ZGlmZiAtLWdpdCBhLy5wcm9qZWN0IGIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MTlhZTkuLjAwMDAwMDAKLS0tIGEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnBhcHlydXMtbW9rYTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvY29yZS9wb20ueG1sIGIvYnVuZGxlcy9jb3JlL3BvbS54bWwKaW5kZXggNzk0M2M4ZS4uNWJkNWU5YiAxMDA2NDQKLS0tIGEvYnVuZGxlcy9jb3JlL3BvbS54bWwKKysrIGIvYnVuZGxlcy9jb3JlL3BvbS54bWwKQEAgLTksMTMgKzksMTQgQEAKIAk8cGFyZW50Pg0KIAkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thPC9ncm91cElkPg0KIAkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmJ1bmRsZXM8L2FydGlmYWN0SWQ+DQotCQk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQogCTwvcGFyZW50Pg0KIAkNCiAJPCEtLSBQT00gRGVzY3JpcHRpb24gLS0+DQogCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5idW5kbGVzLmNvcmU8L2FydGlmYWN0SWQ+DQogCTxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQogCTxuYW1lPk1va2EgQ29yZSAoQ29yZSBmb2xkZXIpPC9uYW1lPg0KKwk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KIAkNCiAJPCEtLSBNb2R1bGVzIHRvIGJ1aWxkIC0tPg0KIAk8bW9kdWxlcz4NCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS9lbmdpbmVzL3BvbS54bWwgYi9idW5kbGVzL2ZtaS9lbmdpbmVzL3BvbS54bWwKaW5kZXggZjNkZGY4Zi4uOWUwOTNkNCAxMDA2NDQKLS0tIGEvYnVuZGxlcy9mbWkvZW5naW5lcy9wb20ueG1sCisrKyBiL2J1bmRsZXMvZm1pL2VuZ2luZXMvcG9tLnhtbApAQCAtOSwxMyArOSwxNCBAQAogCTxwYXJlbnQ+DQogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+DQogCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuYnVuZGxlcy5mbWk8L2FydGlmYWN0SWQ+DQotCQk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQogCTwvcGFyZW50Pg0KIAkNCiAJPCEtLSBQT00gRGVzY3JpcHRpb24gLS0+DQogCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5idW5kbGVzLmZtaS5lbmdpbmVzPC9hcnRpZmFjdElkPg0KIAk8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KIAk8bmFtZT5GTUkgRW5naW5lcyAoRW5naW5lcyBmb2xkZXIpPC9uYW1lPg0KKwk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KIAkNCiAJPCEtLSBNb2R1bGVzIHRvIGJ1aWxkIC0tPg0KIAk8bW9kdWxlcz4NCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS9sYW5ndWFnZS9wb20ueG1sIGIvYnVuZGxlcy9mbWkvbGFuZ3VhZ2UvcG9tLnhtbAppbmRleCBmY2UyMjUxLi44ZDVkMzE5IDEwMDY0NAotLS0gYS9idW5kbGVzL2ZtaS9sYW5ndWFnZS9wb20ueG1sCisrKyBiL2J1bmRsZXMvZm1pL2xhbmd1YWdlL3BvbS54bWwKQEAgLTgsMTMgKzgsMTQgQEAKIAk8cGFyZW50Pg0KIAkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thPC9ncm91cElkPg0KIAkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmJ1bmRsZXMuZm1pPC9hcnRpZmFjdElkPg0KLQkJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4NCisJCTx2ZXJzaW9uPjIuMS4wLVNOQVBTSE9UPC92ZXJzaW9uPg0KIAk8L3BhcmVudD4NCiANCiAJPCEtLSBQT00gRGVzY3JpcHRpb24gLS0+DQogCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5idW5kbGVzLmZtaS5sYW5ndWFnZTwvYXJ0aWZhY3RJZD4NCiAJPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCiAJPG5hbWU+Rk1JIExhbmd1YWdlIChMYW5ndWFnZSBmb2xkZXIpPC9uYW1lPg0KKwk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KIA0KIAk8IS0tIE1vZHVsZXMgdG8gYnVpbGQgLS0+DQogCTxtb2R1bGVzPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3BvbS54bWwgYi9idW5kbGVzL2ZtaS9wb20ueG1sCmluZGV4IGFkZjEwMzkuLmYwYmI2ZDkgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvZm1pL3BvbS54bWwKKysrIGIvYnVuZGxlcy9mbWkvcG9tLnhtbApAQCAtOSw3ICs5LDcgQEAKIAk8cGFyZW50Pg0KIAkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thPC9ncm91cElkPg0KIAkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmJ1bmRsZXM8L2FydGlmYWN0SWQ+DQotCQk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQogCTwvcGFyZW50Pg0KIAkNCiAJPCEtLSBQT00gRGVzY3JpcHRpb24gLS0+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGY1NjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0phdmFTRS0xLjgiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJ0YXJnZXQvY2xhc3NlcyIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvLnByb2plY3QgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzg4YjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTk4NTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBNb2thIEZNVSBFeHBvcnRlcgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlcgotQnVuZGxlLVZlcnNpb246IDIuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyLkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZSBNb2RlbGluZyBQcm9qZWN0Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4xMy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5wcm9maWxlO2J1bmRsZS12ZXJzaW9uPSIyLjAuMTAwIiwKLSBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EudXRpbHM7YnVuZGxlLXZlcnNpb249IjIuMC4xMDAiLAotIG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUucmNwO2J1bmRsZS12ZXJzaW9uPSIyLjAuMTAwIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci9hYm91dC5odG1sIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmQ0OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPg0KLTx0aXRsZT5BYm91dDwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IkVOLVVTIj4NCi08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4NCi0gDQotPHA+SnVuZSA1LCAyMDA3PC9wPgkNCi08aDM+TGljZW5zZTwvaDM+DQotDQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgDQotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgDQotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyANCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudA0KLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci9wb20ueG1sIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjI4NTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPg0KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotCTwhLS0gUGFyZW50IFBPTSAoaS5lLiwgVG9vbHMpIC0tPg0KLQk8cGFyZW50Pg0KLQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thPC9ncm91cElkPg0KLQkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmJ1bmRsZXMuZm1pLnRvb2xzPC9hcnRpZmFjdElkPg0KLQkJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4NCi0JPC9wYXJlbnQ+DQotDQotCTwhLS0gUE9NIERlc2NyaXB0aW9uIC0tPg0KLQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyPC9hcnRpZmFjdElkPg0KLQk8cGFja2FnaW5nPmVjbGlwc2UtcGx1Z2luPC9wYWNrYWdpbmc+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXI8L25hbWU+DQotCTxkZXNjcmlwdGlvbj5VTUwgdG8gRk1VIGV4cG9ydGVyPC9kZXNjcmlwdGlvbj4NCi0JDQotCTxkZXBlbmRlbmNpZXM+DQotCQk8ZGVwZW5kZW5jeT4NCi0JCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+DQotCQkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS5wcm9kdWN0PC9hcnRpZmFjdElkPg0KLQkJCTx2ZXJzaW9uPjIuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQkJCTx0eXBlPmVjbGlwc2UtcmVwb3NpdG9yeTwvdHlwZT4NCi0JCTwvZGVwZW5kZW5jeT4NCi0JPC9kZXBlbmRlbmNpZXM+DQotDQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvcmVzb3VyY2VzL2xpbnV4MzIvLmdpdGlnbm9yZSBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvcmVzb3VyY2VzL2xpbnV4MzIvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxZjVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL3Jlc291cmNlcy9saW51eDMyLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgSWdub3JlIGV2ZXJ5dGhpbmcgaW4gdGhpcyBkaXJlY3RvcnkNCi0qLnppcA0KLSMgRXhjZXB0IHRoaXMgZmlsZQ0KLSEuZ2l0aWdub3JlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci9yZXNvdXJjZXMvbGludXgzMi9saWJmbXV3cmFwcGVyLnNvIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci9yZXNvdXJjZXMvbGludXgzMi9saWJmbXV3cmFwcGVyLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZmM0MWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvcmVzb3VyY2VzL2xpbnV4MzIvbGliZm11d3JhcHBlci5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvcmVzb3VyY2VzL2xpbnV4NjQvLmdpdGlnbm9yZSBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvcmVzb3VyY2VzL2xpbnV4NjQvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxZjVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL3Jlc291cmNlcy9saW51eDY0Ly5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgSWdub3JlIGV2ZXJ5dGhpbmcgaW4gdGhpcyBkaXJlY3RvcnkNCi0qLnppcA0KLSMgRXhjZXB0IHRoaXMgZmlsZQ0KLSEuZ2l0aWdub3JlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci9yZXNvdXJjZXMvbGludXg2NC9saWJmbXV3cmFwcGVyLnNvIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci9yZXNvdXJjZXMvbGludXg2NC9saWJmbXV3cmFwcGVyLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzFlODdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvcmVzb3VyY2VzL2xpbnV4NjQvbGliZm11d3JhcHBlci5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvcmVzb3VyY2VzL3dpbjY0Ly5naXRpZ25vcmUgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL3Jlc291cmNlcy93aW42NC8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzFmNWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvcmVzb3VyY2VzL3dpbjY0Ly5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgSWdub3JlIGV2ZXJ5dGhpbmcgaW4gdGhpcyBkaXJlY3RvcnkNCi0qLnppcA0KLSMgRXhjZXB0IHRoaXMgZmlsZQ0KLSEuZ2l0aWdub3JlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci9yZXNvdXJjZXMvd2luNjQvbGliZm11d3JhcHBlci5kbGwgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL3Jlc291cmNlcy93aW42NC9saWJmbXV3cmFwcGVyLmRsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZkNjM3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL3Jlc291cmNlcy93aW42NC9saWJmbXV3cmFwcGVyLmRsbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvbW9rYS9mbWkvZXhwb3J0ZXIvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL3NyYy9vcmcvZWNsaXBzZS9wYXB5cnVzL21va2EvZm1pL2V4cG9ydGVyL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDFkMDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvbW9rYS9mbWkvZXhwb3J0ZXIvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiANCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuDQotICogDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgQ0VBIExJU1QgSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICogDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlcjsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsNCi0NCi0NCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiAgew0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYnVuZGxlSUQgPSAib3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlciI7DQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBpbnN0YW5jZTsNCi0NCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpew0KLQkJcmV0dXJuIGluc3RhbmNlOw0KLQl9DQotCQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQotCQkJaW5zdGFuY2UgPSB0aGlzOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvbW9rYS9mbWkvZXhwb3J0ZXIvRk1VRXhwb3J0ZXIuamF2YSBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvbW9rYS9mbWkvZXhwb3J0ZXIvRk1VRXhwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyNmRmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL3NyYy9vcmcvZWNsaXBzZS9wYXB5cnVzL21va2EvZm1pL2V4cG9ydGVyL0ZNVUV4cG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogDQotICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KLSAqIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogIENFQSBMSVNUIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqIA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXI7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOw0KLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtdS5GTVVSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mbXVtZXRhbW9kZWwuQXJjaGl2ZVRvVW56aXBJbkZNVTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mbXVtZXRhbW9kZWwuRk1VQnVuZGxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtdW1ldGFtb2RlbC5GbXVtZXRhbW9kZWxGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtdW1ldGFtb2RlbC5KYXZhRmlsZVByb3h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLm1vZGVsZGVzY3JpcHRpb24uRm1pTW9kZWxEZXNjcmlwdGlvblR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkudXRpbC5GTVVSZXNvdXJjZVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUucmNwLkZNVVJDUEFwcGxpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuUHJvZmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZS5VTUxSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsNCi0NCi1wdWJsaWMgY2xhc3MgRk1VRXhwb3J0ZXIgew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRElSID0gInJlc291cmNlcyI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJfTkFNRSA9ICJsaWJmbXV3cmFwcGVyIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJDUF9GT0xERVJfTkFNRSA9ICJyY3AiOw0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9GT0RMRVIgPSAibW9kZWwiOw0KLQkNCi0JDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHBsYXRmb3Jtc1RvUkNQZmlsZTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGRvbnRFeHBvcnRVUklzPSBBcnJheXMuYXNMaXN0KCk7Ly9VTUxSZXNvdXJjZS5FQ09SRV9QUk9GSUxFX1VSSSk7DQotCQ0KLQlzdGF0aWMgew0KLQkJcGxhdGZvcm1zVG9SQ1BmaWxlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotCQlwbGF0Zm9ybXNUb1JDUGZpbGUucHV0KEZNVVJlc291cmNlVXRpbC5CSU5BUklFU19MSU5VWDMyLCAicmNwLWxpbnV4Lmd0ay54ODYuemlwIik7DQotCQlwbGF0Zm9ybXNUb1JDUGZpbGUucHV0KEZNVVJlc291cmNlVXRpbC5CSU5BUklFU19MSU5VWDY0LCAicmNwLWxpbnV4Lmd0ay54ODZfNjQuemlwIik7DQotCQlwbGF0Zm9ybXNUb1JDUGZpbGUucHV0KEZNVVJlc291cmNlVXRpbC5CSU5BUklFU19XSU42NCwgInJjcC13aW4zMi53aW4zMi54ODZfNjQuemlwIik7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRk1VKENsYXNzIHVtbENsYXNzLCBTdHJpbmcgZm11TmFtZSwgU3RyaW5nIG91dHB1dFBhdGgsIFN0cmluZyB0YXJnZXRQbGF0Zm9ybSwNCi0JCQlTdHJpbmcganJlUGF0aCkgew0KLQkJUmVzb3VyY2VTZXQgcmVzU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOw0KLQ0KLQkJDQotCQlGTVVCdW5kbGUgZm11QnVuZGxlID0gRm11bWV0YW1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRk1VQnVuZGxlKCk7DQotCQ0KLQ0KLQkJYWRkTW9kZWxEZXNjcmlwdGlvbih1bWxDbGFzcywgZm11TmFtZSwgZm11QnVuZGxlKTsNCi0JCSBMaXN0PFN0cmluZz4gZXhwb3J0ZWRVTUxHZW5lcmF0ZWRQYWNrYWdlVVJJcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQkJIExpc3Q8U3RyaW5nPiByZW1hcHBlZFVSSXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0JCVN0cmluZyBtYWluTW9kZWxQYXRoID0gYWRkVU1MRmlsZSh1bWxDbGFzcywgcmVzU2V0LCBmbXVCdW5kbGUsIGV4cG9ydGVkVU1MR2VuZXJhdGVkUGFja2FnZVVSSXMsIHJlbWFwcGVkVVJJcyk7DQotDQotCQlhZGRQcm9wZXJ0aWVzRmlsZSh1bWxDbGFzcywgbWFpbk1vZGVsUGF0aCwgZm11QnVuZGxlLCBleHBvcnRlZFVNTEdlbmVyYXRlZFBhY2thZ2VVUklzLCByZW1hcHBlZFVSSXMpOw0KLQ0KLQkJYWRkUmNwKHRhcmdldFBsYXRmb3JtLCBmbXVCdW5kbGUpOw0KLQ0KLQkJYWRkTGlicmFyeSh0YXJnZXRQbGF0Zm9ybSwgZm11TmFtZSwgZm11QnVuZGxlKTsNCi0JCQ0KLQkJRk1VUmVzb3VyY2UgZm11UmVzID0gKEZNVVJlc291cmNlKSByZXNTZXQNCi0JCQkJLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKG91dHB1dFBhdGgpLmFwcGVuZFNlZ21lbnQoZm11TmFtZSkuYXBwZW5kRmlsZUV4dGVuc2lvbigiZm11IikpOw0KLQkJZm11UmVzLmdldENvbnRlbnRzKCkuYWRkKGZtdUJ1bmRsZSk7DQotCQlpZiAoanJlUGF0aCAhPSBudWxsKSB7DQotCQkJYWRkSlJFKGpyZVBhdGgsIGZtdUJ1bmRsZSk7DQotCQl9DQotDQotCQl0cnkgew0KLQkJCWZtdVJlcy5zYXZlKG51bGwpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSlJFKFN0cmluZyBqcmVQYXRoLCBGTVVCdW5kbGUgZm11QnVuZGxlKSB7DQotCQlGaWxlIGpyZUZpbGUgPSBuZXcgRmlsZShqcmVQYXRoKTsNCi0JCUphdmFGaWxlUHJveHkgcHJveHkgPSBGTVVSZXNvdXJjZVV0aWwuY3JlYXRlSmF2YUZpbGVQcm94eShqcmVGaWxlLCAicmNwL2pyZSIpOw0KLQkJZm11QnVuZGxlLmdldFJlc291cmNlc0ZpbGVzKCkuYWRkKHByb3h5KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZExpYnJhcnkoU3RyaW5nIHRhcmdldFBsYXRmb3JtLCBTdHJpbmcgZm11TmFtZSwgRk1VQnVuZGxlIGZtdUJ1bmRsZSkgew0KLQkJQnVuZGxlIGJ1bmRsZSA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7DQotDQotCQlTdHJpbmcgZmlsZUV4dGVuc2lvbjsNCi0JCWlmICh0YXJnZXRQbGF0Zm9ybS5zdGFydHNXaXRoKCJsaW51eCIpKSB7DQotCQkJZmlsZUV4dGVuc2lvbiA9ICIuc28iOw0KLQkJfSBlbHNlIHsNCi0JCQlmaWxlRXh0ZW5zaW9uID0gIi5kbGwiOw0KLQkJfQ0KLQkJVVJMIGxpYlVSTCA9IGJ1bmRsZS5nZXRFbnRyeShSRVNPVVJDRV9ESVIgKyAiLyIgKyB0YXJnZXRQbGF0Zm9ybSArICIvIiArIExJQl9OQU1FICsgZmlsZUV4dGVuc2lvbik7DQotCQl0cnkgew0KLQkJCWxpYlVSTCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChsaWJVUkwpOw0KLQkJCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKGxpYlVSTC5nZXRGaWxlKCkpOw0KLQkJCUphdmFGaWxlUHJveHkgcHJveHkgPSBGTVVSZXNvdXJjZVV0aWwuY3JlYXRlSmF2YUZpbGVQcm94eShsaWJGaWxlLCBmbXVOYW1lICsgZmlsZUV4dGVuc2lvbik7DQotDQotCQkJc3dpdGNoICh0YXJnZXRQbGF0Zm9ybSkgew0KLQkJCWNhc2UgRk1VUmVzb3VyY2VVdGlsLkJJTkFSSUVTX0xJTlVYMzI6DQotCQkJCWZtdUJ1bmRsZS5nZXRMaW51eDMyRmlsZXMoKS5hZGQocHJveHkpOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIEZNVVJlc291cmNlVXRpbC5CSU5BUklFU19MSU5VWDY0Og0KLQkJCQlmbXVCdW5kbGUuZ2V0TGludXg2NEZpbGVzKCkuYWRkKHByb3h5KTsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBGTVVSZXNvdXJjZVV0aWwuQklOQVJJRVNfV0lONjQ6DQotCQkJCWZtdUJ1bmRsZS5nZXRXaW42NEZpbGVzKCkuYWRkKHByb3h5KTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQ0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmNwKFN0cmluZyB0YXJnZXRQbGF0Zm9ybSwgRk1VQnVuZGxlIGZtdUJ1bmRsZSkgew0KLQkJQnVuZGxlIGJ1bmRsZSA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7DQotCQlVUkwgcmNwVVJMID0gYnVuZGxlDQotCQkJCS5nZXRFbnRyeShSRVNPVVJDRV9ESVIgKyAiLyIgKyB0YXJnZXRQbGF0Zm9ybSArICIvIiArIHBsYXRmb3Jtc1RvUkNQZmlsZS5nZXQodGFyZ2V0UGxhdGZvcm0pKTsNCi0JCXRyeSB7DQotCQkJcmNwVVJMID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHJjcFVSTCk7DQotCQkJRmlsZSByY3BGaWxlID0gbmV3IEZpbGUocmNwVVJMLmdldEZpbGUoKSk7DQotCQkJQXJjaGl2ZVRvVW56aXBJbkZNVSBhcmNoaXZlID0gRk1VUmVzb3VyY2VVdGlsLmNyZWF0ZUFyY2hpdmVUb1VuemlwSW5GTVUocmNwRmlsZSk7DQotCQkJYXJjaGl2ZS5zZXROYW1lKFJDUF9GT0xERVJfTkFNRSk7DQotCQkJZm11QnVuZGxlLmdldFJlc291cmNlc0ZpbGVzKCkuYWRkKGFyY2hpdmUpOw0KLQ0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUHJvcGVydGllc0ZpbGUoQ2xhc3MgdW1sQ2xhc3MsIFN0cmluZyBtYWluTW9kZWxQYXRoLCBGTVVCdW5kbGUgZm11QnVuZGxlLCBMaXN0PFN0cmluZz4gZXhwb3J0ZWRVTUxHZW5lcmF0ZWRQYWNrYWdlVVJJcywgTGlzdDxTdHJpbmc+IHJlbWFwcGVkVVJJcykgew0KLQkJUHJvcGVydGllcyBwcm9wID0gbmV3IFByb3BlcnRpZXMoKTsNCi0JCXByb3Auc2V0UHJvcGVydHkoRk1VUkNQQXBwbGljYXRpb24uRk1VX0lELHVtbENsYXNzLmVSZXNvdXJjZSgpLmdldFVSSUZyYWdtZW50KHVtbENsYXNzKSk7DQotCQlwcm9wLnNldFByb3BlcnR5KEZNVVJDUEFwcGxpY2F0aW9uLk1PREVMX1BBVEhfUFJPUCwgbWFpbk1vZGVsUGF0aCk7DQotCQkNCi0JCUl0ZXJhdG9yPFN0cmluZz4gcHJvZmlsZXNVUklNYXBzSXRlcmF0b3IgPSBleHBvcnRlZFVNTEdlbmVyYXRlZFBhY2thZ2VVUklzLml0ZXJhdG9yKCk7DQotCQlpZiAocHJvZmlsZXNVUklNYXBzSXRlcmF0b3IuaGFzTmV4dCgpKXsNCi0JCQlTdHJpbmcgcHJvcFZhbHVlID0gcHJvZmlsZXNVUklNYXBzSXRlcmF0b3IubmV4dCgpOw0KLQkJCXdoaWxlKHByb2ZpbGVzVVJJTWFwc0l0ZXJhdG9yLmhhc05leHQoKSl7DQotCQkJCXByb3BWYWx1ZSArPSIsIitwcm9maWxlc1VSSU1hcHNJdGVyYXRvci5uZXh0KCk7DQotCQkJfQ0KLQkJCXByb3Auc2V0UHJvcGVydHkoRk1VUkNQQXBwbGljYXRpb24uUFJPRklMRV9VUklfTUFQLCBwcm9wVmFsdWUpOw0KLQkJfQ0KLQkJDQotCQlJdGVyYXRvcjxTdHJpbmc+IHVyaVJlbWFwSXRlcmF0b3IgPSByZW1hcHBlZFVSSXMuaXRlcmF0b3IoKTsNCi0JCWlmICh1cmlSZW1hcEl0ZXJhdG9yLmhhc05leHQoKSl7DQotCQkJU3RyaW5nIHByb3BWYWx1ZSA9IHVyaVJlbWFwSXRlcmF0b3IubmV4dCgpOw0KLQkJCXdoaWxlKHVyaVJlbWFwSXRlcmF0b3IuaGFzTmV4dCgpKXsNCi0JCQkJcHJvcFZhbHVlICs9IiwiK3VyaVJlbWFwSXRlcmF0b3IubmV4dCgpOw0KLQkJCX0NCi0JCQlwcm9wLnNldFByb3BlcnR5KEZNVVJDUEFwcGxpY2F0aW9uLlVSSV9SRU1BUCwgcHJvcFZhbHVlKTsNCi0JCX0NCi0JCQ0KLQ0KLQkJdHJ5IHsNCi0JCQlGaWxlIHByb3BGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZm11RXhwb3J0IiwgbnVsbCwgbnVsbCk7IA0KLQkJCXByb3Auc3RvcmUobmV3IEZpbGVPdXRwdXRTdHJlYW0ocHJvcEZpbGUpLCBudWxsKTsNCi0JCQlwcm9wRmlsZS5kZWxldGVPbkV4aXQoKTsNCi0JCQlKYXZhRmlsZVByb3h5IHByb3h5ID0gRk1VUmVzb3VyY2VVdGlsLmNyZWF0ZUphdmFGaWxlUHJveHkocHJvcEZpbGUsIEZNVVJDUEFwcGxpY2F0aW9uLk1PS0FfUFJPUF9GSUxFX05BTUUpOw0KLQkJCWZtdUJ1bmRsZS5nZXRSZXNvdXJjZXNGaWxlcygpLmFkZChwcm94eSk7DQotDQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBhZGRVTUxGaWxlKENsYXNzIHVtbENsYXNzLCBSZXNvdXJjZVNldCByZXNTZXQsIEZNVUJ1bmRsZSBmbXVCdW5kbGUsICBMaXN0PFN0cmluZz4gZXhwb3J0ZWRVTUxHZW5lcmF0ZWRQYWNrYWdlVVJJcywgTGlzdDxTdHJpbmc+IHJlbWFwcGVkVVJJcykgew0KLQkJUmVzb3VyY2Ugb3JpZ2luYWxVTUxSZXNvdXJjZSA9IHVtbENsYXNzLmVSZXNvdXJjZSgpOw0KLQkJDQotCQkNCi0JCQ0KLQkJdHJ5IHsNCi0JCQlQYXRoIHRtcERpclBhdGggPSBGaWxlcy5jcmVhdGVUZW1wRGlyZWN0b3J5KCJmbXVFeHBvcnQiKTsNCi0NCi0JCQlVUkkgdG1wVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkodG1wRGlyUGF0aC50b0Fic29sdXRlUGF0aCgpLnRvU3RyaW5nKCkpOw0KLQkJCVN0cmluZyBtYWluTW9kZWxQYXRoPSBudWxsOyANCi0NCi0JCQkvL3RtcFVSSSA9IHRtcFVSSS5hcHBlbmRTZWdtZW50KGZpbGVOYW1lKTsNCi0JCQlSZXNvdXJjZSByZWxvYWRlZFJlc291cmNlID0gcmVzU2V0LmdldFJlc291cmNlKG9yaWdpbmFsVU1MUmVzb3VyY2UuZ2V0VVJJKCksIHRydWUpOw0KLQkJCUVjb3JlVXRpbC5yZXNvbHZlQWxsKHJlc1NldCk7DQotCQkJDQotCQkJTWFwPFN0cmluZywgVVJJPiBzdGF0aWNQcm9maWxlUmVnaXN0cnkgPSBVTUxQbHVnaW4uZ2V0RVBhY2thZ2VOc1VSSVRvUHJvZmlsZUxvY2F0aW9uTWFwKCk7DQotCQkJTWFwPFByb2ZpbGUsIFN0cmluZz4gc2F2ZWRTdGF0aWNQcm9maWxlc01hcCA9IG5ldyBIYXNoTWFwPFByb2ZpbGUsIFN0cmluZz4oKTsNCi0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG5ld1VyaVJlbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotCQkJTGlzdDxSZXNvdXJjZT4gc291cmNlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4ocmVzU2V0LmdldFJlc291cmNlcygpKTsNCi0JCQlMaXN0PFJlc291cmNlPiB0YXJnZXRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOw0KLQkJCQ0KLS8vCQkJcmVzU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ1bWwiLCBuZXcgUmVzb3VyY2UuRmFjdG9yeSgpew0KLS8vDQotLy8JCQkJQE92ZXJyaWRlDQotLy8JCQkJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsNCi0vLwkJCQkJcmV0dXJuIG5ldyBCaW5hcnlSZXNvdXJjZUltcGwodXJpKTsNCi0vLwkJCQl9DQotLy8JCQkJDQotLy8JCQl9KTsNCi0JCQkNCi0JCQlmb3IgKFJlc291cmNlIHJlc1NldFJlc291cmNlIDogc291cmNlUmVzb3VyY2VzKXsNCi0JCQkJaWYoIHNob3VsZEJlRXhwb3J0ZWQocmVzU2V0UmVzb3VyY2UpKXsNCi0JCQkJCS8vd2UgZ2V0IHRoZSBuZXcgb3V0cHV0IHJlc291cmNlIHdpdGggcG90ZW50aWFsIG5ldyBVUkkgcmVtYXAgZm9yIHJlc291cmNlcyB0aGF0IHdlcmUgc2F2ZWQgaW4gYSBwbHVnaW4gYW5kIHJlZmVyZW5jZWQgDQotCQkJCQkvL3dpdGggYW4gVVJJIHJlbWFwDQotCQkJCQlSZXNvdXJjZSBvdXRwdXRSZXNvdXJjZSA9IGdldE91cHV0UmVzb3VyY2UocmVzU2V0LCB0bXBVUkksIHJlc1NldFJlc291cmNlLCBuZXdVcmlSZW1hcCk7DQotCQkJCQl0YXJnZXRSZXNvdXJjZXMuYWRkKG91dHB1dFJlc291cmNlKTsNCi0JCQkJCWlmIChyZXNTZXRSZXNvdXJjZSA9PSByZWxvYWRlZFJlc291cmNlKXsNCi0JCQkJCQltYWluTW9kZWxQYXRoID0gZ2V0UGF0aFJlbGF0aXZlVG9GTVVSZXNvdXJjZUZvbGRlcih0bXBVUkksIG91dHB1dFJlc291cmNlLmdldFVSSSgpKTsNCi0JCQkJCX0NCi0JCQkJCQ0KLQkJCQkJRU9iamVjdCByb290T2JqZWN0ID0gcmVzU2V0UmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7CQkJCQ0KLQkJCQkJDQotCQkJCQkvL3dlIGFsc28gbmVlZCB0byByZWRpcmVjdCBFUGFja2FnZSBzdGF0aWMgcHJvZmlsZXMgZm9yIHByb2ZpbGVzIHdoaWNoIHdlcmUgc2F2ZWQgaW4gYSBwbHVnaW4gYW4gbm93IGVtYmVkZGVkIGluIHRoZSBGTVUgDQotCQkJCQlpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIFByb2ZpbGUpew0KLQkJCQkJCVVSSSBub3JtYWxpemVkUHJvZmlsZVVSSSA9ICByZXNTZXQuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKEVjb3JlVXRpbC5nZXRVUkkocm9vdE9iamVjdCkpOw0KLQkJCQkJCQ0KLQkJCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgVVJJPiBtYXBFbnRyeSA6IHN0YXRpY1Byb2ZpbGVSZWdpc3RyeS5lbnRyeVNldCgpKXsNCi0JCQkJCQkJVVJJIHJlZ2lzdGVyZWRQcm9maWxlVVJJID0gbWFwRW50cnkuZ2V0VmFsdWUoKTsNCi0JCQkJCQkJaWYobm9ybWFsaXplZFByb2ZpbGVVUkkuZXF1YWxzKCByZXNTZXQuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHJlZ2lzdGVyZWRQcm9maWxlVVJJKSkpew0KLQkJCQkJCQkJc2F2ZWRTdGF0aWNQcm9maWxlc01hcC5wdXQoKFByb2ZpbGUpIHJvb3RPYmplY3QsbWFwRW50cnkuZ2V0S2V5KCkpOw0KLQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCX0NCi0JCQkJCQkJCQ0KLQkJCQkJCX0JDQotCQkJCQl9DQotCQkJCQlhZGRGaWx0ZXJlZENvbnRlbnRzSW5PdXRwdXRSZXNvdXJjZShvdXRwdXRSZXNvdXJjZSwgcmVzU2V0UmVzb3VyY2UpOw0KLQkJCQkJDQotCQkJCQkNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9DQotCQkNCi0NCi0JCQ0KLQ0KLQkJCWZvcihNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IHJlbWFwcGVkVVJJRW50cnkgOiBuZXdVcmlSZW1hcC5lbnRyeVNldCgpKXsNCi0JCQkJcmVtYXBwZWRVUklzLmFkZChyZW1hcHBlZFVSSUVudHJ5LmdldEtleSgpKyI9IityZW1hcHBlZFVSSUVudHJ5LmdldFZhbHVlKCkpOwkNCi0JCQl9DQotCQkJDQotCQkJDQotCQkJZm9yKE1hcC5FbnRyeTxQcm9maWxlLCBTdHJpbmc+IHByb2ZpbGVFbnRyeSA6IHNhdmVkU3RhdGljUHJvZmlsZXNNYXAuZW50cnlTZXQoKSl7DQotCQkJCWV4cG9ydGVkVU1MR2VuZXJhdGVkUGFja2FnZVVSSXMuYWRkKHByb2ZpbGVFbnRyeS5nZXRWYWx1ZSgpKyI9IitnZXRQYXRoUmVsYXRpdmVUb0ZNVVJlc291cmNlRm9sZGVyKHRtcFVSSSxFY29yZVV0aWwuZ2V0VVJJKHByb2ZpbGVFbnRyeS5nZXRLZXkoKSkpKTsJDQotCQkJfQ0KLQkJCQ0KLQkJCQ0KLQkJCWZvciAoUmVzb3VyY2UgdGFyZ2V0UmVzOiB0YXJnZXRSZXNvdXJjZXMpew0KLQkJCQkvL2lmICh0YXJnZXRSZXMgPT0gcmVsb2FkZWRSZXNvdXJjZSl7DQotCQkJCQkvL0hhc2hNYXA8T2JqZWN0LCBPYmplY3Q+IG9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCi0JCQkJCS8vb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0JJTkFSWSwgQm9vbGVhbi5UUlVFKTsNCi0JCQkJLy99DQotCQkJDQotCQkJCXRhcmdldFJlcy5zYXZlKG51bGwpOw0KLQkJCQlGaWxlIG5ld1Jlc291cmNlRmlsZSA9IG5ldyBGaWxlKHRhcmdldFJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7DQotCQkJCW5ld1Jlc291cmNlRmlsZS5kZWxldGVPbkV4aXQoKTsNCi0JCQkJDQotCQkJCUphdmFGaWxlUHJveHkgcHJveHkgPSBGTVVSZXNvdXJjZVV0aWwuY3JlYXRlSmF2YUZpbGVQcm94eShuZXdSZXNvdXJjZUZpbGUsIGdldFBhdGhSZWxhdGl2ZVRvRk1VUmVzb3VyY2VGb2xkZXIodG1wVVJJLHRhcmdldFJlcy5nZXRVUkkoKSkpOw0KLQkJCQlmbXVCdW5kbGUuZ2V0UmVzb3VyY2VzRmlsZXMoKS5hZGQocHJveHkpOw0KLQkJCX0NCi0JCQkNCi0JCQkNCi0NCi0JCQlyZXR1cm4gbWFpbk1vZGVsUGF0aDsNCi0NCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrDQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmlsdGVyZWRDb250ZW50c0luT3V0cHV0UmVzb3VyY2UoUmVzb3VyY2Ugb3V0cHV0UmVzb3VyY2UsIFJlc291cmNlIGlucHV0UGVzb3VyY2UpIHsNCi0JCS8vd2UgYXJlIHJlbW92aW5nIEVjb3JlUHJvZmlsZSBzdGVyZW90eXBlQXBwbGljYXRpb25zLCBzaW5jZSB0aGV5IGNvbnNpZGVyYWJseSBzbG93IGRvd24gdGhlIHJlc291cmNlIGxvYWRpbmcNCi0JCS8vcHJvY2VzcywgbWFpbmx5IGR1ZSB0byB0aGUgZmFjdCB0aGF0IGl0J3MgYSBkeW5hbWljIHByb2ZpbGUgd2hpY2ggaGFzIHRvIGJlIGZ1bGx5IGxvYWRlZCAgZm9yIHRoZQ0KLQkJLy90aGUgc3RlcmVvdHlwZSBhcHBsaWNhdGlvbiBpbnN0YW50aWF0aW9ucy4gQnkgb3Bwb3NpdGlvbiBzdGF0aWMgcHJvZmlsZSBkb24ndCByZXF1aXJlIHRvIGxvYWQgdGhlIFByb2ZpbGUgVU1MDQotCQkvL2ZvciBpbnN0YW50aWF0aW5nIHRoZSBhcHBsaWNhdGlvbnMuDQotCQkvL01vcmVvdmVyIEVjb3JlUHJvZmlsZSBpcyBvbmx5IHVzZWQgZm9yIGNvZGUgZ2VuZXJhdGlvbiBwdXJwb3NlLCBpdCBpcyBjdXJyZW50bHkgbm90IG5lZWRlZCBmb3IgbW9kZWwgZXhlY3V0aW9uLg0KLQkJDQotCQlMaXN0PEVPYmplY3Q+IG9iamVjdHNUb0FkZCA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsNCi0JCWZvciAoRU9iamVjdCBjb250ZW50OiBpbnB1dFBlc291cmNlLmdldENvbnRlbnRzKCkpew0KLQkJCWlmICghVU1MUmVzb3VyY2UuRUNPUkVfUFJPRklMRV9OU19VUkkuZXF1YWxzKGNvbnRlbnQuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKS5nZXROc1VSSSgpKSl7DQotCQkJCW9iamVjdHNUb0FkZC5hZGQoY29udGVudCk7DQotCQkJCQ0KLQkJCX0NCi0JCX0NCi0JCW91dHB1dFJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkQWxsKG9iamVjdHNUb0FkZCk7DQotCQkNCi0JCQ0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYXRoUmVsYXRpdmVUb0ZNVVJlc291cmNlRm9sZGVyKFVSSSB0bXBVUkksIFVSSSB0YXJnZXRVUkkpew0KLQkJcmV0dXJuIHRhcmdldFVSSS50b1N0cmluZygpLnJlcGxhY2VGaXJzdCh0bXBVUkkudG9TdHJpbmcoKSxNT0RFTF9GT0RMRVIpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZSBnZXRPdXB1dFJlc291cmNlKFJlc291cmNlU2V0IHJlc1NldCwgVVJJIHRtcFVSSSwgUmVzb3VyY2UgcmVzU2V0UmVzb3VyY2UsIE1hcDxTdHJpbmcsIFN0cmluZz4gbmV3VXJpUmVtYXApIHsNCi0JCQ0KLQkJVVJJIHNvdXJjZVVSSSA9IHJlc1NldFJlc291cmNlLmdldFVSSSgpOw0KLQkJVVJJIG5vcm1hbGl6ZWRTb3VyY2VVUkkgPSByZXNTZXQuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHNvdXJjZVVSSSk7DQotCQlTdHJpbmcgcmVzb3VyY2VQYXRoID1ub3JtYWxpemVkU291cmNlVVJJLnBhdGgoKTsNCi0JCVVSSSB0YXJnZXRVUkkgPSBVUkkuY3JlYXRlVVJJKHRtcFVSSS50b1N0cmluZygpK3Jlc291cmNlUGF0aCk7DQotCQlVUkkgbm9ybWFsaXplZFRhcmdldFVSSSA9IHJlc1NldC5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodGFyZ2V0VVJJKTsNCi0JCVN0cmluZyBub3JtYWxpemVkVGFyZ2V0VVJJU3RyaW5nID0gbm9ybWFsaXplZFRhcmdldFVSSS50b1N0cmluZygpOw0KLQkJDQotCQlmb3IgKE1hcC5FbnRyeTxVUkksIFVSST4gcmVtYXBFbnRyeSA6IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXIuVVJJX01BUC5lbnRyeVNldCgpKXsNCi0JCQlpZiAocmVtYXBFbnRyeS5nZXRLZXkoKS5pc1ByZWZpeCgpKXsNCi0JCQkJVVJJIHN1YnN0aXR1dGVkU291cmNlVVJJID0gc291cmNlVVJJLnJlcGxhY2VQcmVmaXgocmVtYXBFbnRyeS5nZXRLZXkoKSwgcmVtYXBFbnRyeS5nZXRWYWx1ZSgpKTsNCi0JCQkJaWYoIHN1YnN0aXR1dGVkU291cmNlVVJJICE9IG51bGwpew0KLQkJCQkJVVJJIHN1YnN0aXR1dGVkU291cmNlVVJJTm9ybWFsaXplZCA9cmVzU2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZShzdWJzdGl0dXRlZFNvdXJjZVVSSSk7DQotCQkJCQkvL2lmIG91ciBzb3VyY2UgVVJJIHdhcyBjb250YWluaW5nIGEgcmVtYXBwZWQgcHJlZml4DQotCQkJCQlpZihzdWJzdGl0dXRlZFNvdXJjZVVSSU5vcm1hbGl6ZWQuZXF1YWxzKG5vcm1hbGl6ZWRTb3VyY2VVUkkpICl7DQotCQkJCQkJLy93ZSBoYXZlIHRvIGNvbXB1dGUgdGhlIG5ldyByZW1hcCBwcmVmaXgNCi0JCQkJCQkvL0V4YW1wbGUgOiBzb3VyY2VVUkkgPSBwYXRobWFwOi8vRVhBTVBMRS9tb2RlbC9yZXNvdXJjZS51bWwNCi0JCQkJCQkvL1VSSU1BUCBwYXRobWFwOi8vRVhBTVBMRS8gLS0+IHBsYXRmb3JtOi9wbHVnaW4vbXkucGx1Z2luLw0KLQkJCQkJCS8vbm9ybWFsaXplZFNvdXJjZVVSSSA9ICBwbGF0Zm9ybTovcGx1Z2luL215LnBsdWdpbi9tb2RlbC9yZXNvdXJjZS51bWwNCi0JCQkJCQkvL25vcm1hbGl6ZWRUYXJnZXRVUkkgPSBmaWxlOi8vdG1wVVJJL3BsdWdpbi9teS5wbHVnaW4vbW9kZWwvcmVzb3VyY2UudW1sDQotCQkJCQkJDQotCQkJCQkJLy8gdGhlIG5ldyByZW1hcCBpcyA6IHBhdGhtYXA6Ly9FWEFNUExFLyAgLS0+IGZpbGU6Ly90bXBVUkkvcGx1Z2luL215LnBsdWdpbi8NCi0JCQkJCQkNCi0JCQkJCQkvL3Nob3VsZCBiZSBtb2RlbC9yZXNvdXJjZS51bWwNCi0JCQkJCQlTdHJpbmcgcmVzb3VyY2VQYXRoUmVsYXRpdmVUb1JlbWFwcGVkUHJlZml4ID0gc291cmNlVVJJLmRlcmVzb2x2ZShyZW1hcEVudHJ5LmdldEtleSgpKS50b1N0cmluZygpOw0KLQkJCQkJCSANCi0JCQkJCQlTdHJpbmcgbmV3UHJlZml4ID0gbm9ybWFsaXplZFRhcmdldFVSSVN0cmluZy5zdWJzdHJpbmcoMCwgbm9ybWFsaXplZFRhcmdldFVSSVN0cmluZy5sYXN0SW5kZXhPZihyZXNvdXJjZVBhdGhSZWxhdGl2ZVRvUmVtYXBwZWRQcmVmaXgpKTsNCi0JCQkJCQluZXdQcmVmaXggPSBuZXdQcmVmaXgucmVwbGFjZUZpcnN0KHRtcFVSSS50b1N0cmluZygpLCBNT0RFTF9GT0RMRVIpKyIvIjsNCi0JCQkJCQluZXdVcmlSZW1hcC5wdXQocmVtYXBFbnRyeS5nZXRLZXkoKS50b1N0cmluZygpLCBuZXdQcmVmaXgpOw0KLQkJCQkJCQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJCQ0KLQkJfQ0KLQkJDQotCQlSZXNvdXJjZSByZXN1bHQgPSByZXNTZXQuY3JlYXRlUmVzb3VyY2Uobm9ybWFsaXplZFRhcmdldFVSSSk7DQotCQkNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG91bGRCZUV4cG9ydGVkKFJlc291cmNlIHJlc1NldFJlc291cmNlKSB7DQotCQkNCi0JCWlmICggcmVzU2V0UmVzb3VyY2UgaW5zdGFuY2VvZiBVTUxSZXNvdXJjZSAmJiAhcmVzU2V0UmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsNCi0JCQlyZXR1cm4gISBkb250RXhwb3J0VVJJcy5jb250YWlucyhyZXNTZXRSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsNCi0JCX07DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRNb2RlbERlc2NyaXB0aW9uKENsYXNzIHVtbENsYXNzLCBTdHJpbmcgZm11TmFtZSwgRk1VQnVuZGxlIGZtdUJ1bmRsZSkgew0KLQ0KLQkJRm1pTW9kZWxEZXNjcmlwdGlvblR5cGUgbW9kZWxEZXNjID0gTW9rYVVNTDJGTUkuZ2V0TW9kZWxEZXNjcmlwdGlvbih1bWxDbGFzcywgZm11TmFtZSk7DQotCQlpZiAobW9kZWxEZXNjICE9IG51bGwpIHsNCi0JCQlmbXVCdW5kbGUuc2V0TW9kZWxEZXNjcmlwdGlvbihtb2RlbERlc2MpOw0KLQkJfQ0KLQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvbW9rYS9mbWkvZXhwb3J0ZXIvTW9rYVVNTDJGTUkuamF2YSBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXIvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvbW9rYS9mbWkvZXhwb3J0ZXIvTW9rYVVNTDJGTUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2OGQ4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL3NyYy9vcmcvZWNsaXBzZS9wYXB5cnVzL21va2EvZm1pL2V4cG9ydGVyL01va2FVTUwyRk1JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogDQotICogQ29weXJpZ2h0IChjKSAyMDE2IENFQSBMSVNULg0KLSAqIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogIENFQSBMSVNUIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqIA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZXhwb3J0ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkRhdGF0eXBlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkRhdGF0eXBlRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtaXByb2ZpbGUuQ1NfRk1VOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtaXByb2ZpbGUuQ2FsY3VsYXRlZFBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mbWlwcm9maWxlLkZsb3dEaXJlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZm1pcHJvZmlsZS5JbmRlcGVuZGVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mbWlwcm9maWxlLkxvY2FsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtaXByb2ZpbGUuUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtaXByb2ZpbGUuUG9ydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mbWlwcm9maWxlLlNjYWxhclZhcmlhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLm1vZGVsZGVzY3JpcHRpb24uQm9vbGVhblR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkubW9kZWxkZXNjcmlwdGlvbi5DYXVzYWxpdHlUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLm1vZGVsZGVzY3JpcHRpb24uQ29TaW11bGF0aW9uVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5tb2RlbGRlc2NyaXB0aW9uLkZtaTJTY2FsYXJWYXJpYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5tb2RlbGRlc2NyaXB0aW9uLkZtaTJWYXJpYWJsZURlcGVuZGVuY3k7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkubW9kZWxkZXNjcmlwdGlvbi5GbWlGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLm1vZGVsZGVzY3JpcHRpb24uRm1pTW9kZWxEZXNjcmlwdGlvblR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkubW9kZWxkZXNjcmlwdGlvbi5Jbml0aWFsVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5tb2RlbGRlc2NyaXB0aW9uLkludGVnZXJUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLm1vZGVsZGVzY3JpcHRpb24uTW9kZWxTdHJ1Y3R1cmVUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLm1vZGVsZGVzY3JpcHRpb24uTW9kZWxWYXJpYWJsZXNUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLm1vZGVsZGVzY3JpcHRpb24uUmVhbFR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkubW9kZWxkZXNjcmlwdGlvbi5TdHJpbmdUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLm1vZGVsZGVzY3JpcHRpb24uVW5rbm93blR5cGUxOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLm1vZGVsZGVzY3JpcHRpb24uVmFyaWFiaWxpdHlUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnByb2ZpbGUudXRpbC5GTUlQcm9maWxlVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLnV0aWxzLlVNTFByaW1pdGl2ZVR5cGVzVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db21tZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Qcm9wZXJ0eTsNCi0NCi1wdWJsaWMgY2xhc3MgTW9rYVVNTDJGTUkgew0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlc0Zvck1va2FGTVUoQ2xhc3MgdW1sQ2xhc3MpIHsNCi0JCUNTX0ZNVSBjc0ZNVSA9IEZNSVByb2ZpbGVVdGlsLmdldENTRk1VKHVtbENsYXNzKTsNCi0NCi0JCWNzRk1VLnNldENhbkhhbmRsZVZhcmlhYmxlQ29tbXVuaWNhdGlvblN0ZXBTaXplKHRydWUpOw0KLQkJY3NGTVUuc2V0Q2FuSW50ZXJwb2xhdGVJbnB1dHMoZmFsc2UpOw0KLQkJY3NGTVUuc2V0Q2FuUnVuQXN5bmNocm9udW91c2x5KGZhbHNlKTsNCi0JCWNzRk1VLnNldE1heE91dHB1dERlcml2YXRpdmVPcmRlcigwKTsNCi0JCWNzRk1VLnNldE5lZWRzRXhlY3V0aW9uVG9vbChmYWxzZSk7DQotCQljc0ZNVS5zZXRGbWlWZXJzaW9uKCIyLjAiKTsNCi0JCWNzRk1VLnNldEdlbmVyYXRpb25Ub29sKCJNb2thIEV4cG9ydGVyIik7DQotDQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBGbWlNb2RlbERlc2NyaXB0aW9uVHlwZSBnZXRNb2RlbERlc2NyaXB0aW9uKENsYXNzIHVtbENsYXNzLCBTdHJpbmcgbW9kZWxJZGVudGlmaWVyKSB7DQotCQlDU19GTVUgY3NGTVUgPSBGTUlQcm9maWxlVXRpbC5nZXRDU0ZNVSh1bWxDbGFzcyk7DQotDQotCQlpZiAoY3NGTVUgIT0gbnVsbCkgew0KLQkJCUZtaU1vZGVsRGVzY3JpcHRpb25UeXBlIHJlc3VsdCA9IEZtaUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZtaU1vZGVsRGVzY3JpcHRpb25UeXBlKCk7DQotCQkJcmVzdWx0LnNldEdlbmVyYXRpb25Ub29sKCJNb2thIEZNVSBleHBvcnRlciIpOw0KLQkJCXJlc3VsdC5zZXRGbWlWZXJzaW9uKCIyLjAiKTsNCi0NCi0JCQlHcmVnb3JpYW5DYWxlbmRhciBkYXRlID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7DQotCQkJZGF0ZS5zZXRUaW1lKG5ldyBEYXRlKCkpOw0KLQkJCVhNTEdyZWdvcmlhbkNhbGVuZGFyIHhtbERhdGU7DQotCQkJdHJ5IHsNCi0JCQkJeG1sRGF0ZSA9IERhdGF0eXBlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hNTEdyZWdvcmlhbkNhbGVuZGFyKGRhdGUpOw0KLQkJCQlyZXN1bHQuc2V0R2VuZXJhdGlvbkRhdGVBbmRUaW1lKHhtbERhdGUpOw0KLQkJCX0gY2F0Y2ggKERhdGF0eXBlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJfQ0KLQ0KLQkJCXJlc3VsdC5zZXRNb2RlbE5hbWUodW1sQ2xhc3MuZ2V0TGFiZWwoKSk7DQotCQkJcmVzdWx0LnNldEd1aWQoVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7DQotDQotCQkJQ29TaW11bGF0aW9uVHlwZSBjb3NpbSA9IEZtaUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvU2ltdWxhdGlvblR5cGUoKTsNCi0JCQlyZXN1bHQuZ2V0Q29TaW11bGF0aW9uKCkuYWRkKGNvc2ltKTsNCi0JCQljb3NpbS5zZXRDYW5HZXRBbmRTZXRGTVVzdGF0ZShmYWxzZSk7DQotCQkJY29zaW0uc2V0Q2FuSGFuZGxlVmFyaWFibGVDb21tdW5pY2F0aW9uU3RlcFNpemUodHJ1ZSk7DQotCQkJY29zaW0uc2V0Q2FuQmVJbnN0YW50aWF0ZWRPbmx5T25jZVBlclByb2Nlc3ModHJ1ZSk7DQotCQkJY29zaW0uc2V0Q2FuSW50ZXJwb2xhdGVJbnB1dHMoZmFsc2UpOw0KLQkJCWNvc2ltLnNldENhbk5vdFVzZU1lbW9yeU1hbmFnZW1lbnRGdW5jdGlvbnModHJ1ZSk7DQotCQkJY29zaW0uc2V0Q2FuU2VyaWFsaXplRk1Vc3RhdGUoZmFsc2UpOw0KLQkJCWNvc2ltLnNldENhblJ1bkFzeW5jaHJvbnVvdXNseShmYWxzZSk7DQotCQkJY29zaW0uc2V0TmVlZHNFeGVjdXRpb25Ub29sKGZhbHNlKTsNCi0JCQljb3NpbS5zZXRQcm92aWRlc0RpcmVjdGlvbmFsRGVyaXZhdGl2ZShmYWxzZSk7DQotCQkJY29zaW0uc2V0TWF4T3V0cHV0RGVyaXZhdGl2ZU9yZGVyKDApOw0KLQ0KLQkJCWlmIChtb2RlbElkZW50aWZpZXIgPT0gbnVsbCkgew0KLQkJCQltb2RlbElkZW50aWZpZXIgPSB1bWxDbGFzcy5nZXROYW1lKCk7DQotCQkJfQ0KLQkJCWNvc2ltLnNldE1vZGVsSWRlbnRpZmllcihtb2RlbElkZW50aWZpZXIpOw0KLQ0KLQkJCUxpc3Q8U2NhbGFyVmFyaWFibGU+IHVtbFZhcmlhYmxlcyA9IEZNSVByb2ZpbGVVdGlsLmNvbGxlY3RTY2FsYXJWYXJpYWJsZXModW1sQ2xhc3MpOw0KLQkJCUxpc3Q8UG9ydD4gb3V0cHV0VU1MVmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxQb3J0PigpOw0KLQkJCWlmICghdW1sVmFyaWFibGVzLmlzRW1wdHkoKSkgew0KLQkJCQlNb2RlbFZhcmlhYmxlc1R5cGUgbW9kZWxWYXJpYWJsZXMgPSBGbWlGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNb2RlbFZhcmlhYmxlc1R5cGUoKTsNCi0JCQkJcmVzdWx0LnNldE1vZGVsVmFyaWFibGVzKG1vZGVsVmFyaWFibGVzKTsNCi0JCQkJZm9yIChTY2FsYXJWYXJpYWJsZSB1bWxWYXJpYWJsZSA6IHVtbFZhcmlhYmxlcykgew0KLQkJCQkJbW9kZWxWYXJpYWJsZXMuZ2V0U2NhbGFyVmFyaWFibGUoKS5hZGQoY3JlYXRlRk1JU2NhbGFyVmFyaWFibGUodW1sVmFyaWFibGUpKTsNCi0JCQkJCWlmICh1bWxWYXJpYWJsZSBpbnN0YW5jZW9mIFBvcnQgJiYgKChQb3J0KSB1bWxWYXJpYWJsZSkuZ2V0RGlyZWN0aW9uKCkuZXF1YWxzKEZsb3dEaXJlY3Rpb24uT1VUKSkgew0KLQkJCQkJCW91dHB1dFVNTFZhcmlhYmxlcy5hZGQoKFBvcnQpIHVtbFZhcmlhYmxlKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQ0KLQkJCX0NCi0NCi0JCQlpZiAoIW91dHB1dFVNTFZhcmlhYmxlcy5pc0VtcHR5KCkpIHsNCi0NCi0JCQkJTW9kZWxTdHJ1Y3R1cmVUeXBlIG1vZGVsU3RydWN0dXJlID0gRm1pRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTW9kZWxTdHJ1Y3R1cmVUeXBlKCk7DQotCQkJCXJlc3VsdC5zZXRNb2RlbFN0cnVjdHVyZShtb2RlbFN0cnVjdHVyZSk7DQotCQkJCUZtaTJWYXJpYWJsZURlcGVuZGVuY3kgb3V0cHV0cyA9IEZtaUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZtaTJWYXJpYWJsZURlcGVuZGVuY3koKTsNCi0JCQkJbW9kZWxTdHJ1Y3R1cmUuc2V0T3V0cHV0cyhvdXRwdXRzKTsNCi0JCQkJZm9yIChQb3J0IG91dHB1dFBvcnQgOiBvdXRwdXRVTUxWYXJpYWJsZXMpIHsNCi0JCQkJCW91dHB1dHMuZ2V0VW5rbm93bigpLmFkZChjcmVhdGVVbmtub3duKG91dHB1dFBvcnQsIHVtbFZhcmlhYmxlcykpOw0KLQkJCQl9DQotDQotCQkJfQ0KLQ0KLQkJCXJldHVybiByZXN1bHQ7DQotCQl9IGVsc2Ugew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIFVua25vd25UeXBlMSBjcmVhdGVVbmtub3duKFBvcnQgb3V0cHV0UG9ydCwgTGlzdDxTY2FsYXJWYXJpYWJsZT4gdW1sVmFyaWFibGVzKSB7DQotCQlVbmtub3duVHlwZTEgcmVzdWx0ID0gRm1pRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVW5rbm93blR5cGUxKCk7DQotCQlyZXN1bHQuc2V0SW5kZXgodW1sVmFyaWFibGVzLmluZGV4T2Yob3V0cHV0UG9ydCkgKyAxKTsNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgRm1pMlNjYWxhclZhcmlhYmxlIGNyZWF0ZUZNSVNjYWxhclZhcmlhYmxlKFNjYWxhclZhcmlhYmxlIHVtbFZhcmlhYmxlKSB7DQotCQlGbWkyU2NhbGFyVmFyaWFibGUgcmVzdWx0ID0gRm1pRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm1pMlNjYWxhclZhcmlhYmxlKCk7DQotCQlQcm9wZXJ0eSBiYXNlUHJvcGVydHkgPSB1bWxWYXJpYWJsZS5nZXRCYXNlX1Byb3BlcnR5KCk7DQotCQlpZiAoYmFzZVByb3BlcnR5ID09IG51bGwgJiYgdW1sVmFyaWFibGUgaW5zdGFuY2VvZiBQb3J0KSB7DQotCQkJYmFzZVByb3BlcnR5ID0gKChQb3J0KSB1bWxWYXJpYWJsZSkuZ2V0QmFzZV9Qb3J0KCk7DQotCQl9DQotCQlyZXN1bHQuc2V0TmFtZShiYXNlUHJvcGVydHkuZ2V0TmFtZSgpKTsNCi0JCXJlc3VsdC5zZXRWYWx1ZVJlZmVyZW5jZSh1bWxWYXJpYWJsZS5nZXRWYWx1ZVJlZmVyZW5jZSgpKTsNCi0NCi0JCWlmICghYmFzZVByb3BlcnR5LmdldE93bmVkQ29tbWVudHMoKS5pc0VtcHR5KCkpIHsNCi0JCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiIjsNCi0JCQlmb3IgKENvbW1lbnQgY29tbWVudCA6IGJhc2VQcm9wZXJ0eS5nZXRPd25lZENvbW1lbnRzKCkpIHsNCi0JCQkJaWYgKGNvbW1lbnQuZ2V0Qm9keSgpICE9IG51bGwpIHsNCi0JCQkJCWRlc2NyaXB0aW9uICs9IGNvbW1lbnQuZ2V0Qm9keSgpICsgIlxuIjsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlyZXN1bHQuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOw0KLQkJfQ0KLQ0KLQkJcmVzdWx0LnNldFZhcmlhYmlsaXR5KFZhcmlhYmlsaXR5VHlwZS5ESVNDUkVURSk7DQotDQotCQlDYXVzYWxpdHlUeXBlIGNhdXNhbGl0eSA9IGNvbXB1dGVDYXVzYWxpdHkodW1sVmFyaWFibGUpOw0KLQkJcmVzdWx0LnNldENhdXNhbGl0eShjYXVzYWxpdHkpOw0KLQkJdXBkYXRlVHlwZUFuZEluaXRpYWwocmVzdWx0LCBiYXNlUHJvcGVydHksIGNhdXNhbGl0eSk7DQotDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlVHlwZUFuZEluaXRpYWwoRm1pMlNjYWxhclZhcmlhYmxlIHJlc3VsdCwgUHJvcGVydHkgYmFzZVByb3BlcnR5LA0KLQkJCUNhdXNhbGl0eVR5cGUgY2F1c2FsaXR5KSB7DQotCQlpZiAoYmFzZVByb3BlcnR5LmdldFR5cGUoKS5lcXVhbHMoVU1MUHJpbWl0aXZlVHlwZXNVdGlscy5nZXRSZWFsKGJhc2VQcm9wZXJ0eSkpKSB7DQotCQkJUmVhbFR5cGUgZm1pUmVhbCA9IEZtaUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlYWxUeXBlKCk7DQotCQkJcmVzdWx0LnNldFJlYWwoZm1pUmVhbCk7DQotCQkJaWYgKGNhdXNhbGl0eSA9PSBDYXVzYWxpdHlUeXBlLklOUFVUKSB7DQotCQkJCXJlc3VsdC5zZXRJbml0aWFsKEluaXRpYWxUeXBlLkFQUFJPWCk7DQotCQkJfSBlbHNlIHsNCi0JCQkJcmVzdWx0LnNldEluaXRpYWwoSW5pdGlhbFR5cGUuRVhBQ1QpOw0KLQkJCX0NCi0JCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYmFzZVByb3BlcnR5LmdldERlZmF1bHQoKTsNCi0JCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsNCi0JCQkJZm1pUmVhbC5zZXRTdGFydChEb3VibGUucGFyc2VEb3VibGUoZGVmYXVsdFZhbHVlKSk7DQotCQkJfQ0KLQ0KLQkJfSBlbHNlIGlmIChiYXNlUHJvcGVydHkuZ2V0VHlwZSgpLmVxdWFscyhVTUxQcmltaXRpdmVUeXBlc1V0aWxzLmdldEludGVnZXIoYmFzZVByb3BlcnR5KSkpIHsNCi0JCQlJbnRlZ2VyVHlwZSBmbWlJbnRlZ2VyID0gRm1pRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW50ZWdlclR5cGUoKTsNCi0JCQlyZXN1bHQuc2V0SW50ZWdlcihmbWlJbnRlZ2VyKTsNCi0JCQlpZiAoY2F1c2FsaXR5ID09IENhdXNhbGl0eVR5cGUuSU5QVVQpIHsNCi0JCQkJcmVzdWx0LnNldEluaXRpYWwoSW5pdGlhbFR5cGUuQVBQUk9YKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlyZXN1bHQuc2V0SW5pdGlhbChJbml0aWFsVHlwZS5FWEFDVCk7DQotCQkJfQ0KLQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBiYXNlUHJvcGVydHkuZ2V0RGVmYXVsdCgpOw0KLQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgew0KLQkJCQlmbWlJbnRlZ2VyLnNldFN0YXJ0KEludGVnZXIuZGVjb2RlKGRlZmF1bHRWYWx1ZSkpOw0KLQkJCX0NCi0NCi0JCX0gZWxzZSBpZiAoYmFzZVByb3BlcnR5LmdldFR5cGUoKS5lcXVhbHMoVU1MUHJpbWl0aXZlVHlwZXNVdGlscy5nZXRCb29sZWFuKGJhc2VQcm9wZXJ0eSkpKSB7DQotCQkJQm9vbGVhblR5cGUgZm1pQm9vbGVhbiA9IEZtaUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvb2xlYW5UeXBlKCk7DQotCQkJcmVzdWx0LnNldEJvb2xlYW4oZm1pQm9vbGVhbik7DQotCQkJaWYgKGNhdXNhbGl0eSA9PSBDYXVzYWxpdHlUeXBlLklOUFVUKSB7DQotCQkJCXJlc3VsdC5zZXRJbml0aWFsKEluaXRpYWxUeXBlLkFQUFJPWCk7DQotCQkJfSBlbHNlIHsNCi0JCQkJcmVzdWx0LnNldEluaXRpYWwoSW5pdGlhbFR5cGUuRVhBQ1QpOw0KLQkJCX0NCi0JCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYmFzZVByb3BlcnR5LmdldERlZmF1bHQoKTsNCi0JCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsNCi0JCQkJZm1pQm9vbGVhbi5zZXRTdGFydChCb29sZWFuLmdldEJvb2xlYW4oZGVmYXVsdFZhbHVlKSk7DQotCQkJfQ0KLQ0KLQkJfSBlbHNlIHsNCi0JCQlTdHJpbmdUeXBlIGZtaVN0cmluZyA9IEZtaUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN0cmluZ1R5cGUoKTsNCi0JCQlyZXN1bHQuc2V0U3RyaW5nKGZtaVN0cmluZyk7DQotCQkJaWYgKGNhdXNhbGl0eSA9PSBDYXVzYWxpdHlUeXBlLklOUFVUKSB7DQotCQkJCXJlc3VsdC5zZXRJbml0aWFsKEluaXRpYWxUeXBlLkFQUFJPWCk7DQotCQkJfSBlbHNlIHsNCi0JCQkJcmVzdWx0LnNldEluaXRpYWwoSW5pdGlhbFR5cGUuRVhBQ1QpOw0KLQkJCX0NCi0JCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYmFzZVByb3BlcnR5LmdldERlZmF1bHQoKTsNCi0JCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsNCi0JCQkJZm1pU3RyaW5nLnNldFN0YXJ0KGRlZmF1bHRWYWx1ZSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgQ2F1c2FsaXR5VHlwZSBjb21wdXRlQ2F1c2FsaXR5KFNjYWxhclZhcmlhYmxlIHVtbFZhcmlhYmxlKSB7DQotCQlpZiAodW1sVmFyaWFibGUgaW5zdGFuY2VvZiBMb2NhbCkgew0KLQkJCXJldHVybiBDYXVzYWxpdHlUeXBlLkxPQ0FMOw0KLQkJfSBlbHNlIGlmICh1bWxWYXJpYWJsZSBpbnN0YW5jZW9mIENhbGN1bGF0ZWRQYXJhbWV0ZXIpIHsNCi0JCQlyZXR1cm4gQ2F1c2FsaXR5VHlwZS5DQUxDVUxBVEVEX1BBUkFNRVRFUjsNCi0JCX0gZWxzZSBpZiAodW1sVmFyaWFibGUgaW5zdGFuY2VvZiBQb3J0KSB7DQotCQkJRmxvd0RpcmVjdGlvbiBkaXJlY3Rpb24gPSAoKFBvcnQpIHVtbFZhcmlhYmxlKS5nZXREaXJlY3Rpb24oKTsNCi0JCQlpZiAoZGlyZWN0aW9uLmVxdWFscyhGbG93RGlyZWN0aW9uLklOKSkgew0KLQkJCQlyZXR1cm4gQ2F1c2FsaXR5VHlwZS5JTlBVVDsNCi0JCQl9IGVsc2Ugew0KLQkJCQlyZXR1cm4gQ2F1c2FsaXR5VHlwZS5PVVRQVVQ7DQotCQkJfQ0KLQkJfSBlbHNlIGlmICh1bWxWYXJpYWJsZSBpbnN0YW5jZW9mIFBhcmFtZXRlcikgew0KLQkJCXJldHVybiBDYXVzYWxpdHlUeXBlLlBBUkFNRVRFUjsNCi0JCX0gZWxzZSBpZiAodW1sVmFyaWFibGUgaW5zdGFuY2VvZiBJbmRlcGVuZGVudCkgew0KLQkJCXJldHVybiBDYXVzYWxpdHlUeXBlLklOREVQRU5ERU5UOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mbWkydW1sL3BvbS54bWwgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtaTJ1bWwvcG9tLnhtbAppbmRleCA2ODMzMWJmLi43YWViZGIzIDEwMDY0NAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtaTJ1bWwvcG9tLnhtbAorKysgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtaTJ1bWwvcG9tLnhtbApAQCAtNiw3ICs2LDcgQEAKIAk8cGFyZW50Pg0KIAkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thPC9ncm91cElkPg0KIAkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmJ1bmRsZXMuZm1pLnRvb2xzPC9hcnRpZmFjdElkPg0KLQkJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4NCisJCTx2ZXJzaW9uPjIuMS4wLVNOQVBTSE9UPC92ZXJzaW9uPg0KIAk8L3BhcmVudD4NCiANCiAJPCEtLSBQT00gRGVzY3JpcHRpb24gLS0+DQpAQCAtMTQsNSArMTQsNiBAQAogCTxwYWNrYWdpbmc+ZWNsaXBzZS1wbHVnaW48L3BhY2thZ2luZz4NCiAJPG5hbWU+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mbWkydW1sPC9uYW1lPg0KIAk8ZGVzY3JpcHRpb24+Rk1JIDIgVU1MIEltcG9ydGVyPC9kZXNjcmlwdGlvbj4NCisJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4NCiANCiA8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5wcm9maWxlLnVpL3BvbS54bWwgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnByb2ZpbGUudWkvcG9tLnhtbAppbmRleCAxNDdmOWNhLi5hMGNiZDNjIDEwMDY0NAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnByb2ZpbGUudWkvcG9tLnhtbAorKysgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnByb2ZpbGUudWkvcG9tLnhtbApAQCAtNiw3ICs2LDcgQEAKIAk8cGFyZW50PgogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5idW5kbGVzLmZtaS50b29sczwvYXJ0aWZhY3RJZD4KLQkJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAJPC9wYXJlbnQ+CiAKIAk8IS0tIFBPTSBEZXNjcmlwdGlvbiAtLT4KQEAgLTE0LDUgKzE0LDYgQEAKIAk8cGFja2FnaW5nPmVjbGlwc2UtcGx1Z2luPC9wYWNrYWdpbmc+CiAJPG5hbWU+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5wcm9maWxlLnVpPC9uYW1lPgogCTxkZXNjcmlwdGlvbj5QYXB5cnVzIGludGVncmF0aW9uIG9mIEZNSSAyLjAgcHJvZmlsZTwvZGVzY3JpcHRpb24+CisJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4KIAogPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkucmNwLmV4cG9ydC8uY2xhc3NwYXRoIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5yY3AuZXhwb3J0Ly5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwMDE2NwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkucmNwLmV4cG9ydC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGNsYXNzcGF0aD4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KYXZhU0UtMS44Ij4NCisJCTxhdHRyaWJ1dGVzPg0KKwkJCTxhdHRyaWJ1dGUgbmFtZT0ibWF2ZW4ucG9tZGVyaXZlZCIgdmFsdWU9InRydWUiLz4NCisJCTwvYXR0cmlidXRlcz4NCisJPC9jbGFzc3BhdGhlbnRyeT4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0idGFyZ2V0L2NsYXNzZXMiLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnJjcC5leHBvcnQvLnByb2plY3QgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnJjcC5leHBvcnQvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyMDc0ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkucmNwLmV4cG9ydC8ucHJvamVjdApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkucmNwLmV4cG9ydDwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCTwvcHJvamVjdHM+DQorCTxidWlsZFNwZWM+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yTmF0dXJlPC9uYXR1cmU+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5yY3AuZXhwb3J0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5yY3AuZXhwb3J0L01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNWVmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnJjcC5leHBvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw3IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBNb2thIFJDUCBmb3IgRk1JIGV4cG9ydAorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5yY3AuZXhwb3J0CitCdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlIE1vZGVsaW5nIHByb2plY3QKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnJjcC5leHBvcnQvYnVpbGQucHJvcGVydGllcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlci9idWlsZC5wcm9wZXJ0aWVzCnJlbmFtZSB0byBidW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnJjcC5leHBvcnQvYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5yY3AuZXhwb3J0L3BvbS54bWwgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnJjcC5leHBvcnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY3YzAwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5yY3AuZXhwb3J0L3BvbS54bWwKQEAgLTAsMCArMSwyOCBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisJeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+DQorCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisNCisJPCEtLSBQYXJlbnQgUE9NIChpLmUuLCBUb29scykgLS0+DQorCTxwYXJlbnQ+DQorCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+DQorCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuYnVuZGxlcy5mbWkudG9vbHM8L2FydGlmYWN0SWQ+DQorCQk8dmVyc2lvbj4yLjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4NCisJPC9wYXJlbnQ+DQorDQorCTwhLS0gUE9NIERlc2NyaXB0aW9uIC0tPg0KKwk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnJjcC5leHBvcnQ8L2FydGlmYWN0SWQ+DQorCTxwYWNrYWdpbmc+ZWNsaXBzZS1wbHVnaW48L3BhY2thZ2luZz4NCisJPG5hbWU+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5yY3AuZXhwb3J0PC9uYW1lPg0KKwk8ZGVzY3JpcHRpb24+TW9rYSBSQ1AgZm9yIEZNSSBleHBvcnQ8L2Rlc2NyaXB0aW9uPg0KKwk8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4NCisJDQorCTxkZXBlbmRlbmNpZXM+DQorCQk8ZGVwZW5kZW5jeT4NCisJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+DQorCQkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS5wcm9kdWN0PC9hcnRpZmFjdElkPg0KKwkJCTx2ZXJzaW9uPjIuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPg0KKwkJCTx0eXBlPmVjbGlwc2UtcmVwb3NpdG9yeTwvdHlwZT4NCisJCTwvZGVwZW5kZW5jeT4NCisJPC9kZXBlbmRlbmNpZXM+DQorDQorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkvcG9tLnhtbCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkvcG9tLnhtbAppbmRleCAzMzEwYmY4Li4xM2JjYWZlIDEwMDY0NAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pL3BvbS54bWwKKysrIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS9wb20ueG1sCkBAIC02LDcgKzYsNyBAQAogCTxwYXJlbnQ+DQogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+DQogCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuYnVuZGxlcy5mbWkudG9vbHM8L2FydGlmYWN0SWQ+DQotCQk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQogCTwvcGFyZW50Pg0KIA0KIAk8IS0tIFBPTSBEZXNjcmlwdGlvbiAtLT4NCkBAIC0xNCw1ICsxNCw2IEBACiAJPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPg0KIAk8bmFtZT5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pPC9uYW1lPg0KIAk8ZGVzY3JpcHRpb24+RU1GLWJhc2VkIEZNSSAyLjAgbW9kZWwgZGVzY3JpcHRpb24gWE1MIHBhcnNlci9zZXJpYWxpemVyPC9kZXNjcmlwdGlvbj4NCisJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4NCiANCiA8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS5yY3AvcG9tLnhtbCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUucmNwL3BvbS54bWwKaW5kZXggODY0ODQzNi4uYmNiMzUzNyAxMDA2NDQKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS5yY3AvcG9tLnhtbAorKysgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LnJjcC9wb20ueG1sCkBAIC02LDcgKzYsNyBAQAogCTxwYXJlbnQ+DQogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+DQogCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuYnVuZGxlcy5mbWkudG9vbHM8L2FydGlmYWN0SWQ+DQotCQk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQogCTwvcGFyZW50Pg0KIA0KIAk8IS0tIFBPTSBEZXNjcmlwdGlvbiAtLT4NCkBAIC0xNCw1ICsxNCw2IEBACiAJPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPg0KIAk8bmFtZT5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LnJjcDwvbmFtZT4NCiAJPGRlc2NyaXB0aW9uPk1va2Egc3RhbmRsb25lIFJDUCBmb3IgRk1VIHNpbXVsYXRpb248L2Rlc2NyaXB0aW9uPg0KKwk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KIA0KIDwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvLmNwcm9qZWN0IGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyLy5jcHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyN2I2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvLmNwcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pg0KLTw/ZmlsZVZlcnNpb24gNC4wLjA/PjxjcHJvamVjdCBzdG9yYWdlX3R5cGVfaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLlhtbFByb2plY3REZXNjcmlwdGlvblN0b3JhZ2UiPg0KLQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiPg0KLQkJPGNjb25maWd1cmF0aW9uIGlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28uZGVidWcuOTM4NDQwNTY4Ij4NCi0JCQk8c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5jb25maWd1cmF0aW9uRGF0YVByb3ZpZGVyIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLmRlYnVnLjkzODQ0MDU2OCIgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIiBuYW1lPSJEZWJ1ZyI+DQotCQkJCTxleHRlcm5hbFNldHRpbmdzPg0KLQkJCQkJPGV4dGVybmFsU2V0dGluZz4NCi0JCQkJCQk8ZW50cnkgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIIiBraW5kPSJpbmNsdWRlUGF0aCIgbmFtZT0iL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlciIvPg0KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImxpYnJhcnlQYXRoIiBuYW1lPSIvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL0RlYnVnIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJSRVNPTFZFRCIga2luZD0ibGlicmFyeUZpbGUiIG5hbWU9ImZtdXdyYXBwZXIiIHNyY1ByZWZpeE1hcHBpbmc9IiIgc3JjUm9vdFBhdGg9IiIvPg0KLQkJCQkJPC9leHRlcm5hbFNldHRpbmc+DQotCQkJCTwvZXh0ZXJuYWxTZXR0aW5ncz4NCi0JCQkJPGV4dGVuc2lvbnM+DQotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HTlVfRUxGIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIi8+DQotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQVNFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+DQotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HTERFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+DQotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQ0NFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+DQotCQkJCTwvZXh0ZW5zaW9ucz4NCi0JCQk8L3N0b3JhZ2VNb2R1bGU+DQotCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9ImNkdEJ1aWxkU3lzdGVtIiB2ZXJzaW9uPSI0LjAuMCI+DQotCQkJCTxjb25maWd1cmF0aW9uIGFydGlmYWN0RXh0ZW5zaW9uPSJzbyIgYXJ0aWZhY3ROYW1lPSJmbXV3cmFwcGVyIiBidWlsZEFydGVmYWN0VHlwZT0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGUuc2hhcmVkTGliIiBidWlsZFByb3BlcnRpZXM9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlPW9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlLnNoYXJlZExpYixvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZFR5cGU9b3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRUeXBlLmRlYnVnIiBjbGVhbkNvbW1hbmQ9InJtIC1yZiIgZGVzY3JpcHRpb249IiIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5kZWJ1Zy45Mzg0NDA1NjgiIG5hbWU9IkRlYnVnIiBwYXJlbnQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5kZWJ1ZyI+DQotCQkJCQk8Zm9sZGVySW5mbyBpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLmRlYnVnLjkzODQ0MDU2OC4iIG5hbWU9Ii8iIHJlc291cmNlUGF0aD0iIj4NCi0JCQkJCQk8dG9vbENoYWluIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2xjaGFpbi5nbnUuc28uZGVidWcuMTgzNDI5NDY1MiIgbmFtZT0iTGludXggR0NDIiBub25JbnRlcm5hbEJ1aWxkZXJJZD0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LmJ1aWxkZXIuc28uZGVidWciIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbGNoYWluLmdudS5zby5kZWJ1ZyI+DQotCQkJCQkJCTx0YXJnZXRQbGF0Zm9ybSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LnBsYXRmb3JtLnNvLmRlYnVnLjQ1NDMzMDc2MSIgbmFtZT0iRGVidWcgUGxhdGZvcm0iIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5wbGF0Zm9ybS5zby5kZWJ1ZyIvPg0KLQkJCQkJCQk8YnVpbGRlciBhdXRvQnVpbGRUYXJnZXQ9ImFsbCIgYnVpbGRQYXRoPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlcn0vRGVidWciIGNsZWFuQnVpbGRUYXJnZXQ9ImNsZWFuIiBlbmFibGVBdXRvQnVpbGQ9InRydWUiIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5pbnRlcm5hbC5idWlsZGVyLjQxOTE5MDU2IiBpbmNyZW1lbnRhbEJ1aWxkVGFyZ2V0PSJhbGwiIGtlZXBFbnZpcm9ubWVudEluQnVpbGRmaWxlPSJmYWxzZSIgbWFuYWdlZEJ1aWxkT249InRydWUiIG5hbWU9IkNEVCBJbnRlcm5hbCBCdWlsZGVyIiBzdXBlckNsYXNzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5pbnRlcm5hbC5idWlsZGVyIi8+DQotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFyY2hpdmVyLmJhc2UuOTAwODgzODkwIiBuYW1lPSJHQ0MgQXJjaGl2ZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXJjaGl2ZXIuYmFzZSIvPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuc28uZGVidWcuNzA1MjM4NDYzIiBuYW1lPSJHQ0MgQysrIENvbXBpbGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5zby5kZWJ1ZyI+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLnNvLmRlYnVnLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwuODYxNjI5Mzc0IiBuYW1lPSJPcHRpbWl6YXRpb24gTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIuc28uZGVidWcub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImdudS5jcHAuY29tcGlsZXIub3B0aW1pemF0aW9uLmxldmVsLm5vbmUiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5zby5kZWJ1Zy5vcHRpb24uZGVidWdnaW5nLmxldmVsLjE0OTI1NzM2MjUiIG5hbWU9IkRlYnVnIExldmVsIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLnNvLmRlYnVnLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJnbnUuY3BwLmNvbXBpbGVyLmRlYnVnZ2luZy5sZXZlbC5tYXgiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24uZGlhbGVjdC5zdGQuMTMwODQ0OTQyOCIgbmFtZT0iTGFuZ3VhZ2Ugc3RhbmRhcmQiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmRpYWxlY3Quc3RkIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9InRydWUiIHZhbHVlPSJnbnUuY3BwLmNvbXBpbGVyLmRpYWxlY3QuYysrMTEiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRocy4yNzA4MDI1MjgiIG5hbWU9IkluY2x1ZGUgcGF0aHMgKC1JKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRocyIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWVUeXBlPSJpbmNsdWRlUGF0aCI+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vYXNpby9pbmNsdWRlfSZxdW90OyIvPg0KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2ZtaX0mcXVvdDsiLz4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9mbXV3cmFwcGVyL2luY2x1ZGV9JnF1b3Q7Ii8+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vcmFwaWRqc29uL2luY2x1ZGV9JnF1b3Q7Ii8+DQotCQkJCQkJCQk8L29wdGlvbj4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm90aGVyLnBpYy41NzUwNTI5MjIiIG5hbWU9IlBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUgKC1mUElDKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24ub3RoZXIucGljIiB2YWx1ZT0idHJ1ZSIgdmFsdWVUeXBlPSJib29sZWFuIi8+DQotCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5pbnB1dC4yMDIyNTgxMDg4IiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5pbnB1dCIvPg0KLQkJCQkJCQk8L3Rvb2w+DQotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuc28uZGVidWcuMTQ4MzgwNjczOCIgbmFtZT0iR0NDIEMgQ29tcGlsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5zby5kZWJ1ZyI+DQotCQkJCQkJCQk8b3B0aW9uIGRlZmF1bHRWYWx1ZT0iZ251LmMub3B0aW1pemF0aW9uLmxldmVsLm5vbmUiIGlkPSJnbnUuYy5jb21waWxlci5zby5kZWJ1Zy5vcHRpb24ub3B0aW1pemF0aW9uLmxldmVsLjE0OTg2MDUwNTIiIG5hbWU9Ik9wdGltaXphdGlvbiBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIuc28uZGVidWcub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuYy5jb21waWxlci5zby5kZWJ1Zy5vcHRpb24uZGVidWdnaW5nLmxldmVsLjEzMzIxNzAxMDkiIG5hbWU9IkRlYnVnIExldmVsIiBzdXBlckNsYXNzPSJnbnUuYy5jb21waWxlci5zby5kZWJ1Zy5vcHRpb24uZGVidWdnaW5nLmxldmVsIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZ251LmMuZGVidWdnaW5nLmxldmVsLm1heCIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+DQotCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuaW5wdXQuMTAzNjUzNDMzNyIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0Ii8+DQotCQkJCQkJCTwvdG9vbD4NCi0JCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5saW5rZXIuc28uZGVidWcuNzI5NDc3NDYzIiBuYW1lPSJHQ0MgQyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5saW5rZXIuc28uZGVidWciPg0KLQkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9InRydWUiIGlkPSJnbnUuYy5saW5rLnNvLmRlYnVnLm9wdGlvbi5zaGFyZWQuMTU2ODYwMjAwNyIgbmFtZT0iU2hhcmVkICgtc2hhcmVkKSIgc3VwZXJDbGFzcz0iZ251LmMubGluay5zby5kZWJ1Zy5vcHRpb24uc2hhcmVkIiB2YWx1ZVR5cGU9ImJvb2xlYW4iLz4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLnNvLmRlYnVnLjE3ODI5NDA5OTMiIG5hbWU9IkdDQyBDKysgTGlua2VyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIuc28uZGVidWciPg0KLQkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9InRydWUiIGlkPSJnbnUuY3BwLmxpbmsuc28uZGVidWcub3B0aW9uLnNoYXJlZC4xOTAyNzI3MDMyIiBuYW1lPSJTaGFyZWQgKC1zaGFyZWQpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmxpbmsuc28uZGVidWcub3B0aW9uLnNoYXJlZCIgdmFsdWVUeXBlPSJib29sZWFuIi8+DQotCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIuaW5wdXQuNTM3MDExNjkwIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIuaW5wdXQiPg0KLQkJCQkJCQkJCTxhZGRpdGlvbmFsSW5wdXQga2luZD0iYWRkaXRpb25hbGlucHV0ZGVwZW5kZW5jeSIgcGF0aHM9IiQoVVNFUl9PQkpTKSIvPg0KLQkJCQkJCQkJCTxhZGRpdGlvbmFsSW5wdXQga2luZD0iYWRkaXRpb25hbGlucHV0IiBwYXRocz0iJChMSUJTKSIvPg0KLQkJCQkJCQkJPC9pbnB1dFR5cGU+DQotCQkJCQkJCTwvdG9vbD4NCi0JCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLnNvLmRlYnVnLjIwMjI4OTY3NDciIG5hbWU9IkdDQyBBc3NlbWJsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLnNvLmRlYnVnIj4NCi0JCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLmlucHV0LjI5MTY0MDYzMiIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQiLz4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCTwvdG9vbENoYWluPg0KLQkJCQkJPC9mb2xkZXJJbmZvPg0KLQkJCQkJPHNvdXJjZUVudHJpZXM+DQotCQkJCQkJPGVudHJ5IGV4Y2x1ZGluZz0iZm11d3JhcHBlcnxyYXBpZGpzb258Zm1pfGFzaW8iIGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0iIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0iZm1pIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0iZm11d3JhcHBlciIvPg0KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEh8UkVTT0xWRUQiIGtpbmQ9InNvdXJjZVBhdGgiIG5hbWU9InJhcGlkanNvbiIvPg0KLQkJCQkJPC9zb3VyY2VFbnRyaWVzPg0KLQkJCQk8L2NvbmZpZ3VyYXRpb24+DQotCQkJPC9zdG9yYWdlTW9kdWxlPg0KLQkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5leHRlcm5hbFNldHRpbmdzIi8+DQotCQk8L2Njb25maWd1cmF0aW9uPg0KLQkJPGNjb25maWd1cmF0aW9uIGlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28ucmVsZWFzZS4xNjMzNTkwMzc5Ij4NCi0JCQk8c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5jb25maWd1cmF0aW9uRGF0YVByb3ZpZGVyIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLnJlbGVhc2UuMTYzMzU5MDM3OSIgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLnNldHRpbmdzIiBuYW1lPSJSZWxlYXNlIj4NCi0JCQkJPGV4dGVybmFsU2V0dGluZ3M+DQotCQkJCQk8ZXh0ZXJuYWxTZXR0aW5nPg0KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImluY2x1ZGVQYXRoIiBuYW1lPSIvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSCIga2luZD0ibGlicmFyeVBhdGgiIG5hbWU9Ii9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvUmVsZWFzZSIvPg0KLQkJCQkJCTxlbnRyeSBmbGFncz0iUkVTT0xWRUQiIGtpbmQ9ImxpYnJhcnlGaWxlIiBuYW1lPSJmbXV3cmFwcGVyIiBzcmNQcmVmaXhNYXBwaW5nPSIiIHNyY1Jvb3RQYXRoPSIiLz4NCi0JCQkJCTwvZXh0ZXJuYWxTZXR0aW5nPg0KLQkJCQk8L2V4dGVybmFsU2V0dGluZ3M+DQotCQkJCTxleHRlbnNpb25zPg0KLQkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR05VX0VMRiIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPg0KLQkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0FTRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPg0KLQkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0xERXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPg0KLQkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0NDRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPg0KLQkJCQk8L2V4dGVuc2lvbnM+DQotCQkJPC9zdG9yYWdlTW9kdWxlPg0KLQkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJjZHRCdWlsZFN5c3RlbSIgdmVyc2lvbj0iNC4wLjAiPg0KLQkJCQk8Y29uZmlndXJhdGlvbiBhcnRpZmFjdEV4dGVuc2lvbj0ic28iIGFydGlmYWN0TmFtZT0iZm11d3JhcHBlciIgYnVpbGRBcnRlZmFjdFR5cGU9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlLnNoYXJlZExpYiIgYnVpbGRQcm9wZXJ0aWVzPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZEFydGVmYWN0VHlwZT1vcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZEFydGVmYWN0VHlwZS5zaGFyZWRMaWIsb3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRUeXBlPW9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkVHlwZS5yZWxlYXNlIiBjbGVhbkNvbW1hbmQ9InJtIC1yZiIgZGVzY3JpcHRpb249IiIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5yZWxlYXNlLjE2MzM1OTAzNzkiIG5hbWU9IlJlbGVhc2UiIHBhcmVudD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLnJlbGVhc2UiPg0KLQkJCQkJPGZvbGRlckluZm8gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5yZWxlYXNlLjE2MzM1OTAzNzkuIiBuYW1lPSIvIiByZXNvdXJjZVBhdGg9IiI+DQotCQkJCQkJPHRvb2xDaGFpbiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LnNvLnJlbGVhc2UuMjEzNjQ2NjM3MiIgbmFtZT0iTGludXggR0NDIiBub25JbnRlcm5hbEJ1aWxkZXJJZD0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LmJ1aWxkZXIuc28ucmVsZWFzZSIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LnNvLnJlbGVhc2UiPg0KLQkJCQkJCQk8dGFyZ2V0UGxhdGZvcm0gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5wbGF0Zm9ybS5zby5yZWxlYXNlLjE5MzQ5NTQxMTMiIG5hbWU9IkRlYnVnIFBsYXRmb3JtIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldC5nbnUucGxhdGZvcm0uc28ucmVsZWFzZSIvPg0KLQkJCQkJCQk8YnVpbGRlciBhdXRvQnVpbGRUYXJnZXQ9ImFsbCIgYnVpbGRQYXRoPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlcn0vUmVsZWFzZSIgY2xlYW5CdWlsZFRhcmdldD0iY2xlYW4iIGlkPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5pbnRlcm5hbC5idWlsZGVyLjE5NzYyNDY0OTIiIGluY3JlbWVudGFsQnVpbGRUYXJnZXQ9ImFsbCIga2VlcEVudmlyb25tZW50SW5CdWlsZGZpbGU9ImZhbHNlIiBtYW5hZ2VkQnVpbGRPbj0idHJ1ZSIgbmFtZT0iQ0RUIEludGVybmFsIEJ1aWxkZXIiIHN1cGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmludGVybmFsLmJ1aWxkZXIiLz4NCi0JCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXJjaGl2ZXIuYmFzZS41MjMyNTQ5ODkiIG5hbWU9IkdDQyBBcmNoaXZlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hcmNoaXZlci5iYXNlIi8+DQotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5zby5yZWxlYXNlLjIwNjMxMzEwOTYiIG5hbWU9IkdDQyBDKysgQ29tcGlsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLnNvLnJlbGVhc2UiPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5zby5yZWxlYXNlLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwuNTI4Nzc0NzMiIG5hbWU9Ik9wdGltaXphdGlvbiBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5zby5yZWxlYXNlLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGltaXphdGlvbi5sZXZlbC5tb3N0IiB2YWx1ZVR5cGU9ImVudW1lcmF0ZWQiLz4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIuc28ucmVsZWFzZS5vcHRpb24uZGVidWdnaW5nLmxldmVsLjYxMjczMDExMCIgbmFtZT0iRGVidWcgTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIuc28ucmVsZWFzZS5vcHRpb24uZGVidWdnaW5nLmxldmVsIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZ251LmNwcC5jb21waWxlci5kZWJ1Z2dpbmcubGV2ZWwubm9uZSIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kaWFsZWN0LnN0ZC40OTgzNDIzMjkiIG5hbWU9Ikxhbmd1YWdlIHN0YW5kYXJkIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kaWFsZWN0LnN0ZCIgdmFsdWU9ImdudS5jcHAuY29tcGlsZXIuZGlhbGVjdC5jKysxMSIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5pbmNsdWRlLnBhdGhzLjY0MDgwMjE0NiIgbmFtZT0iSW5jbHVkZSBwYXRocyAoLUkpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5pbmNsdWRlLnBhdGhzIiB2YWx1ZVR5cGU9ImluY2x1ZGVQYXRoIj4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9hc2lvL2luY2x1ZGV9JnF1b3Q7Ii8+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vZm1pfSZxdW90OyIvPg0KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2ZtdXdyYXBwZXIvaW5jbHVkZX0mcXVvdDsiLz4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9yYXBpZGpzb24vaW5jbHVkZX0mcXVvdDsiLz4NCi0JCQkJCQkJCTwvb3B0aW9uPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24ub3RoZXIucGljLjEwNjQ0NzE4MDEiIG5hbWU9IlBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUgKC1mUElDKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24ub3RoZXIucGljIiB2YWx1ZT0idHJ1ZSIgdmFsdWVUeXBlPSJib29sZWFuIi8+DQotCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5pbnB1dC4xNjA5MDMxNTU5IiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5pbnB1dCIvPg0KLQkJCQkJCQk8L3Rvb2w+DQotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuc28ucmVsZWFzZS4xOTcyMjU0OTQ3IiBuYW1lPSJHQ0MgQyBDb21waWxlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLnNvLnJlbGVhc2UiPg0KLQkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9ImdudS5jLm9wdGltaXphdGlvbi5sZXZlbC5tb3N0IiBpZD0iZ251LmMuY29tcGlsZXIuc28ucmVsZWFzZS5vcHRpb24ub3B0aW1pemF0aW9uLmxldmVsLjc4OTcyNTE2NyIgbmFtZT0iT3B0aW1pemF0aW9uIExldmVsIiBzdXBlckNsYXNzPSJnbnUuYy5jb21waWxlci5zby5yZWxlYXNlLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmMuY29tcGlsZXIuc28ucmVsZWFzZS5vcHRpb24uZGVidWdnaW5nLmxldmVsLjE4MjI4NTA5NTMiIG5hbWU9IkRlYnVnIExldmVsIiBzdXBlckNsYXNzPSJnbnUuYy5jb21waWxlci5zby5yZWxlYXNlLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJnbnUuYy5kZWJ1Z2dpbmcubGV2ZWwubm9uZSIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuYy5jb21waWxlci5vcHRpb24uZGlhbGVjdC5zdGQuNDgyNjMyODk2IiBuYW1lPSJMYW5ndWFnZSBzdGFuZGFyZCIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLmRpYWxlY3Quc3RkIiB2YWx1ZT0iZ251LmMuY29tcGlsZXIuZGlhbGVjdC5kZWZhdWx0IiB2YWx1ZVR5cGU9ImVudW1lcmF0ZWQiLz4NCi0JCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5pbnB1dC4xMDA3MDgyNzUiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5pbnB1dCIvPg0KLQkJCQkJCQk8L3Rvb2w+DQotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMubGlua2VyLnNvLnJlbGVhc2UuMTA5OTQwNDAyMSIgbmFtZT0iR0NDIEMgTGlua2VyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMubGlua2VyLnNvLnJlbGVhc2UiPg0KLQkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9InRydWUiIGlkPSJnbnUuYy5saW5rLnNvLnJlbGVhc2Uub3B0aW9uLnNoYXJlZC4zOTgzMTU5MzgiIG5hbWU9IlNoYXJlZCAoLXNoYXJlZCkiIHN1cGVyQ2xhc3M9ImdudS5jLmxpbmsuc28ucmVsZWFzZS5vcHRpb24uc2hhcmVkIiB2YWx1ZVR5cGU9ImJvb2xlYW4iLz4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLnNvLnJlbGVhc2UuNTcwMTg5MDU5IiBuYW1lPSJHQ0MgQysrIExpbmtlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLnNvLnJlbGVhc2UiPg0KLQkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9InRydWUiIGlkPSJnbnUuY3BwLmxpbmsuc28ucmVsZWFzZS5vcHRpb24uc2hhcmVkLjM2MDkzNTU3MyIgbmFtZT0iU2hhcmVkICgtc2hhcmVkKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5saW5rLnNvLnJlbGVhc2Uub3B0aW9uLnNoYXJlZCIgdmFsdWVUeXBlPSJib29sZWFuIi8+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmxpbmsub3B0aW9uLnNvbmFtZS4xMjA5Njc5MDI5IiBuYW1lPSJTaGFyZWQgb2JqZWN0IG5hbWUgKC1XbCwtc29uYW1lPSkiIHN1cGVyQ2xhc3M9ImdudS5jcHAubGluay5vcHRpb24uc29uYW1lIiB2YWx1ZT0iZm11d3JhcHBlciIgdmFsdWVUeXBlPSJzdHJpbmciLz4NCi0JCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5pbnB1dC4yOTUzNDI5ODciIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5pbnB1dCI+DQotCQkJCQkJCQkJPGFkZGl0aW9uYWxJbnB1dCBraW5kPSJhZGRpdGlvbmFsaW5wdXRkZXBlbmRlbmN5IiBwYXRocz0iJChVU0VSX09CSlMpIi8+DQotCQkJCQkJCQkJPGFkZGl0aW9uYWxJbnB1dCBraW5kPSJhZGRpdGlvbmFsaW5wdXQiIHBhdGhzPSIkKExJQlMpIi8+DQotCQkJCQkJCQk8L2lucHV0VHlwZT4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuc28ucmVsZWFzZS4xOTcwNzMwMTQyIiBuYW1lPSJHQ0MgQXNzZW1ibGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFzc2VtYmxlci5zby5yZWxlYXNlIj4NCi0JCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLmlucHV0LjQzNTUyMjkzMiIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQiLz4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCTwvdG9vbENoYWluPg0KLQkJCQkJPC9mb2xkZXJJbmZvPg0KLQkJCQkJPHNvdXJjZUVudHJpZXM+DQotCQkJCQkJPGVudHJ5IGV4Y2x1ZGluZz0iZm11d3JhcHBlcnxyYXBpZGpzb258Zm1pfGFzaW8iIGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0iIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0iZm1pIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0iZm11d3JhcHBlciIvPg0KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEh8UkVTT0xWRUQiIGtpbmQ9InNvdXJjZVBhdGgiIG5hbWU9InJhcGlkanNvbiIvPg0KLQkJCQkJPC9zb3VyY2VFbnRyaWVzPg0KLQkJCQk8L2NvbmZpZ3VyYXRpb24+DQotCQkJPC9zdG9yYWdlTW9kdWxlPg0KLQkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5leHRlcm5hbFNldHRpbmdzIi8+DQotCQk8L2Njb25maWd1cmF0aW9uPg0KLQkJPGNjb25maWd1cmF0aW9uIGlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28uZGVidWcuOTM4NDQwNTY4LjIxMjE3MjU5OTIiPg0KLQkJCTxzdG9yYWdlTW9kdWxlIGJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmNvbmZpZ3VyYXRpb25EYXRhUHJvdmlkZXIiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28uZGVidWcuOTM4NDQwNTY4LjIxMjE3MjU5OTIiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iRGVidWctd2luIj4NCi0JCQkJPGV4dGVybmFsU2V0dGluZ3M+DQotCQkJCQk8ZXh0ZXJuYWxTZXR0aW5nPg0KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImluY2x1ZGVQYXRoIiBuYW1lPSIvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSCIga2luZD0ibGlicmFyeVBhdGgiIG5hbWU9Ii9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvRGVidWctd2luIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJSRVNPTFZFRCIga2luZD0ibGlicmFyeUZpbGUiIG5hbWU9ImZtdXdyYXBwZXIiIHNyY1ByZWZpeE1hcHBpbmc9IiIgc3JjUm9vdFBhdGg9IiIvPg0KLQkJCQkJPC9leHRlcm5hbFNldHRpbmc+DQotCQkJCTwvZXh0ZXJuYWxTZXR0aW5ncz4NCi0JCQkJPGV4dGVuc2lvbnM+DQotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5QRSIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkJpbmFyeVBhcnNlciIvPg0KLQkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0FTRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPg0KLQkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0xERXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPg0KLQkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuR0NDRXJyb3JQYXJzZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5FcnJvclBhcnNlciIvPg0KLQkJCQk8L2V4dGVuc2lvbnM+DQotCQkJPC9zdG9yYWdlTW9kdWxlPg0KLQkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJjZHRCdWlsZFN5c3RlbSIgdmVyc2lvbj0iNC4wLjAiPg0KLQkJCQk8Y29uZmlndXJhdGlvbiBhcnRpZmFjdEV4dGVuc2lvbj0iZGxsIiBhcnRpZmFjdE5hbWU9ImZtdXdyYXBwZXIiIGJ1aWxkQXJ0ZWZhY3RUeXBlPSJvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZEFydGVmYWN0VHlwZS5zaGFyZWRMaWIiIGJ1aWxkUHJvcGVydGllcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGU9b3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGUuc2hhcmVkTGliLG9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkVHlwZT1vcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZFR5cGUuZGVidWciIGNsZWFuQ29tbWFuZD0icm0gLXJmIiBkZXNjcmlwdGlvbj0iIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLmRlYnVnLjkzODQ0MDU2OC4yMTIxNzI1OTkyIiBuYW1lPSJEZWJ1Zy13aW4iIHBhcmVudD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLmRlYnVnIj4NCi0JCQkJCTxmb2xkZXJJbmZvIGlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28uZGVidWcuOTM4NDQwNTY4LjIxMjE3MjU5OTIuIiBuYW1lPSIvIiByZXNvdXJjZVBhdGg9IiI+DQotCQkJCQkJPHRvb2xDaGFpbiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251Lm1pbmd3LmJhc2UuMjgyMzY1NjMiIG5hbWU9Ik1pbkdXIEdDQyIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251Lm1pbmd3LmJhc2UiPg0KLQkJCQkJCQk8dGFyZ2V0UGxhdGZvcm0gYXJjaExpc3Q9ImFsbCIgYmluYXJ5UGFyc2VyPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5QRSIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5wbGF0Zm9ybS5taW5ndy5iYXNlLjU1ODk4NzM3MCIgbmFtZT0iRGVidWcgUGxhdGZvcm0iIG9zTGlzdD0id2luMzIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5wbGF0Zm9ybS5taW5ndy5iYXNlIi8+DQotCQkJCQkJCTxidWlsZGVyIGJ1aWxkUGF0aD0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXJ9L0RlYnVnLXdpbiIgZW5hYmxlQXV0b0J1aWxkPSJ0cnVlIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5idWlsZGVyLm1pbmd3LmJhc2UuNTcxNTkwOTI1IiBrZWVwRW52aXJvbm1lbnRJbkJ1aWxkZmlsZT0iZmFsc2UiIG5hbWU9IkNEVCBJbnRlcm5hbCBCdWlsZGVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmJ1aWxkZXIubWluZ3cuYmFzZSIvPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIubWluZ3cuYmFzZS43ODA2MTM0MzQiIG5hbWU9IkdDQyBBc3NlbWJsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLm1pbmd3LmJhc2UiPg0KLQkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQuNzczOTQwNTI2IiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFzc2VtYmxlci5pbnB1dCIvPg0KLQkJCQkJCQk8L3Rvb2w+DQotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFyY2hpdmVyLm1pbmd3LmJhc2UuMTg3MjA3OTU3NSIgbmFtZT0iR0NDIEFyY2hpdmVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFyY2hpdmVyLm1pbmd3LmJhc2UiLz4NCi0JCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLm1pbmd3LmJhc2UuMTkwNzI3NDg5MyIgbmFtZT0iR0NDIEMrKyBDb21waWxlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIubWluZ3cuYmFzZSI+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5pbmNsdWRlLnBhdGhzLjE3NzMyODgzNjMiIG5hbWU9IkluY2x1ZGUgcGF0aHMgKC1JKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRocyIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWVUeXBlPSJpbmNsdWRlUGF0aCI+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7TUlOR1dfSE9NRX1caW5jbHVkZSZxdW90OyIvPg0KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDtDOlxQcm9ncmFtIEZpbGVzXG1pbmd3LXc2NFx4ODZfNjQtNS4zLjAtd2luMzItc2VoLXJ0X3Y0LXJldjBcbWluZ3c2NFx4ODZfNjQtdzY0LW1pbmd3MzJcaW5jbHVkZVxjKytceDg2XzY0LXc2NC1taW5ndzMyJnF1b3Q7Ii8+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90O0M6XFByb2dyYW0gRmlsZXNcbWluZ3ctdzY0XHg4Nl82NC01LjMuMC13aW4zMi1zZWgtcnRfdjQtcmV2MFxtaW5ndzY0XHg4Nl82NC13NjQtbWluZ3czMlxpbmNsdWRlXGMrK1xiYWNrd2FyZCZxdW90OyIvPg0KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDtDOlxQcm9ncmFtIEZpbGVzXG1pbmd3LXc2NFx4ODZfNjQtNS4zLjAtd2luMzItc2VoLXJ0X3Y0LXJldjBcbWluZ3c2NFx4ODZfNjQtdzY0LW1pbmd3MzJcaW5jbHVkZVxjKysmcXVvdDsiLz4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7QzpcUHJvZ3JhbSBGaWxlc1xtaW5ndy13NjRceDg2XzY0LTUuMy4wLXdpbjMyLXNlaC1ydF92NC1yZXYwXG1pbmd3NjRceDg2XzY0LXc2NC1taW5ndzMyXGluY2x1ZGUmcXVvdDsiLz4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9hc2lvL2luY2x1ZGV9JnF1b3Q7Ii8+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vZm1pfSZxdW90OyIvPg0KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2ZtdXdyYXBwZXIvaW5jbHVkZX0mcXVvdDsiLz4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9yYXBpZGpzb24vaW5jbHVkZX0mcXVvdDsiLz4NCi0JCQkJCQkJCTwvb3B0aW9uPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24ucHJlcHJvY2Vzc29yLmRlZi4yNTUwMDkyOTQiIG5hbWU9IkRlZmluZWQgc3ltYm9scyAoLUQpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5wcmVwcm9jZXNzb3IuZGVmIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZVR5cGU9ImRlZmluZWRTeW1ib2xzIj4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iQVNJT19TVEFOREFMT05FIi8+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9Il9fTk9fSU5MSU5FX18gIi8+DQotCQkJCQkJCQk8L29wdGlvbj4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbC4zMDc2ODQyMjAiIG5hbWU9Ik9wdGltaXphdGlvbiBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24ub3B0aW1pemF0aW9uLmxldmVsIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZ251LmNwcC5jb21waWxlci5vcHRpbWl6YXRpb24ubGV2ZWwubW9zdCIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwuNDExNDI0Nzk1IiBuYW1lPSJEZWJ1ZyBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24uZGVidWdnaW5nLmxldmVsIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZ251LmNwcC5jb21waWxlci5kZWJ1Z2dpbmcubGV2ZWwubWF4IiB2YWx1ZVR5cGU9ImVudW1lcmF0ZWQiLz4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmRpYWxlY3Quc3RkLjE0MzE5OTUwMjIiIG5hbWU9Ikxhbmd1YWdlIHN0YW5kYXJkIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kaWFsZWN0LnN0ZCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJ0cnVlIiB2YWx1ZT0iZ251LmNwcC5jb21waWxlci5kaWFsZWN0LmMrKzExIiB2YWx1ZVR5cGU9ImVudW1lcmF0ZWQiLz4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm90aGVyLnBpYy43NjM3MTExOTEiIG5hbWU9IlBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUgKC1mUElDKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24ub3RoZXIucGljIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZmFsc2UiIHZhbHVlVHlwZT0iYm9vbGVhbiIvPg0KLQkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQuMTc3MjQ0OTc1NSIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQiLz4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLm1pbmd3LmJhc2UuNTUyMjY1MzM5IiBuYW1lPSJHQ0MgQyBDb21waWxlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLm1pbmd3LmJhc2UiPg0KLQkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9ImdudS5jLm9wdGltaXphdGlvbi5sZXZlbC5ub25lIiBpZD0iZ251LmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbC43OTU3ODg1NDEiIG5hbWU9Ik9wdGltaXphdGlvbiBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuYy5jb21waWxlci5vcHRpb24uZGVidWdnaW5nLmxldmVsLjI4NzIyOTQ4OSIgbmFtZT0iRGVidWcgTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJnbnUuYy5kZWJ1Z2dpbmcubGV2ZWwubWF4IiB2YWx1ZVR5cGU9ImVudW1lcmF0ZWQiLz4NCi0JCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5pbnB1dC4xNjQ1MTk2MzgyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuaW5wdXQiLz4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmxpbmtlci5taW5ndy5iYXNlLjE4NDQ1OTgxNDIiIG5hbWU9Ik1pbkdXIEMgTGlua2VyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMubGlua2VyLm1pbmd3LmJhc2UiPg0KLQkJCQkJCQkJPG9wdGlvbiBkZWZhdWx0VmFsdWU9InRydWUiIGlkPSJnbnUuYy5saW5rLm9wdGlvbi5zaGFyZWQuMjEzNjQ0ODE1IiBuYW1lPSJTaGFyZWQgKC1zaGFyZWQpIiBzdXBlckNsYXNzPSJnbnUuYy5saW5rLm9wdGlvbi5zaGFyZWQiIHZhbHVlVHlwZT0iYm9vbGVhbiIvPg0KLQkJCQkJCQk8L3Rvb2w+DQotCQkJCQkJCTx0b29sIGNvbW1hbmRMaW5lUGF0dGVybj0iJHtDT01NQU5EfSAke0ZMQUdTfSAke09VVFBVVF9GTEFHfSAke09VVFBVVF9QUkVGSVh9JHtPVVRQVVR9ICR7SU5QVVRTfSAiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIubWluZ3cuYmFzZS4xNjc0NTkzNDQzIiBuYW1lPSJNaW5HVyBDKysgTGlua2VyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIubWluZ3cuYmFzZSI+DQotCQkJCQkJCQk8b3B0aW9uIGRlZmF1bHRWYWx1ZT0idHJ1ZSIgaWQ9ImdudS5jcHAubGluay5vcHRpb24uc2hhcmVkLjYwODcxOTUwNSIgbmFtZT0iU2hhcmVkICgtc2hhcmVkKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5saW5rLm9wdGlvbi5zaGFyZWQiIHZhbHVlVHlwZT0iYm9vbGVhbiIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5saW5rLm9wdGlvbi5saWJzLjExMzQ5ODY2MjYiIG5hbWU9IkxpYnJhcmllcyAoLWwpIiBzdXBlckNsYXNzPSJnbnUuY3BwLmxpbmsub3B0aW9uLmxpYnMiIHZhbHVlVHlwZT0ibGlicyI+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IndzMl8zMiIvPg0KLQkJCQkJCQkJPC9vcHRpb24+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmxpbmsub3B0aW9uLnVzZXJvYmpzLjEzMDExMjA5MzgiIG5hbWU9Ik90aGVyIG9iamVjdHMiIHN1cGVyQ2xhc3M9ImdudS5jcHAubGluay5vcHRpb24udXNlcm9ianMiLz4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAubGluay5vcHRpb24uZmxhZ3MuMzQyMjA0MzMyIiBuYW1lPSJMaW5rZXIgZmxhZ3MiIHN1cGVyQ2xhc3M9ImdudS5jcHAubGluay5vcHRpb24uZmxhZ3MiIHZhbHVlPSItc3RhdGljIC1zdGF0aWMtbGliZ2NjIC1zdGF0aWMtbGlic3RkYysrIiB2YWx1ZVR5cGU9InN0cmluZyIvPg0KLQkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLmlucHV0LjEzNTk3NTQ4MDQiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5pbnB1dCI+DQotCQkJCQkJCQkJPGFkZGl0aW9uYWxJbnB1dCBraW5kPSJhZGRpdGlvbmFsaW5wdXRkZXBlbmRlbmN5IiBwYXRocz0iJChVU0VSX09CSlMpIi8+DQotCQkJCQkJCQkJPGFkZGl0aW9uYWxJbnB1dCBraW5kPSJhZGRpdGlvbmFsaW5wdXQiIHBhdGhzPSIkKExJQlMpIi8+DQotCQkJCQkJCQk8L2lucHV0VHlwZT4NCi0JCQkJCQkJCTxvdXRwdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIubWluZ3cuc28ub3V0cHV0LmJhc2UuMTUwMzk5NDg2NSIgb3V0cHV0UHJlZml4PSJsaWIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5taW5ndy5zby5vdXRwdXQuYmFzZSIvPg0KLQkJCQkJCQk8L3Rvb2w+DQotCQkJCQkJPC90b29sQ2hhaW4+DQotCQkJCQk8L2ZvbGRlckluZm8+DQotCQkJCQk8c291cmNlRW50cmllcz4NCi0JCQkJCQk8ZW50cnkgZXhjbHVkaW5nPSJmbXV3cmFwcGVyfHJhcGlkanNvbnxmbWl8YXNpbyIgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIfFJFU09MVkVEIiBraW5kPSJzb3VyY2VQYXRoIiBuYW1lPSIiLz4NCi0JCQkJCQk8ZW50cnkgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIfFJFU09MVkVEIiBraW5kPSJzb3VyY2VQYXRoIiBuYW1lPSJmbWkiLz4NCi0JCQkJCQk8ZW50cnkgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIfFJFU09MVkVEIiBraW5kPSJzb3VyY2VQYXRoIiBuYW1lPSJmbXV3cmFwcGVyIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0icmFwaWRqc29uIi8+DQotCQkJCQk8L3NvdXJjZUVudHJpZXM+DQotCQkJCTwvY29uZmlndXJhdGlvbj4NCi0JCQk8L3N0b3JhZ2VNb2R1bGU+DQotCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmV4dGVybmFsU2V0dGluZ3MiLz4NCi0JCTwvY2NvbmZpZ3VyYXRpb24+DQotCQk8Y2NvbmZpZ3VyYXRpb24gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5kZWJ1Zy45Mzg0NDA1NjguMjEyMTcyNTk5Mi45ODg5MjEyNTkiPg0KLQkJCTxzdG9yYWdlTW9kdWxlIGJ1aWxkU3lzdGVtSWQ9Im9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmNvbmZpZ3VyYXRpb25EYXRhUHJvdmlkZXIiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28uZGVidWcuOTM4NDQwNTY4LjIxMjE3MjU5OTIuOTg4OTIxMjU5IiBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuc2V0dGluZ3MiIG5hbWU9IlJlYWxlYXNlLXdpbiI+DQotCQkJCTxleHRlcm5hbFNldHRpbmdzPg0KLQkJCQkJPGV4dGVybmFsU2V0dGluZz4NCi0JCQkJCQk8ZW50cnkgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIIiBraW5kPSJpbmNsdWRlUGF0aCIgbmFtZT0iL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlciIvPg0KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImxpYnJhcnlQYXRoIiBuYW1lPSIvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL1JlYWxlYXNlLXdpbiIvPg0KLQkJCQkJCTxlbnRyeSBmbGFncz0iUkVTT0xWRUQiIGtpbmQ9ImxpYnJhcnlGaWxlIiBuYW1lPSJmbXV3cmFwcGVyIiBzcmNQcmVmaXhNYXBwaW5nPSIiIHNyY1Jvb3RQYXRoPSIiLz4NCi0JCQkJCTwvZXh0ZXJuYWxTZXR0aW5nPg0KLQkJCQk8L2V4dGVybmFsU2V0dGluZ3M+DQotCQkJCTxleHRlbnNpb25zPg0KLQkJCQkJPGV4dGVuc2lvbiBpZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuUEUiIHBvaW50PSJvcmcuZWNsaXBzZS5jZHQuY29yZS5CaW5hcnlQYXJzZXIiLz4NCi0JCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdBU0Vycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4NCi0JCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdMREVycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4NCi0JCQkJCTxleHRlbnNpb24gaWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkdDQ0Vycm9yUGFyc2VyIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuRXJyb3JQYXJzZXIiLz4NCi0JCQkJPC9leHRlbnNpb25zPg0KLQkJCTwvc3RvcmFnZU1vZHVsZT4NCi0JCQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0iY2R0QnVpbGRTeXN0ZW0iIHZlcnNpb249IjQuMC4wIj4NCi0JCQkJPGNvbmZpZ3VyYXRpb24gYXJ0aWZhY3RFeHRlbnNpb249ImRsbCIgYXJ0aWZhY3ROYW1lPSJmbXV3cmFwcGVyIiBidWlsZEFydGVmYWN0VHlwZT0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGUuc2hhcmVkTGliIiBidWlsZFByb3BlcnRpZXM9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlPW9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlLnNoYXJlZExpYixvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZFR5cGU9b3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRUeXBlLmRlYnVnIiBjbGVhbkNvbW1hbmQ9InJtIC1yZiIgZGVzY3JpcHRpb249IiIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5kZWJ1Zy45Mzg0NDA1NjguMjEyMTcyNTk5Mi45ODg5MjEyNTkiIG5hbWU9IlJlYWxlYXNlLXdpbiIgcGFyZW50PSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28uZGVidWciPg0KLQkJCQkJPGZvbGRlckluZm8gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5kZWJ1Zy45Mzg0NDA1NjguMjEyMTcyNTk5Mi45ODg5MjEyNTkuIiBuYW1lPSIvIiByZXNvdXJjZVBhdGg9IiI+DQotCQkJCQkJPHRvb2xDaGFpbiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251Lm1pbmd3LmJhc2UuMjAxMjg2NjMwMiIgbmFtZT0iTWluR1cgR0NDIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2xjaGFpbi5nbnUubWluZ3cuYmFzZSI+DQotCQkJCQkJCTx0YXJnZXRQbGF0Zm9ybSBhcmNoTGlzdD0iYWxsIiBiaW5hcnlQYXJzZXI9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLlBFIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LnBsYXRmb3JtLm1pbmd3LmJhc2UuMzYzNjgwNTUyIiBuYW1lPSJEZWJ1ZyBQbGF0Zm9ybSIgb3NMaXN0PSJ3aW4zMiIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LnBsYXRmb3JtLm1pbmd3LmJhc2UiLz4NCi0JCQkJCQkJPGJ1aWxkZXIgYnVpbGRQYXRoPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlcn0vRGVidWctd2luIiBlbmFibGVBdXRvQnVpbGQ9InRydWUiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmJ1aWxkZXIubWluZ3cuYmFzZS42ODQwMDE1NTciIGtlZXBFbnZpcm9ubWVudEluQnVpbGRmaWxlPSJmYWxzZSIgbmFtZT0iQ0RUIEludGVybmFsIEJ1aWxkZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYnVpbGRlci5taW5ndy5iYXNlIi8+DQotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFzc2VtYmxlci5taW5ndy5iYXNlLjEwMjkzMDM3MzkiIG5hbWU9IkdDQyBBc3NlbWJsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLm1pbmd3LmJhc2UiPg0KLQkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQuMTgzODYyNDE4NSIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQiLz4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hcmNoaXZlci5taW5ndy5iYXNlLjIxMDkyODE5MTgiIG5hbWU9IkdDQyBBcmNoaXZlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hcmNoaXZlci5taW5ndy5iYXNlIi8+DQotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5taW5ndy5iYXNlLjE4MTUxODI3ODEiIG5hbWU9IkdDQyBDKysgQ29tcGlsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLm1pbmd3LmJhc2UiPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRocy4xMDQzMjM3Mjk0IiBuYW1lPSJJbmNsdWRlIHBhdGhzICgtSSkiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmluY2x1ZGUucGF0aHMiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iaW5jbHVkZVBhdGgiPg0KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske01JTkdXX0hPTUV9XGluY2x1ZGUmcXVvdDsiLz4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7QzpcUHJvZ3JhbSBGaWxlc1xtaW5ndy13NjRceDg2XzY0LTUuMy4wLXdpbjMyLXNlaC1ydF92NC1yZXYwXG1pbmd3NjRceDg2XzY0LXc2NC1taW5ndzMyXGluY2x1ZGVcYysrXHg4Nl82NC13NjQtbWluZ3czMiZxdW90OyIvPg0KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDtDOlxQcm9ncmFtIEZpbGVzXG1pbmd3LXc2NFx4ODZfNjQtNS4zLjAtd2luMzItc2VoLXJ0X3Y0LXJldjBcbWluZ3c2NFx4ODZfNjQtdzY0LW1pbmd3MzJcaW5jbHVkZVxjKytcYmFja3dhcmQmcXVvdDsiLz4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7QzpcUHJvZ3JhbSBGaWxlc1xtaW5ndy13NjRceDg2XzY0LTUuMy4wLXdpbjMyLXNlaC1ydF92NC1yZXYwXG1pbmd3NjRceDg2XzY0LXc2NC1taW5ndzMyXGluY2x1ZGVcYysrJnF1b3Q7Ii8+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90O0M6XFByb2dyYW0gRmlsZXNcbWluZ3ctdzY0XHg4Nl82NC01LjMuMC13aW4zMi1zZWgtcnRfdjQtcmV2MFxtaW5ndzY0XHg4Nl82NC13NjQtbWluZ3czMlxpbmNsdWRlJnF1b3Q7Ii8+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vYXNpby9pbmNsdWRlfSZxdW90OyIvPg0KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2ZtaX0mcXVvdDsiLz4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9mbXV3cmFwcGVyL2luY2x1ZGV9JnF1b3Q7Ii8+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vcmFwaWRqc29uL2luY2x1ZGV9JnF1b3Q7Ii8+DQotCQkJCQkJCQk8L29wdGlvbj4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLnByZXByb2Nlc3Nvci5kZWYuMTk2MzY2NTk0MCIgbmFtZT0iRGVmaW5lZCBzeW1ib2xzICgtRCkiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLnByZXByb2Nlc3Nvci5kZWYiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iZGVmaW5lZFN5bWJvbHMiPg0KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSJBU0lPX1NUQU5EQUxPTkUiLz4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iX19OT19JTkxJTkVfXyAiLz4NCi0JCQkJCQkJCTwvb3B0aW9uPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24ub3B0aW1pemF0aW9uLmxldmVsLjYyMzE0MzUxMyIgbmFtZT0iT3B0aW1pemF0aW9uIExldmVsIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGltaXphdGlvbi5sZXZlbC5tb3N0IiB2YWx1ZVR5cGU9ImVudW1lcmF0ZWQiLz4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5sZXZlbC4xODAyMzU2MTI5IiBuYW1lPSJEZWJ1ZyBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24uZGVidWdnaW5nLmxldmVsIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZ251LmNwcC5jb21waWxlci5kZWJ1Z2dpbmcubGV2ZWwubm9uZSIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kaWFsZWN0LnN0ZC4xMjk5NTcwMjAiIG5hbWU9Ikxhbmd1YWdlIHN0YW5kYXJkIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLm9wdGlvbi5kaWFsZWN0LnN0ZCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJ0cnVlIiB2YWx1ZT0iZ251LmNwcC5jb21waWxlci5kaWFsZWN0LmMrKzExIiB2YWx1ZVR5cGU9ImVudW1lcmF0ZWQiLz4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm90aGVyLnBpYy4xMDU3MTA1MTM5IiBuYW1lPSJQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlICgtZlBJQykiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm90aGVyLnBpYyIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImZhbHNlIiB2YWx1ZVR5cGU9ImJvb2xlYW4iLz4NCi0JCQkJCQkJCTxpbnB1dFR5cGUgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLmlucHV0LjkwMTE4OTIyOSIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQiLz4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLm1pbmd3LmJhc2UuMTQ4ODYxNjE4OCIgbmFtZT0iR0NDIEMgQ29tcGlsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5taW5ndy5iYXNlIj4NCi0JCQkJCQkJCTxvcHRpb24gZGVmYXVsdFZhbHVlPSJnbnUuYy5vcHRpbWl6YXRpb24ubGV2ZWwubm9uZSIgaWQ9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwuMjUwMzY2MDM3IiBuYW1lPSJPcHRpbWl6YXRpb24gTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jLmNvbXBpbGVyLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0iZmFsc2UiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmMuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5sZXZlbC4xMDYxMzI5NjExIiBuYW1lPSJEZWJ1ZyBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIub3B0aW9uLmRlYnVnZ2luZy5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImdudS5jLmRlYnVnZ2luZy5sZXZlbC5tYXgiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPg0KLQkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0LjIxMDcyMTc1MzIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5pbnB1dCIvPg0KLQkJCQkJCQk8L3Rvb2w+DQotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMubGlua2VyLm1pbmd3LmJhc2UuMTU1MzE1NDAyMiIgbmFtZT0iTWluR1cgQyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5saW5rZXIubWluZ3cuYmFzZSI+DQotCQkJCQkJCQk8b3B0aW9uIGRlZmF1bHRWYWx1ZT0idHJ1ZSIgaWQ9ImdudS5jLmxpbmsub3B0aW9uLnNoYXJlZC4zMzkzNDk5NjciIG5hbWU9IlNoYXJlZCAoLXNoYXJlZCkiIHN1cGVyQ2xhc3M9ImdudS5jLmxpbmsub3B0aW9uLnNoYXJlZCIgdmFsdWVUeXBlPSJib29sZWFuIi8+DQotCQkJCQkJCTwvdG9vbD4NCi0JCQkJCQkJPHRvb2wgY29tbWFuZExpbmVQYXR0ZXJuPSIke0NPTU1BTkR9ICR7RkxBR1N9ICR7T1VUUFVUX0ZMQUd9ICR7T1VUUFVUX1BSRUZJWH0ke09VVFBVVH0gJHtJTlBVVFN9ICIgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5taW5ndy5iYXNlLjEzNzE3NjQyMDUiIG5hbWU9Ik1pbkdXIEMrKyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5taW5ndy5iYXNlIj4NCi0JCQkJCQkJCTxvcHRpb24gZGVmYXVsdFZhbHVlPSJ0cnVlIiBpZD0iZ251LmNwcC5saW5rLm9wdGlvbi5zaGFyZWQuMTc0MDQwOTkzMyIgbmFtZT0iU2hhcmVkICgtc2hhcmVkKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5saW5rLm9wdGlvbi5zaGFyZWQiIHZhbHVlVHlwZT0iYm9vbGVhbiIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5saW5rLm9wdGlvbi5saWJzLjkzMzgxNTM0NyIgbmFtZT0iTGlicmFyaWVzICgtbCkiIHN1cGVyQ2xhc3M9ImdudS5jcHAubGluay5vcHRpb24ubGlicyIgdmFsdWVUeXBlPSJsaWJzIj4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0id3MyXzMyIi8+DQotCQkJCQkJCQk8L29wdGlvbj4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAubGluay5vcHRpb24udXNlcm9ianMuMTIxNTI3MDY3MCIgbmFtZT0iT3RoZXIgb2JqZWN0cyIgc3VwZXJDbGFzcz0iZ251LmNwcC5saW5rLm9wdGlvbi51c2Vyb2JqcyIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5saW5rLm9wdGlvbi5mbGFncy4yMDY4MTIyNTUwIiBuYW1lPSJMaW5rZXIgZmxhZ3MiIHN1cGVyQ2xhc3M9ImdudS5jcHAubGluay5vcHRpb24uZmxhZ3MiIHZhbHVlPSItc3RhdGljIC1zdGF0aWMtbGliZ2NjIC1zdGF0aWMtbGlic3RkYysrIiB2YWx1ZVR5cGU9InN0cmluZyIvPg0KLQkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLmlucHV0LjE2OTU4MjU3MjIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5pbnB1dCI+DQotCQkJCQkJCQkJPGFkZGl0aW9uYWxJbnB1dCBraW5kPSJhZGRpdGlvbmFsaW5wdXRkZXBlbmRlbmN5IiBwYXRocz0iJChVU0VSX09CSlMpIi8+DQotCQkJCQkJCQkJPGFkZGl0aW9uYWxJbnB1dCBraW5kPSJhZGRpdGlvbmFsaW5wdXQiIHBhdGhzPSIkKExJQlMpIi8+DQotCQkJCQkJCQk8L2lucHV0VHlwZT4NCi0JCQkJCQkJCTxvdXRwdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIubWluZ3cuc28ub3V0cHV0LmJhc2UuMTM2MjYyMDYzMyIgb3V0cHV0UHJlZml4PSJsaWIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5taW5ndy5zby5vdXRwdXQuYmFzZSIvPg0KLQkJCQkJCQk8L3Rvb2w+DQotCQkJCQkJPC90b29sQ2hhaW4+DQotCQkJCQk8L2ZvbGRlckluZm8+DQotCQkJCQk8c291cmNlRW50cmllcz4NCi0JCQkJCQk8ZW50cnkgZXhjbHVkaW5nPSJmbXV3cmFwcGVyfHJhcGlkanNvbnxmbWl8YXNpbyIgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIfFJFU09MVkVEIiBraW5kPSJzb3VyY2VQYXRoIiBuYW1lPSIiLz4NCi0JCQkJCQk8ZW50cnkgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIfFJFU09MVkVEIiBraW5kPSJzb3VyY2VQYXRoIiBuYW1lPSJmbWkiLz4NCi0JCQkJCQk8ZW50cnkgZmxhZ3M9IlZBTFVFX1dPUktTUEFDRV9QQVRIfFJFU09MVkVEIiBraW5kPSJzb3VyY2VQYXRoIiBuYW1lPSJmbXV3cmFwcGVyIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0icmFwaWRqc29uIi8+DQotCQkJCQk8L3NvdXJjZUVudHJpZXM+DQotCQkJCTwvY29uZmlndXJhdGlvbj4NCi0JCQk8L3N0b3JhZ2VNb2R1bGU+DQotCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLmV4dGVybmFsU2V0dGluZ3MiLz4NCi0JCTwvY2NvbmZpZ3VyYXRpb24+DQotCQk8Y2NvbmZpZ3VyYXRpb24gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5yZWxlYXNlLjE2MzM1OTAzNzkuNzE2MTgyNjM0Ij4NCi0JCQk8c3RvcmFnZU1vZHVsZSBidWlsZFN5c3RlbUlkPSJvcmcuZWNsaXBzZS5jZHQubWFuYWdlZGJ1aWxkZXIuY29yZS5jb25maWd1cmF0aW9uRGF0YVByb3ZpZGVyIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLnJlbGVhc2UuMTYzMzU5MDM3OS43MTYxODI2MzQiIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5zZXR0aW5ncyIgbmFtZT0iUmVsZWFzZS1saW51eDMyIj4NCi0JCQkJPGV4dGVybmFsU2V0dGluZ3M+DQotCQkJCQk8ZXh0ZXJuYWxTZXR0aW5nPg0KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEgiIGtpbmQ9ImluY2x1ZGVQYXRoIiBuYW1lPSIvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSCIga2luZD0ibGlicmFyeVBhdGgiIG5hbWU9Ii9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvUmVsZWFzZS1saW51eDMyIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJSRVNPTFZFRCIga2luZD0ibGlicmFyeUZpbGUiIG5hbWU9ImZtdXdyYXBwZXIiIHNyY1ByZWZpeE1hcHBpbmc9IiIgc3JjUm9vdFBhdGg9IiIvPg0KLQkJCQkJPC9leHRlcm5hbFNldHRpbmc+DQotCQkJCTwvZXh0ZXJuYWxTZXR0aW5ncz4NCi0JCQkJPGV4dGVuc2lvbnM+DQotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HTlVfRUxGIiBwb2ludD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuQmluYXJ5UGFyc2VyIi8+DQotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQVNFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+DQotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HTERFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+DQotCQkJCQk8ZXh0ZW5zaW9uIGlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5HQ0NFcnJvclBhcnNlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNkdC5jb3JlLkVycm9yUGFyc2VyIi8+DQotCQkJCTwvZXh0ZW5zaW9ucz4NCi0JCQk8L3N0b3JhZ2VNb2R1bGU+DQotCQkJPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9ImNkdEJ1aWxkU3lzdGVtIiB2ZXJzaW9uPSI0LjAuMCI+DQotCQkJCTxjb25maWd1cmF0aW9uIGFydGlmYWN0RXh0ZW5zaW9uPSJzbyIgYXJ0aWZhY3ROYW1lPSJmbXV3cmFwcGVyIiBidWlsZEFydGVmYWN0VHlwZT0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRBcnRlZmFjdFR5cGUuc2hhcmVkTGliIiBidWlsZFByb3BlcnRpZXM9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlPW9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmJ1aWxkQXJ0ZWZhY3RUeXBlLnNoYXJlZExpYixvcmcuZWNsaXBzZS5jZHQuYnVpbGQuY29yZS5idWlsZFR5cGU9b3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuYnVpbGRUeXBlLnJlbGVhc2UiIGNsZWFuQ29tbWFuZD0icm0gLXJmIiBkZXNjcmlwdGlvbj0iIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLnJlbGVhc2UuMTYzMzU5MDM3OS43MTYxODI2MzQiIG5hbWU9IlJlbGVhc2UtbGludXgzMiIgcGFyZW50PSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28ucmVsZWFzZSI+DQotCQkJCQk8Zm9sZGVySW5mbyBpZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLnJlbGVhc2UuMTYzMzU5MDM3OS43MTYxODI2MzQuIiBuYW1lPSIvIiByZXNvdXJjZVBhdGg9IiI+DQotCQkJCQkJPHRvb2xDaGFpbiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LnNvLnJlbGVhc2UuMTA1ODQ5NDcxMCIgbmFtZT0iTGludXggR0NDIiBub25JbnRlcm5hbEJ1aWxkZXJJZD0iY2R0Lm1hbmFnZWRidWlsZC50YXJnZXQuZ251LmJ1aWxkZXIuc28ucmVsZWFzZSIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sY2hhaW4uZ251LnNvLnJlbGVhc2UiPg0KLQkJCQkJCQk8dGFyZ2V0UGxhdGZvcm0gaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5wbGF0Zm9ybS5zby5yZWxlYXNlLjYwOTMyODc5OCIgbmFtZT0iRGVidWcgUGxhdGZvcm0iIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudGFyZ2V0LmdudS5wbGF0Zm9ybS5zby5yZWxlYXNlIi8+DQotCQkJCQkJCTxidWlsZGVyIGF1dG9CdWlsZFRhcmdldD0iYWxsIiBidWlsZFBhdGg9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyfS9SZWxlYXNlIiBjbGVhbkJ1aWxkVGFyZ2V0PSJjbGVhbiIgaWQ9Im9yZy5lY2xpcHNlLmNkdC5idWlsZC5jb3JlLmludGVybmFsLmJ1aWxkZXIuMTAyNjM0NDMwOCIgaW5jcmVtZW50YWxCdWlsZFRhcmdldD0iYWxsIiBrZWVwRW52aXJvbm1lbnRJbkJ1aWxkZmlsZT0iZmFsc2UiIG1hbmFnZWRCdWlsZE9uPSJ0cnVlIiBuYW1lPSJDRFQgSW50ZXJuYWwgQnVpbGRlciIgc3VwZXJDbGFzcz0ib3JnLmVjbGlwc2UuY2R0LmJ1aWxkLmNvcmUuaW50ZXJuYWwuYnVpbGRlciIvPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hcmNoaXZlci5iYXNlLjQ1Njc0ODM5NiIgbmFtZT0iR0NDIEFyY2hpdmVyIiBzdXBlckNsYXNzPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFyY2hpdmVyLmJhc2UiLz4NCi0JCQkJCQkJPHRvb2wgY29tbWFuZD0iZysrICAtbTMyIiBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuc28ucmVsZWFzZS4yODc0NzU2MDUiIG5hbWU9IkdDQyBDKysgQ29tcGlsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLnNvLnJlbGVhc2UiPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5zby5yZWxlYXNlLm9wdGlvbi5vcHRpbWl6YXRpb24ubGV2ZWwuMTgxMDMzMTEzNCIgbmFtZT0iT3B0aW1pemF0aW9uIExldmVsIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLnNvLnJlbGVhc2Uub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImdudS5jcHAuY29tcGlsZXIub3B0aW1pemF0aW9uLmxldmVsLm1vc3QiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5zby5yZWxlYXNlLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwuMjU3NjY0MjYiIG5hbWU9IkRlYnVnIExldmVsIiBzdXBlckNsYXNzPSJnbnUuY3BwLmNvbXBpbGVyLnNvLnJlbGVhc2Uub3B0aW9uLmRlYnVnZ2luZy5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9ImdudS5jcHAuY29tcGlsZXIuZGVidWdnaW5nLmxldmVsLm5vbmUiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24uZGlhbGVjdC5zdGQuMTg3MDg0OTQyNSIgbmFtZT0iTGFuZ3VhZ2Ugc3RhbmRhcmQiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLmRpYWxlY3Quc3RkIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9InRydWUiIHZhbHVlPSJnbnUuY3BwLmNvbXBpbGVyLmRpYWxlY3QuYysrMTEiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRocy43NDc4NDEyMjciIG5hbWU9IkluY2x1ZGUgcGF0aHMgKC1JKSIgc3VwZXJDbGFzcz0iZ251LmNwcC5jb21waWxlci5vcHRpb24uaW5jbHVkZS5wYXRocyIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWVUeXBlPSJpbmNsdWRlUGF0aCI+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vYXNpby9pbmNsdWRlfSZxdW90OyIvPg0KLQkJCQkJCQkJCTxsaXN0T3B0aW9uVmFsdWUgYnVpbHRJbj0iZmFsc2UiIHZhbHVlPSImcXVvdDske3dvcmtzcGFjZV9sb2M6LyR7UHJvak5hbWV9L2ZtaX0mcXVvdDsiLz4NCi0JCQkJCQkJCQk8bGlzdE9wdGlvblZhbHVlIGJ1aWx0SW49ImZhbHNlIiB2YWx1ZT0iJnF1b3Q7JHt3b3Jrc3BhY2VfbG9jOi8ke1Byb2pOYW1lfS9mbXV3cmFwcGVyL2luY2x1ZGV9JnF1b3Q7Ii8+DQotCQkJCQkJCQkJPGxpc3RPcHRpb25WYWx1ZSBidWlsdEluPSJmYWxzZSIgdmFsdWU9IiZxdW90OyR7d29ya3NwYWNlX2xvYzovJHtQcm9qTmFtZX0vcmFwaWRqc29uL2luY2x1ZGV9JnF1b3Q7Ii8+DQotCQkJCQkJCQk8L29wdGlvbj4NCi0JCQkJCQkJCTxvcHRpb24gaWQ9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm90aGVyLnBpYy4xNTc0NDg2MjQyIiBuYW1lPSJQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlICgtZlBJQykiIHN1cGVyQ2xhc3M9ImdudS5jcHAuY29tcGlsZXIub3B0aW9uLm90aGVyLnBpYyIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWU9InRydWUiIHZhbHVlVHlwZT0iYm9vbGVhbiIvPg0KLQkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQuMjE0MTg2MTE1NiIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQiLz4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCQk8dG9vbCBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLnNvLnJlbGVhc2UuMTYzNTMwNzI1NiIgbmFtZT0iR0NDIEMgQ29tcGlsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5zby5yZWxlYXNlIj4NCi0JCQkJCQkJCTxvcHRpb24gZGVmYXVsdFZhbHVlPSJnbnUuYy5vcHRpbWl6YXRpb24ubGV2ZWwubW9zdCIgaWQ9ImdudS5jLmNvbXBpbGVyLnNvLnJlbGVhc2Uub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbC4xNDc2OTQzMzY3IiBuYW1lPSJPcHRpbWl6YXRpb24gTGV2ZWwiIHN1cGVyQ2xhc3M9ImdudS5jLmNvbXBpbGVyLnNvLnJlbGVhc2Uub3B0aW9uLm9wdGltaXphdGlvbi5sZXZlbCIgdXNlQnlTY2FubmVyRGlzY292ZXJ5PSJmYWxzZSIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+DQotCQkJCQkJCQk8b3B0aW9uIGlkPSJnbnUuYy5jb21waWxlci5zby5yZWxlYXNlLm9wdGlvbi5kZWJ1Z2dpbmcubGV2ZWwuNjcyODYzMTM1IiBuYW1lPSJEZWJ1ZyBMZXZlbCIgc3VwZXJDbGFzcz0iZ251LmMuY29tcGlsZXIuc28ucmVsZWFzZS5vcHRpb24uZGVidWdnaW5nLmxldmVsIiB1c2VCeVNjYW5uZXJEaXNjb3Zlcnk9ImZhbHNlIiB2YWx1ZT0iZ251LmMuZGVidWdnaW5nLmxldmVsLm5vbmUiIHZhbHVlVHlwZT0iZW51bWVyYXRlZCIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmMuY29tcGlsZXIub3B0aW9uLmRpYWxlY3Quc3RkLjE5NzE5MTgzNzEiIG5hbWU9Ikxhbmd1YWdlIHN0YW5kYXJkIiBzdXBlckNsYXNzPSJnbnUuYy5jb21waWxlci5vcHRpb24uZGlhbGVjdC5zdGQiIHVzZUJ5U2Nhbm5lckRpc2NvdmVyeT0idHJ1ZSIgdmFsdWU9ImdudS5jLmNvbXBpbGVyLmRpYWxlY3QuZGVmYXVsdCIgdmFsdWVUeXBlPSJlbnVtZXJhdGVkIi8+DQotCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuaW5wdXQuMTMxNDQzNzc0MiIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0Ii8+DQotCQkJCQkJCTwvdG9vbD4NCi0JCQkJCQkJPHRvb2wgaWQ9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5saW5rZXIuc28ucmVsZWFzZS4zNDk5ODgxMjYiIG5hbWU9IkdDQyBDIExpbmtlciIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmxpbmtlci5zby5yZWxlYXNlIj4NCi0JCQkJCQkJCTxvcHRpb24gZGVmYXVsdFZhbHVlPSJ0cnVlIiBpZD0iZ251LmMubGluay5zby5yZWxlYXNlLm9wdGlvbi5zaGFyZWQuMzg5OTY5ODQyIiBuYW1lPSJTaGFyZWQgKC1zaGFyZWQpIiBzdXBlckNsYXNzPSJnbnUuYy5saW5rLnNvLnJlbGVhc2Uub3B0aW9uLnNoYXJlZCIgdmFsdWVUeXBlPSJib29sZWFuIi8+DQotCQkJCQkJCTwvdG9vbD4NCi0JCQkJCQkJPHRvb2wgY29tbWFuZD0iZysrIC1tMzIiIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIuc28ucmVsZWFzZS42OTMxMjY5MSIgbmFtZT0iR0NDIEMrKyBMaW5rZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmxpbmtlci5zby5yZWxlYXNlIj4NCi0JCQkJCQkJCTxvcHRpb24gZGVmYXVsdFZhbHVlPSJ0cnVlIiBpZD0iZ251LmNwcC5saW5rLnNvLnJlbGVhc2Uub3B0aW9uLnNoYXJlZC4xMDUwNzg0MjQiIG5hbWU9IlNoYXJlZCAoLXNoYXJlZCkiIHN1cGVyQ2xhc3M9ImdudS5jcHAubGluay5zby5yZWxlYXNlLm9wdGlvbi5zaGFyZWQiIHZhbHVlVHlwZT0iYm9vbGVhbiIvPg0KLQkJCQkJCQkJPG9wdGlvbiBpZD0iZ251LmNwcC5saW5rLm9wdGlvbi5zb25hbWUuMTkyOTY3NzM3NSIgbmFtZT0iU2hhcmVkIG9iamVjdCBuYW1lICgtV2wsLXNvbmFtZT0pIiBzdXBlckNsYXNzPSJnbnUuY3BwLmxpbmsub3B0aW9uLnNvbmFtZSIgdmFsdWU9ImZtdXdyYXBwZXIiIHZhbHVlVHlwZT0ic3RyaW5nIi8+DQotCQkJCQkJCQk8aW5wdXRUeXBlIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5saW5rZXIuaW5wdXQuMTQ3OTk0MTUzOCIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAubGlua2VyLmlucHV0Ij4NCi0JCQkJCQkJCQk8YWRkaXRpb25hbElucHV0IGtpbmQ9ImFkZGl0aW9uYWxpbnB1dGRlcGVuZGVuY3kiIHBhdGhzPSIkKFVTRVJfT0JKUykiLz4NCi0JCQkJCQkJCQk8YWRkaXRpb25hbElucHV0IGtpbmQ9ImFkZGl0aW9uYWxpbnB1dCIgcGF0aHM9IiQoTElCUykiLz4NCi0JCQkJCQkJCTwvaW5wdXRUeXBlPg0KLQkJCQkJCQk8L3Rvb2w+DQotCQkJCQkJCTx0b29sIGlkPSJjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmFzc2VtYmxlci5zby5yZWxlYXNlLjEwMTAyMDQyODkiIG5hbWU9IkdDQyBBc3NlbWJsZXIiIHN1cGVyQ2xhc3M9ImNkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYXNzZW1ibGVyLnNvLnJlbGVhc2UiPg0KLQkJCQkJCQkJPGlucHV0VHlwZSBpZD0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQuMTQ5NTI2MzIyOSIgc3VwZXJDbGFzcz0iY2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5hc3NlbWJsZXIuaW5wdXQiLz4NCi0JCQkJCQkJPC90b29sPg0KLQkJCQkJCTwvdG9vbENoYWluPg0KLQkJCQkJPC9mb2xkZXJJbmZvPg0KLQkJCQkJPHNvdXJjZUVudHJpZXM+DQotCQkJCQkJPGVudHJ5IGV4Y2x1ZGluZz0iZm11d3JhcHBlcnxyYXBpZGpzb258Zm1pfGFzaW8iIGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0iIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0iZm1pIi8+DQotCQkJCQkJPGVudHJ5IGZsYWdzPSJWQUxVRV9XT1JLU1BBQ0VfUEFUSHxSRVNPTFZFRCIga2luZD0ic291cmNlUGF0aCIgbmFtZT0iZm11d3JhcHBlciIvPg0KLQkJCQkJCTxlbnRyeSBmbGFncz0iVkFMVUVfV09SS1NQQUNFX1BBVEh8UkVTT0xWRUQiIGtpbmQ9InNvdXJjZVBhdGgiIG5hbWU9InJhcGlkanNvbiIvPg0KLQkJCQkJPC9zb3VyY2VFbnRyaWVzPg0KLQkJCQk8L2NvbmZpZ3VyYXRpb24+DQotCQkJPC9zdG9yYWdlTW9kdWxlPg0KLQkJCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJvcmcuZWNsaXBzZS5jZHQuY29yZS5leHRlcm5hbFNldHRpbmdzIi8+DQotCQk8L2Njb25maWd1cmF0aW9uPg0KLQk8L3N0b3JhZ2VNb2R1bGU+DQotCTxzdG9yYWdlTW9kdWxlIG1vZHVsZUlkPSJjZHRCdWlsZFN5c3RlbSIgdmVyc2lvbj0iNC4wLjAiPg0KLQkJPHByb2plY3QgaWQ9Im9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci5jZHQubWFuYWdlZGJ1aWxkLnRhcmdldC5nbnUuc28uMTMyODQ1MzExMCIgbmFtZT0iU2hhcmVkIExpYnJhcnkiIHByb2plY3RUeXBlPSJjZHQubWFuYWdlZGJ1aWxkLnRhcmdldC5nbnUuc28iLz4NCi0JPC9zdG9yYWdlTW9kdWxlPg0KLQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0LmNvcmUuTGFuZ3VhZ2VTZXR0aW5nc1Byb3ZpZGVycyIvPg0KLQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0icmVmcmVzaFNjb3BlIiB2ZXJzaW9uTnVtYmVyPSIyIj4NCi0JCTxjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25OYW1lPSJSZWFsZWFzZS13aW4iLz4NCi0JCTxjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25OYW1lPSJEZWJ1Zy13aW4iLz4NCi0JCTxjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25OYW1lPSJEZWJ1ZyI+DQotCQkJPHJlc291cmNlIHJlc291cmNlVHlwZT0iUFJPSkVDVCIgd29ya3NwYWNlUGF0aD0iL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlciIvPg0KLQkJPC9jb25maWd1cmF0aW9uPg0KLQkJPGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk5hbWU9IlJlbGVhc2UiPg0KLQkJCTxyZXNvdXJjZSByZXNvdXJjZVR5cGU9IlBST0pFQ1QiIHdvcmtzcGFjZVBhdGg9Ii9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIiLz4NCi0JCTwvY29uZmlndXJhdGlvbj4NCi0JCTxjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb25OYW1lPSJSZWxlYXNlLWxpbnV4MzIiLz4NCi0JPC9zdG9yYWdlTW9kdWxlPg0KLQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ib3JnLmVjbGlwc2UuY2R0Lm1ha2UuY29yZS5idWlsZHRhcmdldHMiLz4NCi0JPHN0b3JhZ2VNb2R1bGUgbW9kdWxlSWQ9Im9yZy5lY2xpcHNlLmNkdC5pbnRlcm5hbC51aS50ZXh0LmNvbW1lbnRPd25lclByb2plY3RNYXBwaW5ncyIvPg0KLQk8c3RvcmFnZU1vZHVsZSBtb2R1bGVJZD0ic2Nhbm5lckNvbmZpZ3VyYXRpb24iPg0KLQkJPGF1dG9kaXNjb3ZlcnkgZW5hYmxlZD0idHJ1ZSIgcHJvYmxlbVJlcG9ydGluZ0VuYWJsZWQ9InRydWUiIHNlbGVjdGVkUHJvZmlsZUlkPSIiLz4NCi0JCTxzY2FubmVyQ29uZmlnQnVpbGRJbmZvIGluc3RhbmNlSWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5kZWJ1Zy45Mzg0NDA1Njg7Y2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLmRlYnVnLjkzODQ0MDU2OC47Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLnNvLmRlYnVnLjE0ODM4MDY3Mzg7Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0LjEwMzY1MzQzMzciPg0KLQkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0iIi8+DQotCQk8L3NjYW5uZXJDb25maWdCdWlsZEluZm8+DQotCQk8c2Nhbm5lckNvbmZpZ0J1aWxkSW5mbyBpbnN0YW5jZUlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28uZGVidWcuOTM4NDQwNTY4O2NkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5kZWJ1Zy45Mzg0NDA1NjguO2NkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLnNvLmRlYnVnLjcwNTIzODQ2MztjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5pbnB1dC4yMDIyNTgxMDg4Ij4NCi0JCQk8YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9IiIvPg0KLQkJPC9zY2FubmVyQ29uZmlnQnVpbGRJbmZvPg0KLQkJPHNjYW5uZXJDb25maWdCdWlsZEluZm8gaW5zdGFuY2VJZD0iY2R0Lm1hbmFnZWRidWlsZC5jb25maWcuZ251LnNvLnJlbGVhc2UuMTYzMzU5MDM3OTtjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28ucmVsZWFzZS4xNjMzNTkwMzc5LjtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5zby5yZWxlYXNlLjIwNjMxMzEwOTY7Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jcHAuY29tcGlsZXIuaW5wdXQuMTYwOTAzMTU1OSI+DQotCQkJPGF1dG9kaXNjb3ZlcnkgZW5hYmxlZD0idHJ1ZSIgcHJvYmxlbVJlcG9ydGluZ0VuYWJsZWQ9InRydWUiIHNlbGVjdGVkUHJvZmlsZUlkPSIiLz4NCi0JCTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4NCi0JCTxzY2FubmVyQ29uZmlnQnVpbGRJbmZvIGluc3RhbmNlSWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5kZWJ1Zy45Mzg0NDA1NjguMjEyMTcyNTk5MjtjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28uZGVidWcuOTM4NDQwNTY4LjIxMjE3MjU5OTIuO2NkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuY3BwLmNvbXBpbGVyLm1pbmd3LmJhc2UuMTcxNTQ5OTAxNTtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmNwcC5jb21waWxlci5pbnB1dC4zNjQ4NDc0NzYiPg0KLQkJCTxhdXRvZGlzY292ZXJ5IGVuYWJsZWQ9InRydWUiIHByb2JsZW1SZXBvcnRpbmdFbmFibGVkPSJ0cnVlIiBzZWxlY3RlZFByb2ZpbGVJZD0iIi8+DQotCQk8L3NjYW5uZXJDb25maWdCdWlsZEluZm8+DQotCQk8c2Nhbm5lckNvbmZpZ0J1aWxkSW5mbyBpbnN0YW5jZUlkPSJjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28ucmVsZWFzZS4xNjMzNTkwMzc5O2NkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5yZWxlYXNlLjE2MzM1OTAzNzkuO2NkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5zby5yZWxlYXNlLjE5NzIyNTQ5NDc7Y2R0Lm1hbmFnZWRidWlsZC50b29sLmdudS5jLmNvbXBpbGVyLmlucHV0LjEwMDcwODI3NSI+DQotCQkJPGF1dG9kaXNjb3ZlcnkgZW5hYmxlZD0idHJ1ZSIgcHJvYmxlbVJlcG9ydGluZ0VuYWJsZWQ9InRydWUiIHNlbGVjdGVkUHJvZmlsZUlkPSIiLz4NCi0JCTwvc2Nhbm5lckNvbmZpZ0J1aWxkSW5mbz4NCi0JCTxzY2FubmVyQ29uZmlnQnVpbGRJbmZvIGluc3RhbmNlSWQ9ImNkdC5tYW5hZ2VkYnVpbGQuY29uZmlnLmdudS5zby5kZWJ1Zy45Mzg0NDA1NjguMjEyMTcyNTk5MjtjZHQubWFuYWdlZGJ1aWxkLmNvbmZpZy5nbnUuc28uZGVidWcuOTM4NDQwNTY4LjIxMjE3MjU5OTIuO2NkdC5tYW5hZ2VkYnVpbGQudG9vbC5nbnUuYy5jb21waWxlci5taW5ndy5iYXNlLjY5NTQ2MzI5NTtjZHQubWFuYWdlZGJ1aWxkLnRvb2wuZ251LmMuY29tcGlsZXIuaW5wdXQuNjkwNjQzNjA5Ij4NCi0JCQk8YXV0b2Rpc2NvdmVyeSBlbmFibGVkPSJ0cnVlIiBwcm9ibGVtUmVwb3J0aW5nRW5hYmxlZD0idHJ1ZSIgc2VsZWN0ZWRQcm9maWxlSWQ9IiIvPg0KLQkJPC9zY2FubmVyQ29uZmlnQnVpbGRJbmZvPg0KLQk8L3N0b3JhZ2VNb2R1bGU+DQotPC9jcHJvamVjdD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvLmdpdGlnbm9yZSBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmI5MTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0vRGVidWctd2luLwotL0RlYnVnLwotL1JlbGVhc2UtbGludXgzMi8KLS9SZWxlYXNlLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyLy5wcm9qZWN0IGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmFiMDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLmdlbm1ha2VidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmNkdC5tYW5hZ2VkYnVpbGRlci5jb3JlLlNjYW5uZXJDb25maWdCdWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0LmNvcmUuY25hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmNkdC5jb3JlLmNjbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUubWFuYWdlZEJ1aWxkTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuY2R0Lm1hbmFnZWRidWlsZGVyLmNvcmUuU2Nhbm5lckNvbmZpZ05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL0RlYnVnLXdpbi8uZ2l0aWdub3JlIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL0RlYnVnLXdpbi8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGE5NTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9EZWJ1Zy13aW4vLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS9saWJmbXV3cmFwcGVyLnNvCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvRGVidWctd2luL2ZtdXdyYXBwZXIvc3JjL0Fic3RyYWN0Rk1JQ29tcG9uZW50Lm8gYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvRGVidWctd2luL2ZtdXdyYXBwZXIvc3JjL0Fic3RyYWN0Rk1JQ29tcG9uZW50Lm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZWIzYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL0RlYnVnLXdpbi9mbXV3cmFwcGVyL3NyYy9BYnN0cmFjdEZNSUNvbXBvbmVudC5vCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL1JlYWxlYXNlLXdpbi8uZ2l0aWdub3JlIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL1JlYWxlYXNlLXdpbi8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYyZGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9SZWFsZWFzZS13aW4vLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS9saWJmbXV3cmFwcGVyLmRsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL1JlYWxlYXNlLXdpbi9mbXV3cmFwcGVyL3NyYy8uZ2l0aWdub3JlIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL1JlYWxlYXNlLXdpbi9mbXV3cmFwcGVyL3NyYy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmU4YWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9SZWFsZWFzZS13aW4vZm11d3JhcHBlci9zcmMvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotL0pTT05DbGllbnQubwotL0pTT05GTUlDb21wb25lbnQubwotL0pTT05GTVVXcmFwcGVyLm8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9SZWFsZWFzZS13aW4vZm11d3JhcHBlci9zcmMvQWJzdHJhY3RGTUlDb21wb25lbnQubyBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9SZWFsZWFzZS13aW4vZm11d3JhcHBlci9zcmMvQWJzdHJhY3RGTUlDb21wb25lbnQubwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlMDBmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvUmVhbGVhc2Utd2luL2ZtdXdyYXBwZXIvc3JjL0Fic3RyYWN0Rk1JQ29tcG9uZW50Lm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvUmVsZWFzZS9mbXV3cmFwcGVyLy5naXRpZ25vcmUgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvUmVsZWFzZS9mbXV3cmFwcGVyLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMDBjZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL1JlbGVhc2UvZm11d3JhcHBlci8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotL3NyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hYm91dC5odG1sIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZDQ5YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4NCi08dGl0bGU+QWJvdXQ8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFTi1VUyI+DQotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+DQotIA0KLTxwPkp1bmUgNSwgMjAwNzwvcD4JDQotPGgzPkxpY2Vuc2U8L2gzPg0KLQ0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIA0KLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIA0KLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uDQotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIA0KLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkNCi1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgDQotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQNCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4NCi0NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL0xJQ0VOU0VfMV8wLnR4dCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL0xJQ0VOU0VfMV8wLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiN2NkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9MSUNFTlNFXzFfMC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1Cb29zdCBTb2Z0d2FyZSBMaWNlbnNlIC0gVmVyc2lvbiAxLjAgLSBBdWd1c3QgMTd0aCwgMjAwMwotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24KLW9idGFpbmluZyBhIGNvcHkgb2YgdGhlIHNvZnR3YXJlIGFuZCBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBjb3ZlcmVkIGJ5Ci10aGlzIGxpY2Vuc2UgKHRoZSAiU29mdHdhcmUiKSB0byB1c2UsIHJlcHJvZHVjZSwgZGlzcGxheSwgZGlzdHJpYnV0ZSwKLWV4ZWN1dGUsIGFuZCB0cmFuc21pdCB0aGUgU29mdHdhcmUsIGFuZCB0byBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlCi1Tb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCB0aGlyZC1wYXJ0aWVzIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0bwotZG8gc28sIGFsbCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmc6Ci0KLVRoZSBjb3B5cmlnaHQgbm90aWNlcyBpbiB0aGUgU29mdHdhcmUgYW5kIHRoaXMgZW50aXJlIHN0YXRlbWVudCwgaW5jbHVkaW5nCi10aGUgYWJvdmUgbGljZW5zZSBncmFudCwgdGhpcyByZXN0cmljdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotbXVzdCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgYW5kCi1hbGwgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU29mdHdhcmUsIHVubGVzcyBzdWNoIGNvcGllcyBvciBkZXJpdmF0aXZlCi13b3JrcyBhcmUgc29sZWx5IGluIHRoZSBmb3JtIG9mIG1hY2hpbmUtZXhlY3V0YWJsZSBvYmplY3QgY29kZSBnZW5lcmF0ZWQgYnkKLWEgc291cmNlIGxhbmd1YWdlIHByb2Nlc3Nvci4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVAotU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIEFOWU9ORSBESVNUUklCVVRJTkcgVEhFIFNPRlRXQVJFIEJFIExJQUJMRQotRk9SIEFOWSBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi1BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKLURFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvTWFrZWZpbGUuYW0gYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmUzYjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotIyBmaW5kIC4gLW5hbWUgIiouKnBwIiB8IHNlZCAtZSAncy9eXC5cLy8vJyB8IHNlZCAtZSAncy9eLiokLyAgJiBcXC8nIHwgc29ydAotbm9iYXNlX2luY2x1ZGVfSEVBREVSUyA9IFwKLQlhc2lvL2FzeW5jX3Jlc3VsdC5ocHAgXAotCWFzaW8vYmFzaWNfZGF0YWdyYW1fc29ja2V0LmhwcCBcCi0JYXNpby9iYXNpY19kZWFkbGluZV90aW1lci5ocHAgXAotCWFzaW8vYmFzaWNfaW9fb2JqZWN0LmhwcCBcCi0JYXNpby9iYXNpY19yYXdfc29ja2V0LmhwcCBcCi0JYXNpby9iYXNpY19zZXFfcGFja2V0X3NvY2tldC5ocHAgXAotCWFzaW8vYmFzaWNfc2VyaWFsX3BvcnQuaHBwIFwKLQlhc2lvL2Jhc2ljX3NpZ25hbF9zZXQuaHBwIFwKLQlhc2lvL2Jhc2ljX3NvY2tldF9hY2NlcHRvci5ocHAgXAotCWFzaW8vYmFzaWNfc29ja2V0LmhwcCBcCi0JYXNpby9iYXNpY19zb2NrZXRfaW9zdHJlYW0uaHBwIFwKLQlhc2lvL2Jhc2ljX3NvY2tldF9zdHJlYW1idWYuaHBwIFwKLQlhc2lvL2Jhc2ljX3N0cmVhbWJ1Zl9md2QuaHBwIFwKLQlhc2lvL2Jhc2ljX3N0cmVhbWJ1Zi5ocHAgXAotCWFzaW8vYmFzaWNfc3RyZWFtX3NvY2tldC5ocHAgXAotCWFzaW8vYmFzaWNfd2FpdGFibGVfdGltZXIuaHBwIFwKLQlhc2lvL2J1ZmZlcmVkX3JlYWRfc3RyZWFtX2Z3ZC5ocHAgXAotCWFzaW8vYnVmZmVyZWRfcmVhZF9zdHJlYW0uaHBwIFwKLQlhc2lvL2J1ZmZlcmVkX3N0cmVhbV9md2QuaHBwIFwKLQlhc2lvL2J1ZmZlcmVkX3N0cmVhbS5ocHAgXAotCWFzaW8vYnVmZmVyZWRfd3JpdGVfc3RyZWFtX2Z3ZC5ocHAgXAotCWFzaW8vYnVmZmVyZWRfd3JpdGVfc3RyZWFtLmhwcCBcCi0JYXNpby9idWZmZXIuaHBwIFwKLQlhc2lvL2J1ZmZlcnNfaXRlcmF0b3IuaHBwIFwKLQlhc2lvL2NvbXBsZXRpb25fY29uZGl0aW9uLmhwcCBcCi0JYXNpby9jb25uZWN0LmhwcCBcCi0JYXNpby9jb3JvdXRpbmUuaHBwIFwKLQlhc2lvL2RhdGFncmFtX3NvY2tldF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZWFkbGluZV90aW1lci5ocHAgXAotCWFzaW8vZGVhZGxpbmVfdGltZXJfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAgXAotCWFzaW8vZGV0YWlsL2FycmF5X2Z3ZC5ocHAgXAotCWFzaW8vZGV0YWlsL2FycmF5LmhwcCBcCi0JYXNpby9kZXRhaWwvYXNzZXJ0LmhwcCBcCi0JYXNpby9kZXRhaWwvYXRvbWljX2NvdW50LmhwcCBcCi0JYXNpby9kZXRhaWwvYmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZC5ocHAgXAotCWFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAgXAotCWFzaW8vZGV0YWlsL2J1ZmZlcmVkX3N0cmVhbV9zdG9yYWdlLmhwcCBcCi0JYXNpby9kZXRhaWwvYnVmZmVyX3Jlc2l6ZV9ndWFyZC5ocHAgXAotCWFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvY2FsbF9zdGFjay5ocHAgXAotCWFzaW8vZGV0YWlsL2Nocm9ub190aW1lX3RyYWl0cy5ocHAgXAotCWFzaW8vZGV0YWlsL2NvbXBsZXRpb25faGFuZGxlci5ocHAgXAotCWFzaW8vZGV0YWlsL2NvbmZpZy5ocHAgXAotCWFzaW8vZGV0YWlsL2NvbnN1bWluZ19idWZmZXJzLmhwcCBcCi0JYXNpby9kZXRhaWwvY3N0ZGludC5ocHAgXAotCWFzaW8vZGV0YWlsL2RhdGVfdGltZV9md2QuaHBwIFwKLQlhc2lvL2RldGFpbC9kZWFkbGluZV90aW1lcl9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvZGVwZW5kZW50X3R5cGUuaHBwIFwKLQlhc2lvL2RldGFpbC9kZXNjcmlwdG9yX29wcy5ocHAgXAotCWFzaW8vZGV0YWlsL2Rlc2NyaXB0b3JfcmVhZF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL2Rlc2NyaXB0b3Jfd3JpdGVfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9kZXZfcG9sbF9yZWFjdG9yLmhwcCBcCi0JYXNpby9kZXRhaWwvZXBvbGxfcmVhY3Rvci5ocHAgXAotCWFzaW8vZGV0YWlsL2V2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvZXZlbnQuaHBwIFwKLQlhc2lvL2RldGFpbC9mZF9zZXRfYWRhcHRlci5ocHAgXAotCWFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAgXAotCWFzaW8vZGV0YWlsL2Z1bmN0aW9uLmhwcCBcCi0JYXNpby9kZXRhaWwvZ2NjX2FybV9mZW5jZWRfYmxvY2suaHBwIFwKLQlhc2lvL2RldGFpbC9nY2NfaHBwYV9mZW5jZWRfYmxvY2suaHBwIFwKLQlhc2lvL2RldGFpbC9nY2Nfc3luY19mZW5jZWRfYmxvY2suaHBwIFwKLQlhc2lvL2RldGFpbC9nY2NfeDg2X2ZlbmNlZF9ibG9jay5ocHAgXAotCWFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAgXAotCWFzaW8vZGV0YWlsL2hhbmRsZXJfY29udF9oZWxwZXJzLmhwcCBcCi0JYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAgXAotCWFzaW8vZGV0YWlsL2hhbmRsZXJfdHJhY2tpbmcuaHBwIFwKLQlhc2lvL2RldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcCBcCi0JYXNpby9kZXRhaWwvaGFzaF9tYXAuaHBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9kZXNjcmlwdG9yX29wcy5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvZGV2X3BvbGxfcmVhY3Rvci5ocHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvZGV2X3BvbGxfcmVhY3Rvci5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvZXBvbGxfcmVhY3Rvci5ocHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvZXBvbGxfcmVhY3Rvci5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvZXZlbnRmZF9zZWxlY3RfaW50ZXJydXB0ZXIuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL2hhbmRsZXJfdHJhY2tpbmcuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL2txdWV1ZV9yZWFjdG9yLmhwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9rcXVldWVfcmVhY3Rvci5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvcGlwZV9zZWxlY3RfaW50ZXJydXB0ZXIuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3Bvc2l4X2V2ZW50LmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9wb3NpeF9tdXRleC5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvcG9zaXhfdGhyZWFkLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9wb3NpeF90c3NfcHRyLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9yZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2UuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3JlYWN0aXZlX3NlcmlhbF9wb3J0X3NlcnZpY2UuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3JlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3Jlc29sdmVyX3NlcnZpY2VfYmFzZS5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvc2VsZWN0X3JlYWN0b3IuaHBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3NlbGVjdF9yZWFjdG9yLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9zZXJ2aWNlX3JlZ2lzdHJ5LmhwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9zZXJ2aWNlX3JlZ2lzdHJ5LmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9zaWduYWxfc2V0X3NlcnZpY2UuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3NvY2tldF9vcHMuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3NvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXIuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3N0cmFuZF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9zdHJhbmRfc2VydmljZS5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvdGFza19pb19zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC90YXNrX2lvX3NlcnZpY2UuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3Rocm93X2Vycm9yLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC90aW1lcl9xdWV1ZV9wdGltZS5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvdGltZXJfcXVldWVfc2V0LmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5fZXZlbnQuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3dpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9pb19zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9pb19zZXJ2aWNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5fbXV0ZXguaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3dpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3dpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaHBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3dpbnJ0X3RpbWVyX3NjaGVkdWxlci5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2luc29ja19pbml0LmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5fc3RhdGljX211dGV4LmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5fdGhyZWFkLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5fdHNzX3B0ci5pcHAgXAotCWFzaW8vZGV0YWlsL2lvX2NvbnRyb2wuaHBwIFwKLQlhc2lvL2RldGFpbC9rZXl3b3JkX3Rzc19wdHIuaHBwIFwKLQlhc2lvL2RldGFpbC9rcXVldWVfcmVhY3Rvci5ocHAgXAotCWFzaW8vZGV0YWlsL2xpbWl0cy5ocHAgXAotCWFzaW8vZGV0YWlsL2xvY2FsX2ZyZWVfb25fYmxvY2tfZXhpdC5ocHAgXAotCWFzaW8vZGV0YWlsL21hY29zX2ZlbmNlZF9ibG9jay5ocHAgXAotCWFzaW8vZGV0YWlsL211dGV4LmhwcCBcCi0JYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIFwKLQlhc2lvL2RldGFpbC9udWxsX2V2ZW50LmhwcCBcCi0JYXNpby9kZXRhaWwvbnVsbF9mZW5jZWRfYmxvY2suaHBwIFwKLQlhc2lvL2RldGFpbC9udWxsX211dGV4LmhwcCBcCi0JYXNpby9kZXRhaWwvbnVsbF9yZWFjdG9yLmhwcCBcCi0JYXNpby9kZXRhaWwvbnVsbF9zaWduYWxfYmxvY2tlci5ocHAgXAotCWFzaW8vZGV0YWlsL251bGxfc29ja2V0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC9udWxsX3N0YXRpY19tdXRleC5ocHAgXAotCWFzaW8vZGV0YWlsL251bGxfdGhyZWFkLmhwcCBcCi0JYXNpby9kZXRhaWwvbnVsbF90c3NfcHRyLmhwcCBcCi0JYXNpby9kZXRhaWwvb2JqZWN0X3Bvb2wuaHBwIFwKLQlhc2lvL2RldGFpbC9vbGRfd2luX3Nka19jb21wYXQuaHBwIFwKLQlhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIFwKLQlhc2lvL2RldGFpbC9vcF9xdWV1ZS5ocHAgXAotCWFzaW8vZGV0YWlsL3BpcGVfc2VsZWN0X2ludGVycnVwdGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIFwKLQlhc2lvL2RldGFpbC9wb3NpeF9ldmVudC5ocHAgXAotCWFzaW8vZGV0YWlsL3Bvc2l4X2ZkX3NldF9hZGFwdGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvcG9zaXhfbXV0ZXguaHBwIFwKLQlhc2lvL2RldGFpbC9wb3NpeF9zaWduYWxfYmxvY2tlci5ocHAgXAotCWFzaW8vZGV0YWlsL3Bvc2l4X3N0YXRpY19tdXRleC5ocHAgXAotCWFzaW8vZGV0YWlsL3Bvc2l4X3RocmVhZC5ocHAgXAotCWFzaW8vZGV0YWlsL3Bvc2l4X3Rzc19wdHIuaHBwIFwKLQlhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdGl2ZV9udWxsX2J1ZmZlcnNfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X2FjY2VwdF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9jb25uZWN0X29wLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3JlY3Ztc2dfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfcmVjdl9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZW5kX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlbmR0b19vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL3JlYWN0b3JfZndkLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3Rvci5ocHAgXAotCWFzaW8vZGV0YWlsL3JlYWN0b3Jfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdG9yX29wX3F1ZXVlLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVnZXhfZndkLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVzb2x2ZV9lbmRwb2ludF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3Jlc29sdmVfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9yZXNvbHZlcl9zZXJ2aWNlX2Jhc2UuaHBwIFwKLQlhc2lvL2RldGFpbC9yZXNvbHZlcl9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvc2NvcGVkX2xvY2suaHBwIFwKLQlhc2lvL2RldGFpbC9zY29wZWRfcHRyLmhwcCBcCi0JYXNpby9kZXRhaWwvc2VsZWN0X2ludGVycnVwdGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvc2VsZWN0X3JlYWN0b3IuaHBwIFwKLQlhc2lvL2RldGFpbC9zZXJ2aWNlX3JlZ2lzdHJ5LmhwcCBcCi0JYXNpby9kZXRhaWwvc2hhcmVkX3B0ci5ocHAgXAotCWFzaW8vZGV0YWlsL3NpZ25hbF9ibG9ja2VyLmhwcCBcCi0JYXNpby9kZXRhaWwvc2lnbmFsX2hhbmRsZXIuaHBwIFwKLQlhc2lvL2RldGFpbC9zaWduYWxfaW5pdC5ocHAgXAotCWFzaW8vZGV0YWlsL3NpZ25hbF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3NpZ25hbF9zZXRfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL3NvY2tldF9ob2xkZXIuaHBwIFwKLQlhc2lvL2RldGFpbC9zb2NrZXRfb3BzLmhwcCBcCi0JYXNpby9kZXRhaWwvc29ja2V0X29wdGlvbi5ocHAgXAotCWFzaW8vZGV0YWlsL3NvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXIuaHBwIFwKLQlhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIFwKLQlhc2lvL2RldGFpbC9zb2xhcmlzX2ZlbmNlZF9ibG9jay5ocHAgXAotCWFzaW8vZGV0YWlsL3N0YXRpY19tdXRleC5ocHAgXAotCWFzaW8vZGV0YWlsL3N0ZF9ldmVudC5ocHAgXAotCWFzaW8vZGV0YWlsL3N0ZF9tdXRleC5ocHAgXAotCWFzaW8vZGV0YWlsL3N0ZF9zdGF0aWNfbXV0ZXguaHBwIFwKLQlhc2lvL2RldGFpbC9zdGRfdGhyZWFkLmhwcCBcCi0JYXNpby9kZXRhaWwvc3RyYW5kX3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC90YXNrX2lvX3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC90YXNrX2lvX3NlcnZpY2Vfb3BlcmF0aW9uLmhwcCBcCi0JYXNpby9kZXRhaWwvdGFza19pb19zZXJ2aWNlX3RocmVhZF9pbmZvLmhwcCBcCi0JYXNpby9kZXRhaWwvdGhyZWFkLmhwcCBcCi0JYXNpby9kZXRhaWwvdGhyZWFkX2luZm9fYmFzZS5ocHAgXAotCWFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCBcCi0JYXNpby9kZXRhaWwvdGhyb3dfZXhjZXB0aW9uLmhwcCBcCi0JYXNpby9kZXRhaWwvdGltZXJfcXVldWVfYmFzZS5ocHAgXAotCWFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlLmhwcCBcCi0JYXNpby9kZXRhaWwvdGltZXJfcXVldWVfcHRpbWUuaHBwIFwKLQlhc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9zZXQuaHBwIFwKLQlhc2lvL2RldGFpbC90aW1lcl9zY2hlZHVsZXJfZndkLmhwcCBcCi0JYXNpby9kZXRhaWwvdGltZXJfc2NoZWR1bGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvdHNzX3B0ci5ocHAgXAotCWFzaW8vZGV0YWlsL3R5cGVfdHJhaXRzLmhwcCBcCi0JYXNpby9kZXRhaWwvdmFyaWFkaWNfdGVtcGxhdGVzLmhwcCBcCi0JYXNpby9kZXRhaWwvd2FpdF9oYW5kbGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvd2FpdF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dlYWtfcHRyLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luY2VfdGhyZWFkLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2V2ZW50LmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2ZkX3NldF9hZGFwdGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2ZlbmNlZF9ibG9jay5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX2hhbmRsZV9yZWFkX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3BfaGFuZGxlX3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9oYW5kbGVfd3JpdGVfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9pb19zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3BfbnVsbF9idWZmZXJzX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3Bfb3BlcmF0aW9uLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3Bfb3ZlcmxhcHBlZF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX292ZXJsYXBwZWRfcHRyLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3Bfc2VyaWFsX3BvcnRfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9hY2NlcHRfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfY29ubmVjdF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9yZWN2ZnJvbV9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9yZWN2bXNnX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3JlY3Zfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfc2VuZF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX3RocmVhZF9pbmZvLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX211dGV4LmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX29iamVjdF9oYW5kbGVfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbnJ0X2FzeW5jX21hbmFnZXIuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5ydF9hc3luY19vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbnJ0X3Jlc29sdmVfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5ydF9yZXNvbHZlcl9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvd2lucnRfc29ja2V0X2Nvbm5lY3Rfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5ydF9zb2NrZXRfcmVjdl9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbnJ0X3NvY2tldF9zZW5kX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5ydF9zc29ja2V0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5ydF91dGlscy5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbnNvY2tfaW5pdC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9zdGF0aWNfbXV0ZXguaHBwIFwKLQlhc2lvL2RldGFpbC93aW5fdGhyZWFkLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX3Rzc19wdHIuaHBwIFwKLQlhc2lvL2RldGFpbC93cmFwcGVkX2hhbmRsZXIuaHBwIFwKLQlhc2lvL2Vycm9yX2NvZGUuaHBwIFwKLQlhc2lvL2Vycm9yLmhwcCBcCi0JYXNpby9nZW5lcmljL2Jhc2ljX2VuZHBvaW50LmhwcCBcCi0JYXNpby9nZW5lcmljL2RhdGFncmFtX3Byb3RvY29sLmhwcCBcCi0JYXNpby9nZW5lcmljL2RldGFpbC9lbmRwb2ludC5ocHAgXAotCWFzaW8vZ2VuZXJpYy9kZXRhaWwvaW1wbC9lbmRwb2ludC5pcHAgXAotCWFzaW8vZ2VuZXJpYy9yYXdfcHJvdG9jb2wuaHBwIFwKLQlhc2lvL2dlbmVyaWMvc2VxX3BhY2tldF9wcm90b2NvbC5ocHAgXAotCWFzaW8vZ2VuZXJpYy9zdHJlYW1fcHJvdG9jb2wuaHBwIFwKLQlhc2lvL2hhbmRsZXJfYWxsb2NfaG9vay5ocHAgXAotCWFzaW8vaGFuZGxlcl9jb250aW51YXRpb25faG9vay5ocHAgXAotCWFzaW8vaGFuZGxlcl9pbnZva2VfaG9vay5ocHAgXAotCWFzaW8vaGFuZGxlcl90eXBlLmhwcCBcCi0JYXNpby9oaWdoX3Jlc29sdXRpb25fdGltZXIuaHBwIFwKLQlhc2lvLmhwcCBcCi0JYXNpby9pbXBsL2J1ZmZlcmVkX3JlYWRfc3RyZWFtLmhwcCBcCi0JYXNpby9pbXBsL2J1ZmZlcmVkX3dyaXRlX3N0cmVhbS5ocHAgXAotCWFzaW8vaW1wbC9jb25uZWN0LmhwcCBcCi0JYXNpby9pbXBsL2Vycm9yX2NvZGUuaXBwIFwKLQlhc2lvL2ltcGwvZXJyb3IuaXBwIFwKLQlhc2lvL2ltcGwvaGFuZGxlcl9hbGxvY19ob29rLmlwcCBcCi0JYXNpby9pbXBsL2lvX3NlcnZpY2UuaHBwIFwKLQlhc2lvL2ltcGwvaW9fc2VydmljZS5pcHAgXAotCWFzaW8vaW1wbC9yZWFkX2F0LmhwcCBcCi0JYXNpby9pbXBsL3JlYWQuaHBwIFwKLQlhc2lvL2ltcGwvcmVhZF91bnRpbC5ocHAgXAotCWFzaW8vaW1wbC9zZXJpYWxfcG9ydF9iYXNlLmhwcCBcCi0JYXNpby9pbXBsL3NlcmlhbF9wb3J0X2Jhc2UuaXBwIFwKLQlhc2lvL2ltcGwvc3Bhd24uaHBwIFwKLQlhc2lvL2ltcGwvc3JjLmNwcCBcCi0JYXNpby9pbXBsL3NyYy5ocHAgXAotCWFzaW8vaW1wbC91c2VfZnV0dXJlLmhwcCBcCi0JYXNpby9pbXBsL3dyaXRlX2F0LmhwcCBcCi0JYXNpby9pbXBsL3dyaXRlLmhwcCBcCi0JYXNpby9pb19zZXJ2aWNlLmhwcCBcCi0JYXNpby9pcC9hZGRyZXNzLmhwcCBcCi0JYXNpby9pcC9hZGRyZXNzX3Y0LmhwcCBcCi0JYXNpby9pcC9hZGRyZXNzX3Y2LmhwcCBcCi0JYXNpby9pcC9iYXNpY19lbmRwb2ludC5ocHAgXAotCWFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfZW50cnkuaHBwIFwKLQlhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyLmhwcCBcCi0JYXNpby9pcC9iYXNpY19yZXNvbHZlcl9pdGVyYXRvci5ocHAgXAotCWFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfcXVlcnkuaHBwIFwKLQlhc2lvL2lwL2RldGFpbC9lbmRwb2ludC5ocHAgXAotCWFzaW8vaXAvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwIFwKLQlhc2lvL2lwL2RldGFpbC9zb2NrZXRfb3B0aW9uLmhwcCBcCi0JYXNpby9pcC9ob3N0X25hbWUuaHBwIFwKLQlhc2lvL2lwL2ljbXAuaHBwIFwKLQlhc2lvL2lwL2ltcGwvYWRkcmVzcy5ocHAgXAotCWFzaW8vaXAvaW1wbC9hZGRyZXNzLmlwcCBcCi0JYXNpby9pcC9pbXBsL2FkZHJlc3NfdjQuaHBwIFwKLQlhc2lvL2lwL2ltcGwvYWRkcmVzc192NC5pcHAgXAotCWFzaW8vaXAvaW1wbC9hZGRyZXNzX3Y2LmhwcCBcCi0JYXNpby9pcC9pbXBsL2FkZHJlc3NfdjYuaXBwIFwKLQlhc2lvL2lwL2ltcGwvYmFzaWNfZW5kcG9pbnQuaHBwIFwKLQlhc2lvL2lwL2ltcGwvaG9zdF9uYW1lLmlwcCBcCi0JYXNpby9pcC9tdWx0aWNhc3QuaHBwIFwKLQlhc2lvL2lwL3Jlc29sdmVyX3F1ZXJ5X2Jhc2UuaHBwIFwKLQlhc2lvL2lwL3Jlc29sdmVyX3NlcnZpY2UuaHBwIFwKLQlhc2lvL2lwL3RjcC5ocHAgXAotCWFzaW8vaXAvdWRwLmhwcCBcCi0JYXNpby9pcC91bmljYXN0LmhwcCBcCi0JYXNpby9pcC92Nl9vbmx5LmhwcCBcCi0JYXNpby9pc19yZWFkX2J1ZmZlcmVkLmhwcCBcCi0JYXNpby9pc193cml0ZV9idWZmZXJlZC5ocHAgXAotCWFzaW8vbG9jYWwvYmFzaWNfZW5kcG9pbnQuaHBwIFwKLQlhc2lvL2xvY2FsL2Nvbm5lY3RfcGFpci5ocHAgXAotCWFzaW8vbG9jYWwvZGF0YWdyYW1fcHJvdG9jb2wuaHBwIFwKLQlhc2lvL2xvY2FsL2RldGFpbC9lbmRwb2ludC5ocHAgXAotCWFzaW8vbG9jYWwvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwIFwKLQlhc2lvL2xvY2FsL3N0cmVhbV9wcm90b2NvbC5ocHAgXAotCWFzaW8vcGxhY2Vob2xkZXJzLmhwcCBcCi0JYXNpby9wb3NpeC9iYXNpY19kZXNjcmlwdG9yLmhwcCBcCi0JYXNpby9wb3NpeC9iYXNpY19zdHJlYW1fZGVzY3JpcHRvci5ocHAgXAotCWFzaW8vcG9zaXgvZGVzY3JpcHRvcl9iYXNlLmhwcCBcCi0JYXNpby9wb3NpeC9zdHJlYW1fZGVzY3JpcHRvci5ocHAgXAotCWFzaW8vcG9zaXgvc3RyZWFtX2Rlc2NyaXB0b3Jfc2VydmljZS5ocHAgXAotCWFzaW8vcmF3X3NvY2tldF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9yZWFkX2F0LmhwcCBcCi0JYXNpby9yZWFkLmhwcCBcCi0JYXNpby9yZWFkX3VudGlsLmhwcCBcCi0JYXNpby9zZXFfcGFja2V0X3NvY2tldF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9zZXJpYWxfcG9ydF9iYXNlLmhwcCBcCi0JYXNpby9zZXJpYWxfcG9ydC5ocHAgXAotCWFzaW8vc2VyaWFsX3BvcnRfc2VydmljZS5ocHAgXAotCWFzaW8vc2lnbmFsX3NldC5ocHAgXAotCWFzaW8vc2lnbmFsX3NldF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9zb2NrZXRfYWNjZXB0b3Jfc2VydmljZS5ocHAgXAotCWFzaW8vc29ja2V0X2Jhc2UuaHBwIFwKLQlhc2lvL3NwYXduLmhwcCBcCi0JYXNpby9zc2wvYmFzaWNfY29udGV4dC5ocHAgXAotCWFzaW8vc3NsL2NvbnRleHRfYmFzZS5ocHAgXAotCWFzaW8vc3NsL2NvbnRleHQuaHBwIFwKLQlhc2lvL3NzbC9jb250ZXh0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvYnVmZmVyZWRfaGFuZHNoYWtlX29wLmhwcCBcCi0JYXNpby9zc2wvZGV0YWlsL2VuZ2luZS5ocHAgXAotCWFzaW8vc3NsL2RldGFpbC9oYW5kc2hha2Vfb3AuaHBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvaW1wbC9lbmdpbmUuaXBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvaW1wbC9vcGVuc3NsX2luaXQuaXBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvaW8uaHBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvb3BlbnNzbF9pbml0LmhwcCBcCi0JYXNpby9zc2wvZGV0YWlsL29wZW5zc2xfdHlwZXMuaHBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvcGFzc3dvcmRfY2FsbGJhY2suaHBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvcmVhZF9vcC5ocHAgXAotCWFzaW8vc3NsL2RldGFpbC9zaHV0ZG93bl9vcC5ocHAgXAotCWFzaW8vc3NsL2RldGFpbC9zdHJlYW1fY29yZS5ocHAgXAotCWFzaW8vc3NsL2RldGFpbC92ZXJpZnlfY2FsbGJhY2suaHBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvd3JpdGVfb3AuaHBwIFwKLQlhc2lvL3NzbC9lcnJvci5ocHAgXAotCWFzaW8vc3NsLmhwcCBcCi0JYXNpby9zc2wvaW1wbC9jb250ZXh0LmhwcCBcCi0JYXNpby9zc2wvaW1wbC9jb250ZXh0LmlwcCBcCi0JYXNpby9zc2wvaW1wbC9lcnJvci5pcHAgXAotCWFzaW8vc3NsL2ltcGwvcmZjMjgxOF92ZXJpZmljYXRpb24uaXBwIFwKLQlhc2lvL3NzbC9pbXBsL3NyYy5ocHAgXAotCWFzaW8vc3NsL29sZC9iYXNpY19jb250ZXh0LmhwcCBcCi0JYXNpby9zc2wvb2xkL2NvbnRleHRfc2VydmljZS5ocHAgXAotCWFzaW8vc3NsL29sZC9kZXRhaWwvb3BlbnNzbF9jb250ZXh0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL3NzbC9vbGQvZGV0YWlsL29wZW5zc2xfb3BlcmF0aW9uLmhwcCBcCi0JYXNpby9zc2wvb2xkL2RldGFpbC9vcGVuc3NsX3N0cmVhbV9zZXJ2aWNlLmhwcCBcCi0JYXNpby9zc2wvb2xkL3N0cmVhbS5ocHAgXAotCWFzaW8vc3NsL29sZC9zdHJlYW1fc2VydmljZS5ocHAgXAotCWFzaW8vc3NsL3JmYzI4MThfdmVyaWZpY2F0aW9uLmhwcCBcCi0JYXNpby9zc2wvc3RyZWFtX2Jhc2UuaHBwIFwKLQlhc2lvL3NzbC9zdHJlYW0uaHBwIFwKLQlhc2lvL3NzbC9zdHJlYW1fc2VydmljZS5ocHAgXAotCWFzaW8vc3NsL3ZlcmlmeV9jb250ZXh0LmhwcCBcCi0JYXNpby9zc2wvdmVyaWZ5X21vZGUuaHBwIFwKLQlhc2lvL3N0ZWFkeV90aW1lci5ocHAgXAotCWFzaW8vc3RyYW5kLmhwcCBcCi0JYXNpby9zdHJlYW1idWYuaHBwIFwKLQlhc2lvL3N0cmVhbV9zb2NrZXRfc2VydmljZS5ocHAgXAotCWFzaW8vc3lzdGVtX2Vycm9yLmhwcCBcCi0JYXNpby9zeXN0ZW1fdGltZXIuaHBwIFwKLQlhc2lvL3RocmVhZC5ocHAgXAotCWFzaW8vdGltZV90cmFpdHMuaHBwIFwKLQlhc2lvL3VueWllbGQuaHBwIFwKLQlhc2lvL3VzZV9mdXR1cmUuaHBwIFwKLQlhc2lvL3ZlcnNpb24uaHBwIFwKLQlhc2lvL3dhaXRhYmxlX3RpbWVyX3NlcnZpY2UuaHBwIFwKLQlhc2lvL3dhaXRfdHJhaXRzLmhwcCBcCi0JYXNpby93aW5kb3dzL2Jhc2ljX2hhbmRsZS5ocHAgXAotCWFzaW8vd2luZG93cy9iYXNpY19vYmplY3RfaGFuZGxlLmhwcCBcCi0JYXNpby93aW5kb3dzL2Jhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlLmhwcCBcCi0JYXNpby93aW5kb3dzL2Jhc2ljX3N0cmVhbV9oYW5kbGUuaHBwIFwKLQlhc2lvL3dpbmRvd3Mvb2JqZWN0X2hhbmRsZS5ocHAgXAotCWFzaW8vd2luZG93cy9vYmplY3RfaGFuZGxlX3NlcnZpY2UuaHBwIFwKLQlhc2lvL3dpbmRvd3Mvb3ZlcmxhcHBlZF9wdHIuaHBwIFwKLQlhc2lvL3dpbmRvd3MvcmFuZG9tX2FjY2Vzc19oYW5kbGUuaHBwIFwKLQlhc2lvL3dpbmRvd3MvcmFuZG9tX2FjY2Vzc19oYW5kbGVfc2VydmljZS5ocHAgXAotCWFzaW8vd2luZG93cy9zdHJlYW1faGFuZGxlLmhwcCBcCi0JYXNpby93aW5kb3dzL3N0cmVhbV9oYW5kbGVfc2VydmljZS5ocHAgXAotCWFzaW8vd3JpdGVfYXQuaHBwIFwKLQlhc2lvL3dyaXRlLmhwcCBcCi0JYXNpby95aWVsZC5ocHAKLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBcCi0JJChzcmNkaXIpL01ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL01ha2VmaWxlLmluIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlNDY0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsOTM1ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTQuMSBmcm9tIE1ha2VmaWxlLmFtLgotIyBAY29uZmlndXJlX2lucHV0QAotCi0jIENvcHlyaWdodCAoQykgMTk5NC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1AU0VUX01BS0VACi0KLVZQQVRIID0gQHNyY2RpckAKLWFtX19pc19nbnVfbWFrZSA9IHRlc3QgLW4gJyQoTUFLRUZJTEVfTElTVCknICYmIHRlc3QgLW4gJyQoTUFLRUxFVkVMKScKLWFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24gPSBcCi0gIGNhc2UgJCR7dGFyZ2V0X29wdGlvbi19IGluIFwKLSAgICAgID8pIDs7IFwKLSAgICAgICopIGVjaG8gImFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb246IGludGVybmFsIGVycm9yOiBpbnZhbGlkIiBcCi0gICAgICAgICAgICAgICJ0YXJnZXQgb3B0aW9uICckJHt0YXJnZXRfb3B0aW9uLX0nIHNwZWNpZmllZCIgPiYyOyBcCi0gICAgICAgICBleGl0IDE7OyBcCi0gIGVzYWM7IFwKLSAgaGFzX29wdD1ubzsgXAotICBzYW5lX21ha2VmbGFncz0kJE1BS0VGTEFHUzsgXAotICBpZiAkKGFtX19pc19nbnVfbWFrZSk7IHRoZW4gXAotICAgIHNhbmVfbWFrZWZsYWdzPSQkTUZMQUdTOyBcCi0gIGVsc2UgXAotICAgIGNhc2UgJCRNQUtFRkxBR1MgaW4gXAotICAgICAgKlxcW1wgXAldKikgXAotICAgICAgICBicz1cXDsgXAotICAgICAgICBzYW5lX21ha2VmbGFncz1gcHJpbnRmICclc1xuJyAiJCRNQUtFRkxBR1MiIFwKLSAgICAgICAgICB8IHNlZCAicy8kJGJzJCRic1skJGJzICQkYnMJXSovL2ciYDs7IFwKLSAgICBlc2FjOyBcCi0gIGZpOyBcCi0gIHNraXBfbmV4dD1ubzsgXAotICBzdHJpcF90cmFpbG9wdCAoKSBcCi0gIHsgXAotICAgIGZsZz1gcHJpbnRmICclc1xuJyAiJCRmbGciIHwgc2VkICJzLyQkMS4qJCQvLyJgOyBcCi0gIH07IFwKLSAgZm9yIGZsZyBpbiAkJHNhbmVfbWFrZWZsYWdzOyBkbyBcCi0gICAgdGVzdCAkJHNraXBfbmV4dCA9IHllcyAmJiB7IHNraXBfbmV4dD1ubzsgY29udGludWU7IH07IFwKLSAgICBjYXNlICQkZmxnIGluIFwKLSAgICAgICo9KnwtLSopIGNvbnRpbnVlOzsgXAotICAgICAgICAtKkkpIHN0cmlwX3RyYWlsb3B0ICdJJzsgc2tpcF9uZXh0PXllczs7IFwKLSAgICAgIC0qST8qKSBzdHJpcF90cmFpbG9wdCAnSSc7OyBcCi0gICAgICAgIC0qTykgc3RyaXBfdHJhaWxvcHQgJ08nOyBza2lwX25leHQ9eWVzOzsgXAotICAgICAgLSpPPyopIHN0cmlwX3RyYWlsb3B0ICdPJzs7IFwKLSAgICAgICAgLSpsKSBzdHJpcF90cmFpbG9wdCAnbCc7IHNraXBfbmV4dD15ZXM7OyBcCi0gICAgICAtKmw/Kikgc3RyaXBfdHJhaWxvcHQgJ2wnOzsgXAotICAgICAgLVtkRURtXSkgc2tpcF9uZXh0PXllczs7IFwKLSAgICAgIC1bSlRdKSBza2lwX25leHQ9eWVzOzsgXAotICAgIGVzYWM7IFwKLSAgICBjYXNlICQkZmxnIGluIFwKLSAgICAgICokJHRhcmdldF9vcHRpb24qKSBoYXNfb3B0PXllczsgYnJlYWs7OyBcCi0gICAgZXNhYzsgXAotICBkb25lOyBcCi0gIHRlc3QgJCRoYXNfb3B0ID0geWVzCi1hbV9fbWFrZV9kcnlydW4gPSAodGFyZ2V0X29wdGlvbj1uOyAkKGFtX19tYWtlX3J1bm5pbmdfd2l0aF9vcHRpb24pKQotYW1fX21ha2Vfa2VlcGdvaW5nID0gKHRhcmdldF9vcHRpb249azsgJChhbV9fbWFrZV9ydW5uaW5nX3dpdGhfb3B0aW9uKSkKLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKLWFtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKLWluc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0Ci1pbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCi1pbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKLUlOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCi10cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXN1YmRpciA9IGluY2x1ZGUKLURJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5hbSBcCi0JJChub2Jhc2VfaW5jbHVkZV9IRUFERVJTKQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCi1hbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAotCSQoQUNMT0NBTF9NNCkKLW1raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCi1DT05GSUdfQ0xFQU5fRklMRVMgPQotQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KLUFNX1ZfUCA9ICQoYW1fX3ZfUF9AQU1fVkApCi1hbV9fdl9QXyA9ICQoYW1fX3ZfUF9AQU1fREVGQVVMVF9WQCkKLWFtX192X1BfMCA9IGZhbHNlCi1hbV9fdl9QXzEgPSA6Ci1BTV9WX0dFTiA9ICQoYW1fX3ZfR0VOX0BBTV9WQCkKLWFtX192X0dFTl8gPSAkKGFtX192X0dFTl9AQU1fREVGQVVMVF9WQCkKLWFtX192X0dFTl8wID0gQGVjaG8gIiAgR0VOICAgICAiICRAOwotYW1fX3ZfR0VOXzEgPSAKLUFNX1ZfYXQgPSAkKGFtX192X2F0X0BBTV9WQCkKLWFtX192X2F0XyA9ICQoYW1fX3ZfYXRfQEFNX0RFRkFVTFRfVkApCi1hbV9fdl9hdF8wID0gQAotYW1fX3ZfYXRfMSA9IAotU09VUkNFUyA9Ci1ESVNUX1NPVVJDRVMgPQotYW1fX2Nhbl9ydW5faW5zdGFsbGluZm8gPSBcCi0gIGNhc2UgJCRBTV9VUERBVEVfSU5GT19ESVIgaW4gXAotICAgIG58bm98Tk8pIGZhbHNlOzsgXAotICAgICopIChpbnN0YWxsLWluZm8gLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7OyBcCi0gIGVzYWMKLWFtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOwotYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKLSAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAotICAgICopIGY9JCRwOzsgXAotICBlc2FjOwotYW1fX3N0cmlwX2RpciA9IGY9YGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgOwotYW1fX2luc3RhbGxfbWF4ID0gNDAKLWFtX19ub2Jhc2Vfc3RyaXBfc2V0dXAgPSBcCi0gIHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCp8XS9cXFxcJi9nJ2AKLWFtX19ub2Jhc2Vfc3RyaXAgPSBcCi0gIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAtZSAic3wkJHNyY2RpcnN0cmlwL3x8IgotYW1fX25vYmFzZV9saXN0ID0gJChhbV9fbm9iYXNlX3N0cmlwX3NldHVwKTsgXAotICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAotICBzZWQgInN8ICQkc3JjZGlyc3RyaXAvfCB8OyInIC8gLipcLy8hcy8gLiovIC4vOyBzLFwoIC4qXCkvW14vXSokJCxcMSwnIHwgXAotICAkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiIH0geyBmaWxlc1skJDJdID0gZmlsZXNbJCQyXSAiICIgJCQxOyBcCi0gICAgaWYgKCsrblskJDJdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgXAotICAgICAgeyBwcmludCAkJDIsIGZpbGVzWyQkMl07IG5bJCQyXSA9IDA7IGZpbGVzWyQkMl0gPSAiIiB9IH0gXAotICAgIEVORCB7IGZvciAoZGlyIGluIGZpbGVzKSBwcmludCBkaXIsIGZpbGVzW2Rpcl0gfScKLWFtX19iYXNlX2xpc3QgPSBcCi0gIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycgfCBcCi0gIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycKLWFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIgPSB7IFwKLSAgdGVzdCAteiAiJCRmaWxlcyIgXAotICAgIHx8IHsgdGVzdCAhIC1kICIkJGRpciIgJiYgdGVzdCAhIC1mICIkJGRpciIgJiYgdGVzdCAhIC1yICIkJGRpciI7IH0gXAotICAgIHx8IHsgZWNobyAiICggY2QgJyQkZGlyJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKLSAgICAgICAgICQoYW1fX2NkKSAiJCRkaXIiICYmIHJtIC1mICQkZmlsZXM7IH07IFwKLSAgfQotYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKGluY2x1ZGVkaXIpIgotSEVBREVSUyA9ICQobm9iYXNlX2luY2x1ZGVfSEVBREVSUykKLWFtX190YWdnZWRfZmlsZXMgPSAkKEhFQURFUlMpICQoU09VUkNFUykgJChUQUdTX0ZJTEVTKSAkKExJU1ApCi0jIFJlYWQgYSBsaXN0IG9mIG5ld2xpbmUtc2VwYXJhdGVkIHN0cmluZ3MgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQsCi0jIGFuZCBwcmludCBlYWNoIG9mIHRoZW0gb25jZSwgd2l0aG91dCBkdXBsaWNhdGVzLiAgSW5wdXQgb3JkZXIgaXMKLSMgKm5vdCogcHJlc2VydmVkLgotYW1fX3VuaXF1aWZ5X2lucHV0ID0gJChBV0spICdcCi0gIEJFR0lOIHsgbm9uZW1wdHkgPSAwOyB9IFwKLSAgeyBpdGVtc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKLSAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBpdGVtcykgcHJpbnQgaTsgfTsgfSBcCi0nCi0jIE1ha2Ugc3VyZSB0aGUgbGlzdCBvZiBzb3VyY2VzIGlzIHVuaXF1ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UsCi0jIGUuZy4sIHRoZSBzYW1lIHNvdXJjZSBmaWxlIG1pZ2h0IGJlIHNoYXJlZCBhbW9uZyBfU09VUkNFUyB2YXJpYWJsZXMKLSMgZm9yIGRpZmZlcmVudCBwcm9ncmFtcy9saWJyYXJpZXMuCi1hbV9fZGVmaW5lX3VuaXFfdGFnZ2VkX2ZpbGVzID0gXAotICBsaXN0PSckKGFtX190YWdnZWRfZmlsZXMpJzsgXAotICB1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAotICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAotICBkb25lIHwgJChhbV9fdW5pcXVpZnlfaW5wdXQpYAotRVRBR1MgPSBldGFncwotQ1RBR1MgPSBjdGFncwotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFNVEFSID0gQEFNVEFSQAotQU1fREVGQVVMVF9WRVJCT1NJVFkgPSBAQU1fREVGQVVMVF9WRVJCT1NJVFlACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVdLID0gQEFXS0AKLUNDID0gQENDQAotQ0NERVBNT0RFID0gQENDREVQTU9ERUAKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNYWCA9IEBDWFhACi1DWFhDUFAgPSBAQ1hYQ1BQQAotQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAotQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACi1DWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAotREVGUyA9IEBERUZTQAotREVQRElSID0gQERFUERJUkAKLUVDSE9fQyA9IEBFQ0hPX0NACi1FQ0hPX04gPSBARUNIT19OQAotRUNIT19UID0gQEVDSE9fVEAKLUVHUkVQID0gQEVHUkVQQAotRVhFRVhUID0gQEVYRUVYVEAKLUdSRVAgPSBAR1JFUEAKLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCT0JKUyA9IEBMSUJPQkpTQAotTElCUyA9IEBMSUJTQAotTFRMSUJPQkpTID0gQExUTElCT0JKU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0RJUl9QID0gQE1LRElSX1BACi1PQkpFWFQgPSBAT0JKRVhUQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACi1QQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAotUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACi1QQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAotUEFDS0FHRV9VUkwgPSBAUEFDS0FHRV9VUkxACi1QQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAotUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACi1SQU5MSUIgPSBAUkFOTElCQAotU0VUX01BS0UgPSBAU0VUX01BS0VACi1TSEVMTCA9IEBTSEVMTEAKLVNUUklQID0gQFNUUklQQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKLWFic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKLWFic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKLWFic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAotYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACi1hY19jdF9DWFggPSBAYWNfY3RfQ1hYQAotYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACi1hbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAotYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKLWFtX190YXIgPSBAYW1fX3RhckAKLWFtX191bnRhciA9IEBhbV9fdW50YXJACi1iaW5kaXIgPSBAYmluZGlyQAotYnVpbGQgPSBAYnVpbGRACi1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX2NwdSA9IEBidWlsZF9jcHVACi1idWlsZF9vcyA9IEBidWlsZF9vc0AKLWJ1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACi1idWlsZGRpciA9IEBidWlsZGRpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLWRhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAotZG9jZGlyID0gQGRvY2RpckAKLWR2aWRpciA9IEBkdmlkaXJACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWhvc3QgPSBAaG9zdEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfY3B1ID0gQGhvc3RfY3B1QAotaG9zdF9vcyA9IEBob3N0X29zQAotaG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACi1odG1sZGlyID0gQGh0bWxkaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1pbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACi1saWJkaXIgPSBAbGliZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLW1hbmRpciA9IEBtYW5kaXJACi1ta2Rpcl9wID0gQG1rZGlyX3BACi1vbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACi1wZGZkaXIgPSBAcGRmZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLXBzZGlyID0gQHBzZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1zcmNkaXIgPSBAc3JjZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKLXRvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi0KLSMgZmluZCAuIC1uYW1lICIqLipwcCIgfCBzZWQgLWUgJ3MvXlwuXC8vLycgfCBzZWQgLWUgJ3MvXi4qJC8gICYgXFwvJyB8IHNvcnQKLW5vYmFzZV9pbmNsdWRlX0hFQURFUlMgPSBcCi0JYXNpby9hc3luY19yZXN1bHQuaHBwIFwKLQlhc2lvL2Jhc2ljX2RhdGFncmFtX3NvY2tldC5ocHAgXAotCWFzaW8vYmFzaWNfZGVhZGxpbmVfdGltZXIuaHBwIFwKLQlhc2lvL2Jhc2ljX2lvX29iamVjdC5ocHAgXAotCWFzaW8vYmFzaWNfcmF3X3NvY2tldC5ocHAgXAotCWFzaW8vYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQuaHBwIFwKLQlhc2lvL2Jhc2ljX3NlcmlhbF9wb3J0LmhwcCBcCi0JYXNpby9iYXNpY19zaWduYWxfc2V0LmhwcCBcCi0JYXNpby9iYXNpY19zb2NrZXRfYWNjZXB0b3IuaHBwIFwKLQlhc2lvL2Jhc2ljX3NvY2tldC5ocHAgXAotCWFzaW8vYmFzaWNfc29ja2V0X2lvc3RyZWFtLmhwcCBcCi0JYXNpby9iYXNpY19zb2NrZXRfc3RyZWFtYnVmLmhwcCBcCi0JYXNpby9iYXNpY19zdHJlYW1idWZfZndkLmhwcCBcCi0JYXNpby9iYXNpY19zdHJlYW1idWYuaHBwIFwKLQlhc2lvL2Jhc2ljX3N0cmVhbV9zb2NrZXQuaHBwIFwKLQlhc2lvL2Jhc2ljX3dhaXRhYmxlX3RpbWVyLmhwcCBcCi0JYXNpby9idWZmZXJlZF9yZWFkX3N0cmVhbV9md2QuaHBwIFwKLQlhc2lvL2J1ZmZlcmVkX3JlYWRfc3RyZWFtLmhwcCBcCi0JYXNpby9idWZmZXJlZF9zdHJlYW1fZndkLmhwcCBcCi0JYXNpby9idWZmZXJlZF9zdHJlYW0uaHBwIFwKLQlhc2lvL2J1ZmZlcmVkX3dyaXRlX3N0cmVhbV9md2QuaHBwIFwKLQlhc2lvL2J1ZmZlcmVkX3dyaXRlX3N0cmVhbS5ocHAgXAotCWFzaW8vYnVmZmVyLmhwcCBcCi0JYXNpby9idWZmZXJzX2l0ZXJhdG9yLmhwcCBcCi0JYXNpby9jb21wbGV0aW9uX2NvbmRpdGlvbi5ocHAgXAotCWFzaW8vY29ubmVjdC5ocHAgXAotCWFzaW8vY29yb3V0aW5lLmhwcCBcCi0JYXNpby9kYXRhZ3JhbV9zb2NrZXRfc2VydmljZS5ocHAgXAotCWFzaW8vZGVhZGxpbmVfdGltZXIuaHBwIFwKLQlhc2lvL2RlYWRsaW5lX3RpbWVyX3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIFwKLQlhc2lvL2RldGFpbC9hcnJheV9md2QuaHBwIFwKLQlhc2lvL2RldGFpbC9hcnJheS5ocHAgXAotCWFzaW8vZGV0YWlsL2Fzc2VydC5ocHAgXAotCWFzaW8vZGV0YWlsL2F0b21pY19jb3VudC5ocHAgXAotCWFzaW8vZGV0YWlsL2Jhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQuaHBwIFwKLQlhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIFwKLQlhc2lvL2RldGFpbC9idWZmZXJlZF9zdHJlYW1fc3RvcmFnZS5ocHAgXAotCWFzaW8vZGV0YWlsL2J1ZmZlcl9yZXNpemVfZ3VhcmQuaHBwIFwKLQlhc2lvL2RldGFpbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5ocHAgXAotCWFzaW8vZGV0YWlsL2NhbGxfc3RhY2suaHBwIFwKLQlhc2lvL2RldGFpbC9jaHJvbm9fdGltZV90cmFpdHMuaHBwIFwKLQlhc2lvL2RldGFpbC9jb21wbGV0aW9uX2hhbmRsZXIuaHBwIFwKLQlhc2lvL2RldGFpbC9jb25maWcuaHBwIFwKLQlhc2lvL2RldGFpbC9jb25zdW1pbmdfYnVmZmVycy5ocHAgXAotCWFzaW8vZGV0YWlsL2NzdGRpbnQuaHBwIFwKLQlhc2lvL2RldGFpbC9kYXRlX3RpbWVfZndkLmhwcCBcCi0JYXNpby9kZXRhaWwvZGVhZGxpbmVfdGltZXJfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL2RlcGVuZGVudF90eXBlLmhwcCBcCi0JYXNpby9kZXRhaWwvZGVzY3JpcHRvcl9vcHMuaHBwIFwKLQlhc2lvL2RldGFpbC9kZXNjcmlwdG9yX3JlYWRfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9kZXNjcmlwdG9yX3dyaXRlX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvZGV2X3BvbGxfcmVhY3Rvci5ocHAgXAotCWFzaW8vZGV0YWlsL2Vwb2xsX3JlYWN0b3IuaHBwIFwKLQlhc2lvL2RldGFpbC9ldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAgXAotCWFzaW8vZGV0YWlsL2V2ZW50LmhwcCBcCi0JYXNpby9kZXRhaWwvZmRfc2V0X2FkYXB0ZXIuaHBwIFwKLQlhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIFwKLQlhc2lvL2RldGFpbC9mdW5jdGlvbi5ocHAgXAotCWFzaW8vZGV0YWlsL2djY19hcm1fZmVuY2VkX2Jsb2NrLmhwcCBcCi0JYXNpby9kZXRhaWwvZ2NjX2hwcGFfZmVuY2VkX2Jsb2NrLmhwcCBcCi0JYXNpby9kZXRhaWwvZ2NjX3N5bmNfZmVuY2VkX2Jsb2NrLmhwcCBcCi0JYXNpby9kZXRhaWwvZ2NjX3g4Nl9mZW5jZWRfYmxvY2suaHBwIFwKLQlhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIFwKLQlhc2lvL2RldGFpbC9oYW5kbGVyX2NvbnRfaGVscGVycy5ocHAgXAotCWFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIFwKLQlhc2lvL2RldGFpbC9oYW5kbGVyX3RyYWNraW5nLmhwcCBcCi0JYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAgXAotCWFzaW8vZGV0YWlsL2hhc2hfbWFwLmhwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvZGVzY3JpcHRvcl9vcHMuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL2Rldl9wb2xsX3JlYWN0b3IuaHBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL2Rldl9wb2xsX3JlYWN0b3IuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL2Vwb2xsX3JlYWN0b3IuaHBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL2Vwb2xsX3JlYWN0b3IuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL2V2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9oYW5kbGVyX3RyYWNraW5nLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9rcXVldWVfcmVhY3Rvci5ocHAgXAotCWFzaW8vZGV0YWlsL2ltcGwva3F1ZXVlX3JlYWN0b3IuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3BpcGVfc2VsZWN0X2ludGVycnVwdGVyLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9wb3NpeF9ldmVudC5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvcG9zaXhfbXV0ZXguaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3Bvc2l4X3RocmVhZC5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvcG9zaXhfdHNzX3B0ci5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9yZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9yZXNvbHZlcl9zZXJ2aWNlX2Jhc2UuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3NlbGVjdF9yZWFjdG9yLmhwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9zZWxlY3RfcmVhY3Rvci5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvc2VydmljZV9yZWdpc3RyeS5ocHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvc2VydmljZV9yZWdpc3RyeS5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvc2lnbmFsX3NldF9zZXJ2aWNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9zb2NrZXRfb3BzLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9zb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC9zdHJhbmRfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvc3RyYW5kX3NlcnZpY2UuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3Rhc2tfaW9fc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvdGFza19pb19zZXJ2aWNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC90aHJvd19lcnJvci5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvdGltZXJfcXVldWVfcHRpbWUuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3RpbWVyX3F1ZXVlX3NldC5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2luX2V2ZW50LmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9oYW5kbGVfc2VydmljZS5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3BfaW9fc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3BfaW9fc2VydmljZS5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3Bfc2VyaWFsX3BvcnRfc2VydmljZS5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2luX211dGV4LmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlLmlwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2lucnRfdGltZXJfc2NoZWR1bGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvaW1wbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaXBwIFwKLQlhc2lvL2RldGFpbC9pbXBsL3dpbnNvY2tfaW5pdC5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2luX3N0YXRpY19tdXRleC5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2luX3RocmVhZC5pcHAgXAotCWFzaW8vZGV0YWlsL2ltcGwvd2luX3Rzc19wdHIuaXBwIFwKLQlhc2lvL2RldGFpbC9pb19jb250cm9sLmhwcCBcCi0JYXNpby9kZXRhaWwva2V5d29yZF90c3NfcHRyLmhwcCBcCi0JYXNpby9kZXRhaWwva3F1ZXVlX3JlYWN0b3IuaHBwIFwKLQlhc2lvL2RldGFpbC9saW1pdHMuaHBwIFwKLQlhc2lvL2RldGFpbC9sb2NhbF9mcmVlX29uX2Jsb2NrX2V4aXQuaHBwIFwKLQlhc2lvL2RldGFpbC9tYWNvc19mZW5jZWRfYmxvY2suaHBwIFwKLQlhc2lvL2RldGFpbC9tdXRleC5ocHAgXAotCWFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCBcCi0JYXNpby9kZXRhaWwvbnVsbF9ldmVudC5ocHAgXAotCWFzaW8vZGV0YWlsL251bGxfZmVuY2VkX2Jsb2NrLmhwcCBcCi0JYXNpby9kZXRhaWwvbnVsbF9tdXRleC5ocHAgXAotCWFzaW8vZGV0YWlsL251bGxfcmVhY3Rvci5ocHAgXAotCWFzaW8vZGV0YWlsL251bGxfc2lnbmFsX2Jsb2NrZXIuaHBwIFwKLQlhc2lvL2RldGFpbC9udWxsX3NvY2tldF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvbnVsbF9zdGF0aWNfbXV0ZXguaHBwIFwKLQlhc2lvL2RldGFpbC9udWxsX3RocmVhZC5ocHAgXAotCWFzaW8vZGV0YWlsL251bGxfdHNzX3B0ci5ocHAgXAotCWFzaW8vZGV0YWlsL29iamVjdF9wb29sLmhwcCBcCi0JYXNpby9kZXRhaWwvb2xkX3dpbl9zZGtfY29tcGF0LmhwcCBcCi0JYXNpby9kZXRhaWwvb3BlcmF0aW9uLmhwcCBcCi0JYXNpby9kZXRhaWwvb3BfcXVldWUuaHBwIFwKLQlhc2lvL2RldGFpbC9waXBlX3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAgXAotCWFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCBcCi0JYXNpby9kZXRhaWwvcG9zaXhfZXZlbnQuaHBwIFwKLQlhc2lvL2RldGFpbC9wb3NpeF9mZF9zZXRfYWRhcHRlci5ocHAgXAotCWFzaW8vZGV0YWlsL3Bvc2l4X211dGV4LmhwcCBcCi0JYXNpby9kZXRhaWwvcG9zaXhfc2lnbmFsX2Jsb2NrZXIuaHBwIFwKLQlhc2lvL2RldGFpbC9wb3NpeF9zdGF0aWNfbXV0ZXguaHBwIFwKLQlhc2lvL2RldGFpbC9wb3NpeF90aHJlYWQuaHBwIFwKLQlhc2lvL2RldGFpbC9wb3NpeF90c3NfcHRyLmhwcCBcCi0JYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3RpdmVfbnVsbF9idWZmZXJzX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9hY2NlcHRfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfY29ubmVjdF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9yZWN2ZnJvbV9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9yZWN2bXNnX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3JlY3Zfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VuZF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZW5kdG9fb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdG9yX2Z3ZC5ocHAgXAotCWFzaW8vZGV0YWlsL3JlYWN0b3IuaHBwIFwKLQlhc2lvL2RldGFpbC9yZWFjdG9yX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVhY3Rvcl9vcF9xdWV1ZS5ocHAgXAotCWFzaW8vZGV0YWlsL3JlZ2V4X2Z3ZC5ocHAgXAotCWFzaW8vZGV0YWlsL3Jlc29sdmVfZW5kcG9pbnRfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9yZXNvbHZlX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVzb2x2ZXJfc2VydmljZV9iYXNlLmhwcCBcCi0JYXNpby9kZXRhaWwvcmVzb2x2ZXJfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL3Njb3BlZF9sb2NrLmhwcCBcCi0JYXNpby9kZXRhaWwvc2NvcGVkX3B0ci5ocHAgXAotCWFzaW8vZGV0YWlsL3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAgXAotCWFzaW8vZGV0YWlsL3NlbGVjdF9yZWFjdG9yLmhwcCBcCi0JYXNpby9kZXRhaWwvc2VydmljZV9yZWdpc3RyeS5ocHAgXAotCWFzaW8vZGV0YWlsL3NoYXJlZF9wdHIuaHBwIFwKLQlhc2lvL2RldGFpbC9zaWduYWxfYmxvY2tlci5ocHAgXAotCWFzaW8vZGV0YWlsL3NpZ25hbF9oYW5kbGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvc2lnbmFsX2luaXQuaHBwIFwKLQlhc2lvL2RldGFpbC9zaWduYWxfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC9zaWduYWxfc2V0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC9zb2NrZXRfaG9sZGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAgXAotCWFzaW8vZGV0YWlsL3NvY2tldF9vcHRpb24uaHBwIFwKLQlhc2lvL2RldGFpbC9zb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCBcCi0JYXNpby9kZXRhaWwvc29sYXJpc19mZW5jZWRfYmxvY2suaHBwIFwKLQlhc2lvL2RldGFpbC9zdGF0aWNfbXV0ZXguaHBwIFwKLQlhc2lvL2RldGFpbC9zdGRfZXZlbnQuaHBwIFwKLQlhc2lvL2RldGFpbC9zdGRfbXV0ZXguaHBwIFwKLQlhc2lvL2RldGFpbC9zdGRfc3RhdGljX211dGV4LmhwcCBcCi0JYXNpby9kZXRhaWwvc3RkX3RocmVhZC5ocHAgXAotCWFzaW8vZGV0YWlsL3N0cmFuZF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvdGFza19pb19zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvdGFza19pb19zZXJ2aWNlX29wZXJhdGlvbi5ocHAgXAotCWFzaW8vZGV0YWlsL3Rhc2tfaW9fc2VydmljZV90aHJlYWRfaW5mby5ocHAgXAotCWFzaW8vZGV0YWlsL3RocmVhZC5ocHAgXAotCWFzaW8vZGV0YWlsL3RocmVhZF9pbmZvX2Jhc2UuaHBwIFwKLQlhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAgXAotCWFzaW8vZGV0YWlsL3Rocm93X2V4Y2VwdGlvbi5ocHAgXAotCWFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX2Jhc2UuaHBwIFwKLQlhc2lvL2RldGFpbC90aW1lcl9xdWV1ZS5ocHAgXAotCWFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX3B0aW1lLmhwcCBcCi0JYXNpby9kZXRhaWwvdGltZXJfcXVldWVfc2V0LmhwcCBcCi0JYXNpby9kZXRhaWwvdGltZXJfc2NoZWR1bGVyX2Z3ZC5ocHAgXAotCWFzaW8vZGV0YWlsL3RpbWVyX3NjaGVkdWxlci5ocHAgXAotCWFzaW8vZGV0YWlsL3Rzc19wdHIuaHBwIFwKLQlhc2lvL2RldGFpbC90eXBlX3RyYWl0cy5ocHAgXAotCWFzaW8vZGV0YWlsL3ZhcmlhZGljX3RlbXBsYXRlcy5ocHAgXAotCWFzaW8vZGV0YWlsL3dhaXRfaGFuZGxlci5ocHAgXAotCWFzaW8vZGV0YWlsL3dhaXRfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93ZWFrX3B0ci5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbmNlX3RocmVhZC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9ldmVudC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9mZF9zZXRfYWRhcHRlci5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9mZW5jZWRfYmxvY2suaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9oYW5kbGVfcmVhZF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3BfaGFuZGxlX3dyaXRlX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3BfaW9fc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX251bGxfYnVmZmVyc19vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX29wZXJhdGlvbi5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX292ZXJsYXBwZWRfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9vdmVybGFwcGVkX3B0ci5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfYWNjZXB0X29wLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X2Nvbm5lY3Rfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfcmVjdmZyb21fb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfcmVjdm1zZ19vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9yZWN2X29wLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3NlbmRfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlLmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5faW9jcF90aHJlYWRfaW5mby5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9tdXRleC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5ydF9hc3luY19tYW5hZ2VyLmhwcCBcCi0JYXNpby9kZXRhaWwvd2lucnRfYXN5bmNfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5ydF9yZXNvbHZlX29wLmhwcCBcCi0JYXNpby9kZXRhaWwvd2lucnRfcmVzb2x2ZXJfc2VydmljZS5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbnJ0X3NvY2tldF9jb25uZWN0X29wLmhwcCBcCi0JYXNpby9kZXRhaWwvd2lucnRfc29ja2V0X3JlY3Zfb3AuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5ydF9zb2NrZXRfc2VuZF9vcC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlLmhwcCBcCi0JYXNpby9kZXRhaWwvd2lucnRfc3NvY2tldF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9kZXRhaWwvd2lucnRfdGltZXJfc2NoZWR1bGVyLmhwcCBcCi0JYXNpby9kZXRhaWwvd2lucnRfdXRpbHMuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5zb2NrX2luaXQuaHBwIFwKLQlhc2lvL2RldGFpbC93aW5fc3RhdGljX211dGV4LmhwcCBcCi0JYXNpby9kZXRhaWwvd2luX3RocmVhZC5ocHAgXAotCWFzaW8vZGV0YWlsL3dpbl90c3NfcHRyLmhwcCBcCi0JYXNpby9kZXRhaWwvd3JhcHBlZF9oYW5kbGVyLmhwcCBcCi0JYXNpby9lcnJvcl9jb2RlLmhwcCBcCi0JYXNpby9lcnJvci5ocHAgXAotCWFzaW8vZ2VuZXJpYy9iYXNpY19lbmRwb2ludC5ocHAgXAotCWFzaW8vZ2VuZXJpYy9kYXRhZ3JhbV9wcm90b2NvbC5ocHAgXAotCWFzaW8vZ2VuZXJpYy9kZXRhaWwvZW5kcG9pbnQuaHBwIFwKLQlhc2lvL2dlbmVyaWMvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwIFwKLQlhc2lvL2dlbmVyaWMvcmF3X3Byb3RvY29sLmhwcCBcCi0JYXNpby9nZW5lcmljL3NlcV9wYWNrZXRfcHJvdG9jb2wuaHBwIFwKLQlhc2lvL2dlbmVyaWMvc3RyZWFtX3Byb3RvY29sLmhwcCBcCi0JYXNpby9oYW5kbGVyX2FsbG9jX2hvb2suaHBwIFwKLQlhc2lvL2hhbmRsZXJfY29udGludWF0aW9uX2hvb2suaHBwIFwKLQlhc2lvL2hhbmRsZXJfaW52b2tlX2hvb2suaHBwIFwKLQlhc2lvL2hhbmRsZXJfdHlwZS5ocHAgXAotCWFzaW8vaGlnaF9yZXNvbHV0aW9uX3RpbWVyLmhwcCBcCi0JYXNpby5ocHAgXAotCWFzaW8vaW1wbC9idWZmZXJlZF9yZWFkX3N0cmVhbS5ocHAgXAotCWFzaW8vaW1wbC9idWZmZXJlZF93cml0ZV9zdHJlYW0uaHBwIFwKLQlhc2lvL2ltcGwvY29ubmVjdC5ocHAgXAotCWFzaW8vaW1wbC9lcnJvcl9jb2RlLmlwcCBcCi0JYXNpby9pbXBsL2Vycm9yLmlwcCBcCi0JYXNpby9pbXBsL2hhbmRsZXJfYWxsb2NfaG9vay5pcHAgXAotCWFzaW8vaW1wbC9pb19zZXJ2aWNlLmhwcCBcCi0JYXNpby9pbXBsL2lvX3NlcnZpY2UuaXBwIFwKLQlhc2lvL2ltcGwvcmVhZF9hdC5ocHAgXAotCWFzaW8vaW1wbC9yZWFkLmhwcCBcCi0JYXNpby9pbXBsL3JlYWRfdW50aWwuaHBwIFwKLQlhc2lvL2ltcGwvc2VyaWFsX3BvcnRfYmFzZS5ocHAgXAotCWFzaW8vaW1wbC9zZXJpYWxfcG9ydF9iYXNlLmlwcCBcCi0JYXNpby9pbXBsL3NwYXduLmhwcCBcCi0JYXNpby9pbXBsL3NyYy5jcHAgXAotCWFzaW8vaW1wbC9zcmMuaHBwIFwKLQlhc2lvL2ltcGwvdXNlX2Z1dHVyZS5ocHAgXAotCWFzaW8vaW1wbC93cml0ZV9hdC5ocHAgXAotCWFzaW8vaW1wbC93cml0ZS5ocHAgXAotCWFzaW8vaW9fc2VydmljZS5ocHAgXAotCWFzaW8vaXAvYWRkcmVzcy5ocHAgXAotCWFzaW8vaXAvYWRkcmVzc192NC5ocHAgXAotCWFzaW8vaXAvYWRkcmVzc192Ni5ocHAgXAotCWFzaW8vaXAvYmFzaWNfZW5kcG9pbnQuaHBwIFwKLQlhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyX2VudHJ5LmhwcCBcCi0JYXNpby9pcC9iYXNpY19yZXNvbHZlci5ocHAgXAotCWFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IuaHBwIFwKLQlhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyX3F1ZXJ5LmhwcCBcCi0JYXNpby9pcC9kZXRhaWwvZW5kcG9pbnQuaHBwIFwKLQlhc2lvL2lwL2RldGFpbC9pbXBsL2VuZHBvaW50LmlwcCBcCi0JYXNpby9pcC9kZXRhaWwvc29ja2V0X29wdGlvbi5ocHAgXAotCWFzaW8vaXAvaG9zdF9uYW1lLmhwcCBcCi0JYXNpby9pcC9pY21wLmhwcCBcCi0JYXNpby9pcC9pbXBsL2FkZHJlc3MuaHBwIFwKLQlhc2lvL2lwL2ltcGwvYWRkcmVzcy5pcHAgXAotCWFzaW8vaXAvaW1wbC9hZGRyZXNzX3Y0LmhwcCBcCi0JYXNpby9pcC9pbXBsL2FkZHJlc3NfdjQuaXBwIFwKLQlhc2lvL2lwL2ltcGwvYWRkcmVzc192Ni5ocHAgXAotCWFzaW8vaXAvaW1wbC9hZGRyZXNzX3Y2LmlwcCBcCi0JYXNpby9pcC9pbXBsL2Jhc2ljX2VuZHBvaW50LmhwcCBcCi0JYXNpby9pcC9pbXBsL2hvc3RfbmFtZS5pcHAgXAotCWFzaW8vaXAvbXVsdGljYXN0LmhwcCBcCi0JYXNpby9pcC9yZXNvbHZlcl9xdWVyeV9iYXNlLmhwcCBcCi0JYXNpby9pcC9yZXNvbHZlcl9zZXJ2aWNlLmhwcCBcCi0JYXNpby9pcC90Y3AuaHBwIFwKLQlhc2lvL2lwL3VkcC5ocHAgXAotCWFzaW8vaXAvdW5pY2FzdC5ocHAgXAotCWFzaW8vaXAvdjZfb25seS5ocHAgXAotCWFzaW8vaXNfcmVhZF9idWZmZXJlZC5ocHAgXAotCWFzaW8vaXNfd3JpdGVfYnVmZmVyZWQuaHBwIFwKLQlhc2lvL2xvY2FsL2Jhc2ljX2VuZHBvaW50LmhwcCBcCi0JYXNpby9sb2NhbC9jb25uZWN0X3BhaXIuaHBwIFwKLQlhc2lvL2xvY2FsL2RhdGFncmFtX3Byb3RvY29sLmhwcCBcCi0JYXNpby9sb2NhbC9kZXRhaWwvZW5kcG9pbnQuaHBwIFwKLQlhc2lvL2xvY2FsL2RldGFpbC9pbXBsL2VuZHBvaW50LmlwcCBcCi0JYXNpby9sb2NhbC9zdHJlYW1fcHJvdG9jb2wuaHBwIFwKLQlhc2lvL3BsYWNlaG9sZGVycy5ocHAgXAotCWFzaW8vcG9zaXgvYmFzaWNfZGVzY3JpcHRvci5ocHAgXAotCWFzaW8vcG9zaXgvYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3IuaHBwIFwKLQlhc2lvL3Bvc2l4L2Rlc2NyaXB0b3JfYmFzZS5ocHAgXAotCWFzaW8vcG9zaXgvc3RyZWFtX2Rlc2NyaXB0b3IuaHBwIFwKLQlhc2lvL3Bvc2l4L3N0cmVhbV9kZXNjcmlwdG9yX3NlcnZpY2UuaHBwIFwKLQlhc2lvL3Jhd19zb2NrZXRfc2VydmljZS5ocHAgXAotCWFzaW8vcmVhZF9hdC5ocHAgXAotCWFzaW8vcmVhZC5ocHAgXAotCWFzaW8vcmVhZF91bnRpbC5ocHAgXAotCWFzaW8vc2VxX3BhY2tldF9zb2NrZXRfc2VydmljZS5ocHAgXAotCWFzaW8vc2VyaWFsX3BvcnRfYmFzZS5ocHAgXAotCWFzaW8vc2VyaWFsX3BvcnQuaHBwIFwKLQlhc2lvL3NlcmlhbF9wb3J0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL3NpZ25hbF9zZXQuaHBwIFwKLQlhc2lvL3NpZ25hbF9zZXRfc2VydmljZS5ocHAgXAotCWFzaW8vc29ja2V0X2FjY2VwdG9yX3NlcnZpY2UuaHBwIFwKLQlhc2lvL3NvY2tldF9iYXNlLmhwcCBcCi0JYXNpby9zcGF3bi5ocHAgXAotCWFzaW8vc3NsL2Jhc2ljX2NvbnRleHQuaHBwIFwKLQlhc2lvL3NzbC9jb250ZXh0X2Jhc2UuaHBwIFwKLQlhc2lvL3NzbC9jb250ZXh0LmhwcCBcCi0JYXNpby9zc2wvY29udGV4dF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9zc2wvZGV0YWlsL2J1ZmZlcmVkX2hhbmRzaGFrZV9vcC5ocHAgXAotCWFzaW8vc3NsL2RldGFpbC9lbmdpbmUuaHBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvaGFuZHNoYWtlX29wLmhwcCBcCi0JYXNpby9zc2wvZGV0YWlsL2ltcGwvZW5naW5lLmlwcCBcCi0JYXNpby9zc2wvZGV0YWlsL2ltcGwvb3BlbnNzbF9pbml0LmlwcCBcCi0JYXNpby9zc2wvZGV0YWlsL2lvLmhwcCBcCi0JYXNpby9zc2wvZGV0YWlsL29wZW5zc2xfaW5pdC5ocHAgXAotCWFzaW8vc3NsL2RldGFpbC9vcGVuc3NsX3R5cGVzLmhwcCBcCi0JYXNpby9zc2wvZGV0YWlsL3Bhc3N3b3JkX2NhbGxiYWNrLmhwcCBcCi0JYXNpby9zc2wvZGV0YWlsL3JlYWRfb3AuaHBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvc2h1dGRvd25fb3AuaHBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvc3RyZWFtX2NvcmUuaHBwIFwKLQlhc2lvL3NzbC9kZXRhaWwvdmVyaWZ5X2NhbGxiYWNrLmhwcCBcCi0JYXNpby9zc2wvZGV0YWlsL3dyaXRlX29wLmhwcCBcCi0JYXNpby9zc2wvZXJyb3IuaHBwIFwKLQlhc2lvL3NzbC5ocHAgXAotCWFzaW8vc3NsL2ltcGwvY29udGV4dC5ocHAgXAotCWFzaW8vc3NsL2ltcGwvY29udGV4dC5pcHAgXAotCWFzaW8vc3NsL2ltcGwvZXJyb3IuaXBwIFwKLQlhc2lvL3NzbC9pbXBsL3JmYzI4MThfdmVyaWZpY2F0aW9uLmlwcCBcCi0JYXNpby9zc2wvaW1wbC9zcmMuaHBwIFwKLQlhc2lvL3NzbC9vbGQvYmFzaWNfY29udGV4dC5ocHAgXAotCWFzaW8vc3NsL29sZC9jb250ZXh0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL3NzbC9vbGQvZGV0YWlsL29wZW5zc2xfY29udGV4dF9zZXJ2aWNlLmhwcCBcCi0JYXNpby9zc2wvb2xkL2RldGFpbC9vcGVuc3NsX29wZXJhdGlvbi5ocHAgXAotCWFzaW8vc3NsL29sZC9kZXRhaWwvb3BlbnNzbF9zdHJlYW1fc2VydmljZS5ocHAgXAotCWFzaW8vc3NsL29sZC9zdHJlYW0uaHBwIFwKLQlhc2lvL3NzbC9vbGQvc3RyZWFtX3NlcnZpY2UuaHBwIFwKLQlhc2lvL3NzbC9yZmMyODE4X3ZlcmlmaWNhdGlvbi5ocHAgXAotCWFzaW8vc3NsL3N0cmVhbV9iYXNlLmhwcCBcCi0JYXNpby9zc2wvc3RyZWFtLmhwcCBcCi0JYXNpby9zc2wvc3RyZWFtX3NlcnZpY2UuaHBwIFwKLQlhc2lvL3NzbC92ZXJpZnlfY29udGV4dC5ocHAgXAotCWFzaW8vc3NsL3ZlcmlmeV9tb2RlLmhwcCBcCi0JYXNpby9zdGVhZHlfdGltZXIuaHBwIFwKLQlhc2lvL3N0cmFuZC5ocHAgXAotCWFzaW8vc3RyZWFtYnVmLmhwcCBcCi0JYXNpby9zdHJlYW1fc29ja2V0X3NlcnZpY2UuaHBwIFwKLQlhc2lvL3N5c3RlbV9lcnJvci5ocHAgXAotCWFzaW8vc3lzdGVtX3RpbWVyLmhwcCBcCi0JYXNpby90aHJlYWQuaHBwIFwKLQlhc2lvL3RpbWVfdHJhaXRzLmhwcCBcCi0JYXNpby91bnlpZWxkLmhwcCBcCi0JYXNpby91c2VfZnV0dXJlLmhwcCBcCi0JYXNpby92ZXJzaW9uLmhwcCBcCi0JYXNpby93YWl0YWJsZV90aW1lcl9zZXJ2aWNlLmhwcCBcCi0JYXNpby93YWl0X3RyYWl0cy5ocHAgXAotCWFzaW8vd2luZG93cy9iYXNpY19oYW5kbGUuaHBwIFwKLQlhc2lvL3dpbmRvd3MvYmFzaWNfb2JqZWN0X2hhbmRsZS5ocHAgXAotCWFzaW8vd2luZG93cy9iYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZS5ocHAgXAotCWFzaW8vd2luZG93cy9iYXNpY19zdHJlYW1faGFuZGxlLmhwcCBcCi0JYXNpby93aW5kb3dzL29iamVjdF9oYW5kbGUuaHBwIFwKLQlhc2lvL3dpbmRvd3Mvb2JqZWN0X2hhbmRsZV9zZXJ2aWNlLmhwcCBcCi0JYXNpby93aW5kb3dzL292ZXJsYXBwZWRfcHRyLmhwcCBcCi0JYXNpby93aW5kb3dzL3JhbmRvbV9hY2Nlc3NfaGFuZGxlLmhwcCBcCi0JYXNpby93aW5kb3dzL3JhbmRvbV9hY2Nlc3NfaGFuZGxlX3NlcnZpY2UuaHBwIFwKLQlhc2lvL3dpbmRvd3Mvc3RyZWFtX2hhbmRsZS5ocHAgXAotCWFzaW8vd2luZG93cy9zdHJlYW1faGFuZGxlX3NlcnZpY2UuaHBwIFwKLQlhc2lvL3dyaXRlX2F0LmhwcCBcCi0JYXNpby93cml0ZS5ocHAgXAotCWFzaW8veWllbGQuaHBwCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gXAotCSQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1hbGw6IGFsbC1hbQotCi0uU1VGRklYRVM6Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKLQlAZm9yIGRlcCBpbiAkPzsgZG8gXAotCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCi0JICAgICokJGRlcCopIFwKLQkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKLQkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCi0JICAgICAgZXhpdCAxOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gaW5jbHVkZS9NYWtlZmlsZSc7IFwKLQkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCi0JICAkKEFVVE9NQUtFKSAtLWZvcmVpZ24gaW5jbHVkZS9NYWtlZmlsZQotLlBSRUNJT1VTOiBNYWtlZmlsZQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCUBjYXNlICckPycgaW4gXAotCSAgKmNvbmZpZy5zdGF0dXMqKSBcCi0JICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKLQkgICopIFwKLQkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKLQkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAotCWVzYWM7Ci0KLSQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotCi0kKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAotJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKLWluc3RhbGwtbm9iYXNlX2luY2x1ZGVIRUFERVJTOiAkKG5vYmFzZV9pbmNsdWRlX0hFQURFUlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JQGxpc3Q9JyQobm9iYXNlX2luY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKGluY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAotCWlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAotCSAgZWNobyAiICQoTUtESVJfUCkgJyQoREVTVERJUikkKGluY2x1ZGVkaXIpJyI7IFwKLQkgICQoTUtESVJfUCkgIiQoREVTVERJUikkKGluY2x1ZGVkaXIpIiB8fCBleGl0IDE7IFwKLQlmaTsgXAotCSQoYW1fX25vYmFzZV9saXN0KSB8IHdoaWxlIHJlYWQgZGlyIGZpbGVzOyBkbyBcCi0JICB4ZmlsZXM9OyBmb3IgZmlsZSBpbiAkJGZpbGVzOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgIiQkZmlsZSI7IHRoZW4geGZpbGVzPSIkJHhmaWxlcyAkJGZpbGUiOyBcCi0JICAgIGVsc2UgeGZpbGVzPSIkJHhmaWxlcyAkKHNyY2RpcikvJCRmaWxlIjsgZmk7IGRvbmU7IFwKLQkgIHRlc3QgLXogIiQkeGZpbGVzIiB8fCB7IFwKLQkgICAgdGVzdCAieCQkZGlyIiA9IHguIHx8IHsgXAotCSAgICAgIGVjaG8gIiAkKE1LRElSX1ApICckKERFU1RESVIpJChpbmNsdWRlZGlyKS8kJGRpciciOyBcCi0JICAgICAgJChNS0RJUl9QKSAiJChERVNURElSKSQoaW5jbHVkZWRpcikvJCRkaXIiOyB9OyBcCi0JICAgIGVjaG8gIiAkKElOU1RBTExfSEVBREVSKSAkJHhmaWxlcyAnJChERVNURElSKSQoaW5jbHVkZWRpcikvJCRkaXInIjsgXAotCSAgICAkKElOU1RBTExfSEVBREVSKSAkJHhmaWxlcyAiJChERVNURElSKSQoaW5jbHVkZWRpcikvJCRkaXIiIHx8IGV4aXQgJCQ/OyB9OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbm9iYXNlX2luY2x1ZGVIRUFERVJTOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JQGxpc3Q9JyQobm9iYXNlX2luY2x1ZGVfSEVBREVSUyknOyB0ZXN0IC1uICIkKGluY2x1ZGVkaXIpIiB8fCBsaXN0PTsgXAotCSQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IGZpbGVzPWAkKGFtX19ub2Jhc2Vfc3RyaXApYDsgXAotCWRpcj0nJChERVNURElSKSQoaW5jbHVkZWRpciknOyAkKGFtX191bmluc3RhbGxfZmlsZXNfZnJvbV9kaXIpCi0KLUlEOiAkKGFtX190YWdnZWRfZmlsZXMpCi0JJChhbV9fZGVmaW5lX3VuaXFfdGFnZ2VkX2ZpbGVzKTsgbWtpZCAtZklEICQkdW5pcXVlCi10YWdzOiB0YWdzLWFtCi1UQUdTOiB0YWdzCi0KLXRhZ3MtYW06ICQoVEFHU19ERVBFTkRFTkNJRVMpICQoYW1fX3RhZ2dlZF9maWxlcykKLQlzZXQgeDsgXAotCWhlcmU9YHB3ZGA7IFwKLQkkKGFtX19kZWZpbmVfdW5pcV90YWdnZWRfZmlsZXMpOyBcCi0Jc2hpZnQ7IFwKLQlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAotCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAotCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKLQkgIGVsc2UgXAotCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCi0JICAgICAgJCR1bmlxdWU7IFwKLQkgIGZpOyBcCi0JZmkKLWN0YWdzOiBjdGFncy1hbQotCi1DVEFHUzogY3RhZ3MKLWN0YWdzLWFtOiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKGFtX190YWdnZWRfZmlsZXMpCi0JJChhbV9fZGVmaW5lX3VuaXFfdGFnZ2VkX2ZpbGVzKTsgXAotCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAotCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAotCSAgICAgJCR1bmlxdWUKLQotR1RBR1M6Ci0JaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKLQkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKLQkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKLWNzY29wZWxpc3Q6IGNzY29wZWxpc3QtYW0KLQotY3Njb3BlbGlzdC1hbTogJChhbV9fdGFnZ2VkX2ZpbGVzKQotCWxpc3Q9JyQoYW1fX3RhZ2dlZF9maWxlcyknOyBcCi0JY2FzZSAiJChzcmNkaXIpIiBpbiBcCi0JICBbXFwvXSogfCA/OltcXC9dKikgc2Rpcj0iJChzcmNkaXIpIiA7OyBcCi0JICAqKSBzZGlyPSQoc3ViZGlyKS8kKHNyY2RpcikgOzsgXAotCWVzYWM7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gXAotCSAgICBlY2hvICIkKHN1YmRpcikvJCRpIjsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIiQkc2Rpci8kJGkiOyBcCi0JICBmaTsgXAotCWRvbmUgPj4gJCh0b3BfYnVpbGRkaXIpL2NzY29wZS5maWxlcwotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCi0JdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAotCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKLQkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCi0JICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAotCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKLQljYXNlICQkZGlzdF9maWxlcyBpbiBcCi0JICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCi0JCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCi0JCQkgICBzb3J0IC11YCA7OyBcCi0JZXNhYzsgXAotCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKLQkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKLQkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKLQkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKLQkgICAgZmk7IFwKLQkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCi0JICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAotCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAotCSAgICBmaTsgXAotCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKLQkgICAgfHwgZXhpdCAxOyBcCi0JICBmaTsgXAotCWRvbmUKLWNoZWNrLWFtOiBhbGwtYW0KLWNoZWNrOiBjaGVjay1hbQotYWxsLWFtOiBNYWtlZmlsZSAkKEhFQURFUlMpCi1pbnN0YWxsZGlyczoKLQlmb3IgZGlyIGluICIkKERFU1RESVIpJChpbmNsdWRlZGlyKSI7IGRvIFwKLQkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKLQlkb25lCi1pbnN0YWxsOiBpbnN0YWxsLWFtCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KLXVuaW5zdGFsbDogdW5pbnN0YWxsLWFtCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi0KLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCi1pbnN0YWxsLXN0cmlwOgotCWlmIHRlc3QgLXogJyQoU1RSSVApJzsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgICBpbnN0YWxsOyBcCi0JZWxzZSBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAotCSAgICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKLQkgICAgIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciIGluc3RhbGw7IFwKLQlmaQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKLWNsZWFuOiBjbGVhbi1hbQotCi1jbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1kaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQotCS1ybSAtZiBNYWtlZmlsZQotZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncwotCi1kdmk6IGR2aS1hbQotCi1kdmktYW06Ci0KLWh0bWw6IGh0bWwtYW0KLQotaHRtbC1hbToKLQotaW5mbzogaW5mby1hbQotCi1pbmZvLWFtOgotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbm9iYXNlX2luY2x1ZGVIRUFERVJTCi0KLWluc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQotCi1pbnN0YWxsLWR2aS1hbToKLQotaW5zdGFsbC1leGVjLWFtOgotCi1pbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQotCi1pbnN0YWxsLWh0bWwtYW06Ci0KLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi0KLWluc3RhbGwtaW5mby1hbToKLQotaW5zdGFsbC1tYW46Ci0KLWluc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQotCi1pbnN0YWxsLXBkZi1hbToKLQotaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQotCi1pbnN0YWxsLXBzLWFtOgotCi1pbnN0YWxsY2hlY2stYW06Ci0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KLQktcm0gLWYgTWFrZWZpbGUKLW1haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCi0KLW1vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljCi0KLXBkZjogcGRmLWFtCi0KLXBkZi1hbToKLQotcHM6IHBzLWFtCi0KLXBzLWFtOgotCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1ub2Jhc2VfaW5jbHVkZUhFQURFUlMKLQotLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAotCi0uUEhPTlk6IENUQUdTIEdUQUdTIFRBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKLQljc2NvcGVsaXN0LWFtIGN0YWdzIGN0YWdzLWFtIGRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBcCi0JZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAotCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKLQlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCi0JaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAotCWluc3RhbGwtbm9iYXNlX2luY2x1ZGVIRUFERVJTIGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIFwKLQlpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAotCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKLQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBwZGYgXAotCXBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSBcCi0JdW5pbnN0YWxsLW5vYmFzZV9pbmNsdWRlSEVBREVSUwotCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA4M2RhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8KLS8vIGFzaW8uaHBwCi0vLyB+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0hQUAotI2RlZmluZSBBU0lPX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2FzeW5jX3Jlc3VsdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9iYXNpY19kYXRhZ3JhbV9zb2NrZXQuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfZGVhZGxpbmVfdGltZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfaW9fb2JqZWN0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3Jhd19zb2NrZXQuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc2VyaWFsX3BvcnQuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc2lnbmFsX3NldC5ocHAiCi0jaW5jbHVkZSAiYXNpby9iYXNpY19zb2NrZXRfYWNjZXB0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc29ja2V0X2lvc3RyZWFtLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3NvY2tldF9zdHJlYW1idWYuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc3RyZWFtX3NvY2tldC5ocHAiCi0jaW5jbHVkZSAiYXNpby9iYXNpY19zdHJlYW1idWYuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfd2FpdGFibGVfdGltZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vYnVmZmVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2J1ZmZlcmVkX3JlYWRfc3RyZWFtX2Z3ZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9idWZmZXJlZF9yZWFkX3N0cmVhbS5ocHAiCi0jaW5jbHVkZSAiYXNpby9idWZmZXJlZF9zdHJlYW1fZndkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2J1ZmZlcmVkX3N0cmVhbS5ocHAiCi0jaW5jbHVkZSAiYXNpby9idWZmZXJlZF93cml0ZV9zdHJlYW1fZndkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2J1ZmZlcmVkX3dyaXRlX3N0cmVhbS5ocHAiCi0jaW5jbHVkZSAiYXNpby9idWZmZXJzX2l0ZXJhdG9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2NvbXBsZXRpb25fY29uZGl0aW9uLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Nvbm5lY3QuaHBwIgotI2luY2x1ZGUgImFzaW8vY29yb3V0aW5lLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RhdGFncmFtX3NvY2tldF9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RlYWRsaW5lX3RpbWVyX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGVhZGxpbmVfdGltZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3JfY29kZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9nZW5lcmljL2Jhc2ljX2VuZHBvaW50LmhwcCIKLSNpbmNsdWRlICJhc2lvL2dlbmVyaWMvZGF0YWdyYW1fcHJvdG9jb2wuaHBwIgotI2luY2x1ZGUgImFzaW8vZ2VuZXJpYy9yYXdfcHJvdG9jb2wuaHBwIgotI2luY2x1ZGUgImFzaW8vZ2VuZXJpYy9zZXFfcGFja2V0X3Byb3RvY29sLmhwcCIKLSNpbmNsdWRlICJhc2lvL2dlbmVyaWMvc3RyZWFtX3Byb3RvY29sLmhwcCIKLSNpbmNsdWRlICJhc2lvL2hhbmRsZXJfYWxsb2NfaG9vay5ocHAiCi0jaW5jbHVkZSAiYXNpby9oYW5kbGVyX2NvbnRpbnVhdGlvbl9ob29rLmhwcCIKLSNpbmNsdWRlICJhc2lvL2hhbmRsZXJfaW52b2tlX2hvb2suaHBwIgotI2luY2x1ZGUgImFzaW8vaGFuZGxlcl90eXBlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYWRkcmVzcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9hZGRyZXNzX3Y0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2FkZHJlc3NfdjYuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfZW5kcG9pbnQuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfcmVzb2x2ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfZW50cnkuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfcXVlcnkuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvaG9zdF9uYW1lLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2ljbXAuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvbXVsdGljYXN0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL3Jlc29sdmVyX3F1ZXJ5X2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvcmVzb2x2ZXJfc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC90Y3AuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvdWRwLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL3VuaWNhc3QuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvdjZfb25seS5ocHAiCi0jaW5jbHVkZSAiYXNpby9pc19yZWFkX2J1ZmZlcmVkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lzX3dyaXRlX2J1ZmZlcmVkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2xvY2FsL2Jhc2ljX2VuZHBvaW50LmhwcCIKLSNpbmNsdWRlICJhc2lvL2xvY2FsL2Nvbm5lY3RfcGFpci5ocHAiCi0jaW5jbHVkZSAiYXNpby9sb2NhbC9kYXRhZ3JhbV9wcm90b2NvbC5ocHAiCi0jaW5jbHVkZSAiYXNpby9sb2NhbC9zdHJlYW1fcHJvdG9jb2wuaHBwIgotI2luY2x1ZGUgImFzaW8vcGxhY2Vob2xkZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL3Bvc2l4L2Jhc2ljX2Rlc2NyaXB0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vcG9zaXgvYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vcG9zaXgvZGVzY3JpcHRvcl9iYXNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3Bvc2l4L3N0cmVhbV9kZXNjcmlwdG9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL3Bvc2l4L3N0cmVhbV9kZXNjcmlwdG9yX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vcmF3X3NvY2tldF9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3JlYWQuaHBwIgotI2luY2x1ZGUgImFzaW8vcmVhZF9hdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9yZWFkX3VudGlsLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NlcV9wYWNrZXRfc29ja2V0X3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc2VyaWFsX3BvcnQuaHBwIgotI2luY2x1ZGUgImFzaW8vc2VyaWFsX3BvcnRfYmFzZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9zZXJpYWxfcG9ydF9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NpZ25hbF9zZXQuaHBwIgotI2luY2x1ZGUgImFzaW8vc2lnbmFsX3NldF9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NvY2tldF9hY2NlcHRvcl9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NvY2tldF9iYXNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3N0cmFuZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9zdHJlYW1fc29ja2V0X3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc3RyZWFtYnVmLmhwcCIKLSNpbmNsdWRlICJhc2lvL3N5c3RlbV9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby90aHJlYWQuaHBwIgotI2luY2x1ZGUgImFzaW8vdGltZV90cmFpdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vdmVyc2lvbi5ocHAiCi0jaW5jbHVkZSAiYXNpby93YWl0X3RyYWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby93YWl0YWJsZV90aW1lcl9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3dpbmRvd3MvYmFzaWNfaGFuZGxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3dpbmRvd3MvYmFzaWNfb2JqZWN0X2hhbmRsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby93aW5kb3dzL2Jhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3dpbmRvd3MvYmFzaWNfc3RyZWFtX2hhbmRsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby93aW5kb3dzL29iamVjdF9oYW5kbGUuaHBwIgotI2luY2x1ZGUgImFzaW8vd2luZG93cy9vYmplY3RfaGFuZGxlX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vd2luZG93cy9vdmVybGFwcGVkX3B0ci5ocHAiCi0jaW5jbHVkZSAiYXNpby93aW5kb3dzL3JhbmRvbV9hY2Nlc3NfaGFuZGxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3dpbmRvd3MvcmFuZG9tX2FjY2Vzc19oYW5kbGVfc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby93aW5kb3dzL3N0cmVhbV9oYW5kbGUuaHBwIgotI2luY2x1ZGUgImFzaW8vd2luZG93cy9zdHJlYW1faGFuZGxlX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vd3JpdGUuaHBwIgotI2luY2x1ZGUgImFzaW8vd3JpdGVfYXQuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9hc3luY19yZXN1bHQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2FzeW5jX3Jlc3VsdC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZTljMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2FzeW5jX3Jlc3VsdC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLwotLy8gYXN5bmNfcmVzdWx0LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0FTWU5DX1JFU1VMVF9IUFAKLSNkZWZpbmUgQVNJT19BU1lOQ19SRVNVTFRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9oYW5kbGVyX3R5cGUuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0vLy8gQW4gaW50ZXJmYWNlIGZvciBjdXN0b21pc2luZyB0aGUgYmVoYXZpb3VyIG9mIGFuIGluaXRpYXRpbmcgZnVuY3Rpb24uCi0vKioKLSAqIFRoaXMgdGVtcGxhdGUgbWF5IGJlIHNwZWNpYWxpc2VkIGZvciB1c2VyLWRlZmluZWQgaGFuZGxlciB0eXBlcy4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyBhc3luY19yZXN1bHQKLXsKLXB1YmxpYzoKLSAgLy8vIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaW5pdGlhdGluZyBmdW5jdGlvbi4KLSAgdHlwZWRlZiB2b2lkIHR5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdCBhbiBhc3luYyByZXN1bHQgZnJvbSBhIGdpdmVuIGhhbmRsZXIuCi0gIC8qKgotICAgKiBXaGVuIHVzaW5nIGEgc3BlY2FsaXNlZCBhc3luY19yZXN1bHQsIHRoZSBjb25zdHJ1Y3RvciBoYXMgYW4gb3Bwb3J0dW5pdHkKLSAgICogdG8gaW5pdGlhbGlzZSBzb21lIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlciwgd2hpY2ggaXMgdGhlbgotICAgKiByZXR1cm5lZCBmcm9tIHRoZSBpbml0aWF0aW5nIGZ1bmN0aW9uLgotICAgKi8KLSAgZXhwbGljaXQgYXN5bmNfcmVzdWx0KEhhbmRsZXImKQotICB7Ci0gIH0KLQotICAvLy8gT2J0YWluIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBmcm9tIHRoZSBpbml0aWF0aW5nIGZ1bmN0aW9uLgotICB0eXBlIGdldCgpCi0gIHsKLSAgfQotfTsKLQotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLS8vIEhlbHBlciB0ZW1wbGF0ZSB0byBkZWR1Y2UgdGhlIHRydWUgdHlwZSBvZiBhIGhhbmRsZXIsIGNhcHR1cmUgYSBsb2NhbCBjb3B5Ci0vLyBvZiB0aGUgaGFuZGxlciwgYW5kIHRoZW4gY3JlYXRlIGFuIGFzeW5jX3Jlc3VsdCBmb3IgdGhlIGhhbmRsZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgU2lnbmF0dXJlPgotc3RydWN0IGFzeW5jX3Jlc3VsdF9pbml0Ci17Ci0gIGV4cGxpY2l0IGFzeW5jX3Jlc3VsdF9pbml0KEFTSU9fTU9WRV9BUkcoSGFuZGxlcikgb3JpZ19oYW5kbGVyKQotICAgIDogaGFuZGxlcihBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShvcmlnX2hhbmRsZXIpKSwKLSAgICAgIHJlc3VsdChoYW5kbGVyKQotICB7Ci0gIH0KLQotICB0eXBlbmFtZSBoYW5kbGVyX3R5cGU8SGFuZGxlciwgU2lnbmF0dXJlPjo6dHlwZSBoYW5kbGVyOwotICBhc3luY19yZXN1bHQ8dHlwZW5hbWUgaGFuZGxlcl90eXBlPEhhbmRsZXIsIFNpZ25hdHVyZT46OnR5cGU+IHJlc3VsdDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBTaWduYXR1cmU+Ci1zdHJ1Y3QgYXN5bmNfcmVzdWx0X3R5cGVfaGVscGVyCi17Ci0gIHR5cGVkZWYgdHlwZW5hbWUgYXN5bmNfcmVzdWx0PAotICAgICAgdHlwZW5hbWUgaGFuZGxlcl90eXBlPEhhbmRsZXIsIFNpZ25hdHVyZT46OnR5cGUKLSAgICA+Ojp0eXBlIHR5cGU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotIyBkZWZpbmUgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoaCwgc2lnKSBcCi0gIHZvaWRfb3JfZGVkdWNlZAotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDwgMTUwMCkKLSMgZGVmaW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKGgsIHNpZykgXAotICB0eXBlbmFtZSA6OmFzaW86OmRldGFpbDo6YXN5bmNfcmVzdWx0X3R5cGVfaGVscGVyPGgsIHNpZz46OnR5cGUKLSNlbHNlCi0jIGRlZmluZSBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShoLCBzaWcpIFwKLSAgdHlwZW5hbWUgOjphc2lvOjphc3luY19yZXN1bHQ8IFwKLSAgICB0eXBlbmFtZSA6OmFzaW86OmhhbmRsZXJfdHlwZTxoLCBzaWc+Ojp0eXBlPjo6dHlwZQotI2VuZGlmCi0KLSNlbmRpZiAvLyBBU0lPX0FTWU5DX1JFU1VMVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19kYXRhZ3JhbV9zb2NrZXQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX2RhdGFncmFtX3NvY2tldC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTlmZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX2RhdGFncmFtX3NvY2tldC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NDkgKzAsMCBAQAotLy8KLS8vIGJhc2ljX2RhdGFncmFtX3NvY2tldC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19CQVNJQ19EQVRBR1JBTV9TT0NLRVRfSFBQCi0jZGVmaW5lIEFTSU9fQkFTSUNfREFUQUdSQU1fU09DS0VUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9iYXNpY19zb2NrZXQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGF0YWdyYW1fc29ja2V0X3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfdHlwZV9yZXF1aXJlbWVudHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90eXBlX3RyYWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBQcm92aWRlcyBkYXRhZ3JhbS1vcmllbnRlZCBzb2NrZXQgZnVuY3Rpb25hbGl0eS4KLS8qKgotICogVGhlIGJhc2ljX2RhdGFncmFtX3NvY2tldCBjbGFzcyB0ZW1wbGF0ZSBwcm92aWRlcyBhc3luY2hyb25vdXMgYW5kIGJsb2NraW5nCi0gKiBkYXRhZ3JhbS1vcmllbnRlZCBzb2NrZXQgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwKLSAgICB0eXBlbmFtZSBEYXRhZ3JhbVNvY2tldFNlcnZpY2UgPSBkYXRhZ3JhbV9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gPgotY2xhc3MgYmFzaWNfZGF0YWdyYW1fc29ja2V0Ci0gIDogcHVibGljIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgRGF0YWdyYW1Tb2NrZXRTZXJ2aWNlPgotewotcHVibGljOgotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlX3R5cGUuKSBUaGUgbmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mIGEKLSAgLy8vIHNvY2tldC4KLSAgdHlwZWRlZiB0eXBlbmFtZSBEYXRhZ3JhbVNvY2tldFNlcnZpY2U6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfdHlwZTsKLQotICAvLy8gVGhlIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZiBhIHNvY2tldC4KLSAgdHlwZWRlZiB0eXBlbmFtZSBEYXRhZ3JhbVNvY2tldFNlcnZpY2U6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgLy8vIFRoZSBwcm90b2NvbCB0eXBlLgotICB0eXBlZGVmIFByb3RvY29sIHByb3RvY29sX3R5cGU7Ci0KLSAgLy8vIFRoZSBlbmRwb2ludCB0eXBlLgotICB0eXBlZGVmIHR5cGVuYW1lIFByb3RvY29sOjplbmRwb2ludCBlbmRwb2ludF90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19kYXRhZ3JhbV9zb2NrZXQgd2l0aG91dCBvcGVuaW5nIGl0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgZGF0YWdyYW0gc29ja2V0IHdpdGhvdXQgb3BlbmluZyBpdC4gVGhlIG9wZW4oKQotICAgKiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZGF0YSBjYW4gYmUgc2VudCBvciByZWNlaXZlZCBvbiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgZGF0YWdyYW0gc29ja2V0IHdpbGwgdXNlCi0gICAqIHRvIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZQotICAgKiBzb2NrZXQuCi0gICAqLwotICBleHBsaWNpdCBiYXNpY19kYXRhZ3JhbV9zb2NrZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgRGF0YWdyYW1Tb2NrZXRTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGFuZCBvcGVuIGEgYmFzaWNfZGF0YWdyYW1fc29ja2V0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuZCBvcGVucyBhIGRhdGFncmFtIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIGRhdGFncmFtIHNvY2tldCB3aWxsIHVzZQotICAgKiB0byBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUKLSAgICogc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gcHJvdG9jb2wgQW4gb2JqZWN0IHNwZWNpZnlpbmcgcHJvdG9jb2wgcGFyYW1ldGVycyB0byBiZSB1c2VkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIGJhc2ljX2RhdGFncmFtX3NvY2tldChhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wpCi0gICAgOiBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIERhdGFncmFtU29ja2V0U2VydmljZT4oaW9fc2VydmljZSwgcHJvdG9jb2wpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19kYXRhZ3JhbV9zb2NrZXQsIG9wZW5pbmcgaXQgYW5kIGJpbmRpbmcgaXQgdG8gdGhlIGdpdmVuCi0gIC8vLyBsb2NhbCBlbmRwb2ludC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIGRhdGFncmFtIHNvY2tldCBhbmQgYXV0b21hdGljYWxseSBvcGVucyBpdCBib3VuZAotICAgKiB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50IG9uIHRoZSBsb2NhbCBtYWNoaW5lLiBUaGUgcHJvdG9jb2wgdXNlZCBpcyB0aGUKLSAgICogcHJvdG9jb2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBlbmRwb2ludC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIGRhdGFncmFtIHNvY2tldCB3aWxsIHVzZQotICAgKiB0byBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUKLSAgICogc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gZW5kcG9pbnQgQW4gZW5kcG9pbnQgb24gdGhlIGxvY2FsIG1hY2hpbmUgdG8gd2hpY2ggdGhlIGRhdGFncmFtCi0gICAqIHNvY2tldCB3aWxsIGJlIGJvdW5kLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIGJhc2ljX2RhdGFncmFtX3NvY2tldChhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgZW5kcG9pbnQpCi0gICAgOiBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIERhdGFncmFtU29ja2V0U2VydmljZT4oaW9fc2VydmljZSwgZW5kcG9pbnQpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19kYXRhZ3JhbV9zb2NrZXQgb24gYW4gZXhpc3RpbmcgbmF0aXZlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIGRhdGFncmFtIHNvY2tldCBvYmplY3QgdG8gaG9sZCBhbiBleGlzdGluZwotICAgKiBuYXRpdmUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgZGF0YWdyYW0gc29ja2V0IHdpbGwgdXNlCi0gICAqIHRvIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZQotICAgKiBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBwcm90b2NvbCBBbiBvYmplY3Qgc3BlY2lmeWluZyBwcm90b2NvbCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBuYXRpdmVfc29ja2V0IFRoZSBuZXcgdW5kZXJseWluZyBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgYmFzaWNfZGF0YWdyYW1fc29ja2V0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBuYXRpdmVfc29ja2V0KQotICAgIDogYmFzaWNfc29ja2V0PFByb3RvY29sLCBEYXRhZ3JhbVNvY2tldFNlcnZpY2U+KAotICAgICAgICBpb19zZXJ2aWNlLCBwcm90b2NvbCwgbmF0aXZlX3NvY2tldCkKLSAgewotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBiYXNpY19kYXRhZ3JhbV9zb2NrZXQgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhIGRhdGFncmFtIHNvY2tldCBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19kYXRhZ3JhbV9zb2NrZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUKLSAgICogd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX2RhdGFncmFtX3NvY2tldChpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICBiYXNpY19kYXRhZ3JhbV9zb2NrZXQoYmFzaWNfZGF0YWdyYW1fc29ja2V0JiYgb3RoZXIpCi0gICAgOiBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIERhdGFncmFtU29ja2V0U2VydmljZT4oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX2RhdGFncmFtX3NvY2tldCkob3RoZXIpKQotICB7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gYSBiYXNpY19kYXRhZ3JhbV9zb2NrZXQgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBhc3NpZ25tZW50IG9wZXJhdG9yIG1vdmVzIGEgZGF0YWdyYW0gc29ja2V0IGZyb20gb25lIG9iamVjdCB0bwotICAgKiBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX2RhdGFncmFtX3NvY2tldCBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZQotICAgKiB3aWxsIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfZGF0YWdyYW1fc29ja2V0KGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIGJhc2ljX2RhdGFncmFtX3NvY2tldCYgb3BlcmF0b3I9KGJhc2ljX2RhdGFncmFtX3NvY2tldCYmIG90aGVyKQotICB7Ci0gICAgYmFzaWNfc29ja2V0PFByb3RvY29sLCBEYXRhZ3JhbVNvY2tldFNlcnZpY2U+OjpvcGVyYXRvcj0oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX2RhdGFncmFtX3NvY2tldCkob3RoZXIpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBiYXNpY19kYXRhZ3JhbV9zb2NrZXQgZnJvbSBhIHNvY2tldCBvZiBhbm90aGVyIHByb3RvY29sCi0gIC8vLyB0eXBlLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhIGRhdGFncmFtIHNvY2tldCBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19kYXRhZ3JhbV9zb2NrZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUKLSAgICogd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX2RhdGFncmFtX3NvY2tldChpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxLCB0eXBlbmFtZSBEYXRhZ3JhbVNvY2tldFNlcnZpY2UxPgotICBiYXNpY19kYXRhZ3JhbV9zb2NrZXQoCi0gICAgICBiYXNpY19kYXRhZ3JhbV9zb2NrZXQ8UHJvdG9jb2wxLCBEYXRhZ3JhbVNvY2tldFNlcnZpY2UxPiYmIG90aGVyLAotICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPFByb3RvY29sMSwgUHJvdG9jb2w+Ojp2YWx1ZT46OnR5cGUqID0gMCkKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgRGF0YWdyYW1Tb2NrZXRTZXJ2aWNlPigKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QyKGJhc2ljX2RhdGFncmFtX3NvY2tldDwKLSAgICAgICAgICBQcm90b2NvbDEsIERhdGFncmFtU29ja2V0U2VydmljZTE+KShvdGhlcikpCi0gIHsKLSAgfQotCi0gIC8vLyBNb3ZlLWFzc2lnbiBhIGJhc2ljX2RhdGFncmFtX3NvY2tldCBmcm9tIGEgc29ja2V0IG9mIGFub3RoZXIgcHJvdG9jb2wKLSAgLy8vIHR5cGUuCi0gIC8qKgotICAgKiBUaGlzIGFzc2lnbm1lbnQgb3BlcmF0b3IgbW92ZXMgYSBkYXRhZ3JhbSBzb2NrZXQgZnJvbSBvbmUgb2JqZWN0IHRvCi0gICAqIGFub3RoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgYmFzaWNfZGF0YWdyYW1fc29ja2V0IG9iamVjdCBmcm9tIHdoaWNoIHRoZSBtb3ZlCi0gICAqIHdpbGwgb2NjdXIuCi0gICAqCi0gICAqIEBub3RlIEZvbGxvd2luZyB0aGUgbW92ZSwgdGhlIG1vdmVkLWZyb20gb2JqZWN0IGlzIGluIHRoZSBzYW1lIHN0YXRlIGFzIGlmCi0gICAqIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBAYyBiYXNpY19kYXRhZ3JhbV9zb2NrZXQoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sMSwgdHlwZW5hbWUgRGF0YWdyYW1Tb2NrZXRTZXJ2aWNlMT4KLSAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPFByb3RvY29sMSwgUHJvdG9jb2w+Ojp2YWx1ZSwKLSAgICAgIGJhc2ljX2RhdGFncmFtX3NvY2tldD46OnR5cGUmIG9wZXJhdG9yPSgKLSAgICAgICAgYmFzaWNfZGF0YWdyYW1fc29ja2V0PFByb3RvY29sMSwgRGF0YWdyYW1Tb2NrZXRTZXJ2aWNlMT4mJiBvdGhlcikKLSAgewotICAgIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgRGF0YWdyYW1Tb2NrZXRTZXJ2aWNlPjo6b3BlcmF0b3I9KAotICAgICAgICBBU0lPX01PVkVfQ0FTVDIoYmFzaWNfZGF0YWdyYW1fc29ja2V0PAotICAgICAgICAgIFByb3RvY29sMSwgRGF0YWdyYW1Tb2NrZXRTZXJ2aWNlMT4pKG90aGVyKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKSB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotICAvLy8gU2VuZCBzb21lIGRhdGEgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgZGF0YSBvbiB0aGUgZGF0YWdyYW0gc29ja2V0LiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIHRoZSBkYXRhIGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IG9yIGFuIGVycm9yCi0gICAqIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yZSBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIFRoZSBzZW5kIG9wZXJhdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBjb25uZWN0ZWQgc29ja2V0LiBVc2UKLSAgICogdGhlIHNlbmRfdG8gZnVuY3Rpb24gdG8gc2VuZCBkYXRhIG9uIGFuIHVuY29ubmVjdGVkIGRhdGFncmFtIHNvY2tldC4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHNlbmQgYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZSBzb2NrZXQuc2VuZChhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSkpOyBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHNlbmRpbmcgbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgc2VuZChjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS5zZW5kKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgMCwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzZW5kIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gU2VuZCBzb21lIGRhdGEgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgZGF0YSBvbiB0aGUgZGF0YWdyYW0gc29ja2V0LiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIHRoZSBkYXRhIGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IG9yIGFuIGVycm9yCi0gICAqIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yZSBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgc2VuZCBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIFRoZSBzZW5kIG9wZXJhdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBjb25uZWN0ZWQgc29ja2V0LiBVc2UKLSAgICogdGhlIHNlbmRfdG8gZnVuY3Rpb24gdG8gc2VuZCBkYXRhIG9uIGFuIHVuY29ubmVjdGVkIGRhdGFncmFtIHNvY2tldC4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBzZW5kKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPmdldF9zZXJ2aWNlKCkuc2VuZCgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGZsYWdzLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNlbmQiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBTZW5kIHNvbWUgZGF0YSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBkYXRhIG9uIHRoZSBkYXRhZ3JhbSBzb2NrZXQuIFRoZSBmdW5jdGlvbgotICAgKiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgdGhlIGRhdGEgaGFzIGJlZW4gc2VudCBzdWNjZXNzZnVsbHkgb3IgYW4gZXJyb3IKLSAgICogb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBkYXRhIGJ1ZmZlcnMgdG8gYmUgc2VudCBvbiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHNlbmQgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBzZW50LgotICAgKgotICAgKiBAbm90ZSBUaGUgc2VuZCBvcGVyYXRpb24gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgY29ubmVjdGVkIHNvY2tldC4gVXNlCi0gICAqIHRoZSBzZW5kX3RvIGZ1bmN0aW9uIHRvIHNlbmQgZGF0YSBvbiBhbiB1bmNvbm5lY3RlZCBkYXRhZ3JhbSBzb2NrZXQuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgc2VuZChjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuc2VuZCgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGZsYWdzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHNlbmQgZGF0YSBvbiB0aGUgZGF0YWdyYW0gc29ja2V0LgotICAgKiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHNlbnQgb24gdGhlIHNvY2tldC4gQWx0aG91Z2gKLSAgICogdGhlIGJ1ZmZlcnMgb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlIHVuZGVybHlpbmcKLSAgICogbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZSB0aGF0IHRoZXkKLSAgICogcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHNlbmQgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZgotICAgKiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBzZW50LgotICAgKiApOyBAZW5kY29kZQotICAgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gICAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gICAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICAgKgotICAgKiBAbm90ZSBUaGUgYXN5bmNfc2VuZCBvcGVyYXRpb24gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgY29ubmVjdGVkIHNvY2tldC4KLSAgICogVXNlIHRoZSBhc3luY19zZW5kX3RvIGZ1bmN0aW9uIHRvIHNlbmQgZGF0YSBvbiBhbiB1bmNvbm5lY3RlZCBkYXRhZ3JhbQotICAgKiBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyBzZW5kIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogc29ja2V0LmFzeW5jX3NlbmQoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBzZW5kaW5nIG11bHRpcGxlCi0gICAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19zZW5kKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBXcml0ZUhhbmRsZXIuCi0gICAgQVNJT19XUklURV9IQU5ETEVSX0NIRUNLKFdyaXRlSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3NlbmQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIGJ1ZmZlcnMsIDAsIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBzZW5kIG9uIGEgY29ubmVjdGVkIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSBzZW5kIGRhdGEgb24gdGhlIGRhdGFncmFtIHNvY2tldC4KLSAgICogVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IG9uIHRoZSBzb2NrZXQuIEFsdGhvdWdoCi0gICAqIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZSB1bmRlcmx5aW5nCi0gICAqIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCB0aGV5Ci0gICAqIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgc2VuZCBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzZW5kIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YKLSAgICogdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICoKLSAgICogQG5vdGUgVGhlIGFzeW5jX3NlbmQgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIGNvbm5lY3RlZCBzb2NrZXQuCi0gICAqIFVzZSB0aGUgYXN5bmNfc2VuZF90byBmdW5jdGlvbiB0byBzZW5kIGRhdGEgb24gYW4gdW5jb25uZWN0ZWQgZGF0YWdyYW0KLSAgICogc29ja2V0LgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19zZW5kKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFdyaXRlSGFuZGxlci4KLSAgICBBU0lPX1dSSVRFX0hBTkRMRVJfQ0hFQ0soV3JpdGVIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfc2VuZCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgYnVmZmVycywgZmxhZ3MsIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIFNlbmQgYSBkYXRhZ3JhbSB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYSBkYXRhZ3JhbSB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBlbmRwb2ludC4KLSAgICogVGhlIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgZGF0YSBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSBvcgotICAgKiBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IHRvIHRoZSByZW1vdGUgZW5kcG9pbnQuCi0gICAqCi0gICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBUaGUgcmVtb3RlIGVuZHBvaW50IHRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgc2VudC4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBzZW50LgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHNlbmQgYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dWRwOjplbmRwb2ludCBkZXN0aW5hdGlvbigKLSAgICogICAgIGFzaW86OmlwOjphZGRyZXNzOjpmcm9tX3N0cmluZygiMS4yLjMuNCIpLCAxMjM0NSk7Ci0gICAqIHNvY2tldC5zZW5kX3RvKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgZGVzdGluYXRpb24pOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHNlbmRpbmcgbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgc2VuZF90byhjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgZGVzdGluYXRpb24pCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnNlbmRfdG8oCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBkZXN0aW5hdGlvbiwgMCwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzZW5kX3RvIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gU2VuZCBhIGRhdGFncmFtIHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGRhdGFncmFtIHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGVuZHBvaW50LgotICAgKiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIHRoZSBkYXRhIGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IG9yCi0gICAqIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBlbmRwb2ludC4KLSAgICoKLSAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFRoZSByZW1vdGUgZW5kcG9pbnQgdG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSBzZW50LgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHNlbmQgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHNlbmRfdG8oY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIGRlc3RpbmF0aW9uLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPmdldF9zZXJ2aWNlKCkuc2VuZF90bygKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGRlc3RpbmF0aW9uLCBmbGFncywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzZW5kX3RvIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gU2VuZCBhIGRhdGFncmFtIHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGRhdGFncmFtIHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGVuZHBvaW50LgotICAgKiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIHRoZSBkYXRhIGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IG9yCi0gICAqIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBlbmRwb2ludC4KLSAgICoKLSAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFRoZSByZW1vdGUgZW5kcG9pbnQgdG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSBzZW50LgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHNlbmQgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBzZW50LgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHNlbmRfdG8oY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIGRlc3RpbmF0aW9uLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuc2VuZF90byh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgYnVmZmVycywgZGVzdGluYXRpb24sIGZsYWdzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgc2VuZCBhIGRhdGFncmFtIHRvIHRoZSBzcGVjaWZpZWQKLSAgICogcmVtb3RlIGVuZHBvaW50LiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBlbmRwb2ludC4KLSAgICogQWx0aG91Z2ggdGhlIGJ1ZmZlcnMgb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlCi0gICAqIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICAgKiB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFRoZSByZW1vdGUgZW5kcG9pbnQgdG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSBzZW50LgotICAgKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBlbmRwb2ludCBhcyByZXF1aXJlZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHNlbmQgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZgotICAgKiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBzZW50LgotICAgKiApOyBAZW5kY29kZQotICAgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gICAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gICAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gc2VuZCBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp1ZHA6OmVuZHBvaW50IGRlc3RpbmF0aW9uKAotICAgKiAgICAgYXNpbzo6aXA6OmFkZHJlc3M6OmZyb21fc3RyaW5nKCIxLjIuMy40IiksIDEyMzQ1KTsKLSAgICogc29ja2V0LmFzeW5jX3NlbmRfdG8oCi0gICAqICAgICBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIGRlc3RpbmF0aW9uLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBzZW5kaW5nIG11bHRpcGxlCi0gICAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19zZW5kX3RvKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBkZXN0aW5hdGlvbiwKLSAgICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFdyaXRlSGFuZGxlci4KLSAgICBBU0lPX1dSSVRFX0hBTkRMRVJfQ0hFQ0soV3JpdGVIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfc2VuZF90bygKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGRlc3RpbmF0aW9uLCAwLAotICAgICAgICBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgc2VuZC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSBzZW5kIGEgZGF0YWdyYW0gdG8gdGhlIHNwZWNpZmllZAotICAgKiByZW1vdGUgZW5kcG9pbnQuIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBkYXRhIGJ1ZmZlcnMgdG8gYmUgc2VudCB0byB0aGUgcmVtb3RlIGVuZHBvaW50LgotICAgKiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUKLSAgICogdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gICAqIHRoYXQgdGhleSByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHNlbmQgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIHJlbW90ZSBlbmRwb2ludCB0byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHNlbnQuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGVuZHBvaW50IGFzIHJlcXVpcmVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc2VuZCBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mCi0gICAqIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHNlbnQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3NlbmRfdG8oY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIGRlc3RpbmF0aW9uLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFdyaXRlSGFuZGxlci4KLSAgICBBU0lPX1dSSVRFX0hBTkRMRVJfQ0hFQ0soV3JpdGVIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfc2VuZF90bygKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGRlc3RpbmF0aW9uLCBmbGFncywKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLQotICAvLy8gUmVjZWl2ZSBzb21lIGRhdGEgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlY2VpdmUgZGF0YSBvbiB0aGUgZGF0YWdyYW0gc29ja2V0LiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5IG9yIGFuIGVycm9yCi0gICAqIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVjZWl2ZSBvcGVyYXRpb24gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgY29ubmVjdGVkIHNvY2tldC4gVXNlCi0gICAqIHRoZSByZWNlaXZlX2Zyb20gZnVuY3Rpb24gdG8gcmVjZWl2ZSBkYXRhIG9uIGFuIHVuY29ubmVjdGVkIGRhdGFncmFtCi0gICAqIHNvY2tldC4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHJlY2VpdmUgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzCi0gICAqIGZvbGxvd3M6Ci0gICAqIEBjb2RlIHNvY2tldC5yZWNlaXZlKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSk7IEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gcmVjZWl2aW5nIGludG8KLSAgICogbXVsdGlwbGUgYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWNlaXZlKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPmdldF9zZXJ2aWNlKCkucmVjZWl2ZSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIDAsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVjZWl2ZSIpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIFJlY2VpdmUgc29tZSBkYXRhIG9uIGEgY29ubmVjdGVkIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNlaXZlIGRhdGEgb24gdGhlIGRhdGFncmFtIHNvY2tldC4gVGhlIGZ1bmN0aW9uCi0gICAqIGNhbGwgd2lsbCBibG9jayB1bnRpbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvcgotICAgKiBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkLgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmUgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJlY2VpdmUgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIGNvbm5lY3RlZCBzb2NrZXQuIFVzZQotICAgKiB0aGUgcmVjZWl2ZV9mcm9tIGZ1bmN0aW9uIHRvIHJlY2VpdmUgZGF0YSBvbiBhbiB1bmNvbm5lY3RlZCBkYXRhZ3JhbQotICAgKiBzb2NrZXQuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWNlaXZlKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZWNlaXZlKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgZmxhZ3MsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVjZWl2ZSIpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIFJlY2VpdmUgc29tZSBkYXRhIG9uIGEgY29ubmVjdGVkIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNlaXZlIGRhdGEgb24gdGhlIGRhdGFncmFtIHNvY2tldC4gVGhlIGZ1bmN0aW9uCi0gICAqIGNhbGwgd2lsbCBibG9jayB1bnRpbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvcgotICAgKiBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkLgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmUgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJlY2VpdmUgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIGNvbm5lY3RlZCBzb2NrZXQuIFVzZQotICAgKiB0aGUgcmVjZWl2ZV9mcm9tIGZ1bmN0aW9uIHRvIHJlY2VpdmUgZGF0YSBvbiBhbiB1bmNvbm5lY3RlZCBkYXRhZ3JhbQotICAgKiBzb2NrZXQuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWNlaXZlKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLnJlY2VpdmUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBmbGFncywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWNlaXZlIG9uIGEgY29ubmVjdGVkIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWNlaXZlIGRhdGEgZnJvbSB0aGUgZGF0YWdyYW0KLSAgICogc29ja2V0LiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWNlaXZlIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBub3RlIFRoZSBhc3luY19yZWNlaXZlIG9wZXJhdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBjb25uZWN0ZWQgc29ja2V0LgotICAgKiBVc2UgdGhlIGFzeW5jX3JlY2VpdmVfZnJvbSBmdW5jdGlvbiB0byByZWNlaXZlIGRhdGEgb24gYW4gdW5jb25uZWN0ZWQKLSAgICogZGF0YWdyYW0gc29ja2V0LgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gcmVjZWl2ZSBpbnRvIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMKLSAgICogZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogc29ja2V0LmFzeW5jX3JlY2VpdmUoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWNlaXZpbmcgaW50bwotICAgKiBtdWx0aXBsZSBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVjZWl2ZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICAgIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfcmVjZWl2ZSh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgYnVmZmVycywgMCwgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgcmVjZWl2ZSBkYXRhIGZyb20gdGhlIGRhdGFncmFtCi0gICAqIHNvY2tldC4gVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkLgotICAgKiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUKLSAgICogdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gICAqIHRoYXQgdGhleSByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmUgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcmVjZWl2ZSBvcGVyYXRpb24KLSAgICogY29tcGxldGVzLiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24KLSAgICogc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICAgKiApOyBAZW5kY29kZQotICAgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gICAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gICAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICAgKgotICAgKiBAbm90ZSBUaGUgYXN5bmNfcmVjZWl2ZSBvcGVyYXRpb24gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgY29ubmVjdGVkIHNvY2tldC4KLSAgICogVXNlIHRoZSBhc3luY19yZWNlaXZlX2Zyb20gZnVuY3Rpb24gdG8gcmVjZWl2ZSBkYXRhIG9uIGFuIHVuY29ubmVjdGVkCi0gICAqIGRhdGFncmFtIHNvY2tldC4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVjZWl2ZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gICAgQVNJT19SRUFEX0hBTkRMRVJfQ0hFQ0soUmVhZEhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19yZWNlaXZlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICBidWZmZXJzLCBmbGFncywgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBSZWNlaXZlIGEgZGF0YWdyYW0gd2l0aCB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbmRlci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNlaXZlIGEgZGF0YWdyYW0uIFRoZSBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sKLSAgICogdW50aWwgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBzdWNjZXNzZnVsbHkgb3IgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICoKLSAgICogQHBhcmFtIHNlbmRlcl9lbmRwb2ludCBBbiBlbmRwb2ludCBvYmplY3QgdGhhdCByZWNlaXZlcyB0aGUgZW5kcG9pbnQgb2YKLSAgICogdGhlIHJlbW90ZSBzZW5kZXIgb2YgdGhlIGRhdGFncmFtLgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHJlY2VpdmUgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzCi0gICAqIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp1ZHA6OmVuZHBvaW50IHNlbmRlcl9lbmRwb2ludDsKLSAgICogc29ja2V0LnJlY2VpdmVfZnJvbSgKLSAgICogICAgIGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgc2VuZGVyX2VuZHBvaW50KTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWNlaXZpbmcgaW50bwotICAgKiBtdWx0aXBsZSBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlY2VpdmVfZnJvbShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBlbmRwb2ludF90eXBlJiBzZW5kZXJfZW5kcG9pbnQpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnJlY2VpdmVfZnJvbSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIHNlbmRlcl9lbmRwb2ludCwgMCwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWNlaXZlX2Zyb20iKTsKLSAgICByZXR1cm4gczsKLSAgfQotICAKLSAgLy8vIFJlY2VpdmUgYSBkYXRhZ3JhbSB3aXRoIHRoZSBlbmRwb2ludCBvZiB0aGUgc2VuZGVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlY2VpdmUgYSBkYXRhZ3JhbS4gVGhlIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jawotICAgKiB1bnRpbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkLgotICAgKgotICAgKiBAcGFyYW0gc2VuZGVyX2VuZHBvaW50IEFuIGVuZHBvaW50IG9iamVjdCB0aGF0IHJlY2VpdmVzIHRoZSBlbmRwb2ludCBvZgotICAgKiB0aGUgcmVtb3RlIHNlbmRlciBvZiB0aGUgZGF0YWdyYW0uCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgcmVjZWl2ZSBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVjZWl2ZV9mcm9tKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGVuZHBvaW50X3R5cGUmIHNlbmRlcl9lbmRwb2ludCwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnJlY2VpdmVfZnJvbSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIHNlbmRlcl9lbmRwb2ludCwgZmxhZ3MsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVjZWl2ZV9mcm9tIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLSAgCi0gIC8vLyBSZWNlaXZlIGEgZGF0YWdyYW0gd2l0aCB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbmRlci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNlaXZlIGEgZGF0YWdyYW0uIFRoZSBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sKLSAgICogdW50aWwgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBzdWNjZXNzZnVsbHkgb3IgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICoKLSAgICogQHBhcmFtIHNlbmRlcl9lbmRwb2ludCBBbiBlbmRwb2ludCBvYmplY3QgdGhhdCByZWNlaXZlcyB0aGUgZW5kcG9pbnQgb2YKLSAgICogdGhlIHJlbW90ZSBzZW5kZXIgb2YgdGhlIGRhdGFncmFtLgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmUgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlY2VpdmVfZnJvbShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBlbmRwb2ludF90eXBlJiBzZW5kZXJfZW5kcG9pbnQsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZWNlaXZlX2Zyb20odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIGJ1ZmZlcnMsIHNlbmRlcl9lbmRwb2ludCwgZmxhZ3MsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWNlaXZlIGEgZGF0YWdyYW0uIFRoZSBmdW5jdGlvbgotICAgKiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICogQWx0aG91Z2ggdGhlIGJ1ZmZlcnMgb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlCi0gICAqIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICAgKiB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIHNlbmRlcl9lbmRwb2ludCBBbiBlbmRwb2ludCBvYmplY3QgdGhhdCByZWNlaXZlcyB0aGUgZW5kcG9pbnQgb2YKLSAgICogdGhlIHJlbW90ZSBzZW5kZXIgb2YgdGhlIGRhdGFncmFtLiBPd25lcnNoaXAgb2YgdGhlIHNlbmRlcl9lbmRwb2ludCBvYmplY3QKLSAgICogaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCBpdCBpcyB2YWxpZCB1bnRpbCB0aGUKLSAgICogaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWNlaXZlIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWNlaXZlIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcwotICAgKiBmb2xsb3dzOgotICAgKiBAY29kZSBzb2NrZXQuYXN5bmNfcmVjZWl2ZV9mcm9tKAotICAgKiAgICAgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCBzZW5kZXJfZW5kcG9pbnQsIGhhbmRsZXIpOyBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlY2VpdmluZyBpbnRvCi0gICAqIG11bHRpcGxlIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19yZWNlaXZlX2Zyb20oY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgZW5kcG9pbnRfdHlwZSYgc2VuZGVyX2VuZHBvaW50LAotICAgICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBSZWFkSGFuZGxlci4KLSAgICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3JlY2VpdmVfZnJvbSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIHNlbmRlcl9lbmRwb2ludCwgMCwKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWNlaXZlIGEgZGF0YWdyYW0uIFRoZSBmdW5jdGlvbgotICAgKiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICogQWx0aG91Z2ggdGhlIGJ1ZmZlcnMgb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlCi0gICAqIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICAgKiB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIHNlbmRlcl9lbmRwb2ludCBBbiBlbmRwb2ludCBvYmplY3QgdGhhdCByZWNlaXZlcyB0aGUgZW5kcG9pbnQgb2YKLSAgICogdGhlIHJlbW90ZSBzZW5kZXIgb2YgdGhlIGRhdGFncmFtLiBPd25lcnNoaXAgb2YgdGhlIHNlbmRlcl9lbmRwb2ludCBvYmplY3QKLSAgICogaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCBpdCBpcyB2YWxpZCB1bnRpbCB0aGUKLSAgICogaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgcmVjZWl2ZSBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWNlaXZlIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlY2VpdmVfZnJvbShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBlbmRwb2ludF90eXBlJiBzZW5kZXJfZW5kcG9pbnQsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBSZWFkSGFuZGxlci4KLSAgICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3JlY2VpdmVfZnJvbSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIHNlbmRlcl9lbmRwb2ludCwgZmxhZ3MsCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fQkFTSUNfREFUQUdSQU1fU09DS0VUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX2RlYWRsaW5lX3RpbWVyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19kZWFkbGluZV90aW1lci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NWI5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX2RlYWRsaW5lX3RpbWVyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vLwotLy8gYmFzaWNfZGVhZGxpbmVfdGltZXIuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19CQVNJQ19ERUFETElORV9USU1FUl9IUFAKLSNkZWZpbmUgQVNJT19CQVNJQ19ERUFETElORV9USU1FUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfREFURV9USU1FKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2Jhc2ljX2lvX29iamVjdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZWFkbGluZV90aW1lcl9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBQcm92aWRlcyB3YWl0YWJsZSB0aW1lciBmdW5jdGlvbmFsaXR5LgotLyoqCi0gKiBUaGUgYmFzaWNfZGVhZGxpbmVfdGltZXIgY2xhc3MgdGVtcGxhdGUgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBhCi0gKiBibG9ja2luZyBvciBhc3luY2hyb25vdXMgd2FpdCBmb3IgYSB0aW1lciB0byBleHBpcmUuCi0gKgotICogQSBkZWFkbGluZSB0aW1lciBpcyBhbHdheXMgaW4gb25lIG9mIHR3byBzdGF0ZXM6ICJleHBpcmVkIiBvciAibm90IGV4cGlyZWQiLgotICogSWYgdGhlIHdhaXQoKSBvciBhc3luY193YWl0KCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGFuIGV4cGlyZWQgdGltZXIsIHRoZQotICogd2FpdCBvcGVyYXRpb24gd2lsbCBjb21wbGV0ZSBpbW1lZGlhdGVseS4KLSAqCi0gKiBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIHVzZSB0aGUgYXNpbzo6ZGVhZGxpbmVfdGltZXIgdHlwZWRlZi4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKgotICogQHBhciBFeGFtcGxlcwotICogUGVyZm9ybWluZyBhIGJsb2NraW5nIHdhaXQ6Ci0gKiBAY29kZQotICogLy8gQ29uc3RydWN0IGEgdGltZXIgd2l0aG91dCBzZXR0aW5nIGFuIGV4cGlyeSB0aW1lLgotICogYXNpbzo6ZGVhZGxpbmVfdGltZXIgdGltZXIoaW9fc2VydmljZSk7Ci0gKgotICogLy8gU2V0IGFuIGV4cGlyeSB0aW1lIHJlbGF0aXZlIHRvIG5vdy4KLSAqIHRpbWVyLmV4cGlyZXNfZnJvbV9ub3coYm9vc3Q6OnBvc2l4X3RpbWU6OnNlY29uZHMoNSkpOwotICoKLSAqIC8vIFdhaXQgZm9yIHRoZSB0aW1lciB0byBleHBpcmUuCi0gKiB0aW1lci53YWl0KCk7Ci0gKiBAZW5kY29kZQotICoKLSAqIEBwYXIgCi0gKiBQZXJmb3JtaW5nIGFuIGFzeW5jaHJvbm91cyB3YWl0OgotICogQGNvZGUKLSAqIHZvaWQgaGFuZGxlcihjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvcikKLSAqIHsKLSAqICAgaWYgKCFlcnJvcikKLSAqICAgewotICogICAgIC8vIFRpbWVyIGV4cGlyZWQuCi0gKiAgIH0KLSAqIH0KLSAqCi0gKiAuLi4KLSAqCi0gKiAvLyBDb25zdHJ1Y3QgYSB0aW1lciB3aXRoIGFuIGFic29sdXRlIGV4cGlyeSB0aW1lLgotICogYXNpbzo6ZGVhZGxpbmVfdGltZXIgdGltZXIoaW9fc2VydmljZSwKLSAqICAgICBib29zdDo6cG9zaXhfdGltZTo6dGltZV9mcm9tX3N0cmluZygiMjAwNS0xMi0wNyAyMzo1OTo1OS4wMDAiKSk7Ci0gKgotICogLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdhaXQuCi0gKiB0aW1lci5hc3luY193YWl0KGhhbmRsZXIpOwotICogQGVuZGNvZGUKLSAqCi0gKiBAcGFyIENoYW5naW5nIGFuIGFjdGl2ZSBkZWFkbGluZV90aW1lcidzIGV4cGlyeSB0aW1lCi0gKgotICogQ2hhbmdpbmcgdGhlIGV4cGlyeSB0aW1lIG9mIGEgdGltZXIgd2hpbGUgdGhlcmUgYXJlIHBlbmRpbmcgYXN5bmNocm9ub3VzCi0gKiB3YWl0cyBjYXVzZXMgdGhvc2Ugd2FpdCBvcGVyYXRpb25zIHRvIGJlIGNhbmNlbGxlZC4gVG8gZW5zdXJlIHRoYXQgdGhlIGFjdGlvbgotICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0aW1lciBpcyBwZXJmb3JtZWQgb25seSBvbmNlLCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpczoKLSAqIHVzZWQ6Ci0gKgotICogQGNvZGUKLSAqIHZvaWQgb25fc29tZV9ldmVudCgpCi0gKiB7Ci0gKiAgIGlmIChteV90aW1lci5leHBpcmVzX2Zyb21fbm93KHNlY29uZHMoNSkpID4gMCkKLSAqICAgewotICogICAgIC8vIFdlIG1hbmFnZWQgdG8gY2FuY2VsIHRoZSB0aW1lci4gU3RhcnQgbmV3IGFzeW5jaHJvbm91cyB3YWl0LgotICogICAgIG15X3RpbWVyLmFzeW5jX3dhaXQob25fdGltZW91dCk7Ci0gKiAgIH0KLSAqICAgZWxzZQotICogICB7Ci0gKiAgICAgLy8gVG9vIGxhdGUsIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQhCi0gKiAgIH0KLSAqIH0KLSAqCi0gKiB2b2lkIG9uX3RpbWVvdXQoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZSkKLSAqIHsKLSAqICAgaWYgKGUgIT0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkKQotICogICB7Ci0gKiAgICAgLy8gVGltZXIgd2FzIG5vdCBjYW5jZWxsZWQsIHRha2UgbmVjZXNzYXJ5IGFjdGlvbi4KLSAqICAgfQotICogfQotICogQGVuZGNvZGUKLSAqCi0gKiBAbGkgVGhlIGFzaW86OmJhc2ljX2RlYWRsaW5lX3RpbWVyOjpleHBpcmVzX2Zyb21fbm93KCkgZnVuY3Rpb24KLSAqIGNhbmNlbHMgYW55IHBlbmRpbmcgYXN5bmNocm9ub3VzIHdhaXRzLCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gKiBhc3luY2hyb25vdXMgd2FpdHMgdGhhdCB3ZXJlIGNhbmNlbGxlZC4gSWYgaXQgcmV0dXJucyAwIHRoZW4geW91IHdlcmUgdG9vCi0gKiBsYXRlIGFuZCB0aGUgd2FpdCBoYW5kbGVyIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQsIG9yIHdpbGwgc29vbiBiZQotICogZXhlY3V0ZWQuIElmIGl0IHJldHVybnMgMSB0aGVuIHRoZSB3YWl0IGhhbmRsZXIgd2FzIHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQuCi0gKgotICogQGxpIElmIGEgd2FpdCBoYW5kbGVyIGlzIGNhbmNlbGxlZCwgdGhlIGFzaW86OmVycm9yX2NvZGUgcGFzc2VkIHRvCi0gKiBpdCBjb250YWlucyB0aGUgdmFsdWUgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZSwKLSAgICB0eXBlbmFtZSBUaW1lVHJhaXRzID0gYXNpbzo6dGltZV90cmFpdHM8VGltZT4sCi0gICAgdHlwZW5hbWUgVGltZXJTZXJ2aWNlID0gZGVhZGxpbmVfdGltZXJfc2VydmljZTxUaW1lLCBUaW1lVHJhaXRzPiA+Ci1jbGFzcyBiYXNpY19kZWFkbGluZV90aW1lcgotICA6IHB1YmxpYyBiYXNpY19pb19vYmplY3Q8VGltZXJTZXJ2aWNlPgotewotcHVibGljOgotICAvLy8gVGhlIHRpbWUgdHJhaXRzIHR5cGUuCi0gIHR5cGVkZWYgVGltZVRyYWl0cyB0cmFpdHNfdHlwZTsKLQotICAvLy8gVGhlIHRpbWUgdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6dGltZV90eXBlIHRpbWVfdHlwZTsKLQotICAvLy8gVGhlIGR1cmF0aW9uIHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmR1cmF0aW9uX3R5cGUgZHVyYXRpb25fdHlwZTsKLQotICAvLy8gQ29uc3RydWN0b3IuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSB0aW1lciB3aXRob3V0IHNldHRpbmcgYW4gZXhwaXJ5IHRpbWUuIFRoZQotICAgKiBleHBpcmVzX2F0KCkgb3IgZXhwaXJlc19mcm9tX25vdygpIGZ1bmN0aW9ucyBtdXN0IGJlIGNhbGxlZCB0byBzZXQgYW4KLSAgICogZXhwaXJ5IHRpbWUgYmVmb3JlIHRoZSB0aW1lciBjYW4gYmUgd2FpdGVkIG9uLgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgdGltZXIgd2lsbCB1c2UgdG8gZGlzcGF0Y2gKLSAgICogaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIHRpbWVyLgotICAgKi8KLSAgZXhwbGljaXQgYmFzaWNfZGVhZGxpbmVfdGltZXIoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGJhc2ljX2lvX29iamVjdDxUaW1lclNlcnZpY2U+KGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3RvciB0byBzZXQgYSBwYXJ0aWN1bGFyIGV4cGlyeSB0aW1lIGFzIGFuIGFic29sdXRlIHRpbWUuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSB0aW1lciBhbmQgc2V0cyB0aGUgZXhwaXJ5IHRpbWUuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSB0aW1lciB3aWxsIHVzZSB0byBkaXNwYXRjaAotICAgKiBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgdGltZXIuCi0gICAqCi0gICAqIEBwYXJhbSBleHBpcnlfdGltZSBUaGUgZXhwaXJ5IHRpbWUgdG8gYmUgdXNlZCBmb3IgdGhlIHRpbWVyLCBleHByZXNzZWQKLSAgICogYXMgYW4gYWJzb2x1dGUgdGltZS4KLSAgICovCi0gIGJhc2ljX2RlYWRsaW5lX3RpbWVyKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCB0aW1lX3R5cGUmIGV4cGlyeV90aW1lKQotICAgIDogYmFzaWNfaW9fb2JqZWN0PFRpbWVyU2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+c2VydmljZS5leHBpcmVzX2F0KHRoaXMtPmltcGxlbWVudGF0aW9uLCBleHBpcnlfdGltZSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJleHBpcmVzX2F0Iik7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0b3IgdG8gc2V0IGEgcGFydGljdWxhciBleHBpcnkgdGltZSByZWxhdGl2ZSB0byBub3cuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSB0aW1lciBhbmQgc2V0cyB0aGUgZXhwaXJ5IHRpbWUuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSB0aW1lciB3aWxsIHVzZSB0byBkaXNwYXRjaAotICAgKiBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgdGltZXIuCi0gICAqCi0gICAqIEBwYXJhbSBleHBpcnlfdGltZSBUaGUgZXhwaXJ5IHRpbWUgdG8gYmUgdXNlZCBmb3IgdGhlIHRpbWVyLCByZWxhdGl2ZSB0bwotICAgKiBub3cuCi0gICAqLwotICBiYXNpY19kZWFkbGluZV90aW1lcihhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgY29uc3QgZHVyYXRpb25fdHlwZSYgZXhwaXJ5X3RpbWUpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8VGltZXJTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5zZXJ2aWNlLmV4cGlyZXNfZnJvbV9ub3codGhpcy0+aW1wbGVtZW50YXRpb24sIGV4cGlyeV90aW1lLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImV4cGlyZXNfZnJvbV9ub3ciKTsKLSAgfQotCi0gIC8vLyBDYW5jZWwgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgYXJlIHdhaXRpbmcgb24gdGhlIHRpbWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBmb3JjZXMgdGhlIGNvbXBsZXRpb24gb2YgYW55IHBlbmRpbmcgYXN5bmNocm9ub3VzIHdhaXQKLSAgICogb3BlcmF0aW9ucyBhZ2FpbnN0IHRoZSB0aW1lci4gVGhlIGhhbmRsZXIgZm9yIGVhY2ggY2FuY2VsbGVkIG9wZXJhdGlvbiB3aWxsCi0gICAqIGJlIGludm9rZWQgd2l0aCB0aGUgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yIGNvZGUuCi0gICAqCi0gICAqIENhbmNlbGxpbmcgdGhlIHRpbWVyIGRvZXMgbm90IGNoYW5nZSB0aGUgZXhwaXJ5IHRpbWUuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB0aGF0IHdlcmUgY2FuY2VsbGVkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgSWYgdGhlIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQgd2hlbiBjYW5jZWwoKSBpcyBjYWxsZWQsIHRoZW4gdGhlCi0gICAqIGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgd2FpdCBvcGVyYXRpb25zIHdpbGw6Ci0gICAqCi0gICAqIEBsaSBoYXZlIGFscmVhZHkgYmVlbiBpbnZva2VkOyBvcgotICAgKgotICAgKiBAbGkgaGF2ZSBiZWVuIHF1ZXVlZCBmb3IgaW52b2NhdGlvbiBpbiB0aGUgbmVhciBmdXR1cmUuCi0gICAqCi0gICAqIFRoZXNlIGhhbmRsZXJzIGNhbiBubyBsb25nZXIgYmUgY2FuY2VsbGVkLCBhbmQgdGhlcmVmb3JlIGFyZSBwYXNzZWQgYW4KLSAgICogZXJyb3IgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSB3YWl0IG9wZXJhdGlvbi4KLSAgICovCi0gIHN0ZDo6c2l6ZV90IGNhbmNlbCgpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5zZXJ2aWNlLmNhbmNlbCh0aGlzLT5pbXBsZW1lbnRhdGlvbiwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJjYW5jZWwiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBDYW5jZWwgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgYXJlIHdhaXRpbmcgb24gdGhlIHRpbWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBmb3JjZXMgdGhlIGNvbXBsZXRpb24gb2YgYW55IHBlbmRpbmcgYXN5bmNocm9ub3VzIHdhaXQKLSAgICogb3BlcmF0aW9ucyBhZ2FpbnN0IHRoZSB0aW1lci4gVGhlIGhhbmRsZXIgZm9yIGVhY2ggY2FuY2VsbGVkIG9wZXJhdGlvbiB3aWxsCi0gICAqIGJlIGludm9rZWQgd2l0aCB0aGUgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yIGNvZGUuCi0gICAqCi0gICAqIENhbmNlbGxpbmcgdGhlIHRpbWVyIGRvZXMgbm90IGNoYW5nZSB0aGUgZXhwaXJ5IHRpbWUuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdGhhdCB3ZXJlIGNhbmNlbGxlZC4KLSAgICoKLSAgICogQG5vdGUgSWYgdGhlIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQgd2hlbiBjYW5jZWwoKSBpcyBjYWxsZWQsIHRoZW4gdGhlCi0gICAqIGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgd2FpdCBvcGVyYXRpb25zIHdpbGw6Ci0gICAqCi0gICAqIEBsaSBoYXZlIGFscmVhZHkgYmVlbiBpbnZva2VkOyBvcgotICAgKgotICAgKiBAbGkgaGF2ZSBiZWVuIHF1ZXVlZCBmb3IgaW52b2NhdGlvbiBpbiB0aGUgbmVhciBmdXR1cmUuCi0gICAqCi0gICAqIFRoZXNlIGhhbmRsZXJzIGNhbiBubyBsb25nZXIgYmUgY2FuY2VsbGVkLCBhbmQgdGhlcmVmb3JlIGFyZSBwYXNzZWQgYW4KLSAgICogZXJyb3IgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSB3YWl0IG9wZXJhdGlvbi4KLSAgICovCi0gIHN0ZDo6c2l6ZV90IGNhbmNlbChhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLmNhbmNlbCh0aGlzLT5pbXBsZW1lbnRhdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIENhbmNlbHMgb25lIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdGhhdCBpcyB3YWl0aW5nIG9uIHRoZSB0aW1lci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIHRoZSBjb21wbGV0aW9uIG9mIG9uZSBwZW5kaW5nIGFzeW5jaHJvbm91cyB3YWl0Ci0gICAqIG9wZXJhdGlvbiBhZ2FpbnN0IHRoZSB0aW1lci4gSGFuZGxlcnMgYXJlIGNhbmNlbGxlZCBpbiBGSUZPIG9yZGVyLiBUaGUKLSAgICogaGFuZGxlciBmb3IgdGhlIGNhbmNlbGxlZCBvcGVyYXRpb24gd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlCi0gICAqIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvciBjb2RlLgotICAgKgotICAgKiBDYW5jZWxsaW5nIHRoZSB0aW1lciBkb2VzIG5vdCBjaGFuZ2UgdGhlIGV4cGlyeSB0aW1lLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdGhhdCB3ZXJlIGNhbmNlbGxlZC4gVGhhdCBpcywKLSAgICogZWl0aGVyIDAgb3IgMS4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIElmIHRoZSB0aW1lciBoYXMgYWxyZWFkeSBleHBpcmVkIHdoZW4gY2FuY2VsX29uZSgpIGlzIGNhbGxlZCwgdGhlbgotICAgKiB0aGUgaGFuZGxlcnMgZm9yIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbnMgd2lsbDoKLSAgICoKLSAgICogQGxpIGhhdmUgYWxyZWFkeSBiZWVuIGludm9rZWQ7IG9yCi0gICAqCi0gICAqIEBsaSBoYXZlIGJlZW4gcXVldWVkIGZvciBpbnZvY2F0aW9uIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICoKLSAgICogVGhlc2UgaGFuZGxlcnMgY2FuIG5vIGxvbmdlciBiZSBjYW5jZWxsZWQsIGFuZCB0aGVyZWZvcmUgYXJlIHBhc3NlZCBhbgotICAgKiBlcnJvciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHdhaXQgb3BlcmF0aW9uLgotICAgKi8KLSAgc3RkOjpzaXplX3QgY2FuY2VsX29uZSgpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5zZXJ2aWNlLmNhbmNlbF9vbmUodGhpcy0+aW1wbGVtZW50YXRpb24sIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiY2FuY2VsX29uZSIpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIENhbmNlbHMgb25lIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdGhhdCBpcyB3YWl0aW5nIG9uIHRoZSB0aW1lci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIHRoZSBjb21wbGV0aW9uIG9mIG9uZSBwZW5kaW5nIGFzeW5jaHJvbm91cyB3YWl0Ci0gICAqIG9wZXJhdGlvbiBhZ2FpbnN0IHRoZSB0aW1lci4gSGFuZGxlcnMgYXJlIGNhbmNlbGxlZCBpbiBGSUZPIG9yZGVyLiBUaGUKLSAgICogaGFuZGxlciBmb3IgdGhlIGNhbmNlbGxlZCBvcGVyYXRpb24gd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlCi0gICAqIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvciBjb2RlLgotICAgKgotICAgKiBDYW5jZWxsaW5nIHRoZSB0aW1lciBkb2VzIG5vdCBjaGFuZ2UgdGhlIGV4cGlyeSB0aW1lLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgd2VyZSBjYW5jZWxsZWQuIFRoYXQgaXMsCi0gICAqIGVpdGhlciAwIG9yIDEuCi0gICAqCi0gICAqIEBub3RlIElmIHRoZSB0aW1lciBoYXMgYWxyZWFkeSBleHBpcmVkIHdoZW4gY2FuY2VsX29uZSgpIGlzIGNhbGxlZCwgdGhlbgotICAgKiB0aGUgaGFuZGxlcnMgZm9yIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbnMgd2lsbDoKLSAgICoKLSAgICogQGxpIGhhdmUgYWxyZWFkeSBiZWVuIGludm9rZWQ7IG9yCi0gICAqCi0gICAqIEBsaSBoYXZlIGJlZW4gcXVldWVkIGZvciBpbnZvY2F0aW9uIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICoKLSAgICogVGhlc2UgaGFuZGxlcnMgY2FuIG5vIGxvbmdlciBiZSBjYW5jZWxsZWQsIGFuZCB0aGVyZWZvcmUgYXJlIHBhc3NlZCBhbgotICAgKiBlcnJvciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHdhaXQgb3BlcmF0aW9uLgotICAgKi8KLSAgc3RkOjpzaXplX3QgY2FuY2VsX29uZShhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLmNhbmNlbF9vbmUodGhpcy0+aW1wbGVtZW50YXRpb24sIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHRpbWVyJ3MgZXhwaXJ5IHRpbWUgYXMgYW4gYWJzb2x1dGUgdGltZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSB0aW1lcidzIGN1cnJlbnQgZXhwaXJ5IHRpbWUuCi0gICAqIFdoZXRoZXIgdGhlIHRpbWVyIGhhcyBleHBpcmVkIG9yIG5vdCBkb2VzIG5vdCBhZmZlY3QgdGhpcyB2YWx1ZS4KLSAgICovCi0gIHRpbWVfdHlwZSBleHBpcmVzX2F0KCkgY29uc3QKLSAgewotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLmV4cGlyZXNfYXQodGhpcy0+aW1wbGVtZW50YXRpb24pOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgdGltZXIncyBleHBpcnkgdGltZSBhcyBhbiBhYnNvbHV0ZSB0aW1lLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBleHBpcnkgdGltZS4gQW55IHBlbmRpbmcgYXN5bmNocm9ub3VzIHdhaXQKLSAgICogb3BlcmF0aW9ucyB3aWxsIGJlIGNhbmNlbGxlZC4gVGhlIGhhbmRsZXIgZm9yIGVhY2ggY2FuY2VsbGVkIG9wZXJhdGlvbiB3aWxsCi0gICAqIGJlIGludm9rZWQgd2l0aCB0aGUgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yIGNvZGUuCi0gICAqCi0gICAqIEBwYXJhbSBleHBpcnlfdGltZSBUaGUgZXhwaXJ5IHRpbWUgdG8gYmUgdXNlZCBmb3IgdGhlIHRpbWVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdGhhdCB3ZXJlIGNhbmNlbGxlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIElmIHRoZSB0aW1lciBoYXMgYWxyZWFkeSBleHBpcmVkIHdoZW4gZXhwaXJlc19hdCgpIGlzIGNhbGxlZCwgdGhlbgotICAgKiB0aGUgaGFuZGxlcnMgZm9yIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbnMgd2lsbDoKLSAgICoKLSAgICogQGxpIGhhdmUgYWxyZWFkeSBiZWVuIGludm9rZWQ7IG9yCi0gICAqCi0gICAqIEBsaSBoYXZlIGJlZW4gcXVldWVkIGZvciBpbnZvY2F0aW9uIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICoKLSAgICogVGhlc2UgaGFuZGxlcnMgY2FuIG5vIGxvbmdlciBiZSBjYW5jZWxsZWQsIGFuZCB0aGVyZWZvcmUgYXJlIHBhc3NlZCBhbgotICAgKiBlcnJvciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHdhaXQgb3BlcmF0aW9uLgotICAgKi8KLSAgc3RkOjpzaXplX3QgZXhwaXJlc19hdChjb25zdCB0aW1lX3R5cGUmIGV4cGlyeV90aW1lKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gdGhpcy0+c2VydmljZS5leHBpcmVzX2F0KAotICAgICAgICB0aGlzLT5pbXBsZW1lbnRhdGlvbiwgZXhwaXJ5X3RpbWUsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiZXhwaXJlc19hdCIpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgdGltZXIncyBleHBpcnkgdGltZSBhcyBhbiBhYnNvbHV0ZSB0aW1lLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBleHBpcnkgdGltZS4gQW55IHBlbmRpbmcgYXN5bmNocm9ub3VzIHdhaXQKLSAgICogb3BlcmF0aW9ucyB3aWxsIGJlIGNhbmNlbGxlZC4gVGhlIGhhbmRsZXIgZm9yIGVhY2ggY2FuY2VsbGVkIG9wZXJhdGlvbiB3aWxsCi0gICAqIGJlIGludm9rZWQgd2l0aCB0aGUgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yIGNvZGUuCi0gICAqCi0gICAqIEBwYXJhbSBleHBpcnlfdGltZSBUaGUgZXhwaXJ5IHRpbWUgdG8gYmUgdXNlZCBmb3IgdGhlIHRpbWVyLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgd2VyZSBjYW5jZWxsZWQuCi0gICAqCi0gICAqIEBub3RlIElmIHRoZSB0aW1lciBoYXMgYWxyZWFkeSBleHBpcmVkIHdoZW4gZXhwaXJlc19hdCgpIGlzIGNhbGxlZCwgdGhlbgotICAgKiB0aGUgaGFuZGxlcnMgZm9yIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbnMgd2lsbDoKLSAgICoKLSAgICogQGxpIGhhdmUgYWxyZWFkeSBiZWVuIGludm9rZWQ7IG9yCi0gICAqCi0gICAqIEBsaSBoYXZlIGJlZW4gcXVldWVkIGZvciBpbnZvY2F0aW9uIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICoKLSAgICogVGhlc2UgaGFuZGxlcnMgY2FuIG5vIGxvbmdlciBiZSBjYW5jZWxsZWQsIGFuZCB0aGVyZWZvcmUgYXJlIHBhc3NlZCBhbgotICAgKiBlcnJvciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHdhaXQgb3BlcmF0aW9uLgotICAgKi8KLSAgc3RkOjpzaXplX3QgZXhwaXJlc19hdChjb25zdCB0aW1lX3R5cGUmIGV4cGlyeV90aW1lLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+c2VydmljZS5leHBpcmVzX2F0KHRoaXMtPmltcGxlbWVudGF0aW9uLCBleHBpcnlfdGltZSwgZWMpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgdGltZXIncyBleHBpcnkgdGltZSByZWxhdGl2ZSB0byBub3cuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIG9idGFpbiB0aGUgdGltZXIncyBjdXJyZW50IGV4cGlyeSB0aW1lLgotICAgKiBXaGV0aGVyIHRoZSB0aW1lciBoYXMgZXhwaXJlZCBvciBub3QgZG9lcyBub3QgYWZmZWN0IHRoaXMgdmFsdWUuCi0gICAqLwotICBkdXJhdGlvbl90eXBlIGV4cGlyZXNfZnJvbV9ub3coKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRoaXMtPnNlcnZpY2UuZXhwaXJlc19mcm9tX25vdyh0aGlzLT5pbXBsZW1lbnRhdGlvbik7Ci0gIH0KLQotICAvLy8gU2V0IHRoZSB0aW1lcidzIGV4cGlyeSB0aW1lIHJlbGF0aXZlIHRvIG5vdy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZXhwaXJ5IHRpbWUuIEFueSBwZW5kaW5nIGFzeW5jaHJvbm91cyB3YWl0Ci0gICAqIG9wZXJhdGlvbnMgd2lsbCBiZSBjYW5jZWxsZWQuIFRoZSBoYW5kbGVyIGZvciBlYWNoIGNhbmNlbGxlZCBvcGVyYXRpb24gd2lsbAotICAgKiBiZSBpbnZva2VkIHdpdGggdGhlIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvciBjb2RlLgotICAgKgotICAgKiBAcGFyYW0gZXhwaXJ5X3RpbWUgVGhlIGV4cGlyeSB0aW1lIHRvIGJlIHVzZWQgZm9yIHRoZSB0aW1lci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgd2VyZSBjYW5jZWxsZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBJZiB0aGUgdGltZXIgaGFzIGFscmVhZHkgZXhwaXJlZCB3aGVuIGV4cGlyZXNfZnJvbV9ub3coKSBpcyBjYWxsZWQsCi0gICAqIHRoZW4gdGhlIGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgd2FpdCBvcGVyYXRpb25zIHdpbGw6Ci0gICAqCi0gICAqIEBsaSBoYXZlIGFscmVhZHkgYmVlbiBpbnZva2VkOyBvcgotICAgKgotICAgKiBAbGkgaGF2ZSBiZWVuIHF1ZXVlZCBmb3IgaW52b2NhdGlvbiBpbiB0aGUgbmVhciBmdXR1cmUuCi0gICAqCi0gICAqIFRoZXNlIGhhbmRsZXJzIGNhbiBubyBsb25nZXIgYmUgY2FuY2VsbGVkLCBhbmQgdGhlcmVmb3JlIGFyZSBwYXNzZWQgYW4KLSAgICogZXJyb3IgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSB3YWl0IG9wZXJhdGlvbi4KLSAgICovCi0gIHN0ZDo6c2l6ZV90IGV4cGlyZXNfZnJvbV9ub3coY29uc3QgZHVyYXRpb25fdHlwZSYgZXhwaXJ5X3RpbWUpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5zZXJ2aWNlLmV4cGlyZXNfZnJvbV9ub3coCi0gICAgICAgIHRoaXMtPmltcGxlbWVudGF0aW9uLCBleHBpcnlfdGltZSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJleHBpcmVzX2Zyb21fbm93Iik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gU2V0IHRoZSB0aW1lcidzIGV4cGlyeSB0aW1lIHJlbGF0aXZlIHRvIG5vdy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZXhwaXJ5IHRpbWUuIEFueSBwZW5kaW5nIGFzeW5jaHJvbm91cyB3YWl0Ci0gICAqIG9wZXJhdGlvbnMgd2lsbCBiZSBjYW5jZWxsZWQuIFRoZSBoYW5kbGVyIGZvciBlYWNoIGNhbmNlbGxlZCBvcGVyYXRpb24gd2lsbAotICAgKiBiZSBpbnZva2VkIHdpdGggdGhlIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvciBjb2RlLgotICAgKgotICAgKiBAcGFyYW0gZXhwaXJ5X3RpbWUgVGhlIGV4cGlyeSB0aW1lIHRvIGJlIHVzZWQgZm9yIHRoZSB0aW1lci4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB0aGF0IHdlcmUgY2FuY2VsbGVkLgotICAgKgotICAgKiBAbm90ZSBJZiB0aGUgdGltZXIgaGFzIGFscmVhZHkgZXhwaXJlZCB3aGVuIGV4cGlyZXNfZnJvbV9ub3coKSBpcyBjYWxsZWQsCi0gICAqIHRoZW4gdGhlIGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgd2FpdCBvcGVyYXRpb25zIHdpbGw6Ci0gICAqCi0gICAqIEBsaSBoYXZlIGFscmVhZHkgYmVlbiBpbnZva2VkOyBvcgotICAgKgotICAgKiBAbGkgaGF2ZSBiZWVuIHF1ZXVlZCBmb3IgaW52b2NhdGlvbiBpbiB0aGUgbmVhciBmdXR1cmUuCi0gICAqCi0gICAqIFRoZXNlIGhhbmRsZXJzIGNhbiBubyBsb25nZXIgYmUgY2FuY2VsbGVkLCBhbmQgdGhlcmVmb3JlIGFyZSBwYXNzZWQgYW4KLSAgICogZXJyb3IgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSB3YWl0IG9wZXJhdGlvbi4KLSAgICovCi0gIHN0ZDo6c2l6ZV90IGV4cGlyZXNfZnJvbV9ub3coY29uc3QgZHVyYXRpb25fdHlwZSYgZXhwaXJ5X3RpbWUsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLmV4cGlyZXNfZnJvbV9ub3coCi0gICAgICAgIHRoaXMtPmltcGxlbWVudGF0aW9uLCBleHBpcnlfdGltZSwgZWMpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gYSBibG9ja2luZyB3YWl0IG9uIHRoZSB0aW1lci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3YWl0IGZvciB0aGUgdGltZXIgdG8gZXhwaXJlLiBUaGlzIGZ1bmN0aW9uCi0gICAqIGJsb2NrcyBhbmQgZG9lcyBub3QgcmV0dXJuIHVudGlsIHRoZSB0aW1lciBoYXMgZXhwaXJlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICB2b2lkIHdhaXQoKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5zZXJ2aWNlLndhaXQodGhpcy0+aW1wbGVtZW50YXRpb24sIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAid2FpdCIpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gYSBibG9ja2luZyB3YWl0IG9uIHRoZSB0aW1lci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3YWl0IGZvciB0aGUgdGltZXIgdG8gZXhwaXJlLiBUaGlzIGZ1bmN0aW9uCi0gICAqIGJsb2NrcyBhbmQgZG9lcyBub3QgcmV0dXJuIHVudGlsIHRoZSB0aW1lciBoYXMgZXhwaXJlZC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICB2b2lkIHdhaXQoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICB0aGlzLT5zZXJ2aWNlLndhaXQodGhpcy0+aW1wbGVtZW50YXRpb24sIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd2FpdCBvbiB0aGUgdGltZXIuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIGluaXRpYXRlIGFuIGFzeW5jaHJvbm91cyB3YWl0IGFnYWluc3QgdGhlCi0gICAqIHRpbWVyLiBJdCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogRm9yIGVhY2ggY2FsbCB0byBhc3luY193YWl0KCksIHRoZSBzdXBwbGllZCBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGV4YWN0bHkKLSAgICogb25jZS4gVGhlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2hlbjoKLSAgICoKLSAgICogQGxpIFRoZSB0aW1lciBoYXMgZXhwaXJlZC4KLSAgICoKLSAgICogQGxpIFRoZSB0aW1lciB3YXMgY2FuY2VsbGVkLCBpbiB3aGljaCBjYXNlIHRoZSBoYW5kbGVyIGlzIHBhc3NlZCB0aGUgZXJyb3IKLSAgICogY29kZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lciBleHBpcmVzLiBDb3BpZXMKLSAgICogd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZQotICAgKiBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiApOyBAZW5kY29kZQotICAgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gICAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gICAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFdhaXRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXYWl0SGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUpKQotICBhc3luY193YWl0KEFTSU9fTU9WRV9BUkcoV2FpdEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV2FpdEhhbmRsZXIuCi0gICAgQVNJT19XQUlUX0hBTkRMRVJfQ0hFQ0soV2FpdEhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+c2VydmljZS5hc3luY193YWl0KHRoaXMtPmltcGxlbWVudGF0aW9uLAotICAgICAgICBBU0lPX01PVkVfQ0FTVChXYWl0SGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkKLSAgICAgICAvLyB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2VuZGlmIC8vIEFTSU9fQkFTSUNfREVBRExJTkVfVElNRVJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfaW9fb2JqZWN0LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19pb19vYmplY3QuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTEzY2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19pb19vYmplY3QuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8vCi0vLyBiYXNpY19pb19vYmplY3QuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fQkFTSUNfSU9fT0JKRUNUX0hQUAotI2RlZmluZSBBU0lPX0JBU0lDX0lPX09CSkVDVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotbmFtZXNwYWNlIGRldGFpbAotewotICAvLyBUeXBlIHRyYWl0IHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzZXJ2aWNlIHN1cHBvcnRzIG1vdmUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJb09iamVjdFNlcnZpY2U+Ci0gIGNsYXNzIHNlcnZpY2VfaGFzX21vdmUKLSAgewotICBwcml2YXRlOgotICAgIHR5cGVkZWYgSW9PYmplY3RTZXJ2aWNlIHNlcnZpY2VfdHlwZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIHNlcnZpY2VfdHlwZTo6aW1wbGVtZW50YXRpb25fdHlwZSBpbXBsZW1lbnRhdGlvbl90eXBlOwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci0gICAgc3RhdGljIGF1dG8gZXZhbChUKiB0LCBVKiB1KSAtPiBkZWNsdHlwZSh0LT5tb3ZlX2NvbnN0cnVjdCgqdSwgKnUpLCBjaGFyKCkpOwotICAgIHN0YXRpYyBjaGFyICgmZXZhbCguLi4pKVsyXTsKLQotICBwdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQotICAgICAgc2l6ZW9mKHNlcnZpY2VfaGFzX21vdmU6OmV2YWwoCi0gICAgICAgIHN0YXRpY19jYXN0PHNlcnZpY2VfdHlwZSo+KDApLAotICAgICAgICBzdGF0aWNfY2FzdDxpbXBsZW1lbnRhdGlvbl90eXBlKj4oMCkpKSA9PSAxOwotICB9OwotfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotLy8vIEJhc2UgY2xhc3MgZm9yIGFsbCBJL08gb2JqZWN0cy4KLS8qKgotICogQG5vdGUgQWxsIEkvTyBvYmplY3RzIGFyZSBub24tY29weWFibGUuIEhvd2V2ZXIsIHdoZW4gdXNpbmcgQysrMHgsIGNlcnRhaW4KLSAqIEkvTyBvYmplY3RzIGRvIHN1cHBvcnQgbW92ZSBjb25zdHJ1Y3Rpb24gYW5kIG1vdmUgYXNzaWdubWVudC4KLSAqLwotI2lmICFkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotdGVtcGxhdGUgPHR5cGVuYW1lIElvT2JqZWN0U2VydmljZT4KLSNlbHNlCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW9PYmplY3RTZXJ2aWNlLAotICAgIGJvb2wgTW92YWJsZSA9IGRldGFpbDo6c2VydmljZV9oYXNfbW92ZTxJb09iamVjdFNlcnZpY2U+Ojp2YWx1ZT4KLSNlbmRpZgotY2xhc3MgYmFzaWNfaW9fb2JqZWN0Ci17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgdHlwZSBvZiB0aGUgc2VydmljZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBwcm92aWRlIEkvTyBvcGVyYXRpb25zLgotICB0eXBlZGVmIElvT2JqZWN0U2VydmljZSBzZXJ2aWNlX3R5cGU7Ci0KLSAgLy8vIFRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgSS9PIG9iamVjdC4KLSAgdHlwZWRlZiB0eXBlbmFtZSBzZXJ2aWNlX3R5cGU6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLQotICAvLy8gR2V0IHRoZSBpb19zZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIEkvTwotICAgKiBvYmplY3QgdXNlcyB0byBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIEkvTyBvYmplY3Qgd2lsbCB1c2UKLSAgICogdG8gZGlzcGF0Y2ggaGFuZGxlcnMuIE93bmVyc2hpcCBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlci4KLSAgICovCi0gIGFzaW86OmlvX3NlcnZpY2UmIGdldF9pb19zZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlLmdldF9pb19zZXJ2aWNlKCk7Ci0gIH0KLQotcHJvdGVjdGVkOgotICAvLy8gQ29uc3RydWN0IGEgYmFzaWNfaW9fb2JqZWN0LgotICAvKioKLSAgICogUGVyZm9ybXM6Ci0gICAqIEBjb2RlIGdldF9zZXJ2aWNlKCkuY29uc3RydWN0KGdldF9pbXBsZW1lbnRhdGlvbigpKTsgQGVuZGNvZGUKLSAgICovCi0gIGV4cGxpY2l0IGJhc2ljX2lvX29iamVjdChhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogc2VydmljZShhc2lvOjp1c2Vfc2VydmljZTxJb09iamVjdFNlcnZpY2U+KGlvX3NlcnZpY2UpKQotICB7Ci0gICAgc2VydmljZS5jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb24pOwotICB9Ci0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIE1vdmUtY29uc3RydWN0IGEgYmFzaWNfaW9fb2JqZWN0LgotICAvKioKLSAgICogUGVyZm9ybXM6Ci0gICAqIEBjb2RlIGdldF9zZXJ2aWNlKCkubW92ZV9jb25zdHJ1Y3QoCi0gICAqICAgICBnZXRfaW1wbGVtZW50YXRpb24oKSwgb3RoZXIuZ2V0X2ltcGxlbWVudGF0aW9uKCkpOyBAZW5kY29kZQotICAgKgotICAgKiBAbm90ZSBBdmFpbGFibGUgb25seSBmb3Igc2VydmljZXMgdGhhdCBzdXBwb3J0IG1vdmFiaWxpdHksCi0gICAqLwotICBiYXNpY19pb19vYmplY3QoYmFzaWNfaW9fb2JqZWN0JiYgb3RoZXIpOwotCi0gIC8vLyBNb3ZlLWFzc2lnbiBhIGJhc2ljX2lvX29iamVjdC4KLSAgLyoqCi0gICAqIFBlcmZvcm1zOgotICAgKiBAY29kZSBnZXRfc2VydmljZSgpLm1vdmVfYXNzaWduKGdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgKiAgICAgb3RoZXIuZ2V0X3NlcnZpY2UoKSwgb3RoZXIuZ2V0X2ltcGxlbWVudGF0aW9uKCkpOyBAZW5kY29kZQotICAgKgotICAgKiBAbm90ZSBBdmFpbGFibGUgb25seSBmb3Igc2VydmljZXMgdGhhdCBzdXBwb3J0IG1vdmFiaWxpdHksCi0gICAqLwotICBiYXNpY19pb19vYmplY3QmIG9wZXJhdG9yPShiYXNpY19pb19vYmplY3QmJiBvdGhlcik7Ci0jZW5kaWYgLy8gZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIFByb3RlY3RlZCBkZXN0cnVjdG9yIHRvIHByZXZlbnQgZGVsZXRpb24gdGhyb3VnaCB0aGlzIHR5cGUuCi0gIC8qKgotICAgKiBQZXJmb3JtczoKLSAgICogQGNvZGUgZ2V0X3NlcnZpY2UoKS5kZXN0cm95KGdldF9pbXBsZW1lbnRhdGlvbigpKTsgQGVuZGNvZGUKLSAgICovCi0gIH5iYXNpY19pb19vYmplY3QoKQotICB7Ci0gICAgc2VydmljZS5kZXN0cm95KGltcGxlbWVudGF0aW9uKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBJL08gb2JqZWN0LgotICBzZXJ2aWNlX3R5cGUmIGdldF9zZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIEkvTyBvYmplY3QuCi0gIGNvbnN0IHNlcnZpY2VfdHlwZSYgZ2V0X3NlcnZpY2UoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLQotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBnZXRfc2VydmljZSgpLikgVGhlIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBJL08KLSAgLy8vIG9iamVjdC4KLSAgLyoqCi0gICAqIEBub3RlIEF2YWlsYWJsZSBvbmx5IGZvciBzZXJ2aWNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IG1vdmFiaWxpdHkuCi0gICAqLwotICBzZXJ2aWNlX3R5cGUmIHNlcnZpY2U7Ci0KLSAgLy8vIEdldCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSS9PIG9iamVjdC4KLSAgaW1wbGVtZW50YXRpb25fdHlwZSYgZ2V0X2ltcGxlbWVudGF0aW9uKCkKLSAgewotICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbjsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIEkvTyBvYmplY3QuCi0gIGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGdldF9pbXBsZW1lbnRhdGlvbigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaW1wbGVtZW50YXRpb247Ci0gIH0KLQotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBnZXRfaW1wbGVtZW50YXRpb24oKS4pIFRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mCi0gIC8vLyB0aGUgSS9PIG9iamVjdC4KLSAgaW1wbGVtZW50YXRpb25fdHlwZSBpbXBsZW1lbnRhdGlvbjsKLQotcHJpdmF0ZToKLSAgYmFzaWNfaW9fb2JqZWN0KGNvbnN0IGJhc2ljX2lvX29iamVjdCYpOwotICBiYXNpY19pb19vYmplY3QmIG9wZXJhdG9yPShjb25zdCBiYXNpY19pb19vYmplY3QmKTsKLX07Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0vLyBTcGVjaWFsaXNhdGlvbiBmb3IgbW92YWJsZSBvYmplY3RzLgotdGVtcGxhdGUgPHR5cGVuYW1lIElvT2JqZWN0U2VydmljZT4KLWNsYXNzIGJhc2ljX2lvX29iamVjdDxJb09iamVjdFNlcnZpY2UsIHRydWU+Ci17Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgSW9PYmplY3RTZXJ2aWNlIHNlcnZpY2VfdHlwZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBzZXJ2aWNlX3R5cGU6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLQotICBhc2lvOjppb19zZXJ2aWNlJiBnZXRfaW9fc2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV8tPmdldF9pb19zZXJ2aWNlKCk7Ci0gIH0KLQotcHJvdGVjdGVkOgotICBleHBsaWNpdCBiYXNpY19pb19vYmplY3QoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IHNlcnZpY2VfKCZhc2lvOjp1c2Vfc2VydmljZTxJb09iamVjdFNlcnZpY2U+KGlvX3NlcnZpY2UpKQotICB7Ci0gICAgc2VydmljZV8tPmNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbik7Ci0gIH0KLQotICBiYXNpY19pb19vYmplY3QoYmFzaWNfaW9fb2JqZWN0JiYgb3RoZXIpCi0gICAgOiBzZXJ2aWNlXygmb3RoZXIuZ2V0X3NlcnZpY2UoKSkKLSAgewotICAgIHNlcnZpY2VfLT5tb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbiwgb3RoZXIuaW1wbGVtZW50YXRpb24pOwotICB9Ci0KLSAgfmJhc2ljX2lvX29iamVjdCgpCi0gIHsKLSAgICBzZXJ2aWNlXy0+ZGVzdHJveShpbXBsZW1lbnRhdGlvbik7Ci0gIH0KLQotICBiYXNpY19pb19vYmplY3QmIG9wZXJhdG9yPShiYXNpY19pb19vYmplY3QmJiBvdGhlcikKLSAgewotICAgIHNlcnZpY2VfLT5tb3ZlX2Fzc2lnbihpbXBsZW1lbnRhdGlvbiwKLSAgICAgICAgKm90aGVyLnNlcnZpY2VfLCBvdGhlci5pbXBsZW1lbnRhdGlvbik7Ci0gICAgc2VydmljZV8gPSBvdGhlci5zZXJ2aWNlXzsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBzZXJ2aWNlX3R5cGUmIGdldF9zZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiAqc2VydmljZV87Ci0gIH0KLQotICBjb25zdCBzZXJ2aWNlX3R5cGUmIGdldF9zZXJ2aWNlKCkgY29uc3QKLSAgewotICAgIHJldHVybiAqc2VydmljZV87Ci0gIH0KLQotICBpbXBsZW1lbnRhdGlvbl90eXBlJiBnZXRfaW1wbGVtZW50YXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGltcGxlbWVudGF0aW9uOwotICB9Ci0KLSAgY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgZ2V0X2ltcGxlbWVudGF0aW9uKCkgY29uc3QKLSAgewotICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbjsKLSAgfQotCi0gIGltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb247Ci0KLXByaXZhdGU6Ci0gIGJhc2ljX2lvX29iamVjdChjb25zdCBiYXNpY19pb19vYmplY3QmKTsKLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgYmFzaWNfaW9fb2JqZWN0Jik7Ci0KLSAgSW9PYmplY3RTZXJ2aWNlKiBzZXJ2aWNlXzsKLX07Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0JBU0lDX0lPX09CSkVDVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19yYXdfc29ja2V0LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19yYXdfc29ja2V0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxOWI1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfcmF3X3NvY2tldC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NDAgKzAsMCBAQAotLy8KLS8vIGJhc2ljX3Jhd19zb2NrZXQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0JBU0lDX1JBV19TT0NLRVRfSFBQCi0jZGVmaW5lIEFTSU9fQkFTSUNfUkFXX1NPQ0tFVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc29ja2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdHlwZV90cmFpdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vcmF3X3NvY2tldF9zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIFByb3ZpZGVzIHJhdy1vcmllbnRlZCBzb2NrZXQgZnVuY3Rpb25hbGl0eS4KLS8qKgotICogVGhlIGJhc2ljX3Jhd19zb2NrZXQgY2xhc3MgdGVtcGxhdGUgcHJvdmlkZXMgYXN5bmNocm9ub3VzIGFuZCBibG9ja2luZwotICogcmF3LW9yaWVudGVkIHNvY2tldCBmdW5jdGlvbmFsaXR5LgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLAotICAgIHR5cGVuYW1lIFJhd1NvY2tldFNlcnZpY2UgPSByYXdfc29ja2V0X3NlcnZpY2U8UHJvdG9jb2w+ID4KLWNsYXNzIGJhc2ljX3Jhd19zb2NrZXQKLSAgOiBwdWJsaWMgYmFzaWNfc29ja2V0PFByb3RvY29sLCBSYXdTb2NrZXRTZXJ2aWNlPgotewotcHVibGljOgotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlX3R5cGUuKSBUaGUgbmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mIGEKLSAgLy8vIHNvY2tldC4KLSAgdHlwZWRlZiB0eXBlbmFtZSBSYXdTb2NrZXRTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX3R5cGU7Ci0KLSAgLy8vIFRoZSBuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgYSBzb2NrZXQuCi0gIHR5cGVkZWYgdHlwZW5hbWUgUmF3U29ja2V0U2VydmljZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICAvLy8gVGhlIHByb3RvY29sIHR5cGUuCi0gIHR5cGVkZWYgUHJvdG9jb2wgcHJvdG9jb2xfdHlwZTsKLQotICAvLy8gVGhlIGVuZHBvaW50IHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX3Jhd19zb2NrZXQgd2l0aG91dCBvcGVuaW5nIGl0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgcmF3IHNvY2tldCB3aXRob3V0IG9wZW5pbmcgaXQuIFRoZSBvcGVuKCkKLSAgICogZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRhdGEgY2FuIGJlIHNlbnQgb3IgcmVjZWl2ZWQgb24gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHJhdyBzb2NrZXQgd2lsbCB1c2UKLSAgICogdG8gZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlCi0gICAqIHNvY2tldC4KLSAgICovCi0gIGV4cGxpY2l0IGJhc2ljX3Jhd19zb2NrZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgUmF3U29ja2V0U2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbmQgb3BlbiBhIGJhc2ljX3Jhd19zb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW5kIG9wZW5zIGEgcmF3IHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHJhdyBzb2NrZXQgd2lsbCB1c2UKLSAgICogdG8gZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlCi0gICAqIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHByb3RvY29sIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHByb3RvY29sIHBhcmFtZXRlcnMgdG8gYmUgdXNlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICBiYXNpY19yYXdfc29ja2V0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCkKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgUmF3U29ja2V0U2VydmljZT4oaW9fc2VydmljZSwgcHJvdG9jb2wpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19yYXdfc29ja2V0LCBvcGVuaW5nIGl0IGFuZCBiaW5kaW5nIGl0IHRvIHRoZSBnaXZlbgotICAvLy8gbG9jYWwgZW5kcG9pbnQuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSByYXcgc29ja2V0IGFuZCBhdXRvbWF0aWNhbGx5IG9wZW5zIGl0IGJvdW5kCi0gICAqIHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgb24gdGhlIGxvY2FsIG1hY2hpbmUuIFRoZSBwcm90b2NvbCB1c2VkIGlzIHRoZQotICAgKiBwcm90b2NvbCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGVuZHBvaW50LgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgcmF3IHNvY2tldCB3aWxsIHVzZQotICAgKiB0byBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUKLSAgICogc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gZW5kcG9pbnQgQW4gZW5kcG9pbnQgb24gdGhlIGxvY2FsIG1hY2hpbmUgdG8gd2hpY2ggdGhlIHJhdwotICAgKiBzb2NrZXQgd2lsbCBiZSBib3VuZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICBiYXNpY19yYXdfc29ja2V0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCkKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgUmF3U29ja2V0U2VydmljZT4oaW9fc2VydmljZSwgZW5kcG9pbnQpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19yYXdfc29ja2V0IG9uIGFuIGV4aXN0aW5nIG5hdGl2ZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSByYXcgc29ja2V0IG9iamVjdCB0byBob2xkIGFuIGV4aXN0aW5nCi0gICAqIG5hdGl2ZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSByYXcgc29ja2V0IHdpbGwgdXNlCi0gICAqIHRvIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZQotICAgKiBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBwcm90b2NvbCBBbiBvYmplY3Qgc3BlY2lmeWluZyBwcm90b2NvbCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBuYXRpdmVfc29ja2V0IFRoZSBuZXcgdW5kZXJseWluZyBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgYmFzaWNfcmF3X3NvY2tldChhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX3NvY2tldCkKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgUmF3U29ja2V0U2VydmljZT4oCi0gICAgICAgIGlvX3NlcnZpY2UsIHByb3RvY29sLCBuYXRpdmVfc29ja2V0KQotICB7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIGJhc2ljX3Jhd19zb2NrZXQgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhIHJhdyBzb2NrZXQgZnJvbSBvbmUgb2JqZWN0IHRvIGFub3RoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgYmFzaWNfcmF3X3NvY2tldCBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZQotICAgKiB3aWxsIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfcmF3X3NvY2tldChpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICBiYXNpY19yYXdfc29ja2V0KGJhc2ljX3Jhd19zb2NrZXQmJiBvdGhlcikKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgUmF3U29ja2V0U2VydmljZT4oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX3Jhd19zb2NrZXQpKG90aGVyKSkKLSAgewotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGEgYmFzaWNfcmF3X3NvY2tldCBmcm9tIGFub3RoZXIuCi0gIC8qKgotICAgKiBUaGlzIGFzc2lnbm1lbnQgb3BlcmF0b3IgbW92ZXMgYSByYXcgc29ja2V0IGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3Jhd19zb2NrZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUKLSAgICogd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3Jhd19zb2NrZXQoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgYmFzaWNfcmF3X3NvY2tldCYgb3BlcmF0b3I9KGJhc2ljX3Jhd19zb2NrZXQmJiBvdGhlcikKLSAgewotICAgIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgUmF3U29ja2V0U2VydmljZT46Om9wZXJhdG9yPSgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoYmFzaWNfcmF3X3NvY2tldCkob3RoZXIpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBiYXNpY19yYXdfc29ja2V0IGZyb20gYSBzb2NrZXQgb2YgYW5vdGhlciBwcm90b2NvbCB0eXBlLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhIHJhdyBzb2NrZXQgZnJvbSBvbmUgb2JqZWN0IHRvIGFub3RoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgYmFzaWNfcmF3X3NvY2tldCBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZSB3aWxsCi0gICAqIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfcmF3X3NvY2tldChpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxLCB0eXBlbmFtZSBSYXdTb2NrZXRTZXJ2aWNlMT4KLSAgYmFzaWNfcmF3X3NvY2tldChiYXNpY19yYXdfc29ja2V0PFByb3RvY29sMSwgUmF3U29ja2V0U2VydmljZTE+JiYgb3RoZXIsCi0gICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8UHJvdG9jb2wxLCBQcm90b2NvbD46OnZhbHVlPjo6dHlwZSogPSAwKQotICAgIDogYmFzaWNfc29ja2V0PFByb3RvY29sLCBSYXdTb2NrZXRTZXJ2aWNlPigKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QyKGJhc2ljX3Jhd19zb2NrZXQ8Ci0gICAgICAgICAgUHJvdG9jb2wxLCBSYXdTb2NrZXRTZXJ2aWNlMT4pKG90aGVyKSkKLSAgewotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGEgYmFzaWNfcmF3X3NvY2tldCBmcm9tIGEgc29ja2V0IG9mIGFub3RoZXIgcHJvdG9jb2wgdHlwZS4KLSAgLyoqCi0gICAqIFRoaXMgYXNzaWdubWVudCBvcGVyYXRvciBtb3ZlcyBhIHJhdyBzb2NrZXQgZnJvbSBvbmUgb2JqZWN0IHRvIGFub3RoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgYmFzaWNfcmF3X3NvY2tldCBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZQotICAgKiB3aWxsIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfcmF3X3NvY2tldChpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxLCB0eXBlbmFtZSBSYXdTb2NrZXRTZXJ2aWNlMT4KLSAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPFByb3RvY29sMSwgUHJvdG9jb2w+Ojp2YWx1ZSwKLSAgICAgIGJhc2ljX3Jhd19zb2NrZXQ+Ojp0eXBlJiBvcGVyYXRvcj0oCi0gICAgICAgIGJhc2ljX3Jhd19zb2NrZXQ8UHJvdG9jb2wxLCBSYXdTb2NrZXRTZXJ2aWNlMT4mJiBvdGhlcikKLSAgewotICAgIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgUmF3U29ja2V0U2VydmljZT46Om9wZXJhdG9yPSgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QyKGJhc2ljX3Jhd19zb2NrZXQ8Ci0gICAgICAgICAgUHJvdG9jb2wxLCBSYXdTb2NrZXRTZXJ2aWNlMT4pKG90aGVyKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKSB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotICAvLy8gU2VuZCBzb21lIGRhdGEgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgZGF0YSBvbiB0aGUgcmF3IHNvY2tldC4gVGhlIGZ1bmN0aW9uIGNhbGwKLSAgICogd2lsbCBibG9jayB1bnRpbCB0aGUgZGF0YSBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvcmUgbW9yZSBkYXRhIGJ1ZmZlcnMgdG8gYmUgc2VudCBvbiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBUaGUgc2VuZCBvcGVyYXRpb24gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgY29ubmVjdGVkIHNvY2tldC4gVXNlCi0gICAqIHRoZSBzZW5kX3RvIGZ1bmN0aW9uIHRvIHNlbmQgZGF0YSBvbiBhbiB1bmNvbm5lY3RlZCByYXcgc29ja2V0LgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gc2VuZCBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gICAqIEBjb2RlIHNvY2tldC5zZW5kKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSk7IEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gc2VuZGluZyBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBzZW5kKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnNlbmQoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCAwLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNlbmQiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBTZW5kIHNvbWUgZGF0YSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBkYXRhIG9uIHRoZSByYXcgc29ja2V0LiBUaGUgZnVuY3Rpb24gY2FsbAotICAgKiB3aWxsIGJsb2NrIHVudGlsIHRoZSBkYXRhIGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5IG9yIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yZSBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgc2VuZCBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIFRoZSBzZW5kIG9wZXJhdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBjb25uZWN0ZWQgc29ja2V0LiBVc2UKLSAgICogdGhlIHNlbmRfdG8gZnVuY3Rpb24gdG8gc2VuZCBkYXRhIG9uIGFuIHVuY29ubmVjdGVkIHJhdyBzb2NrZXQuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgc2VuZChjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnNlbmQoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBmbGFncywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzZW5kIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gU2VuZCBzb21lIGRhdGEgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgZGF0YSBvbiB0aGUgcmF3IHNvY2tldC4gVGhlIGZ1bmN0aW9uIGNhbGwKLSAgICogd2lsbCBibG9jayB1bnRpbCB0aGUgZGF0YSBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgc2VuZCBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQuCi0gICAqCi0gICAqIEBub3RlIFRoZSBzZW5kIG9wZXJhdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBjb25uZWN0ZWQgc29ja2V0LiBVc2UKLSAgICogdGhlIHNlbmRfdG8gZnVuY3Rpb24gdG8gc2VuZCBkYXRhIG9uIGFuIHVuY29ubmVjdGVkIHJhdyBzb2NrZXQuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgc2VuZChjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuc2VuZCgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGZsYWdzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgZGF0YSBvbiB0aGUgcmF3IHNvY2tldC4gVGhlIGZ1bmN0aW9uIGNhbGwKLSAgICogd2lsbCBibG9jayB1bnRpbCB0aGUgZGF0YSBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IG9uIHRoZSBzb2NrZXQuIEFsdGhvdWdoCi0gICAqIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZSB1bmRlcmx5aW5nCi0gICAqIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCB0aGV5Ci0gICAqIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzZW5kIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YKLSAgICogdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICoKLSAgICogQG5vdGUgVGhlIGFzeW5jX3NlbmQgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIGNvbm5lY3RlZCBzb2NrZXQuCi0gICAqIFVzZSB0aGUgYXN5bmNfc2VuZF90byBmdW5jdGlvbiB0byBzZW5kIGRhdGEgb24gYW4gdW5jb25uZWN0ZWQgcmF3Ci0gICAqIHNvY2tldC4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHNlbmQgYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBzb2NrZXQuYXN5bmNfc2VuZChhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIGhhbmRsZXIpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHNlbmRpbmcgbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3NlbmQoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFdyaXRlSGFuZGxlci4KLSAgICBBU0lPX1dSSVRFX0hBTkRMRVJfQ0hFQ0soV3JpdGVIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfc2VuZCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgYnVmZmVycywgMCwgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgZGF0YSBvbiB0aGUgcmF3IHNvY2tldC4gVGhlIGZ1bmN0aW9uIGNhbGwKLSAgICogd2lsbCBibG9jayB1bnRpbCB0aGUgZGF0YSBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IG9uIHRoZSBzb2NrZXQuIEFsdGhvdWdoCi0gICAqIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZSB1bmRlcmx5aW5nCi0gICAqIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCB0aGV5Ci0gICAqIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgc2VuZCBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzZW5kIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YKLSAgICogdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICoKLSAgICogQG5vdGUgVGhlIGFzeW5jX3NlbmQgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIGNvbm5lY3RlZCBzb2NrZXQuCi0gICAqIFVzZSB0aGUgYXN5bmNfc2VuZF90byBmdW5jdGlvbiB0byBzZW5kIGRhdGEgb24gYW4gdW5jb25uZWN0ZWQgcmF3Ci0gICAqIHNvY2tldC4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfc2VuZChjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBXcml0ZUhhbmRsZXIuCi0gICAgQVNJT19XUklURV9IQU5ETEVSX0NIRUNLKFdyaXRlSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3NlbmQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIGJ1ZmZlcnMsIGZsYWdzLCBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBTZW5kIHJhdyBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCByYXcgZGF0YSB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBlbmRwb2ludC4KLSAgICogVGhlIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgZGF0YSBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSBvcgotICAgKiBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IHRvIHRoZSByZW1vdGUgZW5kcG9pbnQuCi0gICAqCi0gICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBUaGUgcmVtb3RlIGVuZHBvaW50IHRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgc2VudC4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBzZW50LgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHNlbmQgYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dWRwOjplbmRwb2ludCBkZXN0aW5hdGlvbigKLSAgICogICAgIGFzaW86OmlwOjphZGRyZXNzOjpmcm9tX3N0cmluZygiMS4yLjMuNCIpLCAxMjM0NSk7Ci0gICAqIHNvY2tldC5zZW5kX3RvKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgZGVzdGluYXRpb24pOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHNlbmRpbmcgbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgc2VuZF90byhjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgZGVzdGluYXRpb24pCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnNlbmRfdG8oCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBkZXN0aW5hdGlvbiwgMCwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzZW5kX3RvIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gU2VuZCByYXcgZGF0YSB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgcmF3IGRhdGEgdG8gdGhlIHNwZWNpZmllZCByZW1vdGUgZW5kcG9pbnQuCi0gICAqIFRoZSBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgdGhlIGRhdGEgaGFzIGJlZW4gc2VudCBzdWNjZXNzZnVsbHkgb3IKLSAgICogYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBkYXRhIGJ1ZmZlcnMgdG8gYmUgc2VudCB0byB0aGUgcmVtb3RlIGVuZHBvaW50LgotICAgKgotICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIHJlbW90ZSBlbmRwb2ludCB0byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHNlbnQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgc2VuZCBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgc2VuZF90byhjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgZGVzdGluYXRpb24sIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS5zZW5kX3RvKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgZGVzdGluYXRpb24sIGZsYWdzLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNlbmRfdG8iKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBTZW5kIHJhdyBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCByYXcgZGF0YSB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBlbmRwb2ludC4KLSAgICogVGhlIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgZGF0YSBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSBvcgotICAgKiBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IHRvIHRoZSByZW1vdGUgZW5kcG9pbnQuCi0gICAqCi0gICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBUaGUgcmVtb3RlIGVuZHBvaW50IHRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgc2VudC4KLSAgICoKLSAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHNwZWNpZnlpbmcgaG93IHRoZSBzZW5kIGNhbGwgaXMgdG8gYmUgbWFkZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBzZW5kX3RvKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBkZXN0aW5hdGlvbiwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLnNlbmRfdG8odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIGJ1ZmZlcnMsIGRlc3RpbmF0aW9uLCBmbGFncywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBzZW5kLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHNlbmQgcmF3IGRhdGEgdG8gdGhlIHNwZWNpZmllZAotICAgKiByZW1vdGUgZW5kcG9pbnQuIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBkYXRhIGJ1ZmZlcnMgdG8gYmUgc2VudCB0byB0aGUgcmVtb3RlIGVuZHBvaW50LgotICAgKiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUKLSAgICogdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gICAqIHRoYXQgdGhleSByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIHJlbW90ZSBlbmRwb2ludCB0byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHNlbnQuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGVuZHBvaW50IGFzIHJlcXVpcmVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc2VuZCBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mCi0gICAqIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHNlbnQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyBzZW5kIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnVkcDo6ZW5kcG9pbnQgZGVzdGluYXRpb24oCi0gICAqICAgICBhc2lvOjppcDo6YWRkcmVzczo6ZnJvbV9zdHJpbmcoIjEuMi4zLjQiKSwgMTIzNDUpOwotICAgKiBzb2NrZXQuYXN5bmNfc2VuZF90bygKLSAgICogICAgIGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgZGVzdGluYXRpb24sIGhhbmRsZXIpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHNlbmRpbmcgbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3NlbmRfdG8oY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIGRlc3RpbmF0aW9uLAotICAgICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV3JpdGVIYW5kbGVyLgotICAgIEFTSU9fV1JJVEVfSEFORExFUl9DSEVDSyhXcml0ZUhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19zZW5kX3RvKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICBidWZmZXJzLCBkZXN0aW5hdGlvbiwgMCwgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgc2VuZCByYXcgZGF0YSB0byB0aGUgc3BlY2lmaWVkCi0gICAqIHJlbW90ZSBlbmRwb2ludC4gVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IHRvIHRoZSByZW1vdGUgZW5kcG9pbnQuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgc2VuZCBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBUaGUgcmVtb3RlIGVuZHBvaW50IHRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgc2VudC4KLSAgICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgZW5kcG9pbnQgYXMgcmVxdWlyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzZW5kIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YKLSAgICogdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfc2VuZF90byhjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgZGVzdGluYXRpb24sIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV3JpdGVIYW5kbGVyLgotICAgIEFTSU9fV1JJVEVfSEFORExFUl9DSEVDSyhXcml0ZUhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19zZW5kX3RvKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgZGVzdGluYXRpb24sIGZsYWdzLAotICAgICAgICBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBSZWNlaXZlIHNvbWUgZGF0YSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSBkYXRhIG9uIHRoZSByYXcgc29ja2V0LiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5IG9yIGFuIGVycm9yCi0gICAqIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVjZWl2ZSBvcGVyYXRpb24gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgY29ubmVjdGVkIHNvY2tldC4gVXNlCi0gICAqIHRoZSByZWNlaXZlX2Zyb20gZnVuY3Rpb24gdG8gcmVjZWl2ZSBkYXRhIG9uIGFuIHVuY29ubmVjdGVkIHJhdwotICAgKiBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWNlaXZlIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcwotICAgKiBmb2xsb3dzOgotICAgKiBAY29kZSBzb2NrZXQucmVjZWl2ZShhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSkpOyBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlY2VpdmluZyBpbnRvCi0gICAqIG11bHRpcGxlIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVjZWl2ZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnJlY2VpdmUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCAwLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInJlY2VpdmUiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBSZWNlaXZlIHNvbWUgZGF0YSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSBkYXRhIG9uIHRoZSByYXcgc29ja2V0LiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5IG9yIGFuIGVycm9yCi0gICAqIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgcmVjZWl2ZSBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVjZWl2ZSBvcGVyYXRpb24gY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgY29ubmVjdGVkIHNvY2tldC4gVXNlCi0gICAqIHRoZSByZWNlaXZlX2Zyb20gZnVuY3Rpb24gdG8gcmVjZWl2ZSBkYXRhIG9uIGFuIHVuY29ubmVjdGVkIHJhdwotICAgKiBzb2NrZXQuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWNlaXZlKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZWNlaXZlKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgZmxhZ3MsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVjZWl2ZSIpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIFJlY2VpdmUgc29tZSBkYXRhIG9uIGEgY29ubmVjdGVkIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNlaXZlIGRhdGEgb24gdGhlIHJhdyBzb2NrZXQuIFRoZSBmdW5jdGlvbgotICAgKiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBzdWNjZXNzZnVsbHkgb3IgYW4gZXJyb3IKLSAgICogb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICoKLSAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHNwZWNpZnlpbmcgaG93IHRoZSByZWNlaXZlIGNhbGwgaXMgdG8gYmUgbWFkZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZWNlaXZlIG9wZXJhdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBjb25uZWN0ZWQgc29ja2V0LiBVc2UKLSAgICogdGhlIHJlY2VpdmVfZnJvbSBmdW5jdGlvbiB0byByZWNlaXZlIGRhdGEgb24gYW4gdW5jb25uZWN0ZWQgcmF3Ci0gICAqIHNvY2tldC4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlY2VpdmUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkucmVjZWl2ZSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGZsYWdzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlY2VpdmUgZGF0YSBmcm9tIHRoZSByYXcKLSAgICogc29ja2V0LiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWNlaXZlIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBub3RlIFRoZSBhc3luY19yZWNlaXZlIG9wZXJhdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBjb25uZWN0ZWQgc29ja2V0LgotICAgKiBVc2UgdGhlIGFzeW5jX3JlY2VpdmVfZnJvbSBmdW5jdGlvbiB0byByZWNlaXZlIGRhdGEgb24gYW4gdW5jb25uZWN0ZWQKLSAgICogcmF3IHNvY2tldC4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHJlY2VpdmUgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzCi0gICAqIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIHNvY2tldC5hc3luY19yZWNlaXZlKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgaGFuZGxlcik7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gcmVjZWl2aW5nIGludG8KLSAgICogbXVsdGlwbGUgYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlY2VpdmUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBSZWFkSGFuZGxlci4KLSAgICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3JlY2VpdmUodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIGJ1ZmZlcnMsIDAsIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlY2VpdmUgZGF0YSBmcm9tIHRoZSByYXcKLSAgICogc29ja2V0LiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgcmVjZWl2ZSBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWNlaXZlIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBub3RlIFRoZSBhc3luY19yZWNlaXZlIG9wZXJhdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBjb25uZWN0ZWQgc29ja2V0LgotICAgKiBVc2UgdGhlIGFzeW5jX3JlY2VpdmVfZnJvbSBmdW5jdGlvbiB0byByZWNlaXZlIGRhdGEgb24gYW4gdW5jb25uZWN0ZWQKLSAgICogcmF3IHNvY2tldC4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVjZWl2ZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gICAgQVNJT19SRUFEX0hBTkRMRVJfQ0hFQ0soUmVhZEhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19yZWNlaXZlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICBidWZmZXJzLCBmbGFncywgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBSZWNlaXZlIHJhdyBkYXRhIHdpdGggdGhlIGVuZHBvaW50IG9mIHRoZSBzZW5kZXIuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSByYXcgZGF0YS4gVGhlIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jawotICAgKiB1bnRpbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkLgotICAgKgotICAgKiBAcGFyYW0gc2VuZGVyX2VuZHBvaW50IEFuIGVuZHBvaW50IG9iamVjdCB0aGF0IHJlY2VpdmVzIHRoZSBlbmRwb2ludCBvZgotICAgKiB0aGUgcmVtb3RlIHNlbmRlciBvZiB0aGUgZGF0YS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWNlaXZlIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcwotICAgKiBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dWRwOjplbmRwb2ludCBzZW5kZXJfZW5kcG9pbnQ7Ci0gICAqIHNvY2tldC5yZWNlaXZlX2Zyb20oCi0gICAqICAgICBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIHNlbmRlcl9lbmRwb2ludCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gcmVjZWl2aW5nIGludG8KLSAgICogbXVsdGlwbGUgYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWNlaXZlX2Zyb20oY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgZW5kcG9pbnRfdHlwZSYgc2VuZGVyX2VuZHBvaW50KQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZWNlaXZlX2Zyb20oCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBzZW5kZXJfZW5kcG9pbnQsIDAsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVjZWl2ZV9mcm9tIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLSAgCi0gIC8vLyBSZWNlaXZlIHJhdyBkYXRhIHdpdGggdGhlIGVuZHBvaW50IG9mIHRoZSBzZW5kZXIuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSByYXcgZGF0YS4gVGhlIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jawotICAgKiB1bnRpbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkLgotICAgKgotICAgKiBAcGFyYW0gc2VuZGVyX2VuZHBvaW50IEFuIGVuZHBvaW50IG9iamVjdCB0aGF0IHJlY2VpdmVzIHRoZSBlbmRwb2ludCBvZgotICAgKiB0aGUgcmVtb3RlIHNlbmRlciBvZiB0aGUgZGF0YS4KLSAgICoKLSAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHNwZWNpZnlpbmcgaG93IHRoZSByZWNlaXZlIGNhbGwgaXMgdG8gYmUgbWFkZS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWNlaXZlX2Zyb20oY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgZW5kcG9pbnRfdHlwZSYgc2VuZGVyX2VuZHBvaW50LCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPmdldF9zZXJ2aWNlKCkucmVjZWl2ZV9mcm9tKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgc2VuZGVyX2VuZHBvaW50LCBmbGFncywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWNlaXZlX2Zyb20iKTsKLSAgICByZXR1cm4gczsKLSAgfQotICAKLSAgLy8vIFJlY2VpdmUgcmF3IGRhdGEgd2l0aCB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbmRlci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNlaXZlIHJhdyBkYXRhLiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrCi0gICAqIHVudGlsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5IG9yIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBzZW5kZXJfZW5kcG9pbnQgQW4gZW5kcG9pbnQgb2JqZWN0IHRoYXQgcmVjZWl2ZXMgdGhlIGVuZHBvaW50IG9mCi0gICAqIHRoZSByZW1vdGUgc2VuZGVyIG9mIHRoZSBkYXRhLgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmUgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlY2VpdmVfZnJvbShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBlbmRwb2ludF90eXBlJiBzZW5kZXJfZW5kcG9pbnQsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZWNlaXZlX2Zyb20odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIGJ1ZmZlcnMsIHNlbmRlcl9lbmRwb2ludCwgZmxhZ3MsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWNlaXZlIHJhdyBkYXRhLiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBzZW5kZXJfZW5kcG9pbnQgQW4gZW5kcG9pbnQgb2JqZWN0IHRoYXQgcmVjZWl2ZXMgdGhlIGVuZHBvaW50IG9mCi0gICAqIHRoZSByZW1vdGUgc2VuZGVyIG9mIHRoZSBkYXRhLiBPd25lcnNoaXAgb2YgdGhlIHNlbmRlcl9lbmRwb2ludCBvYmplY3QKLSAgICogaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCBpdCBpcyB2YWxpZCB1bnRpbCB0aGUKLSAgICogaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWNlaXZlIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWNlaXZlIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcwotICAgKiBmb2xsb3dzOgotICAgKiBAY29kZSBzb2NrZXQuYXN5bmNfcmVjZWl2ZV9mcm9tKAotICAgKiAgICAgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCAwLCBzZW5kZXJfZW5kcG9pbnQsIGhhbmRsZXIpOyBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlY2VpdmluZyBpbnRvCi0gICAqIG11bHRpcGxlIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19yZWNlaXZlX2Zyb20oY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgZW5kcG9pbnRfdHlwZSYgc2VuZGVyX2VuZHBvaW50LAotICAgICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBSZWFkSGFuZGxlci4KLSAgICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3JlY2VpdmVfZnJvbSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIHNlbmRlcl9lbmRwb2ludCwgMCwKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWNlaXZlIHJhdyBkYXRhLiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBzZW5kZXJfZW5kcG9pbnQgQW4gZW5kcG9pbnQgb2JqZWN0IHRoYXQgcmVjZWl2ZXMgdGhlIGVuZHBvaW50IG9mCi0gICAqIHRoZSByZW1vdGUgc2VuZGVyIG9mIHRoZSBkYXRhLiBPd25lcnNoaXAgb2YgdGhlIHNlbmRlcl9lbmRwb2ludCBvYmplY3QKLSAgICogaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCBpdCBpcyB2YWxpZCB1bnRpbCB0aGUKLSAgICogaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgcmVjZWl2ZSBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWNlaXZlIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlY2VpdmVfZnJvbShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBlbmRwb2ludF90eXBlJiBzZW5kZXJfZW5kcG9pbnQsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBSZWFkSGFuZGxlci4KLSAgICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3JlY2VpdmVfZnJvbSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIHNlbmRlcl9lbmRwb2ludCwgZmxhZ3MsCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fQkFTSUNfUkFXX1NPQ0tFVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19zZXFfcGFja2V0X3NvY2tldC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjE3YmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19zZXFfcGFja2V0X3NvY2tldC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NjUgKzAsMCBAQAotLy8KLS8vIGJhc2ljX3NlcV9wYWNrZXRfc29ja2V0LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fQkFTSUNfU0VRX1BBQ0tFVF9TT0NLRVRfSFBQCi0jZGVmaW5lIEFTSU9fQkFTSUNfU0VRX1BBQ0tFVF9TT0NLRVRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3NvY2tldC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vc2VxX3BhY2tldF9zb2NrZXRfc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBQcm92aWRlcyBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldCBmdW5jdGlvbmFsaXR5LgotLyoqCi0gKiBUaGUgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQgY2xhc3MgdGVtcGxhdGUgcHJvdmlkZXMgYXN5bmNocm9ub3VzIGFuZCBibG9ja2luZwotICogc2VxdWVuY2VkIHBhY2tldCBzb2NrZXQgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwKLSAgICB0eXBlbmFtZSBTZXFQYWNrZXRTb2NrZXRTZXJ2aWNlID0gc2VxX3BhY2tldF9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gPgotY2xhc3MgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQKLSAgOiBwdWJsaWMgYmFzaWNfc29ja2V0PFByb3RvY29sLCBTZXFQYWNrZXRTb2NrZXRTZXJ2aWNlPgotewotcHVibGljOgotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlX3R5cGUuKSBUaGUgbmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mIGEKLSAgLy8vIHNvY2tldC4KLSAgdHlwZWRlZiB0eXBlbmFtZSBTZXFQYWNrZXRTb2NrZXRTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX3R5cGU7Ci0KLSAgLy8vIFRoZSBuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgYSBzb2NrZXQuCi0gIHR5cGVkZWYgdHlwZW5hbWUgU2VxUGFja2V0U29ja2V0U2VydmljZTo6bmF0aXZlX2hhbmRsZV90eXBlCi0gICAgbmF0aXZlX2hhbmRsZV90eXBlOwotCi0gIC8vLyBUaGUgcHJvdG9jb2wgdHlwZS4KLSAgdHlwZWRlZiBQcm90b2NvbCBwcm90b2NvbF90eXBlOwotCi0gIC8vLyBUaGUgZW5kcG9pbnQgdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQgZW5kcG9pbnRfdHlwZTsKLQotICAvLy8gQ29uc3RydWN0IGEgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQgd2l0aG91dCBvcGVuaW5nIGl0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgc2VxdWVuY2VkIHBhY2tldCBzb2NrZXQgd2l0aG91dCBvcGVuaW5nIGl0LiBUaGUKLSAgICogc29ja2V0IG5lZWRzIHRvIGJlIG9wZW5lZCBhbmQgdGhlbiBjb25uZWN0ZWQgb3IgYWNjZXB0ZWQgYmVmb3JlIGRhdGEgY2FuCi0gICAqIGJlIHNlbnQgb3IgcmVjZWl2ZWQgb24gaXQuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldAotICAgKiB3aWxsIHVzZSB0byBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbgotICAgKiB0aGUgc29ja2V0LgotICAgKi8KLSAgZXhwbGljaXQgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU2VxUGFja2V0U29ja2V0U2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbmQgb3BlbiBhIGJhc2ljX3NlcV9wYWNrZXRfc29ja2V0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuZCBvcGVucyBhIHNlcXVlbmNlZF9wYWNrZXQgc29ja2V0LiBUaGUgc29ja2V0Ci0gICAqIG5lZWRzIHRvIGJlIGNvbm5lY3RlZCBvciBhY2NlcHRlZCBiZWZvcmUgZGF0YSBjYW4gYmUgc2VudCBvciByZWNlaXZlZCBvbgotICAgKiBpdC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHNlcXVlbmNlZCBwYWNrZXQgc29ja2V0Ci0gICAqIHdpbGwgdXNlIHRvIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uCi0gICAqIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBwcm90b2NvbCBBbiBvYmplY3Qgc3BlY2lmeWluZyBwcm90b2NvbCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwKLSAgICAgIGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sKQotICAgIDogYmFzaWNfc29ja2V0PFByb3RvY29sLCBTZXFQYWNrZXRTb2NrZXRTZXJ2aWNlPihpb19zZXJ2aWNlLCBwcm90b2NvbCkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX3NlcV9wYWNrZXRfc29ja2V0LCBvcGVuaW5nIGl0IGFuZCBiaW5kaW5nIGl0IHRvIHRoZQotICAvLy8gZ2l2ZW4gbG9jYWwgZW5kcG9pbnQuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldCBhbmQgYXV0b21hdGljYWxseSBvcGVucwotICAgKiBpdCBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50IG9uIHRoZSBsb2NhbCBtYWNoaW5lLiBUaGUgcHJvdG9jb2wgdXNlZAotICAgKiBpcyB0aGUgcHJvdG9jb2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBlbmRwb2ludC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHNlcXVlbmNlZCBwYWNrZXQgc29ja2V0Ci0gICAqIHdpbGwgdXNlIHRvIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uCi0gICAqIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBlbmRwb2ludCBBbiBlbmRwb2ludCBvbiB0aGUgbG9jYWwgbWFjaGluZSB0byB3aGljaCB0aGUgc2VxdWVuY2VkCi0gICAqIHBhY2tldCBzb2NrZXQgd2lsbCBiZSBib3VuZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICBiYXNpY19zZXFfcGFja2V0X3NvY2tldChhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgZW5kcG9pbnQpCi0gICAgOiBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNlcVBhY2tldFNvY2tldFNlcnZpY2U+KGlvX3NlcnZpY2UsIGVuZHBvaW50KQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQgb24gYW4gZXhpc3RpbmcgbmF0aXZlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIHNlcXVlbmNlZCBwYWNrZXQgc29ja2V0IG9iamVjdCB0byBob2xkIGFuCi0gICAqIGV4aXN0aW5nIG5hdGl2ZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldAotICAgKiB3aWxsIHVzZSB0byBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbgotICAgKiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gcHJvdG9jb2wgQW4gb2JqZWN0IHNwZWNpZnlpbmcgcHJvdG9jb2wgcGFyYW1ldGVycyB0byBiZSB1c2VkLgotICAgKgotICAgKiBAcGFyYW0gbmF0aXZlX3NvY2tldCBUaGUgbmV3IHVuZGVybHlpbmcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIGJhc2ljX3NlcV9wYWNrZXRfc29ja2V0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBuYXRpdmVfc29ja2V0KQotICAgIDogYmFzaWNfc29ja2V0PFByb3RvY29sLCBTZXFQYWNrZXRTb2NrZXRTZXJ2aWNlPigKLSAgICAgICAgaW9fc2VydmljZSwgcHJvdG9jb2wsIG5hdGl2ZV9zb2NrZXQpCi0gIHsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKSB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIE1vdmUtY29uc3RydWN0IGEgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhIHNlcXVlbmNlZCBwYWNrZXQgc29ja2V0IGZyb20gb25lIG9iamVjdCB0bwotICAgKiBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3NlcV9wYWNrZXRfc29ja2V0IG9iamVjdCBmcm9tIHdoaWNoIHRoZSBtb3ZlCi0gICAqIHdpbGwgb2NjdXIuCi0gICAqCi0gICAqIEBub3RlIEZvbGxvd2luZyB0aGUgbW92ZSwgdGhlIG1vdmVkLWZyb20gb2JqZWN0IGlzIGluIHRoZSBzYW1lIHN0YXRlIGFzIGlmCi0gICAqIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBAYyBiYXNpY19zZXFfcGFja2V0X3NvY2tldChpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICBiYXNpY19zZXFfcGFja2V0X3NvY2tldChiYXNpY19zZXFfcGFja2V0X3NvY2tldCYmIG90aGVyKQotICAgIDogYmFzaWNfc29ja2V0PFByb3RvY29sLCBTZXFQYWNrZXRTb2NrZXRTZXJ2aWNlPigKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQpKG90aGVyKSkKLSAgewotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGEgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBhc3NpZ25tZW50IG9wZXJhdG9yIG1vdmVzIGEgc2VxdWVuY2VkIHBhY2tldCBzb2NrZXQgZnJvbSBvbmUgb2JqZWN0IHRvCi0gICAqIGFub3RoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUKLSAgICogd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3NlcV9wYWNrZXRfc29ja2V0KGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIGJhc2ljX3NlcV9wYWNrZXRfc29ja2V0JiBvcGVyYXRvcj0oYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQmJiBvdGhlcikKLSAgewotICAgIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU2VxUGFja2V0U29ja2V0U2VydmljZT46Om9wZXJhdG9yPSgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQpKG90aGVyKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8vIE1vdmUtY29uc3RydWN0IGEgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQgZnJvbSBhIHNvY2tldCBvZiBhbm90aGVyIHByb3RvY29sCi0gIC8vLyB0eXBlLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhIHNlcXVlbmNlZCBwYWNrZXQgc29ja2V0IGZyb20gb25lIG9iamVjdCB0bwotICAgKiBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3NlcV9wYWNrZXRfc29ja2V0IG9iamVjdCBmcm9tIHdoaWNoIHRoZSBtb3ZlCi0gICAqIHdpbGwgb2NjdXIuCi0gICAqCi0gICAqIEBub3RlIEZvbGxvd2luZyB0aGUgbW92ZSwgdGhlIG1vdmVkLWZyb20gb2JqZWN0IGlzIGluIHRoZSBzYW1lIHN0YXRlIGFzIGlmCi0gICAqIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBAYyBiYXNpY19zZXFfcGFja2V0X3NvY2tldChpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxLCB0eXBlbmFtZSBTZXFQYWNrZXRTb2NrZXRTZXJ2aWNlMT4KLSAgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQoCi0gICAgICBiYXNpY19zZXFfcGFja2V0X3NvY2tldDxQcm90b2NvbDEsIFNlcVBhY2tldFNvY2tldFNlcnZpY2UxPiYmIG90aGVyLAotICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPFByb3RvY29sMSwgUHJvdG9jb2w+Ojp2YWx1ZT46OnR5cGUqID0gMCkKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU2VxUGFja2V0U29ja2V0U2VydmljZT4oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUMihiYXNpY19zZXFfcGFja2V0X3NvY2tldDwKLSAgICAgICAgICBQcm90b2NvbDEsIFNlcVBhY2tldFNvY2tldFNlcnZpY2UxPikob3RoZXIpKQotICB7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gYSBiYXNpY19zZXFfcGFja2V0X3NvY2tldCBmcm9tIGEgc29ja2V0IG9mIGFub3RoZXIgcHJvdG9jb2wKLSAgLy8vIHR5cGUuCi0gIC8qKgotICAgKiBUaGlzIGFzc2lnbm1lbnQgb3BlcmF0b3IgbW92ZXMgYSBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldCBmcm9tIG9uZSBvYmplY3QgdG8KLSAgICogYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19zZXFfcGFja2V0X3NvY2tldCBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZQotICAgKiB3aWxsIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sMSwgdHlwZW5hbWUgU2VxUGFja2V0U29ja2V0U2VydmljZTE+Ci0gIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxQcm90b2NvbDEsIFByb3RvY29sPjo6dmFsdWUsCi0gICAgICBiYXNpY19zZXFfcGFja2V0X3NvY2tldD46OnR5cGUmIG9wZXJhdG9yPSgKLSAgICAgICAgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQ8UHJvdG9jb2wxLCBTZXFQYWNrZXRTb2NrZXRTZXJ2aWNlMT4mJiBvdGhlcikKLSAgewotICAgIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU2VxUGFja2V0U29ja2V0U2VydmljZT46Om9wZXJhdG9yPSgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QyKGJhc2ljX3NlcV9wYWNrZXRfc29ja2V0PAotICAgICAgICAgIFByb3RvY29sMSwgU2VxUGFja2V0U29ja2V0U2VydmljZTE+KShvdGhlcikpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIFNlbmQgc29tZSBkYXRhIG9uIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBkYXRhIG9uIHRoZSBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldC4gVGhlCi0gICAqIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgZGF0YSBoYXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSwgb3IgYW4KLSAgICogdW50aWwgZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBkYXRhIGJ1ZmZlcnMgdG8gYmUgc2VudCBvbiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHNlbmQgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gc2VuZCBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIHNvY2tldC5zZW5kKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgMCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gc2VuZGluZyBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBzZW5kKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPmdldF9zZXJ2aWNlKCkuc2VuZCgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGZsYWdzLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNlbmQiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBTZW5kIHNvbWUgZGF0YSBvbiB0aGUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgZGF0YSBvbiB0aGUgc2VxdWVuY2VkIHBhY2tldCBzb2NrZXQuIFRoZQotICAgKiBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sgdGhlIGRhdGEgaGFzIGJlZW4gc2VudCBzdWNjZXNzZnVsbHksIG9yIGFuIHVudGlsCi0gICAqIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHNlbnQgb24gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHNwZWNpZnlpbmcgaG93IHRoZSBzZW5kIGNhbGwgaXMgdG8gYmUgbWFkZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4gUmV0dXJucyAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgKgotICAgKiBAbm90ZSBUaGUgc2VuZCBvcGVyYXRpb24gbWF5IG5vdCB0cmFuc21pdCBhbGwgb2YgdGhlIGRhdGEgdG8gdGhlIHBlZXIuCi0gICAqIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIHdyaXRlIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFsbCBkYXRhCi0gICAqIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHNlbmQoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLnNlbmQoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBmbGFncywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBzZW5kLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHNlbmQgZGF0YSBvbiB0aGUgc2VxdWVuY2VkIHBhY2tldAotICAgKiBzb2NrZXQuIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBkYXRhIGJ1ZmZlcnMgdG8gYmUgc2VudCBvbiB0aGUgc29ja2V0LiBBbHRob3VnaAotICAgKiB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUgdW5kZXJseWluZwotICAgKiBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlIHRoYXQgdGhleQotICAgKiByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHNlbmQgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc2VuZCBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mCi0gICAqIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHNlbnQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyBzZW5kIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogc29ja2V0LmFzeW5jX3NlbmQoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCAwLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBzZW5kaW5nIG11bHRpcGxlCi0gICAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19zZW5kKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFdyaXRlSGFuZGxlci4KLSAgICBBU0lPX1dSSVRFX0hBTkRMRVJfQ0hFQ0soV3JpdGVIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfc2VuZCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgYnVmZmVycywgZmxhZ3MsIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIFJlY2VpdmUgc29tZSBkYXRhIG9uIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSBkYXRhIG9uIHRoZSBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldC4gVGhlCi0gICAqIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jayB1bnRpbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSwgb3IKLSAgICogdW50aWwgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICoKLSAgICogQHBhcmFtIG91dF9mbGFncyBBZnRlciB0aGUgcmVjZWl2ZSBjYWxsIGNvbXBsZXRlcywgY29udGFpbnMgZmxhZ3MKLSAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaWYgdGhlCi0gICAqIHNvY2tldF9iYXNlOjptZXNzYWdlX2VuZF9vZl9yZWNvcmQgYml0IGlzIHNldCB0aGVuIHRoZSByZWNlaXZlZCBkYXRhIG1hcmtzCi0gICAqIHRoZSBlbmQgb2YgYSByZWNvcmQuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLiBBbiBlcnJvciBjb2RlIG9mCi0gICAqIGFzaW86OmVycm9yOjplb2YgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBieSB0aGUKLSAgICogcGVlci4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHJlY2VpdmUgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzCi0gICAqIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIHNvY2tldC5yZWNlaXZlKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgb3V0X2ZsYWdzKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWNlaXZpbmcgaW50bwotICAgKiBtdWx0aXBsZSBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlY2VpdmUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MmIG91dF9mbGFncykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPmdldF9zZXJ2aWNlKCkucmVjZWl2ZSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIDAsIG91dF9mbGFncywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWNlaXZlIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gUmVjZWl2ZSBzb21lIGRhdGEgb24gdGhlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNlaXZlIGRhdGEgb24gdGhlIHNlcXVlbmNlZCBwYWNrZXQgc29ja2V0LiBUaGUKLSAgICogZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5LCBvcgotICAgKiB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkLgotICAgKgotICAgKiBAcGFyYW0gaW5fZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmUgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gb3V0X2ZsYWdzIEFmdGVyIHRoZSByZWNlaXZlIGNhbGwgY29tcGxldGVzLCBjb250YWlucyBmbGFncwotICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVkIGRhdGEuIEZvciBleGFtcGxlLCBpZiB0aGUKLSAgICogc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZW5kX29mX3JlY29yZCBiaXQgaXMgc2V0IHRoZW4gdGhlIHJlY2VpdmVkIGRhdGEgbWFya3MKLSAgICogdGhlIGVuZCBvZiBhIHJlY29yZC4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIEFuIGVycm9yIGNvZGUgb2YKLSAgICogYXNpbzo6ZXJyb3I6OmVvZiBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZQotICAgKiBwZWVyLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVjZWl2ZSBvcGVyYXRpb24gbWF5IG5vdCByZWNlaXZlIGFsbCBvZiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgotICAgKiBieXRlcy4gQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgcmVhZCBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUKLSAgICogcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQgYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gcmVjZWl2ZSBpbnRvIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMKLSAgICogZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogc29ja2V0LnJlY2VpdmUoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCAwLCBvdXRfZmxhZ3MpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlY2VpdmluZyBpbnRvCi0gICAqIG11bHRpcGxlIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVjZWl2ZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBpbl9mbGFncywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiBvdXRfZmxhZ3MpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnJlY2VpdmUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBpbl9mbGFncywgb3V0X2ZsYWdzLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInJlY2VpdmUiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBSZWNlaXZlIHNvbWUgZGF0YSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSBkYXRhIG9uIHRoZSBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldC4gVGhlCi0gICAqIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jayB1bnRpbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSwgb3IKLSAgICogdW50aWwgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICoKLSAgICogQHBhcmFtIGluX2ZsYWdzIEZsYWdzIHNwZWNpZnlpbmcgaG93IHRoZSByZWNlaXZlIGNhbGwgaXMgdG8gYmUgbWFkZS4KLSAgICoKLSAgICogQHBhcmFtIG91dF9mbGFncyBBZnRlciB0aGUgcmVjZWl2ZSBjYWxsIGNvbXBsZXRlcywgY29udGFpbnMgZmxhZ3MKLSAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaWYgdGhlCi0gICAqIHNvY2tldF9iYXNlOjptZXNzYWdlX2VuZF9vZl9yZWNvcmQgYml0IGlzIHNldCB0aGVuIHRoZSByZWNlaXZlZCBkYXRhIG1hcmtzCi0gICAqIHRoZSBlbmQgb2YgYSByZWNvcmQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLiBSZXR1cm5zIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZWNlaXZlIG9wZXJhdGlvbiBtYXkgbm90IHJlY2VpdmUgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gICAqIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiByZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZQotICAgKiByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWNlaXZlKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGluX2ZsYWdzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MmIG91dF9mbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZWNlaXZlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICBidWZmZXJzLCBpbl9mbGFncywgb3V0X2ZsYWdzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgcmVjZWl2ZSBkYXRhIGZyb20gdGhlIHNlcXVlbmNlZAotICAgKiBwYWNrZXQgc29ja2V0LiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVjZWl2ZWQuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBvdXRfZmxhZ3MgT25jZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMsIGNvbnRhaW5zIGZsYWdzCi0gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjZWl2ZWQgZGF0YS4gRm9yIGV4YW1wbGUsIGlmIHRoZQotICAgKiBzb2NrZXRfYmFzZTo6bWVzc2FnZV9lbmRfb2ZfcmVjb3JkIGJpdCBpcyBzZXQgdGhlbiB0aGUgcmVjZWl2ZWQgZGF0YSBtYXJrcwotICAgKiB0aGUgZW5kIG9mIGEgcmVjb3JkLiBUaGUgY2FsbGVyIG11c3QgZ3VhcmFudGVlIHRoYXQgdGhlIHJlZmVyZW5jZWQKLSAgICogdmFyaWFibGUgcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWNlaXZlIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWNlaXZlIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcwotICAgKiBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBzb2NrZXQuYXN5bmNfcmVjZWl2ZShhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIG91dF9mbGFncywgaGFuZGxlcik7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gcmVjZWl2aW5nIGludG8KLSAgICogbXVsdGlwbGUgYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlY2VpdmUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MmIG91dF9mbGFncywKLSAgICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gICAgQVNJT19SRUFEX0hBTkRMRVJfQ0hFQ0soUmVhZEhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19yZWNlaXZlKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgMCwgb3V0X2ZsYWdzLAotICAgICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWNlaXZlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlY2VpdmUgZGF0YSBmcm9tIHRoZSBzZXF1ZW5jZWQKLSAgICogZGF0YSBzb2NrZXQuIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICogQWx0aG91Z2ggdGhlIGJ1ZmZlcnMgb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlCi0gICAqIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICAgKiB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIGluX2ZsYWdzIEZsYWdzIHNwZWNpZnlpbmcgaG93IHRoZSByZWNlaXZlIGNhbGwgaXMgdG8gYmUgbWFkZS4KLSAgICoKLSAgICogQHBhcmFtIG91dF9mbGFncyBPbmNlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcywgY29udGFpbnMgZmxhZ3MKLSAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaWYgdGhlCi0gICAqIHNvY2tldF9iYXNlOjptZXNzYWdlX2VuZF9vZl9yZWNvcmQgYml0IGlzIHNldCB0aGVuIHRoZSByZWNlaXZlZCBkYXRhIG1hcmtzCi0gICAqIHRoZSBlbmQgb2YgYSByZWNvcmQuIFRoZSBjYWxsZXIgbXVzdCBndWFyYW50ZWUgdGhhdCB0aGUgcmVmZXJlbmNlZAotICAgKiB2YXJpYWJsZSByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlY2VpdmUgb3BlcmF0aW9uCi0gICAqIGNvbXBsZXRlcy4gQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uCi0gICAqIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHJlY2VpdmUgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzCi0gICAqIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIHNvY2tldC5hc3luY19yZWNlaXZlKAotICAgKiAgICAgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLAotICAgKiAgICAgMCwgb3V0X2ZsYWdzLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWNlaXZpbmcgaW50bwotICAgKiBtdWx0aXBsZSBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVjZWl2ZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBpbl9mbGFncywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiBvdXRfZmxhZ3MsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICAgIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfcmVjZWl2ZSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGluX2ZsYWdzLCBvdXRfZmxhZ3MsCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fQkFTSUNfU0VRX1BBQ0tFVF9TT0NLRVRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc2VyaWFsX3BvcnQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3NlcmlhbF9wb3J0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxNzBlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc2VyaWFsX3BvcnQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLS8vCi0vLyBiYXNpY19zZXJpYWxfcG9ydC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IFJlcCBJbnZhcmlhbnQgU3lzdGVtcywgSW5jLiAoaW5mb0ByZXBpbnZhcmlhbnQuY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0JBU0lDX1NFUklBTF9QT1JUX0hQUAotI2RlZmluZSBBU0lPX0JBU0lDX1NFUklBTF9QT1JUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TRVJJQUxfUE9SVCkgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJhc2lvL2Jhc2ljX2lvX29iamVjdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vc2VyaWFsX3BvcnRfYmFzZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9zZXJpYWxfcG9ydF9zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIFByb3ZpZGVzIHNlcmlhbCBwb3J0IGZ1bmN0aW9uYWxpdHkuCi0vKioKLSAqIFRoZSBiYXNpY19zZXJpYWxfcG9ydCBjbGFzcyB0ZW1wbGF0ZSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRoYXQgaXMgY29tbW9uCi0gKiB0byBhbGwgc2VyaWFsIHBvcnRzLgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFNlcmlhbFBvcnRTZXJ2aWNlID0gc2VyaWFsX3BvcnRfc2VydmljZT4KLWNsYXNzIGJhc2ljX3NlcmlhbF9wb3J0Ci0gIDogcHVibGljIGJhc2ljX2lvX29iamVjdDxTZXJpYWxQb3J0U2VydmljZT4sCi0gICAgcHVibGljIHNlcmlhbF9wb3J0X2Jhc2UKLXsKLXB1YmxpYzoKLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZV90eXBlLikgVGhlIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZiBhCi0gIC8vLyBzZXJpYWwgcG9ydC4KLSAgdHlwZWRlZiB0eXBlbmFtZSBTZXJpYWxQb3J0U2VydmljZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV90eXBlOwotCi0gIC8vLyBUaGUgbmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mIGEgc2VyaWFsIHBvcnQuCi0gIHR5cGVkZWYgdHlwZW5hbWUgU2VyaWFsUG9ydFNlcnZpY2U6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgLy8vIEEgYmFzaWNfc2VyaWFsX3BvcnQgaXMgYWx3YXlzIHRoZSBsb3dlc3QgbGF5ZXIuCi0gIHR5cGVkZWYgYmFzaWNfc2VyaWFsX3BvcnQ8U2VyaWFsUG9ydFNlcnZpY2U+IGxvd2VzdF9sYXllcl90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19zZXJpYWxfcG9ydCB3aXRob3V0IG9wZW5pbmcgaXQuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBzZXJpYWwgcG9ydCB3aXRob3V0IG9wZW5pbmcgaXQuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBzZXJpYWwgcG9ydCB3aWxsIHVzZSB0bwotICAgKiBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgcG9ydC4KLSAgICovCi0gIGV4cGxpY2l0IGJhc2ljX3NlcmlhbF9wb3J0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U2VyaWFsUG9ydFNlcnZpY2U+KGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW5kIG9wZW4gYSBiYXNpY19zZXJpYWxfcG9ydC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhbmQgb3BlbnMgYSBzZXJpYWwgcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UKLSAgICogbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHNlcmlhbCBwb3J0IHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBwb3J0LgotICAgKgotICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBkZXZpY2UgbmFtZSBmb3IgdGhpcyBzZXJpYWwKLSAgICogcG9ydC4KLSAgICovCi0gIGV4cGxpY2l0IGJhc2ljX3NlcmlhbF9wb3J0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBjaGFyKiBkZXZpY2UpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U2VyaWFsUG9ydFNlcnZpY2U+KGlvX3NlcnZpY2UpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkub3Blbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZGV2aWNlLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIm9wZW4iKTsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW5kIG9wZW4gYSBiYXNpY19zZXJpYWxfcG9ydC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhbmQgb3BlbnMgYSBzZXJpYWwgcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UKLSAgICogbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHNlcmlhbCBwb3J0IHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBwb3J0LgotICAgKgotICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBkZXZpY2UgbmFtZSBmb3IgdGhpcyBzZXJpYWwKLSAgICogcG9ydC4KLSAgICovCi0gIGV4cGxpY2l0IGJhc2ljX3NlcmlhbF9wb3J0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlKQotICAgIDogYmFzaWNfaW9fb2JqZWN0PFNlcmlhbFBvcnRTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLm9wZW4odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGRldmljZSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJvcGVuIik7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgYmFzaWNfc2VyaWFsX3BvcnQgb24gYW4gZXhpc3RpbmcgbmF0aXZlIHNlcmlhbCBwb3J0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgc2VyaWFsIHBvcnQgb2JqZWN0IHRvIGhvbGQgYW4gZXhpc3RpbmcgbmF0aXZlCi0gICAqIHNlcmlhbCBwb3J0LgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgc2VyaWFsIHBvcnQgd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBuYXRpdmVfc2VyaWFsX3BvcnQgQSBuYXRpdmUgc2VyaWFsIHBvcnQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgYmFzaWNfc2VyaWFsX3BvcnQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwKLSAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX3NlcmlhbF9wb3J0KQotICAgIDogYmFzaWNfaW9fb2JqZWN0PFNlcmlhbFBvcnRTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmFzc2lnbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgbmF0aXZlX3NlcmlhbF9wb3J0LCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImFzc2lnbiIpOwotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBiYXNpY19zZXJpYWxfcG9ydCBmcm9tIGFub3RoZXIuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIG1vdmVzIGEgc2VyaWFsIHBvcnQgZnJvbSBvbmUgb2JqZWN0IHRvIGFub3RoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgYmFzaWNfc2VyaWFsX3BvcnQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUgd2lsbAotICAgKiBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3NlcmlhbF9wb3J0KGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIGJhc2ljX3NlcmlhbF9wb3J0KGJhc2ljX3NlcmlhbF9wb3J0JiYgb3RoZXIpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U2VyaWFsUG9ydFNlcnZpY2U+KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChiYXNpY19zZXJpYWxfcG9ydCkob3RoZXIpKQotICB7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gYSBiYXNpY19zZXJpYWxfcG9ydCBmcm9tIGFub3RoZXIuCi0gIC8qKgotICAgKiBUaGlzIGFzc2lnbm1lbnQgb3BlcmF0b3IgbW92ZXMgYSBzZXJpYWwgcG9ydCBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19zZXJpYWxfcG9ydCBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZSB3aWxsCi0gICAqIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfc2VyaWFsX3BvcnQoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgYmFzaWNfc2VyaWFsX3BvcnQmIG9wZXJhdG9yPShiYXNpY19zZXJpYWxfcG9ydCYmIG90aGVyKQotICB7Ci0gICAgYmFzaWNfaW9fb2JqZWN0PFNlcmlhbFBvcnRTZXJ2aWNlPjo6b3BlcmF0b3I9KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChiYXNpY19zZXJpYWxfcG9ydCkob3RoZXIpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0gIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIGEgc3RhY2sgb2YKLSAgICogbGF5ZXJzLiBTaW5jZSBhIGJhc2ljX3NlcmlhbF9wb3J0IGNhbm5vdCBjb250YWluIGFueSBmdXJ0aGVyIGxheWVycywgaXQKLSAgICogc2ltcGx5IHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgotICAgKgotICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIgaW4gdGhlIHN0YWNrIG9mIGxheWVycy4gT3duZXJzaGlwCi0gICAqIGlzIG5vdCB0cmFuc2ZlcnJlZCB0byB0aGUgY2FsbGVyLgotICAgKi8KLSAgbG93ZXN0X2xheWVyX3R5cGUmIGxvd2VzdF9sYXllcigpCi0gIHsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLy8gR2V0IGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllciBpbiBhIHN0YWNrIG9mCi0gICAqIGxheWVycy4gU2luY2UgYSBiYXNpY19zZXJpYWxfcG9ydCBjYW5ub3QgY29udGFpbiBhbnkgZnVydGhlciBsYXllcnMsIGl0Ci0gICAqIHNpbXBseSByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KLSAgICoKLSAgICogQHJldHVybiBBIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIHRoZSBzdGFjayBvZiBsYXllcnMuCi0gICAqIE93bmVyc2hpcCBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlci4KLSAgICovCi0gIGNvbnN0IGxvd2VzdF9sYXllcl90eXBlJiBsb3dlc3RfbGF5ZXIoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8vIE9wZW4gdGhlIHNlcmlhbCBwb3J0IHVzaW5nIHRoZSBzcGVjaWZpZWQgZGV2aWNlIG5hbWUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIGRldmljZSBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgZGV2aWNlIG5hbWUuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBvcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2UpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkub3Blbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZGV2aWNlLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIm9wZW4iKTsKLSAgfQotCi0gIC8vLyBPcGVuIHRoZSBzZXJpYWwgcG9ydCB1c2luZyB0aGUgc3BlY2lmaWVkIGRldmljZSBuYW1lLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgc2VyaWFsIHBvcnQgdXNpbmcgdGhlIGdpdmVuIHBsYXRmb3JtLXNwZWNpZmljCi0gICAqIGRldmljZSBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gZGV2aWNlIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBkZXZpY2UgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0aGUgaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBvcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2UsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLm9wZW4odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGRldmljZSwgZWMpOwotICB9Ci0KLSAgLy8vIEFzc2lnbiBhbiBleGlzdGluZyBuYXRpdmUgc2VyaWFsIHBvcnQgdG8gdGhlIHNlcmlhbCBwb3J0LgotICAvKgotICAgKiBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBzZXJpYWwgcG9ydCB0byBob2xkIGFuIGV4aXN0aW5nIG5hdGl2ZSBzZXJpYWwgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIG5hdGl2ZV9zZXJpYWxfcG9ydCBBIG5hdGl2ZSBzZXJpYWwgcG9ydC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICB2b2lkIGFzc2lnbihjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIG5hdGl2ZV9zZXJpYWxfcG9ydCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3NpZ24odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIG5hdGl2ZV9zZXJpYWxfcG9ydCwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJhc3NpZ24iKTsKLSAgfQotCi0gIC8vLyBBc3NpZ24gYW4gZXhpc3RpbmcgbmF0aXZlIHNlcmlhbCBwb3J0IHRvIHRoZSBzZXJpYWwgcG9ydC4KLSAgLyoKLSAgICogVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgc2VyaWFsIHBvcnQgdG8gaG9sZCBhbiBleGlzdGluZyBuYXRpdmUgc2VyaWFsIHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBuYXRpdmVfc2VyaWFsX3BvcnQgQSBuYXRpdmUgc2VyaWFsIHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBhc3NpZ24oY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBuYXRpdmVfc2VyaWFsX3BvcnQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzc2lnbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgbmF0aXZlX3NlcmlhbF9wb3J0LCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlcmlhbCBwb3J0IGlzIG9wZW4uCi0gIGJvb2wgaXNfb3BlbigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5pc19vcGVuKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpKTsKLSAgfQotCi0gIC8vLyBDbG9zZSB0aGUgc2VyaWFsIHBvcnQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xvc2UgdGhlIHNlcmlhbCBwb3J0LiBBbnkgYXN5bmNocm9ub3VzIHJlYWQgb3IKLSAgICogd3JpdGUgb3BlcmF0aW9ucyB3aWxsIGJlIGNhbmNlbGxlZCBpbW1lZGlhdGVseSwgYW5kIHdpbGwgY29tcGxldGUgd2l0aCB0aGUKLSAgICogYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIHZvaWQgY2xvc2UoKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmNsb3NlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNsb3NlIik7Ci0gIH0KLQotICAvLy8gQ2xvc2UgdGhlIHNlcmlhbCBwb3J0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNsb3NlIHRoZSBzZXJpYWwgcG9ydC4gQW55IGFzeW5jaHJvbm91cyByZWFkIG9yCi0gICAqIHdyaXRlIG9wZXJhdGlvbnMgd2lsbCBiZSBjYW5jZWxsZWQgaW1tZWRpYXRlbHksIGFuZCB3aWxsIGNvbXBsZXRlIHdpdGggdGhlCi0gICAqIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvci4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIGNsb3NlKGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuY2xvc2UodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgfQotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGUoKS4pIEdldCB0aGUgbmF0aXZlIHNlcmlhbCBwb3J0Ci0gIC8vLyByZXByZXNlbnRhdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgKiBzZXJpYWwgcG9ydC4gVGhpcyBpcyBpbnRlbmRlZCB0byBhbGxvdyBhY2Nlc3MgdG8gbmF0aXZlIHNlcmlhbCBwb3J0Ci0gICAqIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkLgotICAgKi8KLSAgbmF0aXZlX3R5cGUgbmF0aXZlKCkKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLm5hdGl2ZV9oYW5kbGUodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCkpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbmF0aXZlIHNlcmlhbCBwb3J0IHJlcHJlc2VudGF0aW9uLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAqIHNlcmlhbCBwb3J0LiBUaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGFjY2VzcyB0byBuYXRpdmUgc2VyaWFsIHBvcnQKLSAgICogZnVuY3Rpb25hbGl0eSB0aGF0IGlzIG5vdCBvdGhlcndpc2UgcHJvdmlkZWQuCi0gICAqLwotICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfaGFuZGxlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpKTsKLSAgfQotCi0gIC8vLyBDYW5jZWwgYWxsIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VyaWFsIHBvcnQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGNhdXNlcyBhbGwgb3V0c3RhbmRpbmcgYXN5bmNocm9ub3VzIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucwotICAgKiB0byBmaW5pc2ggaW1tZWRpYXRlbHksIGFuZCB0aGUgaGFuZGxlcnMgZm9yIGNhbmNlbGxlZCBvcGVyYXRpb25zIHdpbGwgYmUKLSAgICogcGFzc2VkIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBjYW5jZWwoKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmNhbmNlbCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJjYW5jZWwiKTsKLSAgfQotCi0gIC8vLyBDYW5jZWwgYWxsIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VyaWFsIHBvcnQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGNhdXNlcyBhbGwgb3V0c3RhbmRpbmcgYXN5bmNocm9ub3VzIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucwotICAgKiB0byBmaW5pc2ggaW1tZWRpYXRlbHksIGFuZCB0aGUgaGFuZGxlcnMgZm9yIGNhbmNlbGxlZCBvcGVyYXRpb25zIHdpbGwgYmUKLSAgICogcGFzc2VkIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5jYW5jZWwodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgfQotCi0gIC8vLyBTZW5kIGEgYnJlYWsgc2VxdWVuY2UgdG8gdGhlIHNlcmlhbCBwb3J0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBjYXVzZXMgYSBicmVhayBzZXF1ZW5jZSBvZiBwbGF0Zm9ybS1zcGVjaWZpYyBkdXJhdGlvbiB0byBiZQotICAgKiBzZW50IG91dCB0aGUgc2VyaWFsIHBvcnQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBzZW5kX2JyZWFrKCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5zZW5kX2JyZWFrKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNlbmRfYnJlYWsiKTsKLSAgfQotCi0gIC8vLyBTZW5kIGEgYnJlYWsgc2VxdWVuY2UgdG8gdGhlIHNlcmlhbCBwb3J0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBjYXVzZXMgYSBicmVhayBzZXF1ZW5jZSBvZiBwbGF0Zm9ybS1zcGVjaWZpYyBkdXJhdGlvbiB0byBiZQotICAgKiBzZW50IG91dCB0aGUgc2VyaWFsIHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBzZW5kX2JyZWFrKGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuc2VuZF9icmVhayh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZWMpOwotICB9Ci0KLSAgLy8vIFNldCBhbiBvcHRpb24gb24gdGhlIHNlcmlhbCBwb3J0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBhbiBvcHRpb24gb24gdGhlIHNlcmlhbCBwb3J0LgotICAgKgotICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gdmFsdWUgdG8gYmUgc2V0IG9uIHRoZSBzZXJpYWwgcG9ydC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBzYSBTZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24gQG4KLSAgICogYXNpbzo6c2VyaWFsX3BvcnRfYmFzZTo6YmF1ZF9yYXRlIEBuCi0gICAqIGFzaW86OnNlcmlhbF9wb3J0X2Jhc2U6OmZsb3dfY29udHJvbCBAbgotICAgKiBhc2lvOjpzZXJpYWxfcG9ydF9iYXNlOjpwYXJpdHkgQG4KLSAgICogYXNpbzo6c2VyaWFsX3BvcnRfYmFzZTo6c3RvcF9iaXRzIEBuCi0gICAqIGFzaW86OnNlcmlhbF9wb3J0X2Jhc2U6OmNoYXJhY3Rlcl9zaXplCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uPgotICB2b2lkIHNldF9vcHRpb24oY29uc3QgU2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uJiBvcHRpb24pCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkuc2V0X29wdGlvbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgb3B0aW9uLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNldF9vcHRpb24iKTsKLSAgfQotCi0gIC8vLyBTZXQgYW4gb3B0aW9uIG9uIHRoZSBzZXJpYWwgcG9ydC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgYW4gb3B0aW9uIG9uIHRoZSBzZXJpYWwgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIHZhbHVlIHRvIGJlIHNldCBvbiB0aGUgc2VyaWFsIHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAc2EgU2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uIEBuCi0gICAqIGFzaW86OnNlcmlhbF9wb3J0X2Jhc2U6OmJhdWRfcmF0ZSBAbgotICAgKiBhc2lvOjpzZXJpYWxfcG9ydF9iYXNlOjpmbG93X2NvbnRyb2wgQG4KLSAgICogYXNpbzo6c2VyaWFsX3BvcnRfYmFzZTo6cGFyaXR5IEBuCi0gICAqIGFzaW86OnNlcmlhbF9wb3J0X2Jhc2U6OnN0b3BfYml0cyBAbgotICAgKiBhc2lvOjpzZXJpYWxfcG9ydF9iYXNlOjpjaGFyYWN0ZXJfc2l6ZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNldHRhYmxlU2VyaWFsUG9ydE9wdGlvbj4KLSAgYXNpbzo6ZXJyb3JfY29kZSBzZXRfb3B0aW9uKGNvbnN0IFNldHRhYmxlU2VyaWFsUG9ydE9wdGlvbiYgb3B0aW9uLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5zZXRfb3B0aW9uKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgb3B0aW9uLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0IGFuIG9wdGlvbiBmcm9tIHRoZSBzZXJpYWwgcG9ydC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYW4gb3B0aW9uIG9uIHRoZSBzZXJpYWwKLSAgICogcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIHZhbHVlIHRvIGJlIG9idGFpbmVkIGZyb20gdGhlIHNlcmlhbCBwb3J0LgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQHNhIEdldHRhYmxlU2VyaWFsUG9ydE9wdGlvbiBAbgotICAgKiBhc2lvOjpzZXJpYWxfcG9ydF9iYXNlOjpiYXVkX3JhdGUgQG4KLSAgICogYXNpbzo6c2VyaWFsX3BvcnRfYmFzZTo6Zmxvd19jb250cm9sIEBuCi0gICAqIGFzaW86OnNlcmlhbF9wb3J0X2Jhc2U6OnBhcml0eSBAbgotICAgKiBhc2lvOjpzZXJpYWxfcG9ydF9iYXNlOjpzdG9wX2JpdHMgQG4KLSAgICogYXNpbzo6c2VyaWFsX3BvcnRfYmFzZTo6Y2hhcmFjdGVyX3NpemUKLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBHZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24+Ci0gIHZvaWQgZ2V0X29wdGlvbihHZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24mIG9wdGlvbikKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5nZXRfb3B0aW9uKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBvcHRpb24sIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiZ2V0X29wdGlvbiIpOwotICB9Ci0KLSAgLy8vIEdldCBhbiBvcHRpb24gZnJvbSB0aGUgc2VyaWFsIHBvcnQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIGFuIG9wdGlvbiBvbiB0aGUgc2VyaWFsCi0gICAqIHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBvcHRpb24gVGhlIG9wdGlvbiB2YWx1ZSB0byBiZSBvYnRhaW5lZCBmcm9tIHRoZSBzZXJpYWwgcG9ydC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHNhIEdldHRhYmxlU2VyaWFsUG9ydE9wdGlvbiBAbgotICAgKiBhc2lvOjpzZXJpYWxfcG9ydF9iYXNlOjpiYXVkX3JhdGUgQG4KLSAgICogYXNpbzo6c2VyaWFsX3BvcnRfYmFzZTo6Zmxvd19jb250cm9sIEBuCi0gICAqIGFzaW86OnNlcmlhbF9wb3J0X2Jhc2U6OnBhcml0eSBAbgotICAgKiBhc2lvOjpzZXJpYWxfcG9ydF9iYXNlOjpzdG9wX2JpdHMgQG4KLSAgICogYXNpbzo6c2VyaWFsX3BvcnRfYmFzZTo6Y2hhcmFjdGVyX3NpemUKLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBHZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgZ2V0X29wdGlvbihHZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24mIG9wdGlvbiwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuZ2V0X29wdGlvbigKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG9wdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgc2VyaWFsIHBvcnQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgZGF0YSB0byB0aGUgc2VyaWFsIHBvcnQuIFRoZSBmdW5jdGlvbiBjYWxsCi0gICAqIHdpbGwgYmxvY2sgdW50aWwgb25lIG9yIG1vcmUgYnl0ZXMgb2YgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgotICAgKiBzdWNjZXNzZnVsbHksIG9yIHVudGlsIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNlcmlhbCBwb3J0LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLiBBbiBlcnJvciBjb2RlIG9mCi0gICAqIGFzaW86OmVycm9yOjplb2YgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBieSB0aGUKLSAgICogcGVlci4KLSAgICoKLSAgICogQG5vdGUgVGhlIHdyaXRlX3NvbWUgb3BlcmF0aW9uIG1heSBub3QgdHJhbnNtaXQgYWxsIG9mIHRoZSBkYXRhIHRvIHRoZQotICAgKiBwZWVyLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiB3cml0ZSBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdAotICAgKiBhbGwgZGF0YSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHdyaXRlIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogc2VyaWFsX3BvcnQud3JpdGVfc29tZShhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSkpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHdyaXRpbmcgbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgd3JpdGVfc29tZShjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS53cml0ZV9zb21lKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ3cml0ZV9zb21lIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gV3JpdGUgc29tZSBkYXRhIHRvIHRoZSBzZXJpYWwgcG9ydC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3cml0ZSBkYXRhIHRvIHRoZSBzZXJpYWwgcG9ydC4gVGhlIGZ1bmN0aW9uIGNhbGwKLSAgICogd2lsbCBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiB0aGUgZGF0YSBoYXMgYmVlbiB3cml0dGVuCi0gICAqIHN1Y2Nlc3NmdWxseSwgb3IgdW50aWwgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBkYXRhIGJ1ZmZlcnMgdG8gYmUgd3JpdHRlbiB0byB0aGUgc2VyaWFsIHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIFJldHVybnMgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgICoKLSAgICogQG5vdGUgVGhlIHdyaXRlX3NvbWUgb3BlcmF0aW9uIG1heSBub3QgdHJhbnNtaXQgYWxsIG9mIHRoZSBkYXRhIHRvIHRoZQotICAgKiBwZWVyLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiB3cml0ZSBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdAotICAgKiBhbGwgZGF0YSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLndyaXRlX3NvbWUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdyaXRlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHdyaXRlIGRhdGEgdG8gdGhlIHNlcmlhbCBwb3J0LgotICAgKiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNlcmlhbCBwb3J0LgotICAgKiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUKLSAgICogdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gICAqIHRoYXQgdGhleSByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZgotICAgKiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB3cml0dGVuLgotICAgKiApOyBAZW5kY29kZQotICAgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gICAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gICAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICAgKgotICAgKiBAbm90ZSBUaGUgd3JpdGUgb3BlcmF0aW9uIG1heSBub3QgdHJhbnNtaXQgYWxsIG9mIHRoZSBkYXRhIHRvIHRoZSBwZWVyLgotICAgKiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiBhc3luY193cml0ZSBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCBhbGwKLSAgICogZGF0YSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyB3cml0ZSBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIHNlcmlhbF9wb3J0LmFzeW5jX3dyaXRlX3NvbWUoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIG11bHRpcGxlCi0gICAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY193cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBXcml0ZUhhbmRsZXIuCi0gICAgQVNJT19XUklURV9IQU5ETEVSX0NIRUNLKFdyaXRlSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3dyaXRlX3NvbWUodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIGJ1ZmZlcnMsIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHNlcmlhbCBwb3J0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzZXJpYWwgcG9ydC4gVGhlIGZ1bmN0aW9uCi0gICAqIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiBkYXRhIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LAotICAgKiBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIEFuIGVycm9yIGNvZGUgb2YKLSAgICogYXNpbzo6ZXJyb3I6OmVvZiBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZQotICAgKiBwZWVyLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVhZF9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gICAqIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiByZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0Ci0gICAqIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWFkIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBzZXJpYWxfcG9ydC5yZWFkX3NvbWUoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWFkaW5nIGludG8gbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWFkX3NvbWUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZWFkX3NvbWUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInJlYWRfc29tZSIpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHNlcmlhbCBwb3J0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzZXJpYWwgcG9ydC4gVGhlIGZ1bmN0aW9uCi0gICAqIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiBkYXRhIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LAotICAgKiBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJlYWRfc29tZSBvcGVyYXRpb24gbWF5IG5vdCByZWFkIGFsbCBvZiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgotICAgKiBieXRlcy4gQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgcmVhZCBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdAotICAgKiB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQgYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24KLSAgICogY29tcGxldGVzLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVhZF9zb21lKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkucmVhZF9zb21lKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWFkLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlYWQgZGF0YSBmcm9tIHRoZSBzZXJpYWwgcG9ydC4KLSAgICogVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWFkIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YKLSAgICogdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJlYWQgb3BlcmF0aW9uIG1heSBub3QgcmVhZCBhbGwgb2YgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMuCi0gICAqIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIGFzeW5jX3JlYWQgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICAqIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSBpcyByZWFkIGJlZm9yZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWFkIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBzZXJpYWxfcG9ydC5hc3luY19yZWFkX3NvbWUoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWFkaW5nIGludG8gbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICAgIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfcmVhZF9zb21lKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICBidWZmZXJzLCBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NFUklBTF9QT1JUKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX0JBU0lDX1NFUklBTF9QT1JUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3NpZ25hbF9zZXQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3NpZ25hbF9zZXQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzU0OTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19zaWduYWxfc2V0LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vLwotLy8gYmFzaWNfc2lnbmFsX3NldC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fQkFTSUNfU0lHTkFMX1NFVF9IUFAKLSNkZWZpbmUgQVNJT19CQVNJQ19TSUdOQUxfU0VUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9iYXNpY19pb19vYmplY3QuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfdHlwZV9yZXF1aXJlbWVudHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NpZ25hbF9zZXRfc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBQcm92aWRlcyBzaWduYWwgZnVuY3Rpb25hbGl0eS4KLS8qKgotICogVGhlIGJhc2ljX3NpZ25hbF9zZXQgY2xhc3MgdGVtcGxhdGUgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBhbgotICogYXN5bmNocm9ub3VzIHdhaXQgZm9yIG9uZSBvciBtb3JlIHNpZ25hbHMgdG8gb2NjdXIuCi0gKgotICogTW9zdCBhcHBsaWNhdGlvbnMgd2lsbCB1c2UgdGhlIGFzaW86OnNpZ25hbF9zZXQgdHlwZWRlZi4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBQZXJmb3JtaW5nIGFuIGFzeW5jaHJvbm91cyB3YWl0OgotICogQGNvZGUKLSAqIHZvaWQgaGFuZGxlcigKLSAqICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqICAgICBpbnQgc2lnbmFsX251bWJlcikKLSAqIHsKLSAqICAgaWYgKCFlcnJvcikKLSAqICAgewotICogICAgIC8vIEEgc2lnbmFsIG9jY3VycmVkLgotICogICB9Ci0gKiB9Ci0gKgotICogLi4uCi0gKgotICogLy8gQ29uc3RydWN0IGEgc2lnbmFsIHNldCByZWdpc3RlcmVkIGZvciBwcm9jZXNzIHRlcm1pbmF0aW9uLgotICogYXNpbzo6c2lnbmFsX3NldCBzaWduYWxzKGlvX3NlcnZpY2UsIFNJR0lOVCwgU0lHVEVSTSk7Ci0gKgotICogLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdhaXQgZm9yIG9uZSBvZiB0aGUgc2lnbmFscyB0byBvY2N1ci4KLSAqIHNpZ25hbHMuYXN5bmNfd2FpdChoYW5kbGVyKTsKLSAqIEBlbmRjb2RlCi0gKgotICogQHBhciBRdWV1ZWluZyBvZiBzaWduYWwgbm90aWZpY2F0aW9ucwotICoKLSAqIElmIGEgc2lnbmFsIGlzIHJlZ2lzdGVyZWQgd2l0aCBhIHNpZ25hbF9zZXQsIGFuZCB0aGUgc2lnbmFsIG9jY3VycyB3aGVuCi0gKiB0aGVyZSBhcmUgbm8gd2FpdGluZyBoYW5kbGVycywgdGhlbiB0aGUgc2lnbmFsIG5vdGlmaWNhdGlvbiBpcyBxdWV1ZWQuIFRoZQotICogbmV4dCBhc3luY193YWl0IG9wZXJhdGlvbiBvbiB0aGF0IHNpZ25hbF9zZXQgd2lsbCBkZXF1ZXVlIHRoZSBub3RpZmljYXRpb24uCi0gKiBJZiBtdWx0aXBsZSBub3RpZmljYXRpb25zIGFyZSBxdWV1ZWQsIHN1YnNlcXVlbnQgYXN5bmNfd2FpdCBvcGVyYXRpb25zCi0gKiBkZXF1ZXVlIHRoZW0gb25lIGF0IGEgdGltZS4gU2lnbmFsIG5vdGlmaWNhdGlvbnMgYXJlIGRlcXVldWVkIGluIG9yZGVyIG9mCi0gKiBhc2NlbmRpbmcgc2lnbmFsIG51bWJlci4KLSAqCi0gKiBJZiBhIHNpZ25hbCBudW1iZXIgaXMgcmVtb3ZlZCBmcm9tIGEgc2lnbmFsX3NldCAodXNpbmcgdGhlIEBjIHJlbW92ZSBvciBAYwotICogZXJhc2UgbWVtYmVyIGZ1bmN0aW9ucykgdGhlbiBhbnkgcXVldWVkIG5vdGlmaWNhdGlvbnMgZm9yIHRoYXQgc2lnbmFsIGFyZQotICogZGlzY2FyZGVkLgotICoKLSAqIEBwYXIgTXVsdGlwbGUgcmVnaXN0cmF0aW9uIG9mIHNpZ25hbHMKLSAqCi0gKiBUaGUgc2FtZSBzaWduYWwgbnVtYmVyIG1heSBiZSByZWdpc3RlcmVkIHdpdGggZGlmZmVyZW50IHNpZ25hbF9zZXQgb2JqZWN0cy4KLSAqIFdoZW4gdGhlIHNpZ25hbCBvY2N1cnMsIG9uZSBoYW5kbGVyIGlzIGNhbGxlZCBmb3IgZWFjaCBzaWduYWxfc2V0IG9iamVjdC4KLSAqCi0gKiBOb3RlIHRoYXQgbXVsdGlwbGUgcmVnaXN0cmF0aW9uIG9ubHkgd29ya3MgZm9yIHNpZ25hbHMgdGhhdCBhcmUgcmVnaXN0ZXJlZAotICogdXNpbmcgQXNpby4gVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGFsc28gcmVnaXN0ZXIgYSBzaWduYWwgaGFuZGxlciB1c2luZwotICogZnVuY3Rpb25zIHN1Y2ggYXMgQGMgc2lnbmFsKCkgb3IgQGMgc2lnYWN0aW9uKCkuCi0gKgotICogQHBhciBTaWduYWwgbWFza2luZyBvbiBQT1NJWCBwbGF0Zm9ybXMKLSAqCi0gKiBQT1NJWCBhbGxvd3Mgc2lnbmFscyB0byBiZSBibG9ja2VkIHVzaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIEBjIHNpZ3Byb2NtYXNrKCkKLSAqIGFuZCBAYyBwdGhyZWFkX3NpZ21hc2soKS4gRm9yIHNpZ25hbHMgdG8gYmUgZGVsaXZlcmVkLCBwcm9ncmFtcyBtdXN0IGVuc3VyZQotICogdGhhdCBhbnkgc2lnbmFscyByZWdpc3RlcmVkIHVzaW5nIHNpZ25hbF9zZXQgb2JqZWN0cyBhcmUgdW5ibG9ja2VkIGluIGF0Ci0gKiBsZWFzdCBvbmUgdGhyZWFkLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2lnbmFsU2V0U2VydmljZSA9IHNpZ25hbF9zZXRfc2VydmljZT4KLWNsYXNzIGJhc2ljX3NpZ25hbF9zZXQKLSAgOiBwdWJsaWMgYmFzaWNfaW9fb2JqZWN0PFNpZ25hbFNldFNlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gIC8vLyBDb25zdHJ1Y3QgYSBzaWduYWwgc2V0IHdpdGhvdXQgYWRkaW5nIGFueSBzaWduYWxzLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgc2lnbmFsIHNldCB3aXRob3V0IHJlZ2lzdGVyaW5nIGZvciBhbnkgc2lnbmFscy4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHNpZ25hbCBzZXQgd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIHNldC4KLSAgICovCi0gIGV4cGxpY2l0IGJhc2ljX3NpZ25hbF9zZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGJhc2ljX2lvX29iamVjdDxTaWduYWxTZXRTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgc2lnbmFsIHNldCBhbmQgYWRkIG9uZSBzaWduYWwuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBzaWduYWwgc2V0IGFuZCByZWdpc3RlcnMgZm9yIG9uZSBzaWduYWwuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBzaWduYWwgc2V0IHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBzZXQuCi0gICAqCi0gICAqIEBwYXJhbSBzaWduYWxfbnVtYmVyXzEgVGhlIHNpZ25hbCBudW1iZXIgdG8gYmUgYWRkZWQuCi0gICAqCi0gICAqIEBub3RlIFRoaXMgY29uc3RydWN0b3IgaXMgZXF1aXZhbGVudCB0byBwZXJmb3JtaW5nOgotICAgKiBAY29kZSBhc2lvOjpzaWduYWxfc2V0IHNpZ25hbHMoaW9fc2VydmljZSk7Ci0gICAqIHNpZ25hbHMuYWRkKHNpZ25hbF9udW1iZXJfMSk7IEBlbmRjb2RlCi0gICAqLwotICBiYXNpY19zaWduYWxfc2V0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsIGludCBzaWduYWxfbnVtYmVyXzEpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U2lnbmFsU2V0U2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+c2VydmljZS5hZGQodGhpcy0+aW1wbGVtZW50YXRpb24sIHNpZ25hbF9udW1iZXJfMSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJhZGQiKTsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBzaWduYWwgc2V0IGFuZCBhZGQgdHdvIHNpZ25hbHMuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBzaWduYWwgc2V0IGFuZCByZWdpc3RlcnMgZm9yIHR3byBzaWduYWxzLgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgc2lnbmFsIHNldCB3aWxsIHVzZSB0bwotICAgKiBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgc2V0LgotICAgKgotICAgKiBAcGFyYW0gc2lnbmFsX251bWJlcl8xIFRoZSBmaXJzdCBzaWduYWwgbnVtYmVyIHRvIGJlIGFkZGVkLgotICAgKgotICAgKiBAcGFyYW0gc2lnbmFsX251bWJlcl8yIFRoZSBzZWNvbmQgc2lnbmFsIG51bWJlciB0byBiZSBhZGRlZC4KLSAgICoKLSAgICogQG5vdGUgVGhpcyBjb25zdHJ1Y3RvciBpcyBlcXVpdmFsZW50IHRvIHBlcmZvcm1pbmc6Ci0gICAqIEBjb2RlIGFzaW86OnNpZ25hbF9zZXQgc2lnbmFscyhpb19zZXJ2aWNlKTsKLSAgICogc2lnbmFscy5hZGQoc2lnbmFsX251bWJlcl8xKTsKLSAgICogc2lnbmFscy5hZGQoc2lnbmFsX251bWJlcl8yKTsgQGVuZGNvZGUKLSAgICovCi0gIGJhc2ljX3NpZ25hbF9zZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwgaW50IHNpZ25hbF9udW1iZXJfMSwKLSAgICAgIGludCBzaWduYWxfbnVtYmVyXzIpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U2lnbmFsU2V0U2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+c2VydmljZS5hZGQodGhpcy0+aW1wbGVtZW50YXRpb24sIHNpZ25hbF9udW1iZXJfMSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJhZGQiKTsKLSAgICB0aGlzLT5zZXJ2aWNlLmFkZCh0aGlzLT5pbXBsZW1lbnRhdGlvbiwgc2lnbmFsX251bWJlcl8yLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImFkZCIpOwotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIHNpZ25hbCBzZXQgYW5kIGFkZCB0aHJlZSBzaWduYWxzLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgc2lnbmFsIHNldCBhbmQgcmVnaXN0ZXJzIGZvciB0aHJlZSBzaWduYWxzLgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgc2lnbmFsIHNldCB3aWxsIHVzZSB0bwotICAgKiBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgc2V0LgotICAgKgotICAgKiBAcGFyYW0gc2lnbmFsX251bWJlcl8xIFRoZSBmaXJzdCBzaWduYWwgbnVtYmVyIHRvIGJlIGFkZGVkLgotICAgKgotICAgKiBAcGFyYW0gc2lnbmFsX251bWJlcl8yIFRoZSBzZWNvbmQgc2lnbmFsIG51bWJlciB0byBiZSBhZGRlZC4KLSAgICoKLSAgICogQHBhcmFtIHNpZ25hbF9udW1iZXJfMyBUaGUgdGhpcmQgc2lnbmFsIG51bWJlciB0byBiZSBhZGRlZC4KLSAgICoKLSAgICogQG5vdGUgVGhpcyBjb25zdHJ1Y3RvciBpcyBlcXVpdmFsZW50IHRvIHBlcmZvcm1pbmc6Ci0gICAqIEBjb2RlIGFzaW86OnNpZ25hbF9zZXQgc2lnbmFscyhpb19zZXJ2aWNlKTsKLSAgICogc2lnbmFscy5hZGQoc2lnbmFsX251bWJlcl8xKTsKLSAgICogc2lnbmFscy5hZGQoc2lnbmFsX251bWJlcl8yKTsKLSAgICogc2lnbmFscy5hZGQoc2lnbmFsX251bWJlcl8zKTsgQGVuZGNvZGUKLSAgICovCi0gIGJhc2ljX3NpZ25hbF9zZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwgaW50IHNpZ25hbF9udW1iZXJfMSwKLSAgICAgIGludCBzaWduYWxfbnVtYmVyXzIsIGludCBzaWduYWxfbnVtYmVyXzMpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U2lnbmFsU2V0U2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+c2VydmljZS5hZGQodGhpcy0+aW1wbGVtZW50YXRpb24sIHNpZ25hbF9udW1iZXJfMSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJhZGQiKTsKLSAgICB0aGlzLT5zZXJ2aWNlLmFkZCh0aGlzLT5pbXBsZW1lbnRhdGlvbiwgc2lnbmFsX251bWJlcl8yLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImFkZCIpOwotICAgIHRoaXMtPnNlcnZpY2UuYWRkKHRoaXMtPmltcGxlbWVudGF0aW9uLCBzaWduYWxfbnVtYmVyXzMsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiYWRkIik7Ci0gIH0KLQotICAvLy8gQWRkIGEgc2lnbmFsIHRvIGEgc2lnbmFsX3NldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gYWRkcyB0aGUgc3BlY2lmaWVkIHNpZ25hbCB0byB0aGUgc2V0LiBJdCBoYXMgbm8gZWZmZWN0IGlmIHRoZQotICAgKiBzaWduYWwgaXMgYWxyZWFkeSBpbiB0aGUgc2V0LgotICAgKgotICAgKiBAcGFyYW0gc2lnbmFsX251bWJlciBUaGUgc2lnbmFsIHRvIGJlIGFkZGVkIHRvIHRoZSBzZXQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBhZGQoaW50IHNpZ25hbF9udW1iZXIpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPnNlcnZpY2UuYWRkKHRoaXMtPmltcGxlbWVudGF0aW9uLCBzaWduYWxfbnVtYmVyLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImFkZCIpOwotICB9Ci0KLSAgLy8vIEFkZCBhIHNpZ25hbCB0byBhIHNpZ25hbF9zZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgdGhlIHNwZWNpZmllZCBzaWduYWwgdG8gdGhlIHNldC4gSXQgaGFzIG5vIGVmZmVjdCBpZiB0aGUKLSAgICogc2lnbmFsIGlzIGFscmVhZHkgaW4gdGhlIHNldC4KLSAgICoKLSAgICogQHBhcmFtIHNpZ25hbF9udW1iZXIgVGhlIHNpZ25hbCB0byBiZSBhZGRlZCB0byB0aGUgc2V0LgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgYWRkKGludCBzaWduYWxfbnVtYmVyLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+c2VydmljZS5hZGQodGhpcy0+aW1wbGVtZW50YXRpb24sIHNpZ25hbF9udW1iZXIsIGVjKTsKLSAgfQotCi0gIC8vLyBSZW1vdmUgYSBzaWduYWwgZnJvbSBhIHNpZ25hbF9zZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBzaWduYWwgZnJvbSB0aGUgc2V0LiBJdCBoYXMgbm8gZWZmZWN0Ci0gICAqIGlmIHRoZSBzaWduYWwgaXMgbm90IGluIHRoZSBzZXQuCi0gICAqCi0gICAqIEBwYXJhbSBzaWduYWxfbnVtYmVyIFRoZSBzaWduYWwgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBSZW1vdmVzIGFueSBub3RpZmljYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHF1ZXVlZCBmb3IgdGhlIHNwZWNpZmllZAotICAgKiBzaWduYWwgbnVtYmVyLgotICAgKi8KLSAgdm9pZCByZW1vdmUoaW50IHNpZ25hbF9udW1iZXIpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPnNlcnZpY2UucmVtb3ZlKHRoaXMtPmltcGxlbWVudGF0aW9uLCBzaWduYWxfbnVtYmVyLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInJlbW92ZSIpOwotICB9Ci0KLSAgLy8vIFJlbW92ZSBhIHNpZ25hbCBmcm9tIGEgc2lnbmFsX3NldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHNpZ25hbCBmcm9tIHRoZSBzZXQuIEl0IGhhcyBubyBlZmZlY3QKLSAgICogaWYgdGhlIHNpZ25hbCBpcyBub3QgaW4gdGhlIHNldC4KLSAgICoKLSAgICogQHBhcmFtIHNpZ25hbF9udW1iZXIgVGhlIHNpZ25hbCB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNldC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIFJlbW92ZXMgYW55IG5vdGlmaWNhdGlvbnMgdGhhdCBoYXZlIGJlZW4gcXVldWVkIGZvciB0aGUgc3BlY2lmaWVkCi0gICAqIHNpZ25hbCBudW1iZXIuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIHJlbW92ZShpbnQgc2lnbmFsX251bWJlciwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPnNlcnZpY2UucmVtb3ZlKHRoaXMtPmltcGxlbWVudGF0aW9uLCBzaWduYWxfbnVtYmVyLCBlYyk7Ci0gIH0KLQotICAvLy8gUmVtb3ZlIGFsbCBzaWduYWxzIGZyb20gYSBzaWduYWxfc2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFsbCBzaWduYWxzIGZyb20gdGhlIHNldC4gSXQgaGFzIG5vIGVmZmVjdCBpZiB0aGUgc2V0Ci0gICAqIGlzIGFscmVhZHkgZW1wdHkuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBSZW1vdmVzIGFsbCBxdWV1ZWQgbm90aWZpY2F0aW9ucy4KLSAgICovCi0gIHZvaWQgY2xlYXIoKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5zZXJ2aWNlLmNsZWFyKHRoaXMtPmltcGxlbWVudGF0aW9uLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNsZWFyIik7Ci0gIH0KLQotICAvLy8gUmVtb3ZlIGFsbCBzaWduYWxzIGZyb20gYSBzaWduYWxfc2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFsbCBzaWduYWxzIGZyb20gdGhlIHNldC4gSXQgaGFzIG5vIGVmZmVjdCBpZiB0aGUgc2V0Ci0gICAqIGlzIGFscmVhZHkgZW1wdHkuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAbm90ZSBSZW1vdmVzIGFsbCBxdWV1ZWQgbm90aWZpY2F0aW9ucy4KLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgY2xlYXIoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+c2VydmljZS5jbGVhcih0aGlzLT5pbXBsZW1lbnRhdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbGwgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHNpZ25hbCBzZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGZvcmNlcyB0aGUgY29tcGxldGlvbiBvZiBhbnkgcGVuZGluZyBhc3luY2hyb25vdXMgd2FpdAotICAgKiBvcGVyYXRpb25zIGFnYWluc3QgdGhlIHNpZ25hbCBzZXQuIFRoZSBoYW5kbGVyIGZvciBlYWNoIGNhbmNlbGxlZAotICAgKiBvcGVyYXRpb24gd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZAotICAgKiBlcnJvciBjb2RlLgotICAgKgotICAgKiBDYW5jZWxsYXRpb24gZG9lcyBub3QgYWx0ZXIgdGhlIHNldCBvZiByZWdpc3RlcmVkIHNpZ25hbHMuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBJZiBhIHJlZ2lzdGVyZWQgc2lnbmFsIG9jY3VycmVkIGJlZm9yZSBjYW5jZWwoKSBpcyBjYWxsZWQsIHRoZW4gdGhlCi0gICAqIGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgd2FpdCBvcGVyYXRpb25zIHdpbGw6Ci0gICAqCi0gICAqIEBsaSBoYXZlIGFscmVhZHkgYmVlbiBpbnZva2VkOyBvcgotICAgKgotICAgKiBAbGkgaGF2ZSBiZWVuIHF1ZXVlZCBmb3IgaW52b2NhdGlvbiBpbiB0aGUgbmVhciBmdXR1cmUuCi0gICAqCi0gICAqIFRoZXNlIGhhbmRsZXJzIGNhbiBubyBsb25nZXIgYmUgY2FuY2VsbGVkLCBhbmQgdGhlcmVmb3JlIGFyZSBwYXNzZWQgYW4KLSAgICogZXJyb3IgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSB3YWl0IG9wZXJhdGlvbi4KLSAgICovCi0gIHZvaWQgY2FuY2VsKCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+c2VydmljZS5jYW5jZWwodGhpcy0+aW1wbGVtZW50YXRpb24sIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiY2FuY2VsIik7Ci0gIH0KLQotICAvLy8gQ2FuY2VsIGFsbCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmFsIHNldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIHRoZSBjb21wbGV0aW9uIG9mIGFueSBwZW5kaW5nIGFzeW5jaHJvbm91cyB3YWl0Ci0gICAqIG9wZXJhdGlvbnMgYWdhaW5zdCB0aGUgc2lnbmFsIHNldC4gVGhlIGhhbmRsZXIgZm9yIGVhY2ggY2FuY2VsbGVkCi0gICAqIG9wZXJhdGlvbiB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkCi0gICAqIGVycm9yIGNvZGUuCi0gICAqCi0gICAqIENhbmNlbGxhdGlvbiBkb2VzIG5vdCBhbHRlciB0aGUgc2V0IG9mIHJlZ2lzdGVyZWQgc2lnbmFscy4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIElmIGEgcmVnaXN0ZXJlZCBzaWduYWwgb2NjdXJyZWQgYmVmb3JlIGNhbmNlbCgpIGlzIGNhbGxlZCwgdGhlbiB0aGUKLSAgICogaGFuZGxlcnMgZm9yIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbnMgd2lsbDoKLSAgICoKLSAgICogQGxpIGhhdmUgYWxyZWFkeSBiZWVuIGludm9rZWQ7IG9yCi0gICAqCi0gICAqIEBsaSBoYXZlIGJlZW4gcXVldWVkIGZvciBpbnZvY2F0aW9uIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICoKLSAgICogVGhlc2UgaGFuZGxlcnMgY2FuIG5vIGxvbmdlciBiZSBjYW5jZWxsZWQsIGFuZCB0aGVyZWZvcmUgYXJlIHBhc3NlZCBhbgotICAgKiBlcnJvciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHdhaXQgb3BlcmF0aW9uLgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+c2VydmljZS5jYW5jZWwodGhpcy0+aW1wbGVtZW50YXRpb24sIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHdhaXQgZm9yIGEgc2lnbmFsIHRvIGJlIGRlbGl2ZXJlZC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gaW5pdGlhdGUgYW4gYXN5bmNocm9ub3VzIHdhaXQgYWdhaW5zdCB0aGUKLSAgICogc2lnbmFsIHNldC4gSXQgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEZvciBlYWNoIGNhbGwgdG8gYXN5bmNfd2FpdCgpLCB0aGUgc3VwcGxpZWQgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBleGFjdGx5Ci0gICAqIG9uY2UuIFRoZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdoZW46Ci0gICAqCi0gICAqIEBsaSBPbmUgb2YgdGhlIHJlZ2lzdGVyZWQgc2lnbmFscyBpbiB0aGUgc2lnbmFsIHNldCBvY2N1cnM7IG9yCi0gICAqCi0gICAqIEBsaSBUaGUgc2lnbmFsIHNldCB3YXMgY2FuY2VsbGVkLCBpbiB3aGljaCBjYXNlIHRoZSBoYW5kbGVyIGlzIHBhc3NlZCB0aGUKLSAgICogZXJyb3IgY29kZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzaWduYWwgb2NjdXJzLiBDb3BpZXMKLSAgICogd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZQotICAgKiBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBpbnQgc2lnbmFsX251bWJlciAvLyBJbmRpY2F0ZXMgd2hpY2ggc2lnbmFsIG9jY3VycmVkLgotICAgKiApOyBAZW5kY29kZQotICAgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gICAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gICAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNpZ25hbEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFNpZ25hbEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBpbnQpKQotICBhc3luY193YWl0KEFTSU9fTU9WRV9BUkcoU2lnbmFsSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBTaWduYWxIYW5kbGVyLgotICAgIEFTSU9fU0lHTkFMX0hBTkRMRVJfQ0hFQ0soU2lnbmFsSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLmFzeW5jX3dhaXQodGhpcy0+aW1wbGVtZW50YXRpb24sCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFNpZ25hbEhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19CQVNJQ19TSUdOQUxfU0VUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3NvY2tldC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc29ja2V0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4MGJkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc29ja2V0LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MTggKzAsMCBAQAotLy8KLS8vIGJhc2ljX3NvY2tldC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19CQVNJQ19TT0NLRVRfSFBQCi0jZGVmaW5lIEFTSU9fQkFTSUNfU09DS0VUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2Jhc2ljX2lvX29iamVjdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3R5cGVfdHJhaXRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NvY2tldF9iYXNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIFByb3ZpZGVzIHNvY2tldCBmdW5jdGlvbmFsaXR5LgotLyoqCi0gKiBUaGUgYmFzaWNfc29ja2V0IGNsYXNzIHRlbXBsYXRlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBjb21tb24gdG8gYm90aAotICogc3RyZWFtLW9yaWVudGVkIGFuZCBkYXRhZ3JhbS1vcmllbnRlZCBzb2NrZXRzLgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlPgotY2xhc3MgYmFzaWNfc29ja2V0Ci0gIDogcHVibGljIGJhc2ljX2lvX29iamVjdDxTb2NrZXRTZXJ2aWNlPiwKLSAgICBwdWJsaWMgc29ja2V0X2Jhc2UKLXsKLXB1YmxpYzoKLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZV90eXBlLikgVGhlIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZiBhCi0gIC8vLyBzb2NrZXQuCi0gIHR5cGVkZWYgdHlwZW5hbWUgU29ja2V0U2VydmljZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV90eXBlOwotCi0gIC8vLyBUaGUgbmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mIGEgc29ja2V0LgotICB0eXBlZGVmIHR5cGVuYW1lIFNvY2tldFNlcnZpY2U6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgLy8vIFRoZSBwcm90b2NvbCB0eXBlLgotICB0eXBlZGVmIFByb3RvY29sIHByb3RvY29sX3R5cGU7Ci0KLSAgLy8vIFRoZSBlbmRwb2ludCB0eXBlLgotICB0eXBlZGVmIHR5cGVuYW1lIFByb3RvY29sOjplbmRwb2ludCBlbmRwb2ludF90eXBlOwotCi0gIC8vLyBBIGJhc2ljX3NvY2tldCBpcyBhbHdheXMgdGhlIGxvd2VzdCBsYXllci4KLSAgdHlwZWRlZiBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+IGxvd2VzdF9sYXllcl90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19zb2NrZXQgd2l0aG91dCBvcGVuaW5nIGl0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgc29ja2V0IHdpdGhvdXQgb3BlbmluZyBpdC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHNvY2tldCB3aWxsIHVzZSB0bwotICAgKiBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgc29ja2V0LgotICAgKi8KLSAgZXhwbGljaXQgYmFzaWNfc29ja2V0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U29ja2V0U2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbmQgb3BlbiBhIGJhc2ljX3NvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhbmQgb3BlbnMgYSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBzb2NrZXQgd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHByb3RvY29sIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHByb3RvY29sIHBhcmFtZXRlcnMgdG8gYmUgdXNlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICBiYXNpY19zb2NrZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwKLSAgICAgIGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sKQotICAgIDogYmFzaWNfaW9fb2JqZWN0PFNvY2tldFNlcnZpY2U+KGlvX3NlcnZpY2UpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkub3Blbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgcHJvdG9jb2wsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAib3BlbiIpOwotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX3NvY2tldCwgb3BlbmluZyBpdCBhbmQgYmluZGluZyBpdCB0byB0aGUgZ2l2ZW4gbG9jYWwKLSAgLy8vIGVuZHBvaW50LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgc29ja2V0IGFuZCBhdXRvbWF0aWNhbGx5IG9wZW5zIGl0IGJvdW5kIHRvIHRoZQotICAgKiBzcGVjaWZpZWQgZW5kcG9pbnQgb24gdGhlIGxvY2FsIG1hY2hpbmUuIFRoZSBwcm90b2NvbCB1c2VkIGlzIHRoZSBwcm90b2NvbAotICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGVuZHBvaW50LgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgc29ja2V0IHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBlbmRwb2ludCBBbiBlbmRwb2ludCBvbiB0aGUgbG9jYWwgbWFjaGluZSB0byB3aGljaCB0aGUgc29ja2V0IHdpbGwKLSAgICogYmUgYm91bmQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgYmFzaWNfc29ja2V0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCkKLSAgICA6IGJhc2ljX2lvX29iamVjdDxTb2NrZXRTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBjb25zdCBwcm90b2NvbF90eXBlIHByb3RvY29sID0gZW5kcG9pbnQucHJvdG9jb2woKTsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLm9wZW4odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIHByb3RvY29sLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIm9wZW4iKTsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmJpbmQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVuZHBvaW50LCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImJpbmQiKTsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19zb2NrZXQgb24gYW4gZXhpc3RpbmcgbmF0aXZlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIHNvY2tldCBvYmplY3QgdG8gaG9sZCBhbiBleGlzdGluZyBuYXRpdmUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgc29ja2V0IHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBwcm90b2NvbCBBbiBvYmplY3Qgc3BlY2lmeWluZyBwcm90b2NvbCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBuYXRpdmVfc29ja2V0IEEgbmF0aXZlIHNvY2tldC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICBiYXNpY19zb2NrZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwKLSAgICAgIGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sLCBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIG5hdGl2ZV9zb2NrZXQpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U29ja2V0U2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3NpZ24odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIHByb3RvY29sLCBuYXRpdmVfc29ja2V0LCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImFzc2lnbiIpOwotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBiYXNpY19zb2NrZXQgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhIHNvY2tldCBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19zb2NrZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUgd2lsbAotICAgKiBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3NvY2tldChpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICBiYXNpY19zb2NrZXQoYmFzaWNfc29ja2V0JiYgb3RoZXIpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U29ja2V0U2VydmljZT4oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX3NvY2tldCkob3RoZXIpKQotICB7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gYSBiYXNpY19zb2NrZXQgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBhc3NpZ25tZW50IG9wZXJhdG9yIG1vdmVzIGEgc29ja2V0IGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3NvY2tldCBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZSB3aWxsCi0gICAqIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfc29ja2V0KGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIGJhc2ljX3NvY2tldCYgb3BlcmF0b3I9KGJhc2ljX3NvY2tldCYmIG90aGVyKQotICB7Ci0gICAgYmFzaWNfaW9fb2JqZWN0PFNvY2tldFNlcnZpY2U+OjpvcGVyYXRvcj0oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX3NvY2tldCkob3RoZXIpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBBbGwgc29ja2V0cyBoYXZlIGFjY2VzcyB0byBlYWNoIG90aGVyJ3MgaW1wbGVtZW50YXRpb25zLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlMT4KLSAgZnJpZW5kIGNsYXNzIGJhc2ljX3NvY2tldDsKLQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBiYXNpY19zb2NrZXQgZnJvbSBhIHNvY2tldCBvZiBhbm90aGVyIHByb3RvY29sIHR5cGUuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIG1vdmVzIGEgc29ja2V0IGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3NvY2tldCBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZSB3aWxsCi0gICAqIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfc29ja2V0KGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbDEsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UxPgotICBiYXNpY19zb2NrZXQoYmFzaWNfc29ja2V0PFByb3RvY29sMSwgU29ja2V0U2VydmljZTE+JiYgb3RoZXIsCi0gICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8UHJvdG9jb2wxLCBQcm90b2NvbD46OnZhbHVlPjo6dHlwZSogPSAwKQotICAgIDogYmFzaWNfaW9fb2JqZWN0PFNvY2tldFNlcnZpY2U+KG90aGVyLmdldF9pb19zZXJ2aWNlKCkpCi0gIHsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLnRlbXBsYXRlIGNvbnZlcnRpbmdfbW92ZV9jb25zdHJ1Y3Q8UHJvdG9jb2wxPigKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG90aGVyLmdldF9pbXBsZW1lbnRhdGlvbigpKTsKLSAgfQotCi0gIC8vLyBNb3ZlLWFzc2lnbiBhIGJhc2ljX3NvY2tldCBmcm9tIGEgc29ja2V0IG9mIGFub3RoZXIgcHJvdG9jb2wgdHlwZS4KLSAgLyoqCi0gICAqIFRoaXMgYXNzaWdubWVudCBvcGVyYXRvciBtb3ZlcyBhIHNvY2tldCBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19zb2NrZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUgd2lsbAotICAgKiBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3NvY2tldChpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlMT4KLSAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPFByb3RvY29sMSwgUHJvdG9jb2w+Ojp2YWx1ZSwKLSAgICAgIGJhc2ljX3NvY2tldD46OnR5cGUmIG9wZXJhdG9yPSgKLSAgICAgICAgYmFzaWNfc29ja2V0PFByb3RvY29sMSwgU29ja2V0U2VydmljZTE+JiYgb3RoZXIpCi0gIHsKLSAgICBiYXNpY19zb2NrZXQgdG1wKEFTSU9fTU9WRV9DQVNUMihiYXNpY19zb2NrZXQ8Ci0gICAgICAgICAgICBQcm90b2NvbDEsIFNvY2tldFNlcnZpY2UxPikob3RoZXIpKTsKLSAgICBiYXNpY19pb19vYmplY3Q8U29ja2V0U2VydmljZT46Om9wZXJhdG9yPSgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoYmFzaWNfc29ja2V0KSh0bXApKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0gIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIGEgc3RhY2sgb2YKLSAgICogbGF5ZXJzLiBTaW5jZSBhIGJhc2ljX3NvY2tldCBjYW5ub3QgY29udGFpbiBhbnkgZnVydGhlciBsYXllcnMsIGl0IHNpbXBseQotICAgKiByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KLSAgICoKLSAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIHRoZSBzdGFjayBvZiBsYXllcnMuIE93bmVyc2hpcAotICAgKiBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlci4KLSAgICovCi0gIGxvd2VzdF9sYXllcl90eXBlJiBsb3dlc3RfbGF5ZXIoKQotICB7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8vIEdldCBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIgaW4gYSBzdGFjayBvZgotICAgKiBsYXllcnMuIFNpbmNlIGEgYmFzaWNfc29ja2V0IGNhbm5vdCBjb250YWluIGFueSBmdXJ0aGVyIGxheWVycywgaXQgc2ltcGx5Ci0gICAqIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgotICAgKgotICAgKiBAcmV0dXJuIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIgaW4gdGhlIHN0YWNrIG9mIGxheWVycy4KLSAgICogT3duZXJzaGlwIGlzIG5vdCB0cmFuc2ZlcnJlZCB0byB0aGUgY2FsbGVyLgotICAgKi8KLSAgY29uc3QgbG93ZXN0X2xheWVyX3R5cGUmIGxvd2VzdF9sYXllcigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLy8gT3BlbiB0aGUgc29ja2V0IHVzaW5nIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBzb2NrZXQgc28gdGhhdCBpdCB3aWxsIHVzZSB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgotICAgKgotICAgKiBAcGFyYW0gcHJvdG9jb2wgQW4gb2JqZWN0IHNwZWNpZnlpbmcgcHJvdG9jb2wgcGFyYW1ldGVycyB0byBiZSB1c2VkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7Ci0gICAqIHNvY2tldC5vcGVuKGFzaW86OmlwOjp0Y3A6OnY0KCkpOwotICAgKiBAZW5kY29kZQotICAgKi8KLSAgdm9pZCBvcGVuKGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sID0gcHJvdG9jb2xfdHlwZSgpKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLm9wZW4odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIHByb3RvY29sLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIm9wZW4iKTsKLSAgfQotCi0gIC8vLyBPcGVuIHRoZSBzb2NrZXQgdXNpbmcgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHNvY2tldCBzbyB0aGF0IGl0IHdpbGwgdXNlIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCi0gICAqCi0gICAqIEBwYXJhbSBwcm90b2NvbCBBbiBvYmplY3Qgc3BlY2lmeWluZyB3aGljaCBwcm90b2NvbCBpcyB0byBiZSB1c2VkLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7Ci0gICAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAqIHNvY2tldC5vcGVuKGFzaW86OmlwOjp0Y3A6OnY0KCksIGVjKTsKLSAgICogaWYgKGVjKQotICAgKiB7Ci0gICAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqIH0KLSAgICogQGVuZGNvZGUKLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgb3Blbihjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkub3Blbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgcHJvdG9jb2wsIGVjKTsKLSAgfQotCi0gIC8vLyBBc3NpZ24gYW4gZXhpc3RpbmcgbmF0aXZlIHNvY2tldCB0byB0aGUgc29ja2V0LgotICAvKgotICAgKiBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBzb2NrZXQgdG8gaG9sZCBhbiBleGlzdGluZyBuYXRpdmUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gcHJvdG9jb2wgQW4gb2JqZWN0IHNwZWNpZnlpbmcgd2hpY2ggcHJvdG9jb2wgaXMgdG8gYmUgdXNlZC4KLSAgICoKLSAgICogQHBhcmFtIG5hdGl2ZV9zb2NrZXQgQSBuYXRpdmUgc29ja2V0LgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIHZvaWQgYXNzaWduKGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sLAotICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBuYXRpdmVfc29ja2V0KQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmFzc2lnbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgcHJvdG9jb2wsIG5hdGl2ZV9zb2NrZXQsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiYXNzaWduIik7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBzb2NrZXQgdG8gdGhlIHNvY2tldC4KLSAgLyoKLSAgICogVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgc29ja2V0IHRvIGhvbGQgYW4gZXhpc3RpbmcgbmF0aXZlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHByb3RvY29sIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHdoaWNoIHByb3RvY29sIGlzIHRvIGJlIHVzZWQuCi0gICAqCi0gICAqIEBwYXJhbSBuYXRpdmVfc29ja2V0IEEgbmF0aXZlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwKLSAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX3NvY2tldCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3NpZ24odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIHByb3RvY29sLCBuYXRpdmVfc29ja2V0LCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBvcGVuLgotICBib29sIGlzX29wZW4oKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuaXNfb3Blbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSk7Ci0gIH0KLQotICAvLy8gQ2xvc2UgdGhlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbG9zZSB0aGUgc29ja2V0LiBBbnkgYXN5bmNocm9ub3VzIHNlbmQsIHJlY2VpdmUKLSAgICogb3IgY29ubmVjdCBvcGVyYXRpb25zIHdpbGwgYmUgY2FuY2VsbGVkIGltbWVkaWF0ZWx5LCBhbmQgd2lsbCBjb21wbGV0ZQotICAgKiB3aXRoIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLiBOb3RlIHRoYXQsIGV2ZW4gaWYKLSAgICogdGhlIGZ1bmN0aW9uIGluZGljYXRlcyBhbiBlcnJvciwgdGhlIHVuZGVybHlpbmcgZGVzY3JpcHRvciBpcyBjbG9zZWQuCi0gICAqCi0gICAqIEBub3RlIEZvciBwb3J0YWJsZSBiZWhhdmlvdXIgd2l0aCByZXNwZWN0IHRvIGdyYWNlZnVsIGNsb3N1cmUgb2YgYQotICAgKiBjb25uZWN0ZWQgc29ja2V0LCBjYWxsIHNodXRkb3duKCkgYmVmb3JlIGNsb3NpbmcgdGhlIHNvY2tldC4KLSAgICovCi0gIHZvaWQgY2xvc2UoKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmNsb3NlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNsb3NlIik7Ci0gIH0KLQotICAvLy8gQ2xvc2UgdGhlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbG9zZSB0aGUgc29ja2V0LiBBbnkgYXN5bmNocm9ub3VzIHNlbmQsIHJlY2VpdmUKLSAgICogb3IgY29ubmVjdCBvcGVyYXRpb25zIHdpbGwgYmUgY2FuY2VsbGVkIGltbWVkaWF0ZWx5LCBhbmQgd2lsbCBjb21wbGV0ZQotICAgKiB3aXRoIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LiBOb3RlIHRoYXQsIGV2ZW4gaWYKLSAgICogdGhlIGZ1bmN0aW9uIGluZGljYXRlcyBhbiBlcnJvciwgdGhlIHVuZGVybHlpbmcgZGVzY3JpcHRvciBpcyBjbG9zZWQuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOwotICAgKiAuLi4KLSAgICogYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICogc29ja2V0LmNsb3NlKGVjKTsKLSAgICogaWYgKGVjKQotICAgKiB7Ci0gICAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqIH0KLSAgICogQGVuZGNvZGUKLSAgICoKLSAgICogQG5vdGUgRm9yIHBvcnRhYmxlIGJlaGF2aW91ciB3aXRoIHJlc3BlY3QgdG8gZ3JhY2VmdWwgY2xvc3VyZSBvZiBhCi0gICAqIGNvbm5lY3RlZCBzb2NrZXQsIGNhbGwgc2h1dGRvd24oKSBiZWZvcmUgY2xvc2luZyB0aGUgc29ja2V0LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBjbG9zZShhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmNsb3NlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gIH0KLQotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlKCkuKSBHZXQgdGhlIG5hdGl2ZSBzb2NrZXQgcmVwcmVzZW50YXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIG9idGFpbiB0aGUgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICogc29ja2V0LiBUaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGFjY2VzcyB0byBuYXRpdmUgc29ja2V0IGZ1bmN0aW9uYWxpdHkKLSAgICogdGhhdCBpcyBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkLgotICAgKi8KLSAgbmF0aXZlX3R5cGUgbmF0aXZlKCkKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLm5hdGl2ZV9oYW5kbGUodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCkpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbmF0aXZlIHNvY2tldCByZXByZXNlbnRhdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgKiBzb2NrZXQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWxsb3cgYWNjZXNzIHRvIG5hdGl2ZSBzb2NrZXQgZnVuY3Rpb25hbGl0eQotICAgKiB0aGF0IGlzIG5vdCBvdGhlcndpc2UgcHJvdmlkZWQuCi0gICAqLwotICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfaGFuZGxlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpKTsKLSAgfQotCi0gIC8vLyBDYW5jZWwgYWxsIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBjYXVzZXMgYWxsIG91dHN0YW5kaW5nIGFzeW5jaHJvbm91cyBjb25uZWN0LCBzZW5kIGFuZCByZWNlaXZlCi0gICAqIG9wZXJhdGlvbnMgdG8gZmluaXNoIGltbWVkaWF0ZWx5LCBhbmQgdGhlIGhhbmRsZXJzIGZvciBjYW5jZWxsZWQgb3BlcmF0aW9ucwotICAgKiB3aWxsIGJlIHBhc3NlZCB0aGUgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgdG8gY2FuY2VsKCkgd2lsbCBhbHdheXMgZmFpbCB3aXRoCi0gICAqIGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZCB3aGVuIHJ1biBvbiBXaW5kb3dzIFhQLCBXaW5kb3dzCi0gICAqIFNlcnZlciAyMDAzLCBhbmQgZWFybGllciB2ZXJzaW9ucyBvZiBXaW5kb3dzLCB1bmxlc3MKLSAgICogQVNJT19FTkFCTEVfQ0FOQ0VMSU8gaXMgZGVmaW5lZC4gSG93ZXZlciwgdGhlIENhbmNlbElvIGZ1bmN0aW9uIGhhcwotICAgKiB0d28gaXNzdWVzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYmVmb3JlIGVuYWJsaW5nIGl0cyB1c2U6Ci0gICAqCi0gICAqIEBsaSBJdCB3aWxsIG9ubHkgY2FuY2VsIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgd2VyZSBpbml0aWF0ZWQgaW4gdGhlCi0gICAqIGN1cnJlbnQgdGhyZWFkLgotICAgKgotICAgKiBAbGkgSXQgY2FuIGFwcGVhciB0byBjb21wbGV0ZSB3aXRob3V0IGVycm9yLCBidXQgdGhlIHJlcXVlc3QgdG8gY2FuY2VsIHRoZQotICAgKiB1bmZpbmlzaGVkIG9wZXJhdGlvbnMgbWF5IGJlIHNpbGVudGx5IGlnbm9yZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uCi0gICAqIFdoZXRoZXIgaXQgd29ya3Mgb3Igbm90IHNlZW1zIHRvIGRlcGVuZCBvbiB0aGUgZHJpdmVycyB0aGF0IGFyZSBpbnN0YWxsZWQuCi0gICAqCi0gICAqIEZvciBwb3J0YWJsZSBjYW5jZWxsYXRpb24sIGNvbnNpZGVyIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nCi0gICAqIGFsdGVybmF0aXZlczoKLSAgICoKLSAgICogQGxpIERpc2FibGUgYXNpbydzIEkvTyBjb21wbGV0aW9uIHBvcnQgYmFja2VuZCBieSBkZWZpbmluZwotICAgKiBBU0lPX0RJU0FCTEVfSU9DUC4KLSAgICoKLSAgICogQGxpIFVzZSB0aGUgY2xvc2UoKSBmdW5jdGlvbiB0byBzaW11bHRhbmVvdXNseSBjYW5jZWwgdGhlIG91dHN0YW5kaW5nCi0gICAqIG9wZXJhdGlvbnMgYW5kIGNsb3NlIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIFdoZW4gcnVubmluZyBvbiBXaW5kb3dzIFZpc3RhLCBXaW5kb3dzIFNlcnZlciAyMDA4LCBhbmQgbGF0ZXIsIHRoZQotICAgKiBDYW5jZWxJb0V4IGZ1bmN0aW9uIGlzIGFsd2F5cyB1c2VkLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdGhlCi0gICAqIHByb2JsZW1zIGRlc2NyaWJlZCBhYm92ZS4KLSAgICovCi0jaWYgZGVmaW5lZChBU0lPX01TVkMpICYmIChBU0lPX01TVkMgPj0gMTQwMCkgXAotICAmJiAoIWRlZmluZWQoX1dJTjMyX1dJTk5UKSB8fCBfV0lOMzJfV0lOTlQgPCAweDA2MDApIFwKLSAgJiYgIWRlZmluZWQoQVNJT19FTkFCTEVfQ0FOQ0VMSU8pCi0gIF9fZGVjbHNwZWMoZGVwcmVjYXRlZCgiQnkgZGVmYXVsdCwgdGhpcyBmdW5jdGlvbiBhbHdheXMgZmFpbHMgd2l0aCAiCi0gICAgICAgICJvcGVyYXRpb25fbm90X3N1cHBvcnRlZCB3aGVuIHVzZWQgb24gV2luZG93cyBYUCwgV2luZG93cyBTZXJ2ZXIgMjAwMywgIgotICAgICAgICAib3IgZWFybGllci4gQ29uc3VsdCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLiIpKQotI2VuZGlmCi0gIHZvaWQgY2FuY2VsKCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5jYW5jZWwodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiY2FuY2VsIik7Ci0gIH0KLQotICAvLy8gQ2FuY2VsIGFsbCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gY2F1c2VzIGFsbCBvdXRzdGFuZGluZyBhc3luY2hyb25vdXMgY29ubmVjdCwgc2VuZCBhbmQgcmVjZWl2ZQotICAgKiBvcGVyYXRpb25zIHRvIGZpbmlzaCBpbW1lZGlhdGVseSwgYW5kIHRoZSBoYW5kbGVycyBmb3IgY2FuY2VsbGVkIG9wZXJhdGlvbnMKLSAgICogd2lsbCBiZSBwYXNzZWQgdGhlIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvci4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIHRvIGNhbmNlbCgpIHdpbGwgYWx3YXlzIGZhaWwgd2l0aAotICAgKiBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQgd2hlbiBydW4gb24gV2luZG93cyBYUCwgV2luZG93cwotICAgKiBTZXJ2ZXIgMjAwMywgYW5kIGVhcmxpZXIgdmVyc2lvbnMgb2YgV2luZG93cywgdW5sZXNzCi0gICAqIEFTSU9fRU5BQkxFX0NBTkNFTElPIGlzIGRlZmluZWQuIEhvd2V2ZXIsIHRoZSBDYW5jZWxJbyBmdW5jdGlvbiBoYXMKLSAgICogdHdvIGlzc3VlcyB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGJlZm9yZSBlbmFibGluZyBpdHMgdXNlOgotICAgKgotICAgKiBAbGkgSXQgd2lsbCBvbmx5IGNhbmNlbCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB0aGF0IHdlcmUgaW5pdGlhdGVkIGluIHRoZQotICAgKiBjdXJyZW50IHRocmVhZC4KLSAgICoKLSAgICogQGxpIEl0IGNhbiBhcHBlYXIgdG8gY29tcGxldGUgd2l0aG91dCBlcnJvciwgYnV0IHRoZSByZXF1ZXN0IHRvIGNhbmNlbCB0aGUKLSAgICogdW5maW5pc2hlZCBvcGVyYXRpb25zIG1heSBiZSBzaWxlbnRseSBpZ25vcmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLgotICAgKiBXaGV0aGVyIGl0IHdvcmtzIG9yIG5vdCBzZWVtcyB0byBkZXBlbmQgb24gdGhlIGRyaXZlcnMgdGhhdCBhcmUgaW5zdGFsbGVkLgotICAgKgotICAgKiBGb3IgcG9ydGFibGUgY2FuY2VsbGF0aW9uLCBjb25zaWRlciB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZwotICAgKiBhbHRlcm5hdGl2ZXM6Ci0gICAqCi0gICAqIEBsaSBEaXNhYmxlIGFzaW8ncyBJL08gY29tcGxldGlvbiBwb3J0IGJhY2tlbmQgYnkgZGVmaW5pbmcKLSAgICogQVNJT19ESVNBQkxFX0lPQ1AuCi0gICAqCi0gICAqIEBsaSBVc2UgdGhlIGNsb3NlKCkgZnVuY3Rpb24gdG8gc2ltdWx0YW5lb3VzbHkgY2FuY2VsIHRoZSBvdXRzdGFuZGluZwotICAgKiBvcGVyYXRpb25zIGFuZCBjbG9zZSB0aGUgc29ja2V0LgotICAgKgotICAgKiBXaGVuIHJ1bm5pbmcgb24gV2luZG93cyBWaXN0YSwgV2luZG93cyBTZXJ2ZXIgMjAwOCwgYW5kIGxhdGVyLCB0aGUKLSAgICogQ2FuY2VsSW9FeCBmdW5jdGlvbiBpcyBhbHdheXMgdXNlZC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRoZQotICAgKiBwcm9ibGVtcyBkZXNjcmliZWQgYWJvdmUuCi0gICAqLwotI2lmIGRlZmluZWQoQVNJT19NU1ZDKSAmJiAoQVNJT19NU1ZDID49IDE0MDApIFwKLSAgJiYgKCFkZWZpbmVkKF9XSU4zMl9XSU5OVCkgfHwgX1dJTjMyX1dJTk5UIDwgMHgwNjAwKSBcCi0gICYmICFkZWZpbmVkKEFTSU9fRU5BQkxFX0NBTkNFTElPKQotICBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQoIkJ5IGRlZmF1bHQsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIGZhaWxzIHdpdGggIgotICAgICAgICAib3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQgd2hlbiB1c2VkIG9uIFdpbmRvd3MgWFAsIFdpbmRvd3MgU2VydmVyIDIwMDMsICIKLSAgICAgICAgIm9yIGVhcmxpZXIuIENvbnN1bHQgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4iKSkKLSNlbmRpZgotICBhc2lvOjplcnJvcl9jb2RlIGNhbmNlbChhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmNhbmNlbCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgYXQgdGhlIG91dC1vZi1iYW5kIGRhdGEgbWFyay4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBzb2NrZXQgaW5wdXQgaXMgY3VycmVudGx5Ci0gICAqIHBvc2l0aW9uZWQgYXQgdGhlIG91dC1vZi1iYW5kIGRhdGEgbWFyay4KLSAgICoKLSAgICogQHJldHVybiBBIGJvb2wgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgYXQgdGhlIG91dC1vZi1iYW5kIGRhdGEKLSAgICogbWFyay4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICBib29sIGF0X21hcmsoKSBjb25zdAotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBib29sIGIgPSB0aGlzLT5nZXRfc2VydmljZSgpLmF0X21hcmsodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiYXRfbWFyayIpOwotICAgIHJldHVybiBiOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgYXQgdGhlIG91dC1vZi1iYW5kIGRhdGEgbWFyay4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBzb2NrZXQgaW5wdXQgaXMgY3VycmVudGx5Ci0gICAqIHBvc2l0aW9uZWQgYXQgdGhlIG91dC1vZi1iYW5kIGRhdGEgbWFyay4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm4gQSBib29sIGluZGljYXRpbmcgd2hldGhlciB0aGUgc29ja2V0IGlzIGF0IHRoZSBvdXQtb2YtYmFuZCBkYXRhCi0gICAqIG1hcmsuCi0gICAqLwotICBib29sIGF0X21hcmsoYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hdF9tYXJrKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGZvciByZWFkaW5nLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5IGJlIHJlYWQKLSAgICogd2l0aG91dCBibG9ja2luZy4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5IGJlIHJlYWQgd2l0aG91dCBibG9ja2luZywgb3IgMCBpZiBhbgotICAgKiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgc3RkOjpzaXplX3QgYXZhaWxhYmxlKCkgY29uc3QKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPmdldF9zZXJ2aWNlKCkuYXZhaWxhYmxlKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJhdmFpbGFibGUiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkgYmUgcmVhZAotICAgKiB3aXRob3V0IGJsb2NraW5nLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5IGJlIHJlYWQgd2l0aG91dCBibG9ja2luZywgb3IgMCBpZiBhbgotICAgKiBlcnJvciBvY2N1cnMuCi0gICAqLwotICBzdGQ6OnNpemVfdCBhdmFpbGFibGUoYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hdmFpbGFibGUodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgfQotCi0gIC8vLyBCaW5kIHRoZSBzb2NrZXQgdG8gdGhlIGdpdmVuIGxvY2FsIGVuZHBvaW50LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBiaW5kcyB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgb24gdGhlIGxvY2FsCi0gICAqIG1hY2hpbmUuCi0gICAqCi0gICAqIEBwYXJhbSBlbmRwb2ludCBBbiBlbmRwb2ludCBvbiB0aGUgbG9jYWwgbWFjaGluZSB0byB3aGljaCB0aGUgc29ja2V0IHdpbGwKLSAgICogYmUgYm91bmQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogc29ja2V0Lm9wZW4oYXNpbzo6aXA6OnRjcDo6djQoKSk7Ci0gICAqIHNvY2tldC5iaW5kKGFzaW86OmlwOjp0Y3A6OmVuZHBvaW50KAotICAgKiAgICAgICBhc2lvOjppcDo6dGNwOjp2NCgpLCAxMjM0NSkpOwotICAgKiBAZW5kY29kZQotICAgKi8KLSAgdm9pZCBiaW5kKGNvbnN0IGVuZHBvaW50X3R5cGUmIGVuZHBvaW50KQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmJpbmQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVuZHBvaW50LCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImJpbmQiKTsKLSAgfQotCi0gIC8vLyBCaW5kIHRoZSBzb2NrZXQgdG8gdGhlIGdpdmVuIGxvY2FsIGVuZHBvaW50LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBiaW5kcyB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgb24gdGhlIGxvY2FsCi0gICAqIG1hY2hpbmUuCi0gICAqCi0gICAqIEBwYXJhbSBlbmRwb2ludCBBbiBlbmRwb2ludCBvbiB0aGUgbG9jYWwgbWFjaGluZSB0byB3aGljaCB0aGUgc29ja2V0IHdpbGwKLSAgICogYmUgYm91bmQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogc29ja2V0Lm9wZW4oYXNpbzo6aXA6OnRjcDo6djQoKSk7Ci0gICAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAqIHNvY2tldC5iaW5kKGFzaW86OmlwOjp0Y3A6OmVuZHBvaW50KAotICAgKiAgICAgICBhc2lvOjppcDo6dGNwOjp2NCgpLCAxMjM0NSksIGVjKTsKLSAgICogaWYgKGVjKQotICAgKiB7Ci0gICAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqIH0KLSAgICogQGVuZGNvZGUKLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgYmluZChjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYmluZCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZW5kcG9pbnQsIGVjKTsKLSAgfQotCi0gIC8vLyBDb25uZWN0IHRoZSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBlbmRwb2ludC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjb25uZWN0IGEgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGVuZHBvaW50LgotICAgKiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBtYWRlIG9yCi0gICAqIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogVGhlIHNvY2tldCBpcyBhdXRvbWF0aWNhbGx5IG9wZW5lZCBpZiBpdCBpcyBub3QgYWxyZWFkeSBvcGVuLiBJZiB0aGUKLSAgICogY29ubmVjdCBmYWlscywgYW5kIHRoZSBzb2NrZXQgd2FzIGF1dG9tYXRpY2FsbHkgb3BlbmVkLCB0aGUgc29ja2V0IGlzCi0gICAqIG5vdCByZXR1cm5lZCB0byB0aGUgY2xvc2VkIHN0YXRlLgotICAgKgotICAgKiBAcGFyYW0gcGVlcl9lbmRwb2ludCBUaGUgcmVtb3RlIGVuZHBvaW50IHRvIHdoaWNoIHRoZSBzb2NrZXQgd2lsbCBiZQotICAgKiBjb25uZWN0ZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogYXNpbzo6aXA6OnRjcDo6ZW5kcG9pbnQgZW5kcG9pbnQoCi0gICAqICAgICBhc2lvOjppcDo6YWRkcmVzczo6ZnJvbV9zdHJpbmcoIjEuMi4zLjQiKSwgMTIzNDUpOwotICAgKiBzb2NrZXQuY29ubmVjdChlbmRwb2ludCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB2b2lkIGNvbm5lY3QoY29uc3QgZW5kcG9pbnRfdHlwZSYgcGVlcl9lbmRwb2ludCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgaWYgKCFpc19vcGVuKCkpCi0gICAgewotICAgICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5vcGVuKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICAgIHBlZXJfZW5kcG9pbnQucHJvdG9jb2woKSwgZWMpOwotICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNvbm5lY3QiKTsKLSAgICB9Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5jb25uZWN0KHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBwZWVyX2VuZHBvaW50LCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNvbm5lY3QiKTsKLSAgfQotCi0gIC8vLyBDb25uZWN0IHRoZSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBlbmRwb2ludC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjb25uZWN0IGEgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgcmVtb3RlIGVuZHBvaW50LgotICAgKiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBtYWRlIG9yCi0gICAqIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogVGhlIHNvY2tldCBpcyBhdXRvbWF0aWNhbGx5IG9wZW5lZCBpZiBpdCBpcyBub3QgYWxyZWFkeSBvcGVuLiBJZiB0aGUKLSAgICogY29ubmVjdCBmYWlscywgYW5kIHRoZSBzb2NrZXQgd2FzIGF1dG9tYXRpY2FsbHkgb3BlbmVkLCB0aGUgc29ja2V0IGlzCi0gICAqIG5vdCByZXR1cm5lZCB0byB0aGUgY2xvc2VkIHN0YXRlLgotICAgKgotICAgKiBAcGFyYW0gcGVlcl9lbmRwb2ludCBUaGUgcmVtb3RlIGVuZHBvaW50IHRvIHdoaWNoIHRoZSBzb2NrZXQgd2lsbCBiZQotICAgKiBjb25uZWN0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogYXNpbzo6aXA6OnRjcDo6ZW5kcG9pbnQgZW5kcG9pbnQoCi0gICAqICAgICBhc2lvOjppcDo6YWRkcmVzczo6ZnJvbV9zdHJpbmcoIjEuMi4zLjQiKSwgMTIzNDUpOwotICAgKiBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgKiBzb2NrZXQuY29ubmVjdChlbmRwb2ludCwgZWMpOwotICAgKiBpZiAoZWMpCi0gICAqIHsKLSAgICogICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAgICogfQotICAgKiBAZW5kY29kZQotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBjb25uZWN0KGNvbnN0IGVuZHBvaW50X3R5cGUmIHBlZXJfZW5kcG9pbnQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGlmICghaXNfb3BlbigpKQotICAgIHsKLSAgICAgIGlmICh0aGlzLT5nZXRfc2VydmljZSgpLm9wZW4odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgICAgICBwZWVyX2VuZHBvaW50LnByb3RvY29sKCksIGVjKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGVjOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmNvbm5lY3QoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBwZWVyX2VuZHBvaW50LCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIGNvbm5lY3QuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgY29ubmVjdCBhIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkCi0gICAqIHJlbW90ZSBlbmRwb2ludC4gVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIFRoZSBzb2NrZXQgaXMgYXV0b21hdGljYWxseSBvcGVuZWQgaWYgaXQgaXMgbm90IGFscmVhZHkgb3Blbi4gSWYgdGhlCi0gICAqIGNvbm5lY3QgZmFpbHMsIGFuZCB0aGUgc29ja2V0IHdhcyBhdXRvbWF0aWNhbGx5IG9wZW5lZCwgdGhlIHNvY2tldCBpcwotICAgKiBub3QgcmV0dXJuZWQgdG8gdGhlIGNsb3NlZCBzdGF0ZS4KLSAgICoKLSAgICogQHBhcmFtIHBlZXJfZW5kcG9pbnQgVGhlIHJlbW90ZSBlbmRwb2ludCB0byB3aGljaCB0aGUgc29ja2V0IHdpbGwgYmUKLSAgICogY29ubmVjdGVkLiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBlbmRwb2ludCBvYmplY3QgYXMgcmVxdWlyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEBjb2RlCi0gICAqIHZvaWQgY29ubmVjdF9oYW5kbGVyKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yKQotICAgKiB7Ci0gICAqICAgaWYgKCFlcnJvcikKLSAgICogICB7Ci0gICAqICAgICAvLyBDb25uZWN0IHN1Y2NlZWRlZC4KLSAgICogICB9Ci0gICAqIH0KLSAgICoKLSAgICogLi4uCi0gICAqCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7Ci0gICAqIGFzaW86OmlwOjp0Y3A6OmVuZHBvaW50IGVuZHBvaW50KAotICAgKiAgICAgYXNpbzo6aXA6OmFkZHJlc3M6OmZyb21fc3RyaW5nKCIxLjIuMy40IiksIDEyMzQ1KTsKLSAgICogc29ja2V0LmFzeW5jX2Nvbm5lY3QoZW5kcG9pbnQsIGNvbm5lY3RfaGFuZGxlcik7Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29ubmVjdEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKENvbm5lY3RIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSkpCi0gIGFzeW5jX2Nvbm5lY3QoY29uc3QgZW5kcG9pbnRfdHlwZSYgcGVlcl9lbmRwb2ludCwKLSAgICAgIEFTSU9fTU9WRV9BUkcoQ29ubmVjdEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgQ29ubmVjdEhhbmRsZXIuCi0gICAgQVNJT19DT05ORUNUX0hBTkRMRVJfQ0hFQ0soQ29ubmVjdEhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICBpZiAoIWlzX29wZW4oKSkKLSAgICB7Ci0gICAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSBwcm90b2NvbCA9IHBlZXJfZW5kcG9pbnQucHJvdG9jb2woKTsKLSAgICAgIGlmICh0aGlzLT5nZXRfc2VydmljZSgpLm9wZW4odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIHByb3RvY29sLCBlYykpCi0gICAgICB7Ci0gICAgICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICAgICAgQ29ubmVjdEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUpPiBpbml0KAotICAgICAgICAgICAgQVNJT19NT1ZFX0NBU1QoQ29ubmVjdEhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICAgICAgICB0aGlzLT5nZXRfaW9fc2VydmljZSgpLnBvc3QoCi0gICAgICAgICAgICBhc2lvOjpkZXRhaWw6OmJpbmRfaGFuZGxlcigKLSAgICAgICAgICAgICAgQVNJT19NT1ZFX0NBU1QoQVNJT19IQU5ETEVSX1RZUEUoCi0gICAgICAgICAgICAgICAgQ29ubmVjdEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUpKSkoCi0gICAgICAgICAgICAgICAgICBpbml0LmhhbmRsZXIpLCBlYykpOwotCi0gICAgICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19jb25uZWN0KHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICBwZWVyX2VuZHBvaW50LCBBU0lPX01PVkVfQ0FTVChDb25uZWN0SGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIFNldCBhbiBvcHRpb24gb24gdGhlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgYW4gb3B0aW9uIG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBvcHRpb24gVGhlIG5ldyBvcHRpb24gdmFsdWUgdG8gYmUgc2V0IG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAc2EgU2V0dGFibGVTb2NrZXRPcHRpb24gQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmJyb2FkY2FzdCBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6ZG9fbm90X3JvdXRlIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjprZWVwX2FsaXZlIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpsaW5nZXIgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnJlY2VpdmVfYnVmZmVyX3NpemUgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnJlY2VpdmVfbG93X3dhdGVybWFyayBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6cmV1c2VfYWRkcmVzcyBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6c2VuZF9idWZmZXJfc2l6ZSBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6c2VuZF9sb3dfd2F0ZXJtYXJrIEBuCi0gICAqIGFzaW86OmlwOjptdWx0aWNhc3Q6OmpvaW5fZ3JvdXAgQG4KLSAgICogYXNpbzo6aXA6Om11bHRpY2FzdDo6bGVhdmVfZ3JvdXAgQG4KLSAgICogYXNpbzo6aXA6Om11bHRpY2FzdDo6ZW5hYmxlX2xvb3BiYWNrIEBuCi0gICAqIGFzaW86OmlwOjptdWx0aWNhc3Q6Om91dGJvdW5kX2ludGVyZmFjZSBAbgotICAgKiBhc2lvOjppcDo6bXVsdGljYXN0Ojpob3BzIEBuCi0gICAqIGFzaW86OmlwOjp0Y3A6Om5vX2RlbGF5Ci0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBTZXR0aW5nIHRoZSBJUFBST1RPX1RDUC9UQ1BfTk9ERUxBWSBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7Ci0gICAqIC4uLgotICAgKiBhc2lvOjppcDo6dGNwOjpub19kZWxheSBvcHRpb24odHJ1ZSk7Ci0gICAqIHNvY2tldC5zZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2V0dGFibGVTb2NrZXRPcHRpb24+Ci0gIHZvaWQgc2V0X29wdGlvbihjb25zdCBTZXR0YWJsZVNvY2tldE9wdGlvbiYgb3B0aW9uKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLnNldF9vcHRpb24odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG9wdGlvbiwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzZXRfb3B0aW9uIik7Ci0gIH0KLQotICAvLy8gU2V0IGFuIG9wdGlvbiBvbiB0aGUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBhbiBvcHRpb24gb24gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIG9wdGlvbiBUaGUgbmV3IG9wdGlvbiB2YWx1ZSB0byBiZSBzZXQgb24gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBzYSBTZXR0YWJsZVNvY2tldE9wdGlvbiBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6YnJvYWRjYXN0IEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpkb19ub3Rfcm91dGUgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmtlZXBfYWxpdmUgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmxpbmdlciBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6cmVjZWl2ZV9idWZmZXJfc2l6ZSBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6cmVjZWl2ZV9sb3dfd2F0ZXJtYXJrIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpyZXVzZV9hZGRyZXNzIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpzZW5kX2J1ZmZlcl9zaXplIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpzZW5kX2xvd193YXRlcm1hcmsgQG4KLSAgICogYXNpbzo6aXA6Om11bHRpY2FzdDo6am9pbl9ncm91cCBAbgotICAgKiBhc2lvOjppcDo6bXVsdGljYXN0OjpsZWF2ZV9ncm91cCBAbgotICAgKiBhc2lvOjppcDo6bXVsdGljYXN0OjplbmFibGVfbG9vcGJhY2sgQG4KLSAgICogYXNpbzo6aXA6Om11bHRpY2FzdDo6b3V0Ym91bmRfaW50ZXJmYWNlIEBuCi0gICAqIGFzaW86OmlwOjptdWx0aWNhc3Q6OmhvcHMgQG4KLSAgICogYXNpbzo6aXA6OnRjcDo6bm9fZGVsYXkKLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFNldHRpbmcgdGhlIElQUFJPVE9fVENQL1RDUF9OT0RFTEFZIG9wdGlvbjoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmlwOjp0Y3A6Om5vX2RlbGF5IG9wdGlvbih0cnVlKTsKLSAgICogYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICogc29ja2V0LnNldF9vcHRpb24ob3B0aW9uLCBlYyk7Ci0gICAqIGlmIChlYykKLSAgICogewotICAgKiAgIC8vIEFuIGVycm9yIG9jY3VycmVkLgotICAgKiB9Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2V0dGFibGVTb2NrZXRPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgc2V0X29wdGlvbihjb25zdCBTZXR0YWJsZVNvY2tldE9wdGlvbiYgb3B0aW9uLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5zZXRfb3B0aW9uKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgb3B0aW9uLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0IGFuIG9wdGlvbiBmcm9tIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIGFuIG9wdGlvbiBvbiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gdmFsdWUgdG8gYmUgb2J0YWluZWQgZnJvbSB0aGUgc29ja2V0LgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQHNhIEdldHRhYmxlU29ja2V0T3B0aW9uIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpicm9hZGNhc3QgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmRvX25vdF9yb3V0ZSBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6a2VlcF9hbGl2ZSBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6bGluZ2VyIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpyZWNlaXZlX2J1ZmZlcl9zaXplIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpyZWNlaXZlX2xvd193YXRlcm1hcmsgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnJldXNlX2FkZHJlc3MgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnNlbmRfYnVmZmVyX3NpemUgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnNlbmRfbG93X3dhdGVybWFyayBAbgotICAgKiBhc2lvOjppcDo6bXVsdGljYXN0Ojpqb2luX2dyb3VwIEBuCi0gICAqIGFzaW86OmlwOjptdWx0aWNhc3Q6OmxlYXZlX2dyb3VwIEBuCi0gICAqIGFzaW86OmlwOjptdWx0aWNhc3Q6OmVuYWJsZV9sb29wYmFjayBAbgotICAgKiBhc2lvOjppcDo6bXVsdGljYXN0OjpvdXRib3VuZF9pbnRlcmZhY2UgQG4KLSAgICogYXNpbzo6aXA6Om11bHRpY2FzdDo6aG9wcyBAbgotICAgKiBhc2lvOjppcDo6dGNwOjpub19kZWxheQotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogR2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIFNPTF9TT0NLRVQvU09fS0VFUEFMSVZFIG9wdGlvbjoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldDo6a2VlcF9hbGl2ZSBvcHRpb247Ci0gICAqIHNvY2tldC5nZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIGJvb2wgaXNfc2V0ID0gb3B0aW9uLnZhbHVlKCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgR2V0dGFibGVTb2NrZXRPcHRpb24+Ci0gIHZvaWQgZ2V0X29wdGlvbihHZXR0YWJsZVNvY2tldE9wdGlvbiYgb3B0aW9uKSBjb25zdAotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmdldF9vcHRpb24odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG9wdGlvbiwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJnZXRfb3B0aW9uIik7Ci0gIH0KLQotICAvLy8gR2V0IGFuIG9wdGlvbiBmcm9tIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIGFuIG9wdGlvbiBvbiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gdmFsdWUgdG8gYmUgb2J0YWluZWQgZnJvbSB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHNhIEdldHRhYmxlU29ja2V0T3B0aW9uIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpicm9hZGNhc3QgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmRvX25vdF9yb3V0ZSBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6a2VlcF9hbGl2ZSBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6bGluZ2VyIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpyZWNlaXZlX2J1ZmZlcl9zaXplIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpyZWNlaXZlX2xvd193YXRlcm1hcmsgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnJldXNlX2FkZHJlc3MgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnNlbmRfYnVmZmVyX3NpemUgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnNlbmRfbG93X3dhdGVybWFyayBAbgotICAgKiBhc2lvOjppcDo6bXVsdGljYXN0Ojpqb2luX2dyb3VwIEBuCi0gICAqIGFzaW86OmlwOjptdWx0aWNhc3Q6OmxlYXZlX2dyb3VwIEBuCi0gICAqIGFzaW86OmlwOjptdWx0aWNhc3Q6OmVuYWJsZV9sb29wYmFjayBAbgotICAgKiBhc2lvOjppcDo6bXVsdGljYXN0OjpvdXRib3VuZF9pbnRlcmZhY2UgQG4KLSAgICogYXNpbzo6aXA6Om11bHRpY2FzdDo6aG9wcyBAbgotICAgKiBhc2lvOjppcDo6dGNwOjpub19kZWxheQotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogR2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIFNPTF9TT0NLRVQvU09fS0VFUEFMSVZFIG9wdGlvbjoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldDo6a2VlcF9hbGl2ZSBvcHRpb247Ci0gICAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAqIHNvY2tldC5nZXRfb3B0aW9uKG9wdGlvbiwgZWMpOwotICAgKiBpZiAoZWMpCi0gICAqIHsKLSAgICogICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAgICogfQotICAgKiBib29sIGlzX3NldCA9IG9wdGlvbi52YWx1ZSgpOwotICAgKiBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEdldHRhYmxlU29ja2V0T3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIGdldF9vcHRpb24oR2V0dGFibGVTb2NrZXRPcHRpb24mIG9wdGlvbiwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuZ2V0X29wdGlvbigKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG9wdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gYW4gSU8gY29udHJvbCBjb21tYW5kIG9uIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZXhlY3V0ZSBhbiBJTyBjb250cm9sIGNvbW1hbmQgb24gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIGNvbW1hbmQgVGhlIElPIGNvbnRyb2wgY29tbWFuZCB0byBiZSBwZXJmb3JtZWQgb24gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBzYSBJb0NvbnRyb2xDb21tYW5kIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpieXRlc19yZWFkYWJsZSBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6bm9uX2Jsb2NraW5nX2lvCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBHZXR0aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZHkgdG8gcmVhZDoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldDo6Ynl0ZXNfcmVhZGFibGUgY29tbWFuZDsKLSAgICogc29ja2V0LmlvX2NvbnRyb2woY29tbWFuZCk7Ci0gICAqIHN0ZDo6c2l6ZV90IGJ5dGVzX3JlYWRhYmxlID0gY29tbWFuZC5nZXQoKTsKLSAgICogQGVuZGNvZGUKLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJb0NvbnRyb2xDb21tYW5kPgotICB2b2lkIGlvX2NvbnRyb2woSW9Db250cm9sQ29tbWFuZCYgY29tbWFuZCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5pb19jb250cm9sKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBjb21tYW5kLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImlvX2NvbnRyb2wiKTsKLSAgfQotCi0gIC8vLyBQZXJmb3JtIGFuIElPIGNvbnRyb2wgY29tbWFuZCBvbiB0aGUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGV4ZWN1dGUgYW4gSU8gY29udHJvbCBjb21tYW5kIG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21tYW5kIFRoZSBJTyBjb250cm9sIGNvbW1hbmQgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAc2EgSW9Db250cm9sQ29tbWFuZCBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6Ynl0ZXNfcmVhZGFibGUgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6Om5vbl9ibG9ja2luZ19pbwotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogR2V0dGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWR5IHRvIHJlYWQ6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7Ci0gICAqIC4uLgotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQ6OmJ5dGVzX3JlYWRhYmxlIGNvbW1hbmQ7Ci0gICAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAqIHNvY2tldC5pb19jb250cm9sKGNvbW1hbmQsIGVjKTsKLSAgICogaWYgKGVjKQotICAgKiB7Ci0gICAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqIH0KLSAgICogc3RkOjpzaXplX3QgYnl0ZXNfcmVhZGFibGUgPSBjb21tYW5kLmdldCgpOwotICAgKiBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElvQ29udHJvbENvbW1hbmQ+Ci0gIGFzaW86OmVycm9yX2NvZGUgaW9fY29udHJvbChJb0NvbnRyb2xDb21tYW5kJiBjb21tYW5kLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5pb19jb250cm9sKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgY29tbWFuZCwgZWMpOwotICB9Ci0KLSAgLy8vIEdldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBAcmV0dXJucyBAYyB0cnVlIGlmIHRoZSBzb2NrZXQncyBzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgZmFpbCB3aXRoCi0gICAqIGFzaW86OmVycm9yOjp3b3VsZF9ibG9jayBpZiB0aGV5IGFyZSB1bmFibGUgdG8gcGVyZm9ybSB0aGUgcmVxdWVzdGVkCi0gICAqIG9wZXJhdGlvbiBpbW1lZGlhdGVseS4gSWYgQGMgZmFsc2UsIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMgd2lsbCBibG9jawotICAgKiB1bnRpbCBjb21wbGV0ZS4KLSAgICoKLSAgICogQG5vdGUgVGhlIG5vbi1ibG9ja2luZyBtb2RlIGhhcyBubyBlZmZlY3Qgb24gdGhlIGJlaGF2aW91ciBvZiBhc3luY2hyb25vdXMKLSAgICogb3BlcmF0aW9ucy4gQXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgd2lsbCBuZXZlciBmYWlsIHdpdGggdGhlIGVycm9yCi0gICAqIGFzaW86OmVycm9yOjp3b3VsZF9ibG9jay4KLSAgICovCi0gIGJvb2wgbm9uX2Jsb2NraW5nKCkgY29uc3QKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLm5vbl9ibG9ja2luZyh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSk7Ci0gIH0KLQotICAvLy8gU2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIHNvY2tldC4KLSAgLyoqCi0gICAqIEBwYXJhbSBtb2RlIElmIEBjIHRydWUsIHRoZSBzb2NrZXQncyBzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgZmFpbCB3aXRoCi0gICAqIGFzaW86OmVycm9yOjp3b3VsZF9ibG9jayBpZiB0aGV5IGFyZSB1bmFibGUgdG8gcGVyZm9ybSB0aGUgcmVxdWVzdGVkCi0gICAqIG9wZXJhdGlvbiBpbW1lZGlhdGVseS4gSWYgQGMgZmFsc2UsIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMgd2lsbCBibG9jawotICAgKiB1bnRpbCBjb21wbGV0ZS4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIFRoZSBub24tYmxvY2tpbmcgbW9kZSBoYXMgbm8gZWZmZWN0IG9uIHRoZSBiZWhhdmlvdXIgb2YgYXN5bmNocm9ub3VzCi0gICAqIG9wZXJhdGlvbnMuIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgbmV2ZXIgZmFpbCB3aXRoIHRoZSBlcnJvcgotICAgKiBhc2lvOjplcnJvcjo6d291bGRfYmxvY2suCi0gICAqLwotICB2b2lkIG5vbl9ibG9ja2luZyhib29sIG1vZGUpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkubm9uX2Jsb2NraW5nKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBtb2RlLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIm5vbl9ibG9ja2luZyIpOwotICB9Ci0KLSAgLy8vIFNldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBAcGFyYW0gbW9kZSBJZiBAYyB0cnVlLCB0aGUgc29ja2V0J3Mgc3luY2hyb25vdXMgb3BlcmF0aW9ucyB3aWxsIGZhaWwgd2l0aAotICAgKiBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sgaWYgdGhleSBhcmUgdW5hYmxlIHRvIHBlcmZvcm0gdGhlIHJlcXVlc3RlZAotICAgKiBvcGVyYXRpb24gaW1tZWRpYXRlbHkuIElmIEBjIGZhbHNlLCBzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgYmxvY2sKLSAgICogdW50aWwgY29tcGxldGUuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAbm90ZSBUaGUgbm9uLWJsb2NraW5nIG1vZGUgaGFzIG5vIGVmZmVjdCBvbiB0aGUgYmVoYXZpb3VyIG9mIGFzeW5jaHJvbm91cwotICAgKiBvcGVyYXRpb25zLiBBc3luY2hyb25vdXMgb3BlcmF0aW9ucyB3aWxsIG5ldmVyIGZhaWwgd2l0aCB0aGUgZXJyb3IKLSAgICogYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrLgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBub25fYmxvY2tpbmcoCi0gICAgICBib29sIG1vZGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkubm9uX2Jsb2NraW5nKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgbW9kZSwgZWMpOwotICB9Ci0KLSAgLy8vIEdldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBuYXRpdmUgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgdW5kZXJseWluZwotICAgKiBuYXRpdmUgc29ja2V0LiBUaGlzIG1vZGUgaGFzIG5vIGVmZmVjdCBvbiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBzb2NrZXQKLSAgICogb2JqZWN0J3Mgc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KLSAgICoKLSAgICogQHJldHVybnMgQGMgdHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kCi0gICAqIGRpcmVjdCBzeXN0ZW0gY2FsbHMgbWF5IGZhaWwgd2l0aCBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sgKG9yIHRoZQotICAgKiBlcXVpdmFsZW50IHN5c3RlbSBlcnJvcikuCi0gICAqCi0gICAqIEBub3RlIFRoZSBjdXJyZW50IG5vbi1ibG9ja2luZyBtb2RlIGlzIGNhY2hlZCBieSB0aGUgc29ja2V0IG9iamVjdC4KLSAgICogQ29uc2VxdWVudGx5LCB0aGUgcmV0dXJuIHZhbHVlIG1heSBiZSBpbmNvcnJlY3QgaWYgdGhlIG5vbi1ibG9ja2luZyBtb2RlCi0gICAqIHdhcyBzZXQgZGlyZWN0bHkgb24gdGhlIG5hdGl2ZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGFsbG93IHRoZSBlbmNhcHN1bGF0aW9uIG9mIGFyYml0cmFyeQotICAgKiBub24tYmxvY2tpbmcgc3lzdGVtIGNhbGxzIGFzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLCBpbiBhIHdheSB0aGF0IGlzCi0gICAqIHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyIG9mIHRoZSBzb2NrZXQgb2JqZWN0LiBUaGUgZm9sbG93aW5nIGV4YW1wbGUKLSAgICogaWxsdXN0cmF0ZXMgaG93IExpbnV4J3MgQGMgc2VuZGZpbGUgc3lzdGVtIGNhbGwgbWlnaHQgYmUgZW5jYXBzdWxhdGVkOgotICAgKiBAY29kZSB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgICogc3RydWN0IHNlbmRmaWxlX29wCi0gICAqIHsKLSAgICogICB0Y3A6OnNvY2tldCYgc29ja187Ci0gICAqICAgaW50IGZkXzsKLSAgICogICBIYW5kbGVyIGhhbmRsZXJfOwotICAgKiAgIG9mZl90IG9mZnNldF87Ci0gICAqICAgc3RkOjpzaXplX3QgdG90YWxfYnl0ZXNfdHJhbnNmZXJyZWRfOwotICAgKgotICAgKiAgIC8vIEZ1bmN0aW9uIGNhbGwgb3BlcmF0b3IgbWVldGluZyBXcml0ZUhhbmRsZXIgcmVxdWlyZW1lbnRzLgotICAgKiAgIC8vIFVzZWQgYXMgdGhlIGhhbmRsZXIgZm9yIHRoZSBhc3luY193cml0ZV9zb21lIG9wZXJhdGlvbi4KLSAgICogICB2b2lkIG9wZXJhdG9yKCkoYXNpbzo6ZXJyb3JfY29kZSBlYywgc3RkOjpzaXplX3QpCi0gICAqICAgewotICAgKiAgICAgLy8gUHV0IHRoZSB1bmRlcmx5aW5nIHNvY2tldCBpbnRvIG5vbi1ibG9ja2luZyBtb2RlLgotICAgKiAgICAgaWYgKCFlYykKLSAgICogICAgICAgaWYgKCFzb2NrXy5uYXRpdmVfbm9uX2Jsb2NraW5nKCkpCi0gICAqICAgICAgICAgc29ja18ubmF0aXZlX25vbl9ibG9ja2luZyh0cnVlLCBlYyk7Ci0gICAqCi0gICAqICAgICBpZiAoIWVjKQotICAgKiAgICAgewotICAgKiAgICAgICBmb3IgKDs7KQotICAgKiAgICAgICB7Ci0gICAqICAgICAgICAgLy8gVHJ5IHRoZSBzeXN0ZW0gY2FsbC4KLSAgICogICAgICAgICBlcnJubyA9IDA7Ci0gICAqICAgICAgICAgaW50IG4gPSA6OnNlbmRmaWxlKHNvY2tfLm5hdGl2ZV9oYW5kbGUoKSwgZmRfLCAmb2Zmc2V0XywgNjU1MzYpOwotICAgKiAgICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShuIDwgMCA/IGVycm5vIDogMCwKLSAgICogICAgICAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAqICAgICAgICAgdG90YWxfYnl0ZXNfdHJhbnNmZXJyZWRfICs9IGVjID8gMCA6IG47Ci0gICAqCi0gICAqICAgICAgICAgLy8gUmV0cnkgb3BlcmF0aW9uIGltbWVkaWF0ZWx5IGlmIGludGVycnVwdGVkIGJ5IHNpZ25hbC4KLSAgICogICAgICAgICBpZiAoZWMgPT0gYXNpbzo6ZXJyb3I6OmludGVycnVwdGVkKQotICAgKiAgICAgICAgICAgY29udGludWU7Ci0gICAqCi0gICAqICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBydW4gdGhlIG9wZXJhdGlvbiBhZ2Fpbi4KLSAgICogICAgICAgICBpZiAoZWMgPT0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrCi0gICAqICAgICAgICAgICAgIHx8IGVjID09IGFzaW86OmVycm9yOjp0cnlfYWdhaW4pCi0gICAqICAgICAgICAgewotICAgKiAgICAgICAgICAgLy8gV2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgc29ja2V0IHRvIGJlY29tZSByZWFkeSBhZ2Fpbi4KLSAgICogICAgICAgICAgIHNvY2tfLmFzeW5jX3dyaXRlX3NvbWUoYXNpbzo6bnVsbF9idWZmZXJzKCksICp0aGlzKTsKLSAgICogICAgICAgICAgIHJldHVybjsKLSAgICogICAgICAgICB9Ci0gICAqCi0gICAqICAgICAgICAgaWYgKGVjIHx8IG4gPT0gMCkKLSAgICogICAgICAgICB7Ci0gICAqICAgICAgICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCwgb3Igd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gICAqICAgICAgICAgICAvLyBFaXRoZXIgd2F5IHdlIG11c3QgZXhpdCB0aGUgbG9vcCBzbyB3ZSBjYW4gY2FsbCB0aGUgaGFuZGxlci4KLSAgICogICAgICAgICAgIGJyZWFrOwotICAgKiAgICAgICAgIH0KLSAgICoKLSAgICogICAgICAgICAvLyBMb29wIGFyb3VuZCB0byB0cnkgY2FsbGluZyBzZW5kZmlsZSBhZ2Fpbi4KLSAgICogICAgICAgfQotICAgKiAgICAgfQotICAgKgotICAgKiAgICAgLy8gUGFzcyByZXN1bHQgYmFjayB0byB1c2VyJ3MgaGFuZGxlci4KLSAgICogICAgIGhhbmRsZXJfKGVjLCB0b3RhbF9ieXRlc190cmFuc2ZlcnJlZF8pOwotICAgKiAgIH0KLSAgICogfTsKLSAgICoKLSAgICogdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gICAqIHZvaWQgYXN5bmNfc2VuZGZpbGUodGNwOjpzb2NrZXQmIHNvY2ssIGludCBmZCwgSGFuZGxlciBoKQotICAgKiB7Ci0gICAqICAgc2VuZGZpbGVfb3A8SGFuZGxlcj4gb3AgPSB7IHNvY2ssIGZkLCBoLCAwLCAwIH07Ci0gICAqICAgc29jay5hc3luY193cml0ZV9zb21lKGFzaW86Om51bGxfYnVmZmVycygpLCBvcCk7Ci0gICAqIH0gQGVuZGNvZGUKLSAgICovCi0gIGJvb2wgbmF0aXZlX25vbl9ibG9ja2luZygpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfbm9uX2Jsb2NraW5nKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtb2RpZnkgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nCi0gICAqIG5hdGl2ZSBzb2NrZXQuIEl0IGhhcyBubyBlZmZlY3Qgb24gdGhlIGJlaGF2aW91ciBvZiB0aGUgc29ja2V0IG9iamVjdCdzCi0gICAqIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSBtb2RlIElmIEBjIHRydWUsIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBpcyBwdXQgaW50byBub24tYmxvY2tpbmcKLSAgICogbW9kZSBhbmQgZGlyZWN0IHN5c3RlbSBjYWxscyBtYXkgZmFpbCB3aXRoIGFzaW86OmVycm9yOjp3b3VsZF9ibG9jawotICAgKiAob3IgdGhlIGVxdWl2YWxlbnQgc3lzdGVtIGVycm9yKS4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIElmIHRoZSBAYyBtb2RlIGlzCi0gICAqIEBjIGZhbHNlLCBidXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgQGMgbm9uX2Jsb2NraW5nKCkgaXMgQGMgdHJ1ZSwgdGhpcwotICAgKiBmdW5jdGlvbiBmYWlscyB3aXRoIGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50LCBhcyB0aGUKLSAgICogY29tYmluYXRpb24gZG9lcyBub3QgbWFrZSBzZW5zZS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYWxsb3cgdGhlIGVuY2Fwc3VsYXRpb24gb2YgYXJiaXRyYXJ5Ci0gICAqIG5vbi1ibG9ja2luZyBzeXN0ZW0gY2FsbHMgYXMgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMsIGluIGEgd2F5IHRoYXQgaXMKLSAgICogdHJhbnNwYXJlbnQgdG8gdGhlIHVzZXIgb2YgdGhlIHNvY2tldCBvYmplY3QuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZQotICAgKiBpbGx1c3RyYXRlcyBob3cgTGludXgncyBAYyBzZW5kZmlsZSBzeXN0ZW0gY2FsbCBtaWdodCBiZSBlbmNhcHN1bGF0ZWQ6Ci0gICAqIEBjb2RlIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICAgKiBzdHJ1Y3Qgc2VuZGZpbGVfb3AKLSAgICogewotICAgKiAgIHRjcDo6c29ja2V0JiBzb2NrXzsKLSAgICogICBpbnQgZmRfOwotICAgKiAgIEhhbmRsZXIgaGFuZGxlcl87Ci0gICAqICAgb2ZmX3Qgb2Zmc2V0XzsKLSAgICogICBzdGQ6OnNpemVfdCB0b3RhbF9ieXRlc190cmFuc2ZlcnJlZF87Ci0gICAqCi0gICAqICAgLy8gRnVuY3Rpb24gY2FsbCBvcGVyYXRvciBtZWV0aW5nIFdyaXRlSGFuZGxlciByZXF1aXJlbWVudHMuCi0gICAqICAgLy8gVXNlZCBhcyB0aGUgaGFuZGxlciBmb3IgdGhlIGFzeW5jX3dyaXRlX3NvbWUgb3BlcmF0aW9uLgotICAgKiAgIHZvaWQgb3BlcmF0b3IoKShhc2lvOjplcnJvcl9jb2RlIGVjLCBzdGQ6OnNpemVfdCkKLSAgICogICB7Ci0gICAqICAgICAvLyBQdXQgdGhlIHVuZGVybHlpbmcgc29ja2V0IGludG8gbm9uLWJsb2NraW5nIG1vZGUuCi0gICAqICAgICBpZiAoIWVjKQotICAgKiAgICAgICBpZiAoIXNvY2tfLm5hdGl2ZV9ub25fYmxvY2tpbmcoKSkKLSAgICogICAgICAgICBzb2NrXy5uYXRpdmVfbm9uX2Jsb2NraW5nKHRydWUsIGVjKTsKLSAgICoKLSAgICogICAgIGlmICghZWMpCi0gICAqICAgICB7Ci0gICAqICAgICAgIGZvciAoOzspCi0gICAqICAgICAgIHsKLSAgICogICAgICAgICAvLyBUcnkgdGhlIHN5c3RlbSBjYWxsLgotICAgKiAgICAgICAgIGVycm5vID0gMDsKLSAgICogICAgICAgICBpbnQgbiA9IDo6c2VuZGZpbGUoc29ja18ubmF0aXZlX2hhbmRsZSgpLCBmZF8sICZvZmZzZXRfLCA2NTUzNik7Ci0gICAqICAgICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKG4gPCAwID8gZXJybm8gOiAwLAotICAgKiAgICAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICogICAgICAgICB0b3RhbF9ieXRlc190cmFuc2ZlcnJlZF8gKz0gZWMgPyAwIDogbjsKLSAgICoKLSAgICogICAgICAgICAvLyBSZXRyeSBvcGVyYXRpb24gaW1tZWRpYXRlbHkgaWYgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLgotICAgKiAgICAgICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6aW50ZXJydXB0ZWQpCi0gICAqICAgICAgICAgICBjb250aW51ZTsKLSAgICoKLSAgICogICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJ1biB0aGUgb3BlcmF0aW9uIGFnYWluLgotICAgKiAgICAgICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICogICAgICAgICAgICAgfHwgZWMgPT0gYXNpbzo6ZXJyb3I6OnRyeV9hZ2FpbikKLSAgICogICAgICAgICB7Ci0gICAqICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmVjb21lIHJlYWR5IGFnYWluLgotICAgKiAgICAgICAgICAgc29ja18uYXN5bmNfd3JpdGVfc29tZShhc2lvOjpudWxsX2J1ZmZlcnMoKSwgKnRoaXMpOwotICAgKiAgICAgICAgICAgcmV0dXJuOwotICAgKiAgICAgICAgIH0KLSAgICoKLSAgICogICAgICAgICBpZiAoZWMgfHwgbiA9PSAwKQotICAgKiAgICAgICAgIHsKLSAgICogICAgICAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkLCBvciB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICogICAgICAgICAgIC8vIEVpdGhlciB3YXkgd2UgbXVzdCBleGl0IHRoZSBsb29wIHNvIHdlIGNhbiBjYWxsIHRoZSBoYW5kbGVyLgotICAgKiAgICAgICAgICAgYnJlYWs7Ci0gICAqICAgICAgICAgfQotICAgKgotICAgKiAgICAgICAgIC8vIExvb3AgYXJvdW5kIHRvIHRyeSBjYWxsaW5nIHNlbmRmaWxlIGFnYWluLgotICAgKiAgICAgICB9Ci0gICAqICAgICB9Ci0gICAqCi0gICAqICAgICAvLyBQYXNzIHJlc3VsdCBiYWNrIHRvIHVzZXIncyBoYW5kbGVyLgotICAgKiAgICAgaGFuZGxlcl8oZWMsIHRvdGFsX2J5dGVzX3RyYW5zZmVycmVkXyk7Ci0gICAqICAgfQotICAgKiB9OwotICAgKgotICAgKiB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgICogdm9pZCBhc3luY19zZW5kZmlsZSh0Y3A6OnNvY2tldCYgc29jaywgaW50IGZkLCBIYW5kbGVyIGgpCi0gICAqIHsKLSAgICogICBzZW5kZmlsZV9vcDxIYW5kbGVyPiBvcCA9IHsgc29jaywgZmQsIGgsIDAsIDAgfTsKLSAgICogICBzb2NrLmFzeW5jX3dyaXRlX3NvbWUoYXNpbzo6bnVsbF9idWZmZXJzKCksIG9wKTsKLSAgICogfSBAZW5kY29kZQotICAgKi8KLSAgdm9pZCBuYXRpdmVfbm9uX2Jsb2NraW5nKGJvb2wgbW9kZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfbm9uX2Jsb2NraW5nKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgbW9kZSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJuYXRpdmVfbm9uX2Jsb2NraW5nIik7Ci0gIH0KLQotICAvLy8gU2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIG5hdGl2ZSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgdW5kZXJseWluZwotICAgKiBuYXRpdmUgc29ja2V0LiBJdCBoYXMgbm8gZWZmZWN0IG9uIHRoZSBiZWhhdmlvdXIgb2YgdGhlIHNvY2tldCBvYmplY3QncwotICAgKiBzeW5jaHJvbm91cyBvcGVyYXRpb25zLgotICAgKgotICAgKiBAcGFyYW0gbW9kZSBJZiBAYyB0cnVlLCB0aGUgdW5kZXJseWluZyBzb2NrZXQgaXMgcHV0IGludG8gbm9uLWJsb2NraW5nCi0gICAqIG1vZGUgYW5kIGRpcmVjdCBzeXN0ZW0gY2FsbHMgbWF5IGZhaWwgd2l0aCBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICogKG9yIHRoZSBlcXVpdmFsZW50IHN5c3RlbSBlcnJvcikuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LiBJZiB0aGUgQGMgbW9kZSBpcwotICAgKiBAYyBmYWxzZSwgYnV0IHRoZSBjdXJyZW50IHZhbHVlIG9mIEBjIG5vbl9ibG9ja2luZygpIGlzIEBjIHRydWUsIHRoaXMKLSAgICogZnVuY3Rpb24gZmFpbHMgd2l0aCBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudCwgYXMgdGhlCi0gICAqIGNvbWJpbmF0aW9uIGRvZXMgbm90IG1ha2Ugc2Vuc2UuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGFsbG93IHRoZSBlbmNhcHN1bGF0aW9uIG9mIGFyYml0cmFyeQotICAgKiBub24tYmxvY2tpbmcgc3lzdGVtIGNhbGxzIGFzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLCBpbiBhIHdheSB0aGF0IGlzCi0gICAqIHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyIG9mIHRoZSBzb2NrZXQgb2JqZWN0LiBUaGUgZm9sbG93aW5nIGV4YW1wbGUKLSAgICogaWxsdXN0cmF0ZXMgaG93IExpbnV4J3MgQGMgc2VuZGZpbGUgc3lzdGVtIGNhbGwgbWlnaHQgYmUgZW5jYXBzdWxhdGVkOgotICAgKiBAY29kZSB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgICogc3RydWN0IHNlbmRmaWxlX29wCi0gICAqIHsKLSAgICogICB0Y3A6OnNvY2tldCYgc29ja187Ci0gICAqICAgaW50IGZkXzsKLSAgICogICBIYW5kbGVyIGhhbmRsZXJfOwotICAgKiAgIG9mZl90IG9mZnNldF87Ci0gICAqICAgc3RkOjpzaXplX3QgdG90YWxfYnl0ZXNfdHJhbnNmZXJyZWRfOwotICAgKgotICAgKiAgIC8vIEZ1bmN0aW9uIGNhbGwgb3BlcmF0b3IgbWVldGluZyBXcml0ZUhhbmRsZXIgcmVxdWlyZW1lbnRzLgotICAgKiAgIC8vIFVzZWQgYXMgdGhlIGhhbmRsZXIgZm9yIHRoZSBhc3luY193cml0ZV9zb21lIG9wZXJhdGlvbi4KLSAgICogICB2b2lkIG9wZXJhdG9yKCkoYXNpbzo6ZXJyb3JfY29kZSBlYywgc3RkOjpzaXplX3QpCi0gICAqICAgewotICAgKiAgICAgLy8gUHV0IHRoZSB1bmRlcmx5aW5nIHNvY2tldCBpbnRvIG5vbi1ibG9ja2luZyBtb2RlLgotICAgKiAgICAgaWYgKCFlYykKLSAgICogICAgICAgaWYgKCFzb2NrXy5uYXRpdmVfbm9uX2Jsb2NraW5nKCkpCi0gICAqICAgICAgICAgc29ja18ubmF0aXZlX25vbl9ibG9ja2luZyh0cnVlLCBlYyk7Ci0gICAqCi0gICAqICAgICBpZiAoIWVjKQotICAgKiAgICAgewotICAgKiAgICAgICBmb3IgKDs7KQotICAgKiAgICAgICB7Ci0gICAqICAgICAgICAgLy8gVHJ5IHRoZSBzeXN0ZW0gY2FsbC4KLSAgICogICAgICAgICBlcnJubyA9IDA7Ci0gICAqICAgICAgICAgaW50IG4gPSA6OnNlbmRmaWxlKHNvY2tfLm5hdGl2ZV9oYW5kbGUoKSwgZmRfLCAmb2Zmc2V0XywgNjU1MzYpOwotICAgKiAgICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShuIDwgMCA/IGVycm5vIDogMCwKLSAgICogICAgICAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAqICAgICAgICAgdG90YWxfYnl0ZXNfdHJhbnNmZXJyZWRfICs9IGVjID8gMCA6IG47Ci0gICAqCi0gICAqICAgICAgICAgLy8gUmV0cnkgb3BlcmF0aW9uIGltbWVkaWF0ZWx5IGlmIGludGVycnVwdGVkIGJ5IHNpZ25hbC4KLSAgICogICAgICAgICBpZiAoZWMgPT0gYXNpbzo6ZXJyb3I6OmludGVycnVwdGVkKQotICAgKiAgICAgICAgICAgY29udGludWU7Ci0gICAqCi0gICAqICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBydW4gdGhlIG9wZXJhdGlvbiBhZ2Fpbi4KLSAgICogICAgICAgICBpZiAoZWMgPT0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrCi0gICAqICAgICAgICAgICAgIHx8IGVjID09IGFzaW86OmVycm9yOjp0cnlfYWdhaW4pCi0gICAqICAgICAgICAgewotICAgKiAgICAgICAgICAgLy8gV2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgc29ja2V0IHRvIGJlY29tZSByZWFkeSBhZ2Fpbi4KLSAgICogICAgICAgICAgIHNvY2tfLmFzeW5jX3dyaXRlX3NvbWUoYXNpbzo6bnVsbF9idWZmZXJzKCksICp0aGlzKTsKLSAgICogICAgICAgICAgIHJldHVybjsKLSAgICogICAgICAgICB9Ci0gICAqCi0gICAqICAgICAgICAgaWYgKGVjIHx8IG4gPT0gMCkKLSAgICogICAgICAgICB7Ci0gICAqICAgICAgICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCwgb3Igd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gICAqICAgICAgICAgICAvLyBFaXRoZXIgd2F5IHdlIG11c3QgZXhpdCB0aGUgbG9vcCBzbyB3ZSBjYW4gY2FsbCB0aGUgaGFuZGxlci4KLSAgICogICAgICAgICAgIGJyZWFrOwotICAgKiAgICAgICAgIH0KLSAgICoKLSAgICogICAgICAgICAvLyBMb29wIGFyb3VuZCB0byB0cnkgY2FsbGluZyBzZW5kZmlsZSBhZ2Fpbi4KLSAgICogICAgICAgfQotICAgKiAgICAgfQotICAgKgotICAgKiAgICAgLy8gUGFzcyByZXN1bHQgYmFjayB0byB1c2VyJ3MgaGFuZGxlci4KLSAgICogICAgIGhhbmRsZXJfKGVjLCB0b3RhbF9ieXRlc190cmFuc2ZlcnJlZF8pOwotICAgKiAgIH0KLSAgICogfTsKLSAgICoKLSAgICogdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gICAqIHZvaWQgYXN5bmNfc2VuZGZpbGUodGNwOjpzb2NrZXQmIHNvY2ssIGludCBmZCwgSGFuZGxlciBoKQotICAgKiB7Ci0gICAqICAgc2VuZGZpbGVfb3A8SGFuZGxlcj4gb3AgPSB7IHNvY2ssIGZkLCBoLCAwLCAwIH07Ci0gICAqICAgc29jay5hc3luY193cml0ZV9zb21lKGFzaW86Om51bGxfYnVmZmVycygpLCBvcCk7Ci0gICAqIH0gQGVuZGNvZGUKLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgbmF0aXZlX25vbl9ibG9ja2luZygKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfbm9uX2Jsb2NraW5nKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgbW9kZSwgZWMpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbG9jYWwgZW5kcG9pbnQgb2YgdGhlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBvYnRhaW4gdGhlIGxvY2FsbHkgYm91bmQgZW5kcG9pbnQgb2YgdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHJldHVybnMgQW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYWwgZW5kcG9pbnQgb2YgdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOwotICAgKiAuLi4KLSAgICogYXNpbzo6aXA6OnRjcDo6ZW5kcG9pbnQgZW5kcG9pbnQgPSBzb2NrZXQubG9jYWxfZW5kcG9pbnQoKTsKLSAgICogQGVuZGNvZGUKLSAgICovCi0gIGVuZHBvaW50X3R5cGUgbG9jYWxfZW5kcG9pbnQoKSBjb25zdAotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBlbmRwb2ludF90eXBlIGVwID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS5sb2NhbF9lbmRwb2ludCgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAibG9jYWxfZW5kcG9pbnQiKTsKLSAgICByZXR1cm4gZXA7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBsb2NhbCBlbmRwb2ludCBvZiB0aGUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG9idGFpbiB0aGUgbG9jYWxseSBib3VuZCBlbmRwb2ludCBvZiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybnMgQW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYWwgZW5kcG9pbnQgb2YgdGhlIHNvY2tldC4KLSAgICogUmV0dXJucyBhIGRlZmF1bHQtY29uc3RydWN0ZWQgZW5kcG9pbnQgb2JqZWN0IGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAqIGFzaW86OmlwOjp0Y3A6OmVuZHBvaW50IGVuZHBvaW50ID0gc29ja2V0LmxvY2FsX2VuZHBvaW50KGVjKTsKLSAgICogaWYgKGVjKQotICAgKiB7Ci0gICAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqIH0KLSAgICogQGVuZGNvZGUKLSAgICovCi0gIGVuZHBvaW50X3R5cGUgbG9jYWxfZW5kcG9pbnQoYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5sb2NhbF9lbmRwb2ludCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZWMpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgcmVtb3RlIGVuZHBvaW50IG9mIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gb2J0YWluIHRoZSByZW1vdGUgZW5kcG9pbnQgb2YgdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHJldHVybnMgQW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcmVtb3RlIGVuZHBvaW50IG9mIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmlwOjp0Y3A6OmVuZHBvaW50IGVuZHBvaW50ID0gc29ja2V0LnJlbW90ZV9lbmRwb2ludCgpOwotICAgKiBAZW5kY29kZQotICAgKi8KLSAgZW5kcG9pbnRfdHlwZSByZW1vdGVfZW5kcG9pbnQoKSBjb25zdAotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBlbmRwb2ludF90eXBlIGVwID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZW1vdGVfZW5kcG9pbnQoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInJlbW90ZV9lbmRwb2ludCIpOwotICAgIHJldHVybiBlcDsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHJlbW90ZSBlbmRwb2ludCBvZiB0aGUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG9idGFpbiB0aGUgcmVtb3RlIGVuZHBvaW50IG9mIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBBbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZW1vdGUgZW5kcG9pbnQgb2YgdGhlIHNvY2tldC4KLSAgICogUmV0dXJucyBhIGRlZmF1bHQtY29uc3RydWN0ZWQgZW5kcG9pbnQgb2JqZWN0IGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAqIGFzaW86OmlwOjp0Y3A6OmVuZHBvaW50IGVuZHBvaW50ID0gc29ja2V0LnJlbW90ZV9lbmRwb2ludChlYyk7Ci0gICAqIGlmIChlYykKLSAgICogewotICAgKiAgIC8vIEFuIGVycm9yIG9jY3VycmVkLgotICAgKiB9Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICBlbmRwb2ludF90eXBlIHJlbW90ZV9lbmRwb2ludChhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLnJlbW90ZV9lbmRwb2ludCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZWMpOwotICB9Ci0KLSAgLy8vIERpc2FibGUgc2VuZHMgb3IgcmVjZWl2ZXMgb24gdGhlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkaXNhYmxlIHNlbmQgb3BlcmF0aW9ucywgcmVjZWl2ZSBvcGVyYXRpb25zLCBvcgotICAgKiBib3RoLgotICAgKgotICAgKiBAcGFyYW0gd2hhdCBEZXRlcm1pbmVzIHdoYXQgdHlwZXMgb2Ygb3BlcmF0aW9uIHdpbGwgbm8gbG9uZ2VyIGJlIGFsbG93ZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogU2h1dHRpbmcgZG93biB0aGUgc2VuZCBzaWRlIG9mIHRoZSBzb2NrZXQ6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7Ci0gICAqIC4uLgotICAgKiBzb2NrZXQuc2h1dGRvd24oYXNpbzo6aXA6OnRjcDo6c29ja2V0OjpzaHV0ZG93bl9zZW5kKTsKLSAgICogQGVuZGNvZGUKLSAgICovCi0gIHZvaWQgc2h1dGRvd24oc2h1dGRvd25fdHlwZSB3aGF0KQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLnNodXRkb3duKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCB3aGF0LCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNodXRkb3duIik7Ci0gIH0KLQotICAvLy8gRGlzYWJsZSBzZW5kcyBvciByZWNlaXZlcyBvbiB0aGUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRpc2FibGUgc2VuZCBvcGVyYXRpb25zLCByZWNlaXZlIG9wZXJhdGlvbnMsIG9yCi0gICAqIGJvdGguCi0gICAqCi0gICAqIEBwYXJhbSB3aGF0IERldGVybWluZXMgd2hhdCB0eXBlcyBvZiBvcGVyYXRpb24gd2lsbCBubyBsb25nZXIgYmUgYWxsb3dlZC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBTaHV0dGluZyBkb3duIHRoZSBzZW5kIHNpZGUgb2YgdGhlIHNvY2tldDoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAqIHNvY2tldC5zaHV0ZG93bihhc2lvOjppcDo6dGNwOjpzb2NrZXQ6OnNodXRkb3duX3NlbmQsIGVjKTsKLSAgICogaWYgKGVjKQotICAgKiB7Ci0gICAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqIH0KLSAgICogQGVuZGNvZGUKLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgc2h1dGRvd24oc2h1dGRvd25fdHlwZSB3aGF0LAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5zaHV0ZG93bih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgd2hhdCwgZWMpOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgLy8vIFByb3RlY3RlZCBkZXN0cnVjdG9yIHRvIHByZXZlbnQgZGVsZXRpb24gdGhyb3VnaCB0aGlzIHR5cGUuCi0gIH5iYXNpY19zb2NrZXQoKQotICB7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fQkFTSUNfU09DS0VUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3NvY2tldF9hY2NlcHRvci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc29ja2V0X2FjY2VwdG9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1NWY0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc29ja2V0X2FjY2VwdG9yLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMzYgKzAsMCBAQAotLy8KLS8vIGJhc2ljX3NvY2tldF9hY2NlcHRvci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19CQVNJQ19TT0NLRVRfQUNDRVBUT1JfSFBQCi0jZGVmaW5lIEFTSU9fQkFTSUNfU09DS0VUX0FDQ0VQVE9SX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfaW9fb2JqZWN0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3NvY2tldC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3R5cGVfdHJhaXRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NvY2tldF9hY2NlcHRvcl9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NvY2tldF9iYXNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGFjY2VwdCBuZXcgY29ubmVjdGlvbnMuCi0vKioKLSAqIFRoZSBiYXNpY19zb2NrZXRfYWNjZXB0b3IgY2xhc3MgdGVtcGxhdGUgaXMgdXNlZCBmb3IgYWNjZXB0aW5nIG5ldyBzb2NrZXQKLSAqIGNvbm5lY3Rpb25zLgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIE9wZW5pbmcgYSBzb2NrZXQgYWNjZXB0b3Igd2l0aCB0aGUgU09fUkVVU0VBRERSIG9wdGlvbiBlbmFibGVkOgotICogQGNvZGUKLSAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOwotICogYXNpbzo6aXA6OnRjcDo6ZW5kcG9pbnQgZW5kcG9pbnQoYXNpbzo6aXA6OnRjcDo6djQoKSwgcG9ydCk7Ci0gKiBhY2NlcHRvci5vcGVuKGVuZHBvaW50LnByb3RvY29sKCkpOwotICogYWNjZXB0b3Iuc2V0X29wdGlvbihhc2lvOjppcDo6dGNwOjphY2NlcHRvcjo6cmV1c2VfYWRkcmVzcyh0cnVlKSk7Ci0gKiBhY2NlcHRvci5iaW5kKGVuZHBvaW50KTsKLSAqIGFjY2VwdG9yLmxpc3RlbigpOwotICogQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLAotICAgIHR5cGVuYW1lIFNvY2tldEFjY2VwdG9yU2VydmljZSA9IHNvY2tldF9hY2NlcHRvcl9zZXJ2aWNlPFByb3RvY29sPiA+Ci1jbGFzcyBiYXNpY19zb2NrZXRfYWNjZXB0b3IKLSAgOiBwdWJsaWMgYmFzaWNfaW9fb2JqZWN0PFNvY2tldEFjY2VwdG9yU2VydmljZT4sCi0gICAgcHVibGljIHNvY2tldF9iYXNlCi17Ci1wdWJsaWM6Ci0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGVfdHlwZS4pIFRoZSBuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgYW4KLSAgLy8vIGFjY2VwdG9yLgotICB0eXBlZGVmIHR5cGVuYW1lIFNvY2tldEFjY2VwdG9yU2VydmljZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV90eXBlOwotCi0gIC8vLyBUaGUgbmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGFjY2VwdG9yLgotICB0eXBlZGVmIHR5cGVuYW1lIFNvY2tldEFjY2VwdG9yU2VydmljZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICAvLy8gVGhlIHByb3RvY29sIHR5cGUuCi0gIHR5cGVkZWYgUHJvdG9jb2wgcHJvdG9jb2xfdHlwZTsKLQotICAvLy8gVGhlIGVuZHBvaW50IHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdCBhbiBhY2NlcHRvciB3aXRob3V0IG9wZW5pbmcgaXQuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gYWNjZXB0b3Igd2l0aG91dCBvcGVuaW5nIGl0IHRvIGxpc3RlbiBmb3IgbmV3Ci0gICAqIGNvbm5lY3Rpb25zLiBUaGUgb3BlbigpIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgYWNjZXB0b3IgY2FuCi0gICAqIGFjY2VwdCBuZXcgc29ja2V0IGNvbm5lY3Rpb25zLgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgYWNjZXB0b3Igd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlCi0gICAqIGFjY2VwdG9yLgotICAgKi8KLSAgZXhwbGljaXQgYmFzaWNfc29ja2V0X2FjY2VwdG9yKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U29ja2V0QWNjZXB0b3JTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGFuIG9wZW4gYWNjZXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gYWNjZXB0b3IgYW5kIGF1dG9tYXRpY2FsbHkgb3BlbnMgaXQuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBhY2NlcHRvciB3aWxsIHVzZSB0bwotICAgKiBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUKLSAgICogYWNjZXB0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBwcm90b2NvbCBBbiBvYmplY3Qgc3BlY2lmeWluZyBwcm90b2NvbCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgYmFzaWNfc29ja2V0X2FjY2VwdG9yKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCkKLSAgICA6IGJhc2ljX2lvX29iamVjdDxTb2NrZXRBY2NlcHRvclNlcnZpY2U+KGlvX3NlcnZpY2UpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkub3Blbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgcHJvdG9jb2wsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAib3BlbiIpOwotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbiBhY2NlcHRvciBvcGVuZWQgb24gdGhlIGdpdmVuIGVuZHBvaW50LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGFjY2VwdG9yIGFuZCBhdXRvbWF0aWNhbGx5IG9wZW5zIGl0IHRvIGxpc3RlbgotICAgKiBmb3IgbmV3IGNvbm5lY3Rpb25zIG9uIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBhY2NlcHRvciB3aWxsIHVzZSB0bwotICAgKiBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUKLSAgICogYWNjZXB0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBlbmRwb2ludCBBbiBlbmRwb2ludCBvbiB0aGUgbG9jYWwgbWFjaGluZSBvbiB3aGljaCB0aGUgYWNjZXB0b3IKLSAgICogd2lsbCBsaXN0ZW4gZm9yIG5ldyBjb25uZWN0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIHJldXNlX2FkZHIgV2hldGhlciB0aGUgY29uc3RydWN0b3Igc2hvdWxkIHNldCB0aGUgc29ja2V0IG9wdGlvbgotICAgKiBzb2NrZXRfYmFzZTo6cmV1c2VfYWRkcmVzcy4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIFRoaXMgY29uc3RydWN0b3IgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGNvZGU6Ci0gICAqIEBjb2RlCi0gICAqIGJhc2ljX3NvY2tldF9hY2NlcHRvcjxQcm90b2NvbD4gYWNjZXB0b3IoaW9fc2VydmljZSk7Ci0gICAqIGFjY2VwdG9yLm9wZW4oZW5kcG9pbnQucHJvdG9jb2woKSk7Ci0gICAqIGlmIChyZXVzZV9hZGRyKQotICAgKiAgIGFjY2VwdG9yLnNldF9vcHRpb24oc29ja2V0X2Jhc2U6OnJldXNlX2FkZHJlc3ModHJ1ZSkpOwotICAgKiBhY2NlcHRvci5iaW5kKGVuZHBvaW50KTsKLSAgICogYWNjZXB0b3IubGlzdGVuKGxpc3Rlbl9iYWNrbG9nKTsKLSAgICogQGVuZGNvZGUKLSAgICovCi0gIGJhc2ljX3NvY2tldF9hY2NlcHRvcihhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgZW5kcG9pbnQsIGJvb2wgcmV1c2VfYWRkciA9IHRydWUpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8U29ja2V0QWNjZXB0b3JTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBjb25zdCBwcm90b2NvbF90eXBlIHByb3RvY29sID0gZW5kcG9pbnQucHJvdG9jb2woKTsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLm9wZW4odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIHByb3RvY29sLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIm9wZW4iKTsKLSAgICBpZiAocmV1c2VfYWRkcikKLSAgICB7Ci0gICAgICB0aGlzLT5nZXRfc2VydmljZSgpLnNldF9vcHRpb24odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgICAgc29ja2V0X2Jhc2U6OnJldXNlX2FkZHJlc3ModHJ1ZSksIGVjKTsKLSAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzZXRfb3B0aW9uIik7Ci0gICAgfQotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkuYmluZCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZW5kcG9pbnQsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiYmluZCIpOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkubGlzdGVuKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICBzb2NrZXRfYmFzZTo6bWF4X2Nvbm5lY3Rpb25zLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImxpc3RlbiIpOwotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX3NvY2tldF9hY2NlcHRvciBvbiBhbiBleGlzdGluZyBuYXRpdmUgYWNjZXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gYWNjZXB0b3Igb2JqZWN0IHRvIGhvbGQgYW4gZXhpc3RpbmcgbmF0aXZlCi0gICAqIGFjY2VwdG9yLgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgYWNjZXB0b3Igd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlCi0gICAqIGFjY2VwdG9yLgotICAgKgotICAgKiBAcGFyYW0gcHJvdG9jb2wgQW4gb2JqZWN0IHNwZWNpZnlpbmcgcHJvdG9jb2wgcGFyYW1ldGVycyB0byBiZSB1c2VkLgotICAgKgotICAgKiBAcGFyYW0gbmF0aXZlX2FjY2VwdG9yIEEgbmF0aXZlIGFjY2VwdG9yLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIGJhc2ljX3NvY2tldF9hY2NlcHRvcihhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX2FjY2VwdG9yKQotICAgIDogYmFzaWNfaW9fb2JqZWN0PFNvY2tldEFjY2VwdG9yU2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3NpZ24odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIHByb3RvY29sLCBuYXRpdmVfYWNjZXB0b3IsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiYXNzaWduIik7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIGJhc2ljX3NvY2tldF9hY2NlcHRvciBmcm9tIGFub3RoZXIuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIG1vdmVzIGFuIGFjY2VwdG9yIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3NvY2tldF9hY2NlcHRvciBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZQotICAgKiB3aWxsIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfc29ja2V0X2FjY2VwdG9yKGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIGJhc2ljX3NvY2tldF9hY2NlcHRvcihiYXNpY19zb2NrZXRfYWNjZXB0b3ImJiBvdGhlcikKLSAgICA6IGJhc2ljX2lvX29iamVjdDxTb2NrZXRBY2NlcHRvclNlcnZpY2U+KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChiYXNpY19zb2NrZXRfYWNjZXB0b3IpKG90aGVyKSkKLSAgewotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGEgYmFzaWNfc29ja2V0X2FjY2VwdG9yIGZyb20gYW5vdGhlci4KLSAgLyoqCi0gICAqIFRoaXMgYXNzaWdubWVudCBvcGVyYXRvciBtb3ZlcyBhbiBhY2NlcHRvciBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19zb2NrZXRfYWNjZXB0b3Igb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUKLSAgICogd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3NvY2tldF9hY2NlcHRvcihpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICBiYXNpY19zb2NrZXRfYWNjZXB0b3ImIG9wZXJhdG9yPShiYXNpY19zb2NrZXRfYWNjZXB0b3ImJiBvdGhlcikKLSAgewotICAgIGJhc2ljX2lvX29iamVjdDxTb2NrZXRBY2NlcHRvclNlcnZpY2U+OjpvcGVyYXRvcj0oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX3NvY2tldF9hY2NlcHRvcikob3RoZXIpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBBbGwgc29ja2V0IGFjY2VwdG9ycyBoYXZlIGFjY2VzcyB0byBlYWNoIG90aGVyJ3MgaW1wbGVtZW50YXRpb25zLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxLCB0eXBlbmFtZSBTb2NrZXRBY2NlcHRvclNlcnZpY2UxPgotICBmcmllbmQgY2xhc3MgYmFzaWNfc29ja2V0X2FjY2VwdG9yOwotCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIGJhc2ljX3NvY2tldF9hY2NlcHRvciBmcm9tIGFuIGFjY2VwdG9yIG9mIGFub3RoZXIKLSAgLy8vIHByb3RvY29sIHR5cGUuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIG1vdmVzIGFuIGFjY2VwdG9yIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3NvY2tldF9hY2NlcHRvciBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZQotICAgKiB3aWxsIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfc29ja2V0KGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbDEsIHR5cGVuYW1lIFNvY2tldEFjY2VwdG9yU2VydmljZTE+Ci0gIGJhc2ljX3NvY2tldF9hY2NlcHRvcigKLSAgICAgIGJhc2ljX3NvY2tldF9hY2NlcHRvcjxQcm90b2NvbDEsIFNvY2tldEFjY2VwdG9yU2VydmljZTE+JiYgb3RoZXIsCi0gICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8UHJvdG9jb2wxLCBQcm90b2NvbD46OnZhbHVlPjo6dHlwZSogPSAwKQotICAgIDogYmFzaWNfaW9fb2JqZWN0PFNvY2tldEFjY2VwdG9yU2VydmljZT4ob3RoZXIuZ2V0X2lvX3NlcnZpY2UoKSkKLSAgewotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkudGVtcGxhdGUgY29udmVydGluZ19tb3ZlX2NvbnN0cnVjdDxQcm90b2NvbDE+KAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgb3RoZXIuZ2V0X2ltcGxlbWVudGF0aW9uKCkpOwotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGEgYmFzaWNfc29ja2V0X2FjY2VwdG9yIGZyb20gYW4gYWNjZXB0b3Igb2YgYW5vdGhlciBwcm90b2NvbAotICAvLy8gdHlwZS4KLSAgLyoqCi0gICAqIFRoaXMgYXNzaWdubWVudCBvcGVyYXRvciBtb3ZlcyBhbiBhY2NlcHRvciBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19zb2NrZXRfYWNjZXB0b3Igb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUKLSAgICogd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3NvY2tldChpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxLCB0eXBlbmFtZSBTb2NrZXRBY2NlcHRvclNlcnZpY2UxPgotICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8UHJvdG9jb2wxLCBQcm90b2NvbD46OnZhbHVlLAotICAgICAgYmFzaWNfc29ja2V0X2FjY2VwdG9yPjo6dHlwZSYgb3BlcmF0b3I9KAotICAgICAgICBiYXNpY19zb2NrZXRfYWNjZXB0b3I8UHJvdG9jb2wxLCBTb2NrZXRBY2NlcHRvclNlcnZpY2UxPiYmIG90aGVyKQotICB7Ci0gICAgYmFzaWNfc29ja2V0X2FjY2VwdG9yIHRtcChBU0lPX01PVkVfQ0FTVDIoYmFzaWNfc29ja2V0X2FjY2VwdG9yPAotICAgICAgICAgICAgUHJvdG9jb2wxLCBTb2NrZXRBY2NlcHRvclNlcnZpY2UxPikob3RoZXIpKTsKLSAgICBiYXNpY19pb19vYmplY3Q8U29ja2V0QWNjZXB0b3JTZXJ2aWNlPjo6b3BlcmF0b3I9KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChiYXNpY19zb2NrZXRfYWNjZXB0b3IpKHRtcCkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIE9wZW4gdGhlIGFjY2VwdG9yIHVzaW5nIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBzb2NrZXQgYWNjZXB0b3Igc28gdGhhdCBpdCB3aWxsIHVzZSB0aGUgc3BlY2lmaWVkCi0gICAqIHByb3RvY29sLgotICAgKgotICAgKiBAcGFyYW0gcHJvdG9jb2wgQW4gb2JqZWN0IHNwZWNpZnlpbmcgd2hpY2ggcHJvdG9jb2wgaXMgdG8gYmUgdXNlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjphY2NlcHRvciBhY2NlcHRvcihpb19zZXJ2aWNlKTsKLSAgICogYWNjZXB0b3Iub3Blbihhc2lvOjppcDo6dGNwOjp2NCgpKTsKLSAgICogQGVuZGNvZGUKLSAgICovCi0gIHZvaWQgb3Blbihjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCA9IHByb3RvY29sX3R5cGUoKSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5vcGVuKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBwcm90b2NvbCwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJvcGVuIik7Ci0gIH0KLQotICAvLy8gT3BlbiB0aGUgYWNjZXB0b3IgdXNpbmcgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHNvY2tldCBhY2NlcHRvciBzbyB0aGF0IGl0IHdpbGwgdXNlIHRoZSBzcGVjaWZpZWQKLSAgICogcHJvdG9jb2wuCi0gICAqCi0gICAqIEBwYXJhbSBwcm90b2NvbCBBbiBvYmplY3Qgc3BlY2lmeWluZyB3aGljaCBwcm90b2NvbCBpcyB0byBiZSB1c2VkLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOwotICAgKiBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgKiBhY2NlcHRvci5vcGVuKGFzaW86OmlwOjp0Y3A6OnY0KCksIGVjKTsKLSAgICogaWYgKGVjKQotICAgKiB7Ci0gICAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqIH0KLSAgICogQGVuZGNvZGUKLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgb3Blbihjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkub3Blbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgcHJvdG9jb2wsIGVjKTsKLSAgfQotCi0gIC8vLyBBc3NpZ25zIGFuIGV4aXN0aW5nIG5hdGl2ZSBhY2NlcHRvciB0byB0aGUgYWNjZXB0b3IuCi0gIC8qCi0gICAqIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIGFjY2VwdG9yIHRvIGhvbGQgYW4gZXhpc3RpbmcgbmF0aXZlIGFjY2VwdG9yLgotICAgKgotICAgKiBAcGFyYW0gcHJvdG9jb2wgQW4gb2JqZWN0IHNwZWNpZnlpbmcgd2hpY2ggcHJvdG9jb2wgaXMgdG8gYmUgdXNlZC4KLSAgICoKLSAgICogQHBhcmFtIG5hdGl2ZV9hY2NlcHRvciBBIG5hdGl2ZSBhY2NlcHRvci4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICB2b2lkIGFzc2lnbihjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwKLSAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX2FjY2VwdG9yKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmFzc2lnbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgcHJvdG9jb2wsIG5hdGl2ZV9hY2NlcHRvciwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJhc3NpZ24iKTsKLSAgfQotCi0gIC8vLyBBc3NpZ25zIGFuIGV4aXN0aW5nIG5hdGl2ZSBhY2NlcHRvciB0byB0aGUgYWNjZXB0b3IuCi0gIC8qCi0gICAqIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIGFjY2VwdG9yIHRvIGhvbGQgYW4gZXhpc3RpbmcgbmF0aXZlIGFjY2VwdG9yLgotICAgKgotICAgKiBAcGFyYW0gcHJvdG9jb2wgQW4gb2JqZWN0IHNwZWNpZnlpbmcgd2hpY2ggcHJvdG9jb2wgaXMgdG8gYmUgdXNlZC4KLSAgICoKLSAgICogQHBhcmFtIG5hdGl2ZV9hY2NlcHRvciBBIG5hdGl2ZSBhY2NlcHRvci4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwKLSAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX2FjY2VwdG9yLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzc2lnbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgcHJvdG9jb2wsIG5hdGl2ZV9hY2NlcHRvciwgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBhY2NlcHRvciBpcyBvcGVuLgotICBib29sIGlzX29wZW4oKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuaXNfb3Blbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSk7Ci0gIH0KLQotICAvLy8gQmluZCB0aGUgYWNjZXB0b3IgdG8gdGhlIGdpdmVuIGxvY2FsIGVuZHBvaW50LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBiaW5kcyB0aGUgc29ja2V0IGFjY2VwdG9yIHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgb24gdGhlCi0gICAqIGxvY2FsIG1hY2hpbmUuCi0gICAqCi0gICAqIEBwYXJhbSBlbmRwb2ludCBBbiBlbmRwb2ludCBvbiB0aGUgbG9jYWwgbWFjaGluZSB0byB3aGljaCB0aGUgc29ja2V0Ci0gICAqIGFjY2VwdG9yIHdpbGwgYmUgYm91bmQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3IgYWNjZXB0b3IoaW9fc2VydmljZSk7Ci0gICAqIGFzaW86OmlwOjp0Y3A6OmVuZHBvaW50IGVuZHBvaW50KGFzaW86OmlwOjp0Y3A6OnY0KCksIDEyMzQ1KTsKLSAgICogYWNjZXB0b3Iub3BlbihlbmRwb2ludC5wcm90b2NvbCgpKTsKLSAgICogYWNjZXB0b3IuYmluZChlbmRwb2ludCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB2b2lkIGJpbmQoY29uc3QgZW5kcG9pbnRfdHlwZSYgZW5kcG9pbnQpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkuYmluZCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZW5kcG9pbnQsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiYmluZCIpOwotICB9Ci0KLSAgLy8vIEJpbmQgdGhlIGFjY2VwdG9yIHRvIHRoZSBnaXZlbiBsb2NhbCBlbmRwb2ludC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gYmluZHMgdGhlIHNvY2tldCBhY2NlcHRvciB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50IG9uIHRoZQotICAgKiBsb2NhbCBtYWNoaW5lLgotICAgKgotICAgKiBAcGFyYW0gZW5kcG9pbnQgQW4gZW5kcG9pbnQgb24gdGhlIGxvY2FsIG1hY2hpbmUgdG8gd2hpY2ggdGhlIHNvY2tldAotICAgKiBhY2NlcHRvciB3aWxsIGJlIGJvdW5kLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOwotICAgKiBhc2lvOjppcDo6dGNwOjplbmRwb2ludCBlbmRwb2ludChhc2lvOjppcDo6dGNwOjp2NCgpLCAxMjM0NSk7Ci0gICAqIGFjY2VwdG9yLm9wZW4oZW5kcG9pbnQucHJvdG9jb2woKSk7Ci0gICAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAqIGFjY2VwdG9yLmJpbmQoZW5kcG9pbnQsIGVjKTsKLSAgICogaWYgKGVjKQotICAgKiB7Ci0gICAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqIH0KLSAgICogQGVuZGNvZGUKLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgYmluZChjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYmluZCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZW5kcG9pbnQsIGVjKTsKLSAgfQotCi0gIC8vLyBQbGFjZSB0aGUgYWNjZXB0b3IgaW50byB0aGUgc3RhdGUgd2hlcmUgaXQgd2lsbCBsaXN0ZW4gZm9yIG5ldwotICAvLy8gY29ubmVjdGlvbnMuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHB1dHMgdGhlIHNvY2tldCBhY2NlcHRvciBpbnRvIHRoZSBzdGF0ZSB3aGVyZSBpdCBtYXkgYWNjZXB0Ci0gICAqIG5ldyBjb25uZWN0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIGJhY2tsb2cgVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIGNvbm5lY3Rpb25zLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIHZvaWQgbGlzdGVuKGludCBiYWNrbG9nID0gc29ja2V0X2Jhc2U6Om1heF9jb25uZWN0aW9ucykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5saXN0ZW4odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJhY2tsb2csIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAibGlzdGVuIik7Ci0gIH0KLQotICAvLy8gUGxhY2UgdGhlIGFjY2VwdG9yIGludG8gdGhlIHN0YXRlIHdoZXJlIGl0IHdpbGwgbGlzdGVuIGZvciBuZXcKLSAgLy8vIGNvbm5lY3Rpb25zLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBwdXRzIHRoZSBzb2NrZXQgYWNjZXB0b3IgaW50byB0aGUgc3RhdGUgd2hlcmUgaXQgbWF5IGFjY2VwdAotICAgKiBuZXcgY29ubmVjdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSBiYWNrbG9nIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcXVldWUgb2YgcGVuZGluZyBjb25uZWN0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjphY2NlcHRvciBhY2NlcHRvcihpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAqIGFjY2VwdG9yLmxpc3Rlbihhc2lvOjpzb2NrZXRfYmFzZTo6bWF4X2Nvbm5lY3Rpb25zLCBlYyk7Ci0gICAqIGlmIChlYykKLSAgICogewotICAgKiAgIC8vIEFuIGVycm9yIG9jY3VycmVkLgotICAgKiB9Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIGxpc3RlbihpbnQgYmFja2xvZywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5saXN0ZW4odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJhY2tsb2csIGVjKTsKLSAgfQotCi0gIC8vLyBDbG9zZSB0aGUgYWNjZXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xvc2UgdGhlIGFjY2VwdG9yLiBBbnkgYXN5bmNocm9ub3VzIGFjY2VwdAotICAgKiBvcGVyYXRpb25zIHdpbGwgYmUgY2FuY2VsbGVkIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBBIHN1YnNlcXVlbnQgY2FsbCB0byBvcGVuKCkgaXMgcmVxdWlyZWQgYmVmb3JlIHRoZSBhY2NlcHRvciBjYW4gYWdhaW4gYmUKLSAgICogdXNlZCB0byBhZ2FpbiBwZXJmb3JtIHNvY2tldCBhY2NlcHQgb3BlcmF0aW9ucy4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICB2b2lkIGNsb3NlKCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5jbG9zZSh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJjbG9zZSIpOwotICB9Ci0KLSAgLy8vIENsb3NlIHRoZSBhY2NlcHRvci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbG9zZSB0aGUgYWNjZXB0b3IuIEFueSBhc3luY2hyb25vdXMgYWNjZXB0Ci0gICAqIG9wZXJhdGlvbnMgd2lsbCBiZSBjYW5jZWxsZWQgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEEgc3Vic2VxdWVudCBjYWxsIHRvIG9wZW4oKSBpcyByZXF1aXJlZCBiZWZvcmUgdGhlIGFjY2VwdG9yIGNhbiBhZ2FpbiBiZQotICAgKiB1c2VkIHRvIGFnYWluIHBlcmZvcm0gc29ja2V0IGFjY2VwdCBvcGVyYXRpb25zLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOwotICAgKiAuLi4KLSAgICogYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICogYWNjZXB0b3IuY2xvc2UoZWMpOwotICAgKiBpZiAoZWMpCi0gICAqIHsKLSAgICogICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAgICogfQotICAgKiBAZW5kY29kZQotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBjbG9zZShhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmNsb3NlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gIH0KLQotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlKCkuKSBHZXQgdGhlIG5hdGl2ZSBhY2NlcHRvciByZXByZXNlbnRhdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgKiBhY2NlcHRvci4gVGhpcyBpcyBpbnRlbmRlZCB0byBhbGxvdyBhY2Nlc3MgdG8gbmF0aXZlIGFjY2VwdG9yIGZ1bmN0aW9uYWxpdHkKLSAgICogdGhhdCBpcyBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkLgotICAgKi8KLSAgbmF0aXZlX3R5cGUgbmF0aXZlKCkKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLm5hdGl2ZV9oYW5kbGUodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCkpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbmF0aXZlIGFjY2VwdG9yIHJlcHJlc2VudGF0aW9uLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAqIGFjY2VwdG9yLiBUaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGFjY2VzcyB0byBuYXRpdmUgYWNjZXB0b3IgZnVuY3Rpb25hbGl0eQotICAgKiB0aGF0IGlzIG5vdCBvdGhlcndpc2UgcHJvdmlkZWQuCi0gICAqLwotICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfaGFuZGxlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpKTsKLSAgfQotCi0gIC8vLyBDYW5jZWwgYWxsIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGNhdXNlcyBhbGwgb3V0c3RhbmRpbmcgYXN5bmNocm9ub3VzIGNvbm5lY3QsIHNlbmQgYW5kIHJlY2VpdmUKLSAgICogb3BlcmF0aW9ucyB0byBmaW5pc2ggaW1tZWRpYXRlbHksIGFuZCB0aGUgaGFuZGxlcnMgZm9yIGNhbmNlbGxlZCBvcGVyYXRpb25zCi0gICAqIHdpbGwgYmUgcGFzc2VkIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBjYW5jZWwoKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmNhbmNlbCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJjYW5jZWwiKTsKLSAgfQotCi0gIC8vLyBDYW5jZWwgYWxsIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGNhdXNlcyBhbGwgb3V0c3RhbmRpbmcgYXN5bmNocm9ub3VzIGNvbm5lY3QsIHNlbmQgYW5kIHJlY2VpdmUKLSAgICogb3BlcmF0aW9ucyB0byBmaW5pc2ggaW1tZWRpYXRlbHksIGFuZCB0aGUgaGFuZGxlcnMgZm9yIGNhbmNlbGxlZCBvcGVyYXRpb25zCi0gICAqIHdpbGwgYmUgcGFzc2VkIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5jYW5jZWwodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgfQotCi0gIC8vLyBTZXQgYW4gb3B0aW9uIG9uIHRoZSBhY2NlcHRvci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgYW4gb3B0aW9uIG9uIHRoZSBhY2NlcHRvci4KLSAgICoKLSAgICogQHBhcmFtIG9wdGlvbiBUaGUgbmV3IG9wdGlvbiB2YWx1ZSB0byBiZSBzZXQgb24gdGhlIGFjY2VwdG9yLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQHNhIFNldHRhYmxlU29ja2V0T3B0aW9uIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpyZXVzZV9hZGRyZXNzCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjplbmFibGVfY29ubmVjdGlvbl9hYm9ydGVkCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBTZXR0aW5nIHRoZSBTT0xfU09DS0VUL1NPX1JFVVNFQUREUiBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOwotICAgKiAuLi4KLSAgICogYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3I6OnJldXNlX2FkZHJlc3Mgb3B0aW9uKHRydWUpOwotICAgKiBhY2NlcHRvci5zZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2V0dGFibGVTb2NrZXRPcHRpb24+Ci0gIHZvaWQgc2V0X29wdGlvbihjb25zdCBTZXR0YWJsZVNvY2tldE9wdGlvbiYgb3B0aW9uKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLnNldF9vcHRpb24odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG9wdGlvbiwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzZXRfb3B0aW9uIik7Ci0gIH0KLQotICAvLy8gU2V0IGFuIG9wdGlvbiBvbiB0aGUgYWNjZXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IGFuIG9wdGlvbiBvbiB0aGUgYWNjZXB0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBvcHRpb24gVGhlIG5ldyBvcHRpb24gdmFsdWUgdG8gYmUgc2V0IG9uIHRoZSBhY2NlcHRvci4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBzYSBTZXR0YWJsZVNvY2tldE9wdGlvbiBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6cmV1c2VfYWRkcmVzcwotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6ZW5hYmxlX2Nvbm5lY3Rpb25fYWJvcnRlZAotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogU2V0dGluZyB0aGUgU09MX1NPQ0tFVC9TT19SRVVTRUFERFIgb3B0aW9uOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjphY2NlcHRvciBhY2NlcHRvcihpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yOjpyZXVzZV9hZGRyZXNzIG9wdGlvbih0cnVlKTsKLSAgICogYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICogYWNjZXB0b3Iuc2V0X29wdGlvbihvcHRpb24sIGVjKTsKLSAgICogaWYgKGVjKQotICAgKiB7Ci0gICAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqIH0KLSAgICogQGVuZGNvZGUKLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTZXR0YWJsZVNvY2tldE9wdGlvbj4KLSAgYXNpbzo6ZXJyb3JfY29kZSBzZXRfb3B0aW9uKGNvbnN0IFNldHRhYmxlU29ja2V0T3B0aW9uJiBvcHRpb24sCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLnNldF9vcHRpb24oCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBvcHRpb24sIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgYW4gb3B0aW9uIGZyb20gdGhlIGFjY2VwdG9yLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiBhbiBvcHRpb24gb24gdGhlCi0gICAqIGFjY2VwdG9yLgotICAgKgotICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gdmFsdWUgdG8gYmUgb2J0YWluZWQgZnJvbSB0aGUgYWNjZXB0b3IuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAc2EgR2V0dGFibGVTb2NrZXRPcHRpb24gQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnJldXNlX2FkZHJlc3MKLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEdldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBTT0xfU09DS0VUL1NPX1JFVVNFQUREUiBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOwotICAgKiAuLi4KLSAgICogYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3I6OnJldXNlX2FkZHJlc3Mgb3B0aW9uOwotICAgKiBhY2NlcHRvci5nZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIGJvb2wgaXNfc2V0ID0gb3B0aW9uLmdldCgpOwotICAgKiBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEdldHRhYmxlU29ja2V0T3B0aW9uPgotICB2b2lkIGdldF9vcHRpb24oR2V0dGFibGVTb2NrZXRPcHRpb24mIG9wdGlvbikKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5nZXRfb3B0aW9uKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBvcHRpb24sIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiZ2V0X29wdGlvbiIpOwotICB9Ci0KLSAgLy8vIEdldCBhbiBvcHRpb24gZnJvbSB0aGUgYWNjZXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIGFuIG9wdGlvbiBvbiB0aGUKLSAgICogYWNjZXB0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBvcHRpb24gVGhlIG9wdGlvbiB2YWx1ZSB0byBiZSBvYnRhaW5lZCBmcm9tIHRoZSBhY2NlcHRvci4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBzYSBHZXR0YWJsZVNvY2tldE9wdGlvbiBAbgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6cmV1c2VfYWRkcmVzcwotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogR2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIFNPTF9TT0NLRVQvU09fUkVVU0VBRERSIG9wdGlvbjoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3IgYWNjZXB0b3IoaW9fc2VydmljZSk7Ci0gICAqIC4uLgotICAgKiBhc2lvOjppcDo6dGNwOjphY2NlcHRvcjo6cmV1c2VfYWRkcmVzcyBvcHRpb247Ci0gICAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAqIGFjY2VwdG9yLmdldF9vcHRpb24ob3B0aW9uLCBlYyk7Ci0gICAqIGlmIChlYykKLSAgICogewotICAgKiAgIC8vIEFuIGVycm9yIG9jY3VycmVkLgotICAgKiB9Ci0gICAqIGJvb2wgaXNfc2V0ID0gb3B0aW9uLmdldCgpOwotICAgKiBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEdldHRhYmxlU29ja2V0T3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIGdldF9vcHRpb24oR2V0dGFibGVTb2NrZXRPcHRpb24mIG9wdGlvbiwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuZ2V0X29wdGlvbigKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG9wdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gYW4gSU8gY29udHJvbCBjb21tYW5kIG9uIHRoZSBhY2NlcHRvci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBleGVjdXRlIGFuIElPIGNvbnRyb2wgY29tbWFuZCBvbiB0aGUgYWNjZXB0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBjb21tYW5kIFRoZSBJTyBjb250cm9sIGNvbW1hbmQgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBhY2NlcHRvci4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBzYSBJb0NvbnRyb2xDb21tYW5kIEBuCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpub25fYmxvY2tpbmdfaW8KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEdldHRpbmcgdGhlIG51bWJlciBvZiBieXRlcyByZWFkeSB0byByZWFkOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjphY2NlcHRvciBhY2NlcHRvcihpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yOjpub25fYmxvY2tpbmdfaW8gY29tbWFuZCh0cnVlKTsKLSAgICogc29ja2V0LmlvX2NvbnRyb2woY29tbWFuZCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW9Db250cm9sQ29tbWFuZD4KLSAgdm9pZCBpb19jb250cm9sKElvQ29udHJvbENvbW1hbmQmIGNvbW1hbmQpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkuaW9fY29udHJvbCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgY29tbWFuZCwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJpb19jb250cm9sIik7Ci0gIH0KLQotICAvLy8gUGVyZm9ybSBhbiBJTyBjb250cm9sIGNvbW1hbmQgb24gdGhlIGFjY2VwdG9yLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGV4ZWN1dGUgYW4gSU8gY29udHJvbCBjb21tYW5kIG9uIHRoZSBhY2NlcHRvci4KLSAgICoKLSAgICogQHBhcmFtIGNvbW1hbmQgVGhlIElPIGNvbnRyb2wgY29tbWFuZCB0byBiZSBwZXJmb3JtZWQgb24gdGhlIGFjY2VwdG9yLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHNhIElvQ29udHJvbENvbW1hbmQgQG4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6Om5vbl9ibG9ja2luZ19pbwotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogR2V0dGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWR5IHRvIHJlYWQ6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOwotICAgKiAuLi4KLSAgICogYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3I6Om5vbl9ibG9ja2luZ19pbyBjb21tYW5kKHRydWUpOwotICAgKiBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgKiBzb2NrZXQuaW9fY29udHJvbChjb21tYW5kLCBlYyk7Ci0gICAqIGlmIChlYykKLSAgICogewotICAgKiAgIC8vIEFuIGVycm9yIG9jY3VycmVkLgotICAgKiB9Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW9Db250cm9sQ29tbWFuZD4KLSAgYXNpbzo6ZXJyb3JfY29kZSBpb19jb250cm9sKElvQ29udHJvbENvbW1hbmQmIGNvbW1hbmQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmlvX2NvbnRyb2woCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBjb21tYW5kLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIGFjY2VwdG9yLgotICAvKioKLSAgICogQHJldHVybnMgQGMgdHJ1ZSBpZiB0aGUgYWNjZXB0b3IncyBzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgZmFpbCB3aXRoCi0gICAqIGFzaW86OmVycm9yOjp3b3VsZF9ibG9jayBpZiB0aGV5IGFyZSB1bmFibGUgdG8gcGVyZm9ybSB0aGUgcmVxdWVzdGVkCi0gICAqIG9wZXJhdGlvbiBpbW1lZGlhdGVseS4gSWYgQGMgZmFsc2UsIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMgd2lsbCBibG9jawotICAgKiB1bnRpbCBjb21wbGV0ZS4KLSAgICoKLSAgICogQG5vdGUgVGhlIG5vbi1ibG9ja2luZyBtb2RlIGhhcyBubyBlZmZlY3Qgb24gdGhlIGJlaGF2aW91ciBvZiBhc3luY2hyb25vdXMKLSAgICogb3BlcmF0aW9ucy4gQXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgd2lsbCBuZXZlciBmYWlsIHdpdGggdGhlIGVycm9yCi0gICAqIGFzaW86OmVycm9yOjp3b3VsZF9ibG9jay4KLSAgICovCi0gIGJvb2wgbm9uX2Jsb2NraW5nKCkgY29uc3QKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLm5vbl9ibG9ja2luZyh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSk7Ci0gIH0KLQotICAvLy8gU2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIGFjY2VwdG9yLgotICAvKioKLSAgICogQHBhcmFtIG1vZGUgSWYgQGMgdHJ1ZSwgdGhlIGFjY2VwdG9yJ3Mgc3luY2hyb25vdXMgb3BlcmF0aW9ucyB3aWxsIGZhaWwKLSAgICogd2l0aCBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sgaWYgdGhleSBhcmUgdW5hYmxlIHRvIHBlcmZvcm0gdGhlCi0gICAqIHJlcXVlc3RlZCBvcGVyYXRpb24gaW1tZWRpYXRlbHkuIElmIEBjIGZhbHNlLCBzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwKLSAgICogYmxvY2sgdW50aWwgY29tcGxldGUuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBUaGUgbm9uLWJsb2NraW5nIG1vZGUgaGFzIG5vIGVmZmVjdCBvbiB0aGUgYmVoYXZpb3VyIG9mIGFzeW5jaHJvbm91cwotICAgKiBvcGVyYXRpb25zLiBBc3luY2hyb25vdXMgb3BlcmF0aW9ucyB3aWxsIG5ldmVyIGZhaWwgd2l0aCB0aGUgZXJyb3IKLSAgICogYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrLgotICAgKi8KLSAgdm9pZCBub25fYmxvY2tpbmcoYm9vbCBtb2RlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLm5vbl9ibG9ja2luZyh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgbW9kZSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJub25fYmxvY2tpbmciKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgYWNjZXB0b3IuCi0gIC8qKgotICAgKiBAcGFyYW0gbW9kZSBJZiBAYyB0cnVlLCB0aGUgYWNjZXB0b3IncyBzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgZmFpbAotICAgKiB3aXRoIGFzaW86OmVycm9yOjp3b3VsZF9ibG9jayBpZiB0aGV5IGFyZSB1bmFibGUgdG8gcGVyZm9ybSB0aGUKLSAgICogcmVxdWVzdGVkIG9wZXJhdGlvbiBpbW1lZGlhdGVseS4gSWYgQGMgZmFsc2UsIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMgd2lsbAotICAgKiBibG9jayB1bnRpbCBjb21wbGV0ZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIFRoZSBub24tYmxvY2tpbmcgbW9kZSBoYXMgbm8gZWZmZWN0IG9uIHRoZSBiZWhhdmlvdXIgb2YgYXN5bmNocm9ub3VzCi0gICAqIG9wZXJhdGlvbnMuIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgbmV2ZXIgZmFpbCB3aXRoIHRoZSBlcnJvcgotICAgKiBhc2lvOjplcnJvcjo6d291bGRfYmxvY2suCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIG5vbl9ibG9ja2luZygKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5ub25fYmxvY2tpbmcoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBtb2RlLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIG5hdGl2ZSBhY2NlcHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcKLSAgICogbmF0aXZlIGFjY2VwdG9yLiBUaGlzIG1vZGUgaGFzIG5vIGVmZmVjdCBvbiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBhY2NlcHRvcgotICAgKiBvYmplY3QncyBzeW5jaHJvbm91cyBvcGVyYXRpb25zLgotICAgKgotICAgKiBAcmV0dXJucyBAYyB0cnVlIGlmIHRoZSB1bmRlcmx5aW5nIGFjY2VwdG9yIGlzIGluIG5vbi1ibG9ja2luZyBtb2RlIGFuZAotICAgKiBkaXJlY3Qgc3lzdGVtIGNhbGxzIG1heSBmYWlsIHdpdGggYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrIChvciB0aGUKLSAgICogZXF1aXZhbGVudCBzeXN0ZW0gZXJyb3IpLgotICAgKgotICAgKiBAbm90ZSBUaGUgY3VycmVudCBub24tYmxvY2tpbmcgbW9kZSBpcyBjYWNoZWQgYnkgdGhlIGFjY2VwdG9yIG9iamVjdC4KLSAgICogQ29uc2VxdWVudGx5LCB0aGUgcmV0dXJuIHZhbHVlIG1heSBiZSBpbmNvcnJlY3QgaWYgdGhlIG5vbi1ibG9ja2luZyBtb2RlCi0gICAqIHdhcyBzZXQgZGlyZWN0bHkgb24gdGhlIG5hdGl2ZSBhY2NlcHRvci4KLSAgICovCi0gIGJvb2wgbmF0aXZlX25vbl9ibG9ja2luZygpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfbm9uX2Jsb2NraW5nKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIGFjY2VwdG9yIGltcGxlbWVudGF0aW9uLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG1vZGlmeSB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcKLSAgICogbmF0aXZlIGFjY2VwdG9yLiBJdCBoYXMgbm8gZWZmZWN0IG9uIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGFjY2VwdG9yIG9iamVjdCdzCi0gICAqIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSBtb2RlIElmIEBjIHRydWUsIHRoZSB1bmRlcmx5aW5nIGFjY2VwdG9yIGlzIHB1dCBpbnRvIG5vbi1ibG9ja2luZwotICAgKiBtb2RlIGFuZCBkaXJlY3Qgc3lzdGVtIGNhbGxzIG1heSBmYWlsIHdpdGggYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrCi0gICAqIChvciB0aGUgZXF1aXZhbGVudCBzeXN0ZW0gZXJyb3IpLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4gSWYgdGhlIEBjIG1vZGUgaXMKLSAgICogQGMgZmFsc2UsIGJ1dCB0aGUgY3VycmVudCB2YWx1ZSBvZiBAYyBub25fYmxvY2tpbmcoKSBpcyBAYyB0cnVlLCB0aGlzCi0gICAqIGZ1bmN0aW9uIGZhaWxzIHdpdGggYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQsIGFzIHRoZQotICAgKiBjb21iaW5hdGlvbiBkb2VzIG5vdCBtYWtlIHNlbnNlLgotICAgKi8KLSAgdm9pZCBuYXRpdmVfbm9uX2Jsb2NraW5nKGJvb2wgbW9kZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfbm9uX2Jsb2NraW5nKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgbW9kZSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJuYXRpdmVfbm9uX2Jsb2NraW5nIik7Ci0gIH0KLQotICAvLy8gU2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIG5hdGl2ZSBhY2NlcHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtb2RpZnkgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nCi0gICAqIG5hdGl2ZSBhY2NlcHRvci4gSXQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBhY2NlcHRvciBvYmplY3QncwotICAgKiBzeW5jaHJvbm91cyBvcGVyYXRpb25zLgotICAgKgotICAgKiBAcGFyYW0gbW9kZSBJZiBAYyB0cnVlLCB0aGUgdW5kZXJseWluZyBhY2NlcHRvciBpcyBwdXQgaW50byBub24tYmxvY2tpbmcKLSAgICogbW9kZSBhbmQgZGlyZWN0IHN5c3RlbSBjYWxscyBtYXkgZmFpbCB3aXRoIGFzaW86OmVycm9yOjp3b3VsZF9ibG9jawotICAgKiAob3IgdGhlIGVxdWl2YWxlbnQgc3lzdGVtIGVycm9yKS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuIElmIHRoZSBAYyBtb2RlIGlzCi0gICAqIEBjIGZhbHNlLCBidXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgQGMgbm9uX2Jsb2NraW5nKCkgaXMgQGMgdHJ1ZSwgdGhpcwotICAgKiBmdW5jdGlvbiBmYWlscyB3aXRoIGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50LCBhcyB0aGUKLSAgICogY29tYmluYXRpb24gZG9lcyBub3QgbWFrZSBzZW5zZS4KLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgbmF0aXZlX25vbl9ibG9ja2luZygKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfbm9uX2Jsb2NraW5nKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgbW9kZSwgZWMpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbG9jYWwgZW5kcG9pbnQgb2YgdGhlIGFjY2VwdG9yLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG9idGFpbiB0aGUgbG9jYWxseSBib3VuZCBlbmRwb2ludCBvZiB0aGUgYWNjZXB0b3IuCi0gICAqCi0gICAqIEByZXR1cm5zIEFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2FsIGVuZHBvaW50IG9mIHRoZSBhY2NlcHRvci4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjphY2NlcHRvciBhY2NlcHRvcihpb19zZXJ2aWNlKTsKLSAgICogLi4uCi0gICAqIGFzaW86OmlwOjp0Y3A6OmVuZHBvaW50IGVuZHBvaW50ID0gYWNjZXB0b3IubG9jYWxfZW5kcG9pbnQoKTsKLSAgICogQGVuZGNvZGUKLSAgICovCi0gIGVuZHBvaW50X3R5cGUgbG9jYWxfZW5kcG9pbnQoKSBjb25zdAotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBlbmRwb2ludF90eXBlIGVwID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS5sb2NhbF9lbmRwb2ludCgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAibG9jYWxfZW5kcG9pbnQiKTsKLSAgICByZXR1cm4gZXA7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBsb2NhbCBlbmRwb2ludCBvZiB0aGUgYWNjZXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gb2J0YWluIHRoZSBsb2NhbGx5IGJvdW5kIGVuZHBvaW50IG9mIHRoZSBhY2NlcHRvci4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIEFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2FsIGVuZHBvaW50IG9mIHRoZSBhY2NlcHRvci4KLSAgICogUmV0dXJucyBhIGRlZmF1bHQtY29uc3RydWN0ZWQgZW5kcG9pbnQgb2JqZWN0IGlmIGFuIGVycm9yIG9jY3VycmVkIGFuZCB0aGUKLSAgICogZXJyb3IgaGFuZGxlciBkaWQgbm90IHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOwotICAgKiAuLi4KLSAgICogYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICogYXNpbzo6aXA6OnRjcDo6ZW5kcG9pbnQgZW5kcG9pbnQgPSBhY2NlcHRvci5sb2NhbF9lbmRwb2ludChlYyk7Ci0gICAqIGlmIChlYykKLSAgICogewotICAgKiAgIC8vIEFuIGVycm9yIG9jY3VycmVkLgotICAgKiB9Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICBlbmRwb2ludF90eXBlIGxvY2FsX2VuZHBvaW50KGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkubG9jYWxfZW5kcG9pbnQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgfQotCi0gIC8vLyBBY2NlcHQgYSBuZXcgY29ubmVjdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhY2NlcHQgYSBuZXcgY29ubmVjdGlvbiBmcm9tIGEgcGVlciBpbnRvIHRoZQotICAgKiBnaXZlbiBzb2NrZXQuIFRoZSBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgYSBuZXcgY29ubmVjdGlvbiBoYXMgYmVlbgotICAgKiBhY2NlcHRlZCBzdWNjZXNzZnVsbHkgb3IgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gcGVlciBUaGUgc29ja2V0IGludG8gd2hpY2ggdGhlIG5ldyBjb25uZWN0aW9uIHdpbGwgYmUgYWNjZXB0ZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3IgYWNjZXB0b3IoaW9fc2VydmljZSk7Ci0gICAqIC4uLgotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOwotICAgKiBhY2NlcHRvci5hY2NlcHQoc29ja2V0KTsKLSAgICogQGVuZGNvZGUKLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbDEsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2U+Ci0gIHZvaWQgYWNjZXB0KGJhc2ljX3NvY2tldDxQcm90b2NvbDEsIFNvY2tldFNlcnZpY2U+JiBwZWVyLAotICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPFByb3RvY29sLCBQcm90b2NvbDE+Ojp2YWx1ZT46OnR5cGUqID0gMCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5hY2NlcHQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIHBlZXIsIHN0YXRpY19jYXN0PGVuZHBvaW50X3R5cGUqPigwKSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJhY2NlcHQiKTsKLSAgfQotCi0gIC8vLyBBY2NlcHQgYSBuZXcgY29ubmVjdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhY2NlcHQgYSBuZXcgY29ubmVjdGlvbiBmcm9tIGEgcGVlciBpbnRvIHRoZQotICAgKiBnaXZlbiBzb2NrZXQuIFRoZSBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgYSBuZXcgY29ubmVjdGlvbiBoYXMgYmVlbgotICAgKiBhY2NlcHRlZCBzdWNjZXNzZnVsbHkgb3IgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gcGVlciBUaGUgc29ja2V0IGludG8gd2hpY2ggdGhlIG5ldyBjb25uZWN0aW9uIHdpbGwgYmUgYWNjZXB0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3IgYWNjZXB0b3IoaW9fc2VydmljZSk7Ci0gICAqIC4uLgotICAgKiBhc2lvOjppcDo6dGNwOjpzb29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICogYWNjZXB0b3IuYWNjZXB0KHNvY2tldCwgZWMpOwotICAgKiBpZiAoZWMpCi0gICAqIHsKLSAgICogICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAgICogfQotICAgKiBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sMSwgdHlwZW5hbWUgU29ja2V0U2VydmljZT4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhY2NlcHQoCi0gICAgICBiYXNpY19zb2NrZXQ8UHJvdG9jb2wxLCBTb2NrZXRTZXJ2aWNlPiYgcGVlciwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPFByb3RvY29sLCBQcm90b2NvbDE+Ojp2YWx1ZT46OnR5cGUqID0gMCkKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFjY2VwdCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgcGVlciwgc3RhdGljX2Nhc3Q8ZW5kcG9pbnRfdHlwZSo+KDApLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIGFjY2VwdC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSBhY2NlcHQgYSBuZXcgY29ubmVjdGlvbiBpbnRvIGEKLSAgICogc29ja2V0LiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIHBlZXIgVGhlIHNvY2tldCBpbnRvIHdoaWNoIHRoZSBuZXcgY29ubmVjdGlvbiB3aWxsIGJlIGFjY2VwdGVkLgotICAgKiBPd25lcnNoaXAgb2YgdGhlIHBlZXIgb2JqZWN0IGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QKLSAgICogZ3VhcmFudGVlIHRoYXQgaXQgaXMgdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYWNjZXB0IG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBAY29kZQotICAgKiB2b2lkIGFjY2VwdF9oYW5kbGVyKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yKQotICAgKiB7Ci0gICAqICAgaWYgKCFlcnJvcikKLSAgICogICB7Ci0gICAqICAgICAvLyBBY2NlcHQgc3VjY2VlZGVkLgotICAgKiAgIH0KLSAgICogfQotICAgKgotICAgKiAuLi4KLSAgICoKLSAgICogYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3IgYWNjZXB0b3IoaW9fc2VydmljZSk7Ci0gICAqIC4uLgotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOwotICAgKiBhY2NlcHRvci5hc3luY19hY2NlcHQoc29ja2V0LCBhY2NlcHRfaGFuZGxlcik7Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLCB0eXBlbmFtZSBBY2NlcHRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShBY2NlcHRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSkpCi0gIGFzeW5jX2FjY2VwdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wxLCBTb2NrZXRTZXJ2aWNlPiYgcGVlciwKLSAgICAgIEFTSU9fTU9WRV9BUkcoQWNjZXB0SGFuZGxlcikgaGFuZGxlciwKLSAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxQcm90b2NvbCwgUHJvdG9jb2wxPjo6dmFsdWU+Ojp0eXBlKiA9IDApCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgQWNjZXB0SGFuZGxlci4KLSAgICBBU0lPX0FDQ0VQVF9IQU5ETEVSX0NIRUNLKEFjY2VwdEhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19hY2NlcHQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIHBlZXIsIHN0YXRpY19jYXN0PGVuZHBvaW50X3R5cGUqPigwKSwKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoQWNjZXB0SGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIEFjY2VwdCBhIG5ldyBjb25uZWN0aW9uIGFuZCBvYnRhaW4gdGhlIGVuZHBvaW50IG9mIHRoZSBwZWVyCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWNjZXB0IGEgbmV3IGNvbm5lY3Rpb24gZnJvbSBhIHBlZXIgaW50byB0aGUKLSAgICogZ2l2ZW4gc29ja2V0LCBhbmQgYWRkaXRpb25hbGx5IHByb3ZpZGUgdGhlIGVuZHBvaW50IG9mIHRoZSByZW1vdGUgcGVlci4KLSAgICogVGhlIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jayB1bnRpbCBhIG5ldyBjb25uZWN0aW9uIGhhcyBiZWVuIGFjY2VwdGVkCi0gICAqIHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBwZWVyIFRoZSBzb2NrZXQgaW50byB3aGljaCB0aGUgbmV3IGNvbm5lY3Rpb24gd2lsbCBiZSBhY2NlcHRlZC4KLSAgICoKLSAgICogQHBhcmFtIHBlZXJfZW5kcG9pbnQgQW4gZW5kcG9pbnQgb2JqZWN0IHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgZW5kcG9pbnQgb2YKLSAgICogdGhlIHJlbW90ZSBwZWVyLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOwotICAgKiAuLi4KLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsKLSAgICogYXNpbzo6aXA6OnRjcDo6ZW5kcG9pbnQgZW5kcG9pbnQ7Ci0gICAqIGFjY2VwdG9yLmFjY2VwdChzb2NrZXQsIGVuZHBvaW50KTsKLSAgICogQGVuZGNvZGUKLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlPgotICB2b2lkIGFjY2VwdChiYXNpY19zb2NrZXQ8cHJvdG9jb2xfdHlwZSwgU29ja2V0U2VydmljZT4mIHBlZXIsCi0gICAgICBlbmRwb2ludF90eXBlJiBwZWVyX2VuZHBvaW50KQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmFjY2VwdCh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgcGVlciwgJnBlZXJfZW5kcG9pbnQsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiYWNjZXB0Iik7Ci0gIH0KLQotICAvLy8gQWNjZXB0IGEgbmV3IGNvbm5lY3Rpb24gYW5kIG9idGFpbiB0aGUgZW5kcG9pbnQgb2YgdGhlIHBlZXIKLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhY2NlcHQgYSBuZXcgY29ubmVjdGlvbiBmcm9tIGEgcGVlciBpbnRvIHRoZQotICAgKiBnaXZlbiBzb2NrZXQsIGFuZCBhZGRpdGlvbmFsbHkgcHJvdmlkZSB0aGUgZW5kcG9pbnQgb2YgdGhlIHJlbW90ZSBwZWVyLgotICAgKiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIGEgbmV3IGNvbm5lY3Rpb24gaGFzIGJlZW4gYWNjZXB0ZWQKLSAgICogc3VjY2Vzc2Z1bGx5IG9yIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIHBlZXIgVGhlIHNvY2tldCBpbnRvIHdoaWNoIHRoZSBuZXcgY29ubmVjdGlvbiB3aWxsIGJlIGFjY2VwdGVkLgotICAgKgotICAgKiBAcGFyYW0gcGVlcl9lbmRwb2ludCBBbiBlbmRwb2ludCBvYmplY3Qgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSBlbmRwb2ludCBvZgotICAgKiB0aGUgcmVtb3RlIHBlZXIuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3IgYWNjZXB0b3IoaW9fc2VydmljZSk7Ci0gICAqIC4uLgotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOwotICAgKiBhc2lvOjppcDo6dGNwOjplbmRwb2ludCBlbmRwb2ludDsKLSAgICogYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICogYWNjZXB0b3IuYWNjZXB0KHNvY2tldCwgZW5kcG9pbnQsIGVjKTsKLSAgICogaWYgKGVjKQotICAgKiB7Ci0gICAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqIH0KLSAgICogQGVuZGNvZGUKLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlPgotICBhc2lvOjplcnJvcl9jb2RlIGFjY2VwdCgKLSAgICAgIGJhc2ljX3NvY2tldDxwcm90b2NvbF90eXBlLCBTb2NrZXRTZXJ2aWNlPiYgcGVlciwKLSAgICAgIGVuZHBvaW50X3R5cGUmIHBlZXJfZW5kcG9pbnQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYWNjZXB0KAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgcGVlciwgJnBlZXJfZW5kcG9pbnQsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgYWNjZXB0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IGFjY2VwdCBhIG5ldyBjb25uZWN0aW9uIGludG8gYQotICAgKiBzb2NrZXQsIGFuZCBhZGRpdGlvbmFsbHkgb2J0YWluIHRoZSBlbmRwb2ludCBvZiB0aGUgcmVtb3RlIHBlZXIuIFRoZQotICAgKiBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gcGVlciBUaGUgc29ja2V0IGludG8gd2hpY2ggdGhlIG5ldyBjb25uZWN0aW9uIHdpbGwgYmUgYWNjZXB0ZWQuCi0gICAqIE93bmVyc2hpcCBvZiB0aGUgcGVlciBvYmplY3QgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdAotICAgKiBndWFyYW50ZWUgdGhhdCBpdCBpcyB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBwZWVyX2VuZHBvaW50IEFuIGVuZHBvaW50IG9iamVjdCBpbnRvIHdoaWNoIHRoZSBlbmRwb2ludCBvZiB0aGUKLSAgICogcmVtb3RlIHBlZXIgd2lsbCBiZSB3cml0dGVuLiBPd25lcnNoaXAgb2YgdGhlIHBlZXJfZW5kcG9pbnQgb2JqZWN0IGlzCi0gICAqIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlIHRoYXQgaXQgaXMgdmFsaWQgdW50aWwgdGhlCi0gICAqIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYWNjZXB0IG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICAgKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU29ja2V0U2VydmljZSwgdHlwZW5hbWUgQWNjZXB0SGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoQWNjZXB0SGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUpKQotICBhc3luY19hY2NlcHQoYmFzaWNfc29ja2V0PHByb3RvY29sX3R5cGUsIFNvY2tldFNlcnZpY2U+JiBwZWVyLAotICAgICAgZW5kcG9pbnRfdHlwZSYgcGVlcl9lbmRwb2ludCwgQVNJT19NT1ZFX0FSRyhBY2NlcHRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIEFjY2VwdEhhbmRsZXIuCi0gICAgQVNJT19BQ0NFUFRfSEFORExFUl9DSEVDSyhBY2NlcHRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfYWNjZXB0KHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBwZWVyLAotICAgICAgICAmcGVlcl9lbmRwb2ludCwgQVNJT19NT1ZFX0NBU1QoQWNjZXB0SGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0JBU0lDX1NPQ0tFVF9BQ0NFUFRPUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19zb2NrZXRfaW9zdHJlYW0uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3NvY2tldF9pb3N0cmVhbS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNWQ0YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3NvY2tldF9pb3N0cmVhbS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLy8KLS8vIGJhc2ljX3NvY2tldF9pb3N0cmVhbS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19CQVNJQ19TT0NLRVRfSU9TVFJFQU1fSFBQCi0jZGVmaW5lIEFTSU9fQkFTSUNfU09DS0VUX0lPU1RSRUFNX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotI2luY2x1ZGUgPGlzdHJlYW0+Ci0jaW5jbHVkZSA8b3N0cmVhbT4KLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3NvY2tldF9zdHJlYW1idWYuaHBwIgotI2luY2x1ZGUgImFzaW8vc3RyZWFtX3NvY2tldF9zZXJ2aWNlLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1ZBUklBRElDX1RFTVBMQVRFUykKLQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC92YXJpYWRpY190ZW1wbGF0ZXMuaHBwIgotCi0vLyBBIG1hY3JvIHRoYXQgc2hvdWxkIGV4cGFuZCB0bzoKLS8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCAuLi4sIHR5cGVuYW1lIFRuPgotLy8gICBleHBsaWNpdCBiYXNpY19zb2NrZXRfaW9zdHJlYW0oVDEgeDEsIC4uLiwgVG4geG4pCi0vLyAgICAgOiBzdGQ6OmJhc2ljX2lvc3RyZWFtPGNoYXI+KAotLy8gICAgICAgICAmdGhpcy0+ZGV0YWlsOjpzb2NrZXRfaW9zdHJlYW1fYmFzZTwKLS8vICAgICAgICAgICBQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZSwgVGltZSwKLS8vICAgICAgICAgICBUaW1lVHJhaXRzLCBUaW1lclNlcnZpY2U+OjpzdHJlYW1idWZfKQotLy8gICB7Ci0vLyAgICAgaWYgKHJkYnVmKCktPmNvbm5lY3QoeDEsIC4uLiwgeG4pID09IDApCi0vLyAgICAgICB0aGlzLT5zZXRzdGF0ZShzdGQ6Omlvc19iYXNlOjpmYWlsYml0KTsKLS8vICAgfQotLy8gVGhpcyBtYWNybyBzaG91bGQgb25seSBwZXJzaXN0IHdpdGhpbiB0aGlzIGZpbGUuCi0KLSMgZGVmaW5lIEFTSU9fUFJJVkFURV9DVFJfREVGKG4pIFwKLSAgdGVtcGxhdGUgPEFTSU9fVkFSSUFESUNfVFBBUkFNUyhuKT4gXAotICBleHBsaWNpdCBiYXNpY19zb2NrZXRfaW9zdHJlYW0oQVNJT19WQVJJQURJQ19QQVJBTVMobikpIFwKLSAgICA6IHN0ZDo6YmFzaWNfaW9zdHJlYW08Y2hhcj4oIFwKLSAgICAgICAgJnRoaXMtPmRldGFpbDo6c29ja2V0X2lvc3RyZWFtX2Jhc2U8IFwKLSAgICAgICAgICBQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZSwgVGltZSwgXAotICAgICAgICAgIFRpbWVUcmFpdHMsIFRpbWVyU2VydmljZT46OnN0cmVhbWJ1Zl8pIFwKLSAgeyBcCi0gICAgdGhpcy0+c2V0ZihzdGQ6Omlvc19iYXNlOjp1bml0YnVmKTsgXAotICAgIGlmIChyZGJ1ZigpLT5jb25uZWN0KEFTSU9fVkFSSUFESUNfQVJHUyhuKSkgPT0gMCkgXAotICAgICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7IFwKLSAgfSBcCi0gIC8qKi8KLQotLy8gQSBtYWNybyB0aGF0IHNob3VsZCBleHBhbmQgdG86Ci0vLyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgLi4uLCB0eXBlbmFtZSBUbj4KLS8vICAgdm9pZCBjb25uZWN0KFQxIHgxLCAuLi4sIFRuIHhuKQotLy8gICB7Ci0vLyAgICAgaWYgKHJkYnVmKCktPmNvbm5lY3QoeDEsIC4uLiwgeG4pID09IDApCi0vLyAgICAgICB0aGlzLT5zZXRzdGF0ZShzdGQ6Omlvc19iYXNlOjpmYWlsYml0KTsKLS8vICAgfQotLy8gVGhpcyBtYWNybyBzaG91bGQgb25seSBwZXJzaXN0IHdpdGhpbiB0aGlzIGZpbGUuCi0KLSMgZGVmaW5lIEFTSU9fUFJJVkFURV9DT05ORUNUX0RFRihuKSBcCi0gIHRlbXBsYXRlIDxBU0lPX1ZBUklBRElDX1RQQVJBTVMobik+IFwKLSAgdm9pZCBjb25uZWN0KEFTSU9fVkFSSUFESUNfUEFSQU1TKG4pKSBcCi0gIHsgXAotICAgIGlmIChyZGJ1ZigpLT5jb25uZWN0KEFTSU9fVkFSSUFESUNfQVJHUyhuKSkgPT0gMCkgXAotICAgICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7IFwKLSAgfSBcCi0gIC8qKi8KLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1ZBUklBRElDX1RFTVBMQVRFUykKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLyBBIHNlcGFyYXRlIGJhc2UgY2xhc3MgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgc3RyZWFtYnVmIGlzIGluaXRpYWxpc2VkCi0vLyBwcmlvciB0byB0aGUgYmFzaWNfc29ja2V0X2lvc3RyZWFtJ3MgYmFzaWNfaW9zdHJlYW0gYmFzZSBjbGFzcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgU3RyZWFtU29ja2V0U2VydmljZSwKLSAgICB0eXBlbmFtZSBUaW1lLCB0eXBlbmFtZSBUaW1lVHJhaXRzLCB0eXBlbmFtZSBUaW1lclNlcnZpY2U+Ci1jbGFzcyBzb2NrZXRfaW9zdHJlYW1fYmFzZQotewotcHJvdGVjdGVkOgotICBiYXNpY19zb2NrZXRfc3RyZWFtYnVmPFByb3RvY29sLCBTdHJlYW1Tb2NrZXRTZXJ2aWNlLAotICAgIFRpbWUsIFRpbWVUcmFpdHMsIFRpbWVyU2VydmljZT4gc3RyZWFtYnVmXzsKLX07Ci0KLX0KLQotLy8vIElvc3RyZWFtIGludGVyZmFjZSBmb3IgYSBzb2NrZXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsCi0gICAgdHlwZW5hbWUgU3RyZWFtU29ja2V0U2VydmljZSA9IHN0cmVhbV9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4sCi0jaWYgZGVmaW5lZChBU0lPX0hBU19CT09TVF9EQVRFX1RJTUUpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gICAgdHlwZW5hbWUgVGltZSA9IGJvb3N0Ojpwb3NpeF90aW1lOjpwdGltZSwKLSAgICB0eXBlbmFtZSBUaW1lVHJhaXRzID0gYXNpbzo6dGltZV90cmFpdHM8VGltZT4sCi0gICAgdHlwZW5hbWUgVGltZXJTZXJ2aWNlID0gZGVhZGxpbmVfdGltZXJfc2VydmljZTxUaW1lLCBUaW1lVHJhaXRzPiA+Ci0jZWxzZQotICAgIHR5cGVuYW1lIFRpbWUgPSBzdGVhZHlfdGltZXI6OmNsb2NrX3R5cGUsCi0gICAgdHlwZW5hbWUgVGltZVRyYWl0cyA9IHN0ZWFkeV90aW1lcjo6dHJhaXRzX3R5cGUsCi0gICAgdHlwZW5hbWUgVGltZXJTZXJ2aWNlID0gc3RlYWR5X3RpbWVyOjpzZXJ2aWNlX3R5cGU+Ci0jZW5kaWYKLWNsYXNzIGJhc2ljX3NvY2tldF9pb3N0cmVhbQotICA6IHByaXZhdGUgZGV0YWlsOjpzb2NrZXRfaW9zdHJlYW1fYmFzZTxQcm90b2NvbCwKLSAgICAgICAgU3RyZWFtU29ja2V0U2VydmljZSwgVGltZSwgVGltZVRyYWl0cywgVGltZXJTZXJ2aWNlPiwKLSAgICBwdWJsaWMgc3RkOjpiYXNpY19pb3N0cmVhbTxjaGFyPgotewotcHJpdmF0ZToKLSAgLy8gVGhlc2UgdHlwZWRlZnMgYXJlIGludGVuZGVkIGtlZXAgdGhpcyBjbGFzcydzIGltcGxlbWVudGF0aW9uIGluZGVwZW5kZW50Ci0gIC8vIG9mIHdoZXRoZXIgaXQncyB1c2luZyBCb29zdC5EYXRlVGltZSwgQm9vc3QuQ2hyb25vIG9yIHN0ZDo6Y2hyb25vLgotI2lmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfREFURV9USU1FKQotICB0eXBlZGVmIFRpbWVUcmFpdHMgdHJhaXRzX2hlbHBlcjsKLSNlbHNlCi0gIHR5cGVkZWYgZGV0YWlsOjpjaHJvbm9fdGltZV90cmFpdHM8VGltZSwgVGltZVRyYWl0cz4gdHJhaXRzX2hlbHBlcjsKLSNlbmRpZgotCi1wdWJsaWM6Ci0gIC8vLyBUaGUgZW5kcG9pbnQgdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQgZW5kcG9pbnRfdHlwZTsKLQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gVGhlIHRpbWUgdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBUaW1lVHJhaXRzOjp0aW1lX3R5cGUgdGltZV90eXBlOwotCi0gIC8vLyBUaGUgZHVyYXRpb24gdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBUaW1lVHJhaXRzOjpkdXJhdGlvbl90eXBlIGR1cmF0aW9uX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19oZWxwZXI6OnRpbWVfdHlwZSB0aW1lX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2hlbHBlcjo6ZHVyYXRpb25fdHlwZSBkdXJhdGlvbl90eXBlOwotI2VuZGlmCi0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX3NvY2tldF9pb3N0cmVhbSB3aXRob3V0IGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24uCi0gIGJhc2ljX3NvY2tldF9pb3N0cmVhbSgpCi0gICAgOiBzdGQ6OmJhc2ljX2lvc3RyZWFtPGNoYXI+KAotICAgICAgICAmdGhpcy0+ZGV0YWlsOjpzb2NrZXRfaW9zdHJlYW1fYmFzZTwKLSAgICAgICAgICBQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZSwgVGltZSwKLSAgICAgICAgICBUaW1lVHJhaXRzLCBUaW1lclNlcnZpY2U+OjpzdHJlYW1idWZfKQotICB7Ci0gICAgdGhpcy0+c2V0ZihzdGQ6Omlvc19iYXNlOjp1bml0YnVmKTsKLSAgfQotCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBFc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGFuIGVuZHBvaW50IGNvcnJlc3BvbmRpbmcgdG8gYSByZXNvbHZlciBxdWVyeS4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgYXV0b21hdGljYWxseSBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gYmFzZWQgb24gdGhlCi0gICAqIHN1cHBsaWVkIHJlc29sdmVyIHF1ZXJ5IHBhcmFtZXRlcnMuIFRoZSBhcmd1bWVudHMgYXJlIHVzZWQgdG8gY29uc3RydWN0Ci0gICAqIGEgcmVzb2x2ZXIgcXVlcnkgb2JqZWN0LgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCAuLi4sIHR5cGVuYW1lIFROPgotICBleHBsaWNpdCBiYXNpY19zb2NrZXRfaW9zdHJlYW0oVDEgdDEsIC4uLiwgVE4gdG4pOwotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19WQVJJQURJQ19URU1QTEFURVMpCi0gIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgotICBleHBsaWNpdCBiYXNpY19zb2NrZXRfaW9zdHJlYW0oVC4uLiB4KQotICAgIDogc3RkOjpiYXNpY19pb3N0cmVhbTxjaGFyPigKLSAgICAgICAgJnRoaXMtPmRldGFpbDo6c29ja2V0X2lvc3RyZWFtX2Jhc2U8Ci0gICAgICAgICAgUHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2UsIFRpbWUsCi0gICAgICAgICAgVGltZVRyYWl0cywgVGltZXJTZXJ2aWNlPjo6c3RyZWFtYnVmXykKLSAgewotICAgIHRoaXMtPnNldGYoc3RkOjppb3NfYmFzZTo6dW5pdGJ1Zik7Ci0gICAgaWYgKHJkYnVmKCktPmNvbm5lY3QoeC4uLikgPT0gMCkKLSAgICAgIHRoaXMtPnNldHN0YXRlKHN0ZDo6aW9zX2Jhc2U6OmZhaWxiaXQpOwotICB9Ci0jZWxzZQotICBBU0lPX1ZBUklBRElDX0dFTkVSQVRFKEFTSU9fUFJJVkFURV9DVFJfREVGKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIEVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gYW4gZW5kcG9pbnQgY29ycmVzcG9uZGluZyB0byBhIHJlc29sdmVyIHF1ZXJ5LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiBiYXNlZCBvbiB0aGUgc3VwcGxpZWQKLSAgICogcmVzb2x2ZXIgcXVlcnkgcGFyYW1ldGVycy4gVGhlIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBjb25zdHJ1Y3QgYSByZXNvbHZlcgotICAgKiBxdWVyeSBvYmplY3QuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIC4uLiwgdHlwZW5hbWUgVE4+Ci0gIHZvaWQgY29ubmVjdChUMSB0MSwgLi4uLCBUTiB0bik7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1ZBUklBRElDX1RFTVBMQVRFUykKLSAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+Ci0gIHZvaWQgY29ubmVjdChULi4uIHgpCi0gIHsKLSAgICBpZiAocmRidWYoKS0+Y29ubmVjdCh4Li4uKSA9PSAwKQotICAgICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7Ci0gIH0KLSNlbHNlCi0gIEFTSU9fVkFSSUFESUNfR0VORVJBVEUoQVNJT19QUklWQVRFX0NPTk5FQ1RfREVGKQotI2VuZGlmCi0KLSAgLy8vIENsb3NlIHRoZSBjb25uZWN0aW9uLgotICB2b2lkIGNsb3NlKCkKLSAgewotICAgIGlmIChyZGJ1ZigpLT5jbG9zZSgpID09IDApCi0gICAgICB0aGlzLT5zZXRzdGF0ZShzdGQ6Omlvc19iYXNlOjpmYWlsYml0KTsKLSAgfQotCi0gIC8vLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbWJ1Zi4KLSAgYmFzaWNfc29ja2V0X3N0cmVhbWJ1ZjxQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZSwKLSAgICBUaW1lLCBUaW1lVHJhaXRzLCBUaW1lclNlcnZpY2U+KiByZGJ1ZigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gY29uc3RfY2FzdDxiYXNpY19zb2NrZXRfc3RyZWFtYnVmPFByb3RvY29sLCBTdHJlYW1Tb2NrZXRTZXJ2aWNlLAotICAgICAgVGltZSwgVGltZVRyYWl0cywgVGltZXJTZXJ2aWNlPio+KAotICAgICAgICAmdGhpcy0+ZGV0YWlsOjpzb2NrZXRfaW9zdHJlYW1fYmFzZTwKLSAgICAgICAgICBQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZSwgVGltZSwKLSAgICAgICAgICBUaW1lVHJhaXRzLCBUaW1lclNlcnZpY2U+OjpzdHJlYW1idWZfKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uCi0gIC8qKgotICAgKiBAcmV0dXJuIEFuIFxjIGVycm9yX2NvZGUgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBlcnJvciBmcm9tIHRoZSBzdHJlYW0uCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyBwcmludCB0aGUgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGEgZmFpbHVyZSB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uOgotICAgKiBAY29kZSB0Y3A6Omlvc3RyZWFtIHMoInd3dy5ib29zdC5vcmciLCAiaHR0cCIpOwotICAgKiBpZiAoIXMpCi0gICAqIHsKLSAgICogICBzdGQ6OmNvdXQgPDwgIkVycm9yOiAiIDw8IHMuZXJyb3IoKS5tZXNzYWdlKCkgPDwgc3RkOjplbmRsOwotICAgKiB9IEBlbmRjb2RlCi0gICAqLwotICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvcigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gcmRidWYoKS0+cHViZXJyb3IoKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHN0cmVhbSdzIGV4cGlyeSB0aW1lIGFzIGFuIGFic29sdXRlIHRpbWUuCi0gIC8qKgotICAgKiBAcmV0dXJuIEFuIGFic29sdXRlIHRpbWUgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBzdHJlYW0ncyBleHBpcnkgdGltZS4KLSAgICovCi0gIHRpbWVfdHlwZSBleHBpcmVzX2F0KCkgY29uc3QKLSAgewotICAgIHJldHVybiByZGJ1ZigpLT5leHBpcmVzX2F0KCk7Ci0gIH0KLQotICAvLy8gU2V0IHRoZSBzdHJlYW0ncyBleHBpcnkgdGltZSBhcyBhbiBhYnNvbHV0ZSB0aW1lLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBleHBpcnkgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbS4gU3RyZWFtCi0gICAqIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGFmdGVyIHRoaXMgdGltZSAod2hlcmUgdGhlIG9wZXJhdGlvbnMgY2Fubm90IGJlCi0gICAqIGNvbXBsZXRlZCB1c2luZyB0aGUgaW50ZXJuYWwgYnVmZmVycykgd2lsbCBmYWlsIHdpdGggdGhlIGVycm9yCi0gICAqIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZC4KLSAgICoKLSAgICogQHBhcmFtIGV4cGlyeV90aW1lIFRoZSBleHBpcnkgdGltZSB0byBiZSB1c2VkIGZvciB0aGUgc3RyZWFtLgotICAgKi8KLSAgdm9pZCBleHBpcmVzX2F0KGNvbnN0IHRpbWVfdHlwZSYgZXhwaXJ5X3RpbWUpCi0gIHsKLSAgICByZGJ1ZigpLT5leHBpcmVzX2F0KGV4cGlyeV90aW1lKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHRpbWVyJ3MgZXhwaXJ5IHRpbWUgcmVsYXRpdmUgdG8gbm93LgotICAvKioKLSAgICogQHJldHVybiBBIHJlbGF0aXZlIHRpbWUgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBzdHJlYW0ncyBleHBpcnkgdGltZS4KLSAgICovCi0gIGR1cmF0aW9uX3R5cGUgZXhwaXJlc19mcm9tX25vdygpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gcmRidWYoKS0+ZXhwaXJlc19mcm9tX25vdygpOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgc3RyZWFtJ3MgZXhwaXJ5IHRpbWUgcmVsYXRpdmUgdG8gbm93LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBleHBpcnkgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbS4gU3RyZWFtCi0gICAqIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGFmdGVyIHRoaXMgdGltZSAod2hlcmUgdGhlIG9wZXJhdGlvbnMgY2Fubm90IGJlCi0gICAqIGNvbXBsZXRlZCB1c2luZyB0aGUgaW50ZXJuYWwgYnVmZmVycykgd2lsbCBmYWlsIHdpdGggdGhlIGVycm9yCi0gICAqIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZC4KLSAgICoKLSAgICogQHBhcmFtIGV4cGlyeV90aW1lIFRoZSBleHBpcnkgdGltZSB0byBiZSB1c2VkIGZvciB0aGUgdGltZXIuCi0gICAqLwotICB2b2lkIGV4cGlyZXNfZnJvbV9ub3coY29uc3QgZHVyYXRpb25fdHlwZSYgZXhwaXJ5X3RpbWUpCi0gIHsKLSAgICByZGJ1ZigpLT5leHBpcmVzX2Zyb21fbm93KGV4cGlyeV90aW1lKTsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfVkFSSUFESUNfVEVNUExBVEVTKQotIyB1bmRlZiBBU0lPX1BSSVZBVEVfQ1RSX0RFRgotIyB1bmRlZiBBU0lPX1BSSVZBVEVfQ09OTkVDVF9ERUYKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19WQVJJQURJQ19URU1QTEFURVMpCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0jZW5kaWYgLy8gQVNJT19CQVNJQ19TT0NLRVRfSU9TVFJFQU1fSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc29ja2V0X3N0cmVhbWJ1Zi5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc29ja2V0X3N0cmVhbWJ1Zi5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzliMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3NvY2tldF9zdHJlYW1idWYuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTY3ICswLDAgQEAKLS8vCi0vLyBiYXNpY19zb2NrZXRfc3RyZWFtYnVmLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19CQVNJQ19TT0NLRVRfU1RSRUFNQlVGX0hQUAotI2RlZmluZSBBU0lPX0JBU0lDX1NPQ0tFVF9TVFJFQU1CVUZfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0jaW5jbHVkZSA8c3RyZWFtYnVmPgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc29ja2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RlYWRsaW5lX3RpbWVyX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FycmF5LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3N0cmVhbV9zb2NrZXRfc2VydmljZS5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkKLSMgaW5jbHVkZSAiYXNpby9kZWFkbGluZV90aW1lci5ocHAiCi0jZWxzZQotIyBpbmNsdWRlICJhc2lvL3N0ZWFkeV90aW1lci5ocHAiCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1ZBUklBRElDX1RFTVBMQVRFUykKLQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC92YXJpYWRpY190ZW1wbGF0ZXMuaHBwIgotCi0vLyBBIG1hY3JvIHRoYXQgc2hvdWxkIGV4cGFuZCB0bzoKLS8vICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCAuLi4sIHR5cGVuYW1lIFRuPgotLy8gICBiYXNpY19zb2NrZXRfc3RyZWFtYnVmPFByb3RvY29sLCBTdHJlYW1Tb2NrZXRTZXJ2aWNlLAotLy8gICAgIFRpbWUsIFRpbWVUcmFpdHMsIFRpbWVyU2VydmljZT4qIGNvbm5lY3QoCi0vLyAgICAgICBUMSB4MSwgLi4uLCBUbiB4bikKLS8vICAgewotLy8gICAgIGluaXRfYnVmZmVycygpOwotLy8gICAgIHRoaXMtPmJhc2ljX3NvY2tldDxQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZT46OmNsb3NlKGVjXyk7Ci0vLyAgICAgdHlwZWRlZiB0eXBlbmFtZSBQcm90b2NvbDo6cmVzb2x2ZXIgcmVzb2x2ZXJfdHlwZTsKLS8vICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlc29sdmVyX3R5cGU6OnF1ZXJ5IHJlc29sdmVyX3F1ZXJ5OwotLy8gICAgIHJlc29sdmVyX3F1ZXJ5IHF1ZXJ5KHgxLCAuLi4sIHhuKTsKLS8vICAgICByZXNvbHZlX2FuZF9jb25uZWN0KHF1ZXJ5KTsKLS8vICAgICByZXR1cm4gIWVjXyA/IHRoaXMgOiAwOwotLy8gICB9Ci0vLyBUaGlzIG1hY3JvIHNob3VsZCBvbmx5IHBlcnNpc3Qgd2l0aGluIHRoaXMgZmlsZS4KLQotIyBkZWZpbmUgQVNJT19QUklWQVRFX0NPTk5FQ1RfREVGKG4pIFwKLSAgdGVtcGxhdGUgPEFTSU9fVkFSSUFESUNfVFBBUkFNUyhuKT4gXAotICBiYXNpY19zb2NrZXRfc3RyZWFtYnVmPFByb3RvY29sLCBTdHJlYW1Tb2NrZXRTZXJ2aWNlLCBcCi0gICAgVGltZSwgVGltZVRyYWl0cywgVGltZXJTZXJ2aWNlPiogY29ubmVjdChBU0lPX1ZBUklBRElDX1BBUkFNUyhuKSkgXAotICB7IFwKLSAgICBpbml0X2J1ZmZlcnMoKTsgXAotICAgIHRoaXMtPmJhc2ljX3NvY2tldDxQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZT46OmNsb3NlKGVjXyk7IFwKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFByb3RvY29sOjpyZXNvbHZlciByZXNvbHZlcl90eXBlOyBcCi0gICAgdHlwZWRlZiB0eXBlbmFtZSByZXNvbHZlcl90eXBlOjpxdWVyeSByZXNvbHZlcl9xdWVyeTsgXAotICAgIHJlc29sdmVyX3F1ZXJ5IHF1ZXJ5KEFTSU9fVkFSSUFESUNfQVJHUyhuKSk7IFwKLSAgICByZXNvbHZlX2FuZF9jb25uZWN0KHF1ZXJ5KTsgXAotICAgIHJldHVybiAhZWNfID8gdGhpcyA6IDA7IFwKLSAgfSBcCi0gIC8qKi8KLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1ZBUklBRElDX1RFTVBMQVRFUykKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLyBBIHNlcGFyYXRlIGJhc2UgY2xhc3MgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgaW9fc2VydmljZSBpcyBpbml0aWFsaXNlZAotLy8gcHJpb3IgdG8gdGhlIGJhc2ljX3NvY2tldF9zdHJlYW1idWYncyBiYXNpY19zb2NrZXQgYmFzZSBjbGFzcy4KLWNsYXNzIHNvY2tldF9zdHJlYW1idWZfYmFzZQotewotcHJvdGVjdGVkOgotICBpb19zZXJ2aWNlIGlvX3NlcnZpY2VfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLS8vLyBJb3N0cmVhbSBzdHJlYW1idWYgZm9yIGEgc29ja2V0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLAotICAgIHR5cGVuYW1lIFN0cmVhbVNvY2tldFNlcnZpY2UgPSBzdHJlYW1fc29ja2V0X3NlcnZpY2U8UHJvdG9jb2w+LAotI2lmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfREFURV9USU1FKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAgIHR5cGVuYW1lIFRpbWUgPSBib29zdDo6cG9zaXhfdGltZTo6cHRpbWUsCi0gICAgdHlwZW5hbWUgVGltZVRyYWl0cyA9IGFzaW86OnRpbWVfdHJhaXRzPFRpbWU+LAotICAgIHR5cGVuYW1lIFRpbWVyU2VydmljZSA9IGRlYWRsaW5lX3RpbWVyX3NlcnZpY2U8VGltZSwgVGltZVRyYWl0cz4gPgotI2Vsc2UKLSAgICB0eXBlbmFtZSBUaW1lID0gc3RlYWR5X3RpbWVyOjpjbG9ja190eXBlLAotICAgIHR5cGVuYW1lIFRpbWVUcmFpdHMgPSBzdGVhZHlfdGltZXI6OnRyYWl0c190eXBlLAotICAgIHR5cGVuYW1lIFRpbWVyU2VydmljZSA9IHN0ZWFkeV90aW1lcjo6c2VydmljZV90eXBlPgotI2VuZGlmCi1jbGFzcyBiYXNpY19zb2NrZXRfc3RyZWFtYnVmCi0gIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmLAotICAgIHByaXZhdGUgZGV0YWlsOjpzb2NrZXRfc3RyZWFtYnVmX2Jhc2UsCi0gICAgcHVibGljIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZT4KLXsKLXByaXZhdGU6Ci0gIC8vIFRoZXNlIHR5cGVkZWZzIGFyZSBpbnRlbmRlZCBrZWVwIHRoaXMgY2xhc3MncyBpbXBsZW1lbnRhdGlvbiBpbmRlcGVuZGVudAotICAvLyBvZiB3aGV0aGVyIGl0J3MgdXNpbmcgQm9vc3QuRGF0ZVRpbWUsIEJvb3N0LkNocm9ubyBvciBzdGQ6OmNocm9uby4KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkKLSAgdHlwZWRlZiBUaW1lVHJhaXRzIHRyYWl0c19oZWxwZXI7Ci0jZWxzZQotICB0eXBlZGVmIGRldGFpbDo6Y2hyb25vX3RpbWVfdHJhaXRzPFRpbWUsIFRpbWVUcmFpdHM+IHRyYWl0c19oZWxwZXI7Ci0jZW5kaWYKLQotcHVibGljOgotICAvLy8gVGhlIGVuZHBvaW50IHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB0aW1lIHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgVGltZVRyYWl0czo6dGltZV90eXBlIHRpbWVfdHlwZTsKLQotICAvLy8gVGhlIGR1cmF0aW9uIHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgVGltZVRyYWl0czo6ZHVyYXRpb25fdHlwZSBkdXJhdGlvbl90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfaGVscGVyOjp0aW1lX3R5cGUgdGltZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19oZWxwZXI6OmR1cmF0aW9uX3R5cGUgZHVyYXRpb25fdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19zb2NrZXRfc3RyZWFtYnVmIHdpdGhvdXQgZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbi4KLSAgYmFzaWNfc29ja2V0X3N0cmVhbWJ1ZigpCi0gICAgOiBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+KAotICAgICAgICB0aGlzLT5kZXRhaWw6OnNvY2tldF9zdHJlYW1idWZfYmFzZTo6aW9fc2VydmljZV8pLAotICAgICAgdW5idWZmZXJlZF8oZmFsc2UpLAotICAgICAgdGltZXJfc2VydmljZV8oMCksCi0gICAgICB0aW1lcl9zdGF0ZV8obm9fdGltZXIpCi0gIHsKLSAgICBpbml0X2J1ZmZlcnMoKTsKLSAgfQotCi0gIC8vLyBEZXN0cnVjdG9yIGZsdXNoZXMgYnVmZmVyZWQgZGF0YS4KLSAgdmlydHVhbCB+YmFzaWNfc29ja2V0X3N0cmVhbWJ1ZigpCi0gIHsKLSAgICBpZiAocHB0cigpICE9IHBiYXNlKCkpCi0gICAgICBvdmVyZmxvdyh0cmFpdHNfdHlwZTo6ZW9mKCkpOwotCi0gICAgZGVzdHJveV90aW1lcigpOwotICB9Ci0KLSAgLy8vIEVzdGFibGlzaCBhIGNvbm5lY3Rpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGVzdGFibGlzaGVzIGEgY29ubmVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LgotICAgKgotICAgKiBAcmV0dXJuIFxjIHRoaXMgaWYgYSBjb25uZWN0aW9uIHdhcyBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQsIGEgbnVsbAotICAgKiBwb2ludGVyIG90aGVyd2lzZS4KLSAgICovCi0gIGJhc2ljX3NvY2tldF9zdHJlYW1idWY8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2UsCi0gICAgVGltZSwgVGltZVRyYWl0cywgVGltZXJTZXJ2aWNlPiogY29ubmVjdCgKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIGVuZHBvaW50KQotICB7Ci0gICAgaW5pdF9idWZmZXJzKCk7Ci0KLSAgICB0aGlzLT5iYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+OjpjbG9zZShlY18pOwotCi0gICAgaWYgKHRpbWVyX3N0YXRlXyA9PSB0aW1lcl9oYXNfZXhwaXJlZCkKLSAgICB7Ci0gICAgICBlY18gPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpb19oYW5kbGVyIGhhbmRsZXIgPSB7IHRoaXMgfTsKLSAgICB0aGlzLT5iYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+Ojphc3luY19jb25uZWN0KAotICAgICAgICBlbmRwb2ludCwgaGFuZGxlcik7Ci0KLSAgICBlY18gPSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2s7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5nZXRfaW9fc2VydmljZSgpLnJlc2V0KCk7Ci0gICAgZG8gdGhpcy0+Z2V0X3NlcnZpY2UoKS5nZXRfaW9fc2VydmljZSgpLnJ1bl9vbmUoKTsKLSAgICB3aGlsZSAoZWNfID09IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jayk7Ci0KLSAgICByZXR1cm4gIWVjXyA/IHRoaXMgOiAwOwotICB9Ci0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIEVzdGFibGlzaCBhIGNvbm5lY3Rpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgZXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIGJhc2VkIG9uIHRoZSBzdXBwbGllZAotICAgKiByZXNvbHZlciBxdWVyeSBwYXJhbWV0ZXJzLiBUaGUgYXJndW1lbnRzIGFyZSB1c2VkIHRvIGNvbnN0cnVjdCBhIHJlc29sdmVyCi0gICAqIHF1ZXJ5IG9iamVjdC4KLSAgICoKLSAgICogQHJldHVybiBcYyB0aGlzIGlmIGEgY29ubmVjdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLCBhIG51bGwKLSAgICogcG9pbnRlciBvdGhlcndpc2UuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIC4uLiwgdHlwZW5hbWUgVE4+Ci0gIGJhc2ljX3NvY2tldF9zdHJlYW1idWY8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+KiBjb25uZWN0KAotICAgICAgVDEgdDEsIC4uLiwgVE4gdG4pOwotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19WQVJJQURJQ19URU1QTEFURVMpCi0gIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgotICBiYXNpY19zb2NrZXRfc3RyZWFtYnVmPFByb3RvY29sLCBTdHJlYW1Tb2NrZXRTZXJ2aWNlLAotICAgIFRpbWUsIFRpbWVUcmFpdHMsIFRpbWVyU2VydmljZT4qIGNvbm5lY3QoVC4uLiB4KQotICB7Ci0gICAgaW5pdF9idWZmZXJzKCk7Ci0gICAgdGhpcy0+YmFzaWNfc29ja2V0PFByb3RvY29sLCBTdHJlYW1Tb2NrZXRTZXJ2aWNlPjo6Y2xvc2UoZWNfKTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFByb3RvY29sOjpyZXNvbHZlciByZXNvbHZlcl90eXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVzb2x2ZXJfdHlwZTo6cXVlcnkgcmVzb2x2ZXJfcXVlcnk7Ci0gICAgcmVzb2x2ZXJfcXVlcnkgcXVlcnkoeC4uLik7Ci0gICAgcmVzb2x2ZV9hbmRfY29ubmVjdChxdWVyeSk7Ci0gICAgcmV0dXJuICFlY18gPyB0aGlzIDogMDsKLSAgfQotI2Vsc2UKLSAgQVNJT19WQVJJQURJQ19HRU5FUkFURShBU0lPX1BSSVZBVEVfQ09OTkVDVF9ERUYpCi0jZW5kaWYKLQotICAvLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0gIC8qKgotICAgKiBAcmV0dXJuIFxjIHRoaXMgaWYgYSBjb25uZWN0aW9uIHdhcyBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQsIGEgbnVsbAotICAgKiBwb2ludGVyIG90aGVyd2lzZS4KLSAgICovCi0gIGJhc2ljX3NvY2tldF9zdHJlYW1idWY8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2UsCi0gICAgVGltZSwgVGltZVRyYWl0cywgVGltZXJTZXJ2aWNlPiogY2xvc2UoKQotICB7Ci0gICAgc3luYygpOwotICAgIHRoaXMtPmJhc2ljX3NvY2tldDxQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZT46OmNsb3NlKGVjXyk7Ci0gICAgaWYgKCFlY18pCi0gICAgICBpbml0X2J1ZmZlcnMoKTsKLSAgICByZXR1cm4gIWVjXyA/IHRoaXMgOiAwOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbSBidWZmZXIuCi0gIC8qKgotICAgKiBAcmV0dXJuIEFuIFxjIGVycm9yX2NvZGUgY29ycmVzcG9uZGluZyB0byB0aGUgbGFzdCBlcnJvciBmcm9tIHRoZSBzdHJlYW0KLSAgICogYnVmZmVyLgotICAgKi8KLSAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgcHViZXJyb3IoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGVycm9yKCk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBzdHJlYW0gYnVmZmVyJ3MgZXhwaXJ5IHRpbWUgYXMgYW4gYWJzb2x1dGUgdGltZS4KLSAgLyoqCi0gICAqIEByZXR1cm4gQW4gYWJzb2x1dGUgdGltZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHN0cmVhbSBidWZmZXIncyBleHBpcnkKLSAgICogdGltZS4KLSAgICovCi0gIHRpbWVfdHlwZSBleHBpcmVzX2F0KCkgY29uc3QKLSAgewotICAgIHJldHVybiB0aW1lcl9zZXJ2aWNlXwotICAgICAgPyB0aW1lcl9zZXJ2aWNlXy0+ZXhwaXJlc19hdCh0aW1lcl9pbXBsZW1lbnRhdGlvbl8pCi0gICAgICA6IHRpbWVfdHlwZSgpOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgc3RyZWFtIGJ1ZmZlcidzIGV4cGlyeSB0aW1lIGFzIGFuIGFic29sdXRlIHRpbWUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGV4cGlyeSB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyZWFtLiBTdHJlYW0KLSAgICogb3BlcmF0aW9ucyBwZXJmb3JtZWQgYWZ0ZXIgdGhpcyB0aW1lICh3aGVyZSB0aGUgb3BlcmF0aW9ucyBjYW5ub3QgYmUKLSAgICogY29tcGxldGVkIHVzaW5nIHRoZSBpbnRlcm5hbCBidWZmZXJzKSB3aWxsIGZhaWwgd2l0aCB0aGUgZXJyb3IKLSAgICogYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkLgotICAgKgotICAgKiBAcGFyYW0gZXhwaXJ5X3RpbWUgVGhlIGV4cGlyeSB0aW1lIHRvIGJlIHVzZWQgZm9yIHRoZSBzdHJlYW0uCi0gICAqLwotICB2b2lkIGV4cGlyZXNfYXQoY29uc3QgdGltZV90eXBlJiBleHBpcnlfdGltZSkKLSAgewotICAgIGNvbnN0cnVjdF90aW1lcigpOwotCi0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aW1lcl9zZXJ2aWNlXy0+ZXhwaXJlc19hdCh0aW1lcl9pbXBsZW1lbnRhdGlvbl8sIGV4cGlyeV90aW1lLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImV4cGlyZXNfYXQiKTsKLQotICAgIHN0YXJ0X3RpbWVyKCk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBzdHJlYW0gYnVmZmVyJ3MgZXhwaXJ5IHRpbWUgcmVsYXRpdmUgdG8gbm93LgotICAvKioKLSAgICogQHJldHVybiBBIHJlbGF0aXZlIHRpbWUgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBzdHJlYW0gYnVmZmVyJ3MgZXhwaXJ5IHRpbWUuCi0gICAqLwotICBkdXJhdGlvbl90eXBlIGV4cGlyZXNfZnJvbV9ub3coKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRyYWl0c19oZWxwZXI6OnN1YnRyYWN0KGV4cGlyZXNfYXQoKSwgdHJhaXRzX2hlbHBlcjo6bm93KCkpOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgc3RyZWFtIGJ1ZmZlcidzIGV4cGlyeSB0aW1lIHJlbGF0aXZlIHRvIG5vdy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZXhwaXJ5IHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uIFN0cmVhbQotICAgKiBvcGVyYXRpb25zIHBlcmZvcm1lZCBhZnRlciB0aGlzIHRpbWUgKHdoZXJlIHRoZSBvcGVyYXRpb25zIGNhbm5vdCBiZQotICAgKiBjb21wbGV0ZWQgdXNpbmcgdGhlIGludGVybmFsIGJ1ZmZlcnMpIHdpbGwgZmFpbCB3aXRoIHRoZSBlcnJvcgotICAgKiBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBleHBpcnlfdGltZSBUaGUgZXhwaXJ5IHRpbWUgdG8gYmUgdXNlZCBmb3IgdGhlIHRpbWVyLgotICAgKi8KLSAgdm9pZCBleHBpcmVzX2Zyb21fbm93KGNvbnN0IGR1cmF0aW9uX3R5cGUmIGV4cGlyeV90aW1lKQotICB7Ci0gICAgY29uc3RydWN0X3RpbWVyKCk7Ci0KLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRpbWVyX3NlcnZpY2VfLT5leHBpcmVzX2Zyb21fbm93KHRpbWVyX2ltcGxlbWVudGF0aW9uXywgZXhwaXJ5X3RpbWUsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiZXhwaXJlc19mcm9tX25vdyIpOwotCi0gICAgc3RhcnRfdGltZXIoKTsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIGludF90eXBlIHVuZGVyZmxvdygpCi0gIHsKLSAgICBpZiAoZ3B0cigpID09IGVncHRyKCkpCi0gICAgewotICAgICAgaWYgKHRpbWVyX3N0YXRlXyA9PSB0aW1lcl9oYXNfZXhwaXJlZCkKLSAgICAgIHsKLSAgICAgICAgZWNfID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkOwotICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOwotICAgICAgfQotCi0gICAgICBpb19oYW5kbGVyIGhhbmRsZXIgPSB7IHRoaXMgfTsKLSAgICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfcmVjZWl2ZSh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgICBhc2lvOjpidWZmZXIoYXNpbzo6YnVmZmVyKGdldF9idWZmZXJfKSArIHB1dGJhY2tfbWF4KSwKLSAgICAgICAgICAwLCBoYW5kbGVyKTsKLQotICAgICAgZWNfID0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrOwotICAgICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5nZXRfaW9fc2VydmljZSgpLnJlc2V0KCk7Ci0gICAgICBkbyB0aGlzLT5nZXRfc2VydmljZSgpLmdldF9pb19zZXJ2aWNlKCkucnVuX29uZSgpOwotICAgICAgd2hpbGUgKGVjXyA9PSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2spOwotICAgICAgaWYgKGVjXykKLSAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKLQotICAgICAgc2V0ZygmZ2V0X2J1ZmZlcl9bMF0sICZnZXRfYnVmZmVyX1swXSArIHB1dGJhY2tfbWF4LAotICAgICAgICAgICZnZXRfYnVmZmVyX1swXSArIHB1dGJhY2tfbWF4ICsgYnl0ZXNfdHJhbnNmZXJyZWRfKTsKLSAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKmdwdHIoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOwotICAgIH0KLSAgfQotCi0gIGludF90eXBlIG92ZXJmbG93KGludF90eXBlIGMpCi0gIHsKLSAgICBpZiAodW5idWZmZXJlZF8pCi0gICAgewotICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShjLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQotICAgICAgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvLgotICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6Om5vdF9lb2YoYyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICh0aW1lcl9zdGF0ZV8gPT0gdGltZXJfaGFzX2V4cGlyZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBlY18gPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQ7Ci0gICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlbmQgdGhlIHNpbmdsZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkuCi0gICAgICAgIGNoYXJfdHlwZSBjaCA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoYyk7Ci0gICAgICAgIGlvX2hhbmRsZXIgaGFuZGxlciA9IHsgdGhpcyB9OwotICAgICAgICB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3NlbmQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgICAgICBhc2lvOjpidWZmZXIoJmNoLCBzaXplb2YoY2hhcl90eXBlKSksIDAsIGhhbmRsZXIpOwotCi0gICAgICAgIGVjXyA9IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jazsKLSAgICAgICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5nZXRfaW9fc2VydmljZSgpLnJlc2V0KCk7Ci0gICAgICAgIGRvIHRoaXMtPmdldF9zZXJ2aWNlKCkuZ2V0X2lvX3NlcnZpY2UoKS5ydW5fb25lKCk7Ci0gICAgICAgIHdoaWxlIChlY18gPT0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrKTsKLSAgICAgICAgaWYgKGVjXykKLSAgICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOwotCi0gICAgICAgIHJldHVybiBjOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU2VuZCBhbGwgZGF0YSBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAgICAgIGFzaW86OmNvbnN0X2J1ZmZlciBidWZmZXIgPQotICAgICAgICBhc2lvOjpidWZmZXIocGJhc2UoKSwgcHB0cigpIC0gcGJhc2UoKSk7Ci0gICAgICB3aGlsZSAoYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVyKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmICh0aW1lcl9zdGF0ZV8gPT0gdGltZXJfaGFzX2V4cGlyZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBlY18gPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQ7Ci0gICAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlvX2hhbmRsZXIgaGFuZGxlciA9IHsgdGhpcyB9OwotICAgICAgICB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3NlbmQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgICAgICBhc2lvOjpidWZmZXIoYnVmZmVyKSwgMCwgaGFuZGxlcik7Ci0KLSAgICAgICAgZWNfID0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrOwotICAgICAgICB0aGlzLT5nZXRfc2VydmljZSgpLmdldF9pb19zZXJ2aWNlKCkucmVzZXQoKTsKLSAgICAgICAgZG8gdGhpcy0+Z2V0X3NlcnZpY2UoKS5nZXRfaW9fc2VydmljZSgpLnJ1bl9vbmUoKTsKLSAgICAgICAgd2hpbGUgKGVjXyA9PSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2spOwotICAgICAgICBpZiAoZWNfKQotICAgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7Ci0KLSAgICAgICAgYnVmZmVyID0gYnVmZmVyICsgYnl0ZXNfdHJhbnNmZXJyZWRfOwotICAgICAgfQotICAgICAgc2V0cCgmcHV0X2J1ZmZlcl9bMF0sICZwdXRfYnVmZmVyX1swXSArIHB1dF9idWZmZXJfLnNpemUoKSk7Ci0KLSAgICAgIC8vIElmIHRoZSBuZXcgY2hhcmFjdGVyIGlzIGVvZiB0aGVuIG91ciB3b3JrIGhlcmUgaXMgZG9uZS4KLSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKLSAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjpub3RfZW9mKGMpOwotCi0gICAgICAvLyBBZGQgdGhlIG5ldyBjaGFyYWN0ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIuCi0gICAgICAqcHB0cigpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShjKTsKLSAgICAgIHBidW1wKDEpOwotICAgICAgcmV0dXJuIGM7Ci0gICAgfQotICB9Ci0KLSAgaW50IHN5bmMoKQotICB7Ci0gICAgcmV0dXJuIG92ZXJmbG93KHRyYWl0c190eXBlOjplb2YoKSk7Ci0gIH0KLQotICBzdGQ6OnN0cmVhbWJ1Ziogc2V0YnVmKGNoYXJfdHlwZSogcywgc3RkOjpzdHJlYW1zaXplIG4pCi0gIHsKLSAgICBpZiAocHB0cigpID09IHBiYXNlKCkgJiYgcyA9PSAwICYmIG4gPT0gMCkKLSAgICB7Ci0gICAgICB1bmJ1ZmZlcmVkXyA9IHRydWU7Ci0gICAgICBzZXRwKDAsIDApOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBsYXN0IGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyZWFtIGJ1ZmZlci4KLSAgLyoqCi0gICAqIEByZXR1cm4gQW4gXGMgZXJyb3JfY29kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IGVycm9yIGZyb20gdGhlIHN0cmVhbQotICAgKiBidWZmZXIuCi0gICAqLwotICB2aXJ0dWFsIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yKCkgY29uc3QKLSAgewotICAgIHJldHVybiBlY187Ci0gIH0KLQotcHJpdmF0ZToKLSAgdm9pZCBpbml0X2J1ZmZlcnMoKQotICB7Ci0gICAgc2V0ZygmZ2V0X2J1ZmZlcl9bMF0sCi0gICAgICAgICZnZXRfYnVmZmVyX1swXSArIHB1dGJhY2tfbWF4LAotICAgICAgICAmZ2V0X2J1ZmZlcl9bMF0gKyBwdXRiYWNrX21heCk7Ci0gICAgaWYgKHVuYnVmZmVyZWRfKQotICAgICAgc2V0cCgwLCAwKTsKLSAgICBlbHNlCi0gICAgICBzZXRwKCZwdXRfYnVmZmVyX1swXSwgJnB1dF9idWZmZXJfWzBdICsgcHV0X2J1ZmZlcl8uc2l6ZSgpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXNvbHZlclF1ZXJ5PgotICB2b2lkIHJlc29sdmVfYW5kX2Nvbm5lY3QoY29uc3QgUmVzb2x2ZXJRdWVyeSYgcXVlcnkpCi0gIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFByb3RvY29sOjpyZXNvbHZlciByZXNvbHZlcl90eXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVzb2x2ZXJfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3JfdHlwZTsKLSAgICByZXNvbHZlcl90eXBlIHJlc29sdmVyKGRldGFpbDo6c29ja2V0X3N0cmVhbWJ1Zl9iYXNlOjppb19zZXJ2aWNlXyk7Ci0gICAgaXRlcmF0b3JfdHlwZSBpID0gcmVzb2x2ZXIucmVzb2x2ZShxdWVyeSwgZWNfKTsKLSAgICBpZiAoIWVjXykKLSAgICB7Ci0gICAgICBpdGVyYXRvcl90eXBlIGVuZDsKLSAgICAgIGVjXyA9IGFzaW86OmVycm9yOjpob3N0X25vdF9mb3VuZDsKLSAgICAgIHdoaWxlIChlY18gJiYgaSAhPSBlbmQpCi0gICAgICB7Ci0gICAgICAgIHRoaXMtPmJhc2ljX3NvY2tldDxQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZT46OmNsb3NlKGVjXyk7Ci0KLSAgICAgICAgaWYgKHRpbWVyX3N0YXRlXyA9PSB0aW1lcl9oYXNfZXhwaXJlZCkKLSAgICAgICAgewotICAgICAgICAgIGVjXyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZDsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpb19oYW5kbGVyIGhhbmRsZXIgPSB7IHRoaXMgfTsKLSAgICAgICAgdGhpcy0+YmFzaWNfc29ja2V0PFByb3RvY29sLCBTdHJlYW1Tb2NrZXRTZXJ2aWNlPjo6YXN5bmNfY29ubmVjdCgKLSAgICAgICAgICAgICppLCBoYW5kbGVyKTsKLQotICAgICAgICBlY18gPSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2s7Ci0gICAgICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkuZ2V0X2lvX3NlcnZpY2UoKS5yZXNldCgpOwotICAgICAgICBkbyB0aGlzLT5nZXRfc2VydmljZSgpLmdldF9pb19zZXJ2aWNlKCkucnVuX29uZSgpOwotICAgICAgICB3aGlsZSAoZWNfID09IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jayk7Ci0KLSAgICAgICAgKytpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHN0cnVjdCBpb19oYW5kbGVyOwotICBmcmllbmQgc3RydWN0IGlvX2hhbmRsZXI7Ci0gIHN0cnVjdCBpb19oYW5kbGVyCi0gIHsKLSAgICBiYXNpY19zb2NrZXRfc3RyZWFtYnVmKiB0aGlzXzsKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwKQotICAgIHsKLSAgICAgIHRoaXNfLT5lY18gPSBlYzsKLSAgICAgIHRoaXNfLT5ieXRlc190cmFuc2ZlcnJlZF8gPSBieXRlc190cmFuc2ZlcnJlZDsKLSAgICB9Ci0gIH07Ci0KLSAgc3RydWN0IHRpbWVyX2hhbmRsZXI7Ci0gIGZyaWVuZCBzdHJ1Y3QgdGltZXJfaGFuZGxlcjsKLSAgc3RydWN0IHRpbWVyX2hhbmRsZXIKLSAgewotICAgIGJhc2ljX3NvY2tldF9zdHJlYW1idWYqIHRoaXNfOwotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmKQotICAgIHsKLSAgICAgIHRpbWVfdHlwZSBub3cgPSB0cmFpdHNfaGVscGVyOjpub3coKTsKLQotICAgICAgdGltZV90eXBlIGV4cGlyeV90aW1lID0gdGhpc18tPnRpbWVyX3NlcnZpY2VfLT5leHBpcmVzX2F0KAotICAgICAgICAgICAgdGhpc18tPnRpbWVyX2ltcGxlbWVudGF0aW9uXyk7Ci0KLSAgICAgIGlmICh0cmFpdHNfaGVscGVyOjpsZXNzX3RoYW4obm93LCBleHBpcnlfdGltZSkpCi0gICAgICB7Ci0gICAgICAgIHRoaXNfLT50aW1lcl9zdGF0ZV8gPSB0aW1lcl9pc19wZW5kaW5nOwotICAgICAgICB0aGlzXy0+dGltZXJfc2VydmljZV8tPmFzeW5jX3dhaXQodGhpc18tPnRpbWVyX2ltcGxlbWVudGF0aW9uXywgKnRoaXMpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aGlzXy0+dGltZXJfc3RhdGVfID0gdGltZXJfaGFzX2V4cGlyZWQ7Ci0gICAgICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgICAgIHRoaXNfLT5iYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+OjpjbG9zZShlYyk7Ci0gICAgICB9Ci0gICAgfQotICB9OwotCi0gIHZvaWQgY29uc3RydWN0X3RpbWVyKCkKLSAgewotICAgIGlmICh0aW1lcl9zZXJ2aWNlXyA9PSAwKQotICAgIHsKLSAgICAgIFRpbWVyU2VydmljZSYgdGltZXJfc2VydmljZSA9IHVzZV9zZXJ2aWNlPFRpbWVyU2VydmljZT4oCi0gICAgICAgICAgZGV0YWlsOjpzb2NrZXRfc3RyZWFtYnVmX2Jhc2U6OmlvX3NlcnZpY2VfKTsKLSAgICAgIHRpbWVyX3NlcnZpY2UuY29uc3RydWN0KHRpbWVyX2ltcGxlbWVudGF0aW9uXyk7Ci0gICAgICB0aW1lcl9zZXJ2aWNlXyA9ICZ0aW1lcl9zZXJ2aWNlOwotICAgIH0KLSAgfQotCi0gIHZvaWQgZGVzdHJveV90aW1lcigpCi0gIHsKLSAgICBpZiAodGltZXJfc2VydmljZV8pCi0gICAgICB0aW1lcl9zZXJ2aWNlXy0+ZGVzdHJveSh0aW1lcl9pbXBsZW1lbnRhdGlvbl8pOwotICB9Ci0KLSAgdm9pZCBzdGFydF90aW1lcigpCi0gIHsKLSAgICBpZiAodGltZXJfc3RhdGVfICE9IHRpbWVyX2lzX3BlbmRpbmcpCi0gICAgewotICAgICAgdGltZXJfaGFuZGxlciBoYW5kbGVyID0geyB0aGlzIH07Ci0gICAgICBoYW5kbGVyKGFzaW86OmVycm9yX2NvZGUoKSk7Ci0gICAgfQotICB9Ci0KLSAgZW51bSB7IHB1dGJhY2tfbWF4ID0gOCB9OwotICBlbnVtIHsgYnVmZmVyX3NpemUgPSA1MTIgfTsKLSAgYXNpbzo6ZGV0YWlsOjphcnJheTxjaGFyLCBidWZmZXJfc2l6ZT4gZ2V0X2J1ZmZlcl87Ci0gIGFzaW86OmRldGFpbDo6YXJyYXk8Y2hhciwgYnVmZmVyX3NpemU+IHB1dF9idWZmZXJfOwotICBib29sIHVuYnVmZmVyZWRfOwotICBhc2lvOjplcnJvcl9jb2RlIGVjXzsKLSAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWRfOwotICBUaW1lclNlcnZpY2UqIHRpbWVyX3NlcnZpY2VfOwotICB0eXBlbmFtZSBUaW1lclNlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUgdGltZXJfaW1wbGVtZW50YXRpb25fOwotICBlbnVtIHN0YXRlIHsgbm9fdGltZXIsIHRpbWVyX2lzX3BlbmRpbmcsIHRpbWVyX2hhc19leHBpcmVkIH0gdGltZXJfc3RhdGVfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfVkFSSUFESUNfVEVNUExBVEVTKQotIyB1bmRlZiBBU0lPX1BSSVZBVEVfQ09OTkVDVF9ERUYKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19WQVJJQURJQ19URU1QTEFURVMpCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0jZW5kaWYgLy8gQVNJT19CQVNJQ19TT0NLRVRfU1RSRUFNQlVGX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3N0cmVhbV9zb2NrZXQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3N0cmVhbV9zb2NrZXQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjk2MmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY19zdHJlYW1fc29ja2V0LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDg1MiArMCwwIEBACi0vLwotLy8gYmFzaWNfc3RyZWFtX3NvY2tldC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fQkFTSUNfU1RSRUFNX1NPQ0tFVF9IUFAKLSNkZWZpbmUgQVNJT19CQVNJQ19TVFJFQU1fU09DS0VUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc29ja2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9zdHJlYW1fc29ja2V0X3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0vLy8gUHJvdmlkZXMgc3RyZWFtLW9yaWVudGVkIHNvY2tldCBmdW5jdGlvbmFsaXR5LgotLyoqCi0gKiBUaGUgYmFzaWNfc3RyZWFtX3NvY2tldCBjbGFzcyB0ZW1wbGF0ZSBwcm92aWRlcyBhc3luY2hyb25vdXMgYW5kIGJsb2NraW5nCi0gKiBzdHJlYW0tb3JpZW50ZWQgc29ja2V0IGZ1bmN0aW9uYWxpdHkuCi0gKgotICogQHBhciBUaHJlYWQgU2FmZXR5Ci0gKiBAZSBEaXN0aW5jdCBAZSBvYmplY3RzOiBTYWZlLkBuCi0gKiBAZSBTaGFyZWQgQGUgb2JqZWN0czogVW5zYWZlLgotICoKLSAqIEBwYXIgQ29uY2VwdHM6Ci0gKiBBc3luY1JlYWRTdHJlYW0sIEFzeW5jV3JpdGVTdHJlYW0sIFN0cmVhbSwgU3luY1JlYWRTdHJlYW0sIFN5bmNXcml0ZVN0cmVhbS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLAotICAgIHR5cGVuYW1lIFN0cmVhbVNvY2tldFNlcnZpY2UgPSBzdHJlYW1fc29ja2V0X3NlcnZpY2U8UHJvdG9jb2w+ID4KLWNsYXNzIGJhc2ljX3N0cmVhbV9zb2NrZXQKLSAgOiBwdWJsaWMgYmFzaWNfc29ja2V0PFByb3RvY29sLCBTdHJlYW1Tb2NrZXRTZXJ2aWNlPgotewotcHVibGljOgotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlX3R5cGUuKSBUaGUgbmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mIGEKLSAgLy8vIHNvY2tldC4KLSAgdHlwZWRlZiB0eXBlbmFtZSBTdHJlYW1Tb2NrZXRTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX3R5cGU7Ci0KLSAgLy8vIFRoZSBuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgYSBzb2NrZXQuCi0gIHR5cGVkZWYgdHlwZW5hbWUgU3RyZWFtU29ja2V0U2VydmljZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICAvLy8gVGhlIHByb3RvY29sIHR5cGUuCi0gIHR5cGVkZWYgUHJvdG9jb2wgcHJvdG9jb2xfdHlwZTsKLQotICAvLy8gVGhlIGVuZHBvaW50IHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX3N0cmVhbV9zb2NrZXQgd2l0aG91dCBvcGVuaW5nIGl0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgc3RyZWFtIHNvY2tldCB3aXRob3V0IG9wZW5pbmcgaXQuIFRoZSBzb2NrZXQKLSAgICogbmVlZHMgdG8gYmUgb3BlbmVkIGFuZCB0aGVuIGNvbm5lY3RlZCBvciBhY2NlcHRlZCBiZWZvcmUgZGF0YSBjYW4gYmUgc2VudAotICAgKiBvciByZWNlaXZlZCBvbiBpdC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHN0cmVhbSBzb2NrZXQgd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIHNvY2tldC4KLSAgICovCi0gIGV4cGxpY2l0IGJhc2ljX3N0cmVhbV9zb2NrZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbmQgb3BlbiBhIGJhc2ljX3N0cmVhbV9zb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW5kIG9wZW5zIGEgc3RyZWFtIHNvY2tldC4gVGhlIHNvY2tldCBuZWVkcyB0byBiZQotICAgKiBjb25uZWN0ZWQgb3IgYWNjZXB0ZWQgYmVmb3JlIGRhdGEgY2FuIGJlIHNlbnQgb3IgcmVjZWl2ZWQgb24gaXQuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBzdHJlYW0gc29ja2V0IHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBwcm90b2NvbCBBbiBvYmplY3Qgc3BlY2lmeWluZyBwcm90b2NvbCBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgYmFzaWNfc3RyZWFtX3NvY2tldChhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wpCi0gICAgOiBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+KGlvX3NlcnZpY2UsIHByb3RvY29sKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgYmFzaWNfc3RyZWFtX3NvY2tldCwgb3BlbmluZyBpdCBhbmQgYmluZGluZyBpdCB0byB0aGUgZ2l2ZW4KLSAgLy8vIGxvY2FsIGVuZHBvaW50LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgc3RyZWFtIHNvY2tldCBhbmQgYXV0b21hdGljYWxseSBvcGVucyBpdCBib3VuZAotICAgKiB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50IG9uIHRoZSBsb2NhbCBtYWNoaW5lLiBUaGUgcHJvdG9jb2wgdXNlZCBpcyB0aGUKLSAgICogcHJvdG9jb2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBlbmRwb2ludC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHN0cmVhbSBzb2NrZXQgd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIGVuZHBvaW50IEFuIGVuZHBvaW50IG9uIHRoZSBsb2NhbCBtYWNoaW5lIHRvIHdoaWNoIHRoZSBzdHJlYW0KLSAgICogc29ja2V0IHdpbGwgYmUgYm91bmQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgYmFzaWNfc3RyZWFtX3NvY2tldChhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgZW5kcG9pbnQpCi0gICAgOiBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+KGlvX3NlcnZpY2UsIGVuZHBvaW50KQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgYmFzaWNfc3RyZWFtX3NvY2tldCBvbiBhbiBleGlzdGluZyBuYXRpdmUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgc3RyZWFtIHNvY2tldCBvYmplY3QgdG8gaG9sZCBhbiBleGlzdGluZyBuYXRpdmUKLSAgICogc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgc3RyZWFtIHNvY2tldCB3aWxsIHVzZSB0bwotICAgKiBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gcHJvdG9jb2wgQW4gb2JqZWN0IHNwZWNpZnlpbmcgcHJvdG9jb2wgcGFyYW1ldGVycyB0byBiZSB1c2VkLgotICAgKgotICAgKiBAcGFyYW0gbmF0aXZlX3NvY2tldCBUaGUgbmV3IHVuZGVybHlpbmcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIGJhc2ljX3N0cmVhbV9zb2NrZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwKLSAgICAgIGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sLCBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIG5hdGl2ZV9zb2NrZXQpCi0gICAgOiBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+KAotICAgICAgICBpb19zZXJ2aWNlLCBwcm90b2NvbCwgbmF0aXZlX3NvY2tldCkKLSAgewotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBiYXNpY19zdHJlYW1fc29ja2V0IGZyb20gYW5vdGhlci4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgbW92ZXMgYSBzdHJlYW0gc29ja2V0IGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3N0cmVhbV9zb2NrZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUKLSAgICogd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3N0cmVhbV9zb2NrZXQoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgYmFzaWNfc3RyZWFtX3NvY2tldChiYXNpY19zdHJlYW1fc29ja2V0JiYgb3RoZXIpCi0gICAgOiBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChiYXNpY19zdHJlYW1fc29ja2V0KShvdGhlcikpCi0gIHsKLSAgfQotCi0gIC8vLyBNb3ZlLWFzc2lnbiBhIGJhc2ljX3N0cmVhbV9zb2NrZXQgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBhc3NpZ25tZW50IG9wZXJhdG9yIG1vdmVzIGEgc3RyZWFtIHNvY2tldCBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19zdHJlYW1fc29ja2V0IG9iamVjdCBmcm9tIHdoaWNoIHRoZSBtb3ZlCi0gICAqIHdpbGwgb2NjdXIuCi0gICAqCi0gICAqIEBub3RlIEZvbGxvd2luZyB0aGUgbW92ZSwgdGhlIG1vdmVkLWZyb20gb2JqZWN0IGlzIGluIHRoZSBzYW1lIHN0YXRlIGFzIGlmCi0gICAqIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBAYyBiYXNpY19zdHJlYW1fc29ja2V0KGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIGJhc2ljX3N0cmVhbV9zb2NrZXQmIG9wZXJhdG9yPShiYXNpY19zdHJlYW1fc29ja2V0JiYgb3RoZXIpCi0gIHsKLSAgICBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+OjpvcGVyYXRvcj0oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX3N0cmVhbV9zb2NrZXQpKG90aGVyKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8vIE1vdmUtY29uc3RydWN0IGEgYmFzaWNfc3RyZWFtX3NvY2tldCBmcm9tIGEgc29ja2V0IG9mIGFub3RoZXIgcHJvdG9jb2wKLSAgLy8vIHR5cGUuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIG1vdmVzIGEgc3RyZWFtIHNvY2tldCBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19zdHJlYW1fc29ja2V0IG9iamVjdCBmcm9tIHdoaWNoIHRoZSBtb3ZlCi0gICAqIHdpbGwgb2NjdXIuCi0gICAqCi0gICAqIEBub3RlIEZvbGxvd2luZyB0aGUgbW92ZSwgdGhlIG1vdmVkLWZyb20gb2JqZWN0IGlzIGluIHRoZSBzYW1lIHN0YXRlIGFzIGlmCi0gICAqIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBAYyBiYXNpY19zdHJlYW1fc29ja2V0KGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbDEsIHR5cGVuYW1lIFN0cmVhbVNvY2tldFNlcnZpY2UxPgotICBiYXNpY19zdHJlYW1fc29ja2V0KAotICAgICAgYmFzaWNfc3RyZWFtX3NvY2tldDxQcm90b2NvbDEsIFN0cmVhbVNvY2tldFNlcnZpY2UxPiYmIG90aGVyLAotICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPFByb3RvY29sMSwgUHJvdG9jb2w+Ojp2YWx1ZT46OnR5cGUqID0gMCkKLSAgICA6IGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU3RyZWFtU29ja2V0U2VydmljZT4oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUMihiYXNpY19zdHJlYW1fc29ja2V0PAotICAgICAgICAgIFByb3RvY29sMSwgU3RyZWFtU29ja2V0U2VydmljZTE+KShvdGhlcikpCi0gIHsKLSAgfQotCi0gIC8vLyBNb3ZlLWFzc2lnbiBhIGJhc2ljX3N0cmVhbV9zb2NrZXQgZnJvbSBhIHNvY2tldCBvZiBhbm90aGVyIHByb3RvY29sIHR5cGUuCi0gIC8qKgotICAgKiBUaGlzIGFzc2lnbm1lbnQgb3BlcmF0b3IgbW92ZXMgYSBzdHJlYW0gc29ja2V0IGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3N0cmVhbV9zb2NrZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUKLSAgICogd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3N0cmVhbV9zb2NrZXQoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sMSwgdHlwZW5hbWUgU3RyZWFtU29ja2V0U2VydmljZTE+Ci0gIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTxQcm90b2NvbDEsIFByb3RvY29sPjo6dmFsdWUsCi0gICAgICBiYXNpY19zdHJlYW1fc29ja2V0Pjo6dHlwZSYgb3BlcmF0b3I9KAotICAgICAgICBiYXNpY19zdHJlYW1fc29ja2V0PFByb3RvY29sMSwgU3RyZWFtU29ja2V0U2VydmljZTE+JiYgb3RoZXIpCi0gIHsKLSAgICBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFN0cmVhbVNvY2tldFNlcnZpY2U+OjpvcGVyYXRvcj0oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUMihiYXNpY19zdHJlYW1fc29ja2V0PAotICAgICAgICAgIFByb3RvY29sMSwgU3RyZWFtU29ja2V0U2VydmljZTE+KShvdGhlcikpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIFNlbmQgc29tZSBkYXRhIG9uIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBkYXRhIG9uIHRoZSBzdHJlYW0gc29ja2V0LiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBkYXRhIGhhcyBiZWVuIHNlbnQKLSAgICogc3VjY2Vzc2Z1bGx5LCBvciBhbiB1bnRpbCBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIFRoZSBzZW5kIG9wZXJhdGlvbiBtYXkgbm90IHRyYW5zbWl0IGFsbCBvZiB0aGUgZGF0YSB0byB0aGUgcGVlci4KLSAgICogQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgd3JpdGUgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgYWxsIGRhdGEKLSAgICogaXMgd3JpdHRlbiBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyBzZW5kIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogc29ja2V0LnNlbmQoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBzZW5kaW5nIG11bHRpcGxlCi0gICAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHNlbmQoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPmdldF9zZXJ2aWNlKCkuc2VuZCgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIDAsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic2VuZCIpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIFNlbmQgc29tZSBkYXRhIG9uIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBkYXRhIG9uIHRoZSBzdHJlYW0gc29ja2V0LiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBkYXRhIGhhcyBiZWVuIHNlbnQKLSAgICogc3VjY2Vzc2Z1bGx5LCBvciBhbiB1bnRpbCBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgc2VuZCBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIFRoZSBzZW5kIG9wZXJhdGlvbiBtYXkgbm90IHRyYW5zbWl0IGFsbCBvZiB0aGUgZGF0YSB0byB0aGUgcGVlci4KLSAgICogQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgd3JpdGUgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgYWxsIGRhdGEKLSAgICogaXMgd3JpdHRlbiBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyBzZW5kIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogc29ja2V0LnNlbmQoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCAwKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiBzZW5kaW5nIG11bHRpcGxlCi0gICAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHNlbmQoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gdGhpcy0+Z2V0X3NlcnZpY2UoKS5zZW5kKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgZmxhZ3MsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic2VuZCIpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIFNlbmQgc29tZSBkYXRhIG9uIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBkYXRhIG9uIHRoZSBzdHJlYW0gc29ja2V0LiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBkYXRhIGhhcyBiZWVuIHNlbnQKLSAgICogc3VjY2Vzc2Z1bGx5LCBvciBhbiB1bnRpbCBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSBzZW50IG9uIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBmbGFncyBGbGFncyBzcGVjaWZ5aW5nIGhvdyB0aGUgc2VuZCBjYWxsIGlzIHRvIGJlIG1hZGUuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQuIFJldHVybnMgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgICoKLSAgICogQG5vdGUgVGhlIHNlbmQgb3BlcmF0aW9uIG1heSBub3QgdHJhbnNtaXQgYWxsIG9mIHRoZSBkYXRhIHRvIHRoZSBwZWVyLgotICAgKiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiB3cml0ZSBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCBhbGwgZGF0YQotICAgKiBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBzZW5kKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5zZW5kKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgZmxhZ3MsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgc2VuZC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSBzZW5kIGRhdGEgb24gdGhlIHN0cmVhbSBzb2NrZXQuCi0gICAqIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBkYXRhIGJ1ZmZlcnMgdG8gYmUgc2VudCBvbiB0aGUgc29ja2V0LiBBbHRob3VnaAotICAgKiB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUgdW5kZXJseWluZwotICAgKiBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlIHRoYXQgdGhleQotICAgKiByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc2VuZCBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mCi0gICAqIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHNlbnQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBub3RlIFRoZSBzZW5kIG9wZXJhdGlvbiBtYXkgbm90IHRyYW5zbWl0IGFsbCBvZiB0aGUgZGF0YSB0byB0aGUgcGVlci4KLSAgICogQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgYXN5bmNfd3JpdGUgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgYWxsCi0gICAqIGRhdGEgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gc2VuZCBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIHNvY2tldC5hc3luY19zZW5kKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgaGFuZGxlcik7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gc2VuZGluZyBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfc2VuZChjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV3JpdGVIYW5kbGVyLgotICAgIEFTSU9fV1JJVEVfSEFORExFUl9DSEVDSyhXcml0ZUhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19zZW5kKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgMCwKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgc2VuZCBkYXRhIG9uIHRoZSBzdHJlYW0gc29ja2V0LgotICAgKiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHNlbnQgb24gdGhlIHNvY2tldC4gQWx0aG91Z2gKLSAgICogdGhlIGJ1ZmZlcnMgb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlIHVuZGVybHlpbmcKLSAgICogbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZSB0aGF0IHRoZXkKLSAgICogcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHNwZWNpZnlpbmcgaG93IHRoZSBzZW5kIGNhbGwgaXMgdG8gYmUgbWFkZS4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHNlbmQgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZgotICAgKiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBzZW50LgotICAgKiApOyBAZW5kY29kZQotICAgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gICAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gICAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICAgKgotICAgKiBAbm90ZSBUaGUgc2VuZCBvcGVyYXRpb24gbWF5IG5vdCB0cmFuc21pdCBhbGwgb2YgdGhlIGRhdGEgdG8gdGhlIHBlZXIuCi0gICAqIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIGFzeW5jX3dyaXRlIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFsbAotICAgKiBkYXRhIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHNlbmQgYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBzb2NrZXQuYXN5bmNfc2VuZChhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIDAsIGhhbmRsZXIpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHNlbmRpbmcgbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3NlbmQoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV3JpdGVIYW5kbGVyLgotICAgIEFTSU9fV1JJVEVfSEFORExFUl9DSEVDSyhXcml0ZUhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19zZW5kKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgZmxhZ3MsCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIFJlY2VpdmUgc29tZSBkYXRhIG9uIHRoZSBzb2NrZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSBkYXRhIG9uIHRoZSBzdHJlYW0gc29ja2V0LiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQKLSAgICogc3VjY2Vzc2Z1bGx5LCBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkLgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4gQW4gZXJyb3IgY29kZSBvZgotICAgKiBhc2lvOjplcnJvcjo6ZW9mIGluZGljYXRlcyB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgYnkgdGhlCi0gICAqIHBlZXIuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZWNlaXZlIG9wZXJhdGlvbiBtYXkgbm90IHJlY2VpdmUgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gICAqIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiByZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZQotICAgKiByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWNlaXZlIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcwotICAgKiBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBzb2NrZXQucmVjZWl2ZShhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSkpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlY2VpdmluZyBpbnRvCi0gICAqIG11bHRpcGxlIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVjZWl2ZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnJlY2VpdmUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCAwLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInJlY2VpdmUiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBSZWNlaXZlIHNvbWUgZGF0YSBvbiB0aGUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlY2VpdmUgZGF0YSBvbiB0aGUgc3RyZWFtIHNvY2tldC4gVGhlIGZ1bmN0aW9uCi0gICAqIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkCi0gICAqIHN1Y2Nlc3NmdWxseSwgb3IgdW50aWwgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICoKLSAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHNwZWNpZnlpbmcgaG93IHRoZSByZWNlaXZlIGNhbGwgaXMgdG8gYmUgbWFkZS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIEFuIGVycm9yIGNvZGUgb2YKLSAgICogYXNpbzo6ZXJyb3I6OmVvZiBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZQotICAgKiBwZWVyLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVjZWl2ZSBvcGVyYXRpb24gbWF5IG5vdCByZWNlaXZlIGFsbCBvZiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgotICAgKiBieXRlcy4gQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgcmVhZCBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUKLSAgICogcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQgYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gcmVjZWl2ZSBpbnRvIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMKLSAgICogZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogc29ja2V0LnJlY2VpdmUoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCAwKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWNlaXZpbmcgaW50bwotICAgKiBtdWx0aXBsZSBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlY2VpdmUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnJlY2VpdmUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBmbGFncywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWNlaXZlIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gUmVjZWl2ZSBzb21lIGRhdGEgb24gYSBjb25uZWN0ZWQgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlY2VpdmUgZGF0YSBvbiB0aGUgc3RyZWFtIHNvY2tldC4gVGhlIGZ1bmN0aW9uCi0gICAqIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkCi0gICAqIHN1Y2Nlc3NmdWxseSwgb3IgdW50aWwgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICoKLSAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHNwZWNpZnlpbmcgaG93IHRoZSByZWNlaXZlIGNhbGwgaXMgdG8gYmUgbWFkZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuIFJldHVybnMgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJlY2VpdmUgb3BlcmF0aW9uIG1heSBub3QgcmVjZWl2ZSBhbGwgb2YgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YKLSAgICogYnl0ZXMuIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIHJlYWQgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICAqIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSBpcyByZWFkIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlY2VpdmUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkucmVjZWl2ZSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGZsYWdzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgcmVjZWl2ZSBkYXRhIGZyb20gdGhlIHN0cmVhbQotICAgKiBzb2NrZXQuIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWNlaXZlZC4KLSAgICogQWx0aG91Z2ggdGhlIGJ1ZmZlcnMgb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlCi0gICAqIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICAgKiB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlY2VpdmUgb3BlcmF0aW9uCi0gICAqIGNvbXBsZXRlcy4gQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uCi0gICAqIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJlY2VpdmUgb3BlcmF0aW9uIG1heSBub3QgcmVjZWl2ZSBhbGwgb2YgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YKLSAgICogYnl0ZXMuIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIGFzeW5jX3JlYWQgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlCi0gICAqIHRoYXQgdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSBpcyByZWNlaXZlZCBiZWZvcmUgdGhlIGFzeW5jaHJvbm91cwotICAgKiBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gcmVjZWl2ZSBpbnRvIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMKLSAgICogZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogc29ja2V0LmFzeW5jX3JlY2VpdmUoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWNlaXZpbmcgaW50bwotICAgKiBtdWx0aXBsZSBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVjZWl2ZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICAgIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfcmVjZWl2ZSh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgYnVmZmVycywgMCwgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWNlaXZlIGRhdGEgZnJvbSB0aGUgc3RyZWFtCi0gICAqIHNvY2tldC4gVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlY2VpdmVkLgotICAgKiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUKLSAgICogdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gICAqIHRoYXQgdGhleSByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3Mgc3BlY2lmeWluZyBob3cgdGhlIHJlY2VpdmUgY2FsbCBpcyB0byBiZSBtYWRlLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcmVjZWl2ZSBvcGVyYXRpb24KLSAgICogY29tcGxldGVzLiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24KLSAgICogc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICAgKiApOyBAZW5kY29kZQotICAgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gICAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gICAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVjZWl2ZSBvcGVyYXRpb24gbWF5IG5vdCByZWNlaXZlIGFsbCBvZiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgotICAgKiBieXRlcy4gQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgYXN5bmNfcmVhZCBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUKLSAgICogdGhhdCB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIGlzIHJlY2VpdmVkIGJlZm9yZSB0aGUgYXN5bmNocm9ub3VzCi0gICAqIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWNlaXZlIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcwotICAgKiBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBzb2NrZXQuYXN5bmNfcmVjZWl2ZShhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIDAsIGhhbmRsZXIpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlY2VpdmluZyBpbnRvCi0gICAqIG11bHRpcGxlIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19yZWNlaXZlKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBSZWFkSGFuZGxlci4KLSAgICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3JlY2VpdmUodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIGJ1ZmZlcnMsIGZsYWdzLCBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGRhdGEgdG8gdGhlIHN0cmVhbSBzb2NrZXQuIFRoZSBmdW5jdGlvbiBjYWxsCi0gICAqIHdpbGwgYmxvY2sgdW50aWwgb25lIG9yIG1vcmUgYnl0ZXMgb2YgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgotICAgKiBzdWNjZXNzZnVsbHksIG9yIHVudGlsIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4gQW4gZXJyb3IgY29kZSBvZgotICAgKiBhc2lvOjplcnJvcjo6ZW9mIGluZGljYXRlcyB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgYnkgdGhlCi0gICAqIHBlZXIuCi0gICAqCi0gICAqIEBub3RlIFRoZSB3cml0ZV9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHRyYW5zbWl0IGFsbCBvZiB0aGUgZGF0YSB0byB0aGUKLSAgICogcGVlci4gQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgd3JpdGUgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQKLSAgICogYWxsIGRhdGEgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyB3cml0ZSBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIHNvY2tldC53cml0ZV9zb21lKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSk7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gd3JpdGluZyBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnNlbmQoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCAwLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIndyaXRlX3NvbWUiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3cml0ZSBkYXRhIHRvIHRoZSBzdHJlYW0gc29ja2V0LiBUaGUgZnVuY3Rpb24gY2FsbAotICAgKiB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KLSAgICogc3VjY2Vzc2Z1bGx5LCBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSB3cml0dGVuIHRvIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIFJldHVybnMgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgICoKLSAgICogQG5vdGUgVGhlIHdyaXRlX3NvbWUgb3BlcmF0aW9uIG1heSBub3QgdHJhbnNtaXQgYWxsIG9mIHRoZSBkYXRhIHRvIHRoZQotICAgKiBwZWVyLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiB3cml0ZSBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdAotICAgKiBhbGwgZGF0YSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLnNlbmQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIDAsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd3JpdGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgd3JpdGUgZGF0YSB0byB0aGUgc3RyZWFtIHNvY2tldC4KLSAgICogVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSB3cml0dGVuIHRvIHRoZSBzb2NrZXQuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB3cml0ZSBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mCi0gICAqIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBub3RlIFRoZSB3cml0ZSBvcGVyYXRpb24gbWF5IG5vdCB0cmFuc21pdCBhbGwgb2YgdGhlIGRhdGEgdG8gdGhlIHBlZXIuCi0gICAqIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIGFzeW5jX3dyaXRlIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFsbAotICAgKiBkYXRhIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHdyaXRlIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogc29ja2V0LmFzeW5jX3dyaXRlX3NvbWUoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIG11bHRpcGxlCi0gICAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY193cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBXcml0ZUhhbmRsZXIuCi0gICAgQVNJT19XUklURV9IQU5ETEVSX0NIRUNLKFdyaXRlSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3NlbmQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIGJ1ZmZlcnMsIDAsIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHNvY2tldC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHNvY2tldC4gVGhlIGZ1bmN0aW9uCi0gICAqIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiBkYXRhIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LAotICAgKiBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIEFuIGVycm9yIGNvZGUgb2YKLSAgICogYXNpbzo6ZXJyb3I6OmVvZiBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZQotICAgKiBwZWVyLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVhZF9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gICAqIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiByZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0Ci0gICAqIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWFkIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBzb2NrZXQucmVhZF9zb21lKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSk7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gcmVhZGluZyBpbnRvIG11bHRpcGxlCi0gICAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVhZF9zb21lKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPmdldF9zZXJ2aWNlKCkucmVjZWl2ZSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIDAsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVhZF9zb21lIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gUmVhZCBzb21lIGRhdGEgZnJvbSB0aGUgc29ja2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0gc29ja2V0LiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgaGFzIGJlZW4gcmVhZCBzdWNjZXNzZnVsbHksCi0gICAqIG9yIHVudGlsIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVhZF9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gICAqIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiByZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0Ci0gICAqIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWFkX3NvbWUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZWNlaXZlKAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgYnVmZmVycywgMCwgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWFkLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0gc29ja2V0LgotICAgKiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAgICogQWx0aG91Z2ggdGhlIGJ1ZmZlcnMgb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlCi0gICAqIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICAgKiB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlYWQgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZgotICAgKiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyByZWFkLgotICAgKiApOyBAZW5kY29kZQotICAgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gICAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gICAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVhZCBvcGVyYXRpb24gbWF5IG5vdCByZWFkIGFsbCBvZiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcy4KLSAgICogQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgYXN5bmNfcmVhZCBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUKLSAgICogcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQgYmVmb3JlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uCi0gICAqIGNvbXBsZXRlcy4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHJlYWQgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIHNvY2tldC5hc3luY19yZWFkX3NvbWUoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWFkaW5nIGludG8gbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICAgIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfcmVjZWl2ZSh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgYnVmZmVycywgMCwgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19CQVNJQ19TVFJFQU1fU09DS0VUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3N0cmVhbWJ1Zi5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc3RyZWFtYnVmLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhYThlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc3RyZWFtYnVmLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vLwotLy8gYmFzaWNfc3RyZWFtYnVmLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0JBU0lDX1NUUkVBTUJVRl9IUFAKLSNkZWZpbmUgQVNJT19CQVNJQ19TVFJFQU1CVUZfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiYXNpby9iYXNpY19zdHJlYW1idWZfZndkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2J1ZmZlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbGltaXRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXhjZXB0aW9uLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIEF1dG9tYXRpY2FsbHkgcmVzaXphYmxlIGJ1ZmZlciBjbGFzcyBiYXNlZCBvbiBzdGQ6OnN0cmVhbWJ1Zi4KLS8qKgotICogVGhlIEBjIGJhc2ljX3N0cmVhbWJ1ZiBjbGFzcyBpcyBkZXJpdmVkIGZyb20gQGMgc3RkOjpzdHJlYW1idWYgdG8gYXNzb2NpYXRlCi0gKiB0aGUgc3RyZWFtYnVmJ3MgaW5wdXQgYW5kIG91dHB1dCBzZXF1ZW5jZXMgd2l0aCBvbmUgb3IgbW9yZSBjaGFyYWN0ZXIKLSAqIGFycmF5cy4gVGhlc2UgY2hhcmFjdGVyIGFycmF5cyBhcmUgaW50ZXJuYWwgdG8gdGhlIEBjIGJhc2ljX3N0cmVhbWJ1ZgotICogb2JqZWN0LCBidXQgZGlyZWN0IGFjY2VzcyB0byB0aGUgYXJyYXkgZWxlbWVudHMgaXMgcHJvdmlkZWQgdG8gcGVybWl0IHRoZW0KLSAqIHRvIGJlIHVzZWQgZWZmaWNpZW50bHkgd2l0aCBJL08gb3BlcmF0aW9ucy4gQ2hhcmFjdGVycyB3cml0dGVuIHRvIHRoZSBvdXRwdXQKLSAqIHNlcXVlbmNlIG9mIGEgQGMgYmFzaWNfc3RyZWFtYnVmIG9iamVjdCBhcmUgYXBwZW5kZWQgdG8gdGhlIGlucHV0IHNlcXVlbmNlCi0gKiBvZiB0aGUgc2FtZSBvYmplY3QuCi0gKgotICogVGhlIEBjIGJhc2ljX3N0cmVhbWJ1ZiBjbGFzcydzIHB1YmxpYyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gcGVybWl0IHRoZQotICogZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIHN0cmF0ZWdpZXM6Ci0gKgotICogQGxpIEEgc2luZ2xlIGNvbnRpZ3VvdXMgY2hhcmFjdGVyIGFycmF5LCB3aGljaCBpcyByZWFsbG9jYXRlZCBhcyBuZWNlc3NhcnkKLSAqIHRvIGFjY29tbW9kYXRlIGNoYW5nZXMgaW4gdGhlIHNpemUgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4gVGhpcyBpcyB0aGUKLSAqIGltcGxlbWVudGF0aW9uIGFwcHJvYWNoIGN1cnJlbnRseSB1c2VkIGluIEFzaW8uCi0gKgotICogQGxpIEEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVyIGFycmF5cywgd2hlcmUgZWFjaCBhcnJheSBpcyBvZiB0aGUKLSAqIHNhbWUgc2l6ZS4gQWRkaXRpb25hbCBjaGFyYWN0ZXIgYXJyYXkgb2JqZWN0cyBhcmUgYXBwZW5kZWQgdG8gdGhlIHNlcXVlbmNlCi0gKiB0byBhY2NvbW1vZGF0ZSBjaGFuZ2VzIGluIHRoZSBzaXplIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuCi0gKgotICogQGxpIEEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVyIGFycmF5cyBvZiB2YXJ5aW5nIHNpemVzLiBBZGRpdGlvbmFsCi0gKiBjaGFyYWN0ZXIgYXJyYXkgb2JqZWN0cyBhcmUgYXBwZW5kZWQgdG8gdGhlIHNlcXVlbmNlIHRvIGFjY29tbW9kYXRlIGNoYW5nZXMKLSAqIGluIHRoZSBzaXplIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuCi0gKgotICogVGhlIGNvbnN0cnVjdG9yIGZvciBiYXNpY19zdHJlYW1idWYgYWNjZXB0cyBhIEBjIHNpemVfdCBhcmd1bWVudCBzcGVjaWZ5aW5nCi0gKiB0aGUgbWF4aW11bSBvZiB0aGUgc3VtIG9mIHRoZSBzaXplcyBvZiB0aGUgaW5wdXQgc2VxdWVuY2UgYW5kIG91dHB1dAotICogc2VxdWVuY2UuIER1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIEBjIGJhc2ljX3N0cmVhbWJ1ZiBvYmplY3QsIHRoZSBmb2xsb3dpbmcKLSAqIGludmFyaWFudCBob2xkczoKLSAqIEBjb2RlIHNpemUoKSA8PSBtYXhfc2l6ZSgpQGVuZGNvZGUKLSAqIEFueSBtZW1iZXIgZnVuY3Rpb24gdGhhdCB3b3VsZCwgaWYgc3VjY2Vzc2Z1bCwgY2F1c2UgdGhlIGludmFyaWFudCB0byBiZQotICogdmlvbGF0ZWQgc2hhbGwgdGhyb3cgYW4gZXhjZXB0aW9uIG9mIGNsYXNzIEBjIHN0ZDo6bGVuZ3RoX2Vycm9yLgotICoKLSAqIFRoZSBjb25zdHJ1Y3RvciBmb3IgQGMgYmFzaWNfc3RyZWFtYnVmIHRha2VzIGFuIEFsbG9jYXRvciBhcmd1bWVudC4gQSBjb3B5Ci0gKiBvZiB0aGlzIGFyZ3VtZW50IGlzIHVzZWQgZm9yIGFueSBtZW1vcnkgYWxsb2NhdGlvbiBwZXJmb3JtZWQsIGJ5IHRoZQotICogY29uc3RydWN0b3IgYW5kIGJ5IGFsbCBtZW1iZXIgZnVuY3Rpb25zLCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGVhY2ggQGMKLSAqIGJhc2ljX3N0cmVhbWJ1ZiBvYmplY3QuCi0gKgotICogQHBhciBFeGFtcGxlcwotICogV3JpdGluZyBkaXJlY3RseSBmcm9tIGFuIHN0cmVhbWJ1ZiB0byBhIHNvY2tldDoKLSAqIEBjb2RlCi0gKiBhc2lvOjpzdHJlYW1idWYgYjsKLSAqIHN0ZDo6b3N0cmVhbSBvcygmYik7Ci0gKiBvcyA8PCAiSGVsbG8sIFdvcmxkIVxuIjsKLSAqCi0gKiAvLyB0cnkgc2VuZGluZyBzb21lIGRhdGEgaW4gaW5wdXQgc2VxdWVuY2UKLSAqIHNpemVfdCBuID0gc29jay5zZW5kKGIuZGF0YSgpKTsKLSAqCi0gKiBiLmNvbnN1bWUobik7IC8vIHNlbnQgZGF0YSBpcyByZW1vdmVkIGZyb20gaW5wdXQgc2VxdWVuY2UKLSAqIEBlbmRjb2RlCi0gKgotICogUmVhZGluZyBmcm9tIGEgc29ja2V0IGRpcmVjdGx5IGludG8gYSBzdHJlYW1idWY6Ci0gKiBAY29kZQotICogYXNpbzo6c3RyZWFtYnVmIGI7Ci0gKgotICogLy8gcmVzZXJ2ZSA1MTIgYnl0ZXMgaW4gb3V0cHV0IHNlcXVlbmNlCi0gKiBhc2lvOjpzdHJlYW1idWY6Om11dGFibGVfYnVmZmVyc190eXBlIGJ1ZnMgPSBiLnByZXBhcmUoNTEyKTsKLSAqCi0gKiBzaXplX3QgbiA9IHNvY2sucmVjZWl2ZShidWZzKTsKLSAqCi0gKiAvLyByZWNlaXZlZCBkYXRhIGlzICJjb21taXR0ZWQiIGZyb20gb3V0cHV0IHNlcXVlbmNlIHRvIGlucHV0IHNlcXVlbmNlCi0gKiBiLmNvbW1pdChuKTsKLSAqCi0gKiBzdGQ6OmlzdHJlYW0gaXMoJmIpOwotICogc3RkOjpzdHJpbmcgczsKLSAqIGlzID4+IHM7Ci0gKiBAZW5kY29kZQotICovCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgotI2Vsc2UKLXRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3I+Ci0jZW5kaWYKLWNsYXNzIGJhc2ljX3N0cmVhbWJ1ZgotICA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZiwKLSAgICBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBUaGUgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgaW5wdXQgc2VxdWVuY2UgYXMgYSBsaXN0IG9mIGJ1ZmZlcnMuCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBjb25zdF9idWZmZXJzX3R5cGU7Ci0KLSAgLy8vIFRoZSB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBvdXRwdXQgc2VxdWVuY2UgYXMgYSBsaXN0IG9mIGJ1ZmZlcnMuCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBtdXRhYmxlX2J1ZmZlcnNfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgYXNpbzo6Y29uc3RfYnVmZmVyc18xIGNvbnN0X2J1ZmZlcnNfdHlwZTsKLSAgdHlwZWRlZiBhc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSBtdXRhYmxlX2J1ZmZlcnNfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19zdHJlYW1idWYgb2JqZWN0LgotICAvKioKLSAgICogQ29uc3RydWN0cyBhIHN0cmVhbWJ1ZiB3aXRoIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBzaXplLiBUaGUgaW5pdGlhbCBzaXplCi0gICAqIG9mIHRoZSBzdHJlYW1idWYncyBpbnB1dCBzZXF1ZW5jZSBpcyAwLgotICAgKi8KLSAgZXhwbGljaXQgYmFzaWNfc3RyZWFtYnVmKAotICAgICAgc3RkOjpzaXplX3QgbWF4aW11bV9zaXplID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgpKCksCi0gICAgICBjb25zdCBBbGxvY2F0b3ImIGFsbG9jYXRvciA9IEFsbG9jYXRvcigpKQotICAgIDogbWF4X3NpemVfKG1heGltdW1fc2l6ZSksCi0gICAgICBidWZmZXJfKGFsbG9jYXRvcikKLSAgewotICAgIHN0ZDo6c2l6ZV90IHBlbmQgPSAoc3RkOjptaW48c3RkOjpzaXplX3Q+KShtYXhfc2l6ZV8sIGJ1ZmZlcl9kZWx0YSk7Ci0gICAgYnVmZmVyXy5yZXNpemUoKHN0ZDo6bWF4PHN0ZDo6c2l6ZV90PikocGVuZCwgMSkpOwotICAgIHNldGcoJmJ1ZmZlcl9bMF0sICZidWZmZXJfWzBdLCAmYnVmZmVyX1swXSk7Ci0gICAgc2V0cCgmYnVmZmVyX1swXSwgJmJ1ZmZlcl9bMF0gKyBwZW5kKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHNpemUgb2YgdGhlIGlucHV0IHNlcXVlbmNlLgotICAvKioKLSAgICogQHJldHVybnMgVGhlIHNpemUgb2YgdGhlIGlucHV0IHNlcXVlbmNlLiBUaGUgdmFsdWUgaXMgZXF1YWwgdG8gdGhhdAotICAgKiBjYWxjdWxhdGVkIGZvciBAYyBzIGluIHRoZSBmb2xsb3dpbmcgY29kZToKLSAgICogQGNvZGUKLSAgICogc2l6ZV90IHMgPSAwOwotICAgKiBjb25zdF9idWZmZXJzX3R5cGUgYnVmcyA9IGRhdGEoKTsKLSAgICogY29uc3RfYnVmZmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBpID0gYnVmcy5iZWdpbigpOwotICAgKiB3aGlsZSAoaSAhPSBidWZzLmVuZCgpKQotICAgKiB7Ci0gICAqICAgY29uc3RfYnVmZmVyIGJ1ZigqaSsrKTsKLSAgICogICBzICs9IGJ1ZmZlcl9zaXplKGJ1Zik7Ci0gICAqIH0KLSAgICogQGVuZGNvZGUKLSAgICovCi0gIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHBwdHIoKSAtIGdwdHIoKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgYmFzaWNfc3RyZWFtYnVmLgotICAvKioKLSAgICogQHJldHVybnMgVGhlIGFsbG93ZWQgbWF4aW11bSBvZiB0aGUgc3VtIG9mIHRoZSBzaXplcyBvZiB0aGUgaW5wdXQgc2VxdWVuY2UKLSAgICogYW5kIG91dHB1dCBzZXF1ZW5jZS4KLSAgICovCi0gIHN0ZDo6c2l6ZV90IG1heF9zaXplKCkgY29uc3QKLSAgewotICAgIHJldHVybiBtYXhfc2l6ZV87Ci0gIH0KLQotICAvLy8gR2V0IGEgbGlzdCBvZiBidWZmZXJzIHRoYXQgcmVwcmVzZW50cyB0aGUgaW5wdXQgc2VxdWVuY2UuCi0gIC8qKgotICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgb2YgdHlwZSBAYyBjb25zdF9idWZmZXJzX3R5cGUgdGhhdCBzYXRpc2ZpZXMKLSAgICogQ29uc3RCdWZmZXJTZXF1ZW5jZSByZXF1aXJlbWVudHMsIHJlcHJlc2VudGluZyBhbGwgY2hhcmFjdGVyIGFycmF5cyBpbiB0aGUKLSAgICogaW5wdXQgc2VxdWVuY2UuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgaW52YWxpZGF0ZWQgYnkgYW55IEBjIGJhc2ljX3N0cmVhbWJ1ZiBtZW1iZXIKLSAgICogZnVuY3Rpb24gdGhhdCBtb2RpZmllcyB0aGUgaW5wdXQgc2VxdWVuY2Ugb3Igb3V0cHV0IHNlcXVlbmNlLgotICAgKi8KLSAgY29uc3RfYnVmZmVyc190eXBlIGRhdGEoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGFzaW86OmJ1ZmZlcihhc2lvOjpjb25zdF9idWZmZXIoZ3B0cigpLAotICAgICAgICAgIChwcHRyKCkgLSBncHRyKCkpICogc2l6ZW9mKGNoYXJfdHlwZSkpKTsKLSAgfQotCi0gIC8vLyBHZXQgYSBsaXN0IG9mIGJ1ZmZlcnMgdGhhdCByZXByZXNlbnRzIHRoZSBvdXRwdXQgc2VxdWVuY2UsIHdpdGggdGhlIGdpdmVuCi0gIC8vLyBzaXplLgotICAvKioKLSAgICogRW5zdXJlcyB0aGF0IHRoZSBvdXRwdXQgc2VxdWVuY2UgY2FuIGFjY29tbW9kYXRlIEBjIG4gY2hhcmFjdGVycywKLSAgICogcmVhbGxvY2F0aW5nIGNoYXJhY3RlciBhcnJheSBvYmplY3RzIGFzIG5lY2Vzc2FyeS4KLSAgICoKLSAgICogQHJldHVybnMgQW4gb2JqZWN0IG9mIHR5cGUgQGMgbXV0YWJsZV9idWZmZXJzX3R5cGUgdGhhdCBzYXRpc2ZpZXMKLSAgICogTXV0YWJsZUJ1ZmZlclNlcXVlbmNlIHJlcXVpcmVtZW50cywgcmVwcmVzZW50aW5nIGNoYXJhY3RlciBhcnJheSBvYmplY3RzCi0gICAqIGF0IHRoZSBzdGFydCBvZiB0aGUgb3V0cHV0IHNlcXVlbmNlIHN1Y2ggdGhhdCB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMKLSAgICogaXMgQGMgbi4KLSAgICoKLSAgICogQHRocm93cyBzdGQ6Omxlbmd0aF9lcnJvciBJZiA8dHQ+c2l6ZSgpICsgbiA+IG1heF9zaXplKCk8L3R0Pi4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJldHVybmVkIG9iamVjdCBpcyBpbnZhbGlkYXRlZCBieSBhbnkgQGMgYmFzaWNfc3RyZWFtYnVmIG1lbWJlcgotICAgKiBmdW5jdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBpbnB1dCBzZXF1ZW5jZSBvciBvdXRwdXQgc2VxdWVuY2UuCi0gICAqLwotICBtdXRhYmxlX2J1ZmZlcnNfdHlwZSBwcmVwYXJlKHN0ZDo6c2l6ZV90IG4pCi0gIHsKLSAgICByZXNlcnZlKG4pOwotICAgIHJldHVybiBhc2lvOjpidWZmZXIoYXNpbzo6bXV0YWJsZV9idWZmZXIoCi0gICAgICAgICAgcHB0cigpLCBuICogc2l6ZW9mKGNoYXJfdHlwZSkpKTsKLSAgfQotCi0gIC8vLyBNb3ZlIGNoYXJhY3RlcnMgZnJvbSB0aGUgb3V0cHV0IHNlcXVlbmNlIHRvIHRoZSBpbnB1dCBzZXF1ZW5jZS4KLSAgLyoqCi0gICAqIEFwcGVuZHMgQGMgbiBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBvdXRwdXQgc2VxdWVuY2UgdG8gdGhlIGlucHV0Ci0gICAqIHNlcXVlbmNlLiBUaGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgc2VxdWVuY2UgaXMgYWR2YW5jZWQgYnkgQGMgbgotICAgKiBjaGFyYWN0ZXJzLgotICAgKgotICAgKiBSZXF1aXJlcyBhIHByZWNlZGluZyBjYWxsIDx0dD5wcmVwYXJlKHgpPC90dD4gd2hlcmUgPHR0PnggPj0gbjwvdHQ+LCBhbmQKLSAgICogbm8gaW50ZXJ2ZW5pbmcgb3BlcmF0aW9ucyB0aGF0IG1vZGlmeSB0aGUgaW5wdXQgb3Igb3V0cHV0IHNlcXVlbmNlLgotICAgKgotICAgKiBAbm90ZSBJZiBAYyBuIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHNlcXVlbmNlLCB0aGUgZW50aXJlCi0gICAqIG91dHB1dCBzZXF1ZW5jZSBpcyBtb3ZlZCB0byB0aGUgaW5wdXQgc2VxdWVuY2UgYW5kIG5vIGVycm9yIGlzIGlzc3VlZC4KLSAgICovCi0gIHZvaWQgY29tbWl0KHN0ZDo6c2l6ZV90IG4pCi0gIHsKLSAgICBpZiAocHB0cigpICsgbiA+IGVwcHRyKCkpCi0gICAgICBuID0gZXBwdHIoKSAtIHBwdHIoKTsKLSAgICBwYnVtcChzdGF0aWNfY2FzdDxpbnQ+KG4pKTsKLSAgICBzZXRnKGViYWNrKCksIGdwdHIoKSwgcHB0cigpKTsKLSAgfQotCi0gIC8vLyBSZW1vdmUgY2hhcmFjdGVycyBmcm9tIHRoZSBpbnB1dCBzZXF1ZW5jZS4KLSAgLyoqCi0gICAqIFJlbW92ZXMgQGMgbiBjaGFyYWN0ZXJzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgc2VxdWVuY2UuCi0gICAqCi0gICAqIEBub3RlIElmIEBjIG4gaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzZXF1ZW5jZSwgdGhlIGVudGlyZQotICAgKiBpbnB1dCBzZXF1ZW5jZSBpcyBjb25zdW1lZCBhbmQgbm8gZXJyb3IgaXMgaXNzdWVkLgotICAgKi8KLSAgdm9pZCBjb25zdW1lKHN0ZDo6c2l6ZV90IG4pCi0gIHsKLSAgICBpZiAoZWdwdHIoKSA8IHBwdHIoKSkKLSAgICAgIHNldGcoJmJ1ZmZlcl9bMF0sIGdwdHIoKSwgcHB0cigpKTsKLSAgICBpZiAoZ3B0cigpICsgbiA+IHBwdHIoKSkKLSAgICAgIG4gPSBwcHRyKCkgLSBncHRyKCk7Ci0gICAgZ2J1bXAoc3RhdGljX2Nhc3Q8aW50PihuKSk7Ci0gIH0KLQotcHJvdGVjdGVkOgotICBlbnVtIHsgYnVmZmVyX2RlbHRhID0gMTI4IH07Ci0KLSAgLy8vIE92ZXJyaWRlIHN0ZDo6c3RyZWFtYnVmIGJlaGF2aW91ci4KLSAgLyoqCi0gICAqIEJlaGF2ZXMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIG9mIEBjIHN0ZDo6c3RyZWFtYnVmOjp1bmRlcmZsb3coKS4KLSAgICovCi0gIGludF90eXBlIHVuZGVyZmxvdygpCi0gIHsKLSAgICBpZiAoZ3B0cigpIDwgcHB0cigpKQotICAgIHsKLSAgICAgIHNldGcoJmJ1ZmZlcl9bMF0sIGdwdHIoKSwgcHB0cigpKTsKLSAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKmdwdHIoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOwotICAgIH0KLSAgfQotCi0gIC8vLyBPdmVycmlkZSBzdGQ6OnN0cmVhbWJ1ZiBiZWhhdmlvdXIuCi0gIC8qKgotICAgKiBCZWhhdmVzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiBvZiBAYyBzdGQ6OnN0cmVhbWJ1Zjo6b3ZlcmZsb3coKSwKLSAgICogd2l0aCB0aGUgc3BlY2lhbGlzYXRpb24gdGhhdCBAYyBzdGQ6Omxlbmd0aF9lcnJvciBpcyB0aHJvd24gaWYgYXBwZW5kaW5nCi0gICAqIHRoZSBjaGFyYWN0ZXIgdG8gdGhlIGlucHV0IHNlcXVlbmNlIHdvdWxkIHJlcXVpcmUgdGhlIGNvbmRpdGlvbgotICAgKiA8dHQ+c2l6ZSgpID4gbWF4X3NpemUoKTwvdHQ+IHRvIGJlIHRydWUuCi0gICAqLwotICBpbnRfdHlwZSBvdmVyZmxvdyhpbnRfdHlwZSBjKQotICB7Ci0gICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKLSAgICB7Ci0gICAgICBpZiAocHB0cigpID09IGVwcHRyKCkpCi0gICAgICB7Ci0gICAgICAgIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplID0gcHB0cigpIC0gZ3B0cigpOwotICAgICAgICBpZiAoYnVmZmVyX3NpemUgPCBtYXhfc2l6ZV8gJiYgbWF4X3NpemVfIC0gYnVmZmVyX3NpemUgPCBidWZmZXJfZGVsdGEpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNlcnZlKG1heF9zaXplXyAtIGJ1ZmZlcl9zaXplKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXNlcnZlKGJ1ZmZlcl9kZWx0YSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgKnBwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoYyk7Ci0gICAgICBwYnVtcCgxKTsKLSAgICAgIHJldHVybiBjOwotICAgIH0KLQotICAgIHJldHVybiB0cmFpdHNfdHlwZTo6bm90X2VvZihjKTsKLSAgfQotCi0gIHZvaWQgcmVzZXJ2ZShzdGQ6OnNpemVfdCBuKQotICB7Ci0gICAgLy8gR2V0IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBhcyBvZmZzZXRzLgotICAgIHN0ZDo6c2l6ZV90IGduZXh0ID0gZ3B0cigpIC0gJmJ1ZmZlcl9bMF07Ci0gICAgc3RkOjpzaXplX3QgcG5leHQgPSBwcHRyKCkgLSAmYnVmZmVyX1swXTsKLSAgICBzdGQ6OnNpemVfdCBwZW5kID0gZXBwdHIoKSAtICZidWZmZXJfWzBdOwotCi0gICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBlbm91Z2ggc3BhY2UgaW4gdGhlIHB1dCBhcmVhLgotICAgIGlmIChuIDw9IHBlbmQgLSBwbmV4dCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gU2hpZnQgZXhpc3RpbmcgY29udGVudHMgb2YgZ2V0IGFyZWEgdG8gc3RhcnQgb2YgYnVmZmVyLgotICAgIGlmIChnbmV4dCA+IDApCi0gICAgewotICAgICAgcG5leHQgLT0gZ25leHQ7Ci0gICAgICBzdGQ6Om1lbW1vdmUoJmJ1ZmZlcl9bMF0sICZidWZmZXJfWzBdICsgZ25leHQsIHBuZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBFbnN1cmUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIGF0IGxlYXN0IHRoZSBzcGVjaWZpZWQgc2l6ZS4KLSAgICBpZiAobiA+IHBlbmQgLSBwbmV4dCkKLSAgICB7Ci0gICAgICBpZiAobiA8PSBtYXhfc2l6ZV8gJiYgcG5leHQgPD0gbWF4X3NpemVfIC0gbikKLSAgICAgIHsKLSAgICAgICAgcGVuZCA9IHBuZXh0ICsgbjsKLSAgICAgICAgYnVmZmVyXy5yZXNpemUoKHN0ZDo6bWF4PHN0ZDo6c2l6ZV90PikocGVuZCwgMSkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdGQ6Omxlbmd0aF9lcnJvciBleCgiYXNpbzo6c3RyZWFtYnVmIHRvbyBsb25nIik7Ci0gICAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKGV4KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBVcGRhdGUgc3RyZWFtIHBvc2l0aW9ucy4KLSAgICBzZXRnKCZidWZmZXJfWzBdLCAmYnVmZmVyX1swXSwgJmJ1ZmZlcl9bMF0gKyBwbmV4dCk7Ci0gICAgc2V0cCgmYnVmZmVyX1swXSArIHBuZXh0LCAmYnVmZmVyX1swXSArIHBlbmQpOwotICB9Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6c2l6ZV90IG1heF9zaXplXzsKLSAgc3RkOjp2ZWN0b3I8Y2hhcl90eXBlLCBBbGxvY2F0b3I+IGJ1ZmZlcl87Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgcHJlZmVycmVkIHNpemUgZm9yIHJlYWRpbmcgZGF0YS4KLSAgZnJpZW5kIHN0ZDo6c2l6ZV90IHJlYWRfc2l6ZV9oZWxwZXIoCi0gICAgICBiYXNpY19zdHJlYW1idWYmIHNiLCBzdGQ6OnNpemVfdCBtYXhfc2l6ZSkKLSAgewotICAgIHJldHVybiBzdGQ6Om1pbjxzdGQ6OnNpemVfdD4oCi0gICAgICAgIHN0ZDo6bWF4PHN0ZDo6c2l6ZV90Pig1MTIsIHNiLmJ1ZmZlcl8uY2FwYWNpdHkoKSAtIHNiLnNpemUoKSksCi0gICAgICAgIHN0ZDo6bWluPHN0ZDo6c2l6ZV90PihtYXhfc2l6ZSwgc2IubWF4X3NpemUoKSAtIHNiLnNpemUoKSkpOwotICB9Ci19OwotCi0vLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBwcmVmZXJyZWQgc2l6ZSBmb3IgcmVhZGluZyBkYXRhLiBVc2VkIGZvciBhbnkKLS8vIHVzZXItcHJvdmlkZWQgc3BlY2lhbGlzYXRpb25zIG9mIGJhc2ljX3N0cmVhbWJ1Zi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3I+Ci1pbmxpbmUgc3RkOjpzaXplX3QgcmVhZF9zaXplX2hlbHBlcigKLSAgICBiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgc2IsIHN0ZDo6c2l6ZV90IG1heF9zaXplKQotewotICByZXR1cm4gc3RkOjptaW48c3RkOjpzaXplX3Q+KDUxMiwKLSAgICAgIHN0ZDo6bWluPHN0ZDo6c2l6ZV90PihtYXhfc2l6ZSwgc2IubWF4X3NpemUoKSAtIHNiLnNpemUoKSkpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0jZW5kaWYgLy8gQVNJT19CQVNJQ19TVFJFQU1CVUZfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc3RyZWFtYnVmX2Z3ZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfc3RyZWFtYnVmX2Z3ZC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MzU3NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Jhc2ljX3N0cmVhbWJ1Zl9md2QuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8KLS8vIGJhc2ljX3N0cmVhbWJ1Zl9md2QuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0JBU0lDX1NUUkVBTUJVRl9GV0RfSFBQCi0jZGVmaW5lIEFTSU9fQkFTSUNfU1RSRUFNQlVGX0ZXRF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLW5hbWVzcGFjZSBhc2lvIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KLWNsYXNzIGJhc2ljX3N0cmVhbWJ1ZjsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotI2VuZGlmIC8vIEFTSU9fQkFTSUNfU1RSRUFNQlVGX0ZXRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY193YWl0YWJsZV90aW1lci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYmFzaWNfd2FpdGFibGVfdGltZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmMyZTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9iYXNpY193YWl0YWJsZV90aW1lci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLy8KLS8vIGJhc2ljX3dhaXRhYmxlX3RpbWVyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fQkFTSUNfV0FJVEFCTEVfVElNRVJfSFBQCi0jZGVmaW5lIEFTSU9fQkFTSUNfV0FJVEFCTEVfVElNRVJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2Jhc2ljX2lvX29iamVjdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vd2FpdF90cmFpdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vd2FpdGFibGVfdGltZXJfc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBQcm92aWRlcyB3YWl0YWJsZSB0aW1lciBmdW5jdGlvbmFsaXR5LgotLyoqCi0gKiBUaGUgYmFzaWNfd2FpdGFibGVfdGltZXIgY2xhc3MgdGVtcGxhdGUgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBhCi0gKiBibG9ja2luZyBvciBhc3luY2hyb25vdXMgd2FpdCBmb3IgYSB0aW1lciB0byBleHBpcmUuCi0gKgotICogQSB3YWl0YWJsZSB0aW1lciBpcyBhbHdheXMgaW4gb25lIG9mIHR3byBzdGF0ZXM6ICJleHBpcmVkIiBvciAibm90IGV4cGlyZWQiLgotICogSWYgdGhlIHdhaXQoKSBvciBhc3luY193YWl0KCkgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGFuIGV4cGlyZWQgdGltZXIsIHRoZQotICogd2FpdCBvcGVyYXRpb24gd2lsbCBjb21wbGV0ZSBpbW1lZGlhdGVseS4KLSAqCi0gKiBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIHVzZSBvbmUgb2YgdGhlIGFzaW86OnN0ZWFkeV90aW1lciwKLSAqIGFzaW86OnN5c3RlbV90aW1lciBvciBhc2lvOjpoaWdoX3Jlc29sdXRpb25fdGltZXIgdHlwZWRlZnMuCi0gKgotICogQG5vdGUgVGhpcyB3YWl0YWJsZSB0aW1lciBmdW5jdGlvbmFsaXR5IGlzIGZvciB1c2Ugd2l0aCB0aGUgQysrMTEgc3RhbmRhcmQKLSAqIGxpYnJhcnkncyBAYyAmbHQ7Y2hyb25vJmd0OyBmYWNpbGl0eSwgb3Igd2l0aCB0aGUgQm9vc3QuQ2hyb25vIGxpYnJhcnkuCi0gKgotICogQHBhciBUaHJlYWQgU2FmZXR5Ci0gKiBAZSBEaXN0aW5jdCBAZSBvYmplY3RzOiBTYWZlLkBuCi0gKiBAZSBTaGFyZWQgQGUgb2JqZWN0czogVW5zYWZlLgotICoKLSAqIEBwYXIgRXhhbXBsZXMKLSAqIFBlcmZvcm1pbmcgYSBibG9ja2luZyB3YWl0IChDKysxMSk6Ci0gKiBAY29kZQotICogLy8gQ29uc3RydWN0IGEgdGltZXIgd2l0aG91dCBzZXR0aW5nIGFuIGV4cGlyeSB0aW1lLgotICogYXNpbzo6c3RlYWR5X3RpbWVyIHRpbWVyKGlvX3NlcnZpY2UpOwotICoKLSAqIC8vIFNldCBhbiBleHBpcnkgdGltZSByZWxhdGl2ZSB0byBub3cuCi0gKiB0aW1lci5leHBpcmVzX2Zyb21fbm93KHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKTsKLSAqCi0gKiAvLyBXYWl0IGZvciB0aGUgdGltZXIgdG8gZXhwaXJlLgotICogdGltZXIud2FpdCgpOwotICogQGVuZGNvZGUKLSAqCi0gKiBAcGFyIAotICogUGVyZm9ybWluZyBhbiBhc3luY2hyb25vdXMgd2FpdCAoQysrMTEpOgotICogQGNvZGUKLSAqIHZvaWQgaGFuZGxlcihjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvcikKLSAqIHsKLSAqICAgaWYgKCFlcnJvcikKLSAqICAgewotICogICAgIC8vIFRpbWVyIGV4cGlyZWQuCi0gKiAgIH0KLSAqIH0KLSAqCi0gKiAuLi4KLSAqCi0gKiAvLyBDb25zdHJ1Y3QgYSB0aW1lciB3aXRoIGFuIGFic29sdXRlIGV4cGlyeSB0aW1lLgotICogYXNpbzo6c3RlYWR5X3RpbWVyIHRpbWVyKGlvX3NlcnZpY2UsCi0gKiAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyBzdGQ6OmNocm9ubzo6c2Vjb25kcyg2MCkpOwotICoKLSAqIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3YWl0LgotICogdGltZXIuYXN5bmNfd2FpdChoYW5kbGVyKTsKLSAqIEBlbmRjb2RlCi0gKgotICogQHBhciBDaGFuZ2luZyBhbiBhY3RpdmUgd2FpdGFibGUgdGltZXIncyBleHBpcnkgdGltZQotICoKLSAqIENoYW5naW5nIHRoZSBleHBpcnkgdGltZSBvZiBhIHRpbWVyIHdoaWxlIHRoZXJlIGFyZSBwZW5kaW5nIGFzeW5jaHJvbm91cwotICogd2FpdHMgY2F1c2VzIHRob3NlIHdhaXQgb3BlcmF0aW9ucyB0byBiZSBjYW5jZWxsZWQuIFRvIGVuc3VyZSB0aGF0IHRoZSBhY3Rpb24KLSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGltZXIgaXMgcGVyZm9ybWVkIG9ubHkgb25jZSwgdXNlIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0gKiB1c2VkOgotICoKLSAqIEBjb2RlCi0gKiB2b2lkIG9uX3NvbWVfZXZlbnQoKQotICogewotICogICBpZiAobXlfdGltZXIuZXhwaXJlc19mcm9tX25vdyhzZWNvbmRzKDUpKSA+IDApCi0gKiAgIHsKLSAqICAgICAvLyBXZSBtYW5hZ2VkIHRvIGNhbmNlbCB0aGUgdGltZXIuIFN0YXJ0IG5ldyBhc3luY2hyb25vdXMgd2FpdC4KLSAqICAgICBteV90aW1lci5hc3luY193YWl0KG9uX3RpbWVvdXQpOwotICogICB9Ci0gKiAgIGVsc2UKLSAqICAgewotICogICAgIC8vIFRvbyBsYXRlLCB0aW1lciBoYXMgYWxyZWFkeSBleHBpcmVkIQotICogICB9Ci0gKiB9Ci0gKgotICogdm9pZCBvbl90aW1lb3V0KGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGUpCi0gKiB7Ci0gKiAgIGlmIChlICE9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCkKLSAqICAgewotICogICAgIC8vIFRpbWVyIHdhcyBub3QgY2FuY2VsbGVkLCB0YWtlIG5lY2Vzc2FyeSBhY3Rpb24uCi0gKiAgIH0KLSAqIH0KLSAqIEBlbmRjb2RlCi0gKgotICogQGxpIFRoZSBhc2lvOjpiYXNpY193YWl0YWJsZV90aW1lcjo6ZXhwaXJlc19mcm9tX25vdygpIGZ1bmN0aW9uCi0gKiBjYW5jZWxzIGFueSBwZW5kaW5nIGFzeW5jaHJvbm91cyB3YWl0cywgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZgotICogYXN5bmNocm9ub3VzIHdhaXRzIHRoYXQgd2VyZSBjYW5jZWxsZWQuIElmIGl0IHJldHVybnMgMCB0aGVuIHlvdSB3ZXJlIHRvbwotICogbGF0ZSBhbmQgdGhlIHdhaXQgaGFuZGxlciBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkLCBvciB3aWxsIHNvb24gYmUKLSAqIGV4ZWN1dGVkLiBJZiBpdCByZXR1cm5zIDEgdGhlbiB0aGUgd2FpdCBoYW5kbGVyIHdhcyBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLgotICoKLSAqIEBsaSBJZiBhIHdhaXQgaGFuZGxlciBpcyBjYW5jZWxsZWQsIHRoZSBhc2lvOjplcnJvcl9jb2RlIHBhc3NlZCB0bwotICogaXQgY29udGFpbnMgdGhlIHZhbHVlIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZC4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIENsb2NrLAotICAgIHR5cGVuYW1lIFdhaXRUcmFpdHMgPSBhc2lvOjp3YWl0X3RyYWl0czxDbG9jaz4sCi0gICAgdHlwZW5hbWUgV2FpdGFibGVUaW1lclNlcnZpY2UgPSB3YWl0YWJsZV90aW1lcl9zZXJ2aWNlPENsb2NrLCBXYWl0VHJhaXRzPiA+Ci1jbGFzcyBiYXNpY193YWl0YWJsZV90aW1lcgotICA6IHB1YmxpYyBiYXNpY19pb19vYmplY3Q8V2FpdGFibGVUaW1lclNlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgY2xvY2sgdHlwZS4KLSAgdHlwZWRlZiBDbG9jayBjbG9ja190eXBlOwotCi0gIC8vLyBUaGUgZHVyYXRpb24gdHlwZSBvZiB0aGUgY2xvY2suCi0gIHR5cGVkZWYgdHlwZW5hbWUgY2xvY2tfdHlwZTo6ZHVyYXRpb24gZHVyYXRpb247Ci0KLSAgLy8vIFRoZSB0aW1lIHBvaW50IHR5cGUgb2YgdGhlIGNsb2NrLgotICB0eXBlZGVmIHR5cGVuYW1lIGNsb2NrX3R5cGU6OnRpbWVfcG9pbnQgdGltZV9wb2ludDsKLQotICAvLy8gVGhlIHdhaXQgdHJhaXRzIHR5cGUuCi0gIHR5cGVkZWYgV2FpdFRyYWl0cyB0cmFpdHNfdHlwZTsKLQotICAvLy8gQ29uc3RydWN0b3IuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSB0aW1lciB3aXRob3V0IHNldHRpbmcgYW4gZXhwaXJ5IHRpbWUuIFRoZQotICAgKiBleHBpcmVzX2F0KCkgb3IgZXhwaXJlc19mcm9tX25vdygpIGZ1bmN0aW9ucyBtdXN0IGJlIGNhbGxlZCB0byBzZXQgYW4KLSAgICogZXhwaXJ5IHRpbWUgYmVmb3JlIHRoZSB0aW1lciBjYW4gYmUgd2FpdGVkIG9uLgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgdGltZXIgd2lsbCB1c2UgdG8gZGlzcGF0Y2gKLSAgICogaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIHRpbWVyLgotICAgKi8KLSAgZXhwbGljaXQgYmFzaWNfd2FpdGFibGVfdGltZXIoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGJhc2ljX2lvX29iamVjdDxXYWl0YWJsZVRpbWVyU2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdG9yIHRvIHNldCBhIHBhcnRpY3VsYXIgZXhwaXJ5IHRpbWUgYXMgYW4gYWJzb2x1dGUgdGltZS4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIHRpbWVyIGFuZCBzZXRzIHRoZSBleHBpcnkgdGltZS4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHRpbWVyIHdpbGwgdXNlIHRvIGRpc3BhdGNoCi0gICAqIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSB0aW1lci4KLSAgICoKLSAgICogQHBhcmFtIGV4cGlyeV90aW1lIFRoZSBleHBpcnkgdGltZSB0byBiZSB1c2VkIGZvciB0aGUgdGltZXIsIGV4cHJlc3NlZAotICAgKiBhcyBhbiBhYnNvbHV0ZSB0aW1lLgotICAgKi8KLSAgYmFzaWNfd2FpdGFibGVfdGltZXIoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwKLSAgICAgIGNvbnN0IHRpbWVfcG9pbnQmIGV4cGlyeV90aW1lKQotICAgIDogYmFzaWNfaW9fb2JqZWN0PFdhaXRhYmxlVGltZXJTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5zZXJ2aWNlLmV4cGlyZXNfYXQodGhpcy0+aW1wbGVtZW50YXRpb24sIGV4cGlyeV90aW1lLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImV4cGlyZXNfYXQiKTsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3RvciB0byBzZXQgYSBwYXJ0aWN1bGFyIGV4cGlyeSB0aW1lIHJlbGF0aXZlIHRvIG5vdy4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIHRpbWVyIGFuZCBzZXRzIHRoZSBleHBpcnkgdGltZS4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHRpbWVyIHdpbGwgdXNlIHRvIGRpc3BhdGNoCi0gICAqIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSB0aW1lci4KLSAgICoKLSAgICogQHBhcmFtIGV4cGlyeV90aW1lIFRoZSBleHBpcnkgdGltZSB0byBiZSB1c2VkIGZvciB0aGUgdGltZXIsIHJlbGF0aXZlIHRvCi0gICAqIG5vdy4KLSAgICovCi0gIGJhc2ljX3dhaXRhYmxlX3RpbWVyKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBkdXJhdGlvbiYgZXhwaXJ5X3RpbWUpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8V2FpdGFibGVUaW1lclNlcnZpY2U+KGlvX3NlcnZpY2UpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPnNlcnZpY2UuZXhwaXJlc19mcm9tX25vdyh0aGlzLT5pbXBsZW1lbnRhdGlvbiwgZXhwaXJ5X3RpbWUsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiZXhwaXJlc19mcm9tX25vdyIpOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdGhhdCBhcmUgd2FpdGluZyBvbiB0aGUgdGltZXIuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGZvcmNlcyB0aGUgY29tcGxldGlvbiBvZiBhbnkgcGVuZGluZyBhc3luY2hyb25vdXMgd2FpdAotICAgKiBvcGVyYXRpb25zIGFnYWluc3QgdGhlIHRpbWVyLiBUaGUgaGFuZGxlciBmb3IgZWFjaCBjYW5jZWxsZWQgb3BlcmF0aW9uIHdpbGwKLSAgICogYmUgaW52b2tlZCB3aXRoIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IgY29kZS4KLSAgICoKLSAgICogQ2FuY2VsbGluZyB0aGUgdGltZXIgZG9lcyBub3QgY2hhbmdlIHRoZSBleHBpcnkgdGltZS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgd2VyZSBjYW5jZWxsZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBJZiB0aGUgdGltZXIgaGFzIGFscmVhZHkgZXhwaXJlZCB3aGVuIGNhbmNlbCgpIGlzIGNhbGxlZCwgdGhlbiB0aGUKLSAgICogaGFuZGxlcnMgZm9yIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbnMgd2lsbDoKLSAgICoKLSAgICogQGxpIGhhdmUgYWxyZWFkeSBiZWVuIGludm9rZWQ7IG9yCi0gICAqCi0gICAqIEBsaSBoYXZlIGJlZW4gcXVldWVkIGZvciBpbnZvY2F0aW9uIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICoKLSAgICogVGhlc2UgaGFuZGxlcnMgY2FuIG5vIGxvbmdlciBiZSBjYW5jZWxsZWQsIGFuZCB0aGVyZWZvcmUgYXJlIHBhc3NlZCBhbgotICAgKiBlcnJvciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHdhaXQgb3BlcmF0aW9uLgotICAgKi8KLSAgc3RkOjpzaXplX3QgY2FuY2VsKCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPnNlcnZpY2UuY2FuY2VsKHRoaXMtPmltcGxlbWVudGF0aW9uLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNhbmNlbCIpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdGhhdCBhcmUgd2FpdGluZyBvbiB0aGUgdGltZXIuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGZvcmNlcyB0aGUgY29tcGxldGlvbiBvZiBhbnkgcGVuZGluZyBhc3luY2hyb25vdXMgd2FpdAotICAgKiBvcGVyYXRpb25zIGFnYWluc3QgdGhlIHRpbWVyLiBUaGUgaGFuZGxlciBmb3IgZWFjaCBjYW5jZWxsZWQgb3BlcmF0aW9uIHdpbGwKLSAgICogYmUgaW52b2tlZCB3aXRoIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IgY29kZS4KLSAgICoKLSAgICogQ2FuY2VsbGluZyB0aGUgdGltZXIgZG9lcyBub3QgY2hhbmdlIHRoZSBleHBpcnkgdGltZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB0aGF0IHdlcmUgY2FuY2VsbGVkLgotICAgKgotICAgKiBAbm90ZSBJZiB0aGUgdGltZXIgaGFzIGFscmVhZHkgZXhwaXJlZCB3aGVuIGNhbmNlbCgpIGlzIGNhbGxlZCwgdGhlbiB0aGUKLSAgICogaGFuZGxlcnMgZm9yIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbnMgd2lsbDoKLSAgICoKLSAgICogQGxpIGhhdmUgYWxyZWFkeSBiZWVuIGludm9rZWQ7IG9yCi0gICAqCi0gICAqIEBsaSBoYXZlIGJlZW4gcXVldWVkIGZvciBpbnZvY2F0aW9uIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICoKLSAgICogVGhlc2UgaGFuZGxlcnMgY2FuIG5vIGxvbmdlciBiZSBjYW5jZWxsZWQsIGFuZCB0aGVyZWZvcmUgYXJlIHBhc3NlZCBhbgotICAgKiBlcnJvciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHdhaXQgb3BlcmF0aW9uLgotICAgKi8KLSAgc3RkOjpzaXplX3QgY2FuY2VsKGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPnNlcnZpY2UuY2FuY2VsKHRoaXMtPmltcGxlbWVudGF0aW9uLCBlYyk7Ci0gIH0KLQotICAvLy8gQ2FuY2VscyBvbmUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB0aGF0IGlzIHdhaXRpbmcgb24gdGhlIHRpbWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBmb3JjZXMgdGhlIGNvbXBsZXRpb24gb2Ygb25lIHBlbmRpbmcgYXN5bmNocm9ub3VzIHdhaXQKLSAgICogb3BlcmF0aW9uIGFnYWluc3QgdGhlIHRpbWVyLiBIYW5kbGVycyBhcmUgY2FuY2VsbGVkIGluIEZJRk8gb3JkZXIuIFRoZQotICAgKiBoYW5kbGVyIGZvciB0aGUgY2FuY2VsbGVkIG9wZXJhdGlvbiB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUKLSAgICogYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yIGNvZGUuCi0gICAqCi0gICAqIENhbmNlbGxpbmcgdGhlIHRpbWVyIGRvZXMgbm90IGNoYW5nZSB0aGUgZXhwaXJ5IHRpbWUuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB0aGF0IHdlcmUgY2FuY2VsbGVkLiBUaGF0IGlzLAotICAgKiBlaXRoZXIgMCBvciAxLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgSWYgdGhlIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQgd2hlbiBjYW5jZWxfb25lKCkgaXMgY2FsbGVkLCB0aGVuCi0gICAqIHRoZSBoYW5kbGVycyBmb3IgYXN5bmNocm9ub3VzIHdhaXQgb3BlcmF0aW9ucyB3aWxsOgotICAgKgotICAgKiBAbGkgaGF2ZSBhbHJlYWR5IGJlZW4gaW52b2tlZDsgb3IKLSAgICoKLSAgICogQGxpIGhhdmUgYmVlbiBxdWV1ZWQgZm9yIGludm9jYXRpb24gaW4gdGhlIG5lYXIgZnV0dXJlLgotICAgKgotICAgKiBUaGVzZSBoYW5kbGVycyBjYW4gbm8gbG9uZ2VyIGJlIGNhbmNlbGxlZCwgYW5kIHRoZXJlZm9yZSBhcmUgcGFzc2VkIGFuCi0gICAqIGVycm9yIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgd2FpdCBvcGVyYXRpb24uCi0gICAqLwotICBzdGQ6OnNpemVfdCBjYW5jZWxfb25lKCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPnNlcnZpY2UuY2FuY2VsX29uZSh0aGlzLT5pbXBsZW1lbnRhdGlvbiwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJjYW5jZWxfb25lIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gQ2FuY2VscyBvbmUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB0aGF0IGlzIHdhaXRpbmcgb24gdGhlIHRpbWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBmb3JjZXMgdGhlIGNvbXBsZXRpb24gb2Ygb25lIHBlbmRpbmcgYXN5bmNocm9ub3VzIHdhaXQKLSAgICogb3BlcmF0aW9uIGFnYWluc3QgdGhlIHRpbWVyLiBIYW5kbGVycyBhcmUgY2FuY2VsbGVkIGluIEZJRk8gb3JkZXIuIFRoZQotICAgKiBoYW5kbGVyIGZvciB0aGUgY2FuY2VsbGVkIG9wZXJhdGlvbiB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUKLSAgICogYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yIGNvZGUuCi0gICAqCi0gICAqIENhbmNlbGxpbmcgdGhlIHRpbWVyIGRvZXMgbm90IGNoYW5nZSB0aGUgZXhwaXJ5IHRpbWUuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdGhhdCB3ZXJlIGNhbmNlbGxlZC4gVGhhdCBpcywKLSAgICogZWl0aGVyIDAgb3IgMS4KLSAgICoKLSAgICogQG5vdGUgSWYgdGhlIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQgd2hlbiBjYW5jZWxfb25lKCkgaXMgY2FsbGVkLCB0aGVuCi0gICAqIHRoZSBoYW5kbGVycyBmb3IgYXN5bmNocm9ub3VzIHdhaXQgb3BlcmF0aW9ucyB3aWxsOgotICAgKgotICAgKiBAbGkgaGF2ZSBhbHJlYWR5IGJlZW4gaW52b2tlZDsgb3IKLSAgICoKLSAgICogQGxpIGhhdmUgYmVlbiBxdWV1ZWQgZm9yIGludm9jYXRpb24gaW4gdGhlIG5lYXIgZnV0dXJlLgotICAgKgotICAgKiBUaGVzZSBoYW5kbGVycyBjYW4gbm8gbG9uZ2VyIGJlIGNhbmNlbGxlZCwgYW5kIHRoZXJlZm9yZSBhcmUgcGFzc2VkIGFuCi0gICAqIGVycm9yIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgd2FpdCBvcGVyYXRpb24uCi0gICAqLwotICBzdGQ6OnNpemVfdCBjYW5jZWxfb25lKGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPnNlcnZpY2UuY2FuY2VsX29uZSh0aGlzLT5pbXBsZW1lbnRhdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgdGltZXIncyBleHBpcnkgdGltZSBhcyBhbiBhYnNvbHV0ZSB0aW1lLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIHRpbWVyJ3MgY3VycmVudCBleHBpcnkgdGltZS4KLSAgICogV2hldGhlciB0aGUgdGltZXIgaGFzIGV4cGlyZWQgb3Igbm90IGRvZXMgbm90IGFmZmVjdCB0aGlzIHZhbHVlLgotICAgKi8KLSAgdGltZV9wb2ludCBleHBpcmVzX2F0KCkgY29uc3QKLSAgewotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLmV4cGlyZXNfYXQodGhpcy0+aW1wbGVtZW50YXRpb24pOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgdGltZXIncyBleHBpcnkgdGltZSBhcyBhbiBhYnNvbHV0ZSB0aW1lLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBleHBpcnkgdGltZS4gQW55IHBlbmRpbmcgYXN5bmNocm9ub3VzIHdhaXQKLSAgICogb3BlcmF0aW9ucyB3aWxsIGJlIGNhbmNlbGxlZC4gVGhlIGhhbmRsZXIgZm9yIGVhY2ggY2FuY2VsbGVkIG9wZXJhdGlvbiB3aWxsCi0gICAqIGJlIGludm9rZWQgd2l0aCB0aGUgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yIGNvZGUuCi0gICAqCi0gICAqIEBwYXJhbSBleHBpcnlfdGltZSBUaGUgZXhwaXJ5IHRpbWUgdG8gYmUgdXNlZCBmb3IgdGhlIHRpbWVyLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdGhhdCB3ZXJlIGNhbmNlbGxlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIElmIHRoZSB0aW1lciBoYXMgYWxyZWFkeSBleHBpcmVkIHdoZW4gZXhwaXJlc19hdCgpIGlzIGNhbGxlZCwgdGhlbgotICAgKiB0aGUgaGFuZGxlcnMgZm9yIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbnMgd2lsbDoKLSAgICoKLSAgICogQGxpIGhhdmUgYWxyZWFkeSBiZWVuIGludm9rZWQ7IG9yCi0gICAqCi0gICAqIEBsaSBoYXZlIGJlZW4gcXVldWVkIGZvciBpbnZvY2F0aW9uIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICoKLSAgICogVGhlc2UgaGFuZGxlcnMgY2FuIG5vIGxvbmdlciBiZSBjYW5jZWxsZWQsIGFuZCB0aGVyZWZvcmUgYXJlIHBhc3NlZCBhbgotICAgKiBlcnJvciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHdhaXQgb3BlcmF0aW9uLgotICAgKi8KLSAgc3RkOjpzaXplX3QgZXhwaXJlc19hdChjb25zdCB0aW1lX3BvaW50JiBleHBpcnlfdGltZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPnNlcnZpY2UuZXhwaXJlc19hdCgKLSAgICAgICAgdGhpcy0+aW1wbGVtZW50YXRpb24sIGV4cGlyeV90aW1lLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImV4cGlyZXNfYXQiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBTZXQgdGhlIHRpbWVyJ3MgZXhwaXJ5IHRpbWUgYXMgYW4gYWJzb2x1dGUgdGltZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZXhwaXJ5IHRpbWUuIEFueSBwZW5kaW5nIGFzeW5jaHJvbm91cyB3YWl0Ci0gICAqIG9wZXJhdGlvbnMgd2lsbCBiZSBjYW5jZWxsZWQuIFRoZSBoYW5kbGVyIGZvciBlYWNoIGNhbmNlbGxlZCBvcGVyYXRpb24gd2lsbAotICAgKiBiZSBpbnZva2VkIHdpdGggdGhlIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvciBjb2RlLgotICAgKgotICAgKiBAcGFyYW0gZXhwaXJ5X3RpbWUgVGhlIGV4cGlyeSB0aW1lIHRvIGJlIHVzZWQgZm9yIHRoZSB0aW1lci4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB0aGF0IHdlcmUgY2FuY2VsbGVkLgotICAgKgotICAgKiBAbm90ZSBJZiB0aGUgdGltZXIgaGFzIGFscmVhZHkgZXhwaXJlZCB3aGVuIGV4cGlyZXNfYXQoKSBpcyBjYWxsZWQsIHRoZW4KLSAgICogdGhlIGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgd2FpdCBvcGVyYXRpb25zIHdpbGw6Ci0gICAqCi0gICAqIEBsaSBoYXZlIGFscmVhZHkgYmVlbiBpbnZva2VkOyBvcgotICAgKgotICAgKiBAbGkgaGF2ZSBiZWVuIHF1ZXVlZCBmb3IgaW52b2NhdGlvbiBpbiB0aGUgbmVhciBmdXR1cmUuCi0gICAqCi0gICAqIFRoZXNlIGhhbmRsZXJzIGNhbiBubyBsb25nZXIgYmUgY2FuY2VsbGVkLCBhbmQgdGhlcmVmb3JlIGFyZSBwYXNzZWQgYW4KLSAgICogZXJyb3IgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSB3YWl0IG9wZXJhdGlvbi4KLSAgICovCi0gIHN0ZDo6c2l6ZV90IGV4cGlyZXNfYXQoY29uc3QgdGltZV9wb2ludCYgZXhwaXJ5X3RpbWUsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLmV4cGlyZXNfYXQodGhpcy0+aW1wbGVtZW50YXRpb24sIGV4cGlyeV90aW1lLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSB0aW1lcidzIGV4cGlyeSB0aW1lIHJlbGF0aXZlIHRvIG5vdy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSB0aW1lcidzIGN1cnJlbnQgZXhwaXJ5IHRpbWUuCi0gICAqIFdoZXRoZXIgdGhlIHRpbWVyIGhhcyBleHBpcmVkIG9yIG5vdCBkb2VzIG5vdCBhZmZlY3QgdGhpcyB2YWx1ZS4KLSAgICovCi0gIGR1cmF0aW9uIGV4cGlyZXNfZnJvbV9ub3coKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRoaXMtPnNlcnZpY2UuZXhwaXJlc19mcm9tX25vdyh0aGlzLT5pbXBsZW1lbnRhdGlvbik7Ci0gIH0KLQotICAvLy8gU2V0IHRoZSB0aW1lcidzIGV4cGlyeSB0aW1lIHJlbGF0aXZlIHRvIG5vdy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZXhwaXJ5IHRpbWUuIEFueSBwZW5kaW5nIGFzeW5jaHJvbm91cyB3YWl0Ci0gICAqIG9wZXJhdGlvbnMgd2lsbCBiZSBjYW5jZWxsZWQuIFRoZSBoYW5kbGVyIGZvciBlYWNoIGNhbmNlbGxlZCBvcGVyYXRpb24gd2lsbAotICAgKiBiZSBpbnZva2VkIHdpdGggdGhlIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvciBjb2RlLgotICAgKgotICAgKiBAcGFyYW0gZXhwaXJ5X3RpbWUgVGhlIGV4cGlyeSB0aW1lIHRvIGJlIHVzZWQgZm9yIHRoZSB0aW1lci4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRoYXQgd2VyZSBjYW5jZWxsZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBJZiB0aGUgdGltZXIgaGFzIGFscmVhZHkgZXhwaXJlZCB3aGVuIGV4cGlyZXNfZnJvbV9ub3coKSBpcyBjYWxsZWQsCi0gICAqIHRoZW4gdGhlIGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgd2FpdCBvcGVyYXRpb25zIHdpbGw6Ci0gICAqCi0gICAqIEBsaSBoYXZlIGFscmVhZHkgYmVlbiBpbnZva2VkOyBvcgotICAgKgotICAgKiBAbGkgaGF2ZSBiZWVuIHF1ZXVlZCBmb3IgaW52b2NhdGlvbiBpbiB0aGUgbmVhciBmdXR1cmUuCi0gICAqCi0gICAqIFRoZXNlIGhhbmRsZXJzIGNhbiBubyBsb25nZXIgYmUgY2FuY2VsbGVkLCBhbmQgdGhlcmVmb3JlIGFyZSBwYXNzZWQgYW4KLSAgICogZXJyb3IgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSB3YWl0IG9wZXJhdGlvbi4KLSAgICovCi0gIHN0ZDo6c2l6ZV90IGV4cGlyZXNfZnJvbV9ub3coY29uc3QgZHVyYXRpb24mIGV4cGlyeV90aW1lKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gdGhpcy0+c2VydmljZS5leHBpcmVzX2Zyb21fbm93KAotICAgICAgICB0aGlzLT5pbXBsZW1lbnRhdGlvbiwgZXhwaXJ5X3RpbWUsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiZXhwaXJlc19mcm9tX25vdyIpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgdGltZXIncyBleHBpcnkgdGltZSByZWxhdGl2ZSB0byBub3cuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGV4cGlyeSB0aW1lLiBBbnkgcGVuZGluZyBhc3luY2hyb25vdXMgd2FpdAotICAgKiBvcGVyYXRpb25zIHdpbGwgYmUgY2FuY2VsbGVkLiBUaGUgaGFuZGxlciBmb3IgZWFjaCBjYW5jZWxsZWQgb3BlcmF0aW9uIHdpbGwKLSAgICogYmUgaW52b2tlZCB3aXRoIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IgY29kZS4KLSAgICoKLSAgICogQHBhcmFtIGV4cGlyeV90aW1lIFRoZSBleHBpcnkgdGltZSB0byBiZSB1c2VkIGZvciB0aGUgdGltZXIuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgdGhhdCB3ZXJlIGNhbmNlbGxlZC4KLSAgICoKLSAgICogQG5vdGUgSWYgdGhlIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQgd2hlbiBleHBpcmVzX2Zyb21fbm93KCkgaXMgY2FsbGVkLAotICAgKiB0aGVuIHRoZSBoYW5kbGVycyBmb3IgYXN5bmNocm9ub3VzIHdhaXQgb3BlcmF0aW9ucyB3aWxsOgotICAgKgotICAgKiBAbGkgaGF2ZSBhbHJlYWR5IGJlZW4gaW52b2tlZDsgb3IKLSAgICoKLSAgICogQGxpIGhhdmUgYmVlbiBxdWV1ZWQgZm9yIGludm9jYXRpb24gaW4gdGhlIG5lYXIgZnV0dXJlLgotICAgKgotICAgKiBUaGVzZSBoYW5kbGVycyBjYW4gbm8gbG9uZ2VyIGJlIGNhbmNlbGxlZCwgYW5kIHRoZXJlZm9yZSBhcmUgcGFzc2VkIGFuCi0gICAqIGVycm9yIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgd2FpdCBvcGVyYXRpb24uCi0gICAqLwotICBzdGQ6OnNpemVfdCBleHBpcmVzX2Zyb21fbm93KGNvbnN0IGR1cmF0aW9uJiBleHBpcnlfdGltZSwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPnNlcnZpY2UuZXhwaXJlc19mcm9tX25vdygKLSAgICAgICAgdGhpcy0+aW1wbGVtZW50YXRpb24sIGV4cGlyeV90aW1lLCBlYyk7Ci0gIH0KLQotICAvLy8gUGVyZm9ybSBhIGJsb2NraW5nIHdhaXQgb24gdGhlIHRpbWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdhaXQgZm9yIHRoZSB0aW1lciB0byBleHBpcmUuIFRoaXMgZnVuY3Rpb24KLSAgICogYmxvY2tzIGFuZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgdGhlIHRpbWVyIGhhcyBleHBpcmVkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIHZvaWQgd2FpdCgpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPnNlcnZpY2Uud2FpdCh0aGlzLT5pbXBsZW1lbnRhdGlvbiwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ3YWl0Iik7Ci0gIH0KLQotICAvLy8gUGVyZm9ybSBhIGJsb2NraW5nIHdhaXQgb24gdGhlIHRpbWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdhaXQgZm9yIHRoZSB0aW1lciB0byBleHBpcmUuIFRoaXMgZnVuY3Rpb24KLSAgICogYmxvY2tzIGFuZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgdGhlIHRpbWVyIGhhcyBleHBpcmVkLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICovCi0gIHZvaWQgd2FpdChhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHRoaXMtPnNlcnZpY2Uud2FpdCh0aGlzLT5pbXBsZW1lbnRhdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3YWl0IG9uIHRoZSB0aW1lci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gaW5pdGlhdGUgYW4gYXN5bmNocm9ub3VzIHdhaXQgYWdhaW5zdCB0aGUKLSAgICogdGltZXIuIEl0IGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBGb3IgZWFjaCBjYWxsIHRvIGFzeW5jX3dhaXQoKSwgdGhlIHN1cHBsaWVkIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgZXhhY3RseQotICAgKiBvbmNlLiBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCB3aGVuOgotICAgKgotICAgKiBAbGkgVGhlIHRpbWVyIGhhcyBleHBpcmVkLgotICAgKgotICAgKiBAbGkgVGhlIHRpbWVyIHdhcyBjYW5jZWxsZWQsIGluIHdoaWNoIGNhc2UgdGhlIGhhbmRsZXIgaXMgcGFzc2VkIHRoZSBlcnJvcgotICAgKiBjb2RlIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuIENvcGllcwotICAgKiB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gICAqIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgV2FpdEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdhaXRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSkpCi0gIGFzeW5jX3dhaXQoQVNJT19NT1ZFX0FSRyhXYWl0SGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBXYWl0SGFuZGxlci4KLSAgICBBU0lPX1dBSVRfSEFORExFUl9DSEVDSyhXYWl0SGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLmFzeW5jX3dhaXQodGhpcy0+aW1wbGVtZW50YXRpb24sCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFdhaXRIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fQkFTSUNfV0FJVEFCTEVfVElNRVJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYnVmZmVyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9idWZmZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzg3MjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9idWZmZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjIzOSArMCwwIEBACi0vLwotLy8gYnVmZmVyLmhwcAotLy8gfn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0JVRkZFUl9IUFAKLSNkZWZpbmUgQVNJT19CVUZGRVJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYXJyYXlfZndkLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19NU1ZDKQotIyBpZiBkZWZpbmVkKF9IQVNfSVRFUkFUT1JfREVCVUdHSU5HKSAmJiAoX0hBU19JVEVSQVRPUl9ERUJVR0dJTkcgIT0gMCkKLSMgIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotIyAgIGRlZmluZSBBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HCi0jICBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfQlVGRkVSX0RFQlVHR0lORykKLSMgZW5kaWYgLy8gZGVmaW5lZChfSEFTX0lURVJBVE9SX0RFQlVHR0lORykKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fTVNWQykKLQotI2lmIGRlZmluZWQoX19HTlVDX18pCi0jIGlmIGRlZmluZWQoX0dMSUJDWFhfREVCVUcpCi0jICBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfQlVGRkVSX0RFQlVHR0lORykKLSMgICBkZWZpbmUgQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORwotIyAgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0jIGVuZGlmIC8vIGRlZmluZWQoX0dMSUJDWFhfREVCVUcpCi0jZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykKLQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORykKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvZnVuY3Rpb24uaHBwIgotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfV09SS0FST1VORCkKLSMgaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL3dvcmthcm91bmQuaHBwPgotIyBpZiBCT09TVF9XT1JLQVJPVU5EKF9fQk9STEFORENfXywgQk9PU1RfVEVTVEVEX0FUKDB4NTgyKSkgXAotICAgIHx8IEJPT1NUX1dPUktBUk9VTkQoX19TVU5QUk9fQ0MsIEJPT1NUX1RFU1RFRF9BVCgweDU5MCkpCi0jICBkZWZpbmUgQVNJT19FTkFCTEVfQVJSQVlfQlVGRkVSX1dPUktBUk9VTkQKLSMgZW5kaWYgLy8gQk9PU1RfV09SS0FST1VORChfX0JPUkxBTkRDX18sIEJPT1NUX1RFU1RFRF9BVCgweDU4MikpCi0gICAgICAgIC8vIHx8IEJPT1NUX1dPUktBUk9VTkQoX19TVU5QUk9fQ0MsIEJPT1NUX1RFU1RFRF9BVCgweDU5MCkpCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19CT09TVF9XT1JLQVJPVU5EKQotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9BUlJBWV9CVUZGRVJfV09SS0FST1VORCkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvdHlwZV90cmFpdHMuaHBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfQVJSQVlfQlVGRkVSX1dPUktBUk9VTkQpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLWNsYXNzIG11dGFibGVfYnVmZmVyOwotY2xhc3MgY29uc3RfYnVmZmVyOwotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLXZvaWQqIGJ1ZmZlcl9jYXN0X2hlbHBlcihjb25zdCBtdXRhYmxlX2J1ZmZlciYpOwotY29uc3Qgdm9pZCogYnVmZmVyX2Nhc3RfaGVscGVyKGNvbnN0IGNvbnN0X2J1ZmZlciYpOwotc3RkOjpzaXplX3QgYnVmZmVyX3NpemVfaGVscGVyKGNvbnN0IG11dGFibGVfYnVmZmVyJik7Ci1zdGQ6OnNpemVfdCBidWZmZXJfc2l6ZV9oZWxwZXIoY29uc3QgY29uc3RfYnVmZmVyJik7Ci19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotLy8vIEhvbGRzIGEgYnVmZmVyIHRoYXQgY2FuIGJlIG1vZGlmaWVkLgotLyoqCi0gKiBUaGUgbXV0YWJsZV9idWZmZXIgY2xhc3MgcHJvdmlkZXMgYSBzYWZlIHJlcHJlc2VudGF0aW9uIG9mIGEgYnVmZmVyIHRoYXQgY2FuCi0gKiBiZSBtb2RpZmllZC4gSXQgZG9lcyBub3Qgb3duIHRoZSB1bmRlcmx5aW5nIGRhdGEsIGFuZCBzbyBpcyBjaGVhcCB0byBjb3B5IG9yCi0gKiBhc3NpZ24uCi0gKgotICogQHBhciBBY2Nlc3NpbmcgQnVmZmVyIENvbnRlbnRzCi0gKgotICogVGhlIGNvbnRlbnRzIG9mIGEgYnVmZmVyIG1heSBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgQHJlZiBidWZmZXJfc2l6ZQotICogYW5kIEByZWYgYnVmZmVyX2Nhc3QgZnVuY3Rpb25zOgotICoKLSAqIEBjb2RlIGFzaW86Om11dGFibGVfYnVmZmVyIGIxID0gLi4uOwotICogc3RkOjpzaXplX3QgczEgPSBhc2lvOjpidWZmZXJfc2l6ZShiMSk7Ci0gKiB1bnNpZ25lZCBjaGFyKiBwMSA9IGFzaW86OmJ1ZmZlcl9jYXN0PHVuc2lnbmVkIGNoYXIqPihiMSk7Ci0gKiBAZW5kY29kZQotICoKLSAqIFRoZSBhc2lvOjpidWZmZXJfY2FzdCBmdW5jdGlvbiBwZXJtaXRzIHZpb2xhdGlvbnMgb2YgdHlwZSBzYWZldHksIHNvCi0gKiB1c2VzIG9mIGl0IGluIGFwcGxpY2F0aW9uIGNvZGUgc2hvdWxkIGJlIGNhcmVmdWxseSBjb25zaWRlcmVkLgotICovCi1jbGFzcyBtdXRhYmxlX2J1ZmZlcgotewotcHVibGljOgotICAvLy8gQ29uc3RydWN0IGFuIGVtcHR5IGJ1ZmZlci4KLSAgbXV0YWJsZV9idWZmZXIoKQotICAgIDogZGF0YV8oMCksCi0gICAgICBzaXplXygwKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgYnVmZmVyIHRvIHJlcHJlc2VudCBhIGdpdmVuIG1lbW9yeSByYW5nZS4KLSAgbXV0YWJsZV9idWZmZXIodm9pZCogZGF0YSwgc3RkOjpzaXplX3Qgc2l6ZSkKLSAgICA6IGRhdGFfKGRhdGEpLAotICAgICAgc2l6ZV8oc2l6ZSkKLSAgewotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gIG11dGFibGVfYnVmZmVyKHZvaWQqIGRhdGEsIHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgICBhc2lvOjpkZXRhaWw6OmZ1bmN0aW9uPHZvaWQoKT4gZGVidWdfY2hlY2spCi0gICAgOiBkYXRhXyhkYXRhKSwKLSAgICAgIHNpemVfKHNpemUpLAotICAgICAgZGVidWdfY2hlY2tfKGRlYnVnX2NoZWNrKQotICB7Ci0gIH0KLQotICBjb25zdCBhc2lvOjpkZXRhaWw6OmZ1bmN0aW9uPHZvaWQoKT4mIGdldF9kZWJ1Z19jaGVjaygpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gZGVidWdfY2hlY2tfOwotICB9Ci0jZW5kaWYgLy8gQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORwotCi1wcml2YXRlOgotICBmcmllbmQgdm9pZCogYXNpbzo6ZGV0YWlsOjpidWZmZXJfY2FzdF9oZWxwZXIoCi0gICAgICBjb25zdCBtdXRhYmxlX2J1ZmZlciYgYik7Ci0gIGZyaWVuZCBzdGQ6OnNpemVfdCBhc2lvOjpkZXRhaWw6OmJ1ZmZlcl9zaXplX2hlbHBlcigKLSAgICAgIGNvbnN0IG11dGFibGVfYnVmZmVyJiBiKTsKLQotICB2b2lkKiBkYXRhXzsKLSAgc3RkOjpzaXplX3Qgc2l6ZV87Ci0KLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gIGFzaW86OmRldGFpbDo6ZnVuY3Rpb248dm9pZCgpPiBkZWJ1Z19jaGVja187Ci0jZW5kaWYgLy8gQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORwotfTsKLQotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWlubGluZSB2b2lkKiBidWZmZXJfY2FzdF9oZWxwZXIoY29uc3QgbXV0YWJsZV9idWZmZXImIGIpCi17Ci0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotICBpZiAoYi5zaXplXyAmJiBiLmRlYnVnX2NoZWNrXykKLSAgICBiLmRlYnVnX2NoZWNrXygpOwotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLSAgcmV0dXJuIGIuZGF0YV87Ci19Ci0KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZV9oZWxwZXIoY29uc3QgbXV0YWJsZV9idWZmZXImIGIpCi17Ci0gIHJldHVybiBiLnNpemVfOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotLy8vIEFkYXB0cyBhIHNpbmdsZSBtb2RpZmlhYmxlIGJ1ZmZlciBzbyB0aGF0IGl0IG1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlCi0vLy8gTXV0YWJsZUJ1ZmZlclNlcXVlbmNlIGNvbmNlcHQuCi1jbGFzcyBtdXRhYmxlX2J1ZmZlcnNfMQotICA6IHB1YmxpYyBtdXRhYmxlX2J1ZmZlcgotewotcHVibGljOgotICAvLy8gVGhlIHR5cGUgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgbGlzdCBvZiBidWZmZXJzLgotICB0eXBlZGVmIG11dGFibGVfYnVmZmVyIHZhbHVlX3R5cGU7Ci0KLSAgLy8vIEEgcmFuZG9tLWFjY2VzcyBpdGVyYXRvciB0eXBlIHRoYXQgbWF5IGJlIHVzZWQgdG8gcmVhZCBlbGVtZW50cy4KLSAgdHlwZWRlZiBjb25zdCBtdXRhYmxlX2J1ZmZlciogY29uc3RfaXRlcmF0b3I7Ci0KLSAgLy8vIENvbnN0cnVjdCB0byByZXByZXNlbnQgYSBnaXZlbiBtZW1vcnkgcmFuZ2UuCi0gIG11dGFibGVfYnVmZmVyc18xKHZvaWQqIGRhdGEsIHN0ZDo6c2l6ZV90IHNpemUpCi0gICAgOiBtdXRhYmxlX2J1ZmZlcihkYXRhLCBzaXplKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IHRvIHJlcHJlc2VudCBhIHNpbmdsZSBtb2RpZmlhYmxlIGJ1ZmZlci4KLSAgZXhwbGljaXQgbXV0YWJsZV9idWZmZXJzXzEoY29uc3QgbXV0YWJsZV9idWZmZXImIGIpCi0gICAgOiBtdXRhYmxlX2J1ZmZlcihiKQotICB7Ci0gIH0KLQotICAvLy8gR2V0IGEgcmFuZG9tLWFjY2VzcyBpdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudC4KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvLy8gR2V0IGEgcmFuZG9tLWFjY2VzcyBpdGVyYXRvciBmb3Igb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudC4KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QKLSAgewotICAgIHJldHVybiBiZWdpbigpICsgMTsKLSAgfQotfTsKLQotLy8vIEhvbGRzIGEgYnVmZmVyIHRoYXQgY2Fubm90IGJlIG1vZGlmaWVkLgotLyoqCi0gKiBUaGUgY29uc3RfYnVmZmVyIGNsYXNzIHByb3ZpZGVzIGEgc2FmZSByZXByZXNlbnRhdGlvbiBvZiBhIGJ1ZmZlciB0aGF0IGNhbm5vdAotICogYmUgbW9kaWZpZWQuIEl0IGRvZXMgbm90IG93biB0aGUgdW5kZXJseWluZyBkYXRhLCBhbmQgc28gaXMgY2hlYXAgdG8gY29weSBvcgotICogYXNzaWduLgotICoKLSAqIEBwYXIgQWNjZXNzaW5nIEJ1ZmZlciBDb250ZW50cwotICoKLSAqIFRoZSBjb250ZW50cyBvZiBhIGJ1ZmZlciBtYXkgYmUgYWNjZXNzZWQgdXNpbmcgdGhlIEByZWYgYnVmZmVyX3NpemUKLSAqIGFuZCBAcmVmIGJ1ZmZlcl9jYXN0IGZ1bmN0aW9uczoKLSAqCi0gKiBAY29kZSBhc2lvOjpjb25zdF9idWZmZXIgYjEgPSAuLi47Ci0gKiBzdGQ6OnNpemVfdCBzMSA9IGFzaW86OmJ1ZmZlcl9zaXplKGIxKTsKLSAqIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHAxID0gYXNpbzo6YnVmZmVyX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGIxKTsKLSAqIEBlbmRjb2RlCi0gKgotICogVGhlIGFzaW86OmJ1ZmZlcl9jYXN0IGZ1bmN0aW9uIHBlcm1pdHMgdmlvbGF0aW9ucyBvZiB0eXBlIHNhZmV0eSwgc28KLSAqIHVzZXMgb2YgaXQgaW4gYXBwbGljYXRpb24gY29kZSBzaG91bGQgYmUgY2FyZWZ1bGx5IGNvbnNpZGVyZWQuCi0gKi8KLWNsYXNzIGNvbnN0X2J1ZmZlcgotewotcHVibGljOgotICAvLy8gQ29uc3RydWN0IGFuIGVtcHR5IGJ1ZmZlci4KLSAgY29uc3RfYnVmZmVyKCkKLSAgICA6IGRhdGFfKDApLAotICAgICAgc2l6ZV8oMCkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJ1ZmZlciB0byByZXByZXNlbnQgYSBnaXZlbiBtZW1vcnkgcmFuZ2UuCi0gIGNvbnN0X2J1ZmZlcihjb25zdCB2b2lkKiBkYXRhLCBzdGQ6OnNpemVfdCBzaXplKQotICAgIDogZGF0YV8oZGF0YSksCi0gICAgICBzaXplXyhzaXplKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgbm9uLW1vZGlmaWFibGUgYnVmZmVyIGZyb20gYSBtb2RpZmlhYmxlIG9uZS4KLSAgY29uc3RfYnVmZmVyKGNvbnN0IG11dGFibGVfYnVmZmVyJiBiKQotICAgIDogZGF0YV8oYXNpbzo6ZGV0YWlsOjpidWZmZXJfY2FzdF9oZWxwZXIoYikpLAotICAgICAgc2l6ZV8oYXNpbzo6ZGV0YWlsOjpidWZmZXJfc2l6ZV9oZWxwZXIoYikpCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotICAgICAgLCBkZWJ1Z19jaGVja18oYi5nZXRfZGVidWdfY2hlY2soKSkKLSNlbmRpZiAvLyBBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HCi0gIHsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotICBjb25zdF9idWZmZXIoY29uc3Qgdm9pZCogZGF0YSwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIGFzaW86OmRldGFpbDo6ZnVuY3Rpb248dm9pZCgpPiBkZWJ1Z19jaGVjaykKLSAgICA6IGRhdGFfKGRhdGEpLAotICAgICAgc2l6ZV8oc2l6ZSksCi0gICAgICBkZWJ1Z19jaGVja18oZGVidWdfY2hlY2spCi0gIHsKLSAgfQotCi0gIGNvbnN0IGFzaW86OmRldGFpbDo6ZnVuY3Rpb248dm9pZCgpPiYgZ2V0X2RlYnVnX2NoZWNrKCkgY29uc3QKLSAgewotICAgIHJldHVybiBkZWJ1Z19jaGVja187Ci0gIH0KLSNlbmRpZiAvLyBBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HCi0KLXByaXZhdGU6Ci0gIGZyaWVuZCBjb25zdCB2b2lkKiBhc2lvOjpkZXRhaWw6OmJ1ZmZlcl9jYXN0X2hlbHBlcigKLSAgICAgIGNvbnN0IGNvbnN0X2J1ZmZlciYgYik7Ci0gIGZyaWVuZCBzdGQ6OnNpemVfdCBhc2lvOjpkZXRhaWw6OmJ1ZmZlcl9zaXplX2hlbHBlcigKLSAgICAgIGNvbnN0IGNvbnN0X2J1ZmZlciYgYik7Ci0KLSAgY29uc3Qgdm9pZCogZGF0YV87Ci0gIHN0ZDo6c2l6ZV90IHNpemVfOwotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotICBhc2lvOjpkZXRhaWw6OmZ1bmN0aW9uPHZvaWQoKT4gZGVidWdfY2hlY2tfOwotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLX07Ci0KLW5hbWVzcGFjZSBkZXRhaWwgewotCi1pbmxpbmUgY29uc3Qgdm9pZCogYnVmZmVyX2Nhc3RfaGVscGVyKGNvbnN0IGNvbnN0X2J1ZmZlciYgYikKLXsKLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gIGlmIChiLnNpemVfICYmIGIuZGVidWdfY2hlY2tfKQotICAgIGIuZGVidWdfY2hlY2tfKCk7Ci0jZW5kaWYgLy8gQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORwotICByZXR1cm4gYi5kYXRhXzsKLX0KLQotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplX2hlbHBlcihjb25zdCBjb25zdF9idWZmZXImIGIpCi17Ci0gIHJldHVybiBiLnNpemVfOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotLy8vIEFkYXB0cyBhIHNpbmdsZSBub24tbW9kaWZpYWJsZSBidWZmZXIgc28gdGhhdCBpdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mCi0vLy8gdGhlIENvbnN0QnVmZmVyU2VxdWVuY2UgY29uY2VwdC4KLWNsYXNzIGNvbnN0X2J1ZmZlcnNfMQotICA6IHB1YmxpYyBjb25zdF9idWZmZXIKLXsKLXB1YmxpYzoKLSAgLy8vIFRoZSB0eXBlIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGxpc3Qgb2YgYnVmZmVycy4KLSAgdHlwZWRlZiBjb25zdF9idWZmZXIgdmFsdWVfdHlwZTsKLQotICAvLy8gQSByYW5kb20tYWNjZXNzIGl0ZXJhdG9yIHR5cGUgdGhhdCBtYXkgYmUgdXNlZCB0byByZWFkIGVsZW1lbnRzLgotICB0eXBlZGVmIGNvbnN0IGNvbnN0X2J1ZmZlciogY29uc3RfaXRlcmF0b3I7Ci0KLSAgLy8vIENvbnN0cnVjdCB0byByZXByZXNlbnQgYSBnaXZlbiBtZW1vcnkgcmFuZ2UuCi0gIGNvbnN0X2J1ZmZlcnNfMShjb25zdCB2b2lkKiBkYXRhLCBzdGQ6OnNpemVfdCBzaXplKQotICAgIDogY29uc3RfYnVmZmVyKGRhdGEsIHNpemUpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgdG8gcmVwcmVzZW50IGEgc2luZ2xlIG5vbi1tb2RpZmlhYmxlIGJ1ZmZlci4KLSAgZXhwbGljaXQgY29uc3RfYnVmZmVyc18xKGNvbnN0IGNvbnN0X2J1ZmZlciYgYikKLSAgICA6IGNvbnN0X2J1ZmZlcihiKQotICB7Ci0gIH0KLQotICAvLy8gR2V0IGEgcmFuZG9tLWFjY2VzcyBpdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudC4KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvLy8gR2V0IGEgcmFuZG9tLWFjY2VzcyBpdGVyYXRvciBmb3Igb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudC4KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QKLSAgewotICAgIHJldHVybiBiZWdpbigpICsgMTsKLSAgfQotfTsKLQotLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIGJvdGggdGhlIENvbnN0QnVmZmVyU2VxdWVuY2UgYW5kIE11dGFibGVCdWZmZXJTZXF1ZW5jZQotLy8vIGNvbmNlcHRzIHRvIHJlcHJlc2VudCBhIG51bGwgYnVmZmVyIHNlcXVlbmNlLgotY2xhc3MgbnVsbF9idWZmZXJzCi17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgdHlwZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBsaXN0IG9mIGJ1ZmZlcnMuCi0gIHR5cGVkZWYgbXV0YWJsZV9idWZmZXIgdmFsdWVfdHlwZTsKLQotICAvLy8gQSByYW5kb20tYWNjZXNzIGl0ZXJhdG9yIHR5cGUgdGhhdCBtYXkgYmUgdXNlZCB0byByZWFkIGVsZW1lbnRzLgotICB0eXBlZGVmIGNvbnN0IG11dGFibGVfYnVmZmVyKiBjb25zdF9pdGVyYXRvcjsKLQotICAvLy8gR2V0IGEgcmFuZG9tLWFjY2VzcyBpdGVyYXRvciB0byB0aGUgZmlyc3QgZWxlbWVudC4KLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICZidWZfOwotICB9Ci0KLSAgLy8vIEdldCBhIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3IgZm9yIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQuCi0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gJmJ1Zl87Ci0gIH0KLQotcHJpdmF0ZToKLSAgbXV0YWJsZV9idWZmZXIgYnVmXzsKLX07Ci0KLS8qKiBAZGVmZ3JvdXAgYnVmZmVyX3NpemUgYXNpbzo6YnVmZmVyX3NpemUKLSAqCi0gKiBAYnJpZWYgVGhlIGFzaW86OmJ1ZmZlcl9zaXplIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIHRvdGFsIG51bWJlciBvZgotICogYnl0ZXMgaW4gYSBidWZmZXIgb3IgYnVmZmVyIHNlcXVlbmNlLgotICovCi0vKkB7Ki8KLQotLy8vIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgbW9kaWZpYWJsZSBidWZmZXIuCi1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX3NpemUoY29uc3QgbXV0YWJsZV9idWZmZXImIGIpCi17Ci0gIHJldHVybiBkZXRhaWw6OmJ1ZmZlcl9zaXplX2hlbHBlcihiKTsKLX0KLQotLy8vIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgbW9kaWZpYWJsZSBidWZmZXIuCi1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX3NpemUoY29uc3QgbXV0YWJsZV9idWZmZXJzXzEmIGIpCi17Ci0gIHJldHVybiBkZXRhaWw6OmJ1ZmZlcl9zaXplX2hlbHBlcihiKTsKLX0KLQotLy8vIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgbm9uLW1vZGlmaWFibGUgYnVmZmVyLgotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplKGNvbnN0IGNvbnN0X2J1ZmZlciYgYikKLXsKLSAgcmV0dXJuIGRldGFpbDo6YnVmZmVyX3NpemVfaGVscGVyKGIpOwotfQotCi0vLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBub24tbW9kaWZpYWJsZSBidWZmZXIuCi1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX3NpemUoY29uc3QgY29uc3RfYnVmZmVyc18xJiBiKQotewotICByZXR1cm4gZGV0YWlsOjpidWZmZXJfc2l6ZV9oZWxwZXIoYik7Ci19Ci0KLS8vLyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBpbiBhIGJ1ZmZlciBzZXF1ZW5jZS4KLS8qKiAKLSAqIFRoZSBAYyBCdWZmZXJTZXF1ZW5jZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbWF5IG1lZXQgZWl0aGVyIG9mIHRoZSBAYwotICogQ29uc3RCdWZmZXJTZXF1ZW5jZSBvciBAYyBNdXRhYmxlQnVmZmVyU2VxdWVuY2UgdHlwZSByZXF1aXJlbWVudHMuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZShjb25zdCBCdWZmZXJTZXF1ZW5jZSYgYikKLXsKLSAgc3RkOjpzaXplX3QgdG90YWxfYnVmZmVyX3NpemUgPSAwOwotCi0gIHR5cGVuYW1lIEJ1ZmZlclNlcXVlbmNlOjpjb25zdF9pdGVyYXRvciBpdGVyID0gYi5iZWdpbigpOwotICB0eXBlbmFtZSBCdWZmZXJTZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgZW5kID0gYi5lbmQoKTsKLSAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIpCi0gICAgdG90YWxfYnVmZmVyX3NpemUgKz0gZGV0YWlsOjpidWZmZXJfc2l6ZV9oZWxwZXIoKml0ZXIpOwotCi0gIHJldHVybiB0b3RhbF9idWZmZXJfc2l6ZTsKLX0KLQotLypAfSovCi0KLS8qKiBAZGVmZ3JvdXAgYnVmZmVyX2Nhc3QgYXNpbzo6YnVmZmVyX2Nhc3QKLSAqCi0gKiBAYnJpZWYgVGhlIGFzaW86OmJ1ZmZlcl9jYXN0IGZ1bmN0aW9uIGlzIHVzZWQgdG8gb2J0YWluIGEgcG9pbnRlciB0bwotICogdGhlIHVuZGVybHlpbmcgbWVtb3J5IHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggYSBidWZmZXIuCi0gKgotICogQHBhciBFeGFtcGxlczoKLSAqCi0gKiBUbyBhY2Nlc3MgdGhlIG1lbW9yeSBvZiBhIG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciwgdXNlOgotICogQGNvZGUgYXNpbzo6Y29uc3RfYnVmZmVyIGIxID0gLi4uOwotICogY29uc3QgdW5zaWduZWQgY2hhciogcDEgPSBhc2lvOjpidWZmZXJfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYjEpOwotICogQGVuZGNvZGUKLSAqCi0gKiBUbyBhY2Nlc3MgdGhlIG1lbW9yeSBvZiBhIG1vZGlmaWFibGUgYnVmZmVyLCB1c2U6Ci0gKiBAY29kZSBhc2lvOjptdXRhYmxlX2J1ZmZlciBiMiA9IC4uLjsKLSAqIHVuc2lnbmVkIGNoYXIqIHAyID0gYXNpbzo6YnVmZmVyX2Nhc3Q8dW5zaWduZWQgY2hhcio+KGIyKTsKLSAqIEBlbmRjb2RlCi0gKgotICogVGhlIGFzaW86OmJ1ZmZlcl9jYXN0IGZ1bmN0aW9uIHBlcm1pdHMgdmlvbGF0aW9ucyBvZiB0eXBlIHNhZmV0eSwgc28KLSAqIHVzZXMgb2YgaXQgaW4gYXBwbGljYXRpb24gY29kZSBzaG91bGQgYmUgY2FyZWZ1bGx5IGNvbnNpZGVyZWQuCi0gKi8KLS8qQHsqLwotCi0vLy8gQ2FzdCBhIG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciB0byBhIHNwZWNpZmllZCBwb2ludGVyIHRvIFBPRCB0eXBlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXJUb1BvZFR5cGU+Ci1pbmxpbmUgUG9pbnRlclRvUG9kVHlwZSBidWZmZXJfY2FzdChjb25zdCBtdXRhYmxlX2J1ZmZlciYgYikKLXsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PFBvaW50ZXJUb1BvZFR5cGU+KGRldGFpbDo6YnVmZmVyX2Nhc3RfaGVscGVyKGIpKTsKLX0KLQotLy8vIENhc3QgYSBub24tbW9kaWZpYWJsZSBidWZmZXIgdG8gYSBzcGVjaWZpZWQgcG9pbnRlciB0byBQT0QgdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyVG9Qb2RUeXBlPgotaW5saW5lIFBvaW50ZXJUb1BvZFR5cGUgYnVmZmVyX2Nhc3QoY29uc3QgY29uc3RfYnVmZmVyJiBiKQotewotICByZXR1cm4gc3RhdGljX2Nhc3Q8UG9pbnRlclRvUG9kVHlwZT4oZGV0YWlsOjpidWZmZXJfY2FzdF9oZWxwZXIoYikpOwotfQotCi0vKkB9Ki8KLQotLy8vIENyZWF0ZSBhIG5ldyBtb2RpZmlhYmxlIGJ1ZmZlciB0aGF0IGlzIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiBhbm90aGVyLgotLyoqCi0gKiBAcmVsYXRlcyBtdXRhYmxlX2J1ZmZlcgotICovCi1pbmxpbmUgbXV0YWJsZV9idWZmZXIgb3BlcmF0b3IrKGNvbnN0IG11dGFibGVfYnVmZmVyJiBiLCBzdGQ6OnNpemVfdCBzdGFydCkKLXsKLSAgaWYgKHN0YXJ0ID4gYnVmZmVyX3NpemUoYikpCi0gICAgcmV0dXJuIG11dGFibGVfYnVmZmVyKCk7Ci0gIGNoYXIqIG5ld19kYXRhID0gYnVmZmVyX2Nhc3Q8Y2hhcio+KGIpICsgc3RhcnQ7Ci0gIHN0ZDo6c2l6ZV90IG5ld19zaXplID0gYnVmZmVyX3NpemUoYikgLSBzdGFydDsKLSAgcmV0dXJuIG11dGFibGVfYnVmZmVyKG5ld19kYXRhLCBuZXdfc2l6ZQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORykKLSAgICAgICwgYi5nZXRfZGVidWdfY2hlY2soKQotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLSAgICAgICk7Ci19Ci0KLS8vLyBDcmVhdGUgYSBuZXcgbW9kaWZpYWJsZSBidWZmZXIgdGhhdCBpcyBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgYW5vdGhlci4KLS8qKgotICogQHJlbGF0ZXMgbXV0YWJsZV9idWZmZXIKLSAqLwotaW5saW5lIG11dGFibGVfYnVmZmVyIG9wZXJhdG9yKyhzdGQ6OnNpemVfdCBzdGFydCwgY29uc3QgbXV0YWJsZV9idWZmZXImIGIpCi17Ci0gIGlmIChzdGFydCA+IGJ1ZmZlcl9zaXplKGIpKQotICAgIHJldHVybiBtdXRhYmxlX2J1ZmZlcigpOwotICBjaGFyKiBuZXdfZGF0YSA9IGJ1ZmZlcl9jYXN0PGNoYXIqPihiKSArIHN0YXJ0OwotICBzdGQ6OnNpemVfdCBuZXdfc2l6ZSA9IGJ1ZmZlcl9zaXplKGIpIC0gc3RhcnQ7Ci0gIHJldHVybiBtdXRhYmxlX2J1ZmZlcihuZXdfZGF0YSwgbmV3X3NpemUKLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gICAgICAsIGIuZ2V0X2RlYnVnX2NoZWNrKCkKLSNlbmRpZiAvLyBBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HCi0gICAgICApOwotfQotCi0vLy8gQ3JlYXRlIGEgbmV3IG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciB0aGF0IGlzIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiBhbm90aGVyLgotLyoqCi0gKiBAcmVsYXRlcyBjb25zdF9idWZmZXIKLSAqLwotaW5saW5lIGNvbnN0X2J1ZmZlciBvcGVyYXRvcisoY29uc3QgY29uc3RfYnVmZmVyJiBiLCBzdGQ6OnNpemVfdCBzdGFydCkKLXsKLSAgaWYgKHN0YXJ0ID4gYnVmZmVyX3NpemUoYikpCi0gICAgcmV0dXJuIGNvbnN0X2J1ZmZlcigpOwotICBjb25zdCBjaGFyKiBuZXdfZGF0YSA9IGJ1ZmZlcl9jYXN0PGNvbnN0IGNoYXIqPihiKSArIHN0YXJ0OwotICBzdGQ6OnNpemVfdCBuZXdfc2l6ZSA9IGJ1ZmZlcl9zaXplKGIpIC0gc3RhcnQ7Ci0gIHJldHVybiBjb25zdF9idWZmZXIobmV3X2RhdGEsIG5ld19zaXplCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotICAgICAgLCBiLmdldF9kZWJ1Z19jaGVjaygpCi0jZW5kaWYgLy8gQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORwotICAgICAgKTsKLX0KLQotLy8vIENyZWF0ZSBhIG5ldyBub24tbW9kaWZpYWJsZSBidWZmZXIgdGhhdCBpcyBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgYW5vdGhlci4KLS8qKgotICogQHJlbGF0ZXMgY29uc3RfYnVmZmVyCi0gKi8KLWlubGluZSBjb25zdF9idWZmZXIgb3BlcmF0b3IrKHN0ZDo6c2l6ZV90IHN0YXJ0LCBjb25zdCBjb25zdF9idWZmZXImIGIpCi17Ci0gIGlmIChzdGFydCA+IGJ1ZmZlcl9zaXplKGIpKQotICAgIHJldHVybiBjb25zdF9idWZmZXIoKTsKLSAgY29uc3QgY2hhciogbmV3X2RhdGEgPSBidWZmZXJfY2FzdDxjb25zdCBjaGFyKj4oYikgKyBzdGFydDsKLSAgc3RkOjpzaXplX3QgbmV3X3NpemUgPSBidWZmZXJfc2l6ZShiKSAtIHN0YXJ0OwotICByZXR1cm4gY29uc3RfYnVmZmVyKG5ld19kYXRhLCBuZXdfc2l6ZQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORykKLSAgICAgICwgYi5nZXRfZGVidWdfY2hlY2soKQotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLSAgICAgICk7Ci19Ci0KLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgotY2xhc3MgYnVmZmVyX2RlYnVnX2NoZWNrCi17Ci1wdWJsaWM6Ci0gIGJ1ZmZlcl9kZWJ1Z19jaGVjayhJdGVyYXRvciBpdGVyKQotICAgIDogaXRlcl8oaXRlcikKLSAgewotICB9Ci0KLSAgfmJ1ZmZlcl9kZWJ1Z19jaGVjaygpCi0gIHsKLSNpZiBkZWZpbmVkKEFTSU9fTVNWQykgJiYgKEFTSU9fTVNWQyA9PSAxNDAwKQotICAgIC8vIE1TVkMgOCdzIHN0cmluZyBpdGVyYXRvciBjaGVja2luZyBtYXkgY3Jhc2ggaW4gYSBzdGQ6OnN0cmluZzo6aXRlcmF0b3IKLSAgICAvLyBvYmplY3QncyBkZXN0cnVjdG9yIHdoZW4gdGhlIGl0ZXJhdG9yIHBvaW50cyB0byBhbiBhbHJlYWR5LWRlc3Ryb3llZAotICAgIC8vIHN0ZDo6c3RyaW5nIG9iamVjdCwgdW5sZXNzIHRoZSBpdGVyYXRvciBpcyBjbGVhcmVkIGZpcnN0LgotICAgIGl0ZXJfID0gSXRlcmF0b3IoKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fTVNWQykgJiYgKEFTSU9fTVNWQyA9PSAxNDAwKQotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcigpKCkKLSAgewotICAgICppdGVyXzsKLSAgfQotCi1wcml2YXRlOgotICBJdGVyYXRvciBpdGVyXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLQotLyoqIEBkZWZncm91cCBidWZmZXIgYXNpbzo6YnVmZmVyCi0gKgotICogQGJyaWVmIFRoZSBhc2lvOjpidWZmZXIgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidWZmZXIgb2JqZWN0IHRvCi0gKiByZXByZXNlbnQgcmF3IG1lbW9yeSwgYW4gYXJyYXkgb2YgUE9EIGVsZW1lbnRzLCBhIHZlY3RvciBvZiBQT0QgZWxlbWVudHMsCi0gKiBvciBhIHN0ZDo6c3RyaW5nLgotICoKLSAqIEEgYnVmZmVyIG9iamVjdCByZXByZXNlbnRzIGEgY29udGlndW91cyByZWdpb24gb2YgbWVtb3J5IGFzIGEgMi10dXBsZQotICogY29uc2lzdGluZyBvZiBhIHBvaW50ZXIgYW5kIHNpemUgaW4gYnl0ZXMuIEEgdHVwbGUgb2YgdGhlIGZvcm0gPHR0Pnt2b2lkKiwKLSAqIHNpemVfdH08L3R0PiBzcGVjaWZpZXMgYSBtdXRhYmxlIChtb2RpZmlhYmxlKSByZWdpb24gb2YgbWVtb3J5LiBTaW1pbGFybHksIGEKLSAqIHR1cGxlIG9mIHRoZSBmb3JtIDx0dD57Y29uc3Qgdm9pZCosIHNpemVfdH08L3R0PiBzcGVjaWZpZXMgYSBjb25zdAotICogKG5vbi1tb2RpZmlhYmxlKSByZWdpb24gb2YgbWVtb3J5LiBUaGVzZSB0d28gZm9ybXMgY29ycmVzcG9uZCB0byB0aGUgY2xhc3NlcwotICogbXV0YWJsZV9idWZmZXIgYW5kIGNvbnN0X2J1ZmZlciwgcmVzcGVjdGl2ZWx5LiBUbyBtaXJyb3IgQysrJ3MgY29udmVyc2lvbgotICogcnVsZXMsIGEgbXV0YWJsZV9idWZmZXIgaXMgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBhIGNvbnN0X2J1ZmZlciwgYW5kIHRoZQotICogb3Bwb3NpdGUgY29udmVyc2lvbiBpcyBub3QgcGVybWl0dGVkLgotICoKLSAqIFRoZSBzaW1wbGVzdCB1c2UgY2FzZSBpbnZvbHZlcyByZWFkaW5nIG9yIHdyaXRpbmcgYSBzaW5nbGUgYnVmZmVyIG9mIGEKLSAqIHNwZWNpZmllZCBzaXplOgotICoKLSAqIEBjb2RlIHNvY2suc2VuZChhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSkpOyBAZW5kY29kZQotICoKLSAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgcmV0dXJuIHZhbHVlIG9mIGFzaW86OmJ1ZmZlciBtZWV0cyB0aGUKLSAqIHJlcXVpcmVtZW50cyBvZiB0aGUgQ29uc3RCdWZmZXJTZXF1ZW5jZSBjb25jZXB0IHNvIHRoYXQgaXQgbWF5IGJlIGRpcmVjdGx5Ci0gKiBwYXNzZWQgdG8gdGhlIHNvY2tldCdzIHdyaXRlIGZ1bmN0aW9uLiBBIGJ1ZmZlciBjcmVhdGVkIGZvciBtb2RpZmlhYmxlCi0gKiBtZW1vcnkgYWxzbyBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UgY29uY2VwdC4KLSAqCi0gKiBBbiBpbmRpdmlkdWFsIGJ1ZmZlciBtYXkgYmUgY3JlYXRlZCBmcm9tIGEgYnVpbHRpbiBhcnJheSwgc3RkOjp2ZWN0b3IsCi0gKiBzdGQ6OmFycmF5IG9yIGJvb3N0OjphcnJheSBvZiBQT0QgZWxlbWVudHMuIFRoaXMgaGVscHMgcHJldmVudCBidWZmZXIKLSAqIG92ZXJydW5zIGJ5IGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5pbmcgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcjoKLSAqCi0gKiBAY29kZSBjaGFyIGQxWzEyOF07Ci0gKiBzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSBzb2NrLnJlY2VpdmUoYXNpbzo6YnVmZmVyKGQxKSk7Ci0gKgotICogc3RkOjp2ZWN0b3I8Y2hhcj4gZDIoMTI4KTsKLSAqIGJ5dGVzX3RyYW5zZmVycmVkID0gc29jay5yZWNlaXZlKGFzaW86OmJ1ZmZlcihkMikpOwotICoKLSAqIHN0ZDo6YXJyYXk8Y2hhciwgMTI4PiBkMzsKLSAqIGJ5dGVzX3RyYW5zZmVycmVkID0gc29jay5yZWNlaXZlKGFzaW86OmJ1ZmZlcihkMykpOwotICoKLSAqIGJvb3N0OjphcnJheTxjaGFyLCAxMjg+IGQ0OwotICogYnl0ZXNfdHJhbnNmZXJyZWQgPSBzb2NrLnJlY2VpdmUoYXNpbzo6YnVmZmVyKGQ0KSk7IEBlbmRjb2RlCi0gKgotICogSW4gYWxsIHRocmVlIGNhc2VzIGFib3ZlLCB0aGUgYnVmZmVycyBjcmVhdGVkIGFyZSBleGFjdGx5IDEyOCBieXRlcyBsb25nLgotICogTm90ZSB0aGF0IGEgdmVjdG9yIGlzIEBlIG5ldmVyIGF1dG9tYXRpY2FsbHkgcmVzaXplZCB3aGVuIGNyZWF0aW5nIG9yIHVzaW5nCi0gKiBhIGJ1ZmZlci4gVGhlIGJ1ZmZlciBzaXplIGlzIGRldGVybWluZWQgdXNpbmcgdGhlIHZlY3RvcidzIDx0dD5zaXplKCk8L3R0PgotICogbWVtYmVyIGZ1bmN0aW9uLCBhbmQgbm90IGl0cyBjYXBhY2l0eS4KLSAqCi0gKiBAcGFyIEFjY2Vzc2luZyBCdWZmZXIgQ29udGVudHMKLSAqCi0gKiBUaGUgY29udGVudHMgb2YgYSBidWZmZXIgbWF5IGJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBAcmVmIGJ1ZmZlcl9zaXplIGFuZAotICogQHJlZiBidWZmZXJfY2FzdCBmdW5jdGlvbnM6Ci0gKgotICogQGNvZGUgYXNpbzo6bXV0YWJsZV9idWZmZXIgYjEgPSAuLi47Ci0gKiBzdGQ6OnNpemVfdCBzMSA9IGFzaW86OmJ1ZmZlcl9zaXplKGIxKTsKLSAqIHVuc2lnbmVkIGNoYXIqIHAxID0gYXNpbzo6YnVmZmVyX2Nhc3Q8dW5zaWduZWQgY2hhcio+KGIxKTsKLSAqCi0gKiBhc2lvOjpjb25zdF9idWZmZXIgYjIgPSAuLi47Ci0gKiBzdGQ6OnNpemVfdCBzMiA9IGFzaW86OmJ1ZmZlcl9zaXplKGIyKTsKLSAqIGNvbnN0IHZvaWQqIHAyID0gYXNpbzo6YnVmZmVyX2Nhc3Q8Y29uc3Qgdm9pZCo+KGIyKTsgQGVuZGNvZGUKLSAqCi0gKiBUaGUgYXNpbzo6YnVmZmVyX2Nhc3QgZnVuY3Rpb24gcGVybWl0cyB2aW9sYXRpb25zIG9mIHR5cGUgc2FmZXR5LCBzbwotICogdXNlcyBvZiBpdCBpbiBhcHBsaWNhdGlvbiBjb2RlIHNob3VsZCBiZSBjYXJlZnVsbHkgY29uc2lkZXJlZC4KLSAqCi0gKiBGb3IgY29udmVuaWVuY2UsIHRoZSBAcmVmIGJ1ZmZlcl9zaXplIGZ1bmN0aW9uIGFsc28gd29ya3Mgb24gYnVmZmVyCi0gKiBzZXF1ZW5jZXMgKHRoYXQgaXMsIHR5cGVzIG1lZXRpbmcgdGhlIENvbnN0QnVmZmVyU2VxdWVuY2Ugb3IKLSAqIE11dGFibGVCdWZmZXJTZXF1ZW5jZSB0eXBlIHJlcXVpcmVtZW50cykuIEluIHRoaXMgY2FzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMKLSAqIHRoZSB0b3RhbCBzaXplIG9mIGFsbCBidWZmZXJzIGluIHRoZSBzZXF1ZW5jZS4KLSAqCi0gKiBAcGFyIEJ1ZmZlciBDb3B5aW5nCi0gKgotICogVGhlIEByZWYgYnVmZmVyX2NvcHkgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gY29weSByYXcgYnl0ZXMgYmV0d2VlbgotICogaW5kaXZpZHVhbCBidWZmZXJzIGFuZCBidWZmZXIgc2VxdWVuY2VzLgotICoKLSAqIEluIHBhcnRpY3VsYXIsIHdoZW4gdXNlZCB3aXRoIHRoZSBAcmVmIGJ1ZmZlcl9zaXplLCB0aGUgQHJlZiBidWZmZXJfY29weQotICogZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gbGluZWFyaXNlIGEgc2VxdWVuY2Ugb2YgYnVmZmVycy4gRm9yIGV4YW1wbGU6Ci0gKgotICogQGNvZGUgdmVjdG9yPGNvbnN0X2J1ZmZlcj4gYnVmZmVycyA9IC4uLjsKLSAqCi0gKiB2ZWN0b3I8dW5zaWduZWQgY2hhcj4gZGF0YShhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJzKSk7Ci0gKiBhc2lvOjpidWZmZXJfY29weShhc2lvOjpidWZmZXIoZGF0YSksIGJ1ZmZlcnMpOyBAZW5kY29kZQotICoKLSAqIE5vdGUgdGhhdCBAcmVmIGJ1ZmZlcl9jb3B5IGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kCi0gKiBjb25zZXF1ZW50bHkgaXQgY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICoKLSAqIEBwYXIgQnVmZmVyIEludmFsaWRhdGlvbgotICoKLSAqIEEgYnVmZmVyIG9iamVjdCBkb2VzIG5vdCBoYXZlIGFueSBvd25lcnNoaXAgb2YgdGhlIG1lbW9yeSBpdCByZWZlcnMgdG8uIEl0Ci0gKiBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGVuc3VyZSB0aGUgbWVtb3J5IHJlZ2lvbiByZW1haW5zCi0gKiB2YWxpZCB1bnRpbCBpdCBpcyBubyBsb25nZXIgcmVxdWlyZWQgZm9yIGFuIEkvTyBvcGVyYXRpb24uIFdoZW4gdGhlIG1lbW9yeQotICogaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSwgdGhlIGJ1ZmZlciBpcyBzYWlkIHRvIGhhdmUgYmVlbiBpbnZhbGlkYXRlZC4KLSAqCi0gKiBGb3IgdGhlIGFzaW86OmJ1ZmZlciBvdmVybG9hZHMgdGhhdCBhY2NlcHQgYW4gYXJndW1lbnQgb2YgdHlwZQotICogc3RkOjp2ZWN0b3IsIHRoZSBidWZmZXIgb2JqZWN0cyByZXR1cm5lZCBhcmUgaW52YWxpZGF0ZWQgYnkgYW55IHZlY3RvcgotICogb3BlcmF0aW9uIHRoYXQgYWxzbyBpbnZhbGlkYXRlcyBhbGwgcmVmZXJlbmNlcywgcG9pbnRlcnMgYW5kIGl0ZXJhdG9ycwotICogcmVmZXJyaW5nIHRvIHRoZSBlbGVtZW50cyBpbiB0aGUgc2VxdWVuY2UgKEMrKyBTdGQsIDIzLjIuNCkKLSAqCi0gKiBGb3IgdGhlIGFzaW86OmJ1ZmZlciBvdmVybG9hZHMgdGhhdCBhY2NlcHQgYW4gYXJndW1lbnQgb2YgdHlwZQotICogc3RkOjpiYXNpY19zdHJpbmcsIHRoZSBidWZmZXIgb2JqZWN0cyByZXR1cm5lZCBhcmUgaW52YWxpZGF0ZWQgYWNjb3JkaW5nIHRvCi0gKiB0aGUgcnVsZXMgZGVmaW5lZCBmb3IgaW52YWxpZGF0aW9uIG9mIHJlZmVyZW5jZXMsIHBvaW50ZXJzIGFuZCBpdGVyYXRvcnMKLSAqIHJlZmVycmluZyB0byBlbGVtZW50cyBvZiB0aGUgc2VxdWVuY2UgKEMrKyBTdGQsIDIxLjMpLgotICoKLSAqIEBwYXIgQnVmZmVyIEFyaXRobWV0aWMKLSAqCi0gKiBCdWZmZXIgb2JqZWN0cyBtYXkgYmUgbWFuaXB1bGF0ZWQgdXNpbmcgc2ltcGxlIGFyaXRobWV0aWMgaW4gYSBzYWZlIHdheQotICogd2hpY2ggaGVscHMgcHJldmVudCBidWZmZXIgb3ZlcnJ1bnMuIENvbnNpZGVyIGFuIGFycmF5IGluaXRpYWxpc2VkIGFzCi0gKiBmb2xsb3dzOgotICoKLSAqIEBjb2RlIGJvb3N0OjphcnJheTxjaGFyLCA2PiBhID0geyAnYScsICdiJywgJ2MnLCAnZCcsICdlJyB9OyBAZW5kY29kZQotICoKLSAqIEEgYnVmZmVyIG9iamVjdCBAYyBiMSBjcmVhdGVkIHVzaW5nOgotICoKLSAqIEBjb2RlIGIxID0gYXNpbzo6YnVmZmVyKGEpOyBAZW5kY29kZQotICoKLSAqIHJlcHJlc2VudHMgdGhlIGVudGlyZSBhcnJheSwgPHR0PnsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScgfTwvdHQ+LiBBbgotICogb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBhc2lvOjpidWZmZXIgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8KLSAqIGxpbWl0IHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGJ1ZmZlcjoKLSAqCi0gKiBAY29kZSBiMiA9IGFzaW86OmJ1ZmZlcihhLCAzKTsgQGVuZGNvZGUKLSAqCi0gKiBzdWNoIHRoYXQgQGMgYjIgcmVwcmVzZW50cyB0aGUgZGF0YSA8dHQ+eyAnYScsICdiJywgJ2MnIH08L3R0Pi4gRXZlbiBpZiB0aGUKLSAqIHNpemUgYXJndW1lbnQgZXhjZWVkcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGFycmF5LCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCi0gKiBvYmplY3QgY3JlYXRlZCB3aWxsIGJlIGxpbWl0ZWQgdG8gdGhlIGFycmF5IHNpemUuCi0gKgotICogQW4gb2Zmc2V0IG1heSBiZSBhcHBsaWVkIHRvIGFuIGV4aXN0aW5nIGJ1ZmZlciB0byBjcmVhdGUgYSBuZXcgb25lOgotICoKLSAqIEBjb2RlIGIzID0gYjEgKyAyOyBAZW5kY29kZQotICoKLSAqIHdoZXJlIEBjIGIzIHdpbGwgc2V0IHRvIHJlcHJlc2VudCA8dHQ+eyAnYycsICdkJywgJ2UnIH08L3R0Pi4gSWYgdGhlIG9mZnNldAotICogZXhjZWVkcyB0aGUgc2l6ZSBvZiB0aGUgZXhpc3RpbmcgYnVmZmVyLCB0aGUgbmV3bHkgY3JlYXRlZCBidWZmZXIgd2lsbCBiZQotICogZW1wdHkuCi0gKgotICogQm90aCBhbiBvZmZzZXQgYW5kIHNpemUgbWF5IGJlIHNwZWNpZmllZCB0byBjcmVhdGUgYSBidWZmZXIgdGhhdCBjb3JyZXNwb25kcwotICogdG8gYSBzcGVjaWZpYyByYW5nZSBvZiBieXRlcyB3aXRoaW4gYW4gZXhpc3RpbmcgYnVmZmVyOgotICoKLSAqIEBjb2RlIGI0ID0gYXNpbzo6YnVmZmVyKGIxICsgMSwgMyk7IEBlbmRjb2RlCi0gKgotICogc28gdGhhdCBAYyBiNCB3aWxsIHJlZmVyIHRvIHRoZSBieXRlcyA8dHQ+eyAnYicsICdjJywgJ2QnIH08L3R0Pi4KLSAqCi0gKiBAcGFyIEJ1ZmZlcnMgYW5kIFNjYXR0ZXItR2F0aGVyIEkvTwotICoKLSAqIFRvIHJlYWQgb3Igd3JpdGUgdXNpbmcgbXVsdGlwbGUgYnVmZmVycyAoaS5lLiBzY2F0dGVyLWdhdGhlciBJL08pLCBtdWx0aXBsZQotICogYnVmZmVyIG9iamVjdHMgbWF5IGJlIGFzc2lnbmVkIGludG8gYSBjb250YWluZXIgdGhhdCBzdXBwb3J0cyB0aGUKLSAqIE11dGFibGVCdWZmZXJTZXF1ZW5jZSAoZm9yIHJlYWQpIG9yIENvbnN0QnVmZmVyU2VxdWVuY2UgKGZvciB3cml0ZSkgY29uY2VwdHM6Ci0gKgotICogQGNvZGUKLSAqIGNoYXIgZDFbMTI4XTsKLSAqIHN0ZDo6dmVjdG9yPGNoYXI+IGQyKDEyOCk7Ci0gKiBib29zdDo6YXJyYXk8Y2hhciwgMTI4PiBkMzsKLSAqCi0gKiBib29zdDo6YXJyYXk8bXV0YWJsZV9idWZmZXIsIDM+IGJ1ZnMxID0gewotICogICBhc2lvOjpidWZmZXIoZDEpLAotICogICBhc2lvOjpidWZmZXIoZDIpLAotICogICBhc2lvOjpidWZmZXIoZDMpIH07Ci0gKiBieXRlc190cmFuc2ZlcnJlZCA9IHNvY2sucmVjZWl2ZShidWZzMSk7Ci0gKgotICogc3RkOjp2ZWN0b3I8Y29uc3RfYnVmZmVyPiBidWZzMjsKLSAqIGJ1ZnMyLnB1c2hfYmFjayhhc2lvOjpidWZmZXIoZDEpKTsKLSAqIGJ1ZnMyLnB1c2hfYmFjayhhc2lvOjpidWZmZXIoZDIpKTsKLSAqIGJ1ZnMyLnB1c2hfYmFjayhhc2lvOjpidWZmZXIoZDMpKTsKLSAqIGJ5dGVzX3RyYW5zZmVycmVkID0gc29jay5zZW5kKGJ1ZnMyKTsgQGVuZGNvZGUKLSAqLwotLypAeyovCi0KLS8vLyBDcmVhdGUgYSBuZXcgbW9kaWZpYWJsZSBidWZmZXIgZnJvbSBhbiBleGlzdGluZyBidWZmZXIuCi0vKioKLSAqIEByZXR1cm5zIDx0dD5tdXRhYmxlX2J1ZmZlcnNfMShiKTwvdHQ+LgotICovCi1pbmxpbmUgbXV0YWJsZV9idWZmZXJzXzEgYnVmZmVyKGNvbnN0IG11dGFibGVfYnVmZmVyJiBiKQotewotICByZXR1cm4gbXV0YWJsZV9idWZmZXJzXzEoYik7Ci19Ci0KLS8vLyBDcmVhdGUgYSBuZXcgbW9kaWZpYWJsZSBidWZmZXIgZnJvbSBhbiBleGlzdGluZyBidWZmZXIuCi0vKioKLSAqIEByZXR1cm5zIEEgbXV0YWJsZV9idWZmZXJzXzEgdmFsdWUgZXF1aXZhbGVudCB0bzoKLSAqIEBjb2RlIG11dGFibGVfYnVmZmVyc18xKAotICogICAgIGJ1ZmZlcl9jYXN0PHZvaWQqPihiKSwKLSAqICAgICBtaW4oYnVmZmVyX3NpemUoYiksIG1heF9zaXplX2luX2J5dGVzKSk7IEBlbmRjb2RlCi0gKi8KLWlubGluZSBtdXRhYmxlX2J1ZmZlcnNfMSBidWZmZXIoY29uc3QgbXV0YWJsZV9idWZmZXImIGIsCi0gICAgc3RkOjpzaXplX3QgbWF4X3NpemVfaW5fYnl0ZXMpCi17Ci0gIHJldHVybiBtdXRhYmxlX2J1ZmZlcnNfMSgKLSAgICAgIG11dGFibGVfYnVmZmVyKGJ1ZmZlcl9jYXN0PHZvaWQqPihiKSwKLSAgICAgICAgYnVmZmVyX3NpemUoYikgPCBtYXhfc2l6ZV9pbl9ieXRlcwotICAgICAgICA/IGJ1ZmZlcl9zaXplKGIpIDogbWF4X3NpemVfaW5fYnl0ZXMKLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gICAgICAgICwgYi5nZXRfZGVidWdfY2hlY2soKQotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLSAgICAgICAgKSk7Ci19Ci0KLS8vLyBDcmVhdGUgYSBuZXcgbm9uLW1vZGlmaWFibGUgYnVmZmVyIGZyb20gYW4gZXhpc3RpbmcgYnVmZmVyLgotLyoqCi0gKiBAcmV0dXJucyA8dHQ+Y29uc3RfYnVmZmVyc18xKGIpPC90dD4uCi0gKi8KLWlubGluZSBjb25zdF9idWZmZXJzXzEgYnVmZmVyKGNvbnN0IGNvbnN0X2J1ZmZlciYgYikKLXsKLSAgcmV0dXJuIGNvbnN0X2J1ZmZlcnNfMShiKTsKLX0KLQotLy8vIENyZWF0ZSBhIG5ldyBub24tbW9kaWZpYWJsZSBidWZmZXIgZnJvbSBhbiBleGlzdGluZyBidWZmZXIuCi0vKioKLSAqIEByZXR1cm5zIEEgY29uc3RfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBjb25zdF9idWZmZXJzXzEoCi0gKiAgICAgYnVmZmVyX2Nhc3Q8Y29uc3Qgdm9pZCo+KGIpLAotICogICAgIG1pbihidWZmZXJfc2l6ZShiKSwgbWF4X3NpemVfaW5fYnl0ZXMpKTsgQGVuZGNvZGUKLSAqLwotaW5saW5lIGNvbnN0X2J1ZmZlcnNfMSBidWZmZXIoY29uc3QgY29uc3RfYnVmZmVyJiBiLAotICAgIHN0ZDo6c2l6ZV90IG1heF9zaXplX2luX2J5dGVzKQotewotICByZXR1cm4gY29uc3RfYnVmZmVyc18xKAotICAgICAgY29uc3RfYnVmZmVyKGJ1ZmZlcl9jYXN0PGNvbnN0IHZvaWQqPihiKSwKLSAgICAgICAgYnVmZmVyX3NpemUoYikgPCBtYXhfc2l6ZV9pbl9ieXRlcwotICAgICAgICA/IGJ1ZmZlcl9zaXplKGIpIDogbWF4X3NpemVfaW5fYnl0ZXMKLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gICAgICAgICwgYi5nZXRfZGVidWdfY2hlY2soKQotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLSAgICAgICAgKSk7Ci19Ci0KLS8vLyBDcmVhdGUgYSBuZXcgbW9kaWZpYWJsZSBidWZmZXIgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBtZW1vcnkgcmFuZ2UuCi0vKioKLSAqIEByZXR1cm5zIDx0dD5tdXRhYmxlX2J1ZmZlcnNfMShkYXRhLCBzaXplX2luX2J5dGVzKTwvdHQ+LgotICovCi1pbmxpbmUgbXV0YWJsZV9idWZmZXJzXzEgYnVmZmVyKHZvaWQqIGRhdGEsIHN0ZDo6c2l6ZV90IHNpemVfaW5fYnl0ZXMpCi17Ci0gIHJldHVybiBtdXRhYmxlX2J1ZmZlcnNfMShtdXRhYmxlX2J1ZmZlcihkYXRhLCBzaXplX2luX2J5dGVzKSk7Ci19Ci0KLS8vLyBDcmVhdGUgYSBuZXcgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gbWVtb3J5IHJhbmdlLgotLyoqCi0gKiBAcmV0dXJucyA8dHQ+Y29uc3RfYnVmZmVyc18xKGRhdGEsIHNpemVfaW5fYnl0ZXMpPC90dD4uCi0gKi8KLWlubGluZSBjb25zdF9idWZmZXJzXzEgYnVmZmVyKGNvbnN0IHZvaWQqIGRhdGEsCi0gICAgc3RkOjpzaXplX3Qgc2l6ZV9pbl9ieXRlcykKLXsKLSAgcmV0dXJuIGNvbnN0X2J1ZmZlcnNfMShjb25zdF9idWZmZXIoZGF0YSwgc2l6ZV9pbl9ieXRlcykpOwotfQotCi0vLy8gQ3JlYXRlIGEgbmV3IG1vZGlmaWFibGUgYnVmZmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gUE9EIGFycmF5LgotLyoqCi0gKiBAcmV0dXJucyBBIG11dGFibGVfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBtdXRhYmxlX2J1ZmZlcnNfMSgKLSAqICAgICBzdGF0aWNfY2FzdDx2b2lkKj4oZGF0YSksCi0gKiAgICAgTiAqIHNpemVvZihQb2RUeXBlKSk7IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQb2RUeXBlLCBzdGQ6OnNpemVfdCBOPgotaW5saW5lIG11dGFibGVfYnVmZmVyc18xIGJ1ZmZlcihQb2RUeXBlICgmZGF0YSlbTl0pCi17Ci0gIHJldHVybiBtdXRhYmxlX2J1ZmZlcnNfMShtdXRhYmxlX2J1ZmZlcihkYXRhLCBOICogc2l6ZW9mKFBvZFR5cGUpKSk7Ci19Ci0gCi0vLy8gQ3JlYXRlIGEgbmV3IG1vZGlmaWFibGUgYnVmZmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gUE9EIGFycmF5LgotLyoqCi0gKiBAcmV0dXJucyBBIG11dGFibGVfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBtdXRhYmxlX2J1ZmZlcnNfMSgKLSAqICAgICBzdGF0aWNfY2FzdDx2b2lkKj4oZGF0YSksCi0gKiAgICAgbWluKE4gKiBzaXplb2YoUG9kVHlwZSksIG1heF9zaXplX2luX2J5dGVzKSk7IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQb2RUeXBlLCBzdGQ6OnNpemVfdCBOPgotaW5saW5lIG11dGFibGVfYnVmZmVyc18xIGJ1ZmZlcihQb2RUeXBlICgmZGF0YSlbTl0sCi0gICAgc3RkOjpzaXplX3QgbWF4X3NpemVfaW5fYnl0ZXMpCi17Ci0gIHJldHVybiBtdXRhYmxlX2J1ZmZlcnNfMSgKLSAgICAgIG11dGFibGVfYnVmZmVyKGRhdGEsCi0gICAgICAgIE4gKiBzaXplb2YoUG9kVHlwZSkgPCBtYXhfc2l6ZV9pbl9ieXRlcwotICAgICAgICA/IE4gKiBzaXplb2YoUG9kVHlwZSkgOiBtYXhfc2l6ZV9pbl9ieXRlcykpOwotfQotIAotLy8vIENyZWF0ZSBhIG5ldyBub24tbW9kaWZpYWJsZSBidWZmZXIgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBQT0QgYXJyYXkuCi0vKioKLSAqIEByZXR1cm5zIEEgY29uc3RfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBjb25zdF9idWZmZXJzXzEoCi0gKiAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KGRhdGEpLAotICogICAgIE4gKiBzaXplb2YoUG9kVHlwZSkpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgc3RkOjpzaXplX3QgTj4KLWlubGluZSBjb25zdF9idWZmZXJzXzEgYnVmZmVyKGNvbnN0IFBvZFR5cGUgKCZkYXRhKVtOXSkKLXsKLSAgcmV0dXJuIGNvbnN0X2J1ZmZlcnNfMShjb25zdF9idWZmZXIoZGF0YSwgTiAqIHNpemVvZihQb2RUeXBlKSkpOwotfQotCi0vLy8gQ3JlYXRlIGEgbmV3IG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIFBPRCBhcnJheS4KLS8qKgotICogQHJldHVybnMgQSBjb25zdF9idWZmZXJzXzEgdmFsdWUgZXF1aXZhbGVudCB0bzoKLSAqIEBjb2RlIGNvbnN0X2J1ZmZlcnNfMSgKLSAqICAgICBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oZGF0YSksCi0gKiAgICAgbWluKE4gKiBzaXplb2YoUG9kVHlwZSksIG1heF9zaXplX2luX2J5dGVzKSk7IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQb2RUeXBlLCBzdGQ6OnNpemVfdCBOPgotaW5saW5lIGNvbnN0X2J1ZmZlcnNfMSBidWZmZXIoY29uc3QgUG9kVHlwZSAoJmRhdGEpW05dLAotICAgIHN0ZDo6c2l6ZV90IG1heF9zaXplX2luX2J5dGVzKQotewotICByZXR1cm4gY29uc3RfYnVmZmVyc18xKAotICAgICAgY29uc3RfYnVmZmVyKGRhdGEsCi0gICAgICAgIE4gKiBzaXplb2YoUG9kVHlwZSkgPCBtYXhfc2l6ZV9pbl9ieXRlcwotICAgICAgICA/IE4gKiBzaXplb2YoUG9kVHlwZSkgOiBtYXhfc2l6ZV9pbl9ieXRlcykpOwotfQotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9BUlJBWV9CVUZGRVJfV09SS0FST1VORCkKLQotLy8gQm9ybGFuZCBDKysgYW5kIFN1biBTdHVkaW8gdGhpbmsgdGhlIG92ZXJsb2FkczoKLS8vCi0vLyAgIHVuc3BlY2lmaWVkIGJ1ZmZlcihib29zdDo6YXJyYXk8UG9kVHlwZSwgTj4mIGFycmF5IC4uLik7Ci0vLwotLy8gYW5kCi0vLwotLy8gICB1bnNwZWNpZmllZCBidWZmZXIoYm9vc3Q6OmFycmF5PGNvbnN0IFBvZFR5cGUsIE4+JiBhcnJheSAuLi4pOwotLy8KLS8vIGFyZSBhbWJpZ3VvdXMuIFRoaXMgd2lsbCBiZSB3b3JrZWQgYXJvdW5kIGJ5IHVzaW5nIGEgYnVmZmVyX3R5cGVzIHRyYWl0cwotLy8gY2xhc3MgdGhhdCBjb250YWlucyB0eXBlZGVmcyBmb3IgdGhlIGFwcHJvcHJpYXRlIGJ1ZmZlciBhbmQgY29udGFpbmVyCi0vLyBjbGFzc2VzLCBiYXNlZCBvbiB3aGV0aGVyIFBvZFR5cGUgaXMgY29uc3Qgb3Igbm9uLWNvbnN0LgotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPGJvb2wgSXNDb25zdD4KLXN0cnVjdCBidWZmZXJfdHlwZXNfYmFzZTsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBidWZmZXJfdHlwZXNfYmFzZTxmYWxzZT4KLXsKLSAgdHlwZWRlZiBtdXRhYmxlX2J1ZmZlciBidWZmZXJfdHlwZTsKLSAgdHlwZWRlZiBtdXRhYmxlX2J1ZmZlcnNfMSBjb250YWluZXJfdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgYnVmZmVyX3R5cGVzX2Jhc2U8dHJ1ZT4KLXsKLSAgdHlwZWRlZiBjb25zdF9idWZmZXIgYnVmZmVyX3R5cGU7Ci0gIHR5cGVkZWYgY29uc3RfYnVmZmVyc18xIGNvbnRhaW5lcl90eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFBvZFR5cGU+Ci1zdHJ1Y3QgYnVmZmVyX3R5cGVzCi0gIDogcHVibGljIGJ1ZmZlcl90eXBlc19iYXNlPGlzX2NvbnN0PFBvZFR5cGU+Ojp2YWx1ZT4KLXsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgc3RkOjpzaXplX3QgTj4KLWlubGluZSB0eXBlbmFtZSBkZXRhaWw6OmJ1ZmZlcl90eXBlczxQb2RUeXBlPjo6Y29udGFpbmVyX3R5cGUKLWJ1ZmZlcihib29zdDo6YXJyYXk8UG9kVHlwZSwgTj4mIGRhdGEpCi17Ci0gIHR5cGVkZWYgdHlwZW5hbWUgYXNpbzo6ZGV0YWlsOjpidWZmZXJfdHlwZXM8UG9kVHlwZT46OmJ1ZmZlcl90eXBlCi0gICAgYnVmZmVyX3R5cGU7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgYXNpbzo6ZGV0YWlsOjpidWZmZXJfdHlwZXM8UG9kVHlwZT46OmNvbnRhaW5lcl90eXBlCi0gICAgY29udGFpbmVyX3R5cGU7Ci0gIHJldHVybiBjb250YWluZXJfdHlwZSgKLSAgICAgIGJ1ZmZlcl90eXBlKGRhdGEuY19hcnJheSgpLCBkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgc3RkOjpzaXplX3QgTj4KLWlubGluZSB0eXBlbmFtZSBkZXRhaWw6OmJ1ZmZlcl90eXBlczxQb2RUeXBlPjo6Y29udGFpbmVyX3R5cGUKLWJ1ZmZlcihib29zdDo6YXJyYXk8UG9kVHlwZSwgTj4mIGRhdGEsIHN0ZDo6c2l6ZV90IG1heF9zaXplX2luX2J5dGVzKQotewotICB0eXBlZGVmIHR5cGVuYW1lIGFzaW86OmRldGFpbDo6YnVmZmVyX3R5cGVzPFBvZFR5cGU+OjpidWZmZXJfdHlwZQotICAgIGJ1ZmZlcl90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIGFzaW86OmRldGFpbDo6YnVmZmVyX3R5cGVzPFBvZFR5cGU+Ojpjb250YWluZXJfdHlwZQotICAgIGNvbnRhaW5lcl90eXBlOwotICByZXR1cm4gY29udGFpbmVyX3R5cGUoCi0gICAgICBidWZmZXJfdHlwZShkYXRhLmNfYXJyYXkoKSwKLSAgICAgICAgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkgPCBtYXhfc2l6ZV9pbl9ieXRlcwotICAgICAgICA/IGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpIDogbWF4X3NpemVfaW5fYnl0ZXMpKTsKLX0KLQotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9BUlJBWV9CVUZGRVJfV09SS0FST1VORCkKLQotLy8vIENyZWF0ZSBhIG5ldyBtb2RpZmlhYmxlIGJ1ZmZlciB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIFBPRCBhcnJheS4KLS8qKgotICogQHJldHVybnMgQSBtdXRhYmxlX2J1ZmZlcnNfMSB2YWx1ZSBlcXVpdmFsZW50IHRvOgotICogQGNvZGUgbXV0YWJsZV9idWZmZXJzXzEoCi0gKiAgICAgZGF0YS5kYXRhKCksCi0gKiAgICAgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgc3RkOjpzaXplX3QgTj4KLWlubGluZSBtdXRhYmxlX2J1ZmZlcnNfMSBidWZmZXIoYm9vc3Q6OmFycmF5PFBvZFR5cGUsIE4+JiBkYXRhKQotewotICByZXR1cm4gbXV0YWJsZV9idWZmZXJzXzEoCi0gICAgICBtdXRhYmxlX2J1ZmZlcihkYXRhLmNfYXJyYXkoKSwgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkpKTsKLX0KLQotLy8vIENyZWF0ZSBhIG5ldyBtb2RpZmlhYmxlIGJ1ZmZlciB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIFBPRCBhcnJheS4KLS8qKgotICogQHJldHVybnMgQSBtdXRhYmxlX2J1ZmZlcnNfMSB2YWx1ZSBlcXVpdmFsZW50IHRvOgotICogQGNvZGUgbXV0YWJsZV9idWZmZXJzXzEoCi0gKiAgICAgZGF0YS5kYXRhKCksCi0gKiAgICAgbWluKGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpLCBtYXhfc2l6ZV9pbl9ieXRlcykpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgc3RkOjpzaXplX3QgTj4KLWlubGluZSBtdXRhYmxlX2J1ZmZlcnNfMSBidWZmZXIoYm9vc3Q6OmFycmF5PFBvZFR5cGUsIE4+JiBkYXRhLAotICAgIHN0ZDo6c2l6ZV90IG1heF9zaXplX2luX2J5dGVzKQotewotICByZXR1cm4gbXV0YWJsZV9idWZmZXJzXzEoCi0gICAgICBtdXRhYmxlX2J1ZmZlcihkYXRhLmNfYXJyYXkoKSwKLSAgICAgICAgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkgPCBtYXhfc2l6ZV9pbl9ieXRlcwotICAgICAgICA/IGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpIDogbWF4X3NpemVfaW5fYnl0ZXMpKTsKLX0KLQotLy8vIENyZWF0ZSBhIG5ldyBub24tbW9kaWZpYWJsZSBidWZmZXIgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBQT0QgYXJyYXkuCi0vKioKLSAqIEByZXR1cm5zIEEgY29uc3RfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBjb25zdF9idWZmZXJzXzEoCi0gKiAgICAgZGF0YS5kYXRhKCksCi0gKiAgICAgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgc3RkOjpzaXplX3QgTj4KLWlubGluZSBjb25zdF9idWZmZXJzXzEgYnVmZmVyKGJvb3N0OjphcnJheTxjb25zdCBQb2RUeXBlLCBOPiYgZGF0YSkKLXsKLSAgcmV0dXJuIGNvbnN0X2J1ZmZlcnNfMSgKLSAgICAgIGNvbnN0X2J1ZmZlcihkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkpKTsKLX0KLQotLy8vIENyZWF0ZSBhIG5ldyBub24tbW9kaWZpYWJsZSBidWZmZXIgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBQT0QgYXJyYXkuCi0vKioKLSAqIEByZXR1cm5zIEEgY29uc3RfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBjb25zdF9idWZmZXJzXzEoCi0gKiAgICAgZGF0YS5kYXRhKCksCi0gKiAgICAgbWluKGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpLCBtYXhfc2l6ZV9pbl9ieXRlcykpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgc3RkOjpzaXplX3QgTj4KLWlubGluZSBjb25zdF9idWZmZXJzXzEgYnVmZmVyKGJvb3N0OjphcnJheTxjb25zdCBQb2RUeXBlLCBOPiYgZGF0YSwKLSAgICBzdGQ6OnNpemVfdCBtYXhfc2l6ZV9pbl9ieXRlcykKLXsKLSAgcmV0dXJuIGNvbnN0X2J1ZmZlcnNfMSgKLSAgICAgIGNvbnN0X2J1ZmZlcihkYXRhLmRhdGEoKSwKLSAgICAgICAgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkgPCBtYXhfc2l6ZV9pbl9ieXRlcwotICAgICAgICA/IGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpIDogbWF4X3NpemVfaW5fYnl0ZXMpKTsKLX0KLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfQVJSQVlfQlVGRkVSX1dPUktBUk9VTkQpCi0KLS8vLyBDcmVhdGUgYSBuZXcgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gUE9EIGFycmF5LgotLyoqCi0gKiBAcmV0dXJucyBBIGNvbnN0X2J1ZmZlcnNfMSB2YWx1ZSBlcXVpdmFsZW50IHRvOgotICogQGNvZGUgY29uc3RfYnVmZmVyc18xKAotICogICAgIGRhdGEuZGF0YSgpLAotICogICAgIGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFBvZFR5cGUsIHN0ZDo6c2l6ZV90IE4+Ci1pbmxpbmUgY29uc3RfYnVmZmVyc18xIGJ1ZmZlcihjb25zdCBib29zdDo6YXJyYXk8UG9kVHlwZSwgTj4mIGRhdGEpCi17Ci0gIHJldHVybiBjb25zdF9idWZmZXJzXzEoCi0gICAgICBjb25zdF9idWZmZXIoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpKSk7Ci19Ci0KLS8vLyBDcmVhdGUgYSBuZXcgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gUE9EIGFycmF5LgotLyoqCi0gKiBAcmV0dXJucyBBIGNvbnN0X2J1ZmZlcnNfMSB2YWx1ZSBlcXVpdmFsZW50IHRvOgotICogQGNvZGUgY29uc3RfYnVmZmVyc18xKAotICogICAgIGRhdGEuZGF0YSgpLAotICogICAgIG1pbihkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSwgbWF4X3NpemVfaW5fYnl0ZXMpKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFBvZFR5cGUsIHN0ZDo6c2l6ZV90IE4+Ci1pbmxpbmUgY29uc3RfYnVmZmVyc18xIGJ1ZmZlcihjb25zdCBib29zdDo6YXJyYXk8UG9kVHlwZSwgTj4mIGRhdGEsCi0gICAgc3RkOjpzaXplX3QgbWF4X3NpemVfaW5fYnl0ZXMpCi17Ci0gIHJldHVybiBjb25zdF9idWZmZXJzXzEoCi0gICAgICBjb25zdF9idWZmZXIoZGF0YS5kYXRhKCksCi0gICAgICAgIGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpIDwgbWF4X3NpemVfaW5fYnl0ZXMKLSAgICAgICAgPyBkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSA6IG1heF9zaXplX2luX2J5dGVzKSk7Ci19Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9BUlJBWSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLS8vLyBDcmVhdGUgYSBuZXcgbW9kaWZpYWJsZSBidWZmZXIgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBQT0QgYXJyYXkuCi0vKioKLSAqIEByZXR1cm5zIEEgbXV0YWJsZV9idWZmZXJzXzEgdmFsdWUgZXF1aXZhbGVudCB0bzoKLSAqIEBjb2RlIG11dGFibGVfYnVmZmVyc18xKAotICogICAgIGRhdGEuZGF0YSgpLAotICogICAgIGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFBvZFR5cGUsIHN0ZDo6c2l6ZV90IE4+Ci1pbmxpbmUgbXV0YWJsZV9idWZmZXJzXzEgYnVmZmVyKHN0ZDo6YXJyYXk8UG9kVHlwZSwgTj4mIGRhdGEpCi17Ci0gIHJldHVybiBtdXRhYmxlX2J1ZmZlcnNfMSgKLSAgICAgIG11dGFibGVfYnVmZmVyKGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSkpOwotfQotCi0vLy8gQ3JlYXRlIGEgbmV3IG1vZGlmaWFibGUgYnVmZmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gUE9EIGFycmF5LgotLyoqCi0gKiBAcmV0dXJucyBBIG11dGFibGVfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBtdXRhYmxlX2J1ZmZlcnNfMSgKLSAqICAgICBkYXRhLmRhdGEoKSwKLSAqICAgICBtaW4oZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSksIG1heF9zaXplX2luX2J5dGVzKSk7IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQb2RUeXBlLCBzdGQ6OnNpemVfdCBOPgotaW5saW5lIG11dGFibGVfYnVmZmVyc18xIGJ1ZmZlcihzdGQ6OmFycmF5PFBvZFR5cGUsIE4+JiBkYXRhLAotICAgIHN0ZDo6c2l6ZV90IG1heF9zaXplX2luX2J5dGVzKQotewotICByZXR1cm4gbXV0YWJsZV9idWZmZXJzXzEoCi0gICAgICBtdXRhYmxlX2J1ZmZlcihkYXRhLmRhdGEoKSwKLSAgICAgICAgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkgPCBtYXhfc2l6ZV9pbl9ieXRlcwotICAgICAgICA/IGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpIDogbWF4X3NpemVfaW5fYnl0ZXMpKTsKLX0KLQotLy8vIENyZWF0ZSBhIG5ldyBub24tbW9kaWZpYWJsZSBidWZmZXIgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBQT0QgYXJyYXkuCi0vKioKLSAqIEByZXR1cm5zIEEgY29uc3RfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBjb25zdF9idWZmZXJzXzEoCi0gKiAgICAgZGF0YS5kYXRhKCksCi0gKiAgICAgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgc3RkOjpzaXplX3QgTj4KLWlubGluZSBjb25zdF9idWZmZXJzXzEgYnVmZmVyKHN0ZDo6YXJyYXk8Y29uc3QgUG9kVHlwZSwgTj4mIGRhdGEpCi17Ci0gIHJldHVybiBjb25zdF9idWZmZXJzXzEoCi0gICAgICBjb25zdF9idWZmZXIoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpKSk7Ci19Ci0KLS8vLyBDcmVhdGUgYSBuZXcgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gUE9EIGFycmF5LgotLyoqCi0gKiBAcmV0dXJucyBBIGNvbnN0X2J1ZmZlcnNfMSB2YWx1ZSBlcXVpdmFsZW50IHRvOgotICogQGNvZGUgY29uc3RfYnVmZmVyc18xKAotICogICAgIGRhdGEuZGF0YSgpLAotICogICAgIG1pbihkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSwgbWF4X3NpemVfaW5fYnl0ZXMpKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFBvZFR5cGUsIHN0ZDo6c2l6ZV90IE4+Ci1pbmxpbmUgY29uc3RfYnVmZmVyc18xIGJ1ZmZlcihzdGQ6OmFycmF5PGNvbnN0IFBvZFR5cGUsIE4+JiBkYXRhLAotICAgIHN0ZDo6c2l6ZV90IG1heF9zaXplX2luX2J5dGVzKQotewotICByZXR1cm4gY29uc3RfYnVmZmVyc18xKAotICAgICAgY29uc3RfYnVmZmVyKGRhdGEuZGF0YSgpLAotICAgICAgICBkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSA8IG1heF9zaXplX2luX2J5dGVzCi0gICAgICAgID8gZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkgOiBtYXhfc2l6ZV9pbl9ieXRlcykpOwotfQotCi0vLy8gQ3JlYXRlIGEgbmV3IG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIFBPRCBhcnJheS4KLS8qKgotICogQHJldHVybnMgQSBjb25zdF9idWZmZXJzXzEgdmFsdWUgZXF1aXZhbGVudCB0bzoKLSAqIEBjb2RlIGNvbnN0X2J1ZmZlcnNfMSgKLSAqICAgICBkYXRhLmRhdGEoKSwKLSAqICAgICBkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSk7IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQb2RUeXBlLCBzdGQ6OnNpemVfdCBOPgotaW5saW5lIGNvbnN0X2J1ZmZlcnNfMSBidWZmZXIoY29uc3Qgc3RkOjphcnJheTxQb2RUeXBlLCBOPiYgZGF0YSkKLXsKLSAgcmV0dXJuIGNvbnN0X2J1ZmZlcnNfMSgKLSAgICAgIGNvbnN0X2J1ZmZlcihkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkpKTsKLX0KLQotLy8vIENyZWF0ZSBhIG5ldyBub24tbW9kaWZpYWJsZSBidWZmZXIgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBQT0QgYXJyYXkuCi0vKioKLSAqIEByZXR1cm5zIEEgY29uc3RfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBjb25zdF9idWZmZXJzXzEoCi0gKiAgICAgZGF0YS5kYXRhKCksCi0gKiAgICAgbWluKGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpLCBtYXhfc2l6ZV9pbl9ieXRlcykpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgc3RkOjpzaXplX3QgTj4KLWlubGluZSBjb25zdF9idWZmZXJzXzEgYnVmZmVyKGNvbnN0IHN0ZDo6YXJyYXk8UG9kVHlwZSwgTj4mIGRhdGEsCi0gICAgc3RkOjpzaXplX3QgbWF4X3NpemVfaW5fYnl0ZXMpCi17Ci0gIHJldHVybiBjb25zdF9idWZmZXJzXzEoCi0gICAgICBjb25zdF9idWZmZXIoZGF0YS5kYXRhKCksCi0gICAgICAgIGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpIDwgbWF4X3NpemVfaW5fYnl0ZXMKLSAgICAgICAgPyBkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSA6IG1heF9zaXplX2luX2J5dGVzKSk7Ci19Ci0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9BUlJBWSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLS8vLyBDcmVhdGUgYSBuZXcgbW9kaWZpYWJsZSBidWZmZXIgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBQT0QgdmVjdG9yLgotLyoqCi0gKiBAcmV0dXJucyBBIG11dGFibGVfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBtdXRhYmxlX2J1ZmZlcnNfMSgKLSAqICAgICBkYXRhLnNpemUoKSA/ICZkYXRhWzBdIDogMCwKLSAqICAgICBkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSk7IEBlbmRjb2RlCi0gKgotICogQG5vdGUgVGhlIGJ1ZmZlciBpcyBpbnZhbGlkYXRlZCBieSBhbnkgdmVjdG9yIG9wZXJhdGlvbiB0aGF0IHdvdWxkIGFsc28KLSAqIGludmFsaWRhdGUgaXRlcmF0b3JzLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yPgotaW5saW5lIG11dGFibGVfYnVmZmVyc18xIGJ1ZmZlcihzdGQ6OnZlY3RvcjxQb2RUeXBlLCBBbGxvY2F0b3I+JiBkYXRhKQotewotICByZXR1cm4gbXV0YWJsZV9idWZmZXJzXzEoCi0gICAgICBtdXRhYmxlX2J1ZmZlcihkYXRhLnNpemUoKSA/ICZkYXRhWzBdIDogMCwgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkKLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gICAgICAgICwgZGV0YWlsOjpidWZmZXJfZGVidWdfY2hlY2s8Ci0gICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxQb2RUeXBlLCBBbGxvY2F0b3I+OjppdGVyYXRvcgotICAgICAgICAgID4oZGF0YS5iZWdpbigpKQotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLSAgICAgICAgKSk7Ci19Ci0KLS8vLyBDcmVhdGUgYSBuZXcgbW9kaWZpYWJsZSBidWZmZXIgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBQT0QgdmVjdG9yLgotLyoqCi0gKiBAcmV0dXJucyBBIG11dGFibGVfYnVmZmVyc18xIHZhbHVlIGVxdWl2YWxlbnQgdG86Ci0gKiBAY29kZSBtdXRhYmxlX2J1ZmZlcnNfMSgKLSAqICAgICBkYXRhLnNpemUoKSA/ICZkYXRhWzBdIDogMCwKLSAqICAgICBtaW4oZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSksIG1heF9zaXplX2luX2J5dGVzKSk7IEBlbmRjb2RlCi0gKgotICogQG5vdGUgVGhlIGJ1ZmZlciBpcyBpbnZhbGlkYXRlZCBieSBhbnkgdmVjdG9yIG9wZXJhdGlvbiB0aGF0IHdvdWxkIGFsc28KLSAqIGludmFsaWRhdGUgaXRlcmF0b3JzLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yPgotaW5saW5lIG11dGFibGVfYnVmZmVyc18xIGJ1ZmZlcihzdGQ6OnZlY3RvcjxQb2RUeXBlLCBBbGxvY2F0b3I+JiBkYXRhLAotICAgIHN0ZDo6c2l6ZV90IG1heF9zaXplX2luX2J5dGVzKQotewotICByZXR1cm4gbXV0YWJsZV9idWZmZXJzXzEoCi0gICAgICBtdXRhYmxlX2J1ZmZlcihkYXRhLnNpemUoKSA/ICZkYXRhWzBdIDogMCwKLSAgICAgICAgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkgPCBtYXhfc2l6ZV9pbl9ieXRlcwotICAgICAgICA/IGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpIDogbWF4X3NpemVfaW5fYnl0ZXMKLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gICAgICAgICwgZGV0YWlsOjpidWZmZXJfZGVidWdfY2hlY2s8Ci0gICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxQb2RUeXBlLCBBbGxvY2F0b3I+OjppdGVyYXRvcgotICAgICAgICAgID4oZGF0YS5iZWdpbigpKQotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLSAgICAgICAgKSk7Ci19Ci0KLS8vLyBDcmVhdGUgYSBuZXcgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gUE9EIHZlY3Rvci4KLS8qKgotICogQHJldHVybnMgQSBjb25zdF9idWZmZXJzXzEgdmFsdWUgZXF1aXZhbGVudCB0bzoKLSAqIEBjb2RlIGNvbnN0X2J1ZmZlcnNfMSgKLSAqICAgICBkYXRhLnNpemUoKSA/ICZkYXRhWzBdIDogMCwKLSAqICAgICBkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSk7IEBlbmRjb2RlCi0gKgotICogQG5vdGUgVGhlIGJ1ZmZlciBpcyBpbnZhbGlkYXRlZCBieSBhbnkgdmVjdG9yIG9wZXJhdGlvbiB0aGF0IHdvdWxkIGFsc28KLSAqIGludmFsaWRhdGUgaXRlcmF0b3JzLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yPgotaW5saW5lIGNvbnN0X2J1ZmZlcnNfMSBidWZmZXIoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8UG9kVHlwZSwgQWxsb2NhdG9yPiYgZGF0YSkKLXsKLSAgcmV0dXJuIGNvbnN0X2J1ZmZlcnNfMSgKLSAgICAgIGNvbnN0X2J1ZmZlcihkYXRhLnNpemUoKSA/ICZkYXRhWzBdIDogMCwgZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSkKLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gICAgICAgICwgZGV0YWlsOjpidWZmZXJfZGVidWdfY2hlY2s8Ci0gICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxQb2RUeXBlLCBBbGxvY2F0b3I+Ojpjb25zdF9pdGVyYXRvcgotICAgICAgICAgID4oZGF0YS5iZWdpbigpKQotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLSAgICAgICAgKSk7Ci19Ci0KLS8vLyBDcmVhdGUgYSBuZXcgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gUE9EIHZlY3Rvci4KLS8qKgotICogQHJldHVybnMgQSBjb25zdF9idWZmZXJzXzEgdmFsdWUgZXF1aXZhbGVudCB0bzoKLSAqIEBjb2RlIGNvbnN0X2J1ZmZlcnNfMSgKLSAqICAgICBkYXRhLnNpemUoKSA/ICZkYXRhWzBdIDogMCwKLSAqICAgICBtaW4oZGF0YS5zaXplKCkgKiBzaXplb2YoUG9kVHlwZSksIG1heF9zaXplX2luX2J5dGVzKSk7IEBlbmRjb2RlCi0gKgotICogQG5vdGUgVGhlIGJ1ZmZlciBpcyBpbnZhbGlkYXRlZCBieSBhbnkgdmVjdG9yIG9wZXJhdGlvbiB0aGF0IHdvdWxkIGFsc28KLSAqIGludmFsaWRhdGUgaXRlcmF0b3JzLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUG9kVHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yPgotaW5saW5lIGNvbnN0X2J1ZmZlcnNfMSBidWZmZXIoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8UG9kVHlwZSwgQWxsb2NhdG9yPiYgZGF0YSwgc3RkOjpzaXplX3QgbWF4X3NpemVfaW5fYnl0ZXMpCi17Ci0gIHJldHVybiBjb25zdF9idWZmZXJzXzEoCi0gICAgICBjb25zdF9idWZmZXIoZGF0YS5zaXplKCkgPyAmZGF0YVswXSA6IDAsCi0gICAgICAgIGRhdGEuc2l6ZSgpICogc2l6ZW9mKFBvZFR5cGUpIDwgbWF4X3NpemVfaW5fYnl0ZXMKLSAgICAgICAgPyBkYXRhLnNpemUoKSAqIHNpemVvZihQb2RUeXBlKSA6IG1heF9zaXplX2luX2J5dGVzCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotICAgICAgICAsIGRldGFpbDo6YnVmZmVyX2RlYnVnX2NoZWNrPAotICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8UG9kVHlwZSwgQWxsb2NhdG9yPjo6Y29uc3RfaXRlcmF0b3IKLSAgICAgICAgICA+KGRhdGEuYmVnaW4oKSkKLSNlbmRpZiAvLyBBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HCi0gICAgICAgICkpOwotfQotCi0vLy8gQ3JlYXRlIGEgbmV3IG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHN0cmluZy4KLS8qKgotICogQHJldHVybnMgPHR0PmNvbnN0X2J1ZmZlcnNfMShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkgKiBzaXplb2YoRWxlbSkpPC90dD4uCi0gKgotICogQG5vdGUgVGhlIGJ1ZmZlciBpcyBpbnZhbGlkYXRlZCBieSBhbnkgbm9uLWNvbnN0IG9wZXJhdGlvbiBjYWxsZWQgb24gdGhlCi0gKiBnaXZlbiBzdHJpbmcgb2JqZWN0LgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbSwgdHlwZW5hbWUgVHJhaXRzLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1pbmxpbmUgY29uc3RfYnVmZmVyc18xIGJ1ZmZlcigKLSAgICBjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxFbGVtLCBUcmFpdHMsIEFsbG9jYXRvcj4mIGRhdGEpCi17Ci0gIHJldHVybiBjb25zdF9idWZmZXJzXzEoY29uc3RfYnVmZmVyKGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSAqIHNpemVvZihFbGVtKQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORykKLSAgICAgICAgLCBkZXRhaWw6OmJ1ZmZlcl9kZWJ1Z19jaGVjazwKLSAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPEVsZW0sIFRyYWl0cywgQWxsb2NhdG9yPjo6Y29uc3RfaXRlcmF0b3IKLSAgICAgICAgICA+KGRhdGEuYmVnaW4oKSkKLSNlbmRpZiAvLyBBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HCi0gICAgICAgICkpOwotfQotCi0vLy8gQ3JlYXRlIGEgbmV3IG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHN0cmluZy4KLS8qKgotICogQHJldHVybnMgQSBjb25zdF9idWZmZXJzXzEgdmFsdWUgZXF1aXZhbGVudCB0bzoKLSAqIEBjb2RlIGNvbnN0X2J1ZmZlcnNfMSgKLSAqICAgICBkYXRhLmRhdGEoKSwKLSAqICAgICBtaW4oZGF0YS5zaXplKCkgKiBzaXplb2YoRWxlbSksIG1heF9zaXplX2luX2J5dGVzKSk7IEBlbmRjb2RlCi0gKgotICogQG5vdGUgVGhlIGJ1ZmZlciBpcyBpbnZhbGlkYXRlZCBieSBhbnkgbm9uLWNvbnN0IG9wZXJhdGlvbiBjYWxsZWQgb24gdGhlCi0gKiBnaXZlbiBzdHJpbmcgb2JqZWN0LgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbSwgdHlwZW5hbWUgVHJhaXRzLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1pbmxpbmUgY29uc3RfYnVmZmVyc18xIGJ1ZmZlcigKLSAgICBjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxFbGVtLCBUcmFpdHMsIEFsbG9jYXRvcj4mIGRhdGEsCi0gICAgc3RkOjpzaXplX3QgbWF4X3NpemVfaW5fYnl0ZXMpCi17Ci0gIHJldHVybiBjb25zdF9idWZmZXJzXzEoCi0gICAgICBjb25zdF9idWZmZXIoZGF0YS5kYXRhKCksCi0gICAgICAgIGRhdGEuc2l6ZSgpICogc2l6ZW9mKEVsZW0pIDwgbWF4X3NpemVfaW5fYnl0ZXMKLSAgICAgICAgPyBkYXRhLnNpemUoKSAqIHNpemVvZihFbGVtKSA6IG1heF9zaXplX2luX2J5dGVzCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotICAgICAgICAsIGRldGFpbDo6YnVmZmVyX2RlYnVnX2NoZWNrPAotICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpiYXNpY19zdHJpbmc8RWxlbSwgVHJhaXRzLCBBbGxvY2F0b3I+Ojpjb25zdF9pdGVyYXRvcgotICAgICAgICAgID4oZGF0YS5iZWdpbigpKQotI2VuZGlmIC8vIEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcKLSAgICAgICAgKSk7Ci19Ci0KLS8qQH0qLwotCi0vKiogQGRlZmdyb3VwIGJ1ZmZlcl9jb3B5IGFzaW86OmJ1ZmZlcl9jb3B5Ci0gKgotICogQGJyaWVmIFRoZSBhc2lvOjpidWZmZXJfY29weSBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvcHkgYnl0ZXMgZnJvbSBhCi0gKiBzb3VyY2UgYnVmZmVyIChvciBidWZmZXIgc2VxdWVuY2UpIHRvIGEgdGFyZ2V0IGJ1ZmZlciAob3IgYnVmZmVyIHNlcXVlbmNlKS4KLSAqCi0gKiBUaGUgQGMgYnVmZmVyX2NvcHkgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGluIHR3byBmb3JtczoKLSAqCi0gKiBAbGkgQSAyLWFyZ3VtZW50IGZvcm06IEBjIGJ1ZmZlcl9jb3B5KHRhcmdldCwgc291cmNlKQotICoKLSAqIEBsaSBBIDMtYXJndW1lbnQgZm9ybTogQGMgYnVmZmVyX2NvcHkodGFyZ2V0LCBzb3VyY2UsIG1heF9ieXRlc190b19jb3B5KQotCi0gKiBCb3RoIGZvcm1zIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNvcGllZC4gVGhlIG51bWJlciBvZiBieXRlcwotICogY29waWVkIGlzIHRoZSBsZXNzZXIgb2Y6Ci0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHRhcmdldCkKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUoc291cmNlKQotICoKLSAqIEBsaSBAYyBJZiBzcGVjaWZpZWQsIEBjIG1heF9ieXRlc190b19jb3B5LgotICoKLSAqIFRoaXMgcHJldmVudHMgYnVmZmVyIG92ZXJmbG93LCByZWdhcmRsZXNzIG9mIHRoZSBidWZmZXIgc2l6ZXMgdXNlZCBpbiB0aGUKLSAqIGNvcHkgb3BlcmF0aW9uLgotICoKLSAqIE5vdGUgdGhhdCBAcmVmIGJ1ZmZlcl9jb3B5IGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kCi0gKiBjb25zZXF1ZW50bHkgaXQgY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi0vKkB7Ki8KLQotLy8vIENvcGllcyBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gdG8gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBmcm9tCi0gKiB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IG11dGFibGVfYnVmZmVyJiB0YXJnZXQsCi0gICAgY29uc3QgY29uc3RfYnVmZmVyJiBzb3VyY2UpCi17Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1jcHkuCi0gIHN0ZDo6c2l6ZV90IHRhcmdldF9zaXplID0gYnVmZmVyX3NpemUodGFyZ2V0KTsKLSAgc3RkOjpzaXplX3Qgc291cmNlX3NpemUgPSBidWZmZXJfc2l6ZShzb3VyY2UpOwotICBzdGQ6OnNpemVfdCBuID0gdGFyZ2V0X3NpemUgPCBzb3VyY2Vfc2l6ZSA/IHRhcmdldF9zaXplIDogc291cmNlX3NpemU7Ci0gIG1lbWNweShidWZmZXJfY2FzdDx2b2lkKj4odGFyZ2V0KSwgYnVmZmVyX2Nhc3Q8Y29uc3Qgdm9pZCo+KHNvdXJjZSksIG4pOwotICByZXR1cm4gbjsKLX0KLQotLy8vIENvcGllcyBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gdG8gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBmcm9tCi0gKiB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IG11dGFibGVfYnVmZmVyJiB0YXJnZXQsCi0gICAgY29uc3QgY29uc3RfYnVmZmVyc18xJiBzb3VyY2UpCi17Ci0gIHJldHVybiBidWZmZXJfY29weSh0YXJnZXQsIHN0YXRpY19jYXN0PGNvbnN0IGNvbnN0X2J1ZmZlciY+KHNvdXJjZSkpOwotfQotCi0vLy8gQ29waWVzIGJ5dGVzIGZyb20gYSBzb3VyY2UgYnVmZmVyIHRvIGEgdGFyZ2V0IGJ1ZmZlci4KLS8qKgotICogQHBhcmFtIHRhcmdldCBBIG1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiB0byB3aGljaAotICogdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gZnJvbSB3aGljaAotICogdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLiBUaGUgY29udGVudHMgb2YgdGhlIHNvdXJjZSBidWZmZXIgd2lsbCBub3QgYmUKLSAqIG1vZGlmaWVkLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgotICoKLSAqIEBub3RlIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBsZXNzZXIgb2Y6Ci0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHRhcmdldCkKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUoc291cmNlKQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgQGMgbWVtY3B5LCBhbmQgY29uc2VxdWVudGx5IGl0Ci0gKiBjYW5ub3QgYmUgdXNlZCB0byBjb3B5IGJldHdlZW4gb3ZlcmxhcHBpbmcgbWVtb3J5IHJlZ2lvbnMuCi0gKi8KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfY29weShjb25zdCBtdXRhYmxlX2J1ZmZlciYgdGFyZ2V0LAotICAgIGNvbnN0IG11dGFibGVfYnVmZmVyJiBzb3VyY2UpCi17Ci0gIHJldHVybiBidWZmZXJfY29weSh0YXJnZXQsIGNvbnN0X2J1ZmZlcihzb3VyY2UpKTsKLX0KLQotLy8vIENvcGllcyBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gdG8gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIGZyb20gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4gVGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgYnVmZmVyIHdpbGwgbm90IGJlCi0gKiBtb2RpZmllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX2NvcHkoY29uc3QgbXV0YWJsZV9idWZmZXImIHRhcmdldCwKLSAgICBjb25zdCBtdXRhYmxlX2J1ZmZlcnNfMSYgc291cmNlKQotewotICByZXR1cm4gYnVmZmVyX2NvcHkodGFyZ2V0LCBjb25zdF9idWZmZXIoc291cmNlKSk7Ci19Ci0KLS8vLyBDb3BpZXMgYnl0ZXMgZnJvbSBhIHNvdXJjZSBidWZmZXIgc2VxdWVuY2UgdG8gYSB0YXJnZXQgYnVmZmVyLgotLyoqCi0gKiBAcGFyYW0gdGFyZ2V0IEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIHRvIHdoaWNoCi0gKiB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIHNvdXJjZSBBIG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciBzZXF1ZW5jZSByZXByZXNlbnRpbmcgdGhlIG1lbW9yeQotICogcmVnaW9ucyBmcm9tIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLXN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IG11dGFibGVfYnVmZmVyJiB0YXJnZXQsCi0gICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgc291cmNlKQotewotICBzdGQ6OnNpemVfdCB0b3RhbF9ieXRlc19jb3BpZWQgPSAwOwotCi0gIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIHNvdXJjZV9pdGVyID0gc291cmNlLmJlZ2luKCk7Ci0gIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIHNvdXJjZV9lbmQgPSBzb3VyY2UuZW5kKCk7Ci0KLSAgZm9yIChtdXRhYmxlX2J1ZmZlciB0YXJnZXRfYnVmZmVyKHRhcmdldCk7Ci0gICAgICBidWZmZXJfc2l6ZSh0YXJnZXRfYnVmZmVyKSAmJiBzb3VyY2VfaXRlciAhPSBzb3VyY2VfZW5kOyArK3NvdXJjZV9pdGVyKQotICB7Ci0gICAgY29uc3RfYnVmZmVyIHNvdXJjZV9idWZmZXIoKnNvdXJjZV9pdGVyKTsKLSAgICBzdGQ6OnNpemVfdCBieXRlc19jb3BpZWQgPSBidWZmZXJfY29weSh0YXJnZXRfYnVmZmVyLCBzb3VyY2VfYnVmZmVyKTsKLSAgICB0b3RhbF9ieXRlc19jb3BpZWQgKz0gYnl0ZXNfY29waWVkOwotICAgIHRhcmdldF9idWZmZXIgPSB0YXJnZXRfYnVmZmVyICsgYnl0ZXNfY29waWVkOwotICB9Ci0KLSAgcmV0dXJuIHRvdGFsX2J5dGVzX2NvcGllZDsKLX0KLQotLy8vIENvcGllcyBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gdG8gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBmcm9tCi0gKiB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IG11dGFibGVfYnVmZmVyc18xJiB0YXJnZXQsCi0gICAgY29uc3QgY29uc3RfYnVmZmVyJiBzb3VyY2UpCi17Ci0gIHJldHVybiBidWZmZXJfY29weShzdGF0aWNfY2FzdDxjb25zdCBtdXRhYmxlX2J1ZmZlciY+KHRhcmdldCksIHNvdXJjZSk7Ci19Ci0KLS8vLyBDb3BpZXMgYnl0ZXMgZnJvbSBhIHNvdXJjZSBidWZmZXIgdG8gYSB0YXJnZXQgYnVmZmVyLgotLyoqCi0gKiBAcGFyYW0gdGFyZ2V0IEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIHRvIHdoaWNoCi0gKiB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIHNvdXJjZSBBIG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gZnJvbQotICogd2hpY2ggdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgotICoKLSAqIEBub3RlIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBsZXNzZXIgb2Y6Ci0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHRhcmdldCkKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUoc291cmNlKQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgQGMgbWVtY3B5LCBhbmQgY29uc2VxdWVudGx5IGl0Ci0gKiBjYW5ub3QgYmUgdXNlZCB0byBjb3B5IGJldHdlZW4gb3ZlcmxhcHBpbmcgbWVtb3J5IHJlZ2lvbnMuCi0gKi8KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfY29weShjb25zdCBtdXRhYmxlX2J1ZmZlcnNfMSYgdGFyZ2V0LAotICAgIGNvbnN0IGNvbnN0X2J1ZmZlcnNfMSYgc291cmNlKQotewotICByZXR1cm4gYnVmZmVyX2NvcHkoc3RhdGljX2Nhc3Q8Y29uc3QgbXV0YWJsZV9idWZmZXImPih0YXJnZXQpLAotICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgY29uc3RfYnVmZmVyJj4oc291cmNlKSk7Ci19Ci0KLS8vLyBDb3BpZXMgYnl0ZXMgZnJvbSBhIHNvdXJjZSBidWZmZXIgdG8gYSB0YXJnZXQgYnVmZmVyLgotLyoqCi0gKiBAcGFyYW0gdGFyZ2V0IEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIHRvIHdoaWNoCi0gKiB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIHNvdXJjZSBBIG1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBmcm9tIHdoaWNoCi0gKiB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuIFRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGJ1ZmZlciB3aWxsIG5vdCBiZQotICogbW9kaWZpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IG11dGFibGVfYnVmZmVyc18xJiB0YXJnZXQsCi0gICAgY29uc3QgbXV0YWJsZV9idWZmZXImIHNvdXJjZSkKLXsKLSAgcmV0dXJuIGJ1ZmZlcl9jb3B5KHN0YXRpY19jYXN0PGNvbnN0IG11dGFibGVfYnVmZmVyJj4odGFyZ2V0KSwKLSAgICAgIGNvbnN0X2J1ZmZlcihzb3VyY2UpKTsKLX0KLQotLy8vIENvcGllcyBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gdG8gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIGZyb20gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4gVGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgYnVmZmVyIHdpbGwgbm90IGJlCi0gKiBtb2RpZmllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX2NvcHkoY29uc3QgbXV0YWJsZV9idWZmZXJzXzEmIHRhcmdldCwKLSAgICBjb25zdCBtdXRhYmxlX2J1ZmZlcnNfMSYgc291cmNlKQotewotICByZXR1cm4gYnVmZmVyX2NvcHkoc3RhdGljX2Nhc3Q8Y29uc3QgbXV0YWJsZV9idWZmZXImPih0YXJnZXQpLAotICAgICAgY29uc3RfYnVmZmVyKHNvdXJjZSkpOwotfQotCi0vLy8gQ29waWVzIGJ5dGVzIGZyb20gYSBzb3VyY2UgYnVmZmVyIHNlcXVlbmNlIHRvIGEgdGFyZ2V0IGJ1ZmZlci4KLS8qKgotICogQHBhcmFtIHRhcmdldCBBIG1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiB0byB3aGljaAotICogdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgQSBub24tbW9kaWZpYWJsZSBidWZmZXIgc2VxdWVuY2UgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkKLSAqIHJlZ2lvbnMgZnJvbSB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX2NvcHkoY29uc3QgbXV0YWJsZV9idWZmZXJzXzEmIHRhcmdldCwKLSAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBzb3VyY2UpCi17Ci0gIHJldHVybiBidWZmZXJfY29weShzdGF0aWNfY2FzdDxjb25zdCBtdXRhYmxlX2J1ZmZlciY+KHRhcmdldCksIHNvdXJjZSk7Ci19Ci0KLS8vLyBDb3BpZXMgYnl0ZXMgZnJvbSBhIHNvdXJjZSBidWZmZXIgdG8gYSB0YXJnZXQgYnVmZmVyIHNlcXVlbmNlLgotLyoqCi0gKiBAcGFyYW0gdGFyZ2V0IEEgbW9kaWZpYWJsZSBidWZmZXIgc2VxdWVuY2UgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9ucyB0bwotICogd2hpY2ggdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgQSBub24tbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIGZyb20KLSAqIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotc3RkOjpzaXplX3QgYnVmZmVyX2NvcHkoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiB0YXJnZXQsCi0gICAgY29uc3QgY29uc3RfYnVmZmVyJiBzb3VyY2UpCi17Ci0gIHN0ZDo6c2l6ZV90IHRvdGFsX2J5dGVzX2NvcGllZCA9IDA7Ci0KLSAgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlOjpjb25zdF9pdGVyYXRvciB0YXJnZXRfaXRlciA9IHRhcmdldC5iZWdpbigpOwotICB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIHRhcmdldF9lbmQgPSB0YXJnZXQuZW5kKCk7Ci0KLSAgZm9yIChjb25zdF9idWZmZXIgc291cmNlX2J1ZmZlcihzb3VyY2UpOwotICAgICAgYnVmZmVyX3NpemUoc291cmNlX2J1ZmZlcikgJiYgdGFyZ2V0X2l0ZXIgIT0gdGFyZ2V0X2VuZDsgKyt0YXJnZXRfaXRlcikKLSAgewotICAgIG11dGFibGVfYnVmZmVyIHRhcmdldF9idWZmZXIoKnRhcmdldF9pdGVyKTsKLSAgICBzdGQ6OnNpemVfdCBieXRlc19jb3BpZWQgPSBidWZmZXJfY29weSh0YXJnZXRfYnVmZmVyLCBzb3VyY2VfYnVmZmVyKTsKLSAgICB0b3RhbF9ieXRlc19jb3BpZWQgKz0gYnl0ZXNfY29waWVkOwotICAgIHNvdXJjZV9idWZmZXIgPSBzb3VyY2VfYnVmZmVyICsgYnl0ZXNfY29waWVkOwotICB9Ci0KLSAgcmV0dXJuIHRvdGFsX2J5dGVzX2NvcGllZDsKLX0KLQotLy8vIENvcGllcyBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIgc2VxdWVuY2UuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciBzZXF1ZW5jZSByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb25zIHRvCi0gKiB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIHNvdXJjZSBBIG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gZnJvbQotICogd2hpY2ggdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgotICoKLSAqIEBub3RlIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBsZXNzZXIgb2Y6Ci0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHRhcmdldCkKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUoc291cmNlKQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgQGMgbWVtY3B5LCBhbmQgY29uc2VxdWVudGx5IGl0Ci0gKiBjYW5ub3QgYmUgdXNlZCB0byBjb3B5IGJldHdlZW4gb3ZlcmxhcHBpbmcgbWVtb3J5IHJlZ2lvbnMuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX2NvcHkoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiB0YXJnZXQsCi0gICAgY29uc3QgY29uc3RfYnVmZmVyc18xJiBzb3VyY2UpCi17Ci0gIHJldHVybiBidWZmZXJfY29weSh0YXJnZXQsIHN0YXRpY19jYXN0PGNvbnN0IGNvbnN0X2J1ZmZlciY+KHNvdXJjZSkpOwotfQotCi0vLy8gQ29waWVzIGJ5dGVzIGZyb20gYSBzb3VyY2UgYnVmZmVyIHRvIGEgdGFyZ2V0IGJ1ZmZlciBzZXF1ZW5jZS4KLS8qKgotICogQHBhcmFtIHRhcmdldCBBIG1vZGlmaWFibGUgYnVmZmVyIHNlcXVlbmNlIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbnMgdG8KLSAqIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIGZyb20gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4gVGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgYnVmZmVyIHdpbGwgbm90IGJlCi0gKiBtb2RpZmllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgdGFyZ2V0LAotICAgIGNvbnN0IG11dGFibGVfYnVmZmVyJiBzb3VyY2UpCi17Ci0gIHJldHVybiBidWZmZXJfY29weSh0YXJnZXQsIGNvbnN0X2J1ZmZlcihzb3VyY2UpKTsKLX0KLQotLy8vIENvcGllcyBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIgc2VxdWVuY2UuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciBzZXF1ZW5jZSByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb25zIHRvCi0gKiB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIHNvdXJjZSBBIG1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBmcm9tIHdoaWNoCi0gKiB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuIFRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGJ1ZmZlciB3aWxsIG5vdCBiZQotICogbW9kaWZpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfY29weShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIHRhcmdldCwKLSAgICBjb25zdCBtdXRhYmxlX2J1ZmZlcnNfMSYgc291cmNlKQotewotICByZXR1cm4gYnVmZmVyX2NvcHkodGFyZ2V0LCBjb25zdF9idWZmZXIoc291cmNlKSk7Ci19Ci0KLS8vLyBDb3BpZXMgYnl0ZXMgZnJvbSBhIHNvdXJjZSBidWZmZXIgc2VxdWVuY2UgdG8gYSB0YXJnZXQgYnVmZmVyIHNlcXVlbmNlLgotLyoqCi0gKiBAcGFyYW0gdGFyZ2V0IEEgbW9kaWZpYWJsZSBidWZmZXIgc2VxdWVuY2UgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9ucyB0bwotICogd2hpY2ggdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgQSBub24tbW9kaWZpYWJsZSBidWZmZXIgc2VxdWVuY2UgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkKLSAqIHJlZ2lvbnMgZnJvbSB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLXN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgdGFyZ2V0LAotICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIHNvdXJjZSkKLXsKLSAgc3RkOjpzaXplX3QgdG90YWxfYnl0ZXNfY29waWVkID0gMDsKLQotICB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIHRhcmdldF9pdGVyID0gdGFyZ2V0LmJlZ2luKCk7Ci0gIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgdGFyZ2V0X2VuZCA9IHRhcmdldC5lbmQoKTsKLSAgc3RkOjpzaXplX3QgdGFyZ2V0X2J1ZmZlcl9vZmZzZXQgPSAwOwotCi0gIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIHNvdXJjZV9pdGVyID0gc291cmNlLmJlZ2luKCk7Ci0gIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIHNvdXJjZV9lbmQgPSBzb3VyY2UuZW5kKCk7Ci0gIHN0ZDo6c2l6ZV90IHNvdXJjZV9idWZmZXJfb2Zmc2V0ID0gMDsKLQotICB3aGlsZSAodGFyZ2V0X2l0ZXIgIT0gdGFyZ2V0X2VuZCAmJiBzb3VyY2VfaXRlciAhPSBzb3VyY2VfZW5kKQotICB7Ci0gICAgbXV0YWJsZV9idWZmZXIgdGFyZ2V0X2J1ZmZlciA9Ci0gICAgICBtdXRhYmxlX2J1ZmZlcigqdGFyZ2V0X2l0ZXIpICsgdGFyZ2V0X2J1ZmZlcl9vZmZzZXQ7Ci0KLSAgICBjb25zdF9idWZmZXIgc291cmNlX2J1ZmZlciA9Ci0gICAgICBjb25zdF9idWZmZXIoKnNvdXJjZV9pdGVyKSArIHNvdXJjZV9idWZmZXJfb2Zmc2V0OwotCi0gICAgc3RkOjpzaXplX3QgYnl0ZXNfY29waWVkID0gYnVmZmVyX2NvcHkodGFyZ2V0X2J1ZmZlciwgc291cmNlX2J1ZmZlcik7Ci0gICAgdG90YWxfYnl0ZXNfY29waWVkICs9IGJ5dGVzX2NvcGllZDsKLQotICAgIGlmIChieXRlc19jb3BpZWQgPT0gYnVmZmVyX3NpemUodGFyZ2V0X2J1ZmZlcikpCi0gICAgewotICAgICAgKyt0YXJnZXRfaXRlcjsKLSAgICAgIHRhcmdldF9idWZmZXJfb2Zmc2V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgdGFyZ2V0X2J1ZmZlcl9vZmZzZXQgKz0gYnl0ZXNfY29waWVkOwotCi0gICAgaWYgKGJ5dGVzX2NvcGllZCA9PSBidWZmZXJfc2l6ZShzb3VyY2VfYnVmZmVyKSkKLSAgICB7Ci0gICAgICArK3NvdXJjZV9pdGVyOwotICAgICAgc291cmNlX2J1ZmZlcl9vZmZzZXQgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBzb3VyY2VfYnVmZmVyX29mZnNldCArPSBieXRlc19jb3BpZWQ7Ci0gIH0KLQotICByZXR1cm4gdG90YWxfYnl0ZXNfY29waWVkOwotfQotCi0vLy8gQ29waWVzIGEgbGltaXRlZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhIHNvdXJjZSBidWZmZXIgdG8gYSB0YXJnZXQgYnVmZmVyLgotLyoqCi0gKiBAcGFyYW0gdGFyZ2V0IEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIHRvIHdoaWNoCi0gKiB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIHNvdXJjZSBBIG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gZnJvbQotICogd2hpY2ggdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEBwYXJhbSBtYXhfYnl0ZXNfdG9fY29weSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgotICoKLSAqIEBub3RlIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBsZXNzZXIgb2Y6Ci0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHRhcmdldCkKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUoc291cmNlKQotICoKLSAqIEBsaSBAYyBtYXhfYnl0ZXNfdG9fY29weQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgQGMgbWVtY3B5LCBhbmQgY29uc2VxdWVudGx5IGl0Ci0gKiBjYW5ub3QgYmUgdXNlZCB0byBjb3B5IGJldHdlZW4gb3ZlcmxhcHBpbmcgbWVtb3J5IHJlZ2lvbnMuCi0gKi8KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfY29weShjb25zdCBtdXRhYmxlX2J1ZmZlciYgdGFyZ2V0LAotICAgIGNvbnN0IGNvbnN0X2J1ZmZlciYgc291cmNlLCBzdGQ6OnNpemVfdCBtYXhfYnl0ZXNfdG9fY29weSkKLXsKLSAgcmV0dXJuIGJ1ZmZlcl9jb3B5KGJ1ZmZlcih0YXJnZXQsIG1heF9ieXRlc190b19jb3B5KSwgc291cmNlKTsKLX0KLQotLy8vIENvcGllcyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYSBzb3VyY2UgYnVmZmVyIHRvIGEgdGFyZ2V0IGJ1ZmZlci4KLS8qKgotICogQHBhcmFtIHRhcmdldCBBIG1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiB0byB3aGljaAotICogdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgQSBub24tbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIGZyb20KLSAqIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gbWF4X2J5dGVzX3RvX2NvcHkgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBAbGkgQGMgbWF4X2J5dGVzX3RvX2NvcHkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX2NvcHkoY29uc3QgbXV0YWJsZV9idWZmZXImIHRhcmdldCwKLSAgICBjb25zdCBjb25zdF9idWZmZXJzXzEmIHNvdXJjZSwgc3RkOjpzaXplX3QgbWF4X2J5dGVzX3RvX2NvcHkpCi17Ci0gIHJldHVybiBidWZmZXJfY29weShidWZmZXIodGFyZ2V0LCBtYXhfYnl0ZXNfdG9fY29weSksIHNvdXJjZSk7Ci19Ci0KLS8vLyBDb3BpZXMgYSBsaW1pdGVkIG51bWJlciBvZiBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gdG8gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIGZyb20gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4gVGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgYnVmZmVyIHdpbGwgbm90IGJlCi0gKiBtb2RpZmllZC4KLSAqCi0gKiBAcGFyYW0gbWF4X2J5dGVzX3RvX2NvcHkgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBAbGkgQGMgbWF4X2J5dGVzX3RvX2NvcHkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX2NvcHkoY29uc3QgbXV0YWJsZV9idWZmZXImIHRhcmdldCwKLSAgICBjb25zdCBtdXRhYmxlX2J1ZmZlciYgc291cmNlLCBzdGQ6OnNpemVfdCBtYXhfYnl0ZXNfdG9fY29weSkKLXsKLSAgcmV0dXJuIGJ1ZmZlcl9jb3B5KGJ1ZmZlcih0YXJnZXQsIG1heF9ieXRlc190b19jb3B5KSwgc291cmNlKTsKLX0KLQotLy8vIENvcGllcyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYSBzb3VyY2UgYnVmZmVyIHRvIGEgdGFyZ2V0IGJ1ZmZlci4KLS8qKgotICogQHBhcmFtIHRhcmdldCBBIG1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiB0byB3aGljaAotICogdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gZnJvbSB3aGljaAotICogdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLiBUaGUgY29udGVudHMgb2YgdGhlIHNvdXJjZSBidWZmZXIgd2lsbCBub3QgYmUKLSAqIG1vZGlmaWVkLgotICoKLSAqIEBwYXJhbSBtYXhfYnl0ZXNfdG9fY29weSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgotICoKLSAqIEBub3RlIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBsZXNzZXIgb2Y6Ci0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHRhcmdldCkKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUoc291cmNlKQotICoKLSAqIEBsaSBAYyBtYXhfYnl0ZXNfdG9fY29weQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgQGMgbWVtY3B5LCBhbmQgY29uc2VxdWVudGx5IGl0Ci0gKiBjYW5ub3QgYmUgdXNlZCB0byBjb3B5IGJldHdlZW4gb3ZlcmxhcHBpbmcgbWVtb3J5IHJlZ2lvbnMuCi0gKi8KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfY29weShjb25zdCBtdXRhYmxlX2J1ZmZlciYgdGFyZ2V0LAotICAgIGNvbnN0IG11dGFibGVfYnVmZmVyc18xJiBzb3VyY2UsIHN0ZDo6c2l6ZV90IG1heF9ieXRlc190b19jb3B5KQotewotICByZXR1cm4gYnVmZmVyX2NvcHkoYnVmZmVyKHRhcmdldCwgbWF4X2J5dGVzX3RvX2NvcHkpLCBzb3VyY2UpOwotfQotCi0vLy8gQ29waWVzIGEgbGltaXRlZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhIHNvdXJjZSBidWZmZXIgc2VxdWVuY2UgdG8gYSB0YXJnZXQKLS8vLyBidWZmZXIuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gdG8gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHNlcXVlbmNlIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5Ci0gKiByZWdpb25zIGZyb20gd2hpY2ggdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEBwYXJhbSBtYXhfYnl0ZXNfdG9fY29weSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgotICoKLSAqIEBub3RlIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBsZXNzZXIgb2Y6Ci0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHRhcmdldCkKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUoc291cmNlKQotICoKLSAqIEBsaSBAYyBtYXhfYnl0ZXNfdG9fY29weQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgQGMgbWVtY3B5LCBhbmQgY29uc2VxdWVudGx5IGl0Ci0gKiBjYW5ub3QgYmUgdXNlZCB0byBjb3B5IGJldHdlZW4gb3ZlcmxhcHBpbmcgbWVtb3J5IHJlZ2lvbnMuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IG11dGFibGVfYnVmZmVyJiB0YXJnZXQsCi0gICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgc291cmNlLCBzdGQ6OnNpemVfdCBtYXhfYnl0ZXNfdG9fY29weSkKLXsKLSAgcmV0dXJuIGJ1ZmZlcl9jb3B5KGJ1ZmZlcih0YXJnZXQsIG1heF9ieXRlc190b19jb3B5KSwgc291cmNlKTsKLX0KLQotLy8vIENvcGllcyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYSBzb3VyY2UgYnVmZmVyIHRvIGEgdGFyZ2V0IGJ1ZmZlci4KLS8qKgotICogQHBhcmFtIHRhcmdldCBBIG1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiB0byB3aGljaAotICogdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgQSBub24tbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIGZyb20KLSAqIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gbWF4X2J5dGVzX3RvX2NvcHkgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBAbGkgQGMgbWF4X2J5dGVzX3RvX2NvcHkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX2NvcHkoY29uc3QgbXV0YWJsZV9idWZmZXJzXzEmIHRhcmdldCwKLSAgICBjb25zdCBjb25zdF9idWZmZXImIHNvdXJjZSwgc3RkOjpzaXplX3QgbWF4X2J5dGVzX3RvX2NvcHkpCi17Ci0gIHJldHVybiBidWZmZXJfY29weShidWZmZXIodGFyZ2V0LCBtYXhfYnl0ZXNfdG9fY29weSksIHNvdXJjZSk7Ci19Ci0KLS8vLyBDb3BpZXMgYSBsaW1pdGVkIG51bWJlciBvZiBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gdG8gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBmcm9tCi0gKiB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIG1heF9ieXRlc190b19jb3B5IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogQGxpIEBjIG1heF9ieXRlc190b19jb3B5Ci0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IG11dGFibGVfYnVmZmVyc18xJiB0YXJnZXQsCi0gICAgY29uc3QgY29uc3RfYnVmZmVyc18xJiBzb3VyY2UsIHN0ZDo6c2l6ZV90IG1heF9ieXRlc190b19jb3B5KQotewotICByZXR1cm4gYnVmZmVyX2NvcHkoYnVmZmVyKHRhcmdldCwgbWF4X2J5dGVzX3RvX2NvcHkpLCBzb3VyY2UpOwotfQotCi0vLy8gQ29waWVzIGEgbGltaXRlZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhIHNvdXJjZSBidWZmZXIgdG8gYSB0YXJnZXQgYnVmZmVyLgotLyoqCi0gKiBAcGFyYW0gdGFyZ2V0IEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIHRvIHdoaWNoCi0gKiB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIHNvdXJjZSBBIG1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBmcm9tIHdoaWNoCi0gKiB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuIFRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGJ1ZmZlciB3aWxsIG5vdCBiZQotICogbW9kaWZpZWQuCi0gKgotICogQHBhcmFtIG1heF9ieXRlc190b19jb3B5IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogQGxpIEBjIG1heF9ieXRlc190b19jb3B5Ci0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IG11dGFibGVfYnVmZmVyc18xJiB0YXJnZXQsCi0gICAgY29uc3QgbXV0YWJsZV9idWZmZXImIHNvdXJjZSwgc3RkOjpzaXplX3QgbWF4X2J5dGVzX3RvX2NvcHkpCi17Ci0gIHJldHVybiBidWZmZXJfY29weShidWZmZXIodGFyZ2V0LCBtYXhfYnl0ZXNfdG9fY29weSksIHNvdXJjZSk7Ci19Ci0KLS8vLyBDb3BpZXMgYSBsaW1pdGVkIG51bWJlciBvZiBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb24gdG8gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIGZyb20gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4gVGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgYnVmZmVyIHdpbGwgbm90IGJlCi0gKiBtb2RpZmllZC4KLSAqCi0gKiBAcGFyYW0gbWF4X2J5dGVzX3RvX2NvcHkgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBAbGkgQGMgbWF4X2J5dGVzX3RvX2NvcHkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi1pbmxpbmUgc3RkOjpzaXplX3QgYnVmZmVyX2NvcHkoY29uc3QgbXV0YWJsZV9idWZmZXJzXzEmIHRhcmdldCwKLSAgICBjb25zdCBtdXRhYmxlX2J1ZmZlcnNfMSYgc291cmNlLCBzdGQ6OnNpemVfdCBtYXhfYnl0ZXNfdG9fY29weSkKLXsKLSAgcmV0dXJuIGJ1ZmZlcl9jb3B5KGJ1ZmZlcih0YXJnZXQsIG1heF9ieXRlc190b19jb3B5KSwgc291cmNlKTsKLX0KLQotLy8vIENvcGllcyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYSBzb3VyY2UgYnVmZmVyIHNlcXVlbmNlIHRvIGEgdGFyZ2V0Ci0vLy8gYnVmZmVyLgotLyoqCi0gKiBAcGFyYW0gdGFyZ2V0IEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIHRvIHdoaWNoCi0gKiB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIHNvdXJjZSBBIG5vbi1tb2RpZmlhYmxlIGJ1ZmZlciBzZXF1ZW5jZSByZXByZXNlbnRpbmcgdGhlIG1lbW9yeQotICogcmVnaW9ucyBmcm9tIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gbWF4X2J5dGVzX3RvX2NvcHkgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBAbGkgQGMgbWF4X2J5dGVzX3RvX2NvcHkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfY29weShjb25zdCBtdXRhYmxlX2J1ZmZlcnNfMSYgdGFyZ2V0LAotICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIHNvdXJjZSwgc3RkOjpzaXplX3QgbWF4X2J5dGVzX3RvX2NvcHkpCi17Ci0gIHJldHVybiBidWZmZXJfY29weShidWZmZXIodGFyZ2V0LCBtYXhfYnl0ZXNfdG9fY29weSksIHNvdXJjZSk7Ci19Ci0KLS8vLyBDb3BpZXMgYSBsaW1pdGVkIG51bWJlciBvZiBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIKLS8vLyBzZXF1ZW5jZS4KLS8qKgotICogQHBhcmFtIHRhcmdldCBBIG1vZGlmaWFibGUgYnVmZmVyIHNlcXVlbmNlIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbnMgdG8KLSAqIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBmcm9tCi0gKiB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIG1heF9ieXRlc190b19jb3B5IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogQGxpIEBjIG1heF9ieXRlc190b19jb3B5Ci0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfY29weShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIHRhcmdldCwKLSAgICBjb25zdCBjb25zdF9idWZmZXImIHNvdXJjZSwgc3RkOjpzaXplX3QgbWF4X2J5dGVzX3RvX2NvcHkpCi17Ci0gIHJldHVybiBidWZmZXJfY29weSh0YXJnZXQsIGJ1ZmZlcihzb3VyY2UsIG1heF9ieXRlc190b19jb3B5KSk7Ci19Ci0KLS8vLyBDb3BpZXMgYSBsaW1pdGVkIG51bWJlciBvZiBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIKLS8vLyBzZXF1ZW5jZS4KLS8qKgotICogQHBhcmFtIHRhcmdldCBBIG1vZGlmaWFibGUgYnVmZmVyIHNlcXVlbmNlIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbnMgdG8KLSAqIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbm9uLW1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBmcm9tCi0gKiB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIG1heF9ieXRlc190b19jb3B5IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogQGxpIEBjIG1heF9ieXRlc190b19jb3B5Ci0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfY29weShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIHRhcmdldCwKLSAgICBjb25zdCBjb25zdF9idWZmZXJzXzEmIHNvdXJjZSwgc3RkOjpzaXplX3QgbWF4X2J5dGVzX3RvX2NvcHkpCi17Ci0gIHJldHVybiBidWZmZXJfY29weSh0YXJnZXQsIGJ1ZmZlcihzb3VyY2UsIG1heF9ieXRlc190b19jb3B5KSk7Ci19Ci0KLS8vLyBDb3BpZXMgYSBsaW1pdGVkIG51bWJlciBvZiBieXRlcyBmcm9tIGEgc291cmNlIGJ1ZmZlciB0byBhIHRhcmdldCBidWZmZXIKLS8vLyBzZXF1ZW5jZS4KLS8qKgotICogQHBhcmFtIHRhcmdldCBBIG1vZGlmaWFibGUgYnVmZmVyIHNlcXVlbmNlIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbnMgdG8KLSAqIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4KLSAqCi0gKiBAcGFyYW0gc291cmNlIEEgbW9kaWZpYWJsZSBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9uIGZyb20gd2hpY2gKLSAqIHRoZSBieXRlcyB3aWxsIGJlIGNvcGllZC4gVGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgYnVmZmVyIHdpbGwgbm90IGJlCi0gKiBtb2RpZmllZC4KLSAqCi0gKiBAcGFyYW0gbWF4X2J5dGVzX3RvX2NvcHkgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZC4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqCi0gKiBAbm90ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbGVzc2VyIG9mOgotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZSh0YXJnZXQpCi0gKgotICogQGxpIEBjIGJ1ZmZlcl9zaXplKHNvdXJjZSkKLSAqCi0gKiBAbGkgQGMgbWF4X2J5dGVzX3RvX2NvcHkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIEBjIG1lbWNweSwgYW5kIGNvbnNlcXVlbnRseSBpdAotICogY2Fubm90IGJlIHVzZWQgdG8gY29weSBiZXR3ZWVuIG92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotaW5saW5lIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgdGFyZ2V0LAotICAgIGNvbnN0IG11dGFibGVfYnVmZmVyJiBzb3VyY2UsIHN0ZDo6c2l6ZV90IG1heF9ieXRlc190b19jb3B5KQotewotICByZXR1cm4gYnVmZmVyX2NvcHkodGFyZ2V0LCBidWZmZXIoc291cmNlLCBtYXhfYnl0ZXNfdG9fY29weSkpOwotfQotCi0vLy8gQ29waWVzIGEgbGltaXRlZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhIHNvdXJjZSBidWZmZXIgdG8gYSB0YXJnZXQgYnVmZmVyCi0vLy8gc2VxdWVuY2UuCi0vKioKLSAqIEBwYXJhbSB0YXJnZXQgQSBtb2RpZmlhYmxlIGJ1ZmZlciBzZXF1ZW5jZSByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSByZWdpb25zIHRvCi0gKiB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIHNvdXJjZSBBIG1vZGlmaWFibGUgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgbWVtb3J5IHJlZ2lvbiBmcm9tIHdoaWNoCi0gKiB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuIFRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGJ1ZmZlciB3aWxsIG5vdCBiZQotICogbW9kaWZpZWQuCi0gKgotICogQHBhcmFtIG1heF9ieXRlc190b19jb3B5IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogQGxpIEBjIG1heF9ieXRlc190b19jb3B5Ci0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBzdGQ6OnNpemVfdCBidWZmZXJfY29weShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIHRhcmdldCwKLSAgICBjb25zdCBtdXRhYmxlX2J1ZmZlcnNfMSYgc291cmNlLCBzdGQ6OnNpemVfdCBtYXhfYnl0ZXNfdG9fY29weSkKLXsKLSAgcmV0dXJuIGJ1ZmZlcl9jb3B5KHRhcmdldCwgYnVmZmVyKHNvdXJjZSwgbWF4X2J5dGVzX3RvX2NvcHkpKTsKLX0KLQotLy8vIENvcGllcyBhIGxpbWl0ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYSBzb3VyY2UgYnVmZmVyIHNlcXVlbmNlIHRvIGEgdGFyZ2V0Ci0vLy8gYnVmZmVyIHNlcXVlbmNlLgotLyoqCi0gKiBAcGFyYW0gdGFyZ2V0IEEgbW9kaWZpYWJsZSBidWZmZXIgc2VxdWVuY2UgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkgcmVnaW9ucyB0bwotICogd2hpY2ggdGhlIGJ5dGVzIHdpbGwgYmUgY29waWVkLgotICoKLSAqIEBwYXJhbSBzb3VyY2UgQSBub24tbW9kaWZpYWJsZSBidWZmZXIgc2VxdWVuY2UgcmVwcmVzZW50aW5nIHRoZSBtZW1vcnkKLSAqIHJlZ2lvbnMgZnJvbSB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSBjb3BpZWQuCi0gKgotICogQHBhcmFtIG1heF9ieXRlc190b19jb3B5IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKgotICogQG5vdGUgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIGxlc3NlciBvZjoKLSAqCi0gKiBAbGkgQGMgYnVmZmVyX3NpemUodGFyZ2V0KQotICoKLSAqIEBsaSBAYyBidWZmZXJfc2l6ZShzb3VyY2UpCi0gKgotICogQGxpIEBjIG1heF9ieXRlc190b19jb3B5Ci0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBAYyBtZW1jcHksIGFuZCBjb25zZXF1ZW50bHkgaXQKLSAqIGNhbm5vdCBiZSB1c2VkIHRvIGNvcHkgYmV0d2VlbiBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucy4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLXN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3B5KGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgdGFyZ2V0LAotICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIHNvdXJjZSwgc3RkOjpzaXplX3QgbWF4X2J5dGVzX3RvX2NvcHkpCi17Ci0gIHN0ZDo6c2l6ZV90IHRvdGFsX2J5dGVzX2NvcGllZCA9IDA7Ci0KLSAgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlOjpjb25zdF9pdGVyYXRvciB0YXJnZXRfaXRlciA9IHRhcmdldC5iZWdpbigpOwotICB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIHRhcmdldF9lbmQgPSB0YXJnZXQuZW5kKCk7Ci0gIHN0ZDo6c2l6ZV90IHRhcmdldF9idWZmZXJfb2Zmc2V0ID0gMDsKLQotICB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlOjpjb25zdF9pdGVyYXRvciBzb3VyY2VfaXRlciA9IHNvdXJjZS5iZWdpbigpOwotICB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlOjpjb25zdF9pdGVyYXRvciBzb3VyY2VfZW5kID0gc291cmNlLmVuZCgpOwotICBzdGQ6OnNpemVfdCBzb3VyY2VfYnVmZmVyX29mZnNldCA9IDA7Ci0KLSAgd2hpbGUgKHRvdGFsX2J5dGVzX2NvcGllZCAhPSBtYXhfYnl0ZXNfdG9fY29weQotICAgICAgJiYgdGFyZ2V0X2l0ZXIgIT0gdGFyZ2V0X2VuZCAmJiBzb3VyY2VfaXRlciAhPSBzb3VyY2VfZW5kKQotICB7Ci0gICAgbXV0YWJsZV9idWZmZXIgdGFyZ2V0X2J1ZmZlciA9Ci0gICAgICBtdXRhYmxlX2J1ZmZlcigqdGFyZ2V0X2l0ZXIpICsgdGFyZ2V0X2J1ZmZlcl9vZmZzZXQ7Ci0KLSAgICBjb25zdF9idWZmZXIgc291cmNlX2J1ZmZlciA9Ci0gICAgICBjb25zdF9idWZmZXIoKnNvdXJjZV9pdGVyKSArIHNvdXJjZV9idWZmZXJfb2Zmc2V0OwotCi0gICAgc3RkOjpzaXplX3QgYnl0ZXNfY29waWVkID0gYnVmZmVyX2NvcHkodGFyZ2V0X2J1ZmZlciwKLSAgICAgICAgc291cmNlX2J1ZmZlciwgbWF4X2J5dGVzX3RvX2NvcHkgLSB0b3RhbF9ieXRlc19jb3BpZWQpOwotICAgIHRvdGFsX2J5dGVzX2NvcGllZCArPSBieXRlc19jb3BpZWQ7Ci0KLSAgICBpZiAoYnl0ZXNfY29waWVkID09IGJ1ZmZlcl9zaXplKHRhcmdldF9idWZmZXIpKQotICAgIHsKLSAgICAgICsrdGFyZ2V0X2l0ZXI7Ci0gICAgICB0YXJnZXRfYnVmZmVyX29mZnNldCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHRhcmdldF9idWZmZXJfb2Zmc2V0ICs9IGJ5dGVzX2NvcGllZDsKLQotICAgIGlmIChieXRlc19jb3BpZWQgPT0gYnVmZmVyX3NpemUoc291cmNlX2J1ZmZlcikpCi0gICAgewotICAgICAgKytzb3VyY2VfaXRlcjsKLSAgICAgIHNvdXJjZV9idWZmZXJfb2Zmc2V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgc291cmNlX2J1ZmZlcl9vZmZzZXQgKz0gYnl0ZXNfY29waWVkOwotICB9Ci0KLSAgcmV0dXJuIHRvdGFsX2J5dGVzX2NvcGllZDsKLX0KLQotLypAfSovCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fQlVGRkVSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2J1ZmZlcmVkX3JlYWRfc3RyZWFtLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9idWZmZXJlZF9yZWFkX3N0cmVhbS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNjRmYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2J1ZmZlcmVkX3JlYWRfc3RyZWFtLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vLwotLy8gYnVmZmVyZWRfcmVhZF9zdHJlYW0uaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19CVUZGRVJFRF9SRUFEX1NUUkVBTV9IUFAKLSNkZWZpbmUgQVNJT19CVUZGRVJFRF9SRUFEX1NUUkVBTV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2J1ZmZlcmVkX3JlYWRfc3RyZWFtX2Z3ZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9idWZmZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3Jlc2l6ZV9ndWFyZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyZWRfc3RyZWFtX3N0b3JhZ2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90eXBlX3RyYWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIEFkZHMgYnVmZmVyaW5nIHRvIHRoZSByZWFkLXJlbGF0ZWQgb3BlcmF0aW9ucyBvZiBhIHN0cmVhbS4KLS8qKgotICogVGhlIGJ1ZmZlcmVkX3JlYWRfc3RyZWFtIGNsYXNzIHRlbXBsYXRlIGNhbiBiZSB1c2VkIHRvIGFkZCBidWZmZXJpbmcgdG8gdGhlCi0gKiBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHJlYWQgb3BlcmF0aW9ucyBvZiBhIHN0cmVhbS4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIEFzeW5jUmVhZFN0cmVhbSwgQXN5bmNXcml0ZVN0cmVhbSwgU3RyZWFtLCBTeW5jUmVhZFN0cmVhbSwgU3luY1dyaXRlU3RyZWFtLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotY2xhc3MgYnVmZmVyZWRfcmVhZF9zdHJlYW0KLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgdHlwZSBvZiB0aGUgbmV4dCBsYXllci4KLSAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPFN0cmVhbT46OnR5cGUgbmV4dF9sYXllcl90eXBlOwotCi0gIC8vLyBUaGUgdHlwZSBvZiB0aGUgbG93ZXN0IGxheWVyLgotICB0eXBlZGVmIHR5cGVuYW1lIG5leHRfbGF5ZXJfdHlwZTo6bG93ZXN0X2xheWVyX3R5cGUgbG93ZXN0X2xheWVyX3R5cGU7Ci0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplLgotICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgZGVmYXVsdF9idWZmZXJfc2l6ZSA9IGltcGxlbWVudGF0aW9uX2RlZmluZWQ7Ci0jZWxzZQotICBBU0lPX1NUQVRJQ19DT05TVEFOVChzdGQ6OnNpemVfdCwgZGVmYXVsdF9idWZmZXJfc2l6ZSA9IDEwMjQpOwotI2VuZGlmCi0KLSAgLy8vIENvbnN0cnVjdCwgcGFzc2luZyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IHRvIGluaXRpYWxpc2UgdGhlIG5leHQgbGF5ZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmc+Ci0gIGV4cGxpY2l0IGJ1ZmZlcmVkX3JlYWRfc3RyZWFtKEFyZyYgYSkKLSAgICA6IG5leHRfbGF5ZXJfKGEpLAotICAgICAgc3RvcmFnZV8oZGVmYXVsdF9idWZmZXJfc2l6ZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCwgcGFzc2luZyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IHRvIGluaXRpYWxpc2UgdGhlIG5leHQgbGF5ZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmc+Ci0gIGJ1ZmZlcmVkX3JlYWRfc3RyZWFtKEFyZyYgYSwgc3RkOjpzaXplX3QgYnVmZmVyX3NpemUpCi0gICAgOiBuZXh0X2xheWVyXyhhKSwKLSAgICAgIHN0b3JhZ2VfKGJ1ZmZlcl9zaXplKQotICB7Ci0gIH0KLQotICAvLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IGxheWVyLgotICBuZXh0X2xheWVyX3R5cGUmIG5leHRfbGF5ZXIoKQotICB7Ci0gICAgcmV0dXJuIG5leHRfbGF5ZXJfOwotICB9Ci0KLSAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyLgotICBsb3dlc3RfbGF5ZXJfdHlwZSYgbG93ZXN0X2xheWVyKCkKLSAgewotICAgIHJldHVybiBuZXh0X2xheWVyXy5sb3dlc3RfbGF5ZXIoKTsKLSAgfQotCi0gIC8vLyBHZXQgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllci4KLSAgY29uc3QgbG93ZXN0X2xheWVyX3R5cGUmIGxvd2VzdF9sYXllcigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl8ubG93ZXN0X2xheWVyKCk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBpb19zZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0LgotICBhc2lvOjppb19zZXJ2aWNlJiBnZXRfaW9fc2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl8uZ2V0X2lvX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vLyBDbG9zZSB0aGUgc3RyZWFtLgotICB2b2lkIGNsb3NlKCkKLSAgewotICAgIG5leHRfbGF5ZXJfLmNsb3NlKCk7Ci0gIH0KLQotICAvLy8gQ2xvc2UgdGhlIHN0cmVhbS4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjbG9zZShhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBuZXh0X2xheWVyXy5jbG9zZShlYyk7Ci0gIH0KLQotICAvLy8gV3JpdGUgdGhlIGdpdmVuIGRhdGEgdG8gdGhlIHN0cmVhbS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gIC8vLyBUaHJvd3MgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl8ud3JpdGVfc29tZShidWZmZXJzKTsKLSAgfQotCi0gIC8vLyBXcml0ZSB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgc3RyZWFtLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwKLSAgLy8vIG9yIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBuZXh0X2xheWVyXy53cml0ZV9zb21lKGJ1ZmZlcnMsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd3JpdGUuIFRoZSBkYXRhIGJlaW5nIHdyaXR0ZW4gbXVzdCBiZSB2YWxpZCBmb3IgdGhlCi0gIC8vLyBsaWZldGltZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY193cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBuZXh0X2xheWVyXy5hc3luY193cml0ZV9zb21lKGJ1ZmZlcnMsCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKEFTSU9fSEFORExFUl9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICAgICAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkpKGluaXQuaGFuZGxlcikpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLSAgLy8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHNvbWUgZGF0YS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBsYWNlZCBpbiB0aGUKLSAgLy8vIGJ1ZmZlciBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLiBUaHJvd3MgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUuCi0gIHN0ZDo6c2l6ZV90IGZpbGwoKTsKLQotICAvLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggc29tZSBkYXRhLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGxhY2VkIGluIHRoZQotICAvLy8gYnVmZmVyIGFzIGEgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24sIG9yIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gIHN0ZDo6c2l6ZV90IGZpbGwoYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgZmlsbC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfZmlsbChBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKTsKLQotICAvLy8gUmVhZCBzb21lIGRhdGEgZnJvbSB0aGUgc3RyZWFtLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gVGhyb3dzCi0gIC8vLyBhbiBleGNlcHRpb24gb24gZmFpbHVyZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVhZF9zb21lKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycyk7Ci0KLSAgLy8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHN0cmVhbS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgMCBpZgotICAvLy8gYW4gZXJyb3Igb2NjdXJyZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWFkLiBUaGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkCi0gIC8vLyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVhZF9zb21lKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpOwotCi0gIC8vLyBQZWVrIGF0IHRoZSBpbmNvbWluZyBkYXRhIG9uIHRoZSBzdHJlYW0uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgotICAvLy8gVGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBwZWVrKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycyk7Ci0KLSAgLy8vIFBlZWsgYXQgdGhlIGluY29taW5nIGRhdGEgb24gdGhlIHN0cmVhbS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsCi0gIC8vLyBvciAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBwZWVrKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gRGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHN0ZDo6c2l6ZV90IGluX2F2YWlsKCkKLSAgewotICAgIHJldHVybiBzdG9yYWdlXy5zaXplKCk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHN0ZDo6c2l6ZV90IGluX2F2YWlsKGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIHN0b3JhZ2VfLnNpemUoKTsKLSAgfQotCi1wcml2YXRlOgotICAvLy8gQ29weSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGJ1ZmZlci4KLSAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IGNvcHkoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotICB7Ci0gICAgc3RkOjpzaXplX3QgYnl0ZXNfY29waWVkID0gYXNpbzo6YnVmZmVyX2NvcHkoCi0gICAgICAgIGJ1ZmZlcnMsIHN0b3JhZ2VfLmRhdGEoKSwgc3RvcmFnZV8uc2l6ZSgpKTsKLSAgICBzdG9yYWdlXy5jb25zdW1lKGJ5dGVzX2NvcGllZCk7Ci0gICAgcmV0dXJuIGJ5dGVzX2NvcGllZDsKLSAgfQotCi0gIC8vLyBDb3B5IGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGJ1ZmZlciwgd2l0aG91dAotICAvLy8gcmVtb3ZpbmcgdGhlIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgYnVmZmVyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgLy8vIGNvcGllZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcGVla19jb3B5KGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLSAgewotICAgIHJldHVybiBhc2lvOjpidWZmZXJfY29weShidWZmZXJzLCBzdG9yYWdlXy5kYXRhKCksIHN0b3JhZ2VfLnNpemUoKSk7Ci0gIH0KLQotICAvLy8gVGhlIG5leHQgbGF5ZXIuCi0gIFN0cmVhbSBuZXh0X2xheWVyXzsKLQotICAvLyBUaGUgZGF0YSBpbiB0aGUgYnVmZmVyLgotICBkZXRhaWw6OmJ1ZmZlcmVkX3N0cmVhbV9zdG9yYWdlIHN0b3JhZ2VfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9pbXBsL2J1ZmZlcmVkX3JlYWRfc3RyZWFtLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fQlVGRkVSRURfUkVBRF9TVFJFQU1fSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYnVmZmVyZWRfcmVhZF9zdHJlYW1fZndkLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9idWZmZXJlZF9yZWFkX3N0cmVhbV9md2QuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODY2NGM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9idWZmZXJlZF9yZWFkX3N0cmVhbV9md2QuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8KLS8vIGJ1ZmZlcmVkX3JlYWRfc3RyZWFtX2Z3ZC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19CVUZGRVJFRF9SRUFEX1NUUkVBTV9GV0RfSFBQCi0jZGVmaW5lIEFTSU9fQlVGRkVSRURfUkVBRF9TVFJFQU1fRldEX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLWNsYXNzIGJ1ZmZlcmVkX3JlYWRfc3RyZWFtOwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyBBU0lPX0JVRkZFUkVEX1JFQURfU1RSRUFNX0ZXRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9idWZmZXJlZF9zdHJlYW0uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2J1ZmZlcmVkX3N0cmVhbS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzVkYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2J1ZmZlcmVkX3N0cmVhbS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLy8KLS8vIGJ1ZmZlcmVkX3N0cmVhbS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19CVUZGRVJFRF9TVFJFQU1fSFBQCi0jZGVmaW5lIEFTSU9fQlVGRkVSRURfU1RSRUFNX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotI2luY2x1ZGUgImFzaW8vYnVmZmVyZWRfcmVhZF9zdHJlYW0uaHBwIgotI2luY2x1ZGUgImFzaW8vYnVmZmVyZWRfd3JpdGVfc3RyZWFtLmhwcCIKLSNpbmNsdWRlICJhc2lvL2J1ZmZlcmVkX3N0cmVhbV9md2QuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0vLy8gQWRkcyBidWZmZXJpbmcgdG8gdGhlIHJlYWQtIGFuZCB3cml0ZS1yZWxhdGVkIG9wZXJhdGlvbnMgb2YgYSBzdHJlYW0uCi0vKioKLSAqIFRoZSBidWZmZXJlZF9zdHJlYW0gY2xhc3MgdGVtcGxhdGUgY2FuIGJlIHVzZWQgdG8gYWRkIGJ1ZmZlcmluZyB0byB0aGUKLSAqIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyBvZiBhIHN0cmVhbS4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIEFzeW5jUmVhZFN0cmVhbSwgQXN5bmNXcml0ZVN0cmVhbSwgU3RyZWFtLCBTeW5jUmVhZFN0cmVhbSwgU3luY1dyaXRlU3RyZWFtLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotY2xhc3MgYnVmZmVyZWRfc3RyZWFtCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICAvLy8gVGhlIHR5cGUgb2YgdGhlIG5leHQgbGF5ZXIuCi0gIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxTdHJlYW0+Ojp0eXBlIG5leHRfbGF5ZXJfdHlwZTsKLQotICAvLy8gVGhlIHR5cGUgb2YgdGhlIGxvd2VzdCBsYXllci4KLSAgdHlwZWRlZiB0eXBlbmFtZSBuZXh0X2xheWVyX3R5cGU6Omxvd2VzdF9sYXllcl90eXBlIGxvd2VzdF9sYXllcl90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3QsIHBhc3NpbmcgdGhlIHNwZWNpZmllZCBhcmd1bWVudCB0byBpbml0aWFsaXNlIHRoZSBuZXh0IGxheWVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnPgotICBleHBsaWNpdCBidWZmZXJlZF9zdHJlYW0oQXJnJiBhKQotICAgIDogaW5uZXJfc3RyZWFtX2ltcGxfKGEpLAotICAgICAgc3RyZWFtX2ltcGxfKGlubmVyX3N0cmVhbV9pbXBsXykKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCwgcGFzc2luZyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IHRvIGluaXRpYWxpc2UgdGhlIG5leHQgbGF5ZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmc+Ci0gIGV4cGxpY2l0IGJ1ZmZlcmVkX3N0cmVhbShBcmcmIGEsIHN0ZDo6c2l6ZV90IHJlYWRfYnVmZmVyX3NpemUsCi0gICAgICBzdGQ6OnNpemVfdCB3cml0ZV9idWZmZXJfc2l6ZSkKLSAgICA6IGlubmVyX3N0cmVhbV9pbXBsXyhhLCB3cml0ZV9idWZmZXJfc2l6ZSksCi0gICAgICBzdHJlYW1faW1wbF8oaW5uZXJfc3RyZWFtX2ltcGxfLCByZWFkX2J1ZmZlcl9zaXplKQotICB7Ci0gIH0KLQotICAvLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IGxheWVyLgotICBuZXh0X2xheWVyX3R5cGUmIG5leHRfbGF5ZXIoKQotICB7Ci0gICAgcmV0dXJuIHN0cmVhbV9pbXBsXy5uZXh0X2xheWVyKCkubmV4dF9sYXllcigpOwotICB9Ci0KLSAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyLgotICBsb3dlc3RfbGF5ZXJfdHlwZSYgbG93ZXN0X2xheWVyKCkKLSAgewotICAgIHJldHVybiBzdHJlYW1faW1wbF8ubG93ZXN0X2xheWVyKCk7Ci0gIH0KLQotICAvLy8gR2V0IGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIuCi0gIGNvbnN0IGxvd2VzdF9sYXllcl90eXBlJiBsb3dlc3RfbGF5ZXIoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHN0cmVhbV9pbXBsXy5sb3dlc3RfbGF5ZXIoKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIGlvX3NlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QuCi0gIGFzaW86OmlvX3NlcnZpY2UmIGdldF9pb19zZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBzdHJlYW1faW1wbF8uZ2V0X2lvX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vLyBDbG9zZSB0aGUgc3RyZWFtLgotICB2b2lkIGNsb3NlKCkKLSAgewotICAgIHN0cmVhbV9pbXBsXy5jbG9zZSgpOwotICB9Ci0KLSAgLy8vIENsb3NlIHRoZSBzdHJlYW0uCi0gIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc3RyZWFtX2ltcGxfLmNsb3NlKGVjKTsKLSAgfQotCi0gIC8vLyBGbHVzaCBhbGwgZGF0YSBmcm9tIHRoZSBidWZmZXIgdG8gdGhlIG5leHQgbGF5ZXIuIFJldHVybnMgdGhlIG51bWJlciBvZgotICAvLy8gYnl0ZXMgd3JpdHRlbiB0byB0aGUgbmV4dCBsYXllciBvbiB0aGUgbGFzdCB3cml0ZSBvcGVyYXRpb24uIFRocm93cyBhbgotICAvLy8gZXhjZXB0aW9uIG9uIGZhaWx1cmUuCi0gIHN0ZDo6c2l6ZV90IGZsdXNoKCkKLSAgewotICAgIHJldHVybiBzdHJlYW1faW1wbF8ubmV4dF9sYXllcigpLmZsdXNoKCk7Ci0gIH0KLQotICAvLy8gRmx1c2ggYWxsIGRhdGEgZnJvbSB0aGUgYnVmZmVyIHRvIHRoZSBuZXh0IGxheWVyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgLy8vIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIG5leHQgbGF5ZXIgb24gdGhlIGxhc3Qgd3JpdGUgb3BlcmF0aW9uLCBvciAwIGlmIGFuCi0gIC8vLyBlcnJvciBvY2N1cnJlZC4KLSAgc3RkOjpzaXplX3QgZmx1c2goYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc3RyZWFtX2ltcGxfLm5leHRfbGF5ZXIoKS5mbHVzaChlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIGZsdXNoLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX2ZsdXNoKEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIHN0cmVhbV9pbXBsXy5uZXh0X2xheWVyKCkuYXN5bmNfZmx1c2goCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8vIFdyaXRlIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBzdHJlYW0uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgotICAvLy8gVGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgd3JpdGVfc29tZShjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotICB7Ci0gICAgcmV0dXJuIHN0cmVhbV9pbXBsXy53cml0ZV9zb21lKGJ1ZmZlcnMpOwotICB9Ci0KLSAgLy8vIFdyaXRlIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBzdHJlYW0uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLAotICAvLy8gb3IgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHdyaXRlX3NvbWUoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHN0cmVhbV9pbXBsXy53cml0ZV9zb21lKGJ1ZmZlcnMsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd3JpdGUuIFRoZSBkYXRhIGJlaW5nIHdyaXR0ZW4gbXVzdCBiZSB2YWxpZCBmb3IgdGhlCi0gIC8vLyBsaWZldGltZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY193cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIHJldHVybiBzdHJlYW1faW1wbF8uYXN5bmNfd3JpdGVfc29tZShidWZmZXJzLAotICAgICAgICBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBGaWxsIHRoZSBidWZmZXIgd2l0aCBzb21lIGRhdGEuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBwbGFjZWQgaW4gdGhlCi0gIC8vLyBidWZmZXIgYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLgotICBzdGQ6OnNpemVfdCBmaWxsKCkKLSAgewotICAgIHJldHVybiBzdHJlYW1faW1wbF8uZmlsbCgpOwotICB9Ci0KLSAgLy8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHNvbWUgZGF0YS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBsYWNlZCBpbiB0aGUKLSAgLy8vIGJ1ZmZlciBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLCBvciAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICBzdGQ6OnNpemVfdCBmaWxsKGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHN0cmVhbV9pbXBsXy5maWxsKGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgZmlsbC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfZmlsbChBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIHN0cmVhbV9pbXBsXy5hc3luY19maWxsKEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLQotICAvLy8gUmVhZCBzb21lIGRhdGEgZnJvbSB0aGUgc3RyZWFtLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gVGhyb3dzCi0gIC8vLyBhbiBleGNlcHRpb24gb24gZmFpbHVyZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVhZF9zb21lKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLSAgewotICAgIHJldHVybiBzdHJlYW1faW1wbF8ucmVhZF9zb21lKGJ1ZmZlcnMpOwotICB9Ci0KLSAgLy8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHN0cmVhbS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgMCBpZgotICAvLy8gYW4gZXJyb3Igb2NjdXJyZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzdHJlYW1faW1wbF8ucmVhZF9zb21lKGJ1ZmZlcnMsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVhZC4gVGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZAotICAvLy8gbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIHN0cmVhbV9pbXBsXy5hc3luY19yZWFkX3NvbWUoYnVmZmVycywKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBQZWVrIGF0IHRoZSBpbmNvbWluZyBkYXRhIG9uIHRoZSBzdHJlYW0uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgotICAvLy8gVGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBwZWVrKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLSAgewotICAgIHJldHVybiBzdHJlYW1faW1wbF8ucGVlayhidWZmZXJzKTsKLSAgfQotCi0gIC8vLyBQZWVrIGF0IHRoZSBpbmNvbWluZyBkYXRhIG9uIHRoZSBzdHJlYW0uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLAotICAvLy8gb3IgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcGVlayhjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzdHJlYW1faW1wbF8ucGVlayhidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHN0ZDo6c2l6ZV90IGluX2F2YWlsKCkKLSAgewotICAgIHJldHVybiBzdHJlYW1faW1wbF8uaW5fYXZhaWwoKTsKLSAgfQotCi0gIC8vLyBEZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgbWF5IGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4KLSAgc3RkOjpzaXplX3QgaW5fYXZhaWwoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc3RyZWFtX2ltcGxfLmluX2F2YWlsKGVjKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBUaGUgYnVmZmVyZWQgd3JpdGUgc3RyZWFtLgotICB0eXBlZGVmIGJ1ZmZlcmVkX3dyaXRlX3N0cmVhbTxTdHJlYW0+IHdyaXRlX3N0cmVhbV90eXBlOwotICB3cml0ZV9zdHJlYW1fdHlwZSBpbm5lcl9zdHJlYW1faW1wbF87Ci0KLSAgLy8gVGhlIGJ1ZmZlcmVkIHJlYWQgc3RyZWFtLgotICB0eXBlZGVmIGJ1ZmZlcmVkX3JlYWRfc3RyZWFtPHdyaXRlX3N0cmVhbV90eXBlJj4gcmVhZF9zdHJlYW1fdHlwZTsKLSAgcmVhZF9zdHJlYW1fdHlwZSBzdHJlYW1faW1wbF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0JVRkZFUkVEX1NUUkVBTV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9idWZmZXJlZF9zdHJlYW1fZndkLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9idWZmZXJlZF9zdHJlYW1fZndkLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJhZDBhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYnVmZmVyZWRfc3RyZWFtX2Z3ZC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLwotLy8gYnVmZmVyZWRfc3RyZWFtX2Z3ZC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fQlVGRkVSRURfU1RSRUFNX0ZXRF9IUFAKLSNkZWZpbmUgQVNJT19CVUZGRVJFRF9TVFJFQU1fRldEX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLWNsYXNzIGJ1ZmZlcmVkX3N0cmVhbTsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gQVNJT19CVUZGRVJFRF9TVFJFQU1fRldEX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2J1ZmZlcmVkX3dyaXRlX3N0cmVhbS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYnVmZmVyZWRfd3JpdGVfc3RyZWFtLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjOWQ5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYnVmZmVyZWRfd3JpdGVfc3RyZWFtLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vLwotLy8gYnVmZmVyZWRfd3JpdGVfc3RyZWFtLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0JVRkZFUkVEX1dSSVRFX1NUUkVBTV9IUFAKLSNkZWZpbmUgQVNJT19CVUZGRVJFRF9XUklURV9TVFJFQU1fSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2J1ZmZlcmVkX3dyaXRlX3N0cmVhbV9md2QuaHBwIgotI2luY2x1ZGUgImFzaW8vYnVmZmVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2NvbXBsZXRpb25fY29uZGl0aW9uLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcmVkX3N0cmVhbV9zdG9yYWdlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdHlwZV90cmFpdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby93cml0ZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBBZGRzIGJ1ZmZlcmluZyB0byB0aGUgd3JpdGUtcmVsYXRlZCBvcGVyYXRpb25zIG9mIGEgc3RyZWFtLgotLyoqCi0gKiBUaGUgYnVmZmVyZWRfd3JpdGVfc3RyZWFtIGNsYXNzIHRlbXBsYXRlIGNhbiBiZSB1c2VkIHRvIGFkZCBidWZmZXJpbmcgdG8gdGhlCi0gKiBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHdyaXRlIG9wZXJhdGlvbnMgb2YgYSBzdHJlYW0uCi0gKgotICogQHBhciBUaHJlYWQgU2FmZXR5Ci0gKiBAZSBEaXN0aW5jdCBAZSBvYmplY3RzOiBTYWZlLkBuCi0gKiBAZSBTaGFyZWQgQGUgb2JqZWN0czogVW5zYWZlLgotICoKLSAqIEBwYXIgQ29uY2VwdHM6Ci0gKiBBc3luY1JlYWRTdHJlYW0sIEFzeW5jV3JpdGVTdHJlYW0sIFN0cmVhbSwgU3luY1JlYWRTdHJlYW0sIFN5bmNXcml0ZVN0cmVhbS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLWNsYXNzIGJ1ZmZlcmVkX3dyaXRlX3N0cmVhbQotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8vIFRoZSB0eXBlIG9mIHRoZSBuZXh0IGxheWVyLgotICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8U3RyZWFtPjo6dHlwZSBuZXh0X2xheWVyX3R5cGU7Ci0KLSAgLy8vIFRoZSB0eXBlIG9mIHRoZSBsb3dlc3QgbGF5ZXIuCi0gIHR5cGVkZWYgdHlwZW5hbWUgbmV4dF9sYXllcl90eXBlOjpsb3dlc3RfbGF5ZXJfdHlwZSBsb3dlc3RfbGF5ZXJfdHlwZTsKLQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gVGhlIGRlZmF1bHQgYnVmZmVyIHNpemUuCi0gIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBkZWZhdWx0X2J1ZmZlcl9zaXplID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZDsKLSNlbHNlCi0gIEFTSU9fU1RBVElDX0NPTlNUQU5UKHN0ZDo6c2l6ZV90LCBkZWZhdWx0X2J1ZmZlcl9zaXplID0gMTAyNCk7Ci0jZW5kaWYKLQotICAvLy8gQ29uc3RydWN0LCBwYXNzaW5nIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQgdG8gaW5pdGlhbGlzZSB0aGUgbmV4dCBsYXllci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZz4KLSAgZXhwbGljaXQgYnVmZmVyZWRfd3JpdGVfc3RyZWFtKEFyZyYgYSkKLSAgICA6IG5leHRfbGF5ZXJfKGEpLAotICAgICAgc3RvcmFnZV8oZGVmYXVsdF9idWZmZXJfc2l6ZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCwgcGFzc2luZyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IHRvIGluaXRpYWxpc2UgdGhlIG5leHQgbGF5ZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmc+Ci0gIGJ1ZmZlcmVkX3dyaXRlX3N0cmVhbShBcmcmIGEsIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplKQotICAgIDogbmV4dF9sYXllcl8oYSksCi0gICAgICBzdG9yYWdlXyhidWZmZXJfc2l6ZSkKLSAgewotICB9Ci0KLSAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgbmV4dCBsYXllci4KLSAgbmV4dF9sYXllcl90eXBlJiBuZXh0X2xheWVyKCkKLSAgewotICAgIHJldHVybiBuZXh0X2xheWVyXzsKLSAgfQotCi0gIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllci4KLSAgbG93ZXN0X2xheWVyX3R5cGUmIGxvd2VzdF9sYXllcigpCi0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl8ubG93ZXN0X2xheWVyKCk7Ci0gIH0KLQotICAvLy8gR2V0IGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIuCi0gIGNvbnN0IGxvd2VzdF9sYXllcl90eXBlJiBsb3dlc3RfbGF5ZXIoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIG5leHRfbGF5ZXJfLmxvd2VzdF9sYXllcigpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgaW9fc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdC4KLSAgYXNpbzo6aW9fc2VydmljZSYgZ2V0X2lvX3NlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5leHRfbGF5ZXJfLmdldF9pb19zZXJ2aWNlKCk7Ci0gIH0KLQotICAvLy8gQ2xvc2UgdGhlIHN0cmVhbS4KLSAgdm9pZCBjbG9zZSgpCi0gIHsKLSAgICBuZXh0X2xheWVyXy5jbG9zZSgpOwotICB9Ci0KLSAgLy8vIENsb3NlIHRoZSBzdHJlYW0uCi0gIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl8uY2xvc2UoZWMpOwotICB9Ci0KLSAgLy8vIEZsdXNoIGFsbCBkYXRhIGZyb20gdGhlIGJ1ZmZlciB0byB0aGUgbmV4dCBsYXllci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gIC8vLyBieXRlcyB3cml0dGVuIHRvIHRoZSBuZXh0IGxheWVyIG9uIHRoZSBsYXN0IHdyaXRlIG9wZXJhdGlvbi4gVGhyb3dzIGFuCi0gIC8vLyBleGNlcHRpb24gb24gZmFpbHVyZS4KLSAgc3RkOjpzaXplX3QgZmx1c2goKTsKLQotICAvLy8gRmx1c2ggYWxsIGRhdGEgZnJvbSB0aGUgYnVmZmVyIHRvIHRoZSBuZXh0IGxheWVyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgLy8vIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIG5leHQgbGF5ZXIgb24gdGhlIGxhc3Qgd3JpdGUgb3BlcmF0aW9uLCBvciAwIGlmIGFuCi0gIC8vLyBlcnJvciBvY2N1cnJlZC4KLSAgc3RkOjpzaXplX3QgZmx1c2goYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgZmx1c2guCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfZmx1c2goQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpOwotCi0gIC8vLyBXcml0ZSB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgc3RyZWFtLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KLSAgLy8vIFRocm93cyBhbiBleGNlcHRpb24gb24gZmFpbHVyZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHdyaXRlX3NvbWUoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycyk7Ci0KLSAgLy8vIFdyaXRlIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBzdHJlYW0uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLAotICAvLy8gb3IgMCBpZiBhbiBlcnJvciBvY2N1cnJlZCBhbmQgdGhlIGVycm9yIGhhbmRsZXIgZGlkIG5vdCB0aHJvdy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHdyaXRlX3NvbWUoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdyaXRlLiBUaGUgZGF0YSBiZWluZyB3cml0dGVuIG11c3QgYmUgdmFsaWQgZm9yIHRoZQotICAvLy8gbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfd3JpdGVfc29tZShjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpOwotCi0gIC8vLyBSZWFkIHNvbWUgZGF0YSBmcm9tIHRoZSBzdHJlYW0uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiBUaHJvd3MKLSAgLy8vIGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWFkX3NvbWUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotICB7Ci0gICAgcmV0dXJuIG5leHRfbGF5ZXJfLnJlYWRfc29tZShidWZmZXJzKTsKLSAgfQotCi0gIC8vLyBSZWFkIHNvbWUgZGF0YSBmcm9tIHRoZSBzdHJlYW0uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIDAgaWYKLSAgLy8vIGFuIGVycm9yIG9jY3VycmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWFkX3NvbWUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl8ucmVhZF9zb21lKGJ1ZmZlcnMsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVhZC4gVGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZAotICAvLy8gbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBuZXh0X2xheWVyXy5hc3luY19yZWFkX3NvbWUoYnVmZmVycywKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoQVNJT19IQU5ETEVSX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICAgICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpKShpbml0LmhhbmRsZXIpKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBQZWVrIGF0IHRoZSBpbmNvbWluZyBkYXRhIG9uIHRoZSBzdHJlYW0uIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgotICAvLy8gVGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBwZWVrKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLSAgewotICAgIHJldHVybiBuZXh0X2xheWVyXy5wZWVrKGJ1ZmZlcnMpOwotICB9Ci0KLSAgLy8vIFBlZWsgYXQgdGhlIGluY29taW5nIGRhdGEgb24gdGhlIHN0cmVhbS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsCi0gIC8vLyBvciAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBwZWVrKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIG5leHRfbGF5ZXJfLnBlZWsoYnVmZmVycywgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgcmVhZCB3aXRob3V0IGJsb2NraW5nLgotICBzdGQ6OnNpemVfdCBpbl9hdmFpbCgpCi0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl8uaW5fYXZhaWwoKTsKLSAgfQotCi0gIC8vLyBEZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgbWF5IGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4KLSAgc3RkOjpzaXplX3QgaW5fYXZhaWwoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl8uaW5fYXZhaWwoZWMpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vLyBDb3B5IGRhdGEgaW50byB0aGUgaW50ZXJuYWwgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgYnVmZmVyLgotICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IGNvcHkoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycyk7Ci0KLSAgLy8vIFRoZSBuZXh0IGxheWVyLgotICBTdHJlYW0gbmV4dF9sYXllcl87Ci0KLSAgLy8gVGhlIGRhdGEgaW4gdGhlIGJ1ZmZlci4KLSAgZGV0YWlsOjpidWZmZXJlZF9zdHJlYW1fc3RvcmFnZSBzdG9yYWdlXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vaW1wbC9idWZmZXJlZF93cml0ZV9zdHJlYW0uaHBwIgotCi0jZW5kaWYgLy8gQVNJT19CVUZGRVJFRF9XUklURV9TVFJFQU1fSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYnVmZmVyZWRfd3JpdGVfc3RyZWFtX2Z3ZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYnVmZmVyZWRfd3JpdGVfc3RyZWFtX2Z3ZC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNzM4MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2J1ZmZlcmVkX3dyaXRlX3N0cmVhbV9md2QuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8KLS8vIGJ1ZmZlcmVkX3dyaXRlX3N0cmVhbV9md2QuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0JVRkZFUkVEX1dSSVRFX1NUUkVBTV9GV0RfSFBQCi0jZGVmaW5lIEFTSU9fQlVGRkVSRURfV1JJVEVfU1RSRUFNX0ZXRF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0+Ci1jbGFzcyBidWZmZXJlZF93cml0ZV9zdHJlYW07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIEFTSU9fQlVGRkVSRURfV1JJVEVfU1RSRUFNX0ZXRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9idWZmZXJzX2l0ZXJhdG9yLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9idWZmZXJzX2l0ZXJhdG9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwNGIxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vYnVmZmVyc19pdGVyYXRvci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLy8KLS8vIGJ1ZmZlcnNfaXRlcmF0b3IuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0JVRkZFUlNfSVRFUkFUT1JfSFBQCi0jZGVmaW5lIEFTSU9fQlVGRkVSU19JVEVSQVRPUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgImFzaW8vYnVmZmVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hc3NlcnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3R5cGVfdHJhaXRzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotbmFtZXNwYWNlIGRldGFpbAotewotICB0ZW1wbGF0ZSA8Ym9vbCBJc011dGFibGU+Ci0gIHN0cnVjdCBidWZmZXJzX2l0ZXJhdG9yX3R5cGVzX2hlbHBlcjsKLQotICB0ZW1wbGF0ZSA8PgotICBzdHJ1Y3QgYnVmZmVyc19pdGVyYXRvcl90eXBlc19oZWxwZXI8ZmFsc2U+Ci0gIHsKLSAgICB0eXBlZGVmIGNvbnN0X2J1ZmZlciBidWZmZXJfdHlwZTsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQnl0ZVR5cGU+Ci0gICAgc3RydWN0IGJ5dGVfdHlwZQotICAgIHsKLSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2NvbnN0PEJ5dGVUeXBlPjo6dHlwZSB0eXBlOwotICAgIH07Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPD4KLSAgc3RydWN0IGJ1ZmZlcnNfaXRlcmF0b3JfdHlwZXNfaGVscGVyPHRydWU+Ci0gIHsKLSAgICB0eXBlZGVmIG11dGFibGVfYnVmZmVyIGJ1ZmZlcl90eXBlOwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBCeXRlVHlwZT4KLSAgICBzdHJ1Y3QgYnl0ZV90eXBlCi0gICAgewotICAgICAgdHlwZWRlZiBCeXRlVHlwZSB0eXBlOwotICAgIH07Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBCeXRlVHlwZT4KLSAgc3RydWN0IGJ1ZmZlcnNfaXRlcmF0b3JfdHlwZXMKLSAgewotICAgIGVudW0KLSAgICB7Ci0gICAgICBpc19tdXRhYmxlID0gaXNfY29udmVydGlibGU8Ci0gICAgICAgICAgdHlwZW5hbWUgQnVmZmVyU2VxdWVuY2U6OnZhbHVlX3R5cGUsCi0gICAgICAgICAgbXV0YWJsZV9idWZmZXI+Ojp2YWx1ZQotICAgIH07Ci0gICAgdHlwZWRlZiBidWZmZXJzX2l0ZXJhdG9yX3R5cGVzX2hlbHBlcjxpc19tdXRhYmxlPiBoZWxwZXI7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBoZWxwZXI6OmJ1ZmZlcl90eXBlIGJ1ZmZlcl90eXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgaGVscGVyOjp0ZW1wbGF0ZSBieXRlX3R5cGU8Qnl0ZVR5cGU+Ojp0eXBlIGJ5dGVfdHlwZTsKLSAgfTsKLX0KLQotLy8vIEEgcmFuZG9tIGFjY2VzcyBpdGVyYXRvciBvdmVyIHRoZSBieXRlcyBpbiBhIGJ1ZmZlciBzZXF1ZW5jZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgQnl0ZVR5cGUgPSBjaGFyPgotY2xhc3MgYnVmZmVyc19pdGVyYXRvcgotewotcHJpdmF0ZToKLSAgdHlwZWRlZiB0eXBlbmFtZSBkZXRhaWw6OmJ1ZmZlcnNfaXRlcmF0b3JfdHlwZXM8Ci0gICAgICBCdWZmZXJTZXF1ZW5jZSwgQnl0ZVR5cGU+OjpidWZmZXJfdHlwZSBidWZmZXJfdHlwZTsKLQotcHVibGljOgotICAvLy8gVGhlIHR5cGUgdXNlZCBmb3IgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIGl0ZXJhdG9ycy4KLSAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7Ci0KLSAgLy8vIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IHRoZSBpdGVyYXRvci4KLSAgdHlwZWRlZiBCeXRlVHlwZSB2YWx1ZV90eXBlOwotCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIG9wZXJhdG9yLT4oKSB0byB0aGUgaXRlcmF0b3IuCi0gIC8qKgotICAgKiBJZiB0aGUgYnVmZmVyIHNlcXVlbmNlIHN0b3JlcyBidWZmZXIgb2JqZWN0cyB0aGF0IGFyZSBjb252ZXJ0aWJsZSB0bwotICAgKiBtdXRhYmxlX2J1ZmZlciwgdGhpcyBpcyBhIHBvaW50ZXIgdG8gYSBub24tY29uc3QgQnl0ZVR5cGUuIE90aGVyd2lzZSwgYQotICAgKiBwb2ludGVyIHRvIGEgY29uc3QgQnl0ZVR5cGUuCi0gICAqLwotICB0eXBlZGVmIGNvbnN0X29yX25vbl9jb25zdF9CeXRlVHlwZSogcG9pbnRlcjsKLSNlbHNlIC8vIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIHR5cGVuYW1lIGRldGFpbDo6YnVmZmVyc19pdGVyYXRvcl90eXBlczwKLSAgICAgIEJ1ZmZlclNlcXVlbmNlLCBCeXRlVHlwZT46OmJ5dGVfdHlwZSogcG9pbnRlcjsKLSNlbmRpZiAvLyBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBvcGVyYXRvciooKSB0byB0aGUgaXRlcmF0b3IuCi0gIC8qKgotICAgKiBJZiB0aGUgYnVmZmVyIHNlcXVlbmNlIHN0b3JlcyBidWZmZXIgb2JqZWN0cyB0aGF0IGFyZSBjb252ZXJ0aWJsZSB0bwotICAgKiBtdXRhYmxlX2J1ZmZlciwgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIG5vbi1jb25zdCBCeXRlVHlwZS4gT3RoZXJ3aXNlLCBhCi0gICAqIHJlZmVyZW5jZSB0byBhIGNvbnN0IEJ5dGVUeXBlLgotICAgKi8KLSAgdHlwZWRlZiBjb25zdF9vcl9ub25fY29uc3RfQnl0ZVR5cGUmIHJlZmVyZW5jZTsKLSNlbHNlIC8vIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIHR5cGVuYW1lIGRldGFpbDo6YnVmZmVyc19pdGVyYXRvcl90eXBlczwKLSAgICAgIEJ1ZmZlclNlcXVlbmNlLCBCeXRlVHlwZT46OmJ5dGVfdHlwZSYgcmVmZXJlbmNlOwotI2VuZGlmIC8vIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0gIC8vLyBUaGUgaXRlcmF0b3IgY2F0ZWdvcnkuCi0gIHR5cGVkZWYgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLQotICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhbiBpdGVyYXRvciBpbiBhbiB1bmRlZmluZWQgc3RhdGUuCi0gIGJ1ZmZlcnNfaXRlcmF0b3IoKQotICAgIDogY3VycmVudF9idWZmZXJfKCksCi0gICAgICBjdXJyZW50X2J1ZmZlcl9wb3NpdGlvbl8oMCksCi0gICAgICBiZWdpbl8oKSwKLSAgICAgIGN1cnJlbnRfKCksCi0gICAgICBlbmRfKCksCi0gICAgICBwb3NpdGlvbl8oMCkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbiBpdGVyYXRvciByZXByZXNlbnRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVycycgZGF0YS4KLSAgc3RhdGljIGJ1ZmZlcnNfaXRlcmF0b3IgYmVnaW4oY29uc3QgQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA9PSAzKQotICAgIF9fYXR0cmlidXRlX18gKChfX25vaW5saW5lX18pKQotI2VuZGlmIC8vIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPT0gMykKLSAgewotICAgIGJ1ZmZlcnNfaXRlcmF0b3IgbmV3X2l0ZXI7Ci0gICAgbmV3X2l0ZXIuYmVnaW5fID0gYnVmZmVycy5iZWdpbigpOwotICAgIG5ld19pdGVyLmN1cnJlbnRfID0gYnVmZmVycy5iZWdpbigpOwotICAgIG5ld19pdGVyLmVuZF8gPSBidWZmZXJzLmVuZCgpOwotICAgIHdoaWxlIChuZXdfaXRlci5jdXJyZW50XyAhPSBuZXdfaXRlci5lbmRfKQotICAgIHsKLSAgICAgIG5ld19pdGVyLmN1cnJlbnRfYnVmZmVyXyA9ICpuZXdfaXRlci5jdXJyZW50XzsKLSAgICAgIGlmIChhc2lvOjpidWZmZXJfc2l6ZShuZXdfaXRlci5jdXJyZW50X2J1ZmZlcl8pID4gMCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICArK25ld19pdGVyLmN1cnJlbnRfOwotICAgIH0KLSAgICByZXR1cm4gbmV3X2l0ZXI7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHJlcHJlc2VudGluZyB0aGUgZW5kIG9mIHRoZSBidWZmZXJzJyBkYXRhLgotICBzdGF0aWMgYnVmZmVyc19pdGVyYXRvciBlbmQoY29uc3QgQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA9PSAzKQotICAgIF9fYXR0cmlidXRlX18gKChfX25vaW5saW5lX18pKQotI2VuZGlmIC8vIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPT0gMykKLSAgewotICAgIGJ1ZmZlcnNfaXRlcmF0b3IgbmV3X2l0ZXI7Ci0gICAgbmV3X2l0ZXIuYmVnaW5fID0gYnVmZmVycy5iZWdpbigpOwotICAgIG5ld19pdGVyLmN1cnJlbnRfID0gYnVmZmVycy5iZWdpbigpOwotICAgIG5ld19pdGVyLmVuZF8gPSBidWZmZXJzLmVuZCgpOwotICAgIHdoaWxlIChuZXdfaXRlci5jdXJyZW50XyAhPSBuZXdfaXRlci5lbmRfKQotICAgIHsKLSAgICAgIGJ1ZmZlcl90eXBlIGJ1ZmZlciA9ICpuZXdfaXRlci5jdXJyZW50XzsKLSAgICAgIG5ld19pdGVyLnBvc2l0aW9uXyArPSBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXIpOwotICAgICAgKytuZXdfaXRlci5jdXJyZW50XzsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld19pdGVyOwotICB9Ci0KLSAgLy8vIERlcmVmZXJlbmNlIGFuIGl0ZXJhdG9yLgotICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QKLSAgewotICAgIHJldHVybiBkZXJlZmVyZW5jZSgpOwotICB9Ci0KLSAgLy8vIERlcmVmZXJlbmNlIGFuIGl0ZXJhdG9yLgotICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICZkZXJlZmVyZW5jZSgpOwotICB9Ci0KLSAgLy8vIEFjY2VzcyBhbiBpbmRpdmlkdWFsIGVsZW1lbnQuCi0gIHJlZmVyZW5jZSBvcGVyYXRvcltdKHN0ZDo6cHRyZGlmZl90IGRpZmZlcmVuY2UpIGNvbnN0Ci0gIHsKLSAgICBidWZmZXJzX2l0ZXJhdG9yIHRtcCgqdGhpcyk7Ci0gICAgdG1wLmFkdmFuY2UoZGlmZmVyZW5jZSk7Ci0gICAgcmV0dXJuICp0bXA7Ci0gIH0KLQotICAvLy8gSW5jcmVtZW50IG9wZXJhdG9yIChwcmVmaXgpLgotICBidWZmZXJzX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkKLSAgewotICAgIGluY3JlbWVudCgpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vLyBJbmNyZW1lbnQgb3BlcmF0b3IgKHBvc3RmaXgpLgotICBidWZmZXJzX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQotICB7Ci0gICAgYnVmZmVyc19pdGVyYXRvciB0bXAoKnRoaXMpOwotICAgICsrKnRoaXM7Ci0gICAgcmV0dXJuIHRtcDsKLSAgfQotCi0gIC8vLyBEZWNyZW1lbnQgb3BlcmF0b3IgKHByZWZpeCkuCi0gIGJ1ZmZlcnNfaXRlcmF0b3ImIG9wZXJhdG9yLS0oKQotICB7Ci0gICAgZGVjcmVtZW50KCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8vIERlY3JlbWVudCBvcGVyYXRvciAocG9zdGZpeCkuCi0gIGJ1ZmZlcnNfaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpCi0gIHsKLSAgICBidWZmZXJzX2l0ZXJhdG9yIHRtcCgqdGhpcyk7Ci0gICAgLS0qdGhpczsKLSAgICByZXR1cm4gdG1wOwotICB9Ci0KLSAgLy8vIEFkZGl0aW9uIG9wZXJhdG9yLgotICBidWZmZXJzX2l0ZXJhdG9yJiBvcGVyYXRvcis9KHN0ZDo6cHRyZGlmZl90IGRpZmZlcmVuY2UpCi0gIHsKLSAgICBhZHZhbmNlKGRpZmZlcmVuY2UpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KLSAgYnVmZmVyc19pdGVyYXRvciYgb3BlcmF0b3ItPShzdGQ6OnB0cmRpZmZfdCBkaWZmZXJlbmNlKQotICB7Ci0gICAgYWR2YW5jZSgtZGlmZmVyZW5jZSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8vIEFkZGl0aW9uIG9wZXJhdG9yLgotICBmcmllbmQgYnVmZmVyc19pdGVyYXRvciBvcGVyYXRvcisoY29uc3QgYnVmZmVyc19pdGVyYXRvciYgaXRlciwKLSAgICAgIHN0ZDo6cHRyZGlmZl90IGRpZmZlcmVuY2UpCi0gIHsKLSAgICBidWZmZXJzX2l0ZXJhdG9yIHRtcChpdGVyKTsKLSAgICB0bXAuYWR2YW5jZShkaWZmZXJlbmNlKTsKLSAgICByZXR1cm4gdG1wOwotICB9Ci0KLSAgLy8vIEFkZGl0aW9uIG9wZXJhdG9yLgotICBmcmllbmQgYnVmZmVyc19pdGVyYXRvciBvcGVyYXRvcisoc3RkOjpwdHJkaWZmX3QgZGlmZmVyZW5jZSwKLSAgICAgIGNvbnN0IGJ1ZmZlcnNfaXRlcmF0b3ImIGl0ZXIpCi0gIHsKLSAgICBidWZmZXJzX2l0ZXJhdG9yIHRtcChpdGVyKTsKLSAgICB0bXAuYWR2YW5jZShkaWZmZXJlbmNlKTsKLSAgICByZXR1cm4gdG1wOwotICB9Ci0KLSAgLy8vIFN1YnRyYWN0aW9uIG9wZXJhdG9yLgotICBmcmllbmQgYnVmZmVyc19pdGVyYXRvciBvcGVyYXRvci0oY29uc3QgYnVmZmVyc19pdGVyYXRvciYgaXRlciwKLSAgICAgIHN0ZDo6cHRyZGlmZl90IGRpZmZlcmVuY2UpCi0gIHsKLSAgICBidWZmZXJzX2l0ZXJhdG9yIHRtcChpdGVyKTsKLSAgICB0bXAuYWR2YW5jZSgtZGlmZmVyZW5jZSk7Ci0gICAgcmV0dXJuIHRtcDsKLSAgfQotCi0gIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KLSAgZnJpZW5kIHN0ZDo6cHRyZGlmZl90IG9wZXJhdG9yLShjb25zdCBidWZmZXJzX2l0ZXJhdG9yJiBhLAotICAgICAgY29uc3QgYnVmZmVyc19pdGVyYXRvciYgYikKLSAgewotICAgIHJldHVybiBiLmRpc3RhbmNlX3RvKGEpOwotICB9Ci0KLSAgLy8vIFRlc3QgdHdvIGl0ZXJhdG9ycyBmb3IgZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgYnVmZmVyc19pdGVyYXRvciYgYSwgY29uc3QgYnVmZmVyc19pdGVyYXRvciYgYikKLSAgewotICAgIHJldHVybiBhLmVxdWFsKGIpOwotICB9Ci0KLSAgLy8vIFRlc3QgdHdvIGl0ZXJhdG9ycyBmb3IgaW5lcXVhbGl0eS4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBidWZmZXJzX2l0ZXJhdG9yJiBhLCBjb25zdCBidWZmZXJzX2l0ZXJhdG9yJiBiKQotICB7Ci0gICAgcmV0dXJuICFhLmVxdWFsKGIpOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgdHdvIGl0ZXJhdG9ycy4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGJ1ZmZlcnNfaXRlcmF0b3ImIGEsIGNvbnN0IGJ1ZmZlcnNfaXRlcmF0b3ImIGIpCi0gIHsKLSAgICByZXR1cm4gYS5kaXN0YW5jZV90byhiKSA+IDA7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSB0d28gaXRlcmF0b3JzLgotICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGJ1ZmZlcnNfaXRlcmF0b3ImIGEsIGNvbnN0IGJ1ZmZlcnNfaXRlcmF0b3ImIGIpCi0gIHsKLSAgICByZXR1cm4gIShiIDwgYSk7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSB0d28gaXRlcmF0b3JzLgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgYnVmZmVyc19pdGVyYXRvciYgYSwgY29uc3QgYnVmZmVyc19pdGVyYXRvciYgYikKLSAgewotICAgIHJldHVybiBiIDwgYTsKLSAgfQotCi0gIC8vLyBDb21wYXJlIHR3byBpdGVyYXRvcnMuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3QgYnVmZmVyc19pdGVyYXRvciYgYSwgY29uc3QgYnVmZmVyc19pdGVyYXRvciYgYikKLSAgewotICAgIHJldHVybiAhKGEgPCBiKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBEZXJlZmVyZW5jZSB0aGUgaXRlcmF0b3IuCi0gIHJlZmVyZW5jZSBkZXJlZmVyZW5jZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gYnVmZmVyX2Nhc3Q8cG9pbnRlcj4oY3VycmVudF9idWZmZXJfKVtjdXJyZW50X2J1ZmZlcl9wb3NpdGlvbl9dOwotICB9Ci0KLSAgLy8gQ29tcGFyZSB0d28gaXRlcmF0b3JzIGZvciBlcXVhbGl0eS4KLSAgYm9vbCBlcXVhbChjb25zdCBidWZmZXJzX2l0ZXJhdG9yJiBvdGhlcikgY29uc3QKLSAgewotICAgIHJldHVybiBwb3NpdGlvbl8gPT0gb3RoZXIucG9zaXRpb25fOwotICB9Ci0KLSAgLy8gSW5jcmVtZW50IHRoZSBpdGVyYXRvci4KLSAgdm9pZCBpbmNyZW1lbnQoKQotICB7Ci0gICAgQVNJT19BU1NFUlQoY3VycmVudF8gIT0gZW5kXyAmJiAiaXRlcmF0b3Igb3V0IG9mIGJvdW5kcyIpOwotICAgICsrcG9zaXRpb25fOwotCi0gICAgLy8gQ2hlY2sgaWYgdGhlIGluY3JlbWVudCBjYW4gYmUgc2F0aXNmaWVkIGJ5IHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAgICArK2N1cnJlbnRfYnVmZmVyX3Bvc2l0aW9uXzsKLSAgICBpZiAoY3VycmVudF9idWZmZXJfcG9zaXRpb25fICE9IGFzaW86OmJ1ZmZlcl9zaXplKGN1cnJlbnRfYnVmZmVyXykpCi0gICAgICByZXR1cm47Ci0KLSAgICAvLyBGaW5kIHRoZSBuZXh0IG5vbi1lbXB0eSBidWZmZXIuCi0gICAgKytjdXJyZW50XzsKLSAgICBjdXJyZW50X2J1ZmZlcl9wb3NpdGlvbl8gPSAwOwotICAgIHdoaWxlIChjdXJyZW50XyAhPSBlbmRfKQotICAgIHsKLSAgICAgIGN1cnJlbnRfYnVmZmVyXyA9ICpjdXJyZW50XzsKLSAgICAgIGlmIChhc2lvOjpidWZmZXJfc2l6ZShjdXJyZW50X2J1ZmZlcl8pID4gMCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgKytjdXJyZW50XzsKLSAgICB9Ci0gIH0KLQotICAvLyBEZWNyZW1lbnQgdGhlIGl0ZXJhdG9yLgotICB2b2lkIGRlY3JlbWVudCgpCi0gIHsKLSAgICBBU0lPX0FTU0VSVChwb3NpdGlvbl8gPiAwICYmICJpdGVyYXRvciBvdXQgb2YgYm91bmRzIik7Ci0gICAgLS1wb3NpdGlvbl87Ci0KLSAgICAvLyBDaGVjayBpZiB0aGUgZGVjcmVtZW50IGNhbiBiZSBzYXRpc2ZpZWQgYnkgdGhlIGN1cnJlbnQgYnVmZmVyLgotICAgIGlmIChjdXJyZW50X2J1ZmZlcl9wb3NpdGlvbl8gIT0gMCkKLSAgICB7Ci0gICAgICAtLWN1cnJlbnRfYnVmZmVyX3Bvc2l0aW9uXzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGaW5kIHRoZSBwcmV2aW91cyBub24tZW1wdHkgYnVmZmVyLgotICAgIHR5cGVuYW1lIEJ1ZmZlclNlcXVlbmNlOjpjb25zdF9pdGVyYXRvciBpdGVyID0gY3VycmVudF87Ci0gICAgd2hpbGUgKGl0ZXIgIT0gYmVnaW5fKQotICAgIHsKLSAgICAgIC0taXRlcjsKLSAgICAgIGJ1ZmZlcl90eXBlIGJ1ZmZlciA9ICppdGVyOwotICAgICAgc3RkOjpzaXplX3QgYnVmZmVyX3NpemUgPSBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXIpOwotICAgICAgaWYgKGJ1ZmZlcl9zaXplID4gMCkKLSAgICAgIHsKLSAgICAgICAgY3VycmVudF8gPSBpdGVyOwotICAgICAgICBjdXJyZW50X2J1ZmZlcl8gPSBidWZmZXI7Ci0gICAgICAgIGN1cnJlbnRfYnVmZmVyX3Bvc2l0aW9uXyA9IGJ1ZmZlcl9zaXplIC0gMTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIEFkdmFuY2UgdGhlIGl0ZXJhdG9yIGJ5IHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UuCi0gIHZvaWQgYWR2YW5jZShzdGQ6OnB0cmRpZmZfdCBuKQotICB7Ci0gICAgaWYgKG4gPiAwKQotICAgIHsKLSAgICAgIEFTSU9fQVNTRVJUKGN1cnJlbnRfICE9IGVuZF8gJiYgIml0ZXJhdG9yIG91dCBvZiBib3VuZHMiKTsKLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIHN0ZDo6cHRyZGlmZl90IGN1cnJlbnRfYnVmZmVyX2JhbGFuY2UKLSAgICAgICAgICA9IGFzaW86OmJ1ZmZlcl9zaXplKGN1cnJlbnRfYnVmZmVyXykKLSAgICAgICAgICAtIGN1cnJlbnRfYnVmZmVyX3Bvc2l0aW9uXzsKLQotICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWR2YW5jZSBjYW4gYmUgc2F0aXNmaWVkIGJ5IHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAgICAgICAgaWYgKGN1cnJlbnRfYnVmZmVyX2JhbGFuY2UgPiBuKQotICAgICAgICB7Ci0gICAgICAgICAgcG9zaXRpb25fICs9IG47Ci0gICAgICAgICAgY3VycmVudF9idWZmZXJfcG9zaXRpb25fICs9IG47Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIHBvc2l0aW9uLgotICAgICAgICBuIC09IGN1cnJlbnRfYnVmZmVyX2JhbGFuY2U7Ci0gICAgICAgIHBvc2l0aW9uXyArPSBjdXJyZW50X2J1ZmZlcl9iYWxhbmNlOwotCi0gICAgICAgIC8vIE1vdmUgdG8gbmV4dCBidWZmZXIuIElmIGl0IGlzIGVtcHR5IHRoZW4gaXQgd2lsbCBiZSBza2lwcGVkIG9uIHRoZQotICAgICAgICAvLyBuZXh0IGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AuCi0gICAgICAgIGlmICgrK2N1cnJlbnRfID09IGVuZF8pCi0gICAgICAgIHsKLSAgICAgICAgICBBU0lPX0FTU0VSVChuID09IDAgJiYgIml0ZXJhdG9yIG91dCBvZiBib3VuZHMiKTsKLSAgICAgICAgICBjdXJyZW50X2J1ZmZlcl8gPSBidWZmZXJfdHlwZSgpOwotICAgICAgICAgIGN1cnJlbnRfYnVmZmVyX3Bvc2l0aW9uXyA9IDA7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJlbnRfYnVmZmVyXyA9ICpjdXJyZW50XzsKLSAgICAgICAgY3VycmVudF9idWZmZXJfcG9zaXRpb25fID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobiA8IDApCi0gICAgewotICAgICAgc3RkOjpzaXplX3QgYWJzX24gPSAtbjsKLSAgICAgIEFTSU9fQVNTRVJUKHBvc2l0aW9uXyA+PSBhYnNfbiAmJiAiaXRlcmF0b3Igb3V0IG9mIGJvdW5kcyIpOwotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFkdmFuY2UgY2FuIGJlIHNhdGlzZmllZCBieSB0aGUgY3VycmVudCBidWZmZXIuCi0gICAgICAgIGlmIChjdXJyZW50X2J1ZmZlcl9wb3NpdGlvbl8gPj0gYWJzX24pCi0gICAgICAgIHsKLSAgICAgICAgICBwb3NpdGlvbl8gLT0gYWJzX247Ci0gICAgICAgICAgY3VycmVudF9idWZmZXJfcG9zaXRpb25fIC09IGFic19uOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSBwb3NpdGlvbi4KLSAgICAgICAgYWJzX24gLT0gY3VycmVudF9idWZmZXJfcG9zaXRpb25fOwotICAgICAgICBwb3NpdGlvbl8gLT0gY3VycmVudF9idWZmZXJfcG9zaXRpb25fOwotCi0gICAgICAgIC8vIENoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVycy4KLSAgICAgICAgaWYgKGN1cnJlbnRfID09IGJlZ2luXykKLSAgICAgICAgewotICAgICAgICAgIEFTSU9fQVNTRVJUKGFic19uID09IDAgJiYgIml0ZXJhdG9yIG91dCBvZiBib3VuZHMiKTsKLSAgICAgICAgICBjdXJyZW50X2J1ZmZlcl9wb3NpdGlvbl8gPSAwOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbmQgdGhlIHByZXZpb3VzIG5vbi1lbXB0eSBidWZmZXIuCi0gICAgICAgIHR5cGVuYW1lIEJ1ZmZlclNlcXVlbmNlOjpjb25zdF9pdGVyYXRvciBpdGVyID0gY3VycmVudF87Ci0gICAgICAgIHdoaWxlIChpdGVyICE9IGJlZ2luXykKLSAgICAgICAgewotICAgICAgICAgIC0taXRlcjsKLSAgICAgICAgICBidWZmZXJfdHlwZSBidWZmZXIgPSAqaXRlcjsKLSAgICAgICAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZSA9IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcik7Ci0gICAgICAgICAgaWYgKGJ1ZmZlcl9zaXplID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjdXJyZW50XyA9IGl0ZXI7Ci0gICAgICAgICAgICBjdXJyZW50X2J1ZmZlcl8gPSBidWZmZXI7Ci0gICAgICAgICAgICBjdXJyZW50X2J1ZmZlcl9wb3NpdGlvbl8gPSBidWZmZXJfc2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIERldGVybWluZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gaXRlcmF0b3JzLgotICBzdGQ6OnB0cmRpZmZfdCBkaXN0YW5jZV90byhjb25zdCBidWZmZXJzX2l0ZXJhdG9yJiBvdGhlcikgY29uc3QKLSAgewotICAgIHJldHVybiBvdGhlci5wb3NpdGlvbl8gLSBwb3NpdGlvbl87Ci0gIH0KLQotICBidWZmZXJfdHlwZSBjdXJyZW50X2J1ZmZlcl87Ci0gIHN0ZDo6c2l6ZV90IGN1cnJlbnRfYnVmZmVyX3Bvc2l0aW9uXzsKLSAgdHlwZW5hbWUgQnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGJlZ2luXzsKLSAgdHlwZW5hbWUgQnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGN1cnJlbnRfOwotICB0eXBlbmFtZSBCdWZmZXJTZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgZW5kXzsKLSAgc3RkOjpzaXplX3QgcG9zaXRpb25fOwotfTsKLQotLy8vIENvbnN0cnVjdCBhbiBpdGVyYXRvciByZXByZXNlbnRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVycycgZGF0YS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBidWZmZXJzX2l0ZXJhdG9yPEJ1ZmZlclNlcXVlbmNlPiBidWZmZXJzX2JlZ2luKAotICAgIGNvbnN0IEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotewotICByZXR1cm4gYnVmZmVyc19pdGVyYXRvcjxCdWZmZXJTZXF1ZW5jZT46OmJlZ2luKGJ1ZmZlcnMpOwotfQotCi0vLy8gQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHJlcHJlc2VudGluZyB0aGUgZW5kIG9mIHRoZSBidWZmZXJzJyBkYXRhLgotdGVtcGxhdGUgPHR5cGVuYW1lIEJ1ZmZlclNlcXVlbmNlPgotaW5saW5lIGJ1ZmZlcnNfaXRlcmF0b3I8QnVmZmVyU2VxdWVuY2U+IGJ1ZmZlcnNfZW5kKAotICAgIGNvbnN0IEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotewotICByZXR1cm4gYnVmZmVyc19pdGVyYXRvcjxCdWZmZXJTZXF1ZW5jZT46OmVuZChidWZmZXJzKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19CVUZGRVJTX0lURVJBVE9SX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2NvbXBsZXRpb25fY29uZGl0aW9uLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9jb21wbGV0aW9uX2NvbmRpdGlvbi5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxN2I0NGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2NvbXBsZXRpb25fY29uZGl0aW9uLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vLwotLy8gY29tcGxldGlvbl9jb25kaXRpb24uaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19DT01QTEVUSU9OX0NPTkRJVElPTl9IUFAKLSNkZWZpbmUgQVNJT19DT01QTEVUSU9OX0NPTkRJVElPTl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLQotLy8gVGhlIGRlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLgotZW51bSBkZWZhdWx0X21heF90cmFuc2Zlcl9zaXplX3QgeyBkZWZhdWx0X21heF90cmFuc2Zlcl9zaXplID0gNjU1MzYgfTsKLQotLy8gQWRhcHQgcmVzdWx0IG9mIG9sZC1zdHlsZSBjb21wbGV0aW9uIGNvbmRpdGlvbnMgKHdoaWNoIGhhZCBhIGJvb2wgcmVzdWx0Ci0vLyB3aGVyZSB0cnVlIGluZGljYXRlZCB0aGF0IHRoZSBvcGVyYXRpb24gd2FzIGNvbXBsZXRlKS4KLWlubGluZSBzdGQ6OnNpemVfdCBhZGFwdF9jb21wbGV0aW9uX2NvbmRpdGlvbl9yZXN1bHQoYm9vbCByZXN1bHQpCi17Ci0gIHJldHVybiByZXN1bHQgPyAwIDogZGVmYXVsdF9tYXhfdHJhbnNmZXJfc2l6ZTsKLX0KLQotLy8gQWRhcHQgcmVzdWx0IG9mIGN1cnJlbnQgY29tcGxldGlvbiBjb25kaXRpb25zICh3aGljaCBoYXZlIGEgc2l6ZV90IHJlc3VsdAotLy8gd2hlcmUgMCBtZWFucyB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLCBhbmQgb3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgdGhlCi0vLyBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlciBvbiB0aGUgbmV4dCB1bmRlcmx5aW5nIG9wZXJhdGlvbikuCi1pbmxpbmUgc3RkOjpzaXplX3QgYWRhcHRfY29tcGxldGlvbl9jb25kaXRpb25fcmVzdWx0KHN0ZDo6c2l6ZV90IHJlc3VsdCkKLXsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY2xhc3MgdHJhbnNmZXJfYWxsX3QKLXsKLXB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OnNpemVfdCByZXN1bHRfdHlwZTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXJyb3I+Ci0gIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgRXJyb3ImIGVyciwgc3RkOjpzaXplX3QpCi0gIHsKLSAgICByZXR1cm4gISFlcnIgPyAwIDogZGVmYXVsdF9tYXhfdHJhbnNmZXJfc2l6ZTsKLSAgfQotfTsKLQotY2xhc3MgdHJhbnNmZXJfYXRfbGVhc3RfdAotewotcHVibGljOgotICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHJlc3VsdF90eXBlOwotCi0gIGV4cGxpY2l0IHRyYW5zZmVyX2F0X2xlYXN0X3Qoc3RkOjpzaXplX3QgbWluaW11bSkKLSAgICA6IG1pbmltdW1fKG1pbmltdW0pCi0gIHsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBFcnJvcj4KLSAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBFcnJvciYgZXJyLCBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCkKLSAgewotICAgIHJldHVybiAoISFlcnIgfHwgYnl0ZXNfdHJhbnNmZXJyZWQgPj0gbWluaW11bV8pCi0gICAgICA/IDAgOiBkZWZhdWx0X21heF90cmFuc2Zlcl9zaXplOwotICB9Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6c2l6ZV90IG1pbmltdW1fOwotfTsKLQotY2xhc3MgdHJhbnNmZXJfZXhhY3RseV90Ci17Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjpzaXplX3QgcmVzdWx0X3R5cGU7Ci0KLSAgZXhwbGljaXQgdHJhbnNmZXJfZXhhY3RseV90KHN0ZDo6c2l6ZV90IHNpemUpCi0gICAgOiBzaXplXyhzaXplKQotICB7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXJyb3I+Ci0gIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgRXJyb3ImIGVyciwgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQpCi0gIHsKLSAgICByZXR1cm4gKCEhZXJyIHx8IGJ5dGVzX3RyYW5zZmVycmVkID49IHNpemVfKSA/IDAgOgotICAgICAgKHNpemVfIC0gYnl0ZXNfdHJhbnNmZXJyZWQgPCBkZWZhdWx0X21heF90cmFuc2Zlcl9zaXplCi0gICAgICAgID8gc2l6ZV8gLSBieXRlc190cmFuc2ZlcnJlZCA6IHN0ZDo6c2l6ZV90KGRlZmF1bHRfbWF4X3RyYW5zZmVyX3NpemUpKTsKLSAgfQotCi1wcml2YXRlOgotICBzdGQ6OnNpemVfdCBzaXplXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi0vKioKLSAqIEBkZWZncm91cCBjb21wbGV0aW9uX2NvbmRpdGlvbiBDb21wbGV0aW9uIENvbmRpdGlvbiBGdW5jdGlvbiBPYmplY3RzCi0gKgotICogRnVuY3Rpb24gb2JqZWN0cyB1c2VkIGZvciBkZXRlcm1pbmluZyB3aGVuIGEgcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gc2hvdWxkCi0gKiBjb21wbGV0ZS4KLSAqLwotLypAeyovCi0KLS8vLyBSZXR1cm4gYSBjb21wbGV0aW9uIGNvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIHJlYWQgb3IKLS8vLyB3cml0ZSBvcGVyYXRpb24gc2hvdWxkIGNvbnRpbnVlIHVudGlsIGFsbCBvZiB0aGUgZGF0YSBoYXMgYmVlbiB0cmFuc2ZlcnJlZCwKLS8vLyBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYW4gb2JqZWN0LCBvZiB1bnNwZWNpZmllZCB0eXBlLCB0aGF0IG1lZXRzCi0gKiBDb21wbGV0aW9uQ29uZGl0aW9uIHJlcXVpcmVtZW50cy4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFJlYWRpbmcgdW50aWwgYSBidWZmZXIgaXMgZnVsbDoKLSAqIEBjb2RlCi0gKiBib29zdDo6YXJyYXk8Y2hhciwgMTI4PiBidWY7Ci0gKiBhc2lvOjplcnJvcl9jb2RlIGVjOwotICogc3RkOjpzaXplX3QgbiA9IGFzaW86OnJlYWQoCi0gKiAgICAgc29jaywgYXNpbzo6YnVmZmVyKGJ1ZiksCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYWxsKCksIGVjKTsKLSAqIGlmIChlYykKLSAqIHsKLSAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gKiB9Ci0gKiBlbHNlCi0gKiB7Ci0gKiAgIC8vIG4gPT0gMTI4Ci0gKiB9Ci0gKiBAZW5kY29kZQotICovCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi11bnNwZWNpZmllZCB0cmFuc2Zlcl9hbGwoKTsKLSNlbHNlCi1pbmxpbmUgZGV0YWlsOjp0cmFuc2Zlcl9hbGxfdCB0cmFuc2Zlcl9hbGwoKQotewotICByZXR1cm4gZGV0YWlsOjp0cmFuc2Zlcl9hbGxfdCgpOwotfQotI2VuZGlmCi0KLS8vLyBSZXR1cm4gYSBjb21wbGV0aW9uIGNvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIHJlYWQgb3IKLS8vLyB3cml0ZSBvcGVyYXRpb24gc2hvdWxkIGNvbnRpbnVlIHVudGlsIGEgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMgaGFzIGJlZW4KLS8vLyB0cmFuc2ZlcnJlZCwgb3IgdW50aWwgYW4gZXJyb3Igb2NjdXJzLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGFuIG9iamVjdCwgb2YgdW5zcGVjaWZpZWQgdHlwZSwgdGhhdCBtZWV0cwotICogQ29tcGxldGlvbkNvbmRpdGlvbiByZXF1aXJlbWVudHMuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBSZWFkaW5nIHVudGlsIGEgYnVmZmVyIGlzIGZ1bGwgb3IgY29udGFpbnMgYXQgbGVhc3QgNjQgYnl0ZXM6Ci0gKiBAY29kZQotICogYm9vc3Q6OmFycmF5PGNoYXIsIDEyOD4gYnVmOwotICogYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAqIHN0ZDo6c2l6ZV90IG4gPSBhc2lvOjpyZWFkKAotICogICAgIHNvY2ssIGFzaW86OmJ1ZmZlcihidWYpLAotICogICAgIGFzaW86OnRyYW5zZmVyX2F0X2xlYXN0KDY0KSwgZWMpOwotICogaWYgKGVjKQotICogewotICogICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAqIH0KLSAqIGVsc2UKLSAqIHsKLSAqICAgLy8gbiA+PSA2NCAmJiBuIDw9IDEyOAotICogfQotICogQGVuZGNvZGUKLSAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotdW5zcGVjaWZpZWQgdHJhbnNmZXJfYXRfbGVhc3Qoc3RkOjpzaXplX3QgbWluaW11bSk7Ci0jZWxzZQotaW5saW5lIGRldGFpbDo6dHJhbnNmZXJfYXRfbGVhc3RfdCB0cmFuc2Zlcl9hdF9sZWFzdChzdGQ6OnNpemVfdCBtaW5pbXVtKQotewotICByZXR1cm4gZGV0YWlsOjp0cmFuc2Zlcl9hdF9sZWFzdF90KG1pbmltdW0pOwotfQotI2VuZGlmCi0KLS8vLyBSZXR1cm4gYSBjb21wbGV0aW9uIGNvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIHJlYWQgb3IKLS8vLyB3cml0ZSBvcGVyYXRpb24gc2hvdWxkIGNvbnRpbnVlIHVudGlsIGFuIGV4YWN0IG51bWJlciBvZiBieXRlcyBoYXMgYmVlbgotLy8vIHRyYW5zZmVycmVkLCBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYW4gb2JqZWN0LCBvZiB1bnNwZWNpZmllZCB0eXBlLCB0aGF0IG1lZXRzCi0gKiBDb21wbGV0aW9uQ29uZGl0aW9uIHJlcXVpcmVtZW50cy4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFJlYWRpbmcgdW50aWwgYSBidWZmZXIgaXMgZnVsbCBvciBjb250YWlucyBleGFjdGx5IDY0IGJ5dGVzOgotICogQGNvZGUKLSAqIGJvb3N0OjphcnJheTxjaGFyLCAxMjg+IGJ1ZjsKLSAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gKiBzdGQ6OnNpemVfdCBuID0gYXNpbzo6cmVhZCgKLSAqICAgICBzb2NrLCBhc2lvOjpidWZmZXIoYnVmKSwKLSAqICAgICBhc2lvOjp0cmFuc2Zlcl9leGFjdGx5KDY0KSwgZWMpOwotICogaWYgKGVjKQotICogewotICogICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAqIH0KLSAqIGVsc2UKLSAqIHsKLSAqICAgLy8gbiA9PSA2NAotICogfQotICogQGVuZGNvZGUKLSAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotdW5zcGVjaWZpZWQgdHJhbnNmZXJfZXhhY3RseShzdGQ6OnNpemVfdCBzaXplKTsKLSNlbHNlCi1pbmxpbmUgZGV0YWlsOjp0cmFuc2Zlcl9leGFjdGx5X3QgdHJhbnNmZXJfZXhhY3RseShzdGQ6OnNpemVfdCBzaXplKQotewotICByZXR1cm4gZGV0YWlsOjp0cmFuc2Zlcl9leGFjdGx5X3Qoc2l6ZSk7Ci19Ci0jZW5kaWYKLQotLypAfSovCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fQ09NUExFVElPTl9DT05ESVRJT05fSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vY29ubmVjdC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vY29ubmVjdC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZjI5YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Nvbm5lY3QuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODIzICswLDAgQEAKLS8vCi0vLyBjb25uZWN0LmhwcAotLy8gfn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19DT05ORUNUX0hQUAotI2RlZmluZSBBU0lPX0NPTk5FQ1RfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc29ja2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLyoqCi0gKiBAZGVmZ3JvdXAgY29ubmVjdCBhc2lvOjpjb25uZWN0Ci0gKgotICogQGJyaWVmIEVzdGFibGlzaGVzIGEgc29ja2V0IGNvbm5lY3Rpb24gYnkgdHJ5aW5nIGVhY2ggZW5kcG9pbnQgaW4gYSBzZXF1ZW5jZS4KLSAqLwotLypAeyovCi0KLS8vLyBFc3RhYmxpc2hlcyBhIHNvY2tldCBjb25uZWN0aW9uIGJ5IHRyeWluZyBlYWNoIGVuZHBvaW50IGluIGEgc2VxdWVuY2UuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gY29ubmVjdCBhIHNvY2tldCB0byBvbmUgb2YgYSBzZXF1ZW5jZSBvZgotICogZW5kcG9pbnRzLiBJdCBkb2VzIHRoaXMgYnkgcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIHNvY2tldCdzIEBjIGNvbm5lY3QgbWVtYmVyCi0gKiBmdW5jdGlvbiwgb25jZSBmb3IgZWFjaCBlbmRwb2ludCBpbiB0aGUgc2VxdWVuY2UsIHVudGlsIGEgY29ubmVjdGlvbiBpcwotICogc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzb2NrZXQgdG8gYmUgY29ubmVjdGVkLiBJZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgb3BlbiwgaXQgd2lsbAotICogYmUgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBiZWdpbiBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgYSBzZXF1ZW5jZSBvZiBlbmRwb2ludHMuCi0gKgotICogQHJldHVybnMgT24gc3VjY2VzcywgYW4gaXRlcmF0b3IgZGVub3RpbmcgdGhlIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQKLSAqIGVuZHBvaW50LiBPdGhlcndpc2UsIHRoZSBlbmQgaXRlcmF0b3IuCi0gKgotICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIElmIHRoZSBzZXF1ZW5jZSBpcwotICogZW1wdHksIHRoZSBhc3NvY2lhdGVkIEBjIGVycm9yX2NvZGUgaXMgYXNpbzo6ZXJyb3I6Om5vdF9mb3VuZC4KLSAqIE90aGVyd2lzZSwgY29udGFpbnMgdGhlIGVycm9yIGZyb20gdGhlIGxhc3QgY29ubmVjdGlvbiBhdHRlbXB0LgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgYXNzdW1lcyB0aGF0IGEgZGVmYXVsdCBjb25zdHJ1Y3RlZCBvYmplY3Qgb2YgdHlwZSBAYwotICogSXRlcmF0b3IgcmVwcmVzZW50cyB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4gVGhpcyBpcyBhIHZhbGlkIGFzc3VtcHRpb24gZm9yCi0gKiBpdGVyYXRvciB0eXBlcyBzdWNoIGFzIEBjIGFzaW86OmlwOjp0Y3A6OnJlc29sdmVyOjppdGVyYXRvci4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIEBjb2RlIHRjcDo6cmVzb2x2ZXIgcihpb19zZXJ2aWNlKTsKLSAqIHRjcDo6cmVzb2x2ZXI6OnF1ZXJ5IHEoImhvc3QiLCAic2VydmljZSIpOwotICogdGNwOjpzb2NrZXQgcyhpb19zZXJ2aWNlKTsKLSAqIGFzaW86OmNvbm5lY3Qocywgci5yZXNvbHZlKHEpKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLCB0eXBlbmFtZSBJdGVyYXRvcj4KLUl0ZXJhdG9yIGNvbm5lY3QoYmFzaWNfc29ja2V0PFByb3RvY29sLCBTb2NrZXRTZXJ2aWNlPiYgcywgSXRlcmF0b3IgYmVnaW4pOwotCi0vLy8gRXN0YWJsaXNoZXMgYSBzb2NrZXQgY29ubmVjdGlvbiBieSB0cnlpbmcgZWFjaCBlbmRwb2ludCBpbiBhIHNlcXVlbmNlLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGNvbm5lY3QgYSBzb2NrZXQgdG8gb25lIG9mIGEgc2VxdWVuY2Ugb2YKLSAqIGVuZHBvaW50cy4gSXQgZG9lcyB0aGlzIGJ5IHJlcGVhdGVkIGNhbGxzIHRvIHRoZSBzb2NrZXQncyBAYyBjb25uZWN0IG1lbWJlcgotICogZnVuY3Rpb24sIG9uY2UgZm9yIGVhY2ggZW5kcG9pbnQgaW4gdGhlIHNlcXVlbmNlLCB1bnRpbCBhIGNvbm5lY3Rpb24gaXMKLSAqIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc29ja2V0IHRvIGJlIGNvbm5lY3RlZC4gSWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IG9wZW4sIGl0IHdpbGwKLSAqIGJlIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gYmVnaW4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIGEgc2VxdWVuY2Ugb2YgZW5kcG9pbnRzLgotICoKLSAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LiBJZiB0aGUgc2VxdWVuY2UgaXMKLSAqIGVtcHR5LCBzZXQgdG8gYXNpbzo6ZXJyb3I6Om5vdF9mb3VuZC4gT3RoZXJ3aXNlLCBjb250YWlucyB0aGUgZXJyb3IKLSAqIGZyb20gdGhlIGxhc3QgY29ubmVjdGlvbiBhdHRlbXB0LgotICoKLSAqIEByZXR1cm5zIE9uIHN1Y2Nlc3MsIGFuIGl0ZXJhdG9yIGRlbm90aW5nIHRoZSBzdWNjZXNzZnVsbHkgY29ubmVjdGVkCi0gKiBlbmRwb2ludC4gT3RoZXJ3aXNlLCB0aGUgZW5kIGl0ZXJhdG9yLgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgYXNzdW1lcyB0aGF0IGEgZGVmYXVsdCBjb25zdHJ1Y3RlZCBvYmplY3Qgb2YgdHlwZSBAYwotICogSXRlcmF0b3IgcmVwcmVzZW50cyB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4gVGhpcyBpcyBhIHZhbGlkIGFzc3VtcHRpb24gZm9yCi0gKiBpdGVyYXRvciB0eXBlcyBzdWNoIGFzIEBjIGFzaW86OmlwOjp0Y3A6OnJlc29sdmVyOjppdGVyYXRvci4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIEBjb2RlIHRjcDo6cmVzb2x2ZXIgcihpb19zZXJ2aWNlKTsKLSAqIHRjcDo6cmVzb2x2ZXI6OnF1ZXJ5IHEoImhvc3QiLCAic2VydmljZSIpOwotICogdGNwOjpzb2NrZXQgcyhpb19zZXJ2aWNlKTsKLSAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gKiBhc2lvOjpjb25uZWN0KHMsIHIucmVzb2x2ZShxKSwgZWMpOwotICogaWYgKGVjKQotICogewotICogICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAqIH0gQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLCB0eXBlbmFtZSBJdGVyYXRvcj4KLUl0ZXJhdG9yIGNvbm5lY3QoYmFzaWNfc29ja2V0PFByb3RvY29sLCBTb2NrZXRTZXJ2aWNlPiYgcywKLSAgICBJdGVyYXRvciBiZWdpbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0vLy8gRXN0YWJsaXNoZXMgYSBzb2NrZXQgY29ubmVjdGlvbiBieSB0cnlpbmcgZWFjaCBlbmRwb2ludCBpbiBhIHNlcXVlbmNlLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGNvbm5lY3QgYSBzb2NrZXQgdG8gb25lIG9mIGEgc2VxdWVuY2Ugb2YKLSAqIGVuZHBvaW50cy4gSXQgZG9lcyB0aGlzIGJ5IHJlcGVhdGVkIGNhbGxzIHRvIHRoZSBzb2NrZXQncyBAYyBjb25uZWN0IG1lbWJlcgotICogZnVuY3Rpb24sIG9uY2UgZm9yIGVhY2ggZW5kcG9pbnQgaW4gdGhlIHNlcXVlbmNlLCB1bnRpbCBhIGNvbm5lY3Rpb24gaXMKLSAqIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc29ja2V0IHRvIGJlIGNvbm5lY3RlZC4gSWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IG9wZW4sIGl0IHdpbGwKLSAqIGJlIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gYmVnaW4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIGEgc2VxdWVuY2Ugb2YgZW5kcG9pbnRzLgotICoKLSAqIEBwYXJhbSBlbmQgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiBhIHNlcXVlbmNlIG9mIGVuZHBvaW50cy4KLSAqCi0gKiBAcmV0dXJucyBPbiBzdWNjZXNzLCBhbiBpdGVyYXRvciBkZW5vdGluZyB0aGUgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZAotICogZW5kcG9pbnQuIE90aGVyd2lzZSwgdGhlIGVuZCBpdGVyYXRvci4KLSAqCi0gKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4gSWYgdGhlIHNlcXVlbmNlIGlzCi0gKiBlbXB0eSwgdGhlIGFzc29jaWF0ZWQgQGMgZXJyb3JfY29kZSBpcyBhc2lvOjplcnJvcjo6bm90X2ZvdW5kLgotICogT3RoZXJ3aXNlLCBjb250YWlucyB0aGUgZXJyb3IgZnJvbSB0aGUgbGFzdCBjb25uZWN0aW9uIGF0dGVtcHQuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBAY29kZSB0Y3A6OnJlc29sdmVyIHIoaW9fc2VydmljZSk7Ci0gKiB0Y3A6OnJlc29sdmVyOjpxdWVyeSBxKCJob3N0IiwgInNlcnZpY2UiKTsKLSAqIHRjcDo6cmVzb2x2ZXI6Oml0ZXJhdG9yIGkgPSByLnJlc29sdmUocSksIGVuZDsKLSAqIHRjcDo6c29ja2V0IHMoaW9fc2VydmljZSk7Ci0gKiBhc2lvOjpjb25uZWN0KHMsIGksIGVuZCk7IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgU29ja2V0U2VydmljZSwgdHlwZW5hbWUgSXRlcmF0b3I+Ci1JdGVyYXRvciBjb25uZWN0KGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU29ja2V0U2VydmljZT4mIHMsCi0gICAgSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCk7Ci0KLS8vLyBFc3RhYmxpc2hlcyBhIHNvY2tldCBjb25uZWN0aW9uIGJ5IHRyeWluZyBlYWNoIGVuZHBvaW50IGluIGEgc2VxdWVuY2UuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gY29ubmVjdCBhIHNvY2tldCB0byBvbmUgb2YgYSBzZXF1ZW5jZSBvZgotICogZW5kcG9pbnRzLiBJdCBkb2VzIHRoaXMgYnkgcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIHNvY2tldCdzIEBjIGNvbm5lY3QgbWVtYmVyCi0gKiBmdW5jdGlvbiwgb25jZSBmb3IgZWFjaCBlbmRwb2ludCBpbiB0aGUgc2VxdWVuY2UsIHVudGlsIGEgY29ubmVjdGlvbiBpcwotICogc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzb2NrZXQgdG8gYmUgY29ubmVjdGVkLiBJZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgb3BlbiwgaXQgd2lsbAotICogYmUgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBiZWdpbiBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgYSBzZXF1ZW5jZSBvZiBlbmRwb2ludHMuCi0gKgotICogQHBhcmFtIGVuZCBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIGEgc2VxdWVuY2Ugb2YgZW5kcG9pbnRzLgotICoKLSAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LiBJZiB0aGUgc2VxdWVuY2UgaXMKLSAqIGVtcHR5LCBzZXQgdG8gYXNpbzo6ZXJyb3I6Om5vdF9mb3VuZC4gT3RoZXJ3aXNlLCBjb250YWlucyB0aGUgZXJyb3IKLSAqIGZyb20gdGhlIGxhc3QgY29ubmVjdGlvbiBhdHRlbXB0LgotICoKLSAqIEByZXR1cm5zIE9uIHN1Y2Nlc3MsIGFuIGl0ZXJhdG9yIGRlbm90aW5nIHRoZSBzdWNjZXNzZnVsbHkgY29ubmVjdGVkCi0gKiBlbmRwb2ludC4gT3RoZXJ3aXNlLCB0aGUgZW5kIGl0ZXJhdG9yLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogQGNvZGUgdGNwOjpyZXNvbHZlciByKGlvX3NlcnZpY2UpOwotICogdGNwOjpyZXNvbHZlcjo6cXVlcnkgcSgiaG9zdCIsICJzZXJ2aWNlIik7Ci0gKiB0Y3A6OnJlc29sdmVyOjppdGVyYXRvciBpID0gci5yZXNvbHZlKHEpLCBlbmQ7Ci0gKiB0Y3A6OnNvY2tldCBzKGlvX3NlcnZpY2UpOwotICogYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAqIGFzaW86OmNvbm5lY3QocywgaSwgZW5kLCBlYyk7Ci0gKiBpZiAoZWMpCi0gKiB7Ci0gKiAgIC8vIEFuIGVycm9yIG9jY3VycmVkLgotICogfSBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsIHR5cGVuYW1lIEl0ZXJhdG9yPgotSXRlcmF0b3IgY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotLy8vIEVzdGFibGlzaGVzIGEgc29ja2V0IGNvbm5lY3Rpb24gYnkgdHJ5aW5nIGVhY2ggZW5kcG9pbnQgaW4gYSBzZXF1ZW5jZS4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBjb25uZWN0IGEgc29ja2V0IHRvIG9uZSBvZiBhIHNlcXVlbmNlIG9mCi0gKiBlbmRwb2ludHMuIEl0IGRvZXMgdGhpcyBieSByZXBlYXRlZCBjYWxscyB0byB0aGUgc29ja2V0J3MgQGMgY29ubmVjdCBtZW1iZXIKLSAqIGZ1bmN0aW9uLCBvbmNlIGZvciBlYWNoIGVuZHBvaW50IGluIHRoZSBzZXF1ZW5jZSwgdW50aWwgYSBjb25uZWN0aW9uIGlzCi0gKiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQuCi0gKgotICogQHBhcmFtIHMgVGhlIHNvY2tldCB0byBiZSBjb25uZWN0ZWQuIElmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBvcGVuLCBpdCB3aWxsCi0gKiBiZSBjbG9zZWQuCi0gKgotICogQHBhcmFtIGJlZ2luIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiBhIHNlcXVlbmNlIG9mIGVuZHBvaW50cy4KLSAqCi0gKiBAcGFyYW0gY29ubmVjdF9jb25kaXRpb24gQSBmdW5jdGlvbiBvYmplY3QgdGhhdCBpcyBjYWxsZWQgcHJpb3IgdG8gZWFjaAotICogY29ubmVjdGlvbiBhdHRlbXB0LiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgbXVzdCBiZToKLSAqIEBjb2RlIEl0ZXJhdG9yIGNvbm5lY3RfY29uZGl0aW9uKAotICogICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICogICAgIEl0ZXJhdG9yIG5leHQpOyBAZW5kY29kZQotICogVGhlIEBjIGVjIHBhcmFtZXRlciBjb250YWlucyB0aGUgcmVzdWx0IGZyb20gdGhlIG1vc3QgcmVjZW50IGNvbm5lY3QKLSAqIG9wZXJhdGlvbi4gQmVmb3JlIHRoZSBmaXJzdCBjb25uZWN0aW9uIGF0dGVtcHQsIEBjIGVjIGlzIGFsd2F5cyBzZXQgdG8KLSAqIGluZGljYXRlIHN1Y2Nlc3MuIFRoZSBAYyBuZXh0IHBhcmFtZXRlciBpcyBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbmV4dAotICogZW5kcG9pbnQgdG8gYmUgdHJpZWQuIFRoZSBmdW5jdGlvbiBvYmplY3Qgc2hvdWxkIHJldHVybiB0aGUgbmV4dCBpdGVyYXRvciwKLSAqIGJ1dCBpcyBwZXJtaXR0ZWQgdG8gcmV0dXJuIGEgZGlmZmVyZW50IGl0ZXJhdG9yIHNvIHRoYXQgZW5kcG9pbnRzIG1heSBiZQotICogc2tpcHBlZC4gVGhlIGltcGxlbWVudGF0aW9uIGd1YXJhbnRlZXMgdGhhdCB0aGUgZnVuY3Rpb24gb2JqZWN0IHdpbGwgbmV2ZXIKLSAqIGJlIGNhbGxlZCB3aXRoIHRoZSBlbmQgaXRlcmF0b3IuCi0gKgotICogQHJldHVybnMgT24gc3VjY2VzcywgYW4gaXRlcmF0b3IgZGVub3RpbmcgdGhlIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQKLSAqIGVuZHBvaW50LiBPdGhlcndpc2UsIHRoZSBlbmQgaXRlcmF0b3IuCi0gKgotICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIElmIHRoZSBzZXF1ZW5jZSBpcwotICogZW1wdHksIHRoZSBhc3NvY2lhdGVkIEBjIGVycm9yX2NvZGUgaXMgYXNpbzo6ZXJyb3I6Om5vdF9mb3VuZC4KLSAqIE90aGVyd2lzZSwgY29udGFpbnMgdGhlIGVycm9yIGZyb20gdGhlIGxhc3QgY29ubmVjdGlvbiBhdHRlbXB0LgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgYXNzdW1lcyB0aGF0IGEgZGVmYXVsdCBjb25zdHJ1Y3RlZCBvYmplY3Qgb2YgdHlwZSBAYwotICogSXRlcmF0b3IgcmVwcmVzZW50cyB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4gVGhpcyBpcyBhIHZhbGlkIGFzc3VtcHRpb24gZm9yCi0gKiBpdGVyYXRvciB0eXBlcyBzdWNoIGFzIEBjIGFzaW86OmlwOjp0Y3A6OnJlc29sdmVyOjppdGVyYXRvci4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRoZSBmb2xsb3dpbmcgY29ubmVjdCBjb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IGNhbiBiZSB1c2VkIHRvIG91dHB1dAotICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluZGl2aWR1YWwgY29ubmVjdGlvbiBhdHRlbXB0czoKLSAqIEBjb2RlIHN0cnVjdCBteV9jb25uZWN0X2NvbmRpdGlvbgotICogewotICogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+Ci0gKiAgIEl0ZXJhdG9yIG9wZXJhdG9yKCkoCi0gKiAgICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAqICAgICAgIEl0ZXJhdG9yIG5leHQpCi0gKiAgIHsKLSAqICAgICBpZiAoZWMpIHN0ZDo6Y291dCA8PCAiRXJyb3I6ICIgPDwgZWMubWVzc2FnZSgpIDw8IHN0ZDo6ZW5kbDsKLSAqICAgICBzdGQ6OmNvdXQgPDwgIlRyeWluZzogIiA8PCBuZXh0LT5lbmRwb2ludCgpIDw8IHN0ZDo6ZW5kbDsKLSAqICAgICByZXR1cm4gbmV4dDsKLSAqICAgfQotICogfTsgQGVuZGNvZGUKLSAqIEl0IHdvdWxkIGJlIHVzZWQgd2l0aCB0aGUgYXNpbzo6Y29ubmVjdCBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICogQGNvZGUgdGNwOjpyZXNvbHZlciByKGlvX3NlcnZpY2UpOwotICogdGNwOjpyZXNvbHZlcjo6cXVlcnkgcSgiaG9zdCIsICJzZXJ2aWNlIik7Ci0gKiB0Y3A6OnNvY2tldCBzKGlvX3NlcnZpY2UpOwotICogdGNwOjpyZXNvbHZlcjo6aXRlcmF0b3IgaSA9IGFzaW86OmNvbm5lY3QoCi0gKiAgICAgcywgci5yZXNvbHZlKHEpLCBteV9jb25uZWN0X2NvbmRpdGlvbigpKTsKLSAqIHN0ZDo6Y291dCA8PCAiQ29ubmVjdGVkIHRvOiAiIDw8IGktPmVuZHBvaW50KCkgPDwgc3RkOjplbmRsOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsCi0gICAgdHlwZW5hbWUgSXRlcmF0b3IsIHR5cGVuYW1lIENvbm5lY3RDb25kaXRpb24+Ci1JdGVyYXRvciBjb25uZWN0KGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU29ja2V0U2VydmljZT4mIHMsCi0gICAgSXRlcmF0b3IgYmVnaW4sIENvbm5lY3RDb25kaXRpb24gY29ubmVjdF9jb25kaXRpb24pOwotCi0vLy8gRXN0YWJsaXNoZXMgYSBzb2NrZXQgY29ubmVjdGlvbiBieSB0cnlpbmcgZWFjaCBlbmRwb2ludCBpbiBhIHNlcXVlbmNlLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGNvbm5lY3QgYSBzb2NrZXQgdG8gb25lIG9mIGEgc2VxdWVuY2Ugb2YKLSAqIGVuZHBvaW50cy4gSXQgZG9lcyB0aGlzIGJ5IHJlcGVhdGVkIGNhbGxzIHRvIHRoZSBzb2NrZXQncyBAYyBjb25uZWN0IG1lbWJlcgotICogZnVuY3Rpb24sIG9uY2UgZm9yIGVhY2ggZW5kcG9pbnQgaW4gdGhlIHNlcXVlbmNlLCB1bnRpbCBhIGNvbm5lY3Rpb24gaXMKLSAqIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc29ja2V0IHRvIGJlIGNvbm5lY3RlZC4gSWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IG9wZW4sIGl0IHdpbGwKLSAqIGJlIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gYmVnaW4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIGEgc2VxdWVuY2Ugb2YgZW5kcG9pbnRzLgotICoKLSAqIEBwYXJhbSBjb25uZWN0X2NvbmRpdGlvbiBBIGZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGNhbGxlZCBwcmlvciB0byBlYWNoCi0gKiBjb25uZWN0aW9uIGF0dGVtcHQuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCBtdXN0IGJlOgotICogQGNvZGUgSXRlcmF0b3IgY29ubmVjdF9jb25kaXRpb24oCi0gKiAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gKiAgICAgSXRlcmF0b3IgbmV4dCk7IEBlbmRjb2RlCi0gKiBUaGUgQGMgZWMgcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSByZXN1bHQgZnJvbSB0aGUgbW9zdCByZWNlbnQgY29ubmVjdAotICogb3BlcmF0aW9uLiBCZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb24gYXR0ZW1wdCwgQGMgZWMgaXMgYWx3YXlzIHNldCB0bwotICogaW5kaWNhdGUgc3VjY2Vzcy4gVGhlIEBjIG5leHQgcGFyYW1ldGVyIGlzIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBuZXh0Ci0gKiBlbmRwb2ludCB0byBiZSB0cmllZC4gVGhlIGZ1bmN0aW9uIG9iamVjdCBzaG91bGQgcmV0dXJuIHRoZSBuZXh0IGl0ZXJhdG9yLAotICogYnV0IGlzIHBlcm1pdHRlZCB0byByZXR1cm4gYSBkaWZmZXJlbnQgaXRlcmF0b3Igc28gdGhhdCBlbmRwb2ludHMgbWF5IGJlCi0gKiBza2lwcGVkLiBUaGUgaW1wbGVtZW50YXRpb24gZ3VhcmFudGVlcyB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3Qgd2lsbCBuZXZlcgotICogYmUgY2FsbGVkIHdpdGggdGhlIGVuZCBpdGVyYXRvci4KLSAqCi0gKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4gSWYgdGhlIHNlcXVlbmNlIGlzCi0gKiBlbXB0eSwgc2V0IHRvIGFzaW86OmVycm9yOjpub3RfZm91bmQuIE90aGVyd2lzZSwgY29udGFpbnMgdGhlIGVycm9yCi0gKiBmcm9tIHRoZSBsYXN0IGNvbm5lY3Rpb24gYXR0ZW1wdC4KLSAqCi0gKiBAcmV0dXJucyBPbiBzdWNjZXNzLCBhbiBpdGVyYXRvciBkZW5vdGluZyB0aGUgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZAotICogZW5kcG9pbnQuIE90aGVyd2lzZSwgdGhlIGVuZCBpdGVyYXRvci4KLSAqCi0gKiBAbm90ZSBUaGlzIG92ZXJsb2FkIGFzc3VtZXMgdGhhdCBhIGRlZmF1bHQgY29uc3RydWN0ZWQgb2JqZWN0IG9mIHR5cGUgQGMKLSAqIEl0ZXJhdG9yIHJlcHJlc2VudHMgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuIFRoaXMgaXMgYSB2YWxpZCBhc3N1bXB0aW9uIGZvcgotICogaXRlcmF0b3IgdHlwZXMgc3VjaCBhcyBAYyBhc2lvOjppcDo6dGNwOjpyZXNvbHZlcjo6aXRlcmF0b3IuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUaGUgZm9sbG93aW5nIGNvbm5lY3QgY29uZGl0aW9uIGZ1bmN0aW9uIG9iamVjdCBjYW4gYmUgdXNlZCB0byBvdXRwdXQKLSAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbmRpdmlkdWFsIGNvbm5lY3Rpb24gYXR0ZW1wdHM6Ci0gKiBAY29kZSBzdHJ1Y3QgbXlfY29ubmVjdF9jb25kaXRpb24KLSAqIHsKLSAqICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgotICogICBJdGVyYXRvciBvcGVyYXRvcigpKAotICogICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gKiAgICAgICBJdGVyYXRvciBuZXh0KQotICogICB7Ci0gKiAgICAgaWYgKGVjKSBzdGQ6OmNvdXQgPDwgIkVycm9yOiAiIDw8IGVjLm1lc3NhZ2UoKSA8PCBzdGQ6OmVuZGw7Ci0gKiAgICAgc3RkOjpjb3V0IDw8ICJUcnlpbmc6ICIgPDwgbmV4dC0+ZW5kcG9pbnQoKSA8PCBzdGQ6OmVuZGw7Ci0gKiAgICAgcmV0dXJuIG5leHQ7Ci0gKiAgIH0KLSAqIH07IEBlbmRjb2RlCi0gKiBJdCB3b3VsZCBiZSB1c2VkIHdpdGggdGhlIGFzaW86OmNvbm5lY3QgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAqIEBjb2RlIHRjcDo6cmVzb2x2ZXIgcihpb19zZXJ2aWNlKTsKLSAqIHRjcDo6cmVzb2x2ZXI6OnF1ZXJ5IHEoImhvc3QiLCAic2VydmljZSIpOwotICogdGNwOjpzb2NrZXQgcyhpb19zZXJ2aWNlKTsKLSAqIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gKiB0Y3A6OnJlc29sdmVyOjppdGVyYXRvciBpID0gYXNpbzo6Y29ubmVjdCgKLSAqICAgICBzLCByLnJlc29sdmUocSksIG15X2Nvbm5lY3RfY29uZGl0aW9uKCksIGVjKTsKLSAqIGlmIChlYykKLSAqIHsKLSAqICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuCi0gKiB9Ci0gKiBlbHNlCi0gKiB7Ci0gKiAgIHN0ZDo6Y291dCA8PCAiQ29ubmVjdGVkIHRvOiAiIDw8IGktPmVuZHBvaW50KCkgPDwgc3RkOjplbmRsOwotICogfSBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsCi0gICAgdHlwZW5hbWUgSXRlcmF0b3IsIHR5cGVuYW1lIENvbm5lY3RDb25kaXRpb24+Ci1JdGVyYXRvciBjb25uZWN0KGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU29ja2V0U2VydmljZT4mIHMsIEl0ZXJhdG9yIGJlZ2luLAotICAgIENvbm5lY3RDb25kaXRpb24gY29ubmVjdF9jb25kaXRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotLy8vIEVzdGFibGlzaGVzIGEgc29ja2V0IGNvbm5lY3Rpb24gYnkgdHJ5aW5nIGVhY2ggZW5kcG9pbnQgaW4gYSBzZXF1ZW5jZS4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBjb25uZWN0IGEgc29ja2V0IHRvIG9uZSBvZiBhIHNlcXVlbmNlIG9mCi0gKiBlbmRwb2ludHMuIEl0IGRvZXMgdGhpcyBieSByZXBlYXRlZCBjYWxscyB0byB0aGUgc29ja2V0J3MgQGMgY29ubmVjdCBtZW1iZXIKLSAqIGZ1bmN0aW9uLCBvbmNlIGZvciBlYWNoIGVuZHBvaW50IGluIHRoZSBzZXF1ZW5jZSwgdW50aWwgYSBjb25uZWN0aW9uIGlzCi0gKiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQuCi0gKgotICogQHBhcmFtIHMgVGhlIHNvY2tldCB0byBiZSBjb25uZWN0ZWQuIElmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBvcGVuLCBpdCB3aWxsCi0gKiBiZSBjbG9zZWQuCi0gKgotICogQHBhcmFtIGJlZ2luIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiBhIHNlcXVlbmNlIG9mIGVuZHBvaW50cy4KLSAqCi0gKiBAcGFyYW0gZW5kIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgYSBzZXF1ZW5jZSBvZiBlbmRwb2ludHMuCi0gKgotICogQHBhcmFtIGNvbm5lY3RfY29uZGl0aW9uIEEgZnVuY3Rpb24gb2JqZWN0IHRoYXQgaXMgY2FsbGVkIHByaW9yIHRvIGVhY2gKLSAqIGNvbm5lY3Rpb24gYXR0ZW1wdC4gVGhlIHNpZ25hdHVyZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0IG11c3QgYmU6Ci0gKiBAY29kZSBJdGVyYXRvciBjb25uZWN0X2NvbmRpdGlvbigKLSAqICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAqICAgICBJdGVyYXRvciBuZXh0KTsgQGVuZGNvZGUKLSAqIFRoZSBAYyBlYyBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIHJlc3VsdCBmcm9tIHRoZSBtb3N0IHJlY2VudCBjb25uZWN0Ci0gKiBvcGVyYXRpb24uIEJlZm9yZSB0aGUgZmlyc3QgY29ubmVjdGlvbiBhdHRlbXB0LCBAYyBlYyBpcyBhbHdheXMgc2V0IHRvCi0gKiBpbmRpY2F0ZSBzdWNjZXNzLiBUaGUgQGMgbmV4dCBwYXJhbWV0ZXIgaXMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIG5leHQKLSAqIGVuZHBvaW50IHRvIGJlIHRyaWVkLiBUaGUgZnVuY3Rpb24gb2JqZWN0IHNob3VsZCByZXR1cm4gdGhlIG5leHQgaXRlcmF0b3IsCi0gKiBidXQgaXMgcGVybWl0dGVkIHRvIHJldHVybiBhIGRpZmZlcmVudCBpdGVyYXRvciBzbyB0aGF0IGVuZHBvaW50cyBtYXkgYmUKLSAqIHNraXBwZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBndWFyYW50ZWVzIHRoYXQgdGhlIGZ1bmN0aW9uIG9iamVjdCB3aWxsIG5ldmVyCi0gKiBiZSBjYWxsZWQgd2l0aCB0aGUgZW5kIGl0ZXJhdG9yLgotICoKLSAqIEByZXR1cm5zIE9uIHN1Y2Nlc3MsIGFuIGl0ZXJhdG9yIGRlbm90aW5nIHRoZSBzdWNjZXNzZnVsbHkgY29ubmVjdGVkCi0gKiBlbmRwb2ludC4gT3RoZXJ3aXNlLCB0aGUgZW5kIGl0ZXJhdG9yLgotICoKLSAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLiBJZiB0aGUgc2VxdWVuY2UgaXMKLSAqIGVtcHR5LCB0aGUgYXNzb2NpYXRlZCBAYyBlcnJvcl9jb2RlIGlzIGFzaW86OmVycm9yOjpub3RfZm91bmQuCi0gKiBPdGhlcndpc2UsIGNvbnRhaW5zIHRoZSBlcnJvciBmcm9tIHRoZSBsYXN0IGNvbm5lY3Rpb24gYXR0ZW1wdC4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRoZSBmb2xsb3dpbmcgY29ubmVjdCBjb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IGNhbiBiZSB1c2VkIHRvIG91dHB1dAotICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluZGl2aWR1YWwgY29ubmVjdGlvbiBhdHRlbXB0czoKLSAqIEBjb2RlIHN0cnVjdCBteV9jb25uZWN0X2NvbmRpdGlvbgotICogewotICogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+Ci0gKiAgIEl0ZXJhdG9yIG9wZXJhdG9yKCkoCi0gKiAgICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAqICAgICAgIEl0ZXJhdG9yIG5leHQpCi0gKiAgIHsKLSAqICAgICBpZiAoZWMpIHN0ZDo6Y291dCA8PCAiRXJyb3I6ICIgPDwgZWMubWVzc2FnZSgpIDw8IHN0ZDo6ZW5kbDsKLSAqICAgICBzdGQ6OmNvdXQgPDwgIlRyeWluZzogIiA8PCBuZXh0LT5lbmRwb2ludCgpIDw8IHN0ZDo6ZW5kbDsKLSAqICAgICByZXR1cm4gbmV4dDsKLSAqICAgfQotICogfTsgQGVuZGNvZGUKLSAqIEl0IHdvdWxkIGJlIHVzZWQgd2l0aCB0aGUgYXNpbzo6Y29ubmVjdCBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICogQGNvZGUgdGNwOjpyZXNvbHZlciByKGlvX3NlcnZpY2UpOwotICogdGNwOjpyZXNvbHZlcjo6cXVlcnkgcSgiaG9zdCIsICJzZXJ2aWNlIik7Ci0gKiB0Y3A6OnJlc29sdmVyOjppdGVyYXRvciBpID0gci5yZXNvbHZlKHEpLCBlbmQ7Ci0gKiB0Y3A6OnNvY2tldCBzKGlvX3NlcnZpY2UpOwotICogaSA9IGFzaW86OmNvbm5lY3QocywgaSwgZW5kLCBteV9jb25uZWN0X2NvbmRpdGlvbigpKTsKLSAqIHN0ZDo6Y291dCA8PCAiQ29ubmVjdGVkIHRvOiAiIDw8IGktPmVuZHBvaW50KCkgPDwgc3RkOjplbmRsOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsCi0gICAgdHlwZW5hbWUgSXRlcmF0b3IsIHR5cGVuYW1lIENvbm5lY3RDb25kaXRpb24+Ci1JdGVyYXRvciBjb25uZWN0KGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU29ja2V0U2VydmljZT4mIHMsIEl0ZXJhdG9yIGJlZ2luLAotICAgIEl0ZXJhdG9yIGVuZCwgQ29ubmVjdENvbmRpdGlvbiBjb25uZWN0X2NvbmRpdGlvbik7Ci0KLS8vLyBFc3RhYmxpc2hlcyBhIHNvY2tldCBjb25uZWN0aW9uIGJ5IHRyeWluZyBlYWNoIGVuZHBvaW50IGluIGEgc2VxdWVuY2UuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gY29ubmVjdCBhIHNvY2tldCB0byBvbmUgb2YgYSBzZXF1ZW5jZSBvZgotICogZW5kcG9pbnRzLiBJdCBkb2VzIHRoaXMgYnkgcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIHNvY2tldCdzIEBjIGNvbm5lY3QgbWVtYmVyCi0gKiBmdW5jdGlvbiwgb25jZSBmb3IgZWFjaCBlbmRwb2ludCBpbiB0aGUgc2VxdWVuY2UsIHVudGlsIGEgY29ubmVjdGlvbiBpcwotICogc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzb2NrZXQgdG8gYmUgY29ubmVjdGVkLiBJZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgb3BlbiwgaXQgd2lsbAotICogYmUgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBiZWdpbiBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgYSBzZXF1ZW5jZSBvZiBlbmRwb2ludHMuCi0gKgotICogQHBhcmFtIGVuZCBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIGEgc2VxdWVuY2Ugb2YgZW5kcG9pbnRzLgotICoKLSAqIEBwYXJhbSBjb25uZWN0X2NvbmRpdGlvbiBBIGZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGNhbGxlZCBwcmlvciB0byBlYWNoCi0gKiBjb25uZWN0aW9uIGF0dGVtcHQuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCBtdXN0IGJlOgotICogQGNvZGUgSXRlcmF0b3IgY29ubmVjdF9jb25kaXRpb24oCi0gKiAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gKiAgICAgSXRlcmF0b3IgbmV4dCk7IEBlbmRjb2RlCi0gKiBUaGUgQGMgZWMgcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSByZXN1bHQgZnJvbSB0aGUgbW9zdCByZWNlbnQgY29ubmVjdAotICogb3BlcmF0aW9uLiBCZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb24gYXR0ZW1wdCwgQGMgZWMgaXMgYWx3YXlzIHNldCB0bwotICogaW5kaWNhdGUgc3VjY2Vzcy4gVGhlIEBjIG5leHQgcGFyYW1ldGVyIGlzIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBuZXh0Ci0gKiBlbmRwb2ludCB0byBiZSB0cmllZC4gVGhlIGZ1bmN0aW9uIG9iamVjdCBzaG91bGQgcmV0dXJuIHRoZSBuZXh0IGl0ZXJhdG9yLAotICogYnV0IGlzIHBlcm1pdHRlZCB0byByZXR1cm4gYSBkaWZmZXJlbnQgaXRlcmF0b3Igc28gdGhhdCBlbmRwb2ludHMgbWF5IGJlCi0gKiBza2lwcGVkLiBUaGUgaW1wbGVtZW50YXRpb24gZ3VhcmFudGVlcyB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3Qgd2lsbCBuZXZlcgotICogYmUgY2FsbGVkIHdpdGggdGhlIGVuZCBpdGVyYXRvci4KLSAqCi0gKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4gSWYgdGhlIHNlcXVlbmNlIGlzCi0gKiBlbXB0eSwgc2V0IHRvIGFzaW86OmVycm9yOjpub3RfZm91bmQuIE90aGVyd2lzZSwgY29udGFpbnMgdGhlIGVycm9yCi0gKiBmcm9tIHRoZSBsYXN0IGNvbm5lY3Rpb24gYXR0ZW1wdC4KLSAqCi0gKiBAcmV0dXJucyBPbiBzdWNjZXNzLCBhbiBpdGVyYXRvciBkZW5vdGluZyB0aGUgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZAotICogZW5kcG9pbnQuIE90aGVyd2lzZSwgdGhlIGVuZCBpdGVyYXRvci4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRoZSBmb2xsb3dpbmcgY29ubmVjdCBjb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IGNhbiBiZSB1c2VkIHRvIG91dHB1dAotICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluZGl2aWR1YWwgY29ubmVjdGlvbiBhdHRlbXB0czoKLSAqIEBjb2RlIHN0cnVjdCBteV9jb25uZWN0X2NvbmRpdGlvbgotICogewotICogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+Ci0gKiAgIEl0ZXJhdG9yIG9wZXJhdG9yKCkoCi0gKiAgICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAqICAgICAgIEl0ZXJhdG9yIG5leHQpCi0gKiAgIHsKLSAqICAgICBpZiAoZWMpIHN0ZDo6Y291dCA8PCAiRXJyb3I6ICIgPDwgZWMubWVzc2FnZSgpIDw8IHN0ZDo6ZW5kbDsKLSAqICAgICBzdGQ6OmNvdXQgPDwgIlRyeWluZzogIiA8PCBuZXh0LT5lbmRwb2ludCgpIDw8IHN0ZDo6ZW5kbDsKLSAqICAgICByZXR1cm4gbmV4dDsKLSAqICAgfQotICogfTsgQGVuZGNvZGUKLSAqIEl0IHdvdWxkIGJlIHVzZWQgd2l0aCB0aGUgYXNpbzo6Y29ubmVjdCBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICogQGNvZGUgdGNwOjpyZXNvbHZlciByKGlvX3NlcnZpY2UpOwotICogdGNwOjpyZXNvbHZlcjo6cXVlcnkgcSgiaG9zdCIsICJzZXJ2aWNlIik7Ci0gKiB0Y3A6OnJlc29sdmVyOjppdGVyYXRvciBpID0gci5yZXNvbHZlKHEpLCBlbmQ7Ci0gKiB0Y3A6OnNvY2tldCBzKGlvX3NlcnZpY2UpOwotICogYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAqIGkgPSBhc2lvOjpjb25uZWN0KHMsIGksIGVuZCwgbXlfY29ubmVjdF9jb25kaXRpb24oKSwgZWMpOwotICogaWYgKGVjKQotICogewotICogICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAqIH0KLSAqIGVsc2UKLSAqIHsKLSAqICAgc3RkOjpjb3V0IDw8ICJDb25uZWN0ZWQgdG86ICIgPDwgaS0+ZW5kcG9pbnQoKSA8PCBzdGQ6OmVuZGw7Ci0gKiB9IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgU29ja2V0U2VydmljZSwKLSAgICB0eXBlbmFtZSBJdGVyYXRvciwgdHlwZW5hbWUgQ29ubmVjdENvbmRpdGlvbj4KLUl0ZXJhdG9yIGNvbm5lY3QoYmFzaWNfc29ja2V0PFByb3RvY29sLCBTb2NrZXRTZXJ2aWNlPiYgcywKLSAgICBJdGVyYXRvciBiZWdpbiwgSXRlcmF0b3IgZW5kLCBDb25uZWN0Q29uZGl0aW9uIGNvbm5lY3RfY29uZGl0aW9uLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotLypAfSovCi0KLS8qKgotICogQGRlZmdyb3VwIGFzeW5jX2Nvbm5lY3QgYXNpbzo6YXN5bmNfY29ubmVjdAotICoKLSAqIEBicmllZiBBc3luY2hyb25vdXNseSBlc3RhYmxpc2hlcyBhIHNvY2tldCBjb25uZWN0aW9uIGJ5IHRyeWluZyBlYWNoCi0gKiBlbmRwb2ludCBpbiBhIHNlcXVlbmNlLgotICovCi0vKkB7Ki8KLQotLy8vIEFzeW5jaHJvbm91c2x5IGVzdGFibGlzaGVzIGEgc29ja2V0IGNvbm5lY3Rpb24gYnkgdHJ5aW5nIGVhY2ggZW5kcG9pbnQgaW4gYQotLy8vIHNlcXVlbmNlLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGNvbm5lY3QgYSBzb2NrZXQgdG8gb25lIG9mIGEgc2VxdWVuY2Ugb2YKLSAqIGVuZHBvaW50cy4gSXQgZG9lcyB0aGlzIGJ5IHJlcGVhdGVkIGNhbGxzIHRvIHRoZSBzb2NrZXQncyBAYyBhc3luY19jb25uZWN0Ci0gKiBtZW1iZXIgZnVuY3Rpb24sIG9uY2UgZm9yIGVhY2ggZW5kcG9pbnQgaW4gdGhlIHNlcXVlbmNlLCB1bnRpbCBhIGNvbm5lY3Rpb24KLSAqIGlzIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc29ja2V0IHRvIGJlIGNvbm5lY3RlZC4gSWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IG9wZW4sIGl0IHdpbGwKLSAqIGJlIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gYmVnaW4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIGEgc2VxdWVuY2Ugb2YgZW5kcG9pbnRzLgotICoKLSAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0IG9wZXJhdGlvbgotICogY29tcGxldGVzLiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24KLSAqIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICogICAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLiBpZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIHNldCB0bwotICogICAvLyBhc2lvOjplcnJvcjo6bm90X2ZvdW5kLiBPdGhlcndpc2UsIGNvbnRhaW5zIHRoZQotICogICAvLyBlcnJvciBmcm9tIHRoZSBsYXN0IGNvbm5lY3Rpb24gYXR0ZW1wdC4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBPbiBzdWNjZXNzLCBhbiBpdGVyYXRvciBkZW5vdGluZyB0aGUgc3VjY2Vzc2Z1bGx5Ci0gKiAgIC8vIGNvbm5lY3RlZCBlbmRwb2ludC4gT3RoZXJ3aXNlLCB0aGUgZW5kIGl0ZXJhdG9yLgotICogICBJdGVyYXRvciBpdGVyYXRvcgotICogKTsgQGVuZGNvZGUKLSAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gKgotICogQG5vdGUgVGhpcyBvdmVybG9hZCBhc3N1bWVzIHRoYXQgYSBkZWZhdWx0IGNvbnN0cnVjdGVkIG9iamVjdCBvZiB0eXBlIEBjCi0gKiBJdGVyYXRvciByZXByZXNlbnRzIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLiBUaGlzIGlzIGEgdmFsaWQgYXNzdW1wdGlvbiBmb3IKLSAqIGl0ZXJhdG9yIHR5cGVzIHN1Y2ggYXMgQGMgYXNpbzo6aXA6OnRjcDo6cmVzb2x2ZXI6Oml0ZXJhdG9yLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogQGNvZGUgdGNwOjpyZXNvbHZlciByKGlvX3NlcnZpY2UpOwotICogdGNwOjpyZXNvbHZlcjo6cXVlcnkgcSgiaG9zdCIsICJzZXJ2aWNlIik7Ci0gKiB0Y3A6OnNvY2tldCBzKGlvX3NlcnZpY2UpOwotICoKLSAqIC8vIC4uLgotICoKLSAqIHIuYXN5bmNfcmVzb2x2ZShxLCByZXNvbHZlX2hhbmRsZXIpOwotICoKLSAqIC8vIC4uLgotICoKLSAqIHZvaWQgcmVzb2x2ZV9oYW5kbGVyKAotICogICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICogICAgIHRjcDo6cmVzb2x2ZXI6Oml0ZXJhdG9yIGkpCi0gKiB7Ci0gKiAgIGlmICghZWMpCi0gKiAgIHsKLSAqICAgICBhc2lvOjphc3luY19jb25uZWN0KHMsIGksIGNvbm5lY3RfaGFuZGxlcik7Ci0gKiAgIH0KLSAqIH0KLSAqCi0gKiAvLyAuLi4KLSAqCi0gKiB2b2lkIGNvbm5lY3RfaGFuZGxlcigKLSAqICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAqICAgICB0Y3A6OnJlc29sdmVyOjppdGVyYXRvciBpKQotICogewotICogICAvLyAuLi4KLSAqIH0gQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLAotICAgIHR5cGVuYW1lIEl0ZXJhdG9yLCB0eXBlbmFtZSBDb21wb3NlZENvbm5lY3RIYW5kbGVyPgotQVNJT19JTklURk5fUkVTVUxUX1RZUEUoQ29tcG9zZWRDb25uZWN0SGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBJdGVyYXRvcikpCi1hc3luY19jb25uZWN0KGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU29ja2V0U2VydmljZT4mIHMsCi0gICAgSXRlcmF0b3IgYmVnaW4sIEFTSU9fTU9WRV9BUkcoQ29tcG9zZWRDb25uZWN0SGFuZGxlcikgaGFuZGxlcik7Ci0KLS8vLyBBc3luY2hyb25vdXNseSBlc3RhYmxpc2hlcyBhIHNvY2tldCBjb25uZWN0aW9uIGJ5IHRyeWluZyBlYWNoIGVuZHBvaW50IGluIGEKLS8vLyBzZXF1ZW5jZS4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBjb25uZWN0IGEgc29ja2V0IHRvIG9uZSBvZiBhIHNlcXVlbmNlIG9mCi0gKiBlbmRwb2ludHMuIEl0IGRvZXMgdGhpcyBieSByZXBlYXRlZCBjYWxscyB0byB0aGUgc29ja2V0J3MgQGMgYXN5bmNfY29ubmVjdAotICogbWVtYmVyIGZ1bmN0aW9uLCBvbmNlIGZvciBlYWNoIGVuZHBvaW50IGluIHRoZSBzZXF1ZW5jZSwgdW50aWwgYSBjb25uZWN0aW9uCi0gKiBpcyBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQuCi0gKgotICogQHBhcmFtIHMgVGhlIHNvY2tldCB0byBiZSBjb25uZWN0ZWQuIElmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBvcGVuLCBpdCB3aWxsCi0gKiBiZSBjbG9zZWQuCi0gKgotICogQHBhcmFtIGJlZ2luIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiBhIHNlcXVlbmNlIG9mIGVuZHBvaW50cy4KLSAqCi0gKiBAcGFyYW0gZW5kIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgYSBzZXF1ZW5jZSBvZiBlbmRwb2ludHMuCi0gKgotICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Qgb3BlcmF0aW9uCi0gKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbgotICogc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uIGlmIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSwgc2V0IHRvCi0gKiAgIC8vIGFzaW86OmVycm9yOjpub3RfZm91bmQuIE90aGVyd2lzZSwgY29udGFpbnMgdGhlCi0gKiAgIC8vIGVycm9yIGZyb20gdGhlIGxhc3QgY29ubmVjdGlvbiBhdHRlbXB0LgotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqCi0gKiAgIC8vIE9uIHN1Y2Nlc3MsIGFuIGl0ZXJhdG9yIGRlbm90aW5nIHRoZSBzdWNjZXNzZnVsbHkKLSAqICAgLy8gY29ubmVjdGVkIGVuZHBvaW50LiBPdGhlcndpc2UsIHRoZSBlbmQgaXRlcmF0b3IuCi0gKiAgIEl0ZXJhdG9yIGl0ZXJhdG9yCi0gKiApOyBAZW5kY29kZQotICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIEBjb2RlIHRjcDo6cmVzb2x2ZXIgcihpb19zZXJ2aWNlKTsKLSAqIHRjcDo6cmVzb2x2ZXI6OnF1ZXJ5IHEoImhvc3QiLCAic2VydmljZSIpOwotICogdGNwOjpzb2NrZXQgcyhpb19zZXJ2aWNlKTsKLSAqCi0gKiAvLyAuLi4KLSAqCi0gKiByLmFzeW5jX3Jlc29sdmUocSwgcmVzb2x2ZV9oYW5kbGVyKTsKLSAqCi0gKiAvLyAuLi4KLSAqCi0gKiB2b2lkIHJlc29sdmVfaGFuZGxlcigKLSAqICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAqICAgICB0Y3A6OnJlc29sdmVyOjppdGVyYXRvciBpKQotICogewotICogICBpZiAoIWVjKQotICogICB7Ci0gKiAgICAgdGNwOjpyZXNvbHZlcjo6aXRlcmF0b3IgZW5kOwotICogICAgIGFzaW86OmFzeW5jX2Nvbm5lY3QocywgaSwgZW5kLCBjb25uZWN0X2hhbmRsZXIpOwotICogICB9Ci0gKiB9Ci0gKgotICogLy8gLi4uCi0gKgotICogdm9pZCBjb25uZWN0X2hhbmRsZXIoCi0gKiAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gKiAgICAgdGNwOjpyZXNvbHZlcjo6aXRlcmF0b3IgaSkKLSAqIHsKLSAqICAgLy8gLi4uCi0gKiB9IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgU29ja2V0U2VydmljZSwKLSAgICB0eXBlbmFtZSBJdGVyYXRvciwgdHlwZW5hbWUgQ29tcG9zZWRDb25uZWN0SGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgSXRlcmF0b3IpKQotYXN5bmNfY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsCi0gICAgQVNJT19NT1ZFX0FSRyhDb21wb3NlZENvbm5lY3RIYW5kbGVyKSBoYW5kbGVyKTsKLQotLy8vIEFzeW5jaHJvbm91c2x5IGVzdGFibGlzaGVzIGEgc29ja2V0IGNvbm5lY3Rpb24gYnkgdHJ5aW5nIGVhY2ggZW5kcG9pbnQgaW4gYQotLy8vIHNlcXVlbmNlLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGNvbm5lY3QgYSBzb2NrZXQgdG8gb25lIG9mIGEgc2VxdWVuY2Ugb2YKLSAqIGVuZHBvaW50cy4gSXQgZG9lcyB0aGlzIGJ5IHJlcGVhdGVkIGNhbGxzIHRvIHRoZSBzb2NrZXQncyBAYyBhc3luY19jb25uZWN0Ci0gKiBtZW1iZXIgZnVuY3Rpb24sIG9uY2UgZm9yIGVhY2ggZW5kcG9pbnQgaW4gdGhlIHNlcXVlbmNlLCB1bnRpbCBhIGNvbm5lY3Rpb24KLSAqIGlzIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc29ja2V0IHRvIGJlIGNvbm5lY3RlZC4gSWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IG9wZW4sIGl0IHdpbGwKLSAqIGJlIGNsb3NlZC4KLSAqCi0gKiBAcGFyYW0gYmVnaW4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIGEgc2VxdWVuY2Ugb2YgZW5kcG9pbnRzLgotICoKLSAqIEBwYXJhbSBjb25uZWN0X2NvbmRpdGlvbiBBIGZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGNhbGxlZCBwcmlvciB0byBlYWNoCi0gKiBjb25uZWN0aW9uIGF0dGVtcHQuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCBtdXN0IGJlOgotICogQGNvZGUgSXRlcmF0b3IgY29ubmVjdF9jb25kaXRpb24oCi0gKiAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gKiAgICAgSXRlcmF0b3IgbmV4dCk7IEBlbmRjb2RlCi0gKiBUaGUgQGMgZWMgcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSByZXN1bHQgZnJvbSB0aGUgbW9zdCByZWNlbnQgY29ubmVjdAotICogb3BlcmF0aW9uLiBCZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb24gYXR0ZW1wdCwgQGMgZWMgaXMgYWx3YXlzIHNldCB0bwotICogaW5kaWNhdGUgc3VjY2Vzcy4gVGhlIEBjIG5leHQgcGFyYW1ldGVyIGlzIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBuZXh0Ci0gKiBlbmRwb2ludCB0byBiZSB0cmllZC4gVGhlIGZ1bmN0aW9uIG9iamVjdCBzaG91bGQgcmV0dXJuIHRoZSBuZXh0IGl0ZXJhdG9yLAotICogYnV0IGlzIHBlcm1pdHRlZCB0byByZXR1cm4gYSBkaWZmZXJlbnQgaXRlcmF0b3Igc28gdGhhdCBlbmRwb2ludHMgbWF5IGJlCi0gKiBza2lwcGVkLiBUaGUgaW1wbGVtZW50YXRpb24gZ3VhcmFudGVlcyB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3Qgd2lsbCBuZXZlcgotICogYmUgY2FsbGVkIHdpdGggdGhlIGVuZCBpdGVyYXRvci4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdCBvcGVyYXRpb24KLSAqIGNvbXBsZXRlcy4gQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uCi0gKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAqICAgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4gaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCBzZXQgdG8KLSAqICAgLy8gYXNpbzo6ZXJyb3I6Om5vdF9mb3VuZC4gT3RoZXJ3aXNlLCBjb250YWlucyB0aGUKLSAqICAgLy8gZXJyb3IgZnJvbSB0aGUgbGFzdCBjb25uZWN0aW9uIGF0dGVtcHQuCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gT24gc3VjY2VzcywgYW4gaXRlcmF0b3IgZGVub3RpbmcgdGhlIHN1Y2Nlc3NmdWxseQotICogICAvLyBjb25uZWN0ZWQgZW5kcG9pbnQuIE90aGVyd2lzZSwgdGhlIGVuZCBpdGVyYXRvci4KLSAqICAgSXRlcmF0b3IgaXRlcmF0b3IKLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgYXNzdW1lcyB0aGF0IGEgZGVmYXVsdCBjb25zdHJ1Y3RlZCBvYmplY3Qgb2YgdHlwZSBAYwotICogSXRlcmF0b3IgcmVwcmVzZW50cyB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4gVGhpcyBpcyBhIHZhbGlkIGFzc3VtcHRpb24gZm9yCi0gKiBpdGVyYXRvciB0eXBlcyBzdWNoIGFzIEBjIGFzaW86OmlwOjp0Y3A6OnJlc29sdmVyOjppdGVyYXRvci4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRoZSBmb2xsb3dpbmcgY29ubmVjdCBjb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IGNhbiBiZSB1c2VkIHRvIG91dHB1dAotICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluZGl2aWR1YWwgY29ubmVjdGlvbiBhdHRlbXB0czoKLSAqIEBjb2RlIHN0cnVjdCBteV9jb25uZWN0X2NvbmRpdGlvbgotICogewotICogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+Ci0gKiAgIEl0ZXJhdG9yIG9wZXJhdG9yKCkoCi0gKiAgICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAqICAgICAgIEl0ZXJhdG9yIG5leHQpCi0gKiAgIHsKLSAqICAgICBpZiAoZWMpIHN0ZDo6Y291dCA8PCAiRXJyb3I6ICIgPDwgZWMubWVzc2FnZSgpIDw8IHN0ZDo6ZW5kbDsKLSAqICAgICBzdGQ6OmNvdXQgPDwgIlRyeWluZzogIiA8PCBuZXh0LT5lbmRwb2ludCgpIDw8IHN0ZDo6ZW5kbDsKLSAqICAgICByZXR1cm4gbmV4dDsKLSAqICAgfQotICogfTsgQGVuZGNvZGUKLSAqIEl0IHdvdWxkIGJlIHVzZWQgd2l0aCB0aGUgYXNpbzo6Y29ubmVjdCBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICogQGNvZGUgdGNwOjpyZXNvbHZlciByKGlvX3NlcnZpY2UpOwotICogdGNwOjpyZXNvbHZlcjo6cXVlcnkgcSgiaG9zdCIsICJzZXJ2aWNlIik7Ci0gKiB0Y3A6OnNvY2tldCBzKGlvX3NlcnZpY2UpOwotICoKLSAqIC8vIC4uLgotICoKLSAqIHIuYXN5bmNfcmVzb2x2ZShxLCByZXNvbHZlX2hhbmRsZXIpOwotICoKLSAqIC8vIC4uLgotICoKLSAqIHZvaWQgcmVzb2x2ZV9oYW5kbGVyKAotICogICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICogICAgIHRjcDo6cmVzb2x2ZXI6Oml0ZXJhdG9yIGkpCi0gKiB7Ci0gKiAgIGlmICghZWMpCi0gKiAgIHsKLSAqICAgICBhc2lvOjphc3luY19jb25uZWN0KHMsIGksCi0gKiAgICAgICAgIG15X2Nvbm5lY3RfY29uZGl0aW9uKCksCi0gKiAgICAgICAgIGNvbm5lY3RfaGFuZGxlcik7Ci0gKiAgIH0KLSAqIH0KLSAqCi0gKiAvLyAuLi4KLSAqCi0gKiB2b2lkIGNvbm5lY3RfaGFuZGxlcigKLSAqICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAqICAgICB0Y3A6OnJlc29sdmVyOjppdGVyYXRvciBpKQotICogewotICogICBpZiAoZWMpCi0gKiAgIHsKLSAqICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAqICAgfQotICogICBlbHNlCi0gKiAgIHsKLSAqICAgICBzdGQ6OmNvdXQgPDwgIkNvbm5lY3RlZCB0bzogIiA8PCBpLT5lbmRwb2ludCgpIDw8IHN0ZDo6ZW5kbDsKLSAqICAgfQotICogfSBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsIHR5cGVuYW1lIEl0ZXJhdG9yLAotICAgIHR5cGVuYW1lIENvbm5lY3RDb25kaXRpb24sIHR5cGVuYW1lIENvbXBvc2VkQ29ubmVjdEhhbmRsZXI+Ci1BU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShDb21wb3NlZENvbm5lY3RIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIEl0ZXJhdG9yKSkKLWFzeW5jX2Nvbm5lY3QoYmFzaWNfc29ja2V0PFByb3RvY29sLCBTb2NrZXRTZXJ2aWNlPiYgcywgSXRlcmF0b3IgYmVnaW4sCi0gICAgQ29ubmVjdENvbmRpdGlvbiBjb25uZWN0X2NvbmRpdGlvbiwKLSAgICBBU0lPX01PVkVfQVJHKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIpIGhhbmRsZXIpOwotCi0vLy8gQXN5bmNocm9ub3VzbHkgZXN0YWJsaXNoZXMgYSBzb2NrZXQgY29ubmVjdGlvbiBieSB0cnlpbmcgZWFjaCBlbmRwb2ludCBpbiBhCi0vLy8gc2VxdWVuY2UuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gY29ubmVjdCBhIHNvY2tldCB0byBvbmUgb2YgYSBzZXF1ZW5jZSBvZgotICogZW5kcG9pbnRzLiBJdCBkb2VzIHRoaXMgYnkgcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIHNvY2tldCdzIEBjIGFzeW5jX2Nvbm5lY3QKLSAqIG1lbWJlciBmdW5jdGlvbiwgb25jZSBmb3IgZWFjaCBlbmRwb2ludCBpbiB0aGUgc2VxdWVuY2UsIHVudGlsIGEgY29ubmVjdGlvbgotICogaXMgc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzb2NrZXQgdG8gYmUgY29ubmVjdGVkLiBJZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgb3BlbiwgaXQgd2lsbAotICogYmUgY2xvc2VkLgotICoKLSAqIEBwYXJhbSBiZWdpbiBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgYSBzZXF1ZW5jZSBvZiBlbmRwb2ludHMuCi0gKgotICogQHBhcmFtIGVuZCBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIGEgc2VxdWVuY2Ugb2YgZW5kcG9pbnRzLgotICoKLSAqIEBwYXJhbSBjb25uZWN0X2NvbmRpdGlvbiBBIGZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGNhbGxlZCBwcmlvciB0byBlYWNoCi0gKiBjb25uZWN0aW9uIGF0dGVtcHQuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCBtdXN0IGJlOgotICogQGNvZGUgSXRlcmF0b3IgY29ubmVjdF9jb25kaXRpb24oCi0gKiAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gKiAgICAgSXRlcmF0b3IgbmV4dCk7IEBlbmRjb2RlCi0gKiBUaGUgQGMgZWMgcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSByZXN1bHQgZnJvbSB0aGUgbW9zdCByZWNlbnQgY29ubmVjdAotICogb3BlcmF0aW9uLiBCZWZvcmUgdGhlIGZpcnN0IGNvbm5lY3Rpb24gYXR0ZW1wdCwgQGMgZWMgaXMgYWx3YXlzIHNldCB0bwotICogaW5kaWNhdGUgc3VjY2Vzcy4gVGhlIEBjIG5leHQgcGFyYW1ldGVyIGlzIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBuZXh0Ci0gKiBlbmRwb2ludCB0byBiZSB0cmllZC4gVGhlIGZ1bmN0aW9uIG9iamVjdCBzaG91bGQgcmV0dXJuIHRoZSBuZXh0IGl0ZXJhdG9yLAotICogYnV0IGlzIHBlcm1pdHRlZCB0byByZXR1cm4gYSBkaWZmZXJlbnQgaXRlcmF0b3Igc28gdGhhdCBlbmRwb2ludHMgbWF5IGJlCi0gKiBza2lwcGVkLiBUaGUgaW1wbGVtZW50YXRpb24gZ3VhcmFudGVlcyB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3Qgd2lsbCBuZXZlcgotICogYmUgY2FsbGVkIHdpdGggdGhlIGVuZCBpdGVyYXRvci4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdCBvcGVyYXRpb24KLSAqIGNvbXBsZXRlcy4gQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uCi0gKiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAqICAgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4gaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCBzZXQgdG8KLSAqICAgLy8gYXNpbzo6ZXJyb3I6Om5vdF9mb3VuZC4gT3RoZXJ3aXNlLCBjb250YWlucyB0aGUKLSAqICAgLy8gZXJyb3IgZnJvbSB0aGUgbGFzdCBjb25uZWN0aW9uIGF0dGVtcHQuCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gT24gc3VjY2VzcywgYW4gaXRlcmF0b3IgZGVub3RpbmcgdGhlIHN1Y2Nlc3NmdWxseQotICogICAvLyBjb25uZWN0ZWQgZW5kcG9pbnQuIE90aGVyd2lzZSwgdGhlIGVuZCBpdGVyYXRvci4KLSAqICAgSXRlcmF0b3IgaXRlcmF0b3IKLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogVGhlIGZvbGxvd2luZyBjb25uZWN0IGNvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgY2FuIGJlIHVzZWQgdG8gb3V0cHV0Ci0gKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5kaXZpZHVhbCBjb25uZWN0aW9uIGF0dGVtcHRzOgotICogQGNvZGUgc3RydWN0IG15X2Nvbm5lY3RfY29uZGl0aW9uCi0gKiB7Ci0gKiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4KLSAqICAgSXRlcmF0b3Igb3BlcmF0b3IoKSgKLSAqICAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICogICAgICAgSXRlcmF0b3IgbmV4dCkKLSAqICAgewotICogICAgIGlmIChlYykgc3RkOjpjb3V0IDw8ICJFcnJvcjogIiA8PCBlYy5tZXNzYWdlKCkgPDwgc3RkOjplbmRsOwotICogICAgIHN0ZDo6Y291dCA8PCAiVHJ5aW5nOiAiIDw8IG5leHQtPmVuZHBvaW50KCkgPDwgc3RkOjplbmRsOwotICogICAgIHJldHVybiBuZXh0OwotICogICB9Ci0gKiB9OyBAZW5kY29kZQotICogSXQgd291bGQgYmUgdXNlZCB3aXRoIHRoZSBhc2lvOjpjb25uZWN0IGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSB0Y3A6OnJlc29sdmVyIHIoaW9fc2VydmljZSk7Ci0gKiB0Y3A6OnJlc29sdmVyOjpxdWVyeSBxKCJob3N0IiwgInNlcnZpY2UiKTsKLSAqIHRjcDo6c29ja2V0IHMoaW9fc2VydmljZSk7Ci0gKgotICogLy8gLi4uCi0gKgotICogci5hc3luY19yZXNvbHZlKHEsIHJlc29sdmVfaGFuZGxlcik7Ci0gKgotICogLy8gLi4uCi0gKgotICogdm9pZCByZXNvbHZlX2hhbmRsZXIoCi0gKiAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gKiAgICAgdGNwOjpyZXNvbHZlcjo6aXRlcmF0b3IgaSkKLSAqIHsKLSAqICAgaWYgKCFlYykKLSAqICAgewotICogICAgIHRjcDo6cmVzb2x2ZXI6Oml0ZXJhdG9yIGVuZDsKLSAqICAgICBhc2lvOjphc3luY19jb25uZWN0KHMsIGksIGVuZCwKLSAqICAgICAgICAgbXlfY29ubmVjdF9jb25kaXRpb24oKSwKLSAqICAgICAgICAgY29ubmVjdF9oYW5kbGVyKTsKLSAqICAgfQotICogfQotICoKLSAqIC8vIC4uLgotICoKLSAqIHZvaWQgY29ubmVjdF9oYW5kbGVyKAotICogICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICogICAgIHRjcDo6cmVzb2x2ZXI6Oml0ZXJhdG9yIGkpCi0gKiB7Ci0gKiAgIGlmIChlYykKLSAqICAgewotICogICAgIC8vIEFuIGVycm9yIG9jY3VycmVkLgotICogICB9Ci0gKiAgIGVsc2UKLSAqICAgewotICogICAgIHN0ZDo6Y291dCA8PCAiQ29ubmVjdGVkIHRvOiAiIDw8IGktPmVuZHBvaW50KCkgPDwgc3RkOjplbmRsOwotICogICB9Ci0gKiB9IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgU29ja2V0U2VydmljZSwgdHlwZW5hbWUgSXRlcmF0b3IsCi0gICAgdHlwZW5hbWUgQ29ubmVjdENvbmRpdGlvbiwgdHlwZW5hbWUgQ29tcG9zZWRDb25uZWN0SGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgSXRlcmF0b3IpKQotYXN5bmNfY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsIENvbm5lY3RDb25kaXRpb24gY29ubmVjdF9jb25kaXRpb24sCi0gICAgQVNJT19NT1ZFX0FSRyhDb21wb3NlZENvbm5lY3RIYW5kbGVyKSBoYW5kbGVyKTsKLQotLypAfSovCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vaW1wbC9jb25uZWN0LmhwcCIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vY29yb3V0aW5lLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9jb3JvdXRpbmUuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWRmYWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9jb3JvdXRpbmUuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8vCi0vLyBjb3JvdXRpbmUuaHBwCi0vLyB+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fQ09ST1VUSU5FX0hQUAotI2RlZmluZSBBU0lPX0NPUk9VVElORV9IUFAKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIGNvcm91dGluZV9yZWY7Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi0vLy8gUHJvdmlkZXMgc3VwcG9ydCBmb3IgaW1wbGVtZW50aW5nIHN0YWNrbGVzcyBjb3JvdXRpbmVzLgotLyoqCi0gKiBUaGUgQGMgY29yb3V0aW5lIGNsYXNzIG1heSBiZSB1c2VkIHRvIGltcGxlbWVudCBzdGFja2xlc3MgY29yb3V0aW5lcy4gVGhlCi0gKiBjbGFzcyBpdHNlbGYgaXMgdXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29yb3V0aW5lLgotICoKLSAqIENvcm91dGluZXMgYXJlIGNvcHktY29uc3RydWN0aWJsZSBhbmQgYXNzaWduYWJsZSwgYW5kIHRoZSBzcGFjZSBvdmVyaGVhZCBpcwotICogYSBzaW5nbGUgaW50LiBUaGV5IGNhbiBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzczoKLSAqCi0gKiBAY29kZSBjbGFzcyBzZXNzaW9uIDogY29yb3V0aW5lCi0gKiB7Ci0gKiAgIC4uLgotICogfTsgQGVuZGNvZGUKLSAqCi0gKiBvciBhcyBhIGRhdGEgbWVtYmVyOgotICoKLSAqIEBjb2RlIGNsYXNzIHNlc3Npb24KLSAqIHsKLSAqICAgLi4uCi0gKiAgIGNvcm91dGluZSBjb3JvXzsKLSAqIH07IEBlbmRjb2RlCi0gKgotICogb3IgZXZlbiBib3VuZCBpbiBhcyBhIGZ1bmN0aW9uIGFyZ3VtZW50IHVzaW5nIGxhbWJkYXMgb3IgQGMgYmluZCgpLiBUaGUKLSAqIGltcG9ydGFudCB0aGluZyBpcyB0aGF0IGFzIHRoZSBhcHBsaWNhdGlvbiBtYWludGFpbnMgYSBjb3B5IG9mIHRoZSBvYmplY3QKLSAqIGZvciBhcyBsb25nIGFzIHRoZSBjb3JvdXRpbmUgbXVzdCBiZSBrZXB0IGFsaXZlLgotICoKLSAqIEBwYXIgUHNldWRvLWtleXdvcmRzCi0gKgotICogQSBjb3JvdXRpbmUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNlcnRhaW4gInBzZXVkby1rZXl3b3JkcyIsIHdoaWNoCi0gKiBhcmUgaW1wbGVtZW50ZWQgYXMgbWFjcm9zLiBUaGVzZSBtYWNyb3MgYXJlIGRlZmluZWQgYnkgYSBoZWFkZXIgZmlsZToKLSAqCi0gKiBAY29kZSAjaW5jbHVkZSA8YXNpby95aWVsZC5ocHA+QGVuZGNvZGUKLSAqCi0gKiBhbmQgbWF5IGNvbnZlcnNlbHkgYmUgdW5kZWZpbmVkIGFzIGZvbGxvd3M6Ci0gKgotICogQGNvZGUgI2luY2x1ZGUgPGFzaW8vdW55aWVsZC5ocHA+QGVuZGNvZGUKLSAqCi0gKiA8Yj5yZWVudGVyPC9iPgotICoKLSAqIFRoZSBAYyByZWVudGVyIG1hY3JvIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBib2R5IG9mIGEgY29yb3V0aW5lLiBJdCB0YWtlcyBhCi0gKiBzaW5nbGUgYXJndW1lbnQ6IGEgcG9pbnRlciBvciByZWZlcmVuY2UgdG8gYSBjb3JvdXRpbmUgb2JqZWN0LiBGb3IgZXhhbXBsZSwKLSAqIGlmIHRoZSBiYXNlIGNsYXNzIGlzIGEgY29yb3V0aW5lIG9iamVjdCB5b3UgbWF5IHdyaXRlOgotICoKLSAqIEBjb2RlIHJlZW50ZXIgKHRoaXMpCi0gKiB7Ci0gKiAgIC4uLiBjb3JvdXRpbmUgYm9keSAuLi4KLSAqIH0gQGVuZGNvZGUKLSAqCi0gKiBhbmQgaWYgYSBkYXRhIG1lbWJlciBvciBvdGhlciB2YXJpYWJsZSB5b3UgY2FuIHdyaXRlOgotICoKLSAqIEBjb2RlIHJlZW50ZXIgKGNvcm9fKQotICogewotICogICAuLi4gY29yb3V0aW5lIGJvZHkgLi4uCi0gKiB9IEBlbmRjb2RlCi0gKgotICogV2hlbiBAYyByZWVudGVyIGlzIGV4ZWN1dGVkIGF0IHJ1bnRpbWUsIGNvbnRyb2wganVtcHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZQotICogbGFzdCBAYyB5aWVsZCBvciBAYyBmb3JrLgotICoKLSAqIFRoZSBjb3JvdXRpbmUgYm9keSBtYXkgYWxzbyBiZSBhIHNpbmdsZSBzdGF0ZW1lbnQsIHN1Y2ggYXM6Ci0gKgotICogQGNvZGUgcmVlbnRlciAodGhpcykgZm9yICg7OykKLSAqIHsKLSAqICAgLi4uCi0gKiB9IEBlbmRjb2RlCi0gKgotICogQGIgTGltaXRhdGlvbjogVGhlIEBjIHJlZW50ZXIgbWFjcm8gaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSBzd2l0Y2guIFRoaXMKLSAqIG1lYW5zIHRoYXQgeW91IG11c3QgdGFrZSBjYXJlIHdoZW4gdXNpbmcgbG9jYWwgdmFyaWFibGVzIHdpdGhpbiB0aGUKLSAqIGNvcm91dGluZSBib2R5LiBUaGUgbG9jYWwgdmFyaWFibGUgaXMgbm90IGFsbG93ZWQgaW4gYSBwb3NpdGlvbiB3aGVyZQotICogcmVlbnRlcmluZyB0aGUgY29yb3V0aW5lIGNvdWxkIGJ5cGFzcyB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbi4KLSAqCi0gKiA8Yj55aWVsZCA8ZW0+c3RhdGVtZW50PC9lbT48L2I+Ci0gKgotICogVGhpcyBmb3JtIG9mIHRoZSBAYyB5aWVsZCBrZXl3b3JkIGlzIG9mdGVuIHVzZWQgd2l0aCBhc3luY2hyb25vdXMgb3BlcmF0aW9uczoKLSAqCi0gKiBAY29kZSB5aWVsZCBzb2NrZXRfLT5hc3luY19yZWFkX3NvbWUoYnVmZmVyKCpidWZmZXJfKSwgKnRoaXMpOyBAZW5kY29kZQotICoKLSAqIFRoaXMgZGl2aWRlcyBpbnRvIGZvdXIgbG9naWNhbCBzdGVwczoKLSAqCi0gKiBAbGkgQGMgeWllbGQgc2F2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvcm91dGluZS4KLSAqIEBsaSBUaGUgc3RhdGVtZW50IGluaXRpYXRlcyB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAqIEBsaSBUaGUgcmVzdW1lIHBvaW50IGlzIGRlZmluZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBzdGF0ZW1lbnQuCi0gKiBAbGkgQ29udHJvbCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgZW5kIG9mIHRoZSBjb3JvdXRpbmUgYm9keS4KLSAqCi0gKiBXaGVuIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcywgdGhlIGZ1bmN0aW9uIG9iamVjdCBpcyBpbnZva2VkCi0gKiBhbmQgQGMgcmVlbnRlciBjYXVzZXMgY29udHJvbCB0byB0cmFuc2ZlciB0byB0aGUgcmVzdW1lIHBvaW50LiBJdCBpcwotICogaW1wb3J0YW50IHRvIHJlbWVtYmVyIHRvIGNhcnJ5IHRoZSBjb3JvdXRpbmUgc3RhdGUgZm9yd2FyZCB3aXRoIHRoZQotICogYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4gSW4gdGhlIGFib3ZlIHNuaXBwZXQsIHRoZSBjdXJyZW50IGNsYXNzIGlzIGEKLSAqIGZ1bmN0aW9uIG9iamVjdCBvYmplY3Qgd2l0aCBhIGNvcm91dGluZSBvYmplY3QgYXMgYmFzZSBjbGFzcyBvciBkYXRhIG1lbWJlci4KLSAqCi0gKiBUaGUgc3RhdGVtZW50IG1heSBhbHNvIGJlIGEgY29tcG91bmQgc3RhdGVtZW50LCBhbmQgdGhpcyBwZXJtaXRzIHVzIHRvCi0gKiBkZWZpbmUgbG9jYWwgdmFyaWFibGVzIHdpdGggbGltaXRlZCBzY29wZToKLSAqCi0gKiBAY29kZSB5aWVsZAotICogewotICogICBtdXRhYmxlX2J1ZmZlcnNfMSBiID0gYnVmZmVyKCpidWZmZXJfKTsKLSAqICAgc29ja2V0Xy0+YXN5bmNfcmVhZF9zb21lKGIsICp0aGlzKTsKLSAqIH0gQGVuZGNvZGUKLSAqCi0gKiA8Yj55aWVsZCByZXR1cm4gPGVtPmV4cHJlc3Npb248L2VtPiA7PC9iPgotICoKLSAqIFRoaXMgZm9ybSBvZiBAYyB5aWVsZCBpcyBvZnRlbiB1c2VkIGluIGdlbmVyYXRvcnMgb3IgY29yb3V0aW5lLWJhc2VkIHBhcnNlcnMuCi0gKiBGb3IgZXhhbXBsZSwgdGhlIGZ1bmN0aW9uIG9iamVjdDoKLSAqCi0gKiBAY29kZSBzdHJ1Y3QgaW50ZXJsZWF2ZSA6IGNvcm91dGluZQotICogewotICogICBpc3RyZWFtJiBpczE7Ci0gKiAgIGlzdHJlYW0mIGlzMjsKLSAqICAgY2hhciBvcGVyYXRvcigpKGNoYXIgYykKLSAqICAgewotICogICAgIHJlZW50ZXIgKHRoaXMpIGZvciAoOzspCi0gKiAgICAgewotICogICAgICAgeWllbGQgcmV0dXJuIGlzMS5nZXQoKTsKLSAqICAgICAgIHlpZWxkIHJldHVybiBpczIuZ2V0KCk7Ci0gKiAgICAgfQotICogICB9Ci0gKiB9OyBAZW5kY29kZQotICoKLSAqIGRlZmluZXMgYSB0cml2aWFsIGNvcm91dGluZSB0aGF0IGludGVybGVhdmVzIHRoZSBjaGFyYWN0ZXJzIGZyb20gdHdvIGlucHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIFRoaXMgdHlwZSBvZiBAYyB5aWVsZCBkaXZpZGVzIGludG8gdGhyZWUgbG9naWNhbCBzdGVwczoKLSAqCi0gKiBAbGkgQGMgeWllbGQgc2F2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvcm91dGluZS4KLSAqIEBsaSBUaGUgcmVzdW1lIHBvaW50IGlzIGRlZmluZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBzZW1pY29sb24uCi0gKiBAbGkgVGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZ1bmN0aW9uLgotICoKLSAqIDxiPnlpZWxkIDs8L2I+Ci0gKgotICogVGhpcyBmb3JtIG9mIEBjIHlpZWxkIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBzdGVwczoKLSAqCi0gKiBAbGkgQGMgeWllbGQgc2F2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvcm91dGluZS4KLSAqIEBsaSBUaGUgcmVzdW1lIHBvaW50IGlzIGRlZmluZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBzZW1pY29sb24uCi0gKiBAbGkgQ29udHJvbCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgZW5kIG9mIHRoZSBjb3JvdXRpbmUgYm9keS4KLSAqCi0gKiBUaGlzIGZvcm0gbWlnaHQgYmUgYXBwbGllZCB3aGVuIGNvcm91dGluZXMgYXJlIHVzZWQgZm9yIGNvb3BlcmF0aXZlCi0gKiB0aHJlYWRpbmcgYW5kIHNjaGVkdWxpbmcgaXMgZXhwbGljaXRseSBtYW5hZ2VkLiBGb3IgZXhhbXBsZToKLSAqCi0gKiBAY29kZSBzdHJ1Y3QgdGFzayA6IGNvcm91dGluZQotICogewotICogICAuLi4KLSAqICAgdm9pZCBvcGVyYXRvcigpKCkKLSAqICAgewotICogICAgIHJlZW50ZXIgKHRoaXMpCi0gKiAgICAgewotICogICAgICAgd2hpbGUgKC4uLiBub3QgZmluaXNoZWQgLi4uKQotICogICAgICAgewotICogICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLgotICogICAgICAgICB5aWVsZDsKLSAqICAgICAgICAgLi4uIGRvIHNvbWUgbW9yZSAuLi4KLSAqICAgICAgICAgeWllbGQ7Ci0gKiAgICAgICB9Ci0gKiAgICAgfQotICogICB9Ci0gKiAgIC4uLgotICogfTsKLSAqIC4uLgotICogdGFzayB0MSwgdDI7Ci0gKiBmb3IgKDs7KQotICogewotICogICB0MSgpOwotICogICB0MigpOwotICogfSBAZW5kY29kZQotICoKLSAqIDxiPnlpZWxkIGJyZWFrIDs8L2I+Ci0gKgotICogVGhlIGZpbmFsIGZvcm0gb2YgQGMgeWllbGQgaXMgdXNlZCB0byBleHBsaWNpdGx5IHRlcm1pbmF0ZSB0aGUgY29yb3V0aW5lLgotICogVGhpcyBmb3JtIGlzIGNvbXByaXNlZCBvZiB0d28gc3RlcHM6Ci0gKgotICogQGxpIEBjIHlpZWxkIHNldHMgdGhlIGNvcm91dGluZSBzdGF0ZSB0byBpbmRpY2F0ZSB0ZXJtaW5hdGlvbi4KLSAqIEBsaSBDb250cm9sIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBlbmQgb2YgdGhlIGNvcm91dGluZSBib2R5LgotICoKLSAqIE9uY2UgdGVybWluYXRlZCwgY2FsbHMgdG8gaXNfY29tcGxldGUoKSByZXR1cm4gdHJ1ZSBhbmQgdGhlIGNvcm91dGluZSBjYW5ub3QKLSAqIGJlIHJlZW50ZXJlZC4KLSAqCi0gKiBOb3RlIHRoYXQgYSBjb3JvdXRpbmUgbWF5IGFsc28gYmUgaW1wbGljaXRseSB0ZXJtaW5hdGVkIGlmIHRoZSBjb3JvdXRpbmUKLSAqIGJvZHkgaXMgZXhpdGVkIHdpdGhvdXQgYSB5aWVsZCwgZS5nLiBieSByZXR1cm4sIHRocm93IG9yIGJ5IHJ1bm5pbmcgdG8gdGhlCi0gKiBlbmQgb2YgdGhlIGJvZHkuCi0gKgotICogPGI+Zm9yayA8ZW0+c3RhdGVtZW50PC9lbT48L2I+Ci0gKgotICogVGhlIEBjIGZvcmsgcHNldWRvLWtleXdvcmQgaXMgdXNlZCB3aGVuICJmb3JraW5nIiBhIGNvcm91dGluZSwgaS5lLiBzcGxpdHRpbmcKLSAqIGl0IGludG8gdHdvIChvciBtb3JlKSBjb3BpZXMuIE9uZSB1c2Ugb2YgQGMgZm9yayBpcyBpbiBhIHNlcnZlciwgd2hlcmUgYSBuZXcKLSAqIGNvcm91dGluZSBpcyBjcmVhdGVkIHRvIGhhbmRsZSBlYWNoIGNsaWVudCBjb25uZWN0aW9uOgotICogCi0gKiBAY29kZSByZWVudGVyICh0aGlzKQotICogewotICogICBkbwotICogICB7Ci0gKiAgICAgc29ja2V0Xy5yZXNldChuZXcgdGNwOjpzb2NrZXQoaW9fc2VydmljZV8pKTsKLSAqICAgICB5aWVsZCBhY2NlcHRvci0+YXN5bmNfYWNjZXB0KCpzb2NrZXRfLCAqdGhpcyk7Ci0gKiAgICAgZm9yayBzZXJ2ZXIoKnRoaXMpKCk7Ci0gKiAgIH0gd2hpbGUgKGlzX3BhcmVudCgpKTsKLSAqICAgLi4uIGNsaWVudC1zcGVjaWZpYyBoYW5kbGluZyBmb2xsb3dzIC4uLgotICogfSBAZW5kY29kZQotICogCi0gKiBUaGUgbG9naWNhbCBzdGVwcyBpbnZvbHZlZCBpbiBhIEBjIGZvcmsgYXJlOgotICogCi0gKiBAbGkgQGMgZm9yayBzYXZlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29yb3V0aW5lLgotICogQGxpIFRoZSBzdGF0ZW1lbnQgY3JlYXRlcyBhIGNvcHkgb2YgdGhlIGNvcm91dGluZSBhbmQgZWl0aGVyIGV4ZWN1dGVzIGl0Ci0gKiAgICAgaW1tZWRpYXRlbHkgb3Igc2NoZWR1bGVzIGl0IGZvciBsYXRlciBleGVjdXRpb24uCi0gKiBAbGkgVGhlIHJlc3VtZSBwb2ludCBpcyBkZWZpbmVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgc2VtaWNvbG9uLgotICogQGxpIEZvciB0aGUgInBhcmVudCIsIGNvbnRyb2wgaW1tZWRpYXRlbHkgY29udGludWVzIGZyb20gdGhlIG5leHQgbGluZS4KLSAqCi0gKiBUaGUgZnVuY3Rpb25zIGlzX3BhcmVudCgpIGFuZCBpc19jaGlsZCgpIGNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUKLSAqIGJldHdlZW4gcGFyZW50IGFuZCBjaGlsZC4gWW91IHdvdWxkIHVzZSB0aGVzZSBmdW5jdGlvbnMgdG8gYWx0ZXIgc3Vic2VxdWVudAotICogY29udHJvbCBmbG93LgotICoKLSAqIE5vdGUgdGhhdCBAYyBmb3JrIGRvZXNuJ3QgZG8gdGhlIGFjdHVhbCBmb3JraW5nIGJ5IGl0c2VsZi4gSXQgaXMgdGhlCi0gKiBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIGNyZWF0ZSBhIGNsb25lIG9mIHRoZSBjb3JvdXRpbmUgYW5kIGNhbGwgaXQuCi0gKiBUaGUgY2xvbmUgY2FuIGJlIGNhbGxlZCBpbW1lZGlhdGVseSwgYXMgYWJvdmUsIG9yIHNjaGVkdWxlZCBmb3IgZGVsYXllZAotICogZXhlY3V0aW9uIHVzaW5nIHNvbWV0aGluZyBsaWtlIGlvX3NlcnZpY2U6OnBvc3QoKS4KLSAqCi0gKiBAcGFyIEFsdGVybmF0ZSBtYWNybyBuYW1lcwotICoKLSAqIElmIHByZWZlcnJlZCwgYW4gYXBwbGljYXRpb24gY2FuIHVzZSBtYWNybyBuYW1lcyB0aGF0IGZvbGxvdyBhIG1vcmUgdHlwaWNhbAotICogbmFtaW5nIGNvbnZlbnRpb24sIHJhdGhlciB0aGFuIHRoZSBwc2V1ZG8ta2V5d29yZHMuIFRoZXNlIGFyZToKLSAqCi0gKiBAbGkgQGMgQVNJT19DT1JPX1JFRU5URVIgaW5zdGVhZCBvZiBAYyByZWVudGVyCi0gKiBAbGkgQGMgQVNJT19DT1JPX1lJRUxEIGluc3RlYWQgb2YgQGMgeWllbGQKLSAqIEBsaSBAYyBBU0lPX0NPUk9fRk9SSyBpbnN0ZWFkIG9mIEBjIGZvcmsKLSAqLwotY2xhc3MgY29yb3V0aW5lCi17Ci1wdWJsaWM6Ci0gIC8vLyBDb25zdHJ1Y3RzIGEgY29yb3V0aW5lIGluIGl0cyBpbml0aWFsIHN0YXRlLgotICBjb3JvdXRpbmUoKSA6IHZhbHVlXygwKSB7fQotCi0gIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvcm91dGluZSBpcyB0aGUgY2hpbGQgb2YgYSBmb3JrLgotICBib29sIGlzX2NoaWxkKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfIDwgMDsgfQotCi0gIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvcm91dGluZSBpcyB0aGUgcGFyZW50IG9mIGEgZm9yay4KLSAgYm9vbCBpc19wYXJlbnQoKSBjb25zdCB7IHJldHVybiAhaXNfY2hpbGQoKTsgfQotCi0gIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvcm91dGluZSBoYXMgcmVhY2hlZCBpdHMgdGVybWluYWwgc3RhdGUuCi0gIGJvb2wgaXNfY29tcGxldGUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV8gPT0gLTE7IH0KLQotcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIGRldGFpbDo6Y29yb3V0aW5lX3JlZjsKLSAgaW50IHZhbHVlXzsKLX07Ci0KLQotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIGNvcm91dGluZV9yZWYKLXsKLXB1YmxpYzoKLSAgY29yb3V0aW5lX3JlZihjb3JvdXRpbmUmIGMpIDogdmFsdWVfKGMudmFsdWVfKSwgbW9kaWZpZWRfKGZhbHNlKSB7fQotICBjb3JvdXRpbmVfcmVmKGNvcm91dGluZSogYykgOiB2YWx1ZV8oYy0+dmFsdWVfKSwgbW9kaWZpZWRfKGZhbHNlKSB7fQotICB+Y29yb3V0aW5lX3JlZigpIHsgaWYgKCFtb2RpZmllZF8pIHZhbHVlXyA9IC0xOyB9Ci0gIG9wZXJhdG9yIGludCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotICBpbnQmIG9wZXJhdG9yPShpbnQgdikgeyBtb2RpZmllZF8gPSB0cnVlOyByZXR1cm4gdmFsdWVfID0gdjsgfQotcHJpdmF0ZToKLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgY29yb3V0aW5lX3JlZiYpOwotICBpbnQmIHZhbHVlXzsKLSAgYm9vbCBtb2RpZmllZF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2RlZmluZSBBU0lPX0NPUk9fUkVFTlRFUihjKSBcCi0gIHN3aXRjaCAoOjphc2lvOjpkZXRhaWw6OmNvcm91dGluZV9yZWYgX2Nvcm9fdmFsdWUgPSBjKSBcCi0gICAgY2FzZSAtMTogaWYgKF9jb3JvX3ZhbHVlKSBcCi0gICAgeyBcCi0gICAgICBnb3RvIHRlcm1pbmF0ZV9jb3JvdXRpbmU7IFwKLSAgICAgIHRlcm1pbmF0ZV9jb3JvdXRpbmU6IFwKLSAgICAgIF9jb3JvX3ZhbHVlID0gLTE7IFwKLSAgICAgIGdvdG8gYmFpbF9vdXRfb2ZfY29yb3V0aW5lOyBcCi0gICAgICBiYWlsX291dF9vZl9jb3JvdXRpbmU6IFwKLSAgICAgIGJyZWFrOyBcCi0gICAgfSBcCi0gICAgZWxzZSBjYXNlIDA6Ci0KLSNkZWZpbmUgQVNJT19DT1JPX1lJRUxEX0lNUEwobikgXAotICBmb3IgKF9jb3JvX3ZhbHVlID0gKG4pOzspIFwKLSAgICBpZiAoX2Nvcm9fdmFsdWUgPT0gMCkgXAotICAgIHsgXAotICAgICAgY2FzZSAobik6IDsgXAotICAgICAgYnJlYWs7IFwKLSAgICB9IFwKLSAgICBlbHNlIFwKLSAgICAgIHN3aXRjaCAoX2Nvcm9fdmFsdWUgPyAwIDogMSkgXAotICAgICAgICBmb3IgKDs7KSBcCi0gICAgICAgICAgY2FzZSAtMTogaWYgKF9jb3JvX3ZhbHVlKSBcCi0gICAgICAgICAgICBnb3RvIHRlcm1pbmF0ZV9jb3JvdXRpbmU7IFwKLSAgICAgICAgICBlbHNlIGZvciAoOzspIFwKLSAgICAgICAgICAgIGNhc2UgMTogaWYgKF9jb3JvX3ZhbHVlKSBcCi0gICAgICAgICAgICAgIGdvdG8gYmFpbF9vdXRfb2ZfY29yb3V0aW5lOyBcCi0gICAgICAgICAgICBlbHNlIGNhc2UgMDoKLQotI2RlZmluZSBBU0lPX0NPUk9fRk9SS19JTVBMKG4pIFwKLSAgZm9yIChfY29yb192YWx1ZSA9IC0obik7OyBfY29yb192YWx1ZSA9IChuKSkgXAotICAgIGlmIChfY29yb192YWx1ZSA9PSAobikpIFwKLSAgICB7IFwKLSAgICAgIGNhc2UgLShuKTogOyBcCi0gICAgICBicmVhazsgXAotICAgIH0gXAotICAgIGVsc2UKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpCi0jIGRlZmluZSBBU0lPX0NPUk9fWUlFTEQgQVNJT19DT1JPX1lJRUxEX0lNUEwoX19DT1VOVEVSX18gKyAxKQotIyBkZWZpbmUgQVNJT19DT1JPX0ZPUksgQVNJT19DT1JPX0ZPUktfSU1QTChfX0NPVU5URVJfXyArIDEpCi0jZWxzZSAvLyBkZWZpbmVkKF9NU0NfVkVSKQotIyBkZWZpbmUgQVNJT19DT1JPX1lJRUxEIEFTSU9fQ09ST19ZSUVMRF9JTVBMKF9fTElORV9fKQotIyBkZWZpbmUgQVNJT19DT1JPX0ZPUksgQVNJT19DT1JPX0ZPUktfSU1QTChfX0xJTkVfXykKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKQotCi0jZW5kaWYgLy8gQVNJT19DT1JPVVRJTkVfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGF0YWdyYW1fc29ja2V0X3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RhdGFncmFtX3NvY2tldF9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjYzU2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGF0YWdyYW1fc29ja2V0X3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLS8vCi0vLyBkYXRhZ3JhbV9zb2NrZXRfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RBVEFHUkFNX1NPQ0tFVF9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX0RBVEFHUkFNX1NPQ0tFVF9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3R5cGVfdHJhaXRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvbnVsbF9zb2NrZXRfc2VydmljZS5ocHAiCi0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9zZXJ2aWNlLmhwcCIKLSNlbHNlCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZXJ2aWNlLmhwcCIKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0vLy8gRGVmYXVsdCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZvciBhIGRhdGFncmFtIHNvY2tldC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLWNsYXNzIGRhdGFncmFtX3NvY2tldF9zZXJ2aWNlCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIDogcHVibGljIGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2UKLSNlbHNlCi0gIDogcHVibGljIGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPGRhdGFncmFtX3NvY2tldF9zZXJ2aWNlPFByb3RvY29sPiA+Ci0jZW5kaWYKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB1bmlxdWUgc2VydmljZSBpZGVudGlmaWVyLgotICBzdGF0aWMgYXNpbzo6aW9fc2VydmljZTo6aWQgaWQ7Ci0jZW5kaWYKLQotICAvLy8gVGhlIHByb3RvY29sIHR5cGUuCi0gIHR5cGVkZWYgUHJvdG9jb2wgcHJvdG9jb2xfdHlwZTsKLQotICAvLy8gVGhlIGVuZHBvaW50IHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLXByaXZhdGU6Ci0gIC8vIFRoZSB0eXBlIG9mIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICB0eXBlZGVmIGRldGFpbDo6bnVsbF9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gc2VydmljZV9pbXBsX3R5cGU7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gIHR5cGVkZWYgZGV0YWlsOjp3aW5faW9jcF9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gc2VydmljZV9pbXBsX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIGRldGFpbDo6cmVhY3RpdmVfc29ja2V0X3NlcnZpY2U8UHJvdG9jb2w+IHNlcnZpY2VfaW1wbF90eXBlOwotI2VuZGlmCi0KLXB1YmxpYzoKLSAgLy8vIFRoZSB0eXBlIG9mIGEgZGF0YWdyYW0gc29ja2V0LgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgdHlwZW5hbWUgc2VydmljZV9pbXBsX3R5cGU6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbmRpZgotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGVfdHlwZS4pIFRoZSBuYXRpdmUgc29ja2V0IHR5cGUuCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBuYXRpdmVfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgdHlwZW5hbWUgc2VydmljZV9pbXBsX3R5cGU6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBUaGUgbmF0aXZlIHNvY2tldCB0eXBlLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgbmF0aXZlX2hhbmRsZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiB0eXBlbmFtZSBzZXJ2aWNlX2ltcGxfdHlwZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgZGF0YWdyYW0gc29ja2V0IHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgaW9fc2VydmljZS4KLSAgZXhwbGljaXQgZGF0YWdyYW1fc29ja2V0X3NlcnZpY2UoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPAotICAgICAgICBkYXRhZ3JhbV9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gPihpb19zZXJ2aWNlKSwKLSAgICAgIHNlcnZpY2VfaW1wbF8oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIG5ldyBkYXRhZ3JhbSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmNvbnN0cnVjdChpbXBsKTsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKSB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIE1vdmUtY29uc3RydWN0IGEgbmV3IGRhdGFncmFtIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8ubW92ZV9jb25zdHJ1Y3QoaW1wbCwgb3RoZXJfaW1wbCk7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIGRhdGFncmFtIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2Fzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgZGF0YWdyYW1fc29ja2V0X3NlcnZpY2UmIG90aGVyX3NlcnZpY2UsCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5tb3ZlX2Fzc2lnbihpbXBsLCBvdGhlcl9zZXJ2aWNlLnNlcnZpY2VfaW1wbF8sIG90aGVyX2ltcGwpOwotICB9Ci0KLSAgLy8vIE1vdmUtY29uc3RydWN0IGEgbmV3IGRhdGFncmFtIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBmcm9tIGFub3RoZXIgcHJvdG9jb2wKLSAgLy8vIHR5cGUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbDE+Ci0gIHZvaWQgY29udmVydGluZ19tb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgdHlwZW5hbWUgZGF0YWdyYW1fc29ja2V0X3NlcnZpY2U8Ci0gICAgICAgIFByb3RvY29sMT46OmltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwsCi0gICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8Ci0gICAgICAgIFByb3RvY29sMSwgUHJvdG9jb2w+Ojp2YWx1ZT46OnR5cGUqID0gMCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8udGVtcGxhdGUgY29udmVydGluZ19tb3ZlX2NvbnN0cnVjdDxQcm90b2NvbDE+KAotICAgICAgICBpbXBsLCBvdGhlcl9pbXBsKTsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIERlc3Ryb3kgYSBkYXRhZ3JhbSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgZGVzdHJveShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5kZXN0cm95KGltcGwpOwotICB9Ci0KLSAgLy8gT3BlbiBhIG5ldyBkYXRhZ3JhbSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgb3BlbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgaWYgKHByb3RvY29sLnR5cGUoKSA9PSBBU0lPX09TX0RFRihTT0NLX0RHUkFNKSkKLSAgICAgIHNlcnZpY2VfaW1wbF8ub3BlbihpbXBsLCBwcm90b2NvbCwgZWMpOwotICAgIGVsc2UKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8vIEFzc2lnbiBhbiBleGlzdGluZyBuYXRpdmUgc29ja2V0IHRvIGEgZGF0YWdyYW0gc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX3NvY2tldCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uYXNzaWduKGltcGwsIHByb3RvY29sLCBuYXRpdmVfc29ja2V0LCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBvcGVuLgotICBib29sIGlzX29wZW4oY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmlzX29wZW4oaW1wbCk7Ci0gIH0KLQotICAvLy8gQ2xvc2UgYSBkYXRhZ3JhbSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uY2xvc2UoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZSgpLikgR2V0IHRoZSBuYXRpdmUgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBuYXRpdmVfdHlwZSBuYXRpdmUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5hdGl2ZV9oYW5kbGUoaW1wbCk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBuYXRpdmUgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX2hhbmRsZShpbXBsKTsKLSAgfQotCi0gIC8vLyBDYW5jZWwgYWxsIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIGNhbmNlbChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5jYW5jZWwoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgYXQgdGhlIG91dC1vZi1iYW5kIGRhdGEgbWFyay4KLSAgYm9vbCBhdF9tYXJrKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmF0X21hcmsoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgcmVhZGluZy4KLSAgc3RkOjpzaXplX3QgYXZhaWxhYmxlKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmF2YWlsYWJsZShpbXBsLCBlYyk7Ci0gIH0KLQotICAvLyBCaW5kIHRoZSBkYXRhZ3JhbSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhbCBlbmRwb2ludC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBiaW5kKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5iaW5kKGltcGwsIGVuZHBvaW50LCBlYyk7Ci0gIH0KLQotICAvLy8gQ29ubmVjdCB0aGUgZGF0YWdyYW0gc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gIGFzaW86OmVycm9yX2NvZGUgY29ubmVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgcGVlcl9lbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5jb25uZWN0KGltcGwsIHBlZXJfZW5kcG9pbnQsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgY29ubmVjdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbm5lY3RIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShDb25uZWN0SGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUpKQotICBhc3luY19jb25uZWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBwZWVyX2VuZHBvaW50LAotICAgICAgQVNJT19NT1ZFX0FSRyhDb25uZWN0SGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBDb25uZWN0SGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKENvbm5lY3RIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX2Nvbm5lY3QoaW1wbCwgcGVlcl9lbmRwb2ludCwgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBTZXQgYSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2V0dGFibGVTb2NrZXRPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgc2V0X29wdGlvbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgU2V0dGFibGVTb2NrZXRPcHRpb24mIG9wdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5zZXRfb3B0aW9uKGltcGwsIG9wdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIEdldCBhIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBHZXR0YWJsZVNvY2tldE9wdGlvbj4KLSAgYXNpbzo6ZXJyb3JfY29kZSBnZXRfb3B0aW9uKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBHZXR0YWJsZVNvY2tldE9wdGlvbiYgb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmdldF9vcHRpb24oaW1wbCwgb3B0aW9uLCBlYyk7Ci0gIH0KLQotICAvLy8gUGVyZm9ybSBhbiBJTyBjb250cm9sIGNvbW1hbmQgb24gdGhlIHNvY2tldC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElvQ29udHJvbENvbW1hbmQ+Ci0gIGFzaW86OmVycm9yX2NvZGUgaW9fY29udHJvbChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgSW9Db250cm9sQ29tbWFuZCYgY29tbWFuZCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5pb19jb250cm9sKGltcGwsIGNvbW1hbmQsIGVjKTsKLSAgfQotCi0gIC8vLyBHZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgc29ja2V0LgotICBib29sIG5vbl9ibG9ja2luZyhjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubm9uX2Jsb2NraW5nKGltcGwpOwotICB9Ci0KLSAgLy8vIFNldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBzb2NrZXQuCi0gIGFzaW86OmVycm9yX2NvZGUgbm9uX2Jsb2NraW5nKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBib29sIG1vZGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubm9uX2Jsb2NraW5nKGltcGwsIG1vZGUsIGVjKTsKLSAgfQotCi0gIC8vLyBHZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYm9vbCBuYXRpdmVfbm9uX2Jsb2NraW5nKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfbm9uX2Jsb2NraW5nKGltcGwpOwotICB9Ci0KLSAgLy8vIFNldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBuYXRpdmUgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIG5hdGl2ZV9ub25fYmxvY2tpbmcoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfbm9uX2Jsb2NraW5nKGltcGwsIG1vZGUsIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIGxvY2FsIGVuZHBvaW50LgotICBlbmRwb2ludF90eXBlIGxvY2FsX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmxvY2FsX2VuZHBvaW50KGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHJlbW90ZSBlbmRwb2ludC4KLSAgZW5kcG9pbnRfdHlwZSByZW1vdGVfZW5kcG9pbnQoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ucmVtb3RlX2VuZHBvaW50KGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyBEaXNhYmxlIHNlbmRzIG9yIHJlY2VpdmVzIG9uIHRoZSBzb2NrZXQuCi0gIGFzaW86OmVycm9yX2NvZGUgc2h1dGRvd24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHNvY2tldF9iYXNlOjpzaHV0ZG93bl90eXBlIHdoYXQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2h1dGRvd24oaW1wbCwgd2hhdCwgZWMpOwotICB9Ci0KLSAgLy8vIFNlbmQgdGhlIGdpdmVuIGRhdGEgdG8gdGhlIHBlZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBzZW5kKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2VuZChpbXBsLCBidWZmZXJzLCBmbGFncywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBzZW5kLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3NlbmQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV9pbXBsXy5hc3luY19zZW5kKGltcGwsIGJ1ZmZlcnMsIGZsYWdzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLSAgLy8vIFNlbmQgYSBkYXRhZ3JhbSB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgc2VuZF90byhpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgY29uc3QgZW5kcG9pbnRfdHlwZSYgZGVzdGluYXRpb24sCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5zZW5kX3RvKGltcGwsIGJ1ZmZlcnMsIGRlc3RpbmF0aW9uLCBmbGFncywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBzZW5kLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3NlbmRfdG8oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGNvbnN0IGVuZHBvaW50X3R5cGUmIGRlc3RpbmF0aW9uLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3NlbmRfdG8oaW1wbCwgYnVmZmVycywKLSAgICAgICAgZGVzdGluYXRpb24sIGZsYWdzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLSAgLy8vIFJlY2VpdmUgc29tZSBkYXRhIGZyb20gdGhlIHBlZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlY2VpdmUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnJlY2VpdmUoaW1wbCwgYnVmZmVycywgZmxhZ3MsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19yZWNlaXZlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgICAgUmVhZEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICAgIHNlcnZpY2VfaW1wbF8uYXN5bmNfcmVjZWl2ZShpbXBsLCBidWZmZXJzLCBmbGFncywgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBSZWNlaXZlIGEgZGF0YWdyYW0gd2l0aCB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbmRlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVjZWl2ZV9mcm9tKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGVuZHBvaW50X3R5cGUmIHNlbmRlcl9lbmRwb2ludCwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnJlY2VpdmVfZnJvbShpbXBsLCBidWZmZXJzLCBzZW5kZXJfZW5kcG9pbnQsIGZsYWdzLAotICAgICAgICBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUgdGhhdCB3aWxsIGdldCB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbmRlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19yZWNlaXZlX2Zyb20oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgZW5kcG9pbnRfdHlwZSYgc2VuZGVyX2VuZHBvaW50LAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3JlY2VpdmVfZnJvbShpbXBsLCBidWZmZXJzLAotICAgICAgICBzZW5kZXJfZW5kcG9pbnQsIGZsYWdzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIHZvaWQgc2h1dGRvd25fc2VydmljZSgpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLnNodXRkb3duX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSAgc2VydmljZV9pbXBsX3R5cGUgc2VydmljZV9pbXBsXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREFUQUdSQU1fU09DS0VUX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGVhZGxpbmVfdGltZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RlYWRsaW5lX3RpbWVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMjJjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGVhZGxpbmVfdGltZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8KLS8vIGRlYWRsaW5lX3RpbWVyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVBRExJTkVfVElNRVJfSFBQCi0jZGVmaW5lIEFTSU9fREVBRExJTkVfVElNRVJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiIC8vIE11c3QgY29tZSBiZWZvcmUgcG9zaXhfdGltZS4KLSNpbmNsdWRlICJhc2lvL2Jhc2ljX2RlYWRsaW5lX3RpbWVyLmhwcCIKLQotI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWVfdHlwZXMuaHBwPgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBUeXBlZGVmIGZvciB0aGUgdHlwaWNhbCB1c2FnZSBvZiB0aW1lci4gVXNlcyBhIFVUQyBjbG9jay4KLXR5cGVkZWYgYmFzaWNfZGVhZGxpbmVfdGltZXI8Ym9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lPiBkZWFkbGluZV90aW1lcjsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19CT09TVF9EQVRFX1RJTUUpCi0gICAgICAgLy8gfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX0RFQURMSU5FX1RJTUVSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RlYWRsaW5lX3RpbWVyX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RlYWRsaW5lX3RpbWVyX3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmVhZDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZWFkbGluZV90aW1lcl9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLwotLy8gZGVhZGxpbmVfdGltZXJfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVBRExJTkVfVElNRVJfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19ERUFETElORV9USU1FUl9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19CT09TVF9EQVRFX1RJTUUpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9kZWFkbGluZV90aW1lcl9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vdGltZV90cmFpdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX3B0aW1lLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIERlZmF1bHQgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSB0aW1lci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lVHlwZSwKLSAgICB0eXBlbmFtZSBUaW1lVHJhaXRzID0gYXNpbzo6dGltZV90cmFpdHM8VGltZVR5cGU+ID4KLWNsYXNzIGRlYWRsaW5lX3RpbWVyX3NlcnZpY2UKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgOiBwdWJsaWMgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZQotI2Vsc2UKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8Ci0gICAgICBkZWFkbGluZV90aW1lcl9zZXJ2aWNlPFRpbWVUeXBlLCBUaW1lVHJhaXRzPiA+Ci0jZW5kaWYKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB1bmlxdWUgc2VydmljZSBpZGVudGlmaWVyLgotICBzdGF0aWMgYXNpbzo6aW9fc2VydmljZTo6aWQgaWQ7Ci0jZW5kaWYKLQotICAvLy8gVGhlIHRpbWUgdHJhaXRzIHR5cGUuCi0gIHR5cGVkZWYgVGltZVRyYWl0cyB0cmFpdHNfdHlwZTsKLQotICAvLy8gVGhlIHRpbWUgdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6dGltZV90eXBlIHRpbWVfdHlwZTsKLQotICAvLy8gVGhlIGR1cmF0aW9uIHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmR1cmF0aW9uX3R5cGUgZHVyYXRpb25fdHlwZTsKLQotcHJpdmF0ZToKLSAgLy8gVGhlIHR5cGUgb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotICB0eXBlZGVmIGRldGFpbDo6ZGVhZGxpbmVfdGltZXJfc2VydmljZTx0cmFpdHNfdHlwZT4gc2VydmljZV9pbXBsX3R5cGU7Ci0KLXB1YmxpYzoKLSAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbiB0eXBlIG9mIHRoZSBkZWFkbGluZSB0aW1lci4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIGltcGxlbWVudGF0aW9uX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHR5cGVuYW1lIHNlcnZpY2VfaW1wbF90eXBlOjppbXBsZW1lbnRhdGlvbl90eXBlIGltcGxlbWVudGF0aW9uX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gQ29uc3RydWN0IGEgbmV3IHRpbWVyIHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgaW9fc2VydmljZS4KLSAgZXhwbGljaXQgZGVhZGxpbmVfdGltZXJfc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8Ci0gICAgICAgIGRlYWRsaW5lX3RpbWVyX3NlcnZpY2U8VGltZVR5cGUsIFRpbWVUcmFpdHM+ID4oaW9fc2VydmljZSksCi0gICAgICBzZXJ2aWNlX2ltcGxfKGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgdGltZXIgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmNvbnN0cnVjdChpbXBsKTsKLSAgfQotCi0gIC8vLyBEZXN0cm95IGEgdGltZXIgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgZGVzdHJveShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5kZXN0cm95KGltcGwpOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbnkgYXN5bmNocm9ub3VzIHdhaXQgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVyLgotICBzdGQ6OnNpemVfdCBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5jYW5jZWwoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIENhbmNlbHMgb25lIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVyLgotICBzdGQ6OnNpemVfdCBjYW5jZWxfb25lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNhbmNlbF9vbmUoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgZXhwaXJ5IHRpbWUgZm9yIHRoZSB0aW1lciBhcyBhbiBhYnNvbHV0ZSB0aW1lLgotICB0aW1lX3R5cGUgZXhwaXJlc19hdChjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uZXhwaXJlc19hdChpbXBsKTsKLSAgfQotCi0gIC8vLyBTZXQgdGhlIGV4cGlyeSB0aW1lIGZvciB0aGUgdGltZXIgYXMgYW4gYWJzb2x1dGUgdGltZS4KLSAgc3RkOjpzaXplX3QgZXhwaXJlc19hdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgdGltZV90eXBlJiBleHBpcnlfdGltZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5leHBpcmVzX2F0KGltcGwsIGV4cGlyeV90aW1lLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBleHBpcnkgdGltZSBmb3IgdGhlIHRpbWVyIHJlbGF0aXZlIHRvIG5vdy4KLSAgZHVyYXRpb25fdHlwZSBleHBpcmVzX2Zyb21fbm93KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5leHBpcmVzX2Zyb21fbm93KGltcGwpOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgZXhwaXJ5IHRpbWUgZm9yIHRoZSB0aW1lciByZWxhdGl2ZSB0byBub3cuCi0gIHN0ZDo6c2l6ZV90IGV4cGlyZXNfZnJvbV9ub3coaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IGR1cmF0aW9uX3R5cGUmIGV4cGlyeV90aW1lLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmV4cGlyZXNfZnJvbV9ub3coaW1wbCwgZXhwaXJ5X3RpbWUsIGVjKTsKLSAgfQotCi0gIC8vIFBlcmZvcm0gYSBibG9ja2luZyB3YWl0IG9uIHRoZSB0aW1lci4KLSAgdm9pZCB3YWl0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy53YWl0KGltcGwsIGVjKTsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3YWl0IG9uIHRoZSB0aW1lci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFdhaXRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXYWl0SGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUpKQotICBhc3luY193YWl0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBBU0lPX01PVkVfQVJHKFdhaXRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFdhaXRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlKT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoV2FpdEhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICAgIHNlcnZpY2VfaW1wbF8uYXN5bmNfd2FpdChpbXBsLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIHZvaWQgc2h1dGRvd25fc2VydmljZSgpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLnNodXRkb3duX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSAgc2VydmljZV9pbXBsX3R5cGUgc2VydmljZV9pbXBsXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfREFURV9USU1FKQotICAgICAgIC8vIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jZW5kaWYgLy8gQVNJT19ERUFETElORV9USU1FUl9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmJlYTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvYWRkcmVzc29mLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfQUREUkVTU09GX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9BRERSRVNTT0ZfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9BRERSRVNTT0YpCi0jIGluY2x1ZGUgPG1lbW9yeT4KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FERFJFU1NPRikKLSMgaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9hZGRyZXNzb2YuaHBwPgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FERFJFU1NPRikKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9BRERSRVNTT0YpCi11c2luZyBzdGQ6OmFkZHJlc3NvZjsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FERFJFU1NPRikKLXVzaW5nIGJvb3N0OjphZGRyZXNzb2Y7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfQUREUkVTU09GKQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0FERFJFU1NPRl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYXJyYXkuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9hcnJheS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWY4NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9hcnJheS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2FycmF5LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9BUlJBWV9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfQVJSQVlfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9BUlJBWSkKLSMgaW5jbHVkZSA8YXJyYXk+Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9BUlJBWSkKLSMgaW5jbHVkZSA8Ym9vc3QvYXJyYXkuaHBwPgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotdXNpbmcgc3RkOjphcnJheTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotdXNpbmcgYm9vc3Q6OmFycmF5OwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0FSUkFZX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9hcnJheV9md2QuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9hcnJheV9md2QuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTNlY2EzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYXJyYXlfZndkLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvYXJyYXlfZndkLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfQVJSQVlfRldEX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9BUlJBWV9GV0RfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLW5hbWVzcGFjZSBib29zdCB7Ci0KLXRlbXBsYXRlPGNsYXNzIFQsIHN0ZDo6c2l6ZV90IE4+Ci1jbGFzcyBhcnJheTsKLQotfSAvLyBuYW1lc3BhY2UgYm9vc3QKLQotLy8gU3RhbmRhcmQgbGlicmFyeSBjb21wb25lbnRzIGNhbid0IGJlIGZvcndhcmQgZGVjbGFyZWQsIHNvIHdlJ2xsIGhhdmUgdG8KLS8vIGluY2x1ZGUgdGhlIGFycmF5IGhlYWRlci4gRm9ydHVuYXRlbHksIGl0J3MgZmFpcmx5IGxpZ2h0d2VpZ2h0IGFuZCBkb2Vzbid0Ci0vLyBhZGQgc2lnbmlmaWNhbnRseSB0byB0aGUgY29tcGlsZSB0aW1lLgotI2lmIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotIyBpbmNsdWRlIDxhcnJheT4KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9BUlJBWSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0FSUkFZX0ZXRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYXNzZXJ0LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYXNzZXJ0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0YzBkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2Fzc2VydC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLwotLy8gZGV0YWlsL2Fzc2VydC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0FTU0VSVF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfQVNTRVJUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19CT09TVF9BU1NFUlQpCi0jIGluY2x1ZGUgPGJvb3N0L2Fzc2VydC5ocHA+Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0FTU0VSVCkKLSMgaW5jbHVkZSA8Y2Fzc2VydD4KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0FTU0VSVCkKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQVNTRVJUKQotIyBkZWZpbmUgQVNJT19BU1NFUlQoZXhwcikgQk9PU1RfQVNTRVJUKGV4cHIpCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0FTU0VSVCkKLSMgZGVmaW5lIEFTSU9fQVNTRVJUKGV4cHIpIGFzc2VydChleHByKQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQVNTRVJUKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfQVNTRVJUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9hdG9taWNfY291bnQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9hdG9taWNfY291bnQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTU2ZGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYXRvbWljX2NvdW50LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvYXRvbWljX2NvdW50LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfQVRPTUlDX0NPVU5UX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9BVE9NSUNfQ09VTlRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotLy8gTm90aGluZyB0byBpbmNsdWRlLgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19TVERfQVRPTUlDKQotIyBpbmNsdWRlIDxhdG9taWM+Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9BVE9NSUMpCi0jIGluY2x1ZGUgPGJvb3N0L2RldGFpbC9hdG9taWNfY291bnQuaHBwPgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FUT01JQykKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotdHlwZWRlZiBsb25nIGF0b21pY19jb3VudDsKLWlubGluZSB2b2lkIGluY3JlbWVudChhdG9taWNfY291bnQmIGEsIGxvbmcgYikgeyBhICs9IGI7IH0KLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfU1REX0FUT01JQykKLXR5cGVkZWYgc3RkOjphdG9taWM8bG9uZz4gYXRvbWljX2NvdW50OwotaW5saW5lIHZvaWQgaW5jcmVtZW50KGF0b21pY19jb3VudCYgYSwgbG9uZyBiKSB7IGEgKz0gYjsgfQotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfQVRPTUlDKQotdHlwZWRlZiBib29zdDo6ZGV0YWlsOjphdG9taWNfY291bnQgYXRvbWljX2NvdW50OwotaW5saW5lIHZvaWQgaW5jcmVtZW50KGF0b21pY19jb3VudCYgYSwgbG9uZyBiKSB7IHdoaWxlIChiID4gMCkgKythLCAtLWI7IH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9BVE9NSUMpCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfQVRPTUlDX0NPVU5UX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9iYXNlX2Zyb21fY29tcGxldGlvbl9jb25kLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWE2MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9iYXNlX2Zyb21fY29tcGxldGlvbl9jb25kLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvYmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9CQVNFX0ZST01fQ09NUExFVElPTl9DT05EX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9CQVNFX0ZST01fQ09NUExFVElPTl9DT05EX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vY29tcGxldGlvbl9jb25kaXRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotY2xhc3MgYmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZAotewotcHJvdGVjdGVkOgotICBleHBsaWNpdCBiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kKENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24pCi0gICAgOiBjb21wbGV0aW9uX2NvbmRpdGlvbl8oY29tcGxldGlvbl9jb25kaXRpb24pCi0gIHsKLSAgfQotCi0gIHN0ZDo6c2l6ZV90IGNoZWNrX2Zvcl9jb21wbGV0aW9uKAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICBzdGQ6OnNpemVfdCB0b3RhbF90cmFuc2ZlcnJlZCkKLSAgewotICAgIHJldHVybiBkZXRhaWw6OmFkYXB0X2NvbXBsZXRpb25fY29uZGl0aW9uX3Jlc3VsdCgKLSAgICAgICAgY29tcGxldGlvbl9jb25kaXRpb25fKGVjLCB0b3RhbF90cmFuc2ZlcnJlZCkpOwotICB9Ci0KLXByaXZhdGU6Ci0gIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb25fOwotfTsKLQotdGVtcGxhdGUgPD4KLWNsYXNzIGJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8dHJhbnNmZXJfYWxsX3Q+Ci17Ci1wcm90ZWN0ZWQ6Ci0gIGV4cGxpY2l0IGJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQodHJhbnNmZXJfYWxsX3QpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnNpemVfdCBjaGVja19mb3JfY29tcGxldGlvbigKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWQpCi0gIHsKLSAgICByZXR1cm4gdHJhbnNmZXJfYWxsX3QoKShlYywgdG90YWxfdHJhbnNmZXJyZWQpOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0JBU0VfRlJPTV9DT01QTEVUSU9OX0NPTkRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjY2U3NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvYmluZF9oYW5kbGVyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfQklORF9IQU5ETEVSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9CSU5EX0hBTkRMRVJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2NvbnRfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzE+Ci1jbGFzcyBiaW5kZXIxCi17Ci1wdWJsaWM6Ci0gIGJpbmRlcjEoY29uc3QgSGFuZGxlciYgaGFuZGxlciwgY29uc3QgQXJnMSYgYXJnMSkKLSAgICA6IGhhbmRsZXJfKGhhbmRsZXIpLAotICAgICAgYXJnMV8oYXJnMSkKLSAgewotICB9Ci0KLSAgYmluZGVyMShIYW5kbGVyJiBoYW5kbGVyLCBjb25zdCBBcmcxJiBhcmcxKQotICAgIDogaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpLAotICAgICAgYXJnMV8oYXJnMSkKLSAgewotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcigpKCkKLSAgewotICAgIGhhbmRsZXJfKHN0YXRpY19jYXN0PGNvbnN0IEFyZzEmPihhcmcxXykpOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcigpKCkgY29uc3QKLSAgewotICAgIGhhbmRsZXJfKGFyZzFfKTsKLSAgfQotCi0vL3ByaXZhdGU6Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci0gIEFyZzEgYXJnMV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgQXJnMT4KLWlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICBiaW5kZXIxPEhhbmRsZXIsIEFyZzE+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIHJldHVybiBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzE+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgIGJpbmRlcjE8SGFuZGxlciwgQXJnMT4qIHRoaXNfaGFuZGxlcikKLXsKLSAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmRlYWxsb2NhdGUoCi0gICAgICBwb2ludGVyLCBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzE+Ci1pbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgIGJpbmRlcjE8SGFuZGxlciwgQXJnMT4qIHRoaXNfaGFuZGxlcikKLXsKLSAgcmV0dXJuIGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbigKLSAgICAgIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzE+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICBiaW5kZXIxPEhhbmRsZXIsIEFyZzE+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzE+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICBiaW5kZXIxPEhhbmRsZXIsIEFyZzE+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgQXJnMT4KLWlubGluZSBiaW5kZXIxPEhhbmRsZXIsIEFyZzE+IGJpbmRfaGFuZGxlcihIYW5kbGVyIGhhbmRsZXIsCi0gICAgY29uc3QgQXJnMSYgYXJnMSkKLXsKLSAgcmV0dXJuIGJpbmRlcjE8SGFuZGxlciwgQXJnMT4oaGFuZGxlciwgYXJnMSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgotY2xhc3MgYmluZGVyMgotewotcHVibGljOgotICBiaW5kZXIyKGNvbnN0IEhhbmRsZXImIGhhbmRsZXIsIGNvbnN0IEFyZzEmIGFyZzEsIGNvbnN0IEFyZzImIGFyZzIpCi0gICAgOiBoYW5kbGVyXyhoYW5kbGVyKSwKLSAgICAgIGFyZzFfKGFyZzEpLAotICAgICAgYXJnMl8oYXJnMikKLSAgewotICB9Ci0KLSAgYmluZGVyMihIYW5kbGVyJiBoYW5kbGVyLCBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyKQotICAgIDogaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpLAotICAgICAgYXJnMV8oYXJnMSksCi0gICAgICBhcmcyXyhhcmcyKQotICB7Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yKCkoKQotICB7Ci0gICAgaGFuZGxlcl8oc3RhdGljX2Nhc3Q8Y29uc3QgQXJnMSY+KGFyZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXJnMiY+KGFyZzJfKSk7Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdAotICB7Ci0gICAgaGFuZGxlcl8oYXJnMV8sIGFyZzJfKTsKLSAgfQotCi0vL3ByaXZhdGU6Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci0gIEFyZzEgYXJnMV87Ci0gIEFyZzIgYXJnMl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4KLWlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICBiaW5kZXIyPEhhbmRsZXIsIEFyZzEsIEFyZzI+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIHJldHVybiBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgIGJpbmRlcjI8SGFuZGxlciwgQXJnMSwgQXJnMj4qIHRoaXNfaGFuZGxlcikKLXsKLSAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmRlYWxsb2NhdGUoCi0gICAgICBwb2ludGVyLCBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+Ci1pbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgIGJpbmRlcjI8SGFuZGxlciwgQXJnMSwgQXJnMj4qIHRoaXNfaGFuZGxlcikKLXsKLSAgcmV0dXJuIGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbigKLSAgICAgIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICBiaW5kZXIyPEhhbmRsZXIsIEFyZzEsIEFyZzI+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICBiaW5kZXIyPEhhbmRsZXIsIEFyZzEsIEFyZzI+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4KLWlubGluZSBiaW5kZXIyPEhhbmRsZXIsIEFyZzEsIEFyZzI+IGJpbmRfaGFuZGxlcihIYW5kbGVyIGhhbmRsZXIsCi0gICAgY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMikKLXsKLSAgcmV0dXJuIGJpbmRlcjI8SGFuZGxlciwgQXJnMSwgQXJnMj4oaGFuZGxlciwgYXJnMSwgYXJnMik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczPgotY2xhc3MgYmluZGVyMwotewotcHVibGljOgotICBiaW5kZXIzKGNvbnN0IEhhbmRsZXImIGhhbmRsZXIsIGNvbnN0IEFyZzEmIGFyZzEsIGNvbnN0IEFyZzImIGFyZzIsCi0gICAgICBjb25zdCBBcmczJiBhcmczKQotICAgIDogaGFuZGxlcl8oaGFuZGxlciksCi0gICAgICBhcmcxXyhhcmcxKSwKLSAgICAgIGFyZzJfKGFyZzIpLAotICAgICAgYXJnM18oYXJnMykKLSAgewotICB9Ci0KLSAgYmluZGVyMyhIYW5kbGVyJiBoYW5kbGVyLCBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLAotICAgICAgY29uc3QgQXJnMyYgYXJnMykKLSAgICA6IGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKGhhbmRsZXIpKSwKLSAgICAgIGFyZzFfKGFyZzEpLAotICAgICAgYXJnMl8oYXJnMiksCi0gICAgICBhcmczXyhhcmczKQotICB7Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yKCkoKQotICB7Ci0gICAgaGFuZGxlcl8oc3RhdGljX2Nhc3Q8Y29uc3QgQXJnMSY+KGFyZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXJnMiY+KGFyZzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXJnMyY+KGFyZzNfKSk7Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdAotICB7Ci0gICAgaGFuZGxlcl8oYXJnMV8sIGFyZzJfLCBhcmczXyk7Ci0gIH0KLQotLy9wcml2YXRlOgotICBIYW5kbGVyIGhhbmRsZXJfOwotICBBcmcxIGFyZzFfOwotICBBcmcyIGFyZzJfOwotICBBcmczIGFyZzNfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzM+Ci1pbmxpbmUgdm9pZCogYXNpb19oYW5kbGVyX2FsbG9jYXRlKHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgYmluZGVyMzxIYW5kbGVyLCBBcmcxLCBBcmcyLCBBcmczPiogdGhpc19oYW5kbGVyKQotewotICByZXR1cm4gYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczPgotaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUodm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICBiaW5kZXIzPEhhbmRsZXIsIEFyZzEsIEFyZzIsIEFyZzM+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjpkZWFsbG9jYXRlKAotICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczPgotaW5saW5lIGJvb2wgYXNpb19oYW5kbGVyX2lzX2NvbnRpbnVhdGlvbigKLSAgICBiaW5kZXIzPEhhbmRsZXIsIEFyZzEsIEFyZzIsIEFyZzM+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIHJldHVybiBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oCi0gICAgICB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLAotICAgIHR5cGVuYW1lIEFyZzM+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICBiaW5kZXIzPEhhbmRsZXIsIEFyZzEsIEFyZzIsIEFyZzM+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsCi0gICAgdHlwZW5hbWUgQXJnMz4KLWlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgIGJpbmRlcjM8SGFuZGxlciwgQXJnMSwgQXJnMiwgQXJnMz4qIHRoaXNfaGFuZGxlcikKLXsKLSAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczPgotaW5saW5lIGJpbmRlcjM8SGFuZGxlciwgQXJnMSwgQXJnMiwgQXJnMz4gYmluZF9oYW5kbGVyKEhhbmRsZXIgaGFuZGxlciwKLSAgICBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLCBjb25zdCBBcmczJiBhcmczKQotewotICByZXR1cm4gYmluZGVyMzxIYW5kbGVyLCBBcmcxLCBBcmcyLCBBcmczPihoYW5kbGVyLCBhcmcxLCBhcmcyLCBhcmczKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCi0gICAgdHlwZW5hbWUgQXJnND4KLWNsYXNzIGJpbmRlcjQKLXsKLXB1YmxpYzoKLSAgYmluZGVyNChjb25zdCBIYW5kbGVyJiBoYW5kbGVyLCBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLAotICAgICAgY29uc3QgQXJnMyYgYXJnMywgY29uc3QgQXJnNCYgYXJnNCkKLSAgICA6IGhhbmRsZXJfKGhhbmRsZXIpLAotICAgICAgYXJnMV8oYXJnMSksCi0gICAgICBhcmcyXyhhcmcyKSwKLSAgICAgIGFyZzNfKGFyZzMpLAotICAgICAgYXJnNF8oYXJnNCkKLSAgewotICB9Ci0KLSAgYmluZGVyNChIYW5kbGVyJiBoYW5kbGVyLCBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLAotICAgICAgY29uc3QgQXJnMyYgYXJnMywgY29uc3QgQXJnNCYgYXJnNCkKLSAgICA6IGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKGhhbmRsZXIpKSwKLSAgICAgIGFyZzFfKGFyZzEpLAotICAgICAgYXJnMl8oYXJnMiksCi0gICAgICBhcmczXyhhcmczKSwKLSAgICAgIGFyZzRfKGFyZzQpCi0gIHsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3IoKSgpCi0gIHsKLSAgICBoYW5kbGVyXyhzdGF0aWNfY2FzdDxjb25zdCBBcmcxJj4oYXJnMV8pLAotICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBcmcyJj4oYXJnMl8pLAotICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBcmczJj4oYXJnM18pLAotICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBcmc0Jj4oYXJnNF8pKTsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3IoKSgpIGNvbnN0Ci0gIHsKLSAgICBoYW5kbGVyXyhhcmcxXywgYXJnMl8sIGFyZzNfLCBhcmc0Xyk7Ci0gIH0KLQotLy9wcml2YXRlOgotICBIYW5kbGVyIGhhbmRsZXJfOwotICBBcmcxIGFyZzFfOwotICBBcmcyIGFyZzJfOwotICBBcmczIGFyZzNfOwotICBBcmc0IGFyZzRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCi0gICAgdHlwZW5hbWUgQXJnND4KLWlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICBiaW5kZXI0PEhhbmRsZXIsIEFyZzEsIEFyZzIsIEFyZzMsIEFyZzQ+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIHJldHVybiBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCi0gICAgdHlwZW5hbWUgQXJnND4KLWlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9kZWFsbG9jYXRlKHZvaWQqIHBvaW50ZXIsIHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgYmluZGVyNDxIYW5kbGVyLCBBcmcxLCBBcmcyLCBBcmczLCBBcmc0PiogdGhpc19oYW5kbGVyKQotewotICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6ZGVhbGxvY2F0ZSgKLSAgICAgIHBvaW50ZXIsIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKLSAgICB0eXBlbmFtZSBBcmc0PgotaW5saW5lIGJvb2wgYXNpb19oYW5kbGVyX2lzX2NvbnRpbnVhdGlvbigKLSAgICBiaW5kZXI0PEhhbmRsZXIsIEFyZzEsIEFyZzIsIEFyZzMsIEFyZzQ+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIHJldHVybiBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oCi0gICAgICB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLAotICAgIHR5cGVuYW1lIEFyZzMsIHR5cGVuYW1lIEFyZzQ+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICBiaW5kZXI0PEhhbmRsZXIsIEFyZzEsIEFyZzIsIEFyZzMsIEFyZzQ+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsCi0gICAgdHlwZW5hbWUgQXJnMywgdHlwZW5hbWUgQXJnND4KLWlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgIGJpbmRlcjQ8SGFuZGxlciwgQXJnMSwgQXJnMiwgQXJnMywgQXJnND4qIHRoaXNfaGFuZGxlcikKLXsKLSAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAotICAgIHR5cGVuYW1lIEFyZzQ+Ci1pbmxpbmUgYmluZGVyNDxIYW5kbGVyLCBBcmcxLCBBcmcyLCBBcmczLCBBcmc0PiBiaW5kX2hhbmRsZXIoCi0gICAgSGFuZGxlciBoYW5kbGVyLCBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLAotICAgIGNvbnN0IEFyZzMmIGFyZzMsIGNvbnN0IEFyZzQmIGFyZzQpCi17Ci0gIHJldHVybiBiaW5kZXI0PEhhbmRsZXIsIEFyZzEsIEFyZzIsIEFyZzMsIEFyZzQ+KGhhbmRsZXIsIGFyZzEsIGFyZzIsIGFyZzMsCi0gICAgICBhcmc0KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCi0gICAgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgQXJnNT4KLWNsYXNzIGJpbmRlcjUKLXsKLXB1YmxpYzoKLSAgYmluZGVyNShjb25zdCBIYW5kbGVyJiBoYW5kbGVyLCBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLAotICAgICAgY29uc3QgQXJnMyYgYXJnMywgY29uc3QgQXJnNCYgYXJnNCwgY29uc3QgQXJnNSYgYXJnNSkKLSAgICA6IGhhbmRsZXJfKGhhbmRsZXIpLAotICAgICAgYXJnMV8oYXJnMSksCi0gICAgICBhcmcyXyhhcmcyKSwKLSAgICAgIGFyZzNfKGFyZzMpLAotICAgICAgYXJnNF8oYXJnNCksCi0gICAgICBhcmc1Xyhhcmc1KQotICB7Ci0gIH0KLQotICBiaW5kZXI1KEhhbmRsZXImIGhhbmRsZXIsIGNvbnN0IEFyZzEmIGFyZzEsIGNvbnN0IEFyZzImIGFyZzIsCi0gICAgICBjb25zdCBBcmczJiBhcmczLCBjb25zdCBBcmc0JiBhcmc0LCBjb25zdCBBcmc1JiBhcmc1KQotICAgIDogaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpLAotICAgICAgYXJnMV8oYXJnMSksCi0gICAgICBhcmcyXyhhcmcyKSwKLSAgICAgIGFyZzNfKGFyZzMpLAotICAgICAgYXJnNF8oYXJnNCksCi0gICAgICBhcmc1Xyhhcmc1KQotICB7Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yKCkoKQotICB7Ci0gICAgaGFuZGxlcl8oc3RhdGljX2Nhc3Q8Y29uc3QgQXJnMSY+KGFyZzFfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXJnMiY+KGFyZzJfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXJnMyY+KGFyZzNfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXJnNCY+KGFyZzRfKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQXJnNSY+KGFyZzVfKSk7Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdAotICB7Ci0gICAgaGFuZGxlcl8oYXJnMV8sIGFyZzJfLCBhcmczXywgYXJnNF8sIGFyZzVfKTsKLSAgfQotCi0vL3ByaXZhdGU6Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci0gIEFyZzEgYXJnMV87Ci0gIEFyZzIgYXJnMl87Ci0gIEFyZzMgYXJnM187Ci0gIEFyZzQgYXJnNF87Ci0gIEFyZzUgYXJnNV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKLSAgICB0eXBlbmFtZSBBcmc0LCB0eXBlbmFtZSBBcmc1PgotaW5saW5lIHZvaWQqIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzdGQ6OnNpemVfdCBzaXplLAotICAgIGJpbmRlcjU8SGFuZGxlciwgQXJnMSwgQXJnMiwgQXJnMywgQXJnNCwgQXJnNT4qIHRoaXNfaGFuZGxlcikKLXsKLSAgcmV0dXJuIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKLSAgICB0eXBlbmFtZSBBcmc0LCB0eXBlbmFtZSBBcmc1PgotaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUodm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICBiaW5kZXI1PEhhbmRsZXIsIEFyZzEsIEFyZzIsIEFyZzMsIEFyZzQsIEFyZzU+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjpkZWFsbG9jYXRlKAotICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAotICAgIHR5cGVuYW1lIEFyZzQsIHR5cGVuYW1lIEFyZzU+Ci1pbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgIGJpbmRlcjU8SGFuZGxlciwgQXJnMSwgQXJnMiwgQXJnMywgQXJnNCwgQXJnNT4qIHRoaXNfaGFuZGxlcikKLXsKLSAgcmV0dXJuIGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbigKLSAgICAgIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsCi0gICAgdHlwZW5hbWUgQXJnMywgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgQXJnNT4KLWlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgIGJpbmRlcjU8SGFuZGxlciwgQXJnMSwgQXJnMiwgQXJnMywgQXJnNCwgQXJnNT4qIHRoaXNfaGFuZGxlcikKLXsKLSAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwKLSAgICB0eXBlbmFtZSBBcmczLCB0eXBlbmFtZSBBcmc0LCB0eXBlbmFtZSBBcmc1PgotaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2ludm9rZShjb25zdCBGdW5jdGlvbiYgZnVuY3Rpb24sCi0gICAgYmluZGVyNTxIYW5kbGVyLCBBcmcxLCBBcmcyLCBBcmczLCBBcmc0LCBBcmc1PiogdGhpc19oYW5kbGVyKQotewotICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCi0gICAgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgQXJnNT4KLWlubGluZSBiaW5kZXI1PEhhbmRsZXIsIEFyZzEsIEFyZzIsIEFyZzMsIEFyZzQsIEFyZzU+IGJpbmRfaGFuZGxlcigKLSAgICBIYW5kbGVyIGhhbmRsZXIsIGNvbnN0IEFyZzEmIGFyZzEsIGNvbnN0IEFyZzImIGFyZzIsCi0gICAgY29uc3QgQXJnMyYgYXJnMywgY29uc3QgQXJnNCYgYXJnNCwgY29uc3QgQXJnNSYgYXJnNSkKLXsKLSAgcmV0dXJuIGJpbmRlcjU8SGFuZGxlciwgQXJnMSwgQXJnMiwgQXJnMywgQXJnNCwgQXJnNT4oaGFuZGxlciwgYXJnMSwgYXJnMiwKLSAgICAgIGFyZzMsIGFyZzQsIGFyZzUpOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0JJTkRfSEFORExFUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYnVmZmVyX3Jlc2l6ZV9ndWFyZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2J1ZmZlcl9yZXNpemVfZ3VhcmQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTMzYzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYnVmZmVyX3Jlc2l6ZV9ndWFyZC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLwotLy8gZGV0YWlsL2J1ZmZlcl9yZXNpemVfZ3VhcmQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfQlVGRkVSX1JFU0laRV9HVUFSRF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfQlVGRkVSX1JFU0laRV9HVUFSRF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9saW1pdHMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLS8vIEhlbHBlciBjbGFzcyB0byBtYW5hZ2UgYnVmZmVyIHJlc2l6aW5nIGluIGFuIGV4Y2VwdGlvbiBzYWZlIHdheS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBCdWZmZXI+Ci1jbGFzcyBidWZmZXJfcmVzaXplX2d1YXJkCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBidWZmZXJfcmVzaXplX2d1YXJkKEJ1ZmZlciYgYnVmZmVyKQotICAgIDogYnVmZmVyXyhidWZmZXIpLAotICAgICAgb2xkX3NpemVfKGJ1ZmZlci5zaXplKCkpCi0gIHsKLSAgfQotCi0gIC8vIERlc3RydWN0b3Igcm9sbHMgYmFjayB0aGUgYnVmZmVyIHJlc2l6ZSB1bmxlc3MgY29tbWl0IHdhcyBjYWxsZWQuCi0gIH5idWZmZXJfcmVzaXplX2d1YXJkKCkKLSAgewotICAgIGlmIChvbGRfc2l6ZV8gIT0gKHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KSgpKQotICAgIHsKLSAgICAgIGJ1ZmZlcl8ucmVzaXplKG9sZF9zaXplXyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29tbWl0IHRoZSByZXNpemUgdHJhbnNhY3Rpb24uCi0gIHZvaWQgY29tbWl0KCkKLSAgewotICAgIG9sZF9zaXplXyA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCkoKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBUaGUgYnVmZmVyIGJlaW5nIG1hbmFnZWQuCi0gIEJ1ZmZlciYgYnVmZmVyXzsKLQotICAvLyBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGF0IHRoZSB0aW1lIHRoZSBndWFyZCB3YXMgY29uc3RydWN0ZWQuCi0gIHNpemVfdCBvbGRfc2l6ZV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0JVRkZFUl9SRVNJWkVfR1VBUkRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjM4OGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0JVRkZFUl9TRVFVRU5DRV9BREFQVEVSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9CVUZGRVJfU0VRVUVOQ0VfQURBUFRFUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2J1ZmZlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYXJyYXlfZndkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyX2Jhc2UKLXsKLXByb3RlY3RlZDoKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyB0byBzdXBwb3J0IGluIGEgc2luZ2xlIG9wZXJhdGlvbi4KLSAgZW51bSB7IG1heF9idWZmZXJzID0gMSB9OwotCi0gIHR5cGVkZWYgV2luZG93czo6U3RvcmFnZTo6U3RyZWFtczo6SUJ1ZmZlcl4gbmF0aXZlX2J1ZmZlcl90eXBlOwotCi0gIEFTSU9fREVDTCBzdGF0aWMgdm9pZCBpbml0X25hdGl2ZV9idWZmZXIoCi0gICAgICBuYXRpdmVfYnVmZmVyX3R5cGUmIGJ1ZiwKLSAgICAgIGNvbnN0IGFzaW86Om11dGFibGVfYnVmZmVyJiBidWZmZXIpOwotCi0gIEFTSU9fREVDTCBzdGF0aWMgdm9pZCBpbml0X25hdGl2ZV9idWZmZXIoCi0gICAgICBuYXRpdmVfYnVmZmVyX3R5cGUmIGJ1ZiwKLSAgICAgIGNvbnN0IGFzaW86OmNvbnN0X2J1ZmZlciYgYnVmZmVyKTsKLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIHRvIHN1cHBvcnQgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLgotICBlbnVtIHsgbWF4X2J1ZmZlcnMgPSA2NCA8IG1heF9pb3ZfbGVuID8gNjQgOiBtYXhfaW92X2xlbiB9OwotCi0gIHR5cGVkZWYgV1NBQlVGIG5hdGl2ZV9idWZmZXJfdHlwZTsKLQotICBzdGF0aWMgdm9pZCBpbml0X25hdGl2ZV9idWZmZXIoV1NBQlVGJiBidWYsCi0gICAgICBjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlciYgYnVmZmVyKQotICB7Ci0gICAgYnVmLmJ1ZiA9IGFzaW86OmJ1ZmZlcl9jYXN0PGNoYXIqPihidWZmZXIpOwotICAgIGJ1Zi5sZW4gPSBzdGF0aWNfY2FzdDxVTE9ORz4oYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVyKSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBpbml0X25hdGl2ZV9idWZmZXIoV1NBQlVGJiBidWYsCi0gICAgICBjb25zdCBhc2lvOjpjb25zdF9idWZmZXImIGJ1ZmZlcikKLSAgewotICAgIGJ1Zi5idWYgPSBjb25zdF9jYXN0PGNoYXIqPihhc2lvOjpidWZmZXJfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyKSk7Ci0gICAgYnVmLmxlbiA9IHN0YXRpY19jYXN0PFVMT05HPihhc2lvOjpidWZmZXJfc2l6ZShidWZmZXIpKTsKLSAgfQotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gc3VwcG9ydCBpbiBhIHNpbmdsZSBvcGVyYXRpb24uCi0gIGVudW0geyBtYXhfYnVmZmVycyA9IDY0IDwgbWF4X2lvdl9sZW4gPyA2NCA6IG1heF9pb3ZfbGVuIH07Ci0KLSAgdHlwZWRlZiBpb3ZlYyBuYXRpdmVfYnVmZmVyX3R5cGU7Ci0KLSAgc3RhdGljIHZvaWQgaW5pdF9pb3ZfYmFzZSh2b2lkKiYgYmFzZSwgdm9pZCogYWRkcikKLSAgewotICAgIGJhc2UgPSBhZGRyOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyB2b2lkIGluaXRfaW92X2Jhc2UoVCYgYmFzZSwgdm9pZCogYWRkcikKLSAgewotICAgIGJhc2UgPSBzdGF0aWNfY2FzdDxUPihhZGRyKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGluaXRfbmF0aXZlX2J1ZmZlcihpb3ZlYyYgaW92LAotICAgICAgY29uc3QgYXNpbzo6bXV0YWJsZV9idWZmZXImIGJ1ZmZlcikKLSAgewotICAgIGluaXRfaW92X2Jhc2UoaW92Lmlvdl9iYXNlLCBhc2lvOjpidWZmZXJfY2FzdDx2b2lkKj4oYnVmZmVyKSk7Ci0gICAgaW92Lmlvdl9sZW4gPSBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXIpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgaW5pdF9uYXRpdmVfYnVmZmVyKGlvdmVjJiBpb3YsCi0gICAgICBjb25zdCBhc2lvOjpjb25zdF9idWZmZXImIGJ1ZmZlcikKLSAgewotICAgIGluaXRfaW92X2Jhc2UoaW92Lmlvdl9iYXNlLCBjb25zdF9jYXN0PHZvaWQqPigKLSAgICAgICAgICBhc2lvOjpidWZmZXJfY2FzdDxjb25zdCB2b2lkKj4oYnVmZmVyKSkpOwotICAgIGlvdi5pb3ZfbGVuID0gYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVyKTsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi19OwotCi0vLyBIZWxwZXIgY2xhc3MgdG8gdHJhbnNsYXRlIGJ1ZmZlcnMgaW50byB0aGUgbmF0aXZlIGJ1ZmZlciByZXByZXNlbnRhdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBCdWZmZXIsIHR5cGVuYW1lIEJ1ZmZlcnM+Ci1jbGFzcyBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcgotICA6IGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyX2Jhc2UKLXsKLXB1YmxpYzoKLSAgZXhwbGljaXQgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIoY29uc3QgQnVmZmVycyYgYnVmZmVyX3NlcXVlbmNlKQotICAgIDogY291bnRfKDApLCB0b3RhbF9idWZmZXJfc2l6ZV8oMCkKLSAgewotICAgIHR5cGVuYW1lIEJ1ZmZlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBidWZmZXJfc2VxdWVuY2UuYmVnaW4oKTsKLSAgICB0eXBlbmFtZSBCdWZmZXJzOjpjb25zdF9pdGVyYXRvciBlbmQgPSBidWZmZXJfc2VxdWVuY2UuZW5kKCk7Ci0gICAgZm9yICg7IGl0ZXIgIT0gZW5kICYmIGNvdW50XyA8IG1heF9idWZmZXJzOyArK2l0ZXIsICsrY291bnRfKQotICAgIHsKLSAgICAgIEJ1ZmZlciBidWZmZXIoKml0ZXIpOwotICAgICAgaW5pdF9uYXRpdmVfYnVmZmVyKGJ1ZmZlcnNfW2NvdW50X10sIGJ1ZmZlcik7Ci0gICAgICB0b3RhbF9idWZmZXJfc2l6ZV8gKz0gYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVyKTsKLSAgICB9Ci0gIH0KLQotICBuYXRpdmVfYnVmZmVyX3R5cGUqIGJ1ZmZlcnMoKQotICB7Ci0gICAgcmV0dXJuIGJ1ZmZlcnNfOwotICB9Ci0KLSAgc3RkOjpzaXplX3QgY291bnQoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGNvdW50XzsKLSAgfQotCi0gIGJvb2wgYWxsX2VtcHR5KCkgY29uc3QKLSAgewotICAgIHJldHVybiB0b3RhbF9idWZmZXJfc2l6ZV8gPT0gMDsKLSAgfQotCi0gIHN0YXRpYyBib29sIGFsbF9lbXB0eShjb25zdCBCdWZmZXJzJiBidWZmZXJfc2VxdWVuY2UpCi0gIHsKLSAgICB0eXBlbmFtZSBCdWZmZXJzOjpjb25zdF9pdGVyYXRvciBpdGVyID0gYnVmZmVyX3NlcXVlbmNlLmJlZ2luKCk7Ci0gICAgdHlwZW5hbWUgQnVmZmVyczo6Y29uc3RfaXRlcmF0b3IgZW5kID0gYnVmZmVyX3NlcXVlbmNlLmVuZCgpOwotICAgIHN0ZDo6c2l6ZV90IGkgPSAwOwotICAgIGZvciAoOyBpdGVyICE9IGVuZCAmJiBpIDwgbWF4X2J1ZmZlcnM7ICsraXRlciwgKytpKQotICAgICAgaWYgKGFzaW86OmJ1ZmZlcl9zaXplKEJ1ZmZlcigqaXRlcikpID4gMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgdmFsaWRhdGUoY29uc3QgQnVmZmVycyYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgdHlwZW5hbWUgQnVmZmVyczo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGJ1ZmZlcl9zZXF1ZW5jZS5iZWdpbigpOwotICAgIHR5cGVuYW1lIEJ1ZmZlcnM6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGJ1ZmZlcl9zZXF1ZW5jZS5lbmQoKTsKLSAgICBmb3IgKDsgaXRlciAhPSBlbmQ7ICsraXRlcikKLSAgICB7Ci0gICAgICBCdWZmZXIgYnVmZmVyKCppdGVyKTsKLSAgICAgIGFzaW86OmJ1ZmZlcl9jYXN0PGNvbnN0IHZvaWQqPihidWZmZXIpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBCdWZmZXIgZmlyc3QoY29uc3QgQnVmZmVycyYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgdHlwZW5hbWUgQnVmZmVyczo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGJ1ZmZlcl9zZXF1ZW5jZS5iZWdpbigpOwotICAgIHR5cGVuYW1lIEJ1ZmZlcnM6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGJ1ZmZlcl9zZXF1ZW5jZS5lbmQoKTsKLSAgICBmb3IgKDsgaXRlciAhPSBlbmQ7ICsraXRlcikKLSAgICB7Ci0gICAgICBCdWZmZXIgYnVmZmVyKCppdGVyKTsKLSAgICAgIGlmIChhc2lvOjpidWZmZXJfc2l6ZShidWZmZXIpICE9IDApCi0gICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgfQotICAgIHJldHVybiBCdWZmZXIoKTsKLSAgfQotCi1wcml2YXRlOgotICBuYXRpdmVfYnVmZmVyX3R5cGUgYnVmZmVyc19bbWF4X2J1ZmZlcnNdOwotICBzdGQ6OnNpemVfdCBjb3VudF87Ci0gIHN0ZDo6c2l6ZV90IHRvdGFsX2J1ZmZlcl9zaXplXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBCdWZmZXI+Ci1jbGFzcyBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxCdWZmZXIsIGFzaW86Om11dGFibGVfYnVmZmVyc18xPgotICA6IGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyX2Jhc2UKLXsKLXB1YmxpYzoKLSAgZXhwbGljaXQgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIoCi0gICAgICBjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgaW5pdF9uYXRpdmVfYnVmZmVyKGJ1ZmZlcl8sIEJ1ZmZlcihidWZmZXJfc2VxdWVuY2UpKTsKLSAgICB0b3RhbF9idWZmZXJfc2l6ZV8gPSBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJfc2VxdWVuY2UpOwotICB9Ci0KLSAgbmF0aXZlX2J1ZmZlcl90eXBlKiBidWZmZXJzKCkKLSAgewotICAgIHJldHVybiAmYnVmZmVyXzsKLSAgfQotCi0gIHN0ZDo6c2l6ZV90IGNvdW50KCkgY29uc3QKLSAgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgYm9vbCBhbGxfZW1wdHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRvdGFsX2J1ZmZlcl9zaXplXyA9PSAwOwotICB9Ci0KLSAgc3RhdGljIGJvb2wgYWxsX2VtcHR5KGNvbnN0IGFzaW86Om11dGFibGVfYnVmZmVyc18xJiBidWZmZXJfc2VxdWVuY2UpCi0gIHsKLSAgICByZXR1cm4gYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVyX3NlcXVlbmNlKSA9PSAwOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgdmFsaWRhdGUoY29uc3QgYXNpbzo6bXV0YWJsZV9idWZmZXJzXzEmIGJ1ZmZlcl9zZXF1ZW5jZSkKLSAgewotICAgIGFzaW86OmJ1ZmZlcl9jYXN0PGNvbnN0IHZvaWQqPihidWZmZXJfc2VxdWVuY2UpOwotICB9Ci0KLSAgc3RhdGljIEJ1ZmZlciBmaXJzdChjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgcmV0dXJuIEJ1ZmZlcihidWZmZXJfc2VxdWVuY2UpOwotICB9Ci0KLXByaXZhdGU6Ci0gIG5hdGl2ZV9idWZmZXJfdHlwZSBidWZmZXJfOwotICBzdGQ6OnNpemVfdCB0b3RhbF9idWZmZXJfc2l6ZV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQnVmZmVyPgotY2xhc3MgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8QnVmZmVyLCBhc2lvOjpjb25zdF9idWZmZXJzXzE+Ci0gIDogYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXJfYmFzZQotewotcHVibGljOgotICBleHBsaWNpdCBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcigKLSAgICAgIGNvbnN0IGFzaW86OmNvbnN0X2J1ZmZlcnNfMSYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgaW5pdF9uYXRpdmVfYnVmZmVyKGJ1ZmZlcl8sIEJ1ZmZlcihidWZmZXJfc2VxdWVuY2UpKTsKLSAgICB0b3RhbF9idWZmZXJfc2l6ZV8gPSBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJfc2VxdWVuY2UpOwotICB9Ci0KLSAgbmF0aXZlX2J1ZmZlcl90eXBlKiBidWZmZXJzKCkKLSAgewotICAgIHJldHVybiAmYnVmZmVyXzsKLSAgfQotCi0gIHN0ZDo6c2l6ZV90IGNvdW50KCkgY29uc3QKLSAgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgYm9vbCBhbGxfZW1wdHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRvdGFsX2J1ZmZlcl9zaXplXyA9PSAwOwotICB9Ci0KLSAgc3RhdGljIGJvb2wgYWxsX2VtcHR5KGNvbnN0IGFzaW86OmNvbnN0X2J1ZmZlcnNfMSYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgcmV0dXJuIGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcl9zZXF1ZW5jZSkgPT0gMDsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHZhbGlkYXRlKGNvbnN0IGFzaW86OmNvbnN0X2J1ZmZlcnNfMSYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgYXNpbzo6YnVmZmVyX2Nhc3Q8Y29uc3Qgdm9pZCo+KGJ1ZmZlcl9zZXF1ZW5jZSk7Ci0gIH0KLQotICBzdGF0aWMgQnVmZmVyIGZpcnN0KGNvbnN0IGFzaW86OmNvbnN0X2J1ZmZlcnNfMSYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgcmV0dXJuIEJ1ZmZlcihidWZmZXJfc2VxdWVuY2UpOwotICB9Ci0KLXByaXZhdGU6Ci0gIG5hdGl2ZV9idWZmZXJfdHlwZSBidWZmZXJfOwotICBzdGQ6OnNpemVfdCB0b3RhbF9idWZmZXJfc2l6ZV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQnVmZmVyLCB0eXBlbmFtZSBFbGVtPgotY2xhc3MgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8QnVmZmVyLCBib29zdDo6YXJyYXk8RWxlbSwgMj4gPgotICA6IGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyX2Jhc2UKLXsKLXB1YmxpYzoKLSAgZXhwbGljaXQgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIoCi0gICAgICBjb25zdCBib29zdDo6YXJyYXk8RWxlbSwgMj4mIGJ1ZmZlcl9zZXF1ZW5jZSkKLSAgewotICAgIGluaXRfbmF0aXZlX2J1ZmZlcihidWZmZXJzX1swXSwgQnVmZmVyKGJ1ZmZlcl9zZXF1ZW5jZVswXSkpOwotICAgIGluaXRfbmF0aXZlX2J1ZmZlcihidWZmZXJzX1sxXSwgQnVmZmVyKGJ1ZmZlcl9zZXF1ZW5jZVsxXSkpOwotICAgIHRvdGFsX2J1ZmZlcl9zaXplXyA9IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcl9zZXF1ZW5jZVswXSkKLSAgICAgICsgYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVyX3NlcXVlbmNlWzFdKTsKLSAgfQotCi0gIG5hdGl2ZV9idWZmZXJfdHlwZSogYnVmZmVycygpCi0gIHsKLSAgICByZXR1cm4gYnVmZmVyc187Ci0gIH0KLQotICBzdGQ6OnNpemVfdCBjb3VudCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIGJvb2wgYWxsX2VtcHR5KCkgY29uc3QKLSAgewotICAgIHJldHVybiB0b3RhbF9idWZmZXJfc2l6ZV8gPT0gMDsKLSAgfQotCi0gIHN0YXRpYyBib29sIGFsbF9lbXB0eShjb25zdCBib29zdDo6YXJyYXk8RWxlbSwgMj4mIGJ1ZmZlcl9zZXF1ZW5jZSkKLSAgewotICAgIHJldHVybiBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJfc2VxdWVuY2VbMF0pID09IDAKLSAgICAgICYmIGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcl9zZXF1ZW5jZVsxXSkgPT0gMDsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHZhbGlkYXRlKGNvbnN0IGJvb3N0OjphcnJheTxFbGVtLCAyPiYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgYXNpbzo6YnVmZmVyX2Nhc3Q8Y29uc3Qgdm9pZCo+KGJ1ZmZlcl9zZXF1ZW5jZVswXSk7Ci0gICAgYXNpbzo6YnVmZmVyX2Nhc3Q8Y29uc3Qgdm9pZCo+KGJ1ZmZlcl9zZXF1ZW5jZVsxXSk7Ci0gIH0KLQotICBzdGF0aWMgQnVmZmVyIGZpcnN0KGNvbnN0IGJvb3N0OjphcnJheTxFbGVtLCAyPiYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgcmV0dXJuIEJ1ZmZlcihhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJfc2VxdWVuY2VbMF0pICE9IDAKLSAgICAgICAgPyBidWZmZXJfc2VxdWVuY2VbMF0gOiBidWZmZXJfc2VxdWVuY2VbMV0pOwotICB9Ci0KLXByaXZhdGU6Ci0gIG5hdGl2ZV9idWZmZXJfdHlwZSBidWZmZXJzX1syXTsKLSAgc3RkOjpzaXplX3QgdG90YWxfYnVmZmVyX3NpemVfOwotfTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQnVmZmVyLCB0eXBlbmFtZSBFbGVtPgotY2xhc3MgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8QnVmZmVyLCBzdGQ6OmFycmF5PEVsZW0sIDI+ID4KLSAgOiBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcl9iYXNlCi17Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyKAotICAgICAgY29uc3Qgc3RkOjphcnJheTxFbGVtLCAyPiYgYnVmZmVyX3NlcXVlbmNlKQotICB7Ci0gICAgaW5pdF9uYXRpdmVfYnVmZmVyKGJ1ZmZlcnNfWzBdLCBCdWZmZXIoYnVmZmVyX3NlcXVlbmNlWzBdKSk7Ci0gICAgaW5pdF9uYXRpdmVfYnVmZmVyKGJ1ZmZlcnNfWzFdLCBCdWZmZXIoYnVmZmVyX3NlcXVlbmNlWzFdKSk7Ci0gICAgdG90YWxfYnVmZmVyX3NpemVfID0gYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVyX3NlcXVlbmNlWzBdKQotICAgICAgKyBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJfc2VxdWVuY2VbMV0pOwotICB9Ci0KLSAgbmF0aXZlX2J1ZmZlcl90eXBlKiBidWZmZXJzKCkKLSAgewotICAgIHJldHVybiBidWZmZXJzXzsKLSAgfQotCi0gIHN0ZDo6c2l6ZV90IGNvdW50KCkgY29uc3QKLSAgewotICAgIHJldHVybiAyOwotICB9Ci0KLSAgYm9vbCBhbGxfZW1wdHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRvdGFsX2J1ZmZlcl9zaXplXyA9PSAwOwotICB9Ci0KLSAgc3RhdGljIGJvb2wgYWxsX2VtcHR5KGNvbnN0IHN0ZDo6YXJyYXk8RWxlbSwgMj4mIGJ1ZmZlcl9zZXF1ZW5jZSkKLSAgewotICAgIHJldHVybiBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJfc2VxdWVuY2VbMF0pID09IDAKLSAgICAgICYmIGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcl9zZXF1ZW5jZVsxXSkgPT0gMDsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHZhbGlkYXRlKGNvbnN0IHN0ZDo6YXJyYXk8RWxlbSwgMj4mIGJ1ZmZlcl9zZXF1ZW5jZSkKLSAgewotICAgIGFzaW86OmJ1ZmZlcl9jYXN0PGNvbnN0IHZvaWQqPihidWZmZXJfc2VxdWVuY2VbMF0pOwotICAgIGFzaW86OmJ1ZmZlcl9jYXN0PGNvbnN0IHZvaWQqPihidWZmZXJfc2VxdWVuY2VbMV0pOwotICB9Ci0KLSAgc3RhdGljIEJ1ZmZlciBmaXJzdChjb25zdCBzdGQ6OmFycmF5PEVsZW0sIDI+JiBidWZmZXJfc2VxdWVuY2UpCi0gIHsKLSAgICByZXR1cm4gQnVmZmVyKGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcl9zZXF1ZW5jZVswXSkgIT0gMAotICAgICAgICA/IGJ1ZmZlcl9zZXF1ZW5jZVswXSA6IGJ1ZmZlcl9zZXF1ZW5jZVsxXSk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgbmF0aXZlX2J1ZmZlcl90eXBlIGJ1ZmZlcnNfWzJdOwotICBzdGQ6OnNpemVfdCB0b3RhbF9idWZmZXJfc2l6ZV87Ci19OwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfQVJSQVkpCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9CVUZGRVJfU0VRVUVOQ0VfQURBUFRFUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvYnVmZmVyZWRfc3RyZWFtX3N0b3JhZ2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9idWZmZXJlZF9zdHJlYW1fc3RvcmFnZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNmJjZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9idWZmZXJlZF9zdHJlYW1fc3RvcmFnZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9idWZmZXJlZF9zdHJlYW1fc3RvcmFnZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfQlVGRkVSRURfU1RSRUFNX1NUT1JBR0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0JVRkZFUkVEX1NUUkVBTV9TVE9SQUdFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vYnVmZmVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hc3NlcnQuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3MgYnVmZmVyZWRfc3RyZWFtX3N0b3JhZ2UKLXsKLXB1YmxpYzoKLSAgLy8gVGhlIHR5cGUgb2YgdGhlIGJ5dGVzIHN0b3JlZCBpbiB0aGUgYnVmZmVyLgotICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYnl0ZV90eXBlOwotCi0gIC8vIFRoZSB0eXBlIHVzZWQgZm9yIG9mZnNldHMgaW50byB0aGUgYnVmZmVyLgotICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgZXhwbGljaXQgYnVmZmVyZWRfc3RyZWFtX3N0b3JhZ2Uoc3RkOjpzaXplX3QgYnVmZmVyX2NhcGFjaXR5KQotICAgIDogYmVnaW5fb2Zmc2V0XygwKSwKLSAgICAgIGVuZF9vZmZzZXRfKDApLAotICAgICAgYnVmZmVyXyhidWZmZXJfY2FwYWNpdHkpCi0gIHsKLSAgfQotCi0gIC8vLyBDbGVhciB0aGUgYnVmZmVyLgotICB2b2lkIGNsZWFyKCkKLSAgewotICAgIGJlZ2luX29mZnNldF8gPSAwOwotICAgIGVuZF9vZmZzZXRfID0gMDsKLSAgfQotCi0gIC8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5yZWFkIGRhdGEuCi0gIG11dGFibGVfYnVmZmVyIGRhdGEoKQotICB7Ci0gICAgcmV0dXJuIGFzaW86OmJ1ZmZlcihidWZmZXJfKSArIGJlZ2luX29mZnNldF87Ci0gIH0KLQotICAvLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVucmVhZCBkYXRhLgotICBjb25zdF9idWZmZXIgZGF0YSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gYXNpbzo6YnVmZmVyKGJ1ZmZlcl8pICsgYmVnaW5fb2Zmc2V0XzsKLSAgfQotCi0gIC8vIElzIHRoZXJlIG5vIHVucmVhZCBkYXRhIGluIHRoZSBidWZmZXIuCi0gIGJvb2wgZW1wdHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGJlZ2luX29mZnNldF8gPT0gZW5kX29mZnNldF87Ci0gIH0KLQotICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiB1bnJlYWQgZGF0YSB0aGUgaXMgaW4gdGhlIGJ1ZmZlci4KLSAgc2l6ZV90eXBlIHNpemUoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGVuZF9vZmZzZXRfIC0gYmVnaW5fb2Zmc2V0XzsKLSAgfQotCi0gIC8vIFJlc2l6ZSB0aGUgYnVmZmVyIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbGVuZ3RoKQotICB7Ci0gICAgQVNJT19BU1NFUlQobGVuZ3RoIDw9IGNhcGFjaXR5KCkpOwotICAgIGlmIChiZWdpbl9vZmZzZXRfICsgbGVuZ3RoIDw9IGNhcGFjaXR5KCkpCi0gICAgewotICAgICAgZW5kX29mZnNldF8gPSBiZWdpbl9vZmZzZXRfICsgbGVuZ3RoOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbW1vdmUuCi0gICAgICBtZW1tb3ZlKCZidWZmZXJfWzBdLCAmYnVmZmVyX1swXSArIGJlZ2luX29mZnNldF8sIHNpemUoKSk7Ci0gICAgICBlbmRfb2Zmc2V0XyA9IGxlbmd0aDsKLSAgICAgIGJlZ2luX29mZnNldF8gPSAwOwotICAgIH0KLSAgfQotCi0gIC8vIFJldHVybiB0aGUgbWF4aW11bSBzaXplIGZvciBkYXRhIGluIHRoZSBidWZmZXIuCi0gIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gYnVmZmVyXy5zaXplKCk7Ci0gIH0KLQotICAvLyBDb25zdW1lIG11bHRpcGxlIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLgotICB2b2lkIGNvbnN1bWUoc2l6ZV90eXBlIGNvdW50KQotICB7Ci0gICAgQVNJT19BU1NFUlQoYmVnaW5fb2Zmc2V0XyArIGNvdW50IDw9IGVuZF9vZmZzZXRfKTsKLSAgICBiZWdpbl9vZmZzZXRfICs9IGNvdW50OwotICAgIGlmIChlbXB0eSgpKQotICAgICAgY2xlYXIoKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBUaGUgb2Zmc2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVucmVhZCBkYXRhLgotICBzaXplX3R5cGUgYmVnaW5fb2Zmc2V0XzsKLQotICAvLyBUaGUgb2Zmc2V0IHRvIHRoZSBlbmQgb2YgdGhlIHVucmVhZCBkYXRhLgotICBzaXplX3R5cGUgZW5kX29mZnNldF87Ci0gIAotICAvLyBUaGUgZGF0YSBpbiB0aGUgYnVmZmVyLgotICBzdGQ6OnZlY3RvcjxieXRlX3R5cGU+IGJ1ZmZlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0JVRkZFUkVEX1NUUkVBTV9TVE9SQUdFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9jYWxsX3N0YWNrLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvY2FsbF9zdGFjay5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzYzZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9jYWxsX3N0YWNrLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLwotLy8gZGV0YWlsL2NhbGxfc3RhY2suaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfQ0FMTF9TVEFDS19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfQ0FMTF9TVEFDS19IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdHNzX3B0ci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotLy8gSGVscGVyIGNsYXNzIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW5zaWRlIGFuCi0vLyBpbnZvY2F0aW9uIG9mIGlvX3NlcnZpY2U6OnJ1bigpIGZvciBhIHNwZWNpZmllZCBpb19zZXJ2aWNlIG9iamVjdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlID0gdW5zaWduZWQgY2hhcj4KLWNsYXNzIGNhbGxfc3RhY2sKLXsKLXB1YmxpYzoKLSAgLy8gQ29udGV4dCBjbGFzcyBhdXRvbWF0aWNhbGx5IHB1c2hlcyB0aGUga2V5L3ZhbHVlIHBhaXIgb24gdG8gdGhlIHN0YWNrLgotICBjbGFzcyBjb250ZXh0Ci0gICAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi0gIHsKLSAgcHVibGljOgotICAgIC8vIFB1c2ggdGhlIGtleSBvbiB0byB0aGUgc3RhY2suCi0gICAgZXhwbGljaXQgY29udGV4dChLZXkqIGspCi0gICAgICA6IGtleV8oayksCi0gICAgICAgIG5leHRfKGNhbGxfc3RhY2s8S2V5LCBWYWx1ZT46OnRvcF8pCi0gICAgewotICAgICAgdmFsdWVfID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4odGhpcyk7Ci0gICAgICBjYWxsX3N0YWNrPEtleSwgVmFsdWU+Ojp0b3BfID0gdGhpczsKLSAgICB9Ci0KLSAgICAvLyBQdXNoIHRoZSBrZXkvdmFsdWUgcGFpciBvbiB0byB0aGUgc3RhY2suCi0gICAgY29udGV4dChLZXkqIGssIFZhbHVlJiB2KQotICAgICAgOiBrZXlfKGspLAotICAgICAgICB2YWx1ZV8oJnYpLAotICAgICAgICBuZXh0XyhjYWxsX3N0YWNrPEtleSwgVmFsdWU+Ojp0b3BfKQotICAgIHsKLSAgICAgIGNhbGxfc3RhY2s8S2V5LCBWYWx1ZT46OnRvcF8gPSB0aGlzOwotICAgIH0KLQotICAgIC8vIFBvcCB0aGUga2V5L3ZhbHVlIHBhaXIgZnJvbSB0aGUgc3RhY2suCi0gICAgfmNvbnRleHQoKQotICAgIHsKLSAgICAgIGNhbGxfc3RhY2s8S2V5LCBWYWx1ZT46OnRvcF8gPSBuZXh0XzsKLSAgICB9Ci0KLSAgICAvLyBGaW5kIHRoZSBuZXh0IGNvbnRleHQgd2l0aCB0aGUgc2FtZSBrZXkuCi0gICAgVmFsdWUqIG5leHRfYnlfa2V5KCkgY29uc3QKLSAgICB7Ci0gICAgICBjb250ZXh0KiBlbGVtID0gbmV4dF87Ci0gICAgICB3aGlsZSAoZWxlbSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVsZW0tPmtleV8gPT0ga2V5XykKLSAgICAgICAgICByZXR1cm4gZWxlbS0+dmFsdWVfOwotICAgICAgICBlbGVtID0gZWxlbS0+bmV4dF87Ci0gICAgICB9Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgY2FsbF9zdGFjazxLZXksIFZhbHVlPjsKLQotICAgIC8vIFRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LgotICAgIEtleSoga2V5XzsKLQotICAgIC8vIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQuCi0gICAgVmFsdWUqIHZhbHVlXzsKLQotICAgIC8vIFRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIHN0YWNrLgotICAgIGNvbnRleHQqIG5leHRfOwotICB9OwotCi0gIGZyaWVuZCBjbGFzcyBjb250ZXh0OwotCi0gIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb3duZXIgaXMgb24gdGhlIHN0YWNrLiBSZXR1cm5zIGFkZHJlc3Mgb2YKLSAgLy8ga2V5IGlmIHByZXNlbnQsIDAgb3RoZXJ3aXNlLgotICBzdGF0aWMgVmFsdWUqIGNvbnRhaW5zKEtleSogaykKLSAgewotICAgIGNvbnRleHQqIGVsZW0gPSB0b3BfOwotICAgIHdoaWxlIChlbGVtKQotICAgIHsKLSAgICAgIGlmIChlbGVtLT5rZXlfID09IGspCi0gICAgICAgIHJldHVybiBlbGVtLT52YWx1ZV87Ci0gICAgICBlbGVtID0gZWxlbS0+bmV4dF87Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gT2J0YWluIHRoZSB2YWx1ZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLSAgc3RhdGljIFZhbHVlKiB0b3AoKQotICB7Ci0gICAgY29udGV4dCogZWxlbSA9IHRvcF87Ci0gICAgcmV0dXJuIGVsZW0gPyBlbGVtLT52YWx1ZV8gOiAwOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIFRoZSB0b3Agb2YgdGhlIHN0YWNrIG9mIGNhbGxzIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCi0gIHN0YXRpYyB0c3NfcHRyPGNvbnRleHQ+IHRvcF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBWYWx1ZT4KLXRzc19wdHI8dHlwZW5hbWUgY2FsbF9zdGFjazxLZXksIFZhbHVlPjo6Y29udGV4dD4KLWNhbGxfc3RhY2s8S2V5LCBWYWx1ZT46OnRvcF87Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfQ0FMTF9TVEFDS19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvY2hyb25vX3RpbWVfdHJhaXRzLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvY2hyb25vX3RpbWVfdHJhaXRzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1ZDU1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2Nocm9ub190aW1lX3RyYWl0cy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9jaHJvbm9fdGltZV90cmFpdHMuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9DSFJPTk9fVElNRV9UUkFJVFNfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0NIUk9OT19USU1FX1RSQUlUU19IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY3N0ZGludC5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotLy8gSGVscGVyIHRlbXBsYXRlIHRvIGNvbXB1dGUgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yLgotdGVtcGxhdGUgPGludDY0X3QgdjEsIGludDY0X3QgdjI+Ci1zdHJ1Y3QgZ2NkIHsgZW51bSB7IHZhbHVlID0gZ2NkPHYyLCB2MSAlIHYyPjo6dmFsdWUgfTsgfTsKLQotdGVtcGxhdGUgPGludDY0X3QgdjE+Ci1zdHJ1Y3QgZ2NkPHYxLCAwPiB7IGVudW0geyB2YWx1ZSA9IHYxIH07IH07Ci0KLS8vIEFkYXB0cyBzdGQ6OmNocm9ubyBjbG9ja3MgZm9yIHVzZSB3aXRoIGEgZGVhZGxpbmUgdGltZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2ssIHR5cGVuYW1lIFdhaXRUcmFpdHM+Ci1zdHJ1Y3QgY2hyb25vX3RpbWVfdHJhaXRzCi17Ci0gIC8vIFRoZSBjbG9jayB0eXBlLgotICB0eXBlZGVmIENsb2NrIGNsb2NrX3R5cGU7Ci0KLSAgLy8gVGhlIGR1cmF0aW9uIHR5cGUgb2YgdGhlIGNsb2NrLgotICB0eXBlZGVmIHR5cGVuYW1lIGNsb2NrX3R5cGU6OmR1cmF0aW9uIGR1cmF0aW9uX3R5cGU7Ci0KLSAgLy8gVGhlIHRpbWUgcG9pbnQgdHlwZSBvZiB0aGUgY2xvY2suCi0gIHR5cGVkZWYgdHlwZW5hbWUgY2xvY2tfdHlwZTo6dGltZV9wb2ludCB0aW1lX3R5cGU7Ci0KLSAgLy8gVGhlIHBlcmlvZCBvZiB0aGUgY2xvY2suCi0gIHR5cGVkZWYgdHlwZW5hbWUgZHVyYXRpb25fdHlwZTo6cGVyaW9kIHBlcmlvZF90eXBlOwotCi0gIC8vIEdldCB0aGUgY3VycmVudCB0aW1lLgotICBzdGF0aWMgdGltZV90eXBlIG5vdygpCi0gIHsKLSAgICByZXR1cm4gY2xvY2tfdHlwZTo6bm93KCk7Ci0gIH0KLQotICAvLyBBZGQgYSBkdXJhdGlvbiB0byBhIHRpbWUuCi0gIHN0YXRpYyB0aW1lX3R5cGUgYWRkKGNvbnN0IHRpbWVfdHlwZSYgdCwgY29uc3QgZHVyYXRpb25fdHlwZSYgZCkKLSAgewotICAgIGNvbnN0IHRpbWVfdHlwZSBlcG9jaDsKLSAgICBpZiAodCA+PSBlcG9jaCkKLSAgICB7Ci0gICAgICBpZiAoKHRpbWVfdHlwZTo6bWF4KSgpIC0gdCA8IGQpCi0gICAgICAgIHJldHVybiAodGltZV90eXBlOjptYXgpKCk7Ci0gICAgfQotICAgIGVsc2UgLy8gdCA8IGVwb2NoCi0gICAgewotICAgICAgaWYgKC0odCAtICh0aW1lX3R5cGU6Om1pbikoKSkgPiBkKQotICAgICAgICByZXR1cm4gKHRpbWVfdHlwZTo6bWluKSgpOwotICAgIH0KLQotICAgIHJldHVybiB0ICsgZDsKLSAgfQotCi0gIC8vIFN1YnRyYWN0IG9uZSB0aW1lIGZyb20gYW5vdGhlci4KLSAgc3RhdGljIGR1cmF0aW9uX3R5cGUgc3VidHJhY3QoY29uc3QgdGltZV90eXBlJiB0MSwgY29uc3QgdGltZV90eXBlJiB0MikKLSAgewotICAgIGNvbnN0IHRpbWVfdHlwZSBlcG9jaDsKLSAgICBpZiAodDEgPj0gZXBvY2gpCi0gICAgewotICAgICAgaWYgKHQyID49IGVwb2NoKQotICAgICAgewotICAgICAgICByZXR1cm4gdDEgLSB0MjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHQyID09ICh0aW1lX3R5cGU6Om1pbikoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChkdXJhdGlvbl90eXBlOjptYXgpKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgodGltZV90eXBlOjptYXgpKCkgLSB0MSA8IGVwb2NoIC0gdDIpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoZHVyYXRpb25fdHlwZTo6bWF4KSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gdDEgLSB0MjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvLyB0MSA8IGVwb2NoCi0gICAgewotICAgICAgaWYgKHQyIDwgZXBvY2gpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0MSAtIHQyOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodDEgPT0gKHRpbWVfdHlwZTo6bWluKSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gKGR1cmF0aW9uX3R5cGU6Om1pbikoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCh0aW1lX3R5cGU6Om1heCkoKSAtIHQyIDwgZXBvY2ggLSB0MSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChkdXJhdGlvbl90eXBlOjptaW4pKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAtKHQyIC0gdDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFRlc3Qgd2hldGhlciBvbmUgdGltZSBpcyBsZXNzIHRoYW4gYW5vdGhlci4KLSAgc3RhdGljIGJvb2wgbGVzc190aGFuKGNvbnN0IHRpbWVfdHlwZSYgdDEsIGNvbnN0IHRpbWVfdHlwZSYgdDIpCi0gIHsKLSAgICByZXR1cm4gdDEgPCB0MjsKLSAgfQotCi0gIC8vIEltcGxlbWVudCBqdXN0IGVub3VnaCBvZiB0aGUgcG9zaXhfdGltZTo6dGltZV9kdXJhdGlvbiBpbnRlcmZhY2UgdG8gc3VwcGx5Ci0gIC8vIHdoYXQgdGhlIHRpbWVyX3F1ZXVlIHJlcXVpcmVzLgotICBjbGFzcyBwb3NpeF90aW1lX2R1cmF0aW9uCi0gIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IHBvc2l4X3RpbWVfZHVyYXRpb24oY29uc3QgZHVyYXRpb25fdHlwZSYgZCkKLSAgICAgIDogZF8oZCkKLSAgICB7Ci0gICAgfQotCi0gICAgaW50NjRfdCB0aWNrcygpIGNvbnN0Ci0gICAgewotICAgICAgcmV0dXJuIGRfLmNvdW50KCk7Ci0gICAgfQotCi0gICAgaW50NjRfdCB0b3RhbF9zZWNvbmRzKCkgY29uc3QKLSAgICB7Ci0gICAgICByZXR1cm4gZHVyYXRpb25fY2FzdDwxLCAxPigpOwotICAgIH0KLQotICAgIGludDY0X3QgdG90YWxfbWlsbGlzZWNvbmRzKCkgY29uc3QKLSAgICB7Ci0gICAgICByZXR1cm4gZHVyYXRpb25fY2FzdDwxLCAxMDAwPigpOwotICAgIH0KLQotICAgIGludDY0X3QgdG90YWxfbWljcm9zZWNvbmRzKCkgY29uc3QKLSAgICB7Ci0gICAgICByZXR1cm4gZHVyYXRpb25fY2FzdDwxLCAxMDAwMDAwPigpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHRlbXBsYXRlIDxpbnQ2NF90IE51bSwgaW50NjRfdCBEZW4+Ci0gICAgaW50NjRfdCBkdXJhdGlvbl9jYXN0KCkgY29uc3QKLSAgICB7Ci0gICAgICBjb25zdCBpbnQ2NF90IG51bTEgPSBwZXJpb2RfdHlwZTo6bnVtIC8gZ2NkPHBlcmlvZF90eXBlOjpudW0sIE51bT46OnZhbHVlOwotICAgICAgY29uc3QgaW50NjRfdCBudW0yID0gTnVtIC8gZ2NkPHBlcmlvZF90eXBlOjpudW0sIE51bT46OnZhbHVlOwotCi0gICAgICBjb25zdCBpbnQ2NF90IGRlbjEgPSBwZXJpb2RfdHlwZTo6ZGVuIC8gZ2NkPHBlcmlvZF90eXBlOjpkZW4sIERlbj46OnZhbHVlOwotICAgICAgY29uc3QgaW50NjRfdCBkZW4yID0gRGVuIC8gZ2NkPHBlcmlvZF90eXBlOjpkZW4sIERlbj46OnZhbHVlOwotCi0gICAgICBjb25zdCBpbnQ2NF90IG51bSA9IG51bTEgKiBkZW4yOwotICAgICAgY29uc3QgaW50NjRfdCBkZW4gPSBudW0yICogZGVuMTsKLQotICAgICAgaWYgKG51bSA9PSAxICYmIGRlbiA9PSAxKQotICAgICAgICByZXR1cm4gdGlja3MoKTsKLSAgICAgIGVsc2UgaWYgKG51bSAhPSAxICYmIGRlbiA9PSAxKQotICAgICAgICByZXR1cm4gdGlja3MoKSAqIG51bTsKLSAgICAgIGVsc2UgaWYgKG51bSA9PSAxICYmIHBlcmlvZF90eXBlOjpkZW4gIT0gMSkKLSAgICAgICAgcmV0dXJuIHRpY2tzKCkgLyBkZW47Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiB0aWNrcygpICogbnVtIC8gZGVuOwotICAgIH0KLQotICAgIGR1cmF0aW9uX3R5cGUgZF87Ci0gIH07Ci0KLSAgLy8gQ29udmVydCB0byBQT1NJWCBkdXJhdGlvbiB0eXBlLgotICBzdGF0aWMgcG9zaXhfdGltZV9kdXJhdGlvbiB0b19wb3NpeF9kdXJhdGlvbihjb25zdCBkdXJhdGlvbl90eXBlJiBkKQotICB7Ci0gICAgcmV0dXJuIHBvc2l4X3RpbWVfZHVyYXRpb24oV2FpdFRyYWl0czo6dG9fd2FpdF9kdXJhdGlvbihkKSk7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfQ0hST05PX1RJTUVfVFJBSVRTX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9jb21wbGV0aW9uX2hhbmRsZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9jb21wbGV0aW9uX2hhbmRsZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWRlZDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvY29tcGxldGlvbl9oYW5kbGVyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvY29tcGxldGlvbl9oYW5kbGVyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfQ09NUExFVElPTl9IQU5ETEVSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9DT01QTEVUSU9OX0hBTkRMRVJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BlcmF0aW9uLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIGNvbXBsZXRpb25faGFuZGxlciA6IHB1YmxpYyBvcGVyYXRpb24KLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIoY29tcGxldGlvbl9oYW5kbGVyKTsKLQotICBjb21wbGV0aW9uX2hhbmRsZXIoSGFuZGxlciYgaCkKLSAgICA6IG9wZXJhdGlvbigmY29tcGxldGlvbl9oYW5kbGVyOjpkb19jb21wbGV0ZSksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoKSkKLSAgewotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgLyplYyovLAotICAgICAgc3RkOjpzaXplX3QgLypieXRlc190cmFuc2ZlcnJlZCovKQotICB7Ci0gICAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIGhhbmRsZXIgb2JqZWN0LgotICAgIGNvbXBsZXRpb25faGFuZGxlciogaChzdGF0aWNfY2FzdDxjb21wbGV0aW9uX2hhbmRsZXIqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGgtPmhhbmRsZXJfKSwgaCwgaCB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKGgpKTsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBIYW5kbGVyIGhhbmRsZXIoQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaC0+aGFuZGxlcl8pKTsKLSAgICBwLmggPSBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKTsKLSAgICBwLnJlc2V0KCk7Ci0KLSAgICAvLyBNYWtlIHRoZSB1cGNhbGwgaWYgcmVxdWlyZWQuCi0gICAgaWYgKG93bmVyKQotICAgIHsKLSAgICAgIGZlbmNlZF9ibG9jayBiKGZlbmNlZF9ibG9jazo6aGFsZik7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9CRUdJTigoKSk7Ci0gICAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoYW5kbGVyLCBoYW5kbGVyKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0VORDsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgSGFuZGxlciBoYW5kbGVyXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfQ09NUExFVElPTl9IQU5ETEVSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9jb25maWcuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9jb25maWcuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdiZDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvY29uZmlnLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDk3MyArMCwwIEBACi0vLwotLy8gZGV0YWlsL2NvbmZpZy5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0NPTkZJR19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfQ09ORklHX0hQUAotCi0jaWYgZGVmaW5lZChBU0lPX1NUQU5EQUxPTkUpCi0jIGRlZmluZSBBU0lPX0RJU0FCTEVfQk9PU1RfQVJSQVkgMQotIyBkZWZpbmUgQVNJT19ESVNBQkxFX0JPT1NUX0FTU0VSVCAxCi0jIGRlZmluZSBBU0lPX0RJU0FCTEVfQk9PU1RfQklORCAxCi0jIGRlZmluZSBBU0lPX0RJU0FCTEVfQk9PU1RfQ0hST05PIDEKLSMgZGVmaW5lIEFTSU9fRElTQUJMRV9CT09TVF9EQVRFX1RJTUUgMQotIyBkZWZpbmUgQVNJT19ESVNBQkxFX0JPT1NUX0xJTUlUUyAxCi0jIGRlZmluZSBBU0lPX0RJU0FCTEVfQk9PU1RfUkVHRVggMQotIyBkZWZpbmUgQVNJT19ESVNBQkxFX0JPT1NUX1NUQVRJQ19DT05TVEFOVCAxCi0jIGRlZmluZSBBU0lPX0RJU0FCTEVfQk9PU1RfVEhST1dfRVhDRVBUSU9OIDEKLSMgZGVmaW5lIEFTSU9fRElTQUJMRV9CT09TVF9XT1JLQVJPVU5EIDEKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19TVEFOREFMT05FKQotIyBpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgotIyBpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KLSMgZGVmaW5lIEFTSU9fSEFTX0JPT1NUX0NPTkZJRyAxCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1NUQU5EQUxPTkUpCi0KLS8vIERlZmF1bHQgdG8gYSBoZWFkZXItb25seSBpbXBsZW1lbnRhdGlvbi4gVGhlIHVzZXIgbXVzdCBzcGVjaWZpY2FsbHkgcmVxdWVzdAotLy8gc2VwYXJhdGUgY29tcGlsYXRpb24gYnkgZGVmaW5pbmcgZWl0aGVyIEFTSU9fU0VQQVJBVEVfQ09NUElMQVRJT04gb3IKLS8vIEFTSU9fRFlOX0xJTksgKGFzIGEgRExML3NoYXJlZCBsaWJyYXJ5IGltcGxpZXMgc2VwYXJhdGUgY29tcGlsYXRpb24pLgotI2lmICFkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGlmICFkZWZpbmVkKEFTSU9fU0VQQVJBVEVfQ09NUElMQVRJT04pCi0jICBpZiAhZGVmaW5lZChBU0lPX0RZTl9MSU5LKQotIyAgIGRlZmluZSBBU0lPX0hFQURFUl9PTkxZIDEKLSMgIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRFlOX0xJTkspCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fU0VQQVJBVEVfQ09NUElMQVRJT04pCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgZGVmaW5lIEFTSU9fREVDTCBpbmxpbmUKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19DT0RFR0VBUkNfXykKLS8vIFdlIG5lZWQgdG8gaW1wb3J0L2V4cG9ydCBvdXIgY29kZSBvbmx5IGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpY2FsbHkgYXNrZWQKLS8vIGZvciBpdCBieSBkZWZpbmluZyBBU0lPX0RZTl9MSU5LLgotIyAgaWYgZGVmaW5lZChBU0lPX0RZTl9MSU5LKQotLy8gRXhwb3J0IGlmIHRoaXMgaXMgb3VyIG93biBzb3VyY2UsIG90aGVyd2lzZSBpbXBvcnQuCi0jICAgaWYgZGVmaW5lZChBU0lPX1NPVVJDRSkKLSMgICAgZGVmaW5lIEFTSU9fREVDTCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICBlbHNlIC8vIGRlZmluZWQoQVNJT19TT1VSQ0UpCi0jICAgIGRlZmluZSBBU0lPX0RFQ0wgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgZW5kaWYgLy8gZGVmaW5lZChBU0lPX1NPVVJDRSkKLSMgIGVuZGlmIC8vIGRlZmluZWQoQVNJT19EWU5fTElOSykKLSMgZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19DT0RFR0VBUkNfXykKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLS8vIElmIEFTSU9fREVDTCBpc24ndCBkZWZpbmVkIHlldCBkZWZpbmUgaXQgbm93LgotI2lmICFkZWZpbmVkKEFTSU9fREVDTCkKLSMgZGVmaW5lIEFTSU9fREVDTAotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fREVDTCkKLQotLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgZGV0ZWN0aW9uLgotI2lmICFkZWZpbmVkKEFTSU9fTVNWQykKLSMgaWYgZGVmaW5lZChBU0lPX0hBU19CT09TVF9DT05GSUcpICYmIGRlZmluZWQoQk9PU1RfTVNWQykKLSMgIGRlZmluZSBBU0lPX01TVkMgQk9PU1RfTVNWQwotIyBlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fTVdFUktTX18pICYmICFkZWZpbmVkKF9fRURHX1ZFUlNJT05fXykKLSMgIGRlZmluZSBBU0lPX01TVkMgX01TQ19WRVIKLSMgZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19CT09TVF9DT05GSUcpICYmIGRlZmluZWQoQk9PU1RfTVNWQykKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fTVNWQykKLQotLy8gQ2xhbmcgLyBsaWJjKysgZGV0ZWN0aW9uLgotI2lmIGRlZmluZWQoX19jbGFuZ19fKQotIyBpZiAoX19jcGx1c3BsdXMgPj0gMjAxMTAzKQotIyAgaWYgX19oYXNfaW5jbHVkZSg8X19jb25maWc+KQotIyAgIGluY2x1ZGUgPF9fY29uZmlnPgotIyAgIGlmIGRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKQotIyAgICBkZWZpbmUgQVNJT19IQVNfQ0xBTkdfTElCQ1hYIDEKLSMgICBlbmRpZiAvLyBkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikKLSMgIGVuZGlmIC8vIF9faGFzX2luY2x1ZGUoPF9fY29uZmlnPikKLSMgZW5kaWYgLy8gKF9fY3BsdXNwbHVzID49IDIwMTEwMykKLSNlbmRpZiAvLyBkZWZpbmVkKF9fY2xhbmdfXykKLQotLy8gU3VwcG9ydCBtb3ZlIGNvbnN0cnVjdGlvbiBhbmQgYXNzaWdubWVudCBvbiBjb21waWxlcnMga25vd24gdG8gYWxsb3cgaXQuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSMgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX01PVkUpCi0jICBpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgICBpZiBfX2hhc19mZWF0dXJlKF9fY3h4X3J2YWx1ZV9yZWZlcmVuY2VzX18pCi0jICAgIGRlZmluZSBBU0lPX0hBU19NT1ZFIDEKLSMgICBlbmRpZiAvLyBfX2hhc19mZWF0dXJlKF9fY3h4X3J2YWx1ZV9yZWZlcmVuY2VzX18pCi0jICBlbmRpZiAvLyBkZWZpbmVkKF9fY2xhbmdfXykKLSMgIGlmIGRlZmluZWQoX19HTlVDX18pCi0jICAgaWYgKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gNSkpIHx8IChfX0dOVUNfXyA+IDQpCi0jICAgIGlmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfTU9WRSAxCi0jICAgIGVuZGlmIC8vIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCi0jICAgZW5kaWYgLy8gKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gNSkpIHx8IChfX0dOVUNfXyA+IDQpCi0jICBlbmRpZiAvLyBkZWZpbmVkKF9fR05VQ19fKQotIyAgaWYgZGVmaW5lZChBU0lPX01TVkMpCi0jICAgaWYgKF9NU0NfVkVSID49IDE3MDApCi0jICAgIGRlZmluZSBBU0lPX0hBU19NT1ZFIDEKLSMgICBlbmRpZiAvLyAoX01TQ19WRVIgPj0gMTcwMCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoQVNJT19NU1ZDKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfTU9WRSkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0vLyBJZiBBU0lPX01PVkVfQ0FTVCBpc24ndCBkZWZpbmVkLCBhbmQgbW92ZSBzdXBwb3J0IGlzIGF2YWlsYWJsZSwgZGVmaW5lCi0vLyBBU0lPX01PVkVfQVJHIGFuZCBBU0lPX01PVkVfQ0FTVCB0byB0YWtlIGFkdmFudGFnZSBvZiBydmFsdWUKLS8vIHJlZmVyZW5jZXMgYW5kIHBlcmZlY3QgZm9yd2FyZGluZy4KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpICYmICFkZWZpbmVkKEFTSU9fTU9WRV9DQVNUKQotIyBkZWZpbmUgQVNJT19NT1ZFX0FSRyh0eXBlKSB0eXBlJiYKLSMgZGVmaW5lIEFTSU9fTU9WRV9DQVNUKHR5cGUpIHN0YXRpY19jYXN0PHR5cGUmJj4KLSMgZGVmaW5lIEFTSU9fTU9WRV9DQVNUMih0eXBlMSwgdHlwZTIpIHN0YXRpY19jYXN0PHR5cGUxLCB0eXBlMiYmPgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgJiYgIWRlZmluZWQoQVNJT19NT1ZFX0NBU1QpCi0KLS8vIElmIEFTSU9fTU9WRV9DQVNUIHN0aWxsIGlzbid0IGRlZmluZWQsIGRlZmF1bHQgdG8gYSBDKyswMy1jb21wYXRpYmxlCi0vLyBpbXBsZW1lbnRhdGlvbi4gTm90ZSB0aGF0IG9sZGVyIGcrKyBhbmQgTVNWQyB2ZXJzaW9ucyBkb24ndCBsaWtlIGl0IHdoZW4geW91Ci0vLyBwYXNzIGEgbm9uLW1lbWJlciBmdW5jdGlvbiB0aHJvdWdoIGEgY29uc3QgcmVmZXJlbmNlLCBzbyBmb3IgbW9zdCBjb21waWxlcnMKLS8vIHdlJ2xsIHBsYXkgaXQgc2FmZSBhbmQgc3RpY2sgd2l0aCB0aGUgb2xkIGFwcHJvYWNoIG9mIHBhc3NpbmcgdGhlIGhhbmRsZXIgYnkKLS8vIHZhbHVlLgotI2lmICFkZWZpbmVkKEFTSU9fTU9WRV9DQVNUKQotIyBpZiBkZWZpbmVkKF9fR05VQ19fKQotIyAgaWYgKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gMSkpIHx8IChfX0dOVUNfXyA+IDQpCi0jICAgZGVmaW5lIEFTSU9fTU9WRV9BUkcodHlwZSkgY29uc3QgdHlwZSYKLSMgIGVsc2UgLy8gKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gMSkpIHx8IChfX0dOVUNfXyA+IDQpCi0jICAgZGVmaW5lIEFTSU9fTU9WRV9BUkcodHlwZSkgdHlwZQotIyAgZW5kaWYgLy8gKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gMSkpIHx8IChfX0dOVUNfXyA+IDQpCi0jIGVsaWYgZGVmaW5lZChBU0lPX01TVkMpCi0jICBpZiAoX01TQ19WRVIgPj0gMTQwMCkKLSMgICBkZWZpbmUgQVNJT19NT1ZFX0FSRyh0eXBlKSBjb25zdCB0eXBlJgotIyAgZWxzZSAvLyAoX01TQ19WRVIgPj0gMTQwMCkKLSMgICBkZWZpbmUgQVNJT19NT1ZFX0FSRyh0eXBlKSB0eXBlCi0jICBlbmRpZiAvLyAoX01TQ19WRVIgPj0gMTQwMCkKLSMgZWxzZQotIyAgZGVmaW5lIEFTSU9fTU9WRV9BUkcodHlwZSkgdHlwZQotIyBlbmRpZgotIyBkZWZpbmUgQVNJT19NT1ZFX0NBU1QodHlwZSkgc3RhdGljX2Nhc3Q8Y29uc3QgdHlwZSY+Ci0jIGRlZmluZSBBU0lPX01PVkVfQ0FTVDIodHlwZTEsIHR5cGUyKSBzdGF0aWNfY2FzdDxjb25zdCB0eXBlMSwgdHlwZTImPgotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTU9WRV9DQVNUKQotCi0vLyBTdXBwb3J0IHZhcmlhZGljIHRlbXBsYXRlcyBvbiBjb21waWxlcnMga25vd24gdG8gYWxsb3cgaXQuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfVkFSSUFESUNfVEVNUExBVEVTKQotIyBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfVkFSSUFESUNfVEVNUExBVEVTKQotIyAgaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jICAgaWYgX19oYXNfZmVhdHVyZShfX2N4eF92YXJpYWRpY190ZW1wbGF0ZXNfXykKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1ZBUklBRElDX1RFTVBMQVRFUyAxCi0jICAgZW5kaWYgLy8gX19oYXNfZmVhdHVyZShfX2N4eF92YXJpYWRpY190ZW1wbGF0ZXNfXykKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19jbGFuZ19fKQotIyAgaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgICBpZiAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gNCkKLSMgICAgaWYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICAgIGRlZmluZSBBU0lPX0hBU19WQVJJQURJQ19URU1QTEFURVMgMQotIyAgICBlbmRpZiAvLyBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQotIyAgIGVuZGlmIC8vICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX1ZBUklBRElDX1RFTVBMQVRFUykKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19WQVJJQURJQ19URU1QTEFURVMpCi0KLS8vIFN1cHBvcnQgY29uc3RleHByIG9uIGNvbXBpbGVycyBrbm93biB0byBhbGxvdyBpdC4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19DT05TVEVYUFIpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9DT05TVEVYUFIpCi0jICBpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgICBpZiBfX2hhc19mZWF0dXJlKF9fY3h4X2NvbnN0ZXhwcl9fKQotIyAgICBkZWZpbmUgQVNJT19IQVNfQ09OU1RFWFBSIDEKLSMgICBlbmRpZiAvLyBfX2hhc19mZWF0dXJlKF9fY3h4X2NvbnN0ZXhyX18pCi0jICBlbmRpZiAvLyBkZWZpbmVkKF9fY2xhbmdfXykKLSMgIGlmIGRlZmluZWQoX19HTlVDX18pCi0jICAgaWYgKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gNikpIHx8IChfX0dOVUNfXyA+IDQpCi0jICAgIGlmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfQ09OU1RFWFBSIDEKLSMgICAgZW5kaWYgLy8gZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICBlbmRpZiAvLyAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA2KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19HTlVDX18pCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9DT05TVEVYUFIpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfQ09OU1RFWFBSKQotI2lmICFkZWZpbmVkKEFTSU9fQ09OU1RFWFBSKQotIyBpZiBkZWZpbmVkKEFTSU9fSEFTX0NPTlNURVhQUikKLSMgIGRlZmluZSBBU0lPX0NPTlNURVhQUiBjb25zdGV4cHIKLSMgZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX0NPTlNURVhQUikKLSMgIGRlZmluZSBBU0lPX0NPTlNURVhQUgotIyBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0NPTlNURVhQUikKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0NPTlNURVhQUikKLQotLy8gU3RhbmRhcmQgbGlicmFyeSBzdXBwb3J0IGZvciBzeXN0ZW0gZXJyb3JzLgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfU1lTVEVNX0VSUk9SKQotIyAgaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jICAgaWYgZGVmaW5lZChBU0lPX0hBU19DTEFOR19MSUJDWFgpCi0jICAgIGRlZmluZSBBU0lPX0hBU19TVERfU1lTVEVNX0VSUk9SIDEKLSMgICBlbGlmIChfX2NwbHVzcGx1cyA+PSAyMDExMDMpCi0jICAgIGlmIF9faGFzX2luY2x1ZGUoPHN5c3RlbV9lcnJvcj4pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfU1REX1NZU1RFTV9FUlJPUiAxCi0jICAgIGVuZGlmIC8vIF9faGFzX2luY2x1ZGUoPHN5c3RlbV9lcnJvcj4pCi0jICAgZW5kaWYgLy8gKF9fY3BsdXNwbHVzID49IDIwMTEwMykKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19jbGFuZ19fKQotIyAgaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgICBpZiAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA2KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgICAgaWYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICAgIGRlZmluZSBBU0lPX0hBU19TVERfU1lTVEVNX0VSUk9SIDEKLSMgICAgZW5kaWYgLy8gZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICBlbmRpZiAvLyAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA2KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19HTlVDX18pCi0jICBpZiBkZWZpbmVkKEFTSU9fTVNWQykKLSMgICBpZiAoX01TQ19WRVIgPj0gMTcwMCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IgMQotIyAgIGVuZGlmIC8vIChfTVNDX1ZFUiA+PSAxNzAwKQotIyAgZW5kaWYgLy8gZGVmaW5lZChBU0lPX01TVkMpCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfU1lTVEVNX0VSUk9SKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0KLS8vIENvbXBsaWFudCBDKysxMSBjb21waWxlcnMgcHV0IG5vZXhjZXB0IHNwZWNpZmllcnMgb24gZXJyb3JfY2F0ZWdvcnkgbWVtYmVycy4KLSNpZiAhZGVmaW5lZChBU0lPX0VSUk9SX0NBVEVHT1JZX05PRVhDRVBUKQotIyBpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDUzMDApCi0jICBkZWZpbmUgQVNJT19FUlJPUl9DQVRFR09SWV9OT0VYQ0VQVCBCT09TVF9OT0VYQ0VQVAotIyBlbGlmIGRlZmluZWQoX19jbGFuZ19fKQotIyAgaWYgX19oYXNfZmVhdHVyZShfX2N4eF9ub2V4Y2VwdF9fKQotIyAgIGRlZmluZSBBU0lPX0VSUk9SX0NBVEVHT1JZX05PRVhDRVBUIG5vZXhjZXB0KHRydWUpCi0jICBlbmRpZiAvLyBfX2hhc19mZWF0dXJlKF9fY3h4X25vZXhjZXB0X18pCi0jIGVsaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgIGlmICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDcpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgIGlmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCi0jICAgICBkZWZpbmUgQVNJT19FUlJPUl9DQVRFR09SWV9OT0VYQ0VQVCBub2V4Y2VwdCh0cnVlKQotIyAgIGVuZGlmIC8vIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCi0jICBlbmRpZiAvLyAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA3KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykKLSMgaWYgZGVmaW5lZChBU0lPX01TVkMpCi0jICBpZiAoX01TQ19WRVIgPj0gMTkwMCkKLSMgICBkZWZpbmUgQVNJT19FUlJPUl9DQVRFR09SWV9OT0VYQ0VQVCBub2V4Y2VwdCh0cnVlKQotIyAgZW5kaWYgLy8gKF9NU0NfVkVSID49IDE5MDApCi0jIGVuZGlmIC8vIGRlZmluZWQoQVNJT19NU1ZDKQotIyBpZiAhZGVmaW5lZChBU0lPX0VSUk9SX0NBVEVHT1JZX05PRVhDRVBUKQotIyAgZGVmaW5lIEFTSU9fRVJST1JfQ0FURUdPUllfTk9FWENFUFQKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19FUlJPUl9DQVRFR09SWV9OT0VYQ0VQVCkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VSUk9SX0NBVEVHT1JZX05PRVhDRVBUKQotCi0vLyBTdGFuZGFyZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIGFycmF5cy4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19TVERfQVJSQVkpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfQVJSQVkpCi0jICBpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgICBpZiBkZWZpbmVkKEFTSU9fSEFTX0NMQU5HX0xJQkNYWCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9BUlJBWSAxCi0jICAgZWxpZiAoX19jcGx1c3BsdXMgPj0gMjAxMTAzKQotIyAgICBpZiBfX2hhc19pbmNsdWRlKDxhcnJheT4pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfU1REX0FSUkFZIDEKLSMgICAgZW5kaWYgLy8gX19oYXNfaW5jbHVkZSg8YXJyYXk+KQotIyAgIGVuZGlmIC8vIChfX2NwbHVzcGx1cyA+PSAyMDExMDMpCi0jICBlbmRpZiAvLyBkZWZpbmVkKF9fY2xhbmdfXykKLSMgIGlmIGRlZmluZWQoX19HTlVDX18pCi0jICAgaWYgKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gMykpIHx8IChfX0dOVUNfXyA+IDQpCi0jICAgIGlmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfU1REX0FSUkFZIDEKLSMgICAgZW5kaWYgLy8gZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICBlbmRpZiAvLyAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gNCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19HTlVDX18pCi0jICBpZiBkZWZpbmVkKEFTSU9fTVNWQykKLSMgICBpZiAoX01TQ19WRVIgPj0gMTYwMCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9BUlJBWSAxCi0jICAgZW5kaWYgLy8gKF9NU0NfVkVSID49IDE2MDApCi0jICBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fTVNWQykKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX1NURF9BUlJBWSkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19TVERfQVJSQVkpCi0KLS8vIFN0YW5kYXJkIGxpYnJhcnkgc3VwcG9ydCBmb3Igc2hhcmVkX3B0ciBhbmQgd2Vha19wdHIuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfU1REX1NIQVJFRF9QVFIpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfU0hBUkVEX1BUUikKLSMgIGlmIGRlZmluZWQoX19jbGFuZ19fKQotIyAgIGlmIGRlZmluZWQoQVNJT19IQVNfQ0xBTkdfTElCQ1hYKQotIyAgICBkZWZpbmUgQVNJT19IQVNfU1REX1NIQVJFRF9QVFIgMQotIyAgIGVsaWYgKF9fY3BsdXNwbHVzID49IDIwMTEwMykKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9TSEFSRURfUFRSIDEKLSMgICBlbmRpZiAvLyAoX19jcGx1c3BsdXMgPj0gMjAxMTAzKQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX2NsYW5nX18pCi0jICBpZiBkZWZpbmVkKF9fR05VQ19fKQotIyAgIGlmICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgICBpZiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQotIyAgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9TSEFSRURfUFRSIDEKLSMgICAgZW5kaWYgLy8gZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICBlbmRpZiAvLyAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAzKSkgfHwgKF9fR05VQ19fID4gNCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19HTlVDX18pCi0jICBpZiBkZWZpbmVkKEFTSU9fTVNWQykKLSMgICBpZiAoX01TQ19WRVIgPj0gMTYwMCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9TSEFSRURfUFRSIDEKLSMgICBlbmRpZiAvLyAoX01TQ19WRVIgPj0gMTYwMCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoQVNJT19NU1ZDKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfU1REX1NIQVJFRF9QVFIpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfU1REX1NIQVJFRF9QVFIpCi0KLS8vIFN0YW5kYXJkIGxpYnJhcnkgc3VwcG9ydCBmb3IgYXRvbWljIG9wZXJhdGlvbnMuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfU1REX0FUT01JQykKLSMgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX1NURF9BVE9NSUMpCi0jICBpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgICBpZiBkZWZpbmVkKEFTSU9fSEFTX0NMQU5HX0xJQkNYWCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9BVE9NSUMgMQotIyAgIGVsaWYgKF9fY3BsdXNwbHVzID49IDIwMTEwMykKLSMgICAgaWYgX19oYXNfaW5jbHVkZSg8YXRvbWljPikKLSMgICAgIGRlZmluZSBBU0lPX0hBU19TVERfQVRPTUlDIDEKLSMgICAgZW5kaWYgLy8gX19oYXNfaW5jbHVkZSg8YXRvbWljPikKLSMgICBlbmRpZiAvLyAoX19jcGx1c3BsdXMgPj0gMjAxMTAzKQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX2NsYW5nX18pCi0jICBpZiBkZWZpbmVkKF9fR05VQ19fKQotIyAgIGlmICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDUpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgICBpZiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQotIyAgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9BVE9NSUMgMQotIyAgICBlbmRpZiAvLyBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQotIyAgIGVuZGlmIC8vICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDUpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykKLSMgIGlmIGRlZmluZWQoQVNJT19NU1ZDKQotIyAgIGlmIChfTVNDX1ZFUiA+PSAxNzAwKQotIyAgICBkZWZpbmUgQVNJT19IQVNfU1REX0FUT01JQyAxCi0jICAgZW5kaWYgLy8gKF9NU0NfVkVSID49IDE3MDApCi0jICBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fTVNWQykKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX1NURF9BVE9NSUMpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfU1REX0FUT01JQykKLQotLy8gU3RhbmRhcmQgbGlicmFyeSBzdXBwb3J0IGZvciBjaHJvbm8uIFNvbWUgc3RhbmRhcmQgbGlicmFyaWVzIChzdWNoIGFzIHRoZQotLy8gbGlic3RkYysrIHNoaXBwZWQgd2l0aCBnY2MgNC42KSBwcm92aWRlIG1vbm90b25pY19jbG9jayBhcyBwZXIgZWFybHkgQysrMHgKLS8vIGRyYWZ0cywgcmF0aGVyIHRoYW4gdGhlIGV2ZW50dWFsbHkgc3RhbmRhcmRpc2VkIG5hbWUgb2Ygc3RlYWR5X2Nsb2NrLgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk8pCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfQ0hST05PKQotIyAgaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jICAgaWYgZGVmaW5lZChBU0lPX0hBU19DTEFOR19MSUJDWFgpCi0jICAgIGRlZmluZSBBU0lPX0hBU19TVERfQ0hST05PIDEKLSMgICBlbGlmIChfX2NwbHVzcGx1cyA+PSAyMDExMDMpCi0jICAgIGlmIF9faGFzX2luY2x1ZGUoPGNocm9ubz4pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfU1REX0NIUk9OTyAxCi0jICAgIGVuZGlmIC8vIF9faGFzX2luY2x1ZGUoPGNocm9ubz4pCi0jICAgZW5kaWYgLy8gKF9fY3BsdXNwbHVzID49IDIwMTEwMykKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19jbGFuZ19fKQotIyAgaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgICBpZiAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA2KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgICAgaWYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICAgIGRlZmluZSBBU0lPX0hBU19TVERfQ0hST05PIDEKLSMgICAgIGlmICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID09IDYpKQotIyAgICAgIGRlZmluZSBBU0lPX0hBU19TVERfQ0hST05PX01PTk9UT05JQ19DTE9DSyAxCi0jICAgICBlbmRpZiAvLyAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA9PSA2KSkKLSMgICAgZW5kaWYgLy8gZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICBlbmRpZiAvLyAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA2KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19HTlVDX18pCi0jICBpZiBkZWZpbmVkKEFTSU9fTVNWQykKLSMgICBpZiAoX01TQ19WRVIgPj0gMTcwMCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9DSFJPTk8gMQotIyAgIGVuZGlmIC8vIChfTVNDX1ZFUiA+PSAxNzAwKQotIyAgZW5kaWYgLy8gZGVmaW5lZChBU0lPX01TVkMpCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfQ0hST05PKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk8pCi0KLS8vIEJvb3N0IHN1cHBvcnQgZm9yIGNocm9uby4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19CT09TVF9DSFJPTk8pCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9CT09TVF9DSFJPTk8pCi0jICBpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDQ3MDApCi0jICAgZGVmaW5lIEFTSU9fSEFTX0JPT1NUX0NIUk9OTyAxCi0jICBlbmRpZiAvLyAoQk9PU1RfVkVSU0lPTiA+PSAxMDQ3MDApCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9CT09TVF9DSFJPTk8pCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ0hST05PKQotCi0vLyBCb29zdCBzdXBwb3J0IGZvciB0aGUgRGF0ZVRpbWUgbGlicmFyeS4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19CT09TVF9EQVRFX1RJTUUpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9CT09TVF9EQVRFX1RJTUUpCi0jICBkZWZpbmUgQVNJT19IQVNfQk9PU1RfREFURV9USU1FIDEKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX0JPT1NUX0RBVEVfVElNRSkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19CT09TVF9EQVRFX1RJTUUpCi0KLS8vIFN0YW5kYXJkIGxpYnJhcnkgc3VwcG9ydCBmb3IgYWRkcmVzc29mLgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1NURF9BRERSRVNTT0YpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfQUREUkVTU09GKQotIyAgaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jICAgaWYgZGVmaW5lZChBU0lPX0hBU19DTEFOR19MSUJDWFgpCi0jICAgIGRlZmluZSBBU0lPX0hBU19TVERfQUREUkVTU09GIDEKLSMgICBlbGlmIChfX2NwbHVzcGx1cyA+PSAyMDExMDMpCi0jICAgIGRlZmluZSBBU0lPX0hBU19TVERfQUREUkVTU09GIDEKLSMgICBlbmRpZiAvLyAoX19jcGx1c3BsdXMgPj0gMjAxMTAzKQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX2NsYW5nX18pCi0jICBpZiBkZWZpbmVkKF9fR05VQ19fKQotIyAgIGlmICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDYpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgICBpZiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQotIyAgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9BRERSRVNTT0YgMQotIyAgICBlbmRpZiAvLyBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQotIyAgIGVuZGlmIC8vICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDYpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykKLSMgIGlmIGRlZmluZWQoQVNJT19NU1ZDKQotIyAgIGlmIChfTVNDX1ZFUiA+PSAxNzAwKQotIyAgICBkZWZpbmUgQVNJT19IQVNfU1REX0FERFJFU1NPRiAxCi0jICAgZW5kaWYgLy8gKF9NU0NfVkVSID49IDE3MDApCi0jICBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fTVNWQykKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX1NURF9BRERSRVNTT0YpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfU1REX0FERFJFU1NPRikKLQotLy8gU3RhbmRhcmQgbGlicmFyeSBzdXBwb3J0IGZvciB0aGUgZnVuY3Rpb24gY2xhc3MuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfU1REX0ZVTkNUSU9OKQotIyBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfU1REX0ZVTkNUSU9OKQotIyAgaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jICAgaWYgZGVmaW5lZChBU0lPX0hBU19DTEFOR19MSUJDWFgpCi0jICAgIGRlZmluZSBBU0lPX0hBU19TVERfRlVOQ1RJT04gMQotIyAgIGVsaWYgKF9fY3BsdXNwbHVzID49IDIwMTEwMykKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9GVU5DVElPTiAxCi0jICAgZW5kaWYgLy8gKF9fY3BsdXNwbHVzID49IDIwMTEwMykKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19jbGFuZ19fKQotIyAgaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgICBpZiAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA1KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgICAgaWYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICAgIGRlZmluZSBBU0lPX0hBU19TVERfRlVOQ1RJT04gMQotIyAgICBlbmRpZiAvLyBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQotIyAgIGVuZGlmIC8vICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDUpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykKLSMgIGlmIGRlZmluZWQoQVNJT19NU1ZDKQotIyAgIGlmIChfTVNDX1ZFUiA+PSAxNzAwKQotIyAgICBkZWZpbmUgQVNJT19IQVNfU1REX0ZVTkNUSU9OIDEKLSMgICBlbmRpZiAvLyAoX01TQ19WRVIgPj0gMTcwMCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoQVNJT19NU1ZDKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfU1REX0ZVTkNUSU9OKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1NURF9GVU5DVElPTikKLQotLy8gU3RhbmRhcmQgbGlicmFyeSBzdXBwb3J0IGZvciB0eXBlIHRyYWl0cy4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19TVERfVFlQRV9UUkFJVFMpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfVFlQRV9UUkFJVFMpCi0jICBpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgICBpZiBkZWZpbmVkKEFTSU9fSEFTX0NMQU5HX0xJQkNYWCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9UWVBFX1RSQUlUUyAxCi0jICAgZWxpZiAoX19jcGx1c3BsdXMgPj0gMjAxMTAzKQotIyAgICBpZiBfX2hhc19pbmNsdWRlKDx0eXBlX3RyYWl0cz4pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfU1REX1RZUEVfVFJBSVRTIDEKLSMgICAgZW5kaWYgLy8gX19oYXNfaW5jbHVkZSg8dHlwZV90cmFpdHM+KQotIyAgIGVuZGlmIC8vIChfX2NwbHVzcGx1cyA+PSAyMDExMDMpCi0jICBlbmRpZiAvLyBkZWZpbmVkKF9fY2xhbmdfXykKLSMgIGlmIGRlZmluZWQoX19HTlVDX18pCi0jICAgaWYgKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gNSkpIHx8IChfX0dOVUNfXyA+IDQpCi0jICAgIGlmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfU1REX1RZUEVfVFJBSVRTIDEKLSMgICAgZW5kaWYgLy8gZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICBlbmRpZiAvLyAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA1KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19HTlVDX18pCi0jICBpZiBkZWZpbmVkKEFTSU9fTVNWQykKLSMgICBpZiAoX01TQ19WRVIgPj0gMTcwMCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9UWVBFX1RSQUlUUyAxCi0jICAgZW5kaWYgLy8gKF9NU0NfVkVSID49IDE3MDApCi0jICBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fTVNWQykKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX1NURF9UWVBFX1RSQUlUUykKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19TVERfVFlQRV9UUkFJVFMpCi0KLS8vIFN0YW5kYXJkIGxpYnJhcnkgc3VwcG9ydCBmb3IgdGhlIGNzdGRpbnQgaGVhZGVyLgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX0NTVERJTlQpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9DU1RESU5UKQotIyAgaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jICAgaWYgZGVmaW5lZChBU0lPX0hBU19DTEFOR19MSUJDWFgpCi0jICAgIGRlZmluZSBBU0lPX0hBU19DU1RESU5UIDEKLSMgICBlbGlmIChfX2NwbHVzcGx1cyA+PSAyMDExMDMpCi0jICAgIGRlZmluZSBBU0lPX0hBU19DU1RESU5UIDEKLSMgICBlbmRpZiAvLyAoX19jcGx1c3BsdXMgPj0gMjAxMTAzKQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX2NsYW5nX18pCi0jICBpZiBkZWZpbmVkKF9fR05VQ19fKQotIyAgIGlmICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDUpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgICBpZiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQotIyAgICAgZGVmaW5lIEFTSU9fSEFTX0NTVERJTlQgMQotIyAgICBlbmRpZiAvLyBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQotIyAgIGVuZGlmIC8vICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDUpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykKLSMgIGlmIGRlZmluZWQoQVNJT19NU1ZDKQotIyAgIGlmIChfTVNDX1ZFUiA+PSAxNzAwKQotIyAgICBkZWZpbmUgQVNJT19IQVNfQ1NURElOVCAxCi0jICAgZW5kaWYgLy8gKF9NU0NfVkVSID49IDE3MDApCi0jICBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fTVNWQykKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX0NTVERJTlQpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfQ1NURElOVCkKLQotLy8gU3RhbmRhcmQgbGlicmFyeSBzdXBwb3J0IGZvciB0aGUgdGhyZWFkIGNsYXNzLgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1NURF9USFJFQUQpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfVEhSRUFEKQotIyAgaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jICAgaWYgZGVmaW5lZChBU0lPX0hBU19DTEFOR19MSUJDWFgpCi0jICAgIGRlZmluZSBBU0lPX0hBU19TVERfVEhSRUFEIDEKLSMgICBlbGlmIChfX2NwbHVzcGx1cyA+PSAyMDExMDMpCi0jICAgIGlmIF9faGFzX2luY2x1ZGUoPHRocmVhZD4pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfU1REX1RIUkVBRCAxCi0jICAgIGVuZGlmIC8vIF9faGFzX2luY2x1ZGUoPHRocmVhZD4pCi0jICAgZW5kaWYgLy8gKF9fY3BsdXNwbHVzID49IDIwMTEwMykKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19jbGFuZ19fKQotIyAgaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgICBpZiAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA3KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgICAgaWYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICAgIGRlZmluZSBBU0lPX0hBU19TVERfVEhSRUFEIDEKLSMgICAgZW5kaWYgLy8gZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICBlbmRpZiAvLyAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA3KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19HTlVDX18pCi0jICBpZiBkZWZpbmVkKEFTSU9fTVNWQykKLSMgICBpZiAoX01TQ19WRVIgPj0gMTcwMCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9USFJFQUQgMQotIyAgIGVuZGlmIC8vIChfTVNDX1ZFUiA+PSAxNzAwKQotIyAgZW5kaWYgLy8gZGVmaW5lZChBU0lPX01TVkMpCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfVEhSRUFEKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1NURF9USFJFQUQpCi0KLS8vIFN0YW5kYXJkIGxpYnJhcnkgc3VwcG9ydCBmb3IgdGhlIG11dGV4IGFuZCBjb25kaXRpb24gdmFyaWFibGUgY2xhc3Nlcy4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19TVERfTVVURVhfQU5EX0NPTkRWQVIpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TVERfTVVURVhfQU5EX0NPTkRWQVIpCi0jICBpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgICBpZiBkZWZpbmVkKEFTSU9fSEFTX0NMQU5HX0xJQkNYWCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9NVVRFWF9BTkRfQ09ORFZBUiAxCi0jICAgZWxpZiAoX19jcGx1c3BsdXMgPj0gMjAxMTAzKQotIyAgICBpZiBfX2hhc19pbmNsdWRlKDxtdXRleD4pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfU1REX01VVEVYX0FORF9DT05EVkFSIDEKLSMgICAgZW5kaWYgLy8gX19oYXNfaW5jbHVkZSg8bXV0ZXg+KQotIyAgIGVuZGlmIC8vIChfX2NwbHVzcGx1cyA+PSAyMDExMDMpCi0jICBlbmRpZiAvLyBkZWZpbmVkKF9fY2xhbmdfXykKLSMgIGlmIGRlZmluZWQoX19HTlVDX18pCi0jICAgaWYgKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gNykpIHx8IChfX0dOVUNfXyA+IDQpCi0jICAgIGlmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCi0jICAgICBkZWZpbmUgQVNJT19IQVNfU1REX01VVEVYX0FORF9DT05EVkFSIDEKLSMgICAgZW5kaWYgLy8gZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgICBlbmRpZiAvLyAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA3KSkgfHwgKF9fR05VQ19fID4gNCkKLSMgIGVuZGlmIC8vIGRlZmluZWQoX19HTlVDX18pCi0jICBpZiBkZWZpbmVkKEFTSU9fTVNWQykKLSMgICBpZiAoX01TQ19WRVIgPj0gMTcwMCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1NURF9NVVRFWF9BTkRfQ09ORFZBUiAxCi0jICAgZW5kaWYgLy8gKF9NU0NfVkVSID49IDE3MDApCi0jICBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fTVNWQykKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX1NURF9NVVRFWF9BTkRfQ09ORFZBUikKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19TVERfTVVURVhfQU5EX0NPTkRWQVIpCi0KLS8vIFdpblJUIHRhcmdldC4KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSMgaWYgZGVmaW5lZChfX2NwbHVzcGx1c193aW5ydCkKLSMgIGluY2x1ZGUgPHdpbmFwaWZhbWlseS5oPgotIyAgaWYgV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oV0lOQVBJX1BBUlRJVElPTl9BUFApIFwKLSAgICYmICFXSU5BUElfRkFNSUxZX1BBUlRJVElPTihXSU5BUElfUEFSVElUSU9OX0RFU0tUT1ApCi0jICAgZGVmaW5lIEFTSU9fV0lORE9XU19SVU5USU1FIDEKLSMgIGVuZGlmIC8vIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKFdJTkFQSV9QQVJUSVRJT05fQVBQKQotICAgICAgICAgLy8gJiYgIVdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKFdJTkFQSV9QQVJUSVRJT05fREVTS1RPUCkKLSMgZW5kaWYgLy8gZGVmaW5lZChfX2NwbHVzcGx1c193aW5ydCkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotLy8gV2luZG93cyB0YXJnZXQuIEV4Y2x1ZGVzIFdpblJULgotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLSMgaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0jICBpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0NPTkZJRykgJiYgZGVmaW5lZChCT09TVF9XSU5ET1dTKQotIyAgIGRlZmluZSBBU0lPX1dJTkRPV1MgMQotIyAgZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0jICAgZGVmaW5lIEFTSU9fV0lORE9XUyAxCi0jICBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0NPTkZJRykgJiYgZGVmaW5lZChCT09TVF9XSU5ET1dTKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0KLS8vIFdpbmRvd3M6IHRhcmdldCBPUyB2ZXJzaW9uLgotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jIGlmICFkZWZpbmVkKF9XSU4zMl9XSU5OVCkgJiYgIWRlZmluZWQoX1dJTjMyX1dJTkRPV1MpCi0jICBpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLSMgICBwcmFnbWEgbWVzc2FnZSggXAotICAiUGxlYXNlIGRlZmluZSBfV0lOMzJfV0lOTlQgb3IgX1dJTjMyX1dJTkRPV1MgYXBwcm9wcmlhdGVseS4gRm9yIGV4YW1wbGU6XG4iXAotICAiLSBhZGQgLURfV0lOMzJfV0lOTlQ9MHgwNTAxIHRvIHRoZSBjb21waWxlciBjb21tYW5kIGxpbmU7IG9yXG4iXAotICAiLSBhZGQgX1dJTjMyX1dJTk5UPTB4MDUwMSB0byB5b3VyIHByb2plY3QncyBQcmVwcm9jZXNzb3IgRGVmaW5pdGlvbnMuXG4iXAotICAiQXNzdW1pbmcgX1dJTjMyX1dJTk5UPTB4MDUwMSAoaS5lLiBXaW5kb3dzIFhQIHRhcmdldCkuIikKLSMgIGVsc2UgLy8gZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jICAgd2FybmluZyBQbGVhc2UgZGVmaW5lIF9XSU4zMl9XSU5OVCBvciBfV0lOMzJfV0lORE9XUyBhcHByb3ByaWF0ZWx5LgotIyAgIHdhcm5pbmcgRm9yIGV4YW1wbGUsIGFkZCAtRF9XSU4zMl9XSU5OVD0weDA1MDEgdG8gdGhlIGNvbXBpbGVyIGNvbW1hbmQgbGluZS4KLSMgICB3YXJuaW5nIEFzc3VtaW5nIF9XSU4zMl9XSU5OVD0weDA1MDEgKGkuZS4gV2luZG93cyBYUCB0YXJnZXQpLgotIyAgZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jICBkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDUwMQotIyBlbmRpZiAvLyAhZGVmaW5lZChfV0lOMzJfV0lOTlQpICYmICFkZWZpbmVkKF9XSU4zMl9XSU5ET1dTKQotIyBpZiBkZWZpbmVkKF9NU0NfVkVSKQotIyAgaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKFdJTjMyKQotIyAgIGlmICFkZWZpbmVkKF9XSU5TT0NLMkFQSV8pCi0jICAgIGRlZmluZSBXSU4zMiAvLyBOZWVkZWQgZm9yIGNvcnJlY3QgdHlwZXMgaW4gd2luc29jazIuaAotIyAgIGVsc2UgLy8gIWRlZmluZWQoX1dJTlNPQ0syQVBJXykKLSMgICAgZXJyb3IgUGxlYXNlIGRlZmluZSB0aGUgbWFjcm8gV0lOMzIgaW4geW91ciBjb21waWxlciBvcHRpb25zCi0jICAgZW5kaWYgLy8gIWRlZmluZWQoX1dJTlNPQ0syQVBJXykKLSMgIGVuZGlmIC8vIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChXSU4zMikKLSMgZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikKLSMgaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jICBpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoV0lOMzIpCi0jICAgaWYgIWRlZmluZWQoX1dJTlNPQ0syQVBJXykKLSMgICAgZGVmaW5lIFdJTjMyIC8vIE5lZWRlZCBmb3IgY29ycmVjdCB0eXBlcyBpbiB3aW5zb2NrMi5oCi0jICAgZWxzZSAvLyAhZGVmaW5lZChfV0lOU09DSzJBUElfKQotIyAgICBlcnJvciBQbGVhc2UgZGVmaW5lIHRoZSBtYWNybyBXSU4zMiBpbiB5b3VyIGNvbXBpbGVyIG9wdGlvbnMKLSMgICBlbmRpZiAvLyAhZGVmaW5lZChfV0lOU09DSzJBUElfKQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKFdJTjMyKQotIyBlbmRpZiAvLyBkZWZpbmVkKF9fQk9STEFORENfXykKLSMgaWYgZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgaWYgIWRlZmluZWQoX19VU0VfVzMyX1NPQ0tFVFMpCi0jICAgZXJyb3IgWW91IG11c3QgYWRkIC1EX19VU0VfVzMyX1NPQ0tFVFMgdG8geW91ciBjb21waWxlciBvcHRpb25zLgotIyAgZW5kaWYgLy8gIWRlZmluZWQoX19VU0VfVzMyX1NPQ0tFVFMpCi0jIGVuZGlmIC8vIGRlZmluZWQoX19DWUdXSU5fXykKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotCi0vLyBXaW5kb3dzOiBtaW5pbWlzZSBoZWFkZXIgaW5jbHVzaW9uLgotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jIGlmICFkZWZpbmVkKEFTSU9fTk9fV0lOMzJfTEVBTl9BTkRfTUVBTikKLSMgIGlmICFkZWZpbmVkKFdJTjMyX0xFQU5fQU5EX01FQU4pCi0jICAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgIGVuZGlmIC8vICFkZWZpbmVkKFdJTjMyX0xFQU5fQU5EX01FQU4pCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fV0lOMzJfTEVBTl9BTkRfTUVBTikKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotCi0vLyBXaW5kb3dzOiBzdXBwcmVzcyBkZWZpbml0aW9uIG9mICJtaW4iIGFuZCAibWF4IiBtYWNyb3MuCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSMgaWYgIWRlZmluZWQoQVNJT19OT19OT01JTk1BWCkKLSMgIGlmICFkZWZpbmVkKE5PTUlOTUFYKQotIyAgIGRlZmluZSBOT01JTk1BWCAxCi0jICBlbmRpZiAvLyAhZGVmaW5lZChOT01JTk1BWCkKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19OT01JTk1BWCkKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotCi0vLyBXaW5kb3dzOiBJTyBDb21wbGV0aW9uIFBvcnRzLgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jIGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jICBpZiBkZWZpbmVkKF9XSU4zMl9XSU5OVCkgJiYgKF9XSU4zMl9XSU5OVCA+PSAweDA0MDApCi0jICAgaWYgIWRlZmluZWQoVU5ERVJfQ0UpCi0jICAgIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9JT0NQKQotIyAgICAgZGVmaW5lIEFTSU9fSEFTX0lPQ1AgMQotIyAgICBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfSU9DUCkKLSMgICBlbmRpZiAvLyAhZGVmaW5lZChVTkRFUl9DRSkKLSMgIGVuZGlmIC8vIGRlZmluZWQoX1dJTjMyX1dJTk5UKSAmJiAoX1dJTjMyX1dJTk5UID49IDB4MDQwMCkKLSMgZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0vLyBPbiBQT1NJWCAoYW5kIFBPU0lYLWxpa2UpIHBsYXRmb3JtcyB3ZSBuZWVkIHRvIGluY2x1ZGUgdW5pc3RkLmggaW4gb3JkZXIgdG8KLS8vIGdldCBhY2Nlc3MgdG8gdGhlIHZhcmlvdXMgcGxhdGZvcm0gZmVhdHVyZSBtYWNyb3MsIGUuZy4gdG8gYmUgYWJsZSB0byB0ZXN0Ci0vLyBmb3IgdGhyZWFkcyBzdXBwb3J0LgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1VOSVNURF9IKQotIyBpZiAhZGVmaW5lZChBU0lPX0hBU19CT09TVF9DT05GSUcpCi0jICBpZiBkZWZpbmVkKHVuaXgpIFwKLSAgIHx8IGRlZmluZWQoX191bml4KSBcCi0gICB8fCBkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpIFwKLSAgIHx8IGRlZmluZWQoX1BPU0lYX1NPVVJDRSkgXAotICAgfHwgKGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKSkgXAotICAgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgXAotICAgfHwgZGVmaW5lZChfX05ldEJTRF9fKSBcCi0gICB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSBcCi0gICB8fCBkZWZpbmVkKF9fbGludXhfXykKLSMgICBkZWZpbmUgQVNJT19IQVNfVU5JU1REX0ggMQotIyAgZW5kaWYKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ09ORklHKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1VOSVNURF9IKQotI2lmIGRlZmluZWQoQVNJT19IQVNfVU5JU1REX0gpCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfVU5JU1REX0gpCi0KLS8vIExpbnV4OiBlcG9sbCwgZXZlbnRmZCBhbmQgdGltZXJmZC4KLSNpZiBkZWZpbmVkKF9fbGludXhfXykKLSMgaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotIyBpZiAhZGVmaW5lZChBU0lPX0hBU19FUE9MTCkKLSMgIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9FUE9MTCkKLSMgICBpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDQ1KQotIyAgICBkZWZpbmUgQVNJT19IQVNfRVBPTEwgMQotIyAgIGVuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsNDUpCi0jICBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfRVBPTEwpCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX0VQT0xMKQotIyBpZiAhZGVmaW5lZChBU0lPX0hBU19FVkVOVEZEKQotIyAgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX0VWRU5URkQpCi0jICAgaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMikKLSMgICAgZGVmaW5lIEFTSU9fSEFTX0VWRU5URkQgMQotIyAgIGVuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjIpCi0jICBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfRVZFTlRGRCkKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfRVZFTlRGRCkKLSMgaWYgIWRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLSMgIGlmIGRlZmluZWQoQVNJT19IQVNfRVBPTEwpCi0jICAgaWYgKF9fR0xJQkNfXyA+IDIpIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gOCkKLSMgICAgZGVmaW5lIEFTSU9fSEFTX1RJTUVSRkQgMQotIyAgIGVuZGlmIC8vIChfX0dMSUJDX18gPiAyKSB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDgpCi0jICBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0VQT0xMKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19USU1FUkZEKQotI2VuZGlmIC8vIGRlZmluZWQoX19saW51eF9fKQotCi0vLyBNYWMgT1MgWCwgRnJlZUJTRCwgTmV0QlNELCBPcGVuQlNEOiBrcXVldWUuCi0jaWYgKGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKSkgXAotICB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSBcCi0gIHx8IGRlZmluZWQoX19OZXRCU0RfXykgXAotICB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKQotIyBpZiAhZGVmaW5lZChBU0lPX0hBU19LUVVFVUUpCi0jICBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfS1FVRVVFKQotIyAgIGRlZmluZSBBU0lPX0hBU19LUVVFVUUgMQotIyAgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX0tRVUVVRSkKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfS1FVRVVFKQotI2VuZGlmIC8vIChkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykpCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChfX05ldEJTRF9fKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChfX09wZW5CU0RfXykKLQotLy8gU29sYXJpczogL2Rldi9wb2xsLgotI2lmIGRlZmluZWQoX19zdW4pCi0jIGlmICFkZWZpbmVkKEFTSU9fSEFTX0RFVl9QT0xMKQotIyAgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX0RFVl9QT0xMKQotIyAgIGRlZmluZSBBU0lPX0hBU19ERVZfUE9MTCAxCi0jICBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfREVWX1BPTEwpCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX0RFVl9QT0xMKQotI2VuZGlmIC8vIGRlZmluZWQoX19zdW4pCi0KLS8vIFNlcmlhbCBwb3J0cy4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19TRVJJQUxfUE9SVCkKLSMgaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKSBcCi0gIHx8ICFkZWZpbmVkKEFTSU9fV0lORE9XUykgXAotICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkgXAotICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgaWYgIWRlZmluZWQoX19TWU1CSUFOMzJfXykKLSMgICBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfU0VSSUFMX1BPUlQpCi0jICAgIGRlZmluZSBBU0lPX0hBU19TRVJJQUxfUE9SVCAxCi0jICAgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX1NFUklBTF9QT1JUKQotIyAgZW5kaWYgLy8gIWRlZmluZWQoX19TWU1CSUFOMzJfXykKLSMgZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotICAgICAgICAvLyAgIHx8ICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgICAgICAgLy8gICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1NFUklBTF9QT1JUKQotCi0vLyBXaW5kb3dzOiBzdHJlYW0gaGFuZGxlcy4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX1NUUkVBTV9IQU5ETEUpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9XSU5ET1dTX1NUUkVBTV9IQU5ETEUpCi0jICBpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jICAgZGVmaW5lIEFTSU9fSEFTX1dJTkRPV1NfU1RSRUFNX0hBTkRMRSAxCi0jICBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9XSU5ET1dTX1NUUkVBTV9IQU5ETEUpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfV0lORE9XU19TVFJFQU1fSEFORExFKQotCi0vLyBXaW5kb3dzOiByYW5kb20gYWNjZXNzIGhhbmRsZXMuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfV0lORE9XU19SQU5ET01fQUNDRVNTX0hBTkRMRSkKLSMgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX1dJTkRPV1NfUkFORE9NX0FDQ0VTU19IQU5ETEUpCi0jICBpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jICAgZGVmaW5lIEFTSU9fSEFTX1dJTkRPV1NfUkFORE9NX0FDQ0VTU19IQU5ETEUgMQotIyAgZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfV0lORE9XU19SQU5ET01fQUNDRVNTX0hBTkRMRSkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX1JBTkRPTV9BQ0NFU1NfSEFORExFKQotCi0vLyBXaW5kb3dzOiBvYmplY3QgaGFuZGxlcy4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX09CSkVDVF9IQU5ETEUpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9XSU5ET1dTX09CSkVDVF9IQU5ETEUpCi0jICBpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgIGlmICFkZWZpbmVkKFVOREVSX0NFKQotIyAgICBkZWZpbmUgQVNJT19IQVNfV0lORE9XU19PQkpFQ1RfSEFORExFIDEKLSMgICBlbmRpZiAvLyAhZGVmaW5lZChVTkRFUl9DRSkKLSMgIGVuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9XSU5ET1dTX09CSkVDVF9IQU5ETEUpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfV0lORE9XU19PQkpFQ1RfSEFORExFKQotCi0vLyBXaW5kb3dzOiBPVkVSTEFQUEVEIHdyYXBwZXIuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfV0lORE9XU19PVkVSTEFQUEVEX1BUUikKLSMgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX1dJTkRPV1NfT1ZFUkxBUFBFRF9QVFIpCi0jICBpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jICAgZGVmaW5lIEFTSU9fSEFTX1dJTkRPV1NfT1ZFUkxBUFBFRF9QVFIgMQotIyAgZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfV0lORE9XU19PVkVSTEFQUEVEX1BUUikKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX09WRVJMQVBQRURfUFRSKQotCi0vLyBQT1NJWDogc3RyZWFtLW9yaWVudGVkIGZpbGUgZGVzY3JpcHRvcnMuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfUE9TSVhfU1RSRUFNX0RFU0NSSVBUT1IpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9QT1NJWF9TVFJFQU1fREVTQ1JJUFRPUikKLSMgIGlmICFkZWZpbmVkKEFTSU9fV0lORE9XUykgXAotICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkgXAotICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgIGRlZmluZSBBU0lPX0hBU19QT1NJWF9TVFJFQU1fREVTQ1JJUFRPUiAxCi0jICBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgICAvLyAgICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAgICAgICAgLy8gICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfUE9TSVhfU1RSRUFNX0RFU0NSSVBUT1IpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfUE9TSVhfU1RSRUFNX0RFU0NSSVBUT1IpCi0KLS8vIFVOSVggZG9tYWluIHNvY2tldHMuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfTE9DQUxfU09DS0VUUykKLSMgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX0xPQ0FMX1NPQ0tFVFMpCi0jICBpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpIFwKLSAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpIFwKLSAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSMgICBkZWZpbmUgQVNJT19IQVNfTE9DQUxfU09DS0VUUyAxCi0jICBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgICAvLyAgICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAgICAgICAgLy8gICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfTE9DQUxfU09DS0VUUykKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19MT0NBTF9TT0NLRVRTKQotCi0vLyBDYW4gdXNlIHNpZ2FjdGlvbigpIGluc3RlYWQgb2Ygc2lnbmFsKCkuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfU0lHQUNUSU9OKQotIyBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfU0lHQUNUSU9OKQotIyAgaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTKSBcCi0gICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKSBcCi0gICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0jICAgZGVmaW5lIEFTSU9fSEFTX1NJR0FDVElPTiAxCi0jICBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgICAvLyAgICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAgICAgICAgLy8gICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfU0lHQUNUSU9OKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1NJR0FDVElPTikKLQotLy8gQ2FuIHVzZSBzaWduYWwoKS4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19TSUdOQUwpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TSUdOQUwpCi0jICBpZiAhZGVmaW5lZChVTkRFUl9DRSkKLSMgICBkZWZpbmUgQVNJT19IQVNfU0lHTkFMIDEKLSMgIGVuZGlmIC8vICFkZWZpbmVkKFVOREVSX0NFKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfU0lHTkFMKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1NJR05BTCkKLQotLy8gQ2FuIHVzZSBnZXRhZGRyaW5mbygpIGFuZCBnZXRuYW1laW5mbygpLgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX0dFVEFERFJJTkZPKQotIyBpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgaWYgZGVmaW5lZChfV0lOMzJfV0lOTlQpICYmIChfV0lOMzJfV0lOTlQgPj0gMHgwNTAxKQotIyAgIGRlZmluZSBBU0lPX0hBU19HRVRBRERSSU5GTyAxCi0jICBlbGlmIGRlZmluZWQoVU5ERVJfQ0UpCi0jICAgZGVmaW5lIEFTSU9fSEFTX0dFVEFERFJJTkZPIDEKLSMgIGVuZGlmIC8vIGRlZmluZWQoVU5ERVJfQ0UpCi0jIGVsaWYgIShkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykpCi0jICBkZWZpbmUgQVNJT19IQVNfR0VUQUREUklORk8gMQotIyBlbmRpZiAvLyAhKGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKSkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19HRVRBRERSSU5GTykKLQotLy8gV2hldGhlciBzdGFuZGFyZCBpb3N0cmVhbXMgYXJlIGRpc2FibGVkLgotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0jIGlmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ09ORklHKSAmJiBkZWZpbmVkKEJPT1NUX05PX0lPU1RSRUFNKQotIyAgZGVmaW5lIEFTSU9fTk9fSU9TVFJFQU0gMQotIyBlbmRpZiAvLyAhZGVmaW5lZChCT09TVF9OT19JT1NUUkVBTSkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0vLyBXaGV0aGVyIGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBkaXNhYmxlZC4KLSNpZiAhZGVmaW5lZChBU0lPX05PX0VYQ0VQVElPTlMpCi0jIGlmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ09ORklHKSAmJiBkZWZpbmVkKEJPT1NUX05PX0VYQ0VQVElPTlMpCi0jICBkZWZpbmUgQVNJT19OT19FWENFUFRJT05TIDEKLSMgZW5kaWYgLy8gIWRlZmluZWQoQk9PU1RfTk9fRVhDRVBUSU9OUykKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0VYQ0VQVElPTlMpCi0KLS8vIFdoZXRoZXIgdGhlIHR5cGVpZCBvcGVyYXRvciBpcyBzdXBwb3J0ZWQuCi0jaWYgIWRlZmluZWQoQVNJT19OT19UWVBFSUQpCi0jIGlmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ09ORklHKSAmJiBkZWZpbmVkKEJPT1NUX05PX1RZUEVJRCkKLSMgIGRlZmluZSBBU0lPX05PX1RZUEVJRCAxCi0jIGVuZGlmIC8vICFkZWZpbmVkKEJPT1NUX05PX1RZUEVJRCkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX1RZUEVJRCkKLQotLy8gVGhyZWFkcy4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotIyBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfVEhSRUFEUykKLSMgIGlmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ09ORklHKSAmJiBkZWZpbmVkKEJPT1NUX0hBU19USFJFQURTKQotIyAgIGRlZmluZSBBU0lPX0hBU19USFJFQURTIDEKLSMgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTVQpCi0jICAgZGVmaW5lIEFTSU9fSEFTX1RIUkVBRFMgMQotIyAgZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgZGVmaW5lZChfX01UX18pCi0jICAgZGVmaW5lIEFTSU9fSEFTX1RIUkVBRFMgMQotIyAgZWxpZiBkZWZpbmVkKF9QT1NJWF9USFJFQURTKQotIyAgIGRlZmluZSBBU0lPX0hBU19USFJFQURTIDEKLSMgIGVuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ09ORklHKSAmJiBkZWZpbmVkKEJPT1NUX0hBU19USFJFQURTKQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfVEhSRUFEUykKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotCi0vLyBQT1NJWCB0aHJlYWRzLgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotIyBpZiBkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0jICBpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0NPTkZJRykgJiYgZGVmaW5lZChCT09TVF9IQVNfUFRIUkVBRFMpCi0jICAgZGVmaW5lIEFTSU9fSEFTX1BUSFJFQURTIDEKLSMgIGVsaWYgZGVmaW5lZChfUE9TSVhfVEhSRUFEUykKLSMgICBkZWZpbmUgQVNJT19IQVNfUFRIUkVBRFMgMQotIyAgZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19CT09TVF9DT05GSUcpICYmIGRlZmluZWQoQk9PU1RfSEFTX1BUSFJFQURTKQotIyBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi0KLS8vIEhlbHBlciB0byBwcmV2ZW50IG1hY3JvIGV4cGFuc2lvbi4KLSNkZWZpbmUgQVNJT19QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTgotCi0vLyBIZWxwZXIgdG8gZGVmaW5lIGluLWNsYXNzIGNvbnN0YW50cy4KLSNpZiAhZGVmaW5lZChBU0lPX1NUQVRJQ19DT05TVEFOVCkKLSMgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX0JPT1NUX1NUQVRJQ19DT05TVEFOVCkKLSMgIGRlZmluZSBBU0lPX1NUQVRJQ19DT05TVEFOVCh0eXBlLCBhc3NpZ25tZW50KSBcCi0gICAgQk9PU1RfU1RBVElDX0NPTlNUQU5UKHR5cGUsIGFzc2lnbm1lbnQpCi0jIGVsc2UgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX0JPT1NUX1NUQVRJQ19DT05TVEFOVCkKLSMgIGRlZmluZSBBU0lPX1NUQVRJQ19DT05TVEFOVCh0eXBlLCBhc3NpZ25tZW50KSBcCi0gICAgc3RhdGljIGNvbnN0IHR5cGUgYXNzaWdubWVudAotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfQk9PU1RfU1RBVElDX0NPTlNUQU5UKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fU1RBVElDX0NPTlNUQU5UKQotCi0vLyBCb29zdCBhcnJheSBsaWJyYXJ5LgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0FSUkFZKQotIyBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfQk9PU1RfQVJSQVkpCi0jICBkZWZpbmUgQVNJT19IQVNfQk9PU1RfQVJSQVkgMQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfQk9PU1RfQVJSQVkpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfQk9PU1RfQVJSQVkpCi0KLS8vIEJvb3N0IGFzc2VydCBtYWNyby4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19CT09TVF9BU1NFUlQpCi0jIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9CT09TVF9BU1NFUlQpCi0jICBkZWZpbmUgQVNJT19IQVNfQk9PU1RfQVNTRVJUIDEKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX0JPT1NUX0FTU0VSVCkKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19CT09TVF9BU1NFUlQpCi0KLS8vIEJvb3N0IGxpbWl0cyBoZWFkZXIuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfQk9PU1RfTElNSVRTKQotIyBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfQk9PU1RfTElNSVRTKQotIyAgZGVmaW5lIEFTSU9fSEFTX0JPT1NUX0xJTUlUUyAxCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9CT09TVF9MSU1JVFMpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfQk9PU1RfTElNSVRTKQotCi0vLyBCb29zdCB0aHJvd19leGNlcHRpb24gZnVuY3Rpb24uCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfQk9PU1RfVEhST1dfRVhDRVBUSU9OKQotIyBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfQk9PU1RfVEhST1dfRVhDRVBUSU9OKQotIyAgZGVmaW5lIEFTSU9fSEFTX0JPT1NUX1RIUk9XX0VYQ0VQVElPTiAxCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9CT09TVF9USFJPV19FWENFUFRJT04pCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfQk9PU1RfVEhST1dfRVhDRVBUSU9OKQotCi0vLyBCb29zdCByZWdleCBsaWJyYXJ5LgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX1JFR0VYKQotIyBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfQk9PU1RfUkVHRVgpCi0jICBkZWZpbmUgQVNJT19IQVNfQk9PU1RfUkVHRVggMQotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfQk9PU1RfUkVHRVgpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfQk9PU1RfUkVHRVgpCi0KLS8vIEJvb3N0IGJpbmQgZnVuY3Rpb24uCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfQk9PU1RfQklORCkKLSMgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX0JPT1NUX0JJTkQpCi0jICBkZWZpbmUgQVNJT19IQVNfQk9PU1RfQklORCAxCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9CT09TVF9CSU5EKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0JJTkQpCi0KLS8vIEJvb3N0J3MgQk9PU1RfV09SS0FST1VORCBtYWNyby4KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19CT09TVF9XT1JLQVJPVU5EKQotIyBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfQk9PU1RfV09SS0FST1VORCkKLSMgIGRlZmluZSBBU0lPX0hBU19CT09TVF9XT1JLQVJPVU5EIDEKLSMgZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX0JPT1NUX1dPUktBUk9VTkQpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfQk9PU1RfV09SS0FST1VORCkKLQotLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysncyBzZWN1cmUgQyBydW50aW1lIGxpYnJhcnkuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLSMgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX1NFQ1VSRV9SVEwpCi0jICBpZiBkZWZpbmVkKEFTSU9fTVNWQykgXAotICAgICYmIChBU0lPX01TVkMgPj0gMTQwMCkgXAotICAgICYmICFkZWZpbmVkKFVOREVSX0NFKQotIyAgIGRlZmluZSBBU0lPX0hBU19TRUNVUkVfUlRMIDEKLSMgIGVuZGlmIC8vIGRlZmluZWQoQVNJT19NU1ZDKQotICAgICAgICAgLy8gJiYgKEFTSU9fTVNWQyA+PSAxNDAwKQotICAgICAgICAgLy8gJiYgIWRlZmluZWQoVU5ERVJfQ0UpCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TRUNVUkVfUlRMKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1NFQ1VSRV9SVEwpCi0KLS8vIEhhbmRsZXIgaG9va2luZy4gRGlzYWJsZWQgZm9yIGFuY2llbnQgQm9ybGFuZCBDKysgYW5kIGdjYyBjb21waWxlcnMuCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfSEFORExFUl9IT09LUykKLSMgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX0hBTkRMRVJfSE9PS1MpCi0jICBpZiBkZWZpbmVkKF9fR05VQ19fKQotIyAgIGlmIChfX0dOVUNfXyA+PSAzKQotIyAgICBkZWZpbmUgQVNJT19IQVNfSEFORExFUl9IT09LUyAxCi0jICAgZW5kaWYgLy8gKF9fR05VQ19fID49IDMpCi0jICBlbGlmICFkZWZpbmVkKF9fQk9STEFORENfXykKLSMgICBkZWZpbmUgQVNJT19IQVNfSEFORExFUl9IT09LUyAxCi0jICBlbmRpZiAvLyAhZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9IQU5ETEVSX0hPT0tTKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX0hBTkRMRVJfSE9PS1MpCi0KLS8vIFN1cHBvcnQgZm9yIHRoZSBfX3RocmVhZCBrZXl3b3JkIGV4dGVuc2lvbi4KLSNpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfVEhSRUFEX0tFWVdPUkRfRVhURU5TSU9OKQotIyBpZiBkZWZpbmVkKF9fbGludXhfXykKLSMgIGlmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQotIyAgIGlmICgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSB8fCAoX19HTlVDX18gPiAzKQotIyAgICBpZiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhZGVmaW5lZChfX0lDTCkKLSMgICAgIGRlZmluZSBBU0lPX0hBU19USFJFQURfS0VZV09SRF9FWFRFTlNJT04gMQotIyAgICAgZGVmaW5lIEFTSU9fVEhSRUFEX0tFWVdPUkQgX190aHJlYWQKLSMgICAgZWxpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIChfX0lOVEVMX0NPTVBJTEVSID49IDExMDApCi0jICAgICBkZWZpbmUgQVNJT19IQVNfVEhSRUFEX0tFWVdPUkRfRVhURU5TSU9OIDEKLSMgICAgZW5kaWYgLy8gZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAoX19JTlRFTF9DT01QSUxFUiA+PSAxMTAwKQotIyAgIGVuZGlmIC8vICgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDMpKSB8fCAoX19HTlVDX18gPiAzKQotIyAgZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCi0jIGVuZGlmIC8vIGRlZmluZWQoX19saW51eF9fKQotIyBpZiBkZWZpbmVkKEFTSU9fTVNWQykgJiYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSMgIGlmIChfTVNDX1ZFUiA+PSAxNzAwKQotIyAgIGRlZmluZSBBU0lPX0hBU19USFJFQURfS0VZV09SRF9FWFRFTlNJT04gMQotIyAgIGRlZmluZSBBU0lPX1RIUkVBRF9LRVlXT1JEIF9fZGVjbHNwZWModGhyZWFkKQotIyAgZW5kaWYgLy8gKF9NU0NfVkVSID49IDE3MDApCi0jIGVuZGlmIC8vIGRlZmluZWQoQVNJT19NU1ZDKSAmJiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9USFJFQURfS0VZV09SRF9FWFRFTlNJT04pCi0jaWYgIWRlZmluZWQoQVNJT19USFJFQURfS0VZV09SRCkKLSMgZGVmaW5lIEFTSU9fVEhSRUFEX0tFWVdPUkQgX190aHJlYWQKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1RIUkVBRF9LRVlXT1JEKQotCi0vLyBTdXBwb3J0IGZvciBQT1NJWCBzc2l6ZV90IHR5cGVkZWYuCi0jaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX1NTSVpFX1QpCi0jIGlmIGRlZmluZWQoX19saW51eF9fKSBcCi0gICB8fCAoZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pKQotIyAgZGVmaW5lIEFTSU9fSEFTX1NTSVpFX1QgMQotIyBlbmRpZiAvLyBkZWZpbmVkKF9fbGludXhfXykKLSAgICAgICAgLy8gICB8fCAoZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TU0laRV9UKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfQ09ORklHX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9jb25zdW1pbmdfYnVmZmVycy5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2NvbnN1bWluZ19idWZmZXJzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdjOWZmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2NvbnN1bWluZ19idWZmZXJzLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vLwotLy8gZGV0YWlsL2NvbnN1bWluZ19idWZmZXJzLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9DT05TVU1JTkdfQlVGRkVSU19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfQ09OU1VNSU5HX0JVRkZFUlNfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNpbmNsdWRlICJhc2lvL2J1ZmZlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbGltaXRzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLyBBIHByb3h5IGl0ZXJhdG9yIGZvciBhIHN1Yi1yYW5nZSBpbiBhIGxpc3Qgb2YgYnVmZmVycy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBCdWZmZXIsIHR5cGVuYW1lIEJ1ZmZlcl9JdGVyYXRvcj4KLWNsYXNzIGNvbnN1bWluZ19idWZmZXJzX2l0ZXJhdG9yCi17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgdHlwZSB1c2VkIGZvciB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gaXRlcmF0b3JzLgotICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLQotICAvLy8gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgdGhlIGl0ZXJhdG9yLgotICB0eXBlZGVmIEJ1ZmZlciB2YWx1ZV90eXBlOwotCi0gIC8vLyBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIG9wZXJhdG9yLT4oKSB0byB0aGUgaXRlcmF0b3IuCi0gIHR5cGVkZWYgY29uc3QgQnVmZmVyKiBwb2ludGVyOwotCi0gIC8vLyBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIG9wZXJhdG9yKigpIHRvIHRoZSBpdGVyYXRvci4KLSAgdHlwZWRlZiBjb25zdCBCdWZmZXImIHJlZmVyZW5jZTsKLQotICAvLy8gVGhlIGl0ZXJhdG9yIGNhdGVnb3J5LgotICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0KLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGVuZCBpdGVyYXRvci4KLSAgY29uc3VtaW5nX2J1ZmZlcnNfaXRlcmF0b3IoKQotICAgIDogYXRfZW5kXyh0cnVlKQotICB7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3Qgd2l0aCBhIGJ1ZmZlciBmb3IgdGhlIGZpcnN0IGVudHJ5IGFuZCBhbiBpdGVyYXRvcgotICAvLyByYW5nZSBmb3IgdGhlIHJlbWFpbmluZyBlbnRyaWVzLgotICBjb25zdW1pbmdfYnVmZmVyc19pdGVyYXRvcihib29sIGF0X2VuZCwgY29uc3QgQnVmZmVyJiBmaXJzdCwKLSAgICAgIEJ1ZmZlcl9JdGVyYXRvciBiZWdpbl9yZW1haW5kZXIsIEJ1ZmZlcl9JdGVyYXRvciBlbmRfcmVtYWluZGVyLAotICAgICAgc3RkOjpzaXplX3QgbWF4X3NpemUpCi0gICAgOiBhdF9lbmRfKG1heF9zaXplID4gMCA/IGF0X2VuZCA6IHRydWUpLAotICAgICAgZmlyc3RfKGJ1ZmZlcihmaXJzdCwgbWF4X3NpemUpKSwKLSAgICAgIGJlZ2luX3JlbWFpbmRlcl8oYmVnaW5fcmVtYWluZGVyKSwKLSAgICAgIGVuZF9yZW1haW5kZXJfKGVuZF9yZW1haW5kZXIpLAotICAgICAgb2Zmc2V0XygwKSwKLSAgICAgIG1heF9zaXplXyhtYXhfc2l6ZSkKLSAgewotICB9Ci0KLSAgLy8gRGVyZWZlcmVuY2UgYW4gaXRlcmF0b3IuCi0gIGNvbnN0IEJ1ZmZlciYgb3BlcmF0b3IqKCkgY29uc3QKLSAgewotICAgIHJldHVybiBkZXJlZmVyZW5jZSgpOwotICB9Ci0KLSAgLy8gRGVyZWZlcmVuY2UgYW4gaXRlcmF0b3IuCi0gIGNvbnN0IEJ1ZmZlciogb3BlcmF0b3ItPigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gJmRlcmVmZXJlbmNlKCk7Ci0gIH0KLQotICAvLyBJbmNyZW1lbnQgb3BlcmF0b3IgKHByZWZpeCkuCi0gIGNvbnN1bWluZ19idWZmZXJzX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkKLSAgewotICAgIGluY3JlbWVudCgpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEluY3JlbWVudCBvcGVyYXRvciAocG9zdGZpeCkuCi0gIGNvbnN1bWluZ19idWZmZXJzX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KQotICB7Ci0gICAgY29uc3VtaW5nX2J1ZmZlcnNfaXRlcmF0b3IgdG1wKCp0aGlzKTsKLSAgICArKyp0aGlzOwotICAgIHJldHVybiB0bXA7Ci0gIH0KLQotICAvLyBUZXN0IHR3byBpdGVyYXRvcnMgZm9yIGVxdWFsaXR5LgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN1bWluZ19idWZmZXJzX2l0ZXJhdG9yJiBhLAotICAgICAgY29uc3QgY29uc3VtaW5nX2J1ZmZlcnNfaXRlcmF0b3ImIGIpCi0gIHsKLSAgICByZXR1cm4gYS5lcXVhbChiKTsKLSAgfQotCi0gIC8vIFRlc3QgdHdvIGl0ZXJhdG9ycyBmb3IgaW5lcXVhbGl0eS4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjb25zdW1pbmdfYnVmZmVyc19pdGVyYXRvciYgYSwKLSAgICAgIGNvbnN0IGNvbnN1bWluZ19idWZmZXJzX2l0ZXJhdG9yJiBiKQotICB7Ci0gICAgcmV0dXJuICFhLmVxdWFsKGIpOwotICB9Ci0KLXByaXZhdGU6Ci0gIHZvaWQgaW5jcmVtZW50KCkKLSAgewotICAgIGlmICghYXRfZW5kXykKLSAgICB7Ci0gICAgICBpZiAoYmVnaW5fcmVtYWluZGVyXyA9PSBlbmRfcmVtYWluZGVyXwotICAgICAgICAgIHx8IG9mZnNldF8gKyBidWZmZXJfc2l6ZShmaXJzdF8pID49IG1heF9zaXplXykKLSAgICAgIHsKLSAgICAgICAgYXRfZW5kXyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG9mZnNldF8gKz0gYnVmZmVyX3NpemUoZmlyc3RfKTsKLSAgICAgICAgZmlyc3RfID0gYnVmZmVyKCpiZWdpbl9yZW1haW5kZXJfKyssIG1heF9zaXplXyAtIG9mZnNldF8pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGJvb2wgZXF1YWwoY29uc3QgY29uc3VtaW5nX2J1ZmZlcnNfaXRlcmF0b3ImIG90aGVyKSBjb25zdAotICB7Ci0gICAgaWYgKGF0X2VuZF8gJiYgb3RoZXIuYXRfZW5kXykKLSAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiAhYXRfZW5kXyAmJiAhb3RoZXIuYXRfZW5kXwotICAgICAgJiYgYnVmZmVyX2Nhc3Q8Y29uc3Qgdm9pZCo+KGZpcnN0XykKLSAgICAgICAgPT0gYnVmZmVyX2Nhc3Q8Y29uc3Qgdm9pZCo+KG90aGVyLmZpcnN0XykKLSAgICAgICYmIGJ1ZmZlcl9zaXplKGZpcnN0XykgPT0gYnVmZmVyX3NpemUob3RoZXIuZmlyc3RfKQotICAgICAgJiYgYmVnaW5fcmVtYWluZGVyXyA9PSBvdGhlci5iZWdpbl9yZW1haW5kZXJfCi0gICAgICAmJiBlbmRfcmVtYWluZGVyXyA9PSBvdGhlci5lbmRfcmVtYWluZGVyXzsKLSAgfQotCi0gIGNvbnN0IEJ1ZmZlciYgZGVyZWZlcmVuY2UoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGZpcnN0XzsKLSAgfQotCi0gIGJvb2wgYXRfZW5kXzsKLSAgQnVmZmVyIGZpcnN0XzsKLSAgQnVmZmVyX0l0ZXJhdG9yIGJlZ2luX3JlbWFpbmRlcl87Ci0gIEJ1ZmZlcl9JdGVyYXRvciBlbmRfcmVtYWluZGVyXzsKLSAgc3RkOjpzaXplX3Qgb2Zmc2V0XzsKLSAgc3RkOjpzaXplX3QgbWF4X3NpemVfOwotfTsKLQotLy8gQSBwcm94eSBmb3IgYSBzdWItcmFuZ2UgaW4gYSBsaXN0IG9mIGJ1ZmZlcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQnVmZmVyLCB0eXBlbmFtZSBCdWZmZXJzPgotY2xhc3MgY29uc3VtaW5nX2J1ZmZlcnMKLXsKLXB1YmxpYzoKLSAgLy8gVGhlIHR5cGUgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgbGlzdCBvZiBidWZmZXJzLgotICB0eXBlZGVmIEJ1ZmZlciB2YWx1ZV90eXBlOwotCi0gIC8vIEEgZm9yd2FyZC1vbmx5IGl0ZXJhdG9yIHR5cGUgdGhhdCBtYXkgYmUgdXNlZCB0byByZWFkIGVsZW1lbnRzLgotICB0eXBlZGVmIGNvbnN1bWluZ19idWZmZXJzX2l0ZXJhdG9yPEJ1ZmZlciwgdHlwZW5hbWUgQnVmZmVyczo6Y29uc3RfaXRlcmF0b3I+Ci0gICAgY29uc3RfaXRlcmF0b3I7Ci0KLSAgLy8gQ29uc3RydWN0IHRvIHJlcHJlc2VudCB0aGUgZW50aXJlIGxpc3Qgb2YgYnVmZmVycy4KLSAgY29uc3VtaW5nX2J1ZmZlcnMoY29uc3QgQnVmZmVycyYgYnVmZmVycykKLSAgICA6IGJ1ZmZlcnNfKGJ1ZmZlcnMpLAotICAgICAgYXRfZW5kXyhidWZmZXJzXy5iZWdpbigpID09IGJ1ZmZlcnNfLmVuZCgpKSwKLSAgICAgIGJlZ2luX3JlbWFpbmRlcl8oYnVmZmVyc18uYmVnaW4oKSksCi0gICAgICBtYXhfc2l6ZV8oKHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgpKCkpCi0gIHsKLSAgICBpZiAoIWF0X2VuZF8pCi0gICAgewotICAgICAgZmlyc3RfID0gKmJ1ZmZlcnNfLmJlZ2luKCk7Ci0gICAgICArK2JlZ2luX3JlbWFpbmRlcl87Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KLSAgY29uc3VtaW5nX2J1ZmZlcnMoY29uc3QgY29uc3VtaW5nX2J1ZmZlcnMmIG90aGVyKQotICAgIDogYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgYXRfZW5kXyhvdGhlci5hdF9lbmRfKSwKLSAgICAgIGZpcnN0XyhvdGhlci5maXJzdF8pLAotICAgICAgYmVnaW5fcmVtYWluZGVyXyhidWZmZXJzXy5iZWdpbigpKSwKLSAgICAgIG1heF9zaXplXyhvdGhlci5tYXhfc2l6ZV8pCi0gIHsKLSAgICB0eXBlbmFtZSBCdWZmZXJzOjpjb25zdF9pdGVyYXRvciBmaXJzdCA9IG90aGVyLmJ1ZmZlcnNfLmJlZ2luKCk7Ci0gICAgdHlwZW5hbWUgQnVmZmVyczo6Y29uc3RfaXRlcmF0b3Igc2Vjb25kID0gb3RoZXIuYmVnaW5fcmVtYWluZGVyXzsKLSAgICBzdGQ6OmFkdmFuY2UoYmVnaW5fcmVtYWluZGVyXywgc3RkOjpkaXN0YW5jZShmaXJzdCwgc2Vjb25kKSk7Ci0gIH0KLQotICAvLyBBc3NpZ25tZW50IG9wZXJhdG9yLgotICBjb25zdW1pbmdfYnVmZmVycyYgb3BlcmF0b3I9KGNvbnN0IGNvbnN1bWluZ19idWZmZXJzJiBvdGhlcikKLSAgewotICAgIGJ1ZmZlcnNfID0gb3RoZXIuYnVmZmVyc187Ci0gICAgYXRfZW5kXyA9IG90aGVyLmF0X2VuZF87Ci0gICAgZmlyc3RfID0gb3RoZXIuZmlyc3RfOwotICAgIGJlZ2luX3JlbWFpbmRlcl8gPSBidWZmZXJzXy5iZWdpbigpOwotICAgIHR5cGVuYW1lIEJ1ZmZlcnM6OmNvbnN0X2l0ZXJhdG9yIGZpcnN0ID0gb3RoZXIuYnVmZmVyc18uYmVnaW4oKTsKLSAgICB0eXBlbmFtZSBCdWZmZXJzOjpjb25zdF9pdGVyYXRvciBzZWNvbmQgPSBvdGhlci5iZWdpbl9yZW1haW5kZXJfOwotICAgIHN0ZDo6YWR2YW5jZShiZWdpbl9yZW1haW5kZXJfLCBzdGQ6OmRpc3RhbmNlKGZpcnN0LCBzZWNvbmQpKTsKLSAgICBtYXhfc2l6ZV8gPSBvdGhlci5tYXhfc2l6ZV87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gR2V0IGEgZm9yd2FyZC1vbmx5IGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50LgotICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoYXRfZW5kXywgZmlyc3RfLAotICAgICAgICBiZWdpbl9yZW1haW5kZXJfLCBidWZmZXJzXy5lbmQoKSwgbWF4X3NpemVfKTsKLSAgfQotCi0gIC8vIEdldCBhIGZvcndhcmQtb25seSBpdGVyYXRvciBmb3Igb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudC4KLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QKLSAgewotICAgIHJldHVybiBjb25zdF9pdGVyYXRvcigpOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBtYXhpbXVtIHNpemUgZm9yIGEgc2luZ2xlIHRyYW5zZmVyLgotICB2b2lkIHByZXBhcmUoc3RkOjpzaXplX3QgbWF4X3NpemUpCi0gIHsKLSAgICBtYXhfc2l6ZV8gPSBtYXhfc2l6ZTsKLSAgfQotCi0gIC8vIENvbnN1bWUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgYnVmZmVycy4KLSAgdm9pZCBjb25zdW1lKHN0ZDo6c2l6ZV90IHNpemUpCi0gIHsKLSAgICAvLyBSZW1vdmUgYnVmZmVycyBmcm9tIHRoZSBzdGFydCB1bnRpbCB0aGUgc3BlY2lmaWVkIHNpemUgaXMgcmVhY2hlZC4KLSAgICB3aGlsZSAoc2l6ZSA+IDAgJiYgIWF0X2VuZF8pCi0gICAgewotICAgICAgaWYgKGJ1ZmZlcl9zaXplKGZpcnN0XykgPD0gc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgc2l6ZSAtPSBidWZmZXJfc2l6ZShmaXJzdF8pOwotICAgICAgICBpZiAoYmVnaW5fcmVtYWluZGVyXyA9PSBidWZmZXJzXy5lbmQoKSkKLSAgICAgICAgICBhdF9lbmRfID0gdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGZpcnN0XyA9ICpiZWdpbl9yZW1haW5kZXJfKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpcnN0XyA9IGZpcnN0XyArIHNpemU7Ci0gICAgICAgIHNpemUgPSAwOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJlbW92ZSBhbnkgbW9yZSBlbXB0eSBidWZmZXJzIGF0IHRoZSBzdGFydC4KLSAgICB3aGlsZSAoIWF0X2VuZF8gJiYgYnVmZmVyX3NpemUoZmlyc3RfKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChiZWdpbl9yZW1haW5kZXJfID09IGJ1ZmZlcnNfLmVuZCgpKQotICAgICAgICBhdF9lbmRfID0gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgZmlyc3RfID0gKmJlZ2luX3JlbWFpbmRlcl8rKzsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgQnVmZmVycyBidWZmZXJzXzsKLSAgYm9vbCBhdF9lbmRfOwotICBCdWZmZXIgZmlyc3RfOwotICB0eXBlbmFtZSBCdWZmZXJzOjpjb25zdF9pdGVyYXRvciBiZWdpbl9yZW1haW5kZXJfOwotICBzdGQ6OnNpemVfdCBtYXhfc2l6ZV87Ci19OwotCi0vLyBTcGVjaWFsaXNhdGlvbiBmb3IgbnVsbF9idWZmZXJzIHRvIGVuc3VyZSB0aGF0IHRoZSBudWxsX2J1ZmZlcnMgdHlwZSBpcwotLy8gYWx3YXlzIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSB1bmRlcmx5aW5nIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEJ1ZmZlcj4KLWNsYXNzIGNvbnN1bWluZ19idWZmZXJzPEJ1ZmZlciwgYXNpbzo6bnVsbF9idWZmZXJzPgotICA6IHB1YmxpYyBhc2lvOjpudWxsX2J1ZmZlcnMKLXsKLXB1YmxpYzoKLSAgY29uc3VtaW5nX2J1ZmZlcnMoY29uc3QgYXNpbzo6bnVsbF9idWZmZXJzJikKLSAgewotICAgIC8vIE5vLW9wLgotICB9Ci0KLSAgdm9pZCBwcmVwYXJlKHN0ZDo6c2l6ZV90KQotICB7Ci0gICAgLy8gTm8tb3AuCi0gIH0KLQotICB2b2lkIGNvbnN1bWUoc3RkOjpzaXplX3QpCi0gIHsKLSAgICAvLyBOby1vcC4KLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9DT05TVU1JTkdfQlVGRkVSU19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvY3N0ZGludC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2NzdGRpbnQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2VlODRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvY3N0ZGludC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLwotLy8gZGV0YWlsL2NzdGRpbnQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfQ1NURElOVF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfQ1NURElOVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfQ1NURElOVCkKLSMgaW5jbHVkZSA8Y3N0ZGludD4KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfQ1NURElOVCkKLSMgaW5jbHVkZSA8Ym9vc3QvY3N0ZGludC5ocHA+Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19DU1RESU5UKQotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0NTVERJTlQpCi11c2luZyBzdGQ6OmludDE2X3Q7Ci11c2luZyBzdGQ6OnVpbnQxNl90OwotdXNpbmcgc3RkOjppbnQzMl90OwotdXNpbmcgc3RkOjp1aW50MzJfdDsKLXVzaW5nIHN0ZDo6aW50NjRfdDsKLXVzaW5nIHN0ZDo6dWludDY0X3Q7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX0NTVERJTlQpCi11c2luZyBib29zdDo6aW50MTZfdDsKLXVzaW5nIGJvb3N0Ojp1aW50MTZfdDsKLXVzaW5nIGJvb3N0OjppbnQzMl90OwotdXNpbmcgYm9vc3Q6OnVpbnQzMl90OwotdXNpbmcgYm9vc3Q6OmludDY0X3Q7Ci11c2luZyBib29zdDo6dWludDY0X3Q7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19DU1RESU5UKQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9DU1RESU5UX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9kYXRlX3RpbWVfZndkLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZGF0ZV90aW1lX2Z3ZC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZTMzYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9kYXRlX3RpbWVfZndkLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvZGF0ZV90aW1lX2Z3ZC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9EQVRFX1RJTUVfRldEX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9EQVRFX1RJTUVfRldEX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi1uYW1lc3BhY2UgYm9vc3QgewotbmFtZXNwYWNlIGRhdGVfdGltZSB7Ci0KLXRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFRpbWVTeXN0ZW0+Ci1jbGFzcyBiYXNlX3RpbWU7Ci0KLX0gLy8gbmFtZXNwYWNlIGRhdGVfdGltZQotbmFtZXNwYWNlIHBvc2l4X3RpbWUgewotCi1jbGFzcyBwdGltZTsKLQotfSAvLyBuYW1lc3BhY2UgcG9zaXhfdGltZQotfSAvLyBuYW1lc3BhY2UgYm9vc3QKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0RBVEVfVElNRV9GV0RfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2RlYWRsaW5lX3RpbWVyX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9kZWFkbGluZV90aW1lcl9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxYzlhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2RlYWRsaW5lX3RpbWVyX3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvZGVhZGxpbmVfdGltZXJfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9ERUFETElORV9USU1FUl9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9ERUFETElORV9USU1FUl9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aW1lcl9xdWV1ZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGltZXJfc2NoZWR1bGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93YWl0X2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dhaXRfb3AuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSMgaW5jbHVkZSA8Y2hyb25vPgotIyBpbmNsdWRlIDx0aHJlYWQ+Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci1jbGFzcyBkZWFkbGluZV90aW1lcl9zZXJ2aWNlCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSB0aW1lIHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgVGltZV9UcmFpdHM6OnRpbWVfdHlwZSB0aW1lX3R5cGU7Ci0KLSAgLy8gVGhlIGR1cmF0aW9uIHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgVGltZV9UcmFpdHM6OmR1cmF0aW9uX3R5cGUgZHVyYXRpb25fdHlwZTsKLQotICAvLyBUaGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiB0aGUgdGltZXIuIFRoaXMgdHlwZSBpcyBkZXBlbmRlbnQgb24gdGhlCi0gIC8vIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRpbWVyIHNlcnZpY2UuCi0gIHN0cnVjdCBpbXBsZW1lbnRhdGlvbl90eXBlCi0gICAgOiBwcml2YXRlIGFzaW86OmRldGFpbDo6bm9uY29weWFibGUKLSAgewotICAgIHRpbWVfdHlwZSBleHBpcnk7Ci0gICAgYm9vbCBtaWdodF9oYXZlX3BlbmRpbmdfd2FpdHM7Ci0gICAgdHlwZW5hbWUgdGltZXJfcXVldWU8VGltZV9UcmFpdHM+OjpwZXJfdGltZXJfZGF0YSB0aW1lcl9kYXRhOwotICB9OwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBkZWFkbGluZV90aW1lcl9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBzY2hlZHVsZXJfKGFzaW86OnVzZV9zZXJ2aWNlPHRpbWVyX3NjaGVkdWxlcj4oaW9fc2VydmljZSkpCi0gIHsKLSAgICBzY2hlZHVsZXJfLmluaXRfdGFzaygpOwotICAgIHNjaGVkdWxlcl8uYWRkX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlXyk7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+ZGVhZGxpbmVfdGltZXJfc2VydmljZSgpCi0gIHsKLSAgICBzY2hlZHVsZXJfLnJlbW92ZV90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZV8pOwotICB9Ci0KLSAgLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCkKLSAgewotICB9Ci0KLSAgLy8gQ29uc3RydWN0IGEgbmV3IHRpbWVyIGltcGxlbWVudGF0aW9uLgotICB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgaW1wbC5leHBpcnkgPSB0aW1lX3R5cGUoKTsKLSAgICBpbXBsLm1pZ2h0X2hhdmVfcGVuZGluZ193YWl0cyA9IGZhbHNlOwotICB9Ci0KLSAgLy8gRGVzdHJveSBhIHRpbWVyIGltcGxlbWVudGF0aW9uLgotICB2b2lkIGRlc3Ryb3koaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgY2FuY2VsKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vIENhbmNlbCBhbnkgYXN5bmNocm9ub3VzIHdhaXQgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVyLgotICBzdGQ6OnNpemVfdCBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBpZiAoIWltcGwubWlnaHRfaGF2ZV9wZW5kaW5nX3dhaXRzKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoImRlYWRsaW5lX3RpbWVyIiwgJmltcGwsICJjYW5jZWwiKSk7Ci0KLSAgICBzdGQ6OnNpemVfdCBjb3VudCA9IHNjaGVkdWxlcl8uY2FuY2VsX3RpbWVyKHRpbWVyX3F1ZXVlXywgaW1wbC50aW1lcl9kYXRhKTsKLSAgICBpbXBsLm1pZ2h0X2hhdmVfcGVuZGluZ193YWl0cyA9IGZhbHNlOwotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiBjb3VudDsKLSAgfQotCi0gIC8vIENhbmNlbHMgb25lIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVyLgotICBzdGQ6OnNpemVfdCBjYW5jZWxfb25lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGlmICghaW1wbC5taWdodF9oYXZlX3BlbmRpbmdfd2FpdHMpCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBBU0lPX0hBTkRMRVJfT1BFUkFUSU9OKCgiZGVhZGxpbmVfdGltZXIiLCAmaW1wbCwgImNhbmNlbF9vbmUiKSk7Ci0KLSAgICBzdGQ6OnNpemVfdCBjb3VudCA9IHNjaGVkdWxlcl8uY2FuY2VsX3RpbWVyKAotICAgICAgICB0aW1lcl9xdWV1ZV8sIGltcGwudGltZXJfZGF0YSwgMSk7Ci0gICAgaWYgKGNvdW50ID09IDApCi0gICAgICBpbXBsLm1pZ2h0X2hhdmVfcGVuZGluZ193YWl0cyA9IGZhbHNlOwotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiBjb3VudDsKLSAgfQotCi0gIC8vIEdldCB0aGUgZXhwaXJ5IHRpbWUgZm9yIHRoZSB0aW1lciBhcyBhbiBhYnNvbHV0ZSB0aW1lLgotICB0aW1lX3R5cGUgZXhwaXJlc19hdChjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGltcGwuZXhwaXJ5OwotICB9Ci0KLSAgLy8gU2V0IHRoZSBleHBpcnkgdGltZSBmb3IgdGhlIHRpbWVyIGFzIGFuIGFic29sdXRlIHRpbWUuCi0gIHN0ZDo6c2l6ZV90IGV4cGlyZXNfYXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHRpbWVfdHlwZSYgZXhwaXJ5X3RpbWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgc3RkOjpzaXplX3QgY291bnQgPSBjYW5jZWwoaW1wbCwgZWMpOwotICAgIGltcGwuZXhwaXJ5ID0gZXhwaXJ5X3RpbWU7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIGNvdW50OwotICB9Ci0KLSAgLy8gR2V0IHRoZSBleHBpcnkgdGltZSBmb3IgdGhlIHRpbWVyIHJlbGF0aXZlIHRvIG5vdy4KLSAgZHVyYXRpb25fdHlwZSBleHBpcmVzX2Zyb21fbm93KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gVGltZV9UcmFpdHM6OnN1YnRyYWN0KGV4cGlyZXNfYXQoaW1wbCksIFRpbWVfVHJhaXRzOjpub3coKSk7Ci0gIH0KLQotICAvLyBTZXQgdGhlIGV4cGlyeSB0aW1lIGZvciB0aGUgdGltZXIgcmVsYXRpdmUgdG8gbm93LgotICBzdGQ6OnNpemVfdCBleHBpcmVzX2Zyb21fbm93KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBkdXJhdGlvbl90eXBlJiBleHBpcnlfdGltZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gZXhwaXJlc19hdChpbXBsLAotICAgICAgICBUaW1lX1RyYWl0czo6YWRkKFRpbWVfVHJhaXRzOjpub3coKSwgZXhwaXJ5X3RpbWUpLCBlYyk7Ci0gIH0KLQotICAvLyBQZXJmb3JtIGEgYmxvY2tpbmcgd2FpdCBvbiB0aGUgdGltZXIuCi0gIHZvaWQgd2FpdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHRpbWVfdHlwZSBub3cgPSBUaW1lX1RyYWl0czo6bm93KCk7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgd2hpbGUgKFRpbWVfVHJhaXRzOjpsZXNzX3RoYW4obm93LCBpbXBsLmV4cGlyeSkgJiYgIWVjKQotICAgIHsKLSAgICAgIHRoaXMtPmRvX3dhaXQoVGltZV9UcmFpdHM6OnRvX3Bvc2l4X2R1cmF0aW9uKAotICAgICAgICAgICAgVGltZV9UcmFpdHM6OnN1YnRyYWN0KGltcGwuZXhwaXJ5LCBub3cpKSwgZWMpOwotICAgICAgbm93ID0gVGltZV9UcmFpdHM6Om5vdygpOwotICAgIH0KLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3YWl0IG9uIHRoZSB0aW1lci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfd2FpdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHdhaXRfaGFuZGxlcjxIYW5kbGVyPiBvcDsKLSAgICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplb2Yob3ApLCBoYW5kbGVyKSwgMCB9OwotICAgIHAucCA9IG5ldyAocC52KSBvcChoYW5kbGVyKTsKLQotICAgIGltcGwubWlnaHRfaGF2ZV9wZW5kaW5nX3dhaXRzID0gdHJ1ZTsKLQotICAgIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAiZGVhZGxpbmVfdGltZXIiLCAmaW1wbCwgImFzeW5jX3dhaXQiKSk7Ci0KLSAgICBzY2hlZHVsZXJfLnNjaGVkdWxlX3RpbWVyKHRpbWVyX3F1ZXVlXywgaW1wbC5leHBpcnksIGltcGwudGltZXJfZGF0YSwgcC5wKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byB3YWl0IGdpdmVuIGEgZHVyYXRpb24gdHlwZS4gVGhlIGR1cmF0aW9uIHR5cGUgc2hvdWxkCi0gIC8vIGVpdGhlciBiZSBvZiB0eXBlIGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uLCBvciBpbXBsZW1lbnQgdGhlCi0gIC8vIHJlcXVpcmVkIHN1YnNldCBvZiBpdHMgaW50ZXJmYWNlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHVyYXRpb24+Ci0gIHZvaWQgZG9fd2FpdChjb25zdCBEdXJhdGlvbiYgdGltZW91dCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigKLSAgICAgICAgc3RkOjpjaHJvbm86OnNlY29uZHModGltZW91dC50b3RhbF9zZWNvbmRzKCkpCi0gICAgICAgICsgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyh0aW1lb3V0LnRvdGFsX21pY3Jvc2Vjb25kcygpKSk7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAgIDo6dGltZXZhbCB0djsKLSAgICB0di50dl9zZWMgPSB0aW1lb3V0LnRvdGFsX3NlY29uZHMoKTsKLSAgICB0di50dl91c2VjID0gdGltZW91dC50b3RhbF9taWNyb3NlY29uZHMoKSAlIDEwMDAwMDA7Ci0gICAgc29ja2V0X29wczo6c2VsZWN0KDAsIDAsIDAsIDAsICZ0diwgZWMpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gIH0KLQotICAvLyBUaGUgcXVldWUgb2YgdGltZXJzLgotICB0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4gdGltZXJfcXVldWVfOwotCi0gIC8vIFRoZSBvYmplY3QgdGhhdCBzY2hlZHVsZXMgYW5kIGV4ZWN1dGVzIHRpbWVycy4gVXN1YWxseSBhIHJlYWN0b3IuCi0gIHRpbWVyX3NjaGVkdWxlciYgc2NoZWR1bGVyXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfREVBRExJTkVfVElNRVJfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZGVwZW5kZW50X3R5cGUuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9kZXBlbmRlbnRfdHlwZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjQ4MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9kZXBlbmRlbnRfdHlwZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLwotLy8gZGV0YWlsL2RlcGVuZGVudF90eXBlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9ERVBFTkRFTlRfVFlQRV9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfREVQRU5ERU5UX1RZUEVfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIERlcGVuZHNPbiwgdHlwZW5hbWUgVD4KLXN0cnVjdCBkZXBlbmRlbnRfdHlwZQotewotICB0eXBlZGVmIFQgdHlwZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfREVQRU5ERU5UX1RZUEVfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2Rlc2NyaXB0b3Jfb3BzLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZGVzY3JpcHRvcl9vcHMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDI2MTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZGVzY3JpcHRvcl9vcHMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvZGVzY3JpcHRvcl9vcHMuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0RFU0NSSVBUT1JfT1BTX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9ERVNDUklQVE9SX09QU19IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XUykgXAotICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkgXAotICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2Vycm9yX2NvZGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLW5hbWVzcGFjZSBkZXNjcmlwdG9yX29wcyB7Ci0KLS8vIERlc2NyaXB0b3Igc3RhdGUgYml0cy4KLWVudW0KLXsKLSAgLy8gVGhlIHVzZXIgd2FudHMgYSBub24tYmxvY2tpbmcgZGVzY3JpcHRvci4KLSAgdXNlcl9zZXRfbm9uX2Jsb2NraW5nID0gMSwKLQotICAvLyBUaGUgZGVzY3JpcHRvciBoYXMgYmVlbiBzZXQgbm9uLWJsb2NraW5nLgotICBpbnRlcm5hbF9ub25fYmxvY2tpbmcgPSAyLAotCi0gIC8vIEhlbHBlciAic3RhdGUiIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlc2NyaXB0b3IgaXMgbm9uLWJsb2NraW5nLgotICBub25fYmxvY2tpbmcgPSB1c2VyX3NldF9ub25fYmxvY2tpbmcgfCBpbnRlcm5hbF9ub25fYmxvY2tpbmcsCi0KLSAgLy8gVGhlIGRlc2NyaXB0b3IgbWF5IGhhdmUgYmVlbiBkdXAoKS1lZC4KLSAgcG9zc2libGVfZHVwID0gNAotfTsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHN0YXRlX3R5cGU7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXR1cm5UeXBlPgotaW5saW5lIFJldHVyblR5cGUgZXJyb3Jfd3JhcHBlcihSZXR1cm5UeXBlIHJldHVybl92YWx1ZSwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGVycm5vLAotICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gIHJldHVybiByZXR1cm5fdmFsdWU7Ci19Ci0KLUFTSU9fREVDTCBpbnQgb3Blbihjb25zdCBjaGFyKiBwYXRoLCBpbnQgZmxhZ3MsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgaW50IGNsb3NlKGludCBkLCBzdGF0ZV90eXBlJiBzdGF0ZSwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBib29sIHNldF91c2VyX25vbl9ibG9ja2luZyhpbnQgZCwKLSAgICBzdGF0ZV90eXBlJiBzdGF0ZSwgYm9vbCB2YWx1ZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgYm9vbCBzZXRfaW50ZXJuYWxfbm9uX2Jsb2NraW5nKGludCBkLAotICAgIHN0YXRlX3R5cGUmIHN0YXRlLCBib29sIHZhbHVlLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLXR5cGVkZWYgaW92ZWMgYnVmOwotCi1BU0lPX0RFQ0wgc3RkOjpzaXplX3Qgc3luY19yZWFkKGludCBkLCBzdGF0ZV90eXBlIHN0YXRlLCBidWYqIGJ1ZnMsCi0gICAgc3RkOjpzaXplX3QgY291bnQsIGJvb2wgYWxsX2VtcHR5LCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBib29sIG5vbl9ibG9ja2luZ19yZWFkKGludCBkLCBidWYqIGJ1ZnMsIHN0ZDo6c2l6ZV90IGNvdW50LAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLCBzdGQ6OnNpemVfdCYgYnl0ZXNfdHJhbnNmZXJyZWQpOwotCi1BU0lPX0RFQ0wgc3RkOjpzaXplX3Qgc3luY193cml0ZShpbnQgZCwgc3RhdGVfdHlwZSBzdGF0ZSwKLSAgICBjb25zdCBidWYqIGJ1ZnMsIHN0ZDo6c2l6ZV90IGNvdW50LCBib29sIGFsbF9lbXB0eSwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBib29sIG5vbl9ibG9ja2luZ193cml0ZShpbnQgZCwKLSAgICBjb25zdCBidWYqIGJ1ZnMsIHN0ZDo6c2l6ZV90IGNvdW50LAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLCBzdGQ6OnNpemVfdCYgYnl0ZXNfdHJhbnNmZXJyZWQpOwotCi1BU0lPX0RFQ0wgaW50IGlvY3RsKGludCBkLCBzdGF0ZV90eXBlJiBzdGF0ZSwgbG9uZyBjbWQsCi0gICAgaW9jdGxfYXJnX3R5cGUqIGFyZywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgaW50IGZjbnRsKGludCBkLCBpbnQgY21kLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBpbnQgZmNudGwoaW50IGQsIGludCBjbWQsCi0gICAgbG9uZyBhcmcsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIGludCBwb2xsX3JlYWQoaW50IGQsCi0gICAgc3RhdGVfdHlwZSBzdGF0ZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgaW50IHBvbGxfd3JpdGUoaW50IGQsCi0gICAgc3RhdGVfdHlwZSBzdGF0ZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi19IC8vIG5hbWVzcGFjZSBkZXNjcmlwdG9yX29wcwotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvZGVzY3JpcHRvcl9vcHMuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAvLyAgICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAgICAgIC8vICAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0RFU0NSSVBUT1JfT1BTX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9kZXNjcmlwdG9yX3JlYWRfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9kZXNjcmlwdG9yX3JlYWRfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZkZjU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZGVzY3JpcHRvcl9yZWFkX29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLwotLy8gZGV0YWlsL2Rlc2NyaXB0b3JfcmVhZF9vcC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0RFU0NSSVBUT1JfUkVBRF9PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfREVTQ1JJUFRPUl9SRUFEX09QX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9kZXNjcmlwdG9yX29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdG9yX29wLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotY2xhc3MgZGVzY3JpcHRvcl9yZWFkX29wX2Jhc2UgOiBwdWJsaWMgcmVhY3Rvcl9vcAotewotcHVibGljOgotICBkZXNjcmlwdG9yX3JlYWRfb3BfYmFzZShpbnQgZGVzY3JpcHRvciwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgZnVuY190eXBlIGNvbXBsZXRlX2Z1bmMpCi0gICAgOiByZWFjdG9yX29wKCZkZXNjcmlwdG9yX3JlYWRfb3BfYmFzZTo6ZG9fcGVyZm9ybSwgY29tcGxldGVfZnVuYyksCi0gICAgICBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKLSAgICAgIGJ1ZmZlcnNfKGJ1ZmZlcnMpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyBib29sIGRvX3BlcmZvcm0ocmVhY3Rvcl9vcCogYmFzZSkKLSAgewotICAgIGRlc2NyaXB0b3JfcmVhZF9vcF9iYXNlKiBvKHN0YXRpY19jYXN0PGRlc2NyaXB0b3JfcmVhZF9vcF9iYXNlKj4oYmFzZSkpOwotCi0gICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6bXV0YWJsZV9idWZmZXIsCi0gICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4gYnVmcyhvLT5idWZmZXJzXyk7Ci0KLSAgICByZXR1cm4gZGVzY3JpcHRvcl9vcHM6Om5vbl9ibG9ja2luZ19yZWFkKG8tPmRlc2NyaXB0b3JfLAotICAgICAgICBidWZzLmJ1ZmZlcnMoKSwgYnVmcy5jb3VudCgpLCBvLT5lY18sIG8tPmJ5dGVzX3RyYW5zZmVycmVkXyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgaW50IGRlc2NyaXB0b3JfOwotICBNdXRhYmxlQnVmZmVyU2VxdWVuY2UgYnVmZmVyc187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotY2xhc3MgZGVzY3JpcHRvcl9yZWFkX29wCi0gIDogcHVibGljIGRlc2NyaXB0b3JfcmVhZF9vcF9iYXNlPE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIoZGVzY3JpcHRvcl9yZWFkX29wKTsKLQotICBkZXNjcmlwdG9yX3JlYWRfb3AoaW50IGRlc2NyaXB0b3IsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiBkZXNjcmlwdG9yX3JlYWRfb3BfYmFzZTxNdXRhYmxlQnVmZmVyU2VxdWVuY2U+KAotICAgICAgICBkZXNjcmlwdG9yLCBidWZmZXJzLCAmZGVzY3JpcHRvcl9yZWFkX29wOjpkb19jb21wbGV0ZSksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgLyplYyovLAotICAgICAgc3RkOjpzaXplX3QgLypieXRlc190cmFuc2ZlcnJlZCovKQotICB7Ci0gICAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIGhhbmRsZXIgb2JqZWN0LgotICAgIGRlc2NyaXB0b3JfcmVhZF9vcCogbyhzdGF0aWNfY2FzdDxkZXNjcmlwdG9yX3JlYWRfb3AqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKG8tPmhhbmRsZXJfKSwgbywgbyB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBkZXRhaWw6OmJpbmRlcjI8SGFuZGxlciwgYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3Q+Ci0gICAgICBoYW5kbGVyKG8tPmhhbmRsZXJfLCBvLT5lY18sIG8tPmJ5dGVzX3RyYW5zZmVycmVkXyk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sIGhhbmRsZXIuYXJnMl8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBIYW5kbGVyIGhhbmRsZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9ERVNDUklQVE9SX1JFQURfT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2Rlc2NyaXB0b3Jfd3JpdGVfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9kZXNjcmlwdG9yX3dyaXRlX29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1M2U1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2Rlc2NyaXB0b3Jfd3JpdGVfb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvZGVzY3JpcHRvcl93cml0ZV9vcC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9ERVNDUklQVE9SX1dSSVRFX09QX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9ERVNDUklQVE9SX1dSSVRFX09QX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9kZXNjcmlwdG9yX29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdG9yX29wLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLWNsYXNzIGRlc2NyaXB0b3Jfd3JpdGVfb3BfYmFzZSA6IHB1YmxpYyByZWFjdG9yX29wCi17Ci1wdWJsaWM6Ci0gIGRlc2NyaXB0b3Jfd3JpdGVfb3BfYmFzZShpbnQgZGVzY3JpcHRvciwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGZ1bmNfdHlwZSBjb21wbGV0ZV9mdW5jKQotICAgIDogcmVhY3Rvcl9vcCgmZGVzY3JpcHRvcl93cml0ZV9vcF9iYXNlOjpkb19wZXJmb3JtLCBjb21wbGV0ZV9mdW5jKSwKLSAgICAgIGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAotICAgICAgYnVmZmVyc18oYnVmZmVycykKLSAgewotICB9Ci0KLSAgc3RhdGljIGJvb2wgZG9fcGVyZm9ybShyZWFjdG9yX29wKiBiYXNlKQotICB7Ci0gICAgZGVzY3JpcHRvcl93cml0ZV9vcF9iYXNlKiBvKHN0YXRpY19jYXN0PGRlc2NyaXB0b3Jfd3JpdGVfb3BfYmFzZSo+KGJhc2UpKTsKLQotICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86OmNvbnN0X2J1ZmZlciwKLSAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZT4gYnVmcyhvLT5idWZmZXJzXyk7Ci0KLSAgICByZXR1cm4gZGVzY3JpcHRvcl9vcHM6Om5vbl9ibG9ja2luZ193cml0ZShvLT5kZXNjcmlwdG9yXywKLSAgICAgICAgYnVmcy5idWZmZXJzKCksIGJ1ZnMuY291bnQoKSwgby0+ZWNfLCBvLT5ieXRlc190cmFuc2ZlcnJlZF8pOwotICB9Ci0KLXByaXZhdGU6Ci0gIGludCBkZXNjcmlwdG9yXzsKLSAgQ29uc3RCdWZmZXJTZXF1ZW5jZSBidWZmZXJzXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotY2xhc3MgZGVzY3JpcHRvcl93cml0ZV9vcAotICA6IHB1YmxpYyBkZXNjcmlwdG9yX3dyaXRlX29wX2Jhc2U8Q29uc3RCdWZmZXJTZXF1ZW5jZT4KLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIoZGVzY3JpcHRvcl93cml0ZV9vcCk7Ci0KLSAgZGVzY3JpcHRvcl93cml0ZV9vcChpbnQgZGVzY3JpcHRvciwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiBkZXNjcmlwdG9yX3dyaXRlX29wX2Jhc2U8Q29uc3RCdWZmZXJTZXF1ZW5jZT4oCi0gICAgICAgIGRlc2NyaXB0b3IsIGJ1ZmZlcnMsICZkZXNjcmlwdG9yX3dyaXRlX29wOjpkb19jb21wbGV0ZSksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgLyplYyovLAotICAgICAgc3RkOjpzaXplX3QgLypieXRlc190cmFuc2ZlcnJlZCovKQotICB7Ci0gICAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIGhhbmRsZXIgb2JqZWN0LgotICAgIGRlc2NyaXB0b3Jfd3JpdGVfb3AqIG8oc3RhdGljX2Nhc3Q8ZGVzY3JpcHRvcl93cml0ZV9vcCo+KGJhc2UpKTsKLSAgICBwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2Yoby0+aGFuZGxlcl8pLCBvLCBvIH07Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ09NUExFVElPTigobykpOwotCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBkZWFsbG9jYXRlZCBiZWZvcmUKLSAgICAvLyB0aGUgdXBjYWxsIGlzIG1hZGUuIEV2ZW4gaWYgd2UncmUgbm90IGFib3V0IHRvIG1ha2UgYW4gdXBjYWxsLCBhCi0gICAgLy8gc3ViLW9iamVjdCBvZiB0aGUgaGFuZGxlciBtYXkgYmUgdGhlIHRydWUgb3duZXIgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkCi0gICAgLy8gd2l0aCB0aGUgaGFuZGxlci4gQ29uc2VxdWVudGx5LCBhIGxvY2FsIGNvcHkgb2YgdGhlIGhhbmRsZXIgaXMgcmVxdWlyZWQKLSAgICAvLyB0byBlbnN1cmUgdGhhdCBhbnkgb3duaW5nIHN1Yi1vYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlciB3ZSBoYXZlCi0gICAgLy8gZGVhbGxvY2F0ZWQgdGhlIG1lbW9yeSBoZXJlLgotICAgIGRldGFpbDo6YmluZGVyMjxIYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdD4KLSAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIG8tPmVjXywgby0+Ynl0ZXNfdHJhbnNmZXJyZWRfKTsKLSAgICBwLmggPSBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICBwLnJlc2V0KCk7Ci0KLSAgICAvLyBNYWtlIHRoZSB1cGNhbGwgaWYgcmVxdWlyZWQuCi0gICAgaWYgKG93bmVyKQotICAgIHsKLSAgICAgIGZlbmNlZF9ibG9jayBiKGZlbmNlZF9ibG9jazo6aGFsZik7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9CRUdJTigoaGFuZGxlci5hcmcxXywgaGFuZGxlci5hcmcyXykpOwotICAgICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoaGFuZGxlciwgaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9FTkQ7Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XUykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0RFU0NSSVBUT1JfV1JJVEVfT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2Rldl9wb2xsX3JlYWN0b3IuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9kZXZfcG9sbF9yZWFjdG9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxYTYxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2Rldl9wb2xsX3JlYWN0b3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvZGV2X3BvbGxfcmVhY3Rvci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9ERVZfUE9MTF9SRUFDVE9SX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9ERVZfUE9MTF9SRUFDVE9SX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19ERVZfUE9MTCkKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN5cy9kZXZwb2xsLmg+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFzaF9tYXAuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2xpbWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbXV0ZXguaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL29wX3F1ZXVlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdG9yX29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdG9yX29wX3F1ZXVlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zZWxlY3RfaW50ZXJydXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGltZXJfcXVldWVfYmFzZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGltZXJfcXVldWVfc2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93YWl0X29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIGRldl9wb2xsX3JlYWN0b3IKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8ZGV2X3BvbGxfcmVhY3Rvcj4KLXsKLXB1YmxpYzoKLSAgZW51bSBvcF90eXBlcyB7IHJlYWRfb3AgPSAwLCB3cml0ZV9vcCA9IDEsCi0gICAgY29ubmVjdF9vcCA9IDEsIGV4Y2VwdF9vcCA9IDIsIG1heF9vcHMgPSAzIH07Ci0KLSAgLy8gUGVyLWRlc2NyaXB0b3IgZGF0YS4KLSAgc3RydWN0IHBlcl9kZXNjcmlwdG9yX2RhdGEKLSAgewotICB9OwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgZGV2X3BvbGxfcmVhY3Rvcihhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKTsKLQotICAvLyBEZXN0cnVjdG9yLgotICBBU0lPX0RFQ0wgfmRldl9wb2xsX3JlYWN0b3IoKTsKLQotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICBBU0lPX0RFQ0wgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCk7Ci0KLSAgLy8gUmVjcmVhdGUgaW50ZXJuYWwgZGVzY3JpcHRvcnMgZm9sbG93aW5nIGEgZm9yay4KLSAgQVNJT19ERUNMIHZvaWQgZm9ya19zZXJ2aWNlKAotICAgICAgYXNpbzo6aW9fc2VydmljZTo6Zm9ya19ldmVudCBmb3JrX2V2KTsKLQotICAvLyBJbml0aWFsaXNlIHRoZSB0YXNrLgotICBBU0lPX0RFQ0wgdm9pZCBpbml0X3Rhc2soKTsKLQotICAvLyBSZWdpc3RlciBhIHNvY2tldCB3aXRoIHRoZSByZWFjdG9yLiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgc3lzdGVtIGVycm9yCi0gIC8vIGNvZGUgb24gZmFpbHVyZS4KLSAgQVNJT19ERUNMIGludCByZWdpc3Rlcl9kZXNjcmlwdG9yKHNvY2tldF90eXBlLCBwZXJfZGVzY3JpcHRvcl9kYXRhJik7Ci0KLSAgLy8gUmVnaXN0ZXIgYSBkZXNjcmlwdG9yIHdpdGggYW4gYXNzb2NpYXRlZCBzaW5nbGUgb3BlcmF0aW9uLiBSZXR1cm5zIDAgb24KLSAgLy8gc3VjY2Vzcywgc3lzdGVtIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAgQVNJT19ERUNMIGludCByZWdpc3Rlcl9pbnRlcm5hbF9kZXNjcmlwdG9yKAotICAgICAgaW50IG9wX3R5cGUsIHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiBkZXNjcmlwdG9yX2RhdGEsIHJlYWN0b3Jfb3AqIG9wKTsKLQotICAvLyBNb3ZlIGRlc2NyaXB0b3IgcmVnaXN0cmF0aW9uIGZyb20gb25lIGRlc2NyaXB0b3JfZGF0YSBvYmplY3QgdG8gYW5vdGhlci4KLSAgQVNJT19ERUNMIHZvaWQgbW92ZV9kZXNjcmlwdG9yKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiB0YXJnZXRfZGVzY3JpcHRvcl9kYXRhLAotICAgICAgcGVyX2Rlc2NyaXB0b3JfZGF0YSYgc291cmNlX2Rlc2NyaXB0b3JfZGF0YSk7Ci0KLSAgLy8gUG9zdCBhIHJlYWN0b3Igb3BlcmF0aW9uIGZvciBpbW1lZGlhdGUgY29tcGxldGlvbi4KLSAgdm9pZCBwb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKHJlYWN0b3Jfb3AqIG9wLCBib29sIGlzX2NvbnRpbnVhdGlvbikKLSAgewotICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gIH0KLQotICAvLyBTdGFydCBhIG5ldyBvcGVyYXRpb24uIFRoZSByZWFjdG9yIG9wZXJhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCB3aGVuIHRoZQotICAvLyBnaXZlbiBkZXNjcmlwdG9yIGlzIGZsYWdnZWQgYXMgcmVhZHksIG9yIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfb3AoaW50IG9wX3R5cGUsIHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiwgcmVhY3Rvcl9vcCogb3AsCi0gICAgICBib29sIGlzX2NvbnRpbnVhdGlvbiwgYm9vbCBhbGxvd19zcGVjdWxhdGl2ZSk7Ci0KLSAgLy8gQ2FuY2VsIGFsbCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4gVGhlCi0gIC8vIGhhbmRsZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvciB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUKLSAgLy8gb3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gIEFTSU9fREVDTCB2b2lkIGNhbmNlbF9vcHMoc29ja2V0X3R5cGUgZGVzY3JpcHRvciwgcGVyX2Rlc2NyaXB0b3JfZGF0YSYpOwotCi0gIC8vIENhbmNlbCBhbnkgb3BlcmF0aW9ucyB0aGF0IGFyZSBydW5uaW5nIGFnYWluc3QgdGhlIGRlc2NyaXB0b3IgYW5kIHJlbW92ZQotICAvLyBpdHMgcmVnaXN0cmF0aW9uIGZyb20gdGhlIHJlYWN0b3IuCi0gIEFTSU9fREVDTCB2b2lkIGRlcmVnaXN0ZXJfZGVzY3JpcHRvcihzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgICAgcGVyX2Rlc2NyaXB0b3JfZGF0YSYsIGJvb2wgY2xvc2luZyk7Ci0KLSAgLy8gQ2FuY2VsIGFueSBvcGVyYXRpb25zIHRoYXQgYXJlIHJ1bm5pbmcgYWdhaW5zdCB0aGUgZGVzY3JpcHRvciBhbmQgcmVtb3ZlCi0gIC8vIGl0cyByZWdpc3RyYXRpb24gZnJvbSB0aGUgcmVhY3Rvci4KLSAgQVNJT19ERUNMIHZvaWQgZGVyZWdpc3Rlcl9pbnRlcm5hbF9kZXNjcmlwdG9yKAotICAgICAgc29ja2V0X3R5cGUgZGVzY3JpcHRvciwgcGVyX2Rlc2NyaXB0b3JfZGF0YSYpOwotCi0gIC8vIEFkZCBhIG5ldyB0aW1lciBxdWV1ZSB0byB0aGUgcmVhY3Rvci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotICB2b2lkIGFkZF90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlKTsKLQotICAvLyBSZW1vdmUgYSB0aW1lciBxdWV1ZSBmcm9tIHRoZSByZWFjdG9yLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci0gIHZvaWQgcmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUpOwotCi0gIC8vIFNjaGVkdWxlIGEgbmV3IG9wZXJhdGlvbiBpbiB0aGUgZ2l2ZW4gdGltZXIgcXVldWUgdG8gZXhwaXJlIGF0IHRoZQotICAvLyBzcGVjaWZpZWQgYWJzb2x1dGUgdGltZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotICB2b2lkIHNjaGVkdWxlX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgICBjb25zdCB0eXBlbmFtZSBUaW1lX1RyYWl0czo6dGltZV90eXBlJiB0aW1lLAotICAgICAgdHlwZW5hbWUgdGltZXJfcXVldWU8VGltZV9UcmFpdHM+OjpwZXJfdGltZXJfZGF0YSYgdGltZXIsIHdhaXRfb3AqIG9wKTsKLQotICAvLyBDYW5jZWwgdGhlIHRpbWVyIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0b2tlbi4gUmV0dXJucyB0aGUKLSAgLy8gbnVtYmVyIG9mIG9wZXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gcG9zdGVkIG9yIGRpc3BhdGNoZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLSAgc3RkOjpzaXplX3QgY2FuY2VsX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgICB0eXBlbmFtZSB0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz46OnBlcl90aW1lcl9kYXRhJiB0aW1lciwKLSAgICAgIHN0ZDo6c2l6ZV90IG1heF9jYW5jZWxsZWQgPSAoc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnNpemVfdD46Om1heCkoKSk7Ci0KLSAgLy8gUnVuIC9kZXYvcG9sbCBvbmNlIHVudGlsIGludGVycnVwdGVkIG9yIGV2ZW50cyBhcmUgcmVhZHkgdG8gYmUgZGlzcGF0Y2hlZC4KLSAgQVNJT19ERUNMIHZvaWQgcnVuKGJvb2wgYmxvY2ssIG9wX3F1ZXVlPG9wZXJhdGlvbj4mIG9wcyk7Ci0KLSAgLy8gSW50ZXJydXB0IHRoZSBzZWxlY3QgbG9vcC4KLSAgQVNJT19ERUNMIHZvaWQgaW50ZXJydXB0KCk7Ci0KLXByaXZhdGU6Ci0gIC8vIENyZWF0ZSB0aGUgL2Rldi9wb2xsIGZpbGUgZGVzY3JpcHRvci4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZGVzY3JpcHRvcgotICAvLyBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgQVNJT19ERUNMIHN0YXRpYyBpbnQgZG9fZGV2X3BvbGxfY3JlYXRlKCk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGFkZCBhIG5ldyB0aW1lciBxdWV1ZS4KLSAgQVNJT19ERUNMIHZvaWQgZG9fYWRkX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlX2Jhc2UmIHF1ZXVlKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGEgdGltZXIgcXVldWUuCi0gIEFTSU9fREVDTCB2b2lkIGRvX3JlbW92ZV90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZV9iYXNlJiBxdWV1ZSk7Ci0KLSAgLy8gR2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciB0aGUgL2Rldi9wb2xsIERQX1BPTEwgb3BlcmF0aW9uLiBUaGUgdGltZW91dAotICAvLyB2YWx1ZSBpcyByZXR1cm5lZCBhcyBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMuIEEgcmV0dXJuIHZhbHVlIG9mIC0xCi0gIC8vIGluZGljYXRlcyB0aGF0IHRoZSBwb2xsIHNob3VsZCBibG9jayBpbmRlZmluaXRlbHkuCi0gIEFTSU9fREVDTCBpbnQgZ2V0X3RpbWVvdXQoKTsKLQotICAvLyBDYW5jZWwgYWxsIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdG9yLiBUaGUgZG9fY2FuY2VsCi0gIC8vIGZ1bmN0aW9uIG9mIHRoZSBoYW5kbGVyIG9iamVjdHMgd2lsbCBiZSBpbnZva2VkLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90Ci0gIC8vIGFjcXVpcmUgdGhlIGRldl9wb2xsX3JlYWN0b3IncyBtdXRleC4KLSAgQVNJT19ERUNMIHZvaWQgY2FuY2VsX29wc191bmxvY2tlZChzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIEFkZCBhIHBlbmRpbmcgZXZlbnQgZW50cnkgZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yLgotICBBU0lPX0RFQ0wgOjpwb2xsZmQmIGFkZF9wZW5kaW5nX2V2ZW50X2NoYW5nZShpbnQgZGVzY3JpcHRvcik7Ci0KLSAgLy8gVGhlIGlvX3NlcnZpY2UgaW1wbGVtZW50YXRpb24gdXNlZCB0byBwb3N0IGNvbXBsZXRpb25zLgotICBpb19zZXJ2aWNlX2ltcGwmIGlvX3NlcnZpY2VfOwotCi0gIC8vIE11dGV4IHRvIHByb3RlY3QgYWNjZXNzIHRvIGludGVybmFsIGRhdGEuCi0gIGFzaW86OmRldGFpbDo6bXV0ZXggbXV0ZXhfOwotCi0gIC8vIFRoZSAvZGV2L3BvbGwgZmlsZSBkZXNjcmlwdG9yLgotICBpbnQgZGV2X3BvbGxfZmRfOwotCi0gIC8vIFZlY3RvciBvZiAvZGV2L3BvbGwgZXZlbnRzIHdhaXRpbmcgdG8gYmUgd3JpdHRlbiB0byB0aGUgZGVzY3JpcHRvci4KLSAgc3RkOjp2ZWN0b3I8IDo6cG9sbGZkPiBwZW5kaW5nX2V2ZW50X2NoYW5nZXNfOwotCi0gIC8vIEhhc2ggbWFwIHRvIGFzc29jaWF0ZSBhIGRlc2NyaXB0b3Igd2l0aCBhIHBlbmRpbmcgZXZlbnQgY2hhbmdlIGluZGV4LgotICBoYXNoX21hcDxpbnQsIHN0ZDo6c2l6ZV90PiBwZW5kaW5nX2V2ZW50X2NoYW5nZV9pbmRleF87Ci0KLSAgLy8gVGhlIGludGVycnVwdGVyIGlzIHVzZWQgdG8gYnJlYWsgYSBibG9ja2luZyBEUF9QT0xMIG9wZXJhdGlvbi4KLSAgc2VsZWN0X2ludGVycnVwdGVyIGludGVycnVwdGVyXzsKLQotICAvLyBUaGUgcXVldWVzIG9mIHJlYWQsIHdyaXRlIGFuZCBleGNlcHQgb3BlcmF0aW9ucy4KLSAgcmVhY3Rvcl9vcF9xdWV1ZTxzb2NrZXRfdHlwZT4gb3BfcXVldWVfW21heF9vcHNdOwotCi0gIC8vIFRoZSB0aW1lciBxdWV1ZXMuCi0gIHRpbWVyX3F1ZXVlX3NldCB0aW1lcl9xdWV1ZXNfOwotCi0gIC8vIFdoZXRoZXIgdGhlIHNlcnZpY2UgaGFzIGJlZW4gc2h1dCBkb3duLgotICBib29sIHNodXRkb3duXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9kZXZfcG9sbF9yZWFjdG9yLmhwcCIKLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvZGV2X3BvbGxfcmVhY3Rvci5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19ERVZfUE9MTCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0RFVl9QT0xMX1JFQUNUT1JfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2Vwb2xsX3JlYWN0b3IuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9lcG9sbF9yZWFjdG9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxNDY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2Vwb2xsX3JlYWN0b3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvZXBvbGxfcmVhY3Rvci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9FUE9MTF9SRUFDVE9SX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9FUE9MTF9SRUFDVE9SX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19FUE9MTCkKLQotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYXRvbWljX2NvdW50LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9saW1pdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL211dGV4LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vYmplY3RfcG9vbC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BfcXVldWUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3Jfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9iYXNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9zZXQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dhaXRfb3AuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIGVwb2xsX3JlYWN0b3IKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8ZXBvbGxfcmVhY3Rvcj4KLXsKLXB1YmxpYzoKLSAgZW51bSBvcF90eXBlcyB7IHJlYWRfb3AgPSAwLCB3cml0ZV9vcCA9IDEsCi0gICAgY29ubmVjdF9vcCA9IDEsIGV4Y2VwdF9vcCA9IDIsIG1heF9vcHMgPSAzIH07Ci0KLSAgLy8gUGVyLWRlc2NyaXB0b3IgcXVldWVzLgotICBjbGFzcyBkZXNjcmlwdG9yX3N0YXRlIDogb3BlcmF0aW9uCi0gIHsKLSAgICBmcmllbmQgY2xhc3MgZXBvbGxfcmVhY3RvcjsKLSAgICBmcmllbmQgY2xhc3Mgb2JqZWN0X3Bvb2xfYWNjZXNzOwotCi0gICAgZGVzY3JpcHRvcl9zdGF0ZSogbmV4dF87Ci0gICAgZGVzY3JpcHRvcl9zdGF0ZSogcHJldl87Ci0KLSAgICBtdXRleCBtdXRleF87Ci0gICAgZXBvbGxfcmVhY3RvciogcmVhY3Rvcl87Ci0gICAgaW50IGRlc2NyaXB0b3JfOwotICAgIHVpbnQzMl90IHJlZ2lzdGVyZWRfZXZlbnRzXzsKLSAgICBvcF9xdWV1ZTxyZWFjdG9yX29wPiBvcF9xdWV1ZV9bbWF4X29wc107Ci0gICAgYm9vbCBzaHV0ZG93bl87Ci0KLSAgICBBU0lPX0RFQ0wgZGVzY3JpcHRvcl9zdGF0ZSgpOwotICAgIHZvaWQgc2V0X3JlYWR5X2V2ZW50cyh1aW50MzJfdCBldmVudHMpIHsgdGFza19yZXN1bHRfID0gZXZlbnRzOyB9Ci0gICAgQVNJT19ERUNMIG9wZXJhdGlvbiogcGVyZm9ybV9pbyh1aW50MzJfdCBldmVudHMpOwotICAgIEFTSU9fREVDTCBzdGF0aWMgdm9pZCBkb19jb21wbGV0ZSgKLSAgICAgICAgaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICB9OwotCi0gIC8vIFBlci1kZXNjcmlwdG9yIGRhdGEuCi0gIHR5cGVkZWYgZGVzY3JpcHRvcl9zdGF0ZSogcGVyX2Rlc2NyaXB0b3JfZGF0YTsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIGVwb2xsX3JlYWN0b3IoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIH5lcG9sbF9yZWFjdG9yKCk7Ci0KLSAgLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgQVNJT19ERUNMIHZvaWQgc2h1dGRvd25fc2VydmljZSgpOwotCi0gIC8vIFJlY3JlYXRlIGludGVybmFsIGRlc2NyaXB0b3JzIGZvbGxvd2luZyBhIGZvcmsuCi0gIEFTSU9fREVDTCB2b2lkIGZvcmtfc2VydmljZSgKLSAgICAgIGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfZXZlbnQgZm9ya19ldik7Ci0KLSAgLy8gSW5pdGlhbGlzZSB0aGUgdGFzay4KLSAgQVNJT19ERUNMIHZvaWQgaW5pdF90YXNrKCk7Ci0KLSAgLy8gUmVnaXN0ZXIgYSBzb2NrZXQgd2l0aCB0aGUgcmVhY3Rvci4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIHN5c3RlbSBlcnJvcgotICAvLyBjb2RlIG9uIGZhaWx1cmUuCi0gIEFTSU9fREVDTCBpbnQgcmVnaXN0ZXJfZGVzY3JpcHRvcihzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgICAgcGVyX2Rlc2NyaXB0b3JfZGF0YSYgZGVzY3JpcHRvcl9kYXRhKTsKLQotICAvLyBSZWdpc3RlciBhIGRlc2NyaXB0b3Igd2l0aCBhbiBhc3NvY2lhdGVkIHNpbmdsZSBvcGVyYXRpb24uIFJldHVybnMgMCBvbgotICAvLyBzdWNjZXNzLCBzeXN0ZW0gZXJyb3IgY29kZSBvbiBmYWlsdXJlLgotICBBU0lPX0RFQ0wgaW50IHJlZ2lzdGVyX2ludGVybmFsX2Rlc2NyaXB0b3IoCi0gICAgICBpbnQgb3BfdHlwZSwgc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICAgIHBlcl9kZXNjcmlwdG9yX2RhdGEmIGRlc2NyaXB0b3JfZGF0YSwgcmVhY3Rvcl9vcCogb3ApOwotCi0gIC8vIE1vdmUgZGVzY3JpcHRvciByZWdpc3RyYXRpb24gZnJvbSBvbmUgZGVzY3JpcHRvcl9kYXRhIG9iamVjdCB0byBhbm90aGVyLgotICBBU0lPX0RFQ0wgdm9pZCBtb3ZlX2Rlc2NyaXB0b3Ioc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICAgIHBlcl9kZXNjcmlwdG9yX2RhdGEmIHRhcmdldF9kZXNjcmlwdG9yX2RhdGEsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiBzb3VyY2VfZGVzY3JpcHRvcl9kYXRhKTsKLQotICAvLyBQb3N0IGEgcmVhY3RvciBvcGVyYXRpb24gZm9yIGltbWVkaWF0ZSBjb21wbGV0aW9uLgotICB2b2lkIHBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ocmVhY3Rvcl9vcCogb3AsIGJvb2wgaXNfY29udGludWF0aW9uKQotICB7Ci0gICAgaW9fc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgaXNfY29udGludWF0aW9uKTsKLSAgfQotCi0gIC8vIFN0YXJ0IGEgbmV3IG9wZXJhdGlvbi4gVGhlIHJlYWN0b3Igb3BlcmF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIHdoZW4gdGhlCi0gIC8vIGdpdmVuIGRlc2NyaXB0b3IgaXMgZmxhZ2dlZCBhcyByZWFkeSwgb3IgYW4gZXJyb3IgaGFzIG9jY3VycmVkLgotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF9vcChpbnQgb3BfdHlwZSwgc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICAgIHBlcl9kZXNjcmlwdG9yX2RhdGEmIGRlc2NyaXB0b3JfZGF0YSwgcmVhY3Rvcl9vcCogb3AsCi0gICAgICBib29sIGlzX2NvbnRpbnVhdGlvbiwgYm9vbCBhbGxvd19zcGVjdWxhdGl2ZSk7Ci0KLSAgLy8gQ2FuY2VsIGFsbCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4gVGhlCi0gIC8vIGhhbmRsZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvciB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUKLSAgLy8gb3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gIEFTSU9fREVDTCB2b2lkIGNhbmNlbF9vcHMoc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICAgIHBlcl9kZXNjcmlwdG9yX2RhdGEmIGRlc2NyaXB0b3JfZGF0YSk7Ci0KLSAgLy8gQ2FuY2VsIGFueSBvcGVyYXRpb25zIHRoYXQgYXJlIHJ1bm5pbmcgYWdhaW5zdCB0aGUgZGVzY3JpcHRvciBhbmQgcmVtb3ZlCi0gIC8vIGl0cyByZWdpc3RyYXRpb24gZnJvbSB0aGUgcmVhY3Rvci4KLSAgQVNJT19ERUNMIHZvaWQgZGVyZWdpc3Rlcl9kZXNjcmlwdG9yKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiBkZXNjcmlwdG9yX2RhdGEsIGJvb2wgY2xvc2luZyk7Ci0KLSAgLy8gUmVtb3RlIHRoZSBkZXNjcmlwdG9yJ3MgcmVnaXN0cmF0aW9uIGZyb20gdGhlIHJlYWN0b3IuCi0gIEFTSU9fREVDTCB2b2lkIGRlcmVnaXN0ZXJfaW50ZXJuYWxfZGVzY3JpcHRvcigKLSAgICAgIHNvY2tldF90eXBlIGRlc2NyaXB0b3IsIHBlcl9kZXNjcmlwdG9yX2RhdGEmIGRlc2NyaXB0b3JfZGF0YSk7Ci0KLSAgLy8gQWRkIGEgbmV3IHRpbWVyIHF1ZXVlIHRvIHRoZSByZWFjdG9yLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci0gIHZvaWQgYWRkX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgdGltZXJfcXVldWUpOwotCi0gIC8vIFJlbW92ZSBhIHRpbWVyIHF1ZXVlIGZyb20gdGhlIHJlYWN0b3IuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLSAgdm9pZCByZW1vdmVfdGltZXJfcXVldWUodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiB0aW1lcl9xdWV1ZSk7Ci0KLSAgLy8gU2NoZWR1bGUgYSBuZXcgb3BlcmF0aW9uIGluIHRoZSBnaXZlbiB0aW1lciBxdWV1ZSB0byBleHBpcmUgYXQgdGhlCi0gIC8vIHNwZWNpZmllZCBhYnNvbHV0ZSB0aW1lLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci0gIHZvaWQgc2NoZWR1bGVfdGltZXIodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFRpbWVfVHJhaXRzOjp0aW1lX3R5cGUmIHRpbWUsCi0gICAgICB0eXBlbmFtZSB0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz46OnBlcl90aW1lcl9kYXRhJiB0aW1lciwgd2FpdF9vcCogb3ApOwotCi0gIC8vIENhbmNlbCB0aGUgdGltZXIgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRva2VuLiBSZXR1cm5zIHRoZQotICAvLyBudW1iZXIgb2Ygb3BlcmF0aW9ucyB0aGF0IGhhdmUgYmVlbiBwb3N0ZWQgb3IgZGlzcGF0Y2hlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotICBzdGQ6OnNpemVfdCBjYW5jZWxfdGltZXIodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSwKLSAgICAgIHR5cGVuYW1lIHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPjo6cGVyX3RpbWVyX2RhdGEmIHRpbWVyLAotICAgICAgc3RkOjpzaXplX3QgbWF4X2NhbmNlbGxlZCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHN0ZDo6c2l6ZV90Pjo6bWF4KSgpKTsKLQotICAvLyBSdW4gZXBvbGwgb25jZSB1bnRpbCBpbnRlcnJ1cHRlZCBvciBldmVudHMgYXJlIHJlYWR5IHRvIGJlIGRpc3BhdGNoZWQuCi0gIEFTSU9fREVDTCB2b2lkIHJ1bihib29sIGJsb2NrLCBvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpOwotCi0gIC8vIEludGVycnVwdCB0aGUgc2VsZWN0IGxvb3AuCi0gIEFTSU9fREVDTCB2b2lkIGludGVycnVwdCgpOwotCi1wcml2YXRlOgotICAvLyBUaGUgaGludCB0byBwYXNzIHRvIGVwb2xsX2NyZWF0ZSB0byBzaXplIGl0cyBkYXRhIHN0cnVjdHVyZXMuCi0gIGVudW0geyBlcG9sbF9zaXplID0gMjAwMDAgfTsKLQotICAvLyBDcmVhdGUgdGhlIGVwb2xsIGZpbGUgZGVzY3JpcHRvci4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZGVzY3JpcHRvcgotICAvLyBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgQVNJT19ERUNMIHN0YXRpYyBpbnQgZG9fZXBvbGxfY3JlYXRlKCk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSB0aW1lcmZkIGZpbGUgZGVzY3JpcHRvci4gRG9lcyBub3QgdGhyb3cuCi0gIEFTSU9fREVDTCBzdGF0aWMgaW50IGRvX3RpbWVyZmRfY3JlYXRlKCk7Ci0KLSAgLy8gQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciBzdGF0ZSBvYmplY3QuCi0gIEFTSU9fREVDTCBkZXNjcmlwdG9yX3N0YXRlKiBhbGxvY2F0ZV9kZXNjcmlwdG9yX3N0YXRlKCk7Ci0KLSAgLy8gRnJlZSBhbiBleGlzdGluZyBkZXNjcmlwdG9yIHN0YXRlIG9iamVjdC4KLSAgQVNJT19ERUNMIHZvaWQgZnJlZV9kZXNjcmlwdG9yX3N0YXRlKGRlc2NyaXB0b3Jfc3RhdGUqIHMpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBhZGQgYSBuZXcgdGltZXIgcXVldWUuCi0gIEFTSU9fREVDTCB2b2lkIGRvX2FkZF90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZV9iYXNlJiBxdWV1ZSk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVyIHF1ZXVlLgotICBBU0lPX0RFQ0wgdm9pZCBkb19yZW1vdmVfdGltZXJfcXVldWUodGltZXJfcXVldWVfYmFzZSYgcXVldWUpOwotCi0gIC8vIENhbGxlZCB0byByZWNhbGN1bGF0ZSBhbmQgdXBkYXRlIHRoZSB0aW1lb3V0LgotICBBU0lPX0RFQ0wgdm9pZCB1cGRhdGVfdGltZW91dCgpOwotCi0gIC8vIEdldCB0aGUgdGltZW91dCB2YWx1ZSBmb3IgdGhlIGVwb2xsX3dhaXQgY2FsbC4gVGhlIHRpbWVvdXQgdmFsdWUgaXMKLSAgLy8gcmV0dXJuZWQgYXMgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBBIHJldHVybiB2YWx1ZSBvZiAtMSBpbmRpY2F0ZXMKLSAgLy8gdGhhdCBlcG9sbF93YWl0IHNob3VsZCBibG9jayBpbmRlZmluaXRlbHkuCi0gIEFTSU9fREVDTCBpbnQgZ2V0X3RpbWVvdXQoKTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLSAgLy8gR2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciB0aGUgdGltZXIgZGVzY3JpcHRvci4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUKLSAgLy8gZmxhZyBhcmd1bWVudCB0byBiZSB1c2VkIHdoZW4gY2FsbGluZyB0aW1lcmZkX3NldHRpbWUuCi0gIEFTSU9fREVDTCBpbnQgZ2V0X3RpbWVvdXQoaXRpbWVyc3BlYyYgdHMpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLQotICAvLyBUaGUgaW9fc2VydmljZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHBvc3QgY29tcGxldGlvbnMuCi0gIGlvX3NlcnZpY2VfaW1wbCYgaW9fc2VydmljZV87Ci0KLSAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhY2Nlc3MgdG8gaW50ZXJuYWwgZGF0YS4KLSAgbXV0ZXggbXV0ZXhfOwotCi0gIC8vIFRoZSBpbnRlcnJ1cHRlciBpcyB1c2VkIHRvIGJyZWFrIGEgYmxvY2tpbmcgZXBvbGxfd2FpdCBjYWxsLgotICBzZWxlY3RfaW50ZXJydXB0ZXIgaW50ZXJydXB0ZXJfOwotCi0gIC8vIFRoZSBlcG9sbCBmaWxlIGRlc2NyaXB0b3IuCi0gIGludCBlcG9sbF9mZF87Ci0KLSAgLy8gVGhlIHRpbWVyIGZpbGUgZGVzY3JpcHRvci4KLSAgaW50IHRpbWVyX2ZkXzsKLQotICAvLyBUaGUgdGltZXIgcXVldWVzLgotICB0aW1lcl9xdWV1ZV9zZXQgdGltZXJfcXVldWVzXzsKLQotICAvLyBXaGV0aGVyIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIHNodXQgZG93bi4KLSAgYm9vbCBzaHV0ZG93bl87Ci0KLSAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIHJlZ2lzdGVyZWQgZGVzY3JpcHRvcnMuCi0gIG11dGV4IHJlZ2lzdGVyZWRfZGVzY3JpcHRvcnNfbXV0ZXhfOwotCi0gIC8vIEtlZXAgdHJhY2sgb2YgYWxsIHJlZ2lzdGVyZWQgZGVzY3JpcHRvcnMuCi0gIG9iamVjdF9wb29sPGRlc2NyaXB0b3Jfc3RhdGU+IHJlZ2lzdGVyZWRfZGVzY3JpcHRvcnNfOwotCi0gIC8vIEhlbHBlciBjbGFzcyB0byBkbyBwb3N0LXBlcmZvcm1faW8gY2xlYW51cC4KLSAgc3RydWN0IHBlcmZvcm1faW9fY2xlYW51cF9vbl9ibG9ja19leGl0OwotICBmcmllbmQgc3RydWN0IHBlcmZvcm1faW9fY2xlYW51cF9vbl9ibG9ja19leGl0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL2Vwb2xsX3JlYWN0b3IuaHBwIgotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9lcG9sbF9yZWFjdG9yLmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0VQT0xMKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfRVBPTExfUkVBQ1RPUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZXZlbnQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9ldmVudC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjkzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9ldmVudC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2V2ZW50LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9FVkVOVF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfRVZFTlRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9udWxsX2V2ZW50LmhwcCIKLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC93aW5fZXZlbnQuaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9zaXhfZXZlbnQuaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19TVERfTVVURVhfQU5EX0NPTkRWQVIpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3N0ZF9ldmVudC5ocHAiCi0jZWxzZQotIyBlcnJvciBPbmx5IFdpbmRvd3MsIFBPU0lYIGFuZCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBhcmUgc3VwcG9ydGVkIQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfVEhSRUFEUykKLXR5cGVkZWYgbnVsbF9ldmVudCBldmVudDsKLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotdHlwZWRlZiB3aW5fZXZlbnQgZXZlbnQ7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotdHlwZWRlZiBwb3NpeF9ldmVudCBldmVudDsKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfU1REX01VVEVYX0FORF9DT05EVkFSKQotdHlwZWRlZiBzdGRfZXZlbnQgZXZlbnQ7Ci0jZW5kaWYKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9FVkVOVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZXZlbnRmZF9zZWxlY3RfaW50ZXJydXB0ZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9ldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYTQzODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9ldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLwotLy8gZGV0YWlsL2V2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IFJvZWxvZiBOYXVkZSAocm9lbG9mLm5hdWRlIGF0IGdtYWlsIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0VWRU5URkRfU0VMRUNUX0lOVEVSUlVQVEVSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9FVkVOVEZEX1NFTEVDVF9JTlRFUlJVUFRFUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfRVZFTlRGRCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlcgotewotcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIGV2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyKCk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIH5ldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlcigpOwotCi0gIC8vIFJlY3JlYXRlIHRoZSBpbnRlcnJ1cHRlcidzIGRlc2NyaXB0b3JzLiBVc2VkIGFmdGVyIGEgZm9yay4KLSAgQVNJT19ERUNMIHZvaWQgcmVjcmVhdGUoKTsKLQotICAvLyBJbnRlcnJ1cHQgdGhlIHNlbGVjdCBjYWxsLgotICBBU0lPX0RFQ0wgdm9pZCBpbnRlcnJ1cHQoKTsKLQotICAvLyBSZXNldCB0aGUgc2VsZWN0IGludGVycnVwdC4gUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIHdhcyBpbnRlcnJ1cHRlZC4KLSAgQVNJT19ERUNMIGJvb2wgcmVzZXQoKTsKLQotICAvLyBHZXQgdGhlIHJlYWQgZGVzY3JpcHRvciB0byBiZSBwYXNzZWQgdG8gc2VsZWN0LgotICBpbnQgcmVhZF9kZXNjcmlwdG9yKCkgY29uc3QKLSAgewotICAgIHJldHVybiByZWFkX2Rlc2NyaXB0b3JfOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIE9wZW4gdGhlIGRlc2NyaXB0b3JzLiBUaHJvd3Mgb24gZXJyb3IuCi0gIEFTSU9fREVDTCB2b2lkIG9wZW5fZGVzY3JpcHRvcnMoKTsKLQotICAvLyBDbG9zZSB0aGUgZGVzY3JpcHRvcnMuCi0gIEFTSU9fREVDTCB2b2lkIGNsb3NlX2Rlc2NyaXB0b3JzKCk7Ci0KLSAgLy8gVGhlIHJlYWQgZW5kIG9mIGEgY29ubmVjdGlvbiB1c2VkIHRvIGludGVycnVwdCB0aGUgc2VsZWN0IGNhbGwuIFRoaXMgZmlsZQotICAvLyBkZXNjcmlwdG9yIGlzIHBhc3NlZCB0byBzZWxlY3Qgc3VjaCB0aGF0IHdoZW4gaXQgaXMgdGltZSB0byBzdG9wLCBhIHNpbmdsZQotICAvLyA2NGJpdCB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4gb24gdGhlIG90aGVyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiBhbmQgdGhpcwotICAvLyBkZXNjcmlwdG9yIHdpbGwgYmVjb21lIHJlYWRhYmxlLgotICBpbnQgcmVhZF9kZXNjcmlwdG9yXzsKLQotICAvLyBUaGUgd3JpdGUgZW5kIG9mIGEgY29ubmVjdGlvbiB1c2VkIHRvIGludGVycnVwdCB0aGUgc2VsZWN0IGNhbGwuIEEgc2luZ2xlCi0gIC8vIDY0Yml0IG5vbi16ZXJvIHZhbHVlIG1heSBiZSB3cml0dGVuIHRvIHRoaXMgdG8gd2FrZSB1cCB0aGUgc2VsZWN0IHdoaWNoIGlzCi0gIC8vIHdhaXRpbmcgZm9yIHRoZSBvdGhlciBlbmQgdG8gYmVjb21lIHJlYWRhYmxlLiBUaGlzIGRlc2NyaXB0b3Igd2lsbCBvbmx5Ci0gIC8vIGRpZmZlciBmcm9tIHRoZSByZWFkIGRlc2NyaXB0b3Igd2hlbiBhIHBpcGUgaXMgdXNlZC4KLSAgaW50IHdyaXRlX2Rlc2NyaXB0b3JfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvZXZlbnRmZF9zZWxlY3RfaW50ZXJydXB0ZXIuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfRVZFTlRGRCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0VWRU5URkRfU0VMRUNUX0lOVEVSUlVQVEVSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9mZF9zZXRfYWRhcHRlci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ZkX3NldF9hZGFwdGVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxZjE0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ZkX3NldF9hZGFwdGVyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvZmRfc2V0X2FkYXB0ZXIuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0ZEX1NFVF9BREFQVEVSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9GRF9TRVRfQURBUFRFUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9zaXhfZmRfc2V0X2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9mZF9zZXRfYWRhcHRlci5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLXR5cGVkZWYgd2luX2ZkX3NldF9hZGFwdGVyIGZkX3NldF9hZGFwdGVyOwotI2Vsc2UKLXR5cGVkZWYgcG9zaXhfZmRfc2V0X2FkYXB0ZXIgZmRfc2V0X2FkYXB0ZXI7Ci0jZW5kaWYKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0ZEX1NFVF9BREFQVEVSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjVhNjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfRkVOQ0VEX0JMT0NLX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9GRU5DRURfQkxPQ0tfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKSBcCi0gIHx8IGRlZmluZWQoQVNJT19ESVNBQkxFX0ZFTkNFRF9CTE9DSykKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvbnVsbF9mZW5jZWRfYmxvY2suaHBwIgotI2VsaWYgZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL21hY29zX2ZlbmNlZF9ibG9jay5ocHAiCi0jZWxpZiBkZWZpbmVkKF9fc3VuKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9zb2xhcmlzX2ZlbmNlZF9ibG9jay5ocHAiCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pIFwKLSAgJiYgIWRlZmluZWQoX19HQ0NfSEFWRV9TWU5DX0NPTVBBUkVfQU5EX1NXQVBfNCkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvZ2NjX2FybV9mZW5jZWRfYmxvY2suaHBwIgotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19ocHBhKSB8fCBkZWZpbmVkKF9faHBwYV9fKSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvZ2NjX2hwcGFfZmVuY2VkX2Jsb2NrLmhwcCIKLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9nY2NfeDg2X2ZlbmNlZF9ibG9jay5ocHAiCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSBcCi0gICYmICgoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSAxKSB8fCAoX19HTlVDX18gPiA0KSkgXAotICAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhZGVmaW5lZChfX0lDTCkgXAotICAmJiAhZGVmaW5lZChfX0lDQykgJiYgIWRlZmluZWQoX19FQ0MpICYmICFkZWZpbmVkKF9fUEFUSFNDQUxFX18pCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2djY19zeW5jX2ZlbmNlZF9ibG9jay5ocHAiCi0jZWxpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgJiYgIWRlZmluZWQoVU5ERVJfQ0UpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9mZW5jZWRfYmxvY2suaHBwIgotI2Vsc2UKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvbnVsbF9mZW5jZWRfYmxvY2suaHBwIgotI2VuZGlmCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfVEhSRUFEUykgXAotICB8fCBkZWZpbmVkKEFTSU9fRElTQUJMRV9GRU5DRURfQkxPQ0spCi10eXBlZGVmIG51bGxfZmVuY2VkX2Jsb2NrIGZlbmNlZF9ibG9jazsKLSNlbGlmIGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKQotdHlwZWRlZiBtYWNvc19mZW5jZWRfYmxvY2sgZmVuY2VkX2Jsb2NrOwotI2VsaWYgZGVmaW5lZChfX3N1bikKLXR5cGVkZWYgc29sYXJpc19mZW5jZWRfYmxvY2sgZmVuY2VkX2Jsb2NrOwotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSBcCi0gICYmICFkZWZpbmVkKF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzQpCi10eXBlZGVmIGdjY19hcm1fZmVuY2VkX2Jsb2NrIGZlbmNlZF9ibG9jazsKLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faHBwYSkgfHwgZGVmaW5lZChfX2hwcGFfXykpCi10eXBlZGVmIGdjY19ocHBhX2ZlbmNlZF9ibG9jayBmZW5jZWRfYmxvY2s7Ci0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKLXR5cGVkZWYgZ2NjX3g4Nl9mZW5jZWRfYmxvY2sgZmVuY2VkX2Jsb2NrOwotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgXAotICAmJiAoKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMSkgfHwgKF9fR05VQ19fID4gNCkpIFwKLSAgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19JQ0wpIFwKLSAgJiYgIWRlZmluZWQoX19JQ0MpICYmICFkZWZpbmVkKF9fRUNDKSAmJiAhZGVmaW5lZChfX1BBVEhTQ0FMRV9fKQotdHlwZWRlZiBnY2Nfc3luY19mZW5jZWRfYmxvY2sgZmVuY2VkX2Jsb2NrOwotI2VsaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKFVOREVSX0NFKQotdHlwZWRlZiB3aW5fZmVuY2VkX2Jsb2NrIGZlbmNlZF9ibG9jazsKLSNlbHNlCi10eXBlZGVmIG51bGxfZmVuY2VkX2Jsb2NrIGZlbmNlZF9ibG9jazsKLSNlbmRpZgotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0ZFTkNFRF9CTE9DS19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZnVuY3Rpb24uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9mdW5jdGlvbi5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDRiZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9mdW5jdGlvbi5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2Z1bmN0aW9uLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9GVU5DVElPTl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfRlVOQ1RJT05fSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9GVU5DVElPTikKLSMgaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0ZVTkNUSU9OKQotIyBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfRlVOQ1RJT04pCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TVERfRlVOQ1RJT04pCi11c2luZyBzdGQ6OmZ1bmN0aW9uOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfRlVOQ1RJT04pCi11c2luZyBib29zdDo6ZnVuY3Rpb247Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfRlVOQ1RJT04pCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfRlVOQ1RJT05fSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2djY19hcm1fZmVuY2VkX2Jsb2NrLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZ2NjX2FybV9mZW5jZWRfYmxvY2suaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2ZlY2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZ2NjX2FybV9mZW5jZWRfYmxvY2suaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9nY2NfYXJtX2ZlbmNlZF9ibG9jay5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfR0NDX0FSTV9GRU5DRURfQkxPQ0tfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0dDQ19BUk1fRkVOQ0VEX0JMT0NLX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIGdjY19hcm1fZmVuY2VkX2Jsb2NrCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICBlbnVtIGhhbGZfdCB7IGhhbGYgfTsKLSAgZW51bSBmdWxsX3QgeyBmdWxsIH07Ci0KLSAgLy8gQ29uc3RydWN0b3IgZm9yIGEgaGFsZiBmZW5jZWQgYmxvY2suCi0gIGV4cGxpY2l0IGdjY19hcm1fZmVuY2VkX2Jsb2NrKGhhbGZfdCkKLSAgewotICB9Ci0KLSAgLy8gQ29uc3RydWN0b3IgZm9yIGEgZnVsbCBmZW5jZWQgYmxvY2suCi0gIGV4cGxpY2l0IGdjY19hcm1fZmVuY2VkX2Jsb2NrKGZ1bGxfdCkKLSAgewotICAgIGJhcnJpZXIoKTsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IuCi0gIH5nY2NfYXJtX2ZlbmNlZF9ibG9jaygpCi0gIHsKLSAgICBiYXJyaWVyKCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgc3RhdGljIHZvaWQgYmFycmllcigpCi0gIHsKLSNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfNF9fKSBcCi0gICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzRUX18pIFwKLSAgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNV9fKSBcCi0gICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVFX18pIFwKLSAgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRfXykgXAotICAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgXAotICAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVKX18pIFwKLSAgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSBcCi0gICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZKX18pIFwKLSAgICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNktfXykgXAotICAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Wl9fKSBcCi0gICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZaS19fKSBcCi0gICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZUMl9fKQotIyBpZiBkZWZpbmVkKF9fdGh1bWJfXykKLSAgICAvLyBUaGlzIGlzIGp1c3QgYSBwbGFjZWhvbGRlciBhbmQgYWxtb3N0IGNlcnRhaW5seSBub3Qgc3VmZmljaWVudC4KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiIgOiA6IDogIm1lbW9yeSIpOwotIyBlbHNlIC8vIGRlZmluZWQoX190aHVtYl9fKQotICAgIGludCBhID0gMCwgYiA9IDA7Ci0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzd3AgJTAsICUxLCBbJTJdIgotICAgICAgICA6ICI9JnIiKGEpIDogInIiKDEpLCAiciIoJmIpIDogIm1lbW9yeSIsICJjYyIpOwotIyBlbmRpZiAvLyBkZWZpbmVkKF9fdGh1bWJfXykKLSNlbHNlCi0gICAgLy8gQVJNdjcgYW5kIGxhdGVyLgotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgiZG1iIiA6IDogOiAibWVtb3J5Iik7Ci0jZW5kaWYKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9HQ0NfQVJNX0ZFTkNFRF9CTE9DS19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZ2NjX2hwcGFfZmVuY2VkX2Jsb2NrLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZ2NjX2hwcGFfZmVuY2VkX2Jsb2NrLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1MjdiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2djY19ocHBhX2ZlbmNlZF9ibG9jay5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLwotLy8gZGV0YWlsL2djY19ocHBhX2ZlbmNlZF9ibG9jay5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0dDQ19IUFBBX0ZFTkNFRF9CTE9DS19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfR0NDX0hQUEFfRkVOQ0VEX0JMT0NLX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19ocHBhKSB8fCBkZWZpbmVkKF9faHBwYV9fKSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBnY2NfaHBwYV9mZW5jZWRfYmxvY2sKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIGVudW0gaGFsZl90IHsgaGFsZiB9OwotICBlbnVtIGZ1bGxfdCB7IGZ1bGwgfTsKLQotICAvLyBDb25zdHJ1Y3RvciBmb3IgYSBoYWxmIGZlbmNlZCBibG9jay4KLSAgZXhwbGljaXQgZ2NjX2hwcGFfZmVuY2VkX2Jsb2NrKGhhbGZfdCkKLSAgewotICB9Ci0KLSAgLy8gQ29uc3RydWN0b3IgZm9yIGEgZnVsbCBmZW5jZWQgYmxvY2suCi0gIGV4cGxpY2l0IGdjY19ocHBhX2ZlbmNlZF9ibG9jayhmdWxsX3QpCi0gIHsKLSAgICBiYXJyaWVyKCk7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+Z2NjX2hwcGFfZmVuY2VkX2Jsb2NrKCkKLSAgewotICAgIGJhcnJpZXIoKTsKLSAgfQotCi1wcml2YXRlOgotICBzdGF0aWMgdm9pZCBiYXJyaWVyKCkKLSAgewotICAgIC8vIFRoaXMgaXMganVzdCBhIHBsYWNlaG9sZGVyIGFuZCBhbG1vc3QgY2VydGFpbmx5IG5vdCBzdWZmaWNpZW50LgotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgiIiA6IDogOiAibWVtb3J5Iik7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19ocHBhKSB8fCBkZWZpbmVkKF9faHBwYV9fKSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0dDQ19IUFBBX0ZFTkNFRF9CTE9DS19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZ2NjX3N5bmNfZmVuY2VkX2Jsb2NrLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvZ2NjX3N5bmNfZmVuY2VkX2Jsb2NrLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0ZWZjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2djY19zeW5jX2ZlbmNlZF9ibG9jay5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLwotLy8gZGV0YWlsL2djY19zeW5jX2ZlbmNlZF9ibG9jay5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0dDQ19TWU5DX0ZFTkNFRF9CTE9DS19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfR0NDX1NZTkNfRkVOQ0VEX0JMT0NLX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgXAotICAmJiAoKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMSkgfHwgKF9fR05VQ19fID4gNCkpIFwKLSAgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19JQ0wpIFwKLSAgJiYgIWRlZmluZWQoX19JQ0MpICYmICFkZWZpbmVkKF9fRUNDKSAmJiAhZGVmaW5lZChfX1BBVEhTQ0FMRV9fKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIGdjY19zeW5jX2ZlbmNlZF9ibG9jawotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgZW51bSBoYWxmX29yX2Z1bGxfdCB7IGhhbGYsIGZ1bGwgfTsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgZXhwbGljaXQgZ2NjX3N5bmNfZmVuY2VkX2Jsb2NrKGhhbGZfb3JfZnVsbF90KQotICAgIDogdmFsdWVfKDApCi0gIHsKLSAgICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoJnZhbHVlXywgMSk7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+Z2NjX3N5bmNfZmVuY2VkX2Jsb2NrKCkKLSAgewotICAgIF9fc3luY19sb2NrX3JlbGVhc2UoJnZhbHVlXyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgaW50IHZhbHVlXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykKLSAgICAgICAvLyAmJiAoKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMSkgfHwgKF9fR05VQ19fID4gNCkpCi0gICAgICAgLy8gJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19JQ0wpCi0gICAgICAgLy8gJiYgIWRlZmluZWQoX19JQ0MpICYmICFkZWZpbmVkKF9fRUNDKSAmJiAhZGVmaW5lZChfX1BBVEhTQ0FMRV9fKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfR0NDX1NZTkNfRkVOQ0VEX0JMT0NLX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9nY2NfeDg2X2ZlbmNlZF9ibG9jay5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2djY194ODZfZmVuY2VkX2Jsb2NrLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyNzg4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2djY194ODZfZmVuY2VkX2Jsb2NrLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvZ2NjX3g4Nl9mZW5jZWRfYmxvY2suaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0dDQ19YODZfRkVOQ0VEX0JMT0NLX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9HQ0NfWDg2X0ZFTkNFRF9CTE9DS19IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIGdjY194ODZfZmVuY2VkX2Jsb2NrCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICBlbnVtIGhhbGZfdCB7IGhhbGYgfTsKLSAgZW51bSBmdWxsX3QgeyBmdWxsIH07Ci0KLSAgLy8gQ29uc3RydWN0b3IgZm9yIGEgaGFsZiBmZW5jZWQgYmxvY2suCi0gIGV4cGxpY2l0IGdjY194ODZfZmVuY2VkX2Jsb2NrKGhhbGZfdCkKLSAgewotICB9Ci0KLSAgLy8gQ29uc3RydWN0b3IgZm9yIGEgZnVsbCBmZW5jZWQgYmxvY2suCi0gIGV4cGxpY2l0IGdjY194ODZfZmVuY2VkX2Jsb2NrKGZ1bGxfdCkKLSAgewotICAgIGxiYXJyaWVyKCk7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+Z2NjX3g4Nl9mZW5jZWRfYmxvY2soKQotICB7Ci0gICAgc2JhcnJpZXIoKTsKLSAgfQotCi1wcml2YXRlOgotICBzdGF0aWMgaW50IGJhcnJpZXIoKQotICB7Ci0gICAgaW50IHIgPSAwLCBtID0gMTsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAgICJ4Y2hnbCAlMCwgJTEiIDoKLSAgICAgICAgIj1yIihyKSwgIj1tIihtKSA6Ci0gICAgICAgICIwIigxKSwgIm0iKG0pIDoKLSAgICAgICAgIm1lbW9yeSIsICJjYyIpOwotICAgIHJldHVybiByOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgbGJhcnJpZXIoKQotICB7Ci0jaWYgZGVmaW5lZChfX1NTRTJfXykKLSMgaWYgKF9fR05VQ19fID49IDQpICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmICFkZWZpbmVkKF9fSUNMKQotICAgIF9fYnVpbHRpbl9pYTMyX2xmZW5jZSgpOwotIyBlbHNlIC8vIChfX0dOVUNfXyA+PSA0KSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhZGVmaW5lZChfX0lDTCkKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxmZW5jZSIgOjo6ICJtZW1vcnkiKTsKLSMgZW5kaWYgLy8gKF9fR05VQ19fID49IDQpICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmICFkZWZpbmVkKF9fSUNMKQotI2Vsc2UgLy8gZGVmaW5lZChfX1NTRTJfXykKLSAgICBiYXJyaWVyKCk7Ci0jZW5kaWYgLy8gZGVmaW5lZChfX1NTRTJfXykKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHNiYXJyaWVyKCkKLSAgewotI2lmIGRlZmluZWQoX19TU0UyX18pCi0jIGlmIChfX0dOVUNfXyA+PSA0KSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhZGVmaW5lZChfX0lDTCkKLSAgICBfX2J1aWx0aW5faWEzMl9zZmVuY2UoKTsKLSMgZWxzZSAvLyAoX19HTlVDX18gPj0gNCkgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19JQ0wpCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzZmVuY2UiIDo6OiAibWVtb3J5Iik7Ci0jIGVuZGlmIC8vIChfX0dOVUNfXyA+PSA0KSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiAhZGVmaW5lZChfX0lDTCkKLSNlbHNlIC8vIGRlZmluZWQoX19TU0UyX18pCi0gICAgYmFycmllcigpOwotI2VuZGlmIC8vIGRlZmluZWQoX19TU0UyX18pCi0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9HQ0NfWDg2X0ZFTkNFRF9CTE9DS19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0MTU4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLwotLy8gZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0hBTkRMRVJfQUxMT0NfSEVMUEVSU19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSEFORExFUl9BTExPQ19IRUxQRVJTX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotI2luY2x1ZGUgImFzaW8vaGFuZGxlcl9hbGxvY19ob29rLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLS8vIENhbGxzIHRvIGFzaW9faGFuZGxlcl9hbGxvY2F0ZSBhbmQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUgbXVzdCBiZSBtYWRlIGZyb20KLS8vIGEgbmFtZXNwYWNlIHRoYXQgZG9lcyBub3QgY29udGFpbiBhbnkgb3ZlcmxvYWRzIG9mIHRoZXNlIGZ1bmN0aW9ucy4gVGhlCi0vLyBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVycyBuYW1lc3BhY2UgaXMgZGVmaW5lZCBoZXJlIGZvciB0aGF0IHB1cnBvc2UuCi1uYW1lc3BhY2UgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnMgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLWlubGluZSB2b2lkKiBhbGxvY2F0ZShzdGQ6OnNpemVfdCBzLCBIYW5kbGVyJiBoKQotewotI2lmICFkZWZpbmVkKEFTSU9fSEFTX0hBTkRMRVJfSE9PS1MpCi0gIHJldHVybiA6Om9wZXJhdG9yIG5ldyhzKTsKLSNlbHNlCi0gIHVzaW5nIGFzaW86OmFzaW9faGFuZGxlcl9hbGxvY2F0ZTsKLSAgcmV0dXJuIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzLCBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoKSk7Ci0jZW5kaWYKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci1pbmxpbmUgdm9pZCBkZWFsbG9jYXRlKHZvaWQqIHAsIHN0ZDo6c2l6ZV90IHMsIEhhbmRsZXImIGgpCi17Ci0jaWYgIWRlZmluZWQoQVNJT19IQVNfSEFORExFUl9IT09LUykKLSAgOjpvcGVyYXRvciBkZWxldGUocCk7Ci0jZWxzZQotICB1c2luZyBhc2lvOjphc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZTsKLSAgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUocCwgcywgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaCkpOwotI2VuZGlmCi19Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzCi0KLSNkZWZpbmUgQVNJT19ERUZJTkVfSEFORExFUl9QVFIob3ApIFwKLSAgc3RydWN0IHB0ciBcCi0gIHsgXAotICAgIEhhbmRsZXIqIGg7IFwKLSAgICB2b2lkKiB2OyBcCi0gICAgb3AqIHA7IFwKLSAgICB+cHRyKCkgXAotICAgIHsgXAotICAgICAgcmVzZXQoKTsgXAotICAgIH0gXAotICAgIHZvaWQgcmVzZXQoKSBcCi0gICAgeyBcCi0gICAgICBpZiAocCkgXAotICAgICAgeyBcCi0gICAgICAgIHAtPn5vcCgpOyBcCi0gICAgICAgIHAgPSAwOyBcCi0gICAgICB9IFwKLSAgICAgIGlmICh2KSBcCi0gICAgICB7IFwKLSAgICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmRlYWxsb2NhdGUodiwgc2l6ZW9mKG9wKSwgKmgpOyBcCi0gICAgICAgIHYgPSAwOyBcCi0gICAgICB9IFwKLSAgICB9IFwKLSAgfSBcCi0gIC8qKi8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0hBTkRMRVJfQUxMT0NfSEVMUEVSU19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaGFuZGxlcl9jb250X2hlbHBlcnMuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9oYW5kbGVyX2NvbnRfaGVscGVycy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiN2M0MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9oYW5kbGVyX2NvbnRfaGVscGVycy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLwotLy8gZGV0YWlsL2hhbmRsZXJfY29udF9oZWxwZXJzLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9IQU5ETEVSX0NPTlRfSEVMUEVSU19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSEFORExFUl9DT05UX0hFTFBFUlNfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2hhbmRsZXJfY29udGludWF0aW9uX2hvb2suaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotLy8gQ2FsbHMgdG8gYXNpb19oYW5kbGVyX2lzX2NvbnRpbnVhdGlvbiBtdXN0IGJlIG1hZGUgZnJvbSBhIG5hbWVzcGFjZSB0aGF0Ci0vLyBkb2VzIG5vdCBjb250YWluIG92ZXJsb2FkcyBvZiB0aGlzIGZ1bmN0aW9uLiBUaGlzIG5hbWVzcGFjZSBpcyBkZWZpbmVkIGhlcmUKLS8vIGZvciB0aGF0IHB1cnBvc2UuCi1uYW1lc3BhY2UgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVycyB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb250ZXh0PgotaW5saW5lIGJvb2wgaXNfY29udGludWF0aW9uKENvbnRleHQmIGNvbnRleHQpCi17Ci0jaWYgIWRlZmluZWQoQVNJT19IQVNfSEFORExFUl9IT09LUykKLSAgcmV0dXJuIGZhbHNlOwotI2Vsc2UKLSAgdXNpbmcgYXNpbzo6YXNpb19oYW5kbGVyX2lzX2NvbnRpbnVhdGlvbjsKLSAgcmV0dXJuIGFzaW9faGFuZGxlcl9pc19jb250aW51YXRpb24oCi0gICAgICBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihjb250ZXh0KSk7Ci0jZW5kaWYKLX0KLQotfSAvLyBuYW1lc3BhY2UgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVycwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSEFORExFUl9DT05UX0hFTFBFUlNfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhZDY4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0hBTkRMRVJfSU5WT0tFX0hFTFBFUlNfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0hBTkRMRVJfSU5WT0tFX0hFTFBFUlNfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2hhbmRsZXJfaW52b2tlX2hvb2suaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotLy8gQ2FsbHMgdG8gYXNpb19oYW5kbGVyX2ludm9rZSBtdXN0IGJlIG1hZGUgZnJvbSBhIG5hbWVzcGFjZSB0aGF0IGRvZXMgbm90Ci0vLyBjb250YWluIG92ZXJsb2FkcyBvZiB0aGlzIGZ1bmN0aW9uLiBUaGUgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzCi0vLyBuYW1lc3BhY2UgaXMgZGVmaW5lZCBoZXJlIGZvciB0aGF0IHB1cnBvc2UuCi1uYW1lc3BhY2UgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBDb250ZXh0PgotaW5saW5lIHZvaWQgaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwgQ29udGV4dCYgY29udGV4dCkKLXsKLSNpZiAhZGVmaW5lZChBU0lPX0hBU19IQU5ETEVSX0hPT0tTKQotICBGdW5jdGlvbiB0bXAoZnVuY3Rpb24pOwotICB0bXAoKTsKLSNlbHNlCi0gIHVzaW5nIGFzaW86OmFzaW9faGFuZGxlcl9pbnZva2U7Ci0gIGFzaW9faGFuZGxlcl9pbnZva2UoZnVuY3Rpb24sIGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGNvbnRleHQpKTsKLSNlbmRpZgotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIENvbnRleHQ+Ci1pbmxpbmUgdm9pZCBpbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLCBDb250ZXh0JiBjb250ZXh0KQotewotI2lmICFkZWZpbmVkKEFTSU9fSEFTX0hBTkRMRVJfSE9PS1MpCi0gIEZ1bmN0aW9uIHRtcChmdW5jdGlvbik7Ci0gIHRtcCgpOwotI2Vsc2UKLSAgdXNpbmcgYXNpbzo6YXNpb19oYW5kbGVyX2ludm9rZTsKLSAgYXNpb19oYW5kbGVyX2ludm9rZShmdW5jdGlvbiwgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoY29udGV4dCkpOwotI2VuZGlmCi19Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVycwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSEFORExFUl9JTlZPS0VfSEVMUEVSU19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaGFuZGxlcl90cmFja2luZy5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2hhbmRsZXJfdHJhY2tpbmcuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGU4MTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaGFuZGxlcl90cmFja2luZy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9oYW5kbGVyX3RyYWNraW5nLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0hBTkRMRVJfVFJBQ0tJTkdfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0hBTkRMRVJfVFJBQ0tJTkdfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0hBTkRMRVJfVFJBQ0tJTkcpCi0jIGluY2x1ZGUgImFzaW8vZXJyb3JfY29kZS5ocHAiCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2NzdGRpbnQuaHBwIgotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9zdGF0aWNfbXV0ZXguaHBwIgotIyBpbmNsdWRlICJhc2lvL2RldGFpbC90c3NfcHRyLmhwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0hBTkRMRVJfVFJBQ0tJTkcpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfSEFORExFUl9UUkFDS0lORykKLQotY2xhc3MgaGFuZGxlcl90cmFja2luZwotewotcHVibGljOgotICBjbGFzcyBjb21wbGV0aW9uOwotCi0gIC8vIEJhc2UgY2xhc3MgZm9yIG9iamVjdHMgY29udGFpbmluZyB0cmFja2VkIGhhbmRsZXJzLgotICBjbGFzcyB0cmFja2VkX2hhbmRsZXIKLSAgewotICBwcml2YXRlOgotICAgIC8vIE9ubHkgdGhlIGhhbmRsZXJfdHJhY2tpbmcgY2xhc3Mgd2lsbCBoYXZlIGFjY2VzcyB0byB0aGUgaWQuCi0gICAgZnJpZW5kIGNsYXNzIGhhbmRsZXJfdHJhY2tpbmc7Ci0gICAgZnJpZW5kIGNsYXNzIGNvbXBsZXRpb247Ci0gICAgdWludDY0X3QgaWRfOwotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBDb25zdHJ1Y3RvciBpbml0aWFsaXNlcyB3aXRoIG5vIGlkLgotICAgIHRyYWNrZWRfaGFuZGxlcigpIDogaWRfKDApIHt9Ci0KLSAgICAvLyBQcmV2ZW50IGRlbGV0aW9uIHRocm91Z2ggdGhpcyB0eXBlLgotICAgIH50cmFja2VkX2hhbmRsZXIoKSB7fQotICB9OwotCi0gIC8vIEluaXRpYWxpc2UgdGhlIHRyYWNraW5nIHN5c3RlbS4KLSAgQVNJT19ERUNMIHN0YXRpYyB2b2lkIGluaXQoKTsKLQotICAvLyBSZWNvcmQgdGhlIGNyZWF0aW9uIG9mIGEgdHJhY2tlZCBoYW5kbGVyLgotICBBU0lPX0RFQ0wgc3RhdGljIHZvaWQgY3JlYXRpb24odHJhY2tlZF9oYW5kbGVyKiBoLAotICAgICAgY29uc3QgY2hhciogb2JqZWN0X3R5cGUsIHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogb3BfbmFtZSk7Ci0KLSAgY2xhc3MgY29tcGxldGlvbgotICB7Ci0gIHB1YmxpYzoKLSAgICAvLyBDb25zdHJ1Y3RvciByZWNvcmRzIHRoYXQgaGFuZGxlciBpcyB0byBiZSBpbnZva2VkIHdpdGggbm8gYXJndW1lbnRzLgotICAgIEFTSU9fREVDTCBleHBsaWNpdCBjb21wbGV0aW9uKHRyYWNrZWRfaGFuZGxlciogaCk7Ci0KLSAgICAvLyBEZXN0cnVjdG9yIHJlY29yZHMgb25seSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSB0aGUgaGFuZGxlciwgb3IKLSAgICAvLyBpZiB0aGUgbWVtb3J5IGlzIGJlaW5nIGZyZWVkIHdpdGhvdXQgdGhlIGhhbmRsZXIgaGF2aW5nIGJlZW4gaW52b2tlZC4KLSAgICBBU0lPX0RFQ0wgfmNvbXBsZXRpb24oKTsKLQotICAgIC8vIFJlY29yZHMgdGhhdCBoYW5kbGVyIGlzIHRvIGJlIGludm9rZWQgd2l0aCBubyBhcmd1bWVudHMuCi0gICAgQVNJT19ERUNMIHZvaWQgaW52b2NhdGlvbl9iZWdpbigpOwotCi0gICAgLy8gUmVjb3JkcyB0aGF0IGhhbmRsZXIgaXMgdG8gYmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudHMuCi0gICAgQVNJT19ERUNMIHZvaWQgaW52b2NhdGlvbl9iZWdpbihjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgICAvLyBDb25zdHJ1Y3RvciByZWNvcmRzIHRoYXQgaGFuZGxlciBpcyB0byBiZSBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50cy4KLSAgICBBU0lPX0RFQ0wgdm9pZCBpbnZvY2F0aW9uX2JlZ2luKAotICAgICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQpOwotCi0gICAgLy8gQ29uc3RydWN0b3IgcmVjb3JkcyB0aGF0IGhhbmRsZXIgaXMgdG8gYmUgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHMuCi0gICAgQVNJT19ERUNMIHZvaWQgaW52b2NhdGlvbl9iZWdpbigKLSAgICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIGludCBzaWduYWxfbnVtYmVyKTsKLQotICAgIC8vIENvbnN0cnVjdG9yIHJlY29yZHMgdGhhdCBoYW5kbGVyIGlzIHRvIGJlIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzLgotICAgIEFTSU9fREVDTCB2b2lkIGludm9jYXRpb25fYmVnaW4oCi0gICAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLCBjb25zdCBjaGFyKiBhcmcpOwotCi0gICAgLy8gUmVjb3JkIHRoYXQgaGFuZGxlciBpbnZvY2F0aW9uIGhhcyBlbmRlZC4KLSAgICBBU0lPX0RFQ0wgdm9pZCBpbnZvY2F0aW9uX2VuZCgpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIGhhbmRsZXJfdHJhY2tpbmc7Ci0gICAgdWludDY0X3QgaWRfOwotICAgIGJvb2wgaW52b2tlZF87Ci0gICAgY29tcGxldGlvbiogbmV4dF87Ci0gIH07Ci0KLSAgLy8gUmVjb3JkIGFuIG9wZXJhdGlvbiB0aGF0IGFmZmVjdHMgcGVuZGluZyBoYW5kbGVycy4KLSAgQVNJT19ERUNMIHN0YXRpYyB2b2lkIG9wZXJhdGlvbihjb25zdCBjaGFyKiBvYmplY3RfdHlwZSwKLSAgICAgIHZvaWQqIG9iamVjdCwgY29uc3QgY2hhciogb3BfbmFtZSk7Ci0KLSAgLy8gV3JpdGUgYSBsaW5lIG9mIG91dHB1dC4KLSAgQVNJT19ERUNMIHN0YXRpYyB2b2lkIHdyaXRlX2xpbmUoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOwotCi1wcml2YXRlOgotICBzdHJ1Y3QgdHJhY2tpbmdfc3RhdGU7Ci0gIEFTSU9fREVDTCBzdGF0aWMgdHJhY2tpbmdfc3RhdGUqIGdldF9zdGF0ZSgpOwotfTsKLQotIyBkZWZpbmUgQVNJT19JTkhFUklUX1RSQUNLRURfSEFORExFUiBcCi0gIDogcHVibGljIGFzaW86OmRldGFpbDo6aGFuZGxlcl90cmFja2luZzo6dHJhY2tlZF9oYW5kbGVyCi0KLSMgZGVmaW5lIEFTSU9fQUxTT19JTkhFUklUX1RSQUNLRURfSEFORExFUiBcCi0gICwgcHVibGljIGFzaW86OmRldGFpbDo6aGFuZGxlcl90cmFja2luZzo6dHJhY2tlZF9oYW5kbGVyCi0KLSMgZGVmaW5lIEFTSU9fSEFORExFUl9UUkFDS0lOR19JTklUIFwKLSAgYXNpbzo6ZGV0YWlsOjpoYW5kbGVyX3RyYWNraW5nOjppbml0KCkKLQotIyBkZWZpbmUgQVNJT19IQU5ETEVSX0NSRUFUSU9OKGFyZ3MpIFwKLSAgYXNpbzo6ZGV0YWlsOjpoYW5kbGVyX3RyYWNraW5nOjpjcmVhdGlvbiBhcmdzCi0KLSMgZGVmaW5lIEFTSU9fSEFORExFUl9DT01QTEVUSU9OKGFyZ3MpIFwKLSAgYXNpbzo6ZGV0YWlsOjpoYW5kbGVyX3RyYWNraW5nOjpjb21wbGV0aW9uIHRyYWNrZWRfY29tcGxldGlvbiBhcmdzCi0KLSMgZGVmaW5lIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKGFyZ3MpIFwKLSAgdHJhY2tlZF9jb21wbGV0aW9uLmludm9jYXRpb25fYmVnaW4gYXJncwotCi0jIGRlZmluZSBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9FTkQgXAotICB0cmFja2VkX2NvbXBsZXRpb24uaW52b2NhdGlvbl9lbmQoKQotCi0jIGRlZmluZSBBU0lPX0hBTkRMRVJfT1BFUkFUSU9OKGFyZ3MpIFwKLSAgYXNpbzo6ZGV0YWlsOjpoYW5kbGVyX3RyYWNraW5nOjpvcGVyYXRpb24gYXJncwotCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0hBTkRMRVJfVFJBQ0tJTkcpCi0KLSMgZGVmaW5lIEFTSU9fSU5IRVJJVF9UUkFDS0VEX0hBTkRMRVIKLSMgZGVmaW5lIEFTSU9fQUxTT19JTkhFUklUX1RSQUNLRURfSEFORExFUgotIyBkZWZpbmUgQVNJT19IQU5ETEVSX1RSQUNLSU5HX0lOSVQgKHZvaWQpMAotIyBkZWZpbmUgQVNJT19IQU5ETEVSX0NSRUFUSU9OKGFyZ3MpICh2b2lkKTAKLSMgZGVmaW5lIEFTSU9fSEFORExFUl9DT01QTEVUSU9OKGFyZ3MpICh2b2lkKTAKLSMgZGVmaW5lIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKGFyZ3MpICh2b2lkKTAKLSMgZGVmaW5lIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0VORCAodm9pZCkwCi0jIGRlZmluZSBBU0lPX0hBTkRMRVJfT1BFUkFUSU9OKGFyZ3MpICh2b2lkKTAKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfSEFORExFUl9UUkFDS0lORykKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvaGFuZGxlcl90cmFja2luZy5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSEFORExFUl9UUkFDS0lOR19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2hhbmRsZXJfdHlwZV9yZXF1aXJlbWVudHMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWIyY2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLy8KLS8vIGRldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0hBTkRMRVJfVFlQRV9SRVFVSVJFTUVOVFNfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0hBTkRMRVJfVFlQRV9SRVFVSVJFTUVOVFNfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLS8vIE9sZGVyIHZlcnNpb25zIG9mIGdjYyBoYXZlIGRpZmZpY3VsdHkgY29tcGlsaW5nIHRoZSBzaXplb2YgZXhwcmVzc2lvbnMgd2hlcmUKLS8vIHdlIHRlc3QgdGhlIGhhbmRsZXIgdHlwZSByZXF1aXJlbWVudHMuIFdlJ2xsIGRpc2FibGUgY2hlY2tpbmcgb2YgaGFuZGxlciB0eXBlCi0vLyByZXF1aXJlbWVudHMgZm9yIHRob3NlIGNvbXBpbGVycywgYnV0IG90aGVyd2lzZSBlbmFibGUgaXQgYnkgZGVmYXVsdC4KLSNpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfSEFORExFUl9UWVBFX1JFUVVJUkVNRU5UUykKLSMgaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA+PSA0KQotIyAgZGVmaW5lIEFTSU9fRU5BQkxFX0hBTkRMRVJfVFlQRV9SRVFVSVJFTUVOVFMgMQotIyBlbmRpZiAvLyAhZGVmaW5lZChfX0dOVUNfXykgfHwgKF9fR05VQ19fID49IDQpCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX0hBTkRMRVJfVFlQRV9SRVFVSVJFTUVOVFMpCi0KLS8vIFdpdGggQysrMHggd2UgY2FuIHVzZSBhIGNvbWJpbmF0aW9uIG9mIGVuaGFuY2VkIFNGSU5BRSBhbmQgc3RhdGljX2Fzc2VydCB0bwotLy8gZ2VuZXJhdGUgYmV0dGVyIHRlbXBsYXRlIGVycm9yIG1lc3NhZ2VzLiBBcyB0aGlzIHRlY2huaXF1ZSBpcyBub3QgeWV0IHdpZGVseQotLy8gcG9ydGFibGUsIHdlJ2xsIG9ubHkgZW5hYmxlIGl0IGZvciB0ZXN0ZWQgY29tcGlsZXJzLgotI2lmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTX0FTU0VSVCkKLSMgaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgIGlmICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDUpKSB8fCAoX19HTlVDX18gPiA0KQotIyAgIGlmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCi0jICAgIGRlZmluZSBBU0lPX0VOQUJMRV9IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTX0FTU0VSVCAxCi0jICAgZW5kaWYgLy8gZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKLSMgIGVuZGlmIC8vICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDUpKSB8fCAoX19HTlVDX18gPiA0KQotIyBlbmRpZiAvLyBkZWZpbmVkKF9fR05VQ19fKQotIyBpZiBkZWZpbmVkKEFTSU9fTVNWQykKLSMgIGlmIChfTVNDX1ZFUiA+PSAxNjAwKQotIyAgIGRlZmluZSBBU0lPX0VOQUJMRV9IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTX0FTU0VSVCAxCi0jICBlbmRpZiAvLyAoX01TQ19WRVIgPj0gMTYwMCkKLSMgZW5kaWYgLy8gZGVmaW5lZChBU0lPX01TVkMpCi0jIGlmIGRlZmluZWQoX19jbGFuZ19fKQotIyAgaWYgX19oYXNfZmVhdHVyZShfX2N4eF9zdGF0aWNfYXNzZXJ0X18pCi0jICAgZGVmaW5lIEFTSU9fRU5BQkxFX0hBTkRMRVJfVFlQRV9SRVFVSVJFTUVOVFNfQVNTRVJUIDEKLSMgIGVuZGlmIC8vIF9faGFzX2ZlYXR1cmUoY3h4X3N0YXRpY19hc3NlcnQpCi0jIGVuZGlmIC8vIGRlZmluZWQoX19jbGFuZ19fKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTKQotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTKQotIyBpbmNsdWRlICJhc2lvL2hhbmRsZXJfdHlwZS5ocHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTKQotCi0vLyBOZXdlciBnY2MgbmVlZHMgc3BlY2lhbCB0cmVhdG1lbnQgdG8gc3VwcHJlc3MgdW51c2VkIHR5cGVkZWYgd2FybmluZ3MuCi0jaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgaWYgKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gOCkpIHx8IChfX0dOVUNfXyA+IDQpCi0jICBkZWZpbmUgQVNJT19VTlVTRURfVFlQRURFRiBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKLSMgZW5kaWYgLy8gKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gOCkpIHx8IChfX0dOVUNfXyA+IDQpCi0jZW5kaWYgLy8gZGVmaW5lZChfX0dOVUNfXykKLSNpZiAhZGVmaW5lZChBU0lPX1VOVVNFRF9UWVBFREVGKQotIyBkZWZpbmUgQVNJT19VTlVTRURfVFlQRURFRgotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fVU5VU0VEX1RZUEVERUYpCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTKQotCi0jIGlmIGRlZmluZWQoQVNJT19FTkFCTEVfSEFORExFUl9UWVBFX1JFUVVJUkVNRU5UU19BU1NFUlQpCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotYXV0byB6ZXJvX2FyZ19oYW5kbGVyX3Rlc3QoSGFuZGxlciBoLCB2b2lkKikKLSAgLT4gZGVjbHR5cGUoCi0gICAgc2l6ZW9mKEhhbmRsZXIoc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlciY+KGgpKSksCi0gICAgKChoKSgpKSwKLSAgICBjaGFyKDApKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci1jaGFyICgmemVyb19hcmdfaGFuZGxlcl90ZXN0KEhhbmRsZXIsIC4uLikpWzJdOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgQXJnMT4KLWF1dG8gb25lX2FyZ19oYW5kbGVyX3Rlc3QoSGFuZGxlciBoLCBBcmcxKiBhMSkKLSAgLT4gZGVjbHR5cGUoCi0gICAgc2l6ZW9mKEhhbmRsZXIoc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlciY+KGgpKSksCi0gICAgKChoKSgqYTEpKSwKLSAgICBjaGFyKDApKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci1jaGFyICgmb25lX2FyZ19oYW5kbGVyX3Rlc3QoSGFuZGxlciBoLCAuLi4pKVsyXTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+Ci1hdXRvIHR3b19hcmdfaGFuZGxlcl90ZXN0KEhhbmRsZXIgaCwgQXJnMSogYTEsIEFyZzIqIGEyKQotICAtPiBkZWNsdHlwZSgKLSAgICBzaXplb2YoSGFuZGxlcihzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVyJj4oaCkpKSwKLSAgICAoKGgpKCphMSwgKmEyKSksCi0gICAgY2hhcigwKSk7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotY2hhciAoJnR3b19hcmdfaGFuZGxlcl90ZXN0KEhhbmRsZXIsIC4uLikpWzJdOwotCi0jICBkZWZpbmUgQVNJT19IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTX0FTU0VSVChleHByLCBtc2cpIFwKLSAgICAgc3RhdGljX2Fzc2VydChleHByLCBtc2cpOwotCi0jIGVsc2UgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTX0FTU0VSVCkKLQotIyAgZGVmaW5lIEFTSU9fSEFORExFUl9UWVBFX1JFUVVJUkVNRU5UU19BU1NFUlQoZXhwciwgbXNnKQotCi0jIGVuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfSEFORExFUl9UWVBFX1JFUVVJUkVNRU5UU19BU1NFUlQpCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUJiBsdnJlZigpOwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQmIGx2cmVmKFQpOwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQmIGNsdnJlZigpOwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQmIGNsdnJlZihUKTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjaGFyIGFyZ2J5dihUKTsKLQotdGVtcGxhdGUgPGludD4KLXN0cnVjdCBoYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzCi17Ci19OwotCi0jZGVmaW5lIEFTSU9fQ09NUExFVElPTl9IQU5ETEVSX0NIRUNLKCBcCi0gICAgaGFuZGxlcl90eXBlLCBoYW5kbGVyKSBcCi0gIFwKLSAgdHlwZWRlZiBBU0lPX0hBTkRMRVJfVFlQRShoYW5kbGVyX3R5cGUsIFwKLSAgICAgIHZvaWQoKSkgYXNpb190cnVlX2hhbmRsZXJfdHlwZTsgXAotICBcCi0gIEFTSU9fSEFORExFUl9UWVBFX1JFUVVJUkVNRU5UU19BU1NFUlQoIFwKLSAgICAgIHNpemVvZihhc2lvOjpkZXRhaWw6Onplcm9fYXJnX2hhbmRsZXJfdGVzdCggXAotICAgICAgICAgIGFzaW86OmRldGFpbDo6Y2x2cmVmPCBcCi0gICAgICAgICAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlPigpLCAwKSkgPT0gMSwgXAotICAgICAgIkNvbXBsZXRpb25IYW5kbGVyIHR5cGUgcmVxdWlyZW1lbnRzIG5vdCBtZXQiKSBcCi0gIFwKLSAgdHlwZWRlZiBhc2lvOjpkZXRhaWw6OmhhbmRsZXJfdHlwZV9yZXF1aXJlbWVudHM8IFwKLSAgICAgIHNpemVvZiggXAotICAgICAgICBhc2lvOjpkZXRhaWw6OmFyZ2J5diggXAotICAgICAgICAgIGFzaW86OmRldGFpbDo6Y2x2cmVmPCBcCi0gICAgICAgICAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlPigpKSkgKyBcCi0gICAgICBzaXplb2YoIFwKLSAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjwgXAotICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCkoKSwgXAotICAgICAgICBjaGFyKDApKT4gQVNJT19VTlVTRURfVFlQRURFRgotCi0jZGVmaW5lIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKCBcCi0gICAgaGFuZGxlcl90eXBlLCBoYW5kbGVyKSBcCi0gIFwKLSAgdHlwZWRlZiBBU0lPX0hBTkRMRVJfVFlQRShoYW5kbGVyX3R5cGUsIFwKLSAgICAgIHZvaWQoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKSBcCi0gICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZTsgXAotICBcCi0gIEFTSU9fSEFORExFUl9UWVBFX1JFUVVJUkVNRU5UU19BU1NFUlQoIFwKLSAgICAgIHNpemVvZihhc2lvOjpkZXRhaWw6OnR3b19hcmdfaGFuZGxlcl90ZXN0KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCksIFwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhc2lvOjplcnJvcl9jb2RlKj4oMCksIFwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnNpemVfdCo+KDApKSkgPT0gMSwgXAotICAgICAgIlJlYWRIYW5kbGVyIHR5cGUgcmVxdWlyZW1lbnRzIG5vdCBtZXQiKSBcCi0gIFwKLSAgdHlwZWRlZiBhc2lvOjpkZXRhaWw6OmhhbmRsZXJfdHlwZV9yZXF1aXJlbWVudHM8IFwKLSAgICAgIHNpemVvZiggXAotICAgICAgICBhc2lvOjpkZXRhaWw6OmFyZ2J5diggXAotICAgICAgICAgIGFzaW86OmRldGFpbDo6Y2x2cmVmPCBcCi0gICAgICAgICAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlPigpKSkgKyBcCi0gICAgICBzaXplb2YoIFwKLSAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjwgXAotICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCkoIFwKLSAgICAgICAgICAgIGFzaW86OmRldGFpbDo6bHZyZWY8Y29uc3QgYXNpbzo6ZXJyb3JfY29kZT4oKSwgXAotICAgICAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjxjb25zdCBzdGQ6OnNpemVfdD4oKSksIFwKLSAgICAgICAgY2hhcigwKSk+IEFTSU9fVU5VU0VEX1RZUEVERUYKLQotCi0jZGVmaW5lIEFTSU9fV1JJVEVfSEFORExFUl9DSEVDSyggXAotICAgIGhhbmRsZXJfdHlwZSwgaGFuZGxlcikgXAotICBcCi0gIHR5cGVkZWYgQVNJT19IQU5ETEVSX1RZUEUoaGFuZGxlcl90eXBlLCBcCi0gICAgICB2b2lkKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkgXAotICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU7IFwKLSAgXAotICBBU0lPX0hBTkRMRVJfVFlQRV9SRVFVSVJFTUVOVFNfQVNTRVJUKCBcCi0gICAgICBzaXplb2YoYXNpbzo6ZGV0YWlsOjp0d29fYXJnX2hhbmRsZXJfdGVzdCggXAotICAgICAgICAgIGFzaW86OmRldGFpbDo6Y2x2cmVmPCBcCi0gICAgICAgICAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlPigpLCBcCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXNpbzo6ZXJyb3JfY29kZSo+KDApLCBcCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzaXplX3QqPigwKSkpID09IDEsIFwKLSAgICAgICJXcml0ZUhhbmRsZXIgdHlwZSByZXF1aXJlbWVudHMgbm90IG1ldCIpIFwKLSAgXAotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6aGFuZGxlcl90eXBlX3JlcXVpcmVtZW50czwgXAotICAgICAgc2l6ZW9mKCBcCi0gICAgICAgIGFzaW86OmRldGFpbDo6YXJnYnl2KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCkpKSArIFwKLSAgICAgIHNpemVvZiggXAotICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPCBcCi0gICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSggXAotICAgICAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjxjb25zdCBhc2lvOjplcnJvcl9jb2RlPigpLCBcCi0gICAgICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPGNvbnN0IHN0ZDo6c2l6ZV90PigpKSwgXAotICAgICAgICBjaGFyKDApKT4gQVNJT19VTlVTRURfVFlQRURFRgotCi0jZGVmaW5lIEFTSU9fQUNDRVBUX0hBTkRMRVJfQ0hFQ0soIFwKLSAgICBoYW5kbGVyX3R5cGUsIGhhbmRsZXIpIFwKLSAgXAotICB0eXBlZGVmIEFTSU9fSEFORExFUl9UWVBFKGhhbmRsZXJfdHlwZSwgXAotICAgICAgdm9pZChhc2lvOjplcnJvcl9jb2RlKSkgXAotICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU7IFwKLSAgXAotICBBU0lPX0hBTkRMRVJfVFlQRV9SRVFVSVJFTUVOVFNfQVNTRVJUKCBcCi0gICAgICBzaXplb2YoYXNpbzo6ZGV0YWlsOjpvbmVfYXJnX2hhbmRsZXJfdGVzdCggXAotICAgICAgICAgIGFzaW86OmRldGFpbDo6Y2x2cmVmPCBcCi0gICAgICAgICAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlPigpLCBcCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXNpbzo6ZXJyb3JfY29kZSo+KDApKSkgPT0gMSwgXAotICAgICAgIkFjY2VwdEhhbmRsZXIgdHlwZSByZXF1aXJlbWVudHMgbm90IG1ldCIpIFwKLSAgXAotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6aGFuZGxlcl90eXBlX3JlcXVpcmVtZW50czwgXAotICAgICAgc2l6ZW9mKCBcCi0gICAgICAgIGFzaW86OmRldGFpbDo6YXJnYnl2KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCkpKSArIFwKLSAgICAgIHNpemVvZiggXAotICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPCBcCi0gICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSggXAotICAgICAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjxjb25zdCBhc2lvOjplcnJvcl9jb2RlPigpKSwgXAotICAgICAgICBjaGFyKDApKT4gQVNJT19VTlVTRURfVFlQRURFRgotCi0jZGVmaW5lIEFTSU9fQ09OTkVDVF9IQU5ETEVSX0NIRUNLKCBcCi0gICAgaGFuZGxlcl90eXBlLCBoYW5kbGVyKSBcCi0gIFwKLSAgdHlwZWRlZiBBU0lPX0hBTkRMRVJfVFlQRShoYW5kbGVyX3R5cGUsIFwKLSAgICAgIHZvaWQoYXNpbzo6ZXJyb3JfY29kZSkpIFwKLSAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlOyBcCi0gIFwKLSAgQVNJT19IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTX0FTU0VSVCggXAotICAgICAgc2l6ZW9mKGFzaW86OmRldGFpbDo6b25lX2FyZ19oYW5kbGVyX3Rlc3QoIFwKLSAgICAgICAgICBhc2lvOjpkZXRhaWw6OmNsdnJlZjwgXAotICAgICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSwgXAotICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGFzaW86OmVycm9yX2NvZGUqPigwKSkpID09IDEsIFwKLSAgICAgICJDb25uZWN0SGFuZGxlciB0eXBlIHJlcXVpcmVtZW50cyBub3QgbWV0IikgXAotICBcCi0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjpoYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzPCBcCi0gICAgICBzaXplb2YoIFwKLSAgICAgICAgYXNpbzo6ZGV0YWlsOjphcmdieXYoIFwKLSAgICAgICAgICBhc2lvOjpkZXRhaWw6OmNsdnJlZjwgXAotICAgICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSkpICsgXAotICAgICAgc2l6ZW9mKCBcCi0gICAgICAgIGFzaW86OmRldGFpbDo6bHZyZWY8IFwKLSAgICAgICAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlPigpKCBcCi0gICAgICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPGNvbnN0IGFzaW86OmVycm9yX2NvZGU+KCkpLCBcCi0gICAgICAgIGNoYXIoMCkpPiBBU0lPX1VOVVNFRF9UWVBFREVGCi0KLSNkZWZpbmUgQVNJT19DT01QT1NFRF9DT05ORUNUX0hBTkRMRVJfQ0hFQ0soIFwKLSAgICBoYW5kbGVyX3R5cGUsIGhhbmRsZXIsIGl0ZXJfdHlwZSkgXAotICBcCi0gIHR5cGVkZWYgQVNJT19IQU5ETEVSX1RZUEUoaGFuZGxlcl90eXBlLCBcCi0gICAgICB2b2lkKGFzaW86OmVycm9yX2NvZGUsIGl0ZXJfdHlwZSkpIFwKLSAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlOyBcCi0gIFwKLSAgQVNJT19IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTX0FTU0VSVCggXAotICAgICAgc2l6ZW9mKGFzaW86OmRldGFpbDo6dHdvX2FyZ19oYW5kbGVyX3Rlc3QoIFwKLSAgICAgICAgICBhc2lvOjpkZXRhaWw6OmNsdnJlZjwgXAotICAgICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSwgXAotICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGFzaW86OmVycm9yX2NvZGUqPigwKSwgXAotICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGl0ZXJfdHlwZSo+KDApKSkgPT0gMSwgXAotICAgICAgIkNvbXBvc2VkQ29ubmVjdEhhbmRsZXIgdHlwZSByZXF1aXJlbWVudHMgbm90IG1ldCIpIFwKLSAgXAotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6aGFuZGxlcl90eXBlX3JlcXVpcmVtZW50czwgXAotICAgICAgc2l6ZW9mKCBcCi0gICAgICAgIGFzaW86OmRldGFpbDo6YXJnYnl2KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCkpKSArIFwKLSAgICAgIHNpemVvZiggXAotICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPCBcCi0gICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSggXAotICAgICAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjxjb25zdCBhc2lvOjplcnJvcl9jb2RlPigpLCBcCi0gICAgICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPGNvbnN0IGl0ZXJfdHlwZT4oKSksIFwKLSAgICAgICAgY2hhcigwKSk+IEFTSU9fVU5VU0VEX1RZUEVERUYKLQotI2RlZmluZSBBU0lPX1JFU09MVkVfSEFORExFUl9DSEVDSyggXAotICAgIGhhbmRsZXJfdHlwZSwgaGFuZGxlciwgaXRlcl90eXBlKSBcCi0gIFwKLSAgdHlwZWRlZiBBU0lPX0hBTkRMRVJfVFlQRShoYW5kbGVyX3R5cGUsIFwKLSAgICAgIHZvaWQoYXNpbzo6ZXJyb3JfY29kZSwgaXRlcl90eXBlKSkgXAotICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU7IFwKLSAgXAotICBBU0lPX0hBTkRMRVJfVFlQRV9SRVFVSVJFTUVOVFNfQVNTRVJUKCBcCi0gICAgICBzaXplb2YoYXNpbzo6ZGV0YWlsOjp0d29fYXJnX2hhbmRsZXJfdGVzdCggXAotICAgICAgICAgIGFzaW86OmRldGFpbDo6Y2x2cmVmPCBcCi0gICAgICAgICAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlPigpLCBcCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXNpbzo6ZXJyb3JfY29kZSo+KDApLCBcCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgaXRlcl90eXBlKj4oMCkpKSA9PSAxLCBcCi0gICAgICAiUmVzb2x2ZUhhbmRsZXIgdHlwZSByZXF1aXJlbWVudHMgbm90IG1ldCIpIFwKLSAgXAotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6aGFuZGxlcl90eXBlX3JlcXVpcmVtZW50czwgXAotICAgICAgc2l6ZW9mKCBcCi0gICAgICAgIGFzaW86OmRldGFpbDo6YXJnYnl2KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCkpKSArIFwKLSAgICAgIHNpemVvZiggXAotICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPCBcCi0gICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSggXAotICAgICAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjxjb25zdCBhc2lvOjplcnJvcl9jb2RlPigpLCBcCi0gICAgICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPGNvbnN0IGl0ZXJfdHlwZT4oKSksIFwKLSAgICAgICAgY2hhcigwKSk+IEFTSU9fVU5VU0VEX1RZUEVERUYKLQotI2RlZmluZSBBU0lPX1dBSVRfSEFORExFUl9DSEVDSyggXAotICAgIGhhbmRsZXJfdHlwZSwgaGFuZGxlcikgXAotICBcCi0gIHR5cGVkZWYgQVNJT19IQU5ETEVSX1RZUEUoaGFuZGxlcl90eXBlLCBcCi0gICAgICB2b2lkKGFzaW86OmVycm9yX2NvZGUpKSBcCi0gICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZTsgXAotICBcCi0gIEFTSU9fSEFORExFUl9UWVBFX1JFUVVJUkVNRU5UU19BU1NFUlQoIFwKLSAgICAgIHNpemVvZihhc2lvOjpkZXRhaWw6Om9uZV9hcmdfaGFuZGxlcl90ZXN0KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCksIFwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhc2lvOjplcnJvcl9jb2RlKj4oMCkpKSA9PSAxLCBcCi0gICAgICAiV2FpdEhhbmRsZXIgdHlwZSByZXF1aXJlbWVudHMgbm90IG1ldCIpIFwKLSAgXAotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6aGFuZGxlcl90eXBlX3JlcXVpcmVtZW50czwgXAotICAgICAgc2l6ZW9mKCBcCi0gICAgICAgIGFzaW86OmRldGFpbDo6YXJnYnl2KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCkpKSArIFwKLSAgICAgIHNpemVvZiggXAotICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPCBcCi0gICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSggXAotICAgICAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjxjb25zdCBhc2lvOjplcnJvcl9jb2RlPigpKSwgXAotICAgICAgICBjaGFyKDApKT4gQVNJT19VTlVTRURfVFlQRURFRgotCi0jZGVmaW5lIEFTSU9fU0lHTkFMX0hBTkRMRVJfQ0hFQ0soIFwKLSAgICBoYW5kbGVyX3R5cGUsIGhhbmRsZXIpIFwKLSAgXAotICB0eXBlZGVmIEFTSU9fSEFORExFUl9UWVBFKGhhbmRsZXJfdHlwZSwgXAotICAgICAgdm9pZChhc2lvOjplcnJvcl9jb2RlLCBpbnQpKSBcCi0gICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZTsgXAotICBcCi0gIEFTSU9fSEFORExFUl9UWVBFX1JFUVVJUkVNRU5UU19BU1NFUlQoIFwKLSAgICAgIHNpemVvZihhc2lvOjpkZXRhaWw6OnR3b19hcmdfaGFuZGxlcl90ZXN0KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCksIFwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhc2lvOjplcnJvcl9jb2RlKj4oMCksIFwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBpbnQqPigwKSkpID09IDEsIFwKLSAgICAgICJTaWduYWxIYW5kbGVyIHR5cGUgcmVxdWlyZW1lbnRzIG5vdCBtZXQiKSBcCi0gIFwKLSAgdHlwZWRlZiBhc2lvOjpkZXRhaWw6OmhhbmRsZXJfdHlwZV9yZXF1aXJlbWVudHM8IFwKLSAgICAgIHNpemVvZiggXAotICAgICAgICBhc2lvOjpkZXRhaWw6OmFyZ2J5diggXAotICAgICAgICAgIGFzaW86OmRldGFpbDo6Y2x2cmVmPCBcCi0gICAgICAgICAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlPigpKSkgKyBcCi0gICAgICBzaXplb2YoIFwKLSAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjwgXAotICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCkoIFwKLSAgICAgICAgICAgIGFzaW86OmRldGFpbDo6bHZyZWY8Y29uc3QgYXNpbzo6ZXJyb3JfY29kZT4oKSwgXAotICAgICAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjxjb25zdCBpbnQ+KCkpLCBcCi0gICAgICAgIGNoYXIoMCkpPiBBU0lPX1VOVVNFRF9UWVBFREVGCi0KLSNkZWZpbmUgQVNJT19IQU5EU0hBS0VfSEFORExFUl9DSEVDSyggXAotICAgIGhhbmRsZXJfdHlwZSwgaGFuZGxlcikgXAotICBcCi0gIHR5cGVkZWYgQVNJT19IQU5ETEVSX1RZUEUoaGFuZGxlcl90eXBlLCBcCi0gICAgICB2b2lkKGFzaW86OmVycm9yX2NvZGUpKSBcCi0gICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZTsgXAotICBcCi0gIEFTSU9fSEFORExFUl9UWVBFX1JFUVVJUkVNRU5UU19BU1NFUlQoIFwKLSAgICAgIHNpemVvZihhc2lvOjpkZXRhaWw6Om9uZV9hcmdfaGFuZGxlcl90ZXN0KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCksIFwKLSAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhc2lvOjplcnJvcl9jb2RlKj4oMCkpKSA9PSAxLCBcCi0gICAgICAiSGFuZHNoYWtlSGFuZGxlciB0eXBlIHJlcXVpcmVtZW50cyBub3QgbWV0IikgXAotICBcCi0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjpoYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzPCBcCi0gICAgICBzaXplb2YoIFwKLSAgICAgICAgYXNpbzo6ZGV0YWlsOjphcmdieXYoIFwKLSAgICAgICAgICBhc2lvOjpkZXRhaWw6OmNsdnJlZjwgXAotICAgICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSkpICsgXAotICAgICAgc2l6ZW9mKCBcCi0gICAgICAgIGFzaW86OmRldGFpbDo6bHZyZWY8IFwKLSAgICAgICAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlPigpKCBcCi0gICAgICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPGNvbnN0IGFzaW86OmVycm9yX2NvZGU+KCkpLCBcCi0gICAgICAgIGNoYXIoMCkpPiBBU0lPX1VOVVNFRF9UWVBFREVGCi0KLSNkZWZpbmUgQVNJT19CVUZGRVJFRF9IQU5EU0hBS0VfSEFORExFUl9DSEVDSyggXAotICAgIGhhbmRsZXJfdHlwZSwgaGFuZGxlcikgXAotICBcCi0gIHR5cGVkZWYgQVNJT19IQU5ETEVSX1RZUEUoaGFuZGxlcl90eXBlLCBcCi0gICAgICB2b2lkKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkgXAotICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU7IFwKLSAgXAotICBBU0lPX0hBTkRMRVJfVFlQRV9SRVFVSVJFTUVOVFNfQVNTRVJUKCBcCi0gICAgICBzaXplb2YoYXNpbzo6ZGV0YWlsOjp0d29fYXJnX2hhbmRsZXJfdGVzdCggXAotICAgICAgICAgIGFzaW86OmRldGFpbDo6Y2x2cmVmPCBcCi0gICAgICAgICAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlPigpLCBcCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXNpbzo6ZXJyb3JfY29kZSo+KDApLCBcCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzaXplX3QqPigwKSkpID09IDEsIFwKLSAgICAgICJCdWZmZXJlZEhhbmRzaGFrZUhhbmRsZXIgdHlwZSByZXF1aXJlbWVudHMgbm90IG1ldCIpIFwKLSAgXAotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6aGFuZGxlcl90eXBlX3JlcXVpcmVtZW50czwgXAotICAgICAgc2l6ZW9mKCBcCi0gICAgICAgIGFzaW86OmRldGFpbDo6YXJnYnl2KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCkpKSArIFwKLSAgICAgIHNpemVvZiggXAotICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPCBcCi0gICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSggXAotICAgICAgICAgIGFzaW86OmRldGFpbDo6bHZyZWY8Y29uc3QgYXNpbzo6ZXJyb3JfY29kZT4oKSwgXAotICAgICAgICAgIGFzaW86OmRldGFpbDo6bHZyZWY8Y29uc3Qgc3RkOjpzaXplX3Q+KCkpLCBcCi0gICAgICAgIGNoYXIoMCkpPiBBU0lPX1VOVVNFRF9UWVBFREVGCi0KLSNkZWZpbmUgQVNJT19TSFVURE9XTl9IQU5ETEVSX0NIRUNLKCBcCi0gICAgaGFuZGxlcl90eXBlLCBoYW5kbGVyKSBcCi0gIFwKLSAgdHlwZWRlZiBBU0lPX0hBTkRMRVJfVFlQRShoYW5kbGVyX3R5cGUsIFwKLSAgICAgIHZvaWQoYXNpbzo6ZXJyb3JfY29kZSkpIFwKLSAgICBhc2lvX3RydWVfaGFuZGxlcl90eXBlOyBcCi0gIFwKLSAgQVNJT19IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTX0FTU0VSVCggXAotICAgICAgc2l6ZW9mKGFzaW86OmRldGFpbDo6b25lX2FyZ19oYW5kbGVyX3Rlc3QoIFwKLSAgICAgICAgICBhc2lvOjpkZXRhaWw6OmNsdnJlZjwgXAotICAgICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSwgXAotICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGFzaW86OmVycm9yX2NvZGUqPigwKSkpID09IDEsIFwKLSAgICAgICJTaHV0ZG93bkhhbmRsZXIgdHlwZSByZXF1aXJlbWVudHMgbm90IG1ldCIpIFwKLSAgXAotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6aGFuZGxlcl90eXBlX3JlcXVpcmVtZW50czwgXAotICAgICAgc2l6ZW9mKCBcCi0gICAgICAgIGFzaW86OmRldGFpbDo6YXJnYnl2KCBcCi0gICAgICAgICAgYXNpbzo6ZGV0YWlsOjpjbHZyZWY8IFwKLSAgICAgICAgICAgIGFzaW9fdHJ1ZV9oYW5kbGVyX3R5cGU+KCkpKSArIFwKLSAgICAgIHNpemVvZiggXAotICAgICAgICBhc2lvOjpkZXRhaWw6Omx2cmVmPCBcCi0gICAgICAgICAgYXNpb190cnVlX2hhbmRsZXJfdHlwZT4oKSggXAotICAgICAgICAgICAgYXNpbzo6ZGV0YWlsOjpsdnJlZjxjb25zdCBhc2lvOjplcnJvcl9jb2RlPigpKSwgXAotICAgICAgICBjaGFyKDApKT4gQVNJT19VTlVTRURfVFlQRURFRgotCi0jZWxzZSAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTKQotCi0jZGVmaW5lIEFTSU9fQ09NUExFVElPTl9IQU5ETEVSX0NIRUNLKCBcCi0gICAgaGFuZGxlcl90eXBlLCBoYW5kbGVyKSBcCi0gIHR5cGVkZWYgaW50IEFTSU9fVU5VU0VEX1RZUEVERUYKLQotI2RlZmluZSBBU0lPX1JFQURfSEFORExFUl9DSEVDSyggXAotICAgIGhhbmRsZXJfdHlwZSwgaGFuZGxlcikgXAotICB0eXBlZGVmIGludCBBU0lPX1VOVVNFRF9UWVBFREVGCi0KLSNkZWZpbmUgQVNJT19XUklURV9IQU5ETEVSX0NIRUNLKCBcCi0gICAgaGFuZGxlcl90eXBlLCBoYW5kbGVyKSBcCi0gIHR5cGVkZWYgaW50IEFTSU9fVU5VU0VEX1RZUEVERUYKLQotI2RlZmluZSBBU0lPX0FDQ0VQVF9IQU5ETEVSX0NIRUNLKCBcCi0gICAgaGFuZGxlcl90eXBlLCBoYW5kbGVyKSBcCi0gIHR5cGVkZWYgaW50IEFTSU9fVU5VU0VEX1RZUEVERUYKLQotI2RlZmluZSBBU0lPX0NPTk5FQ1RfSEFORExFUl9DSEVDSyggXAotICAgIGhhbmRsZXJfdHlwZSwgaGFuZGxlcikgXAotICB0eXBlZGVmIGludCBBU0lPX1VOVVNFRF9UWVBFREVGCi0KLSNkZWZpbmUgQVNJT19DT01QT1NFRF9DT05ORUNUX0hBTkRMRVJfQ0hFQ0soIFwKLSAgICBoYW5kbGVyX3R5cGUsIGhhbmRsZXIsIGl0ZXJfdHlwZSkgXAotICB0eXBlZGVmIGludCBBU0lPX1VOVVNFRF9UWVBFREVGCi0KLSNkZWZpbmUgQVNJT19SRVNPTFZFX0hBTkRMRVJfQ0hFQ0soIFwKLSAgICBoYW5kbGVyX3R5cGUsIGhhbmRsZXIsIGl0ZXJfdHlwZSkgXAotICB0eXBlZGVmIGludCBBU0lPX1VOVVNFRF9UWVBFREVGCi0KLSNkZWZpbmUgQVNJT19XQUlUX0hBTkRMRVJfQ0hFQ0soIFwKLSAgICBoYW5kbGVyX3R5cGUsIGhhbmRsZXIpIFwKLSAgdHlwZWRlZiBpbnQgQVNJT19VTlVTRURfVFlQRURFRgotCi0jZGVmaW5lIEFTSU9fU0lHTkFMX0hBTkRMRVJfQ0hFQ0soIFwKLSAgICBoYW5kbGVyX3R5cGUsIGhhbmRsZXIpIFwKLSAgdHlwZWRlZiBpbnQgQVNJT19VTlVTRURfVFlQRURFRgotCi0jZGVmaW5lIEFTSU9fSEFORFNIQUtFX0hBTkRMRVJfQ0hFQ0soIFwKLSAgICBoYW5kbGVyX3R5cGUsIGhhbmRsZXIpIFwKLSAgdHlwZWRlZiBpbnQgQVNJT19VTlVTRURfVFlQRURFRgotCi0jZGVmaW5lIEFTSU9fQlVGRkVSRURfSEFORFNIQUtFX0hBTkRMRVJfQ0hFQ0soIFwKLSAgICBoYW5kbGVyX3R5cGUsIGhhbmRsZXIpIFwKLSAgdHlwZWRlZiBpbnQgQVNJT19VTlVTRURfVFlQRURFRgotCi0jZGVmaW5lIEFTSU9fU0hVVERPV05fSEFORExFUl9DSEVDSyggXAotICAgIGhhbmRsZXJfdHlwZSwgaGFuZGxlcikgXAotICB0eXBlZGVmIGludCBBU0lPX1VOVVNFRF9UWVBFREVGCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9IQU5ETEVSX1RZUEVfUkVRVUlSRU1FTlRTKQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0hBTkRMRVJfVFlQRV9SRVFVSVJFTUVOVFNfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2hhc2hfbWFwLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaGFzaF9tYXAuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTFiNTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaGFzaF9tYXAuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaGFzaF9tYXAuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0hBU0hfTUFQX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9IQVNIX01BUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYXNzZXJ0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotaW5saW5lIHN0ZDo6c2l6ZV90IGNhbGN1bGF0ZV9oYXNoX3ZhbHVlKGludCBpKQotewotICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KGkpOwotfQotCi1pbmxpbmUgc3RkOjpzaXplX3QgY2FsY3VsYXRlX2hhc2hfdmFsdWUodm9pZCogcCkKLXsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaXplX3Q+KHApCi0gICAgKyAocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNpemVfdD4ocCkgPj4gMyk7Ci19Ci0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotaW5saW5lIHN0ZDo6c2l6ZV90IGNhbGN1bGF0ZV9oYXNoX3ZhbHVlKFNPQ0tFVCBzKQotewotICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHMpOwotfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLS8vIE5vdGU6IGFzc3VtZXMgSyBhbmQgViBhcmUgUE9EIHR5cGVzLgotdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1jbGFzcyBoYXNoX21hcAotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8gVGhlIHR5cGUgb2YgYSB2YWx1ZSBpbiB0aGUgbWFwLgotICB0eXBlZGVmIHN0ZDo6cGFpcjxLLCBWPiB2YWx1ZV90eXBlOwotCi0gIC8vIFRoZSB0eXBlIG9mIGEgbm9uLWNvbnN0IGl0ZXJhdG9yIG92ZXIgdGhlIGhhc2ggbWFwLgotICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bGlzdDx2YWx1ZV90eXBlPjo6aXRlcmF0b3IgaXRlcmF0b3I7Ci0KLSAgLy8gVGhlIHR5cGUgb2YgYSBjb25zdCBpdGVyYXRvciBvdmVyIHRoZSBoYXNoIG1hcC4KLSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Omxpc3Q8dmFsdWVfdHlwZT46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBoYXNoX21hcCgpCi0gICAgOiBzaXplXygwKSwKLSAgICAgIGJ1Y2tldHNfKDApLAotICAgICAgbnVtX2J1Y2tldHNfKDApCi0gIHsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IuCi0gIH5oYXNoX21hcCgpCi0gIHsKLSAgICBkZWxldGVbXSBidWNrZXRzXzsKLSAgfQotCi0gIC8vIEdldCBhbiBpdGVyYXRvciBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFwLgotICBpdGVyYXRvciBiZWdpbigpCi0gIHsKLSAgICByZXR1cm4gdmFsdWVzXy5iZWdpbigpOwotICB9Ci0KLSAgLy8gR2V0IGFuIGl0ZXJhdG9yIGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYXAuCi0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QKLSAgewotICAgIHJldHVybiB2YWx1ZXNfLmJlZ2luKCk7Ci0gIH0KLQotICAvLyBHZXQgYW4gaXRlcmF0b3IgZm9yIHRoZSBlbmQgb2YgdGhlIG1hcC4KLSAgaXRlcmF0b3IgZW5kKCkKLSAgewotICAgIHJldHVybiB2YWx1ZXNfLmVuZCgpOwotICB9Ci0KLSAgLy8gR2V0IGFuIGl0ZXJhdG9yIGZvciB0aGUgZW5kIG9mIHRoZSBtYXAuCi0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdmFsdWVzXy5lbmQoKTsKLSAgfQotCi0gIC8vIENoZWNrIHdoZXRoZXIgdGhlIG1hcCBpcyBlbXB0eS4KLSAgYm9vbCBlbXB0eSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdmFsdWVzXy5lbXB0eSgpOwotICB9Ci0KLSAgLy8gRmluZCBhbiBlbnRyeSBpbiB0aGUgbWFwLgotICBpdGVyYXRvciBmaW5kKGNvbnN0IEsmIGspCi0gIHsKLSAgICBpZiAobnVtX2J1Y2tldHNfKQotICAgIHsKLSAgICAgIHNpemVfdCBidWNrZXQgPSBjYWxjdWxhdGVfaGFzaF92YWx1ZShrKSAlIG51bV9idWNrZXRzXzsKLSAgICAgIGl0ZXJhdG9yIGl0ID0gYnVja2V0c19bYnVja2V0XS5maXJzdDsKLSAgICAgIGlmIChpdCA9PSB2YWx1ZXNfLmVuZCgpKQotICAgICAgICByZXR1cm4gdmFsdWVzXy5lbmQoKTsKLSAgICAgIGl0ZXJhdG9yIGVuZF9pdCA9IGJ1Y2tldHNfW2J1Y2tldF0ubGFzdDsKLSAgICAgICsrZW5kX2l0OwotICAgICAgd2hpbGUgKGl0ICE9IGVuZF9pdCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGl0LT5maXJzdCA9PSBrKQotICAgICAgICAgIHJldHVybiBpdDsKLSAgICAgICAgKytpdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlc18uZW5kKCk7Ci0gIH0KLQotICAvLyBGaW5kIGFuIGVudHJ5IGluIHRoZSBtYXAuCi0gIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgSyYgaykgY29uc3QKLSAgewotICAgIGlmIChudW1fYnVja2V0c18pCi0gICAgewotICAgICAgc2l6ZV90IGJ1Y2tldCA9IGNhbGN1bGF0ZV9oYXNoX3ZhbHVlKGspICUgbnVtX2J1Y2tldHNfOwotICAgICAgY29uc3RfaXRlcmF0b3IgaXQgPSBidWNrZXRzX1tidWNrZXRdLmZpcnN0OwotICAgICAgaWYgKGl0ID09IHZhbHVlc18uZW5kKCkpCi0gICAgICAgIHJldHVybiBpdDsKLSAgICAgIGNvbnN0X2l0ZXJhdG9yIGVuZF9pdCA9IGJ1Y2tldHNfW2J1Y2tldF0ubGFzdDsKLSAgICAgICsrZW5kX2l0OwotICAgICAgd2hpbGUgKGl0ICE9IGVuZF9pdCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGl0LT5maXJzdCA9PSBrKQotICAgICAgICAgIHJldHVybiBpdDsKLSAgICAgICAgKytpdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlc18uZW5kKCk7Ci0gIH0KLQotICAvLyBJbnNlcnQgYSBuZXcgZW50cnkgaW50byB0aGUgbWFwLgotICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChjb25zdCB2YWx1ZV90eXBlJiB2KQotICB7Ci0gICAgaWYgKHNpemVfICsgMSA+PSBudW1fYnVja2V0c18pCi0gICAgICByZWhhc2goaGFzaF9zaXplKHNpemVfICsgMSkpOwotICAgIHNpemVfdCBidWNrZXQgPSBjYWxjdWxhdGVfaGFzaF92YWx1ZSh2LmZpcnN0KSAlIG51bV9idWNrZXRzXzsKLSAgICBpdGVyYXRvciBpdCA9IGJ1Y2tldHNfW2J1Y2tldF0uZmlyc3Q7Ci0gICAgaWYgKGl0ID09IHZhbHVlc18uZW5kKCkpCi0gICAgewotICAgICAgYnVja2V0c19bYnVja2V0XS5maXJzdCA9IGJ1Y2tldHNfW2J1Y2tldF0ubGFzdCA9Ci0gICAgICAgIHZhbHVlc19pbnNlcnQodmFsdWVzXy5lbmQoKSwgdik7Ci0gICAgICArK3NpemVfOwotICAgICAgcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oYnVja2V0c19bYnVja2V0XS5sYXN0LCB0cnVlKTsKLSAgICB9Ci0gICAgaXRlcmF0b3IgZW5kX2l0ID0gYnVja2V0c19bYnVja2V0XS5sYXN0OwotICAgICsrZW5kX2l0OwotICAgIHdoaWxlIChpdCAhPSBlbmRfaXQpCi0gICAgewotICAgICAgaWYgKGl0LT5maXJzdCA9PSB2LmZpcnN0KQotICAgICAgICByZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdCwgZmFsc2UpOwotICAgICAgKytpdDsKLSAgICB9Ci0gICAgYnVja2V0c19bYnVja2V0XS5sYXN0ID0gdmFsdWVzX2luc2VydChlbmRfaXQsIHYpOwotICAgICsrc2l6ZV87Ci0gICAgcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oYnVja2V0c19bYnVja2V0XS5sYXN0LCB0cnVlKTsKLSAgfQotCi0gIC8vIEVyYXNlIGFuIGVudHJ5IGZyb20gdGhlIG1hcC4KLSAgdm9pZCBlcmFzZShpdGVyYXRvciBpdCkKLSAgewotICAgIEFTSU9fQVNTRVJUKGl0ICE9IHZhbHVlc18uZW5kKCkpOwotICAgIEFTSU9fQVNTRVJUKG51bV9idWNrZXRzXyAhPSAwKTsKLQotICAgIHNpemVfdCBidWNrZXQgPSBjYWxjdWxhdGVfaGFzaF92YWx1ZShpdC0+Zmlyc3QpICUgbnVtX2J1Y2tldHNfOwotICAgIGJvb2wgaXNfZmlyc3QgPSAoaXQgPT0gYnVja2V0c19bYnVja2V0XS5maXJzdCk7Ci0gICAgYm9vbCBpc19sYXN0ID0gKGl0ID09IGJ1Y2tldHNfW2J1Y2tldF0ubGFzdCk7Ci0gICAgaWYgKGlzX2ZpcnN0ICYmIGlzX2xhc3QpCi0gICAgICBidWNrZXRzX1tidWNrZXRdLmZpcnN0ID0gYnVja2V0c19bYnVja2V0XS5sYXN0ID0gdmFsdWVzXy5lbmQoKTsKLSAgICBlbHNlIGlmIChpc19maXJzdCkKLSAgICAgICsrYnVja2V0c19bYnVja2V0XS5maXJzdDsKLSAgICBlbHNlIGlmIChpc19sYXN0KQotICAgICAgLS1idWNrZXRzX1tidWNrZXRdLmxhc3Q7Ci0KLSAgICB2YWx1ZXNfZXJhc2UoaXQpOwotICAgIC0tc2l6ZV87Ci0gIH0KLQotICAvLyBFcmFzZSBhIGtleSBmcm9tIHRoZSBtYXAuCi0gIHZvaWQgZXJhc2UoY29uc3QgSyYgaykKLSAgewotICAgIGl0ZXJhdG9yIGl0ID0gZmluZChrKTsKLSAgICBpZiAoaXQgIT0gdmFsdWVzXy5lbmQoKSkKLSAgICAgIGVyYXNlKGl0KTsKLSAgfQotCi0gIC8vIFJlbW92ZSBhbGwgZW50cmllcyBmcm9tIHRoZSBtYXAuCi0gIHZvaWQgY2xlYXIoKQotICB7Ci0gICAgLy8gQ2xlYXIgdGhlIHZhbHVlcy4KLSAgICB2YWx1ZXNfLmNsZWFyKCk7Ci0gICAgc2l6ZV8gPSAwOwotCi0gICAgLy8gSW5pdGlhbGlzZSBhbGwgYnVja2V0cyB0byBlbXB0eS4KLSAgICBpdGVyYXRvciBlbmRfaXQgPSB2YWx1ZXNfLmVuZCgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2J1Y2tldHNfOyArK2kpCi0gICAgICBidWNrZXRzX1tpXS5maXJzdCA9IGJ1Y2tldHNfW2ldLmxhc3QgPSBlbmRfaXQ7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gQ2FsY3VsYXRlIHRoZSBoYXNoIHNpemUgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgotICBzdGF0aWMgc3RkOjpzaXplX3QgaGFzaF9zaXplKHN0ZDo6c2l6ZV90IG51bV9lbGVtcykKLSAgewotICAgIHN0YXRpYyBzdGQ6OnNpemVfdCBzaXplc1tdID0KLSAgICB7Ci0jaWYgZGVmaW5lZChBU0lPX0hBU0hfTUFQX0JVQ0tFVFMpCi0gICAgICBBU0lPX0hBU0hfTUFQX0JVQ0tFVFMKLSNlbHNlIC8vIEFTSU9fSEFTSF9NQVBfQlVDS0VUUwotICAgICAgMywgMTMsIDIzLCA1MywgOTcsIDE5MywgMzg5LCA3NjksIDE1NDMsIDMwNzksIDYxNTEsIDEyMjg5LCAyNDU5MywKLSAgICAgIDQ5MTU3LCA5ODMxNywgMTk2NjEzLCAzOTMyNDEsIDc4NjQzMywgMTU3Mjg2OSwgMzE0NTczOSwgNjI5MTQ2OSwKLSAgICAgIDEyNTgyOTE3LCAyNTE2NTg0MwotI2VuZGlmIC8vIEFTSU9fSEFTSF9NQVBfQlVDS0VUUwotICAgIH07Ci0gICAgY29uc3Qgc3RkOjpzaXplX3QgbnRoX3NpemUgPSBzaXplb2Yoc2l6ZXMpIC8gc2l6ZW9mKHN0ZDo6c2l6ZV90KSAtIDE7Ci0gICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG50aF9zaXplOyArK2kpCi0gICAgICBpZiAobnVtX2VsZW1zIDwgc2l6ZXNbaV0pCi0gICAgICAgIHJldHVybiBzaXplc1tpXTsKLSAgICByZXR1cm4gc2l6ZXNbbnRoX3NpemVdOwotICB9Ci0KLSAgLy8gUmUtaW5pdGlhbGlzZSB0aGUgaGFzaCBmcm9tIHRoZSB2YWx1ZXMgYWxyZWFkeSBjb250YWluZWQgaW4gdGhlIGxpc3QuCi0gIHZvaWQgcmVoYXNoKHN0ZDo6c2l6ZV90IG51bV9idWNrZXRzKQotICB7Ci0gICAgaWYgKG51bV9idWNrZXRzID09IG51bV9idWNrZXRzXykKLSAgICAgIHJldHVybjsKLSAgICBudW1fYnVja2V0c18gPSBudW1fYnVja2V0czsKLSAgICBBU0lPX0FTU0VSVChudW1fYnVja2V0c18gIT0gMCk7Ci0KLSAgICBpdGVyYXRvciBlbmRfaXRlciA9IHZhbHVlc18uZW5kKCk7Ci0KLSAgICAvLyBVcGRhdGUgbnVtYmVyIG9mIGJ1Y2tldHMgYW5kIGluaXRpYWxpc2UgYWxsIGJ1Y2tldHMgdG8gZW1wdHkuCi0gICAgYnVja2V0X3R5cGUqIHRtcCA9IG5ldyBidWNrZXRfdHlwZVtudW1fYnVja2V0c19dOwotICAgIGRlbGV0ZVtdIGJ1Y2tldHNfOwotICAgIGJ1Y2tldHNfID0gdG1wOwotICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBudW1fYnVja2V0c187ICsraSkKLSAgICAgIGJ1Y2tldHNfW2ldLmZpcnN0ID0gYnVja2V0c19baV0ubGFzdCA9IGVuZF9pdGVyOwotCi0gICAgLy8gUHV0IGFsbCB2YWx1ZXMgYmFjayBpbnRvIHRoZSBoYXNoLgotICAgIGl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXNfLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ZXIgIT0gZW5kX2l0ZXIpCi0gICAgewotICAgICAgc3RkOjpzaXplX3QgYnVja2V0ID0gY2FsY3VsYXRlX2hhc2hfdmFsdWUoaXRlci0+Zmlyc3QpICUgbnVtX2J1Y2tldHNfOwotICAgICAgaWYgKGJ1Y2tldHNfW2J1Y2tldF0ubGFzdCA9PSBlbmRfaXRlcikKLSAgICAgIHsKLSAgICAgICAgYnVja2V0c19bYnVja2V0XS5maXJzdCA9IGJ1Y2tldHNfW2J1Y2tldF0ubGFzdCA9IGl0ZXIrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCsrYnVja2V0c19bYnVja2V0XS5sYXN0ID09IGl0ZXIpCi0gICAgICB7Ci0gICAgICAgICsraXRlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdmFsdWVzXy5zcGxpY2UoYnVja2V0c19bYnVja2V0XS5sYXN0LCB2YWx1ZXNfLCBpdGVyKyspOwotICAgICAgICAtLWJ1Y2tldHNfW2J1Y2tldF0ubGFzdDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBJbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSB2YWx1ZXMgbGlzdCBieSBzcGxpY2luZyBmcm9tIHRoZSBzcGFyZXMgbGlzdCwKLSAgLy8gaWYgYSBzcGFyZSBpcyBhdmFpbGFibGUsIGFuZCBvdGhlcndpc2UgYnkgaW5zZXJ0aW5nIGEgbmV3IGVsZW1lbnQuCi0gIGl0ZXJhdG9yIHZhbHVlc19pbnNlcnQoaXRlcmF0b3IgaXQsIGNvbnN0IHZhbHVlX3R5cGUmIHYpCi0gIHsKLSAgICBpZiAoc3BhcmVzXy5lbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiB2YWx1ZXNfLmluc2VydChpdCwgdik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzcGFyZXNfLmZyb250KCkgPSB2OwotICAgICAgdmFsdWVzXy5zcGxpY2UoaXQsIHNwYXJlc18sIHNwYXJlc18uYmVnaW4oKSk7Ci0gICAgICByZXR1cm4gLS1pdDsKLSAgICB9Ci0gIH0KLQotICAvLyBFcmFzZSBhbiBlbGVtZW50IGZyb20gdGhlIHZhbHVlcyBsaXN0IGJ5IHNwbGljaW5nIGl0IHRvIHRoZSBzcGFyZXMgbGlzdC4KLSAgdm9pZCB2YWx1ZXNfZXJhc2UoaXRlcmF0b3IgaXQpCi0gIHsKLSAgICAqaXQgPSB2YWx1ZV90eXBlKCk7Ci0gICAgc3BhcmVzXy5zcGxpY2Uoc3BhcmVzXy5iZWdpbigpLCB2YWx1ZXNfLCBpdCk7Ci0gIH0KLQotICAvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoYXNoLgotICBzdGQ6OnNpemVfdCBzaXplXzsKLQotICAvLyBUaGUgbGlzdCBvZiBhbGwgdmFsdWVzIGluIHRoZSBoYXNoIG1hcC4KLSAgc3RkOjpsaXN0PHZhbHVlX3R5cGU+IHZhbHVlc187Ci0KLSAgLy8gVGhlIGxpc3Qgb2Ygc3BhcmUgbm9kZXMgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4gQXNzdW1lcyB0aGF0IFBPRCB0eXBlcyBvbmx5Ci0gIC8vIGFyZSBzdG9yZWQgaW4gdGhlIGhhc2ggbWFwLgotICBzdGQ6Omxpc3Q8dmFsdWVfdHlwZT4gc3BhcmVzXzsKLQotICAvLyBUaGUgdHlwZSBmb3IgYSBidWNrZXQgaW4gdGhlIGhhc2ggdGFibGUuCi0gIHN0cnVjdCBidWNrZXRfdHlwZQotICB7Ci0gICAgaXRlcmF0b3IgZmlyc3Q7Ci0gICAgaXRlcmF0b3IgbGFzdDsKLSAgfTsKLQotICAvLyBUaGUgYnVja2V0cyBpbiB0aGUgaGFzaC4KLSAgYnVja2V0X3R5cGUqIGJ1Y2tldHNfOwotCi0gIC8vIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpbiB0aGUgaGFzaC4KLSAgc3RkOjpzaXplX3QgbnVtX2J1Y2tldHNfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9IQVNIX01BUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzI3NjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfQlVGRkVSX1NFUVVFTkNFX0FEQVBURVJfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfQlVGRkVSX1NFUVVFTkNFX0FEQVBURVJfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jaW5jbHVkZSA8cm9idWZmZXIuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLnN0b3JhZ2Uuc3RyZWFtcy5oPgotI2luY2x1ZGUgPHdybC9pbXBsZW1lbnRzLmg+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHdpbnJ0X2J1ZmZlcl9pbXBsIDoKLSAgcHVibGljIE1pY3Jvc29mdDo6V1JMOjpSdW50aW1lQ2xhc3M8Ci0gICAgTWljcm9zb2Z0OjpXUkw6OlJ1bnRpbWVDbGFzc0ZsYWdzPAotICAgICAgTWljcm9zb2Z0OjpXUkw6OlJ1bnRpbWVDbGFzc1R5cGU6OldpblJ0Q2xhc3NpY0NvbU1peD4sCi0gICAgQUJJOjpXaW5kb3dzOjpTdG9yYWdlOjpTdHJlYW1zOjpJQnVmZmVyLAotICAgIFdpbmRvd3M6OlN0b3JhZ2U6OlN0cmVhbXM6OklCdWZmZXJCeXRlQWNjZXNzPgotewotcHVibGljOgotICBleHBsaWNpdCB3aW5ydF9idWZmZXJfaW1wbChjb25zdCBhc2lvOjpjb25zdF9idWZmZXImIGIpCi0gIHsKLSAgICBieXRlc18gPSBjb25zdF9jYXN0PGJ5dGUqPihhc2lvOjpidWZmZXJfY2FzdDxjb25zdCBieXRlKj4oYikpOwotICAgIGxlbmd0aF8gPSBhc2lvOjpidWZmZXJfc2l6ZShiKTsKLSAgICBjYXBhY2l0eV8gPSBhc2lvOjpidWZmZXJfc2l6ZShiKTsKLSAgfQotCi0gIGV4cGxpY2l0IHdpbnJ0X2J1ZmZlcl9pbXBsKGNvbnN0IGFzaW86Om11dGFibGVfYnVmZmVyJiBiKQotICB7Ci0gICAgYnl0ZXNfID0gY29uc3RfY2FzdDxieXRlKj4oYXNpbzo6YnVmZmVyX2Nhc3Q8Y29uc3QgYnl0ZSo+KGIpKTsKLSAgICBsZW5ndGhfID0gMDsKLSAgICBjYXBhY2l0eV8gPSBhc2lvOjpidWZmZXJfc2l6ZShiKTsKLSAgfQotCi0gIH53aW5ydF9idWZmZXJfaW1wbCgpCi0gIHsKLSAgfQotCi0gIFNURE1FVEhPRElNUCBCdWZmZXIoYnl0ZSoqIHZhbHVlKQotICB7Ci0gICAgKnZhbHVlID0gYnl0ZXNfOwotICAgIHJldHVybiBTX09LOwotICB9Ci0KLSAgU1RETUVUSE9ESU1QIGdldF9DYXBhY2l0eShVSU5UMzIqIHZhbHVlKQotICB7Ci0gICAgKnZhbHVlID0gY2FwYWNpdHlfOwotICAgIHJldHVybiBTX09LOwotICB9Ci0KLSAgU1RETUVUSE9ESU1QIGdldF9MZW5ndGgoVUlOVDMyICp2YWx1ZSkKLSAgewotICAgICp2YWx1ZSA9IGxlbmd0aF87Ci0gICAgcmV0dXJuIFNfT0s7Ci0gIH0KLQotICBTVERNRVRIT0RJTVAgcHV0X0xlbmd0aChVSU5UMzIgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPiBjYXBhY2l0eV8pCi0gICAgICByZXR1cm4gRV9JTlZBTElEQVJHOwotICAgIGxlbmd0aF8gPSB2YWx1ZTsKLSAgICByZXR1cm4gU19PSzsKLSAgfQotCi1wcml2YXRlOgotICBieXRlKiBieXRlc187Ci0gIFVJTlQzMiBsZW5ndGhfOwotICBVSU5UMzIgY2FwYWNpdHlfOwotfTsKLQotdm9pZCBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcl9iYXNlOjppbml0X25hdGl2ZV9idWZmZXIoCi0gICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXJfYmFzZTo6bmF0aXZlX2J1ZmZlcl90eXBlJiBidWYsCi0gICAgY29uc3QgYXNpbzo6bXV0YWJsZV9idWZmZXImIGJ1ZmZlcikKLXsKLSAgc3RkOjptZW1zZXQoJmJ1ZiwgMCwgc2l6ZW9mKG5hdGl2ZV9idWZmZXJfdHlwZSkpOwotICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElJbnNwZWN0YWJsZT4gaW5zcAotICAgID0gTWljcm9zb2Z0OjpXUkw6Ok1ha2U8d2lucnRfYnVmZmVyX2ltcGw+KGJ1ZmZlcik7Ci0gIGJ1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8V2luZG93czo6U3RvcmFnZTo6U3RyZWFtczo6SUJ1ZmZlcl4+KGluc3AuR2V0KCkpOwotfQotCi12b2lkIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyX2Jhc2U6OmluaXRfbmF0aXZlX2J1ZmZlcigKLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcl9iYXNlOjpuYXRpdmVfYnVmZmVyX3R5cGUmIGJ1ZiwKLSAgICBjb25zdCBhc2lvOjpjb25zdF9idWZmZXImIGJ1ZmZlcikKLXsKLSAgc3RkOjptZW1zZXQoJmJ1ZiwgMCwgc2l6ZW9mKG5hdGl2ZV9idWZmZXJfdHlwZSkpOwotICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElJbnNwZWN0YWJsZT4gaW5zcAotICAgID0gTWljcm9zb2Z0OjpXUkw6Ok1ha2U8d2lucnRfYnVmZmVyX2ltcGw+KGJ1ZmZlcik7Ci0gIFBsYXRmb3JtOjpPYmplY3ReIGJ1Zl9vYmogPSByZWludGVycHJldF9jYXN0PFBsYXRmb3JtOjpPYmplY3RePihpbnNwLkdldCgpKTsKLSAgYnVmID0gcmVpbnRlcnByZXRfY2FzdDxXaW5kb3dzOjpTdG9yYWdlOjpTdHJlYW1zOjpJQnVmZmVyXj4oaW5zcC5HZXQoKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfQlVGRkVSX1NFUVVFTkNFX0FEQVBURVJfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvZGVzY3JpcHRvcl9vcHMuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL2Rlc2NyaXB0b3Jfb3BzLmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1YmYwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvZGVzY3JpcHRvcl9vcHMuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC9kZXNjcmlwdG9yX29wcy5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX0RFU0NSSVBUT1JfT1BTX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX0RFU0NSSVBUT1JfT1BTX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9kZXNjcmlwdG9yX29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpIFwKLSAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpIFwKLSAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotbmFtZXNwYWNlIGRlc2NyaXB0b3Jfb3BzIHsKLQotaW50IG9wZW4oY29uc3QgY2hhciogcGF0aCwgaW50IGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgZXJybm8gPSAwOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6Om9wZW4ocGF0aCwgZmxhZ3MpLCBlYyk7Ci0gIGlmIChyZXN1bHQgPj0gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IGNsb3NlKGludCBkLCBzdGF0ZV90eXBlJiBzdGF0ZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGludCByZXN1bHQgPSAwOwotICBpZiAoZCAhPSAtMSkKLSAgewotICAgIGVycm5vID0gMDsKLSAgICByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6Y2xvc2UoZCksIGVjKTsKLQotICAgIGlmIChyZXN1bHQgIT0gMAotICAgICAgICAmJiAoZWMgPT0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrCi0gICAgICAgICAgfHwgZWMgPT0gYXNpbzo6ZXJyb3I6OnRyeV9hZ2FpbikpCi0gICAgewotICAgICAgLy8gQWNjb3JkaW5nIHRvIFVOSVggTmV0d29yayBQcm9ncmFtbWluZyBWb2wuIDEsIGl0IGlzIHBvc3NpYmxlIGZvcgotICAgICAgLy8gY2xvc2UoKSB0byBmYWlsIHdpdGggRVdPVUxEQkxPQ0sgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLiBXaGF0Ci0gICAgICAvLyBpc24ndCBjbGVhciBpcyB0aGUgc3RhdGUgb2YgdGhlIGRlc2NyaXB0b3IgYWZ0ZXIgdGhpcyBlcnJvci4gVGhlIG9uZQotICAgICAgLy8gY3VycmVudCBPUyB3aGVyZSB0aGlzIGJlaGF2aW91ciBpcyBzZWVuLCBXaW5kb3dzLCBzYXlzIHRoYXQgdGhlIHNvY2tldAotICAgICAgLy8gcmVtYWlucyBvcGVuLiBUaGVyZWZvcmUgd2UnbGwgcHV0IHRoZSBkZXNjcmlwdG9yIGJhY2sgaW50byBibG9ja2luZwotICAgICAgLy8gbW9kZSBhbmQgaGF2ZSBhbm90aGVyIGF0dGVtcHQgYXQgY2xvc2luZyBpdC4KLSNpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0gICAgICBpbnQgZmxhZ3MgPSA6OmZjbnRsKGQsIEZfR0VURkwsIDApOwotICAgICAgaWYgKGZsYWdzID49IDApCi0gICAgICAgIDo6ZmNudGwoZCwgRl9TRVRGTCwgZmxhZ3MgJiB+T19OT05CTE9DSyk7Ci0jZWxzZSAvLyBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0gICAgICBpb2N0bF9hcmdfdHlwZSBhcmcgPSAwOwotICAgICAgOjppb2N0bChkLCBGSU9OQklPLCAmYXJnKTsKLSNlbmRpZiAvLyBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0gICAgICBzdGF0ZSAmPSB+bm9uX2Jsb2NraW5nOwotCi0gICAgICBlcnJubyA9IDA7Ci0gICAgICByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6Y2xvc2UoZCksIGVjKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocmVzdWx0ID09IDApCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWJvb2wgc2V0X3VzZXJfbm9uX2Jsb2NraW5nKGludCBkLCBzdGF0ZV90eXBlJiBzdGF0ZSwKLSAgICBib29sIHZhbHVlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGQgPT0gLTEpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBlcnJubyA9IDA7Ci0jaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OmZjbnRsKGQsIEZfR0VURkwsIDApLCBlYyk7Ci0gIGlmIChyZXN1bHQgPj0gMCkKLSAgewotICAgIGVycm5vID0gMDsKLSAgICBpbnQgZmxhZyA9ICh2YWx1ZSA/IChyZXN1bHQgfCBPX05PTkJMT0NLKSA6IChyZXN1bHQgJiB+T19OT05CTE9DSykpOwotICAgIHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpmY250bChkLCBGX1NFVEZMLCBmbGFnKSwgZWMpOwotICB9Ci0jZWxzZSAvLyBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0gIGlvY3RsX2FyZ190eXBlIGFyZyA9ICh2YWx1ZSA/IDEgOiAwKTsKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjppb2N0bChkLCBGSU9OQklPLCAmYXJnKSwgZWMpOwotI2VuZGlmIC8vIGRlZmluZWQoX19TWU1CSUFOMzJfXykKLQotICBpZiAocmVzdWx0ID49IDApCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICBpZiAodmFsdWUpCi0gICAgICBzdGF0ZSB8PSB1c2VyX3NldF9ub25fYmxvY2tpbmc7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIENsZWFyaW5nIHRoZSB1c2VyLXNldCBub24tYmxvY2tpbmcgbW9kZSBhbHdheXMgb3ZlcnJpZGVzIGFueQotICAgICAgLy8gaW50ZXJuYWxseS1zZXQgbm9uLWJsb2NraW5nIGZsYWcuIEFueSBzdWJzZXF1ZW50IGFzeW5jaHJvbm91cwotICAgICAgLy8gb3BlcmF0aW9ucyB3aWxsIG5lZWQgdG8gcmUtZW5hYmxlIG5vbi1ibG9ja2luZyBJL08uCi0gICAgICBzdGF0ZSAmPSB+KHVzZXJfc2V0X25vbl9ibG9ja2luZyB8IGludGVybmFsX25vbl9ibG9ja2luZyk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIHNldF9pbnRlcm5hbF9ub25fYmxvY2tpbmcoaW50IGQsIHN0YXRlX3R5cGUmIHN0YXRlLAotICAgIGJvb2wgdmFsdWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoZCA9PSAtMSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghdmFsdWUgJiYgKHN0YXRlICYgdXNlcl9zZXRfbm9uX2Jsb2NraW5nKSkKLSAgewotICAgIC8vIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gY2xlYXIgdGhlIGludGVybmFsIG5vbi1ibG9ja2luZyBmbGFnIGlmIHRoZQotICAgIC8vIHVzZXIgc3RpbGwgd2FudHMgbm9uLWJsb2NraW5nIGJlaGF2aW91ci4gUmV0dXJuIGFuIGVycm9yIGFuZCBsZXQgdGhlCi0gICAgLy8gY2FsbGVyIGZpZ3VyZSBvdXQgd2hldGhlciB0byB1cGRhdGUgdGhlIHVzZXItc2V0IG5vbi1ibG9ja2luZyBmbGFnLgotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZXJybm8gPSAwOwotI2lmIGRlZmluZWQoX19TWU1CSUFOMzJfXykKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpmY250bChkLCBGX0dFVEZMLCAwKSwgZWMpOwotICBpZiAocmVzdWx0ID49IDApCi0gIHsKLSAgICBlcnJubyA9IDA7Ci0gICAgaW50IGZsYWcgPSAodmFsdWUgPyAocmVzdWx0IHwgT19OT05CTE9DSykgOiAocmVzdWx0ICYgfk9fTk9OQkxPQ0spKTsKLSAgICByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6ZmNudGwoZCwgRl9TRVRGTCwgZmxhZyksIGVjKTsKLSAgfQotI2Vsc2UgLy8gZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotICBpb2N0bF9hcmdfdHlwZSBhcmcgPSAodmFsdWUgPyAxIDogMCk7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6aW9jdGwoZCwgRklPTkJJTywgJmFyZyksIGVjKTsKLSNlbmRpZiAvLyBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0KLSAgaWYgKHJlc3VsdCA+PSAwKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgaWYgKHZhbHVlKQotICAgICAgc3RhdGUgfD0gaW50ZXJuYWxfbm9uX2Jsb2NraW5nOwotICAgIGVsc2UKLSAgICAgIHN0YXRlICY9IH5pbnRlcm5hbF9ub25fYmxvY2tpbmc7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0ZDo6c2l6ZV90IHN5bmNfcmVhZChpbnQgZCwgc3RhdGVfdHlwZSBzdGF0ZSwgYnVmKiBidWZzLAotICAgIHN0ZDo6c2l6ZV90IGNvdW50LCBib29sIGFsbF9lbXB0eSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChkID09IC0xKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBBIHJlcXVlc3QgdG8gcmVhZCAwIGJ5dGVzIG9uIGEgc3RyZWFtIGlzIGEgbm8tb3AuCi0gIGlmIChhbGxfZW1wdHkpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFJlYWQgc29tZSBkYXRhLgotICBmb3IgKDs7KQotICB7Ci0gICAgLy8gVHJ5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24gd2l0aG91dCBibG9ja2luZy4KLSAgICBlcnJubyA9IDA7Ci0gICAgc2lnbmVkX3NpemVfdHlwZSBieXRlcyA9IGVycm9yX3dyYXBwZXIoOjpyZWFkdigKLSAgICAgICAgICBkLCBidWZzLCBzdGF0aWNfY2FzdDxpbnQ+KGNvdW50KSksIGVjKTsKLQotICAgIC8vIENoZWNrIGlmIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgaWYgKGJ5dGVzID4gMCkKLSAgICAgIHJldHVybiBieXRlczsKLQotICAgIC8vIENoZWNrIGZvciBFT0YuCi0gICAgaWYgKGJ5dGVzID09IDApCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6ZW9mOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gT3BlcmF0aW9uIGZhaWxlZC4KLSAgICBpZiAoKHN0YXRlICYgdXNlcl9zZXRfbm9uX2Jsb2NraW5nKQotICAgICAgICB8fCAoZWMgIT0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrCi0gICAgICAgICAgJiYgZWMgIT0gYXNpbzo6ZXJyb3I6OnRyeV9hZ2FpbikpCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8vIFdhaXQgZm9yIGRlc2NyaXB0b3IgdG8gYmVjb21lIHJlYWR5LgotICAgIGlmIChkZXNjcmlwdG9yX29wczo6cG9sbF9yZWFkKGQsIDAsIGVjKSA8IDApCi0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi1ib29sIG5vbl9ibG9ja2luZ19yZWFkKGludCBkLCBidWYqIGJ1ZnMsIHN0ZDo6c2l6ZV90IGNvdW50LAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLCBzdGQ6OnNpemVfdCYgYnl0ZXNfdHJhbnNmZXJyZWQpCi17Ci0gIGZvciAoOzspCi0gIHsKLSAgICAvLyBSZWFkIHNvbWUgZGF0YS4KLSAgICBlcnJubyA9IDA7Ci0gICAgc2lnbmVkX3NpemVfdHlwZSBieXRlcyA9IGVycm9yX3dyYXBwZXIoOjpyZWFkdigKLSAgICAgICAgICBkLCBidWZzLCBzdGF0aWNfY2FzdDxpbnQ+KGNvdW50KSksIGVjKTsKLQotICAgIC8vIENoZWNrIGZvciBlbmQgb2Ygc3RyZWFtLgotICAgIGlmIChieXRlcyA9PSAwKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmVvZjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIFJldHJ5IG9wZXJhdGlvbiBpZiBpbnRlcnJ1cHRlZCBieSBzaWduYWwuCi0gICAgaWYgKGVjID09IGFzaW86OmVycm9yOjppbnRlcnJ1cHRlZCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBydW4gdGhlIG9wZXJhdGlvbiBhZ2Fpbi4KLSAgICBpZiAoZWMgPT0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrCi0gICAgICAgIHx8IGVjID09IGFzaW86OmVycm9yOjp0cnlfYWdhaW4pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBPcGVyYXRpb24gaXMgY29tcGxldGUuCi0gICAgaWYgKGJ5dGVzID4gMCkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gYnl0ZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLXN0ZDo6c2l6ZV90IHN5bmNfd3JpdGUoaW50IGQsIHN0YXRlX3R5cGUgc3RhdGUsIGNvbnN0IGJ1ZiogYnVmcywKLSAgICBzdGQ6OnNpemVfdCBjb3VudCwgYm9vbCBhbGxfZW1wdHksIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoZCA9PSAtMSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gQSByZXF1ZXN0IHRvIHdyaXRlIDAgYnl0ZXMgb24gYSBzdHJlYW0gaXMgYSBuby1vcC4KLSAgaWYgKGFsbF9lbXB0eSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gV3JpdGUgc29tZSBkYXRhLgotICBmb3IgKDs7KQotICB7Ci0gICAgLy8gVHJ5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24gd2l0aG91dCBibG9ja2luZy4KLSAgICBlcnJubyA9IDA7Ci0gICAgc2lnbmVkX3NpemVfdHlwZSBieXRlcyA9IGVycm9yX3dyYXBwZXIoOjp3cml0ZXYoCi0gICAgICAgICAgZCwgYnVmcywgc3RhdGljX2Nhc3Q8aW50Pihjb3VudCkpLCBlYyk7Ci0KLSAgICAvLyBDaGVjayBpZiBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgIGlmIChieXRlcyA+IDApCi0gICAgICByZXR1cm4gYnl0ZXM7Ci0KLSAgICAvLyBPcGVyYXRpb24gZmFpbGVkLgotICAgIGlmICgoc3RhdGUgJiB1c2VyX3NldF9ub25fYmxvY2tpbmcpCi0gICAgICAgIHx8IChlYyAhPSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICAgICAgICAmJiBlYyAhPSBhc2lvOjplcnJvcjo6dHJ5X2FnYWluKSkKLSAgICAgIHJldHVybiAwOwotCi0gICAgLy8gV2FpdCBmb3IgZGVzY3JpcHRvciB0byBiZWNvbWUgcmVhZHkuCi0gICAgaWYgKGRlc2NyaXB0b3Jfb3BzOjpwb2xsX3dyaXRlKGQsIDAsIGVjKSA8IDApCi0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi1ib29sIG5vbl9ibG9ja2luZ193cml0ZShpbnQgZCwgY29uc3QgYnVmKiBidWZzLCBzdGQ6OnNpemVfdCBjb3VudCwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYywgc3RkOjpzaXplX3QmIGJ5dGVzX3RyYW5zZmVycmVkKQotewotICBmb3IgKDs7KQotICB7Ci0gICAgLy8gV3JpdGUgc29tZSBkYXRhLgotICAgIGVycm5vID0gMDsKLSAgICBzaWduZWRfc2l6ZV90eXBlIGJ5dGVzID0gZXJyb3Jfd3JhcHBlcig6OndyaXRldigKLSAgICAgICAgICBkLCBidWZzLCBzdGF0aWNfY2FzdDxpbnQ+KGNvdW50KSksIGVjKTsKLQotICAgIC8vIFJldHJ5IG9wZXJhdGlvbiBpZiBpbnRlcnJ1cHRlZCBieSBzaWduYWwuCi0gICAgaWYgKGVjID09IGFzaW86OmVycm9yOjppbnRlcnJ1cHRlZCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBydW4gdGhlIG9wZXJhdGlvbiBhZ2Fpbi4KLSAgICBpZiAoZWMgPT0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrCi0gICAgICAgIHx8IGVjID09IGFzaW86OmVycm9yOjp0cnlfYWdhaW4pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBPcGVyYXRpb24gaXMgY29tcGxldGUuCi0gICAgaWYgKGJ5dGVzID49IDApCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgICBieXRlc190cmFuc2ZlcnJlZCA9IGJ5dGVzOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQotCi1pbnQgaW9jdGwoaW50IGQsIHN0YXRlX3R5cGUmIHN0YXRlLCBsb25nIGNtZCwKLSAgICBpb2N0bF9hcmdfdHlwZSogYXJnLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGQgPT0gLTEpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBlcnJubyA9IDA7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6aW9jdGwoZCwgY21kLCBhcmcpLCBlYyk7Ci0KLSAgaWYgKHJlc3VsdCA+PSAwKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0KLSAgICAvLyBXaGVuIHVwZGF0aW5nIHRoZSBub24tYmxvY2tpbmcgbW9kZSB3ZSBhbHdheXMgcGVyZm9ybSB0aGUgaW9jdGwgc3lzY2FsbCwKLSAgICAvLyBldmVuIGlmIHRoZSBmbGFncyB3b3VsZCBvdGhlcndpc2UgaW5kaWNhdGUgdGhhdCB0aGUgZGVzY3JpcHRvciBpcwotICAgIC8vIGFscmVhZHkgaW4gdGhlIGNvcnJlY3Qgc3RhdGUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB1bmRlcmx5aW5nCi0gICAgLy8gZGVzY3JpcHRvciBpcyBwdXQgaW50byB0aGUgc3RhdGUgdGhhdCBoYXMgYmVlbiByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuIElmCi0gICAgLy8gdGhlIGlvY3RsIHN5c2NhbGwgd2FzIHN1Y2Nlc3NmdWwgdGhlbiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZmxhZ3MgdG8KLSAgICAvLyBtYXRjaC4KLSAgICBpZiAoY21kID09IHN0YXRpY19jYXN0PGxvbmc+KEZJT05CSU8pKQotICAgIHsKLSAgICAgIGlmICgqYXJnKQotICAgICAgewotICAgICAgICBzdGF0ZSB8PSB1c2VyX3NldF9ub25fYmxvY2tpbmc7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIENsZWFyaW5nIHRoZSBub24tYmxvY2tpbmcgbW9kZSBhbHdheXMgb3ZlcnJpZGVzIGFueSBpbnRlcm5hbGx5LXNldAotICAgICAgICAvLyBub24tYmxvY2tpbmcgZmxhZy4gQW55IHN1YnNlcXVlbnQgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgd2lsbCBuZWVkCi0gICAgICAgIC8vIHRvIHJlLWVuYWJsZSBub24tYmxvY2tpbmcgSS9PLgotICAgICAgICBzdGF0ZSAmPSB+KHVzZXJfc2V0X25vbl9ibG9ja2luZyB8IGludGVybmFsX25vbl9ibG9ja2luZyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IGZjbnRsKGludCBkLCBpbnQgY21kLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGQgPT0gLTEpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBlcnJubyA9IDA7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6ZmNudGwoZCwgY21kKSwgZWMpOwotICBpZiAocmVzdWx0ICE9IC0xKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgZmNudGwoaW50IGQsIGludCBjbWQsIGxvbmcgYXJnLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGQgPT0gLTEpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBlcnJubyA9IDA7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6ZmNudGwoZCwgY21kLCBhcmcpLCBlYyk7Ci0gIGlmIChyZXN1bHQgIT0gLTEpCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBwb2xsX3JlYWQoaW50IGQsIHN0YXRlX3R5cGUgc3RhdGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoZCA9PSAtMSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHBvbGxmZCBmZHM7Ci0gIGZkcy5mZCA9IGQ7Ci0gIGZkcy5ldmVudHMgPSBQT0xMSU47Ci0gIGZkcy5yZXZlbnRzID0gMDsKLSAgaW50IHRpbWVvdXQgPSAoc3RhdGUgJiB1c2VyX3NldF9ub25fYmxvY2tpbmcpID8gMCA6IC0xOwotICBlcnJubyA9IDA7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6cG9sbCgmZmRzLCAxLCB0aW1lb3V0KSwgZWMpOwotICBpZiAocmVzdWx0ID09IDApCi0gICAgZWMgPSAoc3RhdGUgJiB1c2VyX3NldF9ub25fYmxvY2tpbmcpCi0gICAgICA/IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jayA6IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgZWxzZSBpZiAocmVzdWx0ID4gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHBvbGxfd3JpdGUoaW50IGQsIHN0YXRlX3R5cGUgc3RhdGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoZCA9PSAtMSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHBvbGxmZCBmZHM7Ci0gIGZkcy5mZCA9IGQ7Ci0gIGZkcy5ldmVudHMgPSBQT0xMT1VUOwotICBmZHMucmV2ZW50cyA9IDA7Ci0gIGludCB0aW1lb3V0ID0gKHN0YXRlICYgdXNlcl9zZXRfbm9uX2Jsb2NraW5nKSA/IDAgOiAtMTsKLSAgZXJybm8gPSAwOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnBvbGwoJmZkcywgMSwgdGltZW91dCksIGVjKTsKLSAgaWYgKHJlc3VsdCA9PSAwKQotICAgIGVjID0gKHN0YXRlICYgdXNlcl9zZXRfbm9uX2Jsb2NraW5nKQotICAgICAgPyBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sgOiBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIGVsc2UgaWYgKHJlc3VsdCA+IDApCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRlc2NyaXB0b3Jfb3BzCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAvLyAgICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAgICAgIC8vICAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfREVTQ1JJUFRPUl9PUFNfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvZGV2X3BvbGxfcmVhY3Rvci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvZGV2X3BvbGxfcmVhY3Rvci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjZlNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL2Rldl9wb2xsX3JlYWN0b3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL2Rldl9wb2xsX3JlYWN0b3IuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX0RFVl9QT0xMX1JFQUNUT1JfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfREVWX1BPTExfUkVBQ1RPUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfREVWX1BPTEwpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotdm9pZCBkZXZfcG9sbF9yZWFjdG9yOjphZGRfdGltZXJfcXVldWUodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSkKLXsKLSAgZG9fYWRkX3RpbWVyX3F1ZXVlKHF1ZXVlKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotdm9pZCBkZXZfcG9sbF9yZWFjdG9yOjpyZW1vdmVfdGltZXJfcXVldWUodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSkKLXsKLSAgZG9fcmVtb3ZlX3RpbWVyX3F1ZXVlKHF1ZXVlKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotdm9pZCBkZXZfcG9sbF9yZWFjdG9yOjpzY2hlZHVsZV90aW1lcih0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlLAotICAgIGNvbnN0IHR5cGVuYW1lIFRpbWVfVHJhaXRzOjp0aW1lX3R5cGUmIHRpbWUsCi0gICAgdHlwZW5hbWUgdGltZXJfcXVldWU8VGltZV9UcmFpdHM+OjpwZXJfdGltZXJfZGF0YSYgdGltZXIsIHdhaXRfb3AqIG9wKQotewotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgaWYgKHNodXRkb3duXykKLSAgewotICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIGVhcmxpZXN0ID0gcXVldWUuZW5xdWV1ZV90aW1lcih0aW1lLCB0aW1lciwgb3ApOwotICBpb19zZXJ2aWNlXy53b3JrX3N0YXJ0ZWQoKTsKLSAgaWYgKGVhcmxpZXN0KQotICAgIGludGVycnVwdGVyXy5pbnRlcnJ1cHQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotc3RkOjpzaXplX3QgZGV2X3BvbGxfcmVhY3Rvcjo6Y2FuY2VsX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgdHlwZW5hbWUgdGltZXJfcXVldWU8VGltZV9UcmFpdHM+OjpwZXJfdGltZXJfZGF0YSYgdGltZXIsCi0gICAgc3RkOjpzaXplX3QgbWF4X2NhbmNlbGxlZCkKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBvcF9xdWV1ZTxvcGVyYXRpb24+IG9wczsKLSAgc3RkOjpzaXplX3QgbiA9IHF1ZXVlLmNhbmNlbF90aW1lcih0aW1lciwgb3BzLCBtYXhfY2FuY2VsbGVkKTsKLSAgbG9jay51bmxvY2soKTsKLSAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHMpOwotICByZXR1cm4gbjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0RFVl9QT0xMKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9ERVZfUE9MTF9SRUFDVE9SX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL2Rldl9wb2xsX3JlYWN0b3IuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL2Rldl9wb2xsX3JlYWN0b3IuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDM5MzcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9kZXZfcG9sbF9yZWFjdG9yLmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvZGV2X3BvbGxfcmVhY3Rvci5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfREVWX1BPTExfUkVBQ1RPUl9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9ERVZfUE9MTF9SRUFDVE9SX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19ERVZfUE9MTCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2Rldl9wb2xsX3JlYWN0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2Fzc2VydC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWRldl9wb2xsX3JlYWN0b3I6OmRldl9wb2xsX3JlYWN0b3IoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxkZXZfcG9sbF9yZWFjdG9yPihpb19zZXJ2aWNlKSwKLSAgICBpb19zZXJ2aWNlXyh1c2Vfc2VydmljZTxpb19zZXJ2aWNlX2ltcGw+KGlvX3NlcnZpY2UpKSwKLSAgICBtdXRleF8oKSwKLSAgICBkZXZfcG9sbF9mZF8oZG9fZGV2X3BvbGxfY3JlYXRlKCkpLAotICAgIGludGVycnVwdGVyXygpLAotICAgIHNodXRkb3duXyhmYWxzZSkKLXsKLSAgLy8gQWRkIHRoZSBpbnRlcnJ1cHRlcidzIGRlc2NyaXB0b3IgdG8gL2Rldi9wb2xsLgotICA6OnBvbGxmZCBldiA9IHsgMCwgMCwgMCB9OwotICBldi5mZCA9IGludGVycnVwdGVyXy5yZWFkX2Rlc2NyaXB0b3IoKTsKLSAgZXYuZXZlbnRzID0gUE9MTElOIHwgUE9MTEVSUjsKLSAgZXYucmV2ZW50cyA9IDA7Ci0gIDo6d3JpdGUoZGV2X3BvbGxfZmRfLCAmZXYsIHNpemVvZihldikpOwotfQotCi1kZXZfcG9sbF9yZWFjdG9yOjp+ZGV2X3BvbGxfcmVhY3RvcigpCi17Ci0gIHNodXRkb3duX3NlcnZpY2UoKTsKLSAgOjpjbG9zZShkZXZfcG9sbF9mZF8pOwotfQotCi12b2lkIGRldl9wb2xsX3JlYWN0b3I6OnNodXRkb3duX3NlcnZpY2UoKQotewotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIHNodXRkb3duXyA9IHRydWU7Ci0gIGxvY2sudW5sb2NrKCk7Ci0KLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfb3BzOyArK2kpCi0gICAgb3BfcXVldWVfW2ldLmdldF9hbGxfb3BlcmF0aW9ucyhvcHMpOwotCi0gIHRpbWVyX3F1ZXVlc18uZ2V0X2FsbF90aW1lcnMob3BzKTsKLQotICBpb19zZXJ2aWNlXy5hYmFuZG9uX29wZXJhdGlvbnMob3BzKTsKLX0gCi0KLXZvaWQgZGV2X3BvbGxfcmVhY3Rvcjo6Zm9ya19zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfZXZlbnQgZm9ya19ldikKLXsKLSAgaWYgKGZvcmtfZXYgPT0gYXNpbzo6aW9fc2VydmljZTo6Zm9ya19jaGlsZCkKLSAgewotICAgIGRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLQotICAgIGlmIChkZXZfcG9sbF9mZF8gIT0gLTEpCi0gICAgICA6OmNsb3NlKGRldl9wb2xsX2ZkXyk7Ci0gICAgZGV2X3BvbGxfZmRfID0gLTE7Ci0gICAgZGV2X3BvbGxfZmRfID0gZG9fZGV2X3BvbGxfY3JlYXRlKCk7Ci0KLSAgICBpbnRlcnJ1cHRlcl8ucmVjcmVhdGUoKTsKLQotICAgIC8vIEFkZCB0aGUgaW50ZXJydXB0ZXIncyBkZXNjcmlwdG9yIHRvIC9kZXYvcG9sbC4KLSAgICA6OnBvbGxmZCBldiA9IHsgMCwgMCwgMCB9OwotICAgIGV2LmZkID0gaW50ZXJydXB0ZXJfLnJlYWRfZGVzY3JpcHRvcigpOwotICAgIGV2LmV2ZW50cyA9IFBPTExJTiB8IFBPTExFUlI7Ci0gICAgZXYucmV2ZW50cyA9IDA7Ci0gICAgOjp3cml0ZShkZXZfcG9sbF9mZF8sICZldiwgc2l6ZW9mKGV2KSk7Ci0KLSAgICAvLyBSZS1yZWdpc3RlciBhbGwgZGVzY3JpcHRvcnMgd2l0aCAvZGV2L3BvbGwuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgd3JpdHRlbgotICAgIC8vIHRvIHRoZSAvZGV2L3BvbGwgZGVzY3JpcHRvciB0aGUgbmV4dCB0aW1lIHRoZSByZWFjdG9yIGlzIHJ1bi4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heF9vcHM7ICsraSkKLSAgICB7Ci0gICAgICByZWFjdG9yX29wX3F1ZXVlPHNvY2tldF90eXBlPjo6aXRlcmF0b3IgaXRlciA9IG9wX3F1ZXVlX1tpXS5iZWdpbigpOwotICAgICAgcmVhY3Rvcl9vcF9xdWV1ZTxzb2NrZXRfdHlwZT46Oml0ZXJhdG9yIGVuZCA9IG9wX3F1ZXVlX1tpXS5lbmQoKTsKLSAgICAgIGZvciAoOyBpdGVyICE9IGVuZDsgKytpdGVyKQotICAgICAgewotICAgICAgICA6OnBvbGxmZCYgcGVuZGluZ19ldiA9IGFkZF9wZW5kaW5nX2V2ZW50X2NoYW5nZShpdGVyLT5maXJzdCk7Ci0gICAgICAgIHBlbmRpbmdfZXYuZXZlbnRzIHw9IFBPTExFUlIgfCBQT0xMSFVQOwotICAgICAgICBzd2l0Y2ggKGkpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSByZWFkX29wOiBwZW5kaW5nX2V2LmV2ZW50cyB8PSBQT0xMSU47IGJyZWFrOwotICAgICAgICBjYXNlIHdyaXRlX29wOiBwZW5kaW5nX2V2LmV2ZW50cyB8PSBQT0xMT1VUOyBicmVhazsKLSAgICAgICAgY2FzZSBleGNlcHRfb3A6IHBlbmRpbmdfZXYuZXZlbnRzIHw9IFBPTExQUkk7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpbnRlcnJ1cHRlcl8uaW50ZXJydXB0KCk7Ci0gIH0KLX0KLQotdm9pZCBkZXZfcG9sbF9yZWFjdG9yOjppbml0X3Rhc2soKQotewotICBpb19zZXJ2aWNlXy5pbml0X3Rhc2soKTsKLX0KLQotaW50IGRldl9wb2xsX3JlYWN0b3I6OnJlZ2lzdGVyX2Rlc2NyaXB0b3Ioc29ja2V0X3R5cGUsIHBlcl9kZXNjcmlwdG9yX2RhdGEmKQotewotICByZXR1cm4gMDsKLX0KLQotaW50IGRldl9wb2xsX3JlYWN0b3I6OnJlZ2lzdGVyX2ludGVybmFsX2Rlc2NyaXB0b3IoaW50IG9wX3R5cGUsCi0gICAgc29ja2V0X3R5cGUgZGVzY3JpcHRvciwgcGVyX2Rlc2NyaXB0b3JfZGF0YSYsIHJlYWN0b3Jfb3AqIG9wKQotewotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgb3BfcXVldWVfW29wX3R5cGVdLmVucXVldWVfb3BlcmF0aW9uKGRlc2NyaXB0b3IsIG9wKTsKLSAgOjpwb2xsZmQmIGV2ID0gYWRkX3BlbmRpbmdfZXZlbnRfY2hhbmdlKGRlc2NyaXB0b3IpOwotICBldi5ldmVudHMgPSBQT0xMRVJSIHwgUE9MTEhVUDsKLSAgc3dpdGNoIChvcF90eXBlKQotICB7Ci0gIGNhc2UgcmVhZF9vcDogZXYuZXZlbnRzIHw9IFBPTExJTjsgYnJlYWs7Ci0gIGNhc2Ugd3JpdGVfb3A6IGV2LmV2ZW50cyB8PSBQT0xMT1VUOyBicmVhazsKLSAgY2FzZSBleGNlcHRfb3A6IGV2LmV2ZW50cyB8PSBQT0xMUFJJOyBicmVhazsKLSAgZGVmYXVsdDogYnJlYWs7Ci0gIH0KLSAgaW50ZXJydXB0ZXJfLmludGVycnVwdCgpOwotCi0gIHJldHVybiAwOwotfQotCi12b2lkIGRldl9wb2xsX3JlYWN0b3I6Om1vdmVfZGVzY3JpcHRvcihzb2NrZXRfdHlwZSwKLSAgICBkZXZfcG9sbF9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJiwKLSAgICBkZXZfcG9sbF9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJikKLXsKLX0KLQotdm9pZCBkZXZfcG9sbF9yZWFjdG9yOjpzdGFydF9vcChpbnQgb3BfdHlwZSwgc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICBkZXZfcG9sbF9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJiwgcmVhY3Rvcl9vcCogb3AsCi0gICAgYm9vbCBpc19jb250aW51YXRpb24sIGJvb2wgYWxsb3dfc3BlY3VsYXRpdmUpCi17Ci0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLQotICBpZiAoc2h1dGRvd25fKQotICB7Ci0gICAgcG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgaXNfY29udGludWF0aW9uKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYWxsb3dfc3BlY3VsYXRpdmUpCi0gIHsKLSAgICBpZiAob3BfdHlwZSAhPSByZWFkX29wIHx8ICFvcF9xdWV1ZV9bZXhjZXB0X29wXS5oYXNfb3BlcmF0aW9uKGRlc2NyaXB0b3IpKQotICAgIHsKLSAgICAgIGlmICghb3BfcXVldWVfW29wX3R5cGVdLmhhc19vcGVyYXRpb24oZGVzY3JpcHRvcikpCi0gICAgICB7Ci0gICAgICAgIGlmIChvcC0+cGVyZm9ybSgpKQotICAgICAgICB7Ci0gICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICBpb19zZXJ2aWNlXy5wb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKG9wLCBpc19jb250aW51YXRpb24pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGJvb2wgZmlyc3QgPSBvcF9xdWV1ZV9bb3BfdHlwZV0uZW5xdWV1ZV9vcGVyYXRpb24oZGVzY3JpcHRvciwgb3ApOwotICBpb19zZXJ2aWNlXy53b3JrX3N0YXJ0ZWQoKTsKLSAgaWYgKGZpcnN0KQotICB7Ci0gICAgOjpwb2xsZmQmIGV2ID0gYWRkX3BlbmRpbmdfZXZlbnRfY2hhbmdlKGRlc2NyaXB0b3IpOwotICAgIGV2LmV2ZW50cyA9IFBPTExFUlIgfCBQT0xMSFVQOwotICAgIGlmIChvcF90eXBlID09IHJlYWRfb3AKLSAgICAgICAgfHwgb3BfcXVldWVfW3JlYWRfb3BdLmhhc19vcGVyYXRpb24oZGVzY3JpcHRvcikpCi0gICAgICBldi5ldmVudHMgfD0gUE9MTElOOwotICAgIGlmIChvcF90eXBlID09IHdyaXRlX29wCi0gICAgICAgIHx8IG9wX3F1ZXVlX1t3cml0ZV9vcF0uaGFzX29wZXJhdGlvbihkZXNjcmlwdG9yKSkKLSAgICAgIGV2LmV2ZW50cyB8PSBQT0xMT1VUOwotICAgIGlmIChvcF90eXBlID09IGV4Y2VwdF9vcAotICAgICAgICB8fCBvcF9xdWV1ZV9bZXhjZXB0X29wXS5oYXNfb3BlcmF0aW9uKGRlc2NyaXB0b3IpKQotICAgICAgZXYuZXZlbnRzIHw9IFBPTExQUkk7Ci0gICAgaW50ZXJydXB0ZXJfLmludGVycnVwdCgpOwotICB9Ci19Ci0KLXZvaWQgZGV2X3BvbGxfcmVhY3Rvcjo6Y2FuY2VsX29wcyhzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgIGRldl9wb2xsX3JlYWN0b3I6OnBlcl9kZXNjcmlwdG9yX2RhdGEmKQotewotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIGNhbmNlbF9vcHNfdW5sb2NrZWQoZGVzY3JpcHRvciwgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkKTsKLX0KLQotdm9pZCBkZXZfcG9sbF9yZWFjdG9yOjpkZXJlZ2lzdGVyX2Rlc2NyaXB0b3Ioc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICBkZXZfcG9sbF9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJiwgYm9vbCkKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0gIC8vIFJlbW92ZSB0aGUgZGVzY3JpcHRvciBmcm9tIC9kZXYvcG9sbC4KLSAgOjpwb2xsZmQmIGV2ID0gYWRkX3BlbmRpbmdfZXZlbnRfY2hhbmdlKGRlc2NyaXB0b3IpOwotICBldi5ldmVudHMgPSBQT0xMUkVNT1ZFOwotICBpbnRlcnJ1cHRlcl8uaW50ZXJydXB0KCk7Ci0KLSAgLy8gQ2FuY2VsIGFueSBvdXRzdGFuZGluZyBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvci4KLSAgY2FuY2VsX29wc191bmxvY2tlZChkZXNjcmlwdG9yLCBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQpOwotfQotCi12b2lkIGRldl9wb2xsX3JlYWN0b3I6OmRlcmVnaXN0ZXJfaW50ZXJuYWxfZGVzY3JpcHRvcigKLSAgICBzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLCBkZXZfcG9sbF9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJikKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0gIC8vIFJlbW92ZSB0aGUgZGVzY3JpcHRvciBmcm9tIC9kZXYvcG9sbC4gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZAotICAvLyBkdXJpbmcgYSBmb3JrLCB3ZSBjYW4gYXBwbHkgdGhlIGNoYW5nZSBpbW1lZGlhdGVseS4KLSAgOjpwb2xsZmQgZXYgPSB7IDAsIDAsIDAgfTsKLSAgZXYuZmQgPSBkZXNjcmlwdG9yOwotICBldi5ldmVudHMgPSBQT0xMUkVNT1ZFOwotICBldi5yZXZlbnRzID0gMDsKLSAgOjp3cml0ZShkZXZfcG9sbF9mZF8sICZldiwgc2l6ZW9mKGV2KSk7Ci0KLSAgLy8gRGVzdHJveSBhbGwgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IuCi0gIG9wX3F1ZXVlPG9wZXJhdGlvbj4gb3BzOwotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1heF9vcHM7ICsraSkKLSAgICBvcF9xdWV1ZV9baV0uY2FuY2VsX29wZXJhdGlvbnMoZGVzY3JpcHRvciwgb3BzLCBlYyk7Ci19Ci0KLXZvaWQgZGV2X3BvbGxfcmVhY3Rvcjo6cnVuKGJvb2wgYmxvY2ssIG9wX3F1ZXVlPG9wZXJhdGlvbj4mIG9wcykKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0gIC8vIFdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlcmUncyBubyB3b3JrIHRvIGRvIGFuZCB0aGUgcmVhY3RvciBpcwotICAvLyBub3Qgc3VwcG9zZWQgdG8gYmxvY2suCi0gIGlmICghYmxvY2sgJiYgb3BfcXVldWVfW3JlYWRfb3BdLmVtcHR5KCkgJiYgb3BfcXVldWVfW3dyaXRlX29wXS5lbXB0eSgpCi0gICAgICAmJiBvcF9xdWV1ZV9bZXhjZXB0X29wXS5lbXB0eSgpICYmIHRpbWVyX3F1ZXVlc18uYWxsX2VtcHR5KCkpCi0gICAgcmV0dXJuOwotCi0gIC8vIFdyaXRlIHRoZSBwZW5kaW5nIGV2ZW50IHJlZ2lzdHJhdGlvbiBjaGFuZ2VzIHRvIHRoZSAvZGV2L3BvbGwgZGVzY3JpcHRvci4KLSAgc3RkOjpzaXplX3QgZXZlbnRzX3NpemUgPSBzaXplb2YoOjpwb2xsZmQpICogcGVuZGluZ19ldmVudF9jaGFuZ2VzXy5zaXplKCk7Ci0gIGlmIChldmVudHNfc2l6ZSA+IDApCi0gIHsKLSAgICBlcnJubyA9IDA7Ci0gICAgaW50IHJlc3VsdCA9IDo6d3JpdGUoZGV2X3BvbGxfZmRfLAotICAgICAgICAmcGVuZGluZ19ldmVudF9jaGFuZ2VzX1swXSwgZXZlbnRzX3NpemUpOwotICAgIGlmIChyZXN1bHQgIT0gc3RhdGljX2Nhc3Q8aW50PihldmVudHNfc2l6ZSkpCi0gICAgewotICAgICAgYXNpbzo6ZXJyb3JfY29kZSBlYyA9IGFzaW86OmVycm9yX2NvZGUoCi0gICAgICAgICAgZXJybm8sIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHBlbmRpbmdfZXZlbnRfY2hhbmdlc18uc2l6ZSgpOyArK2kpCi0gICAgICB7Ci0gICAgICAgIGludCBkZXNjcmlwdG9yID0gcGVuZGluZ19ldmVudF9jaGFuZ2VzX1tpXS5mZDsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtYXhfb3BzOyArK2opCi0gICAgICAgICAgb3BfcXVldWVfW2pdLmNhbmNlbF9vcGVyYXRpb25zKGRlc2NyaXB0b3IsIG9wcywgZWMpOwotICAgICAgfQotICAgIH0KLSAgICBwZW5kaW5nX2V2ZW50X2NoYW5nZXNfLmNsZWFyKCk7Ci0gICAgcGVuZGluZ19ldmVudF9jaGFuZ2VfaW5kZXhfLmNsZWFyKCk7Ci0gIH0KLQotICBpbnQgdGltZW91dCA9IGJsb2NrID8gZ2V0X3RpbWVvdXQoKSA6IDA7Ci0gIGxvY2sudW5sb2NrKCk7Ci0KLSAgLy8gQmxvY2sgb24gdGhlIC9kZXYvcG9sbCBkZXNjcmlwdG9yLgotICA6OnBvbGxmZCBldmVudHNbMTI4XSA9IHsgeyAwLCAwLCAwIH0gfTsKLSAgOjpkdnBvbGwgZHAgPSB7IDAsIDAsIDAgfTsKLSAgZHAuZHBfZmRzID0gZXZlbnRzOwotICBkcC5kcF9uZmRzID0gMTI4OwotICBkcC5kcF90aW1lb3V0ID0gdGltZW91dDsKLSAgaW50IG51bV9ldmVudHMgPSA6OmlvY3RsKGRldl9wb2xsX2ZkXywgRFBfUE9MTCwgJmRwKTsKLQotICBsb2NrLmxvY2soKTsKLQotICAvLyBEaXNwYXRjaCB0aGUgd2FpdGluZyBldmVudHMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2V2ZW50czsgKytpKQotICB7Ci0gICAgaW50IGRlc2NyaXB0b3IgPSBldmVudHNbaV0uZmQ7Ci0gICAgaWYgKGRlc2NyaXB0b3IgPT0gaW50ZXJydXB0ZXJfLnJlYWRfZGVzY3JpcHRvcigpKQotICAgIHsKLSAgICAgIGludGVycnVwdGVyXy5yZXNldCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYm9vbCBtb3JlX3JlYWRzID0gZmFsc2U7Ci0gICAgICBib29sIG1vcmVfd3JpdGVzID0gZmFsc2U7Ci0gICAgICBib29sIG1vcmVfZXhjZXB0ID0gZmFsc2U7Ci0KLSAgICAgIC8vIEV4Y2VwdGlvbiBvcGVyYXRpb25zIG11c3QgYmUgcHJvY2Vzc2VkIGZpcnN0IHRvIGVuc3VyZSB0aGF0IGFueQotICAgICAgLy8gb3V0LW9mLWJhbmQgZGF0YSBpcyByZWFkIGJlZm9yZSBub3JtYWwgZGF0YS4KLSAgICAgIGlmIChldmVudHNbaV0uZXZlbnRzICYgKFBPTExQUkkgfCBQT0xMRVJSIHwgUE9MTEhVUCkpCi0gICAgICAgIG1vcmVfZXhjZXB0ID0KLSAgICAgICAgICBvcF9xdWV1ZV9bZXhjZXB0X29wXS5wZXJmb3JtX29wZXJhdGlvbnMoZGVzY3JpcHRvciwgb3BzKTsKLSAgICAgIGVsc2UKLSAgICAgICAgbW9yZV9leGNlcHQgPSBvcF9xdWV1ZV9bZXhjZXB0X29wXS5oYXNfb3BlcmF0aW9uKGRlc2NyaXB0b3IpOwotCi0gICAgICBpZiAoZXZlbnRzW2ldLmV2ZW50cyAmIChQT0xMSU4gfCBQT0xMRVJSIHwgUE9MTEhVUCkpCi0gICAgICAgIG1vcmVfcmVhZHMgPSBvcF9xdWV1ZV9bcmVhZF9vcF0ucGVyZm9ybV9vcGVyYXRpb25zKGRlc2NyaXB0b3IsIG9wcyk7Ci0gICAgICBlbHNlCi0gICAgICAgIG1vcmVfcmVhZHMgPSBvcF9xdWV1ZV9bcmVhZF9vcF0uaGFzX29wZXJhdGlvbihkZXNjcmlwdG9yKTsKLQotICAgICAgaWYgKGV2ZW50c1tpXS5ldmVudHMgJiAoUE9MTE9VVCB8IFBPTExFUlIgfCBQT0xMSFVQKSkKLSAgICAgICAgbW9yZV93cml0ZXMgPSBvcF9xdWV1ZV9bd3JpdGVfb3BdLnBlcmZvcm1fb3BlcmF0aW9ucyhkZXNjcmlwdG9yLCBvcHMpOwotICAgICAgZWxzZQotICAgICAgICBtb3JlX3dyaXRlcyA9IG9wX3F1ZXVlX1t3cml0ZV9vcF0uaGFzX29wZXJhdGlvbihkZXNjcmlwdG9yKTsKLQotICAgICAgaWYgKChldmVudHNbaV0uZXZlbnRzICYgKFBPTExFUlIgfCBQT0xMSFVQKSkgIT0gMAotICAgICAgICAgICAgJiYgIW1vcmVfZXhjZXB0ICYmICFtb3JlX3JlYWRzICYmICFtb3JlX3dyaXRlcykKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBldmVudCBhbmQgbm8gb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICAgIC8vIGRlc2NyaXB0b3IgdGhlbiB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgZGVzY3JpcHRvciBmcm9tIC9kZXYvcG9sbC4KLSAgICAgICAgLy8gVGhlIHBvbGwgb3BlcmF0aW9uIGNhbiBwcm9kdWNlIFBPTExIVVAgb3IgUE9MTEVSUiBldmVudHMgd2hlbiB0aGVyZQotICAgICAgICAvLyBpcyBubyBvcGVyYXRpb24gcGVuZGluZywgc28gaWYgd2UgZG8gbm90IHJlbW92ZSB0aGUgZGVzY3JpcHRvciB3ZQotICAgICAgICAvLyBjYW4gZW5kIHVwIGluIGEgdGlnaHQgcG9sbGluZyBsb29wLgotICAgICAgICA6OnBvbGxmZCBldiA9IHsgMCwgMCwgMCB9OwotICAgICAgICBldi5mZCA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIGV2LmV2ZW50cyA9IFBPTExSRU1PVkU7Ci0gICAgICAgIGV2LnJldmVudHMgPSAwOwotICAgICAgICA6OndyaXRlKGRldl9wb2xsX2ZkXywgJmV2LCBzaXplb2YoZXYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgOjpwb2xsZmQgZXYgPSB7IDAsIDAsIDAgfTsKLSAgICAgICAgZXYuZmQgPSBkZXNjcmlwdG9yOwotICAgICAgICBldi5ldmVudHMgPSBQT0xMRVJSIHwgUE9MTEhVUDsKLSAgICAgICAgaWYgKG1vcmVfcmVhZHMpCi0gICAgICAgICAgZXYuZXZlbnRzIHw9IFBPTExJTjsKLSAgICAgICAgaWYgKG1vcmVfd3JpdGVzKQotICAgICAgICAgIGV2LmV2ZW50cyB8PSBQT0xMT1VUOwotICAgICAgICBpZiAobW9yZV9leGNlcHQpCi0gICAgICAgICAgZXYuZXZlbnRzIHw9IFBPTExQUkk7Ci0gICAgICAgIGV2LnJldmVudHMgPSAwOwotICAgICAgICBpbnQgcmVzdWx0ID0gOjp3cml0ZShkZXZfcG9sbF9mZF8sICZldiwgc2l6ZW9mKGV2KSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gc2l6ZW9mKGV2KSkKLSAgICAgICAgewotICAgICAgICAgIGFzaW86OmVycm9yX2NvZGUgZWMoZXJybm8sCi0gICAgICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWF4X29wczsgKytqKQotICAgICAgICAgICAgb3BfcXVldWVfW2pdLmNhbmNlbF9vcGVyYXRpb25zKGRlc2NyaXB0b3IsIG9wcywgZWMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHRpbWVyX3F1ZXVlc18uZ2V0X3JlYWR5X3RpbWVycyhvcHMpOwotfQotCi12b2lkIGRldl9wb2xsX3JlYWN0b3I6OmludGVycnVwdCgpCi17Ci0gIGludGVycnVwdGVyXy5pbnRlcnJ1cHQoKTsKLX0KLQotaW50IGRldl9wb2xsX3JlYWN0b3I6OmRvX2Rldl9wb2xsX2NyZWF0ZSgpCi17Ci0gIGludCBmZCA9IDo6b3BlbigiL2Rldi9wb2xsIiwgT19SRFdSKTsKLSAgaWYgKGZkID09IC0xKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhlcnJubywKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIi9kZXYvcG9sbCIpOwotICB9Ci0gIHJldHVybiBmZDsKLX0KLQotdm9pZCBkZXZfcG9sbF9yZWFjdG9yOjpkb19hZGRfdGltZXJfcXVldWUodGltZXJfcXVldWVfYmFzZSYgcXVldWUpCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIHRpbWVyX3F1ZXVlc18uaW5zZXJ0KCZxdWV1ZSk7Ci19Ci0KLXZvaWQgZGV2X3BvbGxfcmVhY3Rvcjo6ZG9fcmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlX2Jhc2UmIHF1ZXVlKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICB0aW1lcl9xdWV1ZXNfLmVyYXNlKCZxdWV1ZSk7Ci19Ci0KLWludCBkZXZfcG9sbF9yZWFjdG9yOjpnZXRfdGltZW91dCgpCi17Ci0gIC8vIEJ5IGRlZmF1bHQgd2Ugd2lsbCB3YWl0IG5vIGxvbmdlciB0aGFuIDUgbWludXRlcy4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0Ci0gIC8vIGFueSBjaGFuZ2VzIHRvIHRoZSBzeXN0ZW0gY2xvY2sgYXJlIGRldGVjdGVkIGFmdGVyIG5vIGxvbmdlciB0aGFuIHRoaXMuCi0gIHJldHVybiB0aW1lcl9xdWV1ZXNfLndhaXRfZHVyYXRpb25fbXNlYyg1ICogNjAgKiAxMDAwKTsKLX0KLQotdm9pZCBkZXZfcG9sbF9yZWFjdG9yOjpjYW5jZWxfb3BzX3VubG9ja2VkKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGJvb2wgbmVlZF9pbnRlcnJ1cHQgPSBmYWxzZTsKLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4X29wczsgKytpKQotICAgIG5lZWRfaW50ZXJydXB0ID0gb3BfcXVldWVfW2ldLmNhbmNlbF9vcGVyYXRpb25zKAotICAgICAgICBkZXNjcmlwdG9yLCBvcHMsIGVjKSB8fCBuZWVkX2ludGVycnVwdDsKLSAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHMpOwotICBpZiAobmVlZF9pbnRlcnJ1cHQpCi0gICAgaW50ZXJydXB0ZXJfLmludGVycnVwdCgpOwotfQotCi06OnBvbGxmZCYgZGV2X3BvbGxfcmVhY3Rvcjo6YWRkX3BlbmRpbmdfZXZlbnRfY2hhbmdlKGludCBkZXNjcmlwdG9yKQotewotICBoYXNoX21hcDxpbnQsIHN0ZDo6c2l6ZV90Pjo6aXRlcmF0b3IgaXRlcgotICAgID0gcGVuZGluZ19ldmVudF9jaGFuZ2VfaW5kZXhfLmZpbmQoZGVzY3JpcHRvcik7Ci0gIGlmIChpdGVyID09IHBlbmRpbmdfZXZlbnRfY2hhbmdlX2luZGV4Xy5lbmQoKSkKLSAgewotICAgIHN0ZDo6c2l6ZV90IGluZGV4ID0gcGVuZGluZ19ldmVudF9jaGFuZ2VzXy5zaXplKCk7Ci0gICAgcGVuZGluZ19ldmVudF9jaGFuZ2VzXy5yZXNlcnZlKHBlbmRpbmdfZXZlbnRfY2hhbmdlc18uc2l6ZSgpICsgMSk7Ci0gICAgcGVuZGluZ19ldmVudF9jaGFuZ2VfaW5kZXhfLmluc2VydChzdGQ6Om1ha2VfcGFpcihkZXNjcmlwdG9yLCBpbmRleCkpOwotICAgIHBlbmRpbmdfZXZlbnRfY2hhbmdlc18ucHVzaF9iYWNrKDo6cG9sbGZkKCkpOwotICAgIHBlbmRpbmdfZXZlbnRfY2hhbmdlc19baW5kZXhdLmZkID0gZGVzY3JpcHRvcjsKLSAgICBwZW5kaW5nX2V2ZW50X2NoYW5nZXNfW2luZGV4XS5yZXZlbnRzID0gMDsKLSAgICByZXR1cm4gcGVuZGluZ19ldmVudF9jaGFuZ2VzX1tpbmRleF07Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgcmV0dXJuIHBlbmRpbmdfZXZlbnRfY2hhbmdlc19baXRlci0+c2Vjb25kXTsKLSAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfREVWX1BPTEwpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX0RFVl9QT0xMX1JFQUNUT1JfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvZXBvbGxfcmVhY3Rvci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvZXBvbGxfcmVhY3Rvci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMjc2ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL2Vwb2xsX3JlYWN0b3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL2Vwb2xsX3JlYWN0b3IuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX0VQT0xMX1JFQUNUT1JfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfRVBPTExfUkVBQ1RPUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19FUE9MTCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci12b2lkIGVwb2xsX3JlYWN0b3I6OmFkZF90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlKQotewotICBkb19hZGRfdGltZXJfcXVldWUocXVldWUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci12b2lkIGVwb2xsX3JlYWN0b3I6OnJlbW92ZV90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlKQotewotICBkb19yZW1vdmVfdGltZXJfcXVldWUocXVldWUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci12b2lkIGVwb2xsX3JlYWN0b3I6OnNjaGVkdWxlX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgY29uc3QgdHlwZW5hbWUgVGltZV9UcmFpdHM6OnRpbWVfdHlwZSYgdGltZSwKLSAgICB0eXBlbmFtZSB0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz46OnBlcl90aW1lcl9kYXRhJiB0aW1lciwgd2FpdF9vcCogb3ApCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgaWYgKHNodXRkb3duXykKLSAgewotICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIGVhcmxpZXN0ID0gcXVldWUuZW5xdWV1ZV90aW1lcih0aW1lLCB0aW1lciwgb3ApOwotICBpb19zZXJ2aWNlXy53b3JrX3N0YXJ0ZWQoKTsKLSAgaWYgKGVhcmxpZXN0KQotICAgIHVwZGF0ZV90aW1lb3V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXN0ZDo6c2l6ZV90IGVwb2xsX3JlYWN0b3I6OmNhbmNlbF90aW1lcih0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlLAotICAgIHR5cGVuYW1lIHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPjo6cGVyX3RpbWVyX2RhdGEmIHRpbWVyLAotICAgIHN0ZDo6c2l6ZV90IG1heF9jYW5jZWxsZWQpCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIG9wX3F1ZXVlPG9wZXJhdGlvbj4gb3BzOwotICBzdGQ6OnNpemVfdCBuID0gcXVldWUuY2FuY2VsX3RpbWVyKHRpbWVyLCBvcHMsIG1heF9jYW5jZWxsZWQpOwotICBsb2NrLnVubG9jaygpOwotICBpb19zZXJ2aWNlXy5wb3N0X2RlZmVycmVkX2NvbXBsZXRpb25zKG9wcyk7Ci0gIHJldHVybiBuOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfRVBPTEwpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX0VQT0xMX1JFQUNUT1JfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvZXBvbGxfcmVhY3Rvci5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvZXBvbGxfcmVhY3Rvci5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjhkZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL2Vwb2xsX3JlYWN0b3IuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsNjYyICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC9lcG9sbF9yZWFjdG9yLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9FUE9MTF9SRUFDVE9SX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX0VQT0xMX1JFQUNUT1JfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0VQT0xMKQotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxzeXMvZXBvbGwuaD4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9lcG9sbF9yZWFjdG9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1RJTUVSRkQpCi0jIGluY2x1ZGUgPHN5cy90aW1lcmZkLmg+Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19USU1FUkZEKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWVwb2xsX3JlYWN0b3I6OmVwb2xsX3JlYWN0b3IoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxlcG9sbF9yZWFjdG9yPihpb19zZXJ2aWNlKSwKLSAgICBpb19zZXJ2aWNlXyh1c2Vfc2VydmljZTxpb19zZXJ2aWNlX2ltcGw+KGlvX3NlcnZpY2UpKSwKLSAgICBtdXRleF8oKSwKLSAgICBpbnRlcnJ1cHRlcl8oKSwKLSAgICBlcG9sbF9mZF8oZG9fZXBvbGxfY3JlYXRlKCkpLAotICAgIHRpbWVyX2ZkXyhkb190aW1lcmZkX2NyZWF0ZSgpKSwKLSAgICBzaHV0ZG93bl8oZmFsc2UpCi17Ci0gIC8vIEFkZCB0aGUgaW50ZXJydXB0ZXIncyBkZXNjcmlwdG9yIHRvIGVwb2xsLgotICBlcG9sbF9ldmVudCBldiA9IHsgMCwgeyAwIH0gfTsKLSAgZXYuZXZlbnRzID0gRVBPTExJTiB8IEVQT0xMRVJSIHwgRVBPTExFVDsKLSAgZXYuZGF0YS5wdHIgPSAmaW50ZXJydXB0ZXJfOwotICBlcG9sbF9jdGwoZXBvbGxfZmRfLCBFUE9MTF9DVExfQURELCBpbnRlcnJ1cHRlcl8ucmVhZF9kZXNjcmlwdG9yKCksICZldik7Ci0gIGludGVycnVwdGVyXy5pbnRlcnJ1cHQoKTsKLQotICAvLyBBZGQgdGhlIHRpbWVyIGRlc2NyaXB0b3IgdG8gZXBvbGwuCi0gIGlmICh0aW1lcl9mZF8gIT0gLTEpCi0gIHsKLSAgICBldi5ldmVudHMgPSBFUE9MTElOIHwgRVBPTExFUlI7Ci0gICAgZXYuZGF0YS5wdHIgPSAmdGltZXJfZmRfOwotICAgIGVwb2xsX2N0bChlcG9sbF9mZF8sIEVQT0xMX0NUTF9BREQsIHRpbWVyX2ZkXywgJmV2KTsKLSAgfQotfQotCi1lcG9sbF9yZWFjdG9yOjp+ZXBvbGxfcmVhY3RvcigpCi17Ci0gIGlmIChlcG9sbF9mZF8gIT0gLTEpCi0gICAgY2xvc2UoZXBvbGxfZmRfKTsKLSAgaWYgKHRpbWVyX2ZkXyAhPSAtMSkKLSAgICBjbG9zZSh0aW1lcl9mZF8pOwotfQotCi12b2lkIGVwb2xsX3JlYWN0b3I6OnNodXRkb3duX3NlcnZpY2UoKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBzaHV0ZG93bl8gPSB0cnVlOwotICBsb2NrLnVubG9jaygpOwotCi0gIG9wX3F1ZXVlPG9wZXJhdGlvbj4gb3BzOwotCi0gIHdoaWxlIChkZXNjcmlwdG9yX3N0YXRlKiBzdGF0ZSA9IHJlZ2lzdGVyZWRfZGVzY3JpcHRvcnNfLmZpcnN0KCkpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heF9vcHM7ICsraSkKLSAgICAgIG9wcy5wdXNoKHN0YXRlLT5vcF9xdWV1ZV9baV0pOwotICAgIHN0YXRlLT5zaHV0ZG93bl8gPSB0cnVlOwotICAgIHJlZ2lzdGVyZWRfZGVzY3JpcHRvcnNfLmZyZWUoc3RhdGUpOwotICB9Ci0KLSAgdGltZXJfcXVldWVzXy5nZXRfYWxsX3RpbWVycyhvcHMpOwotCi0gIGlvX3NlcnZpY2VfLmFiYW5kb25fb3BlcmF0aW9ucyhvcHMpOwotfQotCi12b2lkIGVwb2xsX3JlYWN0b3I6OmZvcmtfc2VydmljZShhc2lvOjppb19zZXJ2aWNlOjpmb3JrX2V2ZW50IGZvcmtfZXYpCi17Ci0gIGlmIChmb3JrX2V2ID09IGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfY2hpbGQpCi0gIHsKLSAgICBpZiAoZXBvbGxfZmRfICE9IC0xKQotICAgICAgOjpjbG9zZShlcG9sbF9mZF8pOwotICAgIGVwb2xsX2ZkXyA9IC0xOwotICAgIGVwb2xsX2ZkXyA9IGRvX2Vwb2xsX2NyZWF0ZSgpOwotCi0gICAgaWYgKHRpbWVyX2ZkXyAhPSAtMSkKLSAgICAgIDo6Y2xvc2UodGltZXJfZmRfKTsKLSAgICB0aW1lcl9mZF8gPSAtMTsKLSAgICB0aW1lcl9mZF8gPSBkb190aW1lcmZkX2NyZWF0ZSgpOwotCi0gICAgaW50ZXJydXB0ZXJfLnJlY3JlYXRlKCk7Ci0KLSAgICAvLyBBZGQgdGhlIGludGVycnVwdGVyJ3MgZGVzY3JpcHRvciB0byBlcG9sbC4KLSAgICBlcG9sbF9ldmVudCBldiA9IHsgMCwgeyAwIH0gfTsKLSAgICBldi5ldmVudHMgPSBFUE9MTElOIHwgRVBPTExFUlIgfCBFUE9MTEVUOwotICAgIGV2LmRhdGEucHRyID0gJmludGVycnVwdGVyXzsKLSAgICBlcG9sbF9jdGwoZXBvbGxfZmRfLCBFUE9MTF9DVExfQURELCBpbnRlcnJ1cHRlcl8ucmVhZF9kZXNjcmlwdG9yKCksICZldik7Ci0gICAgaW50ZXJydXB0ZXJfLmludGVycnVwdCgpOwotCi0gICAgLy8gQWRkIHRoZSB0aW1lciBkZXNjcmlwdG9yIHRvIGVwb2xsLgotICAgIGlmICh0aW1lcl9mZF8gIT0gLTEpCi0gICAgewotICAgICAgZXYuZXZlbnRzID0gRVBPTExJTiB8IEVQT0xMRVJSOwotICAgICAgZXYuZGF0YS5wdHIgPSAmdGltZXJfZmRfOwotICAgICAgZXBvbGxfY3RsKGVwb2xsX2ZkXywgRVBPTExfQ1RMX0FERCwgdGltZXJfZmRfLCAmZXYpOwotICAgIH0KLQotICAgIHVwZGF0ZV90aW1lb3V0KCk7Ci0KLSAgICAvLyBSZS1yZWdpc3RlciBhbGwgZGVzY3JpcHRvcnMgd2l0aCBlcG9sbC4KLSAgICBtdXRleDo6c2NvcGVkX2xvY2sgZGVzY3JpcHRvcnNfbG9jayhyZWdpc3RlcmVkX2Rlc2NyaXB0b3JzX211dGV4Xyk7Ci0gICAgZm9yIChkZXNjcmlwdG9yX3N0YXRlKiBzdGF0ZSA9IHJlZ2lzdGVyZWRfZGVzY3JpcHRvcnNfLmZpcnN0KCk7Ci0gICAgICAgIHN0YXRlICE9IDA7IHN0YXRlID0gc3RhdGUtPm5leHRfKQotICAgIHsKLSAgICAgIGV2LmV2ZW50cyA9IHN0YXRlLT5yZWdpc3RlcmVkX2V2ZW50c187Ci0gICAgICBldi5kYXRhLnB0ciA9IHN0YXRlOwotICAgICAgaW50IHJlc3VsdCA9IGVwb2xsX2N0bChlcG9sbF9mZF8sIEVQT0xMX0NUTF9BREQsIHN0YXRlLT5kZXNjcmlwdG9yXywgJmV2KTsKLSAgICAgIGlmIChyZXN1bHQgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhlcnJubywKLSAgICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgICAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiZXBvbGwgcmUtcmVnaXN0cmF0aW9uIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgZXBvbGxfcmVhY3Rvcjo6aW5pdF90YXNrKCkKLXsKLSAgaW9fc2VydmljZV8uaW5pdF90YXNrKCk7Ci19Ci0KLWludCBlcG9sbF9yZWFjdG9yOjpyZWdpc3Rlcl9kZXNjcmlwdG9yKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgZXBvbGxfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYgZGVzY3JpcHRvcl9kYXRhKQotewotICBkZXNjcmlwdG9yX2RhdGEgPSBhbGxvY2F0ZV9kZXNjcmlwdG9yX3N0YXRlKCk7Ci0KLSAgewotICAgIG11dGV4OjpzY29wZWRfbG9jayBkZXNjcmlwdG9yX2xvY2soZGVzY3JpcHRvcl9kYXRhLT5tdXRleF8pOwotCi0gICAgZGVzY3JpcHRvcl9kYXRhLT5yZWFjdG9yXyA9IHRoaXM7Ci0gICAgZGVzY3JpcHRvcl9kYXRhLT5kZXNjcmlwdG9yXyA9IGRlc2NyaXB0b3I7Ci0gICAgZGVzY3JpcHRvcl9kYXRhLT5zaHV0ZG93bl8gPSBmYWxzZTsKLSAgfQotCi0gIGVwb2xsX2V2ZW50IGV2ID0geyAwLCB7IDAgfSB9OwotICBldi5ldmVudHMgPSBFUE9MTElOIHwgRVBPTExFUlIgfCBFUE9MTEhVUCB8IEVQT0xMUFJJIHwgRVBPTExFVDsKLSAgZGVzY3JpcHRvcl9kYXRhLT5yZWdpc3RlcmVkX2V2ZW50c18gPSBldi5ldmVudHM7Ci0gIGV2LmRhdGEucHRyID0gZGVzY3JpcHRvcl9kYXRhOwotICBpbnQgcmVzdWx0ID0gZXBvbGxfY3RsKGVwb2xsX2ZkXywgRVBPTExfQ1RMX0FERCwgZGVzY3JpcHRvciwgJmV2KTsKLSAgaWYgKHJlc3VsdCAhPSAwKQotICAgIHJldHVybiBlcnJubzsKLQotICByZXR1cm4gMDsKLX0KLQotaW50IGVwb2xsX3JlYWN0b3I6OnJlZ2lzdGVyX2ludGVybmFsX2Rlc2NyaXB0b3IoCi0gICAgaW50IG9wX3R5cGUsIHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgZXBvbGxfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYgZGVzY3JpcHRvcl9kYXRhLCByZWFjdG9yX29wKiBvcCkKLXsKLSAgZGVzY3JpcHRvcl9kYXRhID0gYWxsb2NhdGVfZGVzY3JpcHRvcl9zdGF0ZSgpOwotCi0gIHsKLSAgICBtdXRleDo6c2NvcGVkX2xvY2sgZGVzY3JpcHRvcl9sb2NrKGRlc2NyaXB0b3JfZGF0YS0+bXV0ZXhfKTsKLQotICAgIGRlc2NyaXB0b3JfZGF0YS0+cmVhY3Rvcl8gPSB0aGlzOwotICAgIGRlc2NyaXB0b3JfZGF0YS0+ZGVzY3JpcHRvcl8gPSBkZXNjcmlwdG9yOwotICAgIGRlc2NyaXB0b3JfZGF0YS0+c2h1dGRvd25fID0gZmFsc2U7Ci0gICAgZGVzY3JpcHRvcl9kYXRhLT5vcF9xdWV1ZV9bb3BfdHlwZV0ucHVzaChvcCk7Ci0gIH0KLQotICBlcG9sbF9ldmVudCBldiA9IHsgMCwgeyAwIH0gfTsKLSAgZXYuZXZlbnRzID0gRVBPTExJTiB8IEVQT0xMRVJSIHwgRVBPTExIVVAgfCBFUE9MTFBSSSB8IEVQT0xMRVQ7Ci0gIGRlc2NyaXB0b3JfZGF0YS0+cmVnaXN0ZXJlZF9ldmVudHNfID0gZXYuZXZlbnRzOwotICBldi5kYXRhLnB0ciA9IGRlc2NyaXB0b3JfZGF0YTsKLSAgaW50IHJlc3VsdCA9IGVwb2xsX2N0bChlcG9sbF9mZF8sIEVQT0xMX0NUTF9BREQsIGRlc2NyaXB0b3IsICZldik7Ci0gIGlmIChyZXN1bHQgIT0gMCkKLSAgICByZXR1cm4gZXJybm87Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZXBvbGxfcmVhY3Rvcjo6bW92ZV9kZXNjcmlwdG9yKHNvY2tldF90eXBlLAotICAgIGVwb2xsX3JlYWN0b3I6OnBlcl9kZXNjcmlwdG9yX2RhdGEmIHRhcmdldF9kZXNjcmlwdG9yX2RhdGEsCi0gICAgZXBvbGxfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYgc291cmNlX2Rlc2NyaXB0b3JfZGF0YSkKLXsKLSAgdGFyZ2V0X2Rlc2NyaXB0b3JfZGF0YSA9IHNvdXJjZV9kZXNjcmlwdG9yX2RhdGE7Ci0gIHNvdXJjZV9kZXNjcmlwdG9yX2RhdGEgPSAwOwotfQotCi12b2lkIGVwb2xsX3JlYWN0b3I6OnN0YXJ0X29wKGludCBvcF90eXBlLCBzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgIGVwb2xsX3JlYWN0b3I6OnBlcl9kZXNjcmlwdG9yX2RhdGEmIGRlc2NyaXB0b3JfZGF0YSwgcmVhY3Rvcl9vcCogb3AsCi0gICAgYm9vbCBpc19jb250aW51YXRpb24sIGJvb2wgYWxsb3dfc3BlY3VsYXRpdmUpCi17Ci0gIGlmICghZGVzY3JpcHRvcl9kYXRhKQotICB7Ci0gICAgb3AtPmVjXyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICBwb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKG9wLCBpc19jb250aW51YXRpb24pOwotICAgIHJldHVybjsKLSAgfQotCi0gIG11dGV4OjpzY29wZWRfbG9jayBkZXNjcmlwdG9yX2xvY2soZGVzY3JpcHRvcl9kYXRhLT5tdXRleF8pOwotCi0gIGlmIChkZXNjcmlwdG9yX2RhdGEtPnNodXRkb3duXykKLSAgewotICAgIHBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGRlc2NyaXB0b3JfZGF0YS0+b3BfcXVldWVfW29wX3R5cGVdLmVtcHR5KCkpCi0gIHsKLSAgICBpZiAoYWxsb3dfc3BlY3VsYXRpdmUKLSAgICAgICAgJiYgKG9wX3R5cGUgIT0gcmVhZF9vcAotICAgICAgICAgIHx8IGRlc2NyaXB0b3JfZGF0YS0+b3BfcXVldWVfW2V4Y2VwdF9vcF0uZW1wdHkoKSkpCi0gICAgewotICAgICAgaWYgKG9wLT5wZXJmb3JtKCkpCi0gICAgICB7Ci0gICAgICAgIGRlc2NyaXB0b3JfbG9jay51bmxvY2soKTsKLSAgICAgICAgaW9fc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgaXNfY29udGludWF0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAob3BfdHlwZSA9PSB3cml0ZV9vcCkKLSAgICAgIHsKLSAgICAgICAgaWYgKChkZXNjcmlwdG9yX2RhdGEtPnJlZ2lzdGVyZWRfZXZlbnRzXyAmIEVQT0xMT1VUKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgZXBvbGxfZXZlbnQgZXYgPSB7IDAsIHsgMCB9IH07Ci0gICAgICAgICAgZXYuZXZlbnRzID0gZGVzY3JpcHRvcl9kYXRhLT5yZWdpc3RlcmVkX2V2ZW50c18gfCBFUE9MTE9VVDsKLSAgICAgICAgICBldi5kYXRhLnB0ciA9IGRlc2NyaXB0b3JfZGF0YTsKLSAgICAgICAgICBpZiAoZXBvbGxfY3RsKGVwb2xsX2ZkXywgRVBPTExfQ1RMX01PRCwgZGVzY3JpcHRvciwgJmV2KSA9PSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRlc2NyaXB0b3JfZGF0YS0+cmVnaXN0ZXJlZF9ldmVudHNfIHw9IGV2LmV2ZW50czsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wLT5lY18gPSBhc2lvOjplcnJvcl9jb2RlKGVycm5vLAotICAgICAgICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgICAgICAgICAgaW9fc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgaXNfY29udGludWF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcF90eXBlID09IHdyaXRlX29wKQotICAgICAgewotICAgICAgICBkZXNjcmlwdG9yX2RhdGEtPnJlZ2lzdGVyZWRfZXZlbnRzXyB8PSBFUE9MTE9VVDsKLSAgICAgIH0KLQotICAgICAgZXBvbGxfZXZlbnQgZXYgPSB7IDAsIHsgMCB9IH07Ci0gICAgICBldi5ldmVudHMgPSBkZXNjcmlwdG9yX2RhdGEtPnJlZ2lzdGVyZWRfZXZlbnRzXzsKLSAgICAgIGV2LmRhdGEucHRyID0gZGVzY3JpcHRvcl9kYXRhOwotICAgICAgZXBvbGxfY3RsKGVwb2xsX2ZkXywgRVBPTExfQ1RMX01PRCwgZGVzY3JpcHRvciwgJmV2KTsKLSAgICB9Ci0gIH0KLQotICBkZXNjcmlwdG9yX2RhdGEtPm9wX3F1ZXVlX1tvcF90eXBlXS5wdXNoKG9wKTsKLSAgaW9fc2VydmljZV8ud29ya19zdGFydGVkKCk7Ci19Ci0KLXZvaWQgZXBvbGxfcmVhY3Rvcjo6Y2FuY2VsX29wcyhzb2NrZXRfdHlwZSwKLSAgICBlcG9sbF9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJiBkZXNjcmlwdG9yX2RhdGEpCi17Ci0gIGlmICghZGVzY3JpcHRvcl9kYXRhKQotICAgIHJldHVybjsKLQotICBtdXRleDo6c2NvcGVkX2xvY2sgZGVzY3JpcHRvcl9sb2NrKGRlc2NyaXB0b3JfZGF0YS0+bXV0ZXhfKTsKLQotICBvcF9xdWV1ZTxvcGVyYXRpb24+IG9wczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfb3BzOyArK2kpCi0gIHsKLSAgICB3aGlsZSAocmVhY3Rvcl9vcCogb3AgPSBkZXNjcmlwdG9yX2RhdGEtPm9wX3F1ZXVlX1tpXS5mcm9udCgpKQotICAgIHsKLSAgICAgIG9wLT5lY18gPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQ7Ci0gICAgICBkZXNjcmlwdG9yX2RhdGEtPm9wX3F1ZXVlX1tpXS5wb3AoKTsKLSAgICAgIG9wcy5wdXNoKG9wKTsKLSAgICB9Ci0gIH0KLQotICBkZXNjcmlwdG9yX2xvY2sudW5sb2NrKCk7Ci0KLSAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHMpOwotfQotCi12b2lkIGVwb2xsX3JlYWN0b3I6OmRlcmVnaXN0ZXJfZGVzY3JpcHRvcihzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgIGVwb2xsX3JlYWN0b3I6OnBlcl9kZXNjcmlwdG9yX2RhdGEmIGRlc2NyaXB0b3JfZGF0YSwgYm9vbCBjbG9zaW5nKQotewotICBpZiAoIWRlc2NyaXB0b3JfZGF0YSkKLSAgICByZXR1cm47Ci0KLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGRlc2NyaXB0b3JfbG9jayhkZXNjcmlwdG9yX2RhdGEtPm11dGV4Xyk7Ci0KLSAgaWYgKCFkZXNjcmlwdG9yX2RhdGEtPnNodXRkb3duXykKLSAgewotICAgIGlmIChjbG9zaW5nKQotICAgIHsKLSAgICAgIC8vIFRoZSBkZXNjcmlwdG9yIHdpbGwgYmUgYXV0b21hdGljYWxseSByZW1vdmVkIGZyb20gdGhlIGVwb2xsIHNldCB3aGVuCi0gICAgICAvLyBpdCBpcyBjbG9zZWQuCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlcG9sbF9ldmVudCBldiA9IHsgMCwgeyAwIH0gfTsKLSAgICAgIGVwb2xsX2N0bChlcG9sbF9mZF8sIEVQT0xMX0NUTF9ERUwsIGRlc2NyaXB0b3IsICZldik7Ci0gICAgfQotCi0gICAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfb3BzOyArK2kpCi0gICAgewotICAgICAgd2hpbGUgKHJlYWN0b3Jfb3AqIG9wID0gZGVzY3JpcHRvcl9kYXRhLT5vcF9xdWV1ZV9baV0uZnJvbnQoKSkKLSAgICAgIHsKLSAgICAgICAgb3AtPmVjXyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZDsKLSAgICAgICAgZGVzY3JpcHRvcl9kYXRhLT5vcF9xdWV1ZV9baV0ucG9wKCk7Ci0gICAgICAgIG9wcy5wdXNoKG9wKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkZXNjcmlwdG9yX2RhdGEtPmRlc2NyaXB0b3JfID0gLTE7Ci0gICAgZGVzY3JpcHRvcl9kYXRhLT5zaHV0ZG93bl8gPSB0cnVlOwotCi0gICAgZGVzY3JpcHRvcl9sb2NrLnVubG9jaygpOwotCi0gICAgZnJlZV9kZXNjcmlwdG9yX3N0YXRlKGRlc2NyaXB0b3JfZGF0YSk7Ci0gICAgZGVzY3JpcHRvcl9kYXRhID0gMDsKLQotICAgIGlvX3NlcnZpY2VfLnBvc3RfZGVmZXJyZWRfY29tcGxldGlvbnMob3BzKTsKLSAgfQotfQotCi12b2lkIGVwb2xsX3JlYWN0b3I6OmRlcmVnaXN0ZXJfaW50ZXJuYWxfZGVzY3JpcHRvcihzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgIGVwb2xsX3JlYWN0b3I6OnBlcl9kZXNjcmlwdG9yX2RhdGEmIGRlc2NyaXB0b3JfZGF0YSkKLXsKLSAgaWYgKCFkZXNjcmlwdG9yX2RhdGEpCi0gICAgcmV0dXJuOwotCi0gIG11dGV4OjpzY29wZWRfbG9jayBkZXNjcmlwdG9yX2xvY2soZGVzY3JpcHRvcl9kYXRhLT5tdXRleF8pOwotCi0gIGlmICghZGVzY3JpcHRvcl9kYXRhLT5zaHV0ZG93bl8pCi0gIHsKLSAgICBlcG9sbF9ldmVudCBldiA9IHsgMCwgeyAwIH0gfTsKLSAgICBlcG9sbF9jdGwoZXBvbGxfZmRfLCBFUE9MTF9DVExfREVMLCBkZXNjcmlwdG9yLCAmZXYpOwotCi0gICAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfb3BzOyArK2kpCi0gICAgICBvcHMucHVzaChkZXNjcmlwdG9yX2RhdGEtPm9wX3F1ZXVlX1tpXSk7Ci0KLSAgICBkZXNjcmlwdG9yX2RhdGEtPmRlc2NyaXB0b3JfID0gLTE7Ci0gICAgZGVzY3JpcHRvcl9kYXRhLT5zaHV0ZG93bl8gPSB0cnVlOwotCi0gICAgZGVzY3JpcHRvcl9sb2NrLnVubG9jaygpOwotCi0gICAgZnJlZV9kZXNjcmlwdG9yX3N0YXRlKGRlc2NyaXB0b3JfZGF0YSk7Ci0gICAgZGVzY3JpcHRvcl9kYXRhID0gMDsKLSAgfQotfQotCi12b2lkIGVwb2xsX3JlYWN0b3I6OnJ1bihib29sIGJsb2NrLCBvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpCi17Ci0gIC8vIFRoaXMgY29kZSByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0aGUgdGFza19pb19zZXJ2aWNlIHF1ZXVlcyB0aGUgcmVhY3RvcgotICAvLyB0YXNrIGJlaGluZCBhbGwgZGVzY3JpcHRvciBvcGVyYXRpb25zIGdlbmVyYXRlZCBieSB0aGlzIGZ1bmN0aW9uLiBUaGlzCi0gIC8vIG1lYW5zLCB0aGF0IGJ5IHRoZSB0aW1lIHdlIHJlYWNoIHRoaXMgcG9pbnQsIGFueSBwcmV2aW91c2x5IHJldHVybmVkCi0gIC8vIGRlc2NyaXB0b3Igb3BlcmF0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBkZXF1ZXVlZC4gVGhlcmVmb3JlIGl0IGlzIG5vdyBzYWZlCi0gIC8vIGZvciB1cyB0byByZXVzZSBhbmQgcmV0dXJuIHRoZW0gZm9yIHRoZSB0YXNrX2lvX3NlcnZpY2UgdG8gcXVldWUgYWdhaW4uCi0KLSAgLy8gQ2FsY3VsYXRlIGEgdGltZW91dCBvbmx5IGlmIHRpbWVyZmQgaXMgbm90IHVzZWQuCi0gIGludCB0aW1lb3V0OwotICBpZiAodGltZXJfZmRfICE9IC0xKQotICAgIHRpbWVvdXQgPSBibG9jayA/IC0xIDogMDsKLSAgZWxzZQotICB7Ci0gICAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgICB0aW1lb3V0ID0gYmxvY2sgPyBnZXRfdGltZW91dCgpIDogMDsKLSAgfQotCi0gIC8vIEJsb2NrIG9uIHRoZSBlcG9sbCBkZXNjcmlwdG9yLgotICBlcG9sbF9ldmVudCBldmVudHNbMTI4XTsKLSAgaW50IG51bV9ldmVudHMgPSBlcG9sbF93YWl0KGVwb2xsX2ZkXywgZXZlbnRzLCAxMjgsIHRpbWVvdXQpOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19USU1FUkZEKQotICBib29sIGNoZWNrX3RpbWVycyA9ICh0aW1lcl9mZF8gPT0gLTEpOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19USU1FUkZEKQotICBib29sIGNoZWNrX3RpbWVycyA9IHRydWU7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19USU1FUkZEKQotCi0gIC8vIERpc3BhdGNoIHRoZSB3YWl0aW5nIGV2ZW50cy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZXZlbnRzOyArK2kpCi0gIHsKLSAgICB2b2lkKiBwdHIgPSBldmVudHNbaV0uZGF0YS5wdHI7Ci0gICAgaWYgKHB0ciA9PSAmaW50ZXJydXB0ZXJfKQotICAgIHsKLSAgICAgIC8vIE5vIG5lZWQgdG8gcmVzZXQgdGhlIGludGVycnVwdGVyIHNpbmNlIHdlJ3JlIGxlYXZpbmcgdGhlIGRlc2NyaXB0b3IKLSAgICAgIC8vIGluIGEgcmVhZHktdG8tcmVhZCBzdGF0ZSBhbmQgcmVseWluZyBvbiBlZGdlLXRyaWdnZXJlZCBub3RpZmljYXRpb25zCi0gICAgICAvLyB0byBtYWtlIGl0IHNvIHRoYXQgd2Ugb25seSBnZXQgd29rZW4gdXAgd2hlbiB0aGUgZGVzY3JpcHRvcidzIGVwb2xsCi0gICAgICAvLyByZWdpc3RyYXRpb24gaXMgdXBkYXRlZC4KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLSAgICAgIGlmICh0aW1lcl9mZF8gPT0gLTEpCi0gICAgICAgIGNoZWNrX3RpbWVycyA9IHRydWU7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1RJTUVSRkQpCi0gICAgICBjaGVja190aW1lcnMgPSB0cnVlOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLSAgICB9Ci0jaWYgZGVmaW5lZChBU0lPX0hBU19USU1FUkZEKQotICAgIGVsc2UgaWYgKHB0ciA9PSAmdGltZXJfZmRfKQotICAgIHsKLSAgICAgIGNoZWNrX3RpbWVycyA9IHRydWU7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gVGhlIGRlc2NyaXB0b3Igb3BlcmF0aW9uIGRvZXNuJ3QgY291bnQgYXMgd29yayBpbiBhbmQgb2YgaXRzZWxmLCBzbyB3ZQotICAgICAgLy8gZG9uJ3QgY2FsbCB3b3JrX3N0YXJ0ZWQoKSBoZXJlLiBUaGlzIHN0aWxsIGFsbG93cyB0aGUgaW9fc2VydmljZSB0bwotICAgICAgLy8gc3RvcCBpZiB0aGUgb25seSByZW1haW5pbmcgb3BlcmF0aW9ucyBhcmUgZGVzY3JpcHRvciBvcGVyYXRpb25zLgotICAgICAgZGVzY3JpcHRvcl9zdGF0ZSogZGVzY3JpcHRvcl9kYXRhID0gc3RhdGljX2Nhc3Q8ZGVzY3JpcHRvcl9zdGF0ZSo+KHB0cik7Ci0gICAgICBkZXNjcmlwdG9yX2RhdGEtPnNldF9yZWFkeV9ldmVudHMoZXZlbnRzW2ldLmV2ZW50cyk7Ci0gICAgICBvcHMucHVzaChkZXNjcmlwdG9yX2RhdGEpOwotICAgIH0KLSAgfQotCi0gIGlmIChjaGVja190aW1lcnMpCi0gIHsKLSAgICBtdXRleDo6c2NvcGVkX2xvY2sgY29tbW9uX2xvY2sobXV0ZXhfKTsKLSAgICB0aW1lcl9xdWV1ZXNfLmdldF9yZWFkeV90aW1lcnMob3BzKTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLSAgICBpZiAodGltZXJfZmRfICE9IC0xKQotICAgIHsKLSAgICAgIGl0aW1lcnNwZWMgbmV3X3RpbWVvdXQ7Ci0gICAgICBpdGltZXJzcGVjIG9sZF90aW1lb3V0OwotICAgICAgaW50IGZsYWdzID0gZ2V0X3RpbWVvdXQobmV3X3RpbWVvdXQpOwotICAgICAgdGltZXJmZF9zZXR0aW1lKHRpbWVyX2ZkXywgZmxhZ3MsICZuZXdfdGltZW91dCwgJm9sZF90aW1lb3V0KTsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19USU1FUkZEKQotICB9Ci19Ci0KLXZvaWQgZXBvbGxfcmVhY3Rvcjo6aW50ZXJydXB0KCkKLXsKLSAgZXBvbGxfZXZlbnQgZXYgPSB7IDAsIHsgMCB9IH07Ci0gIGV2LmV2ZW50cyA9IEVQT0xMSU4gfCBFUE9MTEVSUiB8IEVQT0xMRVQ7Ci0gIGV2LmRhdGEucHRyID0gJmludGVycnVwdGVyXzsKLSAgZXBvbGxfY3RsKGVwb2xsX2ZkXywgRVBPTExfQ1RMX01PRCwgaW50ZXJydXB0ZXJfLnJlYWRfZGVzY3JpcHRvcigpLCAmZXYpOwotfQotCi1pbnQgZXBvbGxfcmVhY3Rvcjo6ZG9fZXBvbGxfY3JlYXRlKCkKLXsKLSNpZiBkZWZpbmVkKEVQT0xMX0NMT0VYRUMpCi0gIGludCBmZCA9IGVwb2xsX2NyZWF0ZTEoRVBPTExfQ0xPRVhFQyk7Ci0jZWxzZSAvLyBkZWZpbmVkKEVQT0xMX0NMT0VYRUMpCi0gIGludCBmZCA9IC0xOwotICBlcnJubyA9IEVJTlZBTDsKLSNlbmRpZiAvLyBkZWZpbmVkKEVQT0xMX0NMT0VYRUMpCi0KLSAgaWYgKGZkID09IC0xICYmIChlcnJubyA9PSBFSU5WQUwgfHwgZXJybm8gPT0gRU5PU1lTKSkKLSAgewotICAgIGZkID0gZXBvbGxfY3JlYXRlKGVwb2xsX3NpemUpOwotICAgIGlmIChmZCAhPSAtMSkKLSAgICAgIDo6ZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotICB9Ci0KLSAgaWYgKGZkID09IC0xKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhlcnJubywKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImVwb2xsIik7Ci0gIH0KLQotICByZXR1cm4gZmQ7Ci19Ci0KLWludCBlcG9sbF9yZWFjdG9yOjpkb190aW1lcmZkX2NyZWF0ZSgpCi17Ci0jaWYgZGVmaW5lZChBU0lPX0hBU19USU1FUkZEKQotIyBpZiBkZWZpbmVkKFRGRF9DTE9FWEVDKQotICBpbnQgZmQgPSB0aW1lcmZkX2NyZWF0ZShDTE9DS19NT05PVE9OSUMsIFRGRF9DTE9FWEVDKTsKLSMgZWxzZSAvLyBkZWZpbmVkKFRGRF9DTE9FWEVDKQotICBpbnQgZmQgPSAtMTsKLSAgZXJybm8gPSBFSU5WQUw7Ci0jIGVuZGlmIC8vIGRlZmluZWQoVEZEX0NMT0VYRUMpCi0KLSAgaWYgKGZkID09IC0xICYmIGVycm5vID09IEVJTlZBTCkKLSAgewotICAgIGZkID0gdGltZXJmZF9jcmVhdGUoQ0xPQ0tfTU9OT1RPTklDLCAwKTsKLSAgICBpZiAoZmQgIT0gLTEpCi0gICAgICA6OmZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSAgfQotCi0gIHJldHVybiBmZDsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLSAgcmV0dXJuIC0xOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLX0KLQotZXBvbGxfcmVhY3Rvcjo6ZGVzY3JpcHRvcl9zdGF0ZSogZXBvbGxfcmVhY3Rvcjo6YWxsb2NhdGVfZGVzY3JpcHRvcl9zdGF0ZSgpCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBkZXNjcmlwdG9yc19sb2NrKHJlZ2lzdGVyZWRfZGVzY3JpcHRvcnNfbXV0ZXhfKTsKLSAgcmV0dXJuIHJlZ2lzdGVyZWRfZGVzY3JpcHRvcnNfLmFsbG9jKCk7Ci19Ci0KLXZvaWQgZXBvbGxfcmVhY3Rvcjo6ZnJlZV9kZXNjcmlwdG9yX3N0YXRlKGVwb2xsX3JlYWN0b3I6OmRlc2NyaXB0b3Jfc3RhdGUqIHMpCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBkZXNjcmlwdG9yc19sb2NrKHJlZ2lzdGVyZWRfZGVzY3JpcHRvcnNfbXV0ZXhfKTsKLSAgcmVnaXN0ZXJlZF9kZXNjcmlwdG9yc18uZnJlZShzKTsKLX0KLQotdm9pZCBlcG9sbF9yZWFjdG9yOjpkb19hZGRfdGltZXJfcXVldWUodGltZXJfcXVldWVfYmFzZSYgcXVldWUpCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIHRpbWVyX3F1ZXVlc18uaW5zZXJ0KCZxdWV1ZSk7Ci19Ci0KLXZvaWQgZXBvbGxfcmVhY3Rvcjo6ZG9fcmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlX2Jhc2UmIHF1ZXVlKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICB0aW1lcl9xdWV1ZXNfLmVyYXNlKCZxdWV1ZSk7Ci19Ci0KLXZvaWQgZXBvbGxfcmVhY3Rvcjo6dXBkYXRlX3RpbWVvdXQoKQotewotI2lmIGRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLSAgaWYgKHRpbWVyX2ZkXyAhPSAtMSkKLSAgewotICAgIGl0aW1lcnNwZWMgbmV3X3RpbWVvdXQ7Ci0gICAgaXRpbWVyc3BlYyBvbGRfdGltZW91dDsKLSAgICBpbnQgZmxhZ3MgPSBnZXRfdGltZW91dChuZXdfdGltZW91dCk7Ci0gICAgdGltZXJmZF9zZXR0aW1lKHRpbWVyX2ZkXywgZmxhZ3MsICZuZXdfdGltZW91dCwgJm9sZF90aW1lb3V0KTsKLSAgICByZXR1cm47Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1RJTUVSRkQpCi0gIGludGVycnVwdCgpOwotfQotCi1pbnQgZXBvbGxfcmVhY3Rvcjo6Z2V0X3RpbWVvdXQoKQotewotICAvLyBCeSBkZWZhdWx0IHdlIHdpbGwgd2FpdCBubyBsb25nZXIgdGhhbiA1IG1pbnV0ZXMuIFRoaXMgd2lsbCBlbnN1cmUgdGhhdAotICAvLyBhbnkgY2hhbmdlcyB0byB0aGUgc3lzdGVtIGNsb2NrIGFyZSBkZXRlY3RlZCBhZnRlciBubyBsb25nZXIgdGhhbiB0aGlzLgotICByZXR1cm4gdGltZXJfcXVldWVzXy53YWl0X2R1cmF0aW9uX21zZWMoNSAqIDYwICogMTAwMCk7Ci19Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1RJTUVSRkQpCi1pbnQgZXBvbGxfcmVhY3Rvcjo6Z2V0X3RpbWVvdXQoaXRpbWVyc3BlYyYgdHMpCi17Ci0gIHRzLml0X2ludGVydmFsLnR2X3NlYyA9IDA7Ci0gIHRzLml0X2ludGVydmFsLnR2X25zZWMgPSAwOwotCi0gIGxvbmcgdXNlYyA9IHRpbWVyX3F1ZXVlc18ud2FpdF9kdXJhdGlvbl91c2VjKDUgKiA2MCAqIDEwMDAgKiAxMDAwKTsKLSAgdHMuaXRfdmFsdWUudHZfc2VjID0gdXNlYyAvIDEwMDAwMDA7Ci0gIHRzLml0X3ZhbHVlLnR2X25zZWMgPSB1c2VjID8gKHVzZWMgJSAxMDAwMDAwKSAqIDEwMDAgOiAxOwotCi0gIHJldHVybiB1c2VjID8gMCA6IFRGRF9USU1FUl9BQlNUSU1FOwotfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfVElNRVJGRCkKLQotc3RydWN0IGVwb2xsX3JlYWN0b3I6OnBlcmZvcm1faW9fY2xlYW51cF9vbl9ibG9ja19leGl0Ci17Ci0gIGV4cGxpY2l0IHBlcmZvcm1faW9fY2xlYW51cF9vbl9ibG9ja19leGl0KGVwb2xsX3JlYWN0b3IqIHIpCi0gICAgOiByZWFjdG9yXyhyKSwgZmlyc3Rfb3BfKDApCi0gIHsKLSAgfQotCi0gIH5wZXJmb3JtX2lvX2NsZWFudXBfb25fYmxvY2tfZXhpdCgpCi0gIHsKLSAgICBpZiAoZmlyc3Rfb3BfKQotICAgIHsKLSAgICAgIC8vIFBvc3QgdGhlIHJlbWFpbmluZyBjb21wbGV0ZWQgb3BlcmF0aW9ucyBmb3IgaW52b2NhdGlvbi4KLSAgICAgIGlmICghb3BzXy5lbXB0eSgpKQotICAgICAgICByZWFjdG9yXy0+aW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHNfKTsKLQotICAgICAgLy8gQSB1c2VyLWluaXRpYXRlZCBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCwgYnV0IHRoZXJlJ3Mgbm8gbmVlZCB0bwotICAgICAgLy8gZXhwbGljaXRseSBjYWxsIHdvcmtfZmluaXNoZWQoKSBoZXJlLiBJbnN0ZWFkLCB3ZSdsbCB0YWtlIGFkdmFudGFnZSBvZgotICAgICAgLy8gdGhlIGZhY3QgdGhhdCB0aGUgdGFza19pb19zZXJ2aWNlIHdpbGwgY2FsbCB3b3JrX2ZpbmlzaGVkKCkgb25jZSB3ZQotICAgICAgLy8gcmV0dXJuLgotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gTm8gdXNlci1pbml0aWF0ZWQgb3BlcmF0aW9ucyBoYXZlIGNvbXBsZXRlZCwgc28gd2UgbmVlZCB0byBjb21wZW5zYXRlCi0gICAgICAvLyBmb3IgdGhlIHdvcmtfZmluaXNoZWQoKSBjYWxsIHRoYXQgdGhlIHRhc2tfaW9fc2VydmljZSB3aWxsIG1ha2Ugb25jZQotICAgICAgLy8gdGhpcyBvcGVyYXRpb24gcmV0dXJucy4KLSAgICAgIHJlYWN0b3JfLT5pb19zZXJ2aWNlXy53b3JrX3N0YXJ0ZWQoKTsKLSAgICB9Ci0gIH0KLQotICBlcG9sbF9yZWFjdG9yKiByZWFjdG9yXzsKLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHNfOwotICBvcGVyYXRpb24qIGZpcnN0X29wXzsKLX07Ci0KLWVwb2xsX3JlYWN0b3I6OmRlc2NyaXB0b3Jfc3RhdGU6OmRlc2NyaXB0b3Jfc3RhdGUoKQotICA6IG9wZXJhdGlvbigmZXBvbGxfcmVhY3Rvcjo6ZGVzY3JpcHRvcl9zdGF0ZTo6ZG9fY29tcGxldGUpCi17Ci19Ci0KLW9wZXJhdGlvbiogZXBvbGxfcmVhY3Rvcjo6ZGVzY3JpcHRvcl9zdGF0ZTo6cGVyZm9ybV9pbyh1aW50MzJfdCBldmVudHMpCi17Ci0gIG11dGV4Xy5sb2NrKCk7Ci0gIHBlcmZvcm1faW9fY2xlYW51cF9vbl9ibG9ja19leGl0IGlvX2NsZWFudXAocmVhY3Rvcl8pOwotICBtdXRleDo6c2NvcGVkX2xvY2sgZGVzY3JpcHRvcl9sb2NrKG11dGV4XywgbXV0ZXg6OnNjb3BlZF9sb2NrOjphZG9wdF9sb2NrKTsKLQotICAvLyBFeGNlcHRpb24gb3BlcmF0aW9ucyBtdXN0IGJlIHByb2Nlc3NlZCBmaXJzdCB0byBlbnN1cmUgdGhhdCBhbnkKLSAgLy8gb3V0LW9mLWJhbmQgZGF0YSBpcyByZWFkIGJlZm9yZSBub3JtYWwgZGF0YS4KLSAgc3RhdGljIGNvbnN0IGludCBmbGFnW21heF9vcHNdID0geyBFUE9MTElOLCBFUE9MTE9VVCwgRVBPTExQUkkgfTsKLSAgZm9yIChpbnQgaiA9IG1heF9vcHMgLSAxOyBqID49IDA7IC0taikKLSAgewotICAgIGlmIChldmVudHMgJiAoZmxhZ1tqXSB8IEVQT0xMRVJSIHwgRVBPTExIVVApKQotICAgIHsKLSAgICAgIHdoaWxlIChyZWFjdG9yX29wKiBvcCA9IG9wX3F1ZXVlX1tqXS5mcm9udCgpKQotICAgICAgewotICAgICAgICBpZiAob3AtPnBlcmZvcm0oKSkKLSAgICAgICAgewotICAgICAgICAgIG9wX3F1ZXVlX1tqXS5wb3AoKTsKLSAgICAgICAgICBpb19jbGVhbnVwLm9wc18ucHVzaChvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFRoZSBmaXJzdCBvcGVyYXRpb24gd2lsbCBiZSByZXR1cm5lZCBmb3IgY29tcGxldGlvbiBub3cuIFRoZSBvdGhlcnMgd2lsbAotICAvLyBiZSBwb3N0ZWQgZm9yIGxhdGVyIGJ5IHRoZSBpb19jbGVhbnVwIG9iamVjdCdzIGRlc3RydWN0b3IuCi0gIGlvX2NsZWFudXAuZmlyc3Rfb3BfID0gaW9fY2xlYW51cC5vcHNfLmZyb250KCk7Ci0gIGlvX2NsZWFudXAub3BzXy5wb3AoKTsKLSAgcmV0dXJuIGlvX2NsZWFudXAuZmlyc3Rfb3BfOwotfQotCi12b2lkIGVwb2xsX3JlYWN0b3I6OmRlc2NyaXB0b3Jfc3RhdGU6OmRvX2NvbXBsZXRlKAotICAgIGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQpCi17Ci0gIGlmIChvd25lcikKLSAgewotICAgIGRlc2NyaXB0b3Jfc3RhdGUqIGRlc2NyaXB0b3JfZGF0YSA9IHN0YXRpY19jYXN0PGRlc2NyaXB0b3Jfc3RhdGUqPihiYXNlKTsKLSAgICB1aW50MzJfdCBldmVudHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIGlmIChvcGVyYXRpb24qIG9wID0gZGVzY3JpcHRvcl9kYXRhLT5wZXJmb3JtX2lvKGV2ZW50cykpCi0gICAgewotICAgICAgb3AtPmNvbXBsZXRlKCpvd25lciwgZWMsIDApOwotICAgIH0KLSAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfRVBPTEwpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX0VQT0xMX1JFQUNUT1JfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvZXZlbnRmZF9zZWxlY3RfaW50ZXJydXB0ZXIuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL2V2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyLmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0YWIwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvZXZlbnRmZF9zZWxlY3RfaW50ZXJydXB0ZXIuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC9ldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlci5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IFJvZWxvZiBOYXVkZSAocm9lbG9mLm5hdWRlIGF0IGdtYWlsIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfRVZFTlRGRF9TRUxFQ1RfSU5URVJSVVBURVJfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfRVZFTlRGRF9TRUxFQ1RfSU5URVJSVVBURVJfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0VWRU5URkQpCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaWYgX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fIDwgOAotIyBpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0jZWxzZSAvLyBfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPCA4Ci0jIGluY2x1ZGUgPHN5cy9ldmVudGZkLmg+Ci0jZW5kaWYgLy8gX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fIDwgOAotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NzdGRpbnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2V2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotZXZlbnRmZF9zZWxlY3RfaW50ZXJydXB0ZXI6OmV2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyKCkKLXsKLSAgb3Blbl9kZXNjcmlwdG9ycygpOwotfQotCi12b2lkIGV2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyOjpvcGVuX2Rlc2NyaXB0b3JzKCkKLXsKLSNpZiBfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPCA4Ci0gIHdyaXRlX2Rlc2NyaXB0b3JfID0gcmVhZF9kZXNjcmlwdG9yXyA9IHN5c2NhbGwoX19OUl9ldmVudGZkLCAwKTsKLSAgaWYgKHJlYWRfZGVzY3JpcHRvcl8gIT0gLTEpCi0gIHsKLSAgICA6OmZjbnRsKHJlYWRfZGVzY3JpcHRvcl8sIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotICAgIDo6ZmNudGwocmVhZF9kZXNjcmlwdG9yXywgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0gIH0KLSNlbHNlIC8vIF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA8IDgKLSMgaWYgZGVmaW5lZChFRkRfQ0xPRVhFQykgJiYgZGVmaW5lZChFRkRfTk9OQkxPQ0spCi0gIHdyaXRlX2Rlc2NyaXB0b3JfID0gcmVhZF9kZXNjcmlwdG9yXyA9Ci0gICAgOjpldmVudGZkKDAsIEVGRF9DTE9FWEVDIHwgRUZEX05PTkJMT0NLKTsKLSMgZWxzZSAvLyBkZWZpbmVkKEVGRF9DTE9FWEVDKSAmJiBkZWZpbmVkKEVGRF9OT05CTE9DSykKLSAgZXJybm8gPSBFSU5WQUw7Ci0gIHdyaXRlX2Rlc2NyaXB0b3JfID0gcmVhZF9kZXNjcmlwdG9yXyA9IC0xOwotIyBlbmRpZiAvLyBkZWZpbmVkKEVGRF9DTE9FWEVDKSAmJiBkZWZpbmVkKEVGRF9OT05CTE9DSykKLSAgaWYgKHJlYWRfZGVzY3JpcHRvcl8gPT0gLTEgJiYgZXJybm8gPT0gRUlOVkFMKQotICB7Ci0gICAgd3JpdGVfZGVzY3JpcHRvcl8gPSByZWFkX2Rlc2NyaXB0b3JfID0gOjpldmVudGZkKDAsIDApOwotICAgIGlmIChyZWFkX2Rlc2NyaXB0b3JfICE9IC0xKQotICAgIHsKLSAgICAgIDo6ZmNudGwocmVhZF9kZXNjcmlwdG9yXywgRl9TRVRGTCwgT19OT05CTE9DSyk7Ci0gICAgICA6OmZjbnRsKHJlYWRfZGVzY3JpcHRvcl8sIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotICAgIH0KLSAgfQotI2VuZGlmIC8vIF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA8IDgKLQotICBpZiAocmVhZF9kZXNjcmlwdG9yXyA9PSAtMSkKLSAgewotICAgIGludCBwaXBlX2Zkc1syXTsKLSAgICBpZiAocGlwZShwaXBlX2ZkcykgPT0gMCkKLSAgICB7Ci0gICAgICByZWFkX2Rlc2NyaXB0b3JfID0gcGlwZV9mZHNbMF07Ci0gICAgICA6OmZjbnRsKHJlYWRfZGVzY3JpcHRvcl8sIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotICAgICAgOjpmY250bChyZWFkX2Rlc2NyaXB0b3JfLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSAgICAgIHdyaXRlX2Rlc2NyaXB0b3JfID0gcGlwZV9mZHNbMV07Ci0gICAgICA6OmZjbnRsKHdyaXRlX2Rlc2NyaXB0b3JfLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKLSAgICAgIDo6ZmNudGwod3JpdGVfZGVzY3JpcHRvcl8sIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhlcnJubywKLSAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlciIpOwotICAgIH0KLSAgfQotfQotCi1ldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlcjo6fmV2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyKCkKLXsKLSAgY2xvc2VfZGVzY3JpcHRvcnMoKTsKLX0KLQotdm9pZCBldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlcjo6Y2xvc2VfZGVzY3JpcHRvcnMoKQotewotICBpZiAod3JpdGVfZGVzY3JpcHRvcl8gIT0gLTEgJiYgd3JpdGVfZGVzY3JpcHRvcl8gIT0gcmVhZF9kZXNjcmlwdG9yXykKLSAgICA6OmNsb3NlKHdyaXRlX2Rlc2NyaXB0b3JfKTsKLSAgaWYgKHJlYWRfZGVzY3JpcHRvcl8gIT0gLTEpCi0gICAgOjpjbG9zZShyZWFkX2Rlc2NyaXB0b3JfKTsKLX0KLQotdm9pZCBldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlcjo6cmVjcmVhdGUoKQotewotICBjbG9zZV9kZXNjcmlwdG9ycygpOwotCi0gIHdyaXRlX2Rlc2NyaXB0b3JfID0gLTE7Ci0gIHJlYWRfZGVzY3JpcHRvcl8gPSAtMTsKLQotICBvcGVuX2Rlc2NyaXB0b3JzKCk7Ci19Ci0KLXZvaWQgZXZlbnRmZF9zZWxlY3RfaW50ZXJydXB0ZXI6OmludGVycnVwdCgpCi17Ci0gIHVpbnQ2NF90IGNvdW50ZXIoMVVMKTsKLSAgaW50IHJlc3VsdCA9IDo6d3JpdGUod3JpdGVfZGVzY3JpcHRvcl8sICZjb3VudGVyLCBzaXplb2YodWludDY0X3QpKTsKLSAgKHZvaWQpcmVzdWx0OwotfQotCi1ib29sIGV2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyOjpyZXNldCgpCi17Ci0gIGlmICh3cml0ZV9kZXNjcmlwdG9yXyA9PSByZWFkX2Rlc2NyaXB0b3JfKQotICB7Ci0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICAvLyBPbmx5IHBlcmZvcm0gb25lIHJlYWQuIFRoZSBrZXJuZWwgbWFpbnRhaW5zIGFuIGF0b21pYyBjb3VudGVyLgotICAgICAgdWludDY0X3QgY291bnRlcigwKTsKLSAgICAgIGVycm5vID0gMDsKLSAgICAgIGludCBieXRlc19yZWFkID0gOjpyZWFkKHJlYWRfZGVzY3JpcHRvcl8sICZjb3VudGVyLCBzaXplb2YodWludDY0X3QpKTsKLSAgICAgIGlmIChieXRlc19yZWFkIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKLSAgICAgICAgY29udGludWU7Ci0gICAgICBib29sIHdhc19pbnRlcnJ1cHRlZCA9IChieXRlc19yZWFkID4gMCk7Ci0gICAgICByZXR1cm4gd2FzX2ludGVycnVwdGVkOwotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIC8vIENsZWFyIGFsbCBkYXRhIGZyb20gdGhlIHBpcGUuCi0gICAgICBjaGFyIGRhdGFbMTAyNF07Ci0gICAgICBpbnQgYnl0ZXNfcmVhZCA9IDo6cmVhZChyZWFkX2Rlc2NyaXB0b3JfLCBkYXRhLCBzaXplb2YoZGF0YSkpOwotICAgICAgaWYgKGJ5dGVzX3JlYWQgPCAwICYmIGVycm5vID09IEVJTlRSKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGJvb2wgd2FzX2ludGVycnVwdGVkID0gKGJ5dGVzX3JlYWQgPiAwKTsKLSAgICAgIHdoaWxlIChieXRlc19yZWFkID09IHNpemVvZihkYXRhKSkKLSAgICAgICAgYnl0ZXNfcmVhZCA9IDo6cmVhZChyZWFkX2Rlc2NyaXB0b3JfLCBkYXRhLCBzaXplb2YoZGF0YSkpOwotICAgICAgcmV0dXJuIHdhc19pbnRlcnJ1cHRlZDsKLSAgICB9Ci0gIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0VWRU5URkQpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX0VWRU5URkRfU0VMRUNUX0lOVEVSUlVQVEVSX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL2hhbmRsZXJfdHJhY2tpbmcuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL2hhbmRsZXJfdHJhY2tpbmcuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWZiZTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9oYW5kbGVyX3RyYWNraW5nLmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvaGFuZGxlcl90cmFja2luZy5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfSEFORExFUl9UUkFDS0lOR19JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9IQU5ETEVSX1RSQUNLSU5HX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9IQU5ETEVSX1RSQUNLSU5HKQotCi0jaW5jbHVkZSA8Y3N0ZGFyZz4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90cmFja2luZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkKLSMgaW5jbHVkZSAiYXNpby90aW1lX3RyYWl0cy5ocHAiCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkKLSMgaWYgZGVmaW5lZChBU0lPX0hBU19TVERfQ0hST05PKQotIyAgaW5jbHVkZSA8Y2hyb25vPgotIyBlbGlmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ0hST05PKQotIyAgaW5jbHVkZSA8Ym9vc3QvY2hyb25vL3N5c3RlbV9jbG9ja3MuaHBwPgotIyBlbmRpZgotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9jaHJvbm9fdGltZV90cmFpdHMuaHBwIgotIyBpbmNsdWRlICJhc2lvL3dhaXRfdHJhaXRzLmhwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkKLQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXN0cnVjdCBoYW5kbGVyX3RyYWNraW5nX3RpbWVzdGFtcAotewotICB1aW50NjRfdCBzZWNvbmRzOwotICB1aW50NjRfdCBtaWNyb3NlY29uZHM7Ci0KLSAgaGFuZGxlcl90cmFja2luZ190aW1lc3RhbXAoKQotICB7Ci0jaWYgZGVmaW5lZChBU0lPX0hBU19CT09TVF9EQVRFX1RJTUUpCi0gICAgYm9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lIGVwb2NoKGJvb3N0OjpncmVnb3JpYW46OmRhdGUoMTk3MCwgMSwgMSkpOwotICAgIGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uIG5vdyA9Ci0gICAgICBib29zdDo6cG9zaXhfdGltZTo6bWljcm9zZWNfY2xvY2s6OnVuaXZlcnNhbF90aW1lKCkgLSBlcG9jaDsKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfU1REX0NIUk9OTykKLSAgICB0eXBlZGVmIGNocm9ub190aW1lX3RyYWl0czxzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrLAotICAgICAgICBhc2lvOjp3YWl0X3RyYWl0czxzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrPiA+IHRyYWl0c19oZWxwZXI7Ci0gICAgdHJhaXRzX2hlbHBlcjo6cG9zaXhfdGltZV9kdXJhdGlvbiBub3coCi0gICAgICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSk7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0NIUk9OTykKLSAgICB0eXBlZGVmIGNocm9ub190aW1lX3RyYWl0czxib29zdDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2ssCi0gICAgICAgIGFzaW86OndhaXRfdHJhaXRzPGJvb3N0OjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gPiB0cmFpdHNfaGVscGVyOwotICAgIHRyYWl0c19oZWxwZXI6OnBvc2l4X3RpbWVfZHVyYXRpb24gbm93KAotICAgICAgICBib29zdDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKSk7Ci0jZW5kaWYKLSAgICBzZWNvbmRzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5vdy50b3RhbF9zZWNvbmRzKCkpOwotICAgIG1pY3Jvc2Vjb25kcyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pihub3cudG90YWxfbWljcm9zZWNvbmRzKCkgJSAxMDAwMDAwKTsKLSAgfQotfTsKLQotc3RydWN0IGhhbmRsZXJfdHJhY2tpbmc6OnRyYWNraW5nX3N0YXRlCi17Ci0gIHN0YXRpY19tdXRleCBtdXRleF87Ci0gIHVpbnQ2NF90IG5leHRfaWRfOwotICB0c3NfcHRyPGNvbXBsZXRpb24+KiBjdXJyZW50X2NvbXBsZXRpb25fOwotfTsKLQotaGFuZGxlcl90cmFja2luZzo6dHJhY2tpbmdfc3RhdGUqIGhhbmRsZXJfdHJhY2tpbmc6OmdldF9zdGF0ZSgpCi17Ci0gIHN0YXRpYyB0cmFja2luZ19zdGF0ZSBzdGF0ZSA9IHsgQVNJT19TVEFUSUNfTVVURVhfSU5JVCwgMSwgMCB9OwotICByZXR1cm4gJnN0YXRlOwotfQotCi12b2lkIGhhbmRsZXJfdHJhY2tpbmc6OmluaXQoKQotewotICBzdGF0aWMgdHJhY2tpbmdfc3RhdGUqIHN0YXRlID0gZ2V0X3N0YXRlKCk7Ci0KLSAgc3RhdGUtPm11dGV4Xy5pbml0KCk7Ci0KLSAgc3RhdGljX211dGV4OjpzY29wZWRfbG9jayBsb2NrKHN0YXRlLT5tdXRleF8pOwotICBpZiAoc3RhdGUtPmN1cnJlbnRfY29tcGxldGlvbl8gPT0gMCkKLSAgICBzdGF0ZS0+Y3VycmVudF9jb21wbGV0aW9uXyA9IG5ldyB0c3NfcHRyPGNvbXBsZXRpb24+OwotfQotCi12b2lkIGhhbmRsZXJfdHJhY2tpbmc6OmNyZWF0aW9uKGhhbmRsZXJfdHJhY2tpbmc6OnRyYWNrZWRfaGFuZGxlciogaCwKLSAgICBjb25zdCBjaGFyKiBvYmplY3RfdHlwZSwgdm9pZCogb2JqZWN0LCBjb25zdCBjaGFyKiBvcF9uYW1lKQotewotICBzdGF0aWMgdHJhY2tpbmdfc3RhdGUqIHN0YXRlID0gZ2V0X3N0YXRlKCk7Ci0KLSAgc3RhdGljX211dGV4OjpzY29wZWRfbG9jayBsb2NrKHN0YXRlLT5tdXRleF8pOwotICBoLT5pZF8gPSBzdGF0ZS0+bmV4dF9pZF8rKzsKLSAgbG9jay51bmxvY2soKTsKLQotICBoYW5kbGVyX3RyYWNraW5nX3RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0KLSAgdWludDY0X3QgY3VycmVudF9pZCA9IDA7Ci0gIGlmIChjb21wbGV0aW9uKiBjdXJyZW50X2NvbXBsZXRpb24gPSAqc3RhdGUtPmN1cnJlbnRfY29tcGxldGlvbl8pCi0gICAgY3VycmVudF9pZCA9IGN1cnJlbnRfY29tcGxldGlvbi0+aWRfOwotCi0gIHdyaXRlX2xpbmUoCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAiQGFzaW98JUk2NHUuJTA2STY0dXwlSTY0dSolSTY0dXwlLjIwc0AlcC4lLjUwc1xuIiwKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgIkBhc2lvfCVsbHUuJTA2bGx1fCVsbHUqJWxsdXwlLjIwc0AlcC4lLjUwc1xuIiwKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgIHRpbWVzdGFtcC5zZWNvbmRzLCB0aW1lc3RhbXAubWljcm9zZWNvbmRzLAotICAgICAgY3VycmVudF9pZCwgaC0+aWRfLCBvYmplY3RfdHlwZSwgb2JqZWN0LCBvcF9uYW1lKTsKLX0KLQotaGFuZGxlcl90cmFja2luZzo6Y29tcGxldGlvbjo6Y29tcGxldGlvbihoYW5kbGVyX3RyYWNraW5nOjp0cmFja2VkX2hhbmRsZXIqIGgpCi0gIDogaWRfKGgtPmlkXyksCi0gICAgaW52b2tlZF8oZmFsc2UpLAotICAgIG5leHRfKCpnZXRfc3RhdGUoKS0+Y3VycmVudF9jb21wbGV0aW9uXykKLXsKLSAgKmdldF9zdGF0ZSgpLT5jdXJyZW50X2NvbXBsZXRpb25fID0gdGhpczsKLX0KLQotaGFuZGxlcl90cmFja2luZzo6Y29tcGxldGlvbjo6fmNvbXBsZXRpb24oKQotewotICBpZiAoaWRfKQotICB7Ci0gICAgaGFuZGxlcl90cmFja2luZ190aW1lc3RhbXAgdGltZXN0YW1wOwotCi0gICAgd3JpdGVfbGluZSgKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAgIkBhc2lvfCVJNjR1LiUwNkk2NHV8JWMlSTY0dXxcbiIsCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAgIkBhc2lvfCVsbHUuJTA2bGx1fCVjJWxsdXxcbiIsCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgIHRpbWVzdGFtcC5zZWNvbmRzLCB0aW1lc3RhbXAubWljcm9zZWNvbmRzLAotICAgICAgICBpbnZva2VkXyA/ICchJyA6ICd+JywgaWRfKTsKLSAgfQotCi0gICpnZXRfc3RhdGUoKS0+Y3VycmVudF9jb21wbGV0aW9uXyA9IG5leHRfOwotfQotCi12b2lkIGhhbmRsZXJfdHJhY2tpbmc6OmNvbXBsZXRpb246Omludm9jYXRpb25fYmVnaW4oKQotewotICBoYW5kbGVyX3RyYWNraW5nX3RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0KLSAgd3JpdGVfbGluZSgKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICJAYXNpb3wlSTY0dS4lMDZJNjR1fD4lSTY0dXxcbiIsCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICJAYXNpb3wlbGx1LiUwNmxsdXw+JWxsdXxcbiIsCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICB0aW1lc3RhbXAuc2Vjb25kcywgdGltZXN0YW1wLm1pY3Jvc2Vjb25kcywgaWRfKTsKLQotICBpbnZva2VkXyA9IHRydWU7Ci19Ci0KLXZvaWQgaGFuZGxlcl90cmFja2luZzo6Y29tcGxldGlvbjo6aW52b2NhdGlvbl9iZWdpbigKLSAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaGFuZGxlcl90cmFja2luZ190aW1lc3RhbXAgdGltZXN0YW1wOwotCi0gIHdyaXRlX2xpbmUoCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAiQGFzaW98JUk2NHUuJTA2STY0dXw+JUk2NHV8ZWM9JS4yMHM6JWRcbiIsCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICJAYXNpb3wlbGx1LiUwNmxsdXw+JWxsdXxlYz0lLjIwczolZFxuIiwKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgIHRpbWVzdGFtcC5zZWNvbmRzLCB0aW1lc3RhbXAubWljcm9zZWNvbmRzLAotICAgICAgaWRfLCBlYy5jYXRlZ29yeSgpLm5hbWUoKSwgZWMudmFsdWUoKSk7Ci0KLSAgaW52b2tlZF8gPSB0cnVlOwotfQotCi12b2lkIGhhbmRsZXJfdHJhY2tpbmc6OmNvbXBsZXRpb246Omludm9jYXRpb25fYmVnaW4oCi0gICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkKQotewotICBoYW5kbGVyX3RyYWNraW5nX3RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0KLSAgd3JpdGVfbGluZSgKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICJAYXNpb3wlSTY0dS4lMDZJNjR1fD4lSTY0dXxlYz0lLjIwczolZCxieXRlc190cmFuc2ZlcnJlZD0lSTY0dVxuIiwKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgIkBhc2lvfCVsbHUuJTA2bGx1fD4lbGx1fGVjPSUuMjBzOiVkLGJ5dGVzX3RyYW5zZmVycmVkPSVsbHVcbiIsCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICB0aW1lc3RhbXAuc2Vjb25kcywgdGltZXN0YW1wLm1pY3Jvc2Vjb25kcywKLSAgICAgIGlkXywgZWMuY2F0ZWdvcnkoKS5uYW1lKCksIGVjLnZhbHVlKCksCi0gICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYnl0ZXNfdHJhbnNmZXJyZWQpKTsKLQotICBpbnZva2VkXyA9IHRydWU7Ci19Ci0KLXZvaWQgaGFuZGxlcl90cmFja2luZzo6Y29tcGxldGlvbjo6aW52b2NhdGlvbl9iZWdpbigKLSAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywgaW50IHNpZ25hbF9udW1iZXIpCi17Ci0gIGhhbmRsZXJfdHJhY2tpbmdfdGltZXN0YW1wIHRpbWVzdGFtcDsKLQotICB3cml0ZV9saW5lKAotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgIkBhc2lvfCVJNjR1LiUwNkk2NHV8PiVJNjR1fGVjPSUuMjBzOiVkLHNpZ25hbF9udW1iZXI9JWRcbiIsCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICJAYXNpb3wlbGx1LiUwNmxsdXw+JWxsdXxlYz0lLjIwczolZCxzaWduYWxfbnVtYmVyPSVkXG4iLAotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgdGltZXN0YW1wLnNlY29uZHMsIHRpbWVzdGFtcC5taWNyb3NlY29uZHMsCi0gICAgICBpZF8sIGVjLmNhdGVnb3J5KCkubmFtZSgpLCBlYy52YWx1ZSgpLCBzaWduYWxfbnVtYmVyKTsKLQotICBpbnZva2VkXyA9IHRydWU7Ci19Ci0KLXZvaWQgaGFuZGxlcl90cmFja2luZzo6Y29tcGxldGlvbjo6aW52b2NhdGlvbl9iZWdpbigKLSAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywgY29uc3QgY2hhciogYXJnKQotewotICBoYW5kbGVyX3RyYWNraW5nX3RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0KLSAgd3JpdGVfbGluZSgKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICJAYXNpb3wlSTY0dS4lMDZJNjR1fD4lSTY0dXxlYz0lLjIwczolZCwlLjUwc1xuIiwKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgIkBhc2lvfCVsbHUuJTA2bGx1fD4lbGx1fGVjPSUuMjBzOiVkLCUuNTBzXG4iLAotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgdGltZXN0YW1wLnNlY29uZHMsIHRpbWVzdGFtcC5taWNyb3NlY29uZHMsCi0gICAgICBpZF8sIGVjLmNhdGVnb3J5KCkubmFtZSgpLCBlYy52YWx1ZSgpLCBhcmcpOwotCi0gIGludm9rZWRfID0gdHJ1ZTsKLX0KLQotdm9pZCBoYW5kbGVyX3RyYWNraW5nOjpjb21wbGV0aW9uOjppbnZvY2F0aW9uX2VuZCgpCi17Ci0gIGlmIChpZF8pCi0gIHsKLSAgICBoYW5kbGVyX3RyYWNraW5nX3RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0KLSAgICB3cml0ZV9saW5lKAotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgICAiQGFzaW98JUk2NHUuJTA2STY0dXw8JUk2NHV8XG4iLAotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgICJAYXNpb3wlbGx1LiUwNmxsdXw8JWxsdXxcbiIsCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgIHRpbWVzdGFtcC5zZWNvbmRzLCB0aW1lc3RhbXAubWljcm9zZWNvbmRzLCBpZF8pOwotCi0gICAgaWRfID0gMDsKLSAgfQotfQotCi12b2lkIGhhbmRsZXJfdHJhY2tpbmc6Om9wZXJhdGlvbihjb25zdCBjaGFyKiBvYmplY3RfdHlwZSwKLSAgICB2b2lkKiBvYmplY3QsIGNvbnN0IGNoYXIqIG9wX25hbWUpCi17Ci0gIHN0YXRpYyB0cmFja2luZ19zdGF0ZSogc3RhdGUgPSBnZXRfc3RhdGUoKTsKLQotICBoYW5kbGVyX3RyYWNraW5nX3RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0KLSAgdW5zaWduZWQgbG9uZyBsb25nIGN1cnJlbnRfaWQgPSAwOwotICBpZiAoY29tcGxldGlvbiogY3VycmVudF9jb21wbGV0aW9uID0gKnN0YXRlLT5jdXJyZW50X2NvbXBsZXRpb25fKQotICAgIGN1cnJlbnRfaWQgPSBjdXJyZW50X2NvbXBsZXRpb24tPmlkXzsKLQotICB3cml0ZV9saW5lKAotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgIkBhc2lvfCVJNjR1LiUwNkk2NHV8JUk2NHV8JS4yMHNAJXAuJS41MHNcbiIsCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICJAYXNpb3wlbGx1LiUwNmxsdXwlbGx1fCUuMjBzQCVwLiUuNTBzXG4iLAotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgdGltZXN0YW1wLnNlY29uZHMsIHRpbWVzdGFtcC5taWNyb3NlY29uZHMsCi0gICAgICBjdXJyZW50X2lkLCBvYmplY3RfdHlwZSwgb2JqZWN0LCBvcF9uYW1lKTsKLX0KLQotdm9pZCBoYW5kbGVyX3RyYWNraW5nOjp3cml0ZV9saW5lKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKQotewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3Igc3ByaW50ZiAob3IgZXF1aXZhbGVudCkuCi0KLSAgdmFfbGlzdCBhcmdzOwotICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotCi0gIGNoYXIgbGluZVsyNTZdID0gIiI7Ci0jaWYgZGVmaW5lZChBU0lPX0hBU19TRUNVUkVfUlRMKQotICBpbnQgbGVuZ3RoID0gdnNwcmludGZfcyhsaW5lLCBzaXplb2YobGluZSksIGZvcm1hdCwgYXJncyk7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1NFQ1VSRV9SVEwpCi0gIGludCBsZW5ndGggPSB2c3ByaW50ZihsaW5lLCBmb3JtYXQsIGFyZ3MpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLQotICB2YV9lbmQoYXJncyk7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgSEFORExFIHN0ZGVycl9oYW5kbGUgPSA6OkdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKLSAgRFdPUkQgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gIDo6V3JpdGVGaWxlKHN0ZGVycl9oYW5kbGUsIGxpbmUsIGxlbmd0aCwgJmJ5dGVzX3dyaXR0ZW4sIDApOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gIDo6d3JpdGUoU1RERVJSX0ZJTEVOTywgbGluZSwgbGVuZ3RoKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0hBTkRMRVJfVFJBQ0tJTkcpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX0hBTkRMRVJfVFJBQ0tJTkdfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwva3F1ZXVlX3JlYWN0b3IuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL2txdWV1ZV9yZWFjdG9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJjZmYwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwva3F1ZXVlX3JlYWN0b3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL2txdWV1ZV9yZWFjdG9yLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgU3RlZmFuIEFyZW50eiAoc3RlZmFuIGF0IHNvemUgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9LUVVFVUVfUkVBQ1RPUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9LUVVFVUVfUkVBQ1RPUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfS1FVRVVFKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXZvaWQga3F1ZXVlX3JlYWN0b3I6OmFkZF90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlKQotewotICBkb19hZGRfdGltZXJfcXVldWUocXVldWUpOwotfQotCi0vLyBSZW1vdmUgYSB0aW1lciBxdWV1ZSBmcm9tIHRoZSByZWFjdG9yLgotdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotdm9pZCBrcXVldWVfcmVhY3Rvcjo6cmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUpCi17Ci0gIGRvX3JlbW92ZV90aW1lcl9xdWV1ZShxdWV1ZSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXZvaWQga3F1ZXVlX3JlYWN0b3I6OnNjaGVkdWxlX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgY29uc3QgdHlwZW5hbWUgVGltZV9UcmFpdHM6OnRpbWVfdHlwZSYgdGltZSwKLSAgICB0eXBlbmFtZSB0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz46OnBlcl90aW1lcl9kYXRhJiB0aW1lciwgd2FpdF9vcCogb3ApCi17Ci0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLQotICBpZiAoc2h1dGRvd25fKQotICB7Ci0gICAgaW9fc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgZWFybGllc3QgPSBxdWV1ZS5lbnF1ZXVlX3RpbWVyKHRpbWUsIHRpbWVyLCBvcCk7Ci0gIGlvX3NlcnZpY2VfLndvcmtfc3RhcnRlZCgpOwotICBpZiAoZWFybGllc3QpCi0gICAgaW50ZXJydXB0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXN0ZDo6c2l6ZV90IGtxdWV1ZV9yZWFjdG9yOjpjYW5jZWxfdGltZXIodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSwKLSAgICB0eXBlbmFtZSB0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz46OnBlcl90aW1lcl9kYXRhJiB0aW1lciwKLSAgICBzdGQ6OnNpemVfdCBtYXhfY2FuY2VsbGVkKQotewotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIG9wX3F1ZXVlPG9wZXJhdGlvbj4gb3BzOwotICBzdGQ6OnNpemVfdCBuID0gcXVldWUuY2FuY2VsX3RpbWVyKHRpbWVyLCBvcHMsIG1heF9jYW5jZWxsZWQpOwotICBsb2NrLnVubG9jaygpOwotICBpb19zZXJ2aWNlXy5wb3N0X2RlZmVycmVkX2NvbXBsZXRpb25zKG9wcyk7Ci0gIHJldHVybiBuOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfS1FVRVVFKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9LUVVFVUVfUkVBQ1RPUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9rcXVldWVfcmVhY3Rvci5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwva3F1ZXVlX3JlYWN0b3IuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQzNjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9rcXVldWVfcmVhY3Rvci5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL2txdWV1ZV9yZWFjdG9yLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgU3RlZmFuIEFyZW50eiAoc3RlZmFuIGF0IHNvemUgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9LUVVFVUVfUkVBQ1RPUl9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9LUVVFVUVfUkVBQ1RPUl9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfS1FVRVVFKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwva3F1ZXVlX3JlYWN0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKF9fTmV0QlNEX18pCi0jIGRlZmluZSBBU0lPX0tRVUVVRV9FVl9TRVQoZXYsIGlkZW50LCBmaWx0LCBmbGFncywgZmZsYWdzLCBkYXRhLCB1ZGF0YSkgXAotICAgIEVWX1NFVChldiwgaWRlbnQsIGZpbHQsIGZsYWdzLCBmZmxhZ3MsIGRhdGEsIFwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHN0YXRpY19jYXN0PHZvaWQqPih1ZGF0YSkpKQotI2Vsc2UKLSMgZGVmaW5lIEFTSU9fS1FVRVVFX0VWX1NFVChldiwgaWRlbnQsIGZpbHQsIGZsYWdzLCBmZmxhZ3MsIGRhdGEsIHVkYXRhKSBcCi0gICAgRVZfU0VUKGV2LCBpZGVudCwgZmlsdCwgZmxhZ3MsIGZmbGFncywgZGF0YSwgdWRhdGEpCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWtxdWV1ZV9yZWFjdG9yOjprcXVldWVfcmVhY3Rvcihhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICA6IGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPGtxdWV1ZV9yZWFjdG9yPihpb19zZXJ2aWNlKSwKLSAgICBpb19zZXJ2aWNlXyh1c2Vfc2VydmljZTxpb19zZXJ2aWNlX2ltcGw+KGlvX3NlcnZpY2UpKSwKLSAgICBtdXRleF8oKSwKLSAgICBrcXVldWVfZmRfKGRvX2txdWV1ZV9jcmVhdGUoKSksCi0gICAgaW50ZXJydXB0ZXJfKCksCi0gICAgc2h1dGRvd25fKGZhbHNlKQotewotICBzdHJ1Y3Qga2V2ZW50IGV2ZW50c1sxXTsKLSAgQVNJT19LUVVFVUVfRVZfU0VUKCZldmVudHNbMF0sIGludGVycnVwdGVyXy5yZWFkX2Rlc2NyaXB0b3IoKSwKLSAgICAgIEVWRklMVF9SRUFELCBFVl9BREQsIDAsIDAsICZpbnRlcnJ1cHRlcl8pOwotICBpZiAoOjprZXZlbnQoa3F1ZXVlX2ZkXywgZXZlbnRzLCAxLCAwLCAwLCAwKSA9PSAtMSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZXJyb3IoZXJybm8sCi0gICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZXJyb3IpOwotICB9Ci19Ci0KLWtxdWV1ZV9yZWFjdG9yOjp+a3F1ZXVlX3JlYWN0b3IoKQotewotICBjbG9zZShrcXVldWVfZmRfKTsKLX0KLQotdm9pZCBrcXVldWVfcmVhY3Rvcjo6c2h1dGRvd25fc2VydmljZSgpCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIHNodXRkb3duXyA9IHRydWU7Ci0gIGxvY2sudW5sb2NrKCk7Ci0KLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0KLSAgd2hpbGUgKGRlc2NyaXB0b3Jfc3RhdGUqIHN0YXRlID0gcmVnaXN0ZXJlZF9kZXNjcmlwdG9yc18uZmlyc3QoKSkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4X29wczsgKytpKQotICAgICAgb3BzLnB1c2goc3RhdGUtPm9wX3F1ZXVlX1tpXSk7Ci0gICAgc3RhdGUtPnNodXRkb3duXyA9IHRydWU7Ci0gICAgcmVnaXN0ZXJlZF9kZXNjcmlwdG9yc18uZnJlZShzdGF0ZSk7Ci0gIH0KLQotICB0aW1lcl9xdWV1ZXNfLmdldF9hbGxfdGltZXJzKG9wcyk7Ci0KLSAgaW9fc2VydmljZV8uYWJhbmRvbl9vcGVyYXRpb25zKG9wcyk7Ci19Ci0KLXZvaWQga3F1ZXVlX3JlYWN0b3I6OmZvcmtfc2VydmljZShhc2lvOjppb19zZXJ2aWNlOjpmb3JrX2V2ZW50IGZvcmtfZXYpCi17Ci0gIGlmIChmb3JrX2V2ID09IGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfY2hpbGQpCi0gIHsKLSAgICAvLyBUaGUga3F1ZXVlIGRlc2NyaXB0b3IgaXMgYXV0b21hdGljYWxseSBjbG9zZWQgaW4gdGhlIGNoaWxkLgotICAgIGtxdWV1ZV9mZF8gPSAtMTsKLSAgICBrcXVldWVfZmRfID0gZG9fa3F1ZXVlX2NyZWF0ZSgpOwotCi0gICAgaW50ZXJydXB0ZXJfLnJlY3JlYXRlKCk7Ci0KLSAgICBzdHJ1Y3Qga2V2ZW50IGV2ZW50c1syXTsKLSAgICBBU0lPX0tRVUVVRV9FVl9TRVQoJmV2ZW50c1swXSwgaW50ZXJydXB0ZXJfLnJlYWRfZGVzY3JpcHRvcigpLAotICAgICAgICBFVkZJTFRfUkVBRCwgRVZfQURELCAwLCAwLCAmaW50ZXJydXB0ZXJfKTsKLSAgICBpZiAoOjprZXZlbnQoa3F1ZXVlX2ZkXywgZXZlbnRzLCAxLCAwLCAwLCAwKSA9PSAtMSkKLSAgICB7Ci0gICAgICBhc2lvOjplcnJvcl9jb2RlIGVjKGVycm5vLAotICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImtxdWV1ZSBpbnRlcnJ1cHRlciByZWdpc3RyYXRpb24iKTsKLSAgICB9Ci0KLSAgICAvLyBSZS1yZWdpc3RlciBhbGwgZGVzY3JpcHRvcnMgd2l0aCBrcXVldWUuCi0gICAgbXV0ZXg6OnNjb3BlZF9sb2NrIGRlc2NyaXB0b3JzX2xvY2socmVnaXN0ZXJlZF9kZXNjcmlwdG9yc19tdXRleF8pOwotICAgIGZvciAoZGVzY3JpcHRvcl9zdGF0ZSogc3RhdGUgPSByZWdpc3RlcmVkX2Rlc2NyaXB0b3JzXy5maXJzdCgpOwotICAgICAgICBzdGF0ZSAhPSAwOyBzdGF0ZSA9IHN0YXRlLT5uZXh0XykKLSAgICB7Ci0gICAgICBpZiAoc3RhdGUtPm51bV9rZXZlbnRzXyA+IDApCi0gICAgICB7Ci0gICAgICAgIEFTSU9fS1FVRVVFX0VWX1NFVCgmZXZlbnRzWzBdLCBzdGF0ZS0+ZGVzY3JpcHRvcl8sCi0gICAgICAgICAgICBFVkZJTFRfUkVBRCwgRVZfQUREIHwgRVZfQ0xFQVIsIDAsIDAsIHN0YXRlKTsKLSAgICAgICAgQVNJT19LUVVFVUVfRVZfU0VUKCZldmVudHNbMV0sIHN0YXRlLT5kZXNjcmlwdG9yXywKLSAgICAgICAgICAgIEVWRklMVF9XUklURSwgRVZfQUREIHwgRVZfQ0xFQVIsIDAsIDAsIHN0YXRlKTsKLSAgICAgICAgaWYgKDo6a2V2ZW50KGtxdWV1ZV9mZF8sIGV2ZW50cywgc3RhdGUtPm51bV9rZXZlbnRzXywgMCwgMCwgMCkgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBhc2lvOjplcnJvcl9jb2RlIGVjKGVycm5vLAotICAgICAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgICAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAia3F1ZXVlIHJlLXJlZ2lzdHJhdGlvbiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQga3F1ZXVlX3JlYWN0b3I6OmluaXRfdGFzaygpCi17Ci0gIGlvX3NlcnZpY2VfLmluaXRfdGFzaygpOwotfQotCi1pbnQga3F1ZXVlX3JlYWN0b3I6OnJlZ2lzdGVyX2Rlc2NyaXB0b3Ioc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICBrcXVldWVfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYgZGVzY3JpcHRvcl9kYXRhKQotewotICBkZXNjcmlwdG9yX2RhdGEgPSBhbGxvY2F0ZV9kZXNjcmlwdG9yX3N0YXRlKCk7Ci0KLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZGVzY3JpcHRvcl9kYXRhLT5tdXRleF8pOwotCi0gIGRlc2NyaXB0b3JfZGF0YS0+ZGVzY3JpcHRvcl8gPSBkZXNjcmlwdG9yOwotICBkZXNjcmlwdG9yX2RhdGEtPm51bV9rZXZlbnRzXyA9IDA7Ci0gIGRlc2NyaXB0b3JfZGF0YS0+c2h1dGRvd25fID0gZmFsc2U7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBrcXVldWVfcmVhY3Rvcjo6cmVnaXN0ZXJfaW50ZXJuYWxfZGVzY3JpcHRvcigKLSAgICBpbnQgb3BfdHlwZSwgc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICBrcXVldWVfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYgZGVzY3JpcHRvcl9kYXRhLCByZWFjdG9yX29wKiBvcCkKLXsKLSAgZGVzY3JpcHRvcl9kYXRhID0gYWxsb2NhdGVfZGVzY3JpcHRvcl9zdGF0ZSgpOwotCi0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKGRlc2NyaXB0b3JfZGF0YS0+bXV0ZXhfKTsKLQotICBkZXNjcmlwdG9yX2RhdGEtPmRlc2NyaXB0b3JfID0gZGVzY3JpcHRvcjsKLSAgZGVzY3JpcHRvcl9kYXRhLT5udW1fa2V2ZW50c18gPSAxOwotICBkZXNjcmlwdG9yX2RhdGEtPnNodXRkb3duXyA9IGZhbHNlOwotICBkZXNjcmlwdG9yX2RhdGEtPm9wX3F1ZXVlX1tvcF90eXBlXS5wdXNoKG9wKTsKLQotICBzdHJ1Y3Qga2V2ZW50IGV2ZW50c1sxXTsKLSAgQVNJT19LUVVFVUVfRVZfU0VUKCZldmVudHNbMF0sIGRlc2NyaXB0b3IsIEVWRklMVF9SRUFELAotICAgICAgRVZfQUREIHwgRVZfQ0xFQVIsIDAsIDAsIGRlc2NyaXB0b3JfZGF0YSk7Ci0gIGlmICg6OmtldmVudChrcXVldWVfZmRfLCBldmVudHMsIDEsIDAsIDAsIDApID09IC0xKQotICAgIHJldHVybiBlcnJubzsKLQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBrcXVldWVfcmVhY3Rvcjo6bW92ZV9kZXNjcmlwdG9yKHNvY2tldF90eXBlLAotICAgIGtxdWV1ZV9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJiB0YXJnZXRfZGVzY3JpcHRvcl9kYXRhLAotICAgIGtxdWV1ZV9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJiBzb3VyY2VfZGVzY3JpcHRvcl9kYXRhKQotewotICB0YXJnZXRfZGVzY3JpcHRvcl9kYXRhID0gc291cmNlX2Rlc2NyaXB0b3JfZGF0YTsKLSAgc291cmNlX2Rlc2NyaXB0b3JfZGF0YSA9IDA7Ci19Ci0KLXZvaWQga3F1ZXVlX3JlYWN0b3I6OnN0YXJ0X29wKGludCBvcF90eXBlLCBzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgIGtxdWV1ZV9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJiBkZXNjcmlwdG9yX2RhdGEsIHJlYWN0b3Jfb3AqIG9wLAotICAgIGJvb2wgaXNfY29udGludWF0aW9uLCBib29sIGFsbG93X3NwZWN1bGF0aXZlKQotewotICBpZiAoIWRlc2NyaXB0b3JfZGF0YSkKLSAgewotICAgIG9wLT5lY18gPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgaXNfY29udGludWF0aW9uKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtdXRleDo6c2NvcGVkX2xvY2sgZGVzY3JpcHRvcl9sb2NrKGRlc2NyaXB0b3JfZGF0YS0+bXV0ZXhfKTsKLQotICBpZiAoZGVzY3JpcHRvcl9kYXRhLT5zaHV0ZG93bl8pCi0gIHsKLSAgICBwb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKG9wLCBpc19jb250aW51YXRpb24pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChkZXNjcmlwdG9yX2RhdGEtPm9wX3F1ZXVlX1tvcF90eXBlXS5lbXB0eSgpKQotICB7Ci0gICAgc3RhdGljIGNvbnN0IGludCBudW1fa2V2ZW50c1ttYXhfb3BzXSA9IHsgMSwgMiwgMSB9OwotCi0gICAgaWYgKGFsbG93X3NwZWN1bGF0aXZlCi0gICAgICAgICYmIChvcF90eXBlICE9IHJlYWRfb3AKLSAgICAgICAgICB8fCBkZXNjcmlwdG9yX2RhdGEtPm9wX3F1ZXVlX1tleGNlcHRfb3BdLmVtcHR5KCkpKQotICAgIHsKLSAgICAgIGlmIChvcC0+cGVyZm9ybSgpKQotICAgICAgewotICAgICAgICBkZXNjcmlwdG9yX2xvY2sudW5sb2NrKCk7Ci0gICAgICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlc2NyaXB0b3JfZGF0YS0+bnVtX2tldmVudHNfIDwgbnVtX2tldmVudHNbb3BfdHlwZV0pCi0gICAgICB7Ci0gICAgICAgIHN0cnVjdCBrZXZlbnQgZXZlbnRzWzJdOwotICAgICAgICBBU0lPX0tRVUVVRV9FVl9TRVQoJmV2ZW50c1swXSwgZGVzY3JpcHRvciwgRVZGSUxUX1JFQUQsCi0gICAgICAgICAgICBFVl9BREQgfCBFVl9DTEVBUiwgMCwgMCwgZGVzY3JpcHRvcl9kYXRhKTsKLSAgICAgICAgQVNJT19LUVVFVUVfRVZfU0VUKCZldmVudHNbMV0sIGRlc2NyaXB0b3IsIEVWRklMVF9XUklURSwKLSAgICAgICAgICAgIEVWX0FERCB8IEVWX0NMRUFSLCAwLCAwLCBkZXNjcmlwdG9yX2RhdGEpOwotICAgICAgICBpZiAoOjprZXZlbnQoa3F1ZXVlX2ZkXywgZXZlbnRzLCBudW1fa2V2ZW50c1tvcF90eXBlXSwgMCwgMCwgMCkgIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdG9yX2RhdGEtPm51bV9rZXZlbnRzXyA9IG51bV9rZXZlbnRzW29wX3R5cGVdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG9wLT5lY18gPSBhc2lvOjplcnJvcl9jb2RlKGVycm5vLAotICAgICAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgICAgICBpb19zZXJ2aWNlXy5wb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKG9wLCBpc19jb250aW51YXRpb24pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGRlc2NyaXB0b3JfZGF0YS0+bnVtX2tldmVudHNfIDwgbnVtX2tldmVudHNbb3BfdHlwZV0pCi0gICAgICAgIGRlc2NyaXB0b3JfZGF0YS0+bnVtX2tldmVudHNfID0gbnVtX2tldmVudHNbb3BfdHlwZV07Ci0KLSAgICAgIHN0cnVjdCBrZXZlbnQgZXZlbnRzWzJdOwotICAgICAgQVNJT19LUVVFVUVfRVZfU0VUKCZldmVudHNbMF0sIGRlc2NyaXB0b3IsIEVWRklMVF9SRUFELAotICAgICAgICAgIEVWX0FERCB8IEVWX0NMRUFSLCAwLCAwLCBkZXNjcmlwdG9yX2RhdGEpOwotICAgICAgQVNJT19LUVVFVUVfRVZfU0VUKCZldmVudHNbMV0sIGRlc2NyaXB0b3IsIEVWRklMVF9XUklURSwKLSAgICAgICAgICBFVl9BREQgfCBFVl9DTEVBUiwgMCwgMCwgZGVzY3JpcHRvcl9kYXRhKTsKLSAgICAgIDo6a2V2ZW50KGtxdWV1ZV9mZF8sIGV2ZW50cywgZGVzY3JpcHRvcl9kYXRhLT5udW1fa2V2ZW50c18sIDAsIDAsIDApOwotICAgIH0KLSAgfQotCi0gIGRlc2NyaXB0b3JfZGF0YS0+b3BfcXVldWVfW29wX3R5cGVdLnB1c2gob3ApOwotICBpb19zZXJ2aWNlXy53b3JrX3N0YXJ0ZWQoKTsKLX0KLQotdm9pZCBrcXVldWVfcmVhY3Rvcjo6Y2FuY2VsX29wcyhzb2NrZXRfdHlwZSwKLSAgICBrcXVldWVfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYgZGVzY3JpcHRvcl9kYXRhKQotewotICBpZiAoIWRlc2NyaXB0b3JfZGF0YSkKLSAgICByZXR1cm47Ci0KLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGRlc2NyaXB0b3JfbG9jayhkZXNjcmlwdG9yX2RhdGEtPm11dGV4Xyk7Ci0KLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4X29wczsgKytpKQotICB7Ci0gICAgd2hpbGUgKHJlYWN0b3Jfb3AqIG9wID0gZGVzY3JpcHRvcl9kYXRhLT5vcF9xdWV1ZV9baV0uZnJvbnQoKSkKLSAgICB7Ci0gICAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkOwotICAgICAgZGVzY3JpcHRvcl9kYXRhLT5vcF9xdWV1ZV9baV0ucG9wKCk7Ci0gICAgICBvcHMucHVzaChvcCk7Ci0gICAgfQotICB9Ci0KLSAgZGVzY3JpcHRvcl9sb2NrLnVubG9jaygpOwotCi0gIGlvX3NlcnZpY2VfLnBvc3RfZGVmZXJyZWRfY29tcGxldGlvbnMob3BzKTsKLX0KLQotdm9pZCBrcXVldWVfcmVhY3Rvcjo6ZGVyZWdpc3Rlcl9kZXNjcmlwdG9yKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAga3F1ZXVlX3JlYWN0b3I6OnBlcl9kZXNjcmlwdG9yX2RhdGEmIGRlc2NyaXB0b3JfZGF0YSwgYm9vbCBjbG9zaW5nKQotewotICBpZiAoIWRlc2NyaXB0b3JfZGF0YSkKLSAgICByZXR1cm47Ci0KLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGRlc2NyaXB0b3JfbG9jayhkZXNjcmlwdG9yX2RhdGEtPm11dGV4Xyk7Ci0KLSAgaWYgKCFkZXNjcmlwdG9yX2RhdGEtPnNodXRkb3duXykKLSAgewotICAgIGlmIChjbG9zaW5nKQotICAgIHsKLSAgICAgIC8vIFRoZSBkZXNjcmlwdG9yIHdpbGwgYmUgYXV0b21hdGljYWxseSByZW1vdmVkIGZyb20gdGhlIGtxdWV1ZSB3aGVuIGl0Ci0gICAgICAvLyBpcyBjbG9zZWQuCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qga2V2ZW50IGV2ZW50c1syXTsKLSAgICAgIEFTSU9fS1FVRVVFX0VWX1NFVCgmZXZlbnRzWzBdLCBkZXNjcmlwdG9yLAotICAgICAgICAgIEVWRklMVF9SRUFELCBFVl9ERUxFVEUsIDAsIDAsIDApOwotICAgICAgQVNJT19LUVVFVUVfRVZfU0VUKCZldmVudHNbMV0sIGRlc2NyaXB0b3IsCi0gICAgICAgICAgRVZGSUxUX1dSSVRFLCBFVl9ERUxFVEUsIDAsIDAsIDApOwotICAgICAgOjprZXZlbnQoa3F1ZXVlX2ZkXywgZXZlbnRzLCBkZXNjcmlwdG9yX2RhdGEtPm51bV9rZXZlbnRzXywgMCwgMCwgMCk7Ci0gICAgfQotCi0gICAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfb3BzOyArK2kpCi0gICAgewotICAgICAgd2hpbGUgKHJlYWN0b3Jfb3AqIG9wID0gZGVzY3JpcHRvcl9kYXRhLT5vcF9xdWV1ZV9baV0uZnJvbnQoKSkKLSAgICAgIHsKLSAgICAgICAgb3AtPmVjXyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZDsKLSAgICAgICAgZGVzY3JpcHRvcl9kYXRhLT5vcF9xdWV1ZV9baV0ucG9wKCk7Ci0gICAgICAgIG9wcy5wdXNoKG9wKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkZXNjcmlwdG9yX2RhdGEtPmRlc2NyaXB0b3JfID0gLTE7Ci0gICAgZGVzY3JpcHRvcl9kYXRhLT5zaHV0ZG93bl8gPSB0cnVlOwotCi0gICAgZGVzY3JpcHRvcl9sb2NrLnVubG9jaygpOwotCi0gICAgZnJlZV9kZXNjcmlwdG9yX3N0YXRlKGRlc2NyaXB0b3JfZGF0YSk7Ci0gICAgZGVzY3JpcHRvcl9kYXRhID0gMDsKLQotICAgIGlvX3NlcnZpY2VfLnBvc3RfZGVmZXJyZWRfY29tcGxldGlvbnMob3BzKTsKLSAgfQotfQotCi12b2lkIGtxdWV1ZV9yZWFjdG9yOjpkZXJlZ2lzdGVyX2ludGVybmFsX2Rlc2NyaXB0b3Ioc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICBrcXVldWVfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYgZGVzY3JpcHRvcl9kYXRhKQotewotICBpZiAoIWRlc2NyaXB0b3JfZGF0YSkKLSAgICByZXR1cm47Ci0KLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGRlc2NyaXB0b3JfbG9jayhkZXNjcmlwdG9yX2RhdGEtPm11dGV4Xyk7Ci0KLSAgaWYgKCFkZXNjcmlwdG9yX2RhdGEtPnNodXRkb3duXykKLSAgewotICAgIHN0cnVjdCBrZXZlbnQgZXZlbnRzWzJdOwotICAgIEFTSU9fS1FVRVVFX0VWX1NFVCgmZXZlbnRzWzBdLCBkZXNjcmlwdG9yLAotICAgICAgICBFVkZJTFRfUkVBRCwgRVZfREVMRVRFLCAwLCAwLCAwKTsKLSAgICBBU0lPX0tRVUVVRV9FVl9TRVQoJmV2ZW50c1sxXSwgZGVzY3JpcHRvciwKLSAgICAgICAgRVZGSUxUX1dSSVRFLCBFVl9ERUxFVEUsIDAsIDAsIDApOwotICAgIDo6a2V2ZW50KGtxdWV1ZV9mZF8sIGV2ZW50cywgZGVzY3JpcHRvcl9kYXRhLT5udW1fa2V2ZW50c18sIDAsIDAsIDApOwotCi0gICAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfb3BzOyArK2kpCi0gICAgICBvcHMucHVzaChkZXNjcmlwdG9yX2RhdGEtPm9wX3F1ZXVlX1tpXSk7Ci0KLSAgICBkZXNjcmlwdG9yX2RhdGEtPmRlc2NyaXB0b3JfID0gLTE7Ci0gICAgZGVzY3JpcHRvcl9kYXRhLT5zaHV0ZG93bl8gPSB0cnVlOwotCi0gICAgZGVzY3JpcHRvcl9sb2NrLnVubG9jaygpOwotCi0gICAgZnJlZV9kZXNjcmlwdG9yX3N0YXRlKGRlc2NyaXB0b3JfZGF0YSk7Ci0gICAgZGVzY3JpcHRvcl9kYXRhID0gMDsKLSAgfQotfQotCi12b2lkIGtxdWV1ZV9yZWFjdG9yOjpydW4oYm9vbCBibG9jaywgb3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0gIC8vIERldGVybWluZSBob3cgbG9uZyB0byBibG9jayB3aGlsZSB3YWl0aW5nIGZvciBldmVudHMuCi0gIHRpbWVzcGVjIHRpbWVvdXRfYnVmID0geyAwLCAwIH07Ci0gIHRpbWVzcGVjKiB0aW1lb3V0ID0gYmxvY2sgPyBnZXRfdGltZW91dCh0aW1lb3V0X2J1ZikgOiAmdGltZW91dF9idWY7Ci0KLSAgbG9jay51bmxvY2soKTsKLQotICAvLyBCbG9jayBvbiB0aGUga3F1ZXVlIGRlc2NyaXB0b3IuCi0gIHN0cnVjdCBrZXZlbnQgZXZlbnRzWzEyOF07Ci0gIGludCBudW1fZXZlbnRzID0ga2V2ZW50KGtxdWV1ZV9mZF8sIDAsIDAsIGV2ZW50cywgMTI4LCB0aW1lb3V0KTsKLQotICAvLyBEaXNwYXRjaCB0aGUgd2FpdGluZyBldmVudHMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2V2ZW50czsgKytpKQotICB7Ci0gICAgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZXZlbnRzW2ldLnVkYXRhKTsKLSAgICBpZiAocHRyID09ICZpbnRlcnJ1cHRlcl8pCi0gICAgewotICAgICAgaW50ZXJydXB0ZXJfLnJlc2V0KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkZXNjcmlwdG9yX3N0YXRlKiBkZXNjcmlwdG9yX2RhdGEgPSBzdGF0aWNfY2FzdDxkZXNjcmlwdG9yX3N0YXRlKj4ocHRyKTsKLSAgICAgIG11dGV4OjpzY29wZWRfbG9jayBkZXNjcmlwdG9yX2xvY2soZGVzY3JpcHRvcl9kYXRhLT5tdXRleF8pOwotCi0gICAgICBpZiAoZXZlbnRzW2ldLmZpbHRlciA9PSBFVkZJTFRfV1JJVEUKLSAgICAgICAgICAmJiBkZXNjcmlwdG9yX2RhdGEtPm51bV9rZXZlbnRzXyA9PSAyCi0gICAgICAgICAgJiYgZGVzY3JpcHRvcl9kYXRhLT5vcF9xdWV1ZV9bd3JpdGVfb3BdLmVtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIC8vIFNvbWUgZGVzY3JpcHRvciB0eXBlcywgbGlrZSBzZXJpYWwgcG9ydHMsIGRvbid0IHNlZW0gdG8gc3VwcG9ydAotICAgICAgICAvLyBFVl9DTEVBUiB3aXRoIEVWRklMVF9XUklURS4gU2luY2Ugd2UgaGF2ZSBubyBwZW5kaW5nIHdyaXRlCi0gICAgICAgIC8vIG9wZXJhdGlvbnMgd2UnbGwgcmVtb3ZlIHRoZSBFVkZJTFRfV1JJVEUgcmVnaXN0cmF0aW9uIGhlcmUgc28gdGhhdAotICAgICAgICAvLyB3ZSBkb24ndCBlbmQgdXAgaW4gYSB0aWdodCBzcGluLgotICAgICAgICBzdHJ1Y3Qga2V2ZW50IGRlbGV0ZV9ldmVudHNbMV07Ci0gICAgICAgIEFTSU9fS1FVRVVFX0VWX1NFVCgmZGVsZXRlX2V2ZW50c1swXSwKLSAgICAgICAgICAgIGRlc2NyaXB0b3JfZGF0YS0+ZGVzY3JpcHRvcl8sIEVWRklMVF9XUklURSwgRVZfREVMRVRFLCAwLCAwLCAwKTsKLSAgICAgICAgOjprZXZlbnQoa3F1ZXVlX2ZkXywgZGVsZXRlX2V2ZW50cywgMSwgMCwgMCwgMCk7Ci0gICAgICAgIGRlc2NyaXB0b3JfZGF0YS0+bnVtX2tldmVudHNfID0gMTsKLSAgICAgIH0KLQotICAgICAgLy8gRXhjZXB0aW9uIG9wZXJhdGlvbnMgbXVzdCBiZSBwcm9jZXNzZWQgZmlyc3QgdG8gZW5zdXJlIHRoYXQgYW55Ci0gICAgICAvLyBvdXQtb2YtYmFuZCBkYXRhIGlzIHJlYWQgYmVmb3JlIG5vcm1hbCBkYXRhLgotI2lmIGRlZmluZWQoX19OZXRCU0RfXykKLSAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZmlsdGVyW21heF9vcHNdID0KLSNlbHNlCi0gICAgICBzdGF0aWMgY29uc3QgaW50IGZpbHRlclttYXhfb3BzXSA9Ci0jZW5kaWYKLSAgICAgICAgeyBFVkZJTFRfUkVBRCwgRVZGSUxUX1dSSVRFLCBFVkZJTFRfUkVBRCB9OwotICAgICAgZm9yIChpbnQgaiA9IG1heF9vcHMgLSAxOyBqID49IDA7IC0taikKLSAgICAgIHsKLSAgICAgICAgaWYgKGV2ZW50c1tpXS5maWx0ZXIgPT0gZmlsdGVyW2pdKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGogIT0gZXhjZXB0X29wIHx8IGV2ZW50c1tpXS5mbGFncyAmIEVWX09PQkFORCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAocmVhY3Rvcl9vcCogb3AgPSBkZXNjcmlwdG9yX2RhdGEtPm9wX3F1ZXVlX1tqXS5mcm9udCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZXZlbnRzW2ldLmZsYWdzICYgRVZfRVJST1IpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihldmVudHNbaV0uZGF0YSksCi0gICAgICAgICAgICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfZGF0YS0+b3BfcXVldWVfW2pdLnBvcCgpOwotICAgICAgICAgICAgICAgIG9wcy5wdXNoKG9wKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAob3AtPnBlcmZvcm0oKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfZGF0YS0+b3BfcXVldWVfW2pdLnBvcCgpOwotICAgICAgICAgICAgICAgIG9wcy5wdXNoKG9wKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgbG9jay5sb2NrKCk7Ci0gIHRpbWVyX3F1ZXVlc18uZ2V0X3JlYWR5X3RpbWVycyhvcHMpOwotfQotCi12b2lkIGtxdWV1ZV9yZWFjdG9yOjppbnRlcnJ1cHQoKQotewotICBpbnRlcnJ1cHRlcl8uaW50ZXJydXB0KCk7Ci19Ci0KLWludCBrcXVldWVfcmVhY3Rvcjo6ZG9fa3F1ZXVlX2NyZWF0ZSgpCi17Ci0gIGludCBmZCA9IDo6a3F1ZXVlKCk7Ci0gIGlmIChmZCA9PSAtMSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMoZXJybm8sCi0gICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJrcXVldWUiKTsKLSAgfQotICByZXR1cm4gZmQ7Ci19Ci0KLWtxdWV1ZV9yZWFjdG9yOjpkZXNjcmlwdG9yX3N0YXRlKiBrcXVldWVfcmVhY3Rvcjo6YWxsb2NhdGVfZGVzY3JpcHRvcl9zdGF0ZSgpCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBkZXNjcmlwdG9yc19sb2NrKHJlZ2lzdGVyZWRfZGVzY3JpcHRvcnNfbXV0ZXhfKTsKLSAgcmV0dXJuIHJlZ2lzdGVyZWRfZGVzY3JpcHRvcnNfLmFsbG9jKCk7Ci19Ci0KLXZvaWQga3F1ZXVlX3JlYWN0b3I6OmZyZWVfZGVzY3JpcHRvcl9zdGF0ZShrcXVldWVfcmVhY3Rvcjo6ZGVzY3JpcHRvcl9zdGF0ZSogcykKLXsKLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGRlc2NyaXB0b3JzX2xvY2socmVnaXN0ZXJlZF9kZXNjcmlwdG9yc19tdXRleF8pOwotICByZWdpc3RlcmVkX2Rlc2NyaXB0b3JzXy5mcmVlKHMpOwotfQotCi12b2lkIGtxdWV1ZV9yZWFjdG9yOjpkb19hZGRfdGltZXJfcXVldWUodGltZXJfcXVldWVfYmFzZSYgcXVldWUpCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIHRpbWVyX3F1ZXVlc18uaW5zZXJ0KCZxdWV1ZSk7Ci19Ci0KLXZvaWQga3F1ZXVlX3JlYWN0b3I6OmRvX3JlbW92ZV90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZV9iYXNlJiBxdWV1ZSkKLXsKLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgdGltZXJfcXVldWVzXy5lcmFzZSgmcXVldWUpOwotfQotCi10aW1lc3BlYyoga3F1ZXVlX3JlYWN0b3I6OmdldF90aW1lb3V0KHRpbWVzcGVjJiB0cykKLXsKLSAgLy8gQnkgZGVmYXVsdCB3ZSB3aWxsIHdhaXQgbm8gbG9uZ2VyIHRoYW4gNSBtaW51dGVzLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQKLSAgLy8gYW55IGNoYW5nZXMgdG8gdGhlIHN5c3RlbSBjbG9jayBhcmUgZGV0ZWN0ZWQgYWZ0ZXIgbm8gbG9uZ2VyIHRoYW4gdGhpcy4KLSAgbG9uZyB1c2VjID0gdGltZXJfcXVldWVzXy53YWl0X2R1cmF0aW9uX3VzZWMoNSAqIDYwICogMTAwMCAqIDEwMDApOwotICB0cy50dl9zZWMgPSB1c2VjIC8gMTAwMDAwMDsKLSAgdHMudHZfbnNlYyA9ICh1c2VjICUgMTAwMDAwMCkgKiAxMDAwOwotICByZXR1cm4gJnRzOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI3VuZGVmIEFTSU9fS1FVRVVFX0VWX1NFVAotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19LUVVFVUUpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX0tRVUVVRV9SRUFDVE9SX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3BpcGVfc2VsZWN0X2ludGVycnVwdGVyLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9waXBlX3NlbGVjdF9pbnRlcnJ1cHRlci5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNWYxNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3BpcGVfc2VsZWN0X2ludGVycnVwdGVyLmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvcGlwZV9zZWxlY3RfaW50ZXJydXB0ZXIuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9QSVBFX1NFTEVDVF9JTlRFUlJVUFRFUl9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9QSVBFX1NFTEVDVF9JTlRFUlJVUFRFUl9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLSNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKQotI2lmICFkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfRVZFTlRGRCkKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9waXBlX3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotcGlwZV9zZWxlY3RfaW50ZXJydXB0ZXI6OnBpcGVfc2VsZWN0X2ludGVycnVwdGVyKCkKLXsKLSAgb3Blbl9kZXNjcmlwdG9ycygpOwotfQotCi12b2lkIHBpcGVfc2VsZWN0X2ludGVycnVwdGVyOjpvcGVuX2Rlc2NyaXB0b3JzKCkKLXsKLSAgaW50IHBpcGVfZmRzWzJdOwotICBpZiAocGlwZShwaXBlX2ZkcykgPT0gMCkKLSAgewotICAgIHJlYWRfZGVzY3JpcHRvcl8gPSBwaXBlX2Zkc1swXTsKLSAgICA6OmZjbnRsKHJlYWRfZGVzY3JpcHRvcl8sIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotICAgIHdyaXRlX2Rlc2NyaXB0b3JfID0gcGlwZV9mZHNbMV07Ci0gICAgOjpmY250bCh3cml0ZV9kZXNjcmlwdG9yXywgRl9TRVRGTCwgT19OT05CTE9DSyk7Ci0KLSNpZiBkZWZpbmVkKEZEX0NMT0VYRUMpCi0gICAgOjpmY250bChyZWFkX2Rlc2NyaXB0b3JfLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSAgICA6OmZjbnRsKHdyaXRlX2Rlc2NyaXB0b3JfLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEZEX0NMT0VYRUMpCi0gIH0KLSAgZWxzZQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhlcnJubywKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInBpcGVfc2VsZWN0X2ludGVycnVwdGVyIik7Ci0gIH0KLX0KLQotcGlwZV9zZWxlY3RfaW50ZXJydXB0ZXI6On5waXBlX3NlbGVjdF9pbnRlcnJ1cHRlcigpCi17Ci0gIGNsb3NlX2Rlc2NyaXB0b3JzKCk7Ci19Ci0KLXZvaWQgcGlwZV9zZWxlY3RfaW50ZXJydXB0ZXI6OmNsb3NlX2Rlc2NyaXB0b3JzKCkKLXsKLSAgaWYgKHJlYWRfZGVzY3JpcHRvcl8gIT0gLTEpCi0gICAgOjpjbG9zZShyZWFkX2Rlc2NyaXB0b3JfKTsKLSAgaWYgKHdyaXRlX2Rlc2NyaXB0b3JfICE9IC0xKQotICAgIDo6Y2xvc2Uod3JpdGVfZGVzY3JpcHRvcl8pOwotfQotCi12b2lkIHBpcGVfc2VsZWN0X2ludGVycnVwdGVyOjpyZWNyZWF0ZSgpCi17Ci0gIGNsb3NlX2Rlc2NyaXB0b3JzKCk7Ci0KLSAgd3JpdGVfZGVzY3JpcHRvcl8gPSAtMTsKLSAgcmVhZF9kZXNjcmlwdG9yXyA9IC0xOwotCi0gIG9wZW5fZGVzY3JpcHRvcnMoKTsKLX0KLQotdm9pZCBwaXBlX3NlbGVjdF9pbnRlcnJ1cHRlcjo6aW50ZXJydXB0KCkKLXsKLSAgY2hhciBieXRlID0gMDsKLSAgc2lnbmVkX3NpemVfdHlwZSByZXN1bHQgPSA6OndyaXRlKHdyaXRlX2Rlc2NyaXB0b3JfLCAmYnl0ZSwgMSk7Ci0gICh2b2lkKXJlc3VsdDsKLX0KLQotYm9vbCBwaXBlX3NlbGVjdF9pbnRlcnJ1cHRlcjo6cmVzZXQoKQotewotICBmb3IgKDs7KQotICB7Ci0gICAgY2hhciBkYXRhWzEwMjRdOwotICAgIHNpZ25lZF9zaXplX3R5cGUgYnl0ZXNfcmVhZCA9IDo6cmVhZChyZWFkX2Rlc2NyaXB0b3JfLCBkYXRhLCBzaXplb2YoZGF0YSkpOwotICAgIGlmIChieXRlc19yZWFkIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKLSAgICAgIGNvbnRpbnVlOwotICAgIGJvb2wgd2FzX2ludGVycnVwdGVkID0gKGJ5dGVzX3JlYWQgPiAwKTsKLSAgICB3aGlsZSAoYnl0ZXNfcmVhZCA9PSBzaXplb2YoZGF0YSkpCi0gICAgICBieXRlc19yZWFkID0gOjpyZWFkKHJlYWRfZGVzY3JpcHRvcl8sIGRhdGEsIHNpemVvZihkYXRhKSk7Ci0gICAgcmV0dXJuIHdhc19pbnRlcnJ1cHRlZDsKLSAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX0VWRU5URkQpCi0jZW5kaWYgLy8gIWRlZmluZWQoX19TWU1CSUFOMzJfXykKLSNlbmRpZiAvLyAhZGVmaW5lZChfX0NZR1dJTl9fKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfUElQRV9TRUxFQ1RfSU5URVJSVVBURVJfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcG9zaXhfZXZlbnQuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Bvc2l4X2V2ZW50LmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMyYzExNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcG9zaXhfZXZlbnQuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3Bvc2l4X2V2ZW50LmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfUE9TSVhfRVZFTlRfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfUE9TSVhfRVZFTlRfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9zaXhfZXZlbnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1wb3NpeF9ldmVudDo6cG9zaXhfZXZlbnQoKQotICA6IHN0YXRlXygwKQotewotICBpbnQgZXJyb3IgPSA6OnB0aHJlYWRfY29uZF9pbml0KCZjb25kXywgMCk7Ci0gIGFzaW86OmVycm9yX2NvZGUgZWMoZXJyb3IsCi0gICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImV2ZW50Iik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfUE9TSVhfRVZFTlRfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcG9zaXhfbXV0ZXguaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Bvc2l4X211dGV4LmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2ODg2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcG9zaXhfbXV0ZXguaXBwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3Bvc2l4X211dGV4LmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfUE9TSVhfTVVURVhfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfUE9TSVhfTVVURVhfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9zaXhfbXV0ZXguaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1wb3NpeF9tdXRleDo6cG9zaXhfbXV0ZXgoKQotewotICBpbnQgZXJyb3IgPSA6OnB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXhfLCAwKTsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYyhlcnJvciwKLSAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAibXV0ZXgiKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9QT1NJWF9NVVRFWF9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9wb3NpeF90aHJlYWQuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Bvc2l4X3RocmVhZC5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YTkzMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Bvc2l4X3RocmVhZC5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvcG9zaXhfdGhyZWFkLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1BPU0lYX1RIUkVBRF9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9QT1NJWF9USFJFQURfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9zaXhfdGhyZWFkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotcG9zaXhfdGhyZWFkOjp+cG9zaXhfdGhyZWFkKCkKLXsKLSAgaWYgKCFqb2luZWRfKQotICAgIDo6cHRocmVhZF9kZXRhY2godGhyZWFkXyk7Ci19Ci0KLXZvaWQgcG9zaXhfdGhyZWFkOjpqb2luKCkKLXsKLSAgaWYgKCFqb2luZWRfKQotICB7Ci0gICAgOjpwdGhyZWFkX2pvaW4odGhyZWFkXywgMCk7Ci0gICAgam9pbmVkXyA9IHRydWU7Ci0gIH0KLX0KLQotdm9pZCBwb3NpeF90aHJlYWQ6OnN0YXJ0X3RocmVhZChmdW5jX2Jhc2UqIGFyZykKLXsKLSAgaW50IGVycm9yID0gOjpwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkXywgMCwKLSAgICAgICAgYXNpb19kZXRhaWxfcG9zaXhfdGhyZWFkX2Z1bmN0aW9uLCBhcmcpOwotICBpZiAoZXJyb3IgIT0gMCkKLSAgewotICAgIGRlbGV0ZSBhcmc7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhlcnJvciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInRocmVhZCIpOwotICB9Ci19Ci0KLXZvaWQqIGFzaW9fZGV0YWlsX3Bvc2l4X3RocmVhZF9mdW5jdGlvbih2b2lkKiBhcmcpCi17Ci0gIHBvc2l4X3RocmVhZDo6YXV0b19mdW5jX2Jhc2VfcHRyIGZ1bmMgPSB7Ci0gICAgICBzdGF0aWNfY2FzdDxwb3NpeF90aHJlYWQ6OmZ1bmNfYmFzZSo+KGFyZykgfTsKLSAgZnVuYy5wdHItPnJ1bigpOwotICByZXR1cm4gMDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9QT1NJWF9USFJFQURfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcG9zaXhfdHNzX3B0ci5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcG9zaXhfdHNzX3B0ci5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzlhYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Bvc2l4X3Rzc19wdHIuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3Bvc2l4X3Rzc19wdHIuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1BPU0lYX1RTU19QVFJfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfUE9TSVhfVFNTX1BUUl9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3NpeF90c3NfcHRyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdm9pZCBwb3NpeF90c3NfcHRyX2NyZWF0ZShwdGhyZWFkX2tleV90JiBrZXkpCi17Ci0gIGludCBlcnJvciA9IDo6cHRocmVhZF9rZXlfY3JlYXRlKCZrZXksIDApOwotICBhc2lvOjplcnJvcl9jb2RlIGVjKGVycm9yLAotICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ0c3MiKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9QT1NJWF9UU1NfUFRSX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3JlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZS5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlLmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExMzhiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlLmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1JFQUNUSVZFX0RFU0NSSVBUT1JfU0VSVklDRV9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9SRUFDVElWRV9ERVNDUklQVE9SX1NFUlZJQ0VfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpIFwKLSAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpIFwKLSAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlOjpyZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2UoCi0gICAgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiByZWFjdG9yXyhhc2lvOjp1c2Vfc2VydmljZTxyZWFjdG9yPihpb19zZXJ2aWNlKSkKLXsKLSAgcmVhY3Rvcl8uaW5pdF90YXNrKCk7Ci19Ci0KLXZvaWQgcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlOjpzaHV0ZG93bl9zZXJ2aWNlKCkKLXsKLX0KLQotdm9pZCByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2U6OmNvbnN0cnVjdCgKLSAgICByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi17Ci0gIGltcGwuZGVzY3JpcHRvcl8gPSAtMTsKLSAgaW1wbC5zdGF0ZV8gPSAwOwotfQotCi12b2lkIHJlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZTo6bW92ZV9jb25zdHJ1Y3QoCi0gICAgcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIHJlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLXsKLSAgaW1wbC5kZXNjcmlwdG9yXyA9IG90aGVyX2ltcGwuZGVzY3JpcHRvcl87Ci0gIG90aGVyX2ltcGwuZGVzY3JpcHRvcl8gPSAtMTsKLQotICBpbXBsLnN0YXRlXyA9IG90aGVyX2ltcGwuc3RhdGVfOwotICBvdGhlcl9pbXBsLnN0YXRlXyA9IDA7Ci0KLSAgcmVhY3Rvcl8ubW92ZV9kZXNjcmlwdG9yKGltcGwuZGVzY3JpcHRvcl8sCi0gICAgICBpbXBsLnJlYWN0b3JfZGF0YV8sIG90aGVyX2ltcGwucmVhY3Rvcl9kYXRhXyk7Ci19Ci0KLXZvaWQgcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlOjptb3ZlX2Fzc2lnbigKLSAgICByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlJiBvdGhlcl9zZXJ2aWNlLAotICAgIHJlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLXsKLSAgZGVzdHJveShpbXBsKTsKLQotICBpbXBsLmRlc2NyaXB0b3JfID0gb3RoZXJfaW1wbC5kZXNjcmlwdG9yXzsKLSAgb3RoZXJfaW1wbC5kZXNjcmlwdG9yXyA9IC0xOwotCi0gIGltcGwuc3RhdGVfID0gb3RoZXJfaW1wbC5zdGF0ZV87Ci0gIG90aGVyX2ltcGwuc3RhdGVfID0gMDsKLQotICBvdGhlcl9zZXJ2aWNlLnJlYWN0b3JfLm1vdmVfZGVzY3JpcHRvcihpbXBsLmRlc2NyaXB0b3JfLAotICAgICAgaW1wbC5yZWFjdG9yX2RhdGFfLCBvdGhlcl9pbXBsLnJlYWN0b3JfZGF0YV8pOwotfQotCi12b2lkIHJlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZTo6ZGVzdHJveSgKLSAgICByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi17Ci0gIGlmIChpc19vcGVuKGltcGwpKQotICB7Ci0gICAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoImRlc2NyaXB0b3IiLCAmaW1wbCwgImNsb3NlIikpOwotCi0gICAgcmVhY3Rvcl8uZGVyZWdpc3Rlcl9kZXNjcmlwdG9yKGltcGwuZGVzY3JpcHRvcl8sIGltcGwucmVhY3Rvcl9kYXRhXywKLSAgICAgICAgKGltcGwuc3RhdGVfICYgZGVzY3JpcHRvcl9vcHM6OnBvc3NpYmxlX2R1cCkgPT0gMCk7Ci0gIH0KLQotICBhc2lvOjplcnJvcl9jb2RlIGlnbm9yZWRfZWM7Ci0gIGRlc2NyaXB0b3Jfb3BzOjpjbG9zZShpbXBsLmRlc2NyaXB0b3JfLCBpbXBsLnN0YXRlXywgaWdub3JlZF9lYyk7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlOjphc3NpZ24oCi0gICAgcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX2Rlc2NyaXB0b3IsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoaXNfb3BlbihpbXBsKSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmFscmVhZHlfb3BlbjsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICBpZiAoaW50IGVyciA9IHJlYWN0b3JfLnJlZ2lzdGVyX2Rlc2NyaXB0b3IoCi0gICAgICAgIG5hdGl2ZV9kZXNjcmlwdG9yLCBpbXBsLnJlYWN0b3JfZGF0YV8pKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGVyciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgaW1wbC5kZXNjcmlwdG9yXyA9IG5hdGl2ZV9kZXNjcmlwdG9yOwotICBpbXBsLnN0YXRlXyA9IGRlc2NyaXB0b3Jfb3BzOjpwb3NzaWJsZV9kdXA7Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlOjpjbG9zZSgKLSAgICByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChpc19vcGVuKGltcGwpKQotICB7Ci0gICAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoImRlc2NyaXB0b3IiLCAmaW1wbCwgImNsb3NlIikpOwotCi0gICAgcmVhY3Rvcl8uZGVyZWdpc3Rlcl9kZXNjcmlwdG9yKGltcGwuZGVzY3JpcHRvcl8sIGltcGwucmVhY3Rvcl9kYXRhXywKLSAgICAgICAgKGltcGwuc3RhdGVfICYgZGVzY3JpcHRvcl9vcHM6OnBvc3NpYmxlX2R1cCkgPT0gMCk7Ci0gIH0KLQotICBkZXNjcmlwdG9yX29wczo6Y2xvc2UoaW1wbC5kZXNjcmlwdG9yXywgaW1wbC5zdGF0ZV8sIGVjKTsKLQotICAvLyBUaGUgZGVzY3JpcHRvciBpcyBjbG9zZWQgYnkgdGhlIE9TIGV2ZW4gaWYgY2xvc2UoKSByZXR1cm5zIGFuIGVycm9yLgotICAvLwotICAvLyAoQWN0dWFsbHksIFBPU0lYIHNheXMgdGhlIHN0YXRlIG9mIHRoZSBkZXNjcmlwdG9yIGlzIHVuc3BlY2lmaWVkLiBPbgotICAvLyBMaW51eCB0aGUgZGVzY3JpcHRvciBpcyBhcHBhcmVudGx5IGNsb3NlZCBhbnl3YXk7IGUuZy4gc2VlCi0gIC8vICAgaHR0cDovL2xrbWwub3JnL2xrbWwvMjAwNS85LzEwLzEyOQotICAvLyBXZSdsbCBqdXN0IGhhdmUgdG8gYXNzdW1lIHRoYXQgb3RoZXIgT1NlcyBmb2xsb3cgdGhlIHNhbWUgYmVoYXZpb3VyLikKLSAgY29uc3RydWN0KGltcGwpOwotCi0gIHJldHVybiBlYzsKLX0KLQotcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUKLXJlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZTo6cmVsZWFzZSgKLSAgICByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi17Ci0gIG5hdGl2ZV9oYW5kbGVfdHlwZSBkZXNjcmlwdG9yID0gaW1wbC5kZXNjcmlwdG9yXzsKLQotICBpZiAoaXNfb3BlbihpbXBsKSkKLSAgewotICAgIEFTSU9fSEFORExFUl9PUEVSQVRJT04oKCJkZXNjcmlwdG9yIiwgJmltcGwsICJyZWxlYXNlIikpOwotCi0gICAgcmVhY3Rvcl8uZGVyZWdpc3Rlcl9kZXNjcmlwdG9yKGltcGwuZGVzY3JpcHRvcl8sIGltcGwucmVhY3Rvcl9kYXRhXywgZmFsc2UpOwotICAgIGNvbnN0cnVjdChpbXBsKTsKLSAgfQotCi0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIHJlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZTo6Y2FuY2VsKAotICAgIHJlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKCFpc19vcGVuKGltcGwpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoImRlc2NyaXB0b3IiLCAmaW1wbCwgImNhbmNlbCIpKTsKLQotICByZWFjdG9yXy5jYW5jZWxfb3BzKGltcGwuZGVzY3JpcHRvcl8sIGltcGwucmVhY3Rvcl9kYXRhXyk7Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLXZvaWQgcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlOjpzdGFydF9vcCgKLSAgICByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgaW50IG9wX3R5cGUsIHJlYWN0b3Jfb3AqIG9wLCBib29sIGlzX2NvbnRpbnVhdGlvbiwKLSAgICBib29sIGlzX25vbl9ibG9ja2luZywgYm9vbCBub29wKQotewotICBpZiAoIW5vb3ApCi0gIHsKLSAgICBpZiAoKGltcGwuc3RhdGVfICYgZGVzY3JpcHRvcl9vcHM6Om5vbl9ibG9ja2luZykgfHwKLSAgICAgICAgZGVzY3JpcHRvcl9vcHM6OnNldF9pbnRlcm5hbF9ub25fYmxvY2tpbmcoCi0gICAgICAgICAgaW1wbC5kZXNjcmlwdG9yXywgaW1wbC5zdGF0ZV8sIHRydWUsIG9wLT5lY18pKQotICAgIHsKLSAgICAgIHJlYWN0b3JfLnN0YXJ0X29wKG9wX3R5cGUsIGltcGwuZGVzY3JpcHRvcl8sCi0gICAgICAgICAgaW1wbC5yZWFjdG9yX2RhdGFfLCBvcCwgaXNfY29udGludWF0aW9uLCBpc19ub25fYmxvY2tpbmcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIHJlYWN0b3JfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgIC8vICAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9SRUFDVElWRV9ERVNDUklQVE9SX1NFUlZJQ0VfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZS5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZS5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzY2U3YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3JlYWN0aXZlX3NlcmlhbF9wb3J0X3NlcnZpY2UuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC9yZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vIENvcHlyaWdodCAoYykgMjAwOCBSZXAgSW52YXJpYW50IFN5c3RlbXMsIEluYy4gKGluZm9AcmVwaW52YXJpYW50LmNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9SRUFDVElWRV9TRVJJQUxfUE9SVF9TRVJWSUNFX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1JFQUNUSVZFX1NFUklBTF9QT1JUX1NFUlZJQ0VfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NFUklBTF9QT1JUKQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XUykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZTo6cmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZSgKLSAgICBhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICA6IGRlc2NyaXB0b3Jfc2VydmljZV8oaW9fc2VydmljZSkKLXsKLX0KLQotdm9pZCByZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlOjpzaHV0ZG93bl9zZXJ2aWNlKCkKLXsKLSAgZGVzY3JpcHRvcl9zZXJ2aWNlXy5zaHV0ZG93bl9zZXJ2aWNlKCk7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZTo6b3BlbigKLSAgICByZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2UsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoaXNfb3BlbihpbXBsKSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmFscmVhZHlfb3BlbjsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICBkZXNjcmlwdG9yX29wczo6c3RhdGVfdHlwZSBzdGF0ZSA9IDA7Ci0gIGludCBmZCA9IGRlc2NyaXB0b3Jfb3BzOjpvcGVuKGRldmljZS5jX3N0cigpLAotICAgICAgT19SRFdSIHwgT19OT05CTE9DSyB8IE9fTk9DVFRZLCBlYyk7Ci0gIGlmIChmZCA8IDApCi0gICAgcmV0dXJuIGVjOwotCi0gIGludCBzID0gZGVzY3JpcHRvcl9vcHM6OmZjbnRsKGZkLCBGX0dFVEZMLCBlYyk7Ci0gIGlmIChzID49IDApCi0gICAgcyA9IGRlc2NyaXB0b3Jfb3BzOjpmY250bChmZCwgRl9TRVRGTCwgcyB8IE9fTk9OQkxPQ0ssIGVjKTsKLSAgaWYgKHMgPCAwKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBpZ25vcmVkX2VjOwotICAgIGRlc2NyaXB0b3Jfb3BzOjpjbG9zZShmZCwgc3RhdGUsIGlnbm9yZWRfZWMpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFNldCB1cCBkZWZhdWx0IHNlcmlhbCBwb3J0IG9wdGlvbnMuCi0gIHRlcm1pb3MgaW9zOwotICBlcnJubyA9IDA7Ci0gIHMgPSBkZXNjcmlwdG9yX29wczo6ZXJyb3Jfd3JhcHBlcig6OnRjZ2V0YXR0cihmZCwgJmlvcyksIGVjKTsKLSAgaWYgKHMgPj0gMCkKLSAgewotI2lmIGRlZmluZWQoX0JTRF9TT1VSQ0UpCi0gICAgOjpjZm1ha2VyYXcoJmlvcyk7Ci0jZWxzZQotICAgIGlvcy5jX2lmbGFnICY9IH4oSUdOQlJLIHwgQlJLSU5UIHwgUEFSTVJLCi0gICAgICAgIHwgSVNUUklQIHwgSU5MQ1IgfCBJR05DUiB8IElDUk5MIHwgSVhPTik7Ci0gICAgaW9zLmNfb2ZsYWcgJj0gfk9QT1NUOwotICAgIGlvcy5jX2xmbGFnICY9IH4oRUNITyB8IEVDSE9OTCB8IElDQU5PTiB8IElTSUcgfCBJRVhURU4pOwotICAgIGlvcy5jX2NmbGFnICY9IH4oQ1NJWkUgfCBQQVJFTkIpOwotICAgIGlvcy5jX2NmbGFnIHw9IENTODsKLSNlbmRpZgotICAgIGlvcy5jX2lmbGFnIHw9IElHTlBBUjsKLSAgICBpb3MuY19jZmxhZyB8PSBDUkVBRCB8IENMT0NBTDsKLSAgICBlcnJubyA9IDA7Ci0gICAgcyA9IGRlc2NyaXB0b3Jfb3BzOjplcnJvcl93cmFwcGVyKDo6dGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmaW9zKSwgZWMpOwotICB9Ci0gIGlmIChzIDwgMCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgaWdub3JlZF9lYzsKLSAgICBkZXNjcmlwdG9yX29wczo6Y2xvc2UoZmQsIHN0YXRlLCBpZ25vcmVkX2VjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBXZSdyZSBkb25lLiBUYWtlIG93bmVyc2hpcCBvZiB0aGUgc2VyaWFsIHBvcnQgZGVzY3JpcHRvci4KLSAgaWYgKGRlc2NyaXB0b3Jfc2VydmljZV8uYXNzaWduKGltcGwsIGZkLCBlYykpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGlnbm9yZWRfZWM7Ci0gICAgZGVzY3JpcHRvcl9vcHM6OmNsb3NlKGZkLCBzdGF0ZSwgaWdub3JlZF9lYyk7Ci0gIH0KLQotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZTo6ZG9fc2V0X29wdGlvbigKLSAgICByZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIHJlYWN0aXZlX3NlcmlhbF9wb3J0X3NlcnZpY2U6OnN0b3JlX2Z1bmN0aW9uX3R5cGUgc3RvcmUsCi0gICAgY29uc3Qgdm9pZCogb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgdGVybWlvcyBpb3M7Ci0gIGVycm5vID0gMDsKLSAgZGVzY3JpcHRvcl9vcHM6OmVycm9yX3dyYXBwZXIoOjp0Y2dldGF0dHIoCi0gICAgICAgIGRlc2NyaXB0b3Jfc2VydmljZV8ubmF0aXZlX2hhbmRsZShpbXBsKSwgJmlvcyksIGVjKTsKLSAgaWYgKGVjKQotICAgIHJldHVybiBlYzsKLQotICBpZiAoc3RvcmUob3B0aW9uLCBpb3MsIGVjKSkKLSAgICByZXR1cm4gZWM7Ci0KLSAgZXJybm8gPSAwOwotICBkZXNjcmlwdG9yX29wczo6ZXJyb3Jfd3JhcHBlcig6OnRjc2V0YXR0cigKLSAgICAgICAgZGVzY3JpcHRvcl9zZXJ2aWNlXy5uYXRpdmVfaGFuZGxlKGltcGwpLCBUQ1NBTk9XLCAmaW9zKSwgZWMpOwotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZTo6ZG9fZ2V0X29wdGlvbigKLSAgICBjb25zdCByZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIHJlYWN0aXZlX3NlcmlhbF9wb3J0X3NlcnZpY2U6OmxvYWRfZnVuY3Rpb25fdHlwZSBsb2FkLAotICAgIHZvaWQqIG9wdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci17Ci0gIHRlcm1pb3MgaW9zOwotICBlcnJubyA9IDA7Ci0gIGRlc2NyaXB0b3Jfb3BzOjplcnJvcl93cmFwcGVyKDo6dGNnZXRhdHRyKAotICAgICAgICBkZXNjcmlwdG9yX3NlcnZpY2VfLm5hdGl2ZV9oYW5kbGUoaW1wbCksICZpb3MpLCBlYyk7Ci0gIGlmIChlYykKLSAgICByZXR1cm4gZWM7Ci0KLSAgcmV0dXJuIGxvYWQob3B0aW9uLCBpb3MsIGVjKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TRVJJQUxfUE9SVCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfUkVBQ1RJVkVfU0VSSUFMX1BPUlRfU0VSVklDRV9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlLmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjZjYyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfUkVBQ1RJVkVfU09DS0VUX1NFUlZJQ0VfQkFTRV9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9SRUFDVElWRV9TT0NLRVRfU0VSVklDRV9CQVNFX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfSU9DUCkgXAotICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OnJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2UoCi0gICAgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiByZWFjdG9yXyh1c2Vfc2VydmljZTxyZWFjdG9yPihpb19zZXJ2aWNlKSkKLXsKLSAgcmVhY3Rvcl8uaW5pdF90YXNrKCk7Ci19Ci0KLXZvaWQgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZTo6c2h1dGRvd25fc2VydmljZSgpCi17Ci19Ci0KLXZvaWQgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZTo6Y29uc3RydWN0KAotICAgIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLXsKLSAgaW1wbC5zb2NrZXRfID0gaW52YWxpZF9zb2NrZXQ7Ci0gIGltcGwuc3RhdGVfID0gMDsKLX0KLQotdm9pZCByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX21vdmVfY29uc3RydWN0KAotICAgIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi17Ci0gIGltcGwuc29ja2V0XyA9IG90aGVyX2ltcGwuc29ja2V0XzsKLSAgb3RoZXJfaW1wbC5zb2NrZXRfID0gaW52YWxpZF9zb2NrZXQ7Ci0KLSAgaW1wbC5zdGF0ZV8gPSBvdGhlcl9pbXBsLnN0YXRlXzsKLSAgb3RoZXJfaW1wbC5zdGF0ZV8gPSAwOwotCi0gIHJlYWN0b3JfLm1vdmVfZGVzY3JpcHRvcihpbXBsLnNvY2tldF8sCi0gICAgICBpbXBsLnJlYWN0b3JfZGF0YV8sIG90aGVyX2ltcGwucmVhY3Rvcl9kYXRhXyk7Ci19Ci0KLXZvaWQgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9tb3ZlX2Fzc2lnbigKLSAgICByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZSYgb3RoZXJfc2VydmljZSwKLSAgICByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi17Ci0gIGRlc3Ryb3koaW1wbCk7Ci0KLSAgaW1wbC5zb2NrZXRfID0gb3RoZXJfaW1wbC5zb2NrZXRfOwotICBvdGhlcl9pbXBsLnNvY2tldF8gPSBpbnZhbGlkX3NvY2tldDsKLQotICBpbXBsLnN0YXRlXyA9IG90aGVyX2ltcGwuc3RhdGVfOwotICBvdGhlcl9pbXBsLnN0YXRlXyA9IDA7Ci0KLSAgb3RoZXJfc2VydmljZS5yZWFjdG9yXy5tb3ZlX2Rlc2NyaXB0b3IoaW1wbC5zb2NrZXRfLAotICAgICAgaW1wbC5yZWFjdG9yX2RhdGFfLCBvdGhlcl9pbXBsLnJlYWN0b3JfZGF0YV8pOwotfQotCi12b2lkIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmRlc3Ryb3koCi0gICAgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotewotICBpZiAoaW1wbC5zb2NrZXRfICE9IGludmFsaWRfc29ja2V0KQotICB7Ci0gICAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoInNvY2tldCIsICZpbXBsLCAiY2xvc2UiKSk7Ci0KLSAgICByZWFjdG9yXy5kZXJlZ2lzdGVyX2Rlc2NyaXB0b3IoaW1wbC5zb2NrZXRfLCBpbXBsLnJlYWN0b3JfZGF0YV8sCi0gICAgICAgIChpbXBsLnN0YXRlXyAmIHNvY2tldF9vcHM6OnBvc3NpYmxlX2R1cCkgPT0gMCk7Ci0KLSAgICBhc2lvOjplcnJvcl9jb2RlIGlnbm9yZWRfZWM7Ci0gICAgc29ja2V0X29wczo6Y2xvc2UoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywgdHJ1ZSwgaWdub3JlZF9lYyk7Ci0gIH0KLX0KLQotYXNpbzo6ZXJyb3JfY29kZSByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlOjpjbG9zZSgKLSAgICByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChpc19vcGVuKGltcGwpKQotICB7Ci0gICAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoInNvY2tldCIsICZpbXBsLCAiY2xvc2UiKSk7Ci0KLSAgICByZWFjdG9yXy5kZXJlZ2lzdGVyX2Rlc2NyaXB0b3IoaW1wbC5zb2NrZXRfLCBpbXBsLnJlYWN0b3JfZGF0YV8sCi0gICAgICAgIChpbXBsLnN0YXRlXyAmIHNvY2tldF9vcHM6OnBvc3NpYmxlX2R1cCkgPT0gMCk7Ci0gIH0KLQotICBzb2NrZXRfb3BzOjpjbG9zZShpbXBsLnNvY2tldF8sIGltcGwuc3RhdGVfLCBmYWxzZSwgZWMpOwotCi0gIC8vIFRoZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCBieSB0aGUgT1MgZXZlbiBpZiBjbG9zZSgpIHJldHVybnMgYW4gZXJyb3IuCi0gIC8vCi0gIC8vIChBY3R1YWxseSwgUE9TSVggc2F5cyB0aGUgc3RhdGUgb2YgdGhlIGRlc2NyaXB0b3IgaXMgdW5zcGVjaWZpZWQuIE9uCi0gIC8vIExpbnV4IHRoZSBkZXNjcmlwdG9yIGlzIGFwcGFyZW50bHkgY2xvc2VkIGFueXdheTsgZS5nLiBzZWUKLSAgLy8gICBodHRwOi8vbGttbC5vcmcvbGttbC8yMDA1LzkvMTAvMTI5Ci0gIC8vIFdlJ2xsIGp1c3QgaGF2ZSB0byBhc3N1bWUgdGhhdCBvdGhlciBPU2VzIGZvbGxvdyB0aGUgc2FtZSBiZWhhdmlvdXIuIFRoZQotICAvLyBrbm93biBleGNlcHRpb24gaXMgd2hlbiBXaW5kb3dzJ3MgY2xvc2Vzb2NrZXQoKSBmdW5jdGlvbiBmYWlscyB3aXRoCi0gIC8vIFdTQUVXT1VMREJMT0NLLCBidXQgdGhpcyBjYXNlIGlzIGhhbmRsZWQgaW5zaWRlIHNvY2tldF9vcHM6OmNsb3NlKCkuCi0gIGNvbnN0cnVjdChpbXBsKTsKLQotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZTo6Y2FuY2VsKAotICAgIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKCFpc19vcGVuKGltcGwpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoInNvY2tldCIsICZpbXBsLCAiY2FuY2VsIikpOwotCi0gIHJlYWN0b3JfLmNhbmNlbF9vcHMoaW1wbC5zb2NrZXRfLCBpbXBsLnJlYWN0b3JfZGF0YV8pOwotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmRvX29wZW4oCi0gICAgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIGludCBhZiwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChpc19vcGVuKGltcGwpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YWxyZWFkeV9vcGVuOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIHNvY2tldF9ob2xkZXIgc29jayhzb2NrZXRfb3BzOjpzb2NrZXQoYWYsIHR5cGUsIHByb3RvY29sLCBlYykpOwotICBpZiAoc29jay5nZXQoKSA9PSBpbnZhbGlkX3NvY2tldCkKLSAgICByZXR1cm4gZWM7Ci0KLSAgaWYgKGludCBlcnIgPSByZWFjdG9yXy5yZWdpc3Rlcl9kZXNjcmlwdG9yKHNvY2suZ2V0KCksIGltcGwucmVhY3Rvcl9kYXRhXykpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoZXJyLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICBpbXBsLnNvY2tldF8gPSBzb2NrLnJlbGVhc2UoKTsKLSAgc3dpdGNoICh0eXBlKQotICB7Ci0gIGNhc2UgU09DS19TVFJFQU06IGltcGwuc3RhdGVfID0gc29ja2V0X29wczo6c3RyZWFtX29yaWVudGVkOyBicmVhazsKLSAgY2FzZSBTT0NLX0RHUkFNOiBpbXBsLnN0YXRlXyA9IHNvY2tldF9vcHM6OmRhdGFncmFtX29yaWVudGVkOyBicmVhazsKLSAgZGVmYXVsdDogaW1wbC5zdGF0ZV8gPSAwOyBicmVhazsKLSAgfQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmRvX2Fzc2lnbigKLSAgICByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGludCB0eXBlLAotICAgIGNvbnN0IHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6Om5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX3NvY2tldCwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGlzX29wZW4oaW1wbCkpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjphbHJlYWR5X29wZW47Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgaWYgKGludCBlcnIgPSByZWFjdG9yXy5yZWdpc3Rlcl9kZXNjcmlwdG9yKAotICAgICAgICBuYXRpdmVfc29ja2V0LCBpbXBsLnJlYWN0b3JfZGF0YV8pKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGVyciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgaW1wbC5zb2NrZXRfID0gbmF0aXZlX3NvY2tldDsKLSAgc3dpdGNoICh0eXBlKQotICB7Ci0gIGNhc2UgU09DS19TVFJFQU06IGltcGwuc3RhdGVfID0gc29ja2V0X29wczo6c3RyZWFtX29yaWVudGVkOyBicmVhazsKLSAgY2FzZSBTT0NLX0RHUkFNOiBpbXBsLnN0YXRlXyA9IHNvY2tldF9vcHM6OmRhdGFncmFtX29yaWVudGVkOyBicmVhazsKLSAgZGVmYXVsdDogaW1wbC5zdGF0ZV8gPSAwOyBicmVhazsKLSAgfQotICBpbXBsLnN0YXRlXyB8PSBzb2NrZXRfb3BzOjpwb3NzaWJsZV9kdXA7Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLXZvaWQgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZTo6c3RhcnRfb3AoCi0gICAgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIGludCBvcF90eXBlLCByZWFjdG9yX29wKiBvcCwgYm9vbCBpc19jb250aW51YXRpb24sCi0gICAgYm9vbCBpc19ub25fYmxvY2tpbmcsIGJvb2wgbm9vcCkKLXsKLSAgaWYgKCFub29wKQotICB7Ci0gICAgaWYgKChpbXBsLnN0YXRlXyAmIHNvY2tldF9vcHM6Om5vbl9ibG9ja2luZykKLSAgICAgICAgfHwgc29ja2V0X29wczo6c2V0X2ludGVybmFsX25vbl9ibG9ja2luZygKLSAgICAgICAgICBpbXBsLnNvY2tldF8sIGltcGwuc3RhdGVfLCB0cnVlLCBvcC0+ZWNfKSkKLSAgICB7Ci0gICAgICByZWFjdG9yXy5zdGFydF9vcChvcF90eXBlLCBpbXBsLnNvY2tldF8sCi0gICAgICAgICAgaW1wbC5yZWFjdG9yX2RhdGFfLCBvcCwgaXNfY29udGludWF0aW9uLCBpc19ub25fYmxvY2tpbmcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIHJlYWN0b3JfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci19Ci0KLXZvaWQgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZTo6c3RhcnRfYWNjZXB0X29wKAotICAgIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICByZWFjdG9yX29wKiBvcCwgYm9vbCBpc19jb250aW51YXRpb24sIGJvb2wgcGVlcl9pc19vcGVuKQotewotICBpZiAoIXBlZXJfaXNfb3BlbikKLSAgICBzdGFydF9vcChpbXBsLCByZWFjdG9yOjpyZWFkX29wLCBvcCwgdHJ1ZSwgaXNfY29udGludWF0aW9uLCBmYWxzZSk7Ci0gIGVsc2UKLSAgewotICAgIG9wLT5lY18gPSBhc2lvOjplcnJvcjo6YWxyZWFkeV9vcGVuOwotICAgIHJlYWN0b3JfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gIH0KLX0KLQotdm9pZCByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlOjpzdGFydF9jb25uZWN0X29wKAotICAgIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICByZWFjdG9yX29wKiBvcCwgYm9vbCBpc19jb250aW51YXRpb24sCi0gICAgY29uc3Qgc29ja2V0X2FkZHJfdHlwZSogYWRkciwgc2l6ZV90IGFkZHJsZW4pCi17Ci0gIGlmICgoaW1wbC5zdGF0ZV8gJiBzb2NrZXRfb3BzOjpub25fYmxvY2tpbmcpCi0gICAgICB8fCBzb2NrZXRfb3BzOjpzZXRfaW50ZXJuYWxfbm9uX2Jsb2NraW5nKAotICAgICAgICBpbXBsLnNvY2tldF8sIGltcGwuc3RhdGVfLCB0cnVlLCBvcC0+ZWNfKSkKLSAgewotICAgIGlmIChzb2NrZXRfb3BzOjpjb25uZWN0KGltcGwuc29ja2V0XywgYWRkciwgYWRkcmxlbiwgb3AtPmVjXykgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAob3AtPmVjXyA9PSBhc2lvOjplcnJvcjo6aW5fcHJvZ3Jlc3MKLSAgICAgICAgICB8fCBvcC0+ZWNfID09IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jaykKLSAgICAgIHsKLSAgICAgICAgb3AtPmVjXyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgICAgcmVhY3Rvcl8uc3RhcnRfb3AocmVhY3Rvcjo6Y29ubmVjdF9vcCwgaW1wbC5zb2NrZXRfLAotICAgICAgICAgICAgaW1wbC5yZWFjdG9yX2RhdGFfLCBvcCwgaXNfY29udGludWF0aW9uLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZWFjdG9yXy5wb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKG9wLCBpc19jb250aW51YXRpb24pOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfUkVBQ1RJVkVfU09DS0VUX1NFUlZJQ0VfQkFTRV9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9yZXNvbHZlcl9zZXJ2aWNlX2Jhc2UuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Jlc29sdmVyX3NlcnZpY2VfYmFzZS5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWMxM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Jlc29sdmVyX3NlcnZpY2VfYmFzZS5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3Jlc29sdmVyX3NlcnZpY2VfYmFzZS5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9SRVNPTFZFUl9TRVJWSUNFX0JBU0VfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfUkVTT0xWRVJfU0VSVklDRV9CQVNFX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Jlc29sdmVyX3NlcnZpY2VfYmFzZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3MgcmVzb2x2ZXJfc2VydmljZV9iYXNlOjp3b3JrX2lvX3NlcnZpY2VfcnVubmVyCi17Ci1wdWJsaWM6Ci0gIHdvcmtfaW9fc2VydmljZV9ydW5uZXIoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGlvX3NlcnZpY2VfKGlvX3NlcnZpY2UpIHt9Ci0gIHZvaWQgb3BlcmF0b3IoKSgpIHsgaW9fc2VydmljZV8ucnVuKCk7IH0KLXByaXZhdGU6Ci0gIGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2VfOwotfTsKLQotcmVzb2x2ZXJfc2VydmljZV9iYXNlOjpyZXNvbHZlcl9zZXJ2aWNlX2Jhc2UoCi0gICAgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiBpb19zZXJ2aWNlX2ltcGxfKGFzaW86OnVzZV9zZXJ2aWNlPGlvX3NlcnZpY2VfaW1wbD4oaW9fc2VydmljZSkpLAotICAgIHdvcmtfaW9fc2VydmljZV8obmV3IGFzaW86OmlvX3NlcnZpY2UpLAotICAgIHdvcmtfaW9fc2VydmljZV9pbXBsXyhhc2lvOjp1c2Vfc2VydmljZTwKLSAgICAgICAgaW9fc2VydmljZV9pbXBsPigqd29ya19pb19zZXJ2aWNlXykpLAotICAgIHdvcmtfKG5ldyBhc2lvOjppb19zZXJ2aWNlOjp3b3JrKCp3b3JrX2lvX3NlcnZpY2VfKSksCi0gICAgd29ya190aHJlYWRfKDApCi17Ci19Ci0KLXJlc29sdmVyX3NlcnZpY2VfYmFzZTo6fnJlc29sdmVyX3NlcnZpY2VfYmFzZSgpCi17Ci0gIHNodXRkb3duX3NlcnZpY2UoKTsKLX0KLQotdm9pZCByZXNvbHZlcl9zZXJ2aWNlX2Jhc2U6OnNodXRkb3duX3NlcnZpY2UoKQotewotICB3b3JrXy5yZXNldCgpOwotICBpZiAod29ya19pb19zZXJ2aWNlXy5nZXQoKSkKLSAgewotICAgIHdvcmtfaW9fc2VydmljZV8tPnN0b3AoKTsKLSAgICBpZiAod29ya190aHJlYWRfLmdldCgpKQotICAgIHsKLSAgICAgIHdvcmtfdGhyZWFkXy0+am9pbigpOwotICAgICAgd29ya190aHJlYWRfLnJlc2V0KCk7Ci0gICAgfQotICAgIHdvcmtfaW9fc2VydmljZV8ucmVzZXQoKTsKLSAgfQotfQotCi12b2lkIHJlc29sdmVyX3NlcnZpY2VfYmFzZTo6Zm9ya19zZXJ2aWNlKAotICAgIGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfZXZlbnQgZm9ya19ldikKLXsKLSAgaWYgKHdvcmtfdGhyZWFkXy5nZXQoKSkKLSAgewotICAgIGlmIChmb3JrX2V2ID09IGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfcHJlcGFyZSkKLSAgICB7Ci0gICAgICB3b3JrX2lvX3NlcnZpY2VfLT5zdG9wKCk7Ci0gICAgICB3b3JrX3RocmVhZF8tPmpvaW4oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdvcmtfaW9fc2VydmljZV8tPnJlc2V0KCk7Ci0gICAgICB3b3JrX3RocmVhZF8ucmVzZXQobmV3IGFzaW86OmRldGFpbDo6dGhyZWFkKAotICAgICAgICAgICAgd29ya19pb19zZXJ2aWNlX3J1bm5lcigqd29ya19pb19zZXJ2aWNlXykpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCByZXNvbHZlcl9zZXJ2aWNlX2Jhc2U6OmNvbnN0cnVjdCgKLSAgICByZXNvbHZlcl9zZXJ2aWNlX2Jhc2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi17Ci0gIGltcGwucmVzZXQoc3RhdGljX2Nhc3Q8dm9pZCo+KDApLCBzb2NrZXRfb3BzOjpub29wX2RlbGV0ZXIoKSk7Ci19Ci0KLXZvaWQgcmVzb2x2ZXJfc2VydmljZV9iYXNlOjpkZXN0cm95KAotICAgIHJlc29sdmVyX3NlcnZpY2VfYmFzZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLXsKLSAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoInJlc29sdmVyIiwgJmltcGwsICJjYW5jZWwiKSk7Ci0KLSAgaW1wbC5yZXNldCgpOwotfQotCi12b2lkIHJlc29sdmVyX3NlcnZpY2VfYmFzZTo6Y2FuY2VsKAotICAgIHJlc29sdmVyX3NlcnZpY2VfYmFzZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLXsKLSAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoInJlc29sdmVyIiwgJmltcGwsICJjYW5jZWwiKSk7Ci0KLSAgaW1wbC5yZXNldChzdGF0aWNfY2FzdDx2b2lkKj4oMCksIHNvY2tldF9vcHM6Om5vb3BfZGVsZXRlcigpKTsKLX0KLQotdm9pZCByZXNvbHZlcl9zZXJ2aWNlX2Jhc2U6OnN0YXJ0X3Jlc29sdmVfb3Aob3BlcmF0aW9uKiBvcCkKLXsKLSAgc3RhcnRfd29ya190aHJlYWQoKTsKLSAgaW9fc2VydmljZV9pbXBsXy53b3JrX3N0YXJ0ZWQoKTsKLSAgd29ya19pb19zZXJ2aWNlX2ltcGxfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGZhbHNlKTsKLX0KLQotdm9pZCByZXNvbHZlcl9zZXJ2aWNlX2Jhc2U6OnN0YXJ0X3dvcmtfdGhyZWFkKCkKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBpZiAoIXdvcmtfdGhyZWFkXy5nZXQoKSkKLSAgewotICAgIHdvcmtfdGhyZWFkXy5yZXNldChuZXcgYXNpbzo6ZGV0YWlsOjp0aHJlYWQoCi0gICAgICAgICAgd29ya19pb19zZXJ2aWNlX3J1bm5lcigqd29ya19pb19zZXJ2aWNlXykpKTsKLSAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfUkVTT0xWRVJfU0VSVklDRV9CQVNFX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3NlbGVjdF9yZWFjdG9yLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9zZWxlY3RfcmVhY3Rvci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NzI5MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3NlbGVjdF9yZWFjdG9yLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC9zZWxlY3RfcmVhY3Rvci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1NFTEVDVF9SRUFDVE9SX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1NFTEVDVF9SRUFDVE9SX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKSBcCi0gIHx8ICghZGVmaW5lZChBU0lPX0hBU19ERVZfUE9MTCkgXAotICAgICAgJiYgIWRlZmluZWQoQVNJT19IQVNfRVBPTEwpIFwKLSAgICAgICYmICFkZWZpbmVkKEFTSU9fSEFTX0tRVUVVRSkgXAotICAgICAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXZvaWQgc2VsZWN0X3JlYWN0b3I6OmFkZF90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlKQotewotICBkb19hZGRfdGltZXJfcXVldWUocXVldWUpOwotfQotCi0vLyBSZW1vdmUgYSB0aW1lciBxdWV1ZSBmcm9tIHRoZSByZWFjdG9yLgotdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotdm9pZCBzZWxlY3RfcmVhY3Rvcjo6cmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUpCi17Ci0gIGRvX3JlbW92ZV90aW1lcl9xdWV1ZShxdWV1ZSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXZvaWQgc2VsZWN0X3JlYWN0b3I6OnNjaGVkdWxlX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgY29uc3QgdHlwZW5hbWUgVGltZV9UcmFpdHM6OnRpbWVfdHlwZSYgdGltZSwKLSAgICB0eXBlbmFtZSB0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz46OnBlcl90aW1lcl9kYXRhJiB0aW1lciwgd2FpdF9vcCogb3ApCi17Ci0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLQotICBpZiAoc2h1dGRvd25fKQotICB7Ci0gICAgaW9fc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgZWFybGllc3QgPSBxdWV1ZS5lbnF1ZXVlX3RpbWVyKHRpbWUsIHRpbWVyLCBvcCk7Ci0gIGlvX3NlcnZpY2VfLndvcmtfc3RhcnRlZCgpOwotICBpZiAoZWFybGllc3QpCi0gICAgaW50ZXJydXB0ZXJfLmludGVycnVwdCgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci1zdGQ6OnNpemVfdCBzZWxlY3RfcmVhY3Rvcjo6Y2FuY2VsX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgdHlwZW5hbWUgdGltZXJfcXVldWU8VGltZV9UcmFpdHM+OjpwZXJfdGltZXJfZGF0YSYgdGltZXIsCi0gICAgc3RkOjpzaXplX3QgbWF4X2NhbmNlbGxlZCkKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBvcF9xdWV1ZTxvcGVyYXRpb24+IG9wczsKLSAgc3RkOjpzaXplX3QgbiA9IHF1ZXVlLmNhbmNlbF90aW1lcih0aW1lciwgb3BzLCBtYXhfY2FuY2VsbGVkKTsKLSAgbG9jay51bmxvY2soKTsKLSAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHMpOwotICByZXR1cm4gbjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gICAgICAgLy8gICB8fCAoIWRlZmluZWQoQVNJT19IQVNfREVWX1BPTEwpCi0gICAgICAgLy8gICAgICAgJiYgIWRlZmluZWQoQVNJT19IQVNfRVBPTEwpCi0gICAgICAgLy8gICAgICAgJiYgIWRlZmluZWQoQVNJT19IQVNfS1FVRVVFKQotICAgICAgIC8vICAgICAgICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfU0VMRUNUX1JFQUNUT1JfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc2VsZWN0X3JlYWN0b3IuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3NlbGVjdF9yZWFjdG9yLmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkNTBkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc2VsZWN0X3JlYWN0b3IuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC9zZWxlY3RfcmVhY3Rvci5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1NFTEVDVF9SRUFDVE9SX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1NFTEVDVF9SRUFDVE9SX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKSBcCi0gIHx8ICghZGVmaW5lZChBU0lPX0hBU19ERVZfUE9MTCkgXAotICAgICAgJiYgIWRlZmluZWQoQVNJT19IQVNfRVBPTEwpIFwKLSAgICAgICYmICFkZWZpbmVkKEFTSU9fSEFTX0tRVUVVRSkgXAotICAgICAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZF9zZXRfYWRhcHRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc2VsZWN0X3JlYWN0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NpZ25hbF9ibG9ja2VyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfb3BzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1zZWxlY3RfcmVhY3Rvcjo6c2VsZWN0X3JlYWN0b3IoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxzZWxlY3RfcmVhY3Rvcj4oaW9fc2VydmljZSksCi0gICAgaW9fc2VydmljZV8odXNlX3NlcnZpY2U8aW9fc2VydmljZV9pbXBsPihpb19zZXJ2aWNlKSksCi0gICAgbXV0ZXhfKCksCi0gICAgaW50ZXJydXB0ZXJfKCksCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotICAgIHN0b3BfdGhyZWFkXyhmYWxzZSksCi0gICAgdGhyZWFkXygwKSwKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gICAgc2h1dGRvd25fKGZhbHNlKQotewotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSAgYXNpbzo6ZGV0YWlsOjpzaWduYWxfYmxvY2tlciBzYjsKLSAgdGhyZWFkXyA9IG5ldyBhc2lvOjpkZXRhaWw6OnRocmVhZCgKLSAgICAgIGJpbmRfaGFuZGxlcigmc2VsZWN0X3JlYWN0b3I6OmNhbGxfcnVuX3RocmVhZCwgdGhpcykpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLX0KLQotc2VsZWN0X3JlYWN0b3I6On5zZWxlY3RfcmVhY3RvcigpCi17Ci0gIHNodXRkb3duX3NlcnZpY2UoKTsKLX0KLQotdm9pZCBzZWxlY3RfcmVhY3Rvcjo6c2h1dGRvd25fc2VydmljZSgpCi17Ci0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgc2h1dGRvd25fID0gdHJ1ZTsKLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gIHN0b3BfdGhyZWFkXyA9IHRydWU7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotICBsb2NrLnVubG9jaygpOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotICBpZiAodGhyZWFkXykKLSAgewotICAgIGludGVycnVwdGVyXy5pbnRlcnJ1cHQoKTsKLSAgICB0aHJlYWRfLT5qb2luKCk7Ci0gICAgZGVsZXRlIHRocmVhZF87Ci0gICAgdGhyZWFkXyA9IDA7Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfb3BzOyArK2kpCi0gICAgb3BfcXVldWVfW2ldLmdldF9hbGxfb3BlcmF0aW9ucyhvcHMpOwotCi0gIHRpbWVyX3F1ZXVlc18uZ2V0X2FsbF90aW1lcnMob3BzKTsKLQotICBpb19zZXJ2aWNlXy5hYmFuZG9uX29wZXJhdGlvbnMob3BzKTsKLX0KLQotdm9pZCBzZWxlY3RfcmVhY3Rvcjo6Zm9ya19zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfZXZlbnQgZm9ya19ldikKLXsKLSAgaWYgKGZvcmtfZXYgPT0gYXNpbzo6aW9fc2VydmljZTo6Zm9ya19jaGlsZCkKLSAgICBpbnRlcnJ1cHRlcl8ucmVjcmVhdGUoKTsKLX0KLQotdm9pZCBzZWxlY3RfcmVhY3Rvcjo6aW5pdF90YXNrKCkKLXsKLSAgaW9fc2VydmljZV8uaW5pdF90YXNrKCk7Ci19Ci0KLWludCBzZWxlY3RfcmVhY3Rvcjo6cmVnaXN0ZXJfZGVzY3JpcHRvcihzb2NrZXRfdHlwZSwKLSAgICBzZWxlY3RfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYpCi17Ci0gIHJldHVybiAwOwotfQotCi1pbnQgc2VsZWN0X3JlYWN0b3I6OnJlZ2lzdGVyX2ludGVybmFsX2Rlc2NyaXB0b3IoCi0gICAgaW50IG9wX3R5cGUsIHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgc2VsZWN0X3JlYWN0b3I6OnBlcl9kZXNjcmlwdG9yX2RhdGEmLCByZWFjdG9yX29wKiBvcCkKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0gIG9wX3F1ZXVlX1tvcF90eXBlXS5lbnF1ZXVlX29wZXJhdGlvbihkZXNjcmlwdG9yLCBvcCk7Ci0gIGludGVycnVwdGVyXy5pbnRlcnJ1cHQoKTsKLQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBzZWxlY3RfcmVhY3Rvcjo6bW92ZV9kZXNjcmlwdG9yKHNvY2tldF90eXBlLAotICAgIHNlbGVjdF9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJiwKLSAgICBzZWxlY3RfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYpCi17Ci19Ci0KLXZvaWQgc2VsZWN0X3JlYWN0b3I6OnN0YXJ0X29wKGludCBvcF90eXBlLCBzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgIHNlbGVjdF9yZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhJiwgcmVhY3Rvcl9vcCogb3AsCi0gICAgYm9vbCBpc19jb250aW51YXRpb24sIGJvb2wpCi17Ci0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLQotICBpZiAoc2h1dGRvd25fKQotICB7Ci0gICAgcG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgaXNfY29udGludWF0aW9uKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIGZpcnN0ID0gb3BfcXVldWVfW29wX3R5cGVdLmVucXVldWVfb3BlcmF0aW9uKGRlc2NyaXB0b3IsIG9wKTsKLSAgaW9fc2VydmljZV8ud29ya19zdGFydGVkKCk7Ci0gIGlmIChmaXJzdCkKLSAgICBpbnRlcnJ1cHRlcl8uaW50ZXJydXB0KCk7Ci19Ci0KLXZvaWQgc2VsZWN0X3JlYWN0b3I6OmNhbmNlbF9vcHMoc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICBzZWxlY3RfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYpCi17Ci0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgY2FuY2VsX29wc191bmxvY2tlZChkZXNjcmlwdG9yLCBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQpOwotfQotCi12b2lkIHNlbGVjdF9yZWFjdG9yOjpkZXJlZ2lzdGVyX2Rlc2NyaXB0b3Ioc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICBzZWxlY3RfcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSYsIGJvb2wpCi17Ci0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgY2FuY2VsX29wc191bmxvY2tlZChkZXNjcmlwdG9yLCBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQpOwotfQotCi12b2lkIHNlbGVjdF9yZWFjdG9yOjpkZXJlZ2lzdGVyX2ludGVybmFsX2Rlc2NyaXB0b3IoCi0gICAgc29ja2V0X3R5cGUgZGVzY3JpcHRvciwgc2VsZWN0X3JlYWN0b3I6OnBlcl9kZXNjcmlwdG9yX2RhdGEmKQotewotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIG9wX3F1ZXVlPG9wZXJhdGlvbj4gb3BzOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1heF9vcHM7ICsraSkKLSAgICBvcF9xdWV1ZV9baV0uY2FuY2VsX29wZXJhdGlvbnMoZGVzY3JpcHRvciwgb3BzKTsKLX0KLQotdm9pZCBzZWxlY3RfcmVhY3Rvcjo6cnVuKGJvb2wgYmxvY2ssIG9wX3F1ZXVlPG9wZXJhdGlvbj4mIG9wcykKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotICAvLyBDaGVjayBpZiB0aGUgdGhyZWFkIGlzIHN1cHBvc2VkIHRvIHN0b3AuCi0gIGlmIChzdG9wX3RocmVhZF8pCi0gICAgcmV0dXJuOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotICAvLyBTZXQgdXAgdGhlIGRlc2NyaXB0b3Igc2V0cy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfc2VsZWN0X29wczsgKytpKQotICAgIGZkX3NldHNfW2ldLnJlc2V0KCk7Ci0gIGZkX3NldHNfW3JlYWRfb3BdLnNldChpbnRlcnJ1cHRlcl8ucmVhZF9kZXNjcmlwdG9yKCkpOwotICBzb2NrZXRfdHlwZSBtYXhfZmQgPSAwOwotICBib29sIGhhdmVfd29ya190b19kbyA9ICF0aW1lcl9xdWV1ZXNfLmFsbF9lbXB0eSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1heF9zZWxlY3Rfb3BzOyArK2kpCi0gIHsKLSAgICBoYXZlX3dvcmtfdG9fZG8gPSBoYXZlX3dvcmtfdG9fZG8gfHwgIW9wX3F1ZXVlX1tpXS5lbXB0eSgpOwotICAgIGZkX3NldHNfW2ldLnNldChvcF9xdWV1ZV9baV0sIG9wcyk7Ci0gICAgaWYgKGZkX3NldHNfW2ldLm1heF9kZXNjcmlwdG9yKCkgPiBtYXhfZmQpCi0gICAgICBtYXhfZmQgPSBmZF9zZXRzX1tpXS5tYXhfZGVzY3JpcHRvcigpOwotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAvLyBDb25uZWN0aW9uIG9wZXJhdGlvbnMgb24gV2luZG93cyB1c2UgYm90aCBleGNlcHQgYW5kIHdyaXRlIGZkX3NldHMuCi0gIGhhdmVfd29ya190b19kbyA9IGhhdmVfd29ya190b19kbyB8fCAhb3BfcXVldWVfW2Nvbm5lY3Rfb3BdLmVtcHR5KCk7Ci0gIGZkX3NldHNfW3dyaXRlX29wXS5zZXQob3BfcXVldWVfW2Nvbm5lY3Rfb3BdLCBvcHMpOwotICBpZiAoZmRfc2V0c19bd3JpdGVfb3BdLm1heF9kZXNjcmlwdG9yKCkgPiBtYXhfZmQpCi0gICAgbWF4X2ZkID0gZmRfc2V0c19bd3JpdGVfb3BdLm1heF9kZXNjcmlwdG9yKCk7Ci0gIGZkX3NldHNfW2V4Y2VwdF9vcF0uc2V0KG9wX3F1ZXVlX1tjb25uZWN0X29wXSwgb3BzKTsKLSAgaWYgKGZkX3NldHNfW2V4Y2VwdF9vcF0ubWF4X2Rlc2NyaXB0b3IoKSA+IG1heF9mZCkKLSAgICBtYXhfZmQgPSBmZF9zZXRzX1tleGNlcHRfb3BdLm1heF9kZXNjcmlwdG9yKCk7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLQotICAvLyBXZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZXJlJ3Mgbm8gd29yayB0byBkbyBhbmQgdGhlIHJlYWN0b3IgaXMKLSAgLy8gbm90IHN1cHBvc2VkIHRvIGJsb2NrLgotICBpZiAoIWJsb2NrICYmICFoYXZlX3dvcmtfdG9fZG8pCi0gICAgcmV0dXJuOwotCi0gIC8vIERldGVybWluZSBob3cgbG9uZyB0byBibG9jayB3aGlsZSB3YWl0aW5nIGZvciBldmVudHMuCi0gIHRpbWV2YWwgdHZfYnVmID0geyAwLCAwIH07Ci0gIHRpbWV2YWwqIHR2ID0gYmxvY2sgPyBnZXRfdGltZW91dCh0dl9idWYpIDogJnR2X2J1ZjsKLQotICBsb2NrLnVubG9jaygpOwotCi0gIC8vIEJsb2NrIG9uIHRoZSBzZWxlY3QgY2FsbCB1bnRpbCBkZXNjcmlwdG9ycyBiZWNvbWUgcmVhZHkuCi0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIGludCByZXR2YWwgPSBzb2NrZXRfb3BzOjpzZWxlY3Qoc3RhdGljX2Nhc3Q8aW50PihtYXhfZmQgKyAxKSwKLSAgICAgIGZkX3NldHNfW3JlYWRfb3BdLCBmZF9zZXRzX1t3cml0ZV9vcF0sIGZkX3NldHNfW2V4Y2VwdF9vcF0sIHR2LCBlYyk7Ci0KLSAgLy8gUmVzZXQgdGhlIGludGVycnVwdGVyLgotICBpZiAocmV0dmFsID4gMCAmJiBmZF9zZXRzX1tyZWFkX29wXS5pc19zZXQoaW50ZXJydXB0ZXJfLnJlYWRfZGVzY3JpcHRvcigpKSkKLSAgewotICAgIGludGVycnVwdGVyXy5yZXNldCgpOwotICAgIC0tcmV0dmFsOwotICB9Ci0KLSAgbG9jay5sb2NrKCk7Ci0KLSAgLy8gRGlzcGF0Y2ggYWxsIHJlYWR5IG9wZXJhdGlvbnMuCi0gIGlmIChyZXR2YWwgPiAwKQotICB7Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICAvLyBDb25uZWN0aW9uIG9wZXJhdGlvbnMgb24gV2luZG93cyB1c2UgYm90aCBleGNlcHQgYW5kIHdyaXRlIGZkX3NldHMuCi0gICAgZmRfc2V0c19bZXhjZXB0X29wXS5wZXJmb3JtKG9wX3F1ZXVlX1tjb25uZWN0X29wXSwgb3BzKTsKLSAgICBmZF9zZXRzX1t3cml0ZV9vcF0ucGVyZm9ybShvcF9xdWV1ZV9bY29ubmVjdF9vcF0sIG9wcyk7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLQotICAgIC8vIEV4Y2VwdGlvbiBvcGVyYXRpb25zIG11c3QgYmUgcHJvY2Vzc2VkIGZpcnN0IHRvIGVuc3VyZSB0aGF0IGFueQotICAgIC8vIG91dC1vZi1iYW5kIGRhdGEgaXMgcmVhZCBiZWZvcmUgbm9ybWFsIGRhdGEuCi0gICAgZm9yIChpbnQgaSA9IG1heF9zZWxlY3Rfb3BzIC0gMTsgaSA+PSAwOyAtLWkpCi0gICAgICBmZF9zZXRzX1tpXS5wZXJmb3JtKG9wX3F1ZXVlX1tpXSwgb3BzKTsKLSAgfQotICB0aW1lcl9xdWV1ZXNfLmdldF9yZWFkeV90aW1lcnMob3BzKTsKLX0KLQotdm9pZCBzZWxlY3RfcmVhY3Rvcjo6aW50ZXJydXB0KCkKLXsKLSAgaW50ZXJydXB0ZXJfLmludGVycnVwdCgpOwotfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotdm9pZCBzZWxlY3RfcmVhY3Rvcjo6cnVuX3RocmVhZCgpCi17Ci0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgd2hpbGUgKCFzdG9wX3RocmVhZF8pCi0gIHsKLSAgICBsb2NrLnVubG9jaygpOwotICAgIG9wX3F1ZXVlPG9wZXJhdGlvbj4gb3BzOwotICAgIHJ1bih0cnVlLCBvcHMpOwotICAgIGlvX3NlcnZpY2VfLnBvc3RfZGVmZXJyZWRfY29tcGxldGlvbnMob3BzKTsKLSAgICBsb2NrLmxvY2soKTsKLSAgfQotfQotCi12b2lkIHNlbGVjdF9yZWFjdG9yOjpjYWxsX3J1bl90aHJlYWQoc2VsZWN0X3JlYWN0b3IqIHJlYWN0b3IpCi17Ci0gIHJlYWN0b3ItPnJ1bl90aHJlYWQoKTsKLX0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLXZvaWQgc2VsZWN0X3JlYWN0b3I6OmRvX2FkZF90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZV9iYXNlJiBxdWV1ZSkKLXsKLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgdGltZXJfcXVldWVzXy5pbnNlcnQoJnF1ZXVlKTsKLX0KLQotdm9pZCBzZWxlY3RfcmVhY3Rvcjo6ZG9fcmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlX2Jhc2UmIHF1ZXVlKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICB0aW1lcl9xdWV1ZXNfLmVyYXNlKCZxdWV1ZSk7Ci19Ci0KLXRpbWV2YWwqIHNlbGVjdF9yZWFjdG9yOjpnZXRfdGltZW91dCh0aW1ldmFsJiB0dikKLXsKLSAgLy8gQnkgZGVmYXVsdCB3ZSB3aWxsIHdhaXQgbm8gbG9uZ2VyIHRoYW4gNSBtaW51dGVzLiBUaGlzIHdpbGwgZW5zdXJlIHRoYXQKLSAgLy8gYW55IGNoYW5nZXMgdG8gdGhlIHN5c3RlbSBjbG9jayBhcmUgZGV0ZWN0ZWQgYWZ0ZXIgbm8gbG9uZ2VyIHRoYW4gdGhpcy4KLSAgbG9uZyB1c2VjID0gdGltZXJfcXVldWVzXy53YWl0X2R1cmF0aW9uX3VzZWMoNSAqIDYwICogMTAwMCAqIDEwMDApOwotICB0di50dl9zZWMgPSB1c2VjIC8gMTAwMDAwMDsKLSAgdHYudHZfdXNlYyA9IHVzZWMgJSAxMDAwMDAwOwotICByZXR1cm4gJnR2OwotfQotCi12b2lkIHNlbGVjdF9yZWFjdG9yOjpjYW5jZWxfb3BzX3VubG9ja2VkKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGJvb2wgbmVlZF9pbnRlcnJ1cHQgPSBmYWxzZTsKLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4X29wczsgKytpKQotICAgIG5lZWRfaW50ZXJydXB0ID0gb3BfcXVldWVfW2ldLmNhbmNlbF9vcGVyYXRpb25zKAotICAgICAgICBkZXNjcmlwdG9yLCBvcHMsIGVjKSB8fCBuZWVkX2ludGVycnVwdDsKLSAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHMpOwotICBpZiAobmVlZF9pbnRlcnJ1cHQpCi0gICAgaW50ZXJydXB0ZXJfLmludGVycnVwdCgpOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSAgICAgICAvLyAgIHx8ICghZGVmaW5lZChBU0lPX0hBU19ERVZfUE9MTCkKLSAgICAgICAvLyAgICAgICAmJiAhZGVmaW5lZChBU0lPX0hBU19FUE9MTCkKLSAgICAgICAvLyAgICAgICAmJiAhZGVmaW5lZChBU0lPX0hBU19LUVVFVUUpKQotICAgICAgIC8vICAgICAgICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfU0VMRUNUX1JFQUNUT1JfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc2VydmljZV9yZWdpc3RyeS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc2VydmljZV9yZWdpc3RyeS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwY2ZhYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3NlcnZpY2VfcmVnaXN0cnkuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3NlcnZpY2VfcmVnaXN0cnkuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1NFUlZJQ0VfUkVHSVNUUllfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfU0VSVklDRV9SRUdJU1RSWV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2aWNlLCB0eXBlbmFtZSBBcmc+Ci1zZXJ2aWNlX3JlZ2lzdHJ5OjpzZXJ2aWNlX3JlZ2lzdHJ5KAotICAgIGFzaW86OmlvX3NlcnZpY2UmIG8sIFNlcnZpY2UqLCBBcmcgYXJnKQotICA6IG93bmVyXyhvKSwKLSAgICBmaXJzdF9zZXJ2aWNlXyhuZXcgU2VydmljZShvLCBhcmcpKQotewotICBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlOjprZXkga2V5OwotICBpbml0X2tleShrZXksIFNlcnZpY2U6OmlkKTsKLSAgZmlyc3Rfc2VydmljZV8tPmtleV8gPSBrZXk7Ci0gIGZpcnN0X3NlcnZpY2VfLT5uZXh0XyA9IDA7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2aWNlPgotU2VydmljZSYgc2VydmljZV9yZWdpc3RyeTo6Zmlyc3Rfc2VydmljZSgpCi17Ci0gIHJldHVybiAqc3RhdGljX2Nhc3Q8U2VydmljZSo+KGZpcnN0X3NlcnZpY2VfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2U+Ci1TZXJ2aWNlJiBzZXJ2aWNlX3JlZ2lzdHJ5Ojp1c2Vfc2VydmljZSgpCi17Ci0gIGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2U6OmtleSBrZXk7Ci0gIGluaXRfa2V5KGtleSwgU2VydmljZTo6aWQpOwotICBmYWN0b3J5X3R5cGUgZmFjdG9yeSA9ICZzZXJ2aWNlX3JlZ2lzdHJ5OjpjcmVhdGU8U2VydmljZT47Ci0gIHJldHVybiAqc3RhdGljX2Nhc3Q8U2VydmljZSo+KGRvX3VzZV9zZXJ2aWNlKGtleSwgZmFjdG9yeSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmljZT4KLXZvaWQgc2VydmljZV9yZWdpc3RyeTo6YWRkX3NlcnZpY2UoU2VydmljZSogbmV3X3NlcnZpY2UpCi17Ci0gIGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2U6OmtleSBrZXk7Ci0gIGluaXRfa2V5KGtleSwgU2VydmljZTo6aWQpOwotICByZXR1cm4gZG9fYWRkX3NlcnZpY2Uoa2V5LCBuZXdfc2VydmljZSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2aWNlPgotYm9vbCBzZXJ2aWNlX3JlZ2lzdHJ5OjpoYXNfc2VydmljZSgpIGNvbnN0Ci17Ci0gIGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2U6OmtleSBrZXk7Ci0gIGluaXRfa2V5KGtleSwgU2VydmljZTo6aWQpOwotICByZXR1cm4gZG9faGFzX3NlcnZpY2Uoa2V5KTsKLX0KLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fVFlQRUlEKQotdGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2U+Ci12b2lkIHNlcnZpY2VfcmVnaXN0cnk6OmluaXRfa2V5KGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2U6OmtleSYga2V5LAotICAgIGNvbnN0IGFzaW86OmRldGFpbDo6c2VydmljZV9pZDxTZXJ2aWNlPiYgLyppZCovKQotewotICBrZXkudHlwZV9pbmZvXyA9ICZ0eXBlaWQodHlwZWlkX3dyYXBwZXI8U2VydmljZT4pOwotICBrZXkuaWRfID0gMDsKLX0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX1RZUEVJRCkKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2U+Ci1hc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlKiBzZXJ2aWNlX3JlZ2lzdHJ5OjpjcmVhdGUoCi0gICAgYXNpbzo6aW9fc2VydmljZSYgb3duZXIpCi17Ci0gIHJldHVybiBuZXcgU2VydmljZShvd25lcik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9TRVJWSUNFX1JFR0lTVFJZX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3NlcnZpY2VfcmVnaXN0cnkuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3NlcnZpY2VfcmVnaXN0cnkuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzM1OGM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9zZXJ2aWNlX3JlZ2lzdHJ5LmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvc2VydmljZV9yZWdpc3RyeS5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfU0VSVklDRV9SRUdJU1RSWV9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9TRVJWSUNFX1JFR0lTVFJZX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zZXJ2aWNlX3JlZ2lzdHJ5LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19leGNlcHRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXNlcnZpY2VfcmVnaXN0cnk6On5zZXJ2aWNlX3JlZ2lzdHJ5KCkKLXsKLSAgLy8gU2h1dGRvd24gYWxsIHNlcnZpY2VzLiBUaGlzIG11c3QgYmUgZG9uZSBpbiBhIHNlcGFyYXRlIGxvb3AgYmVmb3JlIHRoZQotICAvLyBzZXJ2aWNlcyBhcmUgZGVzdHJveWVkIHNpbmNlIHRoZSBkZXN0cnVjdG9ycyBvZiB1c2VyLWRlZmluZWQgaGFuZGxlcgotICAvLyBvYmplY3RzIG1heSB0cnkgdG8gYWNjZXNzIG90aGVyIHNlcnZpY2Ugb2JqZWN0cy4KLSAgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZSogc2VydmljZSA9IGZpcnN0X3NlcnZpY2VfOwotICB3aGlsZSAoc2VydmljZSkKLSAgewotICAgIHNlcnZpY2UtPnNodXRkb3duX3NlcnZpY2UoKTsKLSAgICBzZXJ2aWNlID0gc2VydmljZS0+bmV4dF87Ci0gIH0KLQotICAvLyBEZXN0cm95IGFsbCBzZXJ2aWNlcy4KLSAgd2hpbGUgKGZpcnN0X3NlcnZpY2VfKQotICB7Ci0gICAgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZSogbmV4dF9zZXJ2aWNlID0gZmlyc3Rfc2VydmljZV8tPm5leHRfOwotICAgIGRlc3Ryb3koZmlyc3Rfc2VydmljZV8pOwotICAgIGZpcnN0X3NlcnZpY2VfID0gbmV4dF9zZXJ2aWNlOwotICB9Ci19Ci0KLXZvaWQgc2VydmljZV9yZWdpc3RyeTo6bm90aWZ5X2ZvcmsoYXNpbzo6aW9fc2VydmljZTo6Zm9ya19ldmVudCBmb3JrX2V2KQotewotICAvLyBNYWtlIGEgY29weSBvZiBhbGwgb2YgdGhlIHNlcnZpY2VzIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suIFdlIGRvbid0IHdhbnQKLSAgLy8gdG8gaG9sZCB0aGUgbG9jayB3aGlsZSBjYWxsaW5nIGludG8gZWFjaCBzZXJ2aWNlLCBhcyBpdCBtYXkgdHJ5IHRvIGNhbGwKLSAgLy8gYmFjayBpbnRvIHRoaXMgY2xhc3MuCi0gIHN0ZDo6dmVjdG9yPGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2UqPiBzZXJ2aWNlczsKLSAgewotICAgIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgICBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlKiBzZXJ2aWNlID0gZmlyc3Rfc2VydmljZV87Ci0gICAgd2hpbGUgKHNlcnZpY2UpCi0gICAgewotICAgICAgc2VydmljZXMucHVzaF9iYWNrKHNlcnZpY2UpOwotICAgICAgc2VydmljZSA9IHNlcnZpY2UtPm5leHRfOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHByb2Nlc3NpbmcgdGhlIGZvcmtfcHJlcGFyZSBldmVudCwgd2Ugd2FudCB0byBnbyBpbiByZXZlcnNlIG9yZGVyIG9mCi0gIC8vIHNlcnZpY2UgcmVnaXN0cmF0aW9uLCB3aGljaCBoYXBwZW5zIHRvIGJlIHRoZSBleGlzdGluZyBvcmRlciBvZiB0aGUKLSAgLy8gc2VydmljZXMgaW4gdGhlIHZlY3Rvci4gRm9yIHRoZSBvdGhlciBldmVudHMgd2Ugd2FudCB0byBnbyBpbiB0aGUgb3RoZXIKLSAgLy8gZGlyZWN0aW9uLgotICBzdGQ6OnNpemVfdCBudW1fc2VydmljZXMgPSBzZXJ2aWNlcy5zaXplKCk7Ci0gIGlmIChmb3JrX2V2ID09IGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfcHJlcGFyZSkKLSAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbnVtX3NlcnZpY2VzOyArK2kpCi0gICAgICBzZXJ2aWNlc1tpXS0+Zm9ya19zZXJ2aWNlKGZvcmtfZXYpOwotICBlbHNlCi0gICAgZm9yIChzdGQ6OnNpemVfdCBpID0gbnVtX3NlcnZpY2VzOyBpID4gMDsgLS1pKQotICAgICAgc2VydmljZXNbaSAtIDFdLT5mb3JrX3NlcnZpY2UoZm9ya19ldik7Ci19Ci0KLXZvaWQgc2VydmljZV9yZWdpc3RyeTo6aW5pdF9rZXkoYXNpbzo6aW9fc2VydmljZTo6c2VydmljZTo6a2V5JiBrZXksCi0gICAgY29uc3QgYXNpbzo6aW9fc2VydmljZTo6aWQmIGlkKQotewotICBrZXkudHlwZV9pbmZvXyA9IDA7Ci0gIGtleS5pZF8gPSAmaWQ7Ci19Ci0KLWJvb2wgc2VydmljZV9yZWdpc3RyeTo6a2V5c19tYXRjaCgKLSAgICBjb25zdCBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlOjprZXkmIGtleTEsCi0gICAgY29uc3QgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZTo6a2V5JiBrZXkyKQotewotICBpZiAoa2V5MS5pZF8gJiYga2V5Mi5pZF8pCi0gICAgaWYgKGtleTEuaWRfID09IGtleTIuaWRfKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIGlmIChrZXkxLnR5cGVfaW5mb18gJiYga2V5Mi50eXBlX2luZm9fKQotICAgIGlmICgqa2V5MS50eXBlX2luZm9fID09ICprZXkyLnR5cGVfaW5mb18pCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIHNlcnZpY2VfcmVnaXN0cnk6OmRlc3Ryb3koYXNpbzo6aW9fc2VydmljZTo6c2VydmljZSogc2VydmljZSkKLXsKLSAgZGVsZXRlIHNlcnZpY2U7Ci19Ci0KLWFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2UqIHNlcnZpY2VfcmVnaXN0cnk6OmRvX3VzZV9zZXJ2aWNlKAotICAgIGNvbnN0IGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2U6OmtleSYga2V5LAotICAgIGZhY3RvcnlfdHlwZSBmYWN0b3J5KQotewotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgLy8gRmlyc3Qgc2VlIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHNlcnZpY2Ugb2JqZWN0IHdpdGggdGhlIGdpdmVuIGtleS4KLSAgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZSogc2VydmljZSA9IGZpcnN0X3NlcnZpY2VfOwotICB3aGlsZSAoc2VydmljZSkKLSAgewotICAgIGlmIChrZXlzX21hdGNoKHNlcnZpY2UtPmtleV8sIGtleSkpCi0gICAgICByZXR1cm4gc2VydmljZTsKLSAgICBzZXJ2aWNlID0gc2VydmljZS0+bmV4dF87Ci0gIH0KLQotICAvLyBDcmVhdGUgYSBuZXcgc2VydmljZSBvYmplY3QuIFRoZSBzZXJ2aWNlIHJlZ2lzdHJ5J3MgbXV0ZXggaXMgbm90IGxvY2tlZAotICAvLyBhdCB0aGlzIHRpbWUgdG8gYWxsb3cgZm9yIG5lc3RlZCBjYWxscyBpbnRvIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgbmV3Ci0gIC8vIHNlcnZpY2UncyBjb25zdHJ1Y3Rvci4KLSAgbG9jay51bmxvY2soKTsKLSAgYXV0b19zZXJ2aWNlX3B0ciBuZXdfc2VydmljZSA9IHsgZmFjdG9yeShvd25lcl8pIH07Ci0gIG5ld19zZXJ2aWNlLnB0cl8tPmtleV8gPSBrZXk7Ci0gIGxvY2subG9jaygpOwotCi0gIC8vIENoZWNrIHRoYXQgbm9ib2R5IGVsc2UgY3JlYXRlZCBhbm90aGVyIHNlcnZpY2Ugb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUKLSAgLy8gd2hpbGUgdGhlIGxvY2sgd2FzIHJlbGVhc2VkLgotICBzZXJ2aWNlID0gZmlyc3Rfc2VydmljZV87Ci0gIHdoaWxlIChzZXJ2aWNlKQotICB7Ci0gICAgaWYgKGtleXNfbWF0Y2goc2VydmljZS0+a2V5Xywga2V5KSkKLSAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIHNlcnZpY2UgPSBzZXJ2aWNlLT5uZXh0XzsKLSAgfQotCi0gIC8vIFNlcnZpY2Ugd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXNlZCwgcGFzcyBvd25lcnNoaXAgdG8gcmVnaXN0cnkuCi0gIG5ld19zZXJ2aWNlLnB0cl8tPm5leHRfID0gZmlyc3Rfc2VydmljZV87Ci0gIGZpcnN0X3NlcnZpY2VfID0gbmV3X3NlcnZpY2UucHRyXzsKLSAgbmV3X3NlcnZpY2UucHRyXyA9IDA7Ci0gIHJldHVybiBmaXJzdF9zZXJ2aWNlXzsKLX0KLQotdm9pZCBzZXJ2aWNlX3JlZ2lzdHJ5Ojpkb19hZGRfc2VydmljZSgKLSAgICBjb25zdCBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlOjprZXkmIGtleSwKLSAgICBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlKiBuZXdfc2VydmljZSkKLXsKLSAgaWYgKCZvd25lcl8gIT0gJm5ld19zZXJ2aWNlLT5nZXRfaW9fc2VydmljZSgpKQotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKGludmFsaWRfc2VydmljZV9vd25lcigpKTsKLQotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW4gZXhpc3Rpbmcgc2VydmljZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4ga2V5LgotICBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlKiBzZXJ2aWNlID0gZmlyc3Rfc2VydmljZV87Ci0gIHdoaWxlIChzZXJ2aWNlKQotICB7Ci0gICAgaWYgKGtleXNfbWF0Y2goc2VydmljZS0+a2V5Xywga2V5KSkKLSAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKHNlcnZpY2VfYWxyZWFkeV9leGlzdHMoKSk7Ci0gICAgc2VydmljZSA9IHNlcnZpY2UtPm5leHRfOwotICB9Ci0KLSAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIHNlcnZpY2Ugb2JqZWN0LgotICBuZXdfc2VydmljZS0+a2V5XyA9IGtleTsKLSAgbmV3X3NlcnZpY2UtPm5leHRfID0gZmlyc3Rfc2VydmljZV87Ci0gIGZpcnN0X3NlcnZpY2VfID0gbmV3X3NlcnZpY2U7Ci19Ci0KLWJvb2wgc2VydmljZV9yZWdpc3RyeTo6ZG9faGFzX3NlcnZpY2UoCi0gICAgY29uc3QgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZTo6a2V5JiBrZXkpIGNvbnN0Ci17Ci0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLQotICBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlKiBzZXJ2aWNlID0gZmlyc3Rfc2VydmljZV87Ci0gIHdoaWxlIChzZXJ2aWNlKQotICB7Ci0gICAgaWYgKGtleXNfbWF0Y2goc2VydmljZS0+a2V5Xywga2V5KSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIHNlcnZpY2UgPSBzZXJ2aWNlLT5uZXh0XzsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX1NFUlZJQ0VfUkVHSVNUUllfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc2lnbmFsX3NldF9zZXJ2aWNlLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9zaWduYWxfc2V0X3NlcnZpY2UuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjAwZGMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9zaWduYWxfc2V0X3NlcnZpY2UuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsNjQ3ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC9zaWduYWxfc2V0X3NlcnZpY2UuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfU0lHTkFMX1NFVF9TRVJWSUNFX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1NJR05BTF9TRVRfU0VSVklDRV9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc2lnbmFsX2Jsb2NrZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NpZ25hbF9zZXRfc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc3RhdGljX211dGV4LmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1zdHJ1Y3Qgc2lnbmFsX3N0YXRlCi17Ci0gIC8vIE11dGV4IHVzZWQgZm9yIHByb3RlY3RpbmcgZ2xvYmFsIHN0YXRlLgotICBzdGF0aWNfbXV0ZXggbXV0ZXhfOwotCi0gIC8vIFRoZSByZWFkIGVuZCBvZiB0aGUgcGlwZSB1c2VkIGZvciBzaWduYWwgbm90aWZpY2F0aW9ucy4KLSAgaW50IHJlYWRfZGVzY3JpcHRvcl87Ci0KLSAgLy8gVGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB1c2VkIGZvciBzaWduYWwgbm90aWZpY2F0aW9ucy4KLSAgaW50IHdyaXRlX2Rlc2NyaXB0b3JfOwotCi0gIC8vIFdoZXRoZXIgdGhlIHNpZ25hbCBzdGF0ZSBoYXMgYmVlbiBwcmVwYXJlZCBmb3IgYSBmb3JrLgotICBib29sIGZvcmtfcHJlcGFyZWRfOwotCi0gIC8vIFRoZSBoZWFkIG9mIGEgbGlua2VkIGxpc3Qgb2YgYWxsIHNpZ25hbF9zZXRfc2VydmljZSBpbnN0YW5jZXMuCi0gIGNsYXNzIHNpZ25hbF9zZXRfc2VydmljZSogc2VydmljZV9saXN0XzsKLQotICAvLyBBIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IGFyZSByZWdpc3RlcmVkIGZvciBlYWNoIHNpZ25hbC4KLSAgc3RkOjpzaXplX3QgcmVnaXN0cmF0aW9uX2NvdW50X1ttYXhfc2lnbmFsX251bWJlcl07Ci19OwotCi1zaWduYWxfc3RhdGUqIGdldF9zaWduYWxfc3RhdGUoKQotewotICBzdGF0aWMgc2lnbmFsX3N0YXRlIHN0YXRlID0gewotICAgIEFTSU9fU1RBVElDX01VVEVYX0lOSVQsIC0xLCAtMSwgZmFsc2UsIDAsIHsgMCB9IH07Ci0gIHJldHVybiAmc3RhdGU7Ci19Ci0KLXZvaWQgYXNpb19zaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsX251bWJlcikKLXsKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgXAotICB8fCBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKSBcCi0gIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgc2lnbmFsX3NldF9zZXJ2aWNlOjpkZWxpdmVyX3NpZ25hbChzaWduYWxfbnVtYmVyKTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgLy8gICB8fCBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAgICAgLy8gICB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGludCBzYXZlZF9lcnJubyA9IGVycm5vOwotICBzaWduYWxfc3RhdGUqIHN0YXRlID0gZ2V0X3NpZ25hbF9zdGF0ZSgpOwotICBzaWduZWRfc2l6ZV90eXBlIHJlc3VsdCA9IDo6d3JpdGUoc3RhdGUtPndyaXRlX2Rlc2NyaXB0b3JfLAotICAgICAgJnNpZ25hbF9udW1iZXIsIHNpemVvZihzaWduYWxfbnVtYmVyKSk7Ci0gICh2b2lkKXJlc3VsdDsKLSAgZXJybm8gPSBzYXZlZF9lcnJubzsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAvLyAgIHx8IGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NJR05BTCkgJiYgIWRlZmluZWQoQVNJT19IQVNfU0lHQUNUSU9OKQotICA6OnNpZ25hbChzaWduYWxfbnVtYmVyLCBhc2lvX3NpZ25hbF9oYW5kbGVyKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NJR05BTCkgJiYgIWRlZmluZWQoQVNJT19IQVNfU0lHQUNUSU9OKQotfQotCi0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTKSBcCi0gICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKSBcCi0gICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi1jbGFzcyBzaWduYWxfc2V0X3NlcnZpY2U6OnBpcGVfcmVhZF9vcCA6IHB1YmxpYyByZWFjdG9yX29wCi17Ci1wdWJsaWM6Ci0gIHBpcGVfcmVhZF9vcCgpCi0gICAgOiByZWFjdG9yX29wKCZwaXBlX3JlYWRfb3A6OmRvX3BlcmZvcm0sIHBpcGVfcmVhZF9vcDo6ZG9fY29tcGxldGUpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyBib29sIGRvX3BlcmZvcm0ocmVhY3Rvcl9vcCopCi0gIHsKLSAgICBzaWduYWxfc3RhdGUqIHN0YXRlID0gZ2V0X3NpZ25hbF9zdGF0ZSgpOwotCi0gICAgaW50IGZkID0gc3RhdGUtPnJlYWRfZGVzY3JpcHRvcl87Ci0gICAgaW50IHNpZ25hbF9udW1iZXIgPSAwOwotICAgIHdoaWxlICg6OnJlYWQoZmQsICZzaWduYWxfbnVtYmVyLCBzaXplb2YoaW50KSkgPT0gc2l6ZW9mKGludCkpCi0gICAgICBpZiAoc2lnbmFsX251bWJlciA+PSAwICYmIHNpZ25hbF9udW1iZXIgPCBtYXhfc2lnbmFsX251bWJlcikKLSAgICAgICAgc2lnbmFsX3NldF9zZXJ2aWNlOjpkZWxpdmVyX3NpZ25hbChzaWduYWxfbnVtYmVyKTsKLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogLypvd25lciovLCBvcGVyYXRpb24qIGJhc2UsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiAvKmVjKi8sCi0gICAgICBzdGQ6OnNpemVfdCAvKmJ5dGVzX3RyYW5zZmVycmVkKi8pCi0gIHsKLSAgICBwaXBlX3JlYWRfb3AqIG8oc3RhdGljX2Nhc3Q8cGlwZV9yZWFkX29wKj4oYmFzZSkpOwotICAgIGRlbGV0ZSBvOwotICB9Ci19OwotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAvLyAgICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAgICAgIC8vICAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotc2lnbmFsX3NldF9zZXJ2aWNlOjpzaWduYWxfc2V0X3NlcnZpY2UoCi0gICAgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiBpb19zZXJ2aWNlXyhhc2lvOjp1c2Vfc2VydmljZTxpb19zZXJ2aWNlX2ltcGw+KGlvX3NlcnZpY2UpKSwKLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpIFwKLSAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpIFwKLSAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSAgICByZWFjdG9yXyhhc2lvOjp1c2Vfc2VydmljZTxyZWFjdG9yPihpb19zZXJ2aWNlKSksCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgIC8vICAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotICAgIG5leHRfKDApLAotICAgIHByZXZfKDApCi17Ci0gIGdldF9zaWduYWxfc3RhdGUoKS0+bXV0ZXhfLmluaXQoKTsKLQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XUykgXAotICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkgXAotICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotICByZWFjdG9yXy5pbml0X3Rhc2soKTsKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgICAgICAvLyAgICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfc2lnbmFsX251bWJlcjsgKytpKQotICAgIHJlZ2lzdHJhdGlvbnNfW2ldID0gMDsKLQotICBhZGRfc2VydmljZSh0aGlzKTsKLX0KLQotc2lnbmFsX3NldF9zZXJ2aWNlOjp+c2lnbmFsX3NldF9zZXJ2aWNlKCkKLXsKLSAgcmVtb3ZlX3NlcnZpY2UodGhpcyk7Ci19Ci0KLXZvaWQgc2lnbmFsX3NldF9zZXJ2aWNlOjpzaHV0ZG93bl9zZXJ2aWNlKCkKLXsKLSAgcmVtb3ZlX3NlcnZpY2UodGhpcyk7Ci0KLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfc2lnbmFsX251bWJlcjsgKytpKQotICB7Ci0gICAgcmVnaXN0cmF0aW9uKiByZWcgPSByZWdpc3RyYXRpb25zX1tpXTsKLSAgICB3aGlsZSAocmVnKQotICAgIHsKLSAgICAgIG9wcy5wdXNoKCpyZWctPnF1ZXVlXyk7Ci0gICAgICByZWcgPSByZWctPm5leHRfaW5fdGFibGVfOwotICAgIH0KLSAgfQotCi0gIGlvX3NlcnZpY2VfLmFiYW5kb25fb3BlcmF0aW9ucyhvcHMpOwotfQotCi12b2lkIHNpZ25hbF9zZXRfc2VydmljZTo6Zm9ya19zZXJ2aWNlKAotICAgIGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfZXZlbnQgZm9ya19ldikKLXsKLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpIFwKLSAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpIFwKLSAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSAgc2lnbmFsX3N0YXRlKiBzdGF0ZSA9IGdldF9zaWduYWxfc3RhdGUoKTsKLSAgc3RhdGljX211dGV4OjpzY29wZWRfbG9jayBsb2NrKHN0YXRlLT5tdXRleF8pOwotCi0gIHN3aXRjaCAoZm9ya19ldikKLSAgewotICBjYXNlIGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfcHJlcGFyZToKLSAgICB7Ci0gICAgICBpbnQgcmVhZF9kZXNjcmlwdG9yID0gc3RhdGUtPnJlYWRfZGVzY3JpcHRvcl87Ci0gICAgICBzdGF0ZS0+Zm9ya19wcmVwYXJlZF8gPSB0cnVlOwotICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgIHJlYWN0b3JfLmRlcmVnaXN0ZXJfaW50ZXJuYWxfZGVzY3JpcHRvcihyZWFkX2Rlc2NyaXB0b3IsIHJlYWN0b3JfZGF0YV8pOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBhc2lvOjppb19zZXJ2aWNlOjpmb3JrX3BhcmVudDoKLSAgICBpZiAoc3RhdGUtPmZvcmtfcHJlcGFyZWRfKQotICAgIHsKLSAgICAgIGludCByZWFkX2Rlc2NyaXB0b3IgPSBzdGF0ZS0+cmVhZF9kZXNjcmlwdG9yXzsKLSAgICAgIHN0YXRlLT5mb3JrX3ByZXBhcmVkXyA9IGZhbHNlOwotICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgIHJlYWN0b3JfLnJlZ2lzdGVyX2ludGVybmFsX2Rlc2NyaXB0b3IocmVhY3Rvcjo6cmVhZF9vcCwKLSAgICAgICAgICByZWFkX2Rlc2NyaXB0b3IsIHJlYWN0b3JfZGF0YV8sIG5ldyBwaXBlX3JlYWRfb3ApOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBhc2lvOjppb19zZXJ2aWNlOjpmb3JrX2NoaWxkOgotICAgIGlmIChzdGF0ZS0+Zm9ya19wcmVwYXJlZF8pCi0gICAgewotICAgICAgYXNpbzo6ZGV0YWlsOjpzaWduYWxfYmxvY2tlciBibG9ja2VyOwotICAgICAgY2xvc2VfZGVzY3JpcHRvcnMoKTsKLSAgICAgIG9wZW5fZGVzY3JpcHRvcnMoKTsKLSAgICAgIGludCByZWFkX2Rlc2NyaXB0b3IgPSBzdGF0ZS0+cmVhZF9kZXNjcmlwdG9yXzsKLSAgICAgIHN0YXRlLT5mb3JrX3ByZXBhcmVkXyA9IGZhbHNlOwotICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgIHJlYWN0b3JfLnJlZ2lzdGVyX2ludGVybmFsX2Rlc2NyaXB0b3IocmVhY3Rvcjo6cmVhZF9vcCwKLSAgICAgICAgICByZWFkX2Rlc2NyaXB0b3IsIHJlYWN0b3JfZGF0YV8sIG5ldyBwaXBlX3JlYWRfb3ApOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBicmVhazsKLSAgfQotI2Vsc2UgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgICAgIC8vICAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSAgKHZvaWQpZm9ya19ldjsKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgICAgICAvLyAgICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi19Ci0KLXZvaWQgc2lnbmFsX3NldF9zZXJ2aWNlOjpjb25zdHJ1Y3QoCi0gICAgc2lnbmFsX3NldF9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotewotICBpbXBsLnNpZ25hbHNfID0gMDsKLX0KLQotdm9pZCBzaWduYWxfc2V0X3NlcnZpY2U6OmRlc3Ryb3koCi0gICAgc2lnbmFsX3NldF9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotewotICBhc2lvOjplcnJvcl9jb2RlIGlnbm9yZWRfZWM7Ci0gIGNsZWFyKGltcGwsIGlnbm9yZWRfZWMpOwotICBjYW5jZWwoaW1wbCwgaWdub3JlZF9lYyk7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgc2lnbmFsX3NldF9zZXJ2aWNlOjphZGQoCi0gICAgc2lnbmFsX3NldF9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIGludCBzaWduYWxfbnVtYmVyLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgLy8gQ2hlY2sgdGhhdCB0aGUgc2lnbmFsIG51bWJlciBpcyB2YWxpZC4KLSAgaWYgKHNpZ25hbF9udW1iZXIgPCAwIHx8IHNpZ25hbF9udW1iZXIgPj0gbWF4X3NpZ25hbF9udW1iZXIpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIHNpZ25hbF9zdGF0ZSogc3RhdGUgPSBnZXRfc2lnbmFsX3N0YXRlKCk7Ci0gIHN0YXRpY19tdXRleDo6c2NvcGVkX2xvY2sgbG9jayhzdGF0ZS0+bXV0ZXhfKTsKLQotICAvLyBGaW5kIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSB0byBpbnNlcnQgdGhlIHJlZ2lzdHJhdGlvbi4KLSAgcmVnaXN0cmF0aW9uKiogaW5zZXJ0aW9uX3BvaW50ID0gJmltcGwuc2lnbmFsc187Ci0gIHJlZ2lzdHJhdGlvbiogbmV4dCA9IGltcGwuc2lnbmFsc187Ci0gIHdoaWxlIChuZXh0ICYmIG5leHQtPnNpZ25hbF9udW1iZXJfIDwgc2lnbmFsX251bWJlcikKLSAgewotICAgIGluc2VydGlvbl9wb2ludCA9ICZuZXh0LT5uZXh0X2luX3NldF87Ci0gICAgbmV4dCA9IG5leHQtPm5leHRfaW5fc2V0XzsKLSAgfQotCi0gIC8vIE9ubHkgZG8gc29tZXRoaW5nIGlmIHRoZSBzaWduYWwgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC4KLSAgaWYgKG5leHQgPT0gMCB8fCBuZXh0LT5zaWduYWxfbnVtYmVyXyAhPSBzaWduYWxfbnVtYmVyKQotICB7Ci0gICAgcmVnaXN0cmF0aW9uKiBuZXdfcmVnaXN0cmF0aW9uID0gbmV3IHJlZ2lzdHJhdGlvbjsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU0lHTkFMKSB8fCBkZWZpbmVkKEFTSU9fSEFTX1NJR0FDVElPTikKLSAgICAvLyBSZWdpc3RlciBmb3IgdGhlIHNpZ25hbCBpZiB3ZSdyZSB0aGUgZmlyc3QuCi0gICAgaWYgKHN0YXRlLT5yZWdpc3RyYXRpb25fY291bnRfW3NpZ25hbF9udW1iZXJdID09IDApCi0gICAgewotIyBpZiBkZWZpbmVkKEFTSU9fSEFTX1NJR0FDVElPTikKLSAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1zZXQuCi0gICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotICAgICAgbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7Ci0gICAgICBzYS5zYV9oYW5kbGVyID0gYXNpb19zaWduYWxfaGFuZGxlcjsKLSAgICAgIHNpZ2ZpbGxzZXQoJnNhLnNhX21hc2spOwotICAgICAgaWYgKDo6c2lnYWN0aW9uKHNpZ25hbF9udW1iZXIsICZzYSwgMCkgPT0gLTEpCi0jIGVsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19TSUdBQ1RJT04pCi0gICAgICBpZiAoOjpzaWduYWwoc2lnbmFsX251bWJlciwgYXNpb19zaWduYWxfaGFuZGxlcikgPT0gU0lHX0VSUikKLSMgZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TSUdBQ1RJT04pCi0gICAgICB7Ci0jIGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0jIGVsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGVycm5vLAotICAgICAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0jIGVuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICAgIGRlbGV0ZSBuZXdfcmVnaXN0cmF0aW9uOwotICAgICAgICByZXR1cm4gZWM7Ci0gICAgICB9Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU0lHTkFMKSB8fCBkZWZpbmVkKEFTSU9fSEFTX1NJR0FDVElPTikKLQotICAgIC8vIFJlY29yZCB0aGUgbmV3IHJlZ2lzdHJhdGlvbiBpbiB0aGUgc2V0LgotICAgIG5ld19yZWdpc3RyYXRpb24tPnNpZ25hbF9udW1iZXJfID0gc2lnbmFsX251bWJlcjsKLSAgICBuZXdfcmVnaXN0cmF0aW9uLT5xdWV1ZV8gPSAmaW1wbC5xdWV1ZV87Ci0gICAgbmV3X3JlZ2lzdHJhdGlvbi0+bmV4dF9pbl9zZXRfID0gbmV4dDsKLSAgICAqaW5zZXJ0aW9uX3BvaW50ID0gbmV3X3JlZ2lzdHJhdGlvbjsKLQotICAgIC8vIEluc2VydCByZWdpc3RyYXRpb24gaW50byB0aGUgcmVnaXN0cmF0aW9uIHRhYmxlLgotICAgIG5ld19yZWdpc3RyYXRpb24tPm5leHRfaW5fdGFibGVfID0gcmVnaXN0cmF0aW9uc19bc2lnbmFsX251bWJlcl07Ci0gICAgaWYgKHJlZ2lzdHJhdGlvbnNfW3NpZ25hbF9udW1iZXJdKQotICAgICAgcmVnaXN0cmF0aW9uc19bc2lnbmFsX251bWJlcl0tPnByZXZfaW5fdGFibGVfID0gbmV3X3JlZ2lzdHJhdGlvbjsKLSAgICByZWdpc3RyYXRpb25zX1tzaWduYWxfbnVtYmVyXSA9IG5ld19yZWdpc3RyYXRpb247Ci0KLSAgICArK3N0YXRlLT5yZWdpc3RyYXRpb25fY291bnRfW3NpZ25hbF9udW1iZXJdOwotICB9Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBzaWduYWxfc2V0X3NlcnZpY2U6OnJlbW92ZSgKLSAgICBzaWduYWxfc2V0X3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgaW50IHNpZ25hbF9udW1iZXIsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICAvLyBDaGVjayB0aGF0IHRoZSBzaWduYWwgbnVtYmVyIGlzIHZhbGlkLgotICBpZiAoc2lnbmFsX251bWJlciA8IDAgfHwgc2lnbmFsX251bWJlciA+PSBtYXhfc2lnbmFsX251bWJlcikKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgc2lnbmFsX3N0YXRlKiBzdGF0ZSA9IGdldF9zaWduYWxfc3RhdGUoKTsKLSAgc3RhdGljX211dGV4OjpzY29wZWRfbG9jayBsb2NrKHN0YXRlLT5tdXRleF8pOwotCi0gIC8vIEZpbmQgdGhlIHNpZ25hbCBudW1iZXIgaW4gdGhlIGxpc3Qgb2YgcmVnaXN0cmF0aW9ucy4KLSAgcmVnaXN0cmF0aW9uKiogZGVsZXRpb25fcG9pbnQgPSAmaW1wbC5zaWduYWxzXzsKLSAgcmVnaXN0cmF0aW9uKiByZWcgPSBpbXBsLnNpZ25hbHNfOwotICB3aGlsZSAocmVnICYmIHJlZy0+c2lnbmFsX251bWJlcl8gPCBzaWduYWxfbnVtYmVyKQotICB7Ci0gICAgZGVsZXRpb25fcG9pbnQgPSAmcmVnLT5uZXh0X2luX3NldF87Ci0gICAgcmVnID0gcmVnLT5uZXh0X2luX3NldF87Ci0gIH0KLQotICBpZiAocmVnICE9IDAgJiYgcmVnLT5zaWduYWxfbnVtYmVyXyA9PSBzaWduYWxfbnVtYmVyKQotICB7Ci0jaWYgZGVmaW5lZChBU0lPX0hBU19TSUdOQUwpIHx8IGRlZmluZWQoQVNJT19IQVNfU0lHQUNUSU9OKQotICAgIC8vIFNldCBzaWduYWwgaGFuZGxlciBiYWNrIHRvIHRoZSBkZWZhdWx0IGlmIHdlJ3JlIHRoZSBsYXN0LgotICAgIGlmIChzdGF0ZS0+cmVnaXN0cmF0aW9uX2NvdW50X1tzaWduYWxfbnVtYmVyXSA9PSAxKQotICAgIHsKLSMgaWYgZGVmaW5lZChBU0lPX0hBU19TSUdBQ1RJT04pCi0gICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3IgbWVtc2V0LgotICAgICAgc3RydWN0IHNpZ2FjdGlvbiBzYTsKLSAgICAgIG1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOwotICAgICAgc2Euc2FfaGFuZGxlciA9IFNJR19ERkw7Ci0gICAgICBpZiAoOjpzaWdhY3Rpb24oc2lnbmFsX251bWJlciwgJnNhLCAwKSA9PSAtMSkKLSMgZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1NJR0FDVElPTikKLSAgICAgIGlmICg6OnNpZ25hbChzaWduYWxfbnVtYmVyLCBTSUdfREZMKSA9PSBTSUdfRVJSKQotIyBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NJR0FDVElPTikKLSAgICAgIHsKLSMgaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSMgZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoZXJybm8sCi0gICAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSMgZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICAgICAgcmV0dXJuIGVjOwotICAgICAgfQotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NJR05BTCkgfHwgZGVmaW5lZChBU0lPX0hBU19TSUdBQ1RJT04pCi0KLSAgICAvLyBSZW1vdmUgdGhlIHJlZ2lzdHJhdGlvbiBmcm9tIHRoZSBzZXQuCi0gICAgKmRlbGV0aW9uX3BvaW50ID0gcmVnLT5uZXh0X2luX3NldF87Ci0KLSAgICAvLyBSZW1vdmUgdGhlIHJlZ2lzdHJhdGlvbiBmcm9tIHRoZSByZWdpc3RyYXRpb24gdGFibGUuCi0gICAgaWYgKHJlZ2lzdHJhdGlvbnNfW3NpZ25hbF9udW1iZXJdID09IHJlZykKLSAgICAgIHJlZ2lzdHJhdGlvbnNfW3NpZ25hbF9udW1iZXJdID0gcmVnLT5uZXh0X2luX3RhYmxlXzsKLSAgICBpZiAocmVnLT5wcmV2X2luX3RhYmxlXykKLSAgICAgIHJlZy0+cHJldl9pbl90YWJsZV8tPm5leHRfaW5fdGFibGVfID0gcmVnLT5uZXh0X2luX3RhYmxlXzsKLSAgICBpZiAocmVnLT5uZXh0X2luX3RhYmxlXykKLSAgICAgIHJlZy0+bmV4dF9pbl90YWJsZV8tPnByZXZfaW5fdGFibGVfID0gcmVnLT5wcmV2X2luX3RhYmxlXzsKLQotICAgIC0tc3RhdGUtPnJlZ2lzdHJhdGlvbl9jb3VudF9bc2lnbmFsX251bWJlcl07Ci0KLSAgICBkZWxldGUgcmVnOwotICB9Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBzaWduYWxfc2V0X3NlcnZpY2U6OmNsZWFyKAotICAgIHNpZ25hbF9zZXRfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgc2lnbmFsX3N0YXRlKiBzdGF0ZSA9IGdldF9zaWduYWxfc3RhdGUoKTsKLSAgc3RhdGljX211dGV4OjpzY29wZWRfbG9jayBsb2NrKHN0YXRlLT5tdXRleF8pOwotCi0gIHdoaWxlIChyZWdpc3RyYXRpb24qIHJlZyA9IGltcGwuc2lnbmFsc18pCi0gIHsKLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NJR05BTCkgfHwgZGVmaW5lZChBU0lPX0hBU19TSUdBQ1RJT04pCi0gICAgLy8gU2V0IHNpZ25hbCBoYW5kbGVyIGJhY2sgdG8gdGhlIGRlZmF1bHQgaWYgd2UncmUgdGhlIGxhc3QuCi0gICAgaWYgKHN0YXRlLT5yZWdpc3RyYXRpb25fY291bnRfW3JlZy0+c2lnbmFsX251bWJlcl9dID09IDEpCi0gICAgewotIyBpZiBkZWZpbmVkKEFTSU9fSEFTX1NJR0FDVElPTikKLSAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1zZXQuCi0gICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotICAgICAgbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7Ci0gICAgICBzYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKLSAgICAgIGlmICg6OnNpZ2FjdGlvbihyZWctPnNpZ25hbF9udW1iZXJfLCAmc2EsIDApID09IC0xKQotIyBlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU0lHQUNUSU9OKQotICAgICAgaWYgKDo6c2lnbmFsKHJlZy0+c2lnbmFsX251bWJlcl8sIFNJR19ERkwpID09IFNJR19FUlIpCi0jIGVuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU0lHQUNUSU9OKQotICAgICAgewotIyBpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAgICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotIyBlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShlcnJubywKLSAgICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotIyBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAgICAgICByZXR1cm4gZWM7Ci0gICAgICB9Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU0lHTkFMKSB8fCBkZWZpbmVkKEFTSU9fSEFTX1NJR0FDVElPTikKLQotICAgIC8vIFJlbW92ZSB0aGUgcmVnaXN0cmF0aW9uIGZyb20gdGhlIHJlZ2lzdHJhdGlvbiB0YWJsZS4KLSAgICBpZiAocmVnaXN0cmF0aW9uc19bcmVnLT5zaWduYWxfbnVtYmVyX10gPT0gcmVnKQotICAgICAgcmVnaXN0cmF0aW9uc19bcmVnLT5zaWduYWxfbnVtYmVyX10gPSByZWctPm5leHRfaW5fdGFibGVfOwotICAgIGlmIChyZWctPnByZXZfaW5fdGFibGVfKQotICAgICAgcmVnLT5wcmV2X2luX3RhYmxlXy0+bmV4dF9pbl90YWJsZV8gPSByZWctPm5leHRfaW5fdGFibGVfOwotICAgIGlmIChyZWctPm5leHRfaW5fdGFibGVfKQotICAgICAgcmVnLT5uZXh0X2luX3RhYmxlXy0+cHJldl9pbl90YWJsZV8gPSByZWctPnByZXZfaW5fdGFibGVfOwotCi0gICAgLS1zdGF0ZS0+cmVnaXN0cmF0aW9uX2NvdW50X1tyZWctPnNpZ25hbF9udW1iZXJfXTsKLQotICAgIGltcGwuc2lnbmFsc18gPSByZWctPm5leHRfaW5fc2V0XzsKLSAgICBkZWxldGUgcmVnOwotICB9Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBzaWduYWxfc2V0X3NlcnZpY2U6OmNhbmNlbCgKLSAgICBzaWduYWxfc2V0X3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIEFTSU9fSEFORExFUl9PUEVSQVRJT04oKCJzaWduYWxfc2V0IiwgJmltcGwsICJjYW5jZWwiKSk7Ci0KLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gIHsKLSAgICBzaWduYWxfc3RhdGUqIHN0YXRlID0gZ2V0X3NpZ25hbF9zdGF0ZSgpOwotICAgIHN0YXRpY19tdXRleDo6c2NvcGVkX2xvY2sgbG9jayhzdGF0ZS0+bXV0ZXhfKTsKLQotICAgIHdoaWxlIChzaWduYWxfb3AqIG9wID0gaW1wbC5xdWV1ZV8uZnJvbnQoKSkKLSAgICB7Ci0gICAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkOwotICAgICAgaW1wbC5xdWV1ZV8ucG9wKCk7Ci0gICAgICBvcHMucHVzaChvcCk7Ci0gICAgfQotICB9Ci0KLSAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHMpOwotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLXZvaWQgc2lnbmFsX3NldF9zZXJ2aWNlOjpkZWxpdmVyX3NpZ25hbChpbnQgc2lnbmFsX251bWJlcikKLXsKLSAgc2lnbmFsX3N0YXRlKiBzdGF0ZSA9IGdldF9zaWduYWxfc3RhdGUoKTsKLSAgc3RhdGljX211dGV4OjpzY29wZWRfbG9jayBsb2NrKHN0YXRlLT5tdXRleF8pOwotCi0gIHNpZ25hbF9zZXRfc2VydmljZSogc2VydmljZSA9IHN0YXRlLT5zZXJ2aWNlX2xpc3RfOwotICB3aGlsZSAoc2VydmljZSkKLSAgewotICAgIG9wX3F1ZXVlPG9wZXJhdGlvbj4gb3BzOwotCi0gICAgcmVnaXN0cmF0aW9uKiByZWcgPSBzZXJ2aWNlLT5yZWdpc3RyYXRpb25zX1tzaWduYWxfbnVtYmVyXTsKLSAgICB3aGlsZSAocmVnKQotICAgIHsKLSAgICAgIGlmIChyZWctPnF1ZXVlXy0+ZW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgKytyZWctPnVuZGVsaXZlcmVkXzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgd2hpbGUgKHNpZ25hbF9vcCogb3AgPSByZWctPnF1ZXVlXy0+ZnJvbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIG9wLT5zaWduYWxfbnVtYmVyXyA9IHNpZ25hbF9udW1iZXI7Ci0gICAgICAgICAgcmVnLT5xdWV1ZV8tPnBvcCgpOwotICAgICAgICAgIG9wcy5wdXNoKG9wKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZWcgPSByZWctPm5leHRfaW5fdGFibGVfOwotICAgIH0KLQotICAgIHNlcnZpY2UtPmlvX3NlcnZpY2VfLnBvc3RfZGVmZXJyZWRfY29tcGxldGlvbnMob3BzKTsKLQotICAgIHNlcnZpY2UgPSBzZXJ2aWNlLT5uZXh0XzsKLSAgfQotfQotCi12b2lkIHNpZ25hbF9zZXRfc2VydmljZTo6YWRkX3NlcnZpY2Uoc2lnbmFsX3NldF9zZXJ2aWNlKiBzZXJ2aWNlKQotewotICBzaWduYWxfc3RhdGUqIHN0YXRlID0gZ2V0X3NpZ25hbF9zdGF0ZSgpOwotICBzdGF0aWNfbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soc3RhdGUtPm11dGV4Xyk7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHNlcnZpY2UgdG8gYmUgY3JlYXRlZCwgb3BlbiBhIG5ldyBwaXBlLgotICBpZiAoc3RhdGUtPnNlcnZpY2VfbGlzdF8gPT0gMCkKLSAgICBvcGVuX2Rlc2NyaXB0b3JzKCk7Ci0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotCi0gIC8vIEluc2VydCBzZXJ2aWNlIGludG8gbGlua2VkIGxpc3Qgb2YgYWxsIHNlcnZpY2VzLgotICBzZXJ2aWNlLT5uZXh0XyA9IHN0YXRlLT5zZXJ2aWNlX2xpc3RfOwotICBzZXJ2aWNlLT5wcmV2XyA9IDA7Ci0gIGlmIChzdGF0ZS0+c2VydmljZV9saXN0XykKLSAgICBzdGF0ZS0+c2VydmljZV9saXN0Xy0+cHJldl8gPSBzZXJ2aWNlOwotICBzdGF0ZS0+c2VydmljZV9saXN0XyA9IHNlcnZpY2U7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpIFwKLSAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpIFwKLSAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSAgLy8gUmVnaXN0ZXIgZm9yIHBpcGUgcmVhZGluZXNzIG5vdGlmaWNhdGlvbnMuCi0gIGludCByZWFkX2Rlc2NyaXB0b3IgPSBzdGF0ZS0+cmVhZF9kZXNjcmlwdG9yXzsKLSAgbG9jay51bmxvY2soKTsKLSAgc2VydmljZS0+cmVhY3Rvcl8ucmVnaXN0ZXJfaW50ZXJuYWxfZGVzY3JpcHRvcihyZWFjdG9yOjpyZWFkX29wLAotICAgICAgcmVhZF9kZXNjcmlwdG9yLCBzZXJ2aWNlLT5yZWFjdG9yX2RhdGFfLCBuZXcgcGlwZV9yZWFkX29wKTsKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgICAgICAvLyAgICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi19Ci0KLXZvaWQgc2lnbmFsX3NldF9zZXJ2aWNlOjpyZW1vdmVfc2VydmljZShzaWduYWxfc2V0X3NlcnZpY2UqIHNlcnZpY2UpCi17Ci0gIHNpZ25hbF9zdGF0ZSogc3RhdGUgPSBnZXRfc2lnbmFsX3N0YXRlKCk7Ci0gIHN0YXRpY19tdXRleDo6c2NvcGVkX2xvY2sgbG9jayhzdGF0ZS0+bXV0ZXhfKTsKLQotICBpZiAoc2VydmljZS0+bmV4dF8gfHwgc2VydmljZS0+cHJldl8gfHwgc3RhdGUtPnNlcnZpY2VfbGlzdF8gPT0gc2VydmljZSkKLSAgewotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XUykgXAotICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkgXAotICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotICAgIC8vIERpc2FibGUgdGhlIHBpcGUgcmVhZGluZXNzIG5vdGlmaWNhdGlvbnMuCi0gICAgaW50IHJlYWRfZGVzY3JpcHRvciA9IHN0YXRlLT5yZWFkX2Rlc2NyaXB0b3JfOwotICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgc2VydmljZS0+cmVhY3Rvcl8uZGVyZWdpc3Rlcl9kZXNjcmlwdG9yKAotICAgICAgICByZWFkX2Rlc2NyaXB0b3IsIHNlcnZpY2UtPnJlYWN0b3JfZGF0YV8sIGZhbHNlKTsKLSAgICBsb2NrLmxvY2soKTsKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgICAgICAvLyAgICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSAgICAvLyBSZW1vdmUgc2VydmljZSBmcm9tIGxpbmtlZCBsaXN0IG9mIGFsbCBzZXJ2aWNlcy4KLSAgICBpZiAoc3RhdGUtPnNlcnZpY2VfbGlzdF8gPT0gc2VydmljZSkKLSAgICAgIHN0YXRlLT5zZXJ2aWNlX2xpc3RfID0gc2VydmljZS0+bmV4dF87Ci0gICAgaWYgKHNlcnZpY2UtPnByZXZfKQotICAgICAgc2VydmljZS0+cHJldl8tPm5leHRfID0gc2VydmljZS0+bmV4dF87Ci0gICAgaWYgKHNlcnZpY2UtPm5leHRfKQotICAgICAgc2VydmljZS0+bmV4dF8tPnByZXZfPSBzZXJ2aWNlLT5wcmV2XzsKLSAgICBzZXJ2aWNlLT5uZXh0XyA9IDA7Ci0gICAgc2VydmljZS0+cHJldl8gPSAwOwotCi0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3Qgc2VydmljZSB0byBiZSByZW1vdmVkLCBjbG9zZSB0aGUgcGlwZS4KLSAgICBpZiAoc3RhdGUtPnNlcnZpY2VfbGlzdF8gPT0gMCkKLSAgICAgIGNsb3NlX2Rlc2NyaXB0b3JzKCk7Ci0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotICB9Ci19Ci0KLXZvaWQgc2lnbmFsX3NldF9zZXJ2aWNlOjpvcGVuX2Rlc2NyaXB0b3JzKCkKLXsKLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpIFwKLSAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpIFwKLSAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSAgc2lnbmFsX3N0YXRlKiBzdGF0ZSA9IGdldF9zaWduYWxfc3RhdGUoKTsKLQotICBpbnQgcGlwZV9mZHNbMl07Ci0gIGlmICg6OnBpcGUocGlwZV9mZHMpID09IDApCi0gIHsKLSAgICBzdGF0ZS0+cmVhZF9kZXNjcmlwdG9yXyA9IHBpcGVfZmRzWzBdOwotICAgIDo6ZmNudGwoc3RhdGUtPnJlYWRfZGVzY3JpcHRvcl8sIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotCi0gICAgc3RhdGUtPndyaXRlX2Rlc2NyaXB0b3JfID0gcGlwZV9mZHNbMV07Ci0gICAgOjpmY250bChzdGF0ZS0+d3JpdGVfZGVzY3JpcHRvcl8sIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotCi0jaWYgZGVmaW5lZChGRF9DTE9FWEVDKQotICAgIDo6ZmNudGwoc3RhdGUtPnJlYWRfZGVzY3JpcHRvcl8sIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotICAgIDo6ZmNudGwoc3RhdGUtPndyaXRlX2Rlc2NyaXB0b3JfLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEZEX0NMT0VYRUMpCi0gIH0KLSAgZWxzZQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhlcnJubywKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNpZ25hbF9zZXRfc2VydmljZSBwaXBlIik7Ci0gIH0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgICAgICAvLyAgICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi19Ci0KLXZvaWQgc2lnbmFsX3NldF9zZXJ2aWNlOjpjbG9zZV9kZXNjcmlwdG9ycygpCi17Ci0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTKSBcCi0gICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKSBcCi0gICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIHNpZ25hbF9zdGF0ZSogc3RhdGUgPSBnZXRfc2lnbmFsX3N0YXRlKCk7Ci0KLSAgaWYgKHN0YXRlLT5yZWFkX2Rlc2NyaXB0b3JfICE9IC0xKQotICAgIDo6Y2xvc2Uoc3RhdGUtPnJlYWRfZGVzY3JpcHRvcl8pOwotICBzdGF0ZS0+cmVhZF9kZXNjcmlwdG9yXyA9IC0xOwotCi0gIGlmIChzdGF0ZS0+d3JpdGVfZGVzY3JpcHRvcl8gIT0gLTEpCi0gICAgOjpjbG9zZShzdGF0ZS0+d3JpdGVfZGVzY3JpcHRvcl8pOwotICBzdGF0ZS0+d3JpdGVfZGVzY3JpcHRvcl8gPSAtMTsKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgICAgICAvLyAgICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi19Ci0KLXZvaWQgc2lnbmFsX3NldF9zZXJ2aWNlOjpzdGFydF93YWl0X29wKAotICAgIHNpZ25hbF9zZXRfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgc2lnbmFsX29wKiBvcCkKLXsKLSAgaW9fc2VydmljZV8ud29ya19zdGFydGVkKCk7Ci0KLSAgc2lnbmFsX3N0YXRlKiBzdGF0ZSA9IGdldF9zaWduYWxfc3RhdGUoKTsKLSAgc3RhdGljX211dGV4OjpzY29wZWRfbG9jayBsb2NrKHN0YXRlLT5tdXRleF8pOwotCi0gIHJlZ2lzdHJhdGlvbiogcmVnID0gaW1wbC5zaWduYWxzXzsKLSAgd2hpbGUgKHJlZykKLSAgewotICAgIGlmIChyZWctPnVuZGVsaXZlcmVkXyA+IDApCi0gICAgewotICAgICAgLS1yZWctPnVuZGVsaXZlcmVkXzsKLSAgICAgIG9wLT5zaWduYWxfbnVtYmVyXyA9IHJlZy0+c2lnbmFsX251bWJlcl87Ci0gICAgICBpb19zZXJ2aWNlXy5wb3N0X2RlZmVycmVkX2NvbXBsZXRpb24ob3ApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlZyA9IHJlZy0+bmV4dF9pbl9zZXRfOwotICB9Ci0KLSAgaW1wbC5xdWV1ZV8ucHVzaChvcCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9TSUdOQUxfU0VUX1NFUlZJQ0VfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc29ja2V0X29wcy5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc29ja2V0X29wcy5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkM2RlNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3NvY2tldF9vcHMuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMzQzMyArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvc29ja2V0X29wcy5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1NPQ0tFVF9PUFNfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NPQ0tFVF9PUFNfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpbmNsdWRlIDxjY3R5cGU+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2Fzc2VydC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotIyBpbmNsdWRlIDxjb2RlY3Z0PgotIyBpbmNsdWRlIDxsb2NhbGU+Ci0jIGluY2x1ZGUgPHN0cmluZz4KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykgXAotICB8fCBkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykKLSMgaWYgZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLSMgIGluY2x1ZGUgPHB0aHJlYWQuaD4KLSMgZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAgICAgIC8vIHx8IGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci1uYW1lc3BhY2Ugc29ja2V0X29wcyB7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi1zdHJ1Y3QgbXNnaGRyIHsgaW50IG1zZ19uYW1lbGVuOyB9OwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNpZiBkZWZpbmVkKF9faHB1eCkKLS8vIEhQLVVYIGRvZXNuJ3QgZGVjbGFyZSB0aGVzZSBmdW5jdGlvbnMgZXh0ZXJuICJDIiwgc28gdGhleSBhcmUgZGVjbGFyZWQgYWdhaW4KLS8vIGhlcmUgdG8gYXZvaWQgbGlua2VyIGVycm9ycyBhYm91dCB1bmRlZmluZWQgc3ltYm9scy4KLWV4dGVybiAiQyIgY2hhciogaWZfaW5kZXh0b25hbWUodW5zaWduZWQgaW50LCBjaGFyKik7Ci1leHRlcm4gIkMiIHVuc2lnbmVkIGludCBpZl9uYW1ldG9pbmRleChjb25zdCBjaGFyKik7Ci0jZW5kaWYgLy8gZGVmaW5lZChfX2hwdXgpCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotaW5saW5lIHZvaWQgY2xlYXJfbGFzdF9lcnJvcigpCi17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgV1NBU2V0TGFzdEVycm9yKDApOwotI2Vsc2UKLSAgZXJybm8gPSAwOwotI2VuZGlmCi19Ci0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJldHVyblR5cGU+Ci1pbmxpbmUgUmV0dXJuVHlwZSBlcnJvcl93cmFwcGVyKFJldHVyblR5cGUgcmV0dXJuX3ZhbHVlLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZShXU0FHZXRMYXN0RXJyb3IoKSwKLSAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotI2Vsc2UKLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGVycm5vLAotICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0jZW5kaWYKLSAgcmV0dXJuIHJldHVybl92YWx1ZTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFNvY2tMZW5UeXBlPgotaW5saW5lIHNvY2tldF90eXBlIGNhbGxfYWNjZXB0KFNvY2tMZW5UeXBlIG1zZ2hkcjo6KiwKLSAgICBzb2NrZXRfdHlwZSBzLCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLCBzdGQ6OnNpemVfdCogYWRkcmxlbikKLXsKLSAgU29ja0xlblR5cGUgdG1wX2FkZHJsZW4gPSBhZGRybGVuID8gKFNvY2tMZW5UeXBlKSphZGRybGVuIDogMDsKLSAgc29ja2V0X3R5cGUgcmVzdWx0ID0gOjphY2NlcHQocywgYWRkciwgYWRkcmxlbiA/ICZ0bXBfYWRkcmxlbiA6IDApOwotICBpZiAoYWRkcmxlbikKLSAgICAqYWRkcmxlbiA9IChzdGQ6OnNpemVfdCl0bXBfYWRkcmxlbjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc29ja2V0X3R5cGUgYWNjZXB0KHNvY2tldF90eXBlIHMsIHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsCi0gICAgc3RkOjpzaXplX3QqIGFkZHJsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBpbnZhbGlkX3NvY2tldDsKLSAgfQotCi0gIGNsZWFyX2xhc3RfZXJyb3IoKTsKLQotICBzb2NrZXRfdHlwZSBuZXdfcyA9IGVycm9yX3dyYXBwZXIoY2FsbF9hY2NlcHQoCi0gICAgICAgICZtc2doZHI6Om1zZ19uYW1lbGVuLCBzLCBhZGRyLCBhZGRybGVuKSwgZWMpOwotICBpZiAobmV3X3MgPT0gaW52YWxpZF9zb2NrZXQpCi0gICAgcmV0dXJuIG5ld19zOwotCi0jaWYgZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gIGludCBvcHR2YWwgPSAxOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnNldHNvY2tvcHQobmV3X3MsCi0gICAgICAgIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgJm9wdHZhbCwgc2l6ZW9mKG9wdHZhbCkpLCBlYyk7Ci0gIGlmIChyZXN1bHQgIT0gMCkKLSAgewotICAgIDo6Y2xvc2UobmV3X3MpOwotICAgIHJldHVybiBpbnZhbGlkX3NvY2tldDsKLSAgfQotI2VuZGlmCi0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBuZXdfczsKLX0KLQotc29ja2V0X3R5cGUgc3luY19hY2NlcHQoc29ja2V0X3R5cGUgcywgc3RhdGVfdHlwZSBzdGF0ZSwKLSAgICBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLCBzdGQ6OnNpemVfdCogYWRkcmxlbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIC8vIEFjY2VwdCBhIHNvY2tldC4KLSAgZm9yICg7OykKLSAgewotICAgIC8vIFRyeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uIHdpdGhvdXQgYmxvY2tpbmcuCi0gICAgc29ja2V0X3R5cGUgbmV3X3NvY2tldCA9IHNvY2tldF9vcHM6OmFjY2VwdChzLCBhZGRyLCBhZGRybGVuLCBlYyk7Ci0KLSAgICAvLyBDaGVjayBpZiBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgIGlmIChuZXdfc29ja2V0ICE9IGludmFsaWRfc29ja2V0KQotICAgICAgcmV0dXJuIG5ld19zb2NrZXQ7Ci0KLSAgICAvLyBPcGVyYXRpb24gZmFpbGVkLgotICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICAgICAgfHwgZWMgPT0gYXNpbzo6ZXJyb3I6OnRyeV9hZ2FpbikKLSAgICB7Ci0gICAgICBpZiAoc3RhdGUgJiB1c2VyX3NldF9ub25fYmxvY2tpbmcpCi0gICAgICAgIHJldHVybiBpbnZhbGlkX3NvY2tldDsKLSAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byByZXRyeSBvcGVyYXRpb24uCi0gICAgfQotICAgIGVsc2UgaWYgKGVjID09IGFzaW86OmVycm9yOjpjb25uZWN0aW9uX2Fib3J0ZWQpCi0gICAgewotICAgICAgaWYgKHN0YXRlICYgZW5hYmxlX2Nvbm5lY3Rpb25fYWJvcnRlZCkKLSAgICAgICAgcmV0dXJuIGludmFsaWRfc29ja2V0OwotICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHJldHJ5IG9wZXJhdGlvbi4KLSAgICB9Ci0jaWYgZGVmaW5lZChFUFJPVE8pCi0gICAgZWxzZSBpZiAoZWMudmFsdWUoKSA9PSBFUFJPVE8pCi0gICAgewotICAgICAgaWYgKHN0YXRlICYgZW5hYmxlX2Nvbm5lY3Rpb25fYWJvcnRlZCkKLSAgICAgICAgcmV0dXJuIGludmFsaWRfc29ja2V0OwotICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHJldHJ5IG9wZXJhdGlvbi4KLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChFUFJPVE8pCi0gICAgZWxzZQotICAgICAgcmV0dXJuIGludmFsaWRfc29ja2V0OwotCi0gICAgLy8gV2FpdCBmb3Igc29ja2V0IHRvIGJlY29tZSByZWFkeS4KLSAgICBpZiAoc29ja2V0X29wczo6cG9sbF9yZWFkKHMsIDAsIGVjKSA8IDApCi0gICAgICByZXR1cm4gaW52YWxpZF9zb2NrZXQ7Ci0gIH0KLX0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotdm9pZCBjb21wbGV0ZV9pb2NwX2FjY2VwdChzb2NrZXRfdHlwZSBzLAotICAgIHZvaWQqIG91dHB1dF9idWZmZXIsIERXT1JEIGFkZHJlc3NfbGVuZ3RoLAotICAgIHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsIHN0ZDo6c2l6ZV90KiBhZGRybGVuLAotICAgIHNvY2tldF90eXBlIG5ld19zb2NrZXQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICAvLyBNYXAgbm9uLXBvcnRhYmxlIGVycm9ycyB0byB0aGVpciBwb3J0YWJsZSBjb3VudGVycGFydHMuCi0gIGlmIChlYy52YWx1ZSgpID09IEVSUk9SX05FVE5BTUVfREVMRVRFRCkKLSAgICBlYyA9IGFzaW86OmVycm9yOjpjb25uZWN0aW9uX2Fib3J0ZWQ7Ci0KLSAgaWYgKCFlYykKLSAgewotICAgIC8vIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgcGVlci4KLSAgICBpZiAoYWRkciAmJiBhZGRybGVuKQotICAgIHsKLSAgICAgIExQU09DS0FERFIgbG9jYWxfYWRkciA9IDA7Ci0gICAgICBpbnQgbG9jYWxfYWRkcl9sZW5ndGggPSAwOwotICAgICAgTFBTT0NLQUREUiByZW1vdGVfYWRkciA9IDA7Ci0gICAgICBpbnQgcmVtb3RlX2FkZHJfbGVuZ3RoID0gMDsKLSAgICAgIEdldEFjY2VwdEV4U29ja2FkZHJzKG91dHB1dF9idWZmZXIsIDAsIGFkZHJlc3NfbGVuZ3RoLAotICAgICAgICAgIGFkZHJlc3NfbGVuZ3RoLCAmbG9jYWxfYWRkciwgJmxvY2FsX2FkZHJfbGVuZ3RoLAotICAgICAgICAgICZyZW1vdGVfYWRkciwgJnJlbW90ZV9hZGRyX2xlbmd0aCk7Ci0gICAgICBpZiAoc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHJlbW90ZV9hZGRyX2xlbmd0aCkgPiAqYWRkcmxlbikKLSAgICAgIHsKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbWNweS4KLSAgICAgICAgbWVtY3B5KGFkZHIsIHJlbW90ZV9hZGRyLCByZW1vdGVfYWRkcl9sZW5ndGgpOwotICAgICAgICAqYWRkcmxlbiA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihyZW1vdGVfYWRkcl9sZW5ndGgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE5lZWQgdG8gc2V0IHRoZSBTT19VUERBVEVfQUNDRVBUX0NPTlRFWFQgb3B0aW9uIHNvIHRoYXQgZ2V0c29ja25hbWUKLSAgICAvLyBhbmQgZ2V0cGVlcm5hbWUgd2lsbCB3b3JrIG9uIHRoZSBhY2NlcHRlZCBzb2NrZXQuCi0gICAgU09DS0VUIHVwZGF0ZV9jdHhfcGFyYW0gPSBzOwotICAgIHNvY2tldF9vcHM6OnN0YXRlX3R5cGUgc3RhdGUgPSAwOwotICAgIHNvY2tldF9vcHM6OnNldHNvY2tvcHQobmV3X3NvY2tldCwgc3RhdGUsCi0gICAgICAgICAgU09MX1NPQ0tFVCwgU09fVVBEQVRFX0FDQ0VQVF9DT05URVhULAotICAgICAgICAgICZ1cGRhdGVfY3R4X3BhcmFtLCBzaXplb2YoU09DS0VUKSwgZWMpOwotICB9Ci19Ci0KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotYm9vbCBub25fYmxvY2tpbmdfYWNjZXB0KHNvY2tldF90eXBlIHMsCi0gICAgc3RhdGVfdHlwZSBzdGF0ZSwgc29ja2V0X2FkZHJfdHlwZSogYWRkciwgc3RkOjpzaXplX3QqIGFkZHJsZW4sCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIHNvY2tldF90eXBlJiBuZXdfc29ja2V0KQotewotICBmb3IgKDs7KQotICB7Ci0gICAgLy8gQWNjZXB0IHRoZSB3YWl0aW5nIGNvbm5lY3Rpb24uCi0gICAgbmV3X3NvY2tldCA9IHNvY2tldF9vcHM6OmFjY2VwdChzLCBhZGRyLCBhZGRybGVuLCBlYyk7Ci0KLSAgICAvLyBDaGVjayBpZiBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgIGlmIChuZXdfc29ja2V0ICE9IGludmFsaWRfc29ja2V0KQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBSZXRyeSBvcGVyYXRpb24gaWYgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLgotICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6aW50ZXJydXB0ZWQpCi0gICAgICBjb250aW51ZTsKLQotICAgIC8vIE9wZXJhdGlvbiBmYWlsZWQuCi0gICAgaWYgKGVjID09IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jawotICAgICAgICB8fCBlYyA9PSBhc2lvOjplcnJvcjo6dHJ5X2FnYWluKQotICAgIHsKLSAgICAgIGlmIChzdGF0ZSAmIHVzZXJfc2V0X25vbl9ibG9ja2luZykKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAvLyBGYWxsIHRocm91Z2ggdG8gcmV0cnkgb3BlcmF0aW9uLgotICAgIH0KLSAgICBlbHNlIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6Y29ubmVjdGlvbl9hYm9ydGVkKQotICAgIHsKLSAgICAgIGlmIChzdGF0ZSAmIGVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWQpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHJldHJ5IG9wZXJhdGlvbi4KLSAgICB9Ci0jaWYgZGVmaW5lZChFUFJPVE8pCi0gICAgZWxzZSBpZiAoZWMudmFsdWUoKSA9PSBFUFJPVE8pCi0gICAgewotICAgICAgaWYgKHN0YXRlICYgZW5hYmxlX2Nvbm5lY3Rpb25fYWJvcnRlZCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAvLyBGYWxsIHRocm91Z2ggdG8gcmV0cnkgb3BlcmF0aW9uLgotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEVQUk9UTykKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU29ja0xlblR5cGU+Ci1pbmxpbmUgaW50IGNhbGxfYmluZChTb2NrTGVuVHlwZSBtc2doZHI6OiosCi0gICAgc29ja2V0X3R5cGUgcywgY29uc3Qgc29ja2V0X2FkZHJfdHlwZSogYWRkciwgc3RkOjpzaXplX3QgYWRkcmxlbikKLXsKLSAgcmV0dXJuIDo6YmluZChzLCBhZGRyLCAoU29ja0xlblR5cGUpYWRkcmxlbik7Ci19Ci0KLWludCBiaW5kKHNvY2tldF90eXBlIHMsIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsCi0gICAgc3RkOjpzaXplX3QgYWRkcmxlbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChzID09IGludmFsaWRfc29ja2V0KQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIHNvY2tldF9lcnJvcl9yZXR2YWw7Ci0gIH0KLQotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKGNhbGxfYmluZCgKLSAgICAgICAgJm1zZ2hkcjo6bXNnX25hbWVsZW4sIHMsIGFkZHIsIGFkZHJsZW4pLCBlYyk7Ci0gIGlmIChyZXN1bHQgPT0gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IGNsb3NlKHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUmIHN0YXRlLAotICAgIGJvb2wgZGVzdHJ1Y3Rpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpbnQgcmVzdWx0ID0gMDsKLSAgaWYgKHMgIT0gaW52YWxpZF9zb2NrZXQpCi0gIHsKLSAgICAvLyBXZSBkb24ndCB3YW50IHRoZSBkZXN0cnVjdG9yIHRvIGJsb2NrLCBzbyBzZXQgdGhlIHNvY2tldCB0byBsaW5nZXIgaW4KLSAgICAvLyB0aGUgYmFja2dyb3VuZC4gSWYgdGhlIHVzZXIgZG9lc24ndCBsaWtlIHRoaXMgYmVoYXZpb3VyIHRoZW4gdGhleSBuZWVkCi0gICAgLy8gdG8gZXhwbGljaXRseSBjbG9zZSB0aGUgc29ja2V0LgotICAgIGlmIChkZXN0cnVjdGlvbiAmJiAoc3RhdGUgJiB1c2VyX3NldF9saW5nZXIpKQotICAgIHsKLSAgICAgIDo6bGluZ2VyIG9wdDsKLSAgICAgIG9wdC5sX29ub2ZmID0gMDsKLSAgICAgIG9wdC5sX2xpbmdlciA9IDA7Ci0gICAgICBhc2lvOjplcnJvcl9jb2RlIGlnbm9yZWRfZWM7Ci0gICAgICBzb2NrZXRfb3BzOjpzZXRzb2Nrb3B0KHMsIHN0YXRlLCBTT0xfU09DS0VULAotICAgICAgICAgIFNPX0xJTkdFUiwgJm9wdCwgc2l6ZW9mKG9wdCksIGlnbm9yZWRfZWMpOwotICAgIH0KLQotICAgIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAgIHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpjbG9zZXNvY2tldChzKSwgZWMpOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6Y2xvc2UocyksIGVjKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotCi0gICAgaWYgKHJlc3VsdCAhPSAwCi0gICAgICAgICYmIChlYyA9PSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICAgICAgICB8fCBlYyA9PSBhc2lvOjplcnJvcjo6dHJ5X2FnYWluKSkKLSAgICB7Ci0gICAgICAvLyBBY2NvcmRpbmcgdG8gVU5JWCBOZXR3b3JrIFByb2dyYW1taW5nIFZvbC4gMSwgaXQgaXMgcG9zc2libGUgZm9yCi0gICAgICAvLyBjbG9zZSgpIHRvIGZhaWwgd2l0aCBFV09VTERCTE9DSyB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuIFdoYXQKLSAgICAgIC8vIGlzbid0IGNsZWFyIGlzIHRoZSBzdGF0ZSBvZiB0aGUgZGVzY3JpcHRvciBhZnRlciB0aGlzIGVycm9yLiBUaGUgb25lCi0gICAgICAvLyBjdXJyZW50IE9TIHdoZXJlIHRoaXMgYmVoYXZpb3VyIGlzIHNlZW4sIFdpbmRvd3MsIHNheXMgdGhhdCB0aGUgc29ja2V0Ci0gICAgICAvLyByZW1haW5zIG9wZW4uIFRoZXJlZm9yZSB3ZSdsbCBwdXQgdGhlIGRlc2NyaXB0b3IgYmFjayBpbnRvIGJsb2NraW5nCi0gICAgICAvLyBtb2RlIGFuZCBoYXZlIGFub3RoZXIgYXR0ZW1wdCBhdCBjbG9zaW5nIGl0LgotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICBpb2N0bF9hcmdfdHlwZSBhcmcgPSAwOwotICAgICAgOjppb2N0bHNvY2tldChzLCBGSU9OQklPLCAmYXJnKTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jIGlmIGRlZmluZWQoX19TWU1CSUFOMzJfXykKLSAgICAgIGludCBmbGFncyA9IDo6ZmNudGwocywgRl9HRVRGTCwgMCk7Ci0gICAgICBpZiAoZmxhZ3MgPj0gMCkKLSAgICAgICAgOjpmY250bChzLCBGX1NFVEZMLCBmbGFncyAmIH5PX05PTkJMT0NLKTsKLSMgZWxzZSAvLyBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0gICAgICBpb2N0bF9hcmdfdHlwZSBhcmcgPSAwOwotICAgICAgOjppb2N0bChzLCBGSU9OQklPLCAmYXJnKTsKLSMgZW5kaWYgLy8gZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICBzdGF0ZSAmPSB+bm9uX2Jsb2NraW5nOwotCi0gICAgICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICAgIHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpjbG9zZXNvY2tldChzKSwgZWMpOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICAgIHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpjbG9zZShzKSwgZWMpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgfQotICB9Ci0KLSAgaWYgKHJlc3VsdCA9PSAwKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIHNldF91c2VyX25vbl9ibG9ja2luZyhzb2NrZXRfdHlwZSBzLAotICAgIHN0YXRlX3R5cGUmIHN0YXRlLCBib29sIHZhbHVlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKHMgPT0gaW52YWxpZF9zb2NrZXQpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgaW9jdGxfYXJnX3R5cGUgYXJnID0gKHZhbHVlID8gMSA6IDApOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OmlvY3Rsc29ja2V0KHMsIEZJT05CSU8sICZhcmcpLCBlYyk7Ci0jZWxpZiBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6ZmNudGwocywgRl9HRVRGTCwgMCksIGVjKTsKLSAgaWYgKHJlc3VsdCA+PSAwKQotICB7Ci0gICAgY2xlYXJfbGFzdF9lcnJvcigpOwotICAgIGludCBmbGFnID0gKHZhbHVlID8gKHJlc3VsdCB8IE9fTk9OQkxPQ0spIDogKHJlc3VsdCAmIH5PX05PTkJMT0NLKSk7Ci0gICAgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OmZjbnRsKHMsIEZfU0VURkwsIGZsYWcpLCBlYyk7Ci0gIH0KLSNlbHNlCi0gIGlvY3RsX2FyZ190eXBlIGFyZyA9ICh2YWx1ZSA/IDEgOiAwKTsKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjppb2N0bChzLCBGSU9OQklPLCAmYXJnKSwgZWMpOwotI2VuZGlmCi0KLSAgaWYgKHJlc3VsdCA+PSAwKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgaWYgKHZhbHVlKQotICAgICAgc3RhdGUgfD0gdXNlcl9zZXRfbm9uX2Jsb2NraW5nOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBDbGVhcmluZyB0aGUgdXNlci1zZXQgbm9uLWJsb2NraW5nIG1vZGUgYWx3YXlzIG92ZXJyaWRlcyBhbnkKLSAgICAgIC8vIGludGVybmFsbHktc2V0IG5vbi1ibG9ja2luZyBmbGFnLiBBbnkgc3Vic2VxdWVudCBhc3luY2hyb25vdXMKLSAgICAgIC8vIG9wZXJhdGlvbnMgd2lsbCBuZWVkIHRvIHJlLWVuYWJsZSBub24tYmxvY2tpbmcgSS9PLgotICAgICAgc3RhdGUgJj0gfih1c2VyX3NldF9ub25fYmxvY2tpbmcgfCBpbnRlcm5hbF9ub25fYmxvY2tpbmcpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBzZXRfaW50ZXJuYWxfbm9uX2Jsb2NraW5nKHNvY2tldF90eXBlIHMsCi0gICAgc3RhdGVfdHlwZSYgc3RhdGUsIGJvb2wgdmFsdWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghdmFsdWUgJiYgKHN0YXRlICYgdXNlcl9zZXRfbm9uX2Jsb2NraW5nKSkKLSAgewotICAgIC8vIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gY2xlYXIgdGhlIGludGVybmFsIG5vbi1ibG9ja2luZyBmbGFnIGlmIHRoZQotICAgIC8vIHVzZXIgc3RpbGwgd2FudHMgbm9uLWJsb2NraW5nIGJlaGF2aW91ci4gUmV0dXJuIGFuIGVycm9yIGFuZCBsZXQgdGhlCi0gICAgLy8gY2FsbGVyIGZpZ3VyZSBvdXQgd2hldGhlciB0byB1cGRhdGUgdGhlIHVzZXItc2V0IG5vbi1ibG9ja2luZyBmbGFnLgotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGlvY3RsX2FyZ190eXBlIGFyZyA9ICh2YWx1ZSA/IDEgOiAwKTsKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjppb2N0bHNvY2tldChzLCBGSU9OQklPLCAmYXJnKSwgZWMpOwotI2VsaWYgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OmZjbnRsKHMsIEZfR0VURkwsIDApLCBlYyk7Ci0gIGlmIChyZXN1bHQgPj0gMCkKLSAgewotICAgIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSAgICBpbnQgZmxhZyA9ICh2YWx1ZSA/IChyZXN1bHQgfCBPX05PTkJMT0NLKSA6IChyZXN1bHQgJiB+T19OT05CTE9DSykpOwotICAgIHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpmY250bChzLCBGX1NFVEZMLCBmbGFnKSwgZWMpOwotICB9Ci0jZWxzZQotICBpb2N0bF9hcmdfdHlwZSBhcmcgPSAodmFsdWUgPyAxIDogMCk7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6aW9jdGwocywgRklPTkJJTywgJmFyZyksIGVjKTsKLSNlbmRpZgotCi0gIGlmIChyZXN1bHQgPj0gMCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIGlmICh2YWx1ZSkKLSAgICAgIHN0YXRlIHw9IGludGVybmFsX25vbl9ibG9ja2luZzsKLSAgICBlbHNlCi0gICAgICBzdGF0ZSAmPSB+aW50ZXJuYWxfbm9uX2Jsb2NraW5nOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQgc2h1dGRvd24oc29ja2V0X3R5cGUgcywgaW50IHdoYXQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBzb2NrZXRfZXJyb3JfcmV0dmFsOwotICB9Ci0KLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnNodXRkb3duKHMsIHdoYXQpLCBlYyk7Ci0gIGlmIChyZXN1bHQgPT0gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFNvY2tMZW5UeXBlPgotaW5saW5lIGludCBjYWxsX2Nvbm5lY3QoU29ja0xlblR5cGUgbXNnaGRyOjoqLAotICAgIHNvY2tldF90eXBlIHMsIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsIHN0ZDo6c2l6ZV90IGFkZHJsZW4pCi17Ci0gIHJldHVybiA6OmNvbm5lY3QocywgYWRkciwgKFNvY2tMZW5UeXBlKWFkZHJsZW4pOwotfQotCi1pbnQgY29ubmVjdChzb2NrZXRfdHlwZSBzLCBjb25zdCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLAotICAgIHN0ZDo6c2l6ZV90IGFkZHJsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBzb2NrZXRfZXJyb3JfcmV0dmFsOwotICB9Ci0KLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcihjYWxsX2Nvbm5lY3QoCi0gICAgICAgICZtc2doZHI6Om1zZ19uYW1lbGVuLCBzLCBhZGRyLCBhZGRybGVuKSwgZWMpOwotICBpZiAocmVzdWx0ID09IDApCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0jaWYgZGVmaW5lZChfX2xpbnV4X18pCi0gIGVsc2UgaWYgKGVjID09IGFzaW86OmVycm9yOjp0cnlfYWdhaW4pCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6bm9fYnVmZmVyX3NwYWNlOwotI2VuZGlmIC8vIGRlZmluZWQoX19saW51eF9fKQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIHN5bmNfY29ubmVjdChzb2NrZXRfdHlwZSBzLCBjb25zdCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLAotICAgIHN0ZDo6c2l6ZV90IGFkZHJsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICAvLyBQZXJmb3JtIHRoZSBjb25uZWN0IG9wZXJhdGlvbi4KLSAgc29ja2V0X29wczo6Y29ubmVjdChzLCBhZGRyLCBhZGRybGVuLCBlYyk7Ci0gIGlmIChlYyAhPSBhc2lvOjplcnJvcjo6aW5fcHJvZ3Jlc3MKLSAgICAgICYmIGVjICE9IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jaykKLSAgewotICAgIC8vIFRoZSBjb25uZWN0IG9wZXJhdGlvbiBmaW5pc2hlZCBpbW1lZGlhdGVseS4KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBXYWl0IGZvciBzb2NrZXQgdG8gYmVjb21lIHJlYWR5LgotICBpZiAoc29ja2V0X29wczo6cG9sbF9jb25uZWN0KHMsIGVjKSA8IDApCi0gICAgcmV0dXJuOwotCi0gIC8vIEdldCB0aGUgZXJyb3IgY29kZSBmcm9tIHRoZSBjb25uZWN0IG9wZXJhdGlvbi4KLSAgaW50IGNvbm5lY3RfZXJyb3IgPSAwOwotICBzaXplX3QgY29ubmVjdF9lcnJvcl9sZW4gPSBzaXplb2YoY29ubmVjdF9lcnJvcik7Ci0gIGlmIChzb2NrZXRfb3BzOjpnZXRzb2Nrb3B0KHMsIDAsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLAotICAgICAgICAmY29ubmVjdF9lcnJvciwgJmNvbm5lY3RfZXJyb3JfbGVuLCBlYykgPT0gc29ja2V0X2Vycm9yX3JldHZhbCkKLSAgICByZXR1cm47Ci0KLSAgLy8gUmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGNvbm5lY3Qgb3BlcmF0aW9uLgotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoY29ubmVjdF9lcnJvciwKLSAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi12b2lkIGNvbXBsZXRlX2lvY3BfY29ubmVjdChzb2NrZXRfdHlwZSBzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgLy8gTWFwIG5vbi1wb3J0YWJsZSBlcnJvcnMgdG8gdGhlaXIgcG9ydGFibGUgY291bnRlcnBhcnRzLgotICBzd2l0Y2ggKGVjLnZhbHVlKCkpCi0gIHsKLSAgY2FzZSBFUlJPUl9DT05ORUNUSU9OX1JFRlVTRUQ6Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6Y29ubmVjdGlvbl9yZWZ1c2VkOwotICAgIGJyZWFrOwotICBjYXNlIEVSUk9SX05FVFdPUktfVU5SRUFDSEFCTEU6Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6bmV0d29ya191bnJlYWNoYWJsZTsKLSAgICBicmVhazsKLSAgY2FzZSBFUlJPUl9IT1NUX1VOUkVBQ0hBQkxFOgotICAgIGVjID0gYXNpbzo6ZXJyb3I6Omhvc3RfdW5yZWFjaGFibGU7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRVJST1JfU0VNX1RJTUVPVVQ6Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6dGltZWRfb3V0OwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKCFlYykKLSAgewotICAgIC8vIE5lZWQgdG8gc2V0IHRoZSBTT19VUERBVEVfQ09OTkVDVF9DT05URVhUIG9wdGlvbiBzbyB0aGF0IGdldHNvY2tuYW1lCi0gICAgLy8gYW5kIGdldHBlZXJuYW1lIHdpbGwgd29yayBvbiB0aGUgY29ubmVjdGVkIHNvY2tldC4KLSAgICBzb2NrZXRfb3BzOjpzdGF0ZV90eXBlIHN0YXRlID0gMDsKLSAgICBjb25zdCBpbnQgc29fdXBkYXRlX2Nvbm5lY3RfY29udGV4dCA9IDB4NzAxMDsKLSAgICBzb2NrZXRfb3BzOjpzZXRzb2Nrb3B0KHMsIHN0YXRlLCBTT0xfU09DS0VULAotICAgICAgICBzb191cGRhdGVfY29ubmVjdF9jb250ZXh0LCAwLCAwLCBlYyk7Ci0gIH0KLX0KLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotYm9vbCBub25fYmxvY2tpbmdfY29ubmVjdChzb2NrZXRfdHlwZSBzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Qgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZC4gVGhpcyBpcyByZXF1aXJlZCBzaW5jZSB3ZSBtYXkKLSAgLy8gZ2V0IHNwdXJpb3VzIHJlYWRpbmVzcyBub3RpZmljYXRpb25zIGZyb20gdGhlIHJlYWN0b3IuCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIFwKLSAgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSBcCi0gIHx8IGRlZmluZWQoX19TWU1CSUFOMzJfXykKLSAgZmRfc2V0IHdyaXRlX2ZkczsKLSAgRkRfWkVSTygmd3JpdGVfZmRzKTsKLSAgRkRfU0VUKHMsICZ3cml0ZV9mZHMpOwotICBmZF9zZXQgZXhjZXB0X2ZkczsKLSAgRkRfWkVSTygmZXhjZXB0X2Zkcyk7Ci0gIEZEX1NFVChzLCAmZXhjZXB0X2Zkcyk7Ci0gIHRpbWV2YWwgemVyb190aW1lb3V0OwotICB6ZXJvX3RpbWVvdXQudHZfc2VjID0gMDsKLSAgemVyb190aW1lb3V0LnR2X3VzZWMgPSAwOwotICBpbnQgcmVhZHkgPSA6OnNlbGVjdChzICsgMSwgMCwgJndyaXRlX2ZkcywgJmV4Y2VwdF9mZHMsICZ6ZXJvX3RpbWVvdXQpOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAvLyB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICAvLyB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0gIHBvbGxmZCBmZHM7Ci0gIGZkcy5mZCA9IHM7Ci0gIGZkcy5ldmVudHMgPSBQT0xMT1VUOwotICBmZHMucmV2ZW50cyA9IDA7Ci0gIGludCByZWFkeSA9IDo6cG9sbCgmZmRzLCAxLCAwKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAvLyB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICAgLy8gfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotICBpZiAocmVhZHkgPT0gMCkKLSAgewotICAgIC8vIFRoZSBhc3luY2hyb25vdXMgY29ubmVjdCBvcGVyYXRpb24gaXMgc3RpbGwgaW4gcHJvZ3Jlc3MuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBlcnJvciBjb2RlIGZyb20gdGhlIGNvbm5lY3Qgb3BlcmF0aW9uLgotICBpbnQgY29ubmVjdF9lcnJvciA9IDA7Ci0gIHNpemVfdCBjb25uZWN0X2Vycm9yX2xlbiA9IHNpemVvZihjb25uZWN0X2Vycm9yKTsKLSAgaWYgKHNvY2tldF9vcHM6OmdldHNvY2tvcHQocywgMCwgU09MX1NPQ0tFVCwgU09fRVJST1IsCi0gICAgICAgICZjb25uZWN0X2Vycm9yLCAmY29ubmVjdF9lcnJvcl9sZW4sIGVjKSA9PSAwKQotICB7Ci0gICAgaWYgKGNvbm5lY3RfZXJyb3IpCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGNvbm5lY3RfZXJyb3IsCi0gICAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBzb2NrZXRwYWlyKGludCBhZiwgaW50IHR5cGUsIGludCBwcm90b2NvbCwKLSAgICBzb2NrZXRfdHlwZSBzdlsyXSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgKHZvaWQpKGFmKTsKLSAgKHZvaWQpKHR5cGUpOwotICAodm9pZCkocHJvdG9jb2wpOwotICAodm9pZCkoc3YpOwotICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgcmV0dXJuIHNvY2tldF9lcnJvcl9yZXR2YWw7Ci0jZWxzZQotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6c29ja2V0cGFpcihhZiwgdHlwZSwgcHJvdG9jb2wsIHN2KSwgZWMpOwotICBpZiAocmVzdWx0ID09IDApCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiByZXN1bHQ7Ci0jZW5kaWYKLX0KLQotYm9vbCBzb2NrYXRtYXJrKHNvY2tldF90eXBlIHMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0jaWYgZGVmaW5lZChTSU9DQVRNQVJLKQotICBpb2N0bF9hcmdfdHlwZSB2YWx1ZSA9IDA7Ci0jIGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6aW9jdGxzb2NrZXQocywgU0lPQ0FUTUFSSywgJnZhbHVlKSwgZWMpOwotIyBlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6aW9jdGwocywgU0lPQ0FUTUFSSywgJnZhbHVlKSwgZWMpOwotIyBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICBpZiAocmVzdWx0ID09IDApCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0jIGlmIGRlZmluZWQoRU5PVFRZKQotICBpZiAoZWMudmFsdWUoKSA9PSBFTk9UVFkpCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6bm90X3NvY2tldDsKLSMgZW5kaWYgLy8gZGVmaW5lZChFTk9UVFkpCi0jZWxzZSAvLyBkZWZpbmVkKFNJT0NBVE1BUkspCi0gIGludCB2YWx1ZSA9IGVycm9yX3dyYXBwZXIoOjpzb2NrYXRtYXJrKHMpLCBlYyk7Ci0gIGlmICh2YWx1ZSAhPSAtMSkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSNlbmRpZiAvLyBkZWZpbmVkKFNJT0NBVE1BUkspCi0KLSAgcmV0dXJuIGVjID8gZmFsc2UgOiB2YWx1ZSAhPSAwOwotfQotCi1zaXplX3QgYXZhaWxhYmxlKHNvY2tldF90eXBlIHMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaW9jdGxfYXJnX3R5cGUgdmFsdWUgPSAwOwotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6aW9jdGxzb2NrZXQocywgRklPTlJFQUQsICZ2YWx1ZSksIGVjKTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6aW9jdGwocywgRklPTlJFQUQsICZ2YWx1ZSksIGVjKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICBpZiAocmVzdWx0ID09IDApCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0jaWYgZGVmaW5lZChFTk9UVFkpCi0gIGlmIChlYy52YWx1ZSgpID09IEVOT1RUWSkKLSAgICBlYyA9IGFzaW86OmVycm9yOjpub3Rfc29ja2V0OwotI2VuZGlmIC8vIGRlZmluZWQoRU5PVFRZKQotCi0gIHJldHVybiBlYyA/IHN0YXRpY19jYXN0PHNpemVfdD4oMCkgOiBzdGF0aWNfY2FzdDxzaXplX3Q+KHZhbHVlKTsKLX0KLQotaW50IGxpc3Rlbihzb2NrZXRfdHlwZSBzLCBpbnQgYmFja2xvZywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChzID09IGludmFsaWRfc29ja2V0KQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIHNvY2tldF9lcnJvcl9yZXR2YWw7Ci0gIH0KLQotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6bGlzdGVuKHMsIGJhY2tsb2cpLCBlYyk7Ci0gIGlmIChyZXN1bHQgPT0gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW5saW5lIHZvaWQgaW5pdF9idWZfaW92X2Jhc2Uodm9pZComIGJhc2UsIHZvaWQqIGFkZHIpCi17Ci0gIGJhc2UgPSBhZGRyOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSB2b2lkIGluaXRfYnVmX2lvdl9iYXNlKFQmIGJhc2UsIHZvaWQqIGFkZHIpCi17Ci0gIGJhc2UgPSBzdGF0aWNfY2FzdDxUPihhZGRyKTsKLX0KLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi10eXBlZGVmIFdTQUJVRiBidWY7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotdHlwZWRlZiBpb3ZlYyBidWY7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLQotdm9pZCBpbml0X2J1ZihidWYmIGIsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKQotewotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGIuYnVmID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGRhdGEpOwotICBiLmxlbiA9IHN0YXRpY19jYXN0PHVfbG9uZz4oc2l6ZSk7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICBpbml0X2J1Zl9pb3ZfYmFzZShiLmlvdl9iYXNlLCBkYXRhKTsKLSAgYi5pb3ZfbGVuID0gc2l6ZTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotfQotCi12b2lkIGluaXRfYnVmKGJ1ZiYgYiwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpCi17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgYi5idWYgPSBzdGF0aWNfY2FzdDxjaGFyKj4oY29uc3RfY2FzdDx2b2lkKj4oZGF0YSkpOwotICBiLmxlbiA9IHN0YXRpY19jYXN0PHVfbG9uZz4oc2l6ZSk7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICBpbml0X2J1Zl9pb3ZfYmFzZShiLmlvdl9iYXNlLCBjb25zdF9jYXN0PHZvaWQqPihkYXRhKSk7Ci0gIGIuaW92X2xlbiA9IHNpemU7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLX0KLQotaW5saW5lIHZvaWQgaW5pdF9tc2doZHJfbXNnX25hbWUodm9pZComIG5hbWUsIHNvY2tldF9hZGRyX3R5cGUqIGFkZHIpCi17Ci0gIG5hbWUgPSBhZGRyOwotfQotCi1pbmxpbmUgdm9pZCBpbml0X21zZ2hkcl9tc2dfbmFtZSh2b2lkKiYgbmFtZSwgY29uc3Qgc29ja2V0X2FkZHJfdHlwZSogYWRkcikKLXsKLSAgbmFtZSA9IGNvbnN0X2Nhc3Q8c29ja2V0X2FkZHJfdHlwZSo+KGFkZHIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSB2b2lkIGluaXRfbXNnaGRyX21zZ19uYW1lKFQmIG5hbWUsIHNvY2tldF9hZGRyX3R5cGUqIGFkZHIpCi17Ci0gIG5hbWUgPSByZWludGVycHJldF9jYXN0PFQ+KGFkZHIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSB2b2lkIGluaXRfbXNnaGRyX21zZ19uYW1lKFQmIG5hbWUsIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIpCi17Ci0gIG5hbWUgPSByZWludGVycHJldF9jYXN0PFQ+KGNvbnN0X2Nhc3Q8c29ja2V0X2FkZHJfdHlwZSo+KGFkZHIpKTsKLX0KLQotc2lnbmVkX3NpemVfdHlwZSByZWN2KHNvY2tldF90eXBlIHMsIGJ1ZiogYnVmcywgc2l6ZV90IGNvdW50LAotICAgIGludCBmbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAvLyBSZWNlaXZlIHNvbWUgZGF0YS4KLSAgRFdPUkQgcmVjdl9idWZfY291bnQgPSBzdGF0aWNfY2FzdDxEV09SRD4oY291bnQpOwotICBEV09SRCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gIERXT1JEIHJlY3ZfZmxhZ3MgPSBmbGFnczsKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpXU0FSZWN2KHMsIGJ1ZnMsCi0gICAgICAgIHJlY3ZfYnVmX2NvdW50LCAmYnl0ZXNfdHJhbnNmZXJyZWQsICZyZWN2X2ZsYWdzLCAwLCAwKSwgZWMpOwotICBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9ORVROQU1FX0RFTEVURUQpCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6Y29ubmVjdGlvbl9yZXNldDsKLSAgZWxzZSBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9QT1JUX1VOUkVBQ0hBQkxFKQotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmNvbm5lY3Rpb25fcmVmdXNlZDsKLSAgaWYgKHJlc3VsdCAhPSAwKQotICAgIHJldHVybiBzb2NrZXRfZXJyb3JfcmV0dmFsOwotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgbXNnaGRyIG1zZyA9IG1zZ2hkcigpOwotICBtc2cubXNnX2lvdiA9IGJ1ZnM7Ci0gIG1zZy5tc2dfaW92bGVuID0gc3RhdGljX2Nhc3Q8aW50Pihjb3VudCk7Ci0gIHNpZ25lZF9zaXplX3R5cGUgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnJlY3Ztc2cocywgJm1zZywgZmxhZ3MpLCBlYyk7Ci0gIGlmIChyZXN1bHQgPj0gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotfQotCi1zaXplX3Qgc3luY19yZWN2KHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUgc3RhdGUsIGJ1ZiogYnVmcywKLSAgICBzaXplX3QgY291bnQsIGludCBmbGFncywgYm9vbCBhbGxfZW1wdHksIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gQSByZXF1ZXN0IHRvIHJlYWQgMCBieXRlcyBvbiBhIHN0cmVhbSBpcyBhIG5vLW9wLgotICBpZiAoYWxsX2VtcHR5ICYmIChzdGF0ZSAmIHN0cmVhbV9vcmllbnRlZCkpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFJlYWQgc29tZSBkYXRhLgotICBmb3IgKDs7KQotICB7Ci0gICAgLy8gVHJ5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24gd2l0aG91dCBibG9ja2luZy4KLSAgICBzaWduZWRfc2l6ZV90eXBlIGJ5dGVzID0gc29ja2V0X29wczo6cmVjdihzLCBidWZzLCBjb3VudCwgZmxhZ3MsIGVjKTsKLQotICAgIC8vIENoZWNrIGlmIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgaWYgKGJ5dGVzID4gMCkKLSAgICAgIHJldHVybiBieXRlczsKLQotICAgIC8vIENoZWNrIGZvciBFT0YuCi0gICAgaWYgKChzdGF0ZSAmIHN0cmVhbV9vcmllbnRlZCkgJiYgYnl0ZXMgPT0gMCkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjplb2Y7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBPcGVyYXRpb24gZmFpbGVkLgotICAgIGlmICgoc3RhdGUgJiB1c2VyX3NldF9ub25fYmxvY2tpbmcpCi0gICAgICAgIHx8IChlYyAhPSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICAgICAgICAmJiBlYyAhPSBhc2lvOjplcnJvcjo6dHJ5X2FnYWluKSkKLSAgICAgIHJldHVybiAwOwotCi0gICAgLy8gV2FpdCBmb3Igc29ja2V0IHRvIGJlY29tZSByZWFkeS4KLSAgICBpZiAoc29ja2V0X29wczo6cG9sbF9yZWFkKHMsIDAsIGVjKSA8IDApCi0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi12b2lkIGNvbXBsZXRlX2lvY3BfcmVjdihzdGF0ZV90eXBlIHN0YXRlLAotICAgIGNvbnN0IHdlYWtfY2FuY2VsX3Rva2VuX3R5cGUmIGNhbmNlbF90b2tlbiwgYm9vbCBhbGxfZW1wdHksCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIHNpemVfdCBieXRlc190cmFuc2ZlcnJlZCkKLXsKLSAgLy8gTWFwIG5vbi1wb3J0YWJsZSBlcnJvcnMgdG8gdGhlaXIgcG9ydGFibGUgY291bnRlcnBhcnRzLgotICBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9ORVROQU1FX0RFTEVURUQpCi0gIHsKLSAgICBpZiAoY2FuY2VsX3Rva2VuLmV4cGlyZWQoKSkKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkOwotICAgIGVsc2UKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmNvbm5lY3Rpb25fcmVzZXQ7Ci0gIH0KLSAgZWxzZSBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9QT1JUX1VOUkVBQ0hBQkxFKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6Y29ubmVjdGlvbl9yZWZ1c2VkOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIGNvbm5lY3Rpb24gY2xvc2VkLgotICBlbHNlIGlmICghZWMgJiYgYnl0ZXNfdHJhbnNmZXJyZWQgPT0gMAotICAgICAgJiYgKHN0YXRlICYgc3RyZWFtX29yaWVudGVkKSAhPSAwCi0gICAgICAmJiAhYWxsX2VtcHR5KQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6ZW9mOwotICB9Ci19Ci0KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotYm9vbCBub25fYmxvY2tpbmdfcmVjdihzb2NrZXRfdHlwZSBzLAotICAgIGJ1ZiogYnVmcywgc2l6ZV90IGNvdW50LCBpbnQgZmxhZ3MsIGJvb2wgaXNfc3RyZWFtLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLCBzaXplX3QmIGJ5dGVzX3RyYW5zZmVycmVkKQotewotICBmb3IgKDs7KQotICB7Ci0gICAgLy8gUmVhZCBzb21lIGRhdGEuCi0gICAgc2lnbmVkX3NpemVfdHlwZSBieXRlcyA9IHNvY2tldF9vcHM6OnJlY3YocywgYnVmcywgY291bnQsIGZsYWdzLCBlYyk7Ci0KLSAgICAvLyBDaGVjayBmb3IgZW5kIG9mIHN0cmVhbS4KLSAgICBpZiAoaXNfc3RyZWFtICYmIGJ5dGVzID09IDApCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6ZW9mOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gUmV0cnkgb3BlcmF0aW9uIGlmIGludGVycnVwdGVkIGJ5IHNpZ25hbC4KLSAgICBpZiAoZWMgPT0gYXNpbzo6ZXJyb3I6OmludGVycnVwdGVkKQotICAgICAgY29udGludWU7Ci0KLSAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJ1biB0aGUgb3BlcmF0aW9uIGFnYWluLgotICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICAgICAgfHwgZWMgPT0gYXNpbzo6ZXJyb3I6OnRyeV9hZ2FpbikKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KLSAgICBpZiAoYnl0ZXMgPj0gMCkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gYnl0ZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLXNpZ25lZF9zaXplX3R5cGUgcmVjdmZyb20oc29ja2V0X3R5cGUgcywgYnVmKiBidWZzLCBzaXplX3QgY291bnQsCi0gICAgaW50IGZsYWdzLCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLCBzdGQ6OnNpemVfdCogYWRkcmxlbiwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIC8vIFJlY2VpdmUgc29tZSBkYXRhLgotICBEV09SRCByZWN2X2J1Zl9jb3VudCA9IHN0YXRpY19jYXN0PERXT1JEPihjb3VudCk7Ci0gIERXT1JEIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLSAgRFdPUkQgcmVjdl9mbGFncyA9IGZsYWdzOwotICBpbnQgdG1wX2FkZHJsZW4gPSAoaW50KSphZGRybGVuOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OldTQVJlY3ZGcm9tKHMsIGJ1ZnMsIHJlY3ZfYnVmX2NvdW50LAotICAgICAgICAmYnl0ZXNfdHJhbnNmZXJyZWQsICZyZWN2X2ZsYWdzLCBhZGRyLCAmdG1wX2FkZHJsZW4sIDAsIDApLCBlYyk7Ci0gICphZGRybGVuID0gKHN0ZDo6c2l6ZV90KXRtcF9hZGRybGVuOwotICBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9ORVROQU1FX0RFTEVURUQpCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6Y29ubmVjdGlvbl9yZXNldDsKLSAgZWxzZSBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9QT1JUX1VOUkVBQ0hBQkxFKQotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmNvbm5lY3Rpb25fcmVmdXNlZDsKLSAgaWYgKHJlc3VsdCAhPSAwKQotICAgIHJldHVybiBzb2NrZXRfZXJyb3JfcmV0dmFsOwotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgbXNnaGRyIG1zZyA9IG1zZ2hkcigpOwotICBpbml0X21zZ2hkcl9tc2dfbmFtZShtc2cubXNnX25hbWUsIGFkZHIpOwotICBtc2cubXNnX25hbWVsZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KCphZGRybGVuKTsKLSAgbXNnLm1zZ19pb3YgPSBidWZzOwotICBtc2cubXNnX2lvdmxlbiA9IHN0YXRpY19jYXN0PGludD4oY291bnQpOwotICBzaWduZWRfc2l6ZV90eXBlIHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpyZWN2bXNnKHMsICZtc2csIGZsYWdzKSwgZWMpOwotICAqYWRkcmxlbiA9IG1zZy5tc2dfbmFtZWxlbjsKLSAgaWYgKHJlc3VsdCA+PSAwKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gcmVzdWx0OwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi19Ci0KLXNpemVfdCBzeW5jX3JlY3Zmcm9tKHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUgc3RhdGUsIGJ1ZiogYnVmcywKLSAgICBzaXplX3QgY291bnQsIGludCBmbGFncywgc29ja2V0X2FkZHJfdHlwZSogYWRkciwKLSAgICBzdGQ6OnNpemVfdCogYWRkcmxlbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChzID09IGludmFsaWRfc29ja2V0KQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBSZWFkIHNvbWUgZGF0YS4KLSAgZm9yICg7OykKLSAgewotICAgIC8vIFRyeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uIHdpdGhvdXQgYmxvY2tpbmcuCi0gICAgc2lnbmVkX3NpemVfdHlwZSBieXRlcyA9IHNvY2tldF9vcHM6OnJlY3Zmcm9tKAotICAgICAgICBzLCBidWZzLCBjb3VudCwgZmxhZ3MsIGFkZHIsIGFkZHJsZW4sIGVjKTsKLQotICAgIC8vIENoZWNrIGlmIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgaWYgKGJ5dGVzID49IDApCi0gICAgICByZXR1cm4gYnl0ZXM7Ci0KLSAgICAvLyBPcGVyYXRpb24gZmFpbGVkLgotICAgIGlmICgoc3RhdGUgJiB1c2VyX3NldF9ub25fYmxvY2tpbmcpCi0gICAgICAgIHx8IChlYyAhPSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICAgICAgICAmJiBlYyAhPSBhc2lvOjplcnJvcjo6dHJ5X2FnYWluKSkKLSAgICAgIHJldHVybiAwOwotCi0gICAgLy8gV2FpdCBmb3Igc29ja2V0IHRvIGJlY29tZSByZWFkeS4KLSAgICBpZiAoc29ja2V0X29wczo6cG9sbF9yZWFkKHMsIDAsIGVjKSA8IDApCi0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi12b2lkIGNvbXBsZXRlX2lvY3BfcmVjdmZyb20oCi0gICAgY29uc3Qgd2Vha19jYW5jZWxfdG9rZW5fdHlwZSYgY2FuY2VsX3Rva2VuLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICAvLyBNYXAgbm9uLXBvcnRhYmxlIGVycm9ycyB0byB0aGVpciBwb3J0YWJsZSBjb3VudGVycGFydHMuCi0gIGlmIChlYy52YWx1ZSgpID09IEVSUk9SX05FVE5BTUVfREVMRVRFRCkKLSAgewotICAgIGlmIChjYW5jZWxfdG9rZW4uZXhwaXJlZCgpKQotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQ7Ci0gICAgZWxzZQotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6Y29ubmVjdGlvbl9yZXNldDsKLSAgfQotICBlbHNlIGlmIChlYy52YWx1ZSgpID09IEVSUk9SX1BPUlRfVU5SRUFDSEFCTEUpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpjb25uZWN0aW9uX3JlZnVzZWQ7Ci0gIH0KLX0KLQotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1ib29sIG5vbl9ibG9ja2luZ19yZWN2ZnJvbShzb2NrZXRfdHlwZSBzLAotICAgIGJ1ZiogYnVmcywgc2l6ZV90IGNvdW50LCBpbnQgZmxhZ3MsCi0gICAgc29ja2V0X2FkZHJfdHlwZSogYWRkciwgc3RkOjpzaXplX3QqIGFkZHJsZW4sCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIHNpemVfdCYgYnl0ZXNfdHJhbnNmZXJyZWQpCi17Ci0gIGZvciAoOzspCi0gIHsKLSAgICAvLyBSZWFkIHNvbWUgZGF0YS4KLSAgICBzaWduZWRfc2l6ZV90eXBlIGJ5dGVzID0gc29ja2V0X29wczo6cmVjdmZyb20oCi0gICAgICAgIHMsIGJ1ZnMsIGNvdW50LCBmbGFncywgYWRkciwgYWRkcmxlbiwgZWMpOwotCi0gICAgLy8gUmV0cnkgb3BlcmF0aW9uIGlmIGludGVycnVwdGVkIGJ5IHNpZ25hbC4KLSAgICBpZiAoZWMgPT0gYXNpbzo6ZXJyb3I6OmludGVycnVwdGVkKQotICAgICAgY29udGludWU7Ci0KLSAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJ1biB0aGUgb3BlcmF0aW9uIGFnYWluLgotICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICAgICAgfHwgZWMgPT0gYXNpbzo6ZXJyb3I6OnRyeV9hZ2FpbikKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KLSAgICBpZiAoYnl0ZXMgPj0gMCkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gYnl0ZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLXNpZ25lZF9zaXplX3R5cGUgcmVjdm1zZyhzb2NrZXRfdHlwZSBzLCBidWYqIGJ1ZnMsIHNpemVfdCBjb3VudCwKLSAgICBpbnQgaW5fZmxhZ3MsIGludCYgb3V0X2ZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIG91dF9mbGFncyA9IDA7Ci0gIHJldHVybiBzb2NrZXRfb3BzOjpyZWN2KHMsIGJ1ZnMsIGNvdW50LCBpbl9mbGFncywgZWMpOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgbXNnaGRyIG1zZyA9IG1zZ2hkcigpOwotICBtc2cubXNnX2lvdiA9IGJ1ZnM7Ci0gIG1zZy5tc2dfaW92bGVuID0gc3RhdGljX2Nhc3Q8aW50Pihjb3VudCk7Ci0gIHNpZ25lZF9zaXplX3R5cGUgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnJlY3Ztc2cocywgJm1zZywgaW5fZmxhZ3MpLCBlYyk7Ci0gIGlmIChyZXN1bHQgPj0gMCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIG91dF9mbGFncyA9IG1zZy5tc2dfZmxhZ3M7Ci0gIH0KLSAgZWxzZQotICAgIG91dF9mbGFncyA9IDA7Ci0gIHJldHVybiByZXN1bHQ7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLX0KLQotc2l6ZV90IHN5bmNfcmVjdm1zZyhzb2NrZXRfdHlwZSBzLCBzdGF0ZV90eXBlIHN0YXRlLAotICAgIGJ1ZiogYnVmcywgc2l6ZV90IGNvdW50LCBpbnQgaW5fZmxhZ3MsIGludCYgb3V0X2ZsYWdzLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gUmVhZCBzb21lIGRhdGEuCi0gIGZvciAoOzspCi0gIHsKLSAgICAvLyBUcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbiB3aXRob3V0IGJsb2NraW5nLgotICAgIHNpZ25lZF9zaXplX3R5cGUgYnl0ZXMgPSBzb2NrZXRfb3BzOjpyZWN2bXNnKAotICAgICAgICBzLCBidWZzLCBjb3VudCwgaW5fZmxhZ3MsIG91dF9mbGFncywgZWMpOwotCi0gICAgLy8gQ2hlY2sgaWYgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICBpZiAoYnl0ZXMgPj0gMCkKLSAgICAgIHJldHVybiBieXRlczsKLQotICAgIC8vIE9wZXJhdGlvbiBmYWlsZWQuCi0gICAgaWYgKChzdGF0ZSAmIHVzZXJfc2V0X25vbl9ibG9ja2luZykKLSAgICAgICAgfHwgKGVjICE9IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jawotICAgICAgICAgICYmIGVjICE9IGFzaW86OmVycm9yOjp0cnlfYWdhaW4pKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBXYWl0IGZvciBzb2NrZXQgdG8gYmVjb21lIHJlYWR5LgotICAgIGlmIChzb2NrZXRfb3BzOjpwb2xsX3JlYWQocywgMCwgZWMpIDwgMCkKLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLXZvaWQgY29tcGxldGVfaW9jcF9yZWN2bXNnKAotICAgIGNvbnN0IHdlYWtfY2FuY2VsX3Rva2VuX3R5cGUmIGNhbmNlbF90b2tlbiwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgLy8gTWFwIG5vbi1wb3J0YWJsZSBlcnJvcnMgdG8gdGhlaXIgcG9ydGFibGUgY291bnRlcnBhcnRzLgotICBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9ORVROQU1FX0RFTEVURUQpCi0gIHsKLSAgICBpZiAoY2FuY2VsX3Rva2VuLmV4cGlyZWQoKSkKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkOwotICAgIGVsc2UKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmNvbm5lY3Rpb25fcmVzZXQ7Ci0gIH0KLSAgZWxzZSBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9QT1JUX1VOUkVBQ0hBQkxFKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6Y29ubmVjdGlvbl9yZWZ1c2VkOwotICB9Ci19Ci0KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotYm9vbCBub25fYmxvY2tpbmdfcmVjdm1zZyhzb2NrZXRfdHlwZSBzLAotICAgIGJ1ZiogYnVmcywgc2l6ZV90IGNvdW50LCBpbnQgaW5fZmxhZ3MsIGludCYgb3V0X2ZsYWdzLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLCBzaXplX3QmIGJ5dGVzX3RyYW5zZmVycmVkKQotewotICBmb3IgKDs7KQotICB7Ci0gICAgLy8gUmVhZCBzb21lIGRhdGEuCi0gICAgc2lnbmVkX3NpemVfdHlwZSBieXRlcyA9IHNvY2tldF9vcHM6OnJlY3Ztc2coCi0gICAgICAgIHMsIGJ1ZnMsIGNvdW50LCBpbl9mbGFncywgb3V0X2ZsYWdzLCBlYyk7Ci0KLSAgICAvLyBSZXRyeSBvcGVyYXRpb24gaWYgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLgotICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6aW50ZXJydXB0ZWQpCi0gICAgICBjb250aW51ZTsKLQotICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcnVuIHRoZSBvcGVyYXRpb24gYWdhaW4uCi0gICAgaWYgKGVjID09IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jawotICAgICAgICB8fCBlYyA9PSBhc2lvOjplcnJvcjo6dHJ5X2FnYWluKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gT3BlcmF0aW9uIGlzIGNvbXBsZXRlLgotICAgIGlmIChieXRlcyA+PSAwKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgYnl0ZXNfdHJhbnNmZXJyZWQgPSBieXRlczsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotc2lnbmVkX3NpemVfdHlwZSBzZW5kKHNvY2tldF90eXBlIHMsIGNvbnN0IGJ1ZiogYnVmcywgc2l6ZV90IGNvdW50LAotICAgIGludCBmbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAvLyBTZW5kIHRoZSBkYXRhLgotICBEV09SRCBzZW5kX2J1Zl9jb3VudCA9IHN0YXRpY19jYXN0PERXT1JEPihjb3VudCk7Ci0gIERXT1JEIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLSAgRFdPUkQgc2VuZF9mbGFncyA9IGZsYWdzOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OldTQVNlbmQocywgY29uc3RfY2FzdDxidWYqPihidWZzKSwKLSAgICAgICAgc2VuZF9idWZfY291bnQsICZieXRlc190cmFuc2ZlcnJlZCwgc2VuZF9mbGFncywgMCwgMCksIGVjKTsKLSAgaWYgKGVjLnZhbHVlKCkgPT0gRVJST1JfTkVUTkFNRV9ERUxFVEVEKQotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmNvbm5lY3Rpb25fcmVzZXQ7Ci0gIGVsc2UgaWYgKGVjLnZhbHVlKCkgPT0gRVJST1JfUE9SVF9VTlJFQUNIQUJMRSkKLSAgICBlYyA9IGFzaW86OmVycm9yOjpjb25uZWN0aW9uX3JlZnVzZWQ7Ci0gIGlmIChyZXN1bHQgIT0gMCkKLSAgICByZXR1cm4gc29ja2V0X2Vycm9yX3JldHZhbDsKLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIG1zZ2hkciBtc2cgPSBtc2doZHIoKTsKLSAgbXNnLm1zZ19pb3YgPSBjb25zdF9jYXN0PGJ1Zio+KGJ1ZnMpOwotICBtc2cubXNnX2lvdmxlbiA9IHN0YXRpY19jYXN0PGludD4oY291bnQpOwotI2lmIGRlZmluZWQoX19saW51eF9fKQotICBmbGFncyB8PSBNU0dfTk9TSUdOQUw7Ci0jZW5kaWYgLy8gZGVmaW5lZChfX2xpbnV4X18pCi0gIHNpZ25lZF9zaXplX3R5cGUgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnNlbmRtc2cocywgJm1zZywgZmxhZ3MpLCBlYyk7Ci0gIGlmIChyZXN1bHQgPj0gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotfQotCi1zaXplX3Qgc3luY19zZW5kKHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUgc3RhdGUsIGNvbnN0IGJ1ZiogYnVmcywKLSAgICBzaXplX3QgY291bnQsIGludCBmbGFncywgYm9vbCBhbGxfZW1wdHksIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gQSByZXF1ZXN0IHRvIHdyaXRlIDAgYnl0ZXMgdG8gYSBzdHJlYW0gaXMgYSBuby1vcC4KLSAgaWYgKGFsbF9lbXB0eSAmJiAoc3RhdGUgJiBzdHJlYW1fb3JpZW50ZWQpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBSZWFkIHNvbWUgZGF0YS4KLSAgZm9yICg7OykKLSAgewotICAgIC8vIFRyeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uIHdpdGhvdXQgYmxvY2tpbmcuCi0gICAgc2lnbmVkX3NpemVfdHlwZSBieXRlcyA9IHNvY2tldF9vcHM6OnNlbmQocywgYnVmcywgY291bnQsIGZsYWdzLCBlYyk7Ci0KLSAgICAvLyBDaGVjayBpZiBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgIGlmIChieXRlcyA+PSAwKQotICAgICAgcmV0dXJuIGJ5dGVzOwotCi0gICAgLy8gT3BlcmF0aW9uIGZhaWxlZC4KLSAgICBpZiAoKHN0YXRlICYgdXNlcl9zZXRfbm9uX2Jsb2NraW5nKQotICAgICAgICB8fCAoZWMgIT0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrCi0gICAgICAgICAgJiYgZWMgIT0gYXNpbzo6ZXJyb3I6OnRyeV9hZ2FpbikpCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8vIFdhaXQgZm9yIHNvY2tldCB0byBiZWNvbWUgcmVhZHkuCi0gICAgaWYgKHNvY2tldF9vcHM6OnBvbGxfd3JpdGUocywgMCwgZWMpIDwgMCkKLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLXZvaWQgY29tcGxldGVfaW9jcF9zZW5kKAotICAgIGNvbnN0IHdlYWtfY2FuY2VsX3Rva2VuX3R5cGUmIGNhbmNlbF90b2tlbiwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgLy8gTWFwIG5vbi1wb3J0YWJsZSBlcnJvcnMgdG8gdGhlaXIgcG9ydGFibGUgY291bnRlcnBhcnRzLgotICBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9ORVROQU1FX0RFTEVURUQpCi0gIHsKLSAgICBpZiAoY2FuY2VsX3Rva2VuLmV4cGlyZWQoKSkKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkOwotICAgIGVsc2UKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmNvbm5lY3Rpb25fcmVzZXQ7Ci0gIH0KLSAgZWxzZSBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9QT1JUX1VOUkVBQ0hBQkxFKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6Y29ubmVjdGlvbl9yZWZ1c2VkOwotICB9Ci19Ci0KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotYm9vbCBub25fYmxvY2tpbmdfc2VuZChzb2NrZXRfdHlwZSBzLAotICAgIGNvbnN0IGJ1ZiogYnVmcywgc2l6ZV90IGNvdW50LCBpbnQgZmxhZ3MsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIHNpemVfdCYgYnl0ZXNfdHJhbnNmZXJyZWQpCi17Ci0gIGZvciAoOzspCi0gIHsKLSAgICAvLyBXcml0ZSBzb21lIGRhdGEuCi0gICAgc2lnbmVkX3NpemVfdHlwZSBieXRlcyA9IHNvY2tldF9vcHM6OnNlbmQocywgYnVmcywgY291bnQsIGZsYWdzLCBlYyk7Ci0KLSAgICAvLyBSZXRyeSBvcGVyYXRpb24gaWYgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLgotICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6aW50ZXJydXB0ZWQpCi0gICAgICBjb250aW51ZTsKLQotICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcnVuIHRoZSBvcGVyYXRpb24gYWdhaW4uCi0gICAgaWYgKGVjID09IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jawotICAgICAgICB8fCBlYyA9PSBhc2lvOjplcnJvcjo6dHJ5X2FnYWluKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gT3BlcmF0aW9uIGlzIGNvbXBsZXRlLgotICAgIGlmIChieXRlcyA+PSAwKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgYnl0ZXNfdHJhbnNmZXJyZWQgPSBieXRlczsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotc2lnbmVkX3NpemVfdHlwZSBzZW5kdG8oc29ja2V0X3R5cGUgcywgY29uc3QgYnVmKiBidWZzLCBzaXplX3QgY291bnQsCi0gICAgaW50IGZsYWdzLCBjb25zdCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLCBzdGQ6OnNpemVfdCBhZGRybGVuLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgLy8gU2VuZCB0aGUgZGF0YS4KLSAgRFdPUkQgc2VuZF9idWZfY291bnQgPSBzdGF0aWNfY2FzdDxEV09SRD4oY291bnQpOwotICBEV09SRCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6V1NBU2VuZFRvKHMsIGNvbnN0X2Nhc3Q8YnVmKj4oYnVmcyksCi0gICAgICAgIHNlbmRfYnVmX2NvdW50LCAmYnl0ZXNfdHJhbnNmZXJyZWQsIGZsYWdzLCBhZGRyLAotICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFkZHJsZW4pLCAwLCAwKSwgZWMpOwotICBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9ORVROQU1FX0RFTEVURUQpCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6Y29ubmVjdGlvbl9yZXNldDsKLSAgZWxzZSBpZiAoZWMudmFsdWUoKSA9PSBFUlJPUl9QT1JUX1VOUkVBQ0hBQkxFKQotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmNvbm5lY3Rpb25fcmVmdXNlZDsKLSAgaWYgKHJlc3VsdCAhPSAwKQotICAgIHJldHVybiBzb2NrZXRfZXJyb3JfcmV0dmFsOwotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgbXNnaGRyIG1zZyA9IG1zZ2hkcigpOwotICBpbml0X21zZ2hkcl9tc2dfbmFtZShtc2cubXNnX25hbWUsIGFkZHIpOwotICBtc2cubXNnX25hbWVsZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KGFkZHJsZW4pOwotICBtc2cubXNnX2lvdiA9IGNvbnN0X2Nhc3Q8YnVmKj4oYnVmcyk7Ci0gIG1zZy5tc2dfaW92bGVuID0gc3RhdGljX2Nhc3Q8aW50Pihjb3VudCk7Ci0jaWYgZGVmaW5lZChfX2xpbnV4X18pCi0gIGZsYWdzIHw9IE1TR19OT1NJR05BTDsKLSNlbmRpZiAvLyBkZWZpbmVkKF9fbGludXhfXykKLSAgc2lnbmVkX3NpemVfdHlwZSByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6c2VuZG1zZyhzLCAmbXNnLCBmbGFncyksIGVjKTsKLSAgaWYgKHJlc3VsdCA+PSAwKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gcmVzdWx0OwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi19Ci0KLXNpemVfdCBzeW5jX3NlbmR0byhzb2NrZXRfdHlwZSBzLCBzdGF0ZV90eXBlIHN0YXRlLCBjb25zdCBidWYqIGJ1ZnMsCi0gICAgc2l6ZV90IGNvdW50LCBpbnQgZmxhZ3MsIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsCi0gICAgc3RkOjpzaXplX3QgYWRkcmxlbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChzID09IGludmFsaWRfc29ja2V0KQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBXcml0ZSBzb21lIGRhdGEuCi0gIGZvciAoOzspCi0gIHsKLSAgICAvLyBUcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbiB3aXRob3V0IGJsb2NraW5nLgotICAgIHNpZ25lZF9zaXplX3R5cGUgYnl0ZXMgPSBzb2NrZXRfb3BzOjpzZW5kdG8oCi0gICAgICAgIHMsIGJ1ZnMsIGNvdW50LCBmbGFncywgYWRkciwgYWRkcmxlbiwgZWMpOwotCi0gICAgLy8gQ2hlY2sgaWYgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICBpZiAoYnl0ZXMgPj0gMCkKLSAgICAgIHJldHVybiBieXRlczsKLQotICAgIC8vIE9wZXJhdGlvbiBmYWlsZWQuCi0gICAgaWYgKChzdGF0ZSAmIHVzZXJfc2V0X25vbl9ibG9ja2luZykKLSAgICAgICAgfHwgKGVjICE9IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jawotICAgICAgICAgICYmIGVjICE9IGFzaW86OmVycm9yOjp0cnlfYWdhaW4pKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBXYWl0IGZvciBzb2NrZXQgdG8gYmVjb21lIHJlYWR5LgotICAgIGlmIChzb2NrZXRfb3BzOjpwb2xsX3dyaXRlKHMsIDAsIGVjKSA8IDApCi0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotYm9vbCBub25fYmxvY2tpbmdfc2VuZHRvKHNvY2tldF90eXBlIHMsCi0gICAgY29uc3QgYnVmKiBidWZzLCBzaXplX3QgY291bnQsIGludCBmbGFncywKLSAgICBjb25zdCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLCBzdGQ6OnNpemVfdCBhZGRybGVuLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLCBzaXplX3QmIGJ5dGVzX3RyYW5zZmVycmVkKQotewotICBmb3IgKDs7KQotICB7Ci0gICAgLy8gV3JpdGUgc29tZSBkYXRhLgotICAgIHNpZ25lZF9zaXplX3R5cGUgYnl0ZXMgPSBzb2NrZXRfb3BzOjpzZW5kdG8oCi0gICAgICAgIHMsIGJ1ZnMsIGNvdW50LCBmbGFncywgYWRkciwgYWRkcmxlbiwgZWMpOwotCi0gICAgLy8gUmV0cnkgb3BlcmF0aW9uIGlmIGludGVycnVwdGVkIGJ5IHNpZ25hbC4KLSAgICBpZiAoZWMgPT0gYXNpbzo6ZXJyb3I6OmludGVycnVwdGVkKQotICAgICAgY29udGludWU7Ci0KLSAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJ1biB0aGUgb3BlcmF0aW9uIGFnYWluLgotICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICAgICAgfHwgZWMgPT0gYXNpbzo6ZXJyb3I6OnRyeV9hZ2FpbikKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIE9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KLSAgICBpZiAoYnl0ZXMgPj0gMCkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gYnl0ZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1zb2NrZXRfdHlwZSBzb2NrZXQoaW50IGFmLCBpbnQgdHlwZSwgaW50IHByb3RvY29sLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgc29ja2V0X3R5cGUgcyA9IGVycm9yX3dyYXBwZXIoOjpXU0FTb2NrZXRXKGFmLCB0eXBlLCBwcm90b2NvbCwgMCwgMCwKLSAgICAgICAgV1NBX0ZMQUdfT1ZFUkxBUFBFRCksIGVjKTsKLSAgaWYgKHMgPT0gaW52YWxpZF9zb2NrZXQpCi0gICAgcmV0dXJuIHM7Ci0KLSAgaWYgKGFmID09IEFTSU9fT1NfREVGKEFGX0lORVQ2KSkKLSAgewotICAgIC8vIFRyeSB0byBlbmFibGUgdGhlIFBPU0lYIGRlZmF1bHQgYmVoYXZpb3VyIG9mIGhhdmluZyBJUFY2X1Y2T05MWSBzZXQgdG8KLSAgICAvLyBmYWxzZS4gVGhpcyB3aWxsIG9ubHkgc3VjY2VlZCBvbiBXaW5kb3dzIFZpc3RhIGFuZCBsYXRlciB2ZXJzaW9ucyBvZgotICAgIC8vIFdpbmRvd3MsIHdoZXJlIGEgZHVhbC1zdGFjayBJUHY0L3Y2IGltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZS4KLSAgICBEV09SRCBvcHR2YWwgPSAwOwotICAgIDo6c2V0c29ja29wdChzLCBJUFBST1RPX0lQVjYsIElQVjZfVjZPTkxZLAotICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmb3B0dmFsKSwgc2l6ZW9mKG9wdHZhbCkpOwotICB9Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0KLSAgcmV0dXJuIHM7Ci0jZWxpZiBkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgc29ja2V0X3R5cGUgcyA9IGVycm9yX3dyYXBwZXIoOjpzb2NrZXQoYWYsIHR5cGUsIHByb3RvY29sKSwgZWMpOwotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgICByZXR1cm4gczsKLQotICBpbnQgb3B0dmFsID0gMTsKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpzZXRzb2Nrb3B0KHMsCi0gICAgICAgIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgJm9wdHZhbCwgc2l6ZW9mKG9wdHZhbCkpLCBlYyk7Ci0gIGlmIChyZXN1bHQgIT0gMCkKLSAgewotICAgIDo6Y2xvc2Uocyk7Ci0gICAgcmV0dXJuIGludmFsaWRfc29ja2V0OwotICB9Ci0KLSAgcmV0dXJuIHM7Ci0jZWxzZQotICBpbnQgcyA9IGVycm9yX3dyYXBwZXIoOjpzb2NrZXQoYWYsIHR5cGUsIHByb3RvY29sKSwgZWMpOwotICBpZiAocyA+PSAwKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gczsKLSNlbmRpZgotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU29ja0xlblR5cGU+Ci1pbmxpbmUgaW50IGNhbGxfc2V0c29ja29wdChTb2NrTGVuVHlwZSBtc2doZHI6OiosCi0gICAgc29ja2V0X3R5cGUgcywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLSAgICBjb25zdCB2b2lkKiBvcHR2YWwsIHN0ZDo6c2l6ZV90IG9wdGxlbikKLXsKLSAgcmV0dXJuIDo6c2V0c29ja29wdChzLCBsZXZlbCwgb3B0bmFtZSwKLSAgICAgIChjb25zdCBjaGFyKilvcHR2YWwsIChTb2NrTGVuVHlwZSlvcHRsZW4pOwotfQotCi1pbnQgc2V0c29ja29wdChzb2NrZXRfdHlwZSBzLCBzdGF0ZV90eXBlJiBzdGF0ZSwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLSAgICBjb25zdCB2b2lkKiBvcHR2YWwsIHN0ZDo6c2l6ZV90IG9wdGxlbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChzID09IGludmFsaWRfc29ja2V0KQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIHNvY2tldF9lcnJvcl9yZXR2YWw7Ci0gIH0KLQotICBpZiAobGV2ZWwgPT0gY3VzdG9tX3NvY2tldF9vcHRpb25fbGV2ZWwgJiYgb3B0bmFtZSA9PSBhbHdheXNfZmFpbF9vcHRpb24pCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgIHJldHVybiBzb2NrZXRfZXJyb3JfcmV0dmFsOwotICB9Ci0KLSAgaWYgKGxldmVsID09IGN1c3RvbV9zb2NrZXRfb3B0aW9uX2xldmVsCi0gICAgICAmJiBvcHRuYW1lID09IGVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWRfb3B0aW9uKQotICB7Ci0gICAgaWYgKG9wdGxlbiAhPSBzaXplb2YoaW50KSkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgcmV0dXJuIHNvY2tldF9lcnJvcl9yZXR2YWw7Ci0gICAgfQotCi0gICAgaWYgKCpzdGF0aWNfY2FzdDxjb25zdCBpbnQqPihvcHR2YWwpKQotICAgICAgc3RhdGUgfD0gZW5hYmxlX2Nvbm5lY3Rpb25fYWJvcnRlZDsKLSAgICBlbHNlCi0gICAgICBzdGF0ZSAmPSB+ZW5hYmxlX2Nvbm5lY3Rpb25fYWJvcnRlZDsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmIChsZXZlbCA9PSBTT0xfU09DS0VUICYmIG9wdG5hbWUgPT0gU09fTElOR0VSKQotICAgIHN0YXRlIHw9IHVzZXJfc2V0X2xpbmdlcjsKLQotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQotICAvLyBNeXN0ZXJpb3VzbHksIHVzaW5nIHRoZSBnZXRzb2Nrb3B0IGFuZCBzZXRzb2Nrb3B0IGZ1bmN0aW9ucyBkaXJlY3RseSB3aXRoCi0gIC8vIEJvcmxhbmQgQysrIHJlc3VsdHMgaW4gaW5jb3JyZWN0IHZhbHVlcyBiZWluZyBzZXQgYW5kIHJlYWQuIFRoZSBidWcgY2FuIGJlCi0gIC8vIHdvcmtlZCBhcm91bmQgYnkgdXNpbmcgZnVuY3Rpb24gYWRkcmVzc2VzIHJlc29sdmVkIHdpdGggR2V0UHJvY0FkZHJlc3MuCi0gIGlmIChITU9EVUxFIHdpbnNvY2tfbW9kdWxlID0gOjpHZXRNb2R1bGVIYW5kbGVBKCJ3czJfMzIiKSkKLSAgewotICAgIHR5cGVkZWYgaW50IChXU0FBUEkgKnNzb190KShTT0NLRVQsIGludCwgaW50LCBjb25zdCBjaGFyKiwgaW50KTsKLSAgICBpZiAoc3NvX3Qgc3NvID0gKHNzb190KTo6R2V0UHJvY0FkZHJlc3Mod2luc29ja19tb2R1bGUsICJzZXRzb2Nrb3B0IikpCi0gICAgewotICAgICAgY2xlYXJfbGFzdF9lcnJvcigpOwotICAgICAgcmV0dXJuIGVycm9yX3dyYXBwZXIoc3NvKHMsIGxldmVsLCBvcHRuYW1lLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ob3B0dmFsKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ob3B0bGVuKSksIGVjKTsKLSAgICB9Ci0gIH0KLSAgZWMgPSBhc2lvOjplcnJvcjo6ZmF1bHQ7Ci0gIHJldHVybiBzb2NrZXRfZXJyb3JfcmV0dmFsOwotI2Vsc2UgLy8gZGVmaW5lZChfX0JPUkxBTkRDX18pCi0gIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoY2FsbF9zZXRzb2Nrb3B0KCZtc2doZHI6Om1zZ19uYW1lbGVuLAotICAgICAgICBzLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pLCBlYyk7Ci0gIGlmIChyZXN1bHQgPT0gMCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotCi0jaWYgZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pIFwKLSAgfHwgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKQotICAgIC8vIFRvIGltcGxlbWVudCBwb3J0YWJsZSBiZWhhdmlvdXIgZm9yIFNPX1JFVVNFQUREUiB3aXRoIFVEUCBzb2NrZXRzIHdlCi0gICAgLy8gbmVlZCB0byBhbHNvIHNldCBTT19SRVVTRVBPUlQgb24gQlNELWJhc2VkIHBsYXRmb3Jtcy4KLSAgICBpZiAoKHN0YXRlICYgZGF0YWdyYW1fb3JpZW50ZWQpCi0gICAgICAgICYmIGxldmVsID09IFNPTF9TT0NLRVQgJiYgb3B0bmFtZSA9PSBTT19SRVVTRUFERFIpCi0gICAgewotICAgICAgY2FsbF9zZXRzb2Nrb3B0KCZtc2doZHI6Om1zZ19uYW1lbGVuLCBzLAotICAgICAgICAgIFNPTF9TT0NLRVQsIFNPX1JFVVNFUE9SVCwgb3B0dmFsLCBvcHRsZW4pOwotICAgIH0KLSNlbmRpZgotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLSNlbmRpZiAvLyBkZWZpbmVkKF9fQk9STEFORENfXykKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFNvY2tMZW5UeXBlPgotaW5saW5lIGludCBjYWxsX2dldHNvY2tvcHQoU29ja0xlblR5cGUgbXNnaGRyOjoqLAotICAgIHNvY2tldF90eXBlIHMsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0gICAgdm9pZCogb3B0dmFsLCBzdGQ6OnNpemVfdCogb3B0bGVuKQotewotICBTb2NrTGVuVHlwZSB0bXBfb3B0bGVuID0gKFNvY2tMZW5UeXBlKSpvcHRsZW47Ci0gIGludCByZXN1bHQgPSA6OmdldHNvY2tvcHQocywgbGV2ZWwsIG9wdG5hbWUsIChjaGFyKilvcHR2YWwsICZ0bXBfb3B0bGVuKTsKLSAgKm9wdGxlbiA9IChzdGQ6OnNpemVfdCl0bXBfb3B0bGVuOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgZ2V0c29ja29wdChzb2NrZXRfdHlwZSBzLCBzdGF0ZV90eXBlIHN0YXRlLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotICAgIHZvaWQqIG9wdHZhbCwgc2l6ZV90KiBvcHRsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBzb2NrZXRfZXJyb3JfcmV0dmFsOwotICB9Ci0KLSAgaWYgKGxldmVsID09IGN1c3RvbV9zb2NrZXRfb3B0aW9uX2xldmVsICYmIG9wdG5hbWUgPT0gYWx3YXlzX2ZhaWxfb3B0aW9uKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICByZXR1cm4gc29ja2V0X2Vycm9yX3JldHZhbDsKLSAgfQotCi0gIGlmIChsZXZlbCA9PSBjdXN0b21fc29ja2V0X29wdGlvbl9sZXZlbAotICAgICAgJiYgb3B0bmFtZSA9PSBlbmFibGVfY29ubmVjdGlvbl9hYm9ydGVkX29wdGlvbikKLSAgewotICAgIGlmICgqb3B0bGVuICE9IHNpemVvZihpbnQpKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgICByZXR1cm4gc29ja2V0X2Vycm9yX3JldHZhbDsKLSAgICB9Ci0KLSAgICAqc3RhdGljX2Nhc3Q8aW50Kj4ob3B0dmFsKSA9IChzdGF0ZSAmIGVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWQpID8gMSA6IDA7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQotICAvLyBNeXN0ZXJpb3VzbHksIHVzaW5nIHRoZSBnZXRzb2Nrb3B0IGFuZCBzZXRzb2Nrb3B0IGZ1bmN0aW9ucyBkaXJlY3RseSB3aXRoCi0gIC8vIEJvcmxhbmQgQysrIHJlc3VsdHMgaW4gaW5jb3JyZWN0IHZhbHVlcyBiZWluZyBzZXQgYW5kIHJlYWQuIFRoZSBidWcgY2FuIGJlCi0gIC8vIHdvcmtlZCBhcm91bmQgYnkgdXNpbmcgZnVuY3Rpb24gYWRkcmVzc2VzIHJlc29sdmVkIHdpdGggR2V0UHJvY0FkZHJlc3MuCi0gIGlmIChITU9EVUxFIHdpbnNvY2tfbW9kdWxlID0gOjpHZXRNb2R1bGVIYW5kbGVBKCJ3czJfMzIiKSkKLSAgewotICAgIHR5cGVkZWYgaW50IChXU0FBUEkgKmdzb190KShTT0NLRVQsIGludCwgaW50LCBjaGFyKiwgaW50Kik7Ci0gICAgaWYgKGdzb190IGdzbyA9IChnc29fdCk6OkdldFByb2NBZGRyZXNzKHdpbnNvY2tfbW9kdWxlLCAiZ2V0c29ja29wdCIpKQotICAgIHsKLSAgICAgIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSAgICAgIGludCB0bXBfb3B0bGVuID0gc3RhdGljX2Nhc3Q8aW50Pigqb3B0bGVuKTsKLSAgICAgIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKGdzbyhzLCBsZXZlbCwgb3B0bmFtZSwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG9wdHZhbCksICZ0bXBfb3B0bGVuKSwgZWMpOwotICAgICAgKm9wdGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4odG1wX29wdGxlbik7Ci0gICAgICBpZiAocmVzdWx0ICE9IDAgJiYgbGV2ZWwgPT0gSVBQUk9UT19JUFY2ICYmIG9wdG5hbWUgPT0gSVBWNl9WNk9OTFkKLSAgICAgICAgICAmJiBlYy52YWx1ZSgpID09IFdTQUVOT1BST1RPT1BUICYmICpvcHRsZW4gPT0gc2l6ZW9mKERXT1JEKSkKLSAgICAgIHsKLSAgICAgICAgLy8gRHVhbC1zdGFjayBJUHY0L3Y2IHNvY2tldHMsIGFuZCB0aGUgSVBWNl9WNk9OTFkgc29ja2V0IG9wdGlvbiwgYXJlCi0gICAgICAgIC8vIG9ubHkgc3VwcG9ydGVkIG9uIFdpbmRvd3MgVmlzdGEgYW5kIGxhdGVyLiBUbyBzaW1wbGlmeSBwcm9ncmFtIGxvZ2ljCi0gICAgICAgIC8vIHdlIHdpbGwgZmFrZSBzdWNjZXNzIG9mIGdldHRpbmcgdGhpcyBvcHRpb24gYW5kIHNwZWNpZnkgdGhhdCB0aGUKLSAgICAgICAgLy8gdmFsdWUgaXMgbm9uLXplcm8gKGkuZS4gdHJ1ZSkuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGJlaGF2aW9yIG9mCi0gICAgICAgIC8vIElQdjYgc29ja2V0cyBvbiBXaW5kb3dzIHBsYXRmb3JtcyBwcmUtVmlzdGEuCi0gICAgICAgICpzdGF0aWNfY2FzdDxEV09SRCo+KG9wdHZhbCkgPSAxOwotICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0gIGVjID0gYXNpbzo6ZXJyb3I6OmZhdWx0OwotICByZXR1cm4gc29ja2V0X2Vycm9yX3JldHZhbDsKLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoY2FsbF9nZXRzb2Nrb3B0KCZtc2doZHI6Om1zZ19uYW1lbGVuLAotICAgICAgICBzLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pLCBlYyk7Ci0gIGlmIChyZXN1bHQgIT0gMCAmJiBsZXZlbCA9PSBJUFBST1RPX0lQVjYgJiYgb3B0bmFtZSA9PSBJUFY2X1Y2T05MWQotICAgICAgJiYgZWMudmFsdWUoKSA9PSBXU0FFTk9QUk9UT09QVCAmJiAqb3B0bGVuID09IHNpemVvZihEV09SRCkpCi0gIHsKLSAgICAvLyBEdWFsLXN0YWNrIElQdjQvdjYgc29ja2V0cywgYW5kIHRoZSBJUFY2X1Y2T05MWSBzb2NrZXQgb3B0aW9uLCBhcmUgb25seQotICAgIC8vIHN1cHBvcnRlZCBvbiBXaW5kb3dzIFZpc3RhIGFuZCBsYXRlci4gVG8gc2ltcGxpZnkgcHJvZ3JhbSBsb2dpYyB3ZSB3aWxsCi0gICAgLy8gZmFrZSBzdWNjZXNzIG9mIGdldHRpbmcgdGhpcyBvcHRpb24gYW5kIHNwZWNpZnkgdGhhdCB0aGUgdmFsdWUgaXMKLSAgICAvLyBub24temVybyAoaS5lLiB0cnVlKS4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgSVB2NiBzb2NrZXRzCi0gICAgLy8gb24gV2luZG93cyBwbGF0Zm9ybXMgcHJlLVZpc3RhLgotICAgICpzdGF0aWNfY2FzdDxEV09SRCo+KG9wdHZhbCkgPSAxOwotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICB9Ci0gIGlmIChyZXN1bHQgPT0gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoY2FsbF9nZXRzb2Nrb3B0KCZtc2doZHI6Om1zZ19uYW1lbGVuLAotICAgICAgICBzLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pLCBlYyk7Ci0jaWYgZGVmaW5lZChfX2xpbnV4X18pCi0gIGlmIChyZXN1bHQgPT0gMCAmJiBsZXZlbCA9PSBTT0xfU09DS0VUICYmICpvcHRsZW4gPT0gc2l6ZW9mKGludCkKLSAgICAgICYmIChvcHRuYW1lID09IFNPX1NOREJVRiB8fCBvcHRuYW1lID09IFNPX1JDVkJVRikpCi0gIHsKLSAgICAvLyBPbiBMaW51eCwgc2V0dGluZyBTT19TTkRCVUYgb3IgU09fUkNWQlVGIHRvIE4gYWN0dWFsbHkgY2F1c2VzIHRoZSBrZXJuZWwKLSAgICAvLyB0byBzZXQgdGhlIGJ1ZmZlciBzaXplIHRvIE4qMi4gTGludXggcHV0cyBhZGRpdGlvbmFsIHN0dWZmIGludG8gdGhlCi0gICAgLy8gYnVmZmVycyBzbyB0aGF0IG9ubHkgYWJvdXQgaGFsZiBpcyBhY3R1YWxseSBhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgIC8vIFRoZSByZXRyaWV2ZWQgdmFsdWUgaXMgZGl2aWRlZCBieSAyIGhlcmUgdG8gbWFrZSBpdCBhcHBlYXIgYXMgdGhvdWdoIHRoZQotICAgIC8vIGNvcnJlY3QgdmFsdWUgaGFzIGJlZW4gc2V0LgotICAgICpzdGF0aWNfY2FzdDxpbnQqPihvcHR2YWwpIC89IDI7Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKF9fbGludXhfXykKLSAgaWYgKHJlc3VsdCA9PSAwKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gcmVzdWx0OwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTb2NrTGVuVHlwZT4KLWlubGluZSBpbnQgY2FsbF9nZXRwZWVybmFtZShTb2NrTGVuVHlwZSBtc2doZHI6OiosCi0gICAgc29ja2V0X3R5cGUgcywgc29ja2V0X2FkZHJfdHlwZSogYWRkciwgc3RkOjpzaXplX3QqIGFkZHJsZW4pCi17Ci0gIFNvY2tMZW5UeXBlIHRtcF9hZGRybGVuID0gKFNvY2tMZW5UeXBlKSphZGRybGVuOwotICBpbnQgcmVzdWx0ID0gOjpnZXRwZWVybmFtZShzLCBhZGRyLCAmdG1wX2FkZHJsZW4pOwotICAqYWRkcmxlbiA9IChzdGQ6OnNpemVfdCl0bXBfYWRkcmxlbjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IGdldHBlZXJuYW1lKHNvY2tldF90eXBlIHMsIHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsCi0gICAgc3RkOjpzaXplX3QqIGFkZHJsZW4sIGJvb2wgY2FjaGVkLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKHMgPT0gaW52YWxpZF9zb2NrZXQpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gc29ja2V0X2Vycm9yX3JldHZhbDsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgaWYgKGNhY2hlZCkKLSAgewotICAgIC8vIENoZWNrIGlmIHNvY2tldCBpcyBzdGlsbCBjb25uZWN0ZWQuCi0gICAgRFdPUkQgY29ubmVjdF90aW1lID0gMDsKLSAgICBzaXplX3QgY29ubmVjdF90aW1lX2xlbiA9IHNpemVvZihjb25uZWN0X3RpbWUpOwotICAgIGlmIChzb2NrZXRfb3BzOjpnZXRzb2Nrb3B0KHMsIDAsIFNPTF9TT0NLRVQsIFNPX0NPTk5FQ1RfVElNRSwKLSAgICAgICAgICAmY29ubmVjdF90aW1lLCAmY29ubmVjdF90aW1lX2xlbiwgZWMpID09IHNvY2tldF9lcnJvcl9yZXR2YWwpCi0gICAgewotICAgICAgcmV0dXJuIHNvY2tldF9lcnJvcl9yZXR2YWw7Ci0gICAgfQotICAgIGlmIChjb25uZWN0X3RpbWUgPT0gMHhGRkZGRkZGRikKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjpub3RfY29ubmVjdGVkOwotICAgICAgcmV0dXJuIHNvY2tldF9lcnJvcl9yZXR2YWw7Ci0gICAgfQotCi0gICAgLy8gVGhlIGNhY2hlZCB2YWx1ZSBpcyBzdGlsbCB2YWxpZC4KLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgKHZvaWQpY2FjaGVkOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcihjYWxsX2dldHBlZXJuYW1lKAotICAgICAgICAmbXNnaGRyOjptc2dfbmFtZWxlbiwgcywgYWRkciwgYWRkcmxlbiksIGVjKTsKLSAgaWYgKHJlc3VsdCA9PSAwKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU29ja0xlblR5cGU+Ci1pbmxpbmUgaW50IGNhbGxfZ2V0c29ja25hbWUoU29ja0xlblR5cGUgbXNnaGRyOjoqLAotICAgIHNvY2tldF90eXBlIHMsIHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsIHN0ZDo6c2l6ZV90KiBhZGRybGVuKQotewotICBTb2NrTGVuVHlwZSB0bXBfYWRkcmxlbiA9IChTb2NrTGVuVHlwZSkqYWRkcmxlbjsKLSAgaW50IHJlc3VsdCA9IDo6Z2V0c29ja25hbWUocywgYWRkciwgJnRtcF9hZGRybGVuKTsKLSAgKmFkZHJsZW4gPSAoc3RkOjpzaXplX3QpdG1wX2FkZHJsZW47Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBnZXRzb2NrbmFtZShzb2NrZXRfdHlwZSBzLCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLAotICAgIHN0ZDo6c2l6ZV90KiBhZGRybGVuLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKHMgPT0gaW52YWxpZF9zb2NrZXQpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gc29ja2V0X2Vycm9yX3JldHZhbDsKLSAgfQotCi0gIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoY2FsbF9nZXRzb2NrbmFtZSgKLSAgICAgICAgJm1zZ2hkcjo6bXNnX25hbWVsZW4sIHMsIGFkZHIsIGFkZHJsZW4pLCBlYyk7Ci0gIGlmIChyZXN1bHQgPT0gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IGlvY3RsKHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUmIHN0YXRlLCBpbnQgY21kLAotICAgIGlvY3RsX2FyZ190eXBlKiBhcmcsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBzb2NrZXRfZXJyb3JfcmV0dmFsOwotICB9Ci0KLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6aW9jdGxzb2NrZXQocywgY21kLCBhcmcpLCBlYyk7Ci0jZWxpZiBkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykgXAotICB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pCi0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6aW9jdGwocywKLSAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihjbWQpLCBhcmcpLCBlYyk7Ci0jZWxzZQotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OmlvY3RsKHMsIGNtZCwgYXJnKSwgZWMpOwotI2VuZGlmCi0gIGlmIChyZXN1bHQgPj0gMCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotCi0gICAgLy8gV2hlbiB1cGRhdGluZyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgd2UgYWx3YXlzIHBlcmZvcm0gdGhlIGlvY3RsIHN5c2NhbGwsCi0gICAgLy8gZXZlbiBpZiB0aGUgZmxhZ3Mgd291bGQgb3RoZXJ3aXNlIGluZGljYXRlIHRoYXQgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGluCi0gICAgLy8gdGhlIGNvcnJlY3Qgc3RhdGUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB1bmRlcmx5aW5nIHNvY2tldCBpcyBwdXQgaW50bwotICAgIC8vIHRoZSBzdGF0ZSB0aGF0IGhhcyBiZWVuIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gSWYgdGhlIGlvY3RsIHN5c2NhbGwgd2FzCi0gICAgLy8gc3VjY2Vzc2Z1bCB0aGVuIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBmbGFncyB0byBtYXRjaC4KLSAgICBpZiAoY21kID09IHN0YXRpY19jYXN0PGludD4oRklPTkJJTykpCi0gICAgewotICAgICAgaWYgKCphcmcpCi0gICAgICB7Ci0gICAgICAgIHN0YXRlIHw9IHVzZXJfc2V0X25vbl9ibG9ja2luZzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gQ2xlYXJpbmcgdGhlIG5vbi1ibG9ja2luZyBtb2RlIGFsd2F5cyBvdmVycmlkZXMgYW55IGludGVybmFsbHktc2V0Ci0gICAgICAgIC8vIG5vbi1ibG9ja2luZyBmbGFnLiBBbnkgc3Vic2VxdWVudCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB3aWxsIG5lZWQKLSAgICAgICAgLy8gdG8gcmUtZW5hYmxlIG5vbi1ibG9ja2luZyBJL08uCi0gICAgICAgIHN0YXRlICY9IH4odXNlcl9zZXRfbm9uX2Jsb2NraW5nIHwgaW50ZXJuYWxfbm9uX2Jsb2NraW5nKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgc2VsZWN0KGludCBuZmRzLCBmZF9zZXQqIHJlYWRmZHMsIGZkX3NldCogd3JpdGVmZHMsCi0gICAgZmRfc2V0KiBleGNlcHRmZHMsIHRpbWV2YWwqIHRpbWVvdXQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgaWYgKCFyZWFkZmRzICYmICF3cml0ZWZkcyAmJiAhZXhjZXB0ZmRzICYmIHRpbWVvdXQpCi0gIHsKLSAgICBEV09SRCBtaWxsaXNlY29uZHMgPSB0aW1lb3V0LT50dl9zZWMgKiAxMDAwICsgdGltZW91dC0+dHZfdXNlYyAvIDEwMDA7Ci0gICAgaWYgKG1pbGxpc2Vjb25kcyA9PSAwKQotICAgICAgbWlsbGlzZWNvbmRzID0gMTsgLy8gRm9yY2UgY29udGV4dCBzd2l0Y2guCi0gICAgOjpTbGVlcChtaWxsaXNlY29uZHMpOwotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gVGhlIHNlbGVjdCgpIGNhbGwgYWxsb3dzIHRpbWVvdXQgdmFsdWVzIG1lYXN1cmVkIGluIG1pY3Jvc2Vjb25kcywgYnV0IHRoZQotICAvLyBzeXN0ZW0gY2xvY2sgKGFzIHdyYXBwZWQgYnkgYm9vc3Q6OnBvc2l4X3RpbWU6Om1pY3Jvc2VjX2Nsb2NrKSB0eXBpY2FsbHkKLSAgLy8gaGFzIGEgcmVzb2x1dGlvbiBvZiAxMCBtaWxsaXNlY29uZHMuIFRoaXMgY2FuIGxlYWQgdG8gYSBzcGlubmluZyBzZWxlY3QKLSAgLy8gcmVhY3RvciwgbWVhbmluZyBpbmNyZWFzZWQgQ1BVIHVzYWdlLCB3aGVuIHdhaXRpbmcgZm9yIHRoZSBlYXJsaWVzdAotICAvLyBzY2hlZHVsZWQgdGltZW91dCBpZiBpdCdzIGxlc3MgdGhhbiAxMCBtaWxsaXNlY29uZHMgYXdheS4gVG8gYXZvaWQgYSB0aWdodAotICAvLyBzcGluIHdlJ2xsIHVzZSBhIG1pbmltdW0gdGltZW91dCBvZiAxIG1pbGxpc2Vjb25kLgotICBpZiAodGltZW91dCAmJiB0aW1lb3V0LT50dl9zZWMgPT0gMAotICAgICAgJiYgdGltZW91dC0+dHZfdXNlYyA+IDAgJiYgdGltZW91dC0+dHZfdXNlYyA8IDEwMDApCi0gICAgdGltZW91dC0+dHZfdXNlYyA9IDEwMDA7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLQotI2lmIGRlZmluZWQoX19ocHV4KSAmJiBkZWZpbmVkKF9fU0VMRUNUKQotICB0aW1lc3BlYyB0czsKLSAgdHMudHZfc2VjID0gdGltZW91dCA/IHRpbWVvdXQtPnR2X3NlYyA6IDA7Ci0gIHRzLnR2X25zZWMgPSB0aW1lb3V0ID8gdGltZW91dC0+dHZfdXNlYyAqIDEwMDAgOiAwOwotICByZXR1cm4gZXJyb3Jfd3JhcHBlcig6OnBzZWxlY3QobmZkcywgcmVhZGZkcywKLSAgICAgICAgd3JpdGVmZHMsIGV4Y2VwdGZkcywgdGltZW91dCA/ICZ0cyA6IDAsIDApLCBlYyk7Ci0jZWxzZQotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnNlbGVjdChuZmRzLCByZWFkZmRzLAotICAgICAgICB3cml0ZWZkcywgZXhjZXB0ZmRzLCB0aW1lb3V0KSwgZWMpOwotICBpZiAocmVzdWx0ID49IDApCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiByZXN1bHQ7Ci0jZW5kaWYKLX0KLQotaW50IHBvbGxfcmVhZChzb2NrZXRfdHlwZSBzLCBzdGF0ZV90eXBlIHN0YXRlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKHMgPT0gaW52YWxpZF9zb2NrZXQpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gc29ja2V0X2Vycm9yX3JldHZhbDsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIFwKLSAgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSBcCi0gIHx8IGRlZmluZWQoX19TWU1CSUFOMzJfXykKLSAgZmRfc2V0IGZkczsKLSAgRkRfWkVSTygmZmRzKTsKLSAgRkRfU0VUKHMsICZmZHMpOwotICB0aW1ldmFsIHplcm9fdGltZW91dDsKLSAgemVyb190aW1lb3V0LnR2X3NlYyA9IDA7Ci0gIHplcm9fdGltZW91dC50dl91c2VjID0gMDsKLSAgdGltZXZhbCogdGltZW91dCA9IChzdGF0ZSAmIHVzZXJfc2V0X25vbl9ibG9ja2luZykgPyAmemVyb190aW1lb3V0IDogMDsKLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnNlbGVjdChzICsgMSwgJmZkcywgMCwgMCwgdGltZW91dCksIGVjKTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgLy8gfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAgICAgLy8gfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotICBwb2xsZmQgZmRzOwotICBmZHMuZmQgPSBzOwotICBmZHMuZXZlbnRzID0gUE9MTElOOwotICBmZHMucmV2ZW50cyA9IDA7Ci0gIGludCB0aW1lb3V0ID0gKHN0YXRlICYgdXNlcl9zZXRfbm9uX2Jsb2NraW5nKSA/IDAgOiAtMTsKLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnBvbGwoJmZkcywgMSwgdGltZW91dCksIGVjKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAvLyB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICAgLy8gfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotICBpZiAocmVzdWx0ID09IDApCi0gICAgZWMgPSAoc3RhdGUgJiB1c2VyX3NldF9ub25fYmxvY2tpbmcpCi0gICAgICA/IGFzaW86OmVycm9yOjp3b3VsZF9ibG9jayA6IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgZWxzZSBpZiAocmVzdWx0ID4gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHBvbGxfd3JpdGUoc29ja2V0X3R5cGUgcywgc3RhdGVfdHlwZSBzdGF0ZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChzID09IGludmFsaWRfc29ja2V0KQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIHNvY2tldF9lcnJvcl9yZXR2YWw7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSBcCi0gIHx8IGRlZmluZWQoX19DWUdXSU5fXykgXAotICB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0gIGZkX3NldCBmZHM7Ci0gIEZEX1pFUk8oJmZkcyk7Ci0gIEZEX1NFVChzLCAmZmRzKTsKLSAgdGltZXZhbCB6ZXJvX3RpbWVvdXQ7Ci0gIHplcm9fdGltZW91dC50dl9zZWMgPSAwOwotICB6ZXJvX3RpbWVvdXQudHZfdXNlYyA9IDA7Ci0gIHRpbWV2YWwqIHRpbWVvdXQgPSAoc3RhdGUgJiB1c2VyX3NldF9ub25fYmxvY2tpbmcpID8gJnplcm9fdGltZW91dCA6IDA7Ci0gIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpzZWxlY3QocyArIDEsIDAsICZmZHMsIDAsIHRpbWVvdXQpLCBlYyk7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgIC8vIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICAgIC8vIHx8IGRlZmluZWQoX19TWU1CSUFOMzJfXykKLSAgcG9sbGZkIGZkczsKLSAgZmRzLmZkID0gczsKLSAgZmRzLmV2ZW50cyA9IFBPTExPVVQ7Ci0gIGZkcy5yZXZlbnRzID0gMDsKLSAgaW50IHRpbWVvdXQgPSAoc3RhdGUgJiB1c2VyX3NldF9ub25fYmxvY2tpbmcpID8gMCA6IC0xOwotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6cG9sbCgmZmRzLCAxLCB0aW1lb3V0KSwgZWMpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgIC8vIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICAgICAvLyB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0gIGlmIChyZXN1bHQgPT0gMCkKLSAgICBlYyA9IChzdGF0ZSAmIHVzZXJfc2V0X25vbl9ibG9ja2luZykKLSAgICAgID8gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrIDogYXNpbzo6ZXJyb3JfY29kZSgpOwotICBlbHNlIGlmIChyZXN1bHQgPiAwKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgcG9sbF9jb25uZWN0KHNvY2tldF90eXBlIHMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAocyA9PSBpbnZhbGlkX3NvY2tldCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBzb2NrZXRfZXJyb3JfcmV0dmFsOwotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgXAotICB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIFwKLSAgfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotICBmZF9zZXQgd3JpdGVfZmRzOwotICBGRF9aRVJPKCZ3cml0ZV9mZHMpOwotICBGRF9TRVQocywgJndyaXRlX2Zkcyk7Ci0gIGZkX3NldCBleGNlcHRfZmRzOwotICBGRF9aRVJPKCZleGNlcHRfZmRzKTsKLSAgRkRfU0VUKHMsICZleGNlcHRfZmRzKTsKLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnNlbGVjdCgKLSAgICAgICAgcyArIDEsIDAsICZ3cml0ZV9mZHMsICZleGNlcHRfZmRzLCAwKSwgZWMpOwotICBpZiAocmVzdWx0ID49IDApCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiByZXN1bHQ7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgIC8vIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICAgIC8vIHx8IGRlZmluZWQoX19TWU1CSUFOMzJfXykKLSAgcG9sbGZkIGZkczsKLSAgZmRzLmZkID0gczsKLSAgZmRzLmV2ZW50cyA9IFBPTExPVVQ7Ci0gIGZkcy5yZXZlbnRzID0gMDsKLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OnBvbGwoJmZkcywgMSwgLTEpLCBlYyk7Ci0gIGlmIChyZXN1bHQgPj0gMCkKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAvLyB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICAgLy8gfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotfQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLWNvbnN0IGNoYXIqIGluZXRfbnRvcChpbnQgYWYsIGNvbnN0IHZvaWQqIHNyYywgY2hhciogZGVzdCwgc2l6ZV90IGxlbmd0aCwKLSAgICB1bnNpZ25lZCBsb25nIHNjb3BlX2lkLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBzcHJpbnRmLgotICBjb25zdCB1bnNpZ25lZCBjaGFyKiBieXRlcyA9IHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihzcmMpOwotICBpZiAoYWYgPT0gQVNJT19PU19ERUYoQUZfSU5FVCkpCi0gIHsKLSAgICBzcHJpbnRmX3MoZGVzdCwgbGVuZ3RoLCAiJXUuJXUuJXUuJXUiLAotICAgICAgICBieXRlc1swXSwgYnl0ZXNbMV0sIGJ5dGVzWzJdLCBieXRlc1szXSk7Ci0gICAgcmV0dXJuIGRlc3Q7Ci0gIH0KLSAgZWxzZSBpZiAoYWYgPT0gQVNJT19PU19ERUYoQUZfSU5FVDYpKQotICB7Ci0gICAgc2l6ZV90IG4gPSAwLCBiID0gMCwgeiA9IDA7Ci0gICAgd2hpbGUgKG4gPCBsZW5ndGggJiYgYiA8IDE2KQotICAgIHsKLSAgICAgIGlmIChieXRlc1tiXSA9PSAwICYmIGJ5dGVzW2IgKyAxXSA9PSAwICYmIHogPT0gMCkKLSAgICAgIHsKLSAgICAgICAgZG8gYiArPSAyOyB3aGlsZSAoYiA8IDE2ICYmIGJ5dGVzW2JdID09IDAgJiYgYnl0ZXNbYiArIDFdID09IDApOwotICAgICAgICBuICs9IHNwcmludGZfcyhkZXN0ICsgbiwgbGVuZ3RoIC0gbiwgIjolcyIsIGIgPCAxNiA/ICIiIDogIjoiKSwgKyt6OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBuICs9IHNwcmludGZfcyhkZXN0ICsgbiwgbGVuZ3RoIC0gbiwgIiVzJXgiLCBiID8gIjoiIDogIiIsCi0gICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dV9sb25nX3R5cGU+KGJ5dGVzW2JdKSA8PCA4KSB8IGJ5dGVzW2IgKyAxXSk7Ci0gICAgICAgIGIgKz0gMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHNjb3BlX2lkKQotICAgICAgbiArPSBzcHJpbnRmX3MoZGVzdCArIG4sIGxlbmd0aCAtIG4sICIlJSVsdSIsIHNjb3BlX2lkKTsKLSAgICByZXR1cm4gZGVzdDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjphZGRyZXNzX2ZhbWlseV9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAwOwotICB9Ci0jZWxpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3IgbWVtY3B5LgotCi0gIGlmIChhZiAhPSBBU0lPX09TX0RFRihBRl9JTkVUKSAmJiBhZiAhPSBBU0lPX09TX0RFRihBRl9JTkVUNikpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjphZGRyZXNzX2ZhbWlseV9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdW5pb24KLSAgewotICAgIHNvY2tldF9hZGRyX3R5cGUgYmFzZTsKLSAgICBzb2NrYWRkcl9zdG9yYWdlX3R5cGUgc3RvcmFnZTsKLSAgICBzb2NrYWRkcl9pbjRfdHlwZSB2NDsKLSAgICBzb2NrYWRkcl9pbjZfdHlwZSB2NjsKLSAgfSBhZGRyZXNzOwotICBEV09SRCBhZGRyZXNzX2xlbmd0aDsKLSAgaWYgKGFmID09IEFTSU9fT1NfREVGKEFGX0lORVQpKQotICB7Ci0gICAgYWRkcmVzc19sZW5ndGggPSBzaXplb2Yoc29ja2FkZHJfaW40X3R5cGUpOwotICAgIGFkZHJlc3MudjQuc2luX2ZhbWlseSA9IEFTSU9fT1NfREVGKEFGX0lORVQpOwotICAgIGFkZHJlc3MudjQuc2luX3BvcnQgPSAwOwotICAgIG1lbWNweSgmYWRkcmVzcy52NC5zaW5fYWRkciwgc3JjLCBzaXplb2YoaW40X2FkZHJfdHlwZSkpOwotICB9Ci0gIGVsc2UgLy8gQUZfSU5FVDYKLSAgewotICAgIGFkZHJlc3NfbGVuZ3RoID0gc2l6ZW9mKHNvY2thZGRyX2luNl90eXBlKTsKLSAgICBhZGRyZXNzLnY2LnNpbjZfZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVDYpOwotICAgIGFkZHJlc3MudjYuc2luNl9wb3J0ID0gMDsKLSAgICBhZGRyZXNzLnY2LnNpbjZfZmxvd2luZm8gPSAwOwotICAgIGFkZHJlc3MudjYuc2luNl9zY29wZV9pZCA9IHNjb3BlX2lkOwotICAgIG1lbWNweSgmYWRkcmVzcy52Ni5zaW42X2FkZHIsIHNyYywgc2l6ZW9mKGluNl9hZGRyX3R5cGUpKTsKLSAgfQotCi0gIERXT1JEIHN0cmluZ19sZW5ndGggPSBzdGF0aWNfY2FzdDxEV09SRD4obGVuZ3RoKTsKLSNpZiBkZWZpbmVkKEJPT1NUX05PX0FOU0lfQVBJUykgfHwgKGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxODAwKSkKLSAgTFBXU1RSIHN0cmluZ19idWZmZXIgPSAoTFBXU1RSKV9hbGxvY2EobGVuZ3RoICogc2l6ZW9mKFdDSEFSKSk7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6V1NBQWRkcmVzc1RvU3RyaW5nVygmYWRkcmVzcy5iYXNlLAotICAgICAgICBhZGRyZXNzX2xlbmd0aCwgMCwgc3RyaW5nX2J1ZmZlciwgJnN0cmluZ19sZW5ndGgpLCBlYyk7Ci0gIDo6V2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHN0cmluZ19idWZmZXIsIC0xLAotICAgICAgZGVzdCwgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgpLCAwLCAwKTsKLSNlbHNlCi0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6V1NBQWRkcmVzc1RvU3RyaW5nQSgKLSAgICAgICAgJmFkZHJlc3MuYmFzZSwgYWRkcmVzc19sZW5ndGgsIDAsIGRlc3QsICZzdHJpbmdfbGVuZ3RoKSwgZWMpOwotI2VuZGlmCi0KLSAgLy8gV2luZG93cyBtYXkgc2V0IGVycm9yIGNvZGUgb24gc3VjY2Vzcy4KLSAgaWYgKHJlc3VsdCAhPSBzb2NrZXRfZXJyb3JfcmV0dmFsKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotCi0gIC8vIFdpbmRvd3MgbWF5IG5vdCBzZXQgYW4gZXJyb3IgY29kZSBvbiBmYWlsdXJlLgotICBlbHNlIGlmIChyZXN1bHQgPT0gc29ja2V0X2Vycm9yX3JldHZhbCAmJiAhZWMpCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLQotICByZXR1cm4gcmVzdWx0ID09IHNvY2tldF9lcnJvcl9yZXR2YWwgPyAwIDogZGVzdDsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGNvbnN0IGNoYXIqIHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjppbmV0X250b3AoCi0gICAgICAgIGFmLCBzcmMsIGRlc3QsIHN0YXRpY19jYXN0PGludD4obGVuZ3RoKSksIGVjKTsKLSAgaWYgKHJlc3VsdCA9PSAwICYmICFlYykKLSAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICBpZiAocmVzdWx0ICE9IDAgJiYgYWYgPT0gQVNJT19PU19ERUYoQUZfSU5FVDYpICYmIHNjb3BlX2lkICE9IDApCi0gIHsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3Igc3RyY2F0IGFuZCBzcHJpbnRmLgotICAgIGNoYXIgaWZfbmFtZVtJRl9OQU1FU0laRSArIDFdID0gIiUiOwotICAgIGNvbnN0IGluNl9hZGRyX3R5cGUqIGlwdjZfYWRkcmVzcyA9IHN0YXRpY19jYXN0PGNvbnN0IGluNl9hZGRyX3R5cGUqPihzcmMpOwotICAgIGJvb2wgaXNfbGlua19sb2NhbCA9ICgoaXB2Nl9hZGRyZXNzLT5zNl9hZGRyWzBdID09IDB4ZmUpCi0gICAgICAgICYmICgoaXB2Nl9hZGRyZXNzLT5zNl9hZGRyWzFdICYgMHhjMCkgPT0gMHg4MCkpOwotICAgIGJvb2wgaXNfbXVsdGljYXN0X2xpbmtfbG9jYWwgPSAoKGlwdjZfYWRkcmVzcy0+czZfYWRkclswXSA9PSAweGZmKQotICAgICAgICAmJiAoKGlwdjZfYWRkcmVzcy0+czZfYWRkclsxXSAmIDB4MGYpID09IDB4MDIpKTsKLSAgICBpZiAoKCFpc19saW5rX2xvY2FsICYmICFpc19tdWx0aWNhc3RfbGlua19sb2NhbCkKLSAgICAgICAgfHwgaWZfaW5kZXh0b25hbWUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNjb3BlX2lkKSwgaWZfbmFtZSArIDEpID09IDApCi0gICAgICBzcHJpbnRmKGlmX25hbWUgKyAxLCAiJWx1Iiwgc2NvcGVfaWQpOwotICAgIHN0cmNhdChkZXN0LCBpZl9uYW1lKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi19Ci0KLWludCBpbmV0X3B0b24oaW50IGFmLCBjb25zdCBjaGFyKiBzcmMsIHZvaWQqIGRlc3QsCi0gICAgdW5zaWduZWQgbG9uZyogc2NvcGVfaWQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIHNzY2FuZi4KLSAgdW5zaWduZWQgY2hhciogYnl0ZXMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oZGVzdCk7Ci0gIGlmIChhZiA9PSBBU0lPX09TX0RFRihBRl9JTkVUKSkKLSAgewotICAgIHVuc2lnbmVkIGludCBiMCwgYjEsIGIyLCBiMzsKLSAgICBpZiAoc3NjYW5mX3Moc3JjLCAiJXUuJXUuJXUuJXUiLCAmYjAsICZiMSwgJmIyLCAmYjMpICE9IDQpCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKGIwID4gMjU1IHx8IGIxID4gMjU1IHx8IGIyID4gMjU1IHx8IGIzID4gMjU1KQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGJ5dGVzWzBdID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYjApOwotICAgIGJ5dGVzWzFdID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYjEpOwotICAgIGJ5dGVzWzJdID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYjIpOwotICAgIGJ5dGVzWzNdID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYjMpOwotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiAxOwotICB9Ci0gIGVsc2UgaWYgKGFmID09IEFTSU9fT1NfREVGKEFGX0lORVQ2KSkKLSAgewotICAgIHVuc2lnbmVkIGNoYXIqIGJ5dGVzID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KGRlc3QpOwotICAgIHN0ZDo6bWVtc2V0KGJ5dGVzLCAwLCAxNik7Ci0gICAgdW5zaWduZWQgY2hhciBiYWNrX2J5dGVzWzE2XSA9IHsgMCB9OwotICAgIGludCBudW1fZnJvbnRfYnl0ZXMgPSAwLCBudW1fYmFja19ieXRlcyA9IDA7Ci0gICAgY29uc3QgY2hhciogcCA9IHNyYzsKLQotICAgIGVudW0geyBmd29yZCwgZmNvbG9uLCBid29yZCwgc2NvcGUsIGRvbmUgfSBzdGF0ZSA9IGZ3b3JkOwotICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF93b3JkID0gMDsKLSAgICB3aGlsZSAoc3RhdGUgIT0gZG9uZSkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF93b3JkID4gMHhGRkZGKQotICAgICAgewotICAgICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0KLSAgICAgIHN3aXRjaCAoc3RhdGUpCi0gICAgICB7Ci0gICAgICBjYXNlIGZ3b3JkOgotICAgICAgICBpZiAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykKLSAgICAgICAgICBjdXJyZW50X3dvcmQgPSBjdXJyZW50X3dvcmQgKiAxNiArICpwKysgLSAnMCc7Ci0gICAgICAgIGVsc2UgaWYgKCpwID49ICdhJyAmJiAqcCA8PSAnZicpCi0gICAgICAgICAgY3VycmVudF93b3JkID0gY3VycmVudF93b3JkICogMTYgKyAqcCsrIC0gJ2EnICsgMTA7Ci0gICAgICAgIGVsc2UgaWYgKCpwID49ICdBJyAmJiAqcCA8PSAnRicpCi0gICAgICAgICAgY3VycmVudF93b3JkID0gY3VycmVudF93b3JkICogMTYgKyAqcCsrIC0gJ0EnICsgMTA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChudW1fZnJvbnRfYnl0ZXMgPT0gMTYpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBieXRlc1tudW1fZnJvbnRfYnl0ZXMrK10gPSAoY3VycmVudF93b3JkID4+IDgpICYgMHhGRjsKLSAgICAgICAgICBieXRlc1tudW1fZnJvbnRfYnl0ZXMrK10gPSBjdXJyZW50X3dvcmQgJiAweEZGOwotICAgICAgICAgIGN1cnJlbnRfd29yZCA9IDA7Ci0KLSAgICAgICAgICBpZiAoKnAgPT0gJzonKQotICAgICAgICAgICAgc3RhdGUgPSBmY29sb24sICsrcDsKLSAgICAgICAgICBlbHNlIGlmICgqcCA9PSAnJScpCi0gICAgICAgICAgICBzdGF0ZSA9IHNjb3BlLCArK3A7Ci0gICAgICAgICAgZWxzZSBpZiAoKnAgPT0gMCkKLSAgICAgICAgICAgIHN0YXRlID0gZG9uZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgZmNvbG9uOgotICAgICAgICBpZiAoKnAgPT0gJzonKQotICAgICAgICAgIHN0YXRlID0gYndvcmQsICsrcDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHN0YXRlID0gZndvcmQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGJ3b3JkOgotICAgICAgICBpZiAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykKLSAgICAgICAgICBjdXJyZW50X3dvcmQgPSBjdXJyZW50X3dvcmQgKiAxNiArICpwKysgLSAnMCc7Ci0gICAgICAgIGVsc2UgaWYgKCpwID49ICdhJyAmJiAqcCA8PSAnZicpCi0gICAgICAgICAgY3VycmVudF93b3JkID0gY3VycmVudF93b3JkICogMTYgKyAqcCsrIC0gJ2EnICsgMTA7Ci0gICAgICAgIGVsc2UgaWYgKCpwID49ICdBJyAmJiAqcCA8PSAnRicpCi0gICAgICAgICAgY3VycmVudF93b3JkID0gY3VycmVudF93b3JkICogMTYgKyAqcCsrIC0gJ0EnICsgMTA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChudW1fZnJvbnRfYnl0ZXMgKyBudW1fYmFja19ieXRlcyA9PSAxNikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGJhY2tfYnl0ZXNbbnVtX2JhY2tfYnl0ZXMrK10gPSAoY3VycmVudF93b3JkID4+IDgpICYgMHhGRjsKLSAgICAgICAgICBiYWNrX2J5dGVzW251bV9iYWNrX2J5dGVzKytdID0gY3VycmVudF93b3JkICYgMHhGRjsKLSAgICAgICAgICBjdXJyZW50X3dvcmQgPSAwOwotCi0gICAgICAgICAgaWYgKCpwID09ICc6JykKLSAgICAgICAgICAgIHN0YXRlID0gYndvcmQsICsrcDsKLSAgICAgICAgICBlbHNlIGlmICgqcCA9PSAnJScpCi0gICAgICAgICAgICBzdGF0ZSA9IHNjb3BlLCArK3A7Ci0gICAgICAgICAgZWxzZSBpZiAoKnAgPT0gMCkKLSAgICAgICAgICAgIHN0YXRlID0gZG9uZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2Ugc2NvcGU6Ci0gICAgICAgIGlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKQotICAgICAgICAgIGN1cnJlbnRfd29yZCA9IGN1cnJlbnRfd29yZCAqIDEwICsgKnArKyAtICcwJzsKLSAgICAgICAgZWxzZSBpZiAoKnAgPT0gMCkKLSAgICAgICAgICAqc2NvcGVfaWQgPSBjdXJyZW50X3dvcmQsIHN0YXRlID0gZG9uZTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2JhY2tfYnl0ZXM7ICsraSkKLSAgICAgIGJ5dGVzWzE2IC0gbnVtX2JhY2tfYnl0ZXMgKyBpXSA9IGJhY2tfYnl0ZXNbaV07Ci0KLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjphZGRyZXNzX2ZhbWlseV9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAtMTsKLSAgfQotI2VsaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbWNweSBhbmQgc3RyY21wLgotCi0gIGlmIChhZiAhPSBBU0lPX09TX0RFRihBRl9JTkVUKSAmJiBhZiAhPSBBU0lPX09TX0RFRihBRl9JTkVUNikpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjphZGRyZXNzX2ZhbWlseV9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHVuaW9uCi0gIHsKLSAgICBzb2NrZXRfYWRkcl90eXBlIGJhc2U7Ci0gICAgc29ja2FkZHJfc3RvcmFnZV90eXBlIHN0b3JhZ2U7Ci0gICAgc29ja2FkZHJfaW40X3R5cGUgdjQ7Ci0gICAgc29ja2FkZHJfaW42X3R5cGUgdjY7Ci0gIH0gYWRkcmVzczsKLSAgaW50IGFkZHJlc3NfbGVuZ3RoID0gc2l6ZW9mKHNvY2thZGRyX3N0b3JhZ2VfdHlwZSk7Ci0jaWYgZGVmaW5lZChCT09TVF9OT19BTlNJX0FQSVMpIHx8IChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTgwMCkpCi0gIGludCBudW1fd2lkZV9jaGFycyA9IHN0YXRpY19jYXN0PGludD4oc3RybGVuKHNyYykpICsgMTsKLSAgTFBXU1RSIHdpZGVfYnVmZmVyID0gKExQV1NUUilfYWxsb2NhKG51bV93aWRlX2NoYXJzICogc2l6ZW9mKFdDSEFSKSk7Ci0gIDo6TXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHNyYywgLTEsIHdpZGVfYnVmZmVyLCBudW1fd2lkZV9jaGFycyk7Ci0gIGludCByZXN1bHQgPSBlcnJvcl93cmFwcGVyKDo6V1NBU3RyaW5nVG9BZGRyZXNzVygKLSAgICAgICAgd2lkZV9idWZmZXIsIGFmLCAwLCAmYWRkcmVzcy5iYXNlLCAmYWRkcmVzc19sZW5ndGgpLCBlYyk7Ci0jZWxzZQotICBpbnQgcmVzdWx0ID0gZXJyb3Jfd3JhcHBlcig6OldTQVN0cmluZ1RvQWRkcmVzc0EoCi0gICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHNyYyksIGFmLCAwLCAmYWRkcmVzcy5iYXNlLCAmYWRkcmVzc19sZW5ndGgpLCBlYyk7Ci0jZW5kaWYKLQotICBpZiAoYWYgPT0gQVNJT19PU19ERUYoQUZfSU5FVCkpCi0gIHsKLSAgICBpZiAocmVzdWx0ICE9IHNvY2tldF9lcnJvcl9yZXR2YWwpCi0gICAgewotICAgICAgbWVtY3B5KGRlc3QsICZhZGRyZXNzLnY0LnNpbl9hZGRyLCBzaXplb2YoaW40X2FkZHJfdHlwZSkpOwotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNtcChzcmMsICIyNTUuMjU1LjI1NS4yNTUiKSA9PSAwKQotICAgIHsKLSAgICAgIHN0YXRpY19jYXN0PGluNF9hZGRyX3R5cGUqPihkZXN0KS0+c19hZGRyID0gSU5BRERSX05PTkU7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICB9Ci0gIH0KLSAgZWxzZSAvLyBBRl9JTkVUNgotICB7Ci0gICAgaWYgKHJlc3VsdCAhPSBzb2NrZXRfZXJyb3JfcmV0dmFsKQotICAgIHsKLSAgICAgIG1lbWNweShkZXN0LCAmYWRkcmVzcy52Ni5zaW42X2FkZHIsIHNpemVvZihpbjZfYWRkcl90eXBlKSk7Ci0gICAgICBpZiAoc2NvcGVfaWQpCi0gICAgICAgICpzY29wZV9pZCA9IGFkZHJlc3MudjYuc2luNl9zY29wZV9pZDsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIH0KLSAgfQotCi0gIC8vIFdpbmRvd3MgbWF5IG5vdCBzZXQgYW4gZXJyb3IgY29kZSBvbiBmYWlsdXJlLgotICBpZiAocmVzdWx0ID09IHNvY2tldF9lcnJvcl9yZXR2YWwgJiYgIWVjKQotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0KLSAgaWYgKHJlc3VsdCAhPSBzb2NrZXRfZXJyb3JfcmV0dmFsKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotCi0gIHJldHVybiByZXN1bHQgPT0gc29ja2V0X2Vycm9yX3JldHZhbCA/IC0xIDogMTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBzdHJjaHIsIG1lbWNweSBhbmQgYXRvaS4KLQotICAvLyBPbiBzb21lIHBsYXRmb3JtcywgaW5ldF9wdG9uIGZhaWxzIGlmIGFuIGFkZHJlc3Mgc3RyaW5nIGNvbnRhaW5zIGEgc2NvcGUKLSAgLy8gaWQuIERldGVjdCBhbmQgcmVtb3ZlIHRoZSBzY29wZSBpZCBiZWZvcmUgcGFzc2luZyB0aGUgc3RyaW5nIHRvIGluZXRfcHRvbi4KLSAgY29uc3QgYm9vbCBpc192NiA9IChhZiA9PSBBU0lPX09TX0RFRihBRl9JTkVUNikpOwotICBjb25zdCBjaGFyKiBpZl9uYW1lID0gaXNfdjYgPyBzdHJjaHIoc3JjLCAnJScpIDogMDsKLSAgY2hhciBzcmNfYnVmW21heF9hZGRyX3Y2X3N0cl9sZW4gKyAxXTsKLSAgY29uc3QgY2hhciogc3JjX3B0ciA9IHNyYzsKLSAgaWYgKGlmX25hbWUgIT0gMCkKLSAgewotICAgIGlmIChpZl9uYW1lIC0gc3JjID4gbWF4X2FkZHJfdjZfc3RyX2xlbikKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIG1lbWNweShzcmNfYnVmLCBzcmMsIGlmX25hbWUgLSBzcmMpOwotICAgIHNyY19idWZbaWZfbmFtZSAtIHNyY10gPSAwOwotICAgIHNyY19wdHIgPSBzcmNfYnVmOwotICB9Ci0KLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjppbmV0X3B0b24oYWYsIHNyY19wdHIsIGRlc3QpLCBlYyk7Ci0gIGlmIChyZXN1bHQgPD0gMCAmJiAhZWMpCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgaWYgKHJlc3VsdCA+IDAgJiYgaXNfdjYgJiYgc2NvcGVfaWQpCi0gIHsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3Igc3RyY2hyIGFuZCBhdG9pLgotICAgICpzY29wZV9pZCA9IDA7Ci0gICAgaWYgKGlmX25hbWUgIT0gMCkKLSAgICB7Ci0gICAgICBpbjZfYWRkcl90eXBlKiBpcHY2X2FkZHJlc3MgPSBzdGF0aWNfY2FzdDxpbjZfYWRkcl90eXBlKj4oZGVzdCk7Ci0gICAgICBib29sIGlzX2xpbmtfbG9jYWwgPSAoKGlwdjZfYWRkcmVzcy0+czZfYWRkclswXSA9PSAweGZlKQotICAgICAgICAgICYmICgoaXB2Nl9hZGRyZXNzLT5zNl9hZGRyWzFdICYgMHhjMCkgPT0gMHg4MCkpOwotICAgICAgYm9vbCBpc19tdWx0aWNhc3RfbGlua19sb2NhbCA9ICgoaXB2Nl9hZGRyZXNzLT5zNl9hZGRyWzBdID09IDB4ZmYpCi0gICAgICAgICAgJiYgKChpcHY2X2FkZHJlc3MtPnM2X2FkZHJbMV0gJiAweDBmKSA9PSAweDAyKSk7Ci0gICAgICBpZiAoaXNfbGlua19sb2NhbCB8fCBpc19tdWx0aWNhc3RfbGlua19sb2NhbCkKLSAgICAgICAgKnNjb3BlX2lkID0gaWZfbmFtZXRvaW5kZXgoaWZfbmFtZSArIDEpOwotICAgICAgaWYgKCpzY29wZV9pZCA9PSAwKQotICAgICAgICAqc2NvcGVfaWQgPSBhdG9pKGlmX25hbWUgKyAxKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotfQotCi1pbnQgZ2V0aG9zdG5hbWUoY2hhciogbmFtZSwgaW50IG5hbWVsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgdHJ5Ci0gIHsKLSAgICB1c2luZyBuYW1lc3BhY2UgV2luZG93czo6Rm91bmRhdGlvbjo6Q29sbGVjdGlvbnM7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6Ok5ldHdvcmtpbmc7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6Ok5ldHdvcmtpbmc6OkNvbm5lY3Rpdml0eTsKLSAgICBJVmVjdG9yVmlldzxIb3N0TmFtZV4+XiBob3N0bmFtZXMgPSBOZXR3b3JrSW5mb3JtYXRpb246OkdldEhvc3ROYW1lcygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBob3N0bmFtZXMtPlNpemU7ICsraSkKLSAgICB7Ci0gICAgICBIb3N0TmFtZV4gaG9zdG5hbWUgPSBob3N0bmFtZXMtPkdldEF0KGkpOwotICAgICAgaWYgKGhvc3RuYW1lLT5UeXBlID09IEhvc3ROYW1lVHlwZTo6RG9tYWluTmFtZSkKLSAgICAgIHsKLSAgICAgICAgc3RkOjp3c3RyaW5nX2NvbnZlcnQ8c3RkOjpjb2RlY3Z0X3V0Zjg8d2NoYXJfdD4+IGNvbnZlcnRlcjsKLSAgICAgICAgc3RkOjpzdHJpbmcgcmF3X25hbWUgPSBjb252ZXJ0ZXIudG9fYnl0ZXMoaG9zdG5hbWUtPlJhd05hbWUtPkRhdGEoKSk7Ci0gICAgICAgIGlmIChuYW1lbGVuID4gMCAmJiByYXdfbmFtZS5zaXplKCkgPCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4obmFtZWxlbikpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJjcHlfcyhuYW1lLCBuYW1lbGVuLCByYXdfbmFtZS5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgY2F0Y2ggKFBsYXRmb3JtOjpFeGNlcHRpb25eIGUpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoZS0+SFJlc3VsdCwKLSAgICAgICAgYXNpbzo6c3lzdGVtX2NhdGVnb3J5KCkpOwotICAgIHJldHVybiAtMTsKLSAgfQotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgaW50IHJlc3VsdCA9IGVycm9yX3dyYXBwZXIoOjpnZXRob3N0bmFtZShuYW1lLCBuYW1lbGVuKSwgZWMpOwotIyBpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgaWYgKHJlc3VsdCA9PSAwKQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotIyBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotfQotCi0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19HRVRBRERSSU5GTykKLQotLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG9ubHkgbmVlZGVkIGZvciBlbXVsYXRpb24gb2YgZ2V0YWRkcmluZm8gYW5kCi0vLyBnZXRuYW1laW5mby4KLQotaW5saW5lIGFzaW86OmVycm9yX2NvZGUgdHJhbnNsYXRlX25ldGRiX2Vycm9yKGludCBlcnJvcikKLXsKLSAgc3dpdGNoIChlcnJvcikKLSAgewotICBjYXNlIDA6Ci0gICAgcmV0dXJuIGFzaW86OmVycm9yX2NvZGUoKTsKLSAgY2FzZSBIT1NUX05PVF9GT1VORDoKLSAgICByZXR1cm4gYXNpbzo6ZXJyb3I6Omhvc3Rfbm90X2ZvdW5kOwotICBjYXNlIFRSWV9BR0FJTjoKLSAgICByZXR1cm4gYXNpbzo6ZXJyb3I6Omhvc3Rfbm90X2ZvdW5kX3RyeV9hZ2FpbjsKLSAgY2FzZSBOT19SRUNPVkVSWToKLSAgICByZXR1cm4gYXNpbzo6ZXJyb3I6Om5vX3JlY292ZXJ5OwotICBjYXNlIE5PX0RBVEE6Ci0gICAgcmV0dXJuIGFzaW86OmVycm9yOjpub19kYXRhOwotICBkZWZhdWx0OgotICAgIEFTSU9fQVNTRVJUKGZhbHNlKTsKLSAgICByZXR1cm4gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gIH0KLX0KLQotaW5saW5lIGhvc3RlbnQqIGdldGhvc3RieWFkZHIoY29uc3QgY2hhciogYWRkciwgaW50IGxlbmd0aCwgaW50IGFmLAotICAgIGhvc3RlbnQqIHJlc3VsdCwgY2hhciogYnVmZmVyLCBpbnQgYnVmbGVuZ3RoLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICh2b2lkKShidWZmZXIpOwotICAodm9pZCkoYnVmbGVuZ3RoKTsKLSAgaG9zdGVudCogcmV0dmFsID0gZXJyb3Jfd3JhcHBlcig6OmdldGhvc3RieWFkZHIoYWRkciwgbGVuZ3RoLCBhZiksIGVjKTsKLSAgaWYgKCFyZXR2YWwpCi0gICAgcmV0dXJuIDA7Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAqcmVzdWx0ID0gKnJldHZhbDsKLSAgcmV0dXJuIHJldHZhbDsKLSNlbGlmIGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoX19RTlhfXykKLSAgaW50IGVycm9yID0gMDsKLSAgaG9zdGVudCogcmV0dmFsID0gZXJyb3Jfd3JhcHBlcig6OmdldGhvc3RieWFkZHJfcihhZGRyLCBsZW5ndGgsIGFmLCByZXN1bHQsCi0gICAgICAgIGJ1ZmZlciwgYnVmbGVuZ3RoLCAmZXJyb3IpLCBlYyk7Ci0gIGlmIChlcnJvcikKLSAgICBlYyA9IHRyYW5zbGF0ZV9uZXRkYl9lcnJvcihlcnJvcik7Ci0gIHJldHVybiByZXR2YWw7Ci0jZWxpZiBkZWZpbmVkKF9fTUFDSF9fKSAmJiBkZWZpbmVkKF9fQVBQTEVfXykKLSAgKHZvaWQpKGJ1ZmZlcik7Ci0gICh2b2lkKShidWZsZW5ndGgpOwotICBpbnQgZXJyb3IgPSAwOwotICBob3N0ZW50KiByZXR2YWwgPSBlcnJvcl93cmFwcGVyKDo6Z2V0aXBub2RlYnlhZGRyKAotICAgICAgICBhZGRyLCBsZW5ndGgsIGFmLCAmZXJyb3IpLCBlYyk7Ci0gIGlmIChlcnJvcikKLSAgICBlYyA9IHRyYW5zbGF0ZV9uZXRkYl9lcnJvcihlcnJvcik7Ci0gIGlmICghcmV0dmFsKQotICAgIHJldHVybiAwOwotICAqcmVzdWx0ID0gKnJldHZhbDsKLSAgcmV0dXJuIHJldHZhbDsKLSNlbHNlCi0gIGhvc3RlbnQqIHJldHZhbCA9IDA7Ci0gIGludCBlcnJvciA9IDA7Ci0gIGVycm9yX3dyYXBwZXIoOjpnZXRob3N0YnlhZGRyX3IoYWRkciwgbGVuZ3RoLCBhZiwgcmVzdWx0LCBidWZmZXIsCi0gICAgICAgIGJ1Zmxlbmd0aCwgJnJldHZhbCwgJmVycm9yKSwgZWMpOwotICBpZiAoZXJyb3IpCi0gICAgZWMgPSB0cmFuc2xhdGVfbmV0ZGJfZXJyb3IoZXJyb3IpOwotICByZXR1cm4gcmV0dmFsOwotI2VuZGlmCi19Ci0KLWlubGluZSBob3N0ZW50KiBnZXRob3N0YnluYW1lKGNvbnN0IGNoYXIqIG5hbWUsIGludCBhZiwgc3RydWN0IGhvc3RlbnQqIHJlc3VsdCwKLSAgICBjaGFyKiBidWZmZXIsIGludCBidWZsZW5ndGgsIGludCBhaV9mbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGNsZWFyX2xhc3RfZXJyb3IoKTsKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAodm9pZCkoYnVmZmVyKTsKLSAgKHZvaWQpKGJ1Zmxlbmd0aCk7Ci0gICh2b2lkKShhaV9mbGFncyk7Ci0gIGlmIChhZiAhPSBBU0lPX09TX0RFRihBRl9JTkVUKSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmFkZHJlc3NfZmFtaWx5X25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaG9zdGVudCogcmV0dmFsID0gZXJyb3Jfd3JhcHBlcig6OmdldGhvc3RieW5hbWUobmFtZSksIGVjKTsKLSAgaWYgKCFyZXR2YWwpCi0gICAgcmV0dXJuIDA7Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAqcmVzdWx0ID0gKnJldHZhbDsKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbGlmIGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoX19RTlhfXykKLSAgKHZvaWQpKGFpX2ZsYWdzKTsKLSAgaWYgKGFmICE9IEFTSU9fT1NfREVGKEFGX0lORVQpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YWRkcmVzc19mYW1pbHlfbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpbnQgZXJyb3IgPSAwOwotICBob3N0ZW50KiByZXR2YWwgPSBlcnJvcl93cmFwcGVyKDo6Z2V0aG9zdGJ5bmFtZV9yKG5hbWUsIHJlc3VsdCwgYnVmZmVyLAotICAgICAgICBidWZsZW5ndGgsICZlcnJvciksIGVjKTsKLSAgaWYgKGVycm9yKQotICAgIGVjID0gdHJhbnNsYXRlX25ldGRiX2Vycm9yKGVycm9yKTsKLSAgcmV0dXJuIHJldHZhbDsKLSNlbGlmIGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKQotICAodm9pZCkoYnVmZmVyKTsKLSAgKHZvaWQpKGJ1Zmxlbmd0aCk7Ci0gIGludCBlcnJvciA9IDA7Ci0gIGhvc3RlbnQqIHJldHZhbCA9IGVycm9yX3dyYXBwZXIoOjpnZXRpcG5vZGVieW5hbWUoCi0gICAgICAgIG5hbWUsIGFmLCBhaV9mbGFncywgJmVycm9yKSwgZWMpOwotICBpZiAoZXJyb3IpCi0gICAgZWMgPSB0cmFuc2xhdGVfbmV0ZGJfZXJyb3IoZXJyb3IpOwotICBpZiAoIXJldHZhbCkKLSAgICByZXR1cm4gMDsKLSAgKnJlc3VsdCA9ICpyZXR2YWw7Ci0gIHJldHVybiByZXR2YWw7Ci0jZWxzZQotICAodm9pZCkoYWlfZmxhZ3MpOwotICBpZiAoYWYgIT0gQVNJT19PU19ERUYoQUZfSU5FVCkpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjphZGRyZXNzX2ZhbWlseV9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAwOwotICB9Ci0gIGhvc3RlbnQqIHJldHZhbCA9IDA7Ci0gIGludCBlcnJvciA9IDA7Ci0gIGVycm9yX3dyYXBwZXIoOjpnZXRob3N0YnluYW1lX3IobmFtZSwgcmVzdWx0LAotICAgICAgICBidWZmZXIsIGJ1Zmxlbmd0aCwgJnJldHZhbCwgJmVycm9yKSwgZWMpOwotICBpZiAoZXJyb3IpCi0gICAgZWMgPSB0cmFuc2xhdGVfbmV0ZGJfZXJyb3IoZXJyb3IpOwotICByZXR1cm4gcmV0dmFsOwotI2VuZGlmCi19Ci0KLWlubGluZSB2b2lkIGZyZWVob3N0ZW50KGhvc3RlbnQqIGgpCi17Ci0jaWYgZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pCi0gIGlmIChoKQotICAgIDo6ZnJlZWhvc3RlbnQoaCk7Ci0jZWxzZQotICAodm9pZCkoaCk7Ci0jZW5kaWYKLX0KLQotLy8gRW11bGF0aW9uIG9mIGdldGFkZHJpbmZvIGJhc2VkIG9uIGltcGxlbWVudGF0aW9uIGluOgotLy8gU3RldmVucywgVy4gUi4sIFVOSVggTmV0d29yayBQcm9ncmFtbWluZyBWb2wuIDEsIDJuZCBFZC4sIFByZW50aWNlLUhhbGwgMTk5OC4KLQotc3RydWN0IGdhaV9zZWFyY2gKLXsKLSAgY29uc3QgY2hhciogaG9zdDsKLSAgaW50IGZhbWlseTsKLX07Ci0KLWlubGluZSBpbnQgZ2FpX25zZWFyY2goY29uc3QgY2hhciogaG9zdCwKLSAgICBjb25zdCBhZGRyaW5mb190eXBlKiBoaW50cywgZ2FpX3NlYXJjaCAoJnNlYXJjaClbMl0pCi17Ci0gIGludCBzZWFyY2hfY291bnQgPSAwOwotICBpZiAoaG9zdCA9PSAwIHx8IGhvc3RbMF0gPT0gJ1wwJykKLSAgewotICAgIGlmIChoaW50cy0+YWlfZmxhZ3MgJiBBSV9QQVNTSVZFKQotICAgIHsKLSAgICAgIC8vIE5vIGhvc3QgYW5kIEFJX1BBU1NJVkUgaW1wbGllcyB3aWxkY2FyZCBiaW5kLgotICAgICAgc3dpdGNoIChoaW50cy0+YWlfZmFtaWx5KQotICAgICAgewotICAgICAgY2FzZSBBU0lPX09TX0RFRihBRl9JTkVUKToKLSAgICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uaG9zdCA9ICIwLjAuMC4wIjsKLSAgICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVCk7Ci0gICAgICAgICsrc2VhcmNoX2NvdW50OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQVNJT19PU19ERUYoQUZfSU5FVDYpOgotICAgICAgICBzZWFyY2hbc2VhcmNoX2NvdW50XS5ob3N0ID0gIjA6OjAiOwotICAgICAgICBzZWFyY2hbc2VhcmNoX2NvdW50XS5mYW1pbHkgPSBBU0lPX09TX0RFRihBRl9JTkVUNik7Ci0gICAgICAgICsrc2VhcmNoX2NvdW50OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQVNJT19PU19ERUYoQUZfVU5TUEVDKToKLSAgICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uaG9zdCA9ICIwOjowIjsKLSAgICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVDYpOwotICAgICAgICArK3NlYXJjaF9jb3VudDsKLSAgICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uaG9zdCA9ICIwLjAuMC4wIjsKLSAgICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVCk7Ci0gICAgICAgICsrc2VhcmNoX2NvdW50OwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gTm8gaG9zdCBhbmQgbm90IEFJX1BBU1NJVkUgbWVhbnMgY29ubmVjdCB0byBsb2NhbCBob3N0LgotICAgICAgc3dpdGNoIChoaW50cy0+YWlfZmFtaWx5KQotICAgICAgewotICAgICAgY2FzZSBBU0lPX09TX0RFRihBRl9JTkVUKToKLSAgICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uaG9zdCA9ICJsb2NhbGhvc3QiOwotICAgICAgICBzZWFyY2hbc2VhcmNoX2NvdW50XS5mYW1pbHkgPSBBU0lPX09TX0RFRihBRl9JTkVUKTsKLSAgICAgICAgKytzZWFyY2hfY291bnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBU0lPX09TX0RFRihBRl9JTkVUNik6Ci0gICAgICAgIHNlYXJjaFtzZWFyY2hfY291bnRdLmhvc3QgPSAibG9jYWxob3N0IjsKLSAgICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVDYpOwotICAgICAgICArK3NlYXJjaF9jb3VudDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFTSU9fT1NfREVGKEFGX1VOU1BFQyk6Ci0gICAgICAgIHNlYXJjaFtzZWFyY2hfY291bnRdLmhvc3QgPSAibG9jYWxob3N0IjsKLSAgICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVDYpOwotICAgICAgICArK3NlYXJjaF9jb3VudDsKLSAgICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uaG9zdCA9ICJsb2NhbGhvc3QiOwotICAgICAgICBzZWFyY2hbc2VhcmNoX2NvdW50XS5mYW1pbHkgPSBBU0lPX09TX0RFRihBRl9JTkVUKTsKLSAgICAgICAgKytzZWFyY2hfY291bnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIC8vIEhvc3QgaXMgc3BlY2lmaWVkLgotICAgIHN3aXRjaCAoaGludHMtPmFpX2ZhbWlseSkKLSAgICB7Ci0gICAgY2FzZSBBU0lPX09TX0RFRihBRl9JTkVUKToKLSAgICAgIHNlYXJjaFtzZWFyY2hfY291bnRdLmhvc3QgPSBob3N0OwotICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVCk7Ci0gICAgICArK3NlYXJjaF9jb3VudDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVNJT19PU19ERUYoQUZfSU5FVDYpOgotICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uaG9zdCA9IGhvc3Q7Ci0gICAgICBzZWFyY2hbc2VhcmNoX2NvdW50XS5mYW1pbHkgPSBBU0lPX09TX0RFRihBRl9JTkVUNik7Ci0gICAgICArK3NlYXJjaF9jb3VudDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQVNJT19PU19ERUYoQUZfVU5TUEVDKToKLSAgICAgIHNlYXJjaFtzZWFyY2hfY291bnRdLmhvc3QgPSBob3N0OwotICAgICAgc2VhcmNoW3NlYXJjaF9jb3VudF0uZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVDYpOwotICAgICAgKytzZWFyY2hfY291bnQ7Ci0gICAgICBzZWFyY2hbc2VhcmNoX2NvdW50XS5ob3N0ID0gaG9zdDsKLSAgICAgIHNlYXJjaFtzZWFyY2hfY291bnRdLmZhbWlseSA9IEFTSU9fT1NfREVGKEFGX0lORVQpOwotICAgICAgKytzZWFyY2hfY291bnQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWFyY2hfY291bnQ7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIFQqIGdhaV9hbGxvYyhzdGQ6OnNpemVfdCBzaXplID0gc2l6ZW9mKFQpKQotewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotICBUKiBwID0gc3RhdGljX2Nhc3Q8VCo+KDo6b3BlcmF0b3IgbmV3KHNpemUsIHN0ZDo6bm90aHJvdykpOwotICBpZiAocCkKLSAgICBtZW1zZXQocCwgMCwgc2l6ZSk7Ci0gIHJldHVybiBwOwotfQotCi1pbmxpbmUgdm9pZCBnYWlfZnJlZSh2b2lkKiBwKQotewotICA6Om9wZXJhdG9yIGRlbGV0ZShwKTsKLX0KLQotaW5saW5lIHZvaWQgZ2FpX3N0cmNweShjaGFyKiB0YXJnZXQsIGNvbnN0IGNoYXIqIHNvdXJjZSwgc3RkOjpzaXplX3QgbWF4X3NpemUpCi17Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0jaWYgZGVmaW5lZChBU0lPX0hBU19TRUNVUkVfUlRMKQotICBzdHJjcHlfcyh0YXJnZXQsIG1heF9zaXplLCBzb3VyY2UpOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19TRUNVUkVfUlRMKQotICAqdGFyZ2V0ID0gMDsKLSAgc3RybmNhdCh0YXJnZXQsIHNvdXJjZSwgbWF4X3NpemUpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLX0KLQotZW51bSB7IGdhaV9jbG9uZV9mbGFnID0gMSA8PCAzMCB9OwotCi1pbmxpbmUgaW50IGdhaV9haXN0cnVjdChhZGRyaW5mb190eXBlKioqIG5leHQsIGNvbnN0IGFkZHJpbmZvX3R5cGUqIGhpbnRzLAotICAgIGNvbnN0IHZvaWQqIGFkZHIsIGludCBmYW1pbHkpCi17Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLSAgYWRkcmluZm9fdHlwZSogYWkgPSBnYWlfYWxsb2M8YWRkcmluZm9fdHlwZT4oKTsKLSAgaWYgKGFpID09IDApCi0gICAgcmV0dXJuIEVBSV9NRU1PUlk7Ci0KLSAgYWktPmFpX25leHQgPSAwOwotICAqKm5leHQgPSBhaTsKLSAgKm5leHQgPSAmYWktPmFpX25leHQ7Ci0KLSAgYWktPmFpX2Nhbm9ubmFtZSA9IDA7Ci0gIGFpLT5haV9zb2NrdHlwZSA9IGhpbnRzLT5haV9zb2NrdHlwZTsKLSAgaWYgKGFpLT5haV9zb2NrdHlwZSA9PSAwKQotICAgIGFpLT5haV9mbGFncyB8PSBnYWlfY2xvbmVfZmxhZzsKLSAgYWktPmFpX3Byb3RvY29sID0gaGludHMtPmFpX3Byb3RvY29sOwotICBhaS0+YWlfZmFtaWx5ID0gZmFtaWx5OwotCi0gIHN3aXRjaCAoYWktPmFpX2ZhbWlseSkKLSAgewotICBjYXNlIEFTSU9fT1NfREVGKEFGX0lORVQpOgotICAgIHsKLSAgICAgIHNvY2thZGRyX2luNF90eXBlKiBzaW5wdHIgPSBnYWlfYWxsb2M8c29ja2FkZHJfaW40X3R5cGU+KCk7Ci0gICAgICBpZiAoc2lucHRyID09IDApCi0gICAgICAgIHJldHVybiBFQUlfTUVNT1JZOwotICAgICAgc2lucHRyLT5zaW5fZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVCk7Ci0gICAgICBtZW1jcHkoJnNpbnB0ci0+c2luX2FkZHIsIGFkZHIsIHNpemVvZihpbjRfYWRkcl90eXBlKSk7Ci0gICAgICBhaS0+YWlfYWRkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHIqPihzaW5wdHIpOwotICAgICAgYWktPmFpX2FkZHJsZW4gPSBzaXplb2Yoc29ja2FkZHJfaW40X3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBjYXNlIEFTSU9fT1NfREVGKEFGX0lORVQ2KToKLSAgICB7Ci0gICAgICBzb2NrYWRkcl9pbjZfdHlwZSogc2luNnB0ciA9IGdhaV9hbGxvYzxzb2NrYWRkcl9pbjZfdHlwZT4oKTsKLSAgICAgIGlmIChzaW42cHRyID09IDApCi0gICAgICAgIHJldHVybiBFQUlfTUVNT1JZOwotICAgICAgc2luNnB0ci0+c2luNl9mYW1pbHkgPSBBU0lPX09TX0RFRihBRl9JTkVUNik7Ci0gICAgICBtZW1jcHkoJnNpbjZwdHItPnNpbjZfYWRkciwgYWRkciwgc2l6ZW9mKGluNl9hZGRyX3R5cGUpKTsKLSAgICAgIGFpLT5haV9hZGRyID0gcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcio+KHNpbjZwdHIpOwotICAgICAgYWktPmFpX2FkZHJsZW4gPSBzaXplb2Yoc29ja2FkZHJfaW42X3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBkZWZhdWx0OgotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWlubGluZSBhZGRyaW5mb190eXBlKiBnYWlfY2xvbmUoYWRkcmluZm9fdHlwZSogYWkpCi17Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLSAgYWRkcmluZm9fdHlwZSogbmV3X2FpID0gZ2FpX2FsbG9jPGFkZHJpbmZvX3R5cGU+KCk7Ci0gIGlmIChuZXdfYWkgPT0gMCkKLSAgICByZXR1cm4gbmV3X2FpOwotCi0gIG5ld19haS0+YWlfbmV4dCA9IGFpLT5haV9uZXh0OwotICBhaS0+YWlfbmV4dCA9IG5ld19haTsKLQotICBuZXdfYWktPmFpX2ZsYWdzID0gMDsKLSAgbmV3X2FpLT5haV9mYW1pbHkgPSBhaS0+YWlfZmFtaWx5OwotICBuZXdfYWktPmFpX3NvY2t0eXBlID0gYWktPmFpX3NvY2t0eXBlOwotICBuZXdfYWktPmFpX3Byb3RvY29sID0gYWktPmFpX3Byb3RvY29sOwotICBuZXdfYWktPmFpX2Nhbm9ubmFtZSA9IDA7Ci0gIG5ld19haS0+YWlfYWRkcmxlbiA9IGFpLT5haV9hZGRybGVuOwotICBuZXdfYWktPmFpX2FkZHIgPSBnYWlfYWxsb2M8c29ja2FkZHI+KGFpLT5haV9hZGRybGVuKTsKLSAgbWVtY3B5KG5ld19haS0+YWlfYWRkciwgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKTsKLQotICByZXR1cm4gbmV3X2FpOwotfQotCi1pbmxpbmUgaW50IGdhaV9wb3J0KGFkZHJpbmZvX3R5cGUqIGFpaGVhZCwgaW50IHBvcnQsIGludCBzb2NrdHlwZSkKLXsKLSAgaW50IG51bV9mb3VuZCA9IDA7Ci0KLSAgZm9yIChhZGRyaW5mb190eXBlKiBhaSA9IGFpaGVhZDsgYWk7IGFpID0gYWktPmFpX25leHQpCi0gIHsKLSAgICBpZiAoYWktPmFpX2ZsYWdzICYgZ2FpX2Nsb25lX2ZsYWcpCi0gICAgewotICAgICAgaWYgKGFpLT5haV9zb2NrdHlwZSAhPSAwKQotICAgICAgewotICAgICAgICBhaSA9IGdhaV9jbG9uZShhaSk7Ci0gICAgICAgIGlmIChhaSA9PSAwKQotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgLy8gYWkgbm93IHBvaW50cyB0byBuZXdseSBjbG9uZWQgZW50cnkuCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGFpLT5haV9zb2NrdHlwZSAhPSBzb2NrdHlwZSkKLSAgICB7Ci0gICAgICAvLyBJZ25vcmUgaWYgbWlzbWF0Y2ggb24gc29ja2V0IHR5cGUuCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBhaS0+YWlfc29ja3R5cGUgPSBzb2NrdHlwZTsKLQotICAgIHN3aXRjaCAoYWktPmFpX2ZhbWlseSkKLSAgICB7Ci0gICAgY2FzZSBBU0lPX09TX0RFRihBRl9JTkVUKToKLSAgICAgIHsKLSAgICAgICAgc29ja2FkZHJfaW40X3R5cGUqIHNpbnB0ciA9Ci0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcl9pbjRfdHlwZSo+KGFpLT5haV9hZGRyKTsKLSAgICAgICAgc2lucHRyLT5zaW5fcG9ydCA9IHBvcnQ7Ci0gICAgICAgICsrbnVtX2ZvdW5kOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIEFTSU9fT1NfREVGKEFGX0lORVQ2KToKLSAgICAgIHsKLSAgICAgICAgc29ja2FkZHJfaW42X3R5cGUqIHNpbjZwdHIgPQotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHJfaW42X3R5cGUqPihhaS0+YWlfYWRkcik7Ci0gICAgICAgIHNpbjZwdHItPnNpbjZfcG9ydCA9IHBvcnQ7Ci0gICAgICAgICsrbnVtX2ZvdW5kOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG51bV9mb3VuZDsKLX0KLQotaW5saW5lIGludCBnYWlfc2VydihhZGRyaW5mb190eXBlKiBhaWhlYWQsCi0gICAgY29uc3QgYWRkcmluZm9fdHlwZSogaGludHMsIGNvbnN0IGNoYXIqIHNlcnYpCi17Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLSAgaW50IG51bV9mb3VuZCA9IDA7Ci0KLSAgaWYgKAotI2lmIGRlZmluZWQoQUlfTlVNRVJJQ1NFUlYpCi0gICAgICAoaGludHMtPmFpX2ZsYWdzICYgQUlfTlVNRVJJQ1NFUlYpIHx8Ci0jZW5kaWYKLSAgICAgIGlzZGlnaXQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc2VydlswXSkpKQotICB7Ci0gICAgaW50IHBvcnQgPSBodG9ucyhhdG9pKHNlcnYpKTsKLSAgICBpZiAoaGludHMtPmFpX3NvY2t0eXBlKQotICAgIHsKLSAgICAgIC8vIENhbGxlciBzcGVjaWZpZXMgc29ja2V0IHR5cGUuCi0gICAgICBpbnQgcmMgPSBnYWlfcG9ydChhaWhlYWQsIHBvcnQsIGhpbnRzLT5haV9zb2NrdHlwZSk7Ci0gICAgICBpZiAocmMgPCAwKQotICAgICAgICByZXR1cm4gRUFJX01FTU9SWTsKLSAgICAgIG51bV9mb3VuZCArPSByYzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIENhbGxlciBkb2VzIG5vdCBzcGVjaWZ5IHNvY2tldCB0eXBlLgotICAgICAgaW50IHJjID0gZ2FpX3BvcnQoYWloZWFkLCBwb3J0LCBTT0NLX1NUUkVBTSk7Ci0gICAgICBpZiAocmMgPCAwKQotICAgICAgICByZXR1cm4gRUFJX01FTU9SWTsKLSAgICAgIG51bV9mb3VuZCArPSByYzsKLSAgICAgIHJjID0gZ2FpX3BvcnQoYWloZWFkLCBwb3J0LCBTT0NLX0RHUkFNKTsKLSAgICAgIGlmIChyYyA8IDApCi0gICAgICAgIHJldHVybiBFQUlfTUVNT1JZOwotICAgICAgbnVtX2ZvdW5kICs9IHJjOwotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICAvLyBUcnkgc2VydmljZSBuYW1lIHdpdGggVENQIGZpcnN0LCB0aGVuIFVEUC4KLSAgICBpZiAoaGludHMtPmFpX3NvY2t0eXBlID09IDAgfHwgaGludHMtPmFpX3NvY2t0eXBlID09IFNPQ0tfU1RSRUFNKQotICAgIHsKLSAgICAgIHNlcnZlbnQqIHNwdHIgPSBnZXRzZXJ2YnluYW1lKHNlcnYsICJ0Y3AiKTsKLSAgICAgIGlmIChzcHRyICE9IDApCi0gICAgICB7Ci0gICAgICAgIGludCByYyA9IGdhaV9wb3J0KGFpaGVhZCwgc3B0ci0+c19wb3J0LCBTT0NLX1NUUkVBTSk7Ci0gICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgcmV0dXJuIEVBSV9NRU1PUlk7Ci0gICAgICAgIG51bV9mb3VuZCArPSByYzsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGhpbnRzLT5haV9zb2NrdHlwZSA9PSAwIHx8IGhpbnRzLT5haV9zb2NrdHlwZSA9PSBTT0NLX0RHUkFNKQotICAgIHsKLSAgICAgIHNlcnZlbnQqIHNwdHIgPSBnZXRzZXJ2YnluYW1lKHNlcnYsICJ1ZHAiKTsKLSAgICAgIGlmIChzcHRyICE9IDApCi0gICAgICB7Ci0gICAgICAgIGludCByYyA9IGdhaV9wb3J0KGFpaGVhZCwgc3B0ci0+c19wb3J0LCBTT0NLX0RHUkFNKTsKLSAgICAgICAgaWYgKHJjIDwgMCkKLSAgICAgICAgICByZXR1cm4gRUFJX01FTU9SWTsKLSAgICAgICAgbnVtX2ZvdW5kICs9IHJjOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChudW1fZm91bmQgPT0gMCkKLSAgewotICAgIGlmIChoaW50cy0+YWlfc29ja3R5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAvLyBBbGwgY2FsbHMgdG8gZ2V0c2VydmJ5bmFtZSgpIGZhaWxlZC4KLSAgICAgIHJldHVybiBFQUlfTk9OQU1FOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU2VydmljZSBub3Qgc3VwcG9ydGVkIGZvciBzb2NrZXQgdHlwZS4KLSAgICAgIHJldHVybiBFQUlfU0VSVklDRTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW5saW5lIGludCBnYWlfZWNoZWNrKGNvbnN0IGNoYXIqIGhvc3QsIGNvbnN0IGNoYXIqIHNlcnZpY2UsCi0gICAgaW50IGZsYWdzLCBpbnQgZmFtaWx5LCBpbnQgc29ja3R5cGUsIGludCBwcm90b2NvbCkKLXsKLSAgKHZvaWQpKGZsYWdzKTsKLSAgKHZvaWQpKHByb3RvY29sKTsKLQotICAvLyBIb3N0IG9yIHNlcnZpY2UgbXVzdCBiZSBzcGVjaWZpZWQuCi0gIGlmIChob3N0ID09IDAgfHwgaG9zdFswXSA9PSAnXDAnKQotICAgIGlmIChzZXJ2aWNlID09IDAgfHwgc2VydmljZVswXSA9PSAnXDAnKQotICAgICAgcmV0dXJuIEVBSV9OT05BTUU7Ci0KLSAgLy8gQ2hlY2sgY29tYmluYXRpb24gb2YgZmFtaWx5IGFuZCBzb2NrZXQgdHlwZS4KLSAgc3dpdGNoIChmYW1pbHkpCi0gIHsKLSAgY2FzZSBBU0lPX09TX0RFRihBRl9VTlNQRUMpOgotICAgIGJyZWFrOwotICBjYXNlIEFTSU9fT1NfREVGKEFGX0lORVQpOgotICBjYXNlIEFTSU9fT1NfREVGKEFGX0lORVQ2KToKLSAgICBpZiAoc2VydmljZSAhPSAwICYmIHNlcnZpY2VbMF0gIT0gJ1wwJykKLSAgICAgIGlmIChzb2NrdHlwZSAhPSAwICYmIHNvY2t0eXBlICE9IFNPQ0tfU1RSRUFNICYmIHNvY2t0eXBlICE9IFNPQ0tfREdSQU0pCi0gICAgICAgIHJldHVybiBFQUlfU09DS1RZUEU7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIEVBSV9GQU1JTFk7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW5saW5lIHZvaWQgZnJlZWFkZHJpbmZvX2VtdWxhdGlvbihhZGRyaW5mb190eXBlKiBhaWhlYWQpCi17Ci0gIGFkZHJpbmZvX3R5cGUqIGFpID0gYWloZWFkOwotICB3aGlsZSAoYWkpCi0gIHsKLSAgICBnYWlfZnJlZShhaS0+YWlfYWRkcik7Ci0gICAgZ2FpX2ZyZWUoYWktPmFpX2Nhbm9ubmFtZSk7Ci0gICAgYWRkcmluZm9fdHlwZSogYWluZXh0ID0gYWktPmFpX25leHQ7Ci0gICAgZ2FpX2ZyZWUoYWkpOwotICAgIGFpID0gYWluZXh0OwotICB9Ci19Ci0KLWlubGluZSBpbnQgZ2V0YWRkcmluZm9fZW11bGF0aW9uKGNvbnN0IGNoYXIqIGhvc3QsIGNvbnN0IGNoYXIqIHNlcnZpY2UsCi0gICAgY29uc3QgYWRkcmluZm9fdHlwZSogaGludHNwLCBhZGRyaW5mb190eXBlKiogcmVzdWx0KQotewotICAvLyBTZXQgdXAgbGlua2VkIGxpc3Qgb2YgYWRkcmluZm8gc3RydWN0dXJlcy4KLSAgYWRkcmluZm9fdHlwZSogYWloZWFkID0gMDsKLSAgYWRkcmluZm9fdHlwZSoqIGFpbmV4dCA9ICZhaWhlYWQ7Ci0gIGNoYXIqIGNhbm9uID0gMDsKLQotICAvLyBTdXBwbHkgZGVmYXVsdCBoaW50cyBpZiBub3Qgc3BlY2lmaWVkIGJ5IGNhbGxlci4KLSAgYWRkcmluZm9fdHlwZSBoaW50cyA9IGFkZHJpbmZvX3R5cGUoKTsKLSAgaGludHMuYWlfZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfVU5TUEVDKTsKLSAgaWYgKGhpbnRzcCkKLSAgICBoaW50cyA9ICpoaW50c3A7Ci0KLSAgLy8gSWYgdGhlIHJlc29sdXRpb24gaXMgbm90IHNwZWNpZmljYWxseSBmb3IgQUZfSU5FVDYsIHJlbW92ZSB0aGUgQUlfVjRNQVBQRUQKLSAgLy8gYW5kIEFJX0FMTCBmbGFncy4KLSNpZiBkZWZpbmVkKEFJX1Y0TUFQUEVEKQotICBpZiAoaGludHMuYWlfZmFtaWx5ICE9IEFTSU9fT1NfREVGKEFGX0lORVQ2KSkKLSAgICBoaW50cy5haV9mbGFncyAmPSB+QUlfVjRNQVBQRUQ7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKEFJX0FMTCkKLSAgaWYgKGhpbnRzLmFpX2ZhbWlseSAhPSBBU0lPX09TX0RFRihBRl9JTkVUNikpCi0gICAgaGludHMuYWlfZmxhZ3MgJj0gfkFJX0FMTDsKLSNlbmRpZgotCi0gIC8vIEJhc2ljIGVycm9yIGNoZWNraW5nLgotICBpbnQgcmMgPSBnYWlfZWNoZWNrKGhvc3QsIHNlcnZpY2UsIGhpbnRzLmFpX2ZsYWdzLCBoaW50cy5haV9mYW1pbHksCi0gICAgICBoaW50cy5haV9zb2NrdHlwZSwgaGludHMuYWlfcHJvdG9jb2wpOwotICBpZiAocmMgIT0gMCkKLSAgewotICAgIGZyZWVhZGRyaW5mb19lbXVsYXRpb24oYWloZWFkKTsKLSAgICByZXR1cm4gcmM7Ci0gIH0KLQotICBnYWlfc2VhcmNoIHNlYXJjaFsyXTsKLSAgaW50IHNlYXJjaF9jb3VudCA9IGdhaV9uc2VhcmNoKGhvc3QsICZoaW50cywgc2VhcmNoKTsKLSAgZm9yIChnYWlfc2VhcmNoKiBzcHRyID0gc2VhcmNoOyBzcHRyIDwgc2VhcmNoICsgc2VhcmNoX2NvdW50OyArK3NwdHIpCi0gIHsKLSAgICAvLyBDaGVjayBmb3IgSVB2NCBkb3R0ZWQgZGVjaW1hbCBzdHJpbmcuCi0gICAgaW40X2FkZHJfdHlwZSBpbmFkZHI7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBpZiAoc29ja2V0X29wczo6aW5ldF9wdG9uKEFTSU9fT1NfREVGKEFGX0lORVQpLAotICAgICAgICAgIHNwdHItPmhvc3QsICZpbmFkZHIsIDAsIGVjKSA9PSAxKQotICAgIHsKLSAgICAgIGlmIChoaW50cy5haV9mYW1pbHkgIT0gQVNJT19PU19ERUYoQUZfVU5TUEVDKQotICAgICAgICAgICYmIGhpbnRzLmFpX2ZhbWlseSAhPSBBU0lPX09TX0RFRihBRl9JTkVUKSkKLSAgICAgIHsKLSAgICAgICAgZnJlZWFkZHJpbmZvX2VtdWxhdGlvbihhaWhlYWQpOwotICAgICAgICBnYWlfZnJlZShjYW5vbik7Ci0gICAgICAgIHJldHVybiBFQUlfRkFNSUxZOwotICAgICAgfQotICAgICAgaWYgKHNwdHItPmZhbWlseSA9PSBBU0lPX09TX0RFRihBRl9JTkVUKSkKLSAgICAgIHsKLSAgICAgICAgcmMgPSBnYWlfYWlzdHJ1Y3QoJmFpbmV4dCwgJmhpbnRzLCAmaW5hZGRyLCBBU0lPX09TX0RFRihBRl9JTkVUKSk7Ci0gICAgICAgIGlmIChyYyAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgZnJlZWFkZHJpbmZvX2VtdWxhdGlvbihhaWhlYWQpOwotICAgICAgICAgIGdhaV9mcmVlKGNhbm9uKTsKLSAgICAgICAgICByZXR1cm4gcmM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIENoZWNrIGZvciBJUHY2IGhleCBzdHJpbmcuCi0gICAgaW42X2FkZHJfdHlwZSBpbjZhZGRyOwotICAgIGlmIChzb2NrZXRfb3BzOjppbmV0X3B0b24oQVNJT19PU19ERUYoQUZfSU5FVDYpLAotICAgICAgICAgIHNwdHItPmhvc3QsICZpbjZhZGRyLCAwLCBlYykgPT0gMSkKLSAgICB7Ci0gICAgICBpZiAoaGludHMuYWlfZmFtaWx5ICE9IEFTSU9fT1NfREVGKEFGX1VOU1BFQykKLSAgICAgICAgICAmJiBoaW50cy5haV9mYW1pbHkgIT0gQVNJT19PU19ERUYoQUZfSU5FVDYpKQotICAgICAgewotICAgICAgICBmcmVlYWRkcmluZm9fZW11bGF0aW9uKGFpaGVhZCk7Ci0gICAgICAgIGdhaV9mcmVlKGNhbm9uKTsKLSAgICAgICAgcmV0dXJuIEVBSV9GQU1JTFk7Ci0gICAgICB9Ci0gICAgICBpZiAoc3B0ci0+ZmFtaWx5ID09IEFTSU9fT1NfREVGKEFGX0lORVQ2KSkKLSAgICAgIHsKLSAgICAgICAgcmMgPSBnYWlfYWlzdHJ1Y3QoJmFpbmV4dCwgJmhpbnRzLCAmaW42YWRkciwKLSAgICAgICAgICAgIEFTSU9fT1NfREVGKEFGX0lORVQ2KSk7Ci0gICAgICAgIGlmIChyYyAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgZnJlZWFkZHJpbmZvX2VtdWxhdGlvbihhaWhlYWQpOwotICAgICAgICAgIGdhaV9mcmVlKGNhbm9uKTsKLSAgICAgICAgICByZXR1cm4gcmM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIExvb2sgdXAgaG9zdG5hbWUuCi0gICAgaG9zdGVudCBoZW50OwotICAgIGNoYXIgaGJ1Zls4MTkyXSA9ICIiOwotICAgIGhvc3RlbnQqIGhwdHIgPSBzb2NrZXRfb3BzOjpnZXRob3N0YnluYW1lKHNwdHItPmhvc3QsCi0gICAgICAgIHNwdHItPmZhbWlseSwgJmhlbnQsIGhidWYsIHNpemVvZihoYnVmKSwgaGludHMuYWlfZmxhZ3MsIGVjKTsKLSAgICBpZiAoaHB0ciA9PSAwKQotICAgIHsKLSAgICAgIGlmIChzZWFyY2hfY291bnQgPT0gMikKLSAgICAgIHsKLSAgICAgICAgLy8gRmFpbHVyZSBpcyBPSyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc2VhcmNoZXMuCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZnJlZWFkZHJpbmZvX2VtdWxhdGlvbihhaWhlYWQpOwotICAgICAgZ2FpX2ZyZWUoY2Fub24pOwotICAgICAgaWYgKGVjID09IGFzaW86OmVycm9yOjpob3N0X25vdF9mb3VuZCkKLSAgICAgICAgcmV0dXJuIEVBSV9OT05BTUU7Ci0gICAgICBpZiAoZWMgPT0gYXNpbzo6ZXJyb3I6Omhvc3Rfbm90X2ZvdW5kX3RyeV9hZ2FpbikKLSAgICAgICAgcmV0dXJuIEVBSV9BR0FJTjsKLSAgICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6bm9fcmVjb3ZlcnkpCi0gICAgICAgIHJldHVybiBFQUlfRkFJTDsKLSAgICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6bm9fZGF0YSkKLSAgICAgICAgcmV0dXJuIEVBSV9OT05BTUU7Ci0gICAgICByZXR1cm4gRUFJX05PTkFNRTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBmb3IgYWRkcmVzcyBmYW1pbHkgbWlzbWF0Y2ggaWYgb25lIHdhcyBzcGVjaWZpZWQuCi0gICAgaWYgKGhpbnRzLmFpX2ZhbWlseSAhPSBBU0lPX09TX0RFRihBRl9VTlNQRUMpCi0gICAgICAgICYmIGhpbnRzLmFpX2ZhbWlseSAhPSBocHRyLT5oX2FkZHJ0eXBlKQotICAgIHsKLSAgICAgIGZyZWVhZGRyaW5mb19lbXVsYXRpb24oYWloZWFkKTsKLSAgICAgIGdhaV9mcmVlKGNhbm9uKTsKLSAgICAgIHNvY2tldF9vcHM6OmZyZWVob3N0ZW50KGhwdHIpOwotICAgICAgcmV0dXJuIEVBSV9GQU1JTFk7Ci0gICAgfQotCi0gICAgLy8gU2F2ZSBjYW5vbmljYWwgbmFtZSBmaXJzdCB0aW1lLgotICAgIGlmIChob3N0ICE9IDAgJiYgaG9zdFswXSAhPSAnXDAnICYmIGhwdHItPmhfbmFtZSAmJiBocHRyLT5oX25hbWVbMF0KLSAgICAgICAgJiYgKGhpbnRzLmFpX2ZsYWdzICYgQUlfQ0FOT05OQU1FKSAmJiBjYW5vbiA9PSAwKQotICAgIHsKLSAgICAgIHN0ZDo6c2l6ZV90IGNhbm9uX2xlbiA9IHN0cmxlbihocHRyLT5oX25hbWUpICsgMTsKLSAgICAgIGNhbm9uID0gZ2FpX2FsbG9jPGNoYXI+KGNhbm9uX2xlbik7Ci0gICAgICBpZiAoY2Fub24gPT0gMCkKLSAgICAgIHsKLSAgICAgICAgZnJlZWFkZHJpbmZvX2VtdWxhdGlvbihhaWhlYWQpOwotICAgICAgICBzb2NrZXRfb3BzOjpmcmVlaG9zdGVudChocHRyKTsKLSAgICAgICAgcmV0dXJuIEVBSV9NRU1PUlk7Ci0gICAgICB9Ci0gICAgICBnYWlfc3RyY3B5KGNhbm9uLCBocHRyLT5oX25hbWUsIGNhbm9uX2xlbik7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIGFuIGFkZHJpbmZvIHN0cnVjdHVyZSBmb3IgZWFjaCByZXR1cm5lZCBhZGRyZXNzLgotICAgIGZvciAoY2hhcioqIGFwID0gaHB0ci0+aF9hZGRyX2xpc3Q7ICphcDsgKythcCkKLSAgICB7Ci0gICAgICByYyA9IGdhaV9haXN0cnVjdCgmYWluZXh0LCAmaGludHMsICphcCwgaHB0ci0+aF9hZGRydHlwZSk7Ci0gICAgICBpZiAocmMgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgZnJlZWFkZHJpbmZvX2VtdWxhdGlvbihhaWhlYWQpOwotICAgICAgICBnYWlfZnJlZShjYW5vbik7Ci0gICAgICAgIHNvY2tldF9vcHM6OmZyZWVob3N0ZW50KGhwdHIpOwotICAgICAgICByZXR1cm4gRUFJX0ZBTUlMWTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzb2NrZXRfb3BzOjpmcmVlaG9zdGVudChocHRyKTsKLSAgfQotCi0gIC8vIENoZWNrIGlmIHdlIGZvdW5kIGFueXRoaW5nLgotICBpZiAoYWloZWFkID09IDApCi0gIHsKLSAgICBnYWlfZnJlZShjYW5vbik7Ci0gICAgcmV0dXJuIEVBSV9OT05BTUU7Ci0gIH0KLQotICAvLyBSZXR1cm4gY2Fub25pY2FsIG5hbWUgaW4gZmlyc3QgZW50cnkuCi0gIGlmIChob3N0ICE9IDAgJiYgaG9zdFswXSAhPSAnXDAnICYmIChoaW50cy5haV9mbGFncyAmIEFJX0NBTk9OTkFNRSkpCi0gIHsKLSAgICBpZiAoY2Fub24pCi0gICAgewotICAgICAgYWloZWFkLT5haV9jYW5vbm5hbWUgPSBjYW5vbjsKLSAgICAgIGNhbm9uID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN0ZDo6c2l6ZV90IGNhbm9ubmFtZV9sZW4gPSBzdHJsZW4oc2VhcmNoWzBdLmhvc3QpICsgMTsKLSAgICAgIGFpaGVhZC0+YWlfY2Fub25uYW1lID0gZ2FpX2FsbG9jPGNoYXI+KGNhbm9ubmFtZV9sZW4pOwotICAgICAgaWYgKGFpaGVhZC0+YWlfY2Fub25uYW1lID09IDApCi0gICAgICB7Ci0gICAgICAgIGZyZWVhZGRyaW5mb19lbXVsYXRpb24oYWloZWFkKTsKLSAgICAgICAgcmV0dXJuIEVBSV9NRU1PUlk7Ci0gICAgICB9Ci0gICAgICBnYWlfc3RyY3B5KGFpaGVhZC0+YWlfY2Fub25uYW1lLCBzZWFyY2hbMF0uaG9zdCwgY2Fub25uYW1lX2xlbik7Ci0gICAgfQotICB9Ci0gIGdhaV9mcmVlKGNhbm9uKTsKLQotICAvLyBQcm9jZXNzIHRoZSBzZXJ2aWNlIG5hbWUuCi0gIGlmIChzZXJ2aWNlICE9IDAgJiYgc2VydmljZVswXSAhPSAnXDAnKQotICB7Ci0gICAgcmMgPSBnYWlfc2VydihhaWhlYWQsICZoaW50cywgc2VydmljZSk7Ci0gICAgaWYgKHJjICE9IDApCi0gICAgewotICAgICAgZnJlZWFkZHJpbmZvX2VtdWxhdGlvbihhaWhlYWQpOwotICAgICAgcmV0dXJuIHJjOwotICAgIH0KLSAgfQotCi0gIC8vIFJldHVybiByZXN1bHQgdG8gY2FsbGVyLgotICAqcmVzdWx0ID0gYWloZWFkOwotICByZXR1cm4gMDsKLX0KLQotaW5saW5lIGFzaW86OmVycm9yX2NvZGUgZ2V0bmFtZWluZm9fZW11bGF0aW9uKAotICAgIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIHNhLCBzdGQ6OnNpemVfdCBzYWxlbiwgY2hhciogaG9zdCwKLSAgICBzdGQ6OnNpemVfdCBob3N0bGVuLCBjaGFyKiBzZXJ2LCBzdGQ6OnNpemVfdCBzZXJ2bGVuLCBpbnQgZmxhZ3MsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLSAgY29uc3QgY2hhciogYWRkcjsKLSAgc2l6ZV90IGFkZHJfbGVuOwotICB1bnNpZ25lZCBzaG9ydCBwb3J0OwotICBzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpCi0gIHsKLSAgY2FzZSBBU0lPX09TX0RFRihBRl9JTkVUKToKLSAgICBpZiAoc2FsZW4gIT0gc2l6ZW9mKHNvY2thZGRyX2luNF90eXBlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICB9Ci0gICAgYWRkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KAotICAgICAgICAmcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzb2NrYWRkcl9pbjRfdHlwZSo+KHNhKS0+c2luX2FkZHIpOwotICAgIGFkZHJfbGVuID0gc2l6ZW9mKGluNF9hZGRyX3R5cGUpOwotICAgIHBvcnQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHNvY2thZGRyX2luNF90eXBlKj4oc2EpLT5zaW5fcG9ydDsKLSAgICBicmVhazsKLSAgY2FzZSBBU0lPX09TX0RFRihBRl9JTkVUNik6Ci0gICAgaWYgKHNhbGVuICE9IHNpemVvZihzb2NrYWRkcl9pbjZfdHlwZSkpCi0gICAgewotICAgICAgcmV0dXJuIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgfQotICAgIGFkZHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigKLSAgICAgICAgJnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc29ja2FkZHJfaW42X3R5cGUqPihzYSktPnNpbjZfYWRkcik7Ci0gICAgYWRkcl9sZW4gPSBzaXplb2YoaW42X2FkZHJfdHlwZSk7Ci0gICAgcG9ydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc29ja2FkZHJfaW42X3R5cGUqPihzYSktPnNpbjZfcG9ydDsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZWMgPSBhc2lvOjplcnJvcjo6YWRkcmVzc19mYW1pbHlfbm90X3N1cHBvcnRlZDsKLSAgfQotCi0gIGlmIChob3N0ICYmIGhvc3RsZW4gPiAwKQotICB7Ci0gICAgaWYgKGZsYWdzICYgTklfTlVNRVJJQ0hPU1QpCi0gICAgewotICAgICAgaWYgKHNvY2tldF9vcHM6OmluZXRfbnRvcChzYS0+c2FfZmFtaWx5LCBhZGRyLCBob3N0LCBob3N0bGVuLCAwLCBlYykgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGVjOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaG9zdGVudCBoZW50OwotICAgICAgY2hhciBoYnVmWzgxOTJdID0gIiI7Ci0gICAgICBob3N0ZW50KiBocHRyID0gc29ja2V0X29wczo6Z2V0aG9zdGJ5YWRkcihhZGRyLAotICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYWRkcl9sZW4pLCBzYS0+c2FfZmFtaWx5LAotICAgICAgICAgICZoZW50LCBoYnVmLCBzaXplb2YoaGJ1ZiksIGVjKTsKLSAgICAgIGlmIChocHRyICYmIGhwdHItPmhfbmFtZSAmJiBocHRyLT5oX25hbWVbMF0gIT0gJ1wwJykKLSAgICAgIHsKLSAgICAgICAgaWYgKGZsYWdzICYgTklfTk9GUUROKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciogZG90ID0gc3RyY2hyKGhwdHItPmhfbmFtZSwgJy4nKTsKLSAgICAgICAgICBpZiAoZG90KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICpkb3QgPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnYWlfc3RyY3B5KGhvc3QsIGhwdHItPmhfbmFtZSwgaG9zdGxlbik7Ci0gICAgICAgIHNvY2tldF9vcHM6OmZyZWVob3N0ZW50KGhwdHIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzb2NrZXRfb3BzOjpmcmVlaG9zdGVudChocHRyKTsKLSAgICAgICAgaWYgKGZsYWdzICYgTklfTkFNRVJFUUQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZWMgPSBhc2lvOjplcnJvcjo6aG9zdF9ub3RfZm91bmQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvY2tldF9vcHM6OmluZXRfbnRvcChzYS0+c2FfZmFtaWx5LAotICAgICAgICAgICAgICBhZGRyLCBob3N0LCBob3N0bGVuLCAwLCBlYykgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBlYzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChzZXJ2ICYmIHNlcnZsZW4gPiAwKQotICB7Ci0gICAgaWYgKGZsYWdzICYgTklfTlVNRVJJQ1NFUlYpCi0gICAgewotICAgICAgaWYgKHNlcnZsZW4gPCA2KQotICAgICAgewotICAgICAgICByZXR1cm4gZWMgPSBhc2lvOjplcnJvcjo6bm9fYnVmZmVyX3NwYWNlOwotICAgICAgfQotI2lmIGRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLSAgICAgIHNwcmludGZfcyhzZXJ2LCBzZXJ2bGVuLCAiJXUiLCBudG9ocyhwb3J0KSk7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1NFQ1VSRV9SVEwpCi0gICAgICBzcHJpbnRmKHNlcnYsICIldSIsIG50b2hzKHBvcnQpKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NFQ1VSRV9SVEwpCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0jaWYgZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLSAgICAgIHN0YXRpYyA6OnB0aHJlYWRfbXV0ZXhfdCBtdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci0gICAgICA6OnB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi0gICAgICBzZXJ2ZW50KiBzcHRyID0gOjpnZXRzZXJ2Ynlwb3J0KHBvcnQsIChmbGFncyAmIE5JX0RHUkFNKSA/ICJ1ZHAiIDogMCk7Ci0gICAgICBpZiAoc3B0ciAmJiBzcHRyLT5zX25hbWUgJiYgc3B0ci0+c19uYW1lWzBdICE9ICdcMCcpCi0gICAgICB7Ci0gICAgICAgIGdhaV9zdHJjcHkoc2Vydiwgc3B0ci0+c19uYW1lLCBzZXJ2bGVuKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlcnZsZW4gPCA2KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGVjID0gYXNpbzo6ZXJyb3I6Om5vX2J1ZmZlcl9zcGFjZTsKLSAgICAgICAgfQotI2lmIGRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLSAgICAgICAgc3ByaW50Zl9zKHNlcnYsIHNlcnZsZW4sICIldSIsIG50b2hzKHBvcnQpKTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLSAgICAgICAgc3ByaW50ZihzZXJ2LCAiJXUiLCBudG9ocyhwb3J0KSk7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TRUNVUkVfUlRMKQotICAgICAgfQotI2lmIGRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi0gICAgICA6OnB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLSAgICB9Ci0gIH0KLQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfR0VUQUREUklORk8pCi0KLWlubGluZSBhc2lvOjplcnJvcl9jb2RlIHRyYW5zbGF0ZV9hZGRyaW5mb19lcnJvcihpbnQgZXJyb3IpCi17Ci0gIHN3aXRjaCAoZXJyb3IpCi0gIHsKLSAgY2FzZSAwOgotICAgIHJldHVybiBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIGNhc2UgRUFJX0FHQUlOOgotICAgIHJldHVybiBhc2lvOjplcnJvcjo6aG9zdF9ub3RfZm91bmRfdHJ5X2FnYWluOwotICBjYXNlIEVBSV9CQURGTEFHUzoKLSAgICByZXR1cm4gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gIGNhc2UgRUFJX0ZBSUw6Ci0gICAgcmV0dXJuIGFzaW86OmVycm9yOjpub19yZWNvdmVyeTsKLSAgY2FzZSBFQUlfRkFNSUxZOgotICAgIHJldHVybiBhc2lvOjplcnJvcjo6YWRkcmVzc19mYW1pbHlfbm90X3N1cHBvcnRlZDsKLSAgY2FzZSBFQUlfTUVNT1JZOgotICAgIHJldHVybiBhc2lvOjplcnJvcjo6bm9fbWVtb3J5OwotICBjYXNlIEVBSV9OT05BTUU6Ci0jaWYgZGVmaW5lZChFQUlfQUREUkZBTUlMWSkKLSAgY2FzZSBFQUlfQUREUkZBTUlMWToKLSNlbmRpZgotI2lmIGRlZmluZWQoRUFJX05PREFUQSkgJiYgKEVBSV9OT0RBVEEgIT0gRUFJX05PTkFNRSkKLSAgY2FzZSBFQUlfTk9EQVRBOgotI2VuZGlmCi0gICAgcmV0dXJuIGFzaW86OmVycm9yOjpob3N0X25vdF9mb3VuZDsKLSAgY2FzZSBFQUlfU0VSVklDRToKLSAgICByZXR1cm4gYXNpbzo6ZXJyb3I6OnNlcnZpY2Vfbm90X2ZvdW5kOwotICBjYXNlIEVBSV9TT0NLVFlQRToKLSAgICByZXR1cm4gYXNpbzo6ZXJyb3I6OnNvY2tldF90eXBlX25vdF9zdXBwb3J0ZWQ7Ci0gIGRlZmF1bHQ6IC8vIFBvc3NpYmx5IHRoZSBub24tcG9ydGFibGUgRUFJX1NZU1RFTS4KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAgIHJldHVybiBhc2lvOjplcnJvcl9jb2RlKAotICAgICAgICBXU0FHZXRMYXN0RXJyb3IoKSwgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0jZWxzZQotICAgIHJldHVybiBhc2lvOjplcnJvcl9jb2RlKAotICAgICAgICBlcnJubywgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0jZW5kaWYKLSAgfQotfQotCi1hc2lvOjplcnJvcl9jb2RlIGdldGFkZHJpbmZvKGNvbnN0IGNoYXIqIGhvc3QsCi0gICAgY29uc3QgY2hhciogc2VydmljZSwgY29uc3QgYWRkcmluZm9fdHlwZSYgaGludHMsCi0gICAgYWRkcmluZm9fdHlwZSoqIHJlc3VsdCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGhvc3QgPSAoaG9zdCAmJiAqaG9zdCkgPyBob3N0IDogMDsKLSAgc2VydmljZSA9IChzZXJ2aWNlICYmICpzZXJ2aWNlKSA/IHNlcnZpY2UgOiAwOwotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSMgaWYgZGVmaW5lZChBU0lPX0hBU19HRVRBRERSSU5GTykKLSAgLy8gQnVpbGRpbmcgZm9yIFdpbmRvd3MgWFAsIFdpbmRvd3MgU2VydmVyIDIwMDMsIG9yIGxhdGVyLgotICBpbnQgZXJyb3IgPSA6OmdldGFkZHJpbmZvKGhvc3QsIHNlcnZpY2UsICZoaW50cywgcmVzdWx0KTsKLSAgcmV0dXJuIGVjID0gdHJhbnNsYXRlX2FkZHJpbmZvX2Vycm9yKGVycm9yKTsKLSMgZWxzZQotICAvLyBCdWlsZGluZyBmb3IgV2luZG93cyAyMDAwIG9yIGVhcmxpZXIuCi0gIHR5cGVkZWYgaW50IChXU0FBUEkgKmdhaV90KShjb25zdCBjaGFyKiwKLSAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBhZGRyaW5mb190eXBlKiwgYWRkcmluZm9fdHlwZSoqKTsKLSAgaWYgKEhNT0RVTEUgd2luc29ja19tb2R1bGUgPSA6OkdldE1vZHVsZUhhbmRsZUEoIndzMl8zMiIpKQotICB7Ci0gICAgaWYgKGdhaV90IGdhaSA9IChnYWlfdCk6OkdldFByb2NBZGRyZXNzKHdpbnNvY2tfbW9kdWxlLCAiZ2V0YWRkcmluZm8iKSkKLSAgICB7Ci0gICAgICBpbnQgZXJyb3IgPSBnYWkoaG9zdCwgc2VydmljZSwgJmhpbnRzLCByZXN1bHQpOwotICAgICAgcmV0dXJuIGVjID0gdHJhbnNsYXRlX2FkZHJpbmZvX2Vycm9yKGVycm9yKTsKLSAgICB9Ci0gIH0KLSAgaW50IGVycm9yID0gZ2V0YWRkcmluZm9fZW11bGF0aW9uKGhvc3QsIHNlcnZpY2UsICZoaW50cywgcmVzdWx0KTsKLSAgcmV0dXJuIGVjID0gdHJhbnNsYXRlX2FkZHJpbmZvX2Vycm9yKGVycm9yKTsKLSMgZW5kaWYKLSNlbGlmICFkZWZpbmVkKEFTSU9fSEFTX0dFVEFERFJJTkZPKQotICBpbnQgZXJyb3IgPSBnZXRhZGRyaW5mb19lbXVsYXRpb24oaG9zdCwgc2VydmljZSwgJmhpbnRzLCByZXN1bHQpOwotICByZXR1cm4gZWMgPSB0cmFuc2xhdGVfYWRkcmluZm9fZXJyb3IoZXJyb3IpOwotI2Vsc2UKLSAgaW50IGVycm9yID0gOjpnZXRhZGRyaW5mbyhob3N0LCBzZXJ2aWNlLCAmaGludHMsIHJlc3VsdCk7Ci0gIHJldHVybiBlYyA9IHRyYW5zbGF0ZV9hZGRyaW5mb19lcnJvcihlcnJvcik7Ci0jZW5kaWYKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBiYWNrZ3JvdW5kX2dldGFkZHJpbmZvKAotICAgIGNvbnN0IHdlYWtfY2FuY2VsX3Rva2VuX3R5cGUmIGNhbmNlbF90b2tlbiwgY29uc3QgY2hhciogaG9zdCwKLSAgICBjb25zdCBjaGFyKiBzZXJ2aWNlLCBjb25zdCBhZGRyaW5mb190eXBlJiBoaW50cywKLSAgICBhZGRyaW5mb190eXBlKiogcmVzdWx0LCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGNhbmNlbF90b2tlbi5leHBpcmVkKCkpCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQ7Ci0gIGVsc2UKLSAgICBzb2NrZXRfb3BzOjpnZXRhZGRyaW5mbyhob3N0LCBzZXJ2aWNlLCBoaW50cywgcmVzdWx0LCBlYyk7Ci0gIHJldHVybiBlYzsKLX0KLQotdm9pZCBmcmVlYWRkcmluZm8oYWRkcmluZm9fdHlwZSogYWkpCi17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSMgaWYgZGVmaW5lZChBU0lPX0hBU19HRVRBRERSSU5GTykKLSAgLy8gQnVpbGRpbmcgZm9yIFdpbmRvd3MgWFAsIFdpbmRvd3MgU2VydmVyIDIwMDMsIG9yIGxhdGVyLgotICA6OmZyZWVhZGRyaW5mbyhhaSk7Ci0jIGVsc2UKLSAgLy8gQnVpbGRpbmcgZm9yIFdpbmRvd3MgMjAwMCBvciBlYXJsaWVyLgotICB0eXBlZGVmIGludCAoV1NBQVBJICpmYWlfdCkoYWRkcmluZm9fdHlwZSopOwotICBpZiAoSE1PRFVMRSB3aW5zb2NrX21vZHVsZSA9IDo6R2V0TW9kdWxlSGFuZGxlQSgid3MyXzMyIikpCi0gIHsKLSAgICBpZiAoZmFpX3QgZmFpID0gKGZhaV90KTo6R2V0UHJvY0FkZHJlc3Mod2luc29ja19tb2R1bGUsICJmcmVlYWRkcmluZm8iKSkKLSAgICB7Ci0gICAgICBmYWkoYWkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBmcmVlYWRkcmluZm9fZW11bGF0aW9uKGFpKTsKLSMgZW5kaWYKLSNlbGlmICFkZWZpbmVkKEFTSU9fSEFTX0dFVEFERFJJTkZPKQotICBmcmVlYWRkcmluZm9fZW11bGF0aW9uKGFpKTsKLSNlbHNlCi0gIDo6ZnJlZWFkZHJpbmZvKGFpKTsKLSNlbmRpZgotfQotCi1hc2lvOjplcnJvcl9jb2RlIGdldG5hbWVpbmZvKGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsCi0gICAgc3RkOjpzaXplX3QgYWRkcmxlbiwgY2hhciogaG9zdCwgc3RkOjpzaXplX3QgaG9zdGxlbiwKLSAgICBjaGFyKiBzZXJ2LCBzdGQ6OnNpemVfdCBzZXJ2bGVuLCBpbnQgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jIGlmIGRlZmluZWQoQVNJT19IQVNfR0VUQUREUklORk8pCi0gIC8vIEJ1aWxkaW5nIGZvciBXaW5kb3dzIFhQLCBXaW5kb3dzIFNlcnZlciAyMDAzLCBvciBsYXRlci4KLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotICBpbnQgZXJyb3IgPSA6OmdldG5hbWVpbmZvKGFkZHIsIHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oYWRkcmxlbiksCi0gICAgICBob3N0LCBzdGF0aWNfY2FzdDxEV09SRD4oaG9zdGxlbiksCi0gICAgICBzZXJ2LCBzdGF0aWNfY2FzdDxEV09SRD4oc2VydmxlbiksIGZsYWdzKTsKLSAgcmV0dXJuIGVjID0gdHJhbnNsYXRlX2FkZHJpbmZvX2Vycm9yKGVycm9yKTsKLSMgZWxzZQotICAvLyBCdWlsZGluZyBmb3IgV2luZG93cyAyMDAwIG9yIGVhcmxpZXIuCi0gIHR5cGVkZWYgaW50IChXU0FBUEkgKmduaV90KShjb25zdCBzb2NrZXRfYWRkcl90eXBlKiwKLSAgICAgIGludCwgY2hhciosIERXT1JELCBjaGFyKiwgRFdPUkQsIGludCk7Ci0gIGlmIChITU9EVUxFIHdpbnNvY2tfbW9kdWxlID0gOjpHZXRNb2R1bGVIYW5kbGVBKCJ3czJfMzIiKSkKLSAgewotICAgIGlmIChnbmlfdCBnbmkgPSAoZ25pX3QpOjpHZXRQcm9jQWRkcmVzcyh3aW5zb2NrX21vZHVsZSwgImdldG5hbWVpbmZvIikpCi0gICAgewotICAgICAgY2xlYXJfbGFzdF9lcnJvcigpOwotICAgICAgaW50IGVycm9yID0gZ25pKGFkZHIsIHN0YXRpY19jYXN0PGludD4oYWRkcmxlbiksCi0gICAgICAgICAgaG9zdCwgc3RhdGljX2Nhc3Q8RFdPUkQ+KGhvc3RsZW4pLAotICAgICAgICAgIHNlcnYsIHN0YXRpY19jYXN0PERXT1JEPihzZXJ2bGVuKSwgZmxhZ3MpOwotICAgICAgcmV0dXJuIGVjID0gdHJhbnNsYXRlX2FkZHJpbmZvX2Vycm9yKGVycm9yKTsKLSAgICB9Ci0gIH0KLSAgY2xlYXJfbGFzdF9lcnJvcigpOwotICByZXR1cm4gZ2V0bmFtZWluZm9fZW11bGF0aW9uKGFkZHIsIGFkZHJsZW4sCi0gICAgICBob3N0LCBob3N0bGVuLCBzZXJ2LCBzZXJ2bGVuLCBmbGFncywgZWMpOwotIyBlbmRpZgotI2VsaWYgIWRlZmluZWQoQVNJT19IQVNfR0VUQUREUklORk8pCi0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1jcHkuCi0gIHNvY2thZGRyX3N0b3JhZ2VfdHlwZSB0bXBfYWRkcjsKLSAgbWVtY3B5KCZ0bXBfYWRkciwgYWRkciwgYWRkcmxlbik7Ci0gIHRtcF9hZGRyLnNzX2xlbiA9IGFkZHJsZW47Ci0gIGFkZHIgPSByZWludGVycHJldF9jYXN0PHNvY2tldF9hZGRyX3R5cGUqPigmdG1wX2FkZHIpOwotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0gIHJldHVybiBnZXRuYW1laW5mb19lbXVsYXRpb24oYWRkciwgYWRkcmxlbiwKLSAgICAgIGhvc3QsIGhvc3RsZW4sIHNlcnYsIHNlcnZsZW4sIGZsYWdzLCBlYyk7Ci0jZWxzZQotICBjbGVhcl9sYXN0X2Vycm9yKCk7Ci0gIGludCBlcnJvciA9IDo6Z2V0bmFtZWluZm8oYWRkciwgYWRkcmxlbiwgaG9zdCwgaG9zdGxlbiwgc2Vydiwgc2VydmxlbiwgZmxhZ3MpOwotICByZXR1cm4gZWMgPSB0cmFuc2xhdGVfYWRkcmluZm9fZXJyb3IoZXJyb3IpOwotI2VuZGlmCi19Ci0KLWFzaW86OmVycm9yX2NvZGUgc3luY19nZXRuYW1laW5mbygKLSAgICBjb25zdCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLCBzdGQ6OnNpemVfdCBhZGRybGVuLAotICAgIGNoYXIqIGhvc3QsIHN0ZDo6c2l6ZV90IGhvc3RsZW4sIGNoYXIqIHNlcnYsCi0gICAgc3RkOjpzaXplX3Qgc2VydmxlbiwgaW50IHNvY2tfdHlwZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIC8vIEZpcnN0IHRyeSByZXNvbHZpbmcgd2l0aCB0aGUgc2VydmljZSBuYW1lLiBJZiB0aGF0IGZhaWxzIHRyeSByZXNvbHZpbmcKLSAgLy8gYnV0IGFsbG93IHRoZSBzZXJ2aWNlIHRvIGJlIHJldHVybmVkIGFzIGEgbnVtYmVyLgotICBpbnQgZmxhZ3MgPSAoc29ja190eXBlID09IFNPQ0tfREdSQU0pID8gTklfREdSQU0gOiAwOwotICBzb2NrZXRfb3BzOjpnZXRuYW1laW5mbyhhZGRyLCBhZGRybGVuLCBob3N0LAotICAgICAgaG9zdGxlbiwgc2Vydiwgc2VydmxlbiwgZmxhZ3MsIGVjKTsKLSAgaWYgKGVjKQotICB7Ci0gICAgc29ja2V0X29wczo6Z2V0bmFtZWluZm8oYWRkciwgYWRkcmxlbiwgaG9zdCwgaG9zdGxlbiwKLSAgICAgICAgc2Vydiwgc2VydmxlbiwgZmxhZ3MgfCBOSV9OVU1FUklDU0VSViwgZWMpOwotICB9Ci0KLSAgcmV0dXJuIGVjOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIGJhY2tncm91bmRfZ2V0bmFtZWluZm8oCi0gICAgY29uc3Qgd2Vha19jYW5jZWxfdG9rZW5fdHlwZSYgY2FuY2VsX3Rva2VuLAotICAgIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsIHN0ZDo6c2l6ZV90IGFkZHJsZW4sCi0gICAgY2hhciogaG9zdCwgc3RkOjpzaXplX3QgaG9zdGxlbiwgY2hhciogc2VydiwKLSAgICBzdGQ6OnNpemVfdCBzZXJ2bGVuLCBpbnQgc29ja190eXBlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGNhbmNlbF90b2tlbi5leHBpcmVkKCkpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICAvLyBGaXJzdCB0cnkgcmVzb2x2aW5nIHdpdGggdGhlIHNlcnZpY2UgbmFtZS4gSWYgdGhhdCBmYWlscyB0cnkgcmVzb2x2aW5nCi0gICAgLy8gYnV0IGFsbG93IHRoZSBzZXJ2aWNlIHRvIGJlIHJldHVybmVkIGFzIGEgbnVtYmVyLgotICAgIGludCBmbGFncyA9IChzb2NrX3R5cGUgPT0gU09DS19ER1JBTSkgPyBOSV9ER1JBTSA6IDA7Ci0gICAgc29ja2V0X29wczo6Z2V0bmFtZWluZm8oYWRkciwgYWRkcmxlbiwgaG9zdCwKLSAgICAgICAgaG9zdGxlbiwgc2Vydiwgc2VydmxlbiwgZmxhZ3MsIGVjKTsKLSAgICBpZiAoZWMpCi0gICAgewotICAgICAgc29ja2V0X29wczo6Z2V0bmFtZWluZm8oYWRkciwgYWRkcmxlbiwgaG9zdCwgaG9zdGxlbiwKLSAgICAgICAgICBzZXJ2LCBzZXJ2bGVuLCBmbGFncyB8IE5JX05VTUVSSUNTRVJWLCBlYyk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGVjOwotfQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLXVfbG9uZ190eXBlIG5ldHdvcmtfdG9faG9zdF9sb25nKHVfbG9uZ190eXBlIHZhbHVlKQotewotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gIHVuc2lnbmVkIGNoYXIqIHZhbHVlX3AgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigmdmFsdWUpOwotICB1X2xvbmdfdHlwZSByZXN1bHQgPSAoc3RhdGljX2Nhc3Q8dV9sb25nX3R5cGU+KHZhbHVlX3BbMF0pIDw8IDI0KQotICAgIHwgKHN0YXRpY19jYXN0PHVfbG9uZ190eXBlPih2YWx1ZV9wWzFdKSA8PCAxNikKLSAgICB8IChzdGF0aWNfY2FzdDx1X2xvbmdfdHlwZT4odmFsdWVfcFsyXSkgPDwgOCkKLSAgICB8IHN0YXRpY19jYXN0PHVfbG9uZ190eXBlPih2YWx1ZV9wWzNdKTsKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gIHJldHVybiBudG9obCh2YWx1ZSk7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLX0KLQotdV9sb25nX3R5cGUgaG9zdF90b19uZXR3b3JrX2xvbmcodV9sb25nX3R5cGUgdmFsdWUpCi17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgdV9sb25nX3R5cGUgcmVzdWx0OwotICB1bnNpZ25lZCBjaGFyKiByZXN1bHRfcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KCZyZXN1bHQpOwotICByZXN1bHRfcFswXSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKLSAgcmVzdWx0X3BbMV0gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0gIHJlc3VsdF9wWzJdID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKHZhbHVlID4+IDgpICYgMHhGRik7Ci0gIHJlc3VsdF9wWzNdID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4odmFsdWUgJiAweEZGKTsKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gIHJldHVybiBodG9ubCh2YWx1ZSk7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLX0KLQotdV9zaG9ydF90eXBlIG5ldHdvcmtfdG9faG9zdF9zaG9ydCh1X3Nob3J0X3R5cGUgdmFsdWUpCi17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgdW5zaWduZWQgY2hhciogdmFsdWVfcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KCZ2YWx1ZSk7Ci0gIHVfc2hvcnRfdHlwZSByZXN1bHQgPSAoc3RhdGljX2Nhc3Q8dV9zaG9ydF90eXBlPih2YWx1ZV9wWzBdKSA8PCA4KQotICAgIHwgc3RhdGljX2Nhc3Q8dV9zaG9ydF90eXBlPih2YWx1ZV9wWzFdKTsKLSAgcmV0dXJuIHJlc3VsdDsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gIHJldHVybiBudG9ocyh2YWx1ZSk7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLX0KLQotdV9zaG9ydF90eXBlIGhvc3RfdG9fbmV0d29ya19zaG9ydCh1X3Nob3J0X3R5cGUgdmFsdWUpCi17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgdV9zaG9ydF90eXBlIHJlc3VsdDsKLSAgdW5zaWduZWQgY2hhciogcmVzdWx0X3AgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigmcmVzdWx0KTsKLSAgcmVzdWx0X3BbMF0gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigodmFsdWUgPj4gOCkgJiAweEZGKTsKLSAgcmVzdWx0X3BbMV0gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPih2YWx1ZSAmIDB4RkYpOwotICByZXR1cm4gcmVzdWx0OwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgcmV0dXJuIGh0b25zKHZhbHVlKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotfQotCi19IC8vIG5hbWVzcGFjZSBzb2NrZXRfb3BzCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NPQ0tFVF9PUFNfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlci5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlci5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYzBmYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3NvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXIuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC9zb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9TT0NLRVRfU0VMRUNUX0lOVEVSUlVQVEVSX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1NPQ0tFVF9TRUxFQ1RfSU5URVJSVVBURVJfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSBcCi0gIHx8IGRlZmluZWQoX19DWUdXSU5fXykgXAotICB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9ob2xkZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1zb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyOjpzb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyKCkKLXsKLSAgb3Blbl9kZXNjcmlwdG9ycygpOwotfQotCi12b2lkIHNvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXI6Om9wZW5fZGVzY3JpcHRvcnMoKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBzb2NrZXRfaG9sZGVyIGFjY2VwdG9yKHNvY2tldF9vcHM6OnNvY2tldCgKLSAgICAgICAgQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCBlYykpOwotICBpZiAoYWNjZXB0b3IuZ2V0KCkgPT0gaW52YWxpZF9zb2NrZXQpCi0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXIiKTsKLQotICBpbnQgb3B0ID0gMTsKLSAgc29ja2V0X29wczo6c3RhdGVfdHlwZSBhY2NlcHRvcl9zdGF0ZSA9IDA7Ci0gIHNvY2tldF9vcHM6OnNldHNvY2tvcHQoYWNjZXB0b3IuZ2V0KCksIGFjY2VwdG9yX3N0YXRlLAotICAgICAgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb3B0LCBzaXplb2Yob3B0KSwgZWMpOwotCi0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1zZXQuCi0gIHNvY2thZGRyX2luNF90eXBlIGFkZHI7Ci0gIHN0ZDo6c2l6ZV90IGFkZHJfbGVuID0gc2l6ZW9mKGFkZHIpOwotICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIGFkZHIuc2luX2FkZHIuc19hZGRyID0gc29ja2V0X29wczo6aG9zdF90b19uZXR3b3JrX2xvbmcoSU5BRERSX0xPT1BCQUNLKTsKLSAgYWRkci5zaW5fcG9ydCA9IDA7Ci0gIGlmIChzb2NrZXRfb3BzOjpiaW5kKGFjY2VwdG9yLmdldCgpLCAoY29uc3Qgc29ja2V0X2FkZHJfdHlwZSopJmFkZHIsCi0gICAgICAgIGFkZHJfbGVuLCBlYykgPT0gc29ja2V0X2Vycm9yX3JldHZhbCkKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlciIpOwotCi0gIGlmIChzb2NrZXRfb3BzOjpnZXRzb2NrbmFtZShhY2NlcHRvci5nZXQoKSwgKHNvY2tldF9hZGRyX3R5cGUqKSZhZGRyLAotICAgICAgICAmYWRkcl9sZW4sIGVjKSA9PSBzb2NrZXRfZXJyb3JfcmV0dmFsKQotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyIik7Ci0KLSAgLy8gU29tZSBicm9rZW4gZmlyZXdhbGxzIG9uIFdpbmRvd3Mgd2lsbCBpbnRlcm1pdHRlbnRseSBjYXVzZSBnZXRzb2NrbmFtZSB0bwotICAvLyByZXR1cm4gMC4wLjAuMCB3aGVuIHRoZSBzb2NrZXQgaXMgYWN0dWFsbHkgYm91bmQgdG8gMTI3LjAuMC4xLiBXZQotICAvLyBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHRhcmdldCBhZGRyZXNzIGhlcmUgdG8gd29yayBhcm91bmQgdGhpcyBwcm9ibGVtLgotICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IHNvY2tldF9vcHM6Omhvc3RfdG9fbmV0d29ya19sb25nKElOQUREUl9MT09QQkFDSyk7Ci0KLSAgaWYgKHNvY2tldF9vcHM6Omxpc3RlbihhY2NlcHRvci5nZXQoKSwKLSAgICAgICAgU09NQVhDT05OLCBlYykgPT0gc29ja2V0X2Vycm9yX3JldHZhbCkKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlciIpOwotCi0gIHNvY2tldF9ob2xkZXIgY2xpZW50KHNvY2tldF9vcHM6OnNvY2tldCgKLSAgICAgICAgQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCBlYykpOwotICBpZiAoY2xpZW50LmdldCgpID09IGludmFsaWRfc29ja2V0KQotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyIik7Ci0KLSAgaWYgKHNvY2tldF9vcHM6OmNvbm5lY3QoY2xpZW50LmdldCgpLCAoY29uc3Qgc29ja2V0X2FkZHJfdHlwZSopJmFkZHIsCi0gICAgICAgIGFkZHJfbGVuLCBlYykgPT0gc29ja2V0X2Vycm9yX3JldHZhbCkKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlciIpOwotCi0gIHNvY2tldF9ob2xkZXIgc2VydmVyKHNvY2tldF9vcHM6OmFjY2VwdChhY2NlcHRvci5nZXQoKSwgMCwgMCwgZWMpKTsKLSAgaWYgKHNlcnZlci5nZXQoKSA9PSBpbnZhbGlkX3NvY2tldCkKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlciIpOwotICAKLSAgaW9jdGxfYXJnX3R5cGUgbm9uX2Jsb2NraW5nID0gMTsKLSAgc29ja2V0X29wczo6c3RhdGVfdHlwZSBjbGllbnRfc3RhdGUgPSAwOwotICBpZiAoc29ja2V0X29wczo6aW9jdGwoY2xpZW50LmdldCgpLCBjbGllbnRfc3RhdGUsCi0gICAgICAgIEZJT05CSU8sICZub25fYmxvY2tpbmcsIGVjKSkKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlciIpOwotCi0gIG9wdCA9IDE7Ci0gIHNvY2tldF9vcHM6OnNldHNvY2tvcHQoY2xpZW50LmdldCgpLCBjbGllbnRfc3RhdGUsCi0gICAgICBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZvcHQsIHNpemVvZihvcHQpLCBlYyk7Ci0KLSAgbm9uX2Jsb2NraW5nID0gMTsKLSAgc29ja2V0X29wczo6c3RhdGVfdHlwZSBzZXJ2ZXJfc3RhdGUgPSAwOwotICBpZiAoc29ja2V0X29wczo6aW9jdGwoc2VydmVyLmdldCgpLCBzZXJ2ZXJfc3RhdGUsCi0gICAgICAgIEZJT05CSU8sICZub25fYmxvY2tpbmcsIGVjKSkKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlciIpOwotCi0gIG9wdCA9IDE7Ci0gIHNvY2tldF9vcHM6OnNldHNvY2tvcHQoc2VydmVyLmdldCgpLCBzZXJ2ZXJfc3RhdGUsCi0gICAgICBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZvcHQsIHNpemVvZihvcHQpLCBlYyk7Ci0KLSAgcmVhZF9kZXNjcmlwdG9yXyA9IHNlcnZlci5yZWxlYXNlKCk7Ci0gIHdyaXRlX2Rlc2NyaXB0b3JfID0gY2xpZW50LnJlbGVhc2UoKTsKLX0KLQotc29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlcjo6fnNvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXIoKQotewotICBjbG9zZV9kZXNjcmlwdG9ycygpOwotfQotCi12b2lkIHNvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXI6OmNsb3NlX2Rlc2NyaXB0b3JzKCkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc29ja2V0X29wczo6c3RhdGVfdHlwZSBzdGF0ZSA9IHNvY2tldF9vcHM6OmludGVybmFsX25vbl9ibG9ja2luZzsKLSAgaWYgKHJlYWRfZGVzY3JpcHRvcl8gIT0gaW52YWxpZF9zb2NrZXQpCi0gICAgc29ja2V0X29wczo6Y2xvc2UocmVhZF9kZXNjcmlwdG9yXywgc3RhdGUsIHRydWUsIGVjKTsKLSAgaWYgKHdyaXRlX2Rlc2NyaXB0b3JfICE9IGludmFsaWRfc29ja2V0KQotICAgIHNvY2tldF9vcHM6OmNsb3NlKHdyaXRlX2Rlc2NyaXB0b3JfLCBzdGF0ZSwgdHJ1ZSwgZWMpOwotfQotCi12b2lkIHNvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXI6OnJlY3JlYXRlKCkKLXsKLSAgY2xvc2VfZGVzY3JpcHRvcnMoKTsKLQotICB3cml0ZV9kZXNjcmlwdG9yXyA9IGludmFsaWRfc29ja2V0OwotICByZWFkX2Rlc2NyaXB0b3JfID0gaW52YWxpZF9zb2NrZXQ7Ci0KLSAgb3Blbl9kZXNjcmlwdG9ycygpOwotfQotCi12b2lkIHNvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXI6OmludGVycnVwdCgpCi17Ci0gIGNoYXIgYnl0ZSA9IDA7Ci0gIHNvY2tldF9vcHM6OmJ1ZiBiOwotICBzb2NrZXRfb3BzOjppbml0X2J1ZihiLCAmYnl0ZSwgMSk7Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHNvY2tldF9vcHM6OnNlbmQod3JpdGVfZGVzY3JpcHRvcl8sICZiLCAxLCAwLCBlYyk7Ci19Ci0KLWJvb2wgc29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlcjo6cmVzZXQoKQotewotICBjaGFyIGRhdGFbMTAyNF07Ci0gIHNvY2tldF9vcHM6OmJ1ZiBiOwotICBzb2NrZXRfb3BzOjppbml0X2J1ZihiLCBkYXRhLCBzaXplb2YoZGF0YSkpOwotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBpbnQgYnl0ZXNfcmVhZCA9IHNvY2tldF9vcHM6OnJlY3YocmVhZF9kZXNjcmlwdG9yXywgJmIsIDEsIDAsIGVjKTsKLSAgYm9vbCB3YXNfaW50ZXJydXB0ZWQgPSAoYnl0ZXNfcmVhZCA+IDApOwotICB3aGlsZSAoYnl0ZXNfcmVhZCA9PSBzaXplb2YoZGF0YSkpCi0gICAgYnl0ZXNfcmVhZCA9IHNvY2tldF9vcHM6OnJlY3YocmVhZF9kZXNjcmlwdG9yXywgJmIsIDEsIDAsIGVjKTsKLSAgcmV0dXJuIHdhc19pbnRlcnJ1cHRlZDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAvLyB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICAgLy8gfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX1NPQ0tFVF9TRUxFQ1RfSU5URVJSVVBURVJfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc3RyYW5kX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3N0cmFuZF9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0Yjc3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc3RyYW5kX3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC9zdHJhbmRfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1NUUkFORF9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1NUUkFORF9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NhbGxfc3RhY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbXBsZXRpb25faGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWlubGluZSBzdHJhbmRfc2VydmljZTo6c3RyYW5kX2ltcGw6OnN0cmFuZF9pbXBsKCkKLSAgOiBvcGVyYXRpb24oJnN0cmFuZF9zZXJ2aWNlOjpkb19jb21wbGV0ZSksCi0gICAgbG9ja2VkXyhmYWxzZSkKLXsKLX0KLQotc3RydWN0IHN0cmFuZF9zZXJ2aWNlOjpvbl9kaXNwYXRjaF9leGl0Ci17Ci0gIGlvX3NlcnZpY2VfaW1wbCogaW9fc2VydmljZV87Ci0gIHN0cmFuZF9pbXBsKiBpbXBsXzsKLQotICB+b25fZGlzcGF0Y2hfZXhpdCgpCi0gIHsKLSAgICBpbXBsXy0+bXV0ZXhfLmxvY2soKTsKLSAgICBpbXBsXy0+cmVhZHlfcXVldWVfLnB1c2goaW1wbF8tPndhaXRpbmdfcXVldWVfKTsKLSAgICBib29sIG1vcmVfaGFuZGxlcnMgPSBpbXBsXy0+bG9ja2VkXyA9ICFpbXBsXy0+cmVhZHlfcXVldWVfLmVtcHR5KCk7Ci0gICAgaW1wbF8tPm11dGV4Xy51bmxvY2soKTsKLQotICAgIGlmIChtb3JlX2hhbmRsZXJzKQotICAgICAgaW9fc2VydmljZV8tPnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24oaW1wbF8sIGZhbHNlKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci12b2lkIHN0cmFuZF9zZXJ2aWNlOjpkaXNwYXRjaChzdHJhbmRfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBIYW5kbGVyJiBoYW5kbGVyKQotewotICAvLyBJZiB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgc3RyYW5kIHRoZW4gdGhlIGhhbmRsZXIgY2FuIHJ1biBpbW1lZGlhdGVseS4KLSAgaWYgKGNhbGxfc3RhY2s8c3RyYW5kX2ltcGw+Ojpjb250YWlucyhpbXBsKSkKLSAgewotICAgIGZlbmNlZF9ibG9jayBiKGZlbmNlZF9ibG9jazo6ZnVsbCk7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoaGFuZGxlciwgaGFuZGxlcik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgdHlwZWRlZiBjb21wbGV0aW9uX2hhbmRsZXI8SGFuZGxlcj4gb3A7Ci0gIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgcC5wID0gbmV3IChwLnYpIG9wKGhhbmRsZXIpOwotCi0gIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAic3RyYW5kIiwgaW1wbCwgImRpc3BhdGNoIikpOwotCi0gIGJvb2wgZGlzcGF0Y2hfaW1tZWRpYXRlbHkgPSBkb19kaXNwYXRjaChpbXBsLCBwLnApOwotICBvcGVyYXRpb24qIG8gPSBwLnA7Ci0gIHAudiA9IHAucCA9IDA7Ci0KLSAgaWYgKGRpc3BhdGNoX2ltbWVkaWF0ZWx5KQotICB7Ci0gICAgLy8gSW5kaWNhdGUgdGhhdCB0aGlzIHN0cmFuZCBpcyBleGVjdXRpbmcgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgotICAgIGNhbGxfc3RhY2s8c3RyYW5kX2ltcGw+Ojpjb250ZXh0IGN0eChpbXBsKTsKLQotICAgIC8vIEVuc3VyZSB0aGUgbmV4dCBoYW5kbGVyLCBpZiBhbnksIGlzIHNjaGVkdWxlZCBvbiBibG9jayBleGl0LgotICAgIG9uX2Rpc3BhdGNoX2V4aXQgb25fZXhpdCA9IHsgJmlvX3NlcnZpY2VfLCBpbXBsIH07Ci0gICAgKHZvaWQpb25fZXhpdDsKLQotICAgIGNvbXBsZXRpb25faGFuZGxlcjxIYW5kbGVyPjo6ZG9fY29tcGxldGUoCi0gICAgICAgICZpb19zZXJ2aWNlXywgbywgYXNpbzo6ZXJyb3JfY29kZSgpLCAwKTsKLSAgfQotfQotCi0vLyBSZXF1ZXN0IHRoZSBpb19zZXJ2aWNlIHRvIGludm9rZSB0aGUgZ2l2ZW4gaGFuZGxlciBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci12b2lkIHN0cmFuZF9zZXJ2aWNlOjpwb3N0KHN0cmFuZF9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIEhhbmRsZXImIGhhbmRsZXIpCi17Ci0gIGJvb2wgaXNfY29udGludWF0aW9uID0KLSAgICBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oaGFuZGxlcik7Ci0KLSAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgdHlwZWRlZiBjb21wbGV0aW9uX2hhbmRsZXI8SGFuZGxlcj4gb3A7Ci0gIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgcC5wID0gbmV3IChwLnYpIG9wKGhhbmRsZXIpOwotCi0gIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAic3RyYW5kIiwgaW1wbCwgInBvc3QiKSk7Ci0KLSAgZG9fcG9zdChpbXBsLCBwLnAsIGlzX2NvbnRpbnVhdGlvbik7Ci0gIHAudiA9IHAucCA9IDA7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9TVFJBTkRfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9zdHJhbmRfc2VydmljZS5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvc3RyYW5kX3NlcnZpY2UuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTlkYTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC9zdHJhbmRfc2VydmljZS5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3N0cmFuZF9zZXJ2aWNlLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfU1RSQU5EX1NFUlZJQ0VfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfU1RSQU5EX1NFUlZJQ0VfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY2FsbF9zdGFjay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc3RyYW5kX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXN0cnVjdCBzdHJhbmRfc2VydmljZTo6b25fZG9fY29tcGxldGVfZXhpdAotewotICBpb19zZXJ2aWNlX2ltcGwqIG93bmVyXzsKLSAgc3RyYW5kX2ltcGwqIGltcGxfOwotCi0gIH5vbl9kb19jb21wbGV0ZV9leGl0KCkKLSAgewotICAgIGltcGxfLT5tdXRleF8ubG9jaygpOwotICAgIGltcGxfLT5yZWFkeV9xdWV1ZV8ucHVzaChpbXBsXy0+d2FpdGluZ19xdWV1ZV8pOwotICAgIGJvb2wgbW9yZV9oYW5kbGVycyA9IGltcGxfLT5sb2NrZWRfID0gIWltcGxfLT5yZWFkeV9xdWV1ZV8uZW1wdHkoKTsKLSAgICBpbXBsXy0+bXV0ZXhfLnVubG9jaygpOwotCi0gICAgaWYgKG1vcmVfaGFuZGxlcnMpCi0gICAgICBvd25lcl8tPnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24oaW1wbF8sIHRydWUpOwotICB9Ci19OwotCi1zdHJhbmRfc2VydmljZTo6c3RyYW5kX3NlcnZpY2UoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxzdHJhbmRfc2VydmljZT4oaW9fc2VydmljZSksCi0gICAgaW9fc2VydmljZV8oYXNpbzo6dXNlX3NlcnZpY2U8aW9fc2VydmljZV9pbXBsPihpb19zZXJ2aWNlKSksCi0gICAgbXV0ZXhfKCksCi0gICAgc2FsdF8oMCkKLXsKLX0KLQotdm9pZCBzdHJhbmRfc2VydmljZTo6c2h1dGRvd25fc2VydmljZSgpCi17Ci0gIG9wX3F1ZXVlPG9wZXJhdGlvbj4gb3BzOwotCi0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLQotICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbnVtX2ltcGxlbWVudGF0aW9uczsgKytpKQotICB7Ci0gICAgaWYgKHN0cmFuZF9pbXBsKiBpbXBsID0gaW1wbGVtZW50YXRpb25zX1tpXS5nZXQoKSkKLSAgICB7Ci0gICAgICBvcHMucHVzaChpbXBsLT53YWl0aW5nX3F1ZXVlXyk7Ci0gICAgICBvcHMucHVzaChpbXBsLT5yZWFkeV9xdWV1ZV8pOwotICAgIH0KLSAgfQotfQotCi12b2lkIHN0cmFuZF9zZXJ2aWNlOjpjb25zdHJ1Y3Qoc3RyYW5kX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi17Ci0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLQotICBzdGQ6OnNpemVfdCBzYWx0ID0gc2FsdF8rKzsKLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX1NFUVVFTlRJQUxfU1RSQU5EX0FMTE9DQVRJT04pCi0gIHN0ZDo6c2l6ZV90IGluZGV4ID0gc2FsdDsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfU0VRVUVOVElBTF9TVFJBTkRfQUxMT0NBVElPTikKLSAgc3RkOjpzaXplX3QgaW5kZXggPSByZWludGVycHJldF9jYXN0PHN0ZDo6c2l6ZV90PigmaW1wbCk7Ci0gIGluZGV4ICs9IChyZWludGVycHJldF9jYXN0PHN0ZDo6c2l6ZV90PigmaW1wbCkgPj4gMyk7Ci0gIGluZGV4IF49IHNhbHQgKyAweDllMzc3OWI5ICsgKGluZGV4IDw8IDYpICsgKGluZGV4ID4+IDIpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfU0VRVUVOVElBTF9TVFJBTkRfQUxMT0NBVElPTikKLSAgaW5kZXggPSBpbmRleCAlIG51bV9pbXBsZW1lbnRhdGlvbnM7Ci0KLSAgaWYgKCFpbXBsZW1lbnRhdGlvbnNfW2luZGV4XS5nZXQoKSkKLSAgICBpbXBsZW1lbnRhdGlvbnNfW2luZGV4XS5yZXNldChuZXcgc3RyYW5kX2ltcGwpOwotICBpbXBsID0gaW1wbGVtZW50YXRpb25zX1tpbmRleF0uZ2V0KCk7Ci19Ci0KLWJvb2wgc3RyYW5kX3NlcnZpY2U6OnJ1bm5pbmdfaW5fdGhpc190aHJlYWQoCi0gICAgY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLXsKLSAgcmV0dXJuIGNhbGxfc3RhY2s8c3RyYW5kX2ltcGw+Ojpjb250YWlucyhpbXBsKSAhPSAwOwotfQotCi1ib29sIHN0cmFuZF9zZXJ2aWNlOjpkb19kaXNwYXRjaChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBvcGVyYXRpb24qIG9wKQotewotICAvLyBJZiB3ZSBhcmUgcnVubmluZyBpbnNpZGUgdGhlIGlvX3NlcnZpY2UsIGFuZCBubyBvdGhlciBoYW5kbGVyIGFscmVhZHkKLSAgLy8gaG9sZHMgdGhlIHN0cmFuZCBsb2NrLCB0aGVuIHRoZSBoYW5kbGVyIGNhbiBydW4gaW1tZWRpYXRlbHkuCi0gIGJvb2wgY2FuX2Rpc3BhdGNoID0gaW9fc2VydmljZV8uY2FuX2Rpc3BhdGNoKCk7Ci0gIGltcGwtPm11dGV4Xy5sb2NrKCk7Ci0gIGlmIChjYW5fZGlzcGF0Y2ggJiYgIWltcGwtPmxvY2tlZF8pCi0gIHsKLSAgICAvLyBJbW1lZGlhdGUgaW52b2NhdGlvbiBpcyBhbGxvd2VkLgotICAgIGltcGwtPmxvY2tlZF8gPSB0cnVlOwotICAgIGltcGwtPm11dGV4Xy51bmxvY2soKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChpbXBsLT5sb2NrZWRfKQotICB7Ci0gICAgLy8gU29tZSBvdGhlciBoYW5kbGVyIGFscmVhZHkgaG9sZHMgdGhlIHN0cmFuZCBsb2NrLiBFbnF1ZXVlIGZvciBsYXRlci4KLSAgICBpbXBsLT53YWl0aW5nX3F1ZXVlXy5wdXNoKG9wKTsKLSAgICBpbXBsLT5tdXRleF8udW5sb2NrKCk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgLy8gVGhlIGhhbmRsZXIgaXMgYWNxdWlyaW5nIHRoZSBzdHJhbmQgbG9jayBhbmQgc28gaXMgcmVzcG9uc2libGUgZm9yCi0gICAgLy8gc2NoZWR1bGluZyB0aGUgc3RyYW5kLgotICAgIGltcGwtPmxvY2tlZF8gPSB0cnVlOwotICAgIGltcGwtPm11dGV4Xy51bmxvY2soKTsKLSAgICBpbXBsLT5yZWFkeV9xdWV1ZV8ucHVzaChvcCk7Ci0gICAgaW9fc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihpbXBsLCBmYWxzZSk7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgc3RyYW5kX3NlcnZpY2U6OmRvX3Bvc3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBvcGVyYXRpb24qIG9wLCBib29sIGlzX2NvbnRpbnVhdGlvbikKLXsKLSAgaW1wbC0+bXV0ZXhfLmxvY2soKTsKLSAgaWYgKGltcGwtPmxvY2tlZF8pCi0gIHsKLSAgICAvLyBTb21lIG90aGVyIGhhbmRsZXIgYWxyZWFkeSBob2xkcyB0aGUgc3RyYW5kIGxvY2suIEVucXVldWUgZm9yIGxhdGVyLgotICAgIGltcGwtPndhaXRpbmdfcXVldWVfLnB1c2gob3ApOwotICAgIGltcGwtPm11dGV4Xy51bmxvY2soKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICAvLyBUaGUgaGFuZGxlciBpcyBhY3F1aXJpbmcgdGhlIHN0cmFuZCBsb2NrIGFuZCBzbyBpcyByZXNwb25zaWJsZSBmb3IKLSAgICAvLyBzY2hlZHVsaW5nIHRoZSBzdHJhbmQuCi0gICAgaW1wbC0+bG9ja2VkXyA9IHRydWU7Ci0gICAgaW1wbC0+bXV0ZXhfLnVubG9jaygpOwotICAgIGltcGwtPnJlYWR5X3F1ZXVlXy5wdXNoKG9wKTsKLSAgICBpb19zZXJ2aWNlXy5wb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKGltcGwsIGlzX2NvbnRpbnVhdGlvbik7Ci0gIH0KLX0KLQotdm9pZCBzdHJhbmRfc2VydmljZTo6ZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLCBzdGQ6OnNpemVfdCAvKmJ5dGVzX3RyYW5zZmVycmVkKi8pCi17Ci0gIGlmIChvd25lcikKLSAgewotICAgIHN0cmFuZF9pbXBsKiBpbXBsID0gc3RhdGljX2Nhc3Q8c3RyYW5kX2ltcGwqPihiYXNlKTsKLQotICAgIC8vIEluZGljYXRlIHRoYXQgdGhpcyBzdHJhbmQgaXMgZXhlY3V0aW5nIG9uIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgICBjYWxsX3N0YWNrPHN0cmFuZF9pbXBsPjo6Y29udGV4dCBjdHgoaW1wbCk7Ci0KLSAgICAvLyBFbnN1cmUgdGhlIG5leHQgaGFuZGxlciwgaWYgYW55LCBpcyBzY2hlZHVsZWQgb24gYmxvY2sgZXhpdC4KLSAgICBvbl9kb19jb21wbGV0ZV9leGl0IG9uX2V4aXQgPSB7IG93bmVyLCBpbXBsIH07Ci0gICAgKHZvaWQpb25fZXhpdDsKLQotICAgIC8vIFJ1biBhbGwgcmVhZHkgaGFuZGxlcnMuIE5vIGxvY2sgaXMgcmVxdWlyZWQgc2luY2UgdGhlIHJlYWR5IHF1ZXVlIGlzCi0gICAgLy8gYWNjZXNzZWQgb25seSB3aXRoaW4gdGhlIHN0cmFuZC4KLSAgICB3aGlsZSAob3BlcmF0aW9uKiBvID0gaW1wbC0+cmVhZHlfcXVldWVfLmZyb250KCkpCi0gICAgewotICAgICAgaW1wbC0+cmVhZHlfcXVldWVfLnBvcCgpOwotICAgICAgby0+Y29tcGxldGUoKm93bmVyLCBlYywgMCk7Ci0gICAgfQotICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9TVFJBTkRfU0VSVklDRV9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC90YXNrX2lvX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Rhc2tfaW9fc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjkzNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Rhc2tfaW9fc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvdGFza19pb19zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1RBU0tfSU9fU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9UQVNLX0lPX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29tcGxldGlvbl9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9jb250X2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotdm9pZCB0YXNrX2lvX3NlcnZpY2U6OmRpc3BhdGNoKEhhbmRsZXImIGhhbmRsZXIpCi17Ci0gIGlmICh0aHJlYWRfY2FsbF9zdGFjazo6Y29udGFpbnModGhpcykpCi0gIHsKLSAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmZ1bGwpOwotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiBjb21wbGV0aW9uX2hhbmRsZXI8SGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgImlvX3NlcnZpY2UiLCB0aGlzLCAiZGlzcGF0Y2giKSk7Ci0KLSAgICBkb19kaXNwYXRjaChwLnApOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci12b2lkIHRhc2tfaW9fc2VydmljZTo6cG9zdChIYW5kbGVyJiBoYW5kbGVyKQotewotICBib29sIGlzX2NvbnRpbnVhdGlvbiA9Ci0gICAgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotCi0gIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gIHR5cGVkZWYgY29tcGxldGlvbl9oYW5kbGVyPEhhbmRsZXI+IG9wOwotICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gIHAucCA9IG5ldyAocC52KSBvcChoYW5kbGVyKTsKLQotICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgImlvX3NlcnZpY2UiLCB0aGlzLCAicG9zdCIpKTsKLQotICBwb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKHAucCwgaXNfY29udGludWF0aW9uKTsKLSAgcC52ID0gcC5wID0gMDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX1RBU0tfSU9fU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC90YXNrX2lvX3NlcnZpY2UuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Rhc2tfaW9fc2VydmljZS5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YmE2NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Rhc2tfaW9fc2VydmljZS5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3Rhc2tfaW9fc2VydmljZS5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9UQVNLX0lPX1NFUlZJQ0VfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfVEFTS19JT19TRVJWSUNFX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2V2ZW50LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9saW1pdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rhc2tfaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGFza19pb19zZXJ2aWNlX3RocmVhZF9pbmZvLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1zdHJ1Y3QgdGFza19pb19zZXJ2aWNlOjp0YXNrX2NsZWFudXAKLXsKLSAgfnRhc2tfY2xlYW51cCgpCi0gIHsKLSAgICBpZiAodGhpc190aHJlYWRfLT5wcml2YXRlX291dHN0YW5kaW5nX3dvcmsgPiAwKQotICAgIHsKLSAgICAgIGFzaW86OmRldGFpbDo6aW5jcmVtZW50KAotICAgICAgICAgIHRhc2tfaW9fc2VydmljZV8tPm91dHN0YW5kaW5nX3dvcmtfLAotICAgICAgICAgIHRoaXNfdGhyZWFkXy0+cHJpdmF0ZV9vdXRzdGFuZGluZ193b3JrKTsKLSAgICB9Ci0gICAgdGhpc190aHJlYWRfLT5wcml2YXRlX291dHN0YW5kaW5nX3dvcmsgPSAwOwotCi0gICAgLy8gRW5xdWV1ZSB0aGUgY29tcGxldGVkIG9wZXJhdGlvbnMgYW5kIHJlaW5zZXJ0IHRoZSB0YXNrIGF0IHRoZSBlbmQgb2YKLSAgICAvLyB0aGUgb3BlcmF0aW9uIHF1ZXVlLgotICAgIGxvY2tfLT5sb2NrKCk7Ci0gICAgdGFza19pb19zZXJ2aWNlXy0+dGFza19pbnRlcnJ1cHRlZF8gPSB0cnVlOwotICAgIHRhc2tfaW9fc2VydmljZV8tPm9wX3F1ZXVlXy5wdXNoKHRoaXNfdGhyZWFkXy0+cHJpdmF0ZV9vcF9xdWV1ZSk7Ci0gICAgdGFza19pb19zZXJ2aWNlXy0+b3BfcXVldWVfLnB1c2goJnRhc2tfaW9fc2VydmljZV8tPnRhc2tfb3BlcmF0aW9uXyk7Ci0gIH0KLQotICB0YXNrX2lvX3NlcnZpY2UqIHRhc2tfaW9fc2VydmljZV87Ci0gIG11dGV4OjpzY29wZWRfbG9jayogbG9ja187Ci0gIHRocmVhZF9pbmZvKiB0aGlzX3RocmVhZF87Ci19OwotCi1zdHJ1Y3QgdGFza19pb19zZXJ2aWNlOjp3b3JrX2NsZWFudXAKLXsKLSAgfndvcmtfY2xlYW51cCgpCi0gIHsKLSAgICBpZiAodGhpc190aHJlYWRfLT5wcml2YXRlX291dHN0YW5kaW5nX3dvcmsgPiAxKQotICAgIHsKLSAgICAgIGFzaW86OmRldGFpbDo6aW5jcmVtZW50KAotICAgICAgICAgIHRhc2tfaW9fc2VydmljZV8tPm91dHN0YW5kaW5nX3dvcmtfLAotICAgICAgICAgIHRoaXNfdGhyZWFkXy0+cHJpdmF0ZV9vdXRzdGFuZGluZ193b3JrIC0gMSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHRoaXNfdGhyZWFkXy0+cHJpdmF0ZV9vdXRzdGFuZGluZ193b3JrIDwgMSkKLSAgICB7Ci0gICAgICB0YXNrX2lvX3NlcnZpY2VfLT53b3JrX2ZpbmlzaGVkKCk7Ci0gICAgfQotICAgIHRoaXNfdGhyZWFkXy0+cHJpdmF0ZV9vdXRzdGFuZGluZ193b3JrID0gMDsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfVEhSRUFEUykKLSAgICBpZiAoIXRoaXNfdGhyZWFkXy0+cHJpdmF0ZV9vcF9xdWV1ZS5lbXB0eSgpKQotICAgIHsKLSAgICAgIGxvY2tfLT5sb2NrKCk7Ci0gICAgICB0YXNrX2lvX3NlcnZpY2VfLT5vcF9xdWV1ZV8ucHVzaCh0aGlzX3RocmVhZF8tPnByaXZhdGVfb3BfcXVldWUpOwotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0gIH0KLQotICB0YXNrX2lvX3NlcnZpY2UqIHRhc2tfaW9fc2VydmljZV87Ci0gIG11dGV4OjpzY29wZWRfbG9jayogbG9ja187Ci0gIHRocmVhZF9pbmZvKiB0aGlzX3RocmVhZF87Ci19OwotCi10YXNrX2lvX3NlcnZpY2U6OnRhc2tfaW9fc2VydmljZSgKLSAgICBhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLCBzdGQ6OnNpemVfdCBjb25jdXJyZW5jeV9oaW50KQotICA6IGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPHRhc2tfaW9fc2VydmljZT4oaW9fc2VydmljZSksCi0gICAgb25lX3RocmVhZF8oY29uY3VycmVuY3lfaGludCA9PSAxKSwKLSAgICBtdXRleF8oKSwKLSAgICB0YXNrXygwKSwKLSAgICB0YXNrX2ludGVycnVwdGVkXyh0cnVlKSwKLSAgICBvdXRzdGFuZGluZ193b3JrXygwKSwKLSAgICBzdG9wcGVkXyhmYWxzZSksCi0gICAgc2h1dGRvd25fKGZhbHNlKQotewotICBBU0lPX0hBTkRMRVJfVFJBQ0tJTkdfSU5JVDsKLX0KLQotdm9pZCB0YXNrX2lvX3NlcnZpY2U6OnNodXRkb3duX3NlcnZpY2UoKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBzaHV0ZG93bl8gPSB0cnVlOwotICBsb2NrLnVubG9jaygpOwotCi0gIC8vIERlc3Ryb3kgaGFuZGxlciBvYmplY3RzLgotICB3aGlsZSAoIW9wX3F1ZXVlXy5lbXB0eSgpKQotICB7Ci0gICAgb3BlcmF0aW9uKiBvID0gb3BfcXVldWVfLmZyb250KCk7Ci0gICAgb3BfcXVldWVfLnBvcCgpOwotICAgIGlmIChvICE9ICZ0YXNrX29wZXJhdGlvbl8pCi0gICAgICBvLT5kZXN0cm95KCk7Ci0gIH0KLQotICAvLyBSZXNldCB0byBpbml0aWFsIHN0YXRlLgotICB0YXNrXyA9IDA7Ci19Ci0KLXZvaWQgdGFza19pb19zZXJ2aWNlOjppbml0X3Rhc2soKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBpZiAoIXNodXRkb3duXyAmJiAhdGFza18pCi0gIHsKLSAgICB0YXNrXyA9ICZ1c2Vfc2VydmljZTxyZWFjdG9yPih0aGlzLT5nZXRfaW9fc2VydmljZSgpKTsKLSAgICBvcF9xdWV1ZV8ucHVzaCgmdGFza19vcGVyYXRpb25fKTsKLSAgICB3YWtlX29uZV90aHJlYWRfYW5kX3VubG9jayhsb2NrKTsKLSAgfQotfQotCi1zdGQ6OnNpemVfdCB0YXNrX2lvX3NlcnZpY2U6OnJ1bihhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIGlmIChvdXRzdGFuZGluZ193b3JrXyA9PSAwKQotICB7Ci0gICAgc3RvcCgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdGhyZWFkX2luZm8gdGhpc190aHJlYWQ7Ci0gIHRoaXNfdGhyZWFkLnByaXZhdGVfb3V0c3RhbmRpbmdfd29yayA9IDA7Ci0gIHRocmVhZF9jYWxsX3N0YWNrOjpjb250ZXh0IGN0eCh0aGlzLCB0aGlzX3RocmVhZCk7Ci0KLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLQotICBzdGQ6OnNpemVfdCBuID0gMDsKLSAgZm9yICg7IGRvX3J1bl9vbmUobG9jaywgdGhpc190aHJlYWQsIGVjKTsgbG9jay5sb2NrKCkpCi0gICAgaWYgKG4gIT0gKHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgpKCkpCi0gICAgICArK247Ci0gIHJldHVybiBuOwotfQotCi1zdGQ6OnNpemVfdCB0YXNrX2lvX3NlcnZpY2U6OnJ1bl9vbmUoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICBpZiAob3V0c3RhbmRpbmdfd29ya18gPT0gMCkKLSAgewotICAgIHN0b3AoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHRocmVhZF9pbmZvIHRoaXNfdGhyZWFkOwotICB0aGlzX3RocmVhZC5wcml2YXRlX291dHN0YW5kaW5nX3dvcmsgPSAwOwotICB0aHJlYWRfY2FsbF9zdGFjazo6Y29udGV4dCBjdHgodGhpcywgdGhpc190aHJlYWQpOwotCi0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgcmV0dXJuIGRvX3J1bl9vbmUobG9jaywgdGhpc190aHJlYWQsIGVjKTsKLX0KLQotc3RkOjpzaXplX3QgdGFza19pb19zZXJ2aWNlOjpwb2xsKGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgaWYgKG91dHN0YW5kaW5nX3dvcmtfID09IDApCi0gIHsKLSAgICBzdG9wKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB0aHJlYWRfaW5mbyB0aGlzX3RocmVhZDsKLSAgdGhpc190aHJlYWQucHJpdmF0ZV9vdXRzdGFuZGluZ193b3JrID0gMDsKLSAgdGhyZWFkX2NhbGxfc3RhY2s6OmNvbnRleHQgY3R4KHRoaXMsIHRoaXNfdGhyZWFkKTsKLQotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotICAvLyBXZSB3YW50IHRvIHN1cHBvcnQgbmVzdGVkIGNhbGxzIHRvIHBvbGwoKSBhbmQgcG9sbF9vbmUoKSwgc28gYW55IGhhbmRsZXJzCi0gIC8vIHRoYXQgYXJlIGFscmVhZHkgb24gYSB0aHJlYWQtcHJpdmF0ZSBxdWV1ZSBuZWVkIHRvIGJlIHB1dCBvbiB0byB0aGUgbWFpbgotICAvLyBxdWV1ZSBub3cuCi0gIGlmIChvbmVfdGhyZWFkXykKLSAgICBpZiAodGhyZWFkX2luZm8qIG91dGVyX3RocmVhZF9pbmZvID0gY3R4Lm5leHRfYnlfa2V5KCkpCi0gICAgICBvcF9xdWV1ZV8ucHVzaChvdXRlcl90aHJlYWRfaW5mby0+cHJpdmF0ZV9vcF9xdWV1ZSk7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotCi0gIHN0ZDo6c2l6ZV90IG4gPSAwOwotICBmb3IgKDsgZG9fcG9sbF9vbmUobG9jaywgdGhpc190aHJlYWQsIGVjKTsgbG9jay5sb2NrKCkpCi0gICAgaWYgKG4gIT0gKHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgpKCkpCi0gICAgICArK247Ci0gIHJldHVybiBuOwotfQotCi1zdGQ6OnNpemVfdCB0YXNrX2lvX3NlcnZpY2U6OnBvbGxfb25lKGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgaWYgKG91dHN0YW5kaW5nX3dvcmtfID09IDApCi0gIHsKLSAgICBzdG9wKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB0aHJlYWRfaW5mbyB0aGlzX3RocmVhZDsKLSAgdGhpc190aHJlYWQucHJpdmF0ZV9vdXRzdGFuZGluZ193b3JrID0gMDsKLSAgdGhyZWFkX2NhbGxfc3RhY2s6OmNvbnRleHQgY3R4KHRoaXMsIHRoaXNfdGhyZWFkKTsKLQotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotICAvLyBXZSB3YW50IHRvIHN1cHBvcnQgbmVzdGVkIGNhbGxzIHRvIHBvbGwoKSBhbmQgcG9sbF9vbmUoKSwgc28gYW55IGhhbmRsZXJzCi0gIC8vIHRoYXQgYXJlIGFscmVhZHkgb24gYSB0aHJlYWQtcHJpdmF0ZSBxdWV1ZSBuZWVkIHRvIGJlIHB1dCBvbiB0byB0aGUgbWFpbgotICAvLyBxdWV1ZSBub3cuCi0gIGlmIChvbmVfdGhyZWFkXykKLSAgICBpZiAodGhyZWFkX2luZm8qIG91dGVyX3RocmVhZF9pbmZvID0gY3R4Lm5leHRfYnlfa2V5KCkpCi0gICAgICBvcF9xdWV1ZV8ucHVzaChvdXRlcl90aHJlYWRfaW5mby0+cHJpdmF0ZV9vcF9xdWV1ZSk7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotCi0gIHJldHVybiBkb19wb2xsX29uZShsb2NrLCB0aGlzX3RocmVhZCwgZWMpOwotfQotCi12b2lkIHRhc2tfaW9fc2VydmljZTo6c3RvcCgpCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIHN0b3BfYWxsX3RocmVhZHMobG9jayk7Ci19Ci0KLWJvb2wgdGFza19pb19zZXJ2aWNlOjpzdG9wcGVkKCkgY29uc3QKLXsKLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgcmV0dXJuIHN0b3BwZWRfOwotfQotCi12b2lkIHRhc2tfaW9fc2VydmljZTo6cmVzZXQoKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBzdG9wcGVkXyA9IGZhbHNlOwotfQotCi12b2lkIHRhc2tfaW9fc2VydmljZTo6cG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbigKLSAgICB0YXNrX2lvX3NlcnZpY2U6Om9wZXJhdGlvbiogb3AsIGJvb2wgaXNfY29udGludWF0aW9uKQotewotI2lmIGRlZmluZWQoQVNJT19IQVNfVEhSRUFEUykKLSAgaWYgKG9uZV90aHJlYWRfIHx8IGlzX2NvbnRpbnVhdGlvbikKLSAgewotICAgIGlmICh0aHJlYWRfaW5mbyogdGhpc190aHJlYWQgPSB0aHJlYWRfY2FsbF9zdGFjazo6Y29udGFpbnModGhpcykpCi0gICAgewotICAgICAgKyt0aGlzX3RocmVhZC0+cHJpdmF0ZV9vdXRzdGFuZGluZ193b3JrOwotICAgICAgdGhpc190aHJlYWQtPnByaXZhdGVfb3BfcXVldWUucHVzaChvcCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0gICh2b2lkKWlzX2NvbnRpbnVhdGlvbjsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0KLSAgd29ya19zdGFydGVkKCk7Ci0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIG9wX3F1ZXVlXy5wdXNoKG9wKTsKLSAgd2FrZV9vbmVfdGhyZWFkX2FuZF91bmxvY2sobG9jayk7Ci19Ci0KLXZvaWQgdGFza19pb19zZXJ2aWNlOjpwb3N0X2RlZmVycmVkX2NvbXBsZXRpb24odGFza19pb19zZXJ2aWNlOjpvcGVyYXRpb24qIG9wKQotewotI2lmIGRlZmluZWQoQVNJT19IQVNfVEhSRUFEUykKLSAgaWYgKG9uZV90aHJlYWRfKQotICB7Ci0gICAgaWYgKHRocmVhZF9pbmZvKiB0aGlzX3RocmVhZCA9IHRocmVhZF9jYWxsX3N0YWNrOjpjb250YWlucyh0aGlzKSkKLSAgICB7Ci0gICAgICB0aGlzX3RocmVhZC0+cHJpdmF0ZV9vcF9xdWV1ZS5wdXNoKG9wKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0KLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgb3BfcXVldWVfLnB1c2gob3ApOwotICB3YWtlX29uZV90aHJlYWRfYW5kX3VubG9jayhsb2NrKTsKLX0KLQotdm9pZCB0YXNrX2lvX3NlcnZpY2U6OnBvc3RfZGVmZXJyZWRfY29tcGxldGlvbnMoCi0gICAgb3BfcXVldWU8dGFza19pb19zZXJ2aWNlOjpvcGVyYXRpb24+JiBvcHMpCi17Ci0gIGlmICghb3BzLmVtcHR5KCkpCi0gIHsKLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0gICAgaWYgKG9uZV90aHJlYWRfKQotICAgIHsKLSAgICAgIGlmICh0aHJlYWRfaW5mbyogdGhpc190aHJlYWQgPSB0aHJlYWRfY2FsbF9zdGFjazo6Y29udGFpbnModGhpcykpCi0gICAgICB7Ci0gICAgICAgIHRoaXNfdGhyZWFkLT5wcml2YXRlX29wX3F1ZXVlLnB1c2gob3BzKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0KLSAgICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICAgIG9wX3F1ZXVlXy5wdXNoKG9wcyk7Ci0gICAgd2FrZV9vbmVfdGhyZWFkX2FuZF91bmxvY2sobG9jayk7Ci0gIH0KLX0KLQotdm9pZCB0YXNrX2lvX3NlcnZpY2U6OmRvX2Rpc3BhdGNoKAotICAgIHRhc2tfaW9fc2VydmljZTo6b3BlcmF0aW9uKiBvcCkKLXsKLSAgd29ya19zdGFydGVkKCk7Ci0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIG9wX3F1ZXVlXy5wdXNoKG9wKTsKLSAgd2FrZV9vbmVfdGhyZWFkX2FuZF91bmxvY2sobG9jayk7Ci19Ci0KLXZvaWQgdGFza19pb19zZXJ2aWNlOjphYmFuZG9uX29wZXJhdGlvbnMoCi0gICAgb3BfcXVldWU8dGFza19pb19zZXJ2aWNlOjpvcGVyYXRpb24+JiBvcHMpCi17Ci0gIG9wX3F1ZXVlPHRhc2tfaW9fc2VydmljZTo6b3BlcmF0aW9uPiBvcHMyOwotICBvcHMyLnB1c2gob3BzKTsKLX0KLQotc3RkOjpzaXplX3QgdGFza19pb19zZXJ2aWNlOjpkb19ydW5fb25lKG11dGV4OjpzY29wZWRfbG9jayYgbG9jaywKLSAgICB0YXNrX2lvX3NlcnZpY2U6OnRocmVhZF9pbmZvJiB0aGlzX3RocmVhZCwKLSAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgd2hpbGUgKCFzdG9wcGVkXykKLSAgewotICAgIGlmICghb3BfcXVldWVfLmVtcHR5KCkpCi0gICAgewotICAgICAgLy8gUHJlcGFyZSB0byBleGVjdXRlIGZpcnN0IGhhbmRsZXIgZnJvbSBxdWV1ZS4KLSAgICAgIG9wZXJhdGlvbiogbyA9IG9wX3F1ZXVlXy5mcm9udCgpOwotICAgICAgb3BfcXVldWVfLnBvcCgpOwotICAgICAgYm9vbCBtb3JlX2hhbmRsZXJzID0gKCFvcF9xdWV1ZV8uZW1wdHkoKSk7Ci0KLSAgICAgIGlmIChvID09ICZ0YXNrX29wZXJhdGlvbl8pCi0gICAgICB7Ci0gICAgICAgIHRhc2tfaW50ZXJydXB0ZWRfID0gbW9yZV9oYW5kbGVyczsKLQotICAgICAgICBpZiAobW9yZV9oYW5kbGVycyAmJiAhb25lX3RocmVhZF8pCi0gICAgICAgICAgd2FrZXVwX2V2ZW50Xy51bmxvY2tfYW5kX3NpZ25hbF9vbmUobG9jayk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBsb2NrLnVubG9jaygpOwotCi0gICAgICAgIHRhc2tfY2xlYW51cCBvbl9leGl0ID0geyB0aGlzLCAmbG9jaywgJnRoaXNfdGhyZWFkIH07Ci0gICAgICAgICh2b2lkKW9uX2V4aXQ7Ci0KLSAgICAgICAgLy8gUnVuIHRoZSB0YXNrLiBNYXkgdGhyb3cgYW4gZXhjZXB0aW9uLiBPbmx5IGJsb2NrIGlmIHRoZSBvcGVyYXRpb24KLSAgICAgICAgLy8gcXVldWUgaXMgZW1wdHkgYW5kIHdlJ3JlIG5vdCBwb2xsaW5nLCBvdGhlcndpc2Ugd2Ugd2FudCB0byByZXR1cm4KLSAgICAgICAgLy8gYXMgc29vbiBhcyBwb3NzaWJsZS4KLSAgICAgICAgdGFza18tPnJ1bighbW9yZV9oYW5kbGVycywgdGhpc190aHJlYWQucHJpdmF0ZV9vcF9xdWV1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN0ZDo6c2l6ZV90IHRhc2tfcmVzdWx0ID0gby0+dGFza19yZXN1bHRfOwotCi0gICAgICAgIGlmIChtb3JlX2hhbmRsZXJzICYmICFvbmVfdGhyZWFkXykKLSAgICAgICAgICB3YWtlX29uZV90aHJlYWRfYW5kX3VubG9jayhsb2NrKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRoZSBjb3VudCBvZiBvdXRzdGFuZGluZyB3b3JrIGlzIGRlY3JlbWVudGVkIG9uIGJsb2NrIGV4aXQuCi0gICAgICAgIHdvcmtfY2xlYW51cCBvbl9leGl0ID0geyB0aGlzLCAmbG9jaywgJnRoaXNfdGhyZWFkIH07Ci0gICAgICAgICh2b2lkKW9uX2V4aXQ7Ci0KLSAgICAgICAgLy8gQ29tcGxldGUgdGhlIG9wZXJhdGlvbi4gTWF5IHRocm93IGFuIGV4Y2VwdGlvbi4gRGVsZXRlcyB0aGUgb2JqZWN0LgotICAgICAgICBvLT5jb21wbGV0ZSgqdGhpcywgZWMsIHRhc2tfcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdha2V1cF9ldmVudF8uY2xlYXIobG9jayk7Ci0gICAgICB3YWtldXBfZXZlbnRfLndhaXQobG9jayk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0ZDo6c2l6ZV90IHRhc2tfaW9fc2VydmljZTo6ZG9fcG9sbF9vbmUobXV0ZXg6OnNjb3BlZF9sb2NrJiBsb2NrLAotICAgIHRhc2tfaW9fc2VydmljZTo6dGhyZWFkX2luZm8mIHRoaXNfdGhyZWFkLAotICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoc3RvcHBlZF8pCi0gICAgcmV0dXJuIDA7Ci0KLSAgb3BlcmF0aW9uKiBvID0gb3BfcXVldWVfLmZyb250KCk7Ci0gIGlmIChvID09ICZ0YXNrX29wZXJhdGlvbl8pCi0gIHsKLSAgICBvcF9xdWV1ZV8ucG9wKCk7Ci0gICAgbG9jay51bmxvY2soKTsKLQotICAgIHsKLSAgICAgIHRhc2tfY2xlYW51cCBjID0geyB0aGlzLCAmbG9jaywgJnRoaXNfdGhyZWFkIH07Ci0gICAgICAodm9pZCljOwotCi0gICAgICAvLyBSdW4gdGhlIHRhc2suIE1heSB0aHJvdyBhbiBleGNlcHRpb24uIE9ubHkgYmxvY2sgaWYgdGhlIG9wZXJhdGlvbgotICAgICAgLy8gcXVldWUgaXMgZW1wdHkgYW5kIHdlJ3JlIG5vdCBwb2xsaW5nLCBvdGhlcndpc2Ugd2Ugd2FudCB0byByZXR1cm4KLSAgICAgIC8vIGFzIHNvb24gYXMgcG9zc2libGUuCi0gICAgICB0YXNrXy0+cnVuKGZhbHNlLCB0aGlzX3RocmVhZC5wcml2YXRlX29wX3F1ZXVlKTsKLSAgICB9Ci0KLSAgICBvID0gb3BfcXVldWVfLmZyb250KCk7Ci0gICAgaWYgKG8gPT0gJnRhc2tfb3BlcmF0aW9uXykKLSAgICB7Ci0gICAgICB3YWtldXBfZXZlbnRfLm1heWJlX3VubG9ja19hbmRfc2lnbmFsX29uZShsb2NrKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIGlmIChvID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgb3BfcXVldWVfLnBvcCgpOwotICBib29sIG1vcmVfaGFuZGxlcnMgPSAoIW9wX3F1ZXVlXy5lbXB0eSgpKTsKLQotICBzdGQ6OnNpemVfdCB0YXNrX3Jlc3VsdCA9IG8tPnRhc2tfcmVzdWx0XzsKLQotICBpZiAobW9yZV9oYW5kbGVycyAmJiAhb25lX3RocmVhZF8pCi0gICAgd2FrZV9vbmVfdGhyZWFkX2FuZF91bmxvY2sobG9jayk7Ci0gIGVsc2UKLSAgICBsb2NrLnVubG9jaygpOwotCi0gIC8vIEVuc3VyZSB0aGUgY291bnQgb2Ygb3V0c3RhbmRpbmcgd29yayBpcyBkZWNyZW1lbnRlZCBvbiBibG9jayBleGl0LgotICB3b3JrX2NsZWFudXAgb25fZXhpdCA9IHsgdGhpcywgJmxvY2ssICZ0aGlzX3RocmVhZCB9OwotICAodm9pZClvbl9leGl0OwotCi0gIC8vIENvbXBsZXRlIHRoZSBvcGVyYXRpb24uIE1heSB0aHJvdyBhbiBleGNlcHRpb24uIERlbGV0ZXMgdGhlIG9iamVjdC4KLSAgby0+Y29tcGxldGUoKnRoaXMsIGVjLCB0YXNrX3Jlc3VsdCk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgdGFza19pb19zZXJ2aWNlOjpzdG9wX2FsbF90aHJlYWRzKAotICAgIG11dGV4OjpzY29wZWRfbG9jayYgbG9jaykKLXsKLSAgc3RvcHBlZF8gPSB0cnVlOwotICB3YWtldXBfZXZlbnRfLnNpZ25hbF9hbGwobG9jayk7Ci0KLSAgaWYgKCF0YXNrX2ludGVycnVwdGVkXyAmJiB0YXNrXykKLSAgewotICAgIHRhc2tfaW50ZXJydXB0ZWRfID0gdHJ1ZTsKLSAgICB0YXNrXy0+aW50ZXJydXB0KCk7Ci0gIH0KLX0KLQotdm9pZCB0YXNrX2lvX3NlcnZpY2U6Ondha2Vfb25lX3RocmVhZF9hbmRfdW5sb2NrKAotICAgIG11dGV4OjpzY29wZWRfbG9jayYgbG9jaykKLXsKLSAgaWYgKCF3YWtldXBfZXZlbnRfLm1heWJlX3VubG9ja19hbmRfc2lnbmFsX29uZShsb2NrKSkKLSAgewotICAgIGlmICghdGFza19pbnRlcnJ1cHRlZF8gJiYgdGFza18pCi0gICAgewotICAgICAgdGFza19pbnRlcnJ1cHRlZF8gPSB0cnVlOwotICAgICAgdGFza18tPmludGVycnVwdCgpOwotICAgIH0KLSAgICBsb2NrLnVubG9jaygpOwotICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfVEFTS19JT19TRVJWSUNFX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Rocm93X2Vycm9yLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC90aHJvd19lcnJvci5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzI3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3Rocm93X2Vycm9yLmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC90aHJvd19lcnJvci5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1RIUk9XX0VSUk9SX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1RIUk9XX0VSUk9SX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19leGNlcHRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vc3lzdGVtX2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi12b2lkIGRvX3Rocm93X2Vycm9yKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycikKLXsKLSAgYXNpbzo6c3lzdGVtX2Vycm9yIGUoZXJyKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZSk7Ci19Ci0KLXZvaWQgZG9fdGhyb3dfZXJyb3IoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyLCBjb25zdCBjaGFyKiBsb2NhdGlvbikKLXsKLSAgLy8gYm9vc3RpZnk6IG5vbi1ib29zdCBjb2RlIHN0YXJ0cyBoZXJlCi0jaWYgZGVmaW5lZChBU0lPX01TVkMpICYmIGRlZmluZWQoQVNJT19IQVNfU1REX1NZU1RFTV9FUlJPUikKLSAgLy8gTWljcm9zb2Z0J3MgaW1wbGVtZW50YXRpb24gb2Ygc3RkOjpzeXN0ZW1fZXJyb3IgaXMgbm9uLWNvbmZvcm1hbnQgaW4gdGhhdAotICAvLyBpdCBpZ25vcmVzIHRoZSBlcnJvciBjb2RlJ3MgbWVzc2FnZSB3aGVuIGEgIndoYXQiIHN0cmluZyBpcyBzdXBwbGllZC4gV2UnbGwKLSAgLy8gd29yayBhcm91bmQgdGhpcyBieSBleHBsaWNpdGx5IGZvcm1hdHRpbmcgdGhlICJ3aGF0IiBzdHJpbmcuCi0gIHN0ZDo6c3RyaW5nIHdoYXRfbXNnID0gbG9jYXRpb247Ci0gIHdoYXRfbXNnICs9ICI6ICI7Ci0gIHdoYXRfbXNnICs9IGVyci5tZXNzYWdlKCk7Ci0gIGFzaW86OnN5c3RlbV9lcnJvciBlKGVyciwgd2hhdF9tc2cpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2V4Y2VwdGlvbihlKTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19NU1ZDKSAmJiBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0gIC8vIGJvb3N0aWZ5OiBub24tYm9vc3QgY29kZSBlbmRzIGhlcmUKLSAgYXNpbzo6c3lzdGVtX2Vycm9yIGUoZXJyLCBsb2NhdGlvbik7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKGUpOwotICAvLyBib29zdGlmeTogbm9uLWJvb3N0IGNvZGUgc3RhcnRzIGhlcmUKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fTVNWQykgJiYgZGVmaW5lZChBU0lPX0hBU19TVERfU1lTVEVNX0VSUk9SKQotICAvLyBib29zdGlmeTogbm9uLWJvb3N0IGNvZGUgZW5kcyBoZXJlCi19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9USFJPV19FUlJPUl9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC90aW1lcl9xdWV1ZV9wdGltZS5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvdGltZXJfcXVldWVfcHRpbWUuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTM5NmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC90aW1lcl9xdWV1ZV9wdGltZS5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvdGltZXJfcXVldWVfcHRpbWUuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9USU1FUl9RVUVVRV9QVElNRV9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9USU1FUl9RVUVVRV9QVElNRV9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9wdGltZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19CT09TVF9EQVRFX1RJTUUpCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10aW1lcl9xdWV1ZTx0aW1lX3RyYWl0czxib29zdDo6cG9zaXhfdGltZTo6cHRpbWU+ID46OnRpbWVyX3F1ZXVlKCkKLXsKLX0KLQotdGltZXJfcXVldWU8dGltZV90cmFpdHM8Ym9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lPiA+Ojp+dGltZXJfcXVldWUoKQotewotfQotCi1ib29sIHRpbWVyX3F1ZXVlPHRpbWVfdHJhaXRzPGJvb3N0Ojpwb3NpeF90aW1lOjpwdGltZT4gPjo6ZW5xdWV1ZV90aW1lcigKLSAgICBjb25zdCB0aW1lX3R5cGUmIHRpbWUsIHBlcl90aW1lcl9kYXRhJiB0aW1lciwgd2FpdF9vcCogb3ApCi17Ci0gIHJldHVybiBpbXBsXy5lbnF1ZXVlX3RpbWVyKHRpbWUsIHRpbWVyLCBvcCk7Ci19Ci0KLWJvb2wgdGltZXJfcXVldWU8dGltZV90cmFpdHM8Ym9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lPiA+OjplbXB0eSgpIGNvbnN0Ci17Ci0gIHJldHVybiBpbXBsXy5lbXB0eSgpOwotfQotCi1sb25nIHRpbWVyX3F1ZXVlPHRpbWVfdHJhaXRzPGJvb3N0Ojpwb3NpeF90aW1lOjpwdGltZT4gPjo6d2FpdF9kdXJhdGlvbl9tc2VjKAotICAgIGxvbmcgbWF4X2R1cmF0aW9uKSBjb25zdAotewotICByZXR1cm4gaW1wbF8ud2FpdF9kdXJhdGlvbl9tc2VjKG1heF9kdXJhdGlvbik7Ci19Ci0KLWxvbmcgdGltZXJfcXVldWU8dGltZV90cmFpdHM8Ym9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lPiA+Ojp3YWl0X2R1cmF0aW9uX3VzZWMoCi0gICAgbG9uZyBtYXhfZHVyYXRpb24pIGNvbnN0Ci17Ci0gIHJldHVybiBpbXBsXy53YWl0X2R1cmF0aW9uX3VzZWMobWF4X2R1cmF0aW9uKTsKLX0KLQotdm9pZCB0aW1lcl9xdWV1ZTx0aW1lX3RyYWl0czxib29zdDo6cG9zaXhfdGltZTo6cHRpbWU+ID46OmdldF9yZWFkeV90aW1lcnMoCi0gICAgb3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzKQotewotICBpbXBsXy5nZXRfcmVhZHlfdGltZXJzKG9wcyk7Ci19Ci0KLXZvaWQgdGltZXJfcXVldWU8dGltZV90cmFpdHM8Ym9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lPiA+OjpnZXRfYWxsX3RpbWVycygKLSAgICBvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpCi17Ci0gIGltcGxfLmdldF9hbGxfdGltZXJzKG9wcyk7Ci19Ci0KLXN0ZDo6c2l6ZV90IHRpbWVyX3F1ZXVlPHRpbWVfdHJhaXRzPGJvb3N0Ojpwb3NpeF90aW1lOjpwdGltZT4gPjo6Y2FuY2VsX3RpbWVyKAotICAgIHBlcl90aW1lcl9kYXRhJiB0aW1lciwgb3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzLCBzdGQ6OnNpemVfdCBtYXhfY2FuY2VsbGVkKQotewotICByZXR1cm4gaW1wbF8uY2FuY2VsX3RpbWVyKHRpbWVyLCBvcHMsIG1heF9jYW5jZWxsZWQpOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfREFURV9USU1FKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9USU1FUl9RVUVVRV9QVElNRV9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC90aW1lcl9xdWV1ZV9zZXQuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3RpbWVyX3F1ZXVlX3NldC5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NmUyMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3RpbWVyX3F1ZXVlX3NldC5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3RpbWVyX3F1ZXVlX3NldC5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9USU1FUl9RVUVVRV9TRVRfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfVElNRVJfUVVFVUVfU0VUX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX3NldC5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGltZXJfcXVldWVfc2V0Ojp0aW1lcl9xdWV1ZV9zZXQoKQotICA6IGZpcnN0XygwKQotewotfQotCi12b2lkIHRpbWVyX3F1ZXVlX3NldDo6aW5zZXJ0KHRpbWVyX3F1ZXVlX2Jhc2UqIHEpCi17Ci0gIHEtPm5leHRfID0gZmlyc3RfOwotICBmaXJzdF8gPSBxOwotfQotCi12b2lkIHRpbWVyX3F1ZXVlX3NldDo6ZXJhc2UodGltZXJfcXVldWVfYmFzZSogcSkKLXsKLSAgaWYgKGZpcnN0XykKLSAgewotICAgIGlmIChxID09IGZpcnN0XykKLSAgICB7Ci0gICAgICBmaXJzdF8gPSBxLT5uZXh0XzsKLSAgICAgIHEtPm5leHRfID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKHRpbWVyX3F1ZXVlX2Jhc2UqIHAgPSBmaXJzdF87IHAtPm5leHRfOyBwID0gcC0+bmV4dF8pCi0gICAgewotICAgICAgaWYgKHAtPm5leHRfID09IHEpCi0gICAgICB7Ci0gICAgICAgIHAtPm5leHRfID0gcS0+bmV4dF87Ci0gICAgICAgIHEtPm5leHRfID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1ib29sIHRpbWVyX3F1ZXVlX3NldDo6YWxsX2VtcHR5KCkgY29uc3QKLXsKLSAgZm9yICh0aW1lcl9xdWV1ZV9iYXNlKiBwID0gZmlyc3RfOyBwOyBwID0gcC0+bmV4dF8pCi0gICAgaWYgKCFwLT5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9uZyB0aW1lcl9xdWV1ZV9zZXQ6OndhaXRfZHVyYXRpb25fbXNlYyhsb25nIG1heF9kdXJhdGlvbikgY29uc3QKLXsKLSAgbG9uZyBtaW5fZHVyYXRpb24gPSBtYXhfZHVyYXRpb247Ci0gIGZvciAodGltZXJfcXVldWVfYmFzZSogcCA9IGZpcnN0XzsgcDsgcCA9IHAtPm5leHRfKQotICAgIG1pbl9kdXJhdGlvbiA9IHAtPndhaXRfZHVyYXRpb25fbXNlYyhtaW5fZHVyYXRpb24pOwotICByZXR1cm4gbWluX2R1cmF0aW9uOwotfQotCi1sb25nIHRpbWVyX3F1ZXVlX3NldDo6d2FpdF9kdXJhdGlvbl91c2VjKGxvbmcgbWF4X2R1cmF0aW9uKSBjb25zdAotewotICBsb25nIG1pbl9kdXJhdGlvbiA9IG1heF9kdXJhdGlvbjsKLSAgZm9yICh0aW1lcl9xdWV1ZV9iYXNlKiBwID0gZmlyc3RfOyBwOyBwID0gcC0+bmV4dF8pCi0gICAgbWluX2R1cmF0aW9uID0gcC0+d2FpdF9kdXJhdGlvbl91c2VjKG1pbl9kdXJhdGlvbik7Ci0gIHJldHVybiBtaW5fZHVyYXRpb247Ci19Ci0KLXZvaWQgdGltZXJfcXVldWVfc2V0OjpnZXRfcmVhZHlfdGltZXJzKG9wX3F1ZXVlPG9wZXJhdGlvbj4mIG9wcykKLXsKLSAgZm9yICh0aW1lcl9xdWV1ZV9iYXNlKiBwID0gZmlyc3RfOyBwOyBwID0gcC0+bmV4dF8pCi0gICAgcC0+Z2V0X3JlYWR5X3RpbWVycyhvcHMpOwotfQotCi12b2lkIHRpbWVyX3F1ZXVlX3NldDo6Z2V0X2FsbF90aW1lcnMob3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzKQotewotICBmb3IgKHRpbWVyX3F1ZXVlX2Jhc2UqIHAgPSBmaXJzdF87IHA7IHAgPSBwLT5uZXh0XykKLSAgICBwLT5nZXRfYWxsX3RpbWVycyhvcHMpOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfVElNRVJfUVVFVUVfU0VUX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl9ldmVudC5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX2V2ZW50LmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiZmU1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX2V2ZW50LmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2luX2V2ZW50LmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9XSU5fRVZFTlRfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfV0lOX0VWRU5UX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX2V2ZW50LmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi13aW5fZXZlbnQ6Ondpbl9ldmVudCgpCi0gIDogc3RhdGVfKDApCi17Ci0gIGV2ZW50c19bMF0gPSA6OkNyZWF0ZUV2ZW50KDAsIHRydWUsIGZhbHNlLCAwKTsKLSAgaWYgKCFldmVudHNfWzBdKQotICB7Ci0gICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhsYXN0X2Vycm9yLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiZXZlbnQiKTsKLSAgfQotCi0gIGV2ZW50c19bMV0gPSA6OkNyZWF0ZUV2ZW50KDAsIGZhbHNlLCBmYWxzZSwgMCk7Ci0gIGlmICghZXZlbnRzX1sxXSkKLSAgewotICAgIERXT1JEIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgIDo6Q2xvc2VIYW5kbGUoZXZlbnRzX1swXSk7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhsYXN0X2Vycm9yLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiZXZlbnQiKTsKLSAgfQotfQotCi13aW5fZXZlbnQ6On53aW5fZXZlbnQoKQotewotICA6OkNsb3NlSGFuZGxlKGV2ZW50c19bMF0pOwotICA6OkNsb3NlSGFuZGxlKGV2ZW50c19bMV0pOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9XSU5fRVZFTlRfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3BfaGFuZGxlX3NlcnZpY2UuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlLmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4NGY3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3BfaGFuZGxlX3NlcnZpY2UuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC93aW5faW9jcF9oYW5kbGVfc2VydmljZS5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IFJlcCBJbnZhcmlhbnQgU3lzdGVtcywgSW5jLiAoaW5mb0ByZXBpbnZhcmlhbnQuY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1dJTl9JT0NQX0hBTkRMRV9TRVJWSUNFX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1dJTl9JT0NQX0hBTkRMRV9TRVJWSUNFX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX2lvY3BfaGFuZGxlX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjpvdmVybGFwcGVkX3dyYXBwZXIKLSAgOiBwdWJsaWMgT1ZFUkxBUFBFRAotewotcHVibGljOgotICBleHBsaWNpdCBvdmVybGFwcGVkX3dyYXBwZXIoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBJbnRlcm5hbCA9IDA7Ci0gICAgSW50ZXJuYWxIaWdoID0gMDsKLSAgICBPZmZzZXQgPSAwOwotICAgIE9mZnNldEhpZ2ggPSAwOwotCi0gICAgLy8gQ3JlYXRlIGEgbm9uLXNpZ25hbGxlZCBtYW51YWwtcmVzZXQgZXZlbnQsIGZvciBHZXRPdmVybGFwcGVkUmVzdWx0LgotICAgIGhFdmVudCA9IDo6Q3JlYXRlRXZlbnQoMCwgVFJVRSwgRkFMU0UsIDApOwotICAgIGlmIChoRXZlbnQpCi0gICAgewotICAgICAgLy8gQXMgZG9jdW1lbnRlZCBpbiBHZXRRdWV1ZWRDb21wbGV0aW9uU3RhdHVzLCBzZXR0aW5nIHRoZSBsb3cgb3JkZXIKLSAgICAgIC8vIGJpdCBvZiB0aGlzIGV2ZW50IHByZXZlbnRzIG91ciBzeW5jaHJvbm91cyB3cml0ZXMgZnJvbSBiZWluZyB0cmVhdGVkCi0gICAgICAvLyBhcyBjb21wbGV0aW9uIHBvcnQgZXZlbnRzLgotICAgICAgRFdPUkRfUFRSIHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RFdPUkRfUFRSPihoRXZlbnQpOwotICAgICAgaEV2ZW50ID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KHRtcCB8IDEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUobGFzdF9lcnJvciwKLSAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICB9Ci0gIH0KLQotICB+b3ZlcmxhcHBlZF93cmFwcGVyKCkKLSAgewotICAgIGlmIChoRXZlbnQpCi0gICAgewotICAgICAgOjpDbG9zZUhhbmRsZShoRXZlbnQpOwotICAgIH0KLSAgfQotfTsKLQotd2luX2lvY3BfaGFuZGxlX3NlcnZpY2U6Ondpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlKAotICAgIGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gIDogaW9jcF9zZXJ2aWNlXyhhc2lvOjp1c2Vfc2VydmljZTx3aW5faW9jcF9pb19zZXJ2aWNlPihpb19zZXJ2aWNlKSksCi0gICAgbXV0ZXhfKCksCi0gICAgaW1wbF9saXN0XygwKQotewotfQotCi12b2lkIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjpzaHV0ZG93bl9zZXJ2aWNlKCkKLXsKLSAgLy8gQ2xvc2UgYWxsIGltcGxlbWVudGF0aW9ucywgY2F1c2luZyBhbGwgb3BlcmF0aW9ucyB0byBjb21wbGV0ZS4KLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBpbXBsZW1lbnRhdGlvbl90eXBlKiBpbXBsID0gaW1wbF9saXN0XzsKLSAgd2hpbGUgKGltcGwpCi0gIHsKLSAgICBjbG9zZV9mb3JfZGVzdHJ1Y3Rpb24oKmltcGwpOwotICAgIGltcGwgPSBpbXBsLT5uZXh0XzsKLSAgfQotfQotCi12b2lkIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjpjb25zdHJ1Y3QoCi0gICAgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi17Ci0gIGltcGwuaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBpbXBsLnNhZmVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZF8gPSAwOwotCi0gIC8vIEluc2VydCBpbXBsZW1lbnRhdGlvbiBpbnRvIGxpbmtlZCBsaXN0IG9mIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgaW1wbC5uZXh0XyA9IGltcGxfbGlzdF87Ci0gIGltcGwucHJldl8gPSAwOwotICBpZiAoaW1wbF9saXN0XykKLSAgICBpbXBsX2xpc3RfLT5wcmV2XyA9ICZpbXBsOwotICBpbXBsX2xpc3RfID0gJmltcGw7Ci19Ci0KLXZvaWQgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2U6Om1vdmVfY29uc3RydWN0KAotICAgIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotewotICBpbXBsLmhhbmRsZV8gPSBvdGhlcl9pbXBsLmhhbmRsZV87Ci0gIG90aGVyX2ltcGwuaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotCi0gIGltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXyA9IG90aGVyX2ltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXzsKLSAgb3RoZXJfaW1wbC5zYWZlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWRfID0gMDsKLQotICAvLyBJbnNlcnQgaW1wbGVtZW50YXRpb24gaW50byBsaW5rZWQgbGlzdCBvZiBhbGwgaW1wbGVtZW50YXRpb25zLgotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIGltcGwubmV4dF8gPSBpbXBsX2xpc3RfOwotICBpbXBsLnByZXZfID0gMDsKLSAgaWYgKGltcGxfbGlzdF8pCi0gICAgaW1wbF9saXN0Xy0+cHJldl8gPSAmaW1wbDsKLSAgaW1wbF9saXN0XyA9ICZpbXBsOwotfQotCi12b2lkIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjptb3ZlX2Fzc2lnbigKLSAgICB3aW5faW9jcF9oYW5kbGVfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICB3aW5faW9jcF9oYW5kbGVfc2VydmljZSYgb3RoZXJfc2VydmljZSwKLSAgICB3aW5faW9jcF9oYW5kbGVfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLXsKLSAgY2xvc2VfZm9yX2Rlc3RydWN0aW9uKGltcGwpOwotCi0gIGlmICh0aGlzICE9ICZvdGhlcl9zZXJ2aWNlKQotICB7Ci0gICAgLy8gUmVtb3ZlIGltcGxlbWVudGF0aW9uIGZyb20gbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgaWYgKGltcGxfbGlzdF8gPT0gJmltcGwpCi0gICAgICBpbXBsX2xpc3RfID0gaW1wbC5uZXh0XzsKLSAgICBpZiAoaW1wbC5wcmV2XykKLSAgICAgIGltcGwucHJldl8tPm5leHRfID0gaW1wbC5uZXh0XzsKLSAgICBpZiAoaW1wbC5uZXh0XykKLSAgICAgIGltcGwubmV4dF8tPnByZXZfPSBpbXBsLnByZXZfOwotICAgIGltcGwubmV4dF8gPSAwOwotICAgIGltcGwucHJldl8gPSAwOwotICB9Ci0KLSAgaW1wbC5oYW5kbGVfID0gb3RoZXJfaW1wbC5oYW5kbGVfOwotICBvdGhlcl9pbXBsLmhhbmRsZV8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQotICBpbXBsLnNhZmVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZF8gPSBvdGhlcl9pbXBsLnNhZmVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZF87Ci0gIG90aGVyX2ltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXyA9IDA7Ci0KLSAgaWYgKHRoaXMgIT0gJm90aGVyX3NlcnZpY2UpCi0gIHsKLSAgICAvLyBJbnNlcnQgaW1wbGVtZW50YXRpb24gaW50byBsaW5rZWQgbGlzdCBvZiBhbGwgaW1wbGVtZW50YXRpb25zLgotICAgIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sob3RoZXJfc2VydmljZS5tdXRleF8pOwotICAgIGltcGwubmV4dF8gPSBvdGhlcl9zZXJ2aWNlLmltcGxfbGlzdF87Ci0gICAgaW1wbC5wcmV2XyA9IDA7Ci0gICAgaWYgKG90aGVyX3NlcnZpY2UuaW1wbF9saXN0XykKLSAgICAgIG90aGVyX3NlcnZpY2UuaW1wbF9saXN0Xy0+cHJldl8gPSAmaW1wbDsKLSAgICBvdGhlcl9zZXJ2aWNlLmltcGxfbGlzdF8gPSAmaW1wbDsKLSAgfQotfQotCi12b2lkIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjpkZXN0cm95KAotICAgIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotewotICBjbG9zZV9mb3JfZGVzdHJ1Y3Rpb24oaW1wbCk7Ci0gIAotICAvLyBSZW1vdmUgaW1wbGVtZW50YXRpb24gZnJvbSBsaW5rZWQgbGlzdCBvZiBhbGwgaW1wbGVtZW50YXRpb25zLgotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIGlmIChpbXBsX2xpc3RfID09ICZpbXBsKQotICAgIGltcGxfbGlzdF8gPSBpbXBsLm5leHRfOwotICBpZiAoaW1wbC5wcmV2XykKLSAgICBpbXBsLnByZXZfLT5uZXh0XyA9IGltcGwubmV4dF87Ci0gIGlmIChpbXBsLm5leHRfKQotICAgIGltcGwubmV4dF8tPnByZXZfPSBpbXBsLnByZXZfOwotICBpbXBsLm5leHRfID0gMDsKLSAgaW1wbC5wcmV2XyA9IDA7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2U6OmFzc2lnbigKLSAgICB3aW5faW9jcF9oYW5kbGVfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIGhhbmRsZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChpc19vcGVuKGltcGwpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YWxyZWFkeV9vcGVuOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIGlmIChpb2NwX3NlcnZpY2VfLnJlZ2lzdGVyX2hhbmRsZShoYW5kbGUsIGVjKSkKLSAgICByZXR1cm4gZWM7Ci0KLSAgaW1wbC5oYW5kbGVfID0gaGFuZGxlOwotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjpjbG9zZSgKLSAgICB3aW5faW9jcF9oYW5kbGVfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGlzX29wZW4oaW1wbCkpCi0gIHsKLSAgICBBU0lPX0hBTkRMRVJfT1BFUkFUSU9OKCgiaGFuZGxlIiwgJmltcGwsICJjbG9zZSIpKTsKLQotICAgIGlmICghOjpDbG9zZUhhbmRsZShpbXBsLmhhbmRsZV8pKQotICAgIHsKLSAgICAgIERXT1JEIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGxhc3RfZXJyb3IsCi0gICAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICB9Ci0KLSAgICBpbXBsLmhhbmRsZV8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLSAgICBpbXBsLnNhZmVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZF8gPSAwOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICB9Ci0KLSAgcmV0dXJuIGVjOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjpjYW5jZWwoCi0gICAgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmICghaXNfb3BlbihpbXBsKSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIEFTSU9fSEFORExFUl9PUEVSQVRJT04oKCJoYW5kbGUiLCAmaW1wbCwgImNhbmNlbCIpKTsKLQotICBpZiAoRkFSUFJPQyBjYW5jZWxfaW9fZXhfcHRyID0gOjpHZXRQcm9jQWRkcmVzcygKLSAgICAgICAgOjpHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCAiQ2FuY2VsSW9FeCIpKQotICB7Ci0gICAgLy8gVGhlIHZlcnNpb24gb2YgV2luZG93cyBzdXBwb3J0cyBjYW5jZWxsYXRpb24gZnJvbSBhbnkgdGhyZWFkLgotICAgIHR5cGVkZWYgQk9PTCAoV0lOQVBJKiBjYW5jZWxfaW9fZXhfdCkoSEFORExFLCBMUE9WRVJMQVBQRUQpOwotICAgIGNhbmNlbF9pb19leF90IGNhbmNlbF9pb19leCA9IChjYW5jZWxfaW9fZXhfdCljYW5jZWxfaW9fZXhfcHRyOwotICAgIGlmICghY2FuY2VsX2lvX2V4KGltcGwuaGFuZGxlXywgMCkpCi0gICAgewotICAgICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgICBpZiAobGFzdF9lcnJvciA9PSBFUlJPUl9OT1RfRk9VTkQpCi0gICAgICB7Ci0gICAgICAgIC8vIEVSUk9SX05PVF9GT1VORCBtZWFucyB0aGF0IHRoZXJlIHdlcmUgbm8gb3BlcmF0aW9ucyB0byBiZQotICAgICAgICAvLyBjYW5jZWxsZWQuIFdlIHN3YWxsb3cgdGhpcyBlcnJvciB0byBtYXRjaCB0aGUgYmVoYXZpb3VyIG9uIG90aGVyCi0gICAgICAgIC8vIHBsYXRmb3Jtcy4KLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShsYXN0X2Vycm9yLAotICAgICAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICB9Ci0gIH0KLSAgZWxzZSBpZiAoaW1wbC5zYWZlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWRfID09IDApCi0gIHsKLSAgICAvLyBObyBvcGVyYXRpb25zIGhhdmUgYmVlbiBzdGFydGVkLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gY2FuY2VsLgotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICB9Ci0gIGVsc2UgaWYgKGltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXyA9PSA6OkdldEN1cnJlbnRUaHJlYWRJZCgpKQotICB7Ci0gICAgLy8gQXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHN0YXJ0ZWQgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQgb25seSwKLSAgICAvLyBzbyBpdCBpcyBzYWZlIHRvIHRyeSB0byBjYW5jZWwgdGhlbSB1c2luZyBDYW5jZWxJby4KLSAgICBpZiAoITo6Q2FuY2VsSW8oaW1wbC5oYW5kbGVfKSkKLSAgICB7Ci0gICAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShsYXN0X2Vycm9yLAotICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIC8vIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGhhdmUgYmVlbiBzdGFydGVkIGZyb20gbW9yZSB0aGFuIG9uZSB0aHJlYWQsCi0gICAgLy8gc28gY2FuY2VsbGF0aW9uIGlzIG5vdCBzYWZlLgotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICB9Ci0KLSAgcmV0dXJuIGVjOwotfQotCi1zaXplX3Qgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2U6OmRvX3dyaXRlKAotICAgIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCB1aW50NjRfdCBvZmZzZXQsCi0gICAgY29uc3QgYXNpbzo6Y29uc3RfYnVmZmVyJiBidWZmZXIsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoIWlzX29wZW4oaW1wbCkpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIEEgcmVxdWVzdCB0byB3cml0ZSAwIGJ5dGVzIG9uIGEgaGFuZGxlIGlzIGEgbm8tb3AuCi0gIGlmIChhc2lvOjpidWZmZXJfc2l6ZShidWZmZXIpID09IDApCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIG92ZXJsYXBwZWRfd3JhcHBlciBvdmVybGFwcGVkKGVjKTsKLSAgaWYgKGVjKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgZGF0YS4gCi0gIG92ZXJsYXBwZWQuT2Zmc2V0ID0gb2Zmc2V0ICYgMHhGRkZGRkZGRjsKLSAgb3ZlcmxhcHBlZC5PZmZzZXRIaWdoID0gKG9mZnNldCA+PiAzMikgJiAweEZGRkZGRkZGOwotICBCT09MIG9rID0gOjpXcml0ZUZpbGUoaW1wbC5oYW5kbGVfLAotICAgICAgYXNpbzo6YnVmZmVyX2Nhc3Q8TFBDVk9JRD4oYnVmZmVyKSwKLSAgICAgIHN0YXRpY19jYXN0PERXT1JEPihhc2lvOjpidWZmZXJfc2l6ZShidWZmZXIpKSwgMCwgJm92ZXJsYXBwZWQpOwotICBpZiAoIW9rKSAKLSAgewotICAgIERXT1JEIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgIGlmIChsYXN0X2Vycm9yICE9IEVSUk9SX0lPX1BFTkRJTkcpCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGxhc3RfZXJyb3IsCi0gICAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICAvLyBXYWl0IGZvciB0aGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlLgotICBEV09SRCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gIG9rID0gOjpHZXRPdmVybGFwcGVkUmVzdWx0KGltcGwuaGFuZGxlXywKLSAgICAgICZvdmVybGFwcGVkLCAmYnl0ZXNfdHJhbnNmZXJyZWQsIFRSVUUpOwotICBpZiAoIW9rKQotICB7Ci0gICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGxhc3RfZXJyb3IsCi0gICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLX0KLQotdm9pZCB3aW5faW9jcF9oYW5kbGVfc2VydmljZTo6c3RhcnRfd3JpdGVfb3AoCi0gICAgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIHVpbnQ2NF90IG9mZnNldCwKLSAgICBjb25zdCBhc2lvOjpjb25zdF9idWZmZXImIGJ1ZmZlciwgb3BlcmF0aW9uKiBvcCkKLXsKLSAgdXBkYXRlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWQoaW1wbCk7Ci0gIGlvY3Bfc2VydmljZV8ud29ya19zdGFydGVkKCk7Ci0KLSAgaWYgKCFpc19vcGVuKGltcGwpKQotICB7Ci0gICAgaW9jcF9zZXJ2aWNlXy5vbl9jb21wbGV0aW9uKG9wLCBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3IpOwotICB9Ci0gIGVsc2UgaWYgKGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcikgPT0gMCkKLSAgewotICAgIC8vIEEgcmVxdWVzdCB0byB3cml0ZSAwIGJ5dGVzIG9uIGEgaGFuZGxlIGlzIGEgbm8tb3AuCi0gICAgaW9jcF9zZXJ2aWNlXy5vbl9jb21wbGV0aW9uKG9wKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBEV09SRCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gICAgb3AtPk9mZnNldCA9IG9mZnNldCAmIDB4RkZGRkZGRkY7Ci0gICAgb3AtPk9mZnNldEhpZ2ggPSAob2Zmc2V0ID4+IDMyKSAmIDB4RkZGRkZGRkY7Ci0gICAgQk9PTCBvayA9IDo6V3JpdGVGaWxlKGltcGwuaGFuZGxlXywKLSAgICAgICAgYXNpbzo6YnVmZmVyX2Nhc3Q8TFBDVk9JRD4oYnVmZmVyKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8RFdPUkQ+KGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcikpLAotICAgICAgICAmYnl0ZXNfdHJhbnNmZXJyZWQsIG9wKTsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBpZiAoIW9rICYmIGxhc3RfZXJyb3IgIT0gRVJST1JfSU9fUEVORElORwotICAgICAgICAmJiBsYXN0X2Vycm9yICE9IEVSUk9SX01PUkVfREFUQSkKLSAgICB7Ci0gICAgICBpb2NwX3NlcnZpY2VfLm9uX2NvbXBsZXRpb24ob3AsIGxhc3RfZXJyb3IsIGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlvY3Bfc2VydmljZV8ub25fcGVuZGluZyhvcCk7Ci0gICAgfQotICB9Ci19Ci0KLXNpemVfdCB3aW5faW9jcF9oYW5kbGVfc2VydmljZTo6ZG9fcmVhZCgKLSAgICB3aW5faW9jcF9oYW5kbGVfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgdWludDY0X3Qgb2Zmc2V0LAotICAgIGNvbnN0IGFzaW86Om11dGFibGVfYnVmZmVyJiBidWZmZXIsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoIWlzX29wZW4oaW1wbCkpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gMDsKLSAgfQotICAKLSAgLy8gQSByZXF1ZXN0IHRvIHJlYWQgMCBieXRlcyBvbiBhIHN0cmVhbSBoYW5kbGUgaXMgYSBuby1vcC4KLSAgaWYgKGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcikgPT0gMCkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgb3ZlcmxhcHBlZF93cmFwcGVyIG92ZXJsYXBwZWQoZWMpOwotICBpZiAoZWMpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFJlYWQgc29tZSBkYXRhLgotICBvdmVybGFwcGVkLk9mZnNldCA9IG9mZnNldCAmIDB4RkZGRkZGRkY7Ci0gIG92ZXJsYXBwZWQuT2Zmc2V0SGlnaCA9IChvZmZzZXQgPj4gMzIpICYgMHhGRkZGRkZGRjsKLSAgQk9PTCBvayA9IDo6UmVhZEZpbGUoaW1wbC5oYW5kbGVfLAotICAgICAgYXNpbzo6YnVmZmVyX2Nhc3Q8TFBWT0lEPihidWZmZXIpLAotICAgICAgc3RhdGljX2Nhc3Q8RFdPUkQ+KGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcikpLCAwLCAmb3ZlcmxhcHBlZCk7Ci0gIGlmICghb2spIAotICB7Ci0gICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgaWYgKGxhc3RfZXJyb3IgIT0gRVJST1JfSU9fUEVORElORyAmJiBsYXN0X2Vycm9yICE9IEVSUk9SX01PUkVfREFUQSkKLSAgICB7Ci0gICAgICBpZiAobGFzdF9lcnJvciA9PSBFUlJPUl9IQU5ETEVfRU9GKQotICAgICAgewotICAgICAgICBlYyA9IGFzaW86OmVycm9yOjplb2Y7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShsYXN0X2Vycm9yLAotICAgICAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICAvLyBXYWl0IGZvciB0aGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlLgotICBEV09SRCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gIG9rID0gOjpHZXRPdmVybGFwcGVkUmVzdWx0KGltcGwuaGFuZGxlXywKLSAgICAgICZvdmVybGFwcGVkLCAmYnl0ZXNfdHJhbnNmZXJyZWQsIFRSVUUpOwotICBpZiAoIW9rKQotICB7Ci0gICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgaWYgKGxhc3RfZXJyb3IgPT0gRVJST1JfSEFORExFX0VPRikKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjplb2Y7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUobGFzdF9lcnJvciwKLSAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChsYXN0X2Vycm9yID09IEVSUk9SX01PUkVfREFUQSkgPyBieXRlc190cmFuc2ZlcnJlZCA6IDA7Ci0gIH0KLQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotfQotCi12b2lkIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjpzdGFydF9yZWFkX29wKAotICAgIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCB1aW50NjRfdCBvZmZzZXQsCi0gICAgY29uc3QgYXNpbzo6bXV0YWJsZV9idWZmZXImIGJ1ZmZlciwgb3BlcmF0aW9uKiBvcCkKLXsKLSAgdXBkYXRlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWQoaW1wbCk7Ci0gIGlvY3Bfc2VydmljZV8ud29ya19zdGFydGVkKCk7Ci0KLSAgaWYgKCFpc19vcGVuKGltcGwpKQotICB7Ci0gICAgaW9jcF9zZXJ2aWNlXy5vbl9jb21wbGV0aW9uKG9wLCBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3IpOwotICB9Ci0gIGVsc2UgaWYgKGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcikgPT0gMCkKLSAgewotICAgIC8vIEEgcmVxdWVzdCB0byByZWFkIDAgYnl0ZXMgb24gYSBoYW5kbGUgaXMgYSBuby1vcC4KLSAgICBpb2NwX3NlcnZpY2VfLm9uX2NvbXBsZXRpb24ob3ApOwotICB9Ci0gIGVsc2UKLSAgewotICAgIERXT1JEIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLSAgICBvcC0+T2Zmc2V0ID0gb2Zmc2V0ICYgMHhGRkZGRkZGRjsKLSAgICBvcC0+T2Zmc2V0SGlnaCA9IChvZmZzZXQgPj4gMzIpICYgMHhGRkZGRkZGRjsKLSAgICBCT09MIG9rID0gOjpSZWFkRmlsZShpbXBsLmhhbmRsZV8sCi0gICAgICAgIGFzaW86OmJ1ZmZlcl9jYXN0PExQVk9JRD4oYnVmZmVyKSwKLSAgICAgICAgc3RhdGljX2Nhc3Q8RFdPUkQ+KGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcikpLAotICAgICAgICAmYnl0ZXNfdHJhbnNmZXJyZWQsIG9wKTsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBpZiAoIW9rICYmIGxhc3RfZXJyb3IgIT0gRVJST1JfSU9fUEVORElORwotICAgICAgICAmJiBsYXN0X2Vycm9yICE9IEVSUk9SX01PUkVfREFUQSkKLSAgICB7Ci0gICAgICBpb2NwX3NlcnZpY2VfLm9uX2NvbXBsZXRpb24ob3AsIGxhc3RfZXJyb3IsIGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlvY3Bfc2VydmljZV8ub25fcGVuZGluZyhvcCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2U6OnVwZGF0ZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkKAotICAgIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotewotICBpZiAoaW1wbC5zYWZlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWRfID09IDApCi0gICAgaW1wbC5zYWZlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWRfID0gOjpHZXRDdXJyZW50VGhyZWFkSWQoKTsKLSAgZWxzZSBpZiAoaW1wbC5zYWZlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWRfICE9IDo6R2V0Q3VycmVudFRocmVhZElkKCkpCi0gICAgaW1wbC5zYWZlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWRfID0gfkRXT1JEKDApOwotfQotCi12b2lkIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlOjpjbG9zZV9mb3JfZGVzdHJ1Y3Rpb24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLXsKLSAgaWYgKGlzX29wZW4oaW1wbCkpCi0gIHsKLSAgICBBU0lPX0hBTkRMRVJfT1BFUkFUSU9OKCgiaGFuZGxlIiwgJmltcGwsICJjbG9zZSIpKTsKLQotICAgIDo6Q2xvc2VIYW5kbGUoaW1wbC5oYW5kbGVfKTsKLSAgICBpbXBsLmhhbmRsZV8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLSAgICBpbXBsLnNhZmVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZF8gPSAwOwotICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9XSU5fSU9DUF9IQU5ETEVfU0VSVklDRV9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9pb19zZXJ2aWNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9pb19zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhMjIxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3BfaW9fc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3dpbl9pb2NwX2lvX3NlcnZpY2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1dJTl9JT0NQX0lPX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfV0lOX0lPQ1BfSU9fU0VSVklDRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29tcGxldGlvbl9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci12b2lkIHdpbl9pb2NwX2lvX3NlcnZpY2U6OmRpc3BhdGNoKEhhbmRsZXImIGhhbmRsZXIpCi17Ci0gIGlmICh0aHJlYWRfY2FsbF9zdGFjazo6Y29udGFpbnModGhpcykpCi0gIHsKLSAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmZ1bGwpOwotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiBjb21wbGV0aW9uX2hhbmRsZXI8SGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgImlvX3NlcnZpY2UiLCB0aGlzLCAiZGlzcGF0Y2giKSk7Ci0KLSAgICBwb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKHAucCwgZmFsc2UpOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci12b2lkIHdpbl9pb2NwX2lvX3NlcnZpY2U6OnBvc3QoSGFuZGxlciYgaGFuZGxlcikKLXsKLSAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgdHlwZWRlZiBjb21wbGV0aW9uX2hhbmRsZXI8SGFuZGxlcj4gb3A7Ci0gIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgcC5wID0gbmV3IChwLnYpIG9wKGhhbmRsZXIpOwotCi0gIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAiaW9fc2VydmljZSIsIHRoaXMsICJwb3N0IikpOwotCi0gIHBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ocC5wLCBmYWxzZSk7Ci0gIHAudiA9IHAucCA9IDA7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXZvaWQgd2luX2lvY3BfaW9fc2VydmljZTo6YWRkX3RpbWVyX3F1ZXVlKAotICAgIHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUpCi17Ci0gIGRvX2FkZF90aW1lcl9xdWV1ZShxdWV1ZSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXZvaWQgd2luX2lvY3BfaW9fc2VydmljZTo6cmVtb3ZlX3RpbWVyX3F1ZXVlKAotICAgIHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUpCi17Ci0gIGRvX3JlbW92ZV90aW1lcl9xdWV1ZShxdWV1ZSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXZvaWQgd2luX2lvY3BfaW9fc2VydmljZTo6c2NoZWR1bGVfdGltZXIodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSwKLSAgICBjb25zdCB0eXBlbmFtZSBUaW1lX1RyYWl0czo6dGltZV90eXBlJiB0aW1lLAotICAgIHR5cGVuYW1lIHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPjo6cGVyX3RpbWVyX2RhdGEmIHRpbWVyLCB3YWl0X29wKiBvcCkKLXsKLSAgLy8gSWYgdGhlIHNlcnZpY2UgaGFzIGJlZW4gc2h1dCBkb3duIHdlIHNpbGVudGx5IGRpc2NhcmQgdGhlIHRpbWVyLgotICBpZiAoOjpJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCZzaHV0ZG93bl8sIDApICE9IDApCi0gIHsKLSAgICBwb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKG9wLCBmYWxzZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZGlzcGF0Y2hfbXV0ZXhfKTsKLQotICBib29sIGVhcmxpZXN0ID0gcXVldWUuZW5xdWV1ZV90aW1lcih0aW1lLCB0aW1lciwgb3ApOwotICB3b3JrX3N0YXJ0ZWQoKTsKLSAgaWYgKGVhcmxpZXN0KQotICAgIHVwZGF0ZV90aW1lb3V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXN0ZDo6c2l6ZV90IHdpbl9pb2NwX2lvX3NlcnZpY2U6OmNhbmNlbF90aW1lcih0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlLAotICAgIHR5cGVuYW1lIHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPjo6cGVyX3RpbWVyX2RhdGEmIHRpbWVyLAotICAgIHN0ZDo6c2l6ZV90IG1heF9jYW5jZWxsZWQpCi17Ci0gIC8vIElmIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIHNodXQgZG93biB3ZSBzaWxlbnRseSBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbi4KLSAgaWYgKDo6SW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgmc2h1dGRvd25fLCAwKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKGRpc3BhdGNoX211dGV4Xyk7Ci0gIG9wX3F1ZXVlPHdpbl9pb2NwX29wZXJhdGlvbj4gb3BzOwotICBzdGQ6OnNpemVfdCBuID0gcXVldWUuY2FuY2VsX3RpbWVyKHRpbWVyLCBvcHMsIG1heF9jYW5jZWxsZWQpOwotICBwb3N0X2RlZmVycmVkX2NvbXBsZXRpb25zKG9wcyk7Ci0gIHJldHVybiBuOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfV0lOX0lPQ1BfSU9fU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9pb19zZXJ2aWNlLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9pb19zZXJ2aWNlLmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhZGNhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3BfaW9fc2VydmljZS5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MzggKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3dpbl9pb2NwX2lvX3NlcnZpY2UuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1dJTl9JT0NQX0lPX1NFUlZJQ0VfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfV0lOX0lPQ1BfSU9fU0VSVklDRV9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY3N0ZGludC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9saW1pdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9pb19zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1zdHJ1Y3Qgd2luX2lvY3BfaW9fc2VydmljZTo6d29ya19maW5pc2hlZF9vbl9ibG9ja19leGl0Ci17Ci0gIH53b3JrX2ZpbmlzaGVkX29uX2Jsb2NrX2V4aXQoKQotICB7Ci0gICAgaW9fc2VydmljZV8tPndvcmtfZmluaXNoZWQoKTsKLSAgfQotCi0gIHdpbl9pb2NwX2lvX3NlcnZpY2UqIGlvX3NlcnZpY2VfOwotfTsKLQotc3RydWN0IHdpbl9pb2NwX2lvX3NlcnZpY2U6OnRpbWVyX3RocmVhZF9mdW5jdGlvbgotewotICB2b2lkIG9wZXJhdG9yKCkoKQotICB7Ci0gICAgd2hpbGUgKDo6SW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgmaW9fc2VydmljZV8tPnNodXRkb3duXywgMCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KGlvX3NlcnZpY2VfLT53YWl0YWJsZV90aW1lcl8uaGFuZGxlLAotICAgICAgICAgICAgSU5GSU5JVEUpID09IFdBSVRfT0JKRUNUXzApCi0gICAgICB7Ci0gICAgICAgIDo6SW50ZXJsb2NrZWRFeGNoYW5nZSgmaW9fc2VydmljZV8tPmRpc3BhdGNoX3JlcXVpcmVkXywgMSk7Ci0gICAgICAgIDo6UG9zdFF1ZXVlZENvbXBsZXRpb25TdGF0dXMoaW9fc2VydmljZV8tPmlvY3BfLmhhbmRsZSwKLSAgICAgICAgICAgIDAsIHdha2VfZm9yX2Rpc3BhdGNoLCAwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB3aW5faW9jcF9pb19zZXJ2aWNlKiBpb19zZXJ2aWNlXzsKLX07Ci0KLXdpbl9pb2NwX2lvX3NlcnZpY2U6Ondpbl9pb2NwX2lvX3NlcnZpY2UoCi0gICAgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwgc2l6ZV90IGNvbmN1cnJlbmN5X2hpbnQpCi0gIDogYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8d2luX2lvY3BfaW9fc2VydmljZT4oaW9fc2VydmljZSksCi0gICAgaW9jcF8oKSwKLSAgICBvdXRzdGFuZGluZ193b3JrXygwKSwKLSAgICBzdG9wcGVkXygwKSwKLSAgICBzdG9wX2V2ZW50X3Bvc3RlZF8oMCksCi0gICAgc2h1dGRvd25fKDApLAotICAgIGdxY3NfdGltZW91dF8oZ2V0X2dxY3NfdGltZW91dCgpKSwKLSAgICBkaXNwYXRjaF9yZXF1aXJlZF8oMCkKLXsKLSAgQVNJT19IQU5ETEVSX1RSQUNLSU5HX0lOSVQ7Ci0KLSAgaW9jcF8uaGFuZGxlID0gOjpDcmVhdGVJb0NvbXBsZXRpb25Qb3J0KElOVkFMSURfSEFORExFX1ZBTFVFLCAwLCAwLAotICAgICAgc3RhdGljX2Nhc3Q8RFdPUkQ+KGNvbmN1cnJlbmN5X2hpbnQgPCBEV09SRCh+MCkKLSAgICAgICAgPyBjb25jdXJyZW5jeV9oaW50IDogRFdPUkQofjApKSk7Ci0gIGlmICghaW9jcF8uaGFuZGxlKQotICB7Ci0gICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhsYXN0X2Vycm9yLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiaW9jcCIpOwotICB9Ci19Ci0KLXZvaWQgd2luX2lvY3BfaW9fc2VydmljZTo6c2h1dGRvd25fc2VydmljZSgpCi17Ci0gIDo6SW50ZXJsb2NrZWRFeGNoYW5nZSgmc2h1dGRvd25fLCAxKTsKLQotICBpZiAodGltZXJfdGhyZWFkXy5nZXQoKSkKLSAgewotICAgIExBUkdFX0lOVEVHRVIgdGltZW91dDsKLSAgICB0aW1lb3V0LlF1YWRQYXJ0ID0gMTsKLSAgICA6OlNldFdhaXRhYmxlVGltZXIod2FpdGFibGVfdGltZXJfLmhhbmRsZSwgJnRpbWVvdXQsIDEsIDAsIDAsIEZBTFNFKTsKLSAgfQotCi0gIHdoaWxlICg6OkludGVybG9ja2VkRXhjaGFuZ2VBZGQoJm91dHN0YW5kaW5nX3dvcmtfLCAwKSA+IDApCi0gIHsKLSAgICBvcF9xdWV1ZTx3aW5faW9jcF9vcGVyYXRpb24+IG9wczsKLSAgICB0aW1lcl9xdWV1ZXNfLmdldF9hbGxfdGltZXJzKG9wcyk7Ci0gICAgb3BzLnB1c2goY29tcGxldGVkX29wc18pOwotICAgIGlmICghb3BzLmVtcHR5KCkpCi0gICAgewotICAgICAgd2hpbGUgKHdpbl9pb2NwX29wZXJhdGlvbiogb3AgPSBvcHMuZnJvbnQoKSkKLSAgICAgIHsKLSAgICAgICAgb3BzLnBvcCgpOwotICAgICAgICA6OkludGVybG9ja2VkRGVjcmVtZW50KCZvdXRzdGFuZGluZ193b3JrXyk7Ci0gICAgICAgIG9wLT5kZXN0cm95KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBEV09SRCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gICAgICBkd29yZF9wdHJfdCBjb21wbGV0aW9uX2tleSA9IDA7Ci0gICAgICBMUE9WRVJMQVBQRUQgb3ZlcmxhcHBlZCA9IDA7Ci0gICAgICA6OkdldFF1ZXVlZENvbXBsZXRpb25TdGF0dXMoaW9jcF8uaGFuZGxlLCAmYnl0ZXNfdHJhbnNmZXJyZWQsCi0gICAgICAgICAgJmNvbXBsZXRpb25fa2V5LCAmb3ZlcmxhcHBlZCwgZ3Fjc190aW1lb3V0Xyk7Ci0gICAgICBpZiAob3ZlcmxhcHBlZCkKLSAgICAgIHsKLSAgICAgICAgOjpJbnRlcmxvY2tlZERlY3JlbWVudCgmb3V0c3RhbmRpbmdfd29ya18pOwotICAgICAgICBzdGF0aWNfY2FzdDx3aW5faW9jcF9vcGVyYXRpb24qPihvdmVybGFwcGVkKS0+ZGVzdHJveSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICh0aW1lcl90aHJlYWRfLmdldCgpKQotICAgIHRpbWVyX3RocmVhZF8tPmpvaW4oKTsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSB3aW5faW9jcF9pb19zZXJ2aWNlOjpyZWdpc3Rlcl9oYW5kbGUoCi0gICAgSEFORExFIGhhbmRsZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmICg6OkNyZWF0ZUlvQ29tcGxldGlvblBvcnQoaGFuZGxlLCBpb2NwXy5oYW5kbGUsIDAsIDApID09IDApCi0gIHsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUobGFzdF9lcnJvciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIH0KLSAgcmV0dXJuIGVjOwotfQotCi1zaXplX3Qgd2luX2lvY3BfaW9fc2VydmljZTo6cnVuKGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoOjpJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCZvdXRzdGFuZGluZ193b3JrXywgMCkgPT0gMCkKLSAgewotICAgIHN0b3AoKTsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHdpbl9pb2NwX3RocmVhZF9pbmZvIHRoaXNfdGhyZWFkOwotICB0aHJlYWRfY2FsbF9zdGFjazo6Y29udGV4dCBjdHgodGhpcywgdGhpc190aHJlYWQpOwotCi0gIHNpemVfdCBuID0gMDsKLSAgd2hpbGUgKGRvX29uZSh0cnVlLCBlYykpCi0gICAgaWYgKG4gIT0gKHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KSgpKQotICAgICAgKytuOwotICByZXR1cm4gbjsKLX0KLQotc2l6ZV90IHdpbl9pb2NwX2lvX3NlcnZpY2U6OnJ1bl9vbmUoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmICg6OkludGVybG9ja2VkRXhjaGFuZ2VBZGQoJm91dHN0YW5kaW5nX3dvcmtfLCAwKSA9PSAwKQotICB7Ci0gICAgc3RvcCgpOwotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgd2luX2lvY3BfdGhyZWFkX2luZm8gdGhpc190aHJlYWQ7Ci0gIHRocmVhZF9jYWxsX3N0YWNrOjpjb250ZXh0IGN0eCh0aGlzLCB0aGlzX3RocmVhZCk7Ci0KLSAgcmV0dXJuIGRvX29uZSh0cnVlLCBlYyk7Ci19Ci0KLXNpemVfdCB3aW5faW9jcF9pb19zZXJ2aWNlOjpwb2xsKGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoOjpJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCZvdXRzdGFuZGluZ193b3JrXywgMCkgPT0gMCkKLSAgewotICAgIHN0b3AoKTsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHdpbl9pb2NwX3RocmVhZF9pbmZvIHRoaXNfdGhyZWFkOwotICB0aHJlYWRfY2FsbF9zdGFjazo6Y29udGV4dCBjdHgodGhpcywgdGhpc190aHJlYWQpOwotCi0gIHNpemVfdCBuID0gMDsKLSAgd2hpbGUgKGRvX29uZShmYWxzZSwgZWMpKQotICAgIGlmIChuICE9IChzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCkoKSkKLSAgICAgICsrbjsKLSAgcmV0dXJuIG47Ci19Ci0KLXNpemVfdCB3aW5faW9jcF9pb19zZXJ2aWNlOjpwb2xsX29uZShhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKDo6SW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgmb3V0c3RhbmRpbmdfd29ya18sIDApID09IDApCi0gIHsKLSAgICBzdG9wKCk7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB3aW5faW9jcF90aHJlYWRfaW5mbyB0aGlzX3RocmVhZDsKLSAgdGhyZWFkX2NhbGxfc3RhY2s6OmNvbnRleHQgY3R4KHRoaXMsIHRoaXNfdGhyZWFkKTsKLQotICByZXR1cm4gZG9fb25lKGZhbHNlLCBlYyk7Ci19Ci0KLXZvaWQgd2luX2lvY3BfaW9fc2VydmljZTo6c3RvcCgpCi17Ci0gIGlmICg6OkludGVybG9ja2VkRXhjaGFuZ2UoJnN0b3BwZWRfLCAxKSA9PSAwKQotICB7Ci0gICAgaWYgKDo6SW50ZXJsb2NrZWRFeGNoYW5nZSgmc3RvcF9ldmVudF9wb3N0ZWRfLCAxKSA9PSAwKQotICAgIHsKLSAgICAgIGlmICghOjpQb3N0UXVldWVkQ29tcGxldGlvblN0YXR1cyhpb2NwXy5oYW5kbGUsIDAsIDAsIDApKQotICAgICAgewotICAgICAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhsYXN0X2Vycm9yLAotICAgICAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJwcWNzIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgd2luX2lvY3BfaW9fc2VydmljZTo6cG9zdF9kZWZlcnJlZF9jb21wbGV0aW9uKHdpbl9pb2NwX29wZXJhdGlvbiogb3ApCi17Ci0gIC8vIEZsYWcgdGhlIG9wZXJhdGlvbiBhcyByZWFkeS4KLSAgb3AtPnJlYWR5XyA9IDE7Ci0KLSAgLy8gRW5xdWV1ZSB0aGUgb3BlcmF0aW9uIG9uIHRoZSBJL08gY29tcGxldGlvbiBwb3J0LgotICBpZiAoITo6UG9zdFF1ZXVlZENvbXBsZXRpb25TdGF0dXMoaW9jcF8uaGFuZGxlLCAwLCAwLCBvcCkpCi0gIHsKLSAgICAvLyBPdXQgb2YgcmVzb3VyY2VzLiBQdXQgb24gY29tcGxldGVkIHF1ZXVlIGluc3RlYWQuCi0gICAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZGlzcGF0Y2hfbXV0ZXhfKTsKLSAgICBjb21wbGV0ZWRfb3BzXy5wdXNoKG9wKTsKLSAgICA6OkludGVybG9ja2VkRXhjaGFuZ2UoJmRpc3BhdGNoX3JlcXVpcmVkXywgMSk7Ci0gIH0KLX0KLQotdm9pZCB3aW5faW9jcF9pb19zZXJ2aWNlOjpwb3N0X2RlZmVycmVkX2NvbXBsZXRpb25zKAotICAgIG9wX3F1ZXVlPHdpbl9pb2NwX29wZXJhdGlvbj4mIG9wcykKLXsKLSAgd2hpbGUgKHdpbl9pb2NwX29wZXJhdGlvbiogb3AgPSBvcHMuZnJvbnQoKSkKLSAgewotICAgIG9wcy5wb3AoKTsKLQotICAgIC8vIEZsYWcgdGhlIG9wZXJhdGlvbiBhcyByZWFkeS4KLSAgICBvcC0+cmVhZHlfID0gMTsKLQotICAgIC8vIEVucXVldWUgdGhlIG9wZXJhdGlvbiBvbiB0aGUgSS9PIGNvbXBsZXRpb24gcG9ydC4KLSAgICBpZiAoITo6UG9zdFF1ZXVlZENvbXBsZXRpb25TdGF0dXMoaW9jcF8uaGFuZGxlLCAwLCAwLCBvcCkpCi0gICAgewotICAgICAgLy8gT3V0IG9mIHJlc291cmNlcy4gUHV0IG9uIGNvbXBsZXRlZCBxdWV1ZSBpbnN0ZWFkLgotICAgICAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZGlzcGF0Y2hfbXV0ZXhfKTsKLSAgICAgIGNvbXBsZXRlZF9vcHNfLnB1c2gob3ApOwotICAgICAgY29tcGxldGVkX29wc18ucHVzaChvcHMpOwotICAgICAgOjpJbnRlcmxvY2tlZEV4Y2hhbmdlKCZkaXNwYXRjaF9yZXF1aXJlZF8sIDEpOwotICAgIH0KLSAgfQotfQotCi12b2lkIHdpbl9pb2NwX2lvX3NlcnZpY2U6OmFiYW5kb25fb3BlcmF0aW9ucygKLSAgICBvcF9xdWV1ZTx3aW5faW9jcF9vcGVyYXRpb24+JiBvcHMpCi17Ci0gIHdoaWxlICh3aW5faW9jcF9vcGVyYXRpb24qIG9wID0gb3BzLmZyb250KCkpCi0gIHsKLSAgICBvcHMucG9wKCk7Ci0gICAgOjpJbnRlcmxvY2tlZERlY3JlbWVudCgmb3V0c3RhbmRpbmdfd29ya18pOwotICAgIG9wLT5kZXN0cm95KCk7Ci0gIH0KLX0KLQotdm9pZCB3aW5faW9jcF9pb19zZXJ2aWNlOjpvbl9wZW5kaW5nKHdpbl9pb2NwX29wZXJhdGlvbiogb3ApCi17Ci0gIGlmICg6OkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCZvcC0+cmVhZHlfLCAxLCAwKSA9PSAxKQotICB7Ci0gICAgLy8gRW5xdWV1ZSB0aGUgb3BlcmF0aW9uIG9uIHRoZSBJL08gY29tcGxldGlvbiBwb3J0LgotICAgIGlmICghOjpQb3N0UXVldWVkQ29tcGxldGlvblN0YXR1cyhpb2NwXy5oYW5kbGUsCi0gICAgICAgICAgMCwgb3ZlcmxhcHBlZF9jb250YWluc19yZXN1bHQsIG9wKSkKLSAgICB7Ci0gICAgICAvLyBPdXQgb2YgcmVzb3VyY2VzLiBQdXQgb24gY29tcGxldGVkIHF1ZXVlIGluc3RlYWQuCi0gICAgICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhkaXNwYXRjaF9tdXRleF8pOwotICAgICAgY29tcGxldGVkX29wc18ucHVzaChvcCk7Ci0gICAgICA6OkludGVybG9ja2VkRXhjaGFuZ2UoJmRpc3BhdGNoX3JlcXVpcmVkXywgMSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgd2luX2lvY3BfaW9fc2VydmljZTo6b25fY29tcGxldGlvbih3aW5faW9jcF9vcGVyYXRpb24qIG9wLAotICAgIERXT1JEIGxhc3RfZXJyb3IsIERXT1JEIGJ5dGVzX3RyYW5zZmVycmVkKQotewotICAvLyBGbGFnIHRoYXQgdGhlIG9wZXJhdGlvbiBpcyByZWFkeSBmb3IgaW52b2NhdGlvbi4KLSAgb3AtPnJlYWR5XyA9IDE7Ci0KLSAgLy8gU3RvcmUgcmVzdWx0cyBpbiB0aGUgT1ZFUkxBUFBFRCBzdHJ1Y3R1cmUuCi0gIG9wLT5JbnRlcm5hbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWxvbmdfcHRyX3Q+KAotICAgICAgJmFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICBvcC0+T2Zmc2V0ID0gbGFzdF9lcnJvcjsKLSAgb3AtPk9mZnNldEhpZ2ggPSBieXRlc190cmFuc2ZlcnJlZDsKLQotICAvLyBFbnF1ZXVlIHRoZSBvcGVyYXRpb24gb24gdGhlIEkvTyBjb21wbGV0aW9uIHBvcnQuCi0gIGlmICghOjpQb3N0UXVldWVkQ29tcGxldGlvblN0YXR1cyhpb2NwXy5oYW5kbGUsCi0gICAgICAgIDAsIG92ZXJsYXBwZWRfY29udGFpbnNfcmVzdWx0LCBvcCkpCi0gIHsKLSAgICAvLyBPdXQgb2YgcmVzb3VyY2VzLiBQdXQgb24gY29tcGxldGVkIHF1ZXVlIGluc3RlYWQuCi0gICAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZGlzcGF0Y2hfbXV0ZXhfKTsKLSAgICBjb21wbGV0ZWRfb3BzXy5wdXNoKG9wKTsKLSAgICA6OkludGVybG9ja2VkRXhjaGFuZ2UoJmRpc3BhdGNoX3JlcXVpcmVkXywgMSk7Ci0gIH0KLX0KLQotdm9pZCB3aW5faW9jcF9pb19zZXJ2aWNlOjpvbl9jb21wbGV0aW9uKHdpbl9pb2NwX29wZXJhdGlvbiogb3AsCi0gICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIERXT1JEIGJ5dGVzX3RyYW5zZmVycmVkKQotewotICAvLyBGbGFnIHRoYXQgdGhlIG9wZXJhdGlvbiBpcyByZWFkeSBmb3IgaW52b2NhdGlvbi4KLSAgb3AtPnJlYWR5XyA9IDE7Ci0KLSAgLy8gU3RvcmUgcmVzdWx0cyBpbiB0aGUgT1ZFUkxBUFBFRCBzdHJ1Y3R1cmUuCi0gIG9wLT5JbnRlcm5hbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWxvbmdfcHRyX3Q+KCZlYy5jYXRlZ29yeSgpKTsKLSAgb3AtPk9mZnNldCA9IGVjLnZhbHVlKCk7Ci0gIG9wLT5PZmZzZXRIaWdoID0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0KLSAgLy8gRW5xdWV1ZSB0aGUgb3BlcmF0aW9uIG9uIHRoZSBJL08gY29tcGxldGlvbiBwb3J0LgotICBpZiAoITo6UG9zdFF1ZXVlZENvbXBsZXRpb25TdGF0dXMoaW9jcF8uaGFuZGxlLAotICAgICAgICAwLCBvdmVybGFwcGVkX2NvbnRhaW5zX3Jlc3VsdCwgb3ApKQotICB7Ci0gICAgLy8gT3V0IG9mIHJlc291cmNlcy4gUHV0IG9uIGNvbXBsZXRlZCBxdWV1ZSBpbnN0ZWFkLgotICAgIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKGRpc3BhdGNoX211dGV4Xyk7Ci0gICAgY29tcGxldGVkX29wc18ucHVzaChvcCk7Ci0gICAgOjpJbnRlcmxvY2tlZEV4Y2hhbmdlKCZkaXNwYXRjaF9yZXF1aXJlZF8sIDEpOwotICB9Ci19Ci0KLXNpemVfdCB3aW5faW9jcF9pb19zZXJ2aWNlOjpkb19vbmUoYm9vbCBibG9jaywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGZvciAoOzspCi0gIHsKLSAgICAvLyBUcnkgdG8gYWNxdWlyZSByZXNwb25zaWJpbGl0eSBmb3IgZGlzcGF0Y2hpbmcgdGltZXJzIGFuZCBjb21wbGV0ZWQgb3BzLgotICAgIGlmICg6OkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCZkaXNwYXRjaF9yZXF1aXJlZF8sIDAsIDEpID09IDEpCi0gICAgewotICAgICAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZGlzcGF0Y2hfbXV0ZXhfKTsKLQotICAgICAgLy8gRGlzcGF0Y2ggcGVuZGluZyB0aW1lcnMgYW5kIG9wZXJhdGlvbnMuCi0gICAgICBvcF9xdWV1ZTx3aW5faW9jcF9vcGVyYXRpb24+IG9wczsKLSAgICAgIG9wcy5wdXNoKGNvbXBsZXRlZF9vcHNfKTsKLSAgICAgIHRpbWVyX3F1ZXVlc18uZ2V0X3JlYWR5X3RpbWVycyhvcHMpOwotICAgICAgcG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHMpOwotICAgICAgdXBkYXRlX3RpbWVvdXQoKTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgdGhlIG5leHQgb3BlcmF0aW9uIGZyb20gdGhlIHF1ZXVlLgotICAgIERXT1JEIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLSAgICBkd29yZF9wdHJfdCBjb21wbGV0aW9uX2tleSA9IDA7Ci0gICAgTFBPVkVSTEFQUEVEIG92ZXJsYXBwZWQgPSAwOwotICAgIDo6U2V0TGFzdEVycm9yKDApOwotICAgIEJPT0wgb2sgPSA6OkdldFF1ZXVlZENvbXBsZXRpb25TdGF0dXMoaW9jcF8uaGFuZGxlLCAmYnl0ZXNfdHJhbnNmZXJyZWQsCi0gICAgICAgICZjb21wbGV0aW9uX2tleSwgJm92ZXJsYXBwZWQsIGJsb2NrID8gZ3Fjc190aW1lb3V0XyA6IDApOwotICAgIERXT1JEIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotCi0gICAgaWYgKG92ZXJsYXBwZWQpCi0gICAgewotICAgICAgd2luX2lvY3Bfb3BlcmF0aW9uKiBvcCA9IHN0YXRpY19jYXN0PHdpbl9pb2NwX29wZXJhdGlvbio+KG92ZXJsYXBwZWQpOwotICAgICAgYXNpbzo6ZXJyb3JfY29kZSByZXN1bHRfZWMobGFzdF9lcnJvciwKLSAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLQotICAgICAgLy8gV2UgbWF5IGhhdmUgYmVlbiBwYXNzZWQgdGhlIGxhc3RfZXJyb3IgYW5kIGJ5dGVzX3RyYW5zZmVycmVkIGluIHRoZQotICAgICAgLy8gT1ZFUkxBUFBFRCBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICAgaWYgKGNvbXBsZXRpb25fa2V5ID09IG92ZXJsYXBwZWRfY29udGFpbnNfcmVzdWx0KQotICAgICAgewotICAgICAgICByZXN1bHRfZWMgPSBhc2lvOjplcnJvcl9jb2RlKHN0YXRpY19jYXN0PGludD4ob3AtPk9mZnNldCksCi0gICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxhc2lvOjplcnJvcl9jYXRlZ29yeSo+KG9wLT5JbnRlcm5hbCkpOwotICAgICAgICBieXRlc190cmFuc2ZlcnJlZCA9IG9wLT5PZmZzZXRIaWdoOwotICAgICAgfQotCi0gICAgICAvLyBPdGhlcndpc2UgZW5zdXJlIGFueSByZXN1bHQgaGFzIGJlZW4gc2F2ZWQgaW50byB0aGUgT1ZFUkxBUFBFRAotICAgICAgLy8gc3RydWN0dXJlLgotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvcC0+SW50ZXJuYWwgPSByZWludGVycHJldF9jYXN0PHVsb25nX3B0cl90PigmcmVzdWx0X2VjLmNhdGVnb3J5KCkpOwotICAgICAgICBvcC0+T2Zmc2V0ID0gcmVzdWx0X2VjLnZhbHVlKCk7Ci0gICAgICAgIG9wLT5PZmZzZXRIaWdoID0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0gICAgICB9Ci0KLSAgICAgIC8vIERpc3BhdGNoIHRoZSBvcGVyYXRpb24gb25seSBpZiByZWFkeS4gVGhlIG9wZXJhdGlvbiBtYXkgbm90IGJlIHJlYWR5Ci0gICAgICAvLyBpZiB0aGUgaW5pdGlhdGluZyBmdW5jdGlvbiAoZS5nLiBhIGNhbGwgdG8gV1NBUmVjdikgaGFzIG5vdCB5ZXQKLSAgICAgIC8vIHJldHVybmVkLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGluaXRpYXRpbmcgZnVuY3Rpb24gc3RpbGwgd2FudHMgYWNjZXNzCi0gICAgICAvLyB0byB0aGUgb3BlcmF0aW9uJ3MgT1ZFUkxBUFBFRCBzdHJ1Y3R1cmUuCi0gICAgICBpZiAoOjpJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgmb3AtPnJlYWR5XywgMSwgMCkgPT0gMSkKLSAgICAgIHsKLSAgICAgICAgLy8gRW5zdXJlIHRoZSBjb3VudCBvZiBvdXRzdGFuZGluZyB3b3JrIGlzIGRlY3JlbWVudGVkIG9uIGJsb2NrIGV4aXQuCi0gICAgICAgIHdvcmtfZmluaXNoZWRfb25fYmxvY2tfZXhpdCBvbl9leGl0ID0geyB0aGlzIH07Ci0gICAgICAgICh2b2lkKW9uX2V4aXQ7Ci0KLSAgICAgICAgb3AtPmNvbXBsZXRlKCp0aGlzLCByZXN1bHRfZWMsIGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghb2spCi0gICAgewotICAgICAgaWYgKGxhc3RfZXJyb3IgIT0gV0FJVF9USU1FT1VUKQotICAgICAgewotICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUobGFzdF9lcnJvciwKLSAgICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgd2UncmUgbm90IHBvbGxpbmcgd2UgbmVlZCB0byBrZWVwIGdvaW5nIHVudGlsIHdlIGdldCBhIHJlYWwgaGFuZGxlci4KLSAgICAgIGlmIChibG9jaykKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXBsZXRpb25fa2V5ID09IHdha2VfZm9yX2Rpc3BhdGNoKQotICAgIHsKLSAgICAgIC8vIFdlIGhhdmUgYmVlbiB3b2tlbiB1cCB0byB0cnkgdG8gYWNxdWlyZSByZXNwb25zaWJpbGl0eSBmb3IgZGlzcGF0Y2hpbmcKLSAgICAgIC8vIHRpbWVycyBhbmQgY29tcGxldGVkIG9wZXJhdGlvbnMuCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBJbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIGxvbmdlciBhbiBpbi1mbGlnaHQgc3RvcCBldmVudC4KLSAgICAgIDo6SW50ZXJsb2NrZWRFeGNoYW5nZSgmc3RvcF9ldmVudF9wb3N0ZWRfLCAwKTsKLQotICAgICAgLy8gVGhlIHN0b3BwZWRfIGZsYWcgaXMgYWx3YXlzIGNoZWNrZWQgdG8gZW5zdXJlIHRoYXQgYW55IGxlZnRvdmVyCi0gICAgICAvLyBzdG9wIGV2ZW50cyBmcm9tIGEgcHJldmlvdXMgcnVuIGludm9jYXRpb24gYXJlIGlnbm9yZWQuCi0gICAgICBpZiAoOjpJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCZzdG9wcGVkXywgMCkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gV2FrZSB1cCBuZXh0IHRocmVhZCB0aGF0IGlzIGJsb2NrZWQgb24gR2V0UXVldWVkQ29tcGxldGlvblN0YXR1cy4KLSAgICAgICAgaWYgKDo6SW50ZXJsb2NrZWRFeGNoYW5nZSgmc3RvcF9ldmVudF9wb3N0ZWRfLCAxKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCE6OlBvc3RRdWV1ZWRDb21wbGV0aW9uU3RhdHVzKGlvY3BfLmhhbmRsZSwgMCwgMCwgMCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUobGFzdF9lcnJvciwKLSAgICAgICAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotRFdPUkQgd2luX2lvY3BfaW9fc2VydmljZTo6Z2V0X2dxY3NfdGltZW91dCgpCi17Ci0gIE9TVkVSU0lPTklORk9FWCBvc3ZpOwotICBaZXJvTWVtb3J5KCZvc3ZpLCBzaXplb2Yob3N2aSkpOwotICBvc3ZpLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2Yob3N2aSk7Ci0gIG9zdmkuZHdNYWpvclZlcnNpb24gPSA2dWw7Ci0KLSAgY29uc3QgdWludDY0X3QgY29uZGl0aW9uX21hc2sgPSA6OlZlclNldENvbmRpdGlvbk1hc2soCi0gICAgICAwLCBWRVJfTUFKT1JWRVJTSU9OLCBWRVJfR1JFQVRFUl9FUVVBTCk7Ci0KLSAgaWYgKCEhOjpWZXJpZnlWZXJzaW9uSW5mbygmb3N2aSwgVkVSX01BSk9SVkVSU0lPTiwgY29uZGl0aW9uX21hc2spKQotICAgIHJldHVybiBJTkZJTklURTsKLQotICByZXR1cm4gZGVmYXVsdF9ncWNzX3RpbWVvdXQ7Ci19Ci0KLXZvaWQgd2luX2lvY3BfaW9fc2VydmljZTo6ZG9fYWRkX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlX2Jhc2UmIHF1ZXVlKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhkaXNwYXRjaF9tdXRleF8pOwotCi0gIHRpbWVyX3F1ZXVlc18uaW5zZXJ0KCZxdWV1ZSk7Ci0KLSAgaWYgKCF3YWl0YWJsZV90aW1lcl8uaGFuZGxlKQotICB7Ci0gICAgd2FpdGFibGVfdGltZXJfLmhhbmRsZSA9IDo6Q3JlYXRlV2FpdGFibGVUaW1lcigwLCBGQUxTRSwgMCk7Ci0gICAgaWYgKHdhaXRhYmxlX3RpbWVyXy5oYW5kbGUgPT0gMCkKLSAgICB7Ci0gICAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICAgIGFzaW86OmVycm9yX2NvZGUgZWMobGFzdF9lcnJvciwKLSAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ0aW1lciIpOwotICAgIH0KLQotICAgIExBUkdFX0lOVEVHRVIgdGltZW91dDsKLSAgICB0aW1lb3V0LlF1YWRQYXJ0ID0gLW1heF90aW1lb3V0X3VzZWM7Ci0gICAgdGltZW91dC5RdWFkUGFydCAqPSAxMDsKLSAgICA6OlNldFdhaXRhYmxlVGltZXIod2FpdGFibGVfdGltZXJfLmhhbmRsZSwKLSAgICAgICAgJnRpbWVvdXQsIG1heF90aW1lb3V0X21zZWMsIDAsIDAsIEZBTFNFKTsKLSAgfQotCi0gIGlmICghdGltZXJfdGhyZWFkXy5nZXQoKSkKLSAgewotICAgIHRpbWVyX3RocmVhZF9mdW5jdGlvbiB0aHJlYWRfZnVuY3Rpb24gPSB7IHRoaXMgfTsKLSAgICB0aW1lcl90aHJlYWRfLnJlc2V0KG5ldyB0aHJlYWQodGhyZWFkX2Z1bmN0aW9uLCA2NTUzNikpOwotICB9Ci19Ci0KLXZvaWQgd2luX2lvY3BfaW9fc2VydmljZTo6ZG9fcmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlX2Jhc2UmIHF1ZXVlKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhkaXNwYXRjaF9tdXRleF8pOwotCi0gIHRpbWVyX3F1ZXVlc18uZXJhc2UoJnF1ZXVlKTsKLX0KLQotdm9pZCB3aW5faW9jcF9pb19zZXJ2aWNlOjp1cGRhdGVfdGltZW91dCgpCi17Ci0gIGlmICh0aW1lcl90aHJlYWRfLmdldCgpKQotICB7Ci0gICAgLy8gVGhlcmUncyBubyBwb2ludCB1cGRhdGluZyB0aGUgd2FpdGFibGUgdGltZXIgaWYgdGhlIG5ldyB0aW1lb3V0IHBlcmlvZAotICAgIC8vIGV4Y2VlZHMgdGhlIG1heGltdW0gdGltZW91dC4gSW4gdGhhdCBjYXNlLCB3ZSBtaWdodCBhcyB3ZWxsIHdhaXQgZm9yIHRoZQotICAgIC8vIGV4aXN0aW5nIHBlcmlvZCBvZiB0aGUgdGltZXIgdG8gZXhwaXJlLgotICAgIGxvbmcgdGltZW91dF91c2VjID0gdGltZXJfcXVldWVzXy53YWl0X2R1cmF0aW9uX3VzZWMobWF4X3RpbWVvdXRfdXNlYyk7Ci0gICAgaWYgKHRpbWVvdXRfdXNlYyA8IG1heF90aW1lb3V0X3VzZWMpCi0gICAgewotICAgICAgTEFSR0VfSU5URUdFUiB0aW1lb3V0OwotICAgICAgdGltZW91dC5RdWFkUGFydCA9IC10aW1lb3V0X3VzZWM7Ci0gICAgICB0aW1lb3V0LlF1YWRQYXJ0ICo9IDEwOwotICAgICAgOjpTZXRXYWl0YWJsZVRpbWVyKHdhaXRhYmxlX3RpbWVyXy5oYW5kbGUsCi0gICAgICAgICAgJnRpbWVvdXQsIG1heF90aW1lb3V0X21zZWMsIDAsIDAsIEZBTFNFKTsKLSAgICB9Ci0gIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX1dJTl9JT0NQX0lPX1NFUlZJQ0VfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3Bfc2VyaWFsX3BvcnRfc2VydmljZS5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3Bfc2VyaWFsX3BvcnRfc2VydmljZS5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTQ2ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2UuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC93aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vIENvcHlyaWdodCAoYykgMjAwOCBSZXAgSW52YXJpYW50IFN5c3RlbXMsIEluYy4gKGluZm9AcmVwaW52YXJpYW50LmNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9XSU5fSU9DUF9TRVJJQUxfUE9SVF9TRVJWSUNFX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1dJTl9JT0NQX1NFUklBTF9QT1JUX1NFUlZJQ0VfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApICYmIGRlZmluZWQoQVNJT19IQVNfU0VSSUFMX1BPUlQpCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXdpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2U6Ondpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2UoCi0gICAgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiBoYW5kbGVfc2VydmljZV8oaW9fc2VydmljZSkKLXsKLX0KLQotdm9pZCB3aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlOjpzaHV0ZG93bl9zZXJ2aWNlKCkKLXsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSB3aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlOjpvcGVuKAotICAgIHdpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChpc19vcGVuKGltcGwpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YWxyZWFkeV9vcGVuOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIEZvciBjb252ZW5pZW5jZSwgYWRkIGEgbGVhZGluZyBcXC5cIHNlcXVlbmNlIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuCi0gIHN0ZDo6c3RyaW5nIG5hbWUgPSAoZGV2aWNlWzBdID09ICdcXCcpID8gZGV2aWNlIDogIlxcXFwuXFwiICsgZGV2aWNlOwotCi0gIC8vIE9wZW4gYSBoYW5kbGUgdG8gdGhlIHNlcmlhbCBwb3J0LgotICA6OkhBTkRMRSBoYW5kbGUgPSA6OkNyZWF0ZUZpbGVBKG5hbWUuY19zdHIoKSwKLSAgICAgIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsIDAsIDAsCi0gICAgICBPUEVOX0VYSVNUSU5HLCBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCwgMCk7Ci0gIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gIHsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUobGFzdF9lcnJvciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gRGV0ZXJtaW5lIHRoZSBpbml0aWFsIHNlcmlhbCBwb3J0IHBhcmFtZXRlcnMuCi0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1zZXQuCi0gIDo6RENCIGRjYjsKLSAgbWVtc2V0KCZkY2IsIDAsIHNpemVvZihEQ0IpKTsKLSAgZGNiLkRDQmxlbmd0aCA9IHNpemVvZihEQ0IpOwotICBpZiAoITo6R2V0Q29tbVN0YXRlKGhhbmRsZSwgJmRjYikpCi0gIHsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZSk7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGxhc3RfZXJyb3IsCi0gICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFNldCBzb21lIGRlZmF1bHQgc2VyaWFsIHBvcnQgcGFyYW1ldGVycy4gVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdAotICAvLyBzdXBwb3J0IGNoYW5naW5nIHRoZXNlLCBzbyB0aGV5IG1pZ2h0IGFzIHdlbGwgYmUgaW4gYSBrbm93biBzdGF0ZS4KLSAgZGNiLmZCaW5hcnkgPSBUUlVFOyAvLyBXaW4zMiBvbmx5IHN1cHBvcnRzIGJpbmFyeSBtb2RlLgotICBkY2IuZkRzclNlbnNpdGl2aXR5ID0gRkFMU0U7Ci0gIGRjYi5mTnVsbCA9IEZBTFNFOyAvLyBEbyBub3QgaWdub3JlIE5VTEwgY2hhcmFjdGVycy4KLSAgZGNiLmZBYm9ydE9uRXJyb3IgPSBGQUxTRTsgLy8gSWdub3JlIHNlcmlhbCBmcmFtaW5nIGVycm9ycy4KLSAgaWYgKCE6OlNldENvbW1TdGF0ZShoYW5kbGUsICZkY2IpKQotICB7Ci0gICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgOjpDbG9zZUhhbmRsZShoYW5kbGUpOwotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShsYXN0X2Vycm9yLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBTZXQgdXAgdGltZW91dHMgc28gdGhhdCB0aGUgc2VyaWFsIHBvcnQgd2lsbCBiZWhhdmUgc2ltaWxhcmx5IHRvIGEKLSAgLy8gbmV0d29yayBzb2NrZXQuIFJlYWRzIHdhaXQgZm9yIGF0IGxlYXN0IG9uZSBieXRlLCB0aGVuIHJldHVybiB3aXRoCi0gIC8vIHdoYXRldmVyIHRoZXkgaGF2ZS4gV3JpdGVzIHJldHVybiBvbmNlIGV2ZXJ5dGhpbmcgaXMgb3V0IHRoZSBkb29yLgotICA6OkNPTU1USU1FT1VUUyB0aW1lb3V0czsKLSAgdGltZW91dHMuUmVhZEludGVydmFsVGltZW91dCA9IDE7Ci0gIHRpbWVvdXRzLlJlYWRUb3RhbFRpbWVvdXRNdWx0aXBsaWVyID0gMDsKLSAgdGltZW91dHMuUmVhZFRvdGFsVGltZW91dENvbnN0YW50ID0gMDsKLSAgdGltZW91dHMuV3JpdGVUb3RhbFRpbWVvdXRNdWx0aXBsaWVyID0gMDsKLSAgdGltZW91dHMuV3JpdGVUb3RhbFRpbWVvdXRDb25zdGFudCA9IDA7Ci0gIGlmICghOjpTZXRDb21tVGltZW91dHMoaGFuZGxlLCAmdGltZW91dHMpKQotICB7Ci0gICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgOjpDbG9zZUhhbmRsZShoYW5kbGUpOwotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShsYXN0X2Vycm9yLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBXZSdyZSBkb25lLiBUYWtlIG93bmVyc2hpcCBvZiB0aGUgc2VyaWFsIHBvcnQgaGFuZGxlLgotICBpZiAoaGFuZGxlX3NlcnZpY2VfLmFzc2lnbihpbXBsLCBoYW5kbGUsIGVjKSkKLSAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZSk7Ci0gIHJldHVybiBlYzsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSB3aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlOjpkb19zZXRfb3B0aW9uKAotICAgIHdpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgd2luX2lvY3Bfc2VyaWFsX3BvcnRfc2VydmljZTo6c3RvcmVfZnVuY3Rpb25fdHlwZSBzdG9yZSwKLSAgICBjb25zdCB2b2lkKiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3IgbWVtY3B5LgotCi0gIDo6RENCIGRjYjsKLSAgbWVtc2V0KCZkY2IsIDAsIHNpemVvZihEQ0IpKTsKLSAgZGNiLkRDQmxlbmd0aCA9IHNpemVvZihEQ0IpOwotICBpZiAoITo6R2V0Q29tbVN0YXRlKGhhbmRsZV9zZXJ2aWNlXy5uYXRpdmVfaGFuZGxlKGltcGwpLCAmZGNiKSkKLSAgewotICAgIERXT1JEIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShsYXN0X2Vycm9yLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICBpZiAoc3RvcmUob3B0aW9uLCBkY2IsIGVjKSkKLSAgICByZXR1cm4gZWM7Ci0KLSAgaWYgKCE6OlNldENvbW1TdGF0ZShoYW5kbGVfc2VydmljZV8ubmF0aXZlX2hhbmRsZShpbXBsKSwgJmRjYikpCi0gIHsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUobGFzdF9lcnJvciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSB3aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlOjpkb19nZXRfb3B0aW9uKAotICAgIGNvbnN0IHdpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgd2luX2lvY3Bfc2VyaWFsX3BvcnRfc2VydmljZTo6bG9hZF9mdW5jdGlvbl90eXBlIGxvYWQsCi0gICAgdm9pZCogb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLXsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbXNldC4KLQotICA6OkRDQiBkY2I7Ci0gIG1lbXNldCgmZGNiLCAwLCBzaXplb2YoRENCKSk7Ci0gIGRjYi5EQ0JsZW5ndGggPSBzaXplb2YoRENCKTsKLSAgaWYgKCE6OkdldENvbW1TdGF0ZShoYW5kbGVfc2VydmljZV8ubmF0aXZlX2hhbmRsZShpbXBsKSwgJmRjYikpCi0gIHsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUobGFzdF9lcnJvciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgcmV0dXJuIGxvYWQob3B0aW9uLCBkY2IsIGVjKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApICYmIGRlZmluZWQoQVNJT19IQVNfU0VSSUFMX1BPUlQpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX1dJTl9JT0NQX1NFUklBTF9QT1JUX1NFUlZJQ0VfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OTRlMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC93aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9XSU5fSU9DUF9TT0NLRVRfU0VSVklDRV9CQVNFX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1dJTl9JT0NQX1NPQ0tFVF9TRVJWSUNFX0JBU0VfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi13aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjp3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlKAotICAgIGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gIDogaW9fc2VydmljZV8oaW9fc2VydmljZSksCi0gICAgaW9jcF9zZXJ2aWNlXyh1c2Vfc2VydmljZTx3aW5faW9jcF9pb19zZXJ2aWNlPihpb19zZXJ2aWNlKSksCi0gICAgcmVhY3Rvcl8oMCksCi0gICAgY29ubmVjdF9leF8oMCksCi0gICAgbXV0ZXhfKCksCi0gICAgaW1wbF9saXN0XygwKQotewotfQotCi12b2lkIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OnNodXRkb3duX3NlcnZpY2UoKQotewotICAvLyBDbG9zZSBhbGwgaW1wbGVtZW50YXRpb25zLCBjYXVzaW5nIGFsbCBvcGVyYXRpb25zIHRvIGNvbXBsZXRlLgotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSogaW1wbCA9IGltcGxfbGlzdF87Ci0gIHdoaWxlIChpbXBsKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBpZ25vcmVkX2VjOwotICAgIGNsb3NlX2Zvcl9kZXN0cnVjdGlvbigqaW1wbCk7Ci0gICAgaW1wbCA9IGltcGwtPm5leHRfOwotICB9Ci19Ci0KLXZvaWQgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6Y29uc3RydWN0KAotICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLXsKLSAgaW1wbC5zb2NrZXRfID0gaW52YWxpZF9zb2NrZXQ7Ci0gIGltcGwuc3RhdGVfID0gMDsKLSAgaW1wbC5jYW5jZWxfdG9rZW5fLnJlc2V0KCk7Ci0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9DQU5DRUxJTykKLSAgaW1wbC5zYWZlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWRfID0gMDsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0NBTkNFTElPKQotCi0gIC8vIEluc2VydCBpbXBsZW1lbnRhdGlvbiBpbnRvIGxpbmtlZCBsaXN0IG9mIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgaW1wbC5uZXh0XyA9IGltcGxfbGlzdF87Ci0gIGltcGwucHJldl8gPSAwOwotICBpZiAoaW1wbF9saXN0XykKLSAgICBpbXBsX2xpc3RfLT5wcmV2XyA9ICZpbXBsOwotICBpbXBsX2xpc3RfID0gJmltcGw7Ci19Ci0KLXZvaWQgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9tb3ZlX2NvbnN0cnVjdCgKLSAgICB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotewotICBpbXBsLnNvY2tldF8gPSBvdGhlcl9pbXBsLnNvY2tldF87Ci0gIG90aGVyX2ltcGwuc29ja2V0XyA9IGludmFsaWRfc29ja2V0OwotCi0gIGltcGwuc3RhdGVfID0gb3RoZXJfaW1wbC5zdGF0ZV87Ci0gIG90aGVyX2ltcGwuc3RhdGVfID0gMDsKLQotICBpbXBsLmNhbmNlbF90b2tlbl8gPSBvdGhlcl9pbXBsLmNhbmNlbF90b2tlbl87Ci0gIG90aGVyX2ltcGwuY2FuY2VsX3Rva2VuXy5yZXNldCgpOwotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9DQU5DRUxJTykKLSAgaW1wbC5zYWZlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWRfID0gb3RoZXJfaW1wbC5zYWZlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWRfOwotICBvdGhlcl9pbXBsLnNhZmVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZF8gPSAwOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfQ0FOQ0VMSU8pCi0KLSAgLy8gSW5zZXJ0IGltcGxlbWVudGF0aW9uIGludG8gbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBpbXBsLm5leHRfID0gaW1wbF9saXN0XzsKLSAgaW1wbC5wcmV2XyA9IDA7Ci0gIGlmIChpbXBsX2xpc3RfKQotICAgIGltcGxfbGlzdF8tPnByZXZfID0gJmltcGw7Ci0gIGltcGxfbGlzdF8gPSAmaW1wbDsKLX0KLQotdm9pZCB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX21vdmVfYXNzaWduKAotICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlJiBvdGhlcl9zZXJ2aWNlLAotICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLXsKLSAgY2xvc2VfZm9yX2Rlc3RydWN0aW9uKGltcGwpOwotCi0gIGlmICh0aGlzICE9ICZvdGhlcl9zZXJ2aWNlKQotICB7Ci0gICAgLy8gUmVtb3ZlIGltcGxlbWVudGF0aW9uIGZyb20gbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgaWYgKGltcGxfbGlzdF8gPT0gJmltcGwpCi0gICAgICBpbXBsX2xpc3RfID0gaW1wbC5uZXh0XzsKLSAgICBpZiAoaW1wbC5wcmV2XykKLSAgICAgIGltcGwucHJldl8tPm5leHRfID0gaW1wbC5uZXh0XzsKLSAgICBpZiAoaW1wbC5uZXh0XykKLSAgICAgIGltcGwubmV4dF8tPnByZXZfPSBpbXBsLnByZXZfOwotICAgIGltcGwubmV4dF8gPSAwOwotICAgIGltcGwucHJldl8gPSAwOwotICB9Ci0KLSAgaW1wbC5zb2NrZXRfID0gb3RoZXJfaW1wbC5zb2NrZXRfOwotICBvdGhlcl9pbXBsLnNvY2tldF8gPSBpbnZhbGlkX3NvY2tldDsKLQotICBpbXBsLnN0YXRlXyA9IG90aGVyX2ltcGwuc3RhdGVfOwotICBvdGhlcl9pbXBsLnN0YXRlXyA9IDA7Ci0KLSAgaW1wbC5jYW5jZWxfdG9rZW5fID0gb3RoZXJfaW1wbC5jYW5jZWxfdG9rZW5fOwotICBvdGhlcl9pbXBsLmNhbmNlbF90b2tlbl8ucmVzZXQoKTsKLQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfQ0FOQ0VMSU8pCi0gIGltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXyA9IG90aGVyX2ltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXzsKLSAgb3RoZXJfaW1wbC5zYWZlX2NhbmNlbGxhdGlvbl90aHJlYWRfaWRfID0gMDsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0NBTkNFTElPKQotCi0gIGlmICh0aGlzICE9ICZvdGhlcl9zZXJ2aWNlKQotICB7Ci0gICAgLy8gSW5zZXJ0IGltcGxlbWVudGF0aW9uIGludG8gbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG90aGVyX3NlcnZpY2UubXV0ZXhfKTsKLSAgICBpbXBsLm5leHRfID0gb3RoZXJfc2VydmljZS5pbXBsX2xpc3RfOwotICAgIGltcGwucHJldl8gPSAwOwotICAgIGlmIChvdGhlcl9zZXJ2aWNlLmltcGxfbGlzdF8pCi0gICAgICBvdGhlcl9zZXJ2aWNlLmltcGxfbGlzdF8tPnByZXZfID0gJmltcGw7Ci0gICAgb3RoZXJfc2VydmljZS5pbXBsX2xpc3RfID0gJmltcGw7Ci0gIH0KLX0KLQotdm9pZCB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpkZXN0cm95KAotICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLXsKLSAgY2xvc2VfZm9yX2Rlc3RydWN0aW9uKGltcGwpOwotCi0gIC8vIFJlbW92ZSBpbXBsZW1lbnRhdGlvbiBmcm9tIGxpbmtlZCBsaXN0IG9mIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgaWYgKGltcGxfbGlzdF8gPT0gJmltcGwpCi0gICAgaW1wbF9saXN0XyA9IGltcGwubmV4dF87Ci0gIGlmIChpbXBsLnByZXZfKQotICAgIGltcGwucHJldl8tPm5leHRfID0gaW1wbC5uZXh0XzsKLSAgaWYgKGltcGwubmV4dF8pCi0gICAgaW1wbC5uZXh0Xy0+cHJldl89IGltcGwucHJldl87Ci0gIGltcGwubmV4dF8gPSAwOwotICBpbXBsLnByZXZfID0gMDsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpjbG9zZSgKLSAgICB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChpc19vcGVuKGltcGwpKQotICB7Ci0gICAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoInNvY2tldCIsICZpbXBsLCAiY2xvc2UiKSk7Ci0KLSAgICAvLyBDaGVjayBpZiB0aGUgcmVhY3RvciB3YXMgY3JlYXRlZCwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZQotICAgIC8vIHNvY2tldCBvbiB0aGUgcmVhY3RvciBhcyB3ZWxsIHRvIGNhbmNlbCBhbnkgb3BlcmF0aW9ucyB0aGF0IG1pZ2h0IGJlCi0gICAgLy8gcnVubmluZyB0aGVyZS4KLSAgICByZWFjdG9yKiByID0gc3RhdGljX2Nhc3Q8cmVhY3Rvcio+KAotICAgICAgICAgIGludGVybG9ja2VkX2NvbXBhcmVfZXhjaGFuZ2VfcG9pbnRlcigKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmcmVhY3Rvcl8pLCAwLCAwKSk7Ci0gICAgaWYgKHIpCi0gICAgICByLT5kZXJlZ2lzdGVyX2Rlc2NyaXB0b3IoaW1wbC5zb2NrZXRfLCBpbXBsLnJlYWN0b3JfZGF0YV8sIHRydWUpOwotICB9Ci0KLSAgc29ja2V0X29wczo6Y2xvc2UoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywgZmFsc2UsIGVjKTsKLQotICBpbXBsLnNvY2tldF8gPSBpbnZhbGlkX3NvY2tldDsKLSAgaW1wbC5zdGF0ZV8gPSAwOwotICBpbXBsLmNhbmNlbF90b2tlbl8ucmVzZXQoKTsKLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0NBTkNFTElPKQotICBpbXBsLnNhZmVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZF8gPSAwOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfQ0FOQ0VMSU8pCi0KLSAgcmV0dXJuIGVjOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmNhbmNlbCgKLSAgICB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmICghaXNfb3BlbihpbXBsKSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIEFTSU9fSEFORExFUl9PUEVSQVRJT04oKCJzb2NrZXQiLCAmaW1wbCwgImNhbmNlbCIpKTsKLQotICBpZiAoRkFSUFJPQyBjYW5jZWxfaW9fZXhfcHRyID0gOjpHZXRQcm9jQWRkcmVzcygKLSAgICAgICAgOjpHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCAiQ2FuY2VsSW9FeCIpKQotICB7Ci0gICAgLy8gVGhlIHZlcnNpb24gb2YgV2luZG93cyBzdXBwb3J0cyBjYW5jZWxsYXRpb24gZnJvbSBhbnkgdGhyZWFkLgotICAgIHR5cGVkZWYgQk9PTCAoV0lOQVBJKiBjYW5jZWxfaW9fZXhfdCkoSEFORExFLCBMUE9WRVJMQVBQRUQpOwotICAgIGNhbmNlbF9pb19leF90IGNhbmNlbF9pb19leCA9IChjYW5jZWxfaW9fZXhfdCljYW5jZWxfaW9fZXhfcHRyOwotICAgIHNvY2tldF90eXBlIHNvY2sgPSBpbXBsLnNvY2tldF87Ci0gICAgSEFORExFIHNvY2tfYXNfaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KHNvY2spOwotICAgIGlmICghY2FuY2VsX2lvX2V4KHNvY2tfYXNfaGFuZGxlLCAwKSkKLSAgICB7Ci0gICAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICAgIGlmIChsYXN0X2Vycm9yID09IEVSUk9SX05PVF9GT1VORCkKLSAgICAgIHsKLSAgICAgICAgLy8gRVJST1JfTk9UX0ZPVU5EIG1lYW5zIHRoYXQgdGhlcmUgd2VyZSBubyBvcGVyYXRpb25zIHRvIGJlCi0gICAgICAgIC8vIGNhbmNlbGxlZC4gV2Ugc3dhbGxvdyB0aGlzIGVycm9yIHRvIG1hdGNoIHRoZSBiZWhhdmlvdXIgb24gb3RoZXIKLSAgICAgICAgLy8gcGxhdGZvcm1zLgotICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGxhc3RfZXJyb3IsCi0gICAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIH0KLSAgfQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfQ0FOQ0VMSU8pCi0gIGVsc2UgaWYgKGltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXyA9PSAwKQotICB7Ci0gICAgLy8gTm8gb3BlcmF0aW9ucyBoYXZlIGJlZW4gc3RhcnRlZCwgc28gdGhlcmUncyBub3RoaW5nIHRvIGNhbmNlbC4KLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgfQotICBlbHNlIGlmIChpbXBsLnNhZmVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZF8gPT0gOjpHZXRDdXJyZW50VGhyZWFkSWQoKSkKLSAgewotICAgIC8vIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGhhdmUgYmVlbiBzdGFydGVkIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkIG9ubHksCi0gICAgLy8gc28gaXQgaXMgc2FmZSB0byB0cnkgdG8gY2FuY2VsIHRoZW0gdXNpbmcgQ2FuY2VsSW8uCi0gICAgc29ja2V0X3R5cGUgc29jayA9IGltcGwuc29ja2V0XzsKLSAgICBIQU5ETEUgc29ja19hc19oYW5kbGUgPSByZWludGVycHJldF9jYXN0PEhBTkRMRT4oc29jayk7Ci0gICAgaWYgKCE6OkNhbmNlbElvKHNvY2tfYXNfaGFuZGxlKSkKLSAgICB7Ci0gICAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShsYXN0X2Vycm9yLAotICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIC8vIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGhhdmUgYmVlbiBzdGFydGVkIGZyb20gbW9yZSB0aGFuIG9uZSB0aHJlYWQsCi0gICAgLy8gc28gY2FuY2VsbGF0aW9uIGlzIG5vdCBzYWZlLgotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICB9Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0NBTkNFTElPKQotICBlbHNlCi0gIHsKLSAgICAvLyBDYW5jZWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBhcyBDYW5jZWxJbyBtYXkgbm90IGJlIHVzZWQuCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0NBTkNFTElPKQotCi0gIC8vIENhbmNlbCBhbnkgb3BlcmF0aW9ucyBzdGFydGVkIHZpYSB0aGUgcmVhY3Rvci4KLSAgaWYgKCFlYykKLSAgewotICAgIHJlYWN0b3IqIHIgPSBzdGF0aWNfY2FzdDxyZWFjdG9yKj4oCi0gICAgICAgICAgaW50ZXJsb2NrZWRfY29tcGFyZV9leGNoYW5nZV9wb2ludGVyKAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZyZWFjdG9yXyksIDAsIDApKTsKLSAgICBpZiAocikKLSAgICAgIHItPmNhbmNlbF9vcHMoaW1wbC5zb2NrZXRfLCBpbXBsLnJlYWN0b3JfZGF0YV8pOwotICB9Ci0KLSAgcmV0dXJuIGVjOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmRvX29wZW4oCi0gICAgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoaXNfb3BlbihpbXBsKSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmFscmVhZHlfb3BlbjsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICBzb2NrZXRfaG9sZGVyIHNvY2soc29ja2V0X29wczo6c29ja2V0KGZhbWlseSwgdHlwZSwgcHJvdG9jb2wsIGVjKSk7Ci0gIGlmIChzb2NrLmdldCgpID09IGludmFsaWRfc29ja2V0KQotICAgIHJldHVybiBlYzsKLQotICBIQU5ETEUgc29ja19hc19oYW5kbGUgPSByZWludGVycHJldF9jYXN0PEhBTkRMRT4oc29jay5nZXQoKSk7Ci0gIGlmIChpb2NwX3NlcnZpY2VfLnJlZ2lzdGVyX2hhbmRsZShzb2NrX2FzX2hhbmRsZSwgZWMpKQotICAgIHJldHVybiBlYzsKLQotICBpbXBsLnNvY2tldF8gPSBzb2NrLnJlbGVhc2UoKTsKLSAgc3dpdGNoICh0eXBlKQotICB7Ci0gIGNhc2UgU09DS19TVFJFQU06IGltcGwuc3RhdGVfID0gc29ja2V0X29wczo6c3RyZWFtX29yaWVudGVkOyBicmVhazsKLSAgY2FzZSBTT0NLX0RHUkFNOiBpbXBsLnN0YXRlXyA9IHNvY2tldF9vcHM6OmRhdGFncmFtX29yaWVudGVkOyBicmVhazsKLSAgZGVmYXVsdDogaW1wbC5zdGF0ZV8gPSAwOyBicmVhazsKLSAgfQotICBpbXBsLmNhbmNlbF90b2tlbl8ucmVzZXQoc3RhdGljX2Nhc3Q8dm9pZCo+KDApLCBzb2NrZXRfb3BzOjpub29wX2RlbGV0ZXIoKSk7Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6ZG9fYXNzaWduKAotICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBpbnQgdHlwZSwgc29ja2V0X3R5cGUgbmF0aXZlX3NvY2tldCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChpc19vcGVuKGltcGwpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YWxyZWFkeV9vcGVuOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIEhBTkRMRSBzb2NrX2FzX2hhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExFPihuYXRpdmVfc29ja2V0KTsKLSAgaWYgKGlvY3Bfc2VydmljZV8ucmVnaXN0ZXJfaGFuZGxlKHNvY2tfYXNfaGFuZGxlLCBlYykpCi0gICAgcmV0dXJuIGVjOwotCi0gIGltcGwuc29ja2V0XyA9IG5hdGl2ZV9zb2NrZXQ7Ci0gIHN3aXRjaCAodHlwZSkKLSAgewotICBjYXNlIFNPQ0tfU1RSRUFNOiBpbXBsLnN0YXRlXyA9IHNvY2tldF9vcHM6OnN0cmVhbV9vcmllbnRlZDsgYnJlYWs7Ci0gIGNhc2UgU09DS19ER1JBTTogaW1wbC5zdGF0ZV8gPSBzb2NrZXRfb3BzOjpkYXRhZ3JhbV9vcmllbnRlZDsgYnJlYWs7Ci0gIGRlZmF1bHQ6IGltcGwuc3RhdGVfID0gMDsgYnJlYWs7Ci0gIH0KLSAgaW1wbC5jYW5jZWxfdG9rZW5fLnJlc2V0KHN0YXRpY19jYXN0PHZvaWQqPigwKSwgc29ja2V0X29wczo6bm9vcF9kZWxldGVyKCkpOwotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi12b2lkIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OnN0YXJ0X3NlbmRfb3AoCi0gICAgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIFdTQUJVRiogYnVmZmVycywgc3RkOjpzaXplX3QgYnVmZmVyX2NvdW50LAotICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBib29sIG5vb3AsIG9wZXJhdGlvbiogb3ApCi17Ci0gIHVwZGF0ZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkKGltcGwpOwotICBpb2NwX3NlcnZpY2VfLndvcmtfc3RhcnRlZCgpOwotCi0gIGlmIChub29wKQotICAgIGlvY3Bfc2VydmljZV8ub25fY29tcGxldGlvbihvcCk7Ci0gIGVsc2UgaWYgKCFpc19vcGVuKGltcGwpKQotICAgIGlvY3Bfc2VydmljZV8ub25fY29tcGxldGlvbihvcCwgYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yKTsKLSAgZWxzZQotICB7Ci0gICAgRFdPUkQgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOwotICAgIGludCByZXN1bHQgPSA6OldTQVNlbmQoaW1wbC5zb2NrZXRfLCBidWZmZXJzLAotICAgICAgICBzdGF0aWNfY2FzdDxEV09SRD4oYnVmZmVyX2NvdW50KSwgJmJ5dGVzX3RyYW5zZmVycmVkLCBmbGFncywgb3AsIDApOwotICAgIERXT1JEIGxhc3RfZXJyb3IgPSA6OldTQUdldExhc3RFcnJvcigpOwotICAgIGlmIChsYXN0X2Vycm9yID09IEVSUk9SX1BPUlRfVU5SRUFDSEFCTEUpCi0gICAgICBsYXN0X2Vycm9yID0gV1NBRUNPTk5SRUZVU0VEOwotICAgIGlmIChyZXN1bHQgIT0gMCAmJiBsYXN0X2Vycm9yICE9IFdTQV9JT19QRU5ESU5HKQotICAgICAgaW9jcF9zZXJ2aWNlXy5vbl9jb21wbGV0aW9uKG9wLCBsYXN0X2Vycm9yLCBieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgZWxzZQotICAgICAgaW9jcF9zZXJ2aWNlXy5vbl9wZW5kaW5nKG9wKTsKLSAgfQotfQotCi12b2lkIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OnN0YXJ0X3NlbmRfdG9fb3AoCi0gICAgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIFdTQUJVRiogYnVmZmVycywgc3RkOjpzaXplX3QgYnVmZmVyX2NvdW50LAotICAgIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsIGludCBhZGRybGVuLAotICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBvcGVyYXRpb24qIG9wKQotewotICB1cGRhdGVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZChpbXBsKTsKLSAgaW9jcF9zZXJ2aWNlXy53b3JrX3N0YXJ0ZWQoKTsKLQotICBpZiAoIWlzX29wZW4oaW1wbCkpCi0gICAgaW9jcF9zZXJ2aWNlXy5vbl9jb21wbGV0aW9uKG9wLCBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3IpOwotICBlbHNlCi0gIHsKLSAgICBEV09SRCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gICAgaW50IHJlc3VsdCA9IDo6V1NBU2VuZFRvKGltcGwuc29ja2V0XywgYnVmZmVycywKLSAgICAgICAgc3RhdGljX2Nhc3Q8RFdPUkQ+KGJ1ZmZlcl9jb3VudCksCi0gICAgICAgICZieXRlc190cmFuc2ZlcnJlZCwgZmxhZ3MsIGFkZHIsIGFkZHJsZW4sIG9wLCAwKTsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICBpZiAobGFzdF9lcnJvciA9PSBFUlJPUl9QT1JUX1VOUkVBQ0hBQkxFKQotICAgICAgbGFzdF9lcnJvciA9IFdTQUVDT05OUkVGVVNFRDsKLSAgICBpZiAocmVzdWx0ICE9IDAgJiYgbGFzdF9lcnJvciAhPSBXU0FfSU9fUEVORElORykKLSAgICAgIGlvY3Bfc2VydmljZV8ub25fY29tcGxldGlvbihvcCwgbGFzdF9lcnJvciwgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIGVsc2UKLSAgICAgIGlvY3Bfc2VydmljZV8ub25fcGVuZGluZyhvcCk7Ci0gIH0KLX0KLQotdm9pZCB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpzdGFydF9yZWNlaXZlX29wKAotICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBXU0FCVUYqIGJ1ZmZlcnMsIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3VudCwKLSAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgYm9vbCBub29wLCBvcGVyYXRpb24qIG9wKQotewotICB1cGRhdGVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZChpbXBsKTsKLSAgaW9jcF9zZXJ2aWNlXy53b3JrX3N0YXJ0ZWQoKTsKLQotICBpZiAobm9vcCkKLSAgICBpb2NwX3NlcnZpY2VfLm9uX2NvbXBsZXRpb24ob3ApOwotICBlbHNlIGlmICghaXNfb3BlbihpbXBsKSkKLSAgICBpb2NwX3NlcnZpY2VfLm9uX2NvbXBsZXRpb24ob3AsIGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcik7Ci0gIGVsc2UKLSAgewotICAgIERXT1JEIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLSAgICBEV09SRCByZWN2X2ZsYWdzID0gZmxhZ3M7Ci0gICAgaW50IHJlc3VsdCA9IDo6V1NBUmVjdihpbXBsLnNvY2tldF8sIGJ1ZmZlcnMsCi0gICAgICAgIHN0YXRpY19jYXN0PERXT1JEPihidWZmZXJfY291bnQpLAotICAgICAgICAmYnl0ZXNfdHJhbnNmZXJyZWQsICZyZWN2X2ZsYWdzLCBvcCwgMCk7Ci0gICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6V1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgaWYgKGxhc3RfZXJyb3IgPT0gRVJST1JfTkVUTkFNRV9ERUxFVEVEKQotICAgICAgbGFzdF9lcnJvciA9IFdTQUVDT05OUkVTRVQ7Ci0gICAgZWxzZSBpZiAobGFzdF9lcnJvciA9PSBFUlJPUl9QT1JUX1VOUkVBQ0hBQkxFKQotICAgICAgbGFzdF9lcnJvciA9IFdTQUVDT05OUkVGVVNFRDsKLSAgICBpZiAocmVzdWx0ICE9IDAgJiYgbGFzdF9lcnJvciAhPSBXU0FfSU9fUEVORElORykKLSAgICAgIGlvY3Bfc2VydmljZV8ub25fY29tcGxldGlvbihvcCwgbGFzdF9lcnJvciwgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIGVsc2UKLSAgICAgIGlvY3Bfc2VydmljZV8ub25fcGVuZGluZyhvcCk7Ci0gIH0KLX0KLQotdm9pZCB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpzdGFydF9udWxsX2J1ZmZlcnNfcmVjZWl2ZV9vcCgKLSAgICB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIHJlYWN0b3Jfb3AqIG9wKQotewotICBpZiAoKGltcGwuc3RhdGVfICYgc29ja2V0X29wczo6c3RyZWFtX29yaWVudGVkKSAhPSAwKQotICB7Ci0gICAgLy8gRm9yIHN0cmVhbSBzb2NrZXRzIG9uIFdpbmRvd3MsIHdlIG1heSBpc3N1ZSBhIDAtYnl0ZSBvdmVybGFwcGVkCi0gICAgLy8gV1NBUmVjdiB0byB3YWl0IHVudGlsIHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlIG9uIHRoZSBzb2NrZXQuCi0gICAgOjpXU0FCVUYgYnVmID0geyAwLCAwIH07Ci0gICAgc3RhcnRfcmVjZWl2ZV9vcChpbXBsLCAmYnVmLCAxLCBmbGFncywgZmFsc2UsIG9wKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBzdGFydF9yZWFjdG9yX29wKGltcGwsCi0gICAgICAgIChmbGFncyAmIHNvY2tldF9iYXNlOjptZXNzYWdlX291dF9vZl9iYW5kKQotICAgICAgICAgID8gcmVhY3Rvcjo6ZXhjZXB0X29wIDogcmVhY3Rvcjo6cmVhZF9vcCwKLSAgICAgICAgb3ApOwotICB9Ci19Ci0KLXZvaWQgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6c3RhcnRfcmVjZWl2ZV9mcm9tX29wKAotICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBXU0FCVUYqIGJ1ZmZlcnMsIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3VudCwgc29ja2V0X2FkZHJfdHlwZSogYWRkciwKLSAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgaW50KiBhZGRybGVuLCBvcGVyYXRpb24qIG9wKQotewotICB1cGRhdGVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZChpbXBsKTsKLSAgaW9jcF9zZXJ2aWNlXy53b3JrX3N0YXJ0ZWQoKTsKLQotICBpZiAoIWlzX29wZW4oaW1wbCkpCi0gICAgaW9jcF9zZXJ2aWNlXy5vbl9jb21wbGV0aW9uKG9wLCBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3IpOwotICBlbHNlCi0gIHsKLSAgICBEV09SRCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gICAgRFdPUkQgcmVjdl9mbGFncyA9IGZsYWdzOwotICAgIGludCByZXN1bHQgPSA6OldTQVJlY3ZGcm9tKGltcGwuc29ja2V0XywgYnVmZmVycywKLSAgICAgICAgc3RhdGljX2Nhc3Q8RFdPUkQ+KGJ1ZmZlcl9jb3VudCksCi0gICAgICAgICZieXRlc190cmFuc2ZlcnJlZCwgJnJlY3ZfZmxhZ3MsIGFkZHIsIGFkZHJsZW4sIG9wLCAwKTsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICBpZiAobGFzdF9lcnJvciA9PSBFUlJPUl9QT1JUX1VOUkVBQ0hBQkxFKQotICAgICAgbGFzdF9lcnJvciA9IFdTQUVDT05OUkVGVVNFRDsKLSAgICBpZiAocmVzdWx0ICE9IDAgJiYgbGFzdF9lcnJvciAhPSBXU0FfSU9fUEVORElORykKLSAgICAgIGlvY3Bfc2VydmljZV8ub25fY29tcGxldGlvbihvcCwgbGFzdF9lcnJvciwgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIGVsc2UKLSAgICAgIGlvY3Bfc2VydmljZV8ub25fcGVuZGluZyhvcCk7Ci0gIH0KLX0KLQotdm9pZCB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpzdGFydF9hY2NlcHRfb3AoCi0gICAgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIGJvb2wgcGVlcl9pc19vcGVuLCBzb2NrZXRfaG9sZGVyJiBuZXdfc29ja2V0LCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwKLSAgICBpbnQgcHJvdG9jb2wsIHZvaWQqIG91dHB1dF9idWZmZXIsIERXT1JEIGFkZHJlc3NfbGVuZ3RoLCBvcGVyYXRpb24qIG9wKQotewotICB1cGRhdGVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZChpbXBsKTsKLSAgaW9jcF9zZXJ2aWNlXy53b3JrX3N0YXJ0ZWQoKTsKLQotICBpZiAoIWlzX29wZW4oaW1wbCkpCi0gICAgaW9jcF9zZXJ2aWNlXy5vbl9jb21wbGV0aW9uKG9wLCBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3IpOwotICBlbHNlIGlmIChwZWVyX2lzX29wZW4pCi0gICAgaW9jcF9zZXJ2aWNlXy5vbl9jb21wbGV0aW9uKG9wLCBhc2lvOjplcnJvcjo6YWxyZWFkeV9vcGVuKTsKLSAgZWxzZQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBuZXdfc29ja2V0LnJlc2V0KHNvY2tldF9vcHM6OnNvY2tldChmYW1pbHksIHR5cGUsIHByb3RvY29sLCBlYykpOwotICAgIGlmIChuZXdfc29ja2V0LmdldCgpID09IGludmFsaWRfc29ja2V0KQotICAgICAgaW9jcF9zZXJ2aWNlXy5vbl9jb21wbGV0aW9uKG9wLCBlYyk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIERXT1JEIGJ5dGVzX3JlYWQgPSAwOwotICAgICAgQk9PTCByZXN1bHQgPSA6OkFjY2VwdEV4KGltcGwuc29ja2V0XywgbmV3X3NvY2tldC5nZXQoKSwgb3V0cHV0X2J1ZmZlciwKLSAgICAgICAgICAwLCBhZGRyZXNzX2xlbmd0aCwgYWRkcmVzc19sZW5ndGgsICZieXRlc19yZWFkLCBvcCk7Ci0gICAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICAgIGlmICghcmVzdWx0ICYmIGxhc3RfZXJyb3IgIT0gV1NBX0lPX1BFTkRJTkcpCi0gICAgICAgIGlvY3Bfc2VydmljZV8ub25fY29tcGxldGlvbihvcCwgbGFzdF9lcnJvcik7Ci0gICAgICBlbHNlCi0gICAgICAgIGlvY3Bfc2VydmljZV8ub25fcGVuZGluZyhvcCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6cmVzdGFydF9hY2NlcHRfb3AoCi0gICAgc29ja2V0X3R5cGUgcywgc29ja2V0X2hvbGRlciYgbmV3X3NvY2tldCwgaW50IGZhbWlseSwgaW50IHR5cGUsCi0gICAgaW50IHByb3RvY29sLCB2b2lkKiBvdXRwdXRfYnVmZmVyLCBEV09SRCBhZGRyZXNzX2xlbmd0aCwgb3BlcmF0aW9uKiBvcCkKLXsKLSAgbmV3X3NvY2tldC5yZXNldCgpOwotICBpb2NwX3NlcnZpY2VfLndvcmtfc3RhcnRlZCgpOwotCi0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIG5ld19zb2NrZXQucmVzZXQoc29ja2V0X29wczo6c29ja2V0KGZhbWlseSwgdHlwZSwgcHJvdG9jb2wsIGVjKSk7Ci0gIGlmIChuZXdfc29ja2V0LmdldCgpID09IGludmFsaWRfc29ja2V0KQotICAgIGlvY3Bfc2VydmljZV8ub25fY29tcGxldGlvbihvcCwgZWMpOwotICBlbHNlCi0gIHsKLSAgICBEV09SRCBieXRlc19yZWFkID0gMDsKLSAgICBCT09MIHJlc3VsdCA9IDo6QWNjZXB0RXgocywgbmV3X3NvY2tldC5nZXQoKSwgb3V0cHV0X2J1ZmZlciwKLSAgICAgICAgMCwgYWRkcmVzc19sZW5ndGgsIGFkZHJlc3NfbGVuZ3RoLCAmYnl0ZXNfcmVhZCwgb3ApOwotICAgIERXT1JEIGxhc3RfZXJyb3IgPSA6OldTQUdldExhc3RFcnJvcigpOwotICAgIGlmICghcmVzdWx0ICYmIGxhc3RfZXJyb3IgIT0gV1NBX0lPX1BFTkRJTkcpCi0gICAgICBpb2NwX3NlcnZpY2VfLm9uX2NvbXBsZXRpb24ob3AsIGxhc3RfZXJyb3IpOwotICAgIGVsc2UKLSAgICAgIGlvY3Bfc2VydmljZV8ub25fcGVuZGluZyhvcCk7Ci0gIH0KLX0KLQotdm9pZCB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpzdGFydF9yZWFjdG9yX29wKAotICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBpbnQgb3BfdHlwZSwgcmVhY3Rvcl9vcCogb3ApCi17Ci0gIHJlYWN0b3ImIHIgPSBnZXRfcmVhY3RvcigpOwotICB1cGRhdGVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZChpbXBsKTsKLQotICBpZiAoaXNfb3BlbihpbXBsKSkKLSAgewotICAgIHIuc3RhcnRfb3Aob3BfdHlwZSwgaW1wbC5zb2NrZXRfLCBpbXBsLnJlYWN0b3JfZGF0YV8sIG9wLCBmYWxzZSwgZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotICBlbHNlCi0gICAgb3AtPmVjXyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLQotICBpb2NwX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGZhbHNlKTsKLX0KLQotdm9pZCB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpzdGFydF9jb25uZWN0X29wKAotICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgY29uc3Qgc29ja2V0X2FkZHJfdHlwZSogYWRkciwKLSAgICBzdGQ6OnNpemVfdCBhZGRybGVuLCB3aW5faW9jcF9zb2NrZXRfY29ubmVjdF9vcF9iYXNlKiBvcCkKLXsKLSAgLy8gSWYgQ29ubmVjdEV4IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQuCi0gIGlmIChmYW1pbHkgPT0gQVNJT19PU19ERUYoQUZfSU5FVCkKLSAgICAgIHx8IGZhbWlseSA9PSBBU0lPX09TX0RFRihBRl9JTkVUNikpCi0gIHsKLSAgICBpZiAoY29ubmVjdF9leF9mbiBjb25uZWN0X2V4ID0gZ2V0X2Nvbm5lY3RfZXgoaW1wbCwgdHlwZSkpCi0gICAgewotICAgICAgdW5pb24gYWRkcmVzc191bmlvbgotICAgICAgewotICAgICAgICBzb2NrZXRfYWRkcl90eXBlIGJhc2U7Ci0gICAgICAgIHNvY2thZGRyX2luNF90eXBlIHY0OwotICAgICAgICBzb2NrYWRkcl9pbjZfdHlwZSB2NjsKLSAgICAgIH0gYTsKLQotICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbXNldC4KLSAgICAgIG1lbXNldCgmYSwgMCwgc2l6ZW9mKGEpKTsKLSAgICAgIGEuYmFzZS5zYV9mYW1pbHkgPSBmYW1pbHk7Ci0KLSAgICAgIHNvY2tldF9vcHM6OmJpbmQoaW1wbC5zb2NrZXRfLCAmYS5iYXNlLAotICAgICAgICAgIGZhbWlseSA9PSBBU0lPX09TX0RFRihBRl9JTkVUKQotICAgICAgICAgID8gc2l6ZW9mKGEudjQpIDogc2l6ZW9mKGEudjYpLCBvcC0+ZWNfKTsKLSAgICAgIGlmIChvcC0+ZWNfICYmIG9wLT5lY18gIT0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlvY3Bfc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgZmFsc2UpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIG9wLT5jb25uZWN0X2V4XyA9IHRydWU7Ci0gICAgICB1cGRhdGVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZChpbXBsKTsKLSAgICAgIGlvY3Bfc2VydmljZV8ud29ya19zdGFydGVkKCk7Ci0KLSAgICAgIEJPT0wgcmVzdWx0ID0gY29ubmVjdF9leChpbXBsLnNvY2tldF8sCi0gICAgICAgICAgYWRkciwgc3RhdGljX2Nhc3Q8aW50PihhZGRybGVuKSwgMCwgMCwgMCwgb3ApOwotICAgICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6V1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgICBpZiAoIXJlc3VsdCAmJiBsYXN0X2Vycm9yICE9IFdTQV9JT19QRU5ESU5HKQotICAgICAgICBpb2NwX3NlcnZpY2VfLm9uX2NvbXBsZXRpb24ob3AsIGxhc3RfZXJyb3IpOwotICAgICAgZWxzZQotICAgICAgICBpb2NwX3NlcnZpY2VfLm9uX3BlbmRpbmcob3ApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIC8vIE90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIGEgcmVhY3Rvci1iYXNlZCBpbXBsZW1lbnRhdGlvbi4KLSAgcmVhY3RvciYgciA9IGdldF9yZWFjdG9yKCk7Ci0gIHVwZGF0ZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkKGltcGwpOwotCi0gIGlmICgoaW1wbC5zdGF0ZV8gJiBzb2NrZXRfb3BzOjpub25fYmxvY2tpbmcpICE9IDAKLSAgICAgIHx8IHNvY2tldF9vcHM6OnNldF9pbnRlcm5hbF9ub25fYmxvY2tpbmcoCi0gICAgICAgIGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sIHRydWUsIG9wLT5lY18pKQotICB7Ci0gICAgaWYgKHNvY2tldF9vcHM6OmNvbm5lY3QoaW1wbC5zb2NrZXRfLCBhZGRyLCBhZGRybGVuLCBvcC0+ZWNfKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChvcC0+ZWNfID09IGFzaW86OmVycm9yOjppbl9wcm9ncmVzcwotICAgICAgICAgIHx8IG9wLT5lY18gPT0gYXNpbzo6ZXJyb3I6OndvdWxkX2Jsb2NrKQotICAgICAgewotICAgICAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgICByLnN0YXJ0X29wKHJlYWN0b3I6OmNvbm5lY3Rfb3AsIGltcGwuc29ja2V0XywKLSAgICAgICAgICAgIGltcGwucmVhY3Rvcl9kYXRhXywgb3AsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGZhbHNlKTsKLX0KLQotdm9pZCB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpjbG9zZV9mb3JfZGVzdHJ1Y3Rpb24oCi0gICAgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotewotICBpZiAoaXNfb3BlbihpbXBsKSkKLSAgewotICAgIEFTSU9fSEFORExFUl9PUEVSQVRJT04oKCJzb2NrZXQiLCAmaW1wbCwgImNsb3NlIikpOwotCi0gICAgLy8gQ2hlY2sgaWYgdGhlIHJlYWN0b3Igd2FzIGNyZWF0ZWQsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBjbG9zZSB0aGUKLSAgICAvLyBzb2NrZXQgb24gdGhlIHJlYWN0b3IgYXMgd2VsbCB0byBjYW5jZWwgYW55IG9wZXJhdGlvbnMgdGhhdCBtaWdodCBiZQotICAgIC8vIHJ1bm5pbmcgdGhlcmUuCi0gICAgcmVhY3RvciogciA9IHN0YXRpY19jYXN0PHJlYWN0b3IqPigKLSAgICAgICAgICBpbnRlcmxvY2tlZF9jb21wYXJlX2V4Y2hhbmdlX3BvaW50ZXIoCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnJlYWN0b3JfKSwgMCwgMCkpOwotICAgIGlmIChyKQotICAgICAgci0+ZGVyZWdpc3Rlcl9kZXNjcmlwdG9yKGltcGwuc29ja2V0XywgaW1wbC5yZWFjdG9yX2RhdGFfLCB0cnVlKTsKLSAgfQotCi0gIGFzaW86OmVycm9yX2NvZGUgaWdub3JlZF9lYzsKLSAgc29ja2V0X29wczo6Y2xvc2UoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywgdHJ1ZSwgaWdub3JlZF9lYyk7Ci0gIGltcGwuc29ja2V0XyA9IGludmFsaWRfc29ja2V0OwotICBpbXBsLnN0YXRlXyA9IDA7Ci0gIGltcGwuY2FuY2VsX3Rva2VuXy5yZXNldCgpOwotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfQ0FOQ0VMSU8pCi0gIGltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXyA9IDA7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9DQU5DRUxJTykKLX0KLQotdm9pZCB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjp1cGRhdGVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZCgKLSAgICB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi17Ci0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9DQU5DRUxJTykKLSAgaWYgKGltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXyA9PSAwKQotICAgIGltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXyA9IDo6R2V0Q3VycmVudFRocmVhZElkKCk7Ci0gIGVsc2UgaWYgKGltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXyAhPSA6OkdldEN1cnJlbnRUaHJlYWRJZCgpKQotICAgIGltcGwuc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXyA9IH5EV09SRCgwKTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfQ0FOQ0VMSU8pCi0gICh2b2lkKWltcGw7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9DQU5DRUxJTykKLX0KLQotcmVhY3RvciYgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZTo6Z2V0X3JlYWN0b3IoKQotewotICByZWFjdG9yKiByID0gc3RhdGljX2Nhc3Q8cmVhY3Rvcio+KAotICAgICAgICBpbnRlcmxvY2tlZF9jb21wYXJlX2V4Y2hhbmdlX3BvaW50ZXIoCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZyZWFjdG9yXyksIDAsIDApKTsKLSAgaWYgKCFyKQotICB7Ci0gICAgciA9ICYodXNlX3NlcnZpY2U8cmVhY3Rvcj4oaW9fc2VydmljZV8pKTsKLSAgICBpbnRlcmxvY2tlZF9leGNoYW5nZV9wb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmcmVhY3Rvcl8pLCByKTsKLSAgfQotICByZXR1cm4gKnI7Ci19Ci0KLXdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmNvbm5lY3RfZXhfZm4KLXdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmdldF9jb25uZWN0X2V4KAotICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgaW50IHR5cGUpCi17Ci0jaWYgZGVmaW5lZChBU0lPX0RJU0FCTEVfQ09OTkVDVEVYKQotICAodm9pZClpbXBsOwotICAodm9pZCl0eXBlOwotICByZXR1cm4gMDsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19ESVNBQkxFX0NPTk5FQ1RFWCkKLSAgaWYgKHR5cGUgIT0gQVNJT19PU19ERUYoU09DS19TVFJFQU0pCi0gICAgICAmJiB0eXBlICE9IEFTSU9fT1NfREVGKFNPQ0tfU0VRUEFDS0VUKSkKLSAgICByZXR1cm4gMDsKLQotICB2b2lkKiBwdHIgPSBpbnRlcmxvY2tlZF9jb21wYXJlX2V4Y2hhbmdlX3BvaW50ZXIoJmNvbm5lY3RfZXhfLCAwLCAwKTsKLSAgaWYgKCFwdHIpCi0gIHsKLSAgICBHVUlEIGd1aWQgPSB7IDB4MjVhMjA3YjksIDB4ZGRmMywgMHg0NjYwLAotICAgICAgeyAweDhlLCAweGU5LCAweDc2LCAweGU1LCAweDhjLCAweDc0LCAweDA2LCAweDNlIH0gfTsKLQotICAgIERXT1JEIGJ5dGVzID0gMDsKLSAgICBpZiAoOjpXU0FJb2N0bChpbXBsLnNvY2tldF8sIFNJT19HRVRfRVhURU5TSU9OX0ZVTkNUSU9OX1BPSU5URVIsCi0gICAgICAgICAgJmd1aWQsIHNpemVvZihndWlkKSwgJnB0ciwgc2l6ZW9mKHB0ciksICZieXRlcywgMCwgMCkgIT0gMCkKLSAgICB7Ci0gICAgICAvLyBTZXQgY29ubmVjdF9leF8gdG8gYSBzcGVjaWFsIHZhbHVlIHRvIGluZGljYXRlIHRoYXQgQ29ubmVjdEV4IGlzCi0gICAgICAvLyB1bmF2YWlsYWJsZS4gVGhhdCB3YXkgd2Ugd29uJ3QgYm90aGVyIHRyeWluZyB0byBsb29rIGl0IHVwIGFnYWluLgotICAgICAgcHRyID0gdGhpczsKLSAgICB9Ci0KLSAgICBpbnRlcmxvY2tlZF9leGNoYW5nZV9wb2ludGVyKCZjb25uZWN0X2V4XywgcHRyKTsKLSAgfQotCi0gIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbm5lY3RfZXhfZm4+KHB0ciA9PSB0aGlzID8gMCA6IHB0cik7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0RJU0FCTEVfQ09OTkVDVEVYKQotfQotCi12b2lkKiB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjppbnRlcmxvY2tlZF9jb21wYXJlX2V4Y2hhbmdlX3BvaW50ZXIoCi0gICAgdm9pZCoqIGRlc3QsIHZvaWQqIGV4Y2gsIHZvaWQqIGNtcCkKLXsKLSNpZiBkZWZpbmVkKF9NX0lYODYpCi0gIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQTE9ORz4oZGVzdCksIHJlaW50ZXJwcmV0X2Nhc3Q8TE9ORz4oZXhjaCksCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TE9ORz4oY21wKSkpOwotI2Vsc2UKLSAgcmV0dXJuIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcihkZXN0LCBleGNoLCBjbXApOwotI2VuZGlmCi19Ci0KLXZvaWQqIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmludGVybG9ja2VkX2V4Y2hhbmdlX3BvaW50ZXIoCi0gICAgdm9pZCoqIGRlc3QsIHZvaWQqIHZhbCkKLXsKLSNpZiBkZWZpbmVkKF9NX0lYODYpCi0gIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihJbnRlcmxvY2tlZEV4Y2hhbmdlKAotICAgICAgICByZWludGVycHJldF9jYXN0PFBMT05HPihkZXN0KSwgcmVpbnRlcnByZXRfY2FzdDxMT05HPih2YWwpKSk7Ci0jZWxzZQotICByZXR1cm4gSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIoZGVzdCwgdmFsKTsKLSNlbmRpZgotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfV0lOX0lPQ1BfU09DS0VUX1NFUlZJQ0VfQkFTRV9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5fbXV0ZXguaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl9tdXRleC5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOGY0ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl9tdXRleC5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvd2luX211dGV4LmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1dJTl9NVVRFWF9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9XSU5fTVVURVhfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5fbXV0ZXguaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXdpbl9tdXRleDo6d2luX211dGV4KCkKLXsKLSAgaW50IGVycm9yID0gZG9faW5pdCgpOwotICBhc2lvOjplcnJvcl9jb2RlIGVjKGVycm9yLAotICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJtdXRleCIpOwotfQotCi1pbnQgd2luX211dGV4Ojpkb19pbml0KCkKLXsKLSNpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQotICAvLyBOb3Qgc3VyZSBpZiBNaW5HVyBzdXBwb3J0cyBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbiBoYW5kbGluZywgc28gZm9yIG5vdwotICAvLyB3ZSdsbCBqdXN0IGNhbGwgdGhlIFdpbmRvd3MgQVBJIGFuZCBob3BlLgotIyBpZiBkZWZpbmVkKFVOREVSX0NFKQotICA6OkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJmNyaXRfc2VjdGlvbl8pOwotIyBlbHNlCi0gIGlmICghOjpJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50KCZjcml0X3NlY3Rpb25fLCAweDgwMDAwMDAwKSkKLSAgICByZXR1cm4gOjpHZXRMYXN0RXJyb3IoKTsKLSMgZW5kaWYKLSAgcmV0dXJuIDA7Ci0jZWxzZQotICBfX3RyeQotICB7Ci0jIGlmIGRlZmluZWQoVU5ERVJfQ0UpCi0gICAgOjpJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZjcml0X3NlY3Rpb25fKTsKLSMgZWxzZQotICAgIGlmICghOjpJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50KCZjcml0X3NlY3Rpb25fLCAweDgwMDAwMDAwKSkKLSAgICAgIHJldHVybiA6OkdldExhc3RFcnJvcigpOwotIyBlbmRpZgotICB9Ci0gIF9fZXhjZXB0KEdldEV4Y2VwdGlvbkNvZGUoKSA9PSBTVEFUVVNfTk9fTUVNT1JZCi0gICAgICA/IEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIgOiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIKQotICB7Ci0gICAgcmV0dXJuIEVSUk9SX09VVE9GTUVNT1JZOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfV0lOX01VVEVYX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWZlYjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlLmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvd2luX29iamVjdF9oYW5kbGVfc2VydmljZS5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgQm9yaXMgU2NoYWVsaW5nIChib3Jpc0BoaWdoc2NvcmUuZGUpCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfV0lOX09CSkVDVF9IQU5ETEVfU0VSVklDRV9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9XSU5fT0JKRUNUX0hBTkRMRV9TRVJWSUNFX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX09CSkVDVF9IQU5ETEUpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi13aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlOjp3aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlKAotICAgIGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gIDogaW9fc2VydmljZV8oYXNpbzo6dXNlX3NlcnZpY2U8aW9fc2VydmljZV9pbXBsPihpb19zZXJ2aWNlKSksCi0gICAgbXV0ZXhfKCksCi0gICAgaW1wbF9saXN0XygwKSwKLSAgICBzaHV0ZG93bl8oZmFsc2UpCi17Ci19Ci0KLXZvaWQgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6c2h1dGRvd25fc2VydmljZSgpCi17Ci0gIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgLy8gU2V0dGluZyB0aGlzIGZsYWcgdG8gdHJ1ZSBwcmV2ZW50cyBuZXcgb2JqZWN0cyBmcm9tIGJlaW5nIHJlZ2lzdGVyZWQsIGFuZAotICAvLyBuZXcgYXN5bmNocm9ub3VzIHdhaXQgb3BlcmF0aW9ucyBmcm9tIGJlaW5nIHN0YXJ0ZWQuIFdlIG9ubHkgbmVlZCB0byB3b3JyeQotICAvLyBhYm91dCBjbGVhbmluZyB1cCB0aGUgb3BlcmF0aW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuCi0gIHNodXRkb3duXyA9IHRydWU7Ci0KLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gIGZvciAoaW1wbGVtZW50YXRpb25fdHlwZSogaW1wbCA9IGltcGxfbGlzdF87IGltcGw7IGltcGwgPSBpbXBsLT5uZXh0XykKLSAgICBvcHMucHVzaChpbXBsLT5vcF9xdWV1ZV8pOwotCi0gIGxvY2sudW5sb2NrKCk7Ci0KLSAgaW9fc2VydmljZV8uYWJhbmRvbl9vcGVyYXRpb25zKG9wcyk7Ci19Ci0KLXZvaWQgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6Y29uc3RydWN0KAotICAgIHdpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi17Ci0gIGltcGwuaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBpbXBsLndhaXRfaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBpbXBsLm93bmVyXyA9IHRoaXM7Ci0KLSAgLy8gSW5zZXJ0IGltcGxlbWVudGF0aW9uIGludG8gbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgaWYgKCFzaHV0ZG93bl8pCi0gIHsKLSAgICBpbXBsLm5leHRfID0gaW1wbF9saXN0XzsKLSAgICBpbXBsLnByZXZfID0gMDsKLSAgICBpZiAoaW1wbF9saXN0XykKLSAgICAgIGltcGxfbGlzdF8tPnByZXZfID0gJmltcGw7Ci0gICAgaW1wbF9saXN0XyA9ICZpbXBsOwotICB9Ci19Ci0KLXZvaWQgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6bW92ZV9jb25zdHJ1Y3QoCi0gICAgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICB3aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0gIC8vIEluc2VydCBpbXBsZW1lbnRhdGlvbiBpbnRvIGxpbmtlZCBsaXN0IG9mIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gIGlmICghc2h1dGRvd25fKQotICB7Ci0gICAgaW1wbC5uZXh0XyA9IGltcGxfbGlzdF87Ci0gICAgaW1wbC5wcmV2XyA9IDA7Ci0gICAgaWYgKGltcGxfbGlzdF8pCi0gICAgICBpbXBsX2xpc3RfLT5wcmV2XyA9ICZpbXBsOwotICAgIGltcGxfbGlzdF8gPSAmaW1wbDsKLSAgfQotCi0gIGltcGwuaGFuZGxlXyA9IG90aGVyX2ltcGwuaGFuZGxlXzsKLSAgb3RoZXJfaW1wbC5oYW5kbGVfID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gIGltcGwud2FpdF9oYW5kbGVfID0gb3RoZXJfaW1wbC53YWl0X2hhbmRsZV87Ci0gIG90aGVyX2ltcGwud2FpdF9oYW5kbGVfID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gIGltcGwub3BfcXVldWVfLnB1c2gob3RoZXJfaW1wbC5vcF9xdWV1ZV8pOwotICBpbXBsLm93bmVyXyA9IHRoaXM7Ci0KLSAgLy8gV2UgbXVzdCBub3QgaG9sZCB0aGUgbG9jayB3aGlsZSBjYWxsaW5nIFVucmVnaXN0ZXJXYWl0RXguIFRoaXMgaXMgYmVjYXVzZQotICAvLyB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBtaWdodCBiZSBpbnZva2VkIHdoaWxlIHdlIGFyZSB3YWl0aW5nIGZvcgotICAvLyBVbnJlZ2lzdGVyV2FpdEV4IHRvIGNvbXBsZXRlLgotICBsb2NrLnVubG9jaygpOwotCi0gIGlmIChpbXBsLndhaXRfaGFuZGxlXyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgICA6OlVucmVnaXN0ZXJXYWl0RXgoaW1wbC53YWl0X2hhbmRsZV8sIElOVkFMSURfSEFORExFX1ZBTFVFKTsKLQotICBpZiAoIWltcGwub3BfcXVldWVfLmVtcHR5KCkpCi0gICAgcmVnaXN0ZXJfd2FpdF9jYWxsYmFjayhpbXBsLCBsb2NrKTsKLX0KLQotdm9pZCB3aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlOjptb3ZlX2Fzc2lnbigKLSAgICB3aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIHdpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UmIG90aGVyX3NlcnZpY2UsCi0gICAgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBpZ25vcmVkX2VjOwotICBjbG9zZShpbXBsLCBpZ25vcmVkX2VjKTsKLQotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0gIGlmICh0aGlzICE9ICZvdGhlcl9zZXJ2aWNlKQotICB7Ci0gICAgLy8gUmVtb3ZlIGltcGxlbWVudGF0aW9uIGZyb20gbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgICBpZiAoaW1wbF9saXN0XyA9PSAmaW1wbCkKLSAgICAgIGltcGxfbGlzdF8gPSBpbXBsLm5leHRfOwotICAgIGlmIChpbXBsLnByZXZfKQotICAgICAgaW1wbC5wcmV2Xy0+bmV4dF8gPSBpbXBsLm5leHRfOwotICAgIGlmIChpbXBsLm5leHRfKQotICAgICAgaW1wbC5uZXh0Xy0+cHJldl89IGltcGwucHJldl87Ci0gICAgaW1wbC5uZXh0XyA9IDA7Ci0gICAgaW1wbC5wcmV2XyA9IDA7Ci0gIH0KLQotICBpbXBsLmhhbmRsZV8gPSBvdGhlcl9pbXBsLmhhbmRsZV87Ci0gIG90aGVyX2ltcGwuaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBpbXBsLndhaXRfaGFuZGxlXyA9IG90aGVyX2ltcGwud2FpdF9oYW5kbGVfOwotICBvdGhlcl9pbXBsLndhaXRfaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBpbXBsLm9wX3F1ZXVlXy5wdXNoKG90aGVyX2ltcGwub3BfcXVldWVfKTsKLSAgaW1wbC5vd25lcl8gPSB0aGlzOwotCi0gIGlmICh0aGlzICE9ICZvdGhlcl9zZXJ2aWNlKQotICB7Ci0gICAgLy8gSW5zZXJ0IGltcGxlbWVudGF0aW9uIGludG8gbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgICBpbXBsLm5leHRfID0gb3RoZXJfc2VydmljZS5pbXBsX2xpc3RfOwotICAgIGltcGwucHJldl8gPSAwOwotICAgIGlmIChvdGhlcl9zZXJ2aWNlLmltcGxfbGlzdF8pCi0gICAgICBvdGhlcl9zZXJ2aWNlLmltcGxfbGlzdF8tPnByZXZfID0gJmltcGw7Ci0gICAgb3RoZXJfc2VydmljZS5pbXBsX2xpc3RfID0gJmltcGw7Ci0gIH0KLQotICAvLyBXZSBtdXN0IG5vdCBob2xkIHRoZSBsb2NrIHdoaWxlIGNhbGxpbmcgVW5yZWdpc3RlcldhaXRFeC4gVGhpcyBpcyBiZWNhdXNlCi0gIC8vIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIG1pZ2h0IGJlIGludm9rZWQgd2hpbGUgd2UgYXJlIHdhaXRpbmcgZm9yCi0gIC8vIFVucmVnaXN0ZXJXYWl0RXggdG8gY29tcGxldGUuCi0gIGxvY2sudW5sb2NrKCk7Ci0KLSAgaWYgKGltcGwud2FpdF9oYW5kbGVfICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgIDo6VW5yZWdpc3RlcldhaXRFeChpbXBsLndhaXRfaGFuZGxlXywgSU5WQUxJRF9IQU5ETEVfVkFMVUUpOwotCi0gIGlmICghaW1wbC5vcF9xdWV1ZV8uZW1wdHkoKSkKLSAgICByZWdpc3Rlcl93YWl0X2NhbGxiYWNrKGltcGwsIGxvY2spOwotfQotCi12b2lkIHdpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2U6OmRlc3Ryb3koCi0gICAgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLXsKLSAgbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLQotICAvLyBSZW1vdmUgaW1wbGVtZW50YXRpb24gZnJvbSBsaW5rZWQgbGlzdCBvZiBhbGwgaW1wbGVtZW50YXRpb25zLgotICBpZiAoaW1wbF9saXN0XyA9PSAmaW1wbCkKLSAgICBpbXBsX2xpc3RfID0gaW1wbC5uZXh0XzsKLSAgaWYgKGltcGwucHJldl8pCi0gICAgaW1wbC5wcmV2Xy0+bmV4dF8gPSBpbXBsLm5leHRfOwotICBpZiAoaW1wbC5uZXh0XykKLSAgICBpbXBsLm5leHRfLT5wcmV2Xz0gaW1wbC5wcmV2XzsKLSAgaW1wbC5uZXh0XyA9IDA7Ci0gIGltcGwucHJldl8gPSAwOwotCi0gIGlmIChpc19vcGVuKGltcGwpKQotICB7Ci0gICAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoIm9iamVjdF9oYW5kbGUiLCAmaW1wbCwgImNsb3NlIikpOwotCi0gICAgSEFORExFIHdhaXRfaGFuZGxlID0gaW1wbC53YWl0X2hhbmRsZV87Ci0gICAgaW1wbC53YWl0X2hhbmRsZV8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQotICAgIG9wX3F1ZXVlPG9wZXJhdGlvbj4gb3BzOwotICAgIHdoaWxlICh3YWl0X29wKiBvcCA9IGltcGwub3BfcXVldWVfLmZyb250KCkpCi0gICAgewotICAgICAgb3AtPmVjXyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZDsKLSAgICAgIGltcGwub3BfcXVldWVfLnBvcCgpOwotICAgICAgb3BzLnB1c2gob3ApOwotICAgIH0KLQotICAgIC8vIFdlIG11c3Qgbm90IGhvbGQgdGhlIGxvY2sgd2hpbGUgY2FsbGluZyBVbnJlZ2lzdGVyV2FpdEV4LiBUaGlzIGlzCi0gICAgLy8gYmVjYXVzZSB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBtaWdodCBiZSBpbnZva2VkIHdoaWxlIHdlIGFyZQotICAgIC8vIHdhaXRpbmcgZm9yIFVucmVnaXN0ZXJXYWl0RXggdG8gY29tcGxldGUuCi0gICAgbG9jay51bmxvY2soKTsKLQotICAgIGlmICh3YWl0X2hhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgICAgIDo6VW5yZWdpc3RlcldhaXRFeCh3YWl0X2hhbmRsZSwgSU5WQUxJRF9IQU5ETEVfVkFMVUUpOwotCi0gICAgOjpDbG9zZUhhbmRsZShpbXBsLmhhbmRsZV8pOwotICAgIGltcGwuaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotCi0gICAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHMpOwotICB9Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6YXNzaWduKAotICAgIHdpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBoYW5kbGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoaXNfb3BlbihpbXBsKSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmFscmVhZHlfb3BlbjsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICBpbXBsLmhhbmRsZV8gPSBoYW5kbGU7Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6Y2xvc2UoCi0gICAgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGlzX29wZW4oaW1wbCkpCi0gIHsKLSAgICBBU0lPX0hBTkRMRVJfT1BFUkFUSU9OKCgib2JqZWN0X2hhbmRsZSIsICZpbXBsLCAiY2xvc2UiKSk7Ci0KLSAgICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0gICAgSEFORExFIHdhaXRfaGFuZGxlID0gaW1wbC53YWl0X2hhbmRsZV87Ci0gICAgaW1wbC53YWl0X2hhbmRsZV8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQotICAgIG9wX3F1ZXVlPG9wZXJhdGlvbj4gY29tcGxldGVkX29wczsKLSAgICB3aGlsZSAod2FpdF9vcCogb3AgPSBpbXBsLm9wX3F1ZXVlXy5mcm9udCgpKQotICAgIHsKLSAgICAgIGltcGwub3BfcXVldWVfLnBvcCgpOwotICAgICAgb3AtPmVjXyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZDsKLSAgICAgIGNvbXBsZXRlZF9vcHMucHVzaChvcCk7Ci0gICAgfQotCi0gICAgLy8gV2UgbXVzdCBub3QgaG9sZCB0aGUgbG9jayB3aGlsZSBjYWxsaW5nIFVucmVnaXN0ZXJXYWl0RXguIFRoaXMgaXMKLSAgICAvLyBiZWNhdXNlIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIG1pZ2h0IGJlIGludm9rZWQgd2hpbGUgd2UgYXJlCi0gICAgLy8gd2FpdGluZyBmb3IgVW5yZWdpc3RlcldhaXRFeCB0byBjb21wbGV0ZS4KLSAgICBsb2NrLnVubG9jaygpOwotCi0gICAgaWYgKHdhaXRfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgOjpVbnJlZ2lzdGVyV2FpdEV4KHdhaXRfaGFuZGxlLCBJTlZBTElEX0hBTkRMRV9WQUxVRSk7Ci0KLSAgICBpZiAoOjpDbG9zZUhhbmRsZShpbXBsLmhhbmRsZV8pKQotICAgIHsKLSAgICAgIGltcGwuaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShsYXN0X2Vycm9yLAotICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgIH0KLQotICAgIGlvX3NlcnZpY2VfLnBvc3RfZGVmZXJyZWRfY29tcGxldGlvbnMoY29tcGxldGVkX29wcyk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIH0KLQotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6Y2FuY2VsKAotICAgIHdpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChpc19vcGVuKGltcGwpKQotICB7Ci0gICAgQVNJT19IQU5ETEVSX09QRVJBVElPTigoIm9iamVjdF9oYW5kbGUiLCAmaW1wbCwgImNhbmNlbCIpKTsKLQotICAgIG11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgICBIQU5ETEUgd2FpdF9oYW5kbGUgPSBpbXBsLndhaXRfaGFuZGxlXzsKLSAgICBpbXBsLndhaXRfaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotCi0gICAgb3BfcXVldWU8b3BlcmF0aW9uPiBjb21wbGV0ZWRfb3BzOwotICAgIHdoaWxlICh3YWl0X29wKiBvcCA9IGltcGwub3BfcXVldWVfLmZyb250KCkpCi0gICAgewotICAgICAgb3AtPmVjXyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZDsKLSAgICAgIGltcGwub3BfcXVldWVfLnBvcCgpOwotICAgICAgY29tcGxldGVkX29wcy5wdXNoKG9wKTsKLSAgICB9Ci0KLSAgICAvLyBXZSBtdXN0IG5vdCBob2xkIHRoZSBsb2NrIHdoaWxlIGNhbGxpbmcgVW5yZWdpc3RlcldhaXRFeC4gVGhpcyBpcwotICAgIC8vIGJlY2F1c2UgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gbWlnaHQgYmUgaW52b2tlZCB3aGlsZSB3ZSBhcmUKLSAgICAvLyB3YWl0aW5nIGZvciBVbnJlZ2lzdGVyV2FpdEV4IHRvIGNvbXBsZXRlLgotICAgIGxvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAod2FpdF9oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gICAgICA6OlVucmVnaXN0ZXJXYWl0RXgod2FpdF9oYW5kbGUsIElOVkFMSURfSEFORExFX1ZBTFVFKTsKLQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotCi0gICAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhjb21wbGV0ZWRfb3BzKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgfQotCi0gIHJldHVybiBlYzsKLX0KLQotdm9pZCB3aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlOjp3YWl0KAotICAgIHdpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHN3aXRjaCAoOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KGltcGwuaGFuZGxlXywgSU5GSU5JVEUpKQotICB7Ci0gIGNhc2UgV0FJVF9GQUlMRUQ6Ci0gICAgewotICAgICAgRFdPUkQgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUobGFzdF9lcnJvciwKLSAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgY2FzZSBXQUlUX09CSkVDVF8wOgotICBjYXNlIFdBSVRfQUJBTkRPTkVEOgotICBkZWZhdWx0OgotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6c3RhcnRfd2FpdF9vcCgKLSAgICB3aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCB3YWl0X29wKiBvcCkKLXsKLSAgaW9fc2VydmljZV8ud29ya19zdGFydGVkKCk7Ci0KLSAgaWYgKGlzX29wZW4oaW1wbCkpCi0gIHsKLSAgICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotCi0gICAgaWYgKCFzaHV0ZG93bl8pCi0gICAgewotICAgICAgaW1wbC5vcF9xdWV1ZV8ucHVzaChvcCk7Ci0KLSAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IG9wZXJhdGlvbiB0byBiZSBxdWV1ZWQgZ2V0cyB0byByZWdpc3RlciBhIHdhaXQgY2FsbGJhY2suCi0gICAgICAvLyBTdWJzZXF1ZW50IG9wZXJhdGlvbnMgaGF2ZSB0byB3YWl0IGZvciB0aGUgZmlyc3QgdG8gZmluaXNoLgotICAgICAgaWYgKGltcGwub3BfcXVldWVfLmZyb250KCkgPT0gb3ApCi0gICAgICAgIHJlZ2lzdGVyX3dhaXRfY2FsbGJhY2soaW1wbCwgbG9jayk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsb2NrLnVubG9jaygpOwotICAgICAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9uKG9wKTsKLSAgICB9Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgb3AtPmVjXyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICBpb19zZXJ2aWNlXy5wb3N0X2RlZmVycmVkX2NvbXBsZXRpb24ob3ApOwotICB9Ci19Ci0KLXZvaWQgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTo6cmVnaXN0ZXJfd2FpdF9jYWxsYmFjaygKLSAgICB3aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlOjppbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIG11dGV4OjpzY29wZWRfbG9jayYgbG9jaykKLXsKLSAgbG9jay5sb2NrKCk7Ci0KLSAgaWYgKCFSZWdpc3RlcldhaXRGb3JTaW5nbGVPYmplY3QoJmltcGwud2FpdF9oYW5kbGVfLAotICAgICAgICBpbXBsLmhhbmRsZV8sICZ3aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlOjp3YWl0X2NhbGxiYWNrLAotICAgICAgICAmaW1wbCwgSU5GSU5JVEUsIFdUX0VYRUNVVEVPTkxZT05DRSkpCi0gIHsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjKGxhc3RfZXJyb3IsCi0gICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotCi0gICAgb3BfcXVldWU8b3BlcmF0aW9uPiBjb21wbGV0ZWRfb3BzOwotICAgIHdoaWxlICh3YWl0X29wKiBvcCA9IGltcGwub3BfcXVldWVfLmZyb250KCkpCi0gICAgewotICAgICAgb3AtPmVjXyA9IGVjOwotICAgICAgaW1wbC5vcF9xdWV1ZV8ucG9wKCk7Ci0gICAgICBjb21wbGV0ZWRfb3BzLnB1c2gob3ApOwotICAgIH0KLQotICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhjb21wbGV0ZWRfb3BzKTsKLSAgfQotfQotCi12b2lkIHdpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2U6OndhaXRfY2FsbGJhY2soUFZPSUQgcGFyYW0sIEJPT0xFQU4pCi17Ci0gIGltcGxlbWVudGF0aW9uX3R5cGUqIGltcGwgPSBzdGF0aWNfY2FzdDxpbXBsZW1lbnRhdGlvbl90eXBlKj4ocGFyYW0pOwotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhpbXBsLT5vd25lcl8tPm11dGV4Xyk7Ci0KLSAgaWYgKGltcGwtPndhaXRfaGFuZGxlXyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgewotICAgIDo6VW5yZWdpc3RlcldhaXRFeChpbXBsLT53YWl0X2hhbmRsZV8sIE5VTEwpOwotICAgIGltcGwtPndhaXRfaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICB9Ci0KLSAgaWYgKHdhaXRfb3AqIG9wID0gaW1wbC0+b3BfcXVldWVfLmZyb250KCkpCi0gIHsKLSAgICBvcF9xdWV1ZTxvcGVyYXRpb24+IGNvbXBsZXRlZF9vcHM7Ci0KLSAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIGltcGwtPm9wX3F1ZXVlXy5wb3AoKTsKLSAgICBjb21wbGV0ZWRfb3BzLnB1c2gob3ApOwotCi0gICAgaWYgKCFpbXBsLT5vcF9xdWV1ZV8uZW1wdHkoKSkKLSAgICB7Ci0gICAgICBpZiAoIVJlZ2lzdGVyV2FpdEZvclNpbmdsZU9iamVjdCgmaW1wbC0+d2FpdF9oYW5kbGVfLAotICAgICAgICAgICAgaW1wbC0+aGFuZGxlXywgJndpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2U6OndhaXRfY2FsbGJhY2ssCi0gICAgICAgICAgICBwYXJhbSwgSU5GSU5JVEUsIFdUX0VYRUNVVEVPTkxZT05DRSkpCi0gICAgICB7Ci0gICAgICAgIERXT1JEIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgICAgICBhc2lvOjplcnJvcl9jb2RlIGVjKGxhc3RfZXJyb3IsCi0gICAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLQotICAgICAgICB3aGlsZSAoKG9wID0gaW1wbC0+b3BfcXVldWVfLmZyb250KCkpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICBvcC0+ZWNfID0gZWM7Ci0gICAgICAgICAgaW1wbC0+b3BfcXVldWVfLnBvcCgpOwotICAgICAgICAgIGNvbXBsZXRlZF9vcHMucHVzaChvcCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpb19zZXJ2aWNlX2ltcGwmIGlvcyA9IGltcGwtPm93bmVyXy0+aW9fc2VydmljZV87Ci0gICAgbG9jay51bmxvY2soKTsKLSAgICBpb3MucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhjb21wbGV0ZWRfb3BzKTsKLSAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19PQkpFQ1RfSEFORExFKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9XSU5fT0JKRUNUX0hBTkRMRV9TRVJWSUNFX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl9zdGF0aWNfbXV0ZXguaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl9zdGF0aWNfbXV0ZXguaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjU0YWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5fc3RhdGljX211dGV4LmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2ltcGwvd2luX3N0YXRpY19tdXRleC5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfV0lOX1NUQVRJQ19NVVRFWF9JUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfSU1QTF9XSU5fU1RBVElDX01VVEVYX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9zdGF0aWNfbXV0ZXguaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXZvaWQgd2luX3N0YXRpY19tdXRleDo6aW5pdCgpCi17Ci0gIGludCBlcnJvciA9IGRvX2luaXQoKTsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYyhlcnJvciwKLSAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic3RhdGljX211dGV4Iik7Ci19Ci0KLWludCB3aW5fc3RhdGljX211dGV4Ojpkb19pbml0KCkKLXsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIHNwcmludGYuCi0gIHdjaGFyX3QgbXV0ZXhfbmFtZVsxMjhdOwotI2lmIGRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLSAgc3dwcmludGZfcygKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLSAgX3Nud3ByaW50ZigKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NFQ1VSRV9SVEwpCi0gICAgICBtdXRleF9uYW1lLCAxMjgsIEwiYXNpby01OENDREM0NC02MjY0LTQ4NDItOTBDMi1GM0M1NDVDQjhBQTctJXUtJXAiLAotICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pig6OkdldEN1cnJlbnRQcm9jZXNzSWQoKSksIHRoaXMpOwotCi0gIEhBTkRMRSBtdXRleCA9IDo6Q3JlYXRlTXV0ZXhXKDAsIFRSVUUsIG11dGV4X25hbWUpOwotICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgaWYgKG11dGV4ID09IDApCi0gICAgcmV0dXJuIDo6R2V0TGFzdEVycm9yKCk7Ci0KLSAgaWYgKGxhc3RfZXJyb3IgPT0gRVJST1JfQUxSRUFEWV9FWElTVFMpCi0gICAgOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KG11dGV4LCBJTkZJTklURSk7Ci0KLSAgaWYgKGluaXRpYWxpc2VkXykKLSAgewotICAgIDo6UmVsZWFzZU11dGV4KG11dGV4KTsKLSAgICA6OkNsb3NlSGFuZGxlKG11dGV4KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0jaWYgZGVmaW5lZChfX01JTkdXMzJfXykKLSAgLy8gTm90IHN1cmUgaWYgTWluR1cgc3VwcG9ydHMgc3RydWN0dXJlZCBleGNlcHRpb24gaGFuZGxpbmcsIHNvIGZvciBub3cKLSAgLy8gd2UnbGwganVzdCBjYWxsIHRoZSBXaW5kb3dzIEFQSSBhbmQgaG9wZS4KLSMgaWYgZGVmaW5lZChVTkRFUl9DRSkKLSAgOjpJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZjcml0X3NlY3Rpb25fKTsKLSMgZWxzZQotICBpZiAoITo6SW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudCgmY3JpdF9zZWN0aW9uXywgMHg4MDAwMDAwMCkpCi0gIHsKLSAgICBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICA6OlJlbGVhc2VNdXRleChtdXRleCk7Ci0gICAgOjpDbG9zZUhhbmRsZShtdXRleCk7Ci0gICAgcmV0dXJuIGxhc3RfZXJyb3I7Ci0gIH0KLSMgZW5kaWYKLSNlbHNlCi0gIF9fdHJ5Ci0gIHsKLSMgaWYgZGVmaW5lZChVTkRFUl9DRSkKLSAgICA6OkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJmNyaXRfc2VjdGlvbl8pOwotIyBlbHNlCi0gICAgaWYgKCE6OkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQoJmNyaXRfc2VjdGlvbl8sIDB4ODAwMDAwMDApKQotICAgIHsKLSAgICAgIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgICAgOjpSZWxlYXNlTXV0ZXgobXV0ZXgpOwotICAgICAgOjpDbG9zZUhhbmRsZShtdXRleCk7Ci0gICAgICByZXR1cm4gbGFzdF9lcnJvcjsKLSAgICB9Ci0jIGVuZGlmCi0gIH0KLSAgX19leGNlcHQoR2V0RXhjZXB0aW9uQ29kZSgpID09IFNUQVRVU19OT19NRU1PUlkKLSAgICAgID8gRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiA6IEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0gpCi0gIHsKLSAgICA6OlJlbGVhc2VNdXRleChtdXRleCk7Ci0gICAgOjpDbG9zZUhhbmRsZShtdXRleCk7Ci0gICAgcmV0dXJuIEVSUk9SX09VVE9GTUVNT1JZOwotICB9Ci0jZW5kaWYKLQotICBpbml0aWFsaXNlZF8gPSB0cnVlOwotICA6OlJlbGVhc2VNdXRleChtdXRleCk7Ci0gIDo6Q2xvc2VIYW5kbGUobXV0ZXgpOwotICByZXR1cm4gMDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfV0lOX1NUQVRJQ19NVVRFWF9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5fdGhyZWFkLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5fdGhyZWFkLmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiMmM4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luX3RocmVhZC5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3dpbl90aHJlYWQuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1dJTl9USFJFQURfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfV0lOX1RIUkVBRF9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkKLQotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX3RocmVhZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotd2luX3RocmVhZDo6fndpbl90aHJlYWQoKQotewotICA6OkNsb3NlSGFuZGxlKHRocmVhZF8pOwotCi0gIC8vIFRoZSBleGl0X2V2ZW50XyBoYW5kbGUgaXMgZGVsaWJlcmF0ZWx5IGFsbG93ZWQgdG8gbGVhayBoZXJlIHNpbmNlIGl0Ci0gIC8vIGlzIGFuIGVycm9yIGZvciB0aGUgb3duZXIgb2YgYW4gaW50ZXJuYWwgdGhyZWFkIG5vdCB0byBqb2luKCkgaXQuCi19Ci0KLXZvaWQgd2luX3RocmVhZDo6am9pbigpCi17Ci0gIEhBTkRMRSBoYW5kbGVzWzJdID0geyBleGl0X2V2ZW50XywgdGhyZWFkXyB9OwotICA6OldhaXRGb3JNdWx0aXBsZU9iamVjdHMoMiwgaGFuZGxlcywgRkFMU0UsIElORklOSVRFKTsKLSAgOjpDbG9zZUhhbmRsZShleGl0X2V2ZW50Xyk7Ci0gIGlmICh0ZXJtaW5hdGVfdGhyZWFkcygpKQotICB7Ci0gICAgOjpUZXJtaW5hdGVUaHJlYWQodGhyZWFkXywgMCk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgOjpRdWV1ZVVzZXJBUEMoYXBjX2Z1bmN0aW9uLCB0aHJlYWRfLCAwKTsKLSAgICA6OldhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkXywgSU5GSU5JVEUpOwotICB9Ci19Ci0KLXZvaWQgd2luX3RocmVhZDo6c3RhcnRfdGhyZWFkKGZ1bmNfYmFzZSogYXJnLCB1bnNpZ25lZCBpbnQgc3RhY2tfc2l6ZSkKLXsKLSAgOjpIQU5ETEUgZW50cnlfZXZlbnQgPSAwOwotICBhcmctPmVudHJ5X2V2ZW50XyA9IGVudHJ5X2V2ZW50ID0gOjpDcmVhdGVFdmVudCgwLCB0cnVlLCBmYWxzZSwgMCk7Ci0gIGlmICghZW50cnlfZXZlbnQpCi0gIHsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBkZWxldGUgYXJnOwotICAgIGFzaW86OmVycm9yX2NvZGUgZWMobGFzdF9lcnJvciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInRocmVhZC5lbnRyeV9ldmVudCIpOwotICB9Ci0KLSAgYXJnLT5leGl0X2V2ZW50XyA9IGV4aXRfZXZlbnRfID0gOjpDcmVhdGVFdmVudCgwLCB0cnVlLCBmYWxzZSwgMCk7Ci0gIGlmICghZXhpdF9ldmVudF8pCi0gIHsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBkZWxldGUgYXJnOwotICAgIGFzaW86OmVycm9yX2NvZGUgZWMobGFzdF9lcnJvciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInRocmVhZC5leGl0X2V2ZW50Iik7Ci0gIH0KLQotICB1bnNpZ25lZCBpbnQgdGhyZWFkX2lkID0gMDsKLSAgdGhyZWFkXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExFPig6Ol9iZWdpbnRocmVhZGV4KDAsCi0gICAgICAgIHN0YWNrX3NpemUsIHdpbl90aHJlYWRfZnVuY3Rpb24sIGFyZywgMCwgJnRocmVhZF9pZCkpOwotICBpZiAoIXRocmVhZF8pCi0gIHsKLSAgICBEV09SRCBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKLSAgICBkZWxldGUgYXJnOwotICAgIGlmIChlbnRyeV9ldmVudCkKLSAgICAgIDo6Q2xvc2VIYW5kbGUoZW50cnlfZXZlbnQpOwotICAgIGlmIChleGl0X2V2ZW50XykKLSAgICAgIDo6Q2xvc2VIYW5kbGUoZXhpdF9ldmVudF8pOwotICAgIGFzaW86OmVycm9yX2NvZGUgZWMobGFzdF9lcnJvciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInRocmVhZCIpOwotICB9Ci0KLSAgaWYgKGVudHJ5X2V2ZW50KQotICB7Ci0gICAgOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KGVudHJ5X2V2ZW50LCBJTkZJTklURSk7Ci0gICAgOjpDbG9zZUhhbmRsZShlbnRyeV9ldmVudCk7Ci0gIH0KLX0KLQotdW5zaWduZWQgaW50IF9fc3RkY2FsbCB3aW5fdGhyZWFkX2Z1bmN0aW9uKHZvaWQqIGFyZykKLXsKLSAgd2luX3RocmVhZDo6YXV0b19mdW5jX2Jhc2VfcHRyIGZ1bmMgPSB7Ci0gICAgICBzdGF0aWNfY2FzdDx3aW5fdGhyZWFkOjpmdW5jX2Jhc2UqPihhcmcpIH07Ci0KLSAgOjpTZXRFdmVudChmdW5jLnB0ci0+ZW50cnlfZXZlbnRfKTsKLQotICBmdW5jLnB0ci0+cnVuKCk7Ci0KLSAgLy8gU2lnbmFsIHRoYXQgdGhlIHRocmVhZCBoYXMgZmluaXNoZWQgaXRzIHdvcmssIGJ1dCByYXRoZXIgdGhhbiByZXR1cm5pbmcgZ28KLSAgLy8gdG8gc2xlZXAgdG8gcHV0IHRoZSB0aHJlYWQgaW50byBhIHdlbGwga25vd24gc3RhdGUuIElmIHRoZSB0aHJlYWQgaXMgYmVpbmcKLSAgLy8gam9pbmVkIGR1cmluZyBnbG9iYWwgb2JqZWN0IGRlc3RydWN0aW9uIHRoZW4gaXQgbWF5IGJlIGtpbGxlZCB1c2luZwotICAvLyBUZXJtaW5hdGVUaHJlYWQgKHRvIGF2b2lkIGEgZGVhZGxvY2sgaW4gRGxsTWFpbikuIE90aGVyd2lzZSwgdGhlIFNsZWVwRXgKLSAgLy8gY2FsbCB3aWxsIGJlIGludGVycnVwdGVkIHVzaW5nIFF1ZXVlVXNlckFQQyBhbmQgdGhlIHRocmVhZCB3aWxsIHNodXQgZG93bgotICAvLyBjbGVhbmx5LgotICBIQU5ETEUgZXhpdF9ldmVudCA9IGZ1bmMucHRyLT5leGl0X2V2ZW50XzsKLSAgZGVsZXRlIGZ1bmMucHRyOwotICBmdW5jLnB0ciA9IDA7Ci0gIDo6U2V0RXZlbnQoZXhpdF9ldmVudCk7Ci0gIDo6U2xlZXBFeChJTkZJTklURSwgVFJVRSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZiBkZWZpbmVkKFdJTlZFUikgJiYgKFdJTlZFUiA8IDB4MDUwMCkKLXZvaWQgX19zdGRjYWxsIGFwY19mdW5jdGlvbihVTE9ORykge30KLSNlbHNlCi12b2lkIF9fc3RkY2FsbCBhcGNfZnVuY3Rpb24oVUxPTkdfUFRSKSB7fQotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKFVOREVSX0NFKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9XSU5fVEhSRUFEX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl90c3NfcHRyLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5fdHNzX3B0ci5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDE0YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbl90c3NfcHRyLmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC93aW5fdHNzX3B0ci5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9JTVBMX1dJTl9UU1NfUFRSX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1dJTl9UU1NfUFRSX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX3Rzc19wdHIuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLURXT1JEIHdpbl90c3NfcHRyX2NyZWF0ZSgpCi17Ci0jaWYgZGVmaW5lZChVTkRFUl9DRSkKLSAgZW51bSB7IG91dF9vZl9pbmRleGVzID0gMHhGRkZGRkZGRiB9OwotI2Vsc2UKLSAgZW51bSB7IG91dF9vZl9pbmRleGVzID0gVExTX09VVF9PRl9JTkRFWEVTIH07Ci0jZW5kaWYKLQotICBEV09SRCB0c3Nfa2V5ID0gOjpUbHNBbGxvYygpOwotICBpZiAodHNzX2tleSA9PSBvdXRfb2ZfaW5kZXhlcykKLSAgewotICAgIERXT1JEIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgIGFzaW86OmVycm9yX2NvZGUgZWMobGFzdF9lcnJvciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInRzcyIpOwotICB9Ci0gIHJldHVybiB0c3Nfa2V5OwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9XSU5fVFNTX1BUUl9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2UuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjUwNzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3dpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfV0lOUlRfU1NPQ0tFVF9TRVJWSUNFX0JBU0VfSVBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfV0lOUlRfU1NPQ0tFVF9TRVJWSUNFX0JBU0VfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2lucnRfYXN5bmNfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnJ0X3V0aWxzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi13aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6d2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2UoCi0gICAgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiBpb19zZXJ2aWNlXyh1c2Vfc2VydmljZTxpb19zZXJ2aWNlX2ltcGw+KGlvX3NlcnZpY2UpKSwKLSAgICBhc3luY19tYW5hZ2VyXyh1c2Vfc2VydmljZTx3aW5ydF9hc3luY19tYW5hZ2VyPihpb19zZXJ2aWNlKSksCi0gICAgbXV0ZXhfKCksCi0gICAgaW1wbF9saXN0XygwKQotewotfQotCi12b2lkIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlOjpzaHV0ZG93bl9zZXJ2aWNlKCkKLXsKLSAgLy8gQ2xvc2UgYWxsIGltcGxlbWVudGF0aW9ucywgY2F1c2luZyBhbGwgb3BlcmF0aW9ucyB0byBjb21wbGV0ZS4KLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUqIGltcGwgPSBpbXBsX2xpc3RfOwotICB3aGlsZSAoaW1wbCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgaWdub3JlZF9lYzsKLSAgICBjbG9zZSgqaW1wbCwgaWdub3JlZF9lYyk7Ci0gICAgaW1wbCA9IGltcGwtPm5leHRfOwotICB9Ci19Ci0KLXZvaWQgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmNvbnN0cnVjdCgKLSAgICB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotewotICAvLyBJbnNlcnQgaW1wbGVtZW50YXRpb24gaW50byBsaW5rZWQgbGlzdCBvZiBhbGwgaW1wbGVtZW50YXRpb25zLgotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gIGltcGwubmV4dF8gPSBpbXBsX2xpc3RfOwotICBpbXBsLnByZXZfID0gMDsKLSAgaWYgKGltcGxfbGlzdF8pCi0gICAgaW1wbF9saXN0Xy0+cHJldl8gPSAmaW1wbDsKLSAgaW1wbF9saXN0XyA9ICZpbXBsOwotfQotCi12b2lkIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX21vdmVfY29uc3RydWN0KAotICAgIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLXsKLSAgaW1wbC5zb2NrZXRfID0gb3RoZXJfaW1wbC5zb2NrZXRfOwotICBvdGhlcl9pbXBsLnNvY2tldF8gPSBudWxscHRyOwotCi0gIC8vIEluc2VydCBpbXBsZW1lbnRhdGlvbiBpbnRvIGxpbmtlZCBsaXN0IG9mIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgaW1wbC5uZXh0XyA9IGltcGxfbGlzdF87Ci0gIGltcGwucHJldl8gPSAwOwotICBpZiAoaW1wbF9saXN0XykKLSAgICBpbXBsX2xpc3RfLT5wcmV2XyA9ICZpbXBsOwotICBpbXBsX2xpc3RfID0gJmltcGw7Ci19Ci0KLXZvaWQgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfbW92ZV9hc3NpZ24oCi0gICAgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZSYgb3RoZXJfc2VydmljZSwKLSAgICB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotewotICBhc2lvOjplcnJvcl9jb2RlIGlnbm9yZWRfZWM7Ci0gIGNsb3NlKGltcGwsIGlnbm9yZWRfZWMpOwotCi0gIGlmICh0aGlzICE9ICZvdGhlcl9zZXJ2aWNlKQotICB7Ci0gICAgLy8gUmVtb3ZlIGltcGxlbWVudGF0aW9uIGZyb20gbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgaWYgKGltcGxfbGlzdF8gPT0gJmltcGwpCi0gICAgICBpbXBsX2xpc3RfID0gaW1wbC5uZXh0XzsKLSAgICBpZiAoaW1wbC5wcmV2XykKLSAgICAgIGltcGwucHJldl8tPm5leHRfID0gaW1wbC5uZXh0XzsKLSAgICBpZiAoaW1wbC5uZXh0XykKLSAgICAgIGltcGwubmV4dF8tPnByZXZfPSBpbXBsLnByZXZfOwotICAgIGltcGwubmV4dF8gPSAwOwotICAgIGltcGwucHJldl8gPSAwOwotICB9Ci0KLSAgaW1wbC5zb2NrZXRfID0gb3RoZXJfaW1wbC5zb2NrZXRfOwotICBvdGhlcl9pbXBsLnNvY2tldF8gPSBudWxscHRyOwotCi0gIGlmICh0aGlzICE9ICZvdGhlcl9zZXJ2aWNlKQotICB7Ci0gICAgLy8gSW5zZXJ0IGltcGxlbWVudGF0aW9uIGludG8gbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG90aGVyX3NlcnZpY2UubXV0ZXhfKTsKLSAgICBpbXBsLm5leHRfID0gb3RoZXJfc2VydmljZS5pbXBsX2xpc3RfOwotICAgIGltcGwucHJldl8gPSAwOwotICAgIGlmIChvdGhlcl9zZXJ2aWNlLmltcGxfbGlzdF8pCi0gICAgICBvdGhlcl9zZXJ2aWNlLmltcGxfbGlzdF8tPnByZXZfID0gJmltcGw7Ci0gICAgb3RoZXJfc2VydmljZS5pbXBsX2xpc3RfID0gJmltcGw7Ci0gIH0KLX0KLQotdm9pZCB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6ZGVzdHJveSgKLSAgICB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotewotICBhc2lvOjplcnJvcl9jb2RlIGlnbm9yZWRfZWM7Ci0gIGNsb3NlKGltcGwsIGlnbm9yZWRfZWMpOwotCi0gIC8vIFJlbW92ZSBpbXBsZW1lbnRhdGlvbiBmcm9tIGxpbmtlZCBsaXN0IG9mIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gIGFzaW86OmRldGFpbDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobXV0ZXhfKTsKLSAgaWYgKGltcGxfbGlzdF8gPT0gJmltcGwpCi0gICAgaW1wbF9saXN0XyA9IGltcGwubmV4dF87Ci0gIGlmIChpbXBsLnByZXZfKQotICAgIGltcGwucHJldl8tPm5leHRfID0gaW1wbC5uZXh0XzsKLSAgaWYgKGltcGwubmV4dF8pCi0gICAgaW1wbC5uZXh0Xy0+cHJldl89IGltcGwucHJldl87Ci0gIGltcGwubmV4dF8gPSAwOwotICBpbXBsLnByZXZfID0gMDsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6Y2xvc2UoCi0gICAgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGltcGwuc29ja2V0XykKLSAgewotICAgIGRlbGV0ZSBpbXBsLnNvY2tldF87Ci0gICAgaW1wbC5zb2NrZXRfID0gbnVsbHB0cjsKLSAgfQotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLXN0ZDo6c2l6ZV90IHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlOjpkb19nZXRfZW5kcG9pbnQoCi0gICAgY29uc3QgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBib29sIGxvY2FsLAotICAgIHZvaWQqIGFkZHIsIHN0ZDo6c2l6ZV90IGFkZHJfbGVuLCBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLXsKLSAgaWYgKCFpc19vcGVuKGltcGwpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIGFkZHJfbGVuOwotICB9Ci0KLSAgdHJ5Ci0gIHsKLSAgICBzdGQ6OnN0cmluZyBhZGRyX3N0cmluZyA9IHdpbnJ0X3V0aWxzOjpzdHJpbmcobG9jYWwKLSAgICAgICAgPyBpbXBsLnNvY2tldF8tPkluZm9ybWF0aW9uLT5Mb2NhbEFkZHJlc3MtPkNhbm9uaWNhbE5hbWUKLSAgICAgICAgOiBpbXBsLnNvY2tldF8tPkluZm9ybWF0aW9uLT5SZW1vdGVBZGRyZXNzLT5DYW5vbmljYWxOYW1lKTsKLSAgICB1bnNpZ25lZCBzaG9ydCBwb3J0ID0gd2lucnRfdXRpbHM6OmludGVnZXIobG9jYWwKLSAgICAgICAgPyBpbXBsLnNvY2tldF8tPkluZm9ybWF0aW9uLT5Mb2NhbFBvcnQKLSAgICAgICAgOiBpbXBsLnNvY2tldF8tPkluZm9ybWF0aW9uLT5SZW1vdGVQb3J0KTsKLSAgICB1bnNpZ25lZCBsb25nIHNjb3BlID0gMDsKLQotICAgIHN3aXRjaCAocmVpbnRlcnByZXRfY2FzdDxjb25zdCBzb2NrZXRfYWRkcl90eXBlKj4oYWRkciktPnNhX2ZhbWlseSkKLSAgICB7Ci0gICAgY2FzZSBBU0lPX09TX0RFRihBRl9JTkVUKToKLSAgICAgIGlmIChhZGRyX2xlbiA8IHNpemVvZihzb2NrYWRkcl9pbjRfdHlwZSkpCi0gICAgICB7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgICAgIHJldHVybiBhZGRyX2xlbjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc29ja2V0X29wczo6aW5ldF9wdG9uKEFTSU9fT1NfREVGKEFGX0lORVQpLCBhZGRyX3N0cmluZy5jX3N0cigpLAotICAgICAgICAgICAgJnJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHJfaW40X3R5cGUqPihhZGRyKS0+c2luX2FkZHIsICZzY29wZSwgZWMpOwotICAgICAgICByZWludGVycHJldF9jYXN0PHNvY2thZGRyX2luNF90eXBlKj4oYWRkciktPnNpbl9wb3J0Ci0gICAgICAgICAgPSBzb2NrZXRfb3BzOjpob3N0X3RvX25ldHdvcmtfc2hvcnQocG9ydCk7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgICByZXR1cm4gc2l6ZW9mKHNvY2thZGRyX2luNF90eXBlKTsKLSAgICAgIH0KLSAgICBjYXNlIEFTSU9fT1NfREVGKEFGX0lORVQ2KToKLSAgICAgIGlmIChhZGRyX2xlbiA8IHNpemVvZihzb2NrYWRkcl9pbjZfdHlwZSkpCi0gICAgICB7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgICAgIHJldHVybiBhZGRyX2xlbjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc29ja2V0X29wczo6aW5ldF9wdG9uKEFTSU9fT1NfREVGKEFGX0lORVQ2KSwgYWRkcl9zdHJpbmcuY19zdHIoKSwKLSAgICAgICAgICAgICZyZWludGVycHJldF9jYXN0PHNvY2thZGRyX2luNl90eXBlKj4oYWRkciktPnNpbjZfYWRkciwgJnNjb3BlLCBlYyk7Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHJfaW42X3R5cGUqPihhZGRyKS0+c2luNl9wb3J0Ci0gICAgICAgICAgPSBzb2NrZXRfb3BzOjpob3N0X3RvX25ldHdvcmtfc2hvcnQocG9ydCk7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgICByZXR1cm4gc2l6ZW9mKHNvY2thZGRyX2luNl90eXBlKTsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6YWRkcmVzc19mYW1pbHlfbm90X3N1cHBvcnRlZDsKLSAgICAgIHJldHVybiBhZGRyX2xlbjsKLSAgICB9Ci0gIH0KLSAgY2F0Y2ggKFBsYXRmb3JtOjpFeGNlcHRpb25eIGUpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoZS0+SFJlc3VsdCwKLSAgICAgICAgYXNpbzo6c3lzdGVtX2NhdGVnb3J5KCkpOwotICAgIHJldHVybiBhZGRyX2xlbjsKLSAgfQotfQotCi1hc2lvOjplcnJvcl9jb2RlIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlOjpkb19zZXRfb3B0aW9uKAotICAgIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY29uc3Qgdm9pZCogb3B0dmFsLAotICAgIHN0ZDo6c2l6ZV90IG9wdGxlbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmICghaXNfb3BlbihpbXBsKSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIHRyeQotICB7Ci0gICAgaWYgKGxldmVsID09IEFTSU9fT1NfREVGKFNPTF9TT0NLRVQpCi0gICAgICAgICYmIG9wdG5hbWUgPT0gQVNJT19PU19ERUYoU09fS0VFUEFMSVZFKSkKLSAgICB7Ci0gICAgICBpZiAob3B0bGVuID09IHNpemVvZihpbnQpKQotICAgICAgewotICAgICAgICBpbnQgdmFsdWUgPSAwOwotICAgICAgICBzdGQ6Om1lbWNweSgmdmFsdWUsIG9wdHZhbCwgb3B0bGVuKTsKLSAgICAgICAgaW1wbC5zb2NrZXRfLT5Db250cm9sLT5LZWVwQWxpdmUgPSAhIXZhbHVlOwotICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobGV2ZWwgPT0gQVNJT19PU19ERUYoSVBQUk9UT19UQ1ApCi0gICAgICAgICYmIG9wdG5hbWUgPT0gQVNJT19PU19ERUYoVENQX05PREVMQVkpKQotICAgIHsKLSAgICAgIGlmIChvcHRsZW4gPT0gc2l6ZW9mKGludCkpCi0gICAgICB7Ci0gICAgICAgIGludCB2YWx1ZSA9IDA7Ci0gICAgICAgIHN0ZDo6bWVtY3B5KCZ2YWx1ZSwgb3B0dmFsLCBvcHRsZW4pOwotICAgICAgICBpbXBsLnNvY2tldF8tPkNvbnRyb2wtPk5vRGVsYXkgPSAhIXZhbHVlOwotICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgfQotICB9Ci0gIGNhdGNoIChQbGF0Zm9ybTo6RXhjZXB0aW9uXiBlKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGUtPkhSZXN1bHQsCi0gICAgICAgIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgfQotCi0gIHJldHVybiBlYzsKLX0KLQotdm9pZCB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6ZG9fZ2V0X29wdGlvbigKLSAgICBjb25zdCB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIHZvaWQqIG9wdHZhbCwKLSAgICBzdGQ6OnNpemVfdCogb3B0bGVuLCBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLXsKLSAgaWYgKCFpc19vcGVuKGltcGwpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdHJ5Ci0gIHsKLSAgICBpZiAobGV2ZWwgPT0gQVNJT19PU19ERUYoU09MX1NPQ0tFVCkKLSAgICAgICAgJiYgb3B0bmFtZSA9PSBBU0lPX09TX0RFRihTT19LRUVQQUxJVkUpKQotICAgIHsKLSAgICAgIGlmICgqb3B0bGVuID49IHNpemVvZihpbnQpKQotICAgICAgewotICAgICAgICBpbnQgdmFsdWUgPSBpbXBsLnNvY2tldF8tPkNvbnRyb2wtPktlZXBBbGl2ZSA/IDEgOiAwOwotICAgICAgICBzdGQ6Om1lbWNweShvcHR2YWwsICZ2YWx1ZSwgc2l6ZW9mKGludCkpOwotICAgICAgICAqb3B0bGVuID0gc2l6ZW9mKGludCk7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChsZXZlbCA9PSBBU0lPX09TX0RFRihJUFBST1RPX1RDUCkKLSAgICAgICAgJiYgb3B0bmFtZSA9PSBBU0lPX09TX0RFRihUQ1BfTk9ERUxBWSkpCi0gICAgewotICAgICAgaWYgKCpvcHRsZW4gPj0gc2l6ZW9mKGludCkpCi0gICAgICB7Ci0gICAgICAgIGludCB2YWx1ZSA9IGltcGwuc29ja2V0Xy0+Q29udHJvbC0+Tm9EZWxheSA/IDEgOiAwOwotICAgICAgICBzdGQ6Om1lbWNweShvcHR2YWwsICZ2YWx1ZSwgc2l6ZW9mKGludCkpOwotICAgICAgICAqb3B0bGVuID0gc2l6ZW9mKGludCk7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICB9Ci0gIH0KLSAgY2F0Y2ggKFBsYXRmb3JtOjpFeGNlcHRpb25eIGUpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoZS0+SFJlc3VsdCwKLSAgICAgICAgYXNpbzo6c3lzdGVtX2NhdGVnb3J5KCkpOwotICB9Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmRvX2Nvbm5lY3QoCi0gICAgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBjb25zdCB2b2lkKiBhZGRyLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKCFpc19vcGVuKGltcGwpKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6YmFkX2Rlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgY2hhciBhZGRyX3N0cmluZ1ttYXhfYWRkcl92Nl9zdHJfbGVuXTsKLSAgdW5zaWduZWQgc2hvcnQgcG9ydDsKLSAgc3dpdGNoIChyZWludGVycHJldF9jYXN0PGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqPihhZGRyKS0+c2FfZmFtaWx5KQotICB7Ci0gIGNhc2UgQVNJT19PU19ERUYoQUZfSU5FVCk6Ci0gICAgc29ja2V0X29wczo6aW5ldF9udG9wKEFTSU9fT1NfREVGKEFGX0lORVQpLAotICAgICAgICAmcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzb2NrYWRkcl9pbjRfdHlwZSo+KGFkZHIpLT5zaW5fYWRkciwKLSAgICAgICAgYWRkcl9zdHJpbmcsIHNpemVvZihhZGRyX3N0cmluZyksIDAsIGVjKTsKLSAgICBwb3J0ID0gc29ja2V0X29wczo6bmV0d29ya190b19ob3N0X3Nob3J0KAotICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHNvY2thZGRyX2luNF90eXBlKj4oYWRkciktPnNpbl9wb3J0KTsKLSAgICBicmVhazsKLSAgY2FzZSBBU0lPX09TX0RFRihBRl9JTkVUNik6Ci0gICAgc29ja2V0X29wczo6aW5ldF9udG9wKEFTSU9fT1NfREVGKEFGX0lORVQ2KSwKLSAgICAgICAgJnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc29ja2FkZHJfaW42X3R5cGUqPihhZGRyKS0+c2luNl9hZGRyLAotICAgICAgICBhZGRyX3N0cmluZywgc2l6ZW9mKGFkZHJfc3RyaW5nKSwgMCwgZWMpOwotICAgIHBvcnQgPSBzb2NrZXRfb3BzOjpuZXR3b3JrX3RvX2hvc3Rfc2hvcnQoCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc29ja2FkZHJfaW42X3R5cGUqPihhZGRyKS0+c2luNl9wb3J0KTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBlYyA9IGFzaW86OmVycm9yOjphZGRyZXNzX2ZhbWlseV9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIGlmICghZWMpIHRyeQotICB7Ci0gICAgYXN5bmNfbWFuYWdlcl8uc3luYyhpbXBsLnNvY2tldF8tPkNvbm5lY3RBc3luYygKLSAgICAgICAgICByZWYgbmV3IFdpbmRvd3M6Ok5ldHdvcmtpbmc6Okhvc3ROYW1lKAotICAgICAgICAgICAgd2lucnRfdXRpbHM6OnN0cmluZyhhZGRyX3N0cmluZykpLAotICAgICAgICAgIHdpbnJ0X3V0aWxzOjpzdHJpbmcocG9ydCkpLCBlYyk7Ci0gIH0KLSAgY2F0Y2ggKFBsYXRmb3JtOjpFeGNlcHRpb25eIGUpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoZS0+SFJlc3VsdCwKLSAgICAgICAgYXNpbzo6c3lzdGVtX2NhdGVnb3J5KCkpOwotICB9Ci0KLSAgcmV0dXJuIGVjOwotfQotCi12b2lkIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlOjpzdGFydF9jb25uZWN0X29wKAotICAgIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgY29uc3Qgdm9pZCogYWRkciwgd2lucnRfYXN5bmNfb3A8dm9pZD4qIG9wLCBib29sIGlzX2NvbnRpbnVhdGlvbikKLXsKLSAgaWYgKCFpc19vcGVuKGltcGwpKQotICB7Ci0gICAgb3AtPmVjXyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICBpb19zZXJ2aWNlXy5wb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKG9wLCBpc19jb250aW51YXRpb24pOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNoYXIgYWRkcl9zdHJpbmdbbWF4X2FkZHJfdjZfc3RyX2xlbl07Ci0gIHVuc2lnbmVkIHNob3J0IHBvcnQgPSAwOwotICBzd2l0Y2ggKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc29ja2V0X2FkZHJfdHlwZSo+KGFkZHIpLT5zYV9mYW1pbHkpCi0gIHsKLSAgY2FzZSBBU0lPX09TX0RFRihBRl9JTkVUKToKLSAgICBzb2NrZXRfb3BzOjppbmV0X250b3AoQVNJT19PU19ERUYoQUZfSU5FVCksCi0gICAgICAgICZyZWludGVycHJldF9jYXN0PGNvbnN0IHNvY2thZGRyX2luNF90eXBlKj4oYWRkciktPnNpbl9hZGRyLAotICAgICAgICBhZGRyX3N0cmluZywgc2l6ZW9mKGFkZHJfc3RyaW5nKSwgMCwgb3AtPmVjXyk7Ci0gICAgcG9ydCA9IHNvY2tldF9vcHM6Om5ldHdvcmtfdG9faG9zdF9zaG9ydCgKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzb2NrYWRkcl9pbjRfdHlwZSo+KGFkZHIpLT5zaW5fcG9ydCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQVNJT19PU19ERUYoQUZfSU5FVDYpOgotICAgIHNvY2tldF9vcHM6OmluZXRfbnRvcChBU0lPX09TX0RFRihBRl9JTkVUNiksCi0gICAgICAgICZyZWludGVycHJldF9jYXN0PGNvbnN0IHNvY2thZGRyX2luNl90eXBlKj4oYWRkciktPnNpbjZfYWRkciwKLSAgICAgICAgYWRkcl9zdHJpbmcsIHNpemVvZihhZGRyX3N0cmluZyksIDAsIG9wLT5lY18pOwotICAgIHBvcnQgPSBzb2NrZXRfb3BzOjpuZXR3b3JrX3RvX2hvc3Rfc2hvcnQoCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc29ja2FkZHJfaW42X3R5cGUqPihhZGRyKS0+c2luNl9wb3J0KTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3I6OmFkZHJlc3NfZmFtaWx5X25vdF9zdXBwb3J0ZWQ7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBpZiAob3AtPmVjXykKLSAgewotICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdHJ5Ci0gIHsKLSAgICBhc3luY19tYW5hZ2VyXy5hc3luYyhpbXBsLnNvY2tldF8tPkNvbm5lY3RBc3luYygKLSAgICAgICAgICByZWYgbmV3IFdpbmRvd3M6Ok5ldHdvcmtpbmc6Okhvc3ROYW1lKAotICAgICAgICAgICAgd2lucnRfdXRpbHM6OnN0cmluZyhhZGRyX3N0cmluZykpLAotICAgICAgICAgIHdpbnJ0X3V0aWxzOjpzdHJpbmcocG9ydCkpLCBvcCk7Ci0gIH0KLSAgY2F0Y2ggKFBsYXRmb3JtOjpFeGNlcHRpb25eIGUpCi0gIHsKLSAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgICAgZS0+SFJlc3VsdCwgYXNpbzo6c3lzdGVtX2NhdGVnb3J5KCkpOwotICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gIH0KLX0KLQotc3RkOjpzaXplX3Qgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmRvX3NlbmQoCi0gICAgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICBjb25zdCBhc2lvOjpjb25zdF9idWZmZXImIGRhdGEsCi0gICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpZiAoZmxhZ3MpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmICghaXNfb3BlbihpbXBsKSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdHJ5Ci0gIHsKLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjpjb25zdF9idWZmZXIsCi0gICAgICBhc2lvOjpjb25zdF9idWZmZXJzXzE+IGJ1ZnMoYXNpbzo6YnVmZmVyKGRhdGEpKTsKLQotICAgIGlmIChidWZzLmFsbF9lbXB0eSgpKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFzeW5jX21hbmFnZXJfLnN5bmMoCi0gICAgICAgIGltcGwuc29ja2V0Xy0+T3V0cHV0U3RyZWFtLT5Xcml0ZUFzeW5jKGJ1ZnMuYnVmZmVycygpWzBdKSwgZWMpOwotICB9Ci0gIGNhdGNoIChQbGF0Zm9ybTo6RXhjZXB0aW9uXiBlKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKGUtPkhSZXN1bHQsCi0gICAgICAgIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi12b2lkIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlOjpzdGFydF9zZW5kX29wKAotICAgICAgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IGFzaW86OmNvbnN0X2J1ZmZlciYgZGF0YSwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsCi0gICAgICB3aW5ydF9hc3luY19vcDx1bnNpZ25lZCBpbnQ+KiBvcCwgYm9vbCBpc19jb250aW51YXRpb24pCi17Ci0gIGlmIChmbGFncykKLSAgewotICAgIG9wLT5lY18gPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgaW9fc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgaXNfY29udGludWF0aW9uKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIWlzX29wZW4oaW1wbCkpCi0gIHsKLSAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdHJ5Ci0gIHsKLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjpjb25zdF9idWZmZXIsCi0gICAgICAgIGFzaW86OmNvbnN0X2J1ZmZlcnNfMT4gYnVmcyhhc2lvOjpidWZmZXIoZGF0YSkpOwotCi0gICAgaWYgKGJ1ZnMuYWxsX2VtcHR5KCkpCi0gICAgewotICAgICAgaW9fc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgaXNfY29udGludWF0aW9uKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhc3luY19tYW5hZ2VyXy5hc3luYygKLSAgICAgICAgaW1wbC5zb2NrZXRfLT5PdXRwdXRTdHJlYW0tPldyaXRlQXN5bmMoYnVmcy5idWZmZXJzKClbMF0pLCBvcCk7Ci0gIH0KLSAgY2F0Y2ggKFBsYXRmb3JtOjpFeGNlcHRpb25eIGUpCi0gIHsKLSAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3JfY29kZShlLT5IUmVzdWx0LAotICAgICAgICBhc2lvOjpzeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgaW9fc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgaXNfY29udGludWF0aW9uKTsKLSAgfQotfQotCi1zdGQ6OnNpemVfdCB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6ZG9fcmVjZWl2ZSgKLSAgICB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6YmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgIGNvbnN0IGFzaW86Om11dGFibGVfYnVmZmVyJiBkYXRhLAotICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaWYgKGZsYWdzKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoIWlzX29wZW4oaW1wbCkpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpiYWRfZGVzY3JpcHRvcjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHRyeQotICB7Ci0gICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6bXV0YWJsZV9idWZmZXIsCi0gICAgICAgIGFzaW86Om11dGFibGVfYnVmZmVyc18xPiBidWZzKGFzaW86OmJ1ZmZlcihkYXRhKSk7Ci0KLSAgICBpZiAoYnVmcy5hbGxfZW1wdHkoKSkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGFzeW5jX21hbmFnZXJfLnN5bmMoCi0gICAgICAgIGltcGwuc29ja2V0Xy0+SW5wdXRTdHJlYW0tPlJlYWRBc3luYygKLSAgICAgICAgICBidWZzLmJ1ZmZlcnMoKVswXSwgYnVmcy5idWZmZXJzKClbMF0tPkNhcGFjaXR5LAotICAgICAgICAgIFdpbmRvd3M6OlN0b3JhZ2U6OlN0cmVhbXM6OklucHV0U3RyZWFtT3B0aW9uczo6UGFydGlhbCksIGVjKTsKLQotICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gYnVmcy5idWZmZXJzKClbMF0tPkxlbmd0aDsKLSAgICBpZiAoYnl0ZXNfdHJhbnNmZXJyZWQgPT0gMCAmJiAhZWMpCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6ZW9mOwotICAgIH0KLQotICAgIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLSAgfQotICBjYXRjaCAoUGxhdGZvcm06OkV4Y2VwdGlvbl4gZSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShlLT5IUmVzdWx0LAotICAgICAgICBhc2lvOjpzeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotdm9pZCB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZTo6c3RhcnRfcmVjZWl2ZV9vcCgKLSAgICAgIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlciYgZGF0YSwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsCi0gICAgICB3aW5ydF9hc3luY19vcDxXaW5kb3dzOjpTdG9yYWdlOjpTdHJlYW1zOjpJQnVmZmVyXj4qIG9wLAotICAgICAgYm9vbCBpc19jb250aW51YXRpb24pCi17Ci0gIGlmIChmbGFncykKLSAgewotICAgIG9wLT5lY18gPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgaW9fc2VydmljZV8ucG9zdF9pbW1lZGlhdGVfY29tcGxldGlvbihvcCwgaXNfY29udGludWF0aW9uKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIWlzX29wZW4oaW1wbCkpCi0gIHsKLSAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3I6OmJhZF9kZXNjcmlwdG9yOwotICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdHJ5Ci0gIHsKLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgYXNpbzo6bXV0YWJsZV9idWZmZXJzXzE+IGJ1ZnMoYXNpbzo6YnVmZmVyKGRhdGEpKTsKLQotICAgIGlmIChidWZzLmFsbF9lbXB0eSgpKQotICAgIHsKLSAgICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXN5bmNfbWFuYWdlcl8uYXN5bmMoCi0gICAgICAgIGltcGwuc29ja2V0Xy0+SW5wdXRTdHJlYW0tPlJlYWRBc3luYygKLSAgICAgICAgICBidWZzLmJ1ZmZlcnMoKVswXSwgYnVmcy5idWZmZXJzKClbMF0tPkNhcGFjaXR5LAotICAgICAgICAgIFdpbmRvd3M6OlN0b3JhZ2U6OlN0cmVhbXM6OklucHV0U3RyZWFtT3B0aW9uczo6UGFydGlhbCksIG9wKTsKLSAgfQotICBjYXRjaCAoUGxhdGZvcm06OkV4Y2VwdGlvbl4gZSkKLSAgewotICAgIG9wLT5lY18gPSBhc2lvOjplcnJvcl9jb2RlKGUtPkhSZXN1bHQsCi0gICAgICAgIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICBpb19zZXJ2aWNlXy5wb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKG9wLCBpc19jb250aW51YXRpb24pOwotICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfV0lOUlRfU1NPQ0tFVF9TRVJWSUNFX0JBU0VfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2lucnRfdGltZXJfc2NoZWR1bGVyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWI3NDcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pbXBsL3dpbnJ0X3RpbWVyX3NjaGVkdWxlci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfSU1QTF9XSU5SVF9USU1FUl9TQ0hFRFVMRVJfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lNUExfV0lOUlRfVElNRVJfU0NIRURVTEVSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci12b2lkIHdpbnJ0X3RpbWVyX3NjaGVkdWxlcjo6YWRkX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUpCi17Ci0gIGRvX2FkZF90aW1lcl9xdWV1ZShxdWV1ZSk7Ci19Ci0KLS8vIFJlbW92ZSBhIHRpbWVyIHF1ZXVlIGZyb20gdGhlIHJlYWN0b3IuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci12b2lkIHdpbnJ0X3RpbWVyX3NjaGVkdWxlcjo6cmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUpCi17Ci0gIGRvX3JlbW92ZV90aW1lcl9xdWV1ZShxdWV1ZSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXZvaWQgd2lucnRfdGltZXJfc2NoZWR1bGVyOjpzY2hlZHVsZV90aW1lcih0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlLAotICAgIGNvbnN0IHR5cGVuYW1lIFRpbWVfVHJhaXRzOjp0aW1lX3R5cGUmIHRpbWUsCi0gICAgdHlwZW5hbWUgdGltZXJfcXVldWU8VGltZV9UcmFpdHM+OjpwZXJfdGltZXJfZGF0YSYgdGltZXIsIHdhaXRfb3AqIG9wKQotewotICBhc2lvOjpkZXRhaWw6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgaWYgKHNodXRkb3duXykKLSAgewotICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIGVhcmxpZXN0ID0gcXVldWUuZW5xdWV1ZV90aW1lcih0aW1lLCB0aW1lciwgb3ApOwotICBpb19zZXJ2aWNlXy53b3JrX3N0YXJ0ZWQoKTsKLSAgaWYgKGVhcmxpZXN0KQotICAgIGV2ZW50Xy5zaWduYWwobG9jayk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLXN0ZDo6c2l6ZV90IHdpbnJ0X3RpbWVyX3NjaGVkdWxlcjo6Y2FuY2VsX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgdHlwZW5hbWUgdGltZXJfcXVldWU8VGltZV9UcmFpdHM+OjpwZXJfdGltZXJfZGF0YSYgdGltZXIsCi0gICAgc3RkOjpzaXplX3QgbWF4X2NhbmNlbGxlZCkKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBvcF9xdWV1ZTxvcGVyYXRpb24+IG9wczsKLSAgc3RkOjpzaXplX3QgbiA9IHF1ZXVlLmNhbmNlbF90aW1lcih0aW1lciwgb3BzLCBtYXhfY2FuY2VsbGVkKTsKLSAgbG9jay51bmxvY2soKTsKLSAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHMpOwotICByZXR1cm4gbjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU1QTF9XSU5SVF9USU1FUl9TQ0hFRFVMRVJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2lucnRfdGltZXJfc2NoZWR1bGVyLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM4OTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW1wbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfV0lOUlRfVElNRVJfU0NIRURVTEVSX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1dJTlJUX1RJTUVSX1NDSEVEVUxFUl9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnJ0X3RpbWVyX3NjaGVkdWxlci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotd2lucnRfdGltZXJfc2NoZWR1bGVyOjp3aW5ydF90aW1lcl9zY2hlZHVsZXIoCi0gICAgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTx3aW5ydF90aW1lcl9zY2hlZHVsZXI+KGlvX3NlcnZpY2UpLAotICAgIGlvX3NlcnZpY2VfKHVzZV9zZXJ2aWNlPGlvX3NlcnZpY2VfaW1wbD4oaW9fc2VydmljZSkpLAotICAgIG11dGV4XygpLAotICAgIGV2ZW50XygpLAotICAgIHRpbWVyX3F1ZXVlc18oKSwKLSAgICB0aHJlYWRfKDApLAotICAgIHN0b3BfdGhyZWFkXyhmYWxzZSksCi0gICAgc2h1dGRvd25fKGZhbHNlKQotewotICB0aHJlYWRfID0gbmV3IGFzaW86OmRldGFpbDo6dGhyZWFkKAotICAgICAgYmluZF9oYW5kbGVyKCZ3aW5ydF90aW1lcl9zY2hlZHVsZXI6OmNhbGxfcnVuX3RocmVhZCwgdGhpcykpOwotfQotCi13aW5ydF90aW1lcl9zY2hlZHVsZXI6On53aW5ydF90aW1lcl9zY2hlZHVsZXIoKQotewotICBzaHV0ZG93bl9zZXJ2aWNlKCk7Ci19Ci0KLXZvaWQgd2lucnRfdGltZXJfc2NoZWR1bGVyOjpzaHV0ZG93bl9zZXJ2aWNlKCkKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICBzaHV0ZG93bl8gPSB0cnVlOwotICBzdG9wX3RocmVhZF8gPSB0cnVlOwotICBldmVudF8uc2lnbmFsKGxvY2spOwotICBsb2NrLnVubG9jaygpOwotCi0gIGlmICh0aHJlYWRfKQotICB7Ci0gICAgdGhyZWFkXy0+am9pbigpOwotICAgIGRlbGV0ZSB0aHJlYWRfOwotICAgIHRocmVhZF8gPSAwOwotICB9Ci0KLSAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gIHRpbWVyX3F1ZXVlc18uZ2V0X2FsbF90aW1lcnMob3BzKTsKLSAgaW9fc2VydmljZV8uYWJhbmRvbl9vcGVyYXRpb25zKG9wcyk7Ci19Ci0KLXZvaWQgd2lucnRfdGltZXJfc2NoZWR1bGVyOjpmb3JrX3NlcnZpY2UoYXNpbzo6aW9fc2VydmljZTo6Zm9ya19ldmVudCkKLXsKLX0KLQotdm9pZCB3aW5ydF90aW1lcl9zY2hlZHVsZXI6OmluaXRfdGFzaygpCi17Ci19Ci0KLXZvaWQgd2lucnRfdGltZXJfc2NoZWR1bGVyOjpydW5fdGhyZWFkKCkKLXsKLSAgYXNpbzo6ZGV0YWlsOjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICB3aGlsZSAoIXN0b3BfdGhyZWFkXykKLSAgewotICAgIGNvbnN0IGxvbmcgbWF4X3dhaXRfZHVyYXRpb24gPSA1ICogNjAgKiAxMDAwMDAwOwotICAgIGxvbmcgd2FpdF9kdXJhdGlvbiA9IHRpbWVyX3F1ZXVlc18ud2FpdF9kdXJhdGlvbl91c2VjKG1heF93YWl0X2R1cmF0aW9uKTsKLSAgICBldmVudF8ud2FpdF9mb3JfdXNlYyhsb2NrLCB3YWl0X2R1cmF0aW9uKTsKLSAgICBldmVudF8uY2xlYXIobG9jayk7Ci0gICAgb3BfcXVldWU8b3BlcmF0aW9uPiBvcHM7Ci0gICAgdGltZXJfcXVldWVzXy5nZXRfcmVhZHlfdGltZXJzKG9wcyk7Ci0gICAgaWYgKCFvcHMuZW1wdHkoKSkKLSAgICB7Ci0gICAgICBsb2NrLnVubG9jaygpOwotICAgICAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9ucyhvcHMpOwotICAgICAgbG9jay5sb2NrKCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgd2lucnRfdGltZXJfc2NoZWR1bGVyOjpjYWxsX3J1bl90aHJlYWQod2lucnRfdGltZXJfc2NoZWR1bGVyKiBzY2hlZHVsZXIpCi17Ci0gIHNjaGVkdWxlci0+cnVuX3RocmVhZCgpOwotfQotCi12b2lkIHdpbnJ0X3RpbWVyX3NjaGVkdWxlcjo6ZG9fYWRkX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlX2Jhc2UmIHF1ZXVlKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICB0aW1lcl9xdWV1ZXNfLmluc2VydCgmcXVldWUpOwotfQotCi12b2lkIHdpbnJ0X3RpbWVyX3NjaGVkdWxlcjo6ZG9fcmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlX2Jhc2UmIHF1ZXVlKQotewotICBtdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtdXRleF8pOwotICB0aW1lcl9xdWV1ZXNfLmVyYXNlKCZxdWV1ZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0lNUExfV0lOUlRfVElNRVJfU0NIRURVTEVSX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9pbXBsL3dpbnNvY2tfaW5pdC5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luc29ja19pbml0LmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVjYzllMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2ltcGwvd2luc29ja19pbml0LmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvaW1wbC93aW5zb2NrX2luaXQuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lNUExfV0lOU09DS19JTklUX0lQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9JTVBMX1dJTlNPQ0tfSU5JVF9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnNvY2tfaW5pdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXZvaWQgd2luc29ja19pbml0X2Jhc2U6OnN0YXJ0dXAoZGF0YSYgZCwKLSAgICB1bnNpZ25lZCBjaGFyIG1ham9yLCB1bnNpZ25lZCBjaGFyIG1pbm9yKQotewotICBpZiAoOjpJbnRlcmxvY2tlZEluY3JlbWVudCgmZC5pbml0X2NvdW50XykgPT0gMSkKLSAgewotICAgIFdTQURBVEEgd3NhX2RhdGE7Ci0gICAgbG9uZyByZXN1bHQgPSA6OldTQVN0YXJ0dXAoTUFLRVdPUkQobWFqb3IsIG1pbm9yKSwgJndzYV9kYXRhKTsKLSAgICA6OkludGVybG9ja2VkRXhjaGFuZ2UoJmQucmVzdWx0XywgcmVzdWx0KTsKLSAgfQotfQotCi12b2lkIHdpbnNvY2tfaW5pdF9iYXNlOjptYW51YWxfc3RhcnR1cChkYXRhJiBkKQotewotICBpZiAoOjpJbnRlcmxvY2tlZEluY3JlbWVudCgmZC5pbml0X2NvdW50XykgPT0gMSkKLSAgewotICAgIDo6SW50ZXJsb2NrZWRFeGNoYW5nZSgmZC5yZXN1bHRfLCAwKTsKLSAgfQotfQotCi12b2lkIHdpbnNvY2tfaW5pdF9iYXNlOjpjbGVhbnVwKGRhdGEmIGQpCi17Ci0gIGlmICg6OkludGVybG9ja2VkRGVjcmVtZW50KCZkLmluaXRfY291bnRfKSA9PSAwKQotICB7Ci0gICAgOjpXU0FDbGVhbnVwKCk7Ci0gIH0KLX0KLQotdm9pZCB3aW5zb2NrX2luaXRfYmFzZTo6bWFudWFsX2NsZWFudXAoZGF0YSYgZCkKLXsKLSAgOjpJbnRlcmxvY2tlZERlY3JlbWVudCgmZC5pbml0X2NvdW50Xyk7Ci19Ci0KLXZvaWQgd2luc29ja19pbml0X2Jhc2U6OnRocm93X29uX2Vycm9yKGRhdGEmIGQpCi17Ci0gIGxvbmcgcmVzdWx0ID0gOjpJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCZkLnJlc3VsdF8sIDApOwotICBpZiAocmVzdWx0ICE9IDApCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjKHJlc3VsdCwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIndpbnNvY2siKTsKLSAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9JTVBMX1dJTlNPQ0tfSU5JVF9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW9fY29udHJvbC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2lvX2NvbnRyb2wuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjVhYmE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvaW9fY29udHJvbC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9pb19jb250cm9sLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0lPX0NPTlRST0xfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0lPX0NPTlRST0xfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci1uYW1lc3BhY2UgaW9fY29udHJvbCB7Ci0KLS8vIElPIGNvbnRyb2wgY29tbWFuZCBmb3Igbm9uLWJsb2NraW5nIEkvTy4KLWNsYXNzIG5vbl9ibG9ja2luZ19pbwotewotcHVibGljOgotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBub25fYmxvY2tpbmdfaW8oKQotICAgIDogdmFsdWVfKDApCi0gIHsKLSAgfQotCi0gIC8vIENvbnN0cnVjdCB3aXRoIGEgc3BlY2lmaWMgY29tbWFuZCB2YWx1ZS4KLSAgbm9uX2Jsb2NraW5nX2lvKGJvb2wgdmFsdWUpCi0gICAgOiB2YWx1ZV8odmFsdWUgPyAxIDogMCkKLSAgewotICB9Ci0KLSAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBJTyBjb250cm9sIGNvbW1hbmQuCi0gIGludCBuYW1lKCkgY29uc3QKLSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KEFTSU9fT1NfREVGKEZJT05CSU8pKTsKLSAgfQotCi0gIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIEkvTyBjb250cm9sIGNvbW1hbmQuCi0gIHZvaWQgc2V0KGJvb2wgdmFsdWUpCi0gIHsKLSAgICB2YWx1ZV8gPSB2YWx1ZSA/IDEgOiAwOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBJL08gY29udHJvbCBjb21tYW5kLgotICBib29sIGdldCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdmFsdWVfICE9IDA7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbW1hbmQgZGF0YS4KLSAgZGV0YWlsOjppb2N0bF9hcmdfdHlwZSogZGF0YSgpCi0gIHsKLSAgICByZXR1cm4gJnZhbHVlXzsKLSAgfQotCi0gIC8vIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgY29tbWFuZCBkYXRhLgotICBjb25zdCBkZXRhaWw6OmlvY3RsX2FyZ190eXBlKiBkYXRhKCkgY29uc3QKLSAgewotICAgIHJldHVybiAmdmFsdWVfOwotICB9Ci0KLXByaXZhdGU6Ci0gIGRldGFpbDo6aW9jdGxfYXJnX3R5cGUgdmFsdWVfOwotfTsKLQotLy8gSS9PIGNvbnRyb2wgY29tbWFuZCBmb3IgZ2V0dGluZyBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLgotY2xhc3MgYnl0ZXNfcmVhZGFibGUKLXsKLXB1YmxpYzoKLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgYnl0ZXNfcmVhZGFibGUoKQotICAgIDogdmFsdWVfKDApCi0gIHsKLSAgfQotCi0gIC8vIENvbnN0cnVjdCB3aXRoIGEgc3BlY2lmaWMgY29tbWFuZCB2YWx1ZS4KLSAgYnl0ZXNfcmVhZGFibGUoc3RkOjpzaXplX3QgdmFsdWUpCi0gICAgOiB2YWx1ZV8oc3RhdGljX2Nhc3Q8ZGV0YWlsOjppb2N0bF9hcmdfdHlwZT4odmFsdWUpKQotICB7Ci0gIH0KLQotICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIElPIGNvbnRyb2wgY29tbWFuZC4KLSAgaW50IG5hbWUoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oQVNJT19PU19ERUYoRklPTlJFQUQpKTsKLSAgfQotCi0gIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIEkvTyBjb250cm9sIGNvbW1hbmQuCi0gIHZvaWQgc2V0KHN0ZDo6c2l6ZV90IHZhbHVlKQotICB7Ci0gICAgdmFsdWVfID0gc3RhdGljX2Nhc3Q8ZGV0YWlsOjppb2N0bF9hcmdfdHlwZT4odmFsdWUpOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBJL08gY29udHJvbCBjb21tYW5kLgotICBzdGQ6OnNpemVfdCBnZXQoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90Pih2YWx1ZV8pOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBjb21tYW5kIGRhdGEuCi0gIGRldGFpbDo6aW9jdGxfYXJnX3R5cGUqIGRhdGEoKQotICB7Ci0gICAgcmV0dXJuICZ2YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbW1hbmQgZGF0YS4KLSAgY29uc3QgZGV0YWlsOjppb2N0bF9hcmdfdHlwZSogZGF0YSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gJnZhbHVlXzsKLSAgfQotCi1wcml2YXRlOgotICBkZXRhaWw6OmlvY3RsX2FyZ190eXBlIHZhbHVlXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGlvX2NvbnRyb2wKLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfSU9fQ09OVFJPTF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwva2V5d29yZF90c3NfcHRyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwva2V5d29yZF90c3NfcHRyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4NDBiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2tleXdvcmRfdHNzX3B0ci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2tleXdvcmRfdHNzX3B0ci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0tFWVdPUkRfVFNTX1BUUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfS0VZV09SRF9UU1NfUFRSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19USFJFQURfS0VZV09SRF9FWFRFTlNJT04pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBrZXl3b3JkX3Rzc19wdHIKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBrZXl3b3JkX3Rzc19wdHIoKQotICB7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+a2V5d29yZF90c3NfcHRyKCkKLSAgewotICB9Ci0KLSAgLy8gR2V0IHRoZSB2YWx1ZS4KLSAgb3BlcmF0b3IgVCooKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotCi0gIC8vIFNldCB0aGUgdmFsdWUuCi0gIHZvaWQgb3BlcmF0b3I9KFQqIHZhbHVlKQotICB7Ci0gICAgdmFsdWVfID0gdmFsdWU7Ci0gIH0KLQotcHJpdmF0ZToKLSAgc3RhdGljIEFTSU9fVEhSRUFEX0tFWVdPUkQgVCogdmFsdWVfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1BU0lPX1RIUkVBRF9LRVlXT1JEIFQqIGtleXdvcmRfdHNzX3B0cjxUPjo6dmFsdWVfOwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfVEhSRUFEX0tFWVdPUkRfRVhURU5TSU9OKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfS0VZV09SRF9UU1NfUFRSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9rcXVldWVfcmVhY3Rvci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2txdWV1ZV9yZWFjdG9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhYjIxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2txdWV1ZV9yZWFjdG9yLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vLwotLy8gZGV0YWlsL2txdWV1ZV9yZWFjdG9yLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDA1IFN0ZWZhbiBBcmVudHogKHN0ZWZhbiBhdCBzb3plIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX0tRVUVVRV9SRUFDVE9SX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9LUVVFVUVfUkVBQ1RPUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfS1FVRVVFKQotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvZXZlbnQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2xpbWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbXV0ZXguaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL29iamVjdF9wb29sLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcF9xdWV1ZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc2VsZWN0X2ludGVycnVwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX3NldC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2FpdF9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLQotLy8gT2xkZXIgdmVyc2lvbnMgb2YgTWFjIE9TIFggbWF5IG5vdCBkZWZpbmUgRVZfT09CQU5ELgotI2lmICFkZWZpbmVkKEVWX09PQkFORCkKLSMgZGVmaW5lIEVWX09PQkFORCBFVl9GTEFHMQotI2VuZGlmIC8vICFkZWZpbmVkKEVWX09PQkFORCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBrcXVldWVfcmVhY3RvcgotICA6IHB1YmxpYyBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxrcXVldWVfcmVhY3Rvcj4KLXsKLXB1YmxpYzoKLSAgZW51bSBvcF90eXBlcyB7IHJlYWRfb3AgPSAwLCB3cml0ZV9vcCA9IDEsCi0gICAgY29ubmVjdF9vcCA9IDEsIGV4Y2VwdF9vcCA9IDIsIG1heF9vcHMgPSAzIH07Ci0KLSAgLy8gUGVyLWRlc2NyaXB0b3IgcXVldWVzLgotICBzdHJ1Y3QgZGVzY3JpcHRvcl9zdGF0ZQotICB7Ci0gICAgZnJpZW5kIGNsYXNzIGtxdWV1ZV9yZWFjdG9yOwotICAgIGZyaWVuZCBjbGFzcyBvYmplY3RfcG9vbF9hY2Nlc3M7Ci0KLSAgICBkZXNjcmlwdG9yX3N0YXRlKiBuZXh0XzsKLSAgICBkZXNjcmlwdG9yX3N0YXRlKiBwcmV2XzsKLQotICAgIG11dGV4IG11dGV4XzsKLSAgICBpbnQgZGVzY3JpcHRvcl87Ci0gICAgaW50IG51bV9rZXZlbnRzXzsgLy8gMSA9PSByZWFkIG9ubHksIDIgPT0gcmVhZCBhbmQgd3JpdGUKLSAgICBvcF9xdWV1ZTxyZWFjdG9yX29wPiBvcF9xdWV1ZV9bbWF4X29wc107Ci0gICAgYm9vbCBzaHV0ZG93bl87Ci0gIH07Ci0KLSAgLy8gUGVyLWRlc2NyaXB0b3IgZGF0YS4KLSAgdHlwZWRlZiBkZXNjcmlwdG9yX3N0YXRlKiBwZXJfZGVzY3JpcHRvcl9kYXRhOwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wga3F1ZXVlX3JlYWN0b3IoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIH5rcXVldWVfcmVhY3RvcigpOwotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIEFTSU9fREVDTCB2b2lkIHNodXRkb3duX3NlcnZpY2UoKTsKLQotICAvLyBSZWNyZWF0ZSBpbnRlcm5hbCBkZXNjcmlwdG9ycyBmb2xsb3dpbmcgYSBmb3JrLgotICBBU0lPX0RFQ0wgdm9pZCBmb3JrX3NlcnZpY2UoCi0gICAgICBhc2lvOjppb19zZXJ2aWNlOjpmb3JrX2V2ZW50IGZvcmtfZXYpOwotCi0gIC8vIEluaXRpYWxpc2UgdGhlIHRhc2suCi0gIEFTSU9fREVDTCB2b2lkIGluaXRfdGFzaygpOwotCi0gIC8vIFJlZ2lzdGVyIGEgc29ja2V0IHdpdGggdGhlIHJlYWN0b3IuIFJldHVybnMgMCBvbiBzdWNjZXNzLCBzeXN0ZW0gZXJyb3IKLSAgLy8gY29kZSBvbiBmYWlsdXJlLgotICBBU0lPX0RFQ0wgaW50IHJlZ2lzdGVyX2Rlc2NyaXB0b3Ioc29ja2V0X3R5cGUgZGVzY3JpcHRvciwKLSAgICAgIHBlcl9kZXNjcmlwdG9yX2RhdGEmIGRlc2NyaXB0b3JfZGF0YSk7Ci0KLSAgLy8gUmVnaXN0ZXIgYSBkZXNjcmlwdG9yIHdpdGggYW4gYXNzb2NpYXRlZCBzaW5nbGUgb3BlcmF0aW9uLiBSZXR1cm5zIDAgb24KLSAgLy8gc3VjY2Vzcywgc3lzdGVtIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAgQVNJT19ERUNMIGludCByZWdpc3Rlcl9pbnRlcm5hbF9kZXNjcmlwdG9yKAotICAgICAgaW50IG9wX3R5cGUsIHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiBkZXNjcmlwdG9yX2RhdGEsIHJlYWN0b3Jfb3AqIG9wKTsKLQotICAvLyBNb3ZlIGRlc2NyaXB0b3IgcmVnaXN0cmF0aW9uIGZyb20gb25lIGRlc2NyaXB0b3JfZGF0YSBvYmplY3QgdG8gYW5vdGhlci4KLSAgQVNJT19ERUNMIHZvaWQgbW92ZV9kZXNjcmlwdG9yKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiB0YXJnZXRfZGVzY3JpcHRvcl9kYXRhLAotICAgICAgcGVyX2Rlc2NyaXB0b3JfZGF0YSYgc291cmNlX2Rlc2NyaXB0b3JfZGF0YSk7Ci0KLSAgLy8gUG9zdCBhIHJlYWN0b3Igb3BlcmF0aW9uIGZvciBpbW1lZGlhdGUgY29tcGxldGlvbi4KLSAgdm9pZCBwb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKHJlYWN0b3Jfb3AqIG9wLCBib29sIGlzX2NvbnRpbnVhdGlvbikKLSAgewotICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gIH0KLQotICAvLyBTdGFydCBhIG5ldyBvcGVyYXRpb24uIFRoZSByZWFjdG9yIG9wZXJhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCB3aGVuIHRoZQotICAvLyBnaXZlbiBkZXNjcmlwdG9yIGlzIGZsYWdnZWQgYXMgcmVhZHksIG9yIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfb3AoaW50IG9wX3R5cGUsIHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiBkZXNjcmlwdG9yX2RhdGEsIHJlYWN0b3Jfb3AqIG9wLAotICAgICAgYm9vbCBpc19jb250aW51YXRpb24sIGJvb2wgYWxsb3dfc3BlY3VsYXRpdmUpOwotCi0gIC8vIENhbmNlbCBhbGwgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0b3IuIFRoZQotICAvLyBoYW5kbGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3Igd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlCi0gIC8vIG9wZXJhdGlvbl9hYm9ydGVkIGVycm9yLgotICBBU0lPX0RFQ0wgdm9pZCBjYW5jZWxfb3BzKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiBkZXNjcmlwdG9yX2RhdGEpOwotCi0gIC8vIENhbmNlbCBhbnkgb3BlcmF0aW9ucyB0aGF0IGFyZSBydW5uaW5nIGFnYWluc3QgdGhlIGRlc2NyaXB0b3IgYW5kIHJlbW92ZQotICAvLyBpdHMgcmVnaXN0cmF0aW9uIGZyb20gdGhlIHJlYWN0b3IuCi0gIEFTSU9fREVDTCB2b2lkIGRlcmVnaXN0ZXJfZGVzY3JpcHRvcihzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgICAgcGVyX2Rlc2NyaXB0b3JfZGF0YSYgZGVzY3JpcHRvcl9kYXRhLCBib29sIGNsb3NpbmcpOwotCi0gIC8vIFJlbW90ZSB0aGUgZGVzY3JpcHRvcidzIHJlZ2lzdHJhdGlvbiBmcm9tIHRoZSByZWFjdG9yLgotICBBU0lPX0RFQ0wgdm9pZCBkZXJlZ2lzdGVyX2ludGVybmFsX2Rlc2NyaXB0b3IoCi0gICAgICBzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLCBwZXJfZGVzY3JpcHRvcl9kYXRhJiBkZXNjcmlwdG9yX2RhdGEpOwotCi0gIC8vIEFkZCBhIG5ldyB0aW1lciBxdWV1ZSB0byB0aGUgcmVhY3Rvci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotICB2b2lkIGFkZF90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlKTsKLQotICAvLyBSZW1vdmUgYSB0aW1lciBxdWV1ZSBmcm9tIHRoZSByZWFjdG9yLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci0gIHZvaWQgcmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUpOwotCi0gIC8vIFNjaGVkdWxlIGEgbmV3IG9wZXJhdGlvbiBpbiB0aGUgZ2l2ZW4gdGltZXIgcXVldWUgdG8gZXhwaXJlIGF0IHRoZQotICAvLyBzcGVjaWZpZWQgYWJzb2x1dGUgdGltZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotICB2b2lkIHNjaGVkdWxlX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgICBjb25zdCB0eXBlbmFtZSBUaW1lX1RyYWl0czo6dGltZV90eXBlJiB0aW1lLAotICAgICAgdHlwZW5hbWUgdGltZXJfcXVldWU8VGltZV9UcmFpdHM+OjpwZXJfdGltZXJfZGF0YSYgdGltZXIsIHdhaXRfb3AqIG9wKTsKLQotICAvLyBDYW5jZWwgdGhlIHRpbWVyIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0b2tlbi4gUmV0dXJucyB0aGUKLSAgLy8gbnVtYmVyIG9mIG9wZXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gcG9zdGVkIG9yIGRpc3BhdGNoZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLSAgc3RkOjpzaXplX3QgY2FuY2VsX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgICB0eXBlbmFtZSB0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz46OnBlcl90aW1lcl9kYXRhJiB0aW1lciwKLSAgICAgIHN0ZDo6c2l6ZV90IG1heF9jYW5jZWxsZWQgPSAoc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnNpemVfdD46Om1heCkoKSk7Ci0KLSAgLy8gUnVuIHRoZSBrcXVldWUgbG9vcC4KLSAgQVNJT19ERUNMIHZvaWQgcnVuKGJvb2wgYmxvY2ssIG9wX3F1ZXVlPG9wZXJhdGlvbj4mIG9wcyk7Ci0KLSAgLy8gSW50ZXJydXB0IHRoZSBrcXVldWUgbG9vcC4KLSAgQVNJT19ERUNMIHZvaWQgaW50ZXJydXB0KCk7Ci0KLXByaXZhdGU6Ci0gIC8vIENyZWF0ZSB0aGUga3F1ZXVlIGZpbGUgZGVzY3JpcHRvci4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZGVzY3JpcHRvcgotICAvLyBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgQVNJT19ERUNMIHN0YXRpYyBpbnQgZG9fa3F1ZXVlX2NyZWF0ZSgpOwotCi0gIC8vIEFsbG9jYXRlIGEgbmV3IGRlc2NyaXB0b3Igc3RhdGUgb2JqZWN0LgotICBBU0lPX0RFQ0wgZGVzY3JpcHRvcl9zdGF0ZSogYWxsb2NhdGVfZGVzY3JpcHRvcl9zdGF0ZSgpOwotCi0gIC8vIEZyZWUgYW4gZXhpc3RpbmcgZGVzY3JpcHRvciBzdGF0ZSBvYmplY3QuCi0gIEFTSU9fREVDTCB2b2lkIGZyZWVfZGVzY3JpcHRvcl9zdGF0ZShkZXNjcmlwdG9yX3N0YXRlKiBzKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gYWRkIGEgbmV3IHRpbWVyIHF1ZXVlLgotICBBU0lPX0RFQ0wgdm9pZCBkb19hZGRfdGltZXJfcXVldWUodGltZXJfcXVldWVfYmFzZSYgcXVldWUpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byByZW1vdmUgYSB0aW1lciBxdWV1ZS4KLSAgQVNJT19ERUNMIHZvaWQgZG9fcmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlX2Jhc2UmIHF1ZXVlKTsKLQotICAvLyBHZXQgdGhlIHRpbWVvdXQgdmFsdWUgZm9yIHRoZSBrZXZlbnQgY2FsbC4KLSAgQVNJT19ERUNMIHRpbWVzcGVjKiBnZXRfdGltZW91dCh0aW1lc3BlYyYgdHMpOwotCi0gIC8vIFRoZSBpb19zZXJ2aWNlIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gcG9zdCBjb21wbGV0aW9ucy4KLSAgaW9fc2VydmljZV9pbXBsJiBpb19zZXJ2aWNlXzsKLQotICAvLyBNdXRleCB0byBwcm90ZWN0IGFjY2VzcyB0byBpbnRlcm5hbCBkYXRhLgotICBtdXRleCBtdXRleF87Ci0KLSAgLy8gVGhlIGtxdWV1ZSBmaWxlIGRlc2NyaXB0b3IuCi0gIGludCBrcXVldWVfZmRfOwotCi0gIC8vIFRoZSBpbnRlcnJ1cHRlciBpcyB1c2VkIHRvIGJyZWFrIGEgYmxvY2tpbmcga2V2ZW50IGNhbGwuCi0gIHNlbGVjdF9pbnRlcnJ1cHRlciBpbnRlcnJ1cHRlcl87Ci0KLSAgLy8gVGhlIHRpbWVyIHF1ZXVlcy4KLSAgdGltZXJfcXVldWVfc2V0IHRpbWVyX3F1ZXVlc187Ci0KLSAgLy8gV2hldGhlciB0aGUgc2VydmljZSBoYXMgYmVlbiBzaHV0IGRvd24uCi0gIGJvb2wgc2h1dGRvd25fOwotCi0gIC8vIE11dGV4IHRvIHByb3RlY3QgYWNjZXNzIHRvIHRoZSByZWdpc3RlcmVkIGRlc2NyaXB0b3JzLgotICBtdXRleCByZWdpc3RlcmVkX2Rlc2NyaXB0b3JzX211dGV4XzsKLQotICAvLyBLZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcmVkIGRlc2NyaXB0b3JzLgotICBvYmplY3RfcG9vbDxkZXNjcmlwdG9yX3N0YXRlPiByZWdpc3RlcmVkX2Rlc2NyaXB0b3JzXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9rcXVldWVfcmVhY3Rvci5ocHAiCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL2txdWV1ZV9yZWFjdG9yLmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0tRVUVVRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0tRVUVVRV9SRUFDVE9SX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9saW1pdHMuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9saW1pdHMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzI0NzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbGltaXRzLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvbGltaXRzLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfTElNSVRTX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9MSU1JVFNfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0xJTUlUUykKLSMgaW5jbHVkZSA8Ym9vc3QvbGltaXRzLmhwcD4KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfTElNSVRTKQotIyBpbmNsdWRlIDxsaW1pdHM+Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19CT09TVF9MSU1JVFMpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9MSU1JVFNfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2xvY2FsX2ZyZWVfb25fYmxvY2tfZXhpdC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL2xvY2FsX2ZyZWVfb25fYmxvY2tfZXhpdC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NjBkZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9sb2NhbF9mcmVlX29uX2Jsb2NrX2V4aXQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9sb2NhbF9mcmVlX29uX2Jsb2NrX2V4aXQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9MT0NBTF9GUkVFX09OX0JMT0NLX0VYSVRfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX0xPQ0FMX0ZSRUVfT05fQkxPQ0tfRVhJVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBsb2NhbF9mcmVlX29uX2Jsb2NrX2V4aXQKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yIGJsb2NrcyBhbGwgc2lnbmFscyBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkLgotICBleHBsaWNpdCBsb2NhbF9mcmVlX29uX2Jsb2NrX2V4aXQodm9pZCogcCkKLSAgICA6IHBfKHApCi0gIHsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IgcmVzdG9yZXMgdGhlIHByZXZpb3VzIHNpZ25hbCBtYXNrLgotICB+bG9jYWxfZnJlZV9vbl9ibG9ja19leGl0KCkKLSAgewotICAgIDo6TG9jYWxGcmVlKHBfKTsKLSAgfQotCi1wcml2YXRlOgotICB2b2lkKiBwXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX0xPQ0FMX0ZSRUVfT05fQkxPQ0tfRVhJVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbWFjb3NfZmVuY2VkX2Jsb2NrLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbWFjb3NfZmVuY2VkX2Jsb2NrLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxYzFlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL21hY29zX2ZlbmNlZF9ibG9jay5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLwotLy8gZGV0YWlsL21hY29zX2ZlbmNlZF9ibG9jay5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX01BQ09TX0ZFTkNFRF9CTE9DS19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfTUFDT1NfRkVOQ0VEX0JMT0NLX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChfX01BQ0hfXykgJiYgZGVmaW5lZChfX0FQUExFX18pCi0KLSNpbmNsdWRlIDxsaWJrZXJuL09TQXRvbWljLmg+Ci0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3MgbWFjb3NfZmVuY2VkX2Jsb2NrCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICBlbnVtIGhhbGZfdCB7IGhhbGYgfTsKLSAgZW51bSBmdWxsX3QgeyBmdWxsIH07Ci0KLSAgLy8gQ29uc3RydWN0b3IgZm9yIGEgaGFsZiBmZW5jZWQgYmxvY2suCi0gIGV4cGxpY2l0IG1hY29zX2ZlbmNlZF9ibG9jayhoYWxmX3QpCi0gIHsKLSAgfQotCi0gIC8vIENvbnN0cnVjdG9yIGZvciBhIGZ1bGwgZmVuY2VkIGJsb2NrLgotICBleHBsaWNpdCBtYWNvc19mZW5jZWRfYmxvY2soZnVsbF90KQotICB7Ci0gICAgT1NNZW1vcnlCYXJyaWVyKCk7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+bWFjb3NfZmVuY2VkX2Jsb2NrKCkKLSAgewotICAgIE9TTWVtb3J5QmFycmllcigpOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfTUFDT1NfRkVOQ0VEX0JMT0NLX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9tdXRleC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL211dGV4LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4ODVhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL211dGV4LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvbXV0ZXguaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX01VVEVYX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9NVVRFWF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL251bGxfbXV0ZXguaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9tdXRleC5ocHAiCi0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9wb3NpeF9tdXRleC5ocHAiCi0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9NVVRFWF9BTkRfQ09ORFZBUikKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvc3RkX211dGV4LmhwcCIKLSNlbHNlCi0jIGVycm9yIE9ubHkgV2luZG93cywgUE9TSVggYW5kIHN0ZDo6bXV0ZXggYXJlIHN1cHBvcnRlZCEKLSNlbmRpZgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi10eXBlZGVmIG51bGxfbXV0ZXggbXV0ZXg7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLXR5cGVkZWYgd2luX211dGV4IG11dGV4OwotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLXR5cGVkZWYgcG9zaXhfbXV0ZXggbXV0ZXg7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9NVVRFWF9BTkRfQ09ORFZBUikKLXR5cGVkZWYgc3RkX211dGV4IG11dGV4OwotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfTVVURVhfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjVhYzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9ub25jb3B5YWJsZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfTk9OQ09QWUFCTEVfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX05PTkNPUFlBQkxFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIG5vbmNvcHlhYmxlCi17Ci1wcm90ZWN0ZWQ6Ci0gIG5vbmNvcHlhYmxlKCkge30KLSAgfm5vbmNvcHlhYmxlKCkge30KLXByaXZhdGU6Ci0gIG5vbmNvcHlhYmxlKGNvbnN0IG5vbmNvcHlhYmxlJik7Ci0gIGNvbnN0IG5vbmNvcHlhYmxlJiBvcGVyYXRvcj0oY29uc3Qgbm9uY29weWFibGUmKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi11c2luZyBhc2lvOjpkZXRhaWw6Om5vbmNvcHlhYmxlOwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9OT05DT1BZQUJMRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF9ldmVudC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL251bGxfZXZlbnQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRiYjE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF9ldmVudC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLwotLy8gZGV0YWlsL251bGxfZXZlbnQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfTlVMTF9FVkVOVF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfTlVMTF9FVkVOVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3MgbnVsbF9ldmVudAotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIG51bGxfZXZlbnQoKQotICB7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+bnVsbF9ldmVudCgpCi0gIHsKLSAgfQotCi0gIC8vIFNpZ25hbCB0aGUgZXZlbnQuIChSZXRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4pCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb2NrPgotICB2b2lkIHNpZ25hbChMb2NrJikKLSAgewotICB9Ci0KLSAgLy8gU2lnbmFsIGFsbCB3YWl0ZXJzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgdm9pZCBzaWduYWxfYWxsKExvY2smKQotICB7Ci0gIH0KLQotICAvLyBVbmxvY2sgdGhlIG11dGV4IGFuZCBzaWduYWwgb25lIHdhaXRlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExvY2s+Ci0gIHZvaWQgdW5sb2NrX2FuZF9zaWduYWxfb25lKExvY2smKQotICB7Ci0gIH0KLQotICAvLyBJZiB0aGVyZSdzIGEgd2FpdGVyLCB1bmxvY2sgdGhlIG11dGV4IGFuZCBzaWduYWwgaXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb2NrPgotICBib29sIG1heWJlX3VubG9ja19hbmRfc2lnbmFsX29uZShMb2NrJikKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFJlc2V0IHRoZSBldmVudC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExvY2s+Ci0gIHZvaWQgY2xlYXIoTG9jayYpCi0gIHsKLSAgfQotCi0gIC8vIFdhaXQgZm9yIHRoZSBldmVudCB0byBiZWNvbWUgc2lnbmFsbGVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgdm9pZCB3YWl0KExvY2smKQotICB7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfVEhSRUFEUykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX05VTExfRVZFTlRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL251bGxfZmVuY2VkX2Jsb2NrLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF9mZW5jZWRfYmxvY2suaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTkyZGUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF9mZW5jZWRfYmxvY2suaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9udWxsX2ZlbmNlZF9ibG9jay5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfTlVMTF9GRU5DRURfQkxPQ0tfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX05VTExfRkVOQ0VEX0JMT0NLX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3MgbnVsbF9mZW5jZWRfYmxvY2sKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIGVudW0gaGFsZl9vcl9mdWxsX3QgeyBoYWxmLCBmdWxsIH07Ci0KLSAgLy8gQ29uc3RydWN0b3IuCi0gIGV4cGxpY2l0IG51bGxfZmVuY2VkX2Jsb2NrKGhhbGZfb3JfZnVsbF90KQotICB7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+bnVsbF9mZW5jZWRfYmxvY2soKQotICB7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfTlVMTF9GRU5DRURfQkxPQ0tfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL251bGxfbXV0ZXguaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9udWxsX211dGV4LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlOTJlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL251bGxfbXV0ZXguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9udWxsX211dGV4LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX05VTExfTVVURVhfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX05VTExfTVVURVhfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Njb3BlZF9sb2NrLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBudWxsX211dGV4Ci0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c2NvcGVkX2xvY2s8bnVsbF9tdXRleD4gc2NvcGVkX2xvY2s7Ci0KLSAgLy8gQ29uc3RydWN0b3IuCi0gIG51bGxfbXV0ZXgoKQotICB7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+bnVsbF9tdXRleCgpCi0gIHsKLSAgfQotCi0gIC8vIExvY2sgdGhlIG11dGV4LgotICB2b2lkIGxvY2soKQotICB7Ci0gIH0KLQotICAvLyBVbmxvY2sgdGhlIG11dGV4LgotICB2b2lkIHVubG9jaygpCi0gIHsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfTlVMTF9NVVRFWF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF9yZWFjdG9yLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF9yZWFjdG9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4YzQ3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL251bGxfcmVhY3Rvci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLwotLy8gZGV0YWlsL251bGxfcmVhY3Rvci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX05VTExfUkVBQ1RPUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfTlVMTF9SRUFDVE9SX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3MgbnVsbF9yZWFjdG9yCi0gIDogcHVibGljIGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPG51bGxfcmVhY3Rvcj4KLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIG51bGxfcmVhY3Rvcihhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8bnVsbF9yZWFjdG9yPihpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+bnVsbF9yZWFjdG9yKCkKLSAgewotICB9Ci0KLSAgLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCkKLSAgewotICB9Ci0KLSAgLy8gTm8tb3AgYmVjYXVzZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLgotICB2b2lkIHJ1bihib29sIC8qYmxvY2sqLywgb3BfcXVldWU8b3BlcmF0aW9uPiYgLypvcHMqLykKLSAgewotICB9Ci0KLSAgLy8gTm8tb3AuCi0gIHZvaWQgaW50ZXJydXB0KCkKLSAgewotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9OVUxMX1JFQUNUT1JfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL251bGxfc2lnbmFsX2Jsb2NrZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9udWxsX3NpZ25hbF9ibG9ja2VyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlZDAxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL251bGxfc2lnbmFsX2Jsb2NrZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9udWxsX3NpZ25hbF9ibG9ja2VyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX05VTExfU0lHTkFMX0JMT0NLRVJfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX05VTExfU0lHTkFMX0JMT0NLRVJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKSBcCi0gIHx8IGRlZmluZWQoQVNJT19XSU5ET1dTKSBcCi0gIHx8IGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpIFwKLSAgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSBcCi0gIHx8IGRlZmluZWQoX19TWU1CSUFOMzJfXykKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBudWxsX3NpZ25hbF9ibG9ja2VyCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICAvLyBDb25zdHJ1Y3RvciBibG9ja3MgYWxsIHNpZ25hbHMgZm9yIHRoZSBjYWxsaW5nIHRocmVhZC4KLSAgbnVsbF9zaWduYWxfYmxvY2tlcigpCi0gIHsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IgcmVzdG9yZXMgdGhlIHByZXZpb3VzIHNpZ25hbCBtYXNrLgotICB+bnVsbF9zaWduYWxfYmxvY2tlcigpCi0gIHsKLSAgfQotCi0gIC8vIEJsb2NrIGFsbCBzaWduYWxzIGZvciB0aGUgY2FsbGluZyB0aHJlYWQuCi0gIHZvaWQgYmxvY2soKQotICB7Ci0gIH0KLQotICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyBzaWduYWwgbWFzay4KLSAgdm9pZCB1bmJsb2NrKCkKLSAgewotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0gICAgICAgLy8gfHwgZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgLy8gfHwgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgICAgICAvLyB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgICAgLy8gfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfTlVMTF9TSUdOQUxfQkxPQ0tFUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF9zb2NrZXRfc2VydmljZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL251bGxfc29ja2V0X3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkxNzIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF9zb2NrZXRfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9udWxsX3NvY2tldF9zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX05VTExfU09DS0VUX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX05VTExfU09DS0VUX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jaW5jbHVkZSAiYXNpby9idWZmZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9zb2NrZXRfYmFzZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci1jbGFzcyBudWxsX3NvY2tldF9zZXJ2aWNlCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBwcm90b2NvbCB0eXBlLgotICB0eXBlZGVmIFByb3RvY29sIHByb3RvY29sX3R5cGU7Ci0KLSAgLy8gVGhlIGVuZHBvaW50IHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLSAgLy8gVGhlIG5hdGl2ZSB0eXBlIG9mIGEgc29ja2V0LgotICB0eXBlZGVmIGludCBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgLy8gVGhlIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgdGhlIHNvY2tldC4KLSAgc3RydWN0IGltcGxlbWVudGF0aW9uX3R5cGUKLSAgewotICB9OwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBudWxsX3NvY2tldF9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBpb19zZXJ2aWNlXyhpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICB2b2lkIHNodXRkb3duX3NlcnZpY2UoKQotICB7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3QgYSBuZXcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJikKLSAgewotICB9Ci0KLSAgLy8gTW92ZS1jb25zdHJ1Y3QgYSBuZXcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmLCBpbXBsZW1lbnRhdGlvbl90eXBlJikKLSAgewotICB9Ci0KLSAgLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2Fzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIG51bGxfc29ja2V0X3NlcnZpY2UmLCBpbXBsZW1lbnRhdGlvbl90eXBlJikKLSAgewotICB9Ci0KLSAgLy8gTW92ZS1jb25zdHJ1Y3QgYSBuZXcgc29ja2V0IGltcGxlbWVudGF0aW9uIGZyb20gYW5vdGhlciBwcm90b2NvbCB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxPgotICB2b2lkIGNvbnZlcnRpbmdfbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICB0eXBlbmFtZSBudWxsX3NvY2tldF9zZXJ2aWNlPFByb3RvY29sMT46OmltcGxlbWVudGF0aW9uX3R5cGUmKQotICB7Ci0gIH0KLQotICAvLyBEZXN0cm95IGEgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIGRlc3Ryb3koaW1wbGVtZW50YXRpb25fdHlwZSYpCi0gIHsKLSAgfQotCi0gIC8vIE9wZW4gYSBuZXcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIG9wZW4oaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBjb25zdCBwcm90b2NvbF90eXBlJiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBBc3NpZ24gYSBuYXRpdmUgc29ja2V0IHRvIGEgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiwgY29uc3QgcHJvdG9jb2xfdHlwZSYsCi0gICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgb3Blbi4KLSAgYm9vbCBpc19vcGVuKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gRGVzdHJveSBhIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjbG9zZShpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBuYXRpdmUgc29ja2V0IHJlcHJlc2VudGF0aW9uLgotICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZShpbXBsZW1lbnRhdGlvbl90eXBlJikKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gQ2FuY2VsIGFsbCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIGNhbmNlbChpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBhdCB0aGUgb3V0LW9mLWJhbmQgZGF0YSBtYXJrLgotICBib29sIGF0X21hcmsoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgcmVhZGluZy4KLSAgc3RkOjpzaXplX3QgYXZhaWxhYmxlKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFBsYWNlIHRoZSBzb2NrZXQgaW50byB0aGUgc3RhdGUgd2hlcmUgaXQgd2lsbCBsaXN0ZW4gZm9yIG5ldyBjb25uZWN0aW9ucy4KLSAgYXNpbzo6ZXJyb3JfY29kZSBsaXN0ZW4oaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBpbnQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gUGVyZm9ybSBhbiBJTyBjb250cm9sIGNvbW1hbmQgb24gdGhlIHNvY2tldC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElPX0NvbnRyb2xfQ29tbWFuZD4KLSAgYXNpbzo6ZXJyb3JfY29kZSBpb19jb250cm9sKGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgSU9fQ29udHJvbF9Db21tYW5kJiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBHZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgc29ja2V0LgotICBib29sIG5vbl9ibG9ja2luZyhjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJikgY29uc3QKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFNldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBzb2NrZXQuCi0gIGFzaW86OmVycm9yX2NvZGUgbm9uX2Jsb2NraW5nKGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgYm9vbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBHZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYm9vbCBuYXRpdmVfbm9uX2Jsb2NraW5nKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gU2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIG5hdGl2ZSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgbmF0aXZlX25vbl9ibG9ja2luZyhpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIGJvb2wsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gRGlzYWJsZSBzZW5kcyBvciByZWNlaXZlcyBvbiB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIHNodXRkb3duKGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgc29ja2V0X2Jhc2U6OnNodXRkb3duX3R5cGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gQmluZCB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYWwgZW5kcG9pbnQuCi0gIGFzaW86OmVycm9yX2NvZGUgYmluZChpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFNldCBhIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgc2V0X29wdGlvbihpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIGNvbnN0IE9wdGlvbiYsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gU2V0IGEgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wdGlvbj4KLSAgYXNpbzo6ZXJyb3JfY29kZSBnZXRfb3B0aW9uKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgT3B0aW9uJiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGxvY2FsIGVuZHBvaW50LgotICBlbmRwb2ludF90eXBlIGxvY2FsX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gZW5kcG9pbnRfdHlwZSgpOwotICB9Ci0KLSAgLy8gR2V0IHRoZSByZW1vdGUgZW5kcG9pbnQuCi0gIGVuZHBvaW50X3R5cGUgcmVtb3RlX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gZW5kcG9pbnRfdHlwZSgpOwotICB9Ci0KLSAgLy8gU2VuZCB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgcGVlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHNlbmQoaW1wbGVtZW50YXRpb25fdHlwZSYsIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIGRhdGEgY2FuIGJlIHNlbnQgd2l0aG91dCBibG9ja2luZy4KLSAgc3RkOjpzaXplX3Qgc2VuZChpbXBsZW1lbnRhdGlvbl90eXBlJiwgY29uc3QgbnVsbF9idWZmZXJzJiwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQuIFRoZSBkYXRhIGJlaW5nIHNlbnQgbXVzdCBiZSB2YWxpZCBmb3IgdGhlCi0gIC8vIGxpZmV0aW1lIG9mIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19zZW5kKGltcGxlbWVudGF0aW9uX3R5cGUmLCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICBjb25zdCBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gICAgaW9fc2VydmljZV8ucG9zdChkZXRhaWw6OmJpbmRfaGFuZGxlcihoYW5kbGVyLCBlYywgYnl0ZXNfdHJhbnNmZXJyZWQpKTsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3YWl0IHVudGlsIGRhdGEgY2FuIGJlIHNlbnQgd2l0aG91dCBibG9ja2luZy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfc2VuZChpbXBsZW1lbnRhdGlvbl90eXBlJiwgY29uc3QgbnVsbF9idWZmZXJzJiwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICBjb25zdCBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gICAgaW9fc2VydmljZV8ucG9zdChkZXRhaWw6OmJpbmRfaGFuZGxlcihoYW5kbGVyLCBlYywgYnl0ZXNfdHJhbnNmZXJyZWQpKTsKLSAgfQotCi0gIC8vIFJlY2VpdmUgc29tZSBkYXRhIGZyb20gdGhlIHBlZXIuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVjZWl2ZShpbXBsZW1lbnRhdGlvbl90eXBlJiwgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCBkYXRhIGNhbiBiZSByZWNlaXZlZCB3aXRob3V0IGJsb2NraW5nLgotICBzdGQ6OnNpemVfdCByZWNlaXZlKGltcGxlbWVudGF0aW9uX3R5cGUmLCBjb25zdCBudWxsX2J1ZmZlcnMmLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZS4gVGhlIGJ1ZmZlciBmb3IgdGhlIGRhdGEgYmVpbmcgcmVjZWl2ZWQKLSAgLy8gbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3JlY2VpdmUoaW1wbGVtZW50YXRpb25fdHlwZSYsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgY29uc3Qgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOwotICAgIGlvX3NlcnZpY2VfLnBvc3QoZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlciwgZWMsIGJ5dGVzX3RyYW5zZmVycmVkKSk7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIGRhdGEgY2FuIGJlIHJlY2VpdmVkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3JlY2VpdmUoaW1wbGVtZW50YXRpb25fdHlwZSYsIGNvbnN0IG51bGxfYnVmZmVycyYsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgY29uc3Qgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOwotICAgIGlvX3NlcnZpY2VfLnBvc3QoZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlciwgZWMsIGJ5dGVzX3RyYW5zZmVycmVkKSk7Ci0gIH0KLQotICAvLyBSZWNlaXZlIHNvbWUgZGF0YSB3aXRoIGFzc29jaWF0ZWQgZmxhZ3MuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcwotICAvLyByZWNlaXZlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVjZWl2ZV93aXRoX2ZsYWdzKGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyYsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIGRhdGEgY2FuIGJlIHJlY2VpdmVkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHN0ZDo6c2l6ZV90IHJlY2VpdmVfd2l0aF9mbGFncyhpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIGNvbnN0IG51bGxfYnVmZmVycyYsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MmLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUuIFRoZSBidWZmZXIgZm9yIHRoZSBkYXRhIGJlaW5nIHJlY2VpdmVkCi0gIC8vIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19yZWNlaXZlX3dpdGhfZmxhZ3MoaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiwgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgY29uc3Qgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOwotICAgIGlvX3NlcnZpY2VfLnBvc3QoZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlciwgZWMsIGJ5dGVzX3RyYW5zZmVycmVkKSk7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIGRhdGEgY2FuIGJlIHJlY2VpdmVkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3JlY2VpdmVfd2l0aF9mbGFncyhpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIGNvbnN0IG51bGxfYnVmZmVycyYsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MmLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICBjb25zdCBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gICAgaW9fc2VydmljZV8ucG9zdChkZXRhaWw6OmJpbmRfaGFuZGxlcihoYW5kbGVyLCBlYywgYnl0ZXNfdHJhbnNmZXJyZWQpKTsKLSAgfQotCi0gIC8vIFNlbmQgYSBkYXRhZ3JhbSB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgLy8gc2VudC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHNlbmRfdG8oaW1wbGVtZW50YXRpb25fdHlwZSYsIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgZGF0YSBjYW4gYmUgc2VudCB3aXRob3V0IGJsb2NraW5nLgotICBzdGQ6OnNpemVfdCBzZW5kX3RvKGltcGxlbWVudGF0aW9uX3R5cGUmLCBjb25zdCBudWxsX2J1ZmZlcnMmLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBzZW5kLiBUaGUgZGF0YSBiZWluZyBzZW50IG11c3QgYmUgdmFsaWQgZm9yIHRoZQotICAvLyBsaWZldGltZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfc2VuZF90byhpbXBsZW1lbnRhdGlvbl90eXBlJiwgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsCi0gICAgICBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICBjb25zdCBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gICAgaW9fc2VydmljZV8ucG9zdChkZXRhaWw6OmJpbmRfaGFuZGxlcihoYW5kbGVyLCBlYywgYnl0ZXNfdHJhbnNmZXJyZWQpKTsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3YWl0IHVudGlsIGRhdGEgY2FuIGJlIHNlbnQgd2l0aG91dCBibG9ja2luZy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfc2VuZF90byhpbXBsZW1lbnRhdGlvbl90eXBlJiwgY29uc3QgbnVsbF9idWZmZXJzJiwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgY29uc3Qgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOwotICAgIGlvX3NlcnZpY2VfLnBvc3QoZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlciwgZWMsIGJ5dGVzX3RyYW5zZmVycmVkKSk7Ci0gIH0KLQotICAvLyBSZWNlaXZlIGEgZGF0YWdyYW0gd2l0aCB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbmRlci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gIC8vIGJ5dGVzIHJlY2VpdmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWNlaXZlX2Zyb20oaW1wbGVtZW50YXRpb25fdHlwZSYsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYsCi0gICAgICBlbmRwb2ludF90eXBlJiwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCBkYXRhIGNhbiBiZSByZWNlaXZlZCB3aXRob3V0IGJsb2NraW5nLgotICBzdGQ6OnNpemVfdCByZWNlaXZlX2Zyb20oaW1wbGVtZW50YXRpb25fdHlwZSYsIGNvbnN0IG51bGxfYnVmZmVycyYsCi0gICAgICBlbmRwb2ludF90eXBlJiwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUuIFRoZSBidWZmZXIgZm9yIHRoZSBkYXRhIGJlaW5nIHJlY2VpdmVkIGFuZAotICAvLyB0aGUgc2VuZGVyX2VuZHBvaW50IG9iamVjdCBtdXN0IGJvdGggYmUgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUKLSAgLy8gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19yZWNlaXZlX2Zyb20oaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmLCBlbmRwb2ludF90eXBlJiwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICBjb25zdCBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gICAgaW9fc2VydmljZV8ucG9zdChkZXRhaWw6OmJpbmRfaGFuZGxlcihoYW5kbGVyLCBlYywgYnl0ZXNfdHJhbnNmZXJyZWQpKTsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgZGF0YSBjYW4gYmUgcmVjZWl2ZWQgd2l0aG91dCBibG9ja2luZy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVjZWl2ZV9mcm9tKGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgY29uc3QgbnVsbF9idWZmZXJzJiwgZW5kcG9pbnRfdHlwZSYsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgY29uc3Qgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOwotICAgIGlvX3NlcnZpY2VfLnBvc3QoZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlciwgZWMsIGJ5dGVzX3RyYW5zZmVycmVkKSk7Ci0gIH0KLQotICAvLyBBY2NlcHQgYSBuZXcgY29ubmVjdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvY2tldD4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhY2NlcHQoaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBTb2NrZXQmLCBlbmRwb2ludF90eXBlKiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgYWNjZXB0LiBUaGUgcGVlciBhbmQgcGVlcl9lbmRwb2ludCBvYmplY3RzCi0gIC8vIG11c3QgYmUgdmFsaWQgdW50aWwgdGhlIGFjY2VwdCdzIGhhbmRsZXIgaXMgaW52b2tlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvY2tldCwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19hY2NlcHQoaW1wbGVtZW50YXRpb25fdHlwZSYsIFNvY2tldCYsCi0gICAgICBlbmRwb2ludF90eXBlKiwgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgaW9fc2VydmljZV8ucG9zdChkZXRhaWw6OmJpbmRfaGFuZGxlcihoYW5kbGVyLCBlYykpOwotICB9Ci0KLSAgLy8gQ29ubmVjdCB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gIGFzaW86OmVycm9yX2NvZGUgY29ubmVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBjb25uZWN0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19jb25uZWN0KGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIGlvX3NlcnZpY2VfLnBvc3QoZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlciwgZWMpKTsKLSAgfQotCi1wcml2YXRlOgotICBhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX05VTExfU09DS0VUX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL251bGxfc3RhdGljX211dGV4LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF9zdGF0aWNfbXV0ZXguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjRkZmVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF9zdGF0aWNfbXV0ZXguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9udWxsX3N0YXRpY19tdXRleC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfTlVMTF9TVEFUSUNfTVVURVhfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX05VTExfU1RBVElDX01VVEVYX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfVEhSRUFEUykKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Njb3BlZF9sb2NrLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1zdHJ1Y3QgbnVsbF9zdGF0aWNfbXV0ZXgKLXsKLSAgdHlwZWRlZiBhc2lvOjpkZXRhaWw6OnNjb3BlZF9sb2NrPG51bGxfc3RhdGljX211dGV4PiBzY29wZWRfbG9jazsKLQotICAvLyBJbml0aWFsaXNlIHRoZSBtdXRleC4KLSAgdm9pZCBpbml0KCkKLSAgewotICB9Ci0KLSAgLy8gTG9jayB0aGUgbXV0ZXguCi0gIHZvaWQgbG9jaygpCi0gIHsKLSAgfQotCi0gIC8vIFVubG9jayB0aGUgbXV0ZXguCi0gIHZvaWQgdW5sb2NrKCkKLSAgewotICB9Ci0KLSAgaW50IHVudXNlZF87Ci19OwotCi0jZGVmaW5lIEFTSU9fTlVMTF9TVEFUSUNfTVVURVhfSU5JVCB7IDAgfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9OVUxMX1NUQVRJQ19NVVRFWF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF90aHJlYWQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9udWxsX3RocmVhZC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YTkzMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9udWxsX3RocmVhZC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLwotLy8gZGV0YWlsL251bGxfdGhyZWFkLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9OVUxMX1RIUkVBRF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfTlVMTF9USFJFQURfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBudWxsX3RocmVhZAotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgbnVsbF90aHJlYWQoRnVuY3Rpb24sIHVuc2lnbmVkIGludCA9IDApCi0gIHsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKAotICAgICAgICBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQsICJ0aHJlYWQiKTsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IuCi0gIH5udWxsX3RocmVhZCgpCi0gIHsKLSAgfQotCi0gIC8vIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZXhpdC4KLSAgdm9pZCBqb2luKCkKLSAgewotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9OVUxMX1RIUkVBRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF90c3NfcHRyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvbnVsbF90c3NfcHRyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhMWM5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL251bGxfdHNzX3B0ci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLwotLy8gZGV0YWlsL251bGxfdHNzX3B0ci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX05VTExfVFNTX1BUUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfTlVMTF9UU1NfUFRSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfVEhSRUFEUykKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIG51bGxfdHNzX3B0cgotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIG51bGxfdHNzX3B0cigpCi0gICAgOiB2YWx1ZV8oMCkKLSAgewotICB9Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgfm51bGxfdHNzX3B0cigpCi0gIHsKLSAgfQotCi0gIC8vIEdldCB0aGUgdmFsdWUuCi0gIG9wZXJhdG9yIFQqKCkgY29uc3QKLSAgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotICAvLyBTZXQgdGhlIHZhbHVlLgotICB2b2lkIG9wZXJhdG9yPShUKiB2YWx1ZSkKLSAgewotICAgIHZhbHVlXyA9IHZhbHVlOwotICB9Ci0KLXByaXZhdGU6Ci0gIFQqIHZhbHVlXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19IQVNfVEhSRUFEUykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX05VTExfVFNTX1BUUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvb2JqZWN0X3Bvb2wuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9vYmplY3RfcG9vbC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZTIyZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9vYmplY3RfcG9vbC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9vYmplY3RfcG9vbC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfT0JKRUNUX1BPT0xfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX09CSkVDVF9QT09MX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE9iamVjdD4KLWNsYXNzIG9iamVjdF9wb29sOwotCi1jbGFzcyBvYmplY3RfcG9vbF9hY2Nlc3MKLXsKLXB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE9iamVjdD4KLSAgc3RhdGljIE9iamVjdCogY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgT2JqZWN0OwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE9iamVjdD4KLSAgc3RhdGljIHZvaWQgZGVzdHJveShPYmplY3QqIG8pCi0gIHsKLSAgICBkZWxldGUgbzsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBPYmplY3Q+Ci0gIHN0YXRpYyBPYmplY3QqJiBuZXh0KE9iamVjdCogbykKLSAgewotICAgIHJldHVybiBvLT5uZXh0XzsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBPYmplY3Q+Ci0gIHN0YXRpYyBPYmplY3QqJiBwcmV2KE9iamVjdCogbykKLSAgewotICAgIHJldHVybiBvLT5wcmV2XzsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE9iamVjdD4KLWNsYXNzIG9iamVjdF9wb29sCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgb2JqZWN0X3Bvb2woKQotICAgIDogbGl2ZV9saXN0XygwKSwKLSAgICAgIGZyZWVfbGlzdF8oMCkKLSAgewotICB9Ci0KLSAgLy8gRGVzdHJ1Y3RvciBkZXN0cm95cyBhbGwgb2JqZWN0cy4KLSAgfm9iamVjdF9wb29sKCkKLSAgewotICAgIGRlc3Ryb3lfbGlzdChsaXZlX2xpc3RfKTsKLSAgICBkZXN0cm95X2xpc3QoZnJlZV9saXN0Xyk7Ci0gIH0KLQotICAvLyBHZXQgdGhlIG9iamVjdCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpdmUgbGlzdC4KLSAgT2JqZWN0KiBmaXJzdCgpCi0gIHsKLSAgICByZXR1cm4gbGl2ZV9saXN0XzsKLSAgfQotCi0gIC8vIEFsbG9jYXRlIGEgbmV3IG9iamVjdC4KLSAgT2JqZWN0KiBhbGxvYygpCi0gIHsKLSAgICBPYmplY3QqIG8gPSBmcmVlX2xpc3RfOwotICAgIGlmIChvKQotICAgICAgZnJlZV9saXN0XyA9IG9iamVjdF9wb29sX2FjY2Vzczo6bmV4dChmcmVlX2xpc3RfKTsKLSAgICBlbHNlCi0gICAgICBvID0gb2JqZWN0X3Bvb2xfYWNjZXNzOjpjcmVhdGU8T2JqZWN0PigpOwotCi0gICAgb2JqZWN0X3Bvb2xfYWNjZXNzOjpuZXh0KG8pID0gbGl2ZV9saXN0XzsKLSAgICBvYmplY3RfcG9vbF9hY2Nlc3M6OnByZXYobykgPSAwOwotICAgIGlmIChsaXZlX2xpc3RfKQotICAgICAgb2JqZWN0X3Bvb2xfYWNjZXNzOjpwcmV2KGxpdmVfbGlzdF8pID0gbzsKLSAgICBsaXZlX2xpc3RfID0gbzsKLQotICAgIHJldHVybiBvOwotICB9Ci0KLSAgLy8gRnJlZSBhbiBvYmplY3QuIE1vdmVzIGl0IHRvIHRoZSBmcmVlIGxpc3QuIE5vIGRlc3RydWN0b3JzIGFyZSBydW4uCi0gIHZvaWQgZnJlZShPYmplY3QqIG8pCi0gIHsKLSAgICBpZiAobGl2ZV9saXN0XyA9PSBvKQotICAgICAgbGl2ZV9saXN0XyA9IG9iamVjdF9wb29sX2FjY2Vzczo6bmV4dChvKTsKLQotICAgIGlmIChvYmplY3RfcG9vbF9hY2Nlc3M6OnByZXYobykpCi0gICAgewotICAgICAgb2JqZWN0X3Bvb2xfYWNjZXNzOjpuZXh0KG9iamVjdF9wb29sX2FjY2Vzczo6cHJldihvKSkKLSAgICAgICAgPSBvYmplY3RfcG9vbF9hY2Nlc3M6Om5leHQobyk7Ci0gICAgfQotCi0gICAgaWYgKG9iamVjdF9wb29sX2FjY2Vzczo6bmV4dChvKSkKLSAgICB7Ci0gICAgICBvYmplY3RfcG9vbF9hY2Nlc3M6OnByZXYob2JqZWN0X3Bvb2xfYWNjZXNzOjpuZXh0KG8pKQotICAgICAgICA9IG9iamVjdF9wb29sX2FjY2Vzczo6cHJldihvKTsKLSAgICB9Ci0KLSAgICBvYmplY3RfcG9vbF9hY2Nlc3M6Om5leHQobykgPSBmcmVlX2xpc3RfOwotICAgIG9iamVjdF9wb29sX2FjY2Vzczo6cHJldihvKSA9IDA7Ci0gICAgZnJlZV9saXN0XyA9IG87Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGRlc3Ryb3kgYWxsIGVsZW1lbnRzIGluIGEgbGlzdC4KLSAgdm9pZCBkZXN0cm95X2xpc3QoT2JqZWN0KiBsaXN0KQotICB7Ci0gICAgd2hpbGUgKGxpc3QpCi0gICAgewotICAgICAgT2JqZWN0KiBvID0gbGlzdDsKLSAgICAgIGxpc3QgPSBvYmplY3RfcG9vbF9hY2Nlc3M6Om5leHQobyk7Ci0gICAgICBvYmplY3RfcG9vbF9hY2Nlc3M6OmRlc3Ryb3kobyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVGhlIGxpc3Qgb2YgbGl2ZSBvYmplY3RzLgotICBPYmplY3QqIGxpdmVfbGlzdF87Ci0KLSAgLy8gVGhlIGZyZWUgbGlzdC4KLSAgT2JqZWN0KiBmcmVlX2xpc3RfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9PQkpFQ1RfUE9PTF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvb2xkX3dpbl9zZGtfY29tcGF0LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvb2xkX3dpbl9zZGtfY29tcGF0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2ODE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL29sZF93aW5fc2RrX2NvbXBhdC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9vbGRfd2luX3Nka19jb21wYXQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9PTERfV0lOX1NES19DT01QQVRfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX09MRF9XSU5fU0RLX0NPTVBBVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLS8vIEd1ZXNzIHdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIGFnYWluc3Qgb24gb2xkIFBsYXRmb3JtIFNESy4KLSNpZiAhZGVmaW5lZChJTjZBRERSX0FOWV9JTklUKQotI2RlZmluZSBBU0lPX0hBU19PTERfV0lOX1NESyAxCi0jZW5kaWYgLy8gIWRlZmluZWQoSU42QUREUl9BTllfSU5JVCkKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfT0xEX1dJTl9TREspCi0KLS8vIEVtdWxhdGlvbiBvZiB0eXBlcyB0aGF0IGFyZSBtaXNzaW5nIGZyb20gb2xkIFBsYXRmb3JtIFNES3MuCi0vLwotLy8gTi5CLiB0aGlzIGVtdWxhdGlvbiBpcyBhbHNvIHVzZWQgaWYgYnVpbGRpbmcgZm9yIGEgV2luZG93cyAyMDAwIHRhcmdldCB3aXRoCi0vLyBhIHJlY2VudCAoaS5lLiBWaXN0YSBvciBsYXRlcikgU0RLLCBhcyB0aGUgU0RLIGRvZXMgbm90IHByb3ZpZGUgSVB2NiBzdXBwb3J0Ci0vLyBpbiB0aGF0IGNhc2UuCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotZW51bQotewotICBzb2NrYWRkcl9zdG9yYWdlX21heHNpemUgPSAxMjgsIC8vIE1heGltdW0gc2l6ZS4KLSAgc29ja2FkZHJfc3RvcmFnZV9hbGlnbnNpemUgPSAoc2l6ZW9mKF9faW50NjQpKSwgLy8gRGVzaXJlZCBhbGlnbm1lbnQuCi0gIHNvY2thZGRyX3N0b3JhZ2VfcGFkMXNpemUgPSAoc29ja2FkZHJfc3RvcmFnZV9hbGlnbnNpemUgLSBzaXplb2Yoc2hvcnQpKSwKLSAgc29ja2FkZHJfc3RvcmFnZV9wYWQyc2l6ZSA9IChzb2NrYWRkcl9zdG9yYWdlX21heHNpemUgLQotICAgICAgKHNpemVvZihzaG9ydCkgKyBzb2NrYWRkcl9zdG9yYWdlX3BhZDFzaXplICsgc29ja2FkZHJfc3RvcmFnZV9hbGlnbnNpemUpKQotfTsKLQotc3RydWN0IHNvY2thZGRyX3N0b3JhZ2VfZW11bGF0aW9uCi17Ci0gIHNob3J0IHNzX2ZhbWlseTsKLSAgY2hhciBfX3NzX3BhZDFbc29ja2FkZHJfc3RvcmFnZV9wYWQxc2l6ZV07Ci0gIF9faW50NjQgX19zc19hbGlnbjsKLSAgY2hhciBfX3NzX3BhZDJbc29ja2FkZHJfc3RvcmFnZV9wYWQyc2l6ZV07Ci19OwotCi1zdHJ1Y3QgaW42X2FkZHJfZW11bGF0aW9uCi17Ci0gIHVuaW9uCi0gIHsKLSAgICB1X2NoYXIgQnl0ZVsxNl07Ci0gICAgdV9zaG9ydCBXb3JkWzhdOwotICB9IHU7Ci19OwotCi0jaWYgIWRlZmluZWQoczZfYWRkcikKLSMgZGVmaW5lIF9TNl91biB1Ci0jIGRlZmluZSBfUzZfdTggQnl0ZQotIyBkZWZpbmUgczZfYWRkciBfUzZfdW4uX1M2X3U4Ci0jZW5kaWYgLy8gIWRlZmluZWQoczZfYWRkcikKLQotc3RydWN0IHNvY2thZGRyX2luNl9lbXVsYXRpb24KLXsKLSAgc2hvcnQgc2luNl9mYW1pbHk7Ci0gIHVfc2hvcnQgc2luNl9wb3J0OwotICB1X2xvbmcgc2luNl9mbG93aW5mbzsKLSAgaW42X2FkZHJfZW11bGF0aW9uIHNpbjZfYWRkcjsKLSAgdV9sb25nIHNpbjZfc2NvcGVfaWQ7Ci19OwotCi1zdHJ1Y3QgaXB2Nl9tcmVxX2VtdWxhdGlvbgotewotICBpbjZfYWRkcl9lbXVsYXRpb24gaXB2Nm1yX211bHRpYWRkcjsKLSAgdW5zaWduZWQgaW50IGlwdjZtcl9pbnRlcmZhY2U7Ci19OwotCi1zdHJ1Y3QgYWRkcmluZm9fZW11bGF0aW9uCi17Ci0gIGludCBhaV9mbGFnczsKLSAgaW50IGFpX2ZhbWlseTsKLSAgaW50IGFpX3NvY2t0eXBlOwotICBpbnQgYWlfcHJvdG9jb2w7Ci0gIHNpemVfdCBhaV9hZGRybGVuOwotICBjaGFyKiBhaV9jYW5vbm5hbWU7Ci0gIHNvY2thZGRyKiBhaV9hZGRyOwotICBhZGRyaW5mb19lbXVsYXRpb24qIGFpX25leHQ7Ci19OwotCi0jaWYgIWRlZmluZWQoQUlfUEFTU0lWRSkKLSMgZGVmaW5lIEFJX1BBU1NJVkUgMHgxCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEFJX0NBTk9OTkFNRSkKLSMgZGVmaW5lIEFJX0NBTk9OTkFNRSAweDIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoQUlfTlVNRVJJQ0hPU1QpCi0jIGRlZmluZSBBSV9OVU1FUklDSE9TVCAweDQKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoRUFJX0FHQUlOKQotIyBkZWZpbmUgRUFJX0FHQUlOIFdTQVRSWV9BR0FJTgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChFQUlfQkFERkxBR1MpCi0jIGRlZmluZSBFQUlfQkFERkxBR1MgV1NBRUlOVkFMCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEVBSV9GQUlMKQotIyBkZWZpbmUgRUFJX0ZBSUwgV1NBTk9fUkVDT1ZFUlkKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoRUFJX0ZBTUlMWSkKLSMgZGVmaW5lIEVBSV9GQU1JTFkgV1NBRUFGTk9TVVBQT1JUCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEVBSV9NRU1PUlkpCi0jIGRlZmluZSBFQUlfTUVNT1JZIFdTQV9OT1RfRU5PVUdIX01FTU9SWQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChFQUlfTk9EQVRBKQotIyBkZWZpbmUgRUFJX05PREFUQSBXU0FOT19EQVRBCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEVBSV9OT05BTUUpCi0jIGRlZmluZSBFQUlfTk9OQU1FIFdTQUhPU1RfTk9UX0ZPVU5ECi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEVBSV9TRVJWSUNFKQotIyBkZWZpbmUgRUFJX1NFUlZJQ0UgV1NBVFlQRV9OT1RfRk9VTkQKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoRUFJX1NPQ0tUWVBFKQotIyBkZWZpbmUgRUFJX1NPQ0tUWVBFIFdTQUVTT0NLVE5PU1VQUE9SVAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChOSV9OT0ZRRE4pCi0jIGRlZmluZSBOSV9OT0ZRRE4gMHgwMQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChOSV9OVU1FUklDSE9TVCkKLSMgZGVmaW5lIE5JX05VTUVSSUNIT1NUIDB4MDIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoTklfTkFNRVJFUUQpCi0jIGRlZmluZSBOSV9OQU1FUkVRRCAweDA0Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKE5JX05VTUVSSUNTRVJWKQotIyBkZWZpbmUgTklfTlVNRVJJQ1NFUlYgMHgwOAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChOSV9ER1JBTSkKLSMgZGVmaW5lIE5JX0RHUkFNIDB4MTAKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSVBQUk9UT19JUFY2KQotIyBkZWZpbmUgSVBQUk9UT19JUFY2IDQxCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKElQVjZfVU5JQ0FTVF9IT1BTKQotIyBkZWZpbmUgSVBWNl9VTklDQVNUX0hPUFMgNAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChJUFY2X01VTFRJQ0FTVF9JRikKLSMgZGVmaW5lIElQVjZfTVVMVElDQVNUX0lGIDkKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSVBWNl9NVUxUSUNBU1RfSE9QUykKLSMgZGVmaW5lIElQVjZfTVVMVElDQVNUX0hPUFMgMTAKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSVBWNl9NVUxUSUNBU1RfTE9PUCkKLSMgZGVmaW5lIElQVjZfTVVMVElDQVNUX0xPT1AgMTEKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoSVBWNl9KT0lOX0dST1VQKQotIyBkZWZpbmUgSVBWNl9KT0lOX0dST1VQIDEyCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKElQVjZfTEVBVkVfR1JPVVApCi0jIGRlZmluZSBJUFY2X0xFQVZFX0dST1VQIDEzCi0jZW5kaWYKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX09MRF9XSU5fU0RLKQotCi0vLyBFdmVuIG5ld2VyIFBsYXRmb3JtIFNES3MgdGhhdCBzdXBwb3J0IElQdjYgbWF5IG5vdCBkZWZpbmUgSVBWNl9WNk9OTFkuCi0jaWYgIWRlZmluZWQoSVBWNl9WNk9OTFkpCi0jIGRlZmluZSBJUFY2X1Y2T05MWSAyNwotI2VuZGlmCi0KLS8vIFNvbWUgU0RLcyAoZS5nLiBXaW5kb3dzIENFKSBkb24ndCBkZWZpbmUgSVBQUk9UT19JQ01QVjYuCi0jaWYgIWRlZmluZWQoSVBQUk9UT19JQ01QVjYpCi0jIGRlZmluZSBJUFBST1RPX0lDTVBWNiA1OAotI2VuZGlmCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfT0xEX1dJTl9TREtfQ09NUEFUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9vcF9xdWV1ZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL29wX3F1ZXVlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwNzZiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL29wX3F1ZXVlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLwotLy8gZGV0YWlsL29wX3F1ZXVlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9PUF9RVUVVRV9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfT1BfUVVFVUVfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgT3BlcmF0aW9uPgotY2xhc3Mgb3BfcXVldWU7Ci0KLWNsYXNzIG9wX3F1ZXVlX2FjY2VzcwotewotcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BlcmF0aW9uPgotICBzdGF0aWMgT3BlcmF0aW9uKiBuZXh0KE9wZXJhdGlvbiogbykKLSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxPcGVyYXRpb24qPihvLT5uZXh0Xyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BlcmF0aW9uMSwgdHlwZW5hbWUgT3BlcmF0aW9uMj4KLSAgc3RhdGljIHZvaWQgbmV4dChPcGVyYXRpb24xKiYgbzEsIE9wZXJhdGlvbjIqIG8yKQotICB7Ci0gICAgbzEtPm5leHRfID0gbzI7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BlcmF0aW9uPgotICBzdGF0aWMgdm9pZCBkZXN0cm95KE9wZXJhdGlvbiogbykKLSAgewotICAgIG8tPmRlc3Ryb3koKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBPcGVyYXRpb24+Ci0gIHN0YXRpYyBPcGVyYXRpb24qJiBmcm9udChvcF9xdWV1ZTxPcGVyYXRpb24+JiBxKQotICB7Ci0gICAgcmV0dXJuIHEuZnJvbnRfOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wZXJhdGlvbj4KLSAgc3RhdGljIE9wZXJhdGlvbiomIGJhY2sob3BfcXVldWU8T3BlcmF0aW9uPiYgcSkKLSAgewotICAgIHJldHVybiBxLmJhY2tfOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgT3BlcmF0aW9uPgotY2xhc3Mgb3BfcXVldWUKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBvcF9xdWV1ZSgpCi0gICAgOiBmcm9udF8oMCksCi0gICAgICBiYWNrXygwKQotICB7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yIGRlc3Ryb3lzIGFsbCBvcGVyYXRpb25zLgotICB+b3BfcXVldWUoKQotICB7Ci0gICAgd2hpbGUgKE9wZXJhdGlvbiogb3AgPSBmcm9udF8pCi0gICAgewotICAgICAgcG9wKCk7Ci0gICAgICBvcF9xdWV1ZV9hY2Nlc3M6OmRlc3Ryb3kob3ApOwotICAgIH0KLSAgfQotCi0gIC8vIEdldCB0aGUgb3BlcmF0aW9uIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUuCi0gIE9wZXJhdGlvbiogZnJvbnQoKQotICB7Ci0gICAgcmV0dXJuIGZyb250XzsKLSAgfQotCi0gIC8vIFBvcCBhbiBvcGVyYXRpb24gZnJvbSB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLgotICB2b2lkIHBvcCgpCi0gIHsKLSAgICBpZiAoZnJvbnRfKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiogdG1wID0gZnJvbnRfOwotICAgICAgZnJvbnRfID0gb3BfcXVldWVfYWNjZXNzOjpuZXh0KGZyb250Xyk7Ci0gICAgICBpZiAoZnJvbnRfID09IDApCi0gICAgICAgIGJhY2tfID0gMDsKLSAgICAgIG9wX3F1ZXVlX2FjY2Vzczo6bmV4dCh0bXAsIHN0YXRpY19jYXN0PE9wZXJhdGlvbio+KDApKTsKLSAgICB9Ci0gIH0KLQotICAvLyBQdXNoIGFuIG9wZXJhdGlvbiBvbiB0byB0aGUgYmFjayBvZiB0aGUgcXVldWUuCi0gIHZvaWQgcHVzaChPcGVyYXRpb24qIGgpCi0gIHsKLSAgICBvcF9xdWV1ZV9hY2Nlc3M6Om5leHQoaCwgc3RhdGljX2Nhc3Q8T3BlcmF0aW9uKj4oMCkpOwotICAgIGlmIChiYWNrXykKLSAgICB7Ci0gICAgICBvcF9xdWV1ZV9hY2Nlc3M6Om5leHQoYmFja18sIGgpOwotICAgICAgYmFja18gPSBoOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZnJvbnRfID0gYmFja18gPSBoOwotICAgIH0KLSAgfQotCi0gIC8vIFB1c2ggYWxsIG9wZXJhdGlvbnMgZnJvbSBhbm90aGVyIHF1ZXVlIG9uIHRvIHRoZSBiYWNrIG9mIHRoZSBxdWV1ZS4gVGhlCi0gIC8vIHNvdXJjZSBxdWV1ZSBtYXkgY29udGFpbiBvcGVyYXRpb25zIG9mIGEgZGVyaXZlZCB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJPcGVyYXRpb24+Ci0gIHZvaWQgcHVzaChvcF9xdWV1ZTxPdGhlck9wZXJhdGlvbj4mIHEpCi0gIHsKLSAgICBpZiAoT3BlcmF0aW9uKiBvdGhlcl9mcm9udCA9IG9wX3F1ZXVlX2FjY2Vzczo6ZnJvbnQocSkpCi0gICAgewotICAgICAgaWYgKGJhY2tfKQotICAgICAgICBvcF9xdWV1ZV9hY2Nlc3M6Om5leHQoYmFja18sIG90aGVyX2Zyb250KTsKLSAgICAgIGVsc2UKLSAgICAgICAgZnJvbnRfID0gb3RoZXJfZnJvbnQ7Ci0gICAgICBiYWNrXyA9IG9wX3F1ZXVlX2FjY2Vzczo6YmFjayhxKTsKLSAgICAgIG9wX3F1ZXVlX2FjY2Vzczo6ZnJvbnQocSkgPSAwOwotICAgICAgb3BfcXVldWVfYWNjZXNzOjpiYWNrKHEpID0gMDsKLSAgICB9Ci0gIH0KLQotICAvLyBXaGV0aGVyIHRoZSBxdWV1ZSBpcyBlbXB0eS4KLSAgYm9vbCBlbXB0eSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gZnJvbnRfID09IDA7Ci0gIH0KLQotcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIG9wX3F1ZXVlX2FjY2VzczsKLQotICAvLyBUaGUgZnJvbnQgb2YgdGhlIHF1ZXVlLgotICBPcGVyYXRpb24qIGZyb250XzsKLQotICAvLyBUaGUgYmFjayBvZiB0aGUgcXVldWUuCi0gIE9wZXJhdGlvbiogYmFja187Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX09QX1FVRVVFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzdlYzE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvb3BlcmF0aW9uLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvb3BlcmF0aW9uLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfT1BFUkFUSU9OX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9PUEVSQVRJT05fSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX29wZXJhdGlvbi5ocHAiCi0jZWxzZQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC90YXNrX2lvX3NlcnZpY2Vfb3BlcmF0aW9uLmhwcCIKLSNlbmRpZgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLXR5cGVkZWYgd2luX2lvY3Bfb3BlcmF0aW9uIG9wZXJhdGlvbjsKLSNlbHNlCi10eXBlZGVmIHRhc2tfaW9fc2VydmljZV9vcGVyYXRpb24gb3BlcmF0aW9uOwotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfT1BFUkFUSU9OX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9waXBlX3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3BpcGVfc2VsZWN0X2ludGVycnVwdGVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlMjExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3BpcGVfc2VsZWN0X2ludGVycnVwdGVyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvcGlwZV9zZWxlY3RfaW50ZXJydXB0ZXIuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1BJUEVfU0VMRUNUX0lOVEVSUlVQVEVSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9QSVBFX1NFTEVDVF9JTlRFUlJVUFRFUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKQotI2lmICFkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfRVZFTlRGRCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBwaXBlX3NlbGVjdF9pbnRlcnJ1cHRlcgotewotcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIHBpcGVfc2VsZWN0X2ludGVycnVwdGVyKCk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIH5waXBlX3NlbGVjdF9pbnRlcnJ1cHRlcigpOwotCi0gIC8vIFJlY3JlYXRlIHRoZSBpbnRlcnJ1cHRlcidzIGRlc2NyaXB0b3JzLiBVc2VkIGFmdGVyIGEgZm9yay4KLSAgQVNJT19ERUNMIHZvaWQgcmVjcmVhdGUoKTsKLQotICAvLyBJbnRlcnJ1cHQgdGhlIHNlbGVjdCBjYWxsLgotICBBU0lPX0RFQ0wgdm9pZCBpbnRlcnJ1cHQoKTsKLQotICAvLyBSZXNldCB0aGUgc2VsZWN0IGludGVycnVwdC4gUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIHdhcyBpbnRlcnJ1cHRlZC4KLSAgQVNJT19ERUNMIGJvb2wgcmVzZXQoKTsKLQotICAvLyBHZXQgdGhlIHJlYWQgZGVzY3JpcHRvciB0byBiZSBwYXNzZWQgdG8gc2VsZWN0LgotICBpbnQgcmVhZF9kZXNjcmlwdG9yKCkgY29uc3QKLSAgewotICAgIHJldHVybiByZWFkX2Rlc2NyaXB0b3JfOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIE9wZW4gdGhlIGRlc2NyaXB0b3JzLiBUaHJvd3Mgb24gZXJyb3IuCi0gIEFTSU9fREVDTCB2b2lkIG9wZW5fZGVzY3JpcHRvcnMoKTsKLQotICAvLyBDbG9zZSB0aGUgZGVzY3JpcHRvcnMuCi0gIEFTSU9fREVDTCB2b2lkIGNsb3NlX2Rlc2NyaXB0b3JzKCk7Ci0KLSAgLy8gVGhlIHJlYWQgZW5kIG9mIGEgY29ubmVjdGlvbiB1c2VkIHRvIGludGVycnVwdCB0aGUgc2VsZWN0IGNhbGwuIFRoaXMgZmlsZQotICAvLyBkZXNjcmlwdG9yIGlzIHBhc3NlZCB0byBzZWxlY3Qgc3VjaCB0aGF0IHdoZW4gaXQgaXMgdGltZSB0byBzdG9wLCBhIHNpbmdsZQotICAvLyBieXRlIHdpbGwgYmUgd3JpdHRlbiBvbiB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uIGFuZCB0aGlzCi0gIC8vIGRlc2NyaXB0b3Igd2lsbCBiZWNvbWUgcmVhZGFibGUuCi0gIGludCByZWFkX2Rlc2NyaXB0b3JfOwotCi0gIC8vIFRoZSB3cml0ZSBlbmQgb2YgYSBjb25uZWN0aW9uIHVzZWQgdG8gaW50ZXJydXB0IHRoZSBzZWxlY3QgY2FsbC4gQSBzaW5nbGUKLSAgLy8gYnl0ZSBtYXkgYmUgd3JpdHRlbiB0byB0aGlzIHRvIHdha2UgdXAgdGhlIHNlbGVjdCB3aGljaCBpcyB3YWl0aW5nIGZvciB0aGUKLSAgLy8gb3RoZXIgZW5kIHRvIGJlY29tZSByZWFkYWJsZS4KLSAgaW50IHdyaXRlX2Rlc2NyaXB0b3JfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvcGlwZV9zZWxlY3RfaW50ZXJydXB0ZXIuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX0VWRU5URkQpCi0jZW5kaWYgLy8gIWRlZmluZWQoX19TWU1CSUFOMzJfXykKLSNlbmRpZiAvLyAhZGVmaW5lZChfX0NZR1dJTl9fKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1BJUEVfU0VMRUNUX0lOVEVSUlVQVEVSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxYzFhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3BvcF9vcHRpb25zLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotLy8gTm8gaGVhZGVyIGd1YXJkCi0KLSNpZiBkZWZpbmVkKF9fQ09NT19fKQotCi0vLyBDb21lYXUgQysrCi0KLSNlbGlmIGRlZmluZWQoX19ETUNfXykKLQotLy8gRGlnaXRhbCBNYXJzIEMrKwotCi0jZWxpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpIHx8IGRlZmluZWQoX19JQ0wpIFwKLSAgfHwgZGVmaW5lZChfX0lDQykgfHwgZGVmaW5lZChfX0VDQykKLQotLy8gSW50ZWwgQysrCi0KLSMgaWYgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMSkgfHwgKF9fR05VQ19fID4gNCkKLSMgIHByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKLSMgZW5kaWYgLy8gKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMSkgfHwgKF9fR05VQ19fID4gNCkKLQotI2VsaWYgZGVmaW5lZChfX2NsYW5nX18pCi0KLS8vIENsYW5nCi0KLSMgaWYgZGVmaW5lZChfX09CSkNfXykKLSMgIGlmICFkZWZpbmVkKF9fQVBQTEVfQ0NfXykgfHwgKF9fQVBQTEVfQ0NfXyA8PSAxKQotIyAgIGlmIGRlZmluZWQoQVNJT19PQkpDX1dPUktBUk9VTkQpCi0jICAgIHVuZGVmIFByb3RvY29sCi0jICAgIHVuZGVmIGlkCi0jICAgIHVuZGVmIEFTSU9fT0JKQ19XT1JLQVJPVU5ECi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0KLSMgaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKFdJTjMyKQotIyAgcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAotIyBlbmRpZiAvLyAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoV0lOMzIpCi0KLSNlbGlmIGRlZmluZWQoX19HTlVDX18pCi0KLS8vIEdOVSBDKysKLQotIyBpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jICBwcmFnbWEgcGFjayAocG9wKQotIyBlbmRpZgotCi0jIGlmIGRlZmluZWQoX19PQkpDX18pCi0jICBpZiAhZGVmaW5lZChfX0FQUExFX0NDX18pIHx8IChfX0FQUExFX0NDX18gPD0gMSkKLSMgICBpZiBkZWZpbmVkKEFTSU9fT0JKQ19XT1JLQVJPVU5EKQotIyAgICB1bmRlZiBQcm90b2NvbAotIyAgICB1bmRlZiBpZAotIyAgICB1bmRlZiBBU0lPX09CSkNfV09SS0FST1VORAotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotCi0jIGlmIChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDEpIHx8IChfX0dOVUNfXyA+IDQpCi0jICBwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCi0jIGVuZGlmIC8vIChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDEpIHx8IChfX0dOVUNfXyA+IDQpCi0KLSNlbGlmIGRlZmluZWQoX19LQ0MpCi0KLS8vIEthaSBDKysKLQotI2VsaWYgZGVmaW5lZChfX3NnaSkKLQotLy8gU0dJIE1JUFNwcm8gQysrCi0KLSNlbGlmIGRlZmluZWQoX19ERUNDWFgpCi0KLS8vIENvbXBhcSBUcnU2NCBVbml4IGN4eAotCi0jZWxpZiBkZWZpbmVkKF9fZ2hzKQotCi0vLyBHcmVlbmhpbGxzIEMrKwotCi0jZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykKLQotLy8gQm9ybGFuZCBDKysKLQotIyBwcmFnbWEgb3B0aW9uIHBvcAotIyBwcmFnbWEgbm9wdXNob3B0d2FybgotIyBwcmFnbWEgbm9wYWNrd2FybmluZwotCi0jZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pCi0KLS8vIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IKLQotI2VsaWYgZGVmaW5lZChfX1NVTlBST19DQykKLQotLy8gU3VuIFdvcmtzaG9wIENvbXBpbGVyIEMrKwotCi0jZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQotCi0vLyBIUCBhQ0MKLQotI2VsaWYgZGVmaW5lZChfX01SQ19fKSB8fCBkZWZpbmVkKF9fU0NfXykKLQotLy8gTVBXIE1yQ3BwIG9yIFNDcHAKLQotI2VsaWYgZGVmaW5lZChfX0lCTUNQUF9fKQotCi0vLyBJQk0gVmlzdWFsIEFnZQotCi0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotCi0vLyBNaWNyb3NvZnQgVmlzdWFsIEMrKwotLy8KLS8vIE11c3QgcmVtYWluIHRoZSBsYXN0ICNlbGlmIHNpbmNlIHNvbWUgb3RoZXIgdmVuZG9ycyAoTWV0cm93ZXJrcywgZm9yIGV4YW1wbGUpCi0vLyBhbHNvICNkZWZpbmUgX01TQ19WRVIKLQotIyBwcmFnbWEgd2FybmluZyAocG9wKQotIyBwcmFnbWEgcGFjayAocG9wKQotCi0jIGlmIGRlZmluZWQoX19jcGx1c3BsdXNfY2xpKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzX3dpbnJ0KQotIyAgaWYgZGVmaW5lZChBU0lPX0NMUl9XT1JLQVJPVU5EKQotIyAgIHVuZGVmIGdlbmVyaWMKLSMgICB1bmRlZiBBU0lPX0NMUl9XT1JLQVJPVU5ECi0jICBlbmRpZgotIyBlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcG9zaXhfZXZlbnQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9wb3NpeF9ldmVudC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NGI3MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9wb3NpeF9ldmVudC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9wb3NpeF9ldmVudC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUE9TSVhfRVZFTlRfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1BPU0lYX0VWRU5UX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hc3NlcnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBwb3NpeF9ldmVudAotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIEFTSU9fREVDTCBwb3NpeF9ldmVudCgpOwotCi0gIC8vIERlc3RydWN0b3IuCi0gIH5wb3NpeF9ldmVudCgpCi0gIHsKLSAgICA6OnB0aHJlYWRfY29uZF9kZXN0cm95KCZjb25kXyk7Ci0gIH0KLQotICAvLyBTaWduYWwgdGhlIGV2ZW50LiAoUmV0YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuKQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgdm9pZCBzaWduYWwoTG9jayYgbG9jaykKLSAgewotICAgIHRoaXMtPnNpZ25hbF9hbGwobG9jayk7Ci0gIH0KLQotICAvLyBTaWduYWwgYWxsIHdhaXRlcnMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb2NrPgotICB2b2lkIHNpZ25hbF9hbGwoTG9jayYgbG9jaykKLSAgewotICAgIEFTSU9fQVNTRVJUKGxvY2subG9ja2VkKCkpOwotICAgICh2b2lkKWxvY2s7Ci0gICAgc3RhdGVfIHw9IDE7Ci0gICAgOjpwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZjb25kXyk7IC8vIElnbm9yZSBFSU5WQUwuCi0gIH0KLQotICAvLyBVbmxvY2sgdGhlIG11dGV4IGFuZCBzaWduYWwgb25lIHdhaXRlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExvY2s+Ci0gIHZvaWQgdW5sb2NrX2FuZF9zaWduYWxfb25lKExvY2smIGxvY2spCi0gIHsKLSAgICBBU0lPX0FTU0VSVChsb2NrLmxvY2tlZCgpKTsKLSAgICBzdGF0ZV8gfD0gMTsKLSAgICBib29sIGhhdmVfd2FpdGVycyA9IChzdGF0ZV8gPiAxKTsKLSAgICBsb2NrLnVubG9jaygpOwotICAgIGlmIChoYXZlX3dhaXRlcnMpCi0gICAgICA6OnB0aHJlYWRfY29uZF9zaWduYWwoJmNvbmRfKTsgLy8gSWdub3JlIEVJTlZBTC4KLSAgfQotCi0gIC8vIElmIHRoZXJlJ3MgYSB3YWl0ZXIsIHVubG9jayB0aGUgbXV0ZXggYW5kIHNpZ25hbCBpdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExvY2s+Ci0gIGJvb2wgbWF5YmVfdW5sb2NrX2FuZF9zaWduYWxfb25lKExvY2smIGxvY2spCi0gIHsKLSAgICBBU0lPX0FTU0VSVChsb2NrLmxvY2tlZCgpKTsKLSAgICBzdGF0ZV8gfD0gMTsKLSAgICBpZiAoc3RhdGVfID4gMSkKLSAgICB7Ci0gICAgICBsb2NrLnVubG9jaygpOwotICAgICAgOjpwdGhyZWFkX2NvbmRfc2lnbmFsKCZjb25kXyk7IC8vIElnbm9yZSBFSU5WQUwuCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmVzZXQgdGhlIGV2ZW50LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgdm9pZCBjbGVhcihMb2NrJiBsb2NrKQotICB7Ci0gICAgQVNJT19BU1NFUlQobG9jay5sb2NrZWQoKSk7Ci0gICAgKHZvaWQpbG9jazsKLSAgICBzdGF0ZV8gJj0gfnN0ZDo6c2l6ZV90KDEpOwotICB9Ci0KLSAgLy8gV2FpdCBmb3IgdGhlIGV2ZW50IHRvIGJlY29tZSBzaWduYWxsZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb2NrPgotICB2b2lkIHdhaXQoTG9jayYgbG9jaykKLSAgewotICAgIEFTSU9fQVNTRVJUKGxvY2subG9ja2VkKCkpOwotICAgIHdoaWxlICgoc3RhdGVfICYgMSkgPT0gMCkKLSAgICB7Ci0gICAgICBzdGF0ZV8gKz0gMjsKLSAgICAgIDo6cHRocmVhZF9jb25kX3dhaXQoJmNvbmRfLCAmbG9jay5tdXRleCgpLm11dGV4Xyk7IC8vIElnbm9yZSBFSU5WQUwuCi0gICAgICBzdGF0ZV8gLT0gMjsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgOjpwdGhyZWFkX2NvbmRfdCBjb25kXzsKLSAgc3RkOjpzaXplX3Qgc3RhdGVfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvcG9zaXhfZXZlbnQuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9QT1NJWF9FVkVOVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcG9zaXhfZmRfc2V0X2FkYXB0ZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9wb3NpeF9mZF9zZXRfYWRhcHRlci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYTk3YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9wb3NpeF9mZF9zZXRfYWRhcHRlci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8KLS8vIGRldGFpbC9wb3NpeF9mZF9zZXRfYWRhcHRlci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUE9TSVhfRkRfU0VUX0FEQVBURVJfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1BPU0lYX0ZEX1NFVF9BREFQVEVSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTKSBcCi0gICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pIFwKLSAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdG9yX29wX3F1ZXVlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLS8vIEFkYXB0cyB0aGUgRkRfU0VUIHR5cGUgdG8gbWVldCB0aGUgRGVzY3JpcHRvcl9TZXQgY29uY2VwdCdzIHJlcXVpcmVtZW50cy4KLWNsYXNzIHBvc2l4X2ZkX3NldF9hZGFwdGVyIDogbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgcG9zaXhfZmRfc2V0X2FkYXB0ZXIoKQotICAgIDogbWF4X2Rlc2NyaXB0b3JfKGludmFsaWRfc29ja2V0KQotICB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gTmVlZGVkIGZvciBtZW1zZXQgb24gU29sYXJpcy4KLSAgICBGRF9aRVJPKCZmZF9zZXRfKTsKLSAgfQotCi0gIHZvaWQgcmVzZXQoKQotICB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gTmVlZGVkIGZvciBtZW1zZXQgb24gU29sYXJpcy4KLSAgICBGRF9aRVJPKCZmZF9zZXRfKTsKLSAgfQotCi0gIGJvb2wgc2V0KHNvY2tldF90eXBlIGRlc2NyaXB0b3IpCi0gIHsKLSAgICBpZiAoZGVzY3JpcHRvciA8IChzb2NrZXRfdHlwZSlGRF9TRVRTSVpFKQotICAgIHsKLSAgICAgIGlmIChtYXhfZGVzY3JpcHRvcl8gPT0gaW52YWxpZF9zb2NrZXQgfHwgZGVzY3JpcHRvciA+IG1heF9kZXNjcmlwdG9yXykKLSAgICAgICAgbWF4X2Rlc2NyaXB0b3JfID0gZGVzY3JpcHRvcjsKLSAgICAgIEZEX1NFVChkZXNjcmlwdG9yLCAmZmRfc2V0Xyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdm9pZCBzZXQocmVhY3Rvcl9vcF9xdWV1ZTxzb2NrZXRfdHlwZT4mIG9wZXJhdGlvbnMsIG9wX3F1ZXVlPG9wZXJhdGlvbj4mIG9wcykKLSAgewotICAgIHJlYWN0b3Jfb3BfcXVldWU8c29ja2V0X3R5cGU+OjppdGVyYXRvciBpID0gb3BlcmF0aW9ucy5iZWdpbigpOwotICAgIHdoaWxlIChpICE9IG9wZXJhdGlvbnMuZW5kKCkpCi0gICAgewotICAgICAgcmVhY3Rvcl9vcF9xdWV1ZTxzb2NrZXRfdHlwZT46Oml0ZXJhdG9yIG9wX2l0ZXIgPSBpKys7Ci0gICAgICBpZiAoIXNldChvcF9pdGVyLT5maXJzdCkpCi0gICAgICB7Ci0gICAgICAgIGFzaW86OmVycm9yX2NvZGUgZWMoZXJyb3I6OmZkX3NldF9mYWlsdXJlKTsKLSAgICAgICAgb3BlcmF0aW9ucy5jYW5jZWxfb3BlcmF0aW9ucyhvcF9pdGVyLCBvcHMsIGVjKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBib29sIGlzX3NldChzb2NrZXRfdHlwZSBkZXNjcmlwdG9yKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIEZEX0lTU0VUKGRlc2NyaXB0b3IsICZmZF9zZXRfKSAhPSAwOwotICB9Ci0KLSAgb3BlcmF0b3IgZmRfc2V0KigpCi0gIHsKLSAgICByZXR1cm4gJmZkX3NldF87Ci0gIH0KLQotICBzb2NrZXRfdHlwZSBtYXhfZGVzY3JpcHRvcigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gbWF4X2Rlc2NyaXB0b3JfOwotICB9Ci0KLSAgdm9pZCBwZXJmb3JtKHJlYWN0b3Jfb3BfcXVldWU8c29ja2V0X3R5cGU+JiBvcGVyYXRpb25zLAotICAgICAgb3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzKSBjb25zdAotICB7Ci0gICAgcmVhY3Rvcl9vcF9xdWV1ZTxzb2NrZXRfdHlwZT46Oml0ZXJhdG9yIGkgPSBvcGVyYXRpb25zLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGkgIT0gb3BlcmF0aW9ucy5lbmQoKSkKLSAgICB7Ci0gICAgICByZWFjdG9yX29wX3F1ZXVlPHNvY2tldF90eXBlPjo6aXRlcmF0b3Igb3BfaXRlciA9IGkrKzsKLSAgICAgIGlmIChpc19zZXQob3BfaXRlci0+Zmlyc3QpKQotICAgICAgICBvcGVyYXRpb25zLnBlcmZvcm1fb3BlcmF0aW9ucyhvcF9pdGVyLCBvcHMpOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBtdXRhYmxlIGZkX3NldCBmZF9zZXRfOwotICBzb2NrZXRfdHlwZSBtYXhfZGVzY3JpcHRvcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XUykKLSAgICAgICAvLyAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotICAgICAgIC8vICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUE9TSVhfRkRfU0VUX0FEQVBURVJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Bvc2l4X211dGV4LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcG9zaXhfbXV0ZXguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNiYzU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcG9zaXhfbXV0ZXguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9wb3NpeF9tdXRleC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUE9TSVhfTVVURVhfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1BPU0lYX01VVEVYX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc2NvcGVkX2xvY2suaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHBvc2l4X2V2ZW50OwotCi1jbGFzcyBwb3NpeF9tdXRleAotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgdHlwZWRlZiBhc2lvOjpkZXRhaWw6OnNjb3BlZF9sb2NrPHBvc2l4X211dGV4PiBzY29wZWRfbG9jazsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIHBvc2l4X211dGV4KCk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgfnBvc2l4X211dGV4KCkKLSAgewotICAgIDo6cHRocmVhZF9tdXRleF9kZXN0cm95KCZtdXRleF8pOyAvLyBJZ25vcmUgRUJVU1kuCi0gIH0KLQotICAvLyBMb2NrIHRoZSBtdXRleC4KLSAgdm9pZCBsb2NrKCkKLSAgewotICAgICh2b2lkKTo6cHRocmVhZF9tdXRleF9sb2NrKCZtdXRleF8pOyAvLyBJZ25vcmUgRUlOVkFMLgotICB9Ci0KLSAgLy8gVW5sb2NrIHRoZSBtdXRleC4KLSAgdm9pZCB1bmxvY2soKQotICB7Ci0gICAgKHZvaWQpOjpwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXhfKTsgLy8gSWdub3JlIEVJTlZBTC4KLSAgfQotCi1wcml2YXRlOgotICBmcmllbmQgY2xhc3MgcG9zaXhfZXZlbnQ7Ci0gIDo6cHRocmVhZF9tdXRleF90IG11dGV4XzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3Bvc2l4X211dGV4LmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUE9TSVhfTVVURVhfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Bvc2l4X3NpZ25hbF9ibG9ja2VyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcG9zaXhfc2lnbmFsX2Jsb2NrZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ0YzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcG9zaXhfc2lnbmFsX2Jsb2NrZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9wb3NpeF9zaWduYWxfYmxvY2tlci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUE9TSVhfU0lHTkFMX0JMT0NLRVJfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1BPU0lYX1NJR05BTF9CTE9DS0VSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLQotI2luY2x1ZGUgPGNzaWduYWw+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBwb3NpeF9zaWduYWxfYmxvY2tlcgotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IgYmxvY2tzIGFsbCBzaWduYWxzIGZvciB0aGUgY2FsbGluZyB0aHJlYWQuCi0gIHBvc2l4X3NpZ25hbF9ibG9ja2VyKCkKLSAgICA6IGJsb2NrZWRfKGZhbHNlKQotICB7Ci0gICAgc2lnc2V0X3QgbmV3X21hc2s7Ci0gICAgc2lnZmlsbHNldCgmbmV3X21hc2spOwotICAgIGJsb2NrZWRfID0gKHB0aHJlYWRfc2lnbWFzayhTSUdfQkxPQ0ssICZuZXdfbWFzaywgJm9sZF9tYXNrXykgPT0gMCk7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yIHJlc3RvcmVzIHRoZSBwcmV2aW91cyBzaWduYWwgbWFzay4KLSAgfnBvc2l4X3NpZ25hbF9ibG9ja2VyKCkKLSAgewotICAgIGlmIChibG9ja2VkXykKLSAgICAgIHB0aHJlYWRfc2lnbWFzayhTSUdfU0VUTUFTSywgJm9sZF9tYXNrXywgMCk7Ci0gIH0KLQotICAvLyBCbG9jayBhbGwgc2lnbmFscyBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkLgotICB2b2lkIGJsb2NrKCkKLSAgewotICAgIGlmICghYmxvY2tlZF8pCi0gICAgewotICAgICAgc2lnc2V0X3QgbmV3X21hc2s7Ci0gICAgICBzaWdmaWxsc2V0KCZuZXdfbWFzayk7Ci0gICAgICBibG9ja2VkXyA9IChwdGhyZWFkX3NpZ21hc2soU0lHX0JMT0NLLCAmbmV3X21hc2ssICZvbGRfbWFza18pID09IDApOwotICAgIH0KLSAgfQotCi0gIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHNpZ25hbCBtYXNrLgotICB2b2lkIHVuYmxvY2soKQotICB7Ci0gICAgaWYgKGJsb2NrZWRfKQotICAgICAgYmxvY2tlZF8gPSAocHRocmVhZF9zaWdtYXNrKFNJR19TRVRNQVNLLCAmb2xkX21hc2tfLCAwKSAhPSAwKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBIYXZlIHNpZ25hbHMgYmVlbiBibG9ja2VkLgotICBib29sIGJsb2NrZWRfOwotCi0gIC8vIFRoZSBwcmV2aW91cyBzaWduYWwgbWFzay4KLSAgc2lnc2V0X3Qgb2xkX21hc2tfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUE9TSVhfU0lHTkFMX0JMT0NLRVJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Bvc2l4X3N0YXRpY19tdXRleC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Bvc2l4X3N0YXRpY19tdXRleC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYmQyZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9wb3NpeF9zdGF0aWNfbXV0ZXguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9wb3NpeF9zdGF0aWNfbXV0ZXguaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9QT1NJWF9TVEFUSUNfTVVURVhfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1BPU0lYX1NUQVRJQ19NVVRFWF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc2NvcGVkX2xvY2suaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXN0cnVjdCBwb3NpeF9zdGF0aWNfbXV0ZXgKLXsKLSAgdHlwZWRlZiBhc2lvOjpkZXRhaWw6OnNjb3BlZF9sb2NrPHBvc2l4X3N0YXRpY19tdXRleD4gc2NvcGVkX2xvY2s7Ci0KLSAgLy8gSW5pdGlhbGlzZSB0aGUgbXV0ZXguCi0gIHZvaWQgaW5pdCgpCi0gIHsKLSAgICAvLyBOb3RoaW5nIHRvIGRvLgotICB9Ci0KLSAgLy8gTG9jayB0aGUgbXV0ZXguCi0gIHZvaWQgbG9jaygpCi0gIHsKLSAgICAodm9pZCk6OnB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXhfKTsgLy8gSWdub3JlIEVJTlZBTC4KLSAgfQotCi0gIC8vIFVubG9jayB0aGUgbXV0ZXguCi0gIHZvaWQgdW5sb2NrKCkKLSAgewotICAgICh2b2lkKTo6cHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4Xyk7IC8vIElnbm9yZSBFSU5WQUwuCi0gIH0KLQotICA6OnB0aHJlYWRfbXV0ZXhfdCBtdXRleF87Ci19OwotCi0jZGVmaW5lIEFTSU9fUE9TSVhfU1RBVElDX01VVEVYX0lOSVQgeyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSIH0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUE9TSVhfU1RBVElDX01VVEVYX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9wb3NpeF90aHJlYWQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9wb3NpeF90aHJlYWQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU1YzYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcG9zaXhfdGhyZWFkLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3Bvc2l4X3RocmVhZC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1BPU0lYX1RIUkVBRF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfUE9TSVhfVEhSRUFEX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotZXh0ZXJuICJDIgotewotICBBU0lPX0RFQ0wgdm9pZCogYXNpb19kZXRhaWxfcG9zaXhfdGhyZWFkX2Z1bmN0aW9uKHZvaWQqIGFyZyk7Ci19Ci0KLWNsYXNzIHBvc2l4X3RocmVhZAotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgcG9zaXhfdGhyZWFkKEZ1bmN0aW9uIGYsIHVuc2lnbmVkIGludCA9IDApCi0gICAgOiBqb2luZWRfKGZhbHNlKQotICB7Ci0gICAgc3RhcnRfdGhyZWFkKG5ldyBmdW5jPEZ1bmN0aW9uPihmKSk7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICBBU0lPX0RFQ0wgfnBvc2l4X3RocmVhZCgpOwotCi0gIC8vIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZXhpdC4KLSAgQVNJT19ERUNMIHZvaWQgam9pbigpOwotCi1wcml2YXRlOgotICBmcmllbmQgdm9pZCogYXNpb19kZXRhaWxfcG9zaXhfdGhyZWFkX2Z1bmN0aW9uKHZvaWQqIGFyZyk7Ci0KLSAgY2xhc3MgZnVuY19iYXNlCi0gIHsKLSAgcHVibGljOgotICAgIHZpcnR1YWwgfmZ1bmNfYmFzZSgpIHt9Ci0gICAgdmlydHVhbCB2b2lkIHJ1bigpID0gMDsKLSAgfTsKLQotICBzdHJ1Y3QgYXV0b19mdW5jX2Jhc2VfcHRyCi0gIHsKLSAgICBmdW5jX2Jhc2UqIHB0cjsKLSAgICB+YXV0b19mdW5jX2Jhc2VfcHRyKCkgeyBkZWxldGUgcHRyOyB9Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBjbGFzcyBmdW5jCi0gICAgOiBwdWJsaWMgZnVuY19iYXNlCi0gIHsKLSAgcHVibGljOgotICAgIGZ1bmMoRnVuY3Rpb24gZikKLSAgICAgIDogZl8oZikKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHJ1bigpCi0gICAgewotICAgICAgZl8oKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBGdW5jdGlvbiBmXzsKLSAgfTsKLQotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF90aHJlYWQoZnVuY19iYXNlKiBhcmcpOwotCi0gIDo6cHRocmVhZF90IHRocmVhZF87Ci0gIGJvb2wgam9pbmVkXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3Bvc2l4X3RocmVhZC5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1BPU0lYX1RIUkVBRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcG9zaXhfdHNzX3B0ci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Bvc2l4X3Rzc19wdHIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDdlOWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcG9zaXhfdHNzX3B0ci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3Bvc2l4X3Rzc19wdHIuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUE9TSVhfVFNTX1BUUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfUE9TSVhfVFNTX1BUUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLS8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgdGhyZWFkLXNwZWNpZmljIHN0b3JhZ2UuCi1BU0lPX0RFQ0wgdm9pZCBwb3NpeF90c3NfcHRyX2NyZWF0ZShwdGhyZWFkX2tleV90JiBrZXkpOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIHBvc2l4X3Rzc19wdHIKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBwb3NpeF90c3NfcHRyKCkKLSAgewotICAgIHBvc2l4X3Rzc19wdHJfY3JlYXRlKHRzc19rZXlfKTsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IuCi0gIH5wb3NpeF90c3NfcHRyKCkKLSAgewotICAgIDo6cHRocmVhZF9rZXlfZGVsZXRlKHRzc19rZXlfKTsKLSAgfQotCi0gIC8vIEdldCB0aGUgdmFsdWUuCi0gIG9wZXJhdG9yIFQqKCkgY29uc3QKLSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oOjpwdGhyZWFkX2dldHNwZWNpZmljKHRzc19rZXlfKSk7Ci0gIH0KLQotICAvLyBTZXQgdGhlIHZhbHVlLgotICB2b2lkIG9wZXJhdG9yPShUKiB2YWx1ZSkKLSAgewotICAgIDo6cHRocmVhZF9zZXRzcGVjaWZpYyh0c3Nfa2V5XywgdmFsdWUpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIFRocmVhZC1zcGVjaWZpYyBzdG9yYWdlIHRvIGFsbG93IHVubG9ja2VkIGFjY2VzcyB0byBkZXRlcm1pbmUgd2hldGhlciBhCi0gIC8vIHRocmVhZCBpcyBhIG1lbWJlciBvZiB0aGUgcG9vbC4KLSAgcHRocmVhZF9rZXlfdCB0c3Nfa2V5XzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3Bvc2l4X3Rzc19wdHIuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9QT1NJWF9UU1NfUFRSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTJjMjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vLwotLy8gZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0vLyBObyBoZWFkZXIgZ3VhcmQKLQotI2lmIGRlZmluZWQoX19DT01PX18pCi0KLS8vIENvbWVhdSBDKysKLQotI2VsaWYgZGVmaW5lZChfX0RNQ19fKQotCi0vLyBEaWdpdGFsIE1hcnMgQysrCi0KLSNlbGlmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgfHwgZGVmaW5lZChfX0lDTCkgXAotICB8fCBkZWZpbmVkKF9fSUNDKSB8fCBkZWZpbmVkKF9fRUNDKQotCi0vLyBJbnRlbCBDKysKLQotIyBpZiAoX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSAxKSB8fCAoX19HTlVDX18gPiA0KQotIyAgcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2ggKGRlZmF1bHQpCi0jIGVuZGlmIC8vIChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDEpIHx8IChfX0dOVUNfXyA+IDQpCi0KLSNlbGlmIGRlZmluZWQoX19jbGFuZ19fKQotCi0vLyBDbGFuZwotCi0jIGlmIGRlZmluZWQoX19PQkpDX18pCi0jICBpZiAhZGVmaW5lZChfX0FQUExFX0NDX18pIHx8IChfX0FQUExFX0NDX18gPD0gMSkKLSMgICBpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfT0JKQ19XT1JLQVJPVU5EKQotIyAgICBpZiAhZGVmaW5lZChQcm90b2NvbCkgJiYgIWRlZmluZWQoaWQpCi0jICAgICBkZWZpbmUgUHJvdG9jb2wgY3BwX1Byb3RvY29sCi0jICAgICBkZWZpbmUgaWQgY3BwX2lkCi0jICAgICBkZWZpbmUgQVNJT19PQkpDX1dPUktBUk9VTkQKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLQotIyBpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoV0lOMzIpCi0jICBwcmFnbWEgR0NDIHZpc2liaWxpdHkgcHVzaCAoZGVmYXVsdCkKLSMgZW5kaWYgLy8gIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKFdJTjMyKQotCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKQotCi0vLyBHTlUgQysrCi0KLSMgaWYgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgcHJhZ21hIHBhY2sgKHB1c2gsIDgpCi0jIGVuZGlmCi0KLSMgaWYgZGVmaW5lZChfX09CSkNfXykKLSMgIGlmICFkZWZpbmVkKF9fQVBQTEVfQ0NfXykgfHwgKF9fQVBQTEVfQ0NfXyA8PSAxKQotIyAgIGlmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9PQkpDX1dPUktBUk9VTkQpCi0jICAgIGlmICFkZWZpbmVkKFByb3RvY29sKSAmJiAhZGVmaW5lZChpZCkKLSMgICAgIGRlZmluZSBQcm90b2NvbCBjcHBfUHJvdG9jb2wKLSMgICAgIGRlZmluZSBpZCBjcHBfaWQKLSMgICAgIGRlZmluZSBBU0lPX09CSkNfV09SS0FST1VORAotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotCi0jIGlmIChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDEpIHx8IChfX0dOVUNfXyA+IDQpCi0jICBwcmFnbWEgR0NDIHZpc2liaWxpdHkgcHVzaCAoZGVmYXVsdCkKLSMgZW5kaWYgLy8gKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMSkgfHwgKF9fR05VQ19fID4gNCkKLQotI2VsaWYgZGVmaW5lZChfX0tDQykKLQotLy8gS2FpIEMrKwotCi0jZWxpZiBkZWZpbmVkKF9fc2dpKQotCi0vLyBTR0kgTUlQU3BybyBDKysKLQotI2VsaWYgZGVmaW5lZChfX0RFQ0NYWCkKLQotLy8gQ29tcGFxIFRydTY0IFVuaXggY3h4Ci0KLSNlbGlmIGRlZmluZWQoX19naHMpCi0KLS8vIEdyZWVuaGlsbHMgQysrCi0KLSNlbGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKQotCi0vLyBCb3JsYW5kIEMrKwotCi0jIHByYWdtYSBvcHRpb24gcHVzaCAtYTggLWIgLVZlLSAtVngtIC13LWlubCAtdmktCi0jIHByYWdtYSBub3B1c2hvcHR3YXJuCi0jIHByYWdtYSBub3BhY2t3YXJuaW5nCi0jIGlmICFkZWZpbmVkKF9fTVRfXykKLSMgIGVycm9yIE11bHRpdGhyZWFkZWQgUlRMIG11c3QgYmUgc2VsZWN0ZWQuCi0jIGVuZGlmIC8vICFkZWZpbmVkKF9fTVRfXykKLQotI2VsaWYgZGVmaW5lZChfX01XRVJLU19fKQotCi0vLyBNZXRyb3dlcmtzIENvZGVXYXJyaW9yCi0KLSNlbGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpCi0KLS8vIFN1biBXb3Jrc2hvcCBDb21waWxlciBDKysKLQotI2VsaWYgZGVmaW5lZChfX0hQX2FDQykKLQotLy8gSFAgYUNDCi0KLSNlbGlmIGRlZmluZWQoX19NUkNfXykgfHwgZGVmaW5lZChfX1NDX18pCi0KLS8vIE1QVyBNckNwcCBvciBTQ3BwCi0KLSNlbGlmIGRlZmluZWQoX19JQk1DUFBfXykKLQotLy8gSUJNIFZpc3VhbCBBZ2UKLQotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKLQotLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysKLS8vCi0vLyBNdXN0IHJlbWFpbiB0aGUgbGFzdCAjZWxpZiBzaW5jZSBzb21lIG90aGVyIHZlbmRvcnMgKE1ldHJvd2Vya3MsIGZvciBleGFtcGxlKQotLy8gYWxzbyAjZGVmaW5lIF9NU0NfVkVSCi0KLSMgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6NDEwMykKLSMgcHJhZ21hIHdhcm5pbmcgKHB1c2gpCi0jIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOjQxMjcpCi0jIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOjQxODApCi0jIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOjQyNDQpCi0jIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOjQzNTUpCi0jIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOjQ1MTApCi0jIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOjQ1MTIpCi0jIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOjQ2MTApCi0jIHByYWdtYSB3YXJuaW5nIChkaXNhYmxlOjQ2NzUpCi0jIGlmIGRlZmluZWQoX01fSVg4NikgJiYgZGVmaW5lZChfV3A2NCkKLS8vIFRoZSAvV3A2NCBvcHRpb24gaXMgYnJva2VuLiBJZiB5b3Ugd2FudCB0byBjaGVjayA2NCBiaXQgcG9ydGFiaWxpdHksIHVzZSBhCi0vLyA2NCBiaXQgY29tcGlsZXIhCi0jICBwcmFnbWEgd2FybmluZyAoZGlzYWJsZTo0MzExKQotIyAgcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6NDMxMikKLSMgZW5kaWYgLy8gZGVmaW5lZChfTV9JWDg2KSAmJiBkZWZpbmVkKF9XcDY0KQotIyBwcmFnbWEgcGFjayAocHVzaCwgOCkKLS8vIE5vdGUgdGhhdCBpZiB0aGUgL09nIG9wdGltaXNhdGlvbiBmbGFnIGlzIGVuYWJsZWQgd2l0aCBNU1ZDNiwgdGhlIGNvbXBpbGVyCi0vLyBoYXMgYSB0ZW5kZW5jeSB0byBpbmNvcnJlY3RseSBvcHRpbWlzZSBhd2F5IHNvbWUgY2FsbHMgdG8gbWVtYmVyIHRlbXBsYXRlCi0vLyBmdW5jdGlvbnMsIGV2ZW4gdGhvdWdoIHRob3NlIGZ1bmN0aW9ucyBjb250YWluIGNvZGUgdGhhdCBzaG91bGQgbm90IGJlCi0vLyBvcHRpbWlzZWQgYXdheSEgVGhlcmVmb3JlIHdlIHdpbGwgYWx3YXlzIGRpc2FibGUgdGhpcyBvcHRpbWlzYXRpb24gb3B0aW9uCi0vLyBmb3IgdGhlIE1TVkM2IGNvbXBpbGVyLgotIyBpZiAoX01TQ19WRVIgPCAxMzAwKQotIyAgcHJhZ21hIG9wdGltaXplICgiZyIsIG9mZikKLSMgZW5kaWYKLSMgaWYgIWRlZmluZWQoX01UKQotIyAgZXJyb3IgTXVsdGl0aHJlYWRlZCBSVEwgbXVzdCBiZSBzZWxlY3RlZC4KLSMgZW5kaWYgLy8gIWRlZmluZWQoX01UKQotCi0jIGlmIGRlZmluZWQoX19jcGx1c3BsdXNfY2xpKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzX3dpbnJ0KQotIyAgaWYgIWRlZmluZWQoQVNJT19ESVNBQkxFX0NMUl9XT1JLQVJPVU5EKQotIyAgIGlmICFkZWZpbmVkKGdlbmVyaWMpCi0jICAgIGRlZmluZSBnZW5lcmljIGNwcF9nZW5lcmljCi0jICAgIGRlZmluZSBBU0lPX0NMUl9XT1JLQVJPVU5ECi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTE2ZWQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vLwotLy8gZGV0YWlsL3JlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1JFQUNUSVZFX0RFU0NSSVBUT1JfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfUkVBQ1RJVkVfREVTQ1JJUFRPUl9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTKSBcCi0gICYmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKSBcCi0gICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNpbmNsdWRlICJhc2lvL2J1ZmZlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2Rlc2NyaXB0b3Jfb3BzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9kZXNjcmlwdG9yX3JlYWRfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2Rlc2NyaXB0b3Jfd3JpdGVfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0aXZlX251bGxfYnVmZmVyc19vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3MgcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBuYXRpdmUgdHlwZSBvZiBhIGRlc2NyaXB0b3IuCi0gIHR5cGVkZWYgaW50IG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICAvLyBUaGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiB0aGUgZGVzY3JpcHRvci4KLSAgY2xhc3MgaW1wbGVtZW50YXRpb25fdHlwZQotICAgIDogcHJpdmF0ZSBhc2lvOjpkZXRhaWw6Om5vbmNvcHlhYmxlCi0gIHsKLSAgcHVibGljOgotICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgaW1wbGVtZW50YXRpb25fdHlwZSgpCi0gICAgICA6IGRlc2NyaXB0b3JfKC0xKSwKLSAgICAgICAgc3RhdGVfKDApCi0gICAgewotICAgIH0KLQotICBwcml2YXRlOgotICAgIC8vIE9ubHkgdGhpcyBzZXJ2aWNlIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlIGludGVybmFsIHZhbHVlcy4KLSAgICBmcmllbmQgY2xhc3MgcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlOwotCi0gICAgLy8gVGhlIG5hdGl2ZSBkZXNjcmlwdG9yIHJlcHJlc2VudGF0aW9uLgotICAgIGludCBkZXNjcmlwdG9yXzsKLQotICAgIC8vIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZXNjcmlwdG9yLgotICAgIGRlc2NyaXB0b3Jfb3BzOjpzdGF0ZV90eXBlIHN0YXRlXzsKLQotICAgIC8vIFBlci1kZXNjcmlwdG9yIGRhdGEgdXNlZCBieSB0aGUgcmVhY3Rvci4KLSAgICByZWFjdG9yOjpwZXJfZGVzY3JpcHRvcl9kYXRhIHJlYWN0b3JfZGF0YV87Ci0gIH07Ci0KLSAgLy8gQ29uc3RydWN0b3IuCi0gIEFTSU9fREVDTCByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2UoCi0gICAgICBhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKTsKLQotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICBBU0lPX0RFQ0wgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCk7Ci0KLSAgLy8gQ29uc3RydWN0IGEgbmV3IGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKTsKLQotICAvLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyBkZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBtb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCk7Ci0KLSAgLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIG1vdmVfYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2UmIG90aGVyX3NlcnZpY2UsCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKTsKLQotICAvLyBEZXN0cm95IGEgZGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgZGVzdHJveShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKTsKLQotICAvLyBBc3NpZ24gYSBuYXRpdmUgZGVzY3JpcHRvciB0byBhIGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBuYXRpdmVfZGVzY3JpcHRvciwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVzY3JpcHRvciBpcyBvcGVuLgotICBib29sIGlzX29wZW4oY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiBpbXBsLmRlc2NyaXB0b3JfICE9IC0xOwotICB9Ci0KLSAgLy8gRGVzdHJveSBhIGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGNsb3NlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gR2V0IHRoZSBuYXRpdmUgZGVzY3JpcHRvciByZXByZXNlbnRhdGlvbi4KLSAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiBpbXBsLmRlc2NyaXB0b3JfOwotICB9Ci0KLSAgLy8gUmVsZWFzZSBvd25lcnNoaXAgb2YgdGhlIG5hdGl2ZSBkZXNjcmlwdG9yIHJlcHJlc2VudGF0aW9uLgotICBBU0lPX0RFQ0wgbmF0aXZlX2hhbmRsZV90eXBlIHJlbGVhc2UoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCk7Ci0KLSAgLy8gQ2FuY2VsIGFsbCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvci4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgY2FuY2VsKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gUGVyZm9ybSBhbiBJTyBjb250cm9sIGNvbW1hbmQgb24gdGhlIGRlc2NyaXB0b3IuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJT19Db250cm9sX0NvbW1hbmQ+Ci0gIGFzaW86OmVycm9yX2NvZGUgaW9fY29udHJvbChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgSU9fQ29udHJvbF9Db21tYW5kJiBjb21tYW5kLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGRlc2NyaXB0b3Jfb3BzOjppb2N0bChpbXBsLmRlc2NyaXB0b3JfLCBpbXBsLnN0YXRlXywKLSAgICAgICAgY29tbWFuZC5uYW1lKCksIHN0YXRpY19jYXN0PGlvY3RsX2FyZ190eXBlKj4oY29tbWFuZC5kYXRhKCkpLCBlYyk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIGRlc2NyaXB0b3IuCi0gIGJvb2wgbm9uX2Jsb2NraW5nKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gKGltcGwuc3RhdGVfICYgZGVzY3JpcHRvcl9vcHM6OnVzZXJfc2V0X25vbl9ibG9ja2luZykgIT0gMDsKLSAgfQotCi0gIC8vIFNldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBkZXNjcmlwdG9yLgotICBhc2lvOjplcnJvcl9jb2RlIG5vbl9ibG9ja2luZyhpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYm9vbCBtb2RlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGRlc2NyaXB0b3Jfb3BzOjpzZXRfdXNlcl9ub25fYmxvY2tpbmcoCi0gICAgICAgIGltcGwuZGVzY3JpcHRvcl8sIGltcGwuc3RhdGVfLCBtb2RlLCBlYyk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIG5hdGl2ZSBkZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uLgotICBib29sIG5hdGl2ZV9ub25fYmxvY2tpbmcoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiAoaW1wbC5zdGF0ZV8gJiBkZXNjcmlwdG9yX29wczo6aW50ZXJuYWxfbm9uX2Jsb2NraW5nKSAhPSAwOwotICB9Ci0KLSAgLy8gU2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIG5hdGl2ZSBkZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIG5hdGl2ZV9ub25fYmxvY2tpbmcoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBkZXNjcmlwdG9yX29wczo6c2V0X2ludGVybmFsX25vbl9ibG9ja2luZygKLSAgICAgICAgaW1wbC5kZXNjcmlwdG9yXywgaW1wbC5zdGF0ZV8sIG1vZGUsIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIGRlc2NyaXB0b3IuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzaXplX3Qgd3JpdGVfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjpjb25zdF9idWZmZXIsCi0gICAgICAgIENvbnN0QnVmZmVyU2VxdWVuY2U+IGJ1ZnMoYnVmZmVycyk7Ci0KLSAgICByZXR1cm4gZGVzY3JpcHRvcl9vcHM6OnN5bmNfd3JpdGUoaW1wbC5kZXNjcmlwdG9yXywgaW1wbC5zdGF0ZV8sCi0gICAgICAgIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksIGJ1ZnMuYWxsX2VtcHR5KCksIGVjKTsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgZGF0YSBjYW4gYmUgd3JpdHRlbiB3aXRob3V0IGJsb2NraW5nLgotICBzaXplX3Qgd3JpdGVfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgbnVsbF9idWZmZXJzJiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICAvLyBXYWl0IGZvciBkZXNjcmlwdG9yIHRvIGJlY29tZSByZWFkeS4KLSAgICBkZXNjcmlwdG9yX29wczo6cG9sbF93cml0ZShpbXBsLmRlc2NyaXB0b3JfLCBpbXBsLnN0YXRlXywgZWMpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd3JpdGUuIFRoZSBkYXRhIGJlaW5nIHNlbnQgbXVzdCBiZSB2YWxpZCBmb3IgdGhlCi0gIC8vIGxpZmV0aW1lIG9mIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY193cml0ZV9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYm9vbCBpc19jb250aW51YXRpb24gPQotICAgICAgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotCi0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIGRlc2NyaXB0b3Jfd3JpdGVfb3A8Q29uc3RCdWZmZXJTZXF1ZW5jZSwgSGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaW1wbC5kZXNjcmlwdG9yXywgYnVmZmVycywgaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgImRlc2NyaXB0b3IiLCAmaW1wbCwgImFzeW5jX3dyaXRlX3NvbWUiKSk7Ci0KLSAgICBzdGFydF9vcChpbXBsLCByZWFjdG9yOjp3cml0ZV9vcCwgcC5wLCBpc19jb250aW51YXRpb24sIHRydWUsCi0gICAgICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86OmNvbnN0X2J1ZmZlciwKLSAgICAgICAgICBDb25zdEJ1ZmZlclNlcXVlbmNlPjo6YWxsX2VtcHR5KGJ1ZmZlcnMpKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdhaXQgdW50aWwgZGF0YSBjYW4gYmUgd3JpdHRlbiB3aXRob3V0IGJsb2NraW5nLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY193cml0ZV9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBudWxsX2J1ZmZlcnMmLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYm9vbCBpc19jb250aW51YXRpb24gPQotICAgICAgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotCi0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHJlYWN0aXZlX251bGxfYnVmZmVyc19vcDxIYW5kbGVyPiBvcDsKLSAgICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplb2Yob3ApLCBoYW5kbGVyKSwgMCB9OwotICAgIHAucCA9IG5ldyAocC52KSBvcChoYW5kbGVyKTsKLQotICAgIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAiZGVzY3JpcHRvciIsCi0gICAgICAgICAgJmltcGwsICJhc3luY193cml0ZV9zb21lKG51bGxfYnVmZmVycykiKSk7Ci0KLSAgICBzdGFydF9vcChpbXBsLCByZWFjdG9yOjp3cml0ZV9vcCwgcC5wLCBpc19jb250aW51YXRpb24sIGZhbHNlLCBmYWxzZSk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotCi0gIC8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHN0cmVhbS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHNpemVfdCByZWFkX3NvbWUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPiBidWZzKGJ1ZmZlcnMpOwotCi0gICAgcmV0dXJuIGRlc2NyaXB0b3Jfb3BzOjpzeW5jX3JlYWQoaW1wbC5kZXNjcmlwdG9yXywgaW1wbC5zdGF0ZV8sCi0gICAgICAgIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksIGJ1ZnMuYWxsX2VtcHR5KCksIGVjKTsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgZGF0YSBjYW4gYmUgcmVhZCB3aXRob3V0IGJsb2NraW5nLgotICBzaXplX3QgcmVhZF9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBudWxsX2J1ZmZlcnMmLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIC8vIFdhaXQgZm9yIGRlc2NyaXB0b3IgdG8gYmVjb21lIHJlYWR5LgotICAgIGRlc2NyaXB0b3Jfb3BzOjpwb2xsX3JlYWQoaW1wbC5kZXNjcmlwdG9yXywgaW1wbC5zdGF0ZV8sIGVjKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlYWQuIFRoZSBidWZmZXIgZm9yIHRoZSBkYXRhIGJlaW5nIHJlYWQgbXVzdCBiZQotICAvLyB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3JlYWRfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYm9vbCBpc19jb250aW51YXRpb24gPQotICAgICAgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotCi0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIGRlc2NyaXB0b3JfcmVhZF9vcDxNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGltcGwuZGVzY3JpcHRvcl8sIGJ1ZmZlcnMsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJkZXNjcmlwdG9yIiwgJmltcGwsICJhc3luY19yZWFkX3NvbWUiKSk7Ci0KLSAgICBzdGFydF9vcChpbXBsLCByZWFjdG9yOjpyZWFkX29wLCBwLnAsIGlzX2NvbnRpbnVhdGlvbiwgdHJ1ZSwKLSAgICAgICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6bXV0YWJsZV9idWZmZXIsCi0gICAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPjo6YWxsX2VtcHR5KGJ1ZmZlcnMpKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCBkYXRhIGNhbiBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3JlYWRfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgbnVsbF9idWZmZXJzJiwgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGJvb2wgaXNfY29udGludWF0aW9uID0KLSAgICAgIGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbihoYW5kbGVyKTsKLQotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiByZWFjdGl2ZV9udWxsX2J1ZmZlcnNfb3A8SGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgImRlc2NyaXB0b3IiLAotICAgICAgICAgICZpbXBsLCAiYXN5bmNfcmVhZF9zb21lKG51bGxfYnVmZmVycykiKSk7Ci0KLSAgICBzdGFydF9vcChpbXBsLCByZWFjdG9yOjpyZWFkX29wLCBwLnAsIGlzX2NvbnRpbnVhdGlvbiwgZmFsc2UsIGZhbHNlKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIFN0YXJ0IHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF9vcChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBpbnQgb3BfdHlwZSwKLSAgICAgIHJlYWN0b3Jfb3AqIG9wLCBib29sIGlzX2NvbnRpbnVhdGlvbiwgYm9vbCBpc19ub25fYmxvY2tpbmcsIGJvb2wgbm9vcCk7Ci0KLSAgLy8gVGhlIHNlbGVjdG9yIHRoYXQgcGVyZm9ybXMgZXZlbnQgZGVtdWx0aXBsZXhpbmcgZm9yIHRoZSBzZXJ2aWNlLgotICByZWFjdG9yJiByZWFjdG9yXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3JlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZS5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgICAgIC8vICAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUkVBQ1RJVkVfREVTQ1JJUFRPUl9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9udWxsX2J1ZmZlcnNfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9udWxsX2J1ZmZlcnNfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzEzODE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfbnVsbF9idWZmZXJzX29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvcmVhY3RpdmVfbnVsbF9idWZmZXJzX29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUkVBQ1RJVkVfTlVMTF9CVUZGRVJTX09QX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9SRUFDVElWRV9OVUxMX0JVRkZFUlNfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyByZWFjdGl2ZV9udWxsX2J1ZmZlcnNfb3AgOiBwdWJsaWMgcmVhY3Rvcl9vcAotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUihyZWFjdGl2ZV9udWxsX2J1ZmZlcnNfb3ApOwotCi0gIHJlYWN0aXZlX251bGxfYnVmZmVyc19vcChIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogcmVhY3Rvcl9vcCgmcmVhY3RpdmVfbnVsbF9idWZmZXJzX29wOjpkb19wZXJmb3JtLAotICAgICAgICAmcmVhY3RpdmVfbnVsbF9idWZmZXJzX29wOjpkb19jb21wbGV0ZSksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSAgc3RhdGljIGJvb2wgZG9fcGVyZm9ybShyZWFjdG9yX29wKikKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgLyplYyovLAotICAgICAgc3RkOjpzaXplX3QgLypieXRlc190cmFuc2ZlcnJlZCovKQotICB7Ci0gICAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIGhhbmRsZXIgb2JqZWN0LgotICAgIHJlYWN0aXZlX251bGxfYnVmZmVyc19vcCogbyhzdGF0aWNfY2FzdDxyZWFjdGl2ZV9udWxsX2J1ZmZlcnNfb3AqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKG8tPmhhbmRsZXJfKSwgbywgbyB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBkZXRhaWw6OmJpbmRlcjI8SGFuZGxlciwgYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3Q+Ci0gICAgICBoYW5kbGVyKG8tPmhhbmRsZXJfLCBvLT5lY18sIG8tPmJ5dGVzX3RyYW5zZmVycmVkXyk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sIGhhbmRsZXIuYXJnMl8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBIYW5kbGVyIGhhbmRsZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9SRUFDVElWRV9OVUxMX0JVRkZFUlNfT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NlcmlhbF9wb3J0X3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhYzc4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NlcmlhbF9wb3J0X3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IFJlcCBJbnZhcmlhbnQgU3lzdGVtcywgSW5jLiAoaW5mb0ByZXBpbnZhcmlhbnQuY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9SRUFDVElWRV9TRVJJQUxfUE9SVF9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9SRUFDVElWRV9TRVJJQUxfUE9SVF9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TRVJJQUxfUE9SVCkKLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NlcmlhbF9wb3J0X2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2Rlc2NyaXB0b3Jfb3BzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLS8vIEV4dGVuZCByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2UgdG8gcHJvdmlkZSBzZXJpYWwgcG9ydCBzdXBwb3J0LgotY2xhc3MgcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZQotewotcHVibGljOgotICAvLyBUaGUgbmF0aXZlIHR5cGUgb2YgYSBzZXJpYWwgcG9ydC4KLSAgdHlwZWRlZiByZWFjdGl2ZV9kZXNjcmlwdG9yX3NlcnZpY2U6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgLy8gVGhlIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgdGhlIHNlcmlhbCBwb3J0LgotICB0eXBlZGVmIHJlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZTo6aW1wbGVtZW50YXRpb25fdHlwZSBpbXBsZW1lbnRhdGlvbl90eXBlOwotCi0gIEFTSU9fREVDTCByZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlKAotICAgICAgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSk7Ci0KLSAgLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgQVNJT19ERUNMIHZvaWQgc2h1dGRvd25fc2VydmljZSgpOwotCi0gIC8vIENvbnN0cnVjdCBhIG5ldyBzZXJpYWwgcG9ydCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBjb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIGRlc2NyaXB0b3Jfc2VydmljZV8uY29uc3RydWN0KGltcGwpOwotICB9Ci0KLSAgLy8gTW92ZS1jb25zdHJ1Y3QgYSBuZXcgc2VyaWFsIHBvcnQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi0gIHsKLSAgICBkZXNjcmlwdG9yX3NlcnZpY2VfLm1vdmVfY29uc3RydWN0KGltcGwsIG90aGVyX2ltcGwpOwotICB9Ci0KLSAgLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIHNlcmlhbCBwb3J0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICByZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlJiBvdGhlcl9zZXJ2aWNlLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIGRlc2NyaXB0b3Jfc2VydmljZV8ubW92ZV9hc3NpZ24oaW1wbCwKLSAgICAgICAgb3RoZXJfc2VydmljZS5kZXNjcmlwdG9yX3NlcnZpY2VfLCBvdGhlcl9pbXBsKTsKLSAgfQotCi0gIC8vIERlc3Ryb3kgYSBzZXJpYWwgcG9ydCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBkZXN0cm95KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBkZXNjcmlwdG9yX3NlcnZpY2VfLmRlc3Ryb3koaW1wbCk7Ci0gIH0KLQotICAvLyBPcGVuIHRoZSBzZXJpYWwgcG9ydCB1c2luZyB0aGUgc3BlY2lmaWVkIGRldmljZSBuYW1lLgotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBvcGVuKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gQXNzaWduIGEgbmF0aXZlIGRlc2NyaXB0b3IgdG8gYSBzZXJpYWwgcG9ydCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhc3NpZ24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX2Rlc2NyaXB0b3IsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBkZXNjcmlwdG9yX3NlcnZpY2VfLmFzc2lnbihpbXBsLCBuYXRpdmVfZGVzY3JpcHRvciwgZWMpOwotICB9Ci0KLSAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlcmlhbCBwb3J0IGlzIG9wZW4uCi0gIGJvb2wgaXNfb3Blbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0b3Jfc2VydmljZV8uaXNfb3BlbihpbXBsKTsKLSAgfQotCi0gIC8vIERlc3Ryb3kgYSBzZXJpYWwgcG9ydCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjbG9zZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRvcl9zZXJ2aWNlXy5jbG9zZShpbXBsLCBlYyk7Ci0gIH0KLQotICAvLyBHZXQgdGhlIG5hdGl2ZSBzZXJpYWwgcG9ydCByZXByZXNlbnRhdGlvbi4KLSAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBkZXNjcmlwdG9yX3NlcnZpY2VfLm5hdGl2ZV9oYW5kbGUoaW1wbCk7Ci0gIH0KLQotICAvLyBDYW5jZWwgYWxsIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJpYWwgcG9ydC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0b3Jfc2VydmljZV8uY2FuY2VsKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vIFNldCBhbiBvcHRpb24gb24gdGhlIHNlcmlhbCBwb3J0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIHNldF9vcHRpb24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IFNldHRhYmxlU2VyaWFsUG9ydE9wdGlvbiYgb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBkb19zZXRfb3B0aW9uKGltcGwsCi0gICAgICAgICZyZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlOjpzdG9yZV9vcHRpb248U2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uPiwKLSAgICAgICAgJm9wdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8gR2V0IGFuIG9wdGlvbiBmcm9tIHRoZSBzZXJpYWwgcG9ydC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEdldHRhYmxlU2VyaWFsUG9ydE9wdGlvbj4KLSAgYXNpbzo6ZXJyb3JfY29kZSBnZXRfb3B0aW9uKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBHZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24mIG9wdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gZG9fZ2V0X29wdGlvbihpbXBsLAotICAgICAgICAmcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZTo6bG9hZF9vcHRpb248R2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uPiwKLSAgICAgICAgJm9wdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8gU2VuZCBhIGJyZWFrIHNlcXVlbmNlIHRvIHRoZSBzZXJpYWwgcG9ydC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBzZW5kX2JyZWFrKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVycm5vID0gMDsKLSAgICBkZXNjcmlwdG9yX29wczo6ZXJyb3Jfd3JhcHBlcig6OnRjc2VuZGJyZWFrKAotICAgICAgICAgIGRlc2NyaXB0b3Jfc2VydmljZV8ubmF0aXZlX2hhbmRsZShpbXBsKSwgMCksIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgZ2l2ZW4gZGF0YS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzaXplX3Qgd3JpdGVfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRvcl9zZXJ2aWNlXy53cml0ZV9zb21lKGltcGwsIGJ1ZmZlcnMsIGVjKTsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3cml0ZS4gVGhlIGRhdGEgYmVpbmcgd3JpdHRlbiBtdXN0IGJlIHZhbGlkIGZvciB0aGUKLSAgLy8gbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3dyaXRlX3NvbWUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBkZXNjcmlwdG9yX3NlcnZpY2VfLmFzeW5jX3dyaXRlX3NvbWUoaW1wbCwgYnVmZmVycywgaGFuZGxlcik7Ci0gIH0KLQotICAvLyBSZWFkIHNvbWUgZGF0YS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzaXplX3QgcmVhZF9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0b3Jfc2VydmljZV8ucmVhZF9zb21lKGltcGwsIGJ1ZmZlcnMsIGVjKTsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWFkLiBUaGUgYnVmZmVyIGZvciB0aGUgZGF0YSBiZWluZyByZWNlaXZlZCBtdXN0IGJlCi0gIC8vIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVhZF9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBkZXNjcmlwdG9yX3NlcnZpY2VfLmFzeW5jX3JlYWRfc29tZShpbXBsLCBidWZmZXJzLCBoYW5kbGVyKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBGdW5jdGlvbiBwb2ludGVyIHR5cGUgZm9yIHN0b3JpbmcgYSBzZXJpYWwgcG9ydCBvcHRpb24uCi0gIHR5cGVkZWYgYXNpbzo6ZXJyb3JfY29kZSAoKnN0b3JlX2Z1bmN0aW9uX3R5cGUpKAotICAgICAgY29uc3Qgdm9pZCosIHRlcm1pb3MmLCBhc2lvOjplcnJvcl9jb2RlJik7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRlbXBsYXRlIHRvIHN0b3JlIGEgc2VyaWFsIHBvcnQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uPgotICBzdGF0aWMgYXNpbzo6ZXJyb3JfY29kZSBzdG9yZV9vcHRpb24oY29uc3Qgdm9pZCogb3B0aW9uLAotICAgICAgdGVybWlvcyYgc3RvcmFnZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgU2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uKj4ob3B0aW9uKS0+c3RvcmUoCi0gICAgICAgIHN0b3JhZ2UsIGVjKTsKLSAgfQotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBzZXQgYSBzZXJpYWwgcG9ydCBvcHRpb24uCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGRvX3NldF9vcHRpb24oCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBzdG9yZV9mdW5jdGlvbl90eXBlIHN0b3JlLAotICAgICAgY29uc3Qgdm9pZCogb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gRnVuY3Rpb24gcG9pbnRlciB0eXBlIGZvciBsb2FkaW5nIGEgc2VyaWFsIHBvcnQgb3B0aW9uLgotICB0eXBlZGVmIGFzaW86OmVycm9yX2NvZGUgKCpsb2FkX2Z1bmN0aW9uX3R5cGUpKAotICAgICAgdm9pZCosIGNvbnN0IHRlcm1pb3MmLCBhc2lvOjplcnJvcl9jb2RlJik7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRlbXBsYXRlIHRvIGxvYWQgYSBzZXJpYWwgcG9ydCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBHZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24+Ci0gIHN0YXRpYyBhc2lvOjplcnJvcl9jb2RlIGxvYWRfb3B0aW9uKHZvaWQqIG9wdGlvbiwKLSAgICAgIGNvbnN0IHRlcm1pb3MmIHN0b3JhZ2UsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEdldHRhYmxlU2VyaWFsUG9ydE9wdGlvbio+KG9wdGlvbiktPmxvYWQoc3RvcmFnZSwgZWMpOwotICB9Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBhIHNlcmlhbCBwb3J0IG9wdGlvbi4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgZG9fZ2V0X29wdGlvbigKLSAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGxvYWRfZnVuY3Rpb25fdHlwZSBsb2FkLAotICAgICAgdm9pZCogb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3Q7Ci0KLSAgLy8gVGhlIGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIGluaXRpYXRpbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCi0gIHJlYWN0aXZlX2Rlc2NyaXB0b3Jfc2VydmljZSBkZXNjcmlwdG9yX3NlcnZpY2VfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvcmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZS5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU0VSSUFMX1BPUlQpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9SRUFDVElWRV9TRVJJQUxfUE9SVF9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfYWNjZXB0X29wLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X2FjY2VwdF9vcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODdlMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfYWNjZXB0X29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLwotLy8gZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9hY2NlcHRfb3AuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX0FDQ0VQVF9PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX0FDQ0VQVF9PUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X2hvbGRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFNvY2tldCwgdHlwZW5hbWUgUHJvdG9jb2w+Ci1jbGFzcyByZWFjdGl2ZV9zb2NrZXRfYWNjZXB0X29wX2Jhc2UgOiBwdWJsaWMgcmVhY3Rvcl9vcAotewotcHVibGljOgotICByZWFjdGl2ZV9zb2NrZXRfYWNjZXB0X29wX2Jhc2Uoc29ja2V0X3R5cGUgc29ja2V0LAotICAgICAgc29ja2V0X29wczo6c3RhdGVfdHlwZSBzdGF0ZSwgU29ja2V0JiBwZWVyLCBjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wsCi0gICAgICB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQqIHBlZXJfZW5kcG9pbnQsIGZ1bmNfdHlwZSBjb21wbGV0ZV9mdW5jKQotICAgIDogcmVhY3Rvcl9vcCgmcmVhY3RpdmVfc29ja2V0X2FjY2VwdF9vcF9iYXNlOjpkb19wZXJmb3JtLCBjb21wbGV0ZV9mdW5jKSwKLSAgICAgIHNvY2tldF8oc29ja2V0KSwKLSAgICAgIHN0YXRlXyhzdGF0ZSksCi0gICAgICBwZWVyXyhwZWVyKSwKLSAgICAgIHByb3RvY29sXyhwcm90b2NvbCksCi0gICAgICBwZWVyX2VuZHBvaW50XyhwZWVyX2VuZHBvaW50KQotICB7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBkb19wZXJmb3JtKHJlYWN0b3Jfb3AqIGJhc2UpCi0gIHsKLSAgICByZWFjdGl2ZV9zb2NrZXRfYWNjZXB0X29wX2Jhc2UqIG8oCi0gICAgICAgIHN0YXRpY19jYXN0PHJlYWN0aXZlX3NvY2tldF9hY2NlcHRfb3BfYmFzZSo+KGJhc2UpKTsKLQotICAgIHN0ZDo6c2l6ZV90IGFkZHJsZW4gPSBvLT5wZWVyX2VuZHBvaW50XyA/IG8tPnBlZXJfZW5kcG9pbnRfLT5jYXBhY2l0eSgpIDogMDsKLSAgICBzb2NrZXRfdHlwZSBuZXdfc29ja2V0ID0gaW52YWxpZF9zb2NrZXQ7Ci0gICAgYm9vbCByZXN1bHQgPSBzb2NrZXRfb3BzOjpub25fYmxvY2tpbmdfYWNjZXB0KG8tPnNvY2tldF8sCi0gICAgICAgICAgby0+c3RhdGVfLCBvLT5wZWVyX2VuZHBvaW50XyA/IG8tPnBlZXJfZW5kcG9pbnRfLT5kYXRhKCkgOiAwLAotICAgICAgICAgIG8tPnBlZXJfZW5kcG9pbnRfID8gJmFkZHJsZW4gOiAwLCBvLT5lY18sIG5ld19zb2NrZXQpOwotCi0gICAgLy8gT24gc3VjY2VzcywgYXNzaWduIG5ldyBjb25uZWN0aW9uIHRvIHBlZXIgc29ja2V0IG9iamVjdC4KLSAgICBpZiAobmV3X3NvY2tldCAhPSBpbnZhbGlkX3NvY2tldCkKLSAgICB7Ci0gICAgICBzb2NrZXRfaG9sZGVyIG5ld19zb2NrZXRfaG9sZGVyKG5ld19zb2NrZXQpOwotICAgICAgaWYgKG8tPnBlZXJfZW5kcG9pbnRfKQotICAgICAgICBvLT5wZWVyX2VuZHBvaW50Xy0+cmVzaXplKGFkZHJsZW4pOwotICAgICAgaWYgKCFvLT5wZWVyXy5hc3NpZ24oby0+cHJvdG9jb2xfLCBuZXdfc29ja2V0LCBvLT5lY18pKQotICAgICAgICBuZXdfc29ja2V0X2hvbGRlci5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi1wcml2YXRlOgotICBzb2NrZXRfdHlwZSBzb2NrZXRfOwotICBzb2NrZXRfb3BzOjpzdGF0ZV90eXBlIHN0YXRlXzsKLSAgU29ja2V0JiBwZWVyXzsKLSAgUHJvdG9jb2wgcHJvdG9jb2xfOwotICB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQqIHBlZXJfZW5kcG9pbnRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFNvY2tldCwgdHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyByZWFjdGl2ZV9zb2NrZXRfYWNjZXB0X29wIDoKLSAgcHVibGljIHJlYWN0aXZlX3NvY2tldF9hY2NlcHRfb3BfYmFzZTxTb2NrZXQsIFByb3RvY29sPgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUihyZWFjdGl2ZV9zb2NrZXRfYWNjZXB0X29wKTsKLQotICByZWFjdGl2ZV9zb2NrZXRfYWNjZXB0X29wKHNvY2tldF90eXBlIHNvY2tldCwKLSAgICAgIHNvY2tldF9vcHM6OnN0YXRlX3R5cGUgc3RhdGUsIFNvY2tldCYgcGVlciwgY29uc3QgUHJvdG9jb2wmIHByb3RvY29sLAotICAgICAgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50KiBwZWVyX2VuZHBvaW50LCBIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogcmVhY3RpdmVfc29ja2V0X2FjY2VwdF9vcF9iYXNlPFNvY2tldCwgUHJvdG9jb2w+KHNvY2tldCwgc3RhdGUsIHBlZXIsCi0gICAgICAgIHByb3RvY29sLCBwZWVyX2VuZHBvaW50LCAmcmVhY3RpdmVfc29ja2V0X2FjY2VwdF9vcDo6ZG9fY29tcGxldGUpLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIC8qZWMqLywKLSAgICAgIHN0ZDo6c2l6ZV90IC8qYnl0ZXNfdHJhbnNmZXJyZWQqLykKLSAgewotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBoYW5kbGVyIG9iamVjdC4KLSAgICByZWFjdGl2ZV9zb2NrZXRfYWNjZXB0X29wKiBvKHN0YXRpY19jYXN0PHJlYWN0aXZlX3NvY2tldF9hY2NlcHRfb3AqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKG8tPmhhbmRsZXJfKSwgbywgbyB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBkZXRhaWw6OmJpbmRlcjE8SGFuZGxlciwgYXNpbzo6ZXJyb3JfY29kZT4KLSAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIG8tPmVjXyk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBIYW5kbGVyIGhhbmRsZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9SRUFDVElWRV9TT0NLRVRfQUNDRVBUX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfY29ubmVjdF9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9jb25uZWN0X29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5MTQ2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9jb25uZWN0X29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLwotLy8gZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9jb25uZWN0X29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9SRUFDVElWRV9TT0NLRVRfQ09OTkVDVF9PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX0NPTk5FQ1RfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3Jfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHJlYWN0aXZlX3NvY2tldF9jb25uZWN0X29wX2Jhc2UgOiBwdWJsaWMgcmVhY3Rvcl9vcAotewotcHVibGljOgotICByZWFjdGl2ZV9zb2NrZXRfY29ubmVjdF9vcF9iYXNlKHNvY2tldF90eXBlIHNvY2tldCwgZnVuY190eXBlIGNvbXBsZXRlX2Z1bmMpCi0gICAgOiByZWFjdG9yX29wKCZyZWFjdGl2ZV9zb2NrZXRfY29ubmVjdF9vcF9iYXNlOjpkb19wZXJmb3JtLCBjb21wbGV0ZV9mdW5jKSwKLSAgICAgIHNvY2tldF8oc29ja2V0KQotICB7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBkb19wZXJmb3JtKHJlYWN0b3Jfb3AqIGJhc2UpCi0gIHsKLSAgICByZWFjdGl2ZV9zb2NrZXRfY29ubmVjdF9vcF9iYXNlKiBvKAotICAgICAgICBzdGF0aWNfY2FzdDxyZWFjdGl2ZV9zb2NrZXRfY29ubmVjdF9vcF9iYXNlKj4oYmFzZSkpOwotCi0gICAgcmV0dXJuIHNvY2tldF9vcHM6Om5vbl9ibG9ja2luZ19jb25uZWN0KG8tPnNvY2tldF8sIG8tPmVjXyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgc29ja2V0X3R5cGUgc29ja2V0XzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotY2xhc3MgcmVhY3RpdmVfc29ja2V0X2Nvbm5lY3Rfb3AgOiBwdWJsaWMgcmVhY3RpdmVfc29ja2V0X2Nvbm5lY3Rfb3BfYmFzZQotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUihyZWFjdGl2ZV9zb2NrZXRfY29ubmVjdF9vcCk7Ci0KLSAgcmVhY3RpdmVfc29ja2V0X2Nvbm5lY3Rfb3Aoc29ja2V0X3R5cGUgc29ja2V0LCBIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogcmVhY3RpdmVfc29ja2V0X2Nvbm5lY3Rfb3BfYmFzZShzb2NrZXQsCi0gICAgICAgICZyZWFjdGl2ZV9zb2NrZXRfY29ubmVjdF9vcDo6ZG9fY29tcGxldGUpLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIC8qZWMqLywKLSAgICAgIHN0ZDo6c2l6ZV90IC8qYnl0ZXNfdHJhbnNmZXJyZWQqLykKLSAgewotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBoYW5kbGVyIG9iamVjdC4KLSAgICByZWFjdGl2ZV9zb2NrZXRfY29ubmVjdF9vcCogbwotICAgICAgKHN0YXRpY19jYXN0PHJlYWN0aXZlX3NvY2tldF9jb25uZWN0X29wKj4oYmFzZSkpOwotICAgIHB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihvLT5oYW5kbGVyXyksIG8sIG8gfTsKLQotICAgIEFTSU9fSEFORExFUl9DT01QTEVUSU9OKChvKSk7Ci0KLSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgaGFuZGxlciBzbyB0aGF0IHRoZSBtZW1vcnkgY2FuIGJlIGRlYWxsb2NhdGVkIGJlZm9yZQotICAgIC8vIHRoZSB1cGNhbGwgaXMgbWFkZS4gRXZlbiBpZiB3ZSdyZSBub3QgYWJvdXQgdG8gbWFrZSBhbiB1cGNhbGwsIGEKLSAgICAvLyBzdWItb2JqZWN0IG9mIHRoZSBoYW5kbGVyIG1heSBiZSB0aGUgdHJ1ZSBvd25lciBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKLSAgICAvLyB3aXRoIHRoZSBoYW5kbGVyLiBDb25zZXF1ZW50bHksIGEgbG9jYWwgY29weSBvZiB0aGUgaGFuZGxlciBpcyByZXF1aXJlZAotICAgIC8vIHRvIGVuc3VyZSB0aGF0IGFueSBvd25pbmcgc3ViLW9iamVjdCByZW1haW5zIHZhbGlkIHVudGlsIGFmdGVyIHdlIGhhdmUKLSAgICAvLyBkZWFsbG9jYXRlZCB0aGUgbWVtb3J5IGhlcmUuCi0gICAgZGV0YWlsOjpiaW5kZXIxPEhhbmRsZXIsIGFzaW86OmVycm9yX2NvZGU+Ci0gICAgICBoYW5kbGVyKG8tPmhhbmRsZXJfLCBvLT5lY18pOwotICAgIHAuaCA9IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIuaGFuZGxlcl8pOwotICAgIHAucmVzZXQoKTsKLQotICAgIC8vIE1ha2UgdGhlIHVwY2FsbCBpZiByZXF1aXJlZC4KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgZmVuY2VkX2Jsb2NrIGIoZmVuY2VkX2Jsb2NrOjpoYWxmKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKChoYW5kbGVyLmFyZzFfKSk7Ci0gICAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoYW5kbGVyLCBoYW5kbGVyKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0VORDsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgSGFuZGxlciBoYW5kbGVyXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX0NPTk5FQ1RfT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9yZWN2X29wLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3JlY3Zfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTFlOWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3JlY3Zfb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvcmVhY3RpdmVfc29ja2V0X3JlY3Zfb3AuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1JFQUNUSVZFX1NPQ0tFVF9SRUNWX09QX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9SRUFDVElWRV9TT0NLRVRfUkVDVl9PUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLWNsYXNzIHJlYWN0aXZlX3NvY2tldF9yZWN2X29wX2Jhc2UgOiBwdWJsaWMgcmVhY3Rvcl9vcAotewotcHVibGljOgotICByZWFjdGl2ZV9zb2NrZXRfcmVjdl9vcF9iYXNlKHNvY2tldF90eXBlIHNvY2tldCwKLSAgICAgIHNvY2tldF9vcHM6OnN0YXRlX3R5cGUgc3RhdGUsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBmdW5jX3R5cGUgY29tcGxldGVfZnVuYykKLSAgICA6IHJlYWN0b3Jfb3AoJnJlYWN0aXZlX3NvY2tldF9yZWN2X29wX2Jhc2U6OmRvX3BlcmZvcm0sIGNvbXBsZXRlX2Z1bmMpLAotICAgICAgc29ja2V0Xyhzb2NrZXQpLAotICAgICAgc3RhdGVfKHN0YXRlKSwKLSAgICAgIGJ1ZmZlcnNfKGJ1ZmZlcnMpLAotICAgICAgZmxhZ3NfKGZsYWdzKQotICB7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBkb19wZXJmb3JtKHJlYWN0b3Jfb3AqIGJhc2UpCi0gIHsKLSAgICByZWFjdGl2ZV9zb2NrZXRfcmVjdl9vcF9iYXNlKiBvKAotICAgICAgICBzdGF0aWNfY2FzdDxyZWFjdGl2ZV9zb2NrZXRfcmVjdl9vcF9iYXNlKj4oYmFzZSkpOwotCi0gICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6bXV0YWJsZV9idWZmZXIsCi0gICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4gYnVmcyhvLT5idWZmZXJzXyk7Ci0KLSAgICByZXR1cm4gc29ja2V0X29wczo6bm9uX2Jsb2NraW5nX3JlY3Yoby0+c29ja2V0XywKLSAgICAgICAgYnVmcy5idWZmZXJzKCksIGJ1ZnMuY291bnQoKSwgby0+ZmxhZ3NfLAotICAgICAgICAoby0+c3RhdGVfICYgc29ja2V0X29wczo6c3RyZWFtX29yaWVudGVkKSAhPSAwLAotICAgICAgICBvLT5lY18sIG8tPmJ5dGVzX3RyYW5zZmVycmVkXyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgc29ja2V0X3R5cGUgc29ja2V0XzsKLSAgc29ja2V0X29wczo6c3RhdGVfdHlwZSBzdGF0ZV87Ci0gIE11dGFibGVCdWZmZXJTZXF1ZW5jZSBidWZmZXJzXzsKLSAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3NfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIHJlYWN0aXZlX3NvY2tldF9yZWN2X29wIDoKLSAgcHVibGljIHJlYWN0aXZlX3NvY2tldF9yZWN2X29wX2Jhc2U8TXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUihyZWFjdGl2ZV9zb2NrZXRfcmVjdl9vcCk7Ci0KLSAgcmVhY3RpdmVfc29ja2V0X3JlY3Zfb3Aoc29ja2V0X3R5cGUgc29ja2V0LAotICAgICAgc29ja2V0X29wczo6c3RhdGVfdHlwZSBzdGF0ZSwgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiByZWFjdGl2ZV9zb2NrZXRfcmVjdl9vcF9iYXNlPE11dGFibGVCdWZmZXJTZXF1ZW5jZT4oc29ja2V0LCBzdGF0ZSwKLSAgICAgICAgYnVmZmVycywgZmxhZ3MsICZyZWFjdGl2ZV9zb2NrZXRfcmVjdl9vcDo6ZG9fY29tcGxldGUpLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIC8qZWMqLywKLSAgICAgIHN0ZDo6c2l6ZV90IC8qYnl0ZXNfdHJhbnNmZXJyZWQqLykKLSAgewotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBoYW5kbGVyIG9iamVjdC4KLSAgICByZWFjdGl2ZV9zb2NrZXRfcmVjdl9vcCogbyhzdGF0aWNfY2FzdDxyZWFjdGl2ZV9zb2NrZXRfcmVjdl9vcCo+KGJhc2UpKTsKLSAgICBwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2Yoby0+aGFuZGxlcl8pLCBvLCBvIH07Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ09NUExFVElPTigobykpOwotCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBkZWFsbG9jYXRlZCBiZWZvcmUKLSAgICAvLyB0aGUgdXBjYWxsIGlzIG1hZGUuIEV2ZW4gaWYgd2UncmUgbm90IGFib3V0IHRvIG1ha2UgYW4gdXBjYWxsLCBhCi0gICAgLy8gc3ViLW9iamVjdCBvZiB0aGUgaGFuZGxlciBtYXkgYmUgdGhlIHRydWUgb3duZXIgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkCi0gICAgLy8gd2l0aCB0aGUgaGFuZGxlci4gQ29uc2VxdWVudGx5LCBhIGxvY2FsIGNvcHkgb2YgdGhlIGhhbmRsZXIgaXMgcmVxdWlyZWQKLSAgICAvLyB0byBlbnN1cmUgdGhhdCBhbnkgb3duaW5nIHN1Yi1vYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlciB3ZSBoYXZlCi0gICAgLy8gZGVhbGxvY2F0ZWQgdGhlIG1lbW9yeSBoZXJlLgotICAgIGRldGFpbDo6YmluZGVyMjxIYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdD4KLSAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIG8tPmVjXywgby0+Ynl0ZXNfdHJhbnNmZXJyZWRfKTsKLSAgICBwLmggPSBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICBwLnJlc2V0KCk7Ci0KLSAgICAvLyBNYWtlIHRoZSB1cGNhbGwgaWYgcmVxdWlyZWQuCi0gICAgaWYgKG93bmVyKQotICAgIHsKLSAgICAgIGZlbmNlZF9ibG9jayBiKGZlbmNlZF9ibG9jazo6aGFsZik7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9CRUdJTigoaGFuZGxlci5hcmcxXywgaGFuZGxlci5hcmcyXykpOwotICAgICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoaGFuZGxlciwgaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9FTkQ7Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1JFQUNUSVZFX1NPQ0tFVF9SRUNWX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfcmVjdmZyb21fb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfcmVjdmZyb21fb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTIxMDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLwotLy8gZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9yZWN2ZnJvbV9vcC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1JFQUNUSVZFX1NPQ0tFVF9SRUNWRlJPTV9PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX1JFQ1ZGUk9NX09QX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdG9yX29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfb3BzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBFbmRwb2ludD4KLWNsYXNzIHJlYWN0aXZlX3NvY2tldF9yZWN2ZnJvbV9vcF9iYXNlIDogcHVibGljIHJlYWN0b3Jfb3AKLXsKLXB1YmxpYzoKLSAgcmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wX2Jhc2Uoc29ja2V0X3R5cGUgc29ja2V0LCBpbnQgcHJvdG9jb2xfdHlwZSwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgRW5kcG9pbnQmIGVuZHBvaW50LAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGZ1bmNfdHlwZSBjb21wbGV0ZV9mdW5jKQotICAgIDogcmVhY3Rvcl9vcCgmcmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wX2Jhc2U6OmRvX3BlcmZvcm0sIGNvbXBsZXRlX2Z1bmMpLAotICAgICAgc29ja2V0Xyhzb2NrZXQpLAotICAgICAgcHJvdG9jb2xfdHlwZV8ocHJvdG9jb2xfdHlwZSksCi0gICAgICBidWZmZXJzXyhidWZmZXJzKSwKLSAgICAgIHNlbmRlcl9lbmRwb2ludF8oZW5kcG9pbnQpLAotICAgICAgZmxhZ3NfKGZsYWdzKQotICB7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBkb19wZXJmb3JtKHJlYWN0b3Jfb3AqIGJhc2UpCi0gIHsKLSAgICByZWFjdGl2ZV9zb2NrZXRfcmVjdmZyb21fb3BfYmFzZSogbygKLSAgICAgICAgc3RhdGljX2Nhc3Q8cmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wX2Jhc2UqPihiYXNlKSk7Ci0KLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPiBidWZzKG8tPmJ1ZmZlcnNfKTsKLQotICAgIHN0ZDo6c2l6ZV90IGFkZHJfbGVuID0gby0+c2VuZGVyX2VuZHBvaW50Xy5jYXBhY2l0eSgpOwotICAgIGJvb2wgcmVzdWx0ID0gc29ja2V0X29wczo6bm9uX2Jsb2NraW5nX3JlY3Zmcm9tKG8tPnNvY2tldF8sCi0gICAgICAgIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksIG8tPmZsYWdzXywKLSAgICAgICAgby0+c2VuZGVyX2VuZHBvaW50Xy5kYXRhKCksICZhZGRyX2xlbiwKLSAgICAgICAgby0+ZWNfLCBvLT5ieXRlc190cmFuc2ZlcnJlZF8pOwotCi0gICAgaWYgKHJlc3VsdCAmJiAhby0+ZWNfKQotICAgICAgby0+c2VuZGVyX2VuZHBvaW50Xy5yZXNpemUoYWRkcl9sZW4pOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi1wcml2YXRlOgotICBzb2NrZXRfdHlwZSBzb2NrZXRfOwotICBpbnQgcHJvdG9jb2xfdHlwZV87Ci0gIE11dGFibGVCdWZmZXJTZXF1ZW5jZSBidWZmZXJzXzsKLSAgRW5kcG9pbnQmIHNlbmRlcl9lbmRwb2ludF87Ci0gIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEVuZHBvaW50LCB0eXBlbmFtZSBIYW5kbGVyPgotY2xhc3MgcmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wIDoKLSAgcHVibGljIHJlYWN0aXZlX3NvY2tldF9yZWN2ZnJvbV9vcF9iYXNlPE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgRW5kcG9pbnQ+Ci17Ci1wdWJsaWM6Ci0gIEFTSU9fREVGSU5FX0hBTkRMRVJfUFRSKHJlYWN0aXZlX3NvY2tldF9yZWN2ZnJvbV9vcCk7Ci0KLSAgcmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wKHNvY2tldF90eXBlIHNvY2tldCwgaW50IHByb3RvY29sX3R5cGUsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIEVuZHBvaW50JiBlbmRwb2ludCwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogcmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wX2Jhc2U8TXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCBFbmRwb2ludD4oCi0gICAgICAgIHNvY2tldCwgcHJvdG9jb2xfdHlwZSwgYnVmZmVycywgZW5kcG9pbnQsIGZsYWdzLAotICAgICAgICAmcmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wOjpkb19jb21wbGV0ZSksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgLyplYyovLAotICAgICAgc3RkOjpzaXplX3QgLypieXRlc190cmFuc2ZlcnJlZCovKQotICB7Ci0gICAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIGhhbmRsZXIgb2JqZWN0LgotICAgIHJlYWN0aXZlX3NvY2tldF9yZWN2ZnJvbV9vcCogbygKLSAgICAgICAgc3RhdGljX2Nhc3Q8cmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wKj4oYmFzZSkpOwotICAgIHB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihvLT5oYW5kbGVyXyksIG8sIG8gfTsKLQotICAgIEFTSU9fSEFORExFUl9DT01QTEVUSU9OKChvKSk7Ci0KLSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgaGFuZGxlciBzbyB0aGF0IHRoZSBtZW1vcnkgY2FuIGJlIGRlYWxsb2NhdGVkIGJlZm9yZQotICAgIC8vIHRoZSB1cGNhbGwgaXMgbWFkZS4gRXZlbiBpZiB3ZSdyZSBub3QgYWJvdXQgdG8gbWFrZSBhbiB1cGNhbGwsIGEKLSAgICAvLyBzdWItb2JqZWN0IG9mIHRoZSBoYW5kbGVyIG1heSBiZSB0aGUgdHJ1ZSBvd25lciBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKLSAgICAvLyB3aXRoIHRoZSBoYW5kbGVyLiBDb25zZXF1ZW50bHksIGEgbG9jYWwgY29weSBvZiB0aGUgaGFuZGxlciBpcyByZXF1aXJlZAotICAgIC8vIHRvIGVuc3VyZSB0aGF0IGFueSBvd25pbmcgc3ViLW9iamVjdCByZW1haW5zIHZhbGlkIHVudGlsIGFmdGVyIHdlIGhhdmUKLSAgICAvLyBkZWFsbG9jYXRlZCB0aGUgbWVtb3J5IGhlcmUuCi0gICAgZGV0YWlsOjpiaW5kZXIyPEhhbmRsZXIsIGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90PgotICAgICAgaGFuZGxlcihvLT5oYW5kbGVyXywgby0+ZWNfLCBvLT5ieXRlc190cmFuc2ZlcnJlZF8pOwotICAgIHAuaCA9IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIuaGFuZGxlcl8pOwotICAgIHAucmVzZXQoKTsKLQotICAgIC8vIE1ha2UgdGhlIHVwY2FsbCBpZiByZXF1aXJlZC4KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgZmVuY2VkX2Jsb2NrIGIoZmVuY2VkX2Jsb2NrOjpoYWxmKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKChoYW5kbGVyLmFyZzFfLCBoYW5kbGVyLmFyZzJfKSk7Ci0gICAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoYW5kbGVyLCBoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0VORDsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgSGFuZGxlciBoYW5kbGVyXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX1JFQ1ZGUk9NX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfcmVjdm1zZ19vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9yZWN2bXNnX29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjOWRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9yZWN2bXNnX29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9yZWN2bXNnX29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9SRUFDVElWRV9TT0NLRVRfUkVDVk1TR19PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX1JFQ1ZNU0dfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3Jfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vc29ja2V0X2Jhc2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci1jbGFzcyByZWFjdGl2ZV9zb2NrZXRfcmVjdm1zZ19vcF9iYXNlIDogcHVibGljIHJlYWN0b3Jfb3AKLXsKLXB1YmxpYzoKLSAgcmVhY3RpdmVfc29ja2V0X3JlY3Ztc2dfb3BfYmFzZShzb2NrZXRfdHlwZSBzb2NrZXQsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGluX2ZsYWdzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MmIG91dF9mbGFncywgZnVuY190eXBlIGNvbXBsZXRlX2Z1bmMpCi0gICAgOiByZWFjdG9yX29wKCZyZWFjdGl2ZV9zb2NrZXRfcmVjdm1zZ19vcF9iYXNlOjpkb19wZXJmb3JtLCBjb21wbGV0ZV9mdW5jKSwKLSAgICAgIHNvY2tldF8oc29ja2V0KSwKLSAgICAgIGJ1ZmZlcnNfKGJ1ZmZlcnMpLAotICAgICAgaW5fZmxhZ3NfKGluX2ZsYWdzKSwKLSAgICAgIG91dF9mbGFnc18ob3V0X2ZsYWdzKQotICB7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBkb19wZXJmb3JtKHJlYWN0b3Jfb3AqIGJhc2UpCi0gIHsKLSAgICByZWFjdGl2ZV9zb2NrZXRfcmVjdm1zZ19vcF9iYXNlKiBvKAotICAgICAgICBzdGF0aWNfY2FzdDxyZWFjdGl2ZV9zb2NrZXRfcmVjdm1zZ19vcF9iYXNlKj4oYmFzZSkpOwotCi0gICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6bXV0YWJsZV9idWZmZXIsCi0gICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4gYnVmcyhvLT5idWZmZXJzXyk7Ci0KLSAgICByZXR1cm4gc29ja2V0X29wczo6bm9uX2Jsb2NraW5nX3JlY3Ztc2coby0+c29ja2V0XywKLSAgICAgICAgYnVmcy5idWZmZXJzKCksIGJ1ZnMuY291bnQoKSwKLSAgICAgICAgby0+aW5fZmxhZ3NfLCBvLT5vdXRfZmxhZ3NfLAotICAgICAgICBvLT5lY18sIG8tPmJ5dGVzX3RyYW5zZmVycmVkXyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgc29ja2V0X3R5cGUgc29ja2V0XzsKLSAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlIGJ1ZmZlcnNfOwotICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBpbl9mbGFnc187Ci0gIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiBvdXRfZmxhZ3NfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIHJlYWN0aXZlX3NvY2tldF9yZWN2bXNnX29wIDoKLSAgcHVibGljIHJlYWN0aXZlX3NvY2tldF9yZWN2bXNnX29wX2Jhc2U8TXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUihyZWFjdGl2ZV9zb2NrZXRfcmVjdm1zZ19vcCk7Ci0KLSAgcmVhY3RpdmVfc29ja2V0X3JlY3Ztc2dfb3Aoc29ja2V0X3R5cGUgc29ja2V0LAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBpbl9mbGFncywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiBvdXRfZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiByZWFjdGl2ZV9zb2NrZXRfcmVjdm1zZ19vcF9iYXNlPE11dGFibGVCdWZmZXJTZXF1ZW5jZT4oc29ja2V0LCBidWZmZXJzLAotICAgICAgICBpbl9mbGFncywgb3V0X2ZsYWdzLCAmcmVhY3RpdmVfc29ja2V0X3JlY3Ztc2dfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKGhhbmRsZXIpKQotICB7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBkb19jb21wbGV0ZShpb19zZXJ2aWNlX2ltcGwqIG93bmVyLCBvcGVyYXRpb24qIGJhc2UsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiAvKmVjKi8sCi0gICAgICBzdGQ6OnNpemVfdCAvKmJ5dGVzX3RyYW5zZmVycmVkKi8pCi0gIHsKLSAgICAvLyBUYWtlIG93bmVyc2hpcCBvZiB0aGUgaGFuZGxlciBvYmplY3QuCi0gICAgcmVhY3RpdmVfc29ja2V0X3JlY3Ztc2dfb3AqIG8oCi0gICAgICAgIHN0YXRpY19jYXN0PHJlYWN0aXZlX3NvY2tldF9yZWN2bXNnX29wKj4oYmFzZSkpOwotICAgIHB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihvLT5oYW5kbGVyXyksIG8sIG8gfTsKLQotICAgIEFTSU9fSEFORExFUl9DT01QTEVUSU9OKChvKSk7Ci0KLSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgaGFuZGxlciBzbyB0aGF0IHRoZSBtZW1vcnkgY2FuIGJlIGRlYWxsb2NhdGVkIGJlZm9yZQotICAgIC8vIHRoZSB1cGNhbGwgaXMgbWFkZS4gRXZlbiBpZiB3ZSdyZSBub3QgYWJvdXQgdG8gbWFrZSBhbiB1cGNhbGwsIGEKLSAgICAvLyBzdWItb2JqZWN0IG9mIHRoZSBoYW5kbGVyIG1heSBiZSB0aGUgdHJ1ZSBvd25lciBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKLSAgICAvLyB3aXRoIHRoZSBoYW5kbGVyLiBDb25zZXF1ZW50bHksIGEgbG9jYWwgY29weSBvZiB0aGUgaGFuZGxlciBpcyByZXF1aXJlZAotICAgIC8vIHRvIGVuc3VyZSB0aGF0IGFueSBvd25pbmcgc3ViLW9iamVjdCByZW1haW5zIHZhbGlkIHVudGlsIGFmdGVyIHdlIGhhdmUKLSAgICAvLyBkZWFsbG9jYXRlZCB0aGUgbWVtb3J5IGhlcmUuCi0gICAgZGV0YWlsOjpiaW5kZXIyPEhhbmRsZXIsIGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90PgotICAgICAgaGFuZGxlcihvLT5oYW5kbGVyXywgby0+ZWNfLCBvLT5ieXRlc190cmFuc2ZlcnJlZF8pOwotICAgIHAuaCA9IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIuaGFuZGxlcl8pOwotICAgIHAucmVzZXQoKTsKLQotICAgIC8vIE1ha2UgdGhlIHVwY2FsbCBpZiByZXF1aXJlZC4KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgZmVuY2VkX2Jsb2NrIGIoZmVuY2VkX2Jsb2NrOjpoYWxmKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKChoYW5kbGVyLmFyZzFfLCBoYW5kbGVyLmFyZzJfKSk7Ci0gICAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoYW5kbGVyLCBoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0VORDsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgSGFuZGxlciBoYW5kbGVyXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX1JFQ1ZNU0dfT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZW5kX29wLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlbmRfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBiNjI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlbmRfb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlbmRfb3AuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1JFQUNUSVZFX1NPQ0tFVF9TRU5EX09QX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9SRUFDVElWRV9TT0NLRVRfU0VORF9PUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci1jbGFzcyByZWFjdGl2ZV9zb2NrZXRfc2VuZF9vcF9iYXNlIDogcHVibGljIHJlYWN0b3Jfb3AKLXsKLXB1YmxpYzoKLSAgcmVhY3RpdmVfc29ja2V0X3NlbmRfb3BfYmFzZShzb2NrZXRfdHlwZSBzb2NrZXQsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGZ1bmNfdHlwZSBjb21wbGV0ZV9mdW5jKQotICAgIDogcmVhY3Rvcl9vcCgmcmVhY3RpdmVfc29ja2V0X3NlbmRfb3BfYmFzZTo6ZG9fcGVyZm9ybSwgY29tcGxldGVfZnVuYyksCi0gICAgICBzb2NrZXRfKHNvY2tldCksCi0gICAgICBidWZmZXJzXyhidWZmZXJzKSwKLSAgICAgIGZsYWdzXyhmbGFncykKLSAgewotICB9Ci0KLSAgc3RhdGljIGJvb2wgZG9fcGVyZm9ybShyZWFjdG9yX29wKiBiYXNlKQotICB7Ci0gICAgcmVhY3RpdmVfc29ja2V0X3NlbmRfb3BfYmFzZSogbygKLSAgICAgICAgc3RhdGljX2Nhc3Q8cmVhY3RpdmVfc29ja2V0X3NlbmRfb3BfYmFzZSo+KGJhc2UpKTsKLQotICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86OmNvbnN0X2J1ZmZlciwKLSAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZT4gYnVmcyhvLT5idWZmZXJzXyk7Ci0KLSAgICByZXR1cm4gc29ja2V0X29wczo6bm9uX2Jsb2NraW5nX3NlbmQoby0+c29ja2V0XywKLSAgICAgICAgICBidWZzLmJ1ZmZlcnMoKSwgYnVmcy5jb3VudCgpLCBvLT5mbGFnc18sCi0gICAgICAgICAgby0+ZWNfLCBvLT5ieXRlc190cmFuc2ZlcnJlZF8pOwotICB9Ci0KLXByaXZhdGU6Ci0gIHNvY2tldF90eXBlIHNvY2tldF87Ci0gIENvbnN0QnVmZmVyU2VxdWVuY2UgYnVmZmVyc187Ci0gIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotY2xhc3MgcmVhY3RpdmVfc29ja2V0X3NlbmRfb3AgOgotICBwdWJsaWMgcmVhY3RpdmVfc29ja2V0X3NlbmRfb3BfYmFzZTxDb25zdEJ1ZmZlclNlcXVlbmNlPgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUihyZWFjdGl2ZV9zb2NrZXRfc2VuZF9vcCk7Ci0KLSAgcmVhY3RpdmVfc29ja2V0X3NlbmRfb3Aoc29ja2V0X3R5cGUgc29ja2V0LAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogcmVhY3RpdmVfc29ja2V0X3NlbmRfb3BfYmFzZTxDb25zdEJ1ZmZlclNlcXVlbmNlPihzb2NrZXQsCi0gICAgICAgIGJ1ZmZlcnMsIGZsYWdzLCAmcmVhY3RpdmVfc29ja2V0X3NlbmRfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKGhhbmRsZXIpKQotICB7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBkb19jb21wbGV0ZShpb19zZXJ2aWNlX2ltcGwqIG93bmVyLCBvcGVyYXRpb24qIGJhc2UsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiAvKmVjKi8sCi0gICAgICBzdGQ6OnNpemVfdCAvKmJ5dGVzX3RyYW5zZmVycmVkKi8pCi0gIHsKLSAgICAvLyBUYWtlIG93bmVyc2hpcCBvZiB0aGUgaGFuZGxlciBvYmplY3QuCi0gICAgcmVhY3RpdmVfc29ja2V0X3NlbmRfb3AqIG8oc3RhdGljX2Nhc3Q8cmVhY3RpdmVfc29ja2V0X3NlbmRfb3AqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKG8tPmhhbmRsZXJfKSwgbywgbyB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBkZXRhaWw6OmJpbmRlcjI8SGFuZGxlciwgYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3Q+Ci0gICAgICBoYW5kbGVyKG8tPmhhbmRsZXJfLCBvLT5lY18sIG8tPmJ5dGVzX3RyYW5zZmVycmVkXyk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sIGhhbmRsZXIuYXJnMl8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBIYW5kbGVyIGhhbmRsZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9SRUFDVElWRV9TT0NLRVRfU0VORF9PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlbmR0b19vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZW5kdG9fb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGY3ZmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlbmR0b19vcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VuZHRvX29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1JFQUNUSVZFX1NPQ0tFVF9TRU5EVE9fT1BfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1JFQUNUSVZFX1NPQ0tFVF9TRU5EVE9fT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3Jfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBFbmRwb2ludD4KLWNsYXNzIHJlYWN0aXZlX3NvY2tldF9zZW5kdG9fb3BfYmFzZSA6IHB1YmxpYyByZWFjdG9yX29wCi17Ci1wdWJsaWM6Ci0gIHJlYWN0aXZlX3NvY2tldF9zZW5kdG9fb3BfYmFzZShzb2NrZXRfdHlwZSBzb2NrZXQsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBjb25zdCBFbmRwb2ludCYgZW5kcG9pbnQsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgZnVuY190eXBlIGNvbXBsZXRlX2Z1bmMpCi0gICAgOiByZWFjdG9yX29wKCZyZWFjdGl2ZV9zb2NrZXRfc2VuZHRvX29wX2Jhc2U6OmRvX3BlcmZvcm0sIGNvbXBsZXRlX2Z1bmMpLAotICAgICAgc29ja2V0Xyhzb2NrZXQpLAotICAgICAgYnVmZmVyc18oYnVmZmVycyksCi0gICAgICBkZXN0aW5hdGlvbl8oZW5kcG9pbnQpLAotICAgICAgZmxhZ3NfKGZsYWdzKQotICB7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBkb19wZXJmb3JtKHJlYWN0b3Jfb3AqIGJhc2UpCi0gIHsKLSAgICByZWFjdGl2ZV9zb2NrZXRfc2VuZHRvX29wX2Jhc2UqIG8oCi0gICAgICAgIHN0YXRpY19jYXN0PHJlYWN0aXZlX3NvY2tldF9zZW5kdG9fb3BfYmFzZSo+KGJhc2UpKTsKLQotICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86OmNvbnN0X2J1ZmZlciwKLSAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZT4gYnVmcyhvLT5idWZmZXJzXyk7Ci0KLSAgICByZXR1cm4gc29ja2V0X29wczo6bm9uX2Jsb2NraW5nX3NlbmR0byhvLT5zb2NrZXRfLAotICAgICAgICAgIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksIG8tPmZsYWdzXywKLSAgICAgICAgICBvLT5kZXN0aW5hdGlvbl8uZGF0YSgpLCBvLT5kZXN0aW5hdGlvbl8uc2l6ZSgpLAotICAgICAgICAgIG8tPmVjXywgby0+Ynl0ZXNfdHJhbnNmZXJyZWRfKTsKLSAgfQotCi1wcml2YXRlOgotICBzb2NrZXRfdHlwZSBzb2NrZXRfOwotICBDb25zdEJ1ZmZlclNlcXVlbmNlIGJ1ZmZlcnNfOwotICBFbmRwb2ludCBkZXN0aW5hdGlvbl87Ci0gIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBFbmRwb2ludCwgdHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIHJlYWN0aXZlX3NvY2tldF9zZW5kdG9fb3AgOgotICBwdWJsaWMgcmVhY3RpdmVfc29ja2V0X3NlbmR0b19vcF9iYXNlPENvbnN0QnVmZmVyU2VxdWVuY2UsIEVuZHBvaW50PgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUihyZWFjdGl2ZV9zb2NrZXRfc2VuZHRvX29wKTsKLQotICByZWFjdGl2ZV9zb2NrZXRfc2VuZHRvX29wKHNvY2tldF90eXBlIHNvY2tldCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGNvbnN0IEVuZHBvaW50JiBlbmRwb2ludCwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogcmVhY3RpdmVfc29ja2V0X3NlbmR0b19vcF9iYXNlPENvbnN0QnVmZmVyU2VxdWVuY2UsIEVuZHBvaW50Pihzb2NrZXQsCi0gICAgICAgIGJ1ZmZlcnMsIGVuZHBvaW50LCBmbGFncywgJnJlYWN0aXZlX3NvY2tldF9zZW5kdG9fb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKGhhbmRsZXIpKQotICB7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBkb19jb21wbGV0ZShpb19zZXJ2aWNlX2ltcGwqIG93bmVyLCBvcGVyYXRpb24qIGJhc2UsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiAvKmVjKi8sCi0gICAgICBzdGQ6OnNpemVfdCAvKmJ5dGVzX3RyYW5zZmVycmVkKi8pCi0gIHsKLSAgICAvLyBUYWtlIG93bmVyc2hpcCBvZiB0aGUgaGFuZGxlciBvYmplY3QuCi0gICAgcmVhY3RpdmVfc29ja2V0X3NlbmR0b19vcCogbyhzdGF0aWNfY2FzdDxyZWFjdGl2ZV9zb2NrZXRfc2VuZHRvX29wKj4oYmFzZSkpOwotICAgIHB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihvLT5oYW5kbGVyXyksIG8sIG8gfTsKLQotICAgIEFTSU9fSEFORExFUl9DT01QTEVUSU9OKChvKSk7Ci0KLSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgaGFuZGxlciBzbyB0aGF0IHRoZSBtZW1vcnkgY2FuIGJlIGRlYWxsb2NhdGVkIGJlZm9yZQotICAgIC8vIHRoZSB1cGNhbGwgaXMgbWFkZS4gRXZlbiBpZiB3ZSdyZSBub3QgYWJvdXQgdG8gbWFrZSBhbiB1cGNhbGwsIGEKLSAgICAvLyBzdWItb2JqZWN0IG9mIHRoZSBoYW5kbGVyIG1heSBiZSB0aGUgdHJ1ZSBvd25lciBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKLSAgICAvLyB3aXRoIHRoZSBoYW5kbGVyLiBDb25zZXF1ZW50bHksIGEgbG9jYWwgY29weSBvZiB0aGUgaGFuZGxlciBpcyByZXF1aXJlZAotICAgIC8vIHRvIGVuc3VyZSB0aGF0IGFueSBvd25pbmcgc3ViLW9iamVjdCByZW1haW5zIHZhbGlkIHVudGlsIGFmdGVyIHdlIGhhdmUKLSAgICAvLyBkZWFsbG9jYXRlZCB0aGUgbWVtb3J5IGhlcmUuCi0gICAgZGV0YWlsOjpiaW5kZXIyPEhhbmRsZXIsIGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90PgotICAgICAgaGFuZGxlcihvLT5oYW5kbGVyXywgby0+ZWNfLCBvLT5ieXRlc190cmFuc2ZlcnJlZF8pOwotICAgIHAuaCA9IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIuaGFuZGxlcl8pOwotICAgIHAucmVzZXQoKTsKLQotICAgIC8vIE1ha2UgdGhlIHVwY2FsbCBpZiByZXF1aXJlZC4KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgZmVuY2VkX2Jsb2NrIGIoZmVuY2VkX2Jsb2NrOjpoYWxmKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKChoYW5kbGVyLmFyZzFfLCBoYW5kbGVyLmFyZzJfKSk7Ci0gICAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoYW5kbGVyLCBoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0VORDsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgSGFuZGxlciBoYW5kbGVyXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX1NFTkRUT19PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWZiNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1JFQUNUSVZFX1NPQ0tFVF9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2luY2x1ZGUgImFzaW8vYnVmZmVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc29ja2V0X2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdGl2ZV9udWxsX2J1ZmZlcnNfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9hY2NlcHRfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9jb25uZWN0X29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfcmVjdmZyb21fb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZW5kdG9fb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3Jfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9ob2xkZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotY2xhc3MgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2UgOgotICBwdWJsaWMgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZQotewotcHVibGljOgotICAvLyBUaGUgcHJvdG9jb2wgdHlwZS4KLSAgdHlwZWRlZiBQcm90b2NvbCBwcm90b2NvbF90eXBlOwotCi0gIC8vIFRoZSBlbmRwb2ludCB0eXBlLgotICB0eXBlZGVmIHR5cGVuYW1lIFByb3RvY29sOjplbmRwb2ludCBlbmRwb2ludF90eXBlOwotCi0gIC8vIFRoZSBuYXRpdmUgdHlwZSBvZiBhIHNvY2tldC4KLSAgdHlwZWRlZiBzb2NrZXRfdHlwZSBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgLy8gVGhlIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgdGhlIHNvY2tldC4KLSAgc3RydWN0IGltcGxlbWVudGF0aW9uX3R5cGUgOgotICAgIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2U6OmJhc2VfaW1wbGVtZW50YXRpb25fdHlwZQotICB7Ci0gICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICBpbXBsZW1lbnRhdGlvbl90eXBlKCkKLSAgICAgIDogcHJvdG9jb2xfKGVuZHBvaW50X3R5cGUoKS5wcm90b2NvbCgpKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBUaGUgcHJvdG9jb2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2NrZXQuCi0gICAgcHJvdG9jb2xfdHlwZSBwcm90b2NvbF87Ci0gIH07Ci0KLSAgLy8gQ29uc3RydWN0b3IuCi0gIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlKGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vIE1vdmUtY29uc3RydWN0IGEgbmV3IHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHRoaXMtPmJhc2VfbW92ZV9jb25zdHJ1Y3QoaW1wbCwgb3RoZXJfaW1wbCk7Ci0KLSAgICBpbXBsLnByb3RvY29sXyA9IG90aGVyX2ltcGwucHJvdG9jb2xfOwotICAgIG90aGVyX2ltcGwucHJvdG9jb2xfID0gZW5kcG9pbnRfdHlwZSgpLnByb3RvY29sKCk7Ci0gIH0KLQotICAvLyBNb3ZlLWFzc2lnbiBmcm9tIGFub3RoZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlJiBvdGhlcl9zZXJ2aWNlLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHRoaXMtPmJhc2VfbW92ZV9hc3NpZ24oaW1wbCwgb3RoZXJfc2VydmljZSwgb3RoZXJfaW1wbCk7Ci0KLSAgICBpbXBsLnByb3RvY29sXyA9IG90aGVyX2ltcGwucHJvdG9jb2xfOwotICAgIG90aGVyX2ltcGwucHJvdG9jb2xfID0gZW5kcG9pbnRfdHlwZSgpLnByb3RvY29sKCk7Ci0gIH0KLQotICAvLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyBzb2NrZXQgaW1wbGVtZW50YXRpb24gZnJvbSBhbm90aGVyIHByb3RvY29sIHR5cGUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbDE+Ci0gIHZvaWQgY29udmVydGluZ19tb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgdHlwZW5hbWUgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2U8Ci0gICAgICAgIFByb3RvY29sMT46OmltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi0gIHsKLSAgICB0aGlzLT5iYXNlX21vdmVfY29uc3RydWN0KGltcGwsIG90aGVyX2ltcGwpOwotCi0gICAgaW1wbC5wcm90b2NvbF8gPSBwcm90b2NvbF90eXBlKG90aGVyX2ltcGwucHJvdG9jb2xfKTsKLSAgICBvdGhlcl9pbXBsLnByb3RvY29sXyA9IHR5cGVuYW1lIFByb3RvY29sMTo6ZW5kcG9pbnQoKS5wcm90b2NvbCgpOwotICB9Ci0KLSAgLy8gT3BlbiBhIG5ldyBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgb3BlbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgaWYgKCFkb19vcGVuKGltcGwsIHByb3RvY29sLmZhbWlseSgpLAotICAgICAgICAgIHByb3RvY29sLnR5cGUoKSwgcHJvdG9jb2wucHJvdG9jb2woKSwgZWMpKQotICAgICAgaW1wbC5wcm90b2NvbF8gPSBwcm90b2NvbDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBBc3NpZ24gYSBuYXRpdmUgc29ja2V0IHRvIGEgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX3NvY2tldCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgaWYgKCFkb19hc3NpZ24oaW1wbCwgcHJvdG9jb2wudHlwZSgpLCBuYXRpdmVfc29ja2V0LCBlYykpCi0gICAgICBpbXBsLnByb3RvY29sXyA9IHByb3RvY29sOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIEdldCB0aGUgbmF0aXZlIHNvY2tldCByZXByZXNlbnRhdGlvbi4KLSAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBpbXBsLnNvY2tldF87Ci0gIH0KLQotICAvLyBCaW5kIHRoZSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhbCBlbmRwb2ludC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBiaW5kKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBzb2NrZXRfb3BzOjpiaW5kKGltcGwuc29ja2V0XywgZW5kcG9pbnQuZGF0YSgpLCBlbmRwb2ludC5zaXplKCksIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBTZXQgYSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIHNldF9vcHRpb24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE9wdGlvbiYgb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHNvY2tldF9vcHM6OnNldHNvY2tvcHQoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywKLSAgICAgICAgb3B0aW9uLmxldmVsKGltcGwucHJvdG9jb2xfKSwgb3B0aW9uLm5hbWUoaW1wbC5wcm90b2NvbF8pLAotICAgICAgICBvcHRpb24uZGF0YShpbXBsLnByb3RvY29sXyksIG9wdGlvbi5zaXplKGltcGwucHJvdG9jb2xfKSwgZWMpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFNldCBhIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgZ2V0X29wdGlvbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgT3B0aW9uJiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgc3RkOjpzaXplX3Qgc2l6ZSA9IG9wdGlvbi5zaXplKGltcGwucHJvdG9jb2xfKTsKLSAgICBzb2NrZXRfb3BzOjpnZXRzb2Nrb3B0KGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sCi0gICAgICAgIG9wdGlvbi5sZXZlbChpbXBsLnByb3RvY29sXyksIG9wdGlvbi5uYW1lKGltcGwucHJvdG9jb2xfKSwKLSAgICAgICAgb3B0aW9uLmRhdGEoaW1wbC5wcm90b2NvbF8pLCAmc2l6ZSwgZWMpOwotICAgIGlmICghZWMpCi0gICAgICBvcHRpb24ucmVzaXplKGltcGwucHJvdG9jb2xfLCBzaXplKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGxvY2FsIGVuZHBvaW50LgotICBlbmRwb2ludF90eXBlIGxvY2FsX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIGVuZHBvaW50X3R5cGUgZW5kcG9pbnQ7Ci0gICAgc3RkOjpzaXplX3QgYWRkcl9sZW4gPSBlbmRwb2ludC5jYXBhY2l0eSgpOwotICAgIGlmIChzb2NrZXRfb3BzOjpnZXRzb2NrbmFtZShpbXBsLnNvY2tldF8sIGVuZHBvaW50LmRhdGEoKSwgJmFkZHJfbGVuLCBlYykpCi0gICAgICByZXR1cm4gZW5kcG9pbnRfdHlwZSgpOwotICAgIGVuZHBvaW50LnJlc2l6ZShhZGRyX2xlbik7Ci0gICAgcmV0dXJuIGVuZHBvaW50OwotICB9Ci0KLSAgLy8gR2V0IHRoZSByZW1vdGUgZW5kcG9pbnQuCi0gIGVuZHBvaW50X3R5cGUgcmVtb3RlX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIGVuZHBvaW50X3R5cGUgZW5kcG9pbnQ7Ci0gICAgc3RkOjpzaXplX3QgYWRkcl9sZW4gPSBlbmRwb2ludC5jYXBhY2l0eSgpOwotICAgIGlmIChzb2NrZXRfb3BzOjpnZXRwZWVybmFtZShpbXBsLnNvY2tldF8sCi0gICAgICAgICAgZW5kcG9pbnQuZGF0YSgpLCAmYWRkcl9sZW4sIGZhbHNlLCBlYykpCi0gICAgICByZXR1cm4gZW5kcG9pbnRfdHlwZSgpOwotICAgIGVuZHBvaW50LnJlc2l6ZShhZGRyX2xlbik7Ci0gICAgcmV0dXJuIGVuZHBvaW50OwotICB9Ci0KLSAgLy8gU2VuZCBhIGRhdGFncmFtIHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcwotICAvLyBzZW50LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc2l6ZV90IHNlbmRfdG8oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIGRlc3RpbmF0aW9uLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6Y29uc3RfYnVmZmVyLAotICAgICAgICBDb25zdEJ1ZmZlclNlcXVlbmNlPiBidWZzKGJ1ZmZlcnMpOwotCi0gICAgcmV0dXJuIHNvY2tldF9vcHM6OnN5bmNfc2VuZHRvKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sCi0gICAgICAgIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksIGZsYWdzLAotICAgICAgICBkZXN0aW5hdGlvbi5kYXRhKCksIGRlc3RpbmF0aW9uLnNpemUoKSwgZWMpOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCBkYXRhIGNhbiBiZSBzZW50IHdpdGhvdXQgYmxvY2tpbmcuCi0gIHNpemVfdCBzZW5kX3RvKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGNvbnN0IG51bGxfYnVmZmVycyYsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIC8vIFdhaXQgZm9yIHNvY2tldCB0byBiZWNvbWUgcmVhZHkuCi0gICAgc29ja2V0X29wczo6cG9sbF93cml0ZShpbXBsLnNvY2tldF8sIGltcGwuc3RhdGVfLCBlYyk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBzZW5kLiBUaGUgZGF0YSBiZWluZyBzZW50IG11c3QgYmUgdmFsaWQgZm9yIHRoZQotICAvLyBsaWZldGltZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfc2VuZF90byhpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIGRlc3RpbmF0aW9uLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBib29sIGlzX2NvbnRpbnVhdGlvbiA9Ci0gICAgICBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oaGFuZGxlcik7Ci0KLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgcmVhY3RpdmVfc29ja2V0X3NlbmR0b19vcDxDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgICAgICBlbmRwb2ludF90eXBlLCBIYW5kbGVyPiBvcDsKLSAgICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplb2Yob3ApLCBoYW5kbGVyKSwgMCB9OwotICAgIHAucCA9IG5ldyAocC52KSBvcChpbXBsLnNvY2tldF8sIGJ1ZmZlcnMsIGRlc3RpbmF0aW9uLCBmbGFncywgaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgInNvY2tldCIsICZpbXBsLCAiYXN5bmNfc2VuZF90byIpKTsKLQotICAgIHN0YXJ0X29wKGltcGwsIHJlYWN0b3I6OndyaXRlX29wLCBwLnAsIGlzX2NvbnRpbnVhdGlvbiwgdHJ1ZSwgZmFsc2UpOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd2FpdCB1bnRpbCBkYXRhIGNhbiBiZSBzZW50IHdpdGhvdXQgYmxvY2tpbmcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3NlbmRfdG8oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgY29uc3QgbnVsbF9idWZmZXJzJiwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGJvb2wgaXNfY29udGludWF0aW9uID0KLSAgICAgIGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbihoYW5kbGVyKTsKLQotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiByZWFjdGl2ZV9udWxsX2J1ZmZlcnNfb3A8SGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgInNvY2tldCIsCi0gICAgICAgICAgJmltcGwsICJhc3luY19zZW5kX3RvKG51bGxfYnVmZmVycykiKSk7Ci0KLSAgICBzdGFydF9vcChpbXBsLCByZWFjdG9yOjp3cml0ZV9vcCwgcC5wLCBpc19jb250aW51YXRpb24sIGZhbHNlLCBmYWxzZSk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotCi0gIC8vIFJlY2VpdmUgYSBkYXRhZ3JhbSB3aXRoIHRoZSBlbmRwb2ludCBvZiB0aGUgc2VuZGVyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgLy8gYnl0ZXMgcmVjZWl2ZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHNpemVfdCByZWNlaXZlX2Zyb20oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGVuZHBvaW50X3R5cGUmIHNlbmRlcl9lbmRwb2ludCwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86Om11dGFibGVfYnVmZmVyLAotICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+IGJ1ZnMoYnVmZmVycyk7Ci0KLSAgICBzdGQ6OnNpemVfdCBhZGRyX2xlbiA9IHNlbmRlcl9lbmRwb2ludC5jYXBhY2l0eSgpOwotICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3JlY3ZkID0gc29ja2V0X29wczo6c3luY19yZWN2ZnJvbSgKLSAgICAgICAgaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywgYnVmcy5idWZmZXJzKCksIGJ1ZnMuY291bnQoKSwKLSAgICAgICAgZmxhZ3MsIHNlbmRlcl9lbmRwb2ludC5kYXRhKCksICZhZGRyX2xlbiwgZWMpOwotCi0gICAgaWYgKCFlYykKLSAgICAgIHNlbmRlcl9lbmRwb2ludC5yZXNpemUoYWRkcl9sZW4pOwotCi0gICAgcmV0dXJuIGJ5dGVzX3JlY3ZkOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCBkYXRhIGNhbiBiZSByZWNlaXZlZCB3aXRob3V0IGJsb2NraW5nLgotICBzaXplX3QgcmVjZWl2ZV9mcm9tKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGNvbnN0IG51bGxfYnVmZmVycyYsCi0gICAgICBlbmRwb2ludF90eXBlJiBzZW5kZXJfZW5kcG9pbnQsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICAvLyBXYWl0IGZvciBzb2NrZXQgdG8gYmVjb21lIHJlYWR5LgotICAgIHNvY2tldF9vcHM6OnBvbGxfcmVhZChpbXBsLnNvY2tldF8sIGltcGwuc3RhdGVfLCBlYyk7Ci0KLSAgICAvLyBSZXNldCBlbmRwb2ludCBzaW5jZSBpdCBjYW4gYmUgZ2l2ZW4gbm8gc2Vuc2libGUgdmFsdWUgYXQgdGhpcyB0aW1lLgotICAgIHNlbmRlcl9lbmRwb2ludCA9IGVuZHBvaW50X3R5cGUoKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUuIFRoZSBidWZmZXIgZm9yIHRoZSBkYXRhIGJlaW5nIHJlY2VpdmVkIGFuZAotICAvLyB0aGUgc2VuZGVyX2VuZHBvaW50IG9iamVjdCBtdXN0IGJvdGggYmUgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUKLSAgLy8gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19yZWNlaXZlX2Zyb20oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgZW5kcG9pbnRfdHlwZSYgc2VuZGVyX2VuZHBvaW50LAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBib29sIGlzX2NvbnRpbnVhdGlvbiA9Ci0gICAgICBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oaGFuZGxlcik7Ci0KLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgcmVhY3RpdmVfc29ja2V0X3JlY3Zmcm9tX29wPE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICAgICAgZW5kcG9pbnRfdHlwZSwgSGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBpbnQgcHJvdG9jb2wgPSBpbXBsLnByb3RvY29sXy50eXBlKCk7Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGltcGwuc29ja2V0XywgcHJvdG9jb2wsCi0gICAgICAgIGJ1ZmZlcnMsIHNlbmRlcl9lbmRwb2ludCwgZmxhZ3MsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLAotICAgICAgICAgICZpbXBsLCAiYXN5bmNfcmVjZWl2ZV9mcm9tIikpOwotCi0gICAgc3RhcnRfb3AoaW1wbCwKLSAgICAgICAgKGZsYWdzICYgc29ja2V0X2Jhc2U6Om1lc3NhZ2Vfb3V0X29mX2JhbmQpCi0gICAgICAgICAgPyByZWFjdG9yOjpleGNlcHRfb3AgOiByZWFjdG9yOjpyZWFkX29wLAotICAgICAgICBwLnAsIGlzX2NvbnRpbnVhdGlvbiwgdHJ1ZSwgZmFsc2UpOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIGRhdGEgY2FuIGJlIHJlY2VpdmVkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3JlY2VpdmVfZnJvbShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgbnVsbF9idWZmZXJzJiwgZW5kcG9pbnRfdHlwZSYgc2VuZGVyX2VuZHBvaW50LAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBib29sIGlzX2NvbnRpbnVhdGlvbiA9Ci0gICAgICBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oaGFuZGxlcik7Ci0KLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgcmVhY3RpdmVfbnVsbF9idWZmZXJzX29wPEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLAotICAgICAgICAgICZpbXBsLCAiYXN5bmNfcmVjZWl2ZV9mcm9tKG51bGxfYnVmZmVycykiKSk7Ci0KLSAgICAvLyBSZXNldCBlbmRwb2ludCBzaW5jZSBpdCBjYW4gYmUgZ2l2ZW4gbm8gc2Vuc2libGUgdmFsdWUgYXQgdGhpcyB0aW1lLgotICAgIHNlbmRlcl9lbmRwb2ludCA9IGVuZHBvaW50X3R5cGUoKTsKLQotICAgIHN0YXJ0X29wKGltcGwsCi0gICAgICAgIChmbGFncyAmIHNvY2tldF9iYXNlOjptZXNzYWdlX291dF9vZl9iYW5kKQotICAgICAgICAgID8gcmVhY3Rvcjo6ZXhjZXB0X29wIDogcmVhY3Rvcjo6cmVhZF9vcCwKLSAgICAgICAgcC5wLCBpc19jb250aW51YXRpb24sIGZhbHNlLCBmYWxzZSk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotCi0gIC8vIEFjY2VwdCBhIG5ldyBjb25uZWN0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU29ja2V0PgotICBhc2lvOjplcnJvcl9jb2RlIGFjY2VwdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgU29ja2V0JiBwZWVyLCBlbmRwb2ludF90eXBlKiBwZWVyX2VuZHBvaW50LCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIC8vIFdlIGNhbm5vdCBhY2NlcHQgYSBzb2NrZXQgdGhhdCBpcyBhbHJlYWR5IG9wZW4uCi0gICAgaWYgKHBlZXIuaXNfb3BlbigpKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmFscmVhZHlfb3BlbjsKLSAgICAgIHJldHVybiBlYzsKLSAgICB9Ci0KLSAgICBzdGQ6OnNpemVfdCBhZGRyX2xlbiA9IHBlZXJfZW5kcG9pbnQgPyBwZWVyX2VuZHBvaW50LT5jYXBhY2l0eSgpIDogMDsKLSAgICBzb2NrZXRfaG9sZGVyIG5ld19zb2NrZXQoc29ja2V0X29wczo6c3luY19hY2NlcHQoaW1wbC5zb2NrZXRfLAotICAgICAgICAgIGltcGwuc3RhdGVfLCBwZWVyX2VuZHBvaW50ID8gcGVlcl9lbmRwb2ludC0+ZGF0YSgpIDogMCwKLSAgICAgICAgICBwZWVyX2VuZHBvaW50ID8gJmFkZHJfbGVuIDogMCwgZWMpKTsKLQotICAgIC8vIE9uIHN1Y2Nlc3MsIGFzc2lnbiBuZXcgY29ubmVjdGlvbiB0byBwZWVyIHNvY2tldCBvYmplY3QuCi0gICAgaWYgKG5ld19zb2NrZXQuZ2V0KCkgIT0gaW52YWxpZF9zb2NrZXQpCi0gICAgewotICAgICAgaWYgKHBlZXJfZW5kcG9pbnQpCi0gICAgICAgIHBlZXJfZW5kcG9pbnQtPnJlc2l6ZShhZGRyX2xlbik7Ci0gICAgICBpZiAoIXBlZXIuYXNzaWduKGltcGwucHJvdG9jb2xfLCBuZXdfc29ja2V0LmdldCgpLCBlYykpCi0gICAgICAgIG5ld19zb2NrZXQucmVsZWFzZSgpOwotICAgIH0KLQotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBhY2NlcHQuIFRoZSBwZWVyIGFuZCBwZWVyX2VuZHBvaW50IG9iamVjdHMKLSAgLy8gbXVzdCBiZSB2YWxpZCB1bnRpbCB0aGUgYWNjZXB0J3MgaGFuZGxlciBpcyBpbnZva2VkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU29ja2V0LCB0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX2FjY2VwdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBTb2NrZXQmIHBlZXIsCi0gICAgICBlbmRwb2ludF90eXBlKiBwZWVyX2VuZHBvaW50LCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYm9vbCBpc19jb250aW51YXRpb24gPQotICAgICAgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotCi0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHJlYWN0aXZlX3NvY2tldF9hY2NlcHRfb3A8U29ja2V0LCBQcm90b2NvbCwgSGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywgcGVlciwKLSAgICAgICAgaW1wbC5wcm90b2NvbF8sIHBlZXJfZW5kcG9pbnQsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLCAmaW1wbCwgImFzeW5jX2FjY2VwdCIpKTsKLQotICAgIHN0YXJ0X2FjY2VwdF9vcChpbXBsLCBwLnAsIGlzX2NvbnRpbnVhdGlvbiwgcGVlci5pc19vcGVuKCkpOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBDb25uZWN0IHRoZSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBlbmRwb2ludC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjb25uZWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBwZWVyX2VuZHBvaW50LCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHNvY2tldF9vcHM6OnN5bmNfY29ubmVjdChpbXBsLnNvY2tldF8sCi0gICAgICAgIHBlZXJfZW5kcG9pbnQuZGF0YSgpLCBwZWVyX2VuZHBvaW50LnNpemUoKSwgZWMpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBjb25uZWN0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19jb25uZWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBwZWVyX2VuZHBvaW50LCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYm9vbCBpc19jb250aW51YXRpb24gPQotICAgICAgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotCi0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHJlYWN0aXZlX3NvY2tldF9jb25uZWN0X29wPEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGltcGwuc29ja2V0XywgaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgInNvY2tldCIsICZpbXBsLCAiYXN5bmNfY29ubmVjdCIpKTsKLQotICAgIHN0YXJ0X2Nvbm5lY3Rfb3AoaW1wbCwgcC5wLCBpc19jb250aW51YXRpb24sCi0gICAgICAgIHBlZXJfZW5kcG9pbnQuZGF0YSgpLCBwZWVyX2VuZHBvaW50LnNpemUoKSk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUkVBQ1RJVkVfU09DS0VUX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1MDUzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9SRUFDVElWRV9TT0NLRVRfU0VSVklDRV9CQVNFX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9SRUFDVElWRV9TT0NLRVRfU0VSVklDRV9CQVNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfSU9DUCkgXAotICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgImFzaW8vYnVmZmVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc29ja2V0X2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0aXZlX251bGxfYnVmZmVyc19vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3JlY3Zfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0aXZlX3NvY2tldF9yZWN2bXNnX29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VuZF9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X2hvbGRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyByZWFjdGl2ZV9zb2NrZXRfc2VydmljZV9iYXNlCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBuYXRpdmUgdHlwZSBvZiBhIHNvY2tldC4KLSAgdHlwZWRlZiBzb2NrZXRfdHlwZSBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgLy8gVGhlIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgdGhlIHNvY2tldC4KLSAgc3RydWN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZQotICB7Ci0gICAgLy8gVGhlIG5hdGl2ZSBzb2NrZXQgcmVwcmVzZW50YXRpb24uCi0gICAgc29ja2V0X3R5cGUgc29ja2V0XzsKLQotICAgIC8vIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzb2NrZXQuCi0gICAgc29ja2V0X29wczo6c3RhdGVfdHlwZSBzdGF0ZV87Ci0KLSAgICAvLyBQZXItZGVzY3JpcHRvciBkYXRhIHVzZWQgYnkgdGhlIHJlYWN0b3IuCi0gICAgcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSByZWFjdG9yX2RhdGFfOwotICB9OwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZSgKLSAgICAgIGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpOwotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIEFTSU9fREVDTCB2b2lkIHNodXRkb3duX3NlcnZpY2UoKTsKLQotICAvLyBDb25zdHJ1Y3QgYSBuZXcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBjb25zdHJ1Y3QoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKTsKLQotICAvLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIGJhc2VfbW92ZV9jb25zdHJ1Y3QoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKTsKLQotICAvLyBNb3ZlLWFzc2lnbiBmcm9tIGFub3RoZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBiYXNlX21vdmVfYXNzaWduKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2UmIG90aGVyX3NlcnZpY2UsCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpOwotCi0gIC8vIERlc3Ryb3kgYSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIGRlc3Ryb3koYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKTsKLQotICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgc29ja2V0IGlzIG9wZW4uCi0gIGJvb2wgaXNfb3Blbihjb25zdCBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaW1wbC5zb2NrZXRfICE9IGludmFsaWRfc29ja2V0OwotICB9Ci0KLSAgLy8gRGVzdHJveSBhIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBHZXQgdGhlIG5hdGl2ZSBzb2NrZXQgcmVwcmVzZW50YXRpb24uCi0gIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBpbXBsLnNvY2tldF87Ci0gIH0KLQotICAvLyBDYW5jZWwgYWxsIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2NrZXQuCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGNhbmNlbCgKLSAgICAgIGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgYXQgdGhlIG91dC1vZi1iYW5kIGRhdGEgbWFyay4KLSAgYm9vbCBhdF9tYXJrKGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNvY2tldF9vcHM6OnNvY2thdG1hcmsoaW1wbC5zb2NrZXRfLCBlYyk7Ci0gIH0KLQotICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcuCi0gIHN0ZDo6c2l6ZV90IGF2YWlsYWJsZShjb25zdCBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzb2NrZXRfb3BzOjphdmFpbGFibGUoaW1wbC5zb2NrZXRfLCBlYyk7Ci0gIH0KLQotICAvLyBQbGFjZSB0aGUgc29ja2V0IGludG8gdGhlIHN0YXRlIHdoZXJlIGl0IHdpbGwgbGlzdGVuIGZvciBuZXcgY29ubmVjdGlvbnMuCi0gIGFzaW86OmVycm9yX2NvZGUgbGlzdGVuKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGludCBiYWNrbG9nLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHNvY2tldF9vcHM6Omxpc3RlbihpbXBsLnNvY2tldF8sIGJhY2tsb2csIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBQZXJmb3JtIGFuIElPIGNvbnRyb2wgY29tbWFuZCBvbiB0aGUgc29ja2V0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSU9fQ29udHJvbF9Db21tYW5kPgotICBhc2lvOjplcnJvcl9jb2RlIGlvX2NvbnRyb2woYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgSU9fQ29udHJvbF9Db21tYW5kJiBjb21tYW5kLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHNvY2tldF9vcHM6OmlvY3RsKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sIGNvbW1hbmQubmFtZSgpLAotICAgICAgICBzdGF0aWNfY2FzdDxpb2N0bF9hcmdfdHlwZSo+KGNvbW1hbmQuZGF0YSgpKSwgZWMpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIEdldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBzb2NrZXQuCi0gIGJvb2wgbm9uX2Jsb2NraW5nKGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiAoaW1wbC5zdGF0ZV8gJiBzb2NrZXRfb3BzOjp1c2VyX3NldF9ub25fYmxvY2tpbmcpICE9IDA7Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIG5vbl9ibG9ja2luZyhiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBib29sIG1vZGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgc29ja2V0X29wczo6c2V0X3VzZXJfbm9uX2Jsb2NraW5nKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sIG1vZGUsIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBHZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYm9vbCBuYXRpdmVfbm9uX2Jsb2NraW5nKGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiAoaW1wbC5zdGF0ZV8gJiBzb2NrZXRfb3BzOjppbnRlcm5hbF9ub25fYmxvY2tpbmcpICE9IDA7Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBuYXRpdmVfbm9uX2Jsb2NraW5nKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBzb2NrZXRfb3BzOjpzZXRfaW50ZXJuYWxfbm9uX2Jsb2NraW5nKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sIG1vZGUsIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBEaXNhYmxlIHNlbmRzIG9yIHJlY2VpdmVzIG9uIHRoZSBzb2NrZXQuCi0gIGFzaW86OmVycm9yX2NvZGUgc2h1dGRvd24oYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgc29ja2V0X2Jhc2U6OnNodXRkb3duX3R5cGUgd2hhdCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBzb2NrZXRfb3BzOjpzaHV0ZG93bihpbXBsLnNvY2tldF8sIHdoYXQsIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBTZW5kIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBwZWVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc2l6ZV90IHNlbmQoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86OmNvbnN0X2J1ZmZlciwKLSAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZT4gYnVmcyhidWZmZXJzKTsKLQotICAgIHJldHVybiBzb2NrZXRfb3BzOjpzeW5jX3NlbmQoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywKLSAgICAgICAgYnVmcy5idWZmZXJzKCksIGJ1ZnMuY291bnQoKSwgZmxhZ3MsIGJ1ZnMuYWxsX2VtcHR5KCksIGVjKTsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgZGF0YSBjYW4gYmUgc2VudCB3aXRob3V0IGJsb2NraW5nLgotICBzaXplX3Qgc2VuZChiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGNvbnN0IG51bGxfYnVmZmVycyYsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICAvLyBXYWl0IGZvciBzb2NrZXQgdG8gYmVjb21lIHJlYWR5LgotICAgIHNvY2tldF9vcHM6OnBvbGxfd3JpdGUoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywgZWMpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgc2VuZC4gVGhlIGRhdGEgYmVpbmcgc2VudCBtdXN0IGJlIHZhbGlkIGZvciB0aGUKLSAgLy8gbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3NlbmQoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYm9vbCBpc19jb250aW51YXRpb24gPQotICAgICAgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotCi0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHJlYWN0aXZlX3NvY2tldF9zZW5kX29wPENvbnN0QnVmZmVyU2VxdWVuY2UsIEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGltcGwuc29ja2V0XywgYnVmZmVycywgZmxhZ3MsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLCAmaW1wbCwgImFzeW5jX3NlbmQiKSk7Ci0KLSAgICBzdGFydF9vcChpbXBsLCByZWFjdG9yOjp3cml0ZV9vcCwgcC5wLCBpc19jb250aW51YXRpb24sIHRydWUsCi0gICAgICAgICgoaW1wbC5zdGF0ZV8gJiBzb2NrZXRfb3BzOjpzdHJlYW1fb3JpZW50ZWQpCi0gICAgICAgICAgJiYgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6Y29uc3RfYnVmZmVyLAotICAgICAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZT46OmFsbF9lbXB0eShidWZmZXJzKSkpOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd2FpdCB1bnRpbCBkYXRhIGNhbiBiZSBzZW50IHdpdGhvdXQgYmxvY2tpbmcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3NlbmQoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBjb25zdCBudWxsX2J1ZmZlcnMmLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBib29sIGlzX2NvbnRpbnVhdGlvbiA9Ci0gICAgICBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oaGFuZGxlcik7Ci0KLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgcmVhY3RpdmVfbnVsbF9idWZmZXJzX29wPEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLAotICAgICAgICAgICZpbXBsLCAiYXN5bmNfc2VuZChudWxsX2J1ZmZlcnMpIikpOwotCi0gICAgc3RhcnRfb3AoaW1wbCwgcmVhY3Rvcjo6d3JpdGVfb3AsIHAucCwgaXNfY29udGludWF0aW9uLCBmYWxzZSwgZmFsc2UpOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBSZWNlaXZlIHNvbWUgZGF0YSBmcm9tIHRoZSBwZWVyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHNpemVfdCByZWNlaXZlKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86Om11dGFibGVfYnVmZmVyLAotICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+IGJ1ZnMoYnVmZmVycyk7Ci0KLSAgICByZXR1cm4gc29ja2V0X29wczo6c3luY19yZWN2KGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sCi0gICAgICAgIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksIGZsYWdzLCBidWZzLmFsbF9lbXB0eSgpLCBlYyk7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIGRhdGEgY2FuIGJlIHJlY2VpdmVkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHNpemVfdCByZWNlaXZlKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgY29uc3QgbnVsbF9idWZmZXJzJiwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIC8vIFdhaXQgZm9yIHNvY2tldCB0byBiZWNvbWUgcmVhZHkuCi0gICAgc29ja2V0X29wczo6cG9sbF9yZWFkKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sIGVjKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUuIFRoZSBidWZmZXIgZm9yIHRoZSBkYXRhIGJlaW5nIHJlY2VpdmVkCi0gIC8vIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19yZWNlaXZlKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYm9vbCBpc19jb250aW51YXRpb24gPQotICAgICAgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotCi0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHJlYWN0aXZlX3NvY2tldF9yZWN2X29wPE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgSGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywgYnVmZmVycywgZmxhZ3MsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLCAmaW1wbCwgImFzeW5jX3JlY2VpdmUiKSk7Ci0KLSAgICBzdGFydF9vcChpbXBsLAotICAgICAgICAoZmxhZ3MgJiBzb2NrZXRfYmFzZTo6bWVzc2FnZV9vdXRfb2ZfYmFuZCkKLSAgICAgICAgICA/IHJlYWN0b3I6OmV4Y2VwdF9vcCA6IHJlYWN0b3I6OnJlYWRfb3AsCi0gICAgICAgIHAucCwgaXNfY29udGludWF0aW9uLAotICAgICAgICAoZmxhZ3MgJiBzb2NrZXRfYmFzZTo6bWVzc2FnZV9vdXRfb2ZfYmFuZCkgPT0gMCwKLSAgICAgICAgKChpbXBsLnN0YXRlXyAmIHNvY2tldF9vcHM6OnN0cmVhbV9vcmllbnRlZCkKLSAgICAgICAgICAmJiBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZT46OmFsbF9lbXB0eShidWZmZXJzKSkpOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIGRhdGEgY2FuIGJlIHJlY2VpdmVkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3JlY2VpdmUoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBjb25zdCBudWxsX2J1ZmZlcnMmLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBib29sIGlzX2NvbnRpbnVhdGlvbiA9Ci0gICAgICBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oaGFuZGxlcik7Ci0KLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgcmVhY3RpdmVfbnVsbF9idWZmZXJzX29wPEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLAotICAgICAgICAgICZpbXBsLCAiYXN5bmNfcmVjZWl2ZShudWxsX2J1ZmZlcnMpIikpOwotCi0gICAgc3RhcnRfb3AoaW1wbCwKLSAgICAgICAgKGZsYWdzICYgc29ja2V0X2Jhc2U6Om1lc3NhZ2Vfb3V0X29mX2JhbmQpCi0gICAgICAgICAgPyByZWFjdG9yOjpleGNlcHRfb3AgOiByZWFjdG9yOjpyZWFkX29wLAotICAgICAgICBwLnAsIGlzX2NvbnRpbnVhdGlvbiwgZmFsc2UsIGZhbHNlKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLSAgLy8gUmVjZWl2ZSBzb21lIGRhdGEgd2l0aCBhc3NvY2lhdGVkIGZsYWdzLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgLy8gcmVjZWl2ZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHNpemVfdCByZWNlaXZlX3dpdGhfZmxhZ3MoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgaW5fZmxhZ3MsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyYgb3V0X2ZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86Om11dGFibGVfYnVmZmVyLAotICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+IGJ1ZnMoYnVmZmVycyk7Ci0KLSAgICByZXR1cm4gc29ja2V0X29wczo6c3luY19yZWN2bXNnKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sCi0gICAgICAgIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksIGluX2ZsYWdzLCBvdXRfZmxhZ3MsIGVjKTsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgZGF0YSBjYW4gYmUgcmVjZWl2ZWQgd2l0aG91dCBibG9ja2luZy4KLSAgc2l6ZV90IHJlY2VpdmVfd2l0aF9mbGFncyhiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBudWxsX2J1ZmZlcnMmLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiBvdXRfZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgLy8gV2FpdCBmb3Igc29ja2V0IHRvIGJlY29tZSByZWFkeS4KLSAgICBzb2NrZXRfb3BzOjpwb2xsX3JlYWQoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywgZWMpOwotCi0gICAgLy8gQ2xlYXIgb3V0X2ZsYWdzLCBzaW5jZSB3ZSBjYW5ub3QgZ2l2ZSBpdCBhbnkgb3RoZXIgc2Vuc2libGUgdmFsdWUgd2hlbgotICAgIC8vIHBlcmZvcm1pbmcgYSBudWxsX2J1ZmZlcnMgb3BlcmF0aW9uLgotICAgIG91dF9mbGFncyA9IDA7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWNlaXZlLiBUaGUgYnVmZmVyIGZvciB0aGUgZGF0YSBiZWluZyByZWNlaXZlZAotICAvLyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVjZWl2ZV93aXRoX2ZsYWdzKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgaW5fZmxhZ3MsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyYgb3V0X2ZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYm9vbCBpc19jb250aW51YXRpb24gPQotICAgICAgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotCi0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHJlYWN0aXZlX3NvY2tldF9yZWN2bXNnX29wPE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgSGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaW1wbC5zb2NrZXRfLCBidWZmZXJzLCBpbl9mbGFncywgb3V0X2ZsYWdzLCBoYW5kbGVyKTsKLQotICAgIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAic29ja2V0IiwKLSAgICAgICAgICAmaW1wbCwgImFzeW5jX3JlY2VpdmVfd2l0aF9mbGFncyIpKTsKLQotICAgIHN0YXJ0X29wKGltcGwsCi0gICAgICAgIChpbl9mbGFncyAmIHNvY2tldF9iYXNlOjptZXNzYWdlX291dF9vZl9iYW5kKQotICAgICAgICAgID8gcmVhY3Rvcjo6ZXhjZXB0X29wIDogcmVhY3Rvcjo6cmVhZF9vcCwKLSAgICAgICAgcC5wLCBpc19jb250aW51YXRpb24sCi0gICAgICAgIChpbl9mbGFncyAmIHNvY2tldF9iYXNlOjptZXNzYWdlX291dF9vZl9iYW5kKSA9PSAwLCBmYWxzZSk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgZGF0YSBjYW4gYmUgcmVjZWl2ZWQgd2l0aG91dCBibG9ja2luZy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVjZWl2ZV93aXRoX2ZsYWdzKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IG51bGxfYnVmZmVycyYsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGluX2ZsYWdzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MmIG91dF9mbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGJvb2wgaXNfY29udGludWF0aW9uID0KLSAgICAgIGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbihoYW5kbGVyKTsKLQotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiByZWFjdGl2ZV9udWxsX2J1ZmZlcnNfb3A8SGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgInNvY2tldCIsICZpbXBsLAotICAgICAgICAgICJhc3luY19yZWNlaXZlX3dpdGhfZmxhZ3MobnVsbF9idWZmZXJzKSIpKTsKLQotICAgIC8vIENsZWFyIG91dF9mbGFncywgc2luY2Ugd2UgY2Fubm90IGdpdmUgaXQgYW55IG90aGVyIHNlbnNpYmxlIHZhbHVlIHdoZW4KLSAgICAvLyBwZXJmb3JtaW5nIGEgbnVsbF9idWZmZXJzIG9wZXJhdGlvbi4KLSAgICBvdXRfZmxhZ3MgPSAwOwotCi0gICAgc3RhcnRfb3AoaW1wbCwKLSAgICAgICAgKGluX2ZsYWdzICYgc29ja2V0X2Jhc2U6Om1lc3NhZ2Vfb3V0X29mX2JhbmQpCi0gICAgICAgICAgPyByZWFjdG9yOjpleGNlcHRfb3AgOiByZWFjdG9yOjpyZWFkX29wLAotICAgICAgICBwLnAsIGlzX2NvbnRpbnVhdGlvbiwgZmFsc2UsIGZhbHNlKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgLy8gT3BlbiBhIG5ldyBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGRvX29wZW4oCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGludCBhZiwKLSAgICAgIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBBc3NpZ24gYSBuYXRpdmUgc29ja2V0IHRvIGEgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBkb19hc3NpZ24oCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGludCB0eXBlLAotICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBuYXRpdmVfc29ja2V0LCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gU3RhcnQgdGhlIGFzeW5jaHJvbm91cyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfb3AoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBpbnQgb3BfdHlwZSwKLSAgICAgIHJlYWN0b3Jfb3AqIG9wLCBib29sIGlzX2NvbnRpbnVhdGlvbiwgYm9vbCBpc19ub25fYmxvY2tpbmcsIGJvb2wgbm9vcCk7Ci0KLSAgLy8gU3RhcnQgdGhlIGFzeW5jaHJvbm91cyBhY2NlcHQgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF9hY2NlcHRfb3AoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgcmVhY3Rvcl9vcCogb3AsIGJvb2wgaXNfY29udGludWF0aW9uLCBib29sIHBlZXJfaXNfb3Blbik7Ci0KLSAgLy8gU3RhcnQgdGhlIGFzeW5jaHJvbm91cyBjb25uZWN0IG9wZXJhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfY29ubmVjdF9vcChiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICByZWFjdG9yX29wKiBvcCwgYm9vbCBpc19jb250aW51YXRpb24sCi0gICAgICBjb25zdCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLCBzaXplX3QgYWRkcmxlbik7Ci0KLSAgLy8gVGhlIHNlbGVjdG9yIHRoYXQgcGVyZm9ybXMgZXZlbnQgZGVtdWx0aXBsZXhpbmcgZm9yIHRoZSBzZXJ2aWNlLgotICByZWFjdG9yJiByZWFjdG9yXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3JlYWN0aXZlX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1JFQUNUSVZFX1NPQ0tFVF9TRVJWSUNFX0JBU0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0b3IuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdG9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhNTE1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0b3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9yZWFjdG9yLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1JFQUNUT1JfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1JFQUNUT1JfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3JfZndkLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfRVBPTEwpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2Vwb2xsX3JlYWN0b3IuaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19LUVVFVUUpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2txdWV1ZV9yZWFjdG9yLmhwcCIKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfREVWX1BPTEwpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2Rldl9wb2xsX3JlYWN0b3IuaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvbnVsbF9yZWFjdG9yLmhwcCIKLSNlbHNlCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3NlbGVjdF9yZWFjdG9yLmhwcCIKLSNlbmRpZgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUkVBQ1RPUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3Rvcl9md2QuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdG9yX2Z3ZC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjA3NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWFjdG9yX2Z3ZC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3JlYWN0b3JfZndkLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9SRUFDVE9SX0ZXRF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfUkVBQ1RPUl9GV0RfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLXR5cGVkZWYgY2xhc3MgbnVsbF9yZWFjdG9yIHJlYWN0b3I7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi10eXBlZGVmIGNsYXNzIHNlbGVjdF9yZWFjdG9yIHJlYWN0b3I7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0VQT0xMKQotdHlwZWRlZiBjbGFzcyBlcG9sbF9yZWFjdG9yIHJlYWN0b3I7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0tRVUVVRSkKLXR5cGVkZWYgY2xhc3Mga3F1ZXVlX3JlYWN0b3IgcmVhY3RvcjsKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfREVWX1BPTEwpCi10eXBlZGVmIGNsYXNzIGRldl9wb2xsX3JlYWN0b3IgcmVhY3RvcjsKLSNlbHNlCi10eXBlZGVmIGNsYXNzIHNlbGVjdF9yZWFjdG9yIHJlYWN0b3I7Ci0jZW5kaWYKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9SRUFDVE9SX0ZXRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0b3Jfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzM5ZmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3JlYWN0b3Jfb3AuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUkVBQ1RPUl9PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfUkVBQ1RPUl9PUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHJlYWN0b3Jfb3AKLSAgOiBwdWJsaWMgb3BlcmF0aW9uCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBlcnJvciBjb2RlIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGxldGlvbiBoYW5kbGVyLgotICBhc2lvOjplcnJvcl9jb2RlIGVjXzsKLQotICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbXBsZXRpb24gaGFuZGxlci4KLSAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWRfOwotCi0gIC8vIFBlcmZvcm0gdGhlIG9wZXJhdGlvbi4gUmV0dXJucyB0cnVlIGlmIGl0IGlzIGZpbmlzaGVkLgotICBib29sIHBlcmZvcm0oKQotICB7Ci0gICAgcmV0dXJuIHBlcmZvcm1fZnVuY18odGhpcyk7Ci0gIH0KLQotcHJvdGVjdGVkOgotICB0eXBlZGVmIGJvb2wgKCpwZXJmb3JtX2Z1bmNfdHlwZSkocmVhY3Rvcl9vcCopOwotCi0gIHJlYWN0b3Jfb3AocGVyZm9ybV9mdW5jX3R5cGUgcGVyZm9ybV9mdW5jLCBmdW5jX3R5cGUgY29tcGxldGVfZnVuYykKLSAgICA6IG9wZXJhdGlvbihjb21wbGV0ZV9mdW5jKSwKLSAgICAgIGJ5dGVzX3RyYW5zZmVycmVkXygwKSwKLSAgICAgIHBlcmZvcm1fZnVuY18ocGVyZm9ybV9mdW5jKQotICB7Ci0gIH0KLQotcHJpdmF0ZToKLSAgcGVyZm9ybV9mdW5jX3R5cGUgcGVyZm9ybV9mdW5jXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUkVBQ1RPUl9PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3Rvcl9vcF9xdWV1ZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3JlYWN0b3Jfb3BfcXVldWUuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmVhY2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVhY3Rvcl9vcF9xdWV1ZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLy8KLS8vIGRldGFpbC9yZWFjdG9yX29wX3F1ZXVlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1JFQUNUT1JfT1BfUVVFVUVfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1JFQUNUT1JfT1BfUVVFVUVfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFzaF9tYXAuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcF9xdWV1ZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3I+Ci1jbGFzcyByZWFjdG9yX29wX3F1ZXVlCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICB0eXBlZGVmIERlc2NyaXB0b3Iga2V5X3R5cGU7Ci0KLSAgc3RydWN0IG1hcHBlZF90eXBlIDogb3BfcXVldWU8cmVhY3Rvcl9vcD4KLSAgewotICAgIG1hcHBlZF90eXBlKCkge30KLSAgICBtYXBwZWRfdHlwZShjb25zdCBtYXBwZWRfdHlwZSYpIHt9Ci0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgbWFwcGVkX3R5cGUmKSB7fQotICB9OwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgaGFzaF9tYXA8a2V5X3R5cGUsIG1hcHBlZF90eXBlPjo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIGhhc2hfbWFwPGtleV90eXBlLCBtYXBwZWRfdHlwZT46Oml0ZXJhdG9yIGl0ZXJhdG9yOwotCi0gIC8vIENvbnN0cnVjdG9yLgotICByZWFjdG9yX29wX3F1ZXVlKCkKLSAgICA6IG9wZXJhdGlvbnNfKCkKLSAgewotICB9Ci0KLSAgLy8gT2J0YWluIGl0ZXJhdG9ycyB0byBhbGwgcmVnaXN0ZXJlZCBkZXNjcmlwdG9ycy4KLSAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBvcGVyYXRpb25zXy5iZWdpbigpOyB9Ci0gIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG9wZXJhdGlvbnNfLmVuZCgpOyB9Ci0KLSAgLy8gQWRkIGEgbmV3IG9wZXJhdGlvbiB0byB0aGUgcXVldWUuIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBvbmx5Ci0gIC8vIG9wZXJhdGlvbiBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0b3IsIGluIHdoaWNoIGNhc2UgdGhlIHJlYWN0b3IncyBldmVudAotICAvLyBkZW11bHRpcGxleGluZyBmdW5jdGlvbiBjYWxsIG1heSBuZWVkIHRvIGJlIGludGVycnVwdGVkIGFuZCByZXN0YXJ0ZWQuCi0gIGJvb2wgZW5xdWV1ZV9vcGVyYXRpb24oRGVzY3JpcHRvciBkZXNjcmlwdG9yLCByZWFjdG9yX29wKiBvcCkKLSAgewotICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gZW50cnkgPQotICAgICAgb3BlcmF0aW9uc18uaW5zZXJ0KHZhbHVlX3R5cGUoZGVzY3JpcHRvciwgbWFwcGVkX3R5cGUoKSkpOwotICAgIGVudHJ5LmZpcnN0LT5zZWNvbmQucHVzaChvcCk7Ci0gICAgcmV0dXJuIGVudHJ5LnNlY29uZDsKLSAgfQotCi0gIC8vIENhbmNlbCBhbGwgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IgaWRlbnRpZmllZCBieSB0aGUKLSAgLy8gc3VwcGxpZWQgaXRlcmF0b3IuIEFueSBvcGVyYXRpb25zIHBlbmRpbmcgZm9yIHRoZSBkZXNjcmlwdG9yIHdpbGwgYmUKLSAgLy8gY2FuY2VsbGVkLiBSZXR1cm5zIHRydWUgaWYgYW55IG9wZXJhdGlvbnMgd2VyZSBjYW5jZWxsZWQsIGluIHdoaWNoIGNhc2UKLSAgLy8gdGhlIHJlYWN0b3IncyBldmVudCBkZW11bHRpcGxleGluZyBmdW5jdGlvbiBtYXkgbmVlZCB0byBiZSBpbnRlcnJ1cHRlZCBhbmQKLSAgLy8gcmVzdGFydGVkLgotICBib29sIGNhbmNlbF9vcGVyYXRpb25zKGl0ZXJhdG9yIGksIG9wX3F1ZXVlPG9wZXJhdGlvbj4mIG9wcywKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjID0KLSAgICAgICAgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkKQotICB7Ci0gICAgaWYgKGkgIT0gb3BlcmF0aW9uc18uZW5kKCkpCi0gICAgewotICAgICAgd2hpbGUgKHJlYWN0b3Jfb3AqIG9wID0gaS0+c2Vjb25kLmZyb250KCkpCi0gICAgICB7Ci0gICAgICAgIG9wLT5lY18gPSBlYzsKLSAgICAgICAgaS0+c2Vjb25kLnBvcCgpOwotICAgICAgICBvcHMucHVzaChvcCk7Ci0gICAgICB9Ci0gICAgICBvcGVyYXRpb25zXy5lcmFzZShpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIENhbmNlbCBhbGwgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IuIEFueSBvcGVyYXRpb25zCi0gIC8vIHBlbmRpbmcgZm9yIHRoZSBkZXNjcmlwdG9yIHdpbGwgYmUgY2FuY2VsbGVkLiBSZXR1cm5zIHRydWUgaWYgYW55Ci0gIC8vIG9wZXJhdGlvbnMgd2VyZSBjYW5jZWxsZWQsIGluIHdoaWNoIGNhc2UgdGhlIHJlYWN0b3IncyBldmVudAotICAvLyBkZW11bHRpcGxleGluZyBmdW5jdGlvbiBtYXkgbmVlZCB0byBiZSBpbnRlcnJ1cHRlZCBhbmQgcmVzdGFydGVkLgotICBib29sIGNhbmNlbF9vcGVyYXRpb25zKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgb3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMgPQotICAgICAgICBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Y2FuY2VsX29wZXJhdGlvbnMob3BlcmF0aW9uc18uZmluZChkZXNjcmlwdG9yKSwgb3BzLCBlYyk7Ci0gIH0KLQotICAvLyBXaGV0aGVyIHRoZXJlIGFyZSBubyBvcGVyYXRpb25zIGluIHRoZSBxdWV1ZS4KLSAgYm9vbCBlbXB0eSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uc18uZW1wdHkoKTsKLSAgfQotCi0gIC8vIERldGVybWluZSB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IuCi0gIGJvb2wgaGFzX29wZXJhdGlvbihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uc18uZmluZChkZXNjcmlwdG9yKSAhPSBvcGVyYXRpb25zXy5lbmQoKTsKLSAgfQotCi0gIC8vIFBlcmZvcm0gdGhlIG9wZXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgZGVzY3JpcHRvciBpZGVudGlmaWVkIGJ5IHRoZQotICAvLyBzdXBwbGllZCBpdGVyYXRvci4gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBzdGlsbCB1bmZpbmlzaGVkIG9wZXJhdGlvbnMKLSAgLy8gcXVldWVkIGZvciB0aGUgZGVzY3JpcHRvci4KLSAgYm9vbCBwZXJmb3JtX29wZXJhdGlvbnMoaXRlcmF0b3IgaSwgb3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzKQotICB7Ci0gICAgaWYgKGkgIT0gb3BlcmF0aW9uc18uZW5kKCkpCi0gICAgewotICAgICAgd2hpbGUgKHJlYWN0b3Jfb3AqIG9wID0gaS0+c2Vjb25kLmZyb250KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChvcC0+cGVyZm9ybSgpKQotICAgICAgICB7Ci0gICAgICAgICAgaS0+c2Vjb25kLnBvcCgpOwotICAgICAgICAgIG9wcy5wdXNoKG9wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgb3BlcmF0aW9uc18uZXJhc2UoaSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFBlcmZvcm0gdGhlIG9wZXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgZGVzY3JpcHRvci4gUmV0dXJucyB0cnVlIGlmCi0gIC8vIHRoZXJlIGFyZSBzdGlsbCB1bmZpbmlzaGVkIG9wZXJhdGlvbnMgcXVldWVkIGZvciB0aGUgZGVzY3JpcHRvci4KLSAgYm9vbCBwZXJmb3JtX29wZXJhdGlvbnMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+cGVyZm9ybV9vcGVyYXRpb25zKG9wZXJhdGlvbnNfLmZpbmQoZGVzY3JpcHRvciksIG9wcyk7Ci0gIH0KLQotICAvLyBHZXQgYWxsIG9wZXJhdGlvbnMgb3duZWQgYnkgdGhlIHF1ZXVlLgotICB2b2lkIGdldF9hbGxfb3BlcmF0aW9ucyhvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpCi0gIHsKLSAgICBpdGVyYXRvciBpID0gb3BlcmF0aW9uc18uYmVnaW4oKTsKLSAgICB3aGlsZSAoaSAhPSBvcGVyYXRpb25zXy5lbmQoKSkKLSAgICB7Ci0gICAgICBpdGVyYXRvciBvcF9pdGVyID0gaSsrOwotICAgICAgb3BzLnB1c2gob3BfaXRlci0+c2Vjb25kKTsKLSAgICAgIG9wZXJhdGlvbnNfLmVyYXNlKG9wX2l0ZXIpOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICAvLyBUaGUgb3BlcmF0aW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgZXhlY3V0aW5nIGFzeW5jaHJvbm91c2x5LgotICBoYXNoX21hcDxrZXlfdHlwZSwgbWFwcGVkX3R5cGU+IG9wZXJhdGlvbnNfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9SRUFDVE9SX09QX1FVRVVFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWdleF9md2QuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZWdleF9md2QuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjgyNWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVnZXhfZndkLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvcmVnZXhfZndkLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUkVHRVhfRldEX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9SRUdFWF9GV0RfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfUkVHRVgpCi0KLSNpbmNsdWRlIDxib29zdC9yZWdleF9md2QuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3JlZ2V4L3Y0L21hdGNoX2ZsYWdzLmhwcD4KLQotbmFtZXNwYWNlIGJvb3N0IHsKLQotdGVtcGxhdGUgPGNsYXNzIEJpZGlJdGVyYXRvcj4KLXN0cnVjdCBzdWJfbWF0Y2g7Ci0KLXRlbXBsYXRlIDxjbGFzcyBCaWRpSXRlcmF0b3IsIGNsYXNzIEFsbG9jYXRvcj4KLWNsYXNzIG1hdGNoX3Jlc3VsdHM7Ci0KLX0gLy8gbmFtZXNwYWNlIGJvb3N0Ci0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX1JFR0VYKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUkVHRVhfRldEX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZXNvbHZlX2VuZHBvaW50X29wLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVzb2x2ZV9lbmRwb2ludF9vcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODk3YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZXNvbHZlX2VuZHBvaW50X29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3Jlc29sdmVfZW5kcG9pbnRfb3AuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUkVTT0xWRVJfRU5EUE9JTlRfT1BfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1JFU09MVkVSX0VORFBPSU5UX09QX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9iYXNpY19yZXNvbHZlcl9pdGVyYXRvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIHJlc29sdmVfZW5kcG9pbnRfb3AgOiBwdWJsaWMgb3BlcmF0aW9uCi17Ci1wdWJsaWM6Ci0gIEFTSU9fREVGSU5FX0hBTkRMRVJfUFRSKHJlc29sdmVfZW5kcG9pbnRfb3ApOwotCi0gIHR5cGVkZWYgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0gIHR5cGVkZWYgYXNpbzo6aXA6OmJhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yPFByb3RvY29sPiBpdGVyYXRvcl90eXBlOwotCi0gIHJlc29sdmVfZW5kcG9pbnRfb3Aoc29ja2V0X29wczo6d2Vha19jYW5jZWxfdG9rZW5fdHlwZSBjYW5jZWxfdG9rZW4sCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCwgaW9fc2VydmljZV9pbXBsJiBpb3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiBvcGVyYXRpb24oJnJlc29sdmVfZW5kcG9pbnRfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIGNhbmNlbF90b2tlbl8oY2FuY2VsX3Rva2VuKSwKLSAgICAgIGVuZHBvaW50XyhlbmRwb2ludCksCi0gICAgICBpb19zZXJ2aWNlX2ltcGxfKGlvcyksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgLyplYyovLAotICAgICAgc3RkOjpzaXplX3QgLypieXRlc190cmFuc2ZlcnJlZCovKQotICB7Ci0gICAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIG9wZXJhdGlvbiBvYmplY3QuCi0gICAgcmVzb2x2ZV9lbmRwb2ludF9vcCogbyhzdGF0aWNfY2FzdDxyZXNvbHZlX2VuZHBvaW50X29wKj4oYmFzZSkpOwotICAgIHB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihvLT5oYW5kbGVyXyksIG8sIG8gfTsKLQotICAgIGlmIChvd25lciAmJiBvd25lciAhPSAmby0+aW9fc2VydmljZV9pbXBsXykKLSAgICB7Ci0gICAgICAvLyBUaGUgb3BlcmF0aW9uIGlzIGJlaW5nIHJ1biBvbiB0aGUgd29ya2VyIGlvX3NlcnZpY2UuIFRpbWUgdG8gcGVyZm9ybQotICAgICAgLy8gdGhlIHJlc29sdmVyIG9wZXJhdGlvbi4KLSAgICAKLSAgICAgIC8vIFBlcmZvcm0gdGhlIGJsb2NraW5nIGVuZHBvaW50IHJlc29sdXRpb24gb3BlcmF0aW9uLgotICAgICAgY2hhciBob3N0X25hbWVbTklfTUFYSE9TVF07Ci0gICAgICBjaGFyIHNlcnZpY2VfbmFtZVtOSV9NQVhTRVJWXTsKLSAgICAgIHNvY2tldF9vcHM6OmJhY2tncm91bmRfZ2V0bmFtZWluZm8oby0+Y2FuY2VsX3Rva2VuXywgby0+ZW5kcG9pbnRfLmRhdGEoKSwKLSAgICAgICAgICBvLT5lbmRwb2ludF8uc2l6ZSgpLCBob3N0X25hbWUsIE5JX01BWEhPU1QsIHNlcnZpY2VfbmFtZSwgTklfTUFYU0VSViwKLSAgICAgICAgICBvLT5lbmRwb2ludF8ucHJvdG9jb2woKS50eXBlKCksIG8tPmVjXyk7Ci0gICAgICBvLT5pdGVyXyA9IGl0ZXJhdG9yX3R5cGU6OmNyZWF0ZShvLT5lbmRwb2ludF8sIGhvc3RfbmFtZSwgc2VydmljZV9uYW1lKTsKLQotICAgICAgLy8gUGFzcyBvcGVyYXRpb24gYmFjayB0byBtYWluIGlvX3NlcnZpY2UgZm9yIGNvbXBsZXRpb24uCi0gICAgICBvLT5pb19zZXJ2aWNlX2ltcGxfLnBvc3RfZGVmZXJyZWRfY29tcGxldGlvbihvKTsKLSAgICAgIHAudiA9IHAucCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIHJldHVybmVkIHRvIHRoZSBtYWluIGlvX3NlcnZpY2UuIFRoZSBjb21wbGV0aW9uCi0gICAgICAvLyBoYW5kbGVyIGlzIHJlYWR5IHRvIGJlIGRlbGl2ZXJlZC4KLQotICAgICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotICAgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBkZWFsbG9jYXRlZAotICAgICAgLy8gYmVmb3JlIHRoZSB1cGNhbGwgaXMgbWFkZS4gRXZlbiBpZiB3ZSdyZSBub3QgYWJvdXQgdG8gbWFrZSBhbiB1cGNhbGwsCi0gICAgICAvLyBhIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkKLSAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlci4gQ29uc2VxdWVudGx5LCBhIGxvY2FsIGNvcHkgb2YgdGhlIGhhbmRsZXIKLSAgICAgIC8vIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IGFueSBvd25pbmcgc3ViLW9iamVjdCByZW1haW5zIHZhbGlkIHVudGlsCi0gICAgICAvLyBhZnRlciB3ZSBoYXZlIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICAgIGRldGFpbDo6YmluZGVyMjxIYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlLCBpdGVyYXRvcl90eXBlPgotICAgICAgICBoYW5kbGVyKG8tPmhhbmRsZXJfLCBvLT5lY18sIG8tPml0ZXJfKTsKLSAgICAgIHAuaCA9IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgcC5yZXNldCgpOwotCi0gICAgICBpZiAob3duZXIpCi0gICAgICB7Ci0gICAgICAgIGZlbmNlZF9ibG9jayBiKGZlbmNlZF9ibG9jazo6aGFsZik7Ci0gICAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKChoYW5kbGVyLmFyZzFfLCAiLi4uIikpOwotICAgICAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoYW5kbGVyLCBoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgICAgfQotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBzb2NrZXRfb3BzOjp3ZWFrX2NhbmNlbF90b2tlbl90eXBlIGNhbmNlbF90b2tlbl87Ci0gIGVuZHBvaW50X3R5cGUgZW5kcG9pbnRfOwotICBpb19zZXJ2aWNlX2ltcGwmIGlvX3NlcnZpY2VfaW1wbF87Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci0gIGFzaW86OmVycm9yX2NvZGUgZWNfOwotICBpdGVyYXRvcl90eXBlIGl0ZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9SRVNPTFZFUl9FTkRQT0lOVF9PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVzb2x2ZV9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Jlc29sdmVfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDkyZmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVzb2x2ZV9vcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9yZXNvbHZlX29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1JFU09MVkVfT1BfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1JFU09MVkVfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyX3F1ZXJ5LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL29wZXJhdGlvbi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBIYW5kbGVyPgotY2xhc3MgcmVzb2x2ZV9vcCA6IHB1YmxpYyBvcGVyYXRpb24KLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIocmVzb2x2ZV9vcCk7Ci0KLSAgdHlwZWRlZiBhc2lvOjppcDo6YmFzaWNfcmVzb2x2ZXJfcXVlcnk8UHJvdG9jb2w+IHF1ZXJ5X3R5cGU7Ci0gIHR5cGVkZWYgYXNpbzo6aXA6OmJhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yPFByb3RvY29sPiBpdGVyYXRvcl90eXBlOwotCi0gIHJlc29sdmVfb3Aoc29ja2V0X29wczo6d2Vha19jYW5jZWxfdG9rZW5fdHlwZSBjYW5jZWxfdG9rZW4sCi0gICAgICBjb25zdCBxdWVyeV90eXBlJiBxdWVyeSwgaW9fc2VydmljZV9pbXBsJiBpb3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiBvcGVyYXRpb24oJnJlc29sdmVfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIGNhbmNlbF90b2tlbl8oY2FuY2VsX3Rva2VuKSwKLSAgICAgIHF1ZXJ5XyhxdWVyeSksCi0gICAgICBpb19zZXJ2aWNlX2ltcGxfKGlvcyksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSksCi0gICAgICBhZGRyaW5mb18oMCkKLSAgewotICB9Ci0KLSAgfnJlc29sdmVfb3AoKQotICB7Ci0gICAgaWYgKGFkZHJpbmZvXykKLSAgICAgIHNvY2tldF9vcHM6OmZyZWVhZGRyaW5mbyhhZGRyaW5mb18pOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgLyplYyovLAotICAgICAgc3RkOjpzaXplX3QgLypieXRlc190cmFuc2ZlcnJlZCovKQotICB7Ci0gICAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIG9wZXJhdGlvbiBvYmplY3QuCi0gICAgcmVzb2x2ZV9vcCogbyhzdGF0aWNfY2FzdDxyZXNvbHZlX29wKj4oYmFzZSkpOwotICAgIHB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihvLT5oYW5kbGVyXyksIG8sIG8gfTsKLQotICAgIGlmIChvd25lciAmJiBvd25lciAhPSAmby0+aW9fc2VydmljZV9pbXBsXykKLSAgICB7Ci0gICAgICAvLyBUaGUgb3BlcmF0aW9uIGlzIGJlaW5nIHJ1biBvbiB0aGUgd29ya2VyIGlvX3NlcnZpY2UuIFRpbWUgdG8gcGVyZm9ybQotICAgICAgLy8gdGhlIHJlc29sdmVyIG9wZXJhdGlvbi4KLSAgICAKLSAgICAgIC8vIFBlcmZvcm0gdGhlIGJsb2NraW5nIGhvc3QgcmVzb2x1dGlvbiBvcGVyYXRpb24uCi0gICAgICBzb2NrZXRfb3BzOjpiYWNrZ3JvdW5kX2dldGFkZHJpbmZvKG8tPmNhbmNlbF90b2tlbl8sCi0gICAgICAgICAgby0+cXVlcnlfLmhvc3RfbmFtZSgpLmNfc3RyKCksIG8tPnF1ZXJ5Xy5zZXJ2aWNlX25hbWUoKS5jX3N0cigpLAotICAgICAgICAgIG8tPnF1ZXJ5Xy5oaW50cygpLCAmby0+YWRkcmluZm9fLCBvLT5lY18pOwotCi0gICAgICAvLyBQYXNzIG9wZXJhdGlvbiBiYWNrIHRvIG1haW4gaW9fc2VydmljZSBmb3IgY29tcGxldGlvbi4KLSAgICAgIG8tPmlvX3NlcnZpY2VfaW1wbF8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9uKG8pOwotICAgICAgcC52ID0gcC5wID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gcmV0dXJuZWQgdG8gdGhlIG1haW4gaW9fc2VydmljZS4gVGhlIGNvbXBsZXRpb24KLSAgICAgIC8vIGhhbmRsZXIgaXMgcmVhZHkgdG8gYmUgZGVsaXZlcmVkLgotCi0gICAgICBBU0lPX0hBTkRMRVJfQ09NUExFVElPTigobykpOwotCi0gICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgaGFuZGxlciBzbyB0aGF0IHRoZSBtZW1vcnkgY2FuIGJlIGRlYWxsb2NhdGVkCi0gICAgICAvLyBiZWZvcmUgdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwKLSAgICAgIC8vIGEgc3ViLW9iamVjdCBvZiB0aGUgaGFuZGxlciBtYXkgYmUgdGhlIHRydWUgb3duZXIgb2YgdGhlIG1lbW9yeQotICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGVyLiBDb25zZXF1ZW50bHksIGEgbG9jYWwgY29weSBvZiB0aGUgaGFuZGxlcgotICAgICAgLy8gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwKLSAgICAgIC8vIGFmdGVyIHdlIGhhdmUgZGVhbGxvY2F0ZWQgdGhlIG1lbW9yeSBoZXJlLgotICAgICAgZGV0YWlsOjpiaW5kZXIyPEhhbmRsZXIsIGFzaW86OmVycm9yX2NvZGUsIGl0ZXJhdG9yX3R5cGU+Ci0gICAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIG8tPmVjXywgaXRlcmF0b3JfdHlwZSgpKTsKLSAgICAgIHAuaCA9IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgaWYgKG8tPmFkZHJpbmZvXykKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlci5hcmcyXyA9IGl0ZXJhdG9yX3R5cGU6OmNyZWF0ZShvLT5hZGRyaW5mb18sCi0gICAgICAgICAgICBvLT5xdWVyeV8uaG9zdF9uYW1lKCksIG8tPnF1ZXJ5Xy5zZXJ2aWNlX25hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBwLnJlc2V0KCk7Ci0KLSAgICAgIGlmIChvd25lcikKLSAgICAgIHsKLSAgICAgICAgZmVuY2VkX2Jsb2NrIGIoZmVuY2VkX2Jsb2NrOjpoYWxmKTsKLSAgICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sICIuLi4iKSk7Ci0gICAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9FTkQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIHNvY2tldF9vcHM6OndlYWtfY2FuY2VsX3Rva2VuX3R5cGUgY2FuY2VsX3Rva2VuXzsKLSAgcXVlcnlfdHlwZSBxdWVyeV87Ci0gIGlvX3NlcnZpY2VfaW1wbCYgaW9fc2VydmljZV9pbXBsXzsKLSAgSGFuZGxlciBoYW5kbGVyXzsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlY187Ci0gIGFzaW86OmRldGFpbDo6YWRkcmluZm9fdHlwZSogYWRkcmluZm9fOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9SRVNPTFZFX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZXNvbHZlcl9zZXJ2aWNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVzb2x2ZXJfc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTVkZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9yZXNvbHZlcl9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3Jlc29sdmVyX3NlcnZpY2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfUkVTT0xWRVJfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfUkVTT0xWRVJfU0VSVklDRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jaW5jbHVkZSAiYXNpby9pcC9iYXNpY19yZXNvbHZlcl9pdGVyYXRvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9iYXNpY19yZXNvbHZlcl9xdWVyeS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZXNvbHZlX2VuZHBvaW50X29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZXNvbHZlX29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZXNvbHZlcl9zZXJ2aWNlX2Jhc2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLWNsYXNzIHJlc29sdmVyX3NlcnZpY2UgOiBwdWJsaWMgcmVzb2x2ZXJfc2VydmljZV9iYXNlCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiB0eXBlIG9mIHRoZSByZXNvbHZlci4gQSBjYW5jZWxsYXRpb24gdG9rZW4gaXMgdXNlZCB0bwotICAvLyBpbmRpY2F0ZSB0byB0aGUgYmFja2dyb3VuZCB0aHJlYWQgdGhhdCB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4KLSAgdHlwZWRlZiBzb2NrZXRfb3BzOjpzaGFyZWRfY2FuY2VsX3Rva2VuX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLQotICAvLyBUaGUgZW5kcG9pbnQgdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQgZW5kcG9pbnRfdHlwZTsKLQotICAvLyBUaGUgcXVlcnkgdHlwZS4KLSAgdHlwZWRlZiBhc2lvOjppcDo6YmFzaWNfcmVzb2x2ZXJfcXVlcnk8UHJvdG9jb2w+IHF1ZXJ5X3R5cGU7Ci0KLSAgLy8gVGhlIGl0ZXJhdG9yIHR5cGUuCi0gIHR5cGVkZWYgYXNpbzo6aXA6OmJhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yPFByb3RvY29sPiBpdGVyYXRvcl90eXBlOwotCi0gIC8vIENvbnN0cnVjdG9yLgotICByZXNvbHZlcl9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiByZXNvbHZlcl9zZXJ2aWNlX2Jhc2UoaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8gUmVzb2x2ZSBhIHF1ZXJ5IHRvIGEgbGlzdCBvZiBlbnRyaWVzLgotICBpdGVyYXRvcl90eXBlIHJlc29sdmUoaW1wbGVtZW50YXRpb25fdHlwZSYsIGNvbnN0IHF1ZXJ5X3R5cGUmIHF1ZXJ5LAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBhc2lvOjpkZXRhaWw6OmFkZHJpbmZvX3R5cGUqIGFkZHJlc3NfaW5mbyA9IDA7Ci0KLSAgICBzb2NrZXRfb3BzOjpnZXRhZGRyaW5mbyhxdWVyeS5ob3N0X25hbWUoKS5jX3N0cigpLAotICAgICAgICBxdWVyeS5zZXJ2aWNlX25hbWUoKS5jX3N0cigpLCBxdWVyeS5oaW50cygpLCAmYWRkcmVzc19pbmZvLCBlYyk7Ci0gICAgYXV0b19hZGRyaW5mbyBhdXRvX2FkZHJlc3NfaW5mbyhhZGRyZXNzX2luZm8pOwotCi0gICAgcmV0dXJuIGVjID8gaXRlcmF0b3JfdHlwZSgpIDogaXRlcmF0b3JfdHlwZTo6Y3JlYXRlKAotICAgICAgICBhZGRyZXNzX2luZm8sIHF1ZXJ5Lmhvc3RfbmFtZSgpLCBxdWVyeS5zZXJ2aWNlX25hbWUoKSk7Ci0gIH0KLQotICAvLyBBc3luY2hyb25vdXNseSByZXNvbHZlIGEgcXVlcnkgdG8gYSBsaXN0IG9mIGVudHJpZXMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3Jlc29sdmUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHF1ZXJ5X3R5cGUmIHF1ZXJ5LCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHJlc29sdmVfb3A8UHJvdG9jb2wsIEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGltcGwsIHF1ZXJ5LCBpb19zZXJ2aWNlX2ltcGxfLCBoYW5kbGVyKTsKLQotICAgIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAicmVzb2x2ZXIiLCAmaW1wbCwgImFzeW5jX3Jlc29sdmUiKSk7Ci0KLSAgICBzdGFydF9yZXNvbHZlX29wKHAucCk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotCi0gIC8vIFJlc29sdmUgYW4gZW5kcG9pbnQgdG8gYSBsaXN0IG9mIGVudHJpZXMuCi0gIGl0ZXJhdG9yX3R5cGUgcmVzb2x2ZShpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIGVuZHBvaW50LCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGNoYXIgaG9zdF9uYW1lW05JX01BWEhPU1RdOwotICAgIGNoYXIgc2VydmljZV9uYW1lW05JX01BWFNFUlZdOwotICAgIHNvY2tldF9vcHM6OnN5bmNfZ2V0bmFtZWluZm8oZW5kcG9pbnQuZGF0YSgpLCBlbmRwb2ludC5zaXplKCksCi0gICAgICAgIGhvc3RfbmFtZSwgTklfTUFYSE9TVCwgc2VydmljZV9uYW1lLCBOSV9NQVhTRVJWLAotICAgICAgICBlbmRwb2ludC5wcm90b2NvbCgpLnR5cGUoKSwgZWMpOwotCi0gICAgcmV0dXJuIGVjID8gaXRlcmF0b3JfdHlwZSgpIDogaXRlcmF0b3JfdHlwZTo6Y3JlYXRlKAotICAgICAgICBlbmRwb2ludCwgaG9zdF9uYW1lLCBzZXJ2aWNlX25hbWUpOwotICB9Ci0KLSAgLy8gQXN5bmNocm9ub3VzbHkgcmVzb2x2ZSBhbiBlbmRwb2ludCB0byBhIGxpc3Qgb2YgZW50cmllcy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVzb2x2ZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgZW5kcG9pbnQsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgcmVzb2x2ZV9lbmRwb2ludF9vcDxQcm90b2NvbCwgSGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaW1wbCwgZW5kcG9pbnQsIGlvX3NlcnZpY2VfaW1wbF8sIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJyZXNvbHZlciIsICZpbXBsLCAiYXN5bmNfcmVzb2x2ZSIpKTsKLQotICAgIHN0YXJ0X3Jlc29sdmVfb3AocC5wKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfUkVTT0xWRVJfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVzb2x2ZXJfc2VydmljZV9iYXNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvcmVzb2x2ZXJfc2VydmljZV9iYXNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxYWU5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Jlc29sdmVyX3NlcnZpY2VfYmFzZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9yZXNvbHZlcl9zZXJ2aWNlX2Jhc2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9SRVNPTFZFUl9TRVJWSUNFX0JBU0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1JFU09MVkVSX1NFUlZJQ0VfQkFTRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL211dGV4LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BlcmF0aW9uLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfb3BzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Njb3BlZF9wdHIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RocmVhZC5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3MgcmVzb2x2ZXJfc2VydmljZV9iYXNlCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiB0eXBlIG9mIHRoZSByZXNvbHZlci4gQSBjYW5jZWxsYXRpb24gdG9rZW4gaXMgdXNlZCB0bwotICAvLyBpbmRpY2F0ZSB0byB0aGUgYmFja2dyb3VuZCB0aHJlYWQgdGhhdCB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4KLSAgdHlwZWRlZiBzb2NrZXRfb3BzOjpzaGFyZWRfY2FuY2VsX3Rva2VuX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIHJlc29sdmVyX3NlcnZpY2VfYmFzZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKTsKLQotICAvLyBEZXN0cnVjdG9yLgotICBBU0lPX0RFQ0wgfnJlc29sdmVyX3NlcnZpY2VfYmFzZSgpOwotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIEFTSU9fREVDTCB2b2lkIHNodXRkb3duX3NlcnZpY2UoKTsKLQotICAvLyBQZXJmb3JtIGFueSBmb3JrLXJlbGF0ZWQgaG91c2VrZWVwaW5nLgotICBBU0lPX0RFQ0wgdm9pZCBmb3JrX3NlcnZpY2UoCi0gICAgICBhc2lvOjppb19zZXJ2aWNlOjpmb3JrX2V2ZW50IGZvcmtfZXYpOwotCi0gIC8vIENvbnN0cnVjdCBhIG5ldyByZXNvbHZlciBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpOwotCi0gIC8vIERlc3Ryb3kgYSByZXNvbHZlciBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgZGVzdHJveShpbXBsZW1lbnRhdGlvbl90eXBlJik7Ci0KLSAgLy8gQ2FuY2VsIHBlbmRpbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCi0gIEFTSU9fREVDTCB2b2lkIGNhbmNlbChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKTsKLQotcHJvdGVjdGVkOgotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gc3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlc29sdmUgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF9yZXNvbHZlX29wKG9wZXJhdGlvbiogb3ApOwotCi0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gIC8vIEhlbHBlciBjbGFzcyB0byBwZXJmb3JtIGV4Y2VwdGlvbi1zYWZlIGNsZWFudXAgb2YgYWRkcmluZm8gb2JqZWN0cy4KLSAgY2xhc3MgYXV0b19hZGRyaW5mbwotICAgIDogcHJpdmF0ZSBhc2lvOjpkZXRhaWw6Om5vbmNvcHlhYmxlCi0gIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IGF1dG9fYWRkcmluZm8oYXNpbzo6ZGV0YWlsOjphZGRyaW5mb190eXBlKiBhaSkKLSAgICAgIDogYWlfKGFpKQotICAgIHsKLSAgICB9Ci0KLSAgICB+YXV0b19hZGRyaW5mbygpCi0gICAgewotICAgICAgaWYgKGFpXykKLSAgICAgICAgc29ja2V0X29wczo6ZnJlZWFkZHJpbmZvKGFpXyk7Ci0gICAgfQotCi0gICAgb3BlcmF0b3IgYXNpbzo6ZGV0YWlsOjphZGRyaW5mb190eXBlKigpCi0gICAgewotICAgICAgcmV0dXJuIGFpXzsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBhc2lvOjpkZXRhaWw6OmFkZHJpbmZvX3R5cGUqIGFpXzsKLSAgfTsKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotICAvLyBIZWxwZXIgY2xhc3MgdG8gcnVuIHRoZSB3b3JrIGlvX3NlcnZpY2UgaW4gYSB0aHJlYWQuCi0gIGNsYXNzIHdvcmtfaW9fc2VydmljZV9ydW5uZXI7Ci0KLSAgLy8gU3RhcnQgdGhlIHdvcmsgdGhyZWFkIGlmIGl0J3Mgbm90IGFscmVhZHkgcnVubmluZy4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfd29ya190aHJlYWQoKTsKLQotICAvLyBUaGUgaW9fc2VydmljZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHBvc3QgY29tcGxldGlvbnMuCi0gIGlvX3NlcnZpY2VfaW1wbCYgaW9fc2VydmljZV9pbXBsXzsKLQotcHJpdmF0ZToKLSAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhY2Nlc3MgdG8gaW50ZXJuYWwgZGF0YS4KLSAgYXNpbzo6ZGV0YWlsOjptdXRleCBtdXRleF87Ci0KLSAgLy8gUHJpdmF0ZSBpb19zZXJ2aWNlIHVzZWQgZm9yIHBlcmZvcm1pbmcgYXN5bmNocm9ub3VzIGhvc3QgcmVzb2x1dGlvbi4KLSAgYXNpbzo6ZGV0YWlsOjpzY29wZWRfcHRyPGFzaW86OmlvX3NlcnZpY2U+IHdvcmtfaW9fc2VydmljZV87Ci0KLSAgLy8gVGhlIHdvcmsgaW9fc2VydmljZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHBvc3QgY29tcGxldGlvbnMuCi0gIGlvX3NlcnZpY2VfaW1wbCYgd29ya19pb19zZXJ2aWNlX2ltcGxfOwotCi0gIC8vIFdvcmsgZm9yIHRoZSBwcml2YXRlIGlvX3NlcnZpY2UgdG8gcGVyZm9ybS4KLSAgYXNpbzo6ZGV0YWlsOjpzY29wZWRfcHRyPGFzaW86OmlvX3NlcnZpY2U6Ondvcms+IHdvcmtfOwotCi0gIC8vIFRocmVhZCB1c2VkIGZvciBydW5uaW5nIHRoZSB3b3JrIGlvX3NlcnZpY2UncyBydW4gbG9vcC4KLSAgYXNpbzo6ZGV0YWlsOjpzY29wZWRfcHRyPGFzaW86OmRldGFpbDo6dGhyZWFkPiB3b3JrX3RocmVhZF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9yZXNvbHZlcl9zZXJ2aWNlX2Jhc2UuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1JFU09MVkVSX1NFUlZJQ0VfQkFTRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2NvcGVkX2xvY2suaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zY29wZWRfbG9jay5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDZjOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zY29wZWRfbG9jay5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zY29wZWRfbG9jay5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfU0NPUEVEX0xPQ0tfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NDT1BFRF9MT0NLX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotLy8gSGVscGVyIGNsYXNzIHRvIGxvY2sgYW5kIHVubG9jayBhIG11dGV4IGF1dG9tYXRpY2FsbHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0ZXg+Ci1jbGFzcyBzY29wZWRfbG9jawotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8gVGFnIHR5cGUgdXNlZCB0byBkaXN0aW5ndWlzaCBjb25zdHJ1Y3RvcnMuCi0gIGVudW0gYWRvcHRfbG9ja190IHsgYWRvcHRfbG9jayB9OwotCi0gIC8vIENvbnN0cnVjdG9yIGFkb3B0cyBhIGxvY2sgdGhhdCBpcyBhbHJlYWR5IGhlbGQuCi0gIHNjb3BlZF9sb2NrKE11dGV4JiBtLCBhZG9wdF9sb2NrX3QpCi0gICAgOiBtdXRleF8obSksCi0gICAgICBsb2NrZWRfKHRydWUpCi0gIHsKLSAgfQotCi0gIC8vIENvbnN0cnVjdG9yIGFjcXVpcmVzIHRoZSBsb2NrLgotICBleHBsaWNpdCBzY29wZWRfbG9jayhNdXRleCYgbSkKLSAgICA6IG11dGV4XyhtKQotICB7Ci0gICAgbXV0ZXhfLmxvY2soKTsKLSAgICBsb2NrZWRfID0gdHJ1ZTsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IgcmVsZWFzZXMgdGhlIGxvY2suCi0gIH5zY29wZWRfbG9jaygpCi0gIHsKLSAgICBpZiAobG9ja2VkXykKLSAgICAgIG11dGV4Xy51bmxvY2soKTsKLSAgfQotCi0gIC8vIEV4cGxpY2l0bHkgYWNxdWlyZSB0aGUgbG9jay4KLSAgdm9pZCBsb2NrKCkKLSAgewotICAgIGlmICghbG9ja2VkXykKLSAgICB7Ci0gICAgICBtdXRleF8ubG9jaygpOwotICAgICAgbG9ja2VkXyA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLy8gRXhwbGljaXRseSByZWxlYXNlIHRoZSBsb2NrLgotICB2b2lkIHVubG9jaygpCi0gIHsKLSAgICBpZiAobG9ja2VkXykKLSAgICB7Ci0gICAgICBtdXRleF8udW5sb2NrKCk7Ci0gICAgICBsb2NrZWRfID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gVGVzdCB3aGV0aGVyIHRoZSBsb2NrIGlzIGhlbGQuCi0gIGJvb2wgbG9ja2VkKCkgY29uc3QKLSAgewotICAgIHJldHVybiBsb2NrZWRfOwotICB9Ci0KLSAgLy8gR2V0IHRoZSB1bmRlcmx5aW5nIG11dGV4LgotICBNdXRleCYgbXV0ZXgoKQotICB7Ci0gICAgcmV0dXJuIG11dGV4XzsKLSAgfQotCi1wcml2YXRlOgotICAvLyBUaGUgdW5kZXJseWluZyBtdXRleC4KLSAgTXV0ZXgmIG11dGV4XzsKLQotICAvLyBXaGV0aGVyIHRoZSBtdXRleCBpcyBjdXJyZW50bHkgbG9ja2VkIG9yIHVubG9ja2VkLgotICBib29sIGxvY2tlZF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NDT1BFRF9MT0NLX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zY29wZWRfcHRyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2NvcGVkX3B0ci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYWEwY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zY29wZWRfcHRyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvc2NvcGVkX3B0ci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9TQ09QRURfUFRSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9TQ09QRURfUFRSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3Mgc2NvcGVkX3B0cgotewotcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgZXhwbGljaXQgc2NvcGVkX3B0cihUKiBwID0gMCkKLSAgICA6IHBfKHApCi0gIHsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IuCi0gIH5zY29wZWRfcHRyKCkKLSAgewotICAgIGRlbGV0ZSBwXzsKLSAgfQotCi0gIC8vIEFjY2Vzcy4KLSAgVCogZ2V0KCkKLSAgewotICAgIHJldHVybiBwXzsKLSAgfQotCi0gIC8vIEFjY2Vzcy4KLSAgVCogb3BlcmF0b3ItPigpCi0gIHsKLSAgICByZXR1cm4gcF87Ci0gIH0KLQotICAvLyBEZXJlZmVyZW5jZS4KLSAgVCYgb3BlcmF0b3IqKCkKLSAgewotICAgIHJldHVybiAqcF87Ci0gIH0KLQotICAvLyBSZXNldCBwb2ludGVyLgotICB2b2lkIHJlc2V0KFQqIHAgPSAwKQotICB7Ci0gICAgZGVsZXRlIHBfOwotICAgIHBfID0gcDsKLSAgfQotCi1wcml2YXRlOgotICAvLyBEaXNhbGxvdyBjb3B5aW5nIGFuZCBhc3NpZ25tZW50LgotICBzY29wZWRfcHRyKGNvbnN0IHNjb3BlZF9wdHImKTsKLSAgc2NvcGVkX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHNjb3BlZF9wdHImKTsKLQotICBUKiBwXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfU0NPUEVEX1BUUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2VsZWN0X2ludGVycnVwdGVyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2VsZWN0X2ludGVycnVwdGVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiODM1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLwotLy8gZGV0YWlsL3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1NFTEVDVF9JTlRFUlJVUFRFUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfU0VMRUNUX0lOVEVSUlVQVEVSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXIuaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19FVkVOVEZEKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9ldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAiCi0jZWxzZQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9waXBlX3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAiCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi10eXBlZGVmIHNvY2tldF9zZWxlY3RfaW50ZXJydXB0ZXIgc2VsZWN0X2ludGVycnVwdGVyOwotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19FVkVOVEZEKQotdHlwZWRlZiBldmVudGZkX3NlbGVjdF9pbnRlcnJ1cHRlciBzZWxlY3RfaW50ZXJydXB0ZXI7Ci0jZWxzZQotdHlwZWRlZiBwaXBlX3NlbGVjdF9pbnRlcnJ1cHRlciBzZWxlY3RfaW50ZXJydXB0ZXI7Ci0jZW5kaWYKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NFTEVDVF9JTlRFUlJVUFRFUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2VsZWN0X3JlYWN0b3IuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zZWxlY3RfcmVhY3Rvci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YzBjYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zZWxlY3RfcmVhY3Rvci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zZWxlY3RfcmVhY3Rvci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfU0VMRUNUX1JFQUNUT1JfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NFTEVDVF9SRUFDVE9SX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKSBcCi0gIHx8ICghZGVmaW5lZChBU0lPX0hBU19ERVZfUE9MTCkgXAotICAgICAgJiYgIWRlZmluZWQoQVNJT19IQVNfRVBPTEwpIFwKLSAgICAgICYmICFkZWZpbmVkKEFTSU9fSEFTX0tRVUVVRSkgXAotICAgICAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpKQotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZF9zZXRfYWRhcHRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbGltaXRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9tdXRleC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BfcXVldWUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3Jfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3Jfb3BfcXVldWUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9iYXNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9zZXQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dhaXRfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3RocmVhZC5ocHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHNlbGVjdF9yZWFjdG9yCi0gIDogcHVibGljIGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPHNlbGVjdF9yZWFjdG9yPgotewotcHVibGljOgotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGVudW0gb3BfdHlwZXMgeyByZWFkX29wID0gMCwgd3JpdGVfb3AgPSAxLCBleGNlcHRfb3AgPSAyLAotICAgIG1heF9zZWxlY3Rfb3BzID0gMywgY29ubmVjdF9vcCA9IDMsIG1heF9vcHMgPSA0IH07Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICBlbnVtIG9wX3R5cGVzIHsgcmVhZF9vcCA9IDAsIHdyaXRlX29wID0gMSwgZXhjZXB0X29wID0gMiwKLSAgICBtYXhfc2VsZWN0X29wcyA9IDMsIGNvbm5lY3Rfb3AgPSAxLCBtYXhfb3BzID0gMyB9OwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSAgLy8gUGVyLWRlc2NyaXB0b3IgZGF0YS4KLSAgc3RydWN0IHBlcl9kZXNjcmlwdG9yX2RhdGEKLSAgewotICB9OwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgc2VsZWN0X3JlYWN0b3IoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIH5zZWxlY3RfcmVhY3RvcigpOwotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIEFTSU9fREVDTCB2b2lkIHNodXRkb3duX3NlcnZpY2UoKTsKLQotICAvLyBSZWNyZWF0ZSBpbnRlcm5hbCBkZXNjcmlwdG9ycyBmb2xsb3dpbmcgYSBmb3JrLgotICBBU0lPX0RFQ0wgdm9pZCBmb3JrX3NlcnZpY2UoCi0gICAgICBhc2lvOjppb19zZXJ2aWNlOjpmb3JrX2V2ZW50IGZvcmtfZXYpOwotCi0gIC8vIEluaXRpYWxpc2UgdGhlIHRhc2ssIGJ1dCBvbmx5IGlmIHRoZSByZWFjdG9yIGlzIG5vdCBpbiBpdHMgb3duIHRocmVhZC4KLSAgQVNJT19ERUNMIHZvaWQgaW5pdF90YXNrKCk7Ci0KLSAgLy8gUmVnaXN0ZXIgYSBzb2NrZXQgd2l0aCB0aGUgcmVhY3Rvci4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIHN5c3RlbSBlcnJvcgotICAvLyBjb2RlIG9uIGZhaWx1cmUuCi0gIEFTSU9fREVDTCBpbnQgcmVnaXN0ZXJfZGVzY3JpcHRvcihzb2NrZXRfdHlwZSwgcGVyX2Rlc2NyaXB0b3JfZGF0YSYpOwotCi0gIC8vIFJlZ2lzdGVyIGEgZGVzY3JpcHRvciB3aXRoIGFuIGFzc29jaWF0ZWQgc2luZ2xlIG9wZXJhdGlvbi4gUmV0dXJucyAwIG9uCi0gIC8vIHN1Y2Nlc3MsIHN5c3RlbSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gIEFTSU9fREVDTCBpbnQgcmVnaXN0ZXJfaW50ZXJuYWxfZGVzY3JpcHRvcigKLSAgICAgIGludCBvcF90eXBlLCBzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLAotICAgICAgcGVyX2Rlc2NyaXB0b3JfZGF0YSYgZGVzY3JpcHRvcl9kYXRhLCByZWFjdG9yX29wKiBvcCk7Ci0KLSAgLy8gUG9zdCBhIHJlYWN0b3Igb3BlcmF0aW9uIGZvciBpbW1lZGlhdGUgY29tcGxldGlvbi4KLSAgdm9pZCBwb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKHJlYWN0b3Jfb3AqIG9wLCBib29sIGlzX2NvbnRpbnVhdGlvbikKLSAgewotICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ob3AsIGlzX2NvbnRpbnVhdGlvbik7Ci0gIH0KLQotICAvLyBTdGFydCBhIG5ldyBvcGVyYXRpb24uIFRoZSByZWFjdG9yIG9wZXJhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCB3aGVuIHRoZQotICAvLyBnaXZlbiBkZXNjcmlwdG9yIGlzIGZsYWdnZWQgYXMgcmVhZHksIG9yIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfb3AoaW50IG9wX3R5cGUsIHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiwgcmVhY3Rvcl9vcCogb3AsIGJvb2wgaXNfY29udGludWF0aW9uLCBib29sKTsKLQotICAvLyBDYW5jZWwgYWxsIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdG9yLiBUaGUKLSAgLy8gaGFuZGxlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXNjcmlwdG9yIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZQotICAvLyBvcGVyYXRpb25fYWJvcnRlZCBlcnJvci4KLSAgQVNJT19ERUNMIHZvaWQgY2FuY2VsX29wcyhzb2NrZXRfdHlwZSBkZXNjcmlwdG9yLCBwZXJfZGVzY3JpcHRvcl9kYXRhJik7Ci0KLSAgLy8gQ2FuY2VsIGFueSBvcGVyYXRpb25zIHRoYXQgYXJlIHJ1bm5pbmcgYWdhaW5zdCB0aGUgZGVzY3JpcHRvciBhbmQgcmVtb3ZlCi0gIC8vIGl0cyByZWdpc3RyYXRpb24gZnJvbSB0aGUgcmVhY3Rvci4KLSAgQVNJT19ERUNMIHZvaWQgZGVyZWdpc3Rlcl9kZXNjcmlwdG9yKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiwgYm9vbCBjbG9zaW5nKTsKLQotICAvLyBSZW1vdGUgdGhlIGRlc2NyaXB0b3IncyByZWdpc3RyYXRpb24gZnJvbSB0aGUgcmVhY3Rvci4KLSAgQVNJT19ERUNMIHZvaWQgZGVyZWdpc3Rlcl9pbnRlcm5hbF9kZXNjcmlwdG9yKAotICAgICAgc29ja2V0X3R5cGUgZGVzY3JpcHRvciwgcGVyX2Rlc2NyaXB0b3JfZGF0YSYgZGVzY3JpcHRvcl9kYXRhKTsKLQotICAvLyBNb3ZlIGRlc2NyaXB0b3IgcmVnaXN0cmF0aW9uIGZyb20gb25lIGRlc2NyaXB0b3JfZGF0YSBvYmplY3QgdG8gYW5vdGhlci4KLSAgQVNJT19ERUNMIHZvaWQgbW92ZV9kZXNjcmlwdG9yKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBwZXJfZGVzY3JpcHRvcl9kYXRhJiB0YXJnZXRfZGVzY3JpcHRvcl9kYXRhLAotICAgICAgcGVyX2Rlc2NyaXB0b3JfZGF0YSYgc291cmNlX2Rlc2NyaXB0b3JfZGF0YSk7Ci0KLSAgLy8gQWRkIGEgbmV3IHRpbWVyIHF1ZXVlIHRvIHRoZSByZWFjdG9yLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci0gIHZvaWQgYWRkX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUpOwotCi0gIC8vIFJlbW92ZSBhIHRpbWVyIHF1ZXVlIGZyb20gdGhlIHJlYWN0b3IuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLSAgdm9pZCByZW1vdmVfdGltZXJfcXVldWUodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSk7Ci0KLSAgLy8gU2NoZWR1bGUgYSBuZXcgb3BlcmF0aW9uIGluIHRoZSBnaXZlbiB0aW1lciBxdWV1ZSB0byBleHBpcmUgYXQgdGhlCi0gIC8vIHNwZWNpZmllZCBhYnNvbHV0ZSB0aW1lLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci0gIHZvaWQgc2NoZWR1bGVfdGltZXIodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFRpbWVfVHJhaXRzOjp0aW1lX3R5cGUmIHRpbWUsCi0gICAgICB0eXBlbmFtZSB0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz46OnBlcl90aW1lcl9kYXRhJiB0aW1lciwgd2FpdF9vcCogb3ApOwotCi0gIC8vIENhbmNlbCB0aGUgdGltZXIgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRva2VuLiBSZXR1cm5zIHRoZQotICAvLyBudW1iZXIgb2Ygb3BlcmF0aW9ucyB0aGF0IGhhdmUgYmVlbiBwb3N0ZWQgb3IgZGlzcGF0Y2hlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotICBzdGQ6OnNpemVfdCBjYW5jZWxfdGltZXIodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSwKLSAgICAgIHR5cGVuYW1lIHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPjo6cGVyX3RpbWVyX2RhdGEmIHRpbWVyLAotICAgICAgc3RkOjpzaXplX3QgbWF4X2NhbmNlbGxlZCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHN0ZDo6c2l6ZV90Pjo6bWF4KSgpKTsKLQotICAvLyBSdW4gc2VsZWN0IG9uY2UgdW50aWwgaW50ZXJydXB0ZWQgb3IgZXZlbnRzIGFyZSByZWFkeSB0byBiZSBkaXNwYXRjaGVkLgotICBBU0lPX0RFQ0wgdm9pZCBydW4oYm9vbCBibG9jaywgb3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzKTsKLQotICAvLyBJbnRlcnJ1cHQgdGhlIHNlbGVjdCBsb29wLgotICBBU0lPX0RFQ0wgdm9pZCBpbnRlcnJ1cHQoKTsKLQotcHJpdmF0ZToKLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gIC8vIFJ1biB0aGUgc2VsZWN0IGxvb3AgaW4gdGhlIHRocmVhZC4KLSAgQVNJT19ERUNMIHZvaWQgcnVuX3RocmVhZCgpOwotCi0gIC8vIEVudHJ5IHBvaW50IGZvciB0aGUgc2VsZWN0IGxvb3AgdGhyZWFkLgotICBBU0lPX0RFQ0wgc3RhdGljIHZvaWQgY2FsbF9ydW5fdGhyZWFkKHNlbGVjdF9yZWFjdG9yKiByZWFjdG9yKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGFkZCBhIG5ldyB0aW1lciBxdWV1ZS4KLSAgQVNJT19ERUNMIHZvaWQgZG9fYWRkX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlX2Jhc2UmIHF1ZXVlKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGEgdGltZXIgcXVldWUuCi0gIEFTSU9fREVDTCB2b2lkIGRvX3JlbW92ZV90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZV9iYXNlJiBxdWV1ZSk7Ci0KLSAgLy8gR2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciB0aGUgc2VsZWN0IGNhbGwuCi0gIEFTSU9fREVDTCB0aW1ldmFsKiBnZXRfdGltZW91dCh0aW1ldmFsJiB0dik7Ci0KLSAgLy8gQ2FuY2VsIGFsbCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4gVGhpcyBmdW5jdGlvbgotICAvLyBkb2VzIG5vdCBhY3F1aXJlIHRoZSBzZWxlY3RfcmVhY3RvcidzIG11dGV4LgotICBBU0lPX0RFQ0wgdm9pZCBjYW5jZWxfb3BzX3VubG9ja2VkKHNvY2tldF90eXBlIGRlc2NyaXB0b3IsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gVGhlIGlvX3NlcnZpY2UgaW1wbGVtZW50YXRpb24gdXNlZCB0byBwb3N0IGNvbXBsZXRpb25zLgotICBpb19zZXJ2aWNlX2ltcGwmIGlvX3NlcnZpY2VfOwotCi0gIC8vIE11dGV4IHRvIHByb3RlY3QgYWNjZXNzIHRvIGludGVybmFsIGRhdGEuCi0gIGFzaW86OmRldGFpbDo6bXV0ZXggbXV0ZXhfOwotCi0gIC8vIFRoZSBpbnRlcnJ1cHRlciBpcyB1c2VkIHRvIGJyZWFrIGEgYmxvY2tpbmcgc2VsZWN0IGNhbGwuCi0gIHNlbGVjdF9pbnRlcnJ1cHRlciBpbnRlcnJ1cHRlcl87Ci0KLSAgLy8gVGhlIHF1ZXVlcyBvZiByZWFkLCB3cml0ZSBhbmQgZXhjZXB0IG9wZXJhdGlvbnMuCi0gIHJlYWN0b3Jfb3BfcXVldWU8c29ja2V0X3R5cGU+IG9wX3F1ZXVlX1ttYXhfb3BzXTsKLQotICAvLyBUaGUgZmlsZSBkZXNjcmlwdG9yIHNldHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBzZWxlY3Qgc3lzdGVtIGNhbGwuCi0gIGZkX3NldF9hZGFwdGVyIGZkX3NldHNfW21heF9zZWxlY3Rfb3BzXTsKLQotICAvLyBUaGUgdGltZXIgcXVldWVzLgotICB0aW1lcl9xdWV1ZV9zZXQgdGltZXJfcXVldWVzXzsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSAgLy8gRG9lcyB0aGUgcmVhY3RvciBsb29wIHRocmVhZCBuZWVkIHRvIHN0b3AuCi0gIGJvb2wgc3RvcF90aHJlYWRfOwotCi0gIC8vIFRoZSB0aHJlYWQgdGhhdCBpcyBydW5uaW5nIHRoZSByZWFjdG9yIGxvb3AuCi0gIGFzaW86OmRldGFpbDo6dGhyZWFkKiB0aHJlYWRfOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotICAvLyBXaGV0aGVyIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIHNodXQgZG93bi4KLSAgYm9vbCBzaHV0ZG93bl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvc2VsZWN0X3JlYWN0b3IuaHBwIgotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9zZWxlY3RfcmVhY3Rvci5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotICAgICAgIC8vICAgfHwgKCFkZWZpbmVkKEFTSU9fSEFTX0RFVl9QT0xMKQotICAgICAgIC8vICAgICAgICYmICFkZWZpbmVkKEFTSU9fSEFTX0VQT0xMKQotICAgICAgIC8vICAgICAgICYmICFkZWZpbmVkKEFTSU9fSEFTX0tRVUVVRSkKLSAgICAgICAvLyAgICAgICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9TRUxFQ1RfUkVBQ1RPUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2VydmljZV9yZWdpc3RyeS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NlcnZpY2VfcmVnaXN0cnkuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmZkYjg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2VydmljZV9yZWdpc3RyeS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zZXJ2aWNlX3JlZ2lzdHJ5LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1NFUlZJQ0VfUkVHSVNUUllfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NFUlZJQ0VfUkVHSVNUUllfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8dHlwZWluZm8+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbXV0ZXguaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgdHlwZWlkX3dyYXBwZXIge307Ci0KLWNsYXNzIHNlcnZpY2VfcmVnaXN0cnkKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLiBBZGRzIHRoZSBpbml0aWFsIHNlcnZpY2UuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2aWNlLCB0eXBlbmFtZSBBcmc+Ci0gIHNlcnZpY2VfcmVnaXN0cnkoYXNpbzo6aW9fc2VydmljZSYgbywKLSAgICAgIFNlcnZpY2UqIGluaXRpYWxfc2VydmljZSwgQXJnIGFyZyk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIH5zZXJ2aWNlX3JlZ2lzdHJ5KCk7Ci0KLSAgLy8gTm90aWZ5IGFsbCBzZXJ2aWNlcyBvZiBhIGZvcmsgZXZlbnQuCi0gIEFTSU9fREVDTCB2b2lkIG5vdGlmeV9mb3JrKGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfZXZlbnQgZm9ya19ldik7Ci0KLSAgLy8gR2V0IHRoZSBmaXJzdCBzZXJ2aWNlIG9iamVjdCBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4gQ2FsbGVkIGR1cmluZwotICAvLyBpb19zZXJ2aWNlIGNvbnN0cnVjdGlvbiBhbmQgc28gcGVyZm9ybXMgbm8gbG9ja2luZyBvciB0eXBlIGNoZWNraW5nLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmljZT4KLSAgU2VydmljZSYgZmlyc3Rfc2VydmljZSgpOwotCi0gIC8vIEdldCB0aGUgc2VydmljZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgdHlwZS4gV2lsbAotICAvLyBjcmVhdGUgYSBuZXcgc2VydmljZSBvYmplY3QgYXV0b21hdGljYWxseSBpZiBubyBzdWNoIG9iamVjdCBhbHJlYWR5Ci0gIC8vIGV4aXN0cy4gT3duZXJzaGlwIG9mIHRoZSBzZXJ2aWNlIG9iamVjdCBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2U+Ci0gIFNlcnZpY2UmIHVzZV9zZXJ2aWNlKCk7Ci0KLSAgLy8gQWRkIGEgc2VydmljZSBvYmplY3QuIFRocm93cyBvbiBlcnJvciwgaW4gd2hpY2ggY2FzZSBvd25lcnNoaXAgb2YgdGhlCi0gIC8vIG9iamVjdCBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmljZT4KLSAgdm9pZCBhZGRfc2VydmljZShTZXJ2aWNlKiBuZXdfc2VydmljZSk7Ci0KLSAgLy8gQ2hlY2sgd2hldGhlciBhIHNlcnZpY2Ugb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhbHJlYWR5IGV4aXN0cy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2U+Ci0gIGJvb2wgaGFzX3NlcnZpY2UoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgLy8gSW5pdGlhbGlzZSBhIHNlcnZpY2UncyBrZXkgYmFzZWQgb24gaXRzIGlkLgotICBBU0lPX0RFQ0wgc3RhdGljIHZvaWQgaW5pdF9rZXkoCi0gICAgICBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlOjprZXkmIGtleSwKLSAgICAgIGNvbnN0IGFzaW86OmlvX3NlcnZpY2U6OmlkJiBpZCk7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX1RZUEVJRCkKLSAgLy8gSW5pdGlhbGlzZSBhIHNlcnZpY2UncyBrZXkgYmFzZWQgb24gaXRzIGlkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmljZT4KLSAgc3RhdGljIHZvaWQgaW5pdF9rZXkoYXNpbzo6aW9fc2VydmljZTo6c2VydmljZTo6a2V5JiBrZXksCi0gICAgICBjb25zdCBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfaWQ8U2VydmljZT4mIC8qaWQqLyk7Ci0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19UWVBFSUQpCi0KLSAgLy8gQ2hlY2sgaWYgYSBzZXJ2aWNlIG1hdGNoZXMgdGhlIGdpdmVuIGlkLgotICBBU0lPX0RFQ0wgc3RhdGljIGJvb2wga2V5c19tYXRjaCgKLSAgICAgIGNvbnN0IGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2U6OmtleSYga2V5MSwKLSAgICAgIGNvbnN0IGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2U6OmtleSYga2V5Mik7Ci0KLSAgLy8gVGhlIHR5cGUgb2YgYSBmYWN0b3J5IGZ1bmN0aW9uIHVzZWQgZm9yIGNyZWF0aW5nIGEgc2VydmljZSBpbnN0YW5jZS4KLSAgdHlwZWRlZiBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlKgotICAgICgqZmFjdG9yeV90eXBlKShhc2lvOjppb19zZXJ2aWNlJik7Ci0KLSAgLy8gRmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBzZXJ2aWNlIGluc3RhbmNlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmljZT4KLSAgc3RhdGljIGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2UqIGNyZWF0ZSgKLSAgICAgIGFzaW86OmlvX3NlcnZpY2UmIG93bmVyKTsKLQotICAvLyBEZXN0cm95IGEgc2VydmljZSBpbnN0YW5jZS4KLSAgQVNJT19ERUNMIHN0YXRpYyB2b2lkIGRlc3Ryb3koCi0gICAgICBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlKiBzZXJ2aWNlKTsKLQotICAvLyBIZWxwZXIgY2xhc3MgdG8gbWFuYWdlIHNlcnZpY2UgcG9pbnRlcnMuCi0gIHN0cnVjdCBhdXRvX3NlcnZpY2VfcHRyOwotICBmcmllbmQgc3RydWN0IGF1dG9fc2VydmljZV9wdHI7Ci0gIHN0cnVjdCBhdXRvX3NlcnZpY2VfcHRyCi0gIHsKLSAgICBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlKiBwdHJfOwotICAgIH5hdXRvX3NlcnZpY2VfcHRyKCkgeyBkZXN0cm95KHB0cl8pOyB9Ci0gIH07Ci0KLSAgLy8gR2V0IHRoZSBzZXJ2aWNlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc2VydmljZSBrZXkuIFdpbGwKLSAgLy8gY3JlYXRlIGEgbmV3IHNlcnZpY2Ugb2JqZWN0IGF1dG9tYXRpY2FsbHkgaWYgbm8gc3VjaCBvYmplY3QgYWxyZWFkeQotICAvLyBleGlzdHMuIE93bmVyc2hpcCBvZiB0aGUgc2VydmljZSBvYmplY3QgaXMgbm90IHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIuCi0gIEFTSU9fREVDTCBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlKiBkb191c2Vfc2VydmljZSgKLSAgICAgIGNvbnN0IGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2U6OmtleSYga2V5LAotICAgICAgZmFjdG9yeV90eXBlIGZhY3RvcnkpOwotCi0gIC8vIEFkZCBhIHNlcnZpY2Ugb2JqZWN0LiBUaHJvd3Mgb24gZXJyb3IsIGluIHdoaWNoIGNhc2Ugb3duZXJzaGlwIG9mIHRoZQotICAvLyBvYmplY3QgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlci4KLSAgQVNJT19ERUNMIHZvaWQgZG9fYWRkX3NlcnZpY2UoCi0gICAgICBjb25zdCBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlOjprZXkmIGtleSwKLSAgICAgIGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2UqIG5ld19zZXJ2aWNlKTsKLQotICAvLyBDaGVjayB3aGV0aGVyIGEgc2VydmljZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbHJlYWR5IGV4aXN0cy4KLSAgQVNJT19ERUNMIGJvb2wgZG9faGFzX3NlcnZpY2UoCi0gICAgICBjb25zdCBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlOjprZXkmIGtleSkgY29uc3Q7Ci0KLSAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhY2Nlc3MgdG8gaW50ZXJuYWwgZGF0YS4KLSAgbXV0YWJsZSBhc2lvOjpkZXRhaWw6Om11dGV4IG11dGV4XzsKLQotICAvLyBUaGUgb3duZXIgb2YgdGhpcyBzZXJ2aWNlIHJlZ2lzdHJ5IGFuZCB0aGUgc2VydmljZXMgaXQgY29udGFpbnMuCi0gIGFzaW86OmlvX3NlcnZpY2UmIG93bmVyXzsKLQotICAvLyBUaGUgZmlyc3Qgc2VydmljZSBpbiB0aGUgbGlzdCBvZiBjb250YWluZWQgc2VydmljZXMuCi0gIGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2UqIGZpcnN0X3NlcnZpY2VfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3NlcnZpY2VfcmVnaXN0cnkuaHBwIgotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9zZXJ2aWNlX3JlZ2lzdHJ5LmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9TRVJWSUNFX1JFR0lTVFJZX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zaGFyZWRfcHRyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2hhcmVkX3B0ci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MTFjYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zaGFyZWRfcHRyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvc2hhcmVkX3B0ci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9TSEFSRURfUFRSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9TSEFSRURfUFRSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TVERfU0hBUkVEX1BUUikKLSMgaW5jbHVkZSA8bWVtb3J5PgotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfU0hBUkVEX1BUUikKLSMgaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfU0hBUkVEX1BUUikKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9TSEFSRURfUFRSKQotdXNpbmcgc3RkOjpzaGFyZWRfcHRyOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfU0hBUkVEX1BUUikKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX1NIQVJFRF9QVFIpCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfU0hBUkVEX1BUUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2lnbmFsX2Jsb2NrZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zaWduYWxfYmxvY2tlci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjY4YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zaWduYWxfYmxvY2tlci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3NpZ25hbF9ibG9ja2VyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9TSUdOQUxfQkxPQ0tFUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfU0lHTkFMX0JMT0NLRVJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKSB8fCBkZWZpbmVkKEFTSU9fV0lORE9XUykgXAotICB8fCBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKSBcCi0gIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9udWxsX3NpZ25hbF9ibG9ja2VyLmhwcCIKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3Bvc2l4X3NpZ25hbF9ibG9ja2VyLmhwcCIKLSNlbHNlCi0jIGVycm9yIE9ubHkgV2luZG93cyBhbmQgUE9TSVggYXJlIHN1cHBvcnRlZCEKLSNlbmRpZgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpIHx8IGRlZmluZWQoQVNJT19XSU5ET1dTKSBcCi0gIHx8IGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpIFwKLSAgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pCi10eXBlZGVmIG51bGxfc2lnbmFsX2Jsb2NrZXIgc2lnbmFsX2Jsb2NrZXI7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotdHlwZWRlZiBwb3NpeF9zaWduYWxfYmxvY2tlciBzaWduYWxfYmxvY2tlcjsKLSNlbmRpZgotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NJR05BTF9CTE9DS0VSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zaWduYWxfaGFuZGxlci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NpZ25hbF9oYW5kbGVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyZTA4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NpZ25hbF9oYW5kbGVyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvc2lnbmFsX2hhbmRsZXIuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1NJR05BTF9IQU5ETEVSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9TSUdOQUxfSEFORExFUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zaWduYWxfb3AuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotY2xhc3Mgc2lnbmFsX2hhbmRsZXIgOiBwdWJsaWMgc2lnbmFsX29wCi17Ci1wdWJsaWM6Ci0gIEFTSU9fREVGSU5FX0hBTkRMRVJfUFRSKHNpZ25hbF9oYW5kbGVyKTsKLQotICBzaWduYWxfaGFuZGxlcihIYW5kbGVyJiBoKQotICAgIDogc2lnbmFsX29wKCZzaWduYWxfaGFuZGxlcjo6ZG9fY29tcGxldGUpLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaCkpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIC8qZWMqLywKLSAgICAgIHN0ZDo6c2l6ZV90IC8qYnl0ZXNfdHJhbnNmZXJyZWQqLykKLSAgewotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBoYW5kbGVyIG9iamVjdC4KLSAgICBzaWduYWxfaGFuZGxlciogaChzdGF0aWNfY2FzdDxzaWduYWxfaGFuZGxlcio+KGJhc2UpKTsKLSAgICBwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaC0+aGFuZGxlcl8pLCBoLCBoIH07Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ09NUExFVElPTigoaCkpOwotCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBkZWFsbG9jYXRlZCBiZWZvcmUKLSAgICAvLyB0aGUgdXBjYWxsIGlzIG1hZGUuIEV2ZW4gaWYgd2UncmUgbm90IGFib3V0IHRvIG1ha2UgYW4gdXBjYWxsLCBhCi0gICAgLy8gc3ViLW9iamVjdCBvZiB0aGUgaGFuZGxlciBtYXkgYmUgdGhlIHRydWUgb3duZXIgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkCi0gICAgLy8gd2l0aCB0aGUgaGFuZGxlci4gQ29uc2VxdWVudGx5LCBhIGxvY2FsIGNvcHkgb2YgdGhlIGhhbmRsZXIgaXMgcmVxdWlyZWQKLSAgICAvLyB0byBlbnN1cmUgdGhhdCBhbnkgb3duaW5nIHN1Yi1vYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlciB3ZSBoYXZlCi0gICAgLy8gZGVhbGxvY2F0ZWQgdGhlIG1lbW9yeSBoZXJlLgotICAgIGRldGFpbDo6YmluZGVyMjxIYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlLCBpbnQ+Ci0gICAgICBoYW5kbGVyKGgtPmhhbmRsZXJfLCBoLT5lY18sIGgtPnNpZ25hbF9udW1iZXJfKTsKLSAgICBwLmggPSBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICBwLnJlc2V0KCk7Ci0KLSAgICAvLyBNYWtlIHRoZSB1cGNhbGwgaWYgcmVxdWlyZWQuCi0gICAgaWYgKG93bmVyKQotICAgIHsKLSAgICAgIGZlbmNlZF9ibG9jayBiKGZlbmNlZF9ibG9jazo6aGFsZik7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9CRUdJTigoaGFuZGxlci5hcmcxXywgaGFuZGxlci5hcmcyXykpOwotICAgICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoaGFuZGxlciwgaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9FTkQ7Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NJR05BTF9IQU5ETEVSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zaWduYWxfaW5pdC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NpZ25hbF9pbml0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhOGNhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NpZ25hbF9pbml0LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvc2lnbmFsX2luaXQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1NJR05BTF9JTklUX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9TSUdOQUxfSU5JVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XUykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotI2luY2x1ZGUgPGNzaWduYWw+Ci0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPGludCBTaWduYWwgPSBTSUdQSVBFPgotY2xhc3Mgc2lnbmFsX2luaXQKLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIHNpZ25hbF9pbml0KCkKLSAgewotICAgIHN0ZDo6c2lnbmFsKFNpZ25hbCwgU0lHX0lHTik7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfU0lHTkFMX0lOSVRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NpZ25hbF9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NpZ25hbF9vcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2ZkNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zaWduYWxfb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zaWduYWxfb3AuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9TSUdOQUxfT1BfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NJR05BTF9PUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHNpZ25hbF9vcAotICA6IHB1YmxpYyBvcGVyYXRpb24KLXsKLXB1YmxpYzoKLSAgLy8gVGhlIGVycm9yIGNvZGUgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21wbGV0aW9uIGhhbmRsZXIuCi0gIGFzaW86OmVycm9yX2NvZGUgZWNfOwotCi0gIC8vIFRoZSBzaWduYWwgbnVtYmVyIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGxldGlvbiBoYW5kbGVyLgotICBpbnQgc2lnbmFsX251bWJlcl87Ci0KLXByb3RlY3RlZDoKLSAgc2lnbmFsX29wKGZ1bmNfdHlwZSBmdW5jKQotICAgIDogb3BlcmF0aW9uKGZ1bmMpLAotICAgICAgc2lnbmFsX251bWJlcl8oMCkKLSAgewotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NJR05BTF9PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2lnbmFsX3NldF9zZXJ2aWNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc2lnbmFsX3NldF9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NGEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NpZ25hbF9zZXRfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zaWduYWxfc2V0X3NlcnZpY2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9TSUdOQUxfU0VUX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NJR05BTF9TRVRfU0VSVklDRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BfcXVldWUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NpZ25hbF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zaWduYWxfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3IuaHBwIgotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XUykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgZGVmaW5lZChOU0lHKSAmJiAoTlNJRyA+IDApCi1lbnVtIHsgbWF4X3NpZ25hbF9udW1iZXIgPSBOU0lHIH07Ci0jZWxzZQotZW51bSB7IG1heF9zaWduYWxfbnVtYmVyID0gMTI4IH07Ci0jZW5kaWYKLQotZXh0ZXJuIEFTSU9fREVDTCBzdHJ1Y3Qgc2lnbmFsX3N0YXRlKiBnZXRfc2lnbmFsX3N0YXRlKCk7Ci0KLWV4dGVybiAiQyIgQVNJT19ERUNMIHZvaWQgYXNpb19zaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsX251bWJlcik7Ci0KLWNsYXNzIHNpZ25hbF9zZXRfc2VydmljZQotewotcHVibGljOgotICAvLyBUeXBlIHVzZWQgZm9yIHRyYWNraW5nIGFuIGluZGl2aWR1YWwgc2lnbmFsIHJlZ2lzdHJhdGlvbi4KLSAgY2xhc3MgcmVnaXN0cmF0aW9uCi0gIHsKLSAgcHVibGljOgotICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgcmVnaXN0cmF0aW9uKCkKLSAgICAgIDogc2lnbmFsX251bWJlcl8oMCksCi0gICAgICAgIHF1ZXVlXygwKSwKLSAgICAgICAgdW5kZWxpdmVyZWRfKDApLAotICAgICAgICBuZXh0X2luX3RhYmxlXygwKSwKLSAgICAgICAgcHJldl9pbl90YWJsZV8oMCksCi0gICAgICAgIG5leHRfaW5fc2V0XygwKQotICAgIHsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICAvLyBPbmx5IHRoaXMgc2VydmljZSB3aWxsIGhhdmUgYWNjZXNzIHRvIHRoZSBpbnRlcm5hbCB2YWx1ZXMuCi0gICAgZnJpZW5kIGNsYXNzIHNpZ25hbF9zZXRfc2VydmljZTsKLQotICAgIC8vIFRoZSBzaWduYWwgbnVtYmVyIHRoYXQgaXMgcmVnaXN0ZXJlZC4KLSAgICBpbnQgc2lnbmFsX251bWJlcl87Ci0KLSAgICAvLyBUaGUgd2FpdGluZyBzaWduYWwgaGFuZGxlcnMuCi0gICAgb3BfcXVldWU8c2lnbmFsX29wPiogcXVldWVfOwotCi0gICAgLy8gVGhlIG51bWJlciBvZiB1bmRlbGl2ZXJlZCBzaWduYWxzLgotICAgIHN0ZDo6c2l6ZV90IHVuZGVsaXZlcmVkXzsKLQotICAgIC8vIFBvaW50ZXJzIHRvIGFkamFjZW50IHJlZ2lzdHJhdGlvbnMgaW4gdGhlIHJlZ2lzdHJhdGlvbnNfIHRhYmxlLgotICAgIHJlZ2lzdHJhdGlvbiogbmV4dF9pbl90YWJsZV87Ci0gICAgcmVnaXN0cmF0aW9uKiBwcmV2X2luX3RhYmxlXzsKLQotICAgIC8vIExpbmsgdG8gbmV4dCByZWdpc3RyYXRpb24gaW4gdGhlIHNpZ25hbCBzZXQuCi0gICAgcmVnaXN0cmF0aW9uKiBuZXh0X2luX3NldF87Ci0gIH07Ci0KLSAgLy8gVGhlIGltcGxlbWVudGF0aW9uIHR5cGUgb2YgdGhlIHNpZ25hbF9zZXQuCi0gIGNsYXNzIGltcGxlbWVudGF0aW9uX3R5cGUKLSAgewotICBwdWJsaWM6Ci0gICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICBpbXBsZW1lbnRhdGlvbl90eXBlKCkKLSAgICAgIDogc2lnbmFsc18oMCkKLSAgICB7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgLy8gT25seSB0aGlzIHNlcnZpY2Ugd2lsbCBoYXZlIGFjY2VzcyB0byB0aGUgaW50ZXJuYWwgdmFsdWVzLgotICAgIGZyaWVuZCBjbGFzcyBzaWduYWxfc2V0X3NlcnZpY2U7Ci0KLSAgICAvLyBUaGUgcGVuZGluZyBzaWduYWwgaGFuZGxlcnMuCi0gICAgb3BfcXVldWU8c2lnbmFsX29wPiBxdWV1ZV87Ci0KLSAgICAvLyBMaW5rZWQgbGlzdCBvZiByZWdpc3RlcmVkIHNpZ25hbHMuCi0gICAgcmVnaXN0cmF0aW9uKiBzaWduYWxzXzsKLSAgfTsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIHNpZ25hbF9zZXRfc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKTsKLQotICAvLyBEZXN0cnVjdG9yLgotICBBU0lPX0RFQ0wgfnNpZ25hbF9zZXRfc2VydmljZSgpOwotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIEFTSU9fREVDTCB2b2lkIHNodXRkb3duX3NlcnZpY2UoKTsKLQotICAvLyBQZXJmb3JtIGZvcmstcmVsYXRlZCBob3VzZWtlZXBpbmcuCi0gIEFTSU9fREVDTCB2b2lkIGZvcmtfc2VydmljZSgKLSAgICAgIGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfZXZlbnQgZm9ya19ldik7Ci0KLSAgLy8gQ29uc3RydWN0IGEgbmV3IHNpZ25hbF9zZXQgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKTsKLQotICAvLyBEZXN0cm95IGEgc2lnbmFsX3NldCBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgZGVzdHJveShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKTsKLQotICAvLyBBZGQgYSBzaWduYWwgdG8gYSBzaWduYWxfc2V0LgotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBhZGQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGludCBzaWduYWxfbnVtYmVyLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gUmVtb3ZlIGEgc2lnbmFsIHRvIGEgc2lnbmFsX3NldC4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgcmVtb3ZlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBpbnQgc2lnbmFsX251bWJlciwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIFJlbW92ZSBhbGwgc2lnbmFscyBmcm9tIGEgc2lnbmFsX3NldC4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgY2xlYXIoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBDYW5jZWwgYWxsIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzaWduYWwgc2V0LgotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHdhaXQgZm9yIGEgc2lnbmFsIHRvIGJlIGRlbGl2ZXJlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfd2FpdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHNpZ25hbF9oYW5kbGVyPEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzaWduYWxfc2V0IiwgJmltcGwsICJhc3luY193YWl0IikpOwotCi0gICAgc3RhcnRfd2FpdF9vcChpbXBsLCBwLnApOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBEZWxpdmVyIG5vdGlmaWNhdGlvbiB0aGF0IGEgcGFydGljdWxhciBzaWduYWwgb2NjdXJyZWQuCi0gIEFTSU9fREVDTCBzdGF0aWMgdm9pZCBkZWxpdmVyX3NpZ25hbChpbnQgc2lnbmFsX251bWJlcik7Ci0KLXByaXZhdGU6Ci0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBhZGQgYSBzZXJ2aWNlIHRvIHRoZSBnbG9iYWwgc2lnbmFsIHN0YXRlLgotICBBU0lPX0RFQ0wgc3RhdGljIHZvaWQgYWRkX3NlcnZpY2Uoc2lnbmFsX3NldF9zZXJ2aWNlKiBzZXJ2aWNlKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGEgc2VydmljZSBmcm9tIHRoZSBnbG9iYWwgc2lnbmFsIHN0YXRlLgotICBBU0lPX0RFQ0wgc3RhdGljIHZvaWQgcmVtb3ZlX3NlcnZpY2Uoc2lnbmFsX3NldF9zZXJ2aWNlKiBzZXJ2aWNlKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBwaXBlIGRlc2NyaXB0b3JzLgotICBBU0lPX0RFQ0wgc3RhdGljIHZvaWQgb3Blbl9kZXNjcmlwdG9ycygpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjbG9zZSB0aGUgcGlwZSBkZXNjcmlwdG9ycy4KLSAgQVNJT19ERUNMIHN0YXRpYyB2b2lkIGNsb3NlX2Rlc2NyaXB0b3JzKCk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHN0YXJ0IGEgd2FpdCBvcGVyYXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIHN0YXJ0X3dhaXRfb3AoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgc2lnbmFsX29wKiBvcCk7Ci0KLSAgLy8gVGhlIGlvX3NlcnZpY2UgaW5zdGFuY2UgdXNlZCBmb3IgZGlzcGF0Y2hpbmcgaGFuZGxlcnMuCi0gIGlvX3NlcnZpY2VfaW1wbCYgaW9fc2VydmljZV87Ci0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpIFwKLSAgJiYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpIFwKLSAgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSAgLy8gVGhlIHR5cGUgdXNlZCBmb3IgcmVnaXN0ZXJpbmcgZm9yIHBpcGUgcmVhY3RvciBub3RpZmljYXRpb25zLgotICBjbGFzcyBwaXBlX3JlYWRfb3A7Ci0KLSAgLy8gVGhlIHJlYWN0b3IgdXNlZCBmb3Igd2FpdGluZyBmb3IgcGlwZSByZWFkaW5lc3MuCi0gIHJlYWN0b3ImIHJlYWN0b3JfOwotCi0gIC8vIFRoZSBwZXItZGVzY3JpcHRvciByZWFjdG9yIGRhdGEgdXNlZCBmb3IgdGhlIHBpcGUuCi0gIHJlYWN0b3I6OnBlcl9kZXNjcmlwdG9yX2RhdGEgcmVhY3Rvcl9kYXRhXzsKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgLy8gICAmJiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSAgICAgICAvLyAgICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSAgLy8gQSBtYXBwaW5nIGZyb20gc2lnbmFsIG51bWJlciB0byB0aGUgcmVnaXN0ZXJlZCBzaWduYWwgc2V0cy4KLSAgcmVnaXN0cmF0aW9uKiByZWdpc3RyYXRpb25zX1ttYXhfc2lnbmFsX251bWJlcl07Ci0KLSAgLy8gUG9pbnRlcnMgdG8gYWRqYWNlbnQgc2VydmljZXMgaW4gbGlua2VkIGxpc3QuCi0gIHNpZ25hbF9zZXRfc2VydmljZSogbmV4dF87Ci0gIHNpZ25hbF9zZXRfc2VydmljZSogcHJldl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9zaWduYWxfc2V0X3NlcnZpY2UuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NJR05BTF9TRVRfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc29ja2V0X2hvbGRlci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NvY2tldF9ob2xkZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmEzMTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc29ja2V0X2hvbGRlci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3NvY2tldF9ob2xkZXIuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfU09DS0VUX0hPTERFUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfU09DS0VUX0hPTERFUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotLy8gSW1wbGVtZW50IHRoZSByZXNvdXJjZSBhY3F1aXNpdGlvbiBpcyBpbml0aWFsaXNhdGlvbiBpZGlvbSBmb3Igc29ja2V0cy4KLWNsYXNzIHNvY2tldF9ob2xkZXIKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdCBhcyBhbiB1bmluaXRpYWxpc2VkIHNvY2tldC4KLSAgc29ja2V0X2hvbGRlcigpCi0gICAgOiBzb2NrZXRfKGludmFsaWRfc29ja2V0KQotICB7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3QgdG8gdGFrZSBvd25lcnNoaXAgb2YgdGhlIHNwZWNpZmllZCBzb2NrZXQuCi0gIGV4cGxpY2l0IHNvY2tldF9ob2xkZXIoc29ja2V0X3R5cGUgcykKLSAgICA6IHNvY2tldF8ocykKLSAgewotICB9Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgfnNvY2tldF9ob2xkZXIoKQotICB7Ci0gICAgaWYgKHNvY2tldF8gIT0gaW52YWxpZF9zb2NrZXQpCi0gICAgewotICAgICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICAgIHNvY2tldF9vcHM6OnN0YXRlX3R5cGUgc3RhdGUgPSAwOwotICAgICAgc29ja2V0X29wczo6Y2xvc2Uoc29ja2V0Xywgc3RhdGUsIHRydWUsIGVjKTsKLSAgICB9Ci0gIH0KLQotICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgc29ja2V0LgotICBzb2NrZXRfdHlwZSBnZXQoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNvY2tldF87Ci0gIH0KLQotICAvLyBSZXNldCB0byBhbiB1bmluaXRpYWxpc2VkIHNvY2tldC4KLSAgdm9pZCByZXNldCgpCi0gIHsKLSAgICBpZiAoc29ja2V0XyAhPSBpbnZhbGlkX3NvY2tldCkKLSAgICB7Ci0gICAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgICAgc29ja2V0X29wczo6c3RhdGVfdHlwZSBzdGF0ZSA9IDA7Ci0gICAgICBzb2NrZXRfb3BzOjpjbG9zZShzb2NrZXRfLCBzdGF0ZSwgdHJ1ZSwgZWMpOwotICAgICAgc29ja2V0XyA9IGludmFsaWRfc29ja2V0OwotICAgIH0KLSAgfQotCi0gIC8vIFJlc2V0IHRvIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBzcGVjaWZpZWQgc29ja2V0LgotICB2b2lkIHJlc2V0KHNvY2tldF90eXBlIHMpCi0gIHsKLSAgICByZXNldCgpOwotICAgIHNvY2tldF8gPSBzOwotICB9Ci0KLSAgLy8gUmVsZWFzZSBvd25lcnNoaXAgb2YgdGhlIHNvY2tldC4KLSAgc29ja2V0X3R5cGUgcmVsZWFzZSgpCi0gIHsKLSAgICBzb2NrZXRfdHlwZSB0bXAgPSBzb2NrZXRfOwotICAgIHNvY2tldF8gPSBpbnZhbGlkX3NvY2tldDsKLSAgICByZXR1cm4gdG1wOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIFRoZSB1bmRlcmx5aW5nIHNvY2tldC4KLSAgc29ja2V0X3R5cGUgc29ja2V0XzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfU09DS0VUX0hPTERFUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWFkYTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zb2NrZXRfb3BzLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1NPQ0tFVF9PUFNfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NPQ0tFVF9PUFNfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2Vycm9yX2NvZGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NoYXJlZF9wdHIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2Vha19wdHIuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci1uYW1lc3BhY2Ugc29ja2V0X29wcyB7Ci0KLS8vIFNvY2tldCBzdGF0ZSBiaXRzLgotZW51bQotewotICAvLyBUaGUgdXNlciB3YW50cyBhIG5vbi1ibG9ja2luZyBzb2NrZXQuCi0gIHVzZXJfc2V0X25vbl9ibG9ja2luZyA9IDEsCi0KLSAgLy8gVGhlIHNvY2tldCBoYXMgYmVlbiBzZXQgbm9uLWJsb2NraW5nLgotICBpbnRlcm5hbF9ub25fYmxvY2tpbmcgPSAyLAotCi0gIC8vIEhlbHBlciAic3RhdGUiIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBub24tYmxvY2tpbmcuCi0gIG5vbl9ibG9ja2luZyA9IHVzZXJfc2V0X25vbl9ibG9ja2luZyB8IGludGVybmFsX25vbl9ibG9ja2luZywKLQotICAvLyBVc2VyIHdhbnRzIGNvbm5lY3Rpb25fYWJvcnRlZCBlcnJvcnMsIHdoaWNoIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LgotICBlbmFibGVfY29ubmVjdGlvbl9hYm9ydGVkID0gNCwKLQotICAvLyBUaGUgdXNlciBzZXQgdGhlIGxpbmdlciBvcHRpb24uIE5lZWRzIHRvIGJlIGNoZWNrZWQgd2hlbiBjbG9zaW5nLgotICB1c2VyX3NldF9saW5nZXIgPSA4LAotCi0gIC8vIFRoZSBzb2NrZXQgaXMgc3RyZWFtLW9yaWVudGVkLgotICBzdHJlYW1fb3JpZW50ZWQgPSAxNiwKLQotICAvLyBUaGUgc29ja2V0IGlzIGRhdGFncmFtLW9yaWVudGVkLgotICBkYXRhZ3JhbV9vcmllbnRlZCA9IDMyLAotCi0gIC8vIFRoZSBzb2NrZXQgbWF5IGhhdmUgYmVlbiBkdXAoKS1lZC4KLSAgcG9zc2libGVfZHVwID0gNjQKLX07Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBzdGF0ZV90eXBlOwotCi1zdHJ1Y3Qgbm9vcF9kZWxldGVyIHsgdm9pZCBvcGVyYXRvcigpKHZvaWQqKSB7fSB9OwotdHlwZWRlZiBzaGFyZWRfcHRyPHZvaWQ+IHNoYXJlZF9jYW5jZWxfdG9rZW5fdHlwZTsKLXR5cGVkZWYgd2Vha19wdHI8dm9pZD4gd2Vha19jYW5jZWxfdG9rZW5fdHlwZTsKLQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi1BU0lPX0RFQ0wgc29ja2V0X3R5cGUgYWNjZXB0KHNvY2tldF90eXBlIHMsIHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsCi0gICAgc3RkOjpzaXplX3QqIGFkZHJsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIHNvY2tldF90eXBlIHN5bmNfYWNjZXB0KHNvY2tldF90eXBlIHMsCi0gICAgc3RhdGVfdHlwZSBzdGF0ZSwgc29ja2V0X2FkZHJfdHlwZSogYWRkciwKLSAgICBzdGQ6OnNpemVfdCogYWRkcmxlbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1BU0lPX0RFQ0wgdm9pZCBjb21wbGV0ZV9pb2NwX2FjY2VwdChzb2NrZXRfdHlwZSBzLAotICAgIHZvaWQqIG91dHB1dF9idWZmZXIsIERXT1JEIGFkZHJlc3NfbGVuZ3RoLAotICAgIHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsIHN0ZDo6c2l6ZV90KiBhZGRybGVuLAotICAgIHNvY2tldF90eXBlIG5ld19zb2NrZXQsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1BU0lPX0RFQ0wgYm9vbCBub25fYmxvY2tpbmdfYWNjZXB0KHNvY2tldF90eXBlIHMsCi0gICAgc3RhdGVfdHlwZSBzdGF0ZSwgc29ja2V0X2FkZHJfdHlwZSogYWRkciwgc3RkOjpzaXplX3QqIGFkZHJsZW4sCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIHNvY2tldF90eXBlJiBuZXdfc29ja2V0KTsKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotQVNJT19ERUNMIGludCBiaW5kKHNvY2tldF90eXBlIHMsIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsCi0gICAgc3RkOjpzaXplX3QgYWRkcmxlbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgaW50IGNsb3NlKHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUmIHN0YXRlLAotICAgIGJvb2wgZGVzdHJ1Y3Rpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIGJvb2wgc2V0X3VzZXJfbm9uX2Jsb2NraW5nKHNvY2tldF90eXBlIHMsCi0gICAgc3RhdGVfdHlwZSYgc3RhdGUsIGJvb2wgdmFsdWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIGJvb2wgc2V0X2ludGVybmFsX25vbl9ibG9ja2luZyhzb2NrZXRfdHlwZSBzLAotICAgIHN0YXRlX3R5cGUmIHN0YXRlLCBib29sIHZhbHVlLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBpbnQgc2h1dGRvd24oc29ja2V0X3R5cGUgcywKLSAgICBpbnQgd2hhdCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgaW50IGNvbm5lY3Qoc29ja2V0X3R5cGUgcywgY29uc3Qgc29ja2V0X2FkZHJfdHlwZSogYWRkciwKLSAgICBzdGQ6OnNpemVfdCBhZGRybGVuLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCB2b2lkIHN5bmNfY29ubmVjdChzb2NrZXRfdHlwZSBzLCBjb25zdCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLAotICAgIHN0ZDo6c2l6ZV90IGFkZHJsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotQVNJT19ERUNMIHZvaWQgY29tcGxldGVfaW9jcF9jb25uZWN0KHNvY2tldF90eXBlIHMsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1BU0lPX0RFQ0wgYm9vbCBub25fYmxvY2tpbmdfY29ubmVjdChzb2NrZXRfdHlwZSBzLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIGludCBzb2NrZXRwYWlyKGludCBhZiwgaW50IHR5cGUsIGludCBwcm90b2NvbCwKLSAgICBzb2NrZXRfdHlwZSBzdlsyXSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgYm9vbCBzb2NrYXRtYXJrKHNvY2tldF90eXBlIHMsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIHNpemVfdCBhdmFpbGFibGUoc29ja2V0X3R5cGUgcywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgaW50IGxpc3Rlbihzb2NrZXRfdHlwZSBzLAotICAgIGludCBiYWNrbG9nLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotdHlwZWRlZiBXU0FCVUYgYnVmOwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLXR5cGVkZWYgaW92ZWMgYnVmOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLUFTSU9fREVDTCB2b2lkIGluaXRfYnVmKGJ1ZiYgYiwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOwotCi1BU0lPX0RFQ0wgdm9pZCBpbml0X2J1ZihidWYmIGIsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKLQotQVNJT19ERUNMIHNpZ25lZF9zaXplX3R5cGUgcmVjdihzb2NrZXRfdHlwZSBzLCBidWYqIGJ1ZnMsCi0gICAgc2l6ZV90IGNvdW50LCBpbnQgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIHNpemVfdCBzeW5jX3JlY3Yoc29ja2V0X3R5cGUgcywgc3RhdGVfdHlwZSBzdGF0ZSwgYnVmKiBidWZzLAotICAgIHNpemVfdCBjb3VudCwgaW50IGZsYWdzLCBib29sIGFsbF9lbXB0eSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1BU0lPX0RFQ0wgdm9pZCBjb21wbGV0ZV9pb2NwX3JlY3Yoc3RhdGVfdHlwZSBzdGF0ZSwKLSAgICBjb25zdCB3ZWFrX2NhbmNlbF90b2tlbl90eXBlJiBjYW5jZWxfdG9rZW4sIGJvb2wgYWxsX2VtcHR5LAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLCBzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQpOwotCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLUFTSU9fREVDTCBib29sIG5vbl9ibG9ja2luZ19yZWN2KHNvY2tldF90eXBlIHMsCi0gICAgYnVmKiBidWZzLCBzaXplX3QgY291bnQsIGludCBmbGFncywgYm9vbCBpc19zdHJlYW0sCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIHNpemVfdCYgYnl0ZXNfdHJhbnNmZXJyZWQpOwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1BU0lPX0RFQ0wgc2lnbmVkX3NpemVfdHlwZSByZWN2ZnJvbShzb2NrZXRfdHlwZSBzLCBidWYqIGJ1ZnMsCi0gICAgc2l6ZV90IGNvdW50LCBpbnQgZmxhZ3MsIHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsCi0gICAgc3RkOjpzaXplX3QqIGFkZHJsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIHNpemVfdCBzeW5jX3JlY3Zmcm9tKHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUgc3RhdGUsCi0gICAgYnVmKiBidWZzLCBzaXplX3QgY291bnQsIGludCBmbGFncywgc29ja2V0X2FkZHJfdHlwZSogYWRkciwKLSAgICBzdGQ6OnNpemVfdCogYWRkcmxlbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1BU0lPX0RFQ0wgdm9pZCBjb21wbGV0ZV9pb2NwX3JlY3Zmcm9tKAotICAgIGNvbnN0IHdlYWtfY2FuY2VsX3Rva2VuX3R5cGUmIGNhbmNlbF90b2tlbiwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotQVNJT19ERUNMIGJvb2wgbm9uX2Jsb2NraW5nX3JlY3Zmcm9tKHNvY2tldF90eXBlIHMsCi0gICAgYnVmKiBidWZzLCBzaXplX3QgY291bnQsIGludCBmbGFncywKLSAgICBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLCBzdGQ6OnNpemVfdCogYWRkcmxlbiwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYywgc2l6ZV90JiBieXRlc190cmFuc2ZlcnJlZCk7Ci0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLUFTSU9fREVDTCBzaWduZWRfc2l6ZV90eXBlIHJlY3Ztc2coc29ja2V0X3R5cGUgcywgYnVmKiBidWZzLAotICAgIHNpemVfdCBjb3VudCwgaW50IGluX2ZsYWdzLCBpbnQmIG91dF9mbGFncywKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBzaXplX3Qgc3luY19yZWN2bXNnKHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUgc3RhdGUsCi0gICAgYnVmKiBidWZzLCBzaXplX3QgY291bnQsIGludCBpbl9mbGFncywgaW50JiBvdXRfZmxhZ3MsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1BU0lPX0RFQ0wgdm9pZCBjb21wbGV0ZV9pb2NwX3JlY3Ztc2coCi0gICAgY29uc3Qgd2Vha19jYW5jZWxfdG9rZW5fdHlwZSYgY2FuY2VsX3Rva2VuLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1BU0lPX0RFQ0wgYm9vbCBub25fYmxvY2tpbmdfcmVjdm1zZyhzb2NrZXRfdHlwZSBzLAotICAgIGJ1ZiogYnVmcywgc2l6ZV90IGNvdW50LCBpbnQgaW5fZmxhZ3MsIGludCYgb3V0X2ZsYWdzLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLCBzaXplX3QmIGJ5dGVzX3RyYW5zZmVycmVkKTsKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotQVNJT19ERUNMIHNpZ25lZF9zaXplX3R5cGUgc2VuZChzb2NrZXRfdHlwZSBzLCBjb25zdCBidWYqIGJ1ZnMsCi0gICAgc2l6ZV90IGNvdW50LCBpbnQgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIHNpemVfdCBzeW5jX3NlbmQoc29ja2V0X3R5cGUgcywgc3RhdGVfdHlwZSBzdGF0ZSwKLSAgICBjb25zdCBidWYqIGJ1ZnMsIHNpemVfdCBjb3VudCwgaW50IGZsYWdzLAotICAgIGJvb2wgYWxsX2VtcHR5LCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLUFTSU9fREVDTCB2b2lkIGNvbXBsZXRlX2lvY3Bfc2VuZCgKLSAgICBjb25zdCB3ZWFrX2NhbmNlbF90b2tlbl90eXBlJiBjYW5jZWxfdG9rZW4sCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLUFTSU9fREVDTCBib29sIG5vbl9ibG9ja2luZ19zZW5kKHNvY2tldF90eXBlIHMsCi0gICAgY29uc3QgYnVmKiBidWZzLCBzaXplX3QgY291bnQsIGludCBmbGFncywKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYywgc2l6ZV90JiBieXRlc190cmFuc2ZlcnJlZCk7Ci0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLUFTSU9fREVDTCBzaWduZWRfc2l6ZV90eXBlIHNlbmR0byhzb2NrZXRfdHlwZSBzLCBjb25zdCBidWYqIGJ1ZnMsCi0gICAgc2l6ZV90IGNvdW50LCBpbnQgZmxhZ3MsIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsCi0gICAgc3RkOjpzaXplX3QgYWRkcmxlbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgc2l6ZV90IHN5bmNfc2VuZHRvKHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUgc3RhdGUsCi0gICAgY29uc3QgYnVmKiBidWZzLCBzaXplX3QgY291bnQsIGludCBmbGFncywgY29uc3Qgc29ja2V0X2FkZHJfdHlwZSogYWRkciwKLSAgICBzdGQ6OnNpemVfdCBhZGRybGVuLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi1BU0lPX0RFQ0wgYm9vbCBub25fYmxvY2tpbmdfc2VuZHRvKHNvY2tldF90eXBlIHMsCi0gICAgY29uc3QgYnVmKiBidWZzLCBzaXplX3QgY291bnQsIGludCBmbGFncywKLSAgICBjb25zdCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLCBzdGQ6OnNpemVfdCBhZGRybGVuLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLCBzaXplX3QmIGJ5dGVzX3RyYW5zZmVycmVkKTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLUFTSU9fREVDTCBzb2NrZXRfdHlwZSBzb2NrZXQoaW50IGFmLCBpbnQgdHlwZSwgaW50IHByb3RvY29sLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIGludCBzZXRzb2Nrb3B0KHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUmIHN0YXRlLAotICAgIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNvbnN0IHZvaWQqIG9wdHZhbCwKLSAgICBzdGQ6OnNpemVfdCBvcHRsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIGludCBnZXRzb2Nrb3B0KHNvY2tldF90eXBlIHMsIHN0YXRlX3R5cGUgc3RhdGUsCi0gICAgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgdm9pZCogb3B0dmFsLAotICAgIHNpemVfdCogb3B0bGVuLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBpbnQgZ2V0cGVlcm5hbWUoc29ja2V0X3R5cGUgcywgc29ja2V0X2FkZHJfdHlwZSogYWRkciwKLSAgICBzdGQ6OnNpemVfdCogYWRkcmxlbiwgYm9vbCBjYWNoZWQsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIGludCBnZXRzb2NrbmFtZShzb2NrZXRfdHlwZSBzLCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLAotICAgIHN0ZDo6c2l6ZV90KiBhZGRybGVuLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBpbnQgaW9jdGwoc29ja2V0X3R5cGUgcywgc3RhdGVfdHlwZSYgc3RhdGUsCi0gICAgaW50IGNtZCwgaW9jdGxfYXJnX3R5cGUqIGFyZywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgaW50IHNlbGVjdChpbnQgbmZkcywgZmRfc2V0KiByZWFkZmRzLCBmZF9zZXQqIHdyaXRlZmRzLAotICAgIGZkX3NldCogZXhjZXB0ZmRzLCB0aW1ldmFsKiB0aW1lb3V0LCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBpbnQgcG9sbF9yZWFkKHNvY2tldF90eXBlIHMsCi0gICAgc3RhdGVfdHlwZSBzdGF0ZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgaW50IHBvbGxfd3JpdGUoc29ja2V0X3R5cGUgcywKLSAgICBzdGF0ZV90eXBlIHN0YXRlLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBpbnQgcG9sbF9jb25uZWN0KHNvY2tldF90eXBlIHMsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi1BU0lPX0RFQ0wgY29uc3QgY2hhciogaW5ldF9udG9wKGludCBhZiwgY29uc3Qgdm9pZCogc3JjLCBjaGFyKiBkZXN0LAotICAgIHNpemVfdCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgc2NvcGVfaWQsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIGludCBpbmV0X3B0b24oaW50IGFmLCBjb25zdCBjaGFyKiBzcmMsIHZvaWQqIGRlc3QsCi0gICAgdW5zaWduZWQgbG9uZyogc2NvcGVfaWQsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIGludCBnZXRob3N0bmFtZShjaGFyKiBuYW1lLAotICAgIGludCBuYW1lbGVuLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgZ2V0YWRkcmluZm8oY29uc3QgY2hhciogaG9zdCwKLSAgICBjb25zdCBjaGFyKiBzZXJ2aWNlLCBjb25zdCBhZGRyaW5mb190eXBlJiBoaW50cywKLSAgICBhZGRyaW5mb190eXBlKiogcmVzdWx0LCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGJhY2tncm91bmRfZ2V0YWRkcmluZm8oCi0gICAgY29uc3Qgd2Vha19jYW5jZWxfdG9rZW5fdHlwZSYgY2FuY2VsX3Rva2VuLCBjb25zdCBjaGFyKiBob3N0LAotICAgIGNvbnN0IGNoYXIqIHNlcnZpY2UsIGNvbnN0IGFkZHJpbmZvX3R5cGUmIGhpbnRzLAotICAgIGFkZHJpbmZvX3R5cGUqKiByZXN1bHQsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotQVNJT19ERUNMIHZvaWQgZnJlZWFkZHJpbmZvKGFkZHJpbmZvX3R5cGUqIGFpKTsKLQotQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgZ2V0bmFtZWluZm8oCi0gICAgY29uc3Qgc29ja2V0X2FkZHJfdHlwZSogYWRkciwgc3RkOjpzaXplX3QgYWRkcmxlbiwKLSAgICBjaGFyKiBob3N0LCBzdGQ6OnNpemVfdCBob3N0bGVuLCBjaGFyKiBzZXJ2LAotICAgIHN0ZDo6c2l6ZV90IHNlcnZsZW4sIGludCBmbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi1BU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBzeW5jX2dldG5hbWVpbmZvKAotICAgIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsIHN0ZDo6c2l6ZV90IGFkZHJsZW4sCi0gICAgY2hhciogaG9zdCwgc3RkOjpzaXplX3QgaG9zdGxlbiwgY2hhciogc2VydiwKLSAgICBzdGQ6OnNpemVfdCBzZXJ2bGVuLCBpbnQgc29ja190eXBlLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLUFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGJhY2tncm91bmRfZ2V0bmFtZWluZm8oCi0gICAgY29uc3Qgd2Vha19jYW5jZWxfdG9rZW5fdHlwZSYgY2FuY2VsX3Rva2VuLAotICAgIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsIHN0ZDo6c2l6ZV90IGFkZHJsZW4sCi0gICAgY2hhciogaG9zdCwgc3RkOjpzaXplX3QgaG9zdGxlbiwgY2hhciogc2VydiwKLSAgICBzdGQ6OnNpemVfdCBzZXJ2bGVuLCBpbnQgc29ja190eXBlLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotQVNJT19ERUNMIHVfbG9uZ190eXBlIG5ldHdvcmtfdG9faG9zdF9sb25nKHVfbG9uZ190eXBlIHZhbHVlKTsKLQotQVNJT19ERUNMIHVfbG9uZ190eXBlIGhvc3RfdG9fbmV0d29ya19sb25nKHVfbG9uZ190eXBlIHZhbHVlKTsKLQotQVNJT19ERUNMIHVfc2hvcnRfdHlwZSBuZXR3b3JrX3RvX2hvc3Rfc2hvcnQodV9zaG9ydF90eXBlIHZhbHVlKTsKLQotQVNJT19ERUNMIHVfc2hvcnRfdHlwZSBob3N0X3RvX25ldHdvcmtfc2hvcnQodV9zaG9ydF90eXBlIHZhbHVlKTsKLQotfSAvLyBuYW1lc3BhY2Ugc29ja2V0X29wcwotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvc29ja2V0X29wcy5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfU09DS0VUX09QU19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc29ja2V0X29wdGlvbi5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NvY2tldF9vcHRpb24uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQxYWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc29ja2V0X29wdGlvbi5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zb2NrZXRfb3B0aW9uLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1NPQ0tFVF9PUFRJT05fSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NPQ0tFVF9PUFRJT05fSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19leGNlcHRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci1uYW1lc3BhY2Ugc29ja2V0X29wdGlvbiB7Ci0KLS8vIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIGJvb2xlYW4tYmFzZWQgb3B0aW9ucy4KLXRlbXBsYXRlIDxpbnQgTGV2ZWwsIGludCBOYW1lPgotY2xhc3MgYm9vbGVhbgotewotcHVibGljOgotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBib29sZWFuKCkKLSAgICA6IHZhbHVlXygwKQotICB7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3Qgd2l0aCBhIHNwZWNpZmljIG9wdGlvbiB2YWx1ZS4KLSAgZXhwbGljaXQgYm9vbGVhbihib29sIHYpCi0gICAgOiB2YWx1ZV8odiA/IDEgOiAwKQotICB7Ci0gIH0KLQotICAvLyBTZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4uCi0gIGJvb2xlYW4mIG9wZXJhdG9yPShib29sIHYpCi0gIHsKLSAgICB2YWx1ZV8gPSB2ID8gMSA6IDA7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBib29sZWFuLgotICBib29sIHZhbHVlKCkgY29uc3QKLSAgewotICAgIHJldHVybiAhIXZhbHVlXzsKLSAgfQotCi0gIC8vIENvbnZlcnQgdG8gYm9vbC4KLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gISF2YWx1ZV87Ci0gIH0KLQotICAvLyBUZXN0IGZvciBmYWxzZS4KLSAgYm9vbCBvcGVyYXRvciEoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICF2YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIGxldmVsIG9mIHRoZSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIGludCBsZXZlbChjb25zdCBQcm90b2NvbCYpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gTGV2ZWw7Ci0gIH0KLQotICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgaW50IG5hbWUoY29uc3QgUHJvdG9jb2wmKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIE5hbWU7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJvb2xlYW4gZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBpbnQqIGRhdGEoY29uc3QgUHJvdG9jb2wmKQotICB7Ci0gICAgcmV0dXJuICZ2YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJvb2xlYW4gZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBjb25zdCBpbnQqIGRhdGEoY29uc3QgUHJvdG9jb2wmKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICZ2YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIHNpemUgb2YgdGhlIGJvb2xlYW4gZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBzdGQ6OnNpemVfdCBzaXplKGNvbnN0IFByb3RvY29sJikgY29uc3QKLSAgewotICAgIHJldHVybiBzaXplb2YodmFsdWVfKTsKLSAgfQotCi0gIC8vIFNldCB0aGUgc2l6ZSBvZiB0aGUgYm9vbGVhbiBkYXRhLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIHZvaWQgcmVzaXplKGNvbnN0IFByb3RvY29sJiwgc3RkOjpzaXplX3QgcykKLSAgewotICAgIC8vIE9uIHNvbWUgcGxhdGZvcm1zIChlLmcuIFdpbmRvd3MgVmlzdGEpLCB0aGUgZ2V0c29ja29wdCBmdW5jdGlvbiB3aWxsCi0gICAgLy8gcmV0dXJuIHRoZSBzaXplIG9mIGEgYm9vbGVhbiBzb2NrZXQgb3B0aW9uIGFzIG9uZSBieXRlLCBldmVuIHRob3VnaCBhCi0gICAgLy8gZm91ciBieXRlIGludGVnZXIgd2FzIHBhc3NlZCBpbi4KLSAgICBzd2l0Y2ggKHMpCi0gICAgewotICAgIGNhc2Ugc2l6ZW9mKGNoYXIpOgotICAgICAgdmFsdWVfID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2YWx1ZV8pID8gMSA6IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNpemVvZih2YWx1ZV8pOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLSAgICAgICAgc3RkOjpsZW5ndGhfZXJyb3IgZXgoImJvb2xlYW4gc29ja2V0IG9wdGlvbiByZXNpemUiKTsKLSAgICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBpbnQgdmFsdWVfOwotfTsKLQotLy8gSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgaW50ZWdlciBvcHRpb25zLgotdGVtcGxhdGUgPGludCBMZXZlbCwgaW50IE5hbWU+Ci1jbGFzcyBpbnRlZ2VyCi17Ci1wdWJsaWM6Ci0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCi0gIGludGVnZXIoKQotICAgIDogdmFsdWVfKDApCi0gIHsKLSAgfQotCi0gIC8vIENvbnN0cnVjdCB3aXRoIGEgc3BlY2lmaWMgb3B0aW9uIHZhbHVlLgotICBleHBsaWNpdCBpbnRlZ2VyKGludCB2KQotICAgIDogdmFsdWVfKHYpCi0gIHsKLSAgfQotCi0gIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIGludCBvcHRpb24uCi0gIGludGVnZXImIG9wZXJhdG9yPShpbnQgdikKLSAgewotICAgIHZhbHVlXyA9IHY7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnQgb3B0aW9uLgotICBpbnQgdmFsdWUoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotCi0gIC8vIEdldCB0aGUgbGV2ZWwgb2YgdGhlIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgaW50IGxldmVsKGNvbnN0IFByb3RvY29sJikgY29uc3QKLSAgewotICAgIHJldHVybiBMZXZlbDsKLSAgfQotCi0gIC8vIEdldCB0aGUgbmFtZSBvZiB0aGUgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBpbnQgbmFtZShjb25zdCBQcm90b2NvbCYpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gTmFtZTsKLSAgfQotCi0gIC8vIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW50IGRhdGEuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgaW50KiBkYXRhKGNvbnN0IFByb3RvY29sJikKLSAgewotICAgIHJldHVybiAmdmFsdWVfOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBpbnQgZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBjb25zdCBpbnQqIGRhdGEoY29uc3QgUHJvdG9jb2wmKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICZ2YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIHNpemUgb2YgdGhlIGludCBkYXRhLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIHN0ZDo6c2l6ZV90IHNpemUoY29uc3QgUHJvdG9jb2wmKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNpemVvZih2YWx1ZV8pOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBzaXplIG9mIHRoZSBpbnQgZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICB2b2lkIHJlc2l6ZShjb25zdCBQcm90b2NvbCYsIHN0ZDo6c2l6ZV90IHMpCi0gIHsKLSAgICBpZiAocyAhPSBzaXplb2YodmFsdWVfKSkKLSAgICB7Ci0gICAgICBzdGQ6Omxlbmd0aF9lcnJvciBleCgiaW50ZWdlciBzb2NrZXQgb3B0aW9uIHJlc2l6ZSIpOwotICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBpbnQgdmFsdWVfOwotfTsKLQotLy8gSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgbGluZ2VyIG9wdGlvbnMuCi10ZW1wbGF0ZSA8aW50IExldmVsLCBpbnQgTmFtZT4KLWNsYXNzIGxpbmdlcgotewotcHVibGljOgotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBsaW5nZXIoKQotICB7Ci0gICAgdmFsdWVfLmxfb25vZmYgPSAwOwotICAgIHZhbHVlXy5sX2xpbmdlciA9IDA7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3Qgd2l0aCBzcGVjaWZpYyBvcHRpb24gdmFsdWVzLgotICBsaW5nZXIoYm9vbCBlLCBpbnQgdCkKLSAgewotICAgIGVuYWJsZWQoZSk7Ci0gICAgdGltZW91dCBBU0lPX1BSRVZFTlRfTUFDUk9fU1VCU1RJVFVUSU9OKHQpOwotICB9Ci0KLSAgLy8gU2V0IHRoZSB2YWx1ZSBmb3Igd2hldGhlciBsaW5nZXIgaXMgZW5hYmxlZC4KLSAgdm9pZCBlbmFibGVkKGJvb2wgdmFsdWUpCi0gIHsKLSAgICB2YWx1ZV8ubF9vbm9mZiA9IHZhbHVlID8gMSA6IDA7Ci0gIH0KLQotICAvLyBHZXQgdGhlIHZhbHVlIGZvciB3aGV0aGVyIGxpbmdlciBpcyBlbmFibGVkLgotICBib29sIGVuYWJsZWQoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHZhbHVlXy5sX29ub2ZmICE9IDA7Ci0gIH0KLQotICAvLyBTZXQgdGhlIHZhbHVlIGZvciB0aGUgbGluZ2VyIHRpbWVvdXQuCi0gIHZvaWQgdGltZW91dCBBU0lPX1BSRVZFTlRfTUFDUk9fU1VCU1RJVFVUSU9OKGludCB2YWx1ZSkKLSAgewotI2lmIGRlZmluZWQoV0lOMzIpCi0gICAgdmFsdWVfLmxfbGluZ2VyID0gc3RhdGljX2Nhc3Q8dV9zaG9ydD4odmFsdWUpOwotI2Vsc2UKLSAgICB2YWx1ZV8ubF9saW5nZXIgPSB2YWx1ZTsKLSNlbmRpZgotICB9Ci0KLSAgLy8gR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIGxpbmdlciB0aW1lb3V0LgotICBpbnQgdGltZW91dCBBU0lPX1BSRVZFTlRfTUFDUk9fU1VCU1RJVFVUSU9OKCkgY29uc3QKLSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHZhbHVlXy5sX2xpbmdlcik7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGxldmVsIG9mIHRoZSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIGludCBsZXZlbChjb25zdCBQcm90b2NvbCYpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gTGV2ZWw7Ci0gIH0KLQotICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgaW50IG5hbWUoY29uc3QgUHJvdG9jb2wmKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIE5hbWU7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxpbmdlciBkYXRhLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIGRldGFpbDo6bGluZ2VyX3R5cGUqIGRhdGEoY29uc3QgUHJvdG9jb2wmKQotICB7Ci0gICAgcmV0dXJuICZ2YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxpbmdlciBkYXRhLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIGNvbnN0IGRldGFpbDo6bGluZ2VyX3R5cGUqIGRhdGEoY29uc3QgUHJvdG9jb2wmKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICZ2YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIHNpemUgb2YgdGhlIGxpbmdlciBkYXRhLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIHN0ZDo6c2l6ZV90IHNpemUoY29uc3QgUHJvdG9jb2wmKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNpemVvZih2YWx1ZV8pOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBzaXplIG9mIHRoZSBpbnQgZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICB2b2lkIHJlc2l6ZShjb25zdCBQcm90b2NvbCYsIHN0ZDo6c2l6ZV90IHMpCi0gIHsKLSAgICBpZiAocyAhPSBzaXplb2YodmFsdWVfKSkKLSAgICB7Ci0gICAgICBzdGQ6Omxlbmd0aF9lcnJvciBleCgibGluZ2VyIHNvY2tldCBvcHRpb24gcmVzaXplIik7Ci0gICAgICBhc2lvOjpkZXRhaWw6OnRocm93X2V4Y2VwdGlvbihleCk7Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIGRldGFpbDo6bGluZ2VyX3R5cGUgdmFsdWVfOwotfTsKLQotfSAvLyBuYW1lc3BhY2Ugc29ja2V0X29wdGlvbgotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9TT0NLRVRfT1BUSU9OX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MGNlNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvc29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9TT0NLRVRfU0VMRUNUX0lOVEVSUlVQVEVSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9TT0NLRVRfU0VMRUNUX0lOVEVSUlVQVEVSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgXAotICB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIFwKLSAgfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBzb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgc29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlcigpOwotCi0gIC8vIERlc3RydWN0b3IuCi0gIEFTSU9fREVDTCB+c29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlcigpOwotCi0gIC8vIFJlY3JlYXRlIHRoZSBpbnRlcnJ1cHRlcidzIGRlc2NyaXB0b3JzLiBVc2VkIGFmdGVyIGEgZm9yay4KLSAgQVNJT19ERUNMIHZvaWQgcmVjcmVhdGUoKTsKLQotICAvLyBJbnRlcnJ1cHQgdGhlIHNlbGVjdCBjYWxsLgotICBBU0lPX0RFQ0wgdm9pZCBpbnRlcnJ1cHQoKTsKLQotICAvLyBSZXNldCB0aGUgc2VsZWN0IGludGVycnVwdC4gUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIHdhcyBpbnRlcnJ1cHRlZC4KLSAgQVNJT19ERUNMIGJvb2wgcmVzZXQoKTsKLQotICAvLyBHZXQgdGhlIHJlYWQgZGVzY3JpcHRvciB0byBiZSBwYXNzZWQgdG8gc2VsZWN0LgotICBzb2NrZXRfdHlwZSByZWFkX2Rlc2NyaXB0b3IoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHJlYWRfZGVzY3JpcHRvcl87Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gT3BlbiB0aGUgZGVzY3JpcHRvcnMuIFRocm93cyBvbiBlcnJvci4KLSAgQVNJT19ERUNMIHZvaWQgb3Blbl9kZXNjcmlwdG9ycygpOwotCi0gIC8vIENsb3NlIHRoZSBkZXNjcmlwdG9ycy4KLSAgQVNJT19ERUNMIHZvaWQgY2xvc2VfZGVzY3JpcHRvcnMoKTsKLQotICAvLyBUaGUgcmVhZCBlbmQgb2YgYSBjb25uZWN0aW9uIHVzZWQgdG8gaW50ZXJydXB0IHRoZSBzZWxlY3QgY2FsbC4gVGhpcyBmaWxlCi0gIC8vIGRlc2NyaXB0b3IgaXMgcGFzc2VkIHRvIHNlbGVjdCBzdWNoIHRoYXQgd2hlbiBpdCBpcyB0aW1lIHRvIHN0b3AsIGEgc2luZ2xlCi0gIC8vIGJ5dGUgd2lsbCBiZSB3cml0dGVuIG9uIHRoZSBvdGhlciBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gYW5kIHRoaXMKLSAgLy8gZGVzY3JpcHRvciB3aWxsIGJlY29tZSByZWFkYWJsZS4KLSAgc29ja2V0X3R5cGUgcmVhZF9kZXNjcmlwdG9yXzsKLQotICAvLyBUaGUgd3JpdGUgZW5kIG9mIGEgY29ubmVjdGlvbiB1c2VkIHRvIGludGVycnVwdCB0aGUgc2VsZWN0IGNhbGwuIEEgc2luZ2xlCi0gIC8vIGJ5dGUgbWF5IGJlIHdyaXR0ZW4gdG8gdGhpcyB0byB3YWtlIHVwIHRoZSBzZWxlY3Qgd2hpY2ggaXMgd2FpdGluZyBmb3IgdGhlCi0gIC8vIG90aGVyIGVuZCB0byBiZWNvbWUgcmVhZGFibGUuCi0gIHNvY2tldF90eXBlIHdyaXRlX2Rlc2NyaXB0b3JfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvc29ja2V0X3NlbGVjdF9pbnRlcnJ1cHRlci5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gICAgICAgLy8gfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAgICAgIC8vIHx8IGRlZmluZWQoX19TWU1CSUFOMzJfXykKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfU09DS0VUX1NFTEVDVF9JTlRFUlJVUFRFUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2MDBjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zb2NrZXRfdHlwZXMuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9TT0NLRVRfVFlQRVNfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NPQ0tFVF9UWVBFU19IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0vLyBFbXB0eS4KLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jIGlmIGRlZmluZWQoX1dJTlNPQ0tBUElfKSAmJiAhZGVmaW5lZChfV0lOU09DSzJBUElfKQotIyAgZXJyb3IgV2luU29jay5oIGhhcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQKLSMgZW5kaWYgLy8gZGVmaW5lZChfV0lOU09DS0FQSV8pICYmICFkZWZpbmVkKF9XSU5TT0NLMkFQSV8pCi0jIGlmIGRlZmluZWQoX19CT1JMQU5EQ19fKQotIyAgaW5jbHVkZSA8c3RkbGliLmg+IC8vIE5lZWRlZCBmb3IgX19lcnJubwotIyAgaWYgIWRlZmluZWQoX1dTUElBUElfSF8pCi0jICAgZGVmaW5lIF9XU1BJQVBJX0hfCi0jICAgZGVmaW5lIEFTSU9fV1NQSUFQSV9IX0RFRklORUQKLSMgIGVuZGlmIC8vICFkZWZpbmVkKF9XU1BJQVBJX0hfKQotIyBlbmRpZiAvLyBkZWZpbmVkKF9fQk9STEFORENfXykKLSMgaWYgZGVmaW5lZChXSU5BUElfRkFNSUxZKQotIyAgaWYgKChXSU5BUElfRkFNSUxZICYgV0lOQVBJX1BBUlRJVElPTl9ERVNLVE9QKSAhPSAwKQotIyAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSMgIGVuZGlmIC8vICgoV0lOQVBJX0ZBTUlMWSAmIFdJTkFQSV9QQVJUSVRJT05fREVTS1RPUCkgIT0gMCkKLSMgZW5kaWYgLy8gZGVmaW5lZChXSU5BUElfRkFNSUxZKQotIyBpbmNsdWRlIDx3aW5zb2NrMi5oPgotIyBpbmNsdWRlIDx3czJ0Y3BpcC5oPgotIyBpbmNsdWRlIDxtc3dzb2NrLmg+Ci0jIGlmIGRlZmluZWQoQVNJT19XU1BJQVBJX0hfREVGSU5FRCkKLSMgIHVuZGVmIF9XU1BJQVBJX0hfCi0jICB1bmRlZiBBU0lPX1dTUElBUElfSF9ERUZJTkVECi0jIGVuZGlmIC8vIGRlZmluZWQoQVNJT19XU1BJQVBJX0hfREVGSU5FRCkKLSMgaWYgIWRlZmluZWQoQVNJT19OT19ERUZBVUxUX0xJTktFRF9MSUJTKQotIyAgaWYgZGVmaW5lZChVTkRFUl9DRSkKLSMgICBwcmFnbWEgY29tbWVudChsaWIsICJ3czIubGliIikKLSMgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jICAgcHJhZ21hIGNvbW1lbnQobGliLCAid3MyXzMyLmxpYiIpCi0jICAgcHJhZ21hIGNvbW1lbnQobGliLCAibXN3c29jay5saWIiKQotIyAgZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fREVGQVVMVF9MSU5LRURfTElCUykKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvb2xkX3dpbl9zZGtfY29tcGF0LmhwcCIKLSNlbHNlCi0jIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgotIyBpZiAhZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotIyAgaW5jbHVkZSA8c3lzL3BvbGwuaD4KLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jIGluY2x1ZGUgPGZjbnRsLmg+Ci0jIGlmIGRlZmluZWQoX19ocHV4KQotIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSMgZW5kaWYKLSMgaWYgIWRlZmluZWQoX19ocHV4KSB8fCBkZWZpbmVkKF9fU0VMRUNUKQotIyAgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgotIyBlbmRpZgotIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jIGluY2x1ZGUgPHN5cy91aW8uaD4KLSMgaW5jbHVkZSA8c3lzL3VuLmg+Ci0jIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSMgaWYgIWRlZmluZWQoX19TWU1CSUFOMzJfXykKLSMgIGluY2x1ZGUgPG5ldGluZXQvdGNwLmg+Ci0jIGVuZGlmCi0jIGluY2x1ZGUgPGFycGEvaW5ldC5oPgotIyBpbmNsdWRlIDxuZXRkYi5oPgotIyBpbmNsdWRlIDxuZXQvaWYuaD4KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jIGlmIGRlZmluZWQoX19zdW4pCi0jICBpbmNsdWRlIDxzeXMvZmlsaW8uaD4KLSMgIGluY2x1ZGUgPHN5cy9zb2NraW8uaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotY29uc3QgaW50IG1heF9hZGRyX3Y0X3N0cl9sZW4gPSAyNTY7Ci1jb25zdCBpbnQgbWF4X2FkZHJfdjZfc3RyX2xlbiA9IDI1NjsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQzMiB1X2xvbmdfdHlwZTsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQxNiB1X3Nob3J0X3R5cGU7Ci1zdHJ1Y3QgaW40X2FkZHJfdHlwZSB7IHVfbG9uZ190eXBlIHNfYWRkcjsgfTsKLXN0cnVjdCBpbjRfbXJlcV90eXBlIHsgaW40X2FkZHJfdHlwZSBpbXJfbXVsdGlhZGRyLCBpbXJfaW50ZXJmYWNlOyB9Owotc3RydWN0IGluNl9hZGRyX3R5cGUgeyB1bnNpZ25lZCBjaGFyIHM2X2FkZHJbMTZdOyB9Owotc3RydWN0IGluNl9tcmVxX3R5cGUgeyBpbjZfYWRkcl90eXBlIGlwdjZtcl9tdWx0aWFkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgaXB2Nm1yX2ludGVyZmFjZTsgfTsKLXN0cnVjdCBzb2NrZXRfYWRkcl90eXBlIHsgaW50IHNhX2ZhbWlseTsgfTsKLXN0cnVjdCBzb2NrYWRkcl9pbjRfdHlwZSB7IGludCBzaW5fZmFtaWx5OwotICBpbjRfYWRkcl90eXBlIHNpbl9hZGRyOyB1X3Nob3J0X3R5cGUgc2luX3BvcnQ7IH07Ci1zdHJ1Y3Qgc29ja2FkZHJfaW42X3R5cGUgeyBpbnQgc2luNl9mYW1pbHk7Ci0gIGluNl9hZGRyX3R5cGUgc2luNl9hZGRyOyB1X3Nob3J0X3R5cGUgc2luNl9wb3J0OwotICB1X2xvbmdfdHlwZSBzaW42X2Zsb3dpbmZvOyB1X2xvbmdfdHlwZSBzaW42X3Njb3BlX2lkOyB9Owotc3RydWN0IHNvY2thZGRyX3N0b3JhZ2VfdHlwZSB7IGludCBzc19mYW1pbHk7Ci0gIHVuc2lnbmVkIGNoYXIgc3NfYnl0ZXNbMTI4IC0gc2l6ZW9mKGludCldOyB9Owotc3RydWN0IGFkZHJpbmZvX3R5cGUgeyBpbnQgYWlfZmxhZ3M7Ci0gIGludCBhaV9mYW1pbHksIGFpX3NvY2t0eXBlLCBhaV9wcm90b2NvbDsKLSAgaW50IGFpX2FkZHJsZW47IGNvbnN0IHZvaWQqIGFpX2FkZHI7Ci0gIGNvbnN0IGNoYXIqIGFpX2Nhbm9ubmFtZTsgYWRkcmluZm9fdHlwZSogYWlfbmV4dDsgfTsKLXN0cnVjdCBsaW5nZXJfdHlwZSB7IHVfc2hvcnRfdHlwZSBsX29ub2ZmLCBsX2xpbmdlcjsgfTsKLXR5cGVkZWYgdV9sb25nX3R5cGUgaW9jdGxfYXJnX3R5cGU7Ci10eXBlZGVmIGludCBzaWduZWRfc2l6ZV90eXBlOwotIyBkZWZpbmUgQVNJT19PU19ERUYoYykgQVNJT19PU19ERUZfIyNjCi0jIGRlZmluZSBBU0lPX09TX0RFRl9BRl9VTlNQRUMgMAotIyBkZWZpbmUgQVNJT19PU19ERUZfQUZfSU5FVCAyCi0jIGRlZmluZSBBU0lPX09TX0RFRl9BRl9JTkVUNiAyMwotIyBkZWZpbmUgQVNJT19PU19ERUZfU09DS19TVFJFQU0gMQotIyBkZWZpbmUgQVNJT19PU19ERUZfU09DS19ER1JBTSAyCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT0NLX1JBVyAzCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT0NLX1NFUVBBQ0tFVCA1Ci0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFBST1RPX0lQIDAKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQUFJPVE9fSVBWNiA0MQotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBQUk9UT19UQ1AgNgotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBQUk9UT19VRFAgMTcKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQUFJPVE9fSUNNUCAxCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFBST1RPX0lDTVBWNiA1OAotIyBkZWZpbmUgQVNJT19PU19ERUZfRklPTkJJTyAxCi0jIGRlZmluZSBBU0lPX09TX0RFRl9GSU9OUkVBRCAyCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JTkFERFJfQU5ZIDAKLSMgZGVmaW5lIEFTSU9fT1NfREVGX01TR19PT0IgMHgxCi0jIGRlZmluZSBBU0lPX09TX0RFRl9NU0dfUEVFSyAweDIKLSMgZGVmaW5lIEFTSU9fT1NfREVGX01TR19ET05UUk9VVEUgMHg0Ci0jIGRlZmluZSBBU0lPX09TX0RFRl9NU0dfRU9SIDAgLy8gTm90IHN1cHBvcnRlZC4KLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NIVVRfUkQgMHgwCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TSFVUX1dSIDB4MQotIyBkZWZpbmUgQVNJT19PU19ERUZfU0hVVF9SRFdSIDB4MgotIyBkZWZpbmUgQVNJT19PU19ERUZfU09NQVhDT05OIDB4N2ZmZmZmZmYKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPTF9TT0NLRVQgMHhmZmZmCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT19CUk9BRENBU1QgMHgyMAotIyBkZWZpbmUgQVNJT19PU19ERUZfU09fREVCVUcgMHgxCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT19ET05UUk9VVEUgMHgxMAotIyBkZWZpbmUgQVNJT19PU19ERUZfU09fS0VFUEFMSVZFIDB4OAotIyBkZWZpbmUgQVNJT19PU19ERUZfU09fTElOR0VSIDB4ODAKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX1NOREJVRiAweDEwMDEKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX1JDVkJVRiAweDEwMDIKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX1NORExPV0FUIDB4MTAwMwotIyBkZWZpbmUgQVNJT19PU19ERUZfU09fUkNWTE9XQVQgMHgxMDA0Ci0jIGRlZmluZSBBU0lPX09TX0RFRl9TT19SRVVTRUFERFIgMHg0Ci0jIGRlZmluZSBBU0lPX09TX0RFRl9UQ1BfTk9ERUxBWSAweDEKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQX01VTFRJQ0FTVF9JRiAyCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUF9NVUxUSUNBU1RfVFRMIDMKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQX01VTFRJQ0FTVF9MT09QIDQKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQX0FERF9NRU1CRVJTSElQIDUKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQX0RST1BfTUVNQkVSU0hJUCA2Ci0jIGRlZmluZSBBU0lPX09TX0RFRl9JUF9UVEwgNwotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBWNl9VTklDQVNUX0hPUFMgNAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBWNl9NVUxUSUNBU1RfSUYgOQotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBWNl9NVUxUSUNBU1RfSE9QUyAxMAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBWNl9NVUxUSUNBU1RfTE9PUCAxMQotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBWNl9KT0lOX0dST1VQIDEyCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFY2X0xFQVZFX0dST1VQIDEzCi0jIGRlZmluZSBBU0lPX09TX0RFRl9BSV9DQU5PTk5BTUUgMHgyCi0jIGRlZmluZSBBU0lPX09TX0RFRl9BSV9QQVNTSVZFIDB4MQotIyBkZWZpbmUgQVNJT19PU19ERUZfQUlfTlVNRVJJQ0hPU1QgMHg0Ci0jIGRlZmluZSBBU0lPX09TX0RFRl9BSV9OVU1FUklDU0VSViAweDgKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0FJX1Y0TUFQUEVEIDB4ODAwCi0jIGRlZmluZSBBU0lPX09TX0RFRl9BSV9BTEwgMHgxMDAKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0FJX0FERFJDT05GSUcgMHg0MDAKLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi10eXBlZGVmIFNPQ0tFVCBzb2NrZXRfdHlwZTsKLWNvbnN0IFNPQ0tFVCBpbnZhbGlkX3NvY2tldCA9IElOVkFMSURfU09DS0VUOwotY29uc3QgaW50IHNvY2tldF9lcnJvcl9yZXR2YWwgPSBTT0NLRVRfRVJST1I7Ci1jb25zdCBpbnQgbWF4X2FkZHJfdjRfc3RyX2xlbiA9IDI1NjsKLWNvbnN0IGludCBtYXhfYWRkcl92Nl9zdHJfbGVuID0gMjU2OwotdHlwZWRlZiBzb2NrYWRkciBzb2NrZXRfYWRkcl90eXBlOwotdHlwZWRlZiBpbl9hZGRyIGluNF9hZGRyX3R5cGU7Ci10eXBlZGVmIGlwX21yZXEgaW40X21yZXFfdHlwZTsKLXR5cGVkZWYgc29ja2FkZHJfaW4gc29ja2FkZHJfaW40X3R5cGU7Ci0jIGlmIGRlZmluZWQoQVNJT19IQVNfT0xEX1dJTl9TREspCi10eXBlZGVmIGluNl9hZGRyX2VtdWxhdGlvbiBpbjZfYWRkcl90eXBlOwotdHlwZWRlZiBpcHY2X21yZXFfZW11bGF0aW9uIGluNl9tcmVxX3R5cGU7Ci10eXBlZGVmIHNvY2thZGRyX2luNl9lbXVsYXRpb24gc29ja2FkZHJfaW42X3R5cGU7Ci10eXBlZGVmIHNvY2thZGRyX3N0b3JhZ2VfZW11bGF0aW9uIHNvY2thZGRyX3N0b3JhZ2VfdHlwZTsKLXR5cGVkZWYgYWRkcmluZm9fZW11bGF0aW9uIGFkZHJpbmZvX3R5cGU7Ci0jIGVsc2UKLXR5cGVkZWYgaW42X2FkZHIgaW42X2FkZHJfdHlwZTsKLXR5cGVkZWYgaXB2Nl9tcmVxIGluNl9tcmVxX3R5cGU7Ci10eXBlZGVmIHNvY2thZGRyX2luNiBzb2NrYWRkcl9pbjZfdHlwZTsKLXR5cGVkZWYgc29ja2FkZHJfc3RvcmFnZSBzb2NrYWRkcl9zdG9yYWdlX3R5cGU7Ci10eXBlZGVmIGFkZHJpbmZvIGFkZHJpbmZvX3R5cGU7Ci0jIGVuZGlmCi10eXBlZGVmIDo6bGluZ2VyIGxpbmdlcl90eXBlOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGlvY3RsX2FyZ190eXBlOwotdHlwZWRlZiB1X2xvbmcgdV9sb25nX3R5cGU7Ci10eXBlZGVmIHVfc2hvcnQgdV9zaG9ydF90eXBlOwotdHlwZWRlZiBpbnQgc2lnbmVkX3NpemVfdHlwZTsKLSMgZGVmaW5lIEFTSU9fT1NfREVGKGMpIEFTSU9fT1NfREVGXyMjYwotIyBkZWZpbmUgQVNJT19PU19ERUZfQUZfVU5TUEVDIEFGX1VOU1BFQwotIyBkZWZpbmUgQVNJT19PU19ERUZfQUZfSU5FVCBBRl9JTkVUCi0jIGRlZmluZSBBU0lPX09TX0RFRl9BRl9JTkVUNiBBRl9JTkVUNgotIyBkZWZpbmUgQVNJT19PU19ERUZfU09DS19TVFJFQU0gU09DS19TVFJFQU0KLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPQ0tfREdSQU0gU09DS19ER1JBTQotIyBkZWZpbmUgQVNJT19PU19ERUZfU09DS19SQVcgU09DS19SQVcKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPQ0tfU0VRUEFDS0VUIFNPQ0tfU0VRUEFDS0VUCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFBST1RPX0lQIElQUFJPVE9fSVAKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQUFJPVE9fSVBWNiBJUFBST1RPX0lQVjYKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQUFJPVE9fVENQIElQUFJPVE9fVENQCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFBST1RPX1VEUCBJUFBST1RPX1VEUAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBQUk9UT19JQ01QIElQUFJPVE9fSUNNUAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBQUk9UT19JQ01QVjYgSVBQUk9UT19JQ01QVjYKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0ZJT05CSU8gRklPTkJJTwotIyBkZWZpbmUgQVNJT19PU19ERUZfRklPTlJFQUQgRklPTlJFQUQKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lOQUREUl9BTlkgSU5BRERSX0FOWQotIyBkZWZpbmUgQVNJT19PU19ERUZfTVNHX09PQiBNU0dfT09CCi0jIGRlZmluZSBBU0lPX09TX0RFRl9NU0dfUEVFSyBNU0dfUEVFSwotIyBkZWZpbmUgQVNJT19PU19ERUZfTVNHX0RPTlRST1VURSBNU0dfRE9OVFJPVVRFCi0jIGRlZmluZSBBU0lPX09TX0RFRl9NU0dfRU9SIDAgLy8gTm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLgotIyBkZWZpbmUgQVNJT19PU19ERUZfU0hVVF9SRCBTRF9SRUNFSVZFCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TSFVUX1dSIFNEX1NFTkQKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NIVVRfUkRXUiBTRF9CT1RICi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT01BWENPTk4gU09NQVhDT05OCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT0xfU09DS0VUIFNPTF9TT0NLRVQKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX0JST0FEQ0FTVCBTT19CUk9BRENBU1QKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX0RFQlVHIFNPX0RFQlVHCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT19ET05UUk9VVEUgU09fRE9OVFJPVVRFCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT19LRUVQQUxJVkUgU09fS0VFUEFMSVZFCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT19MSU5HRVIgU09fTElOR0VSCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT19TTkRCVUYgU09fU05EQlVGCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT19SQ1ZCVUYgU09fUkNWQlVGCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT19TTkRMT1dBVCBTT19TTkRMT1dBVAotIyBkZWZpbmUgQVNJT19PU19ERUZfU09fUkNWTE9XQVQgU09fUkNWTE9XQVQKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX1JFVVNFQUREUiBTT19SRVVTRUFERFIKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1RDUF9OT0RFTEFZIFRDUF9OT0RFTEFZCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUF9NVUxUSUNBU1RfSUYgSVBfTVVMVElDQVNUX0lGCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUF9NVUxUSUNBU1RfVFRMIElQX01VTFRJQ0FTVF9UVEwKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQX01VTFRJQ0FTVF9MT09QIElQX01VTFRJQ0FTVF9MT09QCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUF9BRERfTUVNQkVSU0hJUCBJUF9BRERfTUVNQkVSU0hJUAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBfRFJPUF9NRU1CRVJTSElQIElQX0RST1BfTUVNQkVSU0hJUAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBfVFRMIElQX1RUTAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBWNl9VTklDQVNUX0hPUFMgSVBWNl9VTklDQVNUX0hPUFMKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQVjZfTVVMVElDQVNUX0lGIElQVjZfTVVMVElDQVNUX0lGCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFY2X01VTFRJQ0FTVF9IT1BTIElQVjZfTVVMVElDQVNUX0hPUFMKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQVjZfTVVMVElDQVNUX0xPT1AgSVBWNl9NVUxUSUNBU1RfTE9PUAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBWNl9KT0lOX0dST1VQIElQVjZfSk9JTl9HUk9VUAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBWNl9MRUFWRV9HUk9VUCBJUFY2X0xFQVZFX0dST1VQCi0jIGRlZmluZSBBU0lPX09TX0RFRl9BSV9DQU5PTk5BTUUgQUlfQ0FOT05OQU1FCi0jIGRlZmluZSBBU0lPX09TX0RFRl9BSV9QQVNTSVZFIEFJX1BBU1NJVkUKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0FJX05VTUVSSUNIT1NUIEFJX05VTUVSSUNIT1NUCi0jIGlmIGRlZmluZWQoQUlfTlVNRVJJQ1NFUlYpCi0jICBkZWZpbmUgQVNJT19PU19ERUZfQUlfTlVNRVJJQ1NFUlYgQUlfTlVNRVJJQ1NFUlYKLSMgZWxzZQotIyAgZGVmaW5lIEFTSU9fT1NfREVGX0FJX05VTUVSSUNTRVJWIDAKLSMgZW5kaWYKLSMgaWYgZGVmaW5lZChBSV9WNE1BUFBFRCkKLSMgIGRlZmluZSBBU0lPX09TX0RFRl9BSV9WNE1BUFBFRCBBSV9WNE1BUFBFRAotIyBlbHNlCi0jICBkZWZpbmUgQVNJT19PU19ERUZfQUlfVjRNQVBQRUQgMAotIyBlbmRpZgotIyBpZiBkZWZpbmVkKEFJX0FMTCkKLSMgIGRlZmluZSBBU0lPX09TX0RFRl9BSV9BTEwgQUlfQUxMCi0jIGVsc2UKLSMgIGRlZmluZSBBU0lPX09TX0RFRl9BSV9BTEwgMAotIyBlbmRpZgotIyBpZiBkZWZpbmVkKEFJX0FERFJDT05GSUcpCi0jICBkZWZpbmUgQVNJT19PU19ERUZfQUlfQUREUkNPTkZJRyBBSV9BRERSQ09ORklHCi0jIGVsc2UKLSMgIGRlZmluZSBBU0lPX09TX0RFRl9BSV9BRERSQ09ORklHIDAKLSMgZW5kaWYKLSMgaWYgZGVmaW5lZCAoX1dJTjMyX1dJTk5UKQotY29uc3QgaW50IG1heF9pb3ZfbGVuID0gNjQ7Ci0jIGVsc2UKLWNvbnN0IGludCBtYXhfaW92X2xlbiA9IDE2OwotIyBlbmRpZgotI2Vsc2UKLXR5cGVkZWYgaW50IHNvY2tldF90eXBlOwotY29uc3QgaW50IGludmFsaWRfc29ja2V0ID0gLTE7Ci1jb25zdCBpbnQgc29ja2V0X2Vycm9yX3JldHZhbCA9IC0xOwotY29uc3QgaW50IG1heF9hZGRyX3Y0X3N0cl9sZW4gPSBJTkVUX0FERFJTVFJMRU47Ci0jaWYgZGVmaW5lZChJTkVUNl9BRERSU1RSTEVOKQotY29uc3QgaW50IG1heF9hZGRyX3Y2X3N0cl9sZW4gPSBJTkVUNl9BRERSU1RSTEVOICsgMSArIElGX05BTUVTSVpFOwotI2Vsc2UgLy8gZGVmaW5lZChJTkVUNl9BRERSU1RSTEVOKQotY29uc3QgaW50IG1heF9hZGRyX3Y2X3N0cl9sZW4gPSAyNTY7Ci0jZW5kaWYgLy8gZGVmaW5lZChJTkVUNl9BRERSU1RSTEVOKQotdHlwZWRlZiBzb2NrYWRkciBzb2NrZXRfYWRkcl90eXBlOwotdHlwZWRlZiBpbl9hZGRyIGluNF9hZGRyX3R5cGU7Ci0jIGlmIGRlZmluZWQoX19ocHV4KQotLy8gSFAtVVggZG9lc24ndCBwcm92aWRlIGlwX21yZXEgd2hlbiBfWE9QRU5fU09VUkNFX0VYVEVOREVEIGlzIGRlZmluZWQuCi1zdHJ1Y3QgaW40X21yZXFfdHlwZQotewotICBzdHJ1Y3QgaW5fYWRkciBpbXJfbXVsdGlhZGRyOwotICBzdHJ1Y3QgaW5fYWRkciBpbXJfaW50ZXJmYWNlOwotfTsKLSMgZWxzZQotdHlwZWRlZiBpcF9tcmVxIGluNF9tcmVxX3R5cGU7Ci0jIGVuZGlmCi10eXBlZGVmIHNvY2thZGRyX2luIHNvY2thZGRyX2luNF90eXBlOwotdHlwZWRlZiBpbjZfYWRkciBpbjZfYWRkcl90eXBlOwotdHlwZWRlZiBpcHY2X21yZXEgaW42X21yZXFfdHlwZTsKLXR5cGVkZWYgc29ja2FkZHJfaW42IHNvY2thZGRyX2luNl90eXBlOwotdHlwZWRlZiBzb2NrYWRkcl9zdG9yYWdlIHNvY2thZGRyX3N0b3JhZ2VfdHlwZTsKLXR5cGVkZWYgc29ja2FkZHJfdW4gc29ja2FkZHJfdW5fdHlwZTsKLXR5cGVkZWYgYWRkcmluZm8gYWRkcmluZm9fdHlwZTsKLXR5cGVkZWYgOjpsaW5nZXIgbGluZ2VyX3R5cGU7Ci10eXBlZGVmIGludCBpb2N0bF9hcmdfdHlwZTsKLXR5cGVkZWYgdWludDMyX3QgdV9sb25nX3R5cGU7Ci10eXBlZGVmIHVpbnQxNl90IHVfc2hvcnRfdHlwZTsKLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NTSVpFX1QpCi10eXBlZGVmIHNzaXplX3Qgc2lnbmVkX3NpemVfdHlwZTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU1NJWkVfVCkKLXR5cGVkZWYgaW50IHNpZ25lZF9zaXplX3R5cGU7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TU0laRV9UKQotIyBkZWZpbmUgQVNJT19PU19ERUYoYykgQVNJT19PU19ERUZfIyNjCi0jIGRlZmluZSBBU0lPX09TX0RFRl9BRl9VTlNQRUMgQUZfVU5TUEVDCi0jIGRlZmluZSBBU0lPX09TX0RFRl9BRl9JTkVUIEFGX0lORVQKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0FGX0lORVQ2IEFGX0lORVQ2Ci0jIGRlZmluZSBBU0lPX09TX0RFRl9TT0NLX1NUUkVBTSBTT0NLX1NUUkVBTQotIyBkZWZpbmUgQVNJT19PU19ERUZfU09DS19ER1JBTSBTT0NLX0RHUkFNCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT0NLX1JBVyBTT0NLX1JBVwotIyBkZWZpbmUgQVNJT19PU19ERUZfU09DS19TRVFQQUNLRVQgU09DS19TRVFQQUNLRVQKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQUFJPVE9fSVAgSVBQUk9UT19JUAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBQUk9UT19JUFY2IElQUFJPVE9fSVBWNgotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBQUk9UT19UQ1AgSVBQUk9UT19UQ1AKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQUFJPVE9fVURQIElQUFJPVE9fVURQCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFBST1RPX0lDTVAgSVBQUk9UT19JQ01QCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFBST1RPX0lDTVBWNiBJUFBST1RPX0lDTVBWNgotIyBkZWZpbmUgQVNJT19PU19ERUZfRklPTkJJTyBGSU9OQklPCi0jIGRlZmluZSBBU0lPX09TX0RFRl9GSU9OUkVBRCBGSU9OUkVBRAotIyBkZWZpbmUgQVNJT19PU19ERUZfSU5BRERSX0FOWSBJTkFERFJfQU5ZCi0jIGRlZmluZSBBU0lPX09TX0RFRl9NU0dfT09CIE1TR19PT0IKLSMgZGVmaW5lIEFTSU9fT1NfREVGX01TR19QRUVLIE1TR19QRUVLCi0jIGRlZmluZSBBU0lPX09TX0RFRl9NU0dfRE9OVFJPVVRFIE1TR19ET05UUk9VVEUKLSMgZGVmaW5lIEFTSU9fT1NfREVGX01TR19FT1IgTVNHX0VPUgotIyBkZWZpbmUgQVNJT19PU19ERUZfU0hVVF9SRCBTSFVUX1JECi0jIGRlZmluZSBBU0lPX09TX0RFRl9TSFVUX1dSIFNIVVRfV1IKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NIVVRfUkRXUiBTSFVUX1JEV1IKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPTUFYQ09OTiBTT01BWENPTk4KLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPTF9TT0NLRVQgU09MX1NPQ0tFVAotIyBkZWZpbmUgQVNJT19PU19ERUZfU09fQlJPQURDQVNUIFNPX0JST0FEQ0FTVAotIyBkZWZpbmUgQVNJT19PU19ERUZfU09fREVCVUcgU09fREVCVUcKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX0RPTlRST1VURSBTT19ET05UUk9VVEUKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX0tFRVBBTElWRSBTT19LRUVQQUxJVkUKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX0xJTkdFUiBTT19MSU5HRVIKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX1NOREJVRiBTT19TTkRCVUYKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX1JDVkJVRiBTT19SQ1ZCVUYKLSMgZGVmaW5lIEFTSU9fT1NfREVGX1NPX1NORExPV0FUIFNPX1NORExPV0FUCi0jIGRlZmluZSBBU0lPX09TX0RFRl9TT19SQ1ZMT1dBVCBTT19SQ1ZMT1dBVAotIyBkZWZpbmUgQVNJT19PU19ERUZfU09fUkVVU0VBRERSIFNPX1JFVVNFQUREUgotIyBkZWZpbmUgQVNJT19PU19ERUZfVENQX05PREVMQVkgVENQX05PREVMQVkKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQX01VTFRJQ0FTVF9JRiBJUF9NVUxUSUNBU1RfSUYKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQX01VTFRJQ0FTVF9UVEwgSVBfTVVMVElDQVNUX1RUTAotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBfTVVMVElDQVNUX0xPT1AgSVBfTVVMVElDQVNUX0xPT1AKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQX0FERF9NRU1CRVJTSElQIElQX0FERF9NRU1CRVJTSElQCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUF9EUk9QX01FTUJFUlNISVAgSVBfRFJPUF9NRU1CRVJTSElQCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUF9UVEwgSVBfVFRMCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFY2X1VOSUNBU1RfSE9QUyBJUFY2X1VOSUNBU1RfSE9QUwotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBWNl9NVUxUSUNBU1RfSUYgSVBWNl9NVUxUSUNBU1RfSUYKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0lQVjZfTVVMVElDQVNUX0hPUFMgSVBWNl9NVUxUSUNBU1RfSE9QUwotIyBkZWZpbmUgQVNJT19PU19ERUZfSVBWNl9NVUxUSUNBU1RfTE9PUCBJUFY2X01VTFRJQ0FTVF9MT09QCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFY2X0pPSU5fR1JPVVAgSVBWNl9KT0lOX0dST1VQCi0jIGRlZmluZSBBU0lPX09TX0RFRl9JUFY2X0xFQVZFX0dST1VQIElQVjZfTEVBVkVfR1JPVVAKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0FJX0NBTk9OTkFNRSBBSV9DQU5PTk5BTUUKLSMgZGVmaW5lIEFTSU9fT1NfREVGX0FJX1BBU1NJVkUgQUlfUEFTU0lWRQotIyBkZWZpbmUgQVNJT19PU19ERUZfQUlfTlVNRVJJQ0hPU1QgQUlfTlVNRVJJQ0hPU1QKLSMgaWYgZGVmaW5lZChBSV9OVU1FUklDU0VSVikKLSMgIGRlZmluZSBBU0lPX09TX0RFRl9BSV9OVU1FUklDU0VSViBBSV9OVU1FUklDU0VSVgotIyBlbHNlCi0jICBkZWZpbmUgQVNJT19PU19ERUZfQUlfTlVNRVJJQ1NFUlYgMAotIyBlbmRpZgotLy8gTm90ZTogUU5YIE5ldXRyaW5vIDYuMyBkZWZpbmVzIEFJX1Y0TUFQUEVELCBBSV9BTEwgYW5kIEFJX0FERFJDT05GSUcgYnV0Ci0vLyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlbS4gVGhlcmVmb3JlIHRoZXkgYXJlIHNwZWNpZmljYWxseSBleGNsdWRlZCBoZXJlLgotIyBpZiBkZWZpbmVkKEFJX1Y0TUFQUEVEKSAmJiAhZGVmaW5lZChfX1FOWE5UT19fKQotIyAgZGVmaW5lIEFTSU9fT1NfREVGX0FJX1Y0TUFQUEVEIEFJX1Y0TUFQUEVECi0jIGVsc2UKLSMgIGRlZmluZSBBU0lPX09TX0RFRl9BSV9WNE1BUFBFRCAwCi0jIGVuZGlmCi0jIGlmIGRlZmluZWQoQUlfQUxMKSAmJiAhZGVmaW5lZChfX1FOWE5UT19fKQotIyAgZGVmaW5lIEFTSU9fT1NfREVGX0FJX0FMTCBBSV9BTEwKLSMgZWxzZQotIyAgZGVmaW5lIEFTSU9fT1NfREVGX0FJX0FMTCAwCi0jIGVuZGlmCi0jIGlmIGRlZmluZWQoQUlfQUREUkNPTkZJRykgJiYgIWRlZmluZWQoX19RTlhOVE9fXykKLSMgIGRlZmluZSBBU0lPX09TX0RFRl9BSV9BRERSQ09ORklHIEFJX0FERFJDT05GSUcKLSMgZWxzZQotIyAgZGVmaW5lIEFTSU9fT1NfREVGX0FJX0FERFJDT05GSUcgMAotIyBlbmRpZgotIyBpZiBkZWZpbmVkKElPVl9NQVgpCi1jb25zdCBpbnQgbWF4X2lvdl9sZW4gPSBJT1ZfTUFYOwotIyBlbHNlCi0vLyBQT1NJWCBwbGF0Zm9ybXMgYXJlIG5vdCByZXF1aXJlZCB0byBkZWZpbmUgSU9WX01BWC4KLWNvbnN0IGludCBtYXhfaW92X2xlbiA9IDE2OwotIyBlbmRpZgotI2VuZGlmCi1jb25zdCBpbnQgY3VzdG9tX3NvY2tldF9vcHRpb25fbGV2ZWwgPSAweEE1MTAwMDAwOwotY29uc3QgaW50IGVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWRfb3B0aW9uID0gMTsKLWNvbnN0IGludCBhbHdheXNfZmFpbF9vcHRpb24gPSAyOwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NPQ0tFVF9UWVBFU19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc29sYXJpc19mZW5jZWRfYmxvY2suaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zb2xhcmlzX2ZlbmNlZF9ibG9jay5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDFlYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zb2xhcmlzX2ZlbmNlZF9ibG9jay5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3NvbGFyaXNfZmVuY2VkX2Jsb2NrLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9TT0xBUklTX0ZFTkNFRF9CTE9DS19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfU09MQVJJU19GRU5DRURfQkxPQ0tfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKF9fc3VuKQotCi0jaW5jbHVkZSA8YXRvbWljLmg+Ci0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgc29sYXJpc19mZW5jZWRfYmxvY2sKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIGVudW0gaGFsZl90IHsgaGFsZiB9OwotICBlbnVtIGZ1bGxfdCB7IGZ1bGwgfTsKLQotICAvLyBDb25zdHJ1Y3RvciBmb3IgYSBoYWxmIGZlbmNlZCBibG9jay4KLSAgZXhwbGljaXQgc29sYXJpc19mZW5jZWRfYmxvY2soaGFsZl90KQotICB7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3RvciBmb3IgYSBmdWxsIGZlbmNlZCBibG9jay4KLSAgZXhwbGljaXQgc29sYXJpc19mZW5jZWRfYmxvY2soZnVsbF90KQotICB7Ci0gICAgbWVtYmFyX2NvbnN1bWVyKCk7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+c29sYXJpc19mZW5jZWRfYmxvY2soKQotICB7Ci0gICAgbWVtYmFyX3Byb2R1Y2VyKCk7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChfX3N1bikKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NPTEFSSVNfRkVOQ0VEX0JMT0NLX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zdGF0aWNfbXV0ZXguaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zdGF0aWNfbXV0ZXguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzg0MTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc3RhdGljX211dGV4LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvc3RhdGljX211dGV4LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfU1RBVElDX01VVEVYX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9TVEFUSUNfTVVURVhfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9udWxsX3N0YXRpY19tdXRleC5ocHAiCi0jZWxpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX3N0YXRpY19tdXRleC5ocHAiCi0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9wb3NpeF9zdGF0aWNfbXV0ZXguaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19TVERfTVVURVhfQU5EX0NPTkRWQVIpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3N0ZF9zdGF0aWNfbXV0ZXguaHBwIgotI2Vsc2UKLSMgZXJyb3IgT25seSBXaW5kb3dzIGFuZCBQT1NJWCBhcmUgc3VwcG9ydGVkIQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfVEhSRUFEUykKLXR5cGVkZWYgbnVsbF9zdGF0aWNfbXV0ZXggc3RhdGljX211dGV4OwotIyBkZWZpbmUgQVNJT19TVEFUSUNfTVVURVhfSU5JVCBBU0lPX05VTExfU1RBVElDX01VVEVYX0lOSVQKLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotdHlwZWRlZiB3aW5fc3RhdGljX211dGV4IHN0YXRpY19tdXRleDsKLSMgZGVmaW5lIEFTSU9fU1RBVElDX01VVEVYX0lOSVQgQVNJT19XSU5fU1RBVElDX01VVEVYX0lOSVQKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi10eXBlZGVmIHBvc2l4X3N0YXRpY19tdXRleCBzdGF0aWNfbXV0ZXg7Ci0jIGRlZmluZSBBU0lPX1NUQVRJQ19NVVRFWF9JTklUIEFTSU9fUE9TSVhfU1RBVElDX01VVEVYX0lOSVQKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfU1REX01VVEVYX0FORF9DT05EVkFSKQotdHlwZWRlZiBzdGRfc3RhdGljX211dGV4IHN0YXRpY19tdXRleDsKLSMgZGVmaW5lIEFTSU9fU1RBVElDX01VVEVYX0lOSVQgQVNJT19TVERfU1RBVElDX01VVEVYX0lOSVQKLSNlbmRpZgotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NUQVRJQ19NVVRFWF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc3RkX2V2ZW50LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc3RkX2V2ZW50LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjNWUyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3N0ZF9ldmVudC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zdGRfZXZlbnQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9TVERfRVZFTlRfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NURF9FVkVOVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU1REX01VVEVYX0FORF9DT05EVkFSKQotCi0jaW5jbHVkZSA8Y2hyb25vPgotI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hc3NlcnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBzdGRfZXZlbnQKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBzdGRfZXZlbnQoKQotICAgIDogc3RhdGVfKDApCi0gIHsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IuCi0gIH5zdGRfZXZlbnQoKQotICB7Ci0gIH0KLQotICAvLyBTaWduYWwgdGhlIGV2ZW50LiAoUmV0YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuKQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgdm9pZCBzaWduYWwoTG9jayYgbG9jaykKLSAgewotICAgIHRoaXMtPnNpZ25hbF9hbGwobG9jayk7Ci0gIH0KLQotICAvLyBTaWduYWwgYWxsIHdhaXRlcnMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb2NrPgotICB2b2lkIHNpZ25hbF9hbGwoTG9jayYgbG9jaykKLSAgewotICAgIEFTSU9fQVNTRVJUKGxvY2subG9ja2VkKCkpOwotICAgICh2b2lkKWxvY2s7Ci0gICAgc3RhdGVfIHw9IDE7Ci0gICAgY29uZF8ubm90aWZ5X2FsbCgpOwotICB9Ci0KLSAgLy8gVW5sb2NrIHRoZSBtdXRleCBhbmQgc2lnbmFsIG9uZSB3YWl0ZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb2NrPgotICB2b2lkIHVubG9ja19hbmRfc2lnbmFsX29uZShMb2NrJiBsb2NrKQotICB7Ci0gICAgQVNJT19BU1NFUlQobG9jay5sb2NrZWQoKSk7Ci0gICAgc3RhdGVfIHw9IDE7Ci0gICAgYm9vbCBoYXZlX3dhaXRlcnMgPSAoc3RhdGVfID4gMSk7Ci0gICAgbG9jay51bmxvY2soKTsKLSAgICBpZiAoaGF2ZV93YWl0ZXJzKQotICAgICAgY29uZF8ubm90aWZ5X29uZSgpOwotICB9Ci0KLSAgLy8gSWYgdGhlcmUncyBhIHdhaXRlciwgdW5sb2NrIHRoZSBtdXRleCBhbmQgc2lnbmFsIGl0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgYm9vbCBtYXliZV91bmxvY2tfYW5kX3NpZ25hbF9vbmUoTG9jayYgbG9jaykKLSAgewotICAgIEFTSU9fQVNTRVJUKGxvY2subG9ja2VkKCkpOwotICAgIHN0YXRlXyB8PSAxOwotICAgIGlmIChzdGF0ZV8gPiAxKQotICAgIHsKLSAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICBjb25kXy5ub3RpZnlfb25lKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmVzZXQgdGhlIGV2ZW50LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgdm9pZCBjbGVhcihMb2NrJiBsb2NrKQotICB7Ci0gICAgQVNJT19BU1NFUlQobG9jay5sb2NrZWQoKSk7Ci0gICAgKHZvaWQpbG9jazsKLSAgICBzdGF0ZV8gJj0gfnN0ZDo6c2l6ZV90KDEpOwotICB9Ci0KLSAgLy8gV2FpdCBmb3IgdGhlIGV2ZW50IHRvIGJlY29tZSBzaWduYWxsZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb2NrPgotICB2b2lkIHdhaXQoTG9jayYgbG9jaykKLSAgewotICAgIEFTSU9fQVNTRVJUKGxvY2subG9ja2VkKCkpOwotICAgIHVuaXF1ZV9sb2NrX2FkYXB0ZXIgdV9sb2NrKGxvY2spOwotICAgIHdoaWxlICgoc3RhdGVfICYgMSkgPT0gMCkKLSAgICB7Ci0gICAgICB3YWl0ZXIgdyhzdGF0ZV8pOwotICAgICAgY29uZF8ud2FpdCh1X2xvY2sudW5pcXVlX2xvY2tfKTsKLSAgICB9Ci0gIH0KLQotICAvLyBUaW1lZCB3YWl0IGZvciB0aGUgZXZlbnQgdG8gYmVjb21lIHNpZ25hbGxlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIExvY2s+Ci0gIGJvb2wgd2FpdF9mb3JfdXNlYyhMb2NrJiBsb2NrLCBsb25nIHVzZWMpCi0gIHsKLSAgICBBU0lPX0FTU0VSVChsb2NrLmxvY2tlZCgpKTsKLSAgICB1bmlxdWVfbG9ja19hZGFwdGVyIHVfbG9jayhsb2NrKTsKLSAgICBpZiAoKHN0YXRlXyAmIDEpID09IDApCi0gICAgewotICAgICAgd2FpdGVyIHcoc3RhdGVfKTsKLSAgICAgIGNvbmRfLndhaXRfZm9yKHVfbG9jay51bmlxdWVfbG9ja18sIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHModXNlYykpOwotICAgIH0KLSAgICByZXR1cm4gKHN0YXRlXyAmIDEpICE9IDA7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gSGVscGVyIGNsYXNzIHRvIHRlbXBvcmFyaWx5IGFkYXB0IGEgc2NvcGVkX2xvY2sgaW50byBhIHVuaXF1ZV9sb2NrIHNvIHRoYXQKLSAgLy8gaXQgY2FuIGJlIHBhc3NlZCB0byBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZTo6d2FpdCgpLgotICBzdHJ1Y3QgdW5pcXVlX2xvY2tfYWRhcHRlcgotICB7Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIExvY2s+Ci0gICAgZXhwbGljaXQgdW5pcXVlX2xvY2tfYWRhcHRlcihMb2NrJiBsb2NrKQotICAgICAgOiB1bmlxdWVfbG9ja18obG9jay5tdXRleCgpLm11dGV4Xywgc3RkOjphZG9wdF9sb2NrKQotICAgIHsKLSAgICB9Ci0KLSAgICB+dW5pcXVlX2xvY2tfYWRhcHRlcigpCi0gICAgewotICAgICAgdW5pcXVlX2xvY2tfLnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IHVuaXF1ZV9sb2NrXzsKLSAgfTsKLQotICAvLyBIZWxwZXIgdG8gaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgdGhlIHN0YXRlIHRvIHRyYWNrIG91dHN0YW5kaW5nIHdhaXRlcnMuCi0gIGNsYXNzIHdhaXRlcgotICB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCB3YWl0ZXIoc3RkOjpzaXplX3QmIHN0YXRlKQotICAgICAgOiBzdGF0ZV8oc3RhdGUpCi0gICAgewotICAgICAgc3RhdGVfICs9IDI7Ci0gICAgfQotCi0gICAgfndhaXRlcigpCi0gICAgewotICAgICAgc3RhdGVfIC09IDI7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgc3RkOjpzaXplX3QmIHN0YXRlXzsKLSAgfTsKLQotICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjb25kXzsKLSAgc3RkOjpzaXplX3Qgc3RhdGVfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9NVVRFWF9BTkRfQ09ORFZBUikKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NURF9FVkVOVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc3RkX211dGV4LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc3RkX211dGV4LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4YWExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3N0ZF9tdXRleC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLwotLy8gZGV0YWlsL3N0ZF9tdXRleC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1NURF9NVVRFWF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfU1REX01VVEVYX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TVERfTVVURVhfQU5EX0NPTkRWQVIpCi0KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc2NvcGVkX2xvY2suaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHN0ZF9ldmVudDsKLQotY2xhc3Mgc3RkX211dGV4Ci0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c2NvcGVkX2xvY2s8c3RkX211dGV4PiBzY29wZWRfbG9jazsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgc3RkX211dGV4KCkKLSAgewotICB9Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgfnN0ZF9tdXRleCgpCi0gIHsKLSAgfQotCi0gIC8vIExvY2sgdGhlIG11dGV4LgotICB2b2lkIGxvY2soKQotICB7Ci0gICAgbXV0ZXhfLmxvY2soKTsKLSAgfQotCi0gIC8vIFVubG9jayB0aGUgbXV0ZXguCi0gIHZvaWQgdW5sb2NrKCkKLSAgewotICAgIG11dGV4Xy51bmxvY2soKTsKLSAgfQotCi1wcml2YXRlOgotICBmcmllbmQgY2xhc3Mgc3RkX2V2ZW50OwotICBzdGQ6Om11dGV4IG11dGV4XzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfTVVURVhfQU5EX0NPTkRWQVIpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9TVERfTVVURVhfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3N0ZF9zdGF0aWNfbXV0ZXguaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zdGRfc3RhdGljX211dGV4LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJhYmFkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3N0ZF9zdGF0aWNfbXV0ZXguaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zdGRfc3RhdGljX211dGV4LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1NURF9TVEFUSUNfTVVURVhfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NURF9TVEFUSUNfTVVURVhfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9NVVRFWF9BTkRfQ09ORFZBUikKLQotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zY29wZWRfbG9jay5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgc3RkX2V2ZW50OwotCi1jbGFzcyBzdGRfc3RhdGljX211dGV4Ci0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c2NvcGVkX2xvY2s8c3RkX3N0YXRpY19tdXRleD4gc2NvcGVkX2xvY2s7Ci0KLSAgLy8gQ29uc3RydWN0b3IuCi0gIHN0ZF9zdGF0aWNfbXV0ZXgoaW50KQotICB7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+c3RkX3N0YXRpY19tdXRleCgpCi0gIHsKLSAgfQotCi0gIC8vIEluaXRpYWxpc2UgdGhlIG11dGV4LgotICB2b2lkIGluaXQoKQotICB7Ci0gICAgLy8gTm90aGluZyB0byBkby4KLSAgfQotCi0gIC8vIExvY2sgdGhlIG11dGV4LgotICB2b2lkIGxvY2soKQotICB7Ci0gICAgbXV0ZXhfLmxvY2soKTsKLSAgfQotCi0gIC8vIFVubG9jayB0aGUgbXV0ZXguCi0gIHZvaWQgdW5sb2NrKCkKLSAgewotICAgIG11dGV4Xy51bmxvY2soKTsKLSAgfQotCi1wcml2YXRlOgotICBmcmllbmQgY2xhc3Mgc3RkX2V2ZW50OwotICBzdGQ6Om11dGV4IG11dGV4XzsKLX07Ci0KLSNkZWZpbmUgQVNJT19TVERfU1RBVElDX01VVEVYX0lOSVQgMAotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX01VVEVYX0FORF9DT05EVkFSKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfU1REX1NUQVRJQ19NVVRFWF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc3RkX3RocmVhZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3N0ZF90aHJlYWQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTZhODk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc3RkX3RocmVhZC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3N0ZF90aHJlYWQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfU1REX1RIUkVBRF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfU1REX1RIUkVBRF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU1REX1RIUkVBRCkKLQotI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgc3RkX3RocmVhZAotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RkX3RocmVhZChGdW5jdGlvbiBmLCB1bnNpZ25lZCBpbnQgPSAwKQotICAgIDogdGhyZWFkXyhmKQotICB7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+c3RkX3RocmVhZCgpCi0gIHsKLSAgICBqb2luKCk7Ci0gIH0KLQotICAvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIGV4aXQuCi0gIHZvaWQgam9pbigpCi0gIHsKLSAgICBpZiAodGhyZWFkXy5qb2luYWJsZSgpKQotICAgICAgdGhyZWFkXy5qb2luKCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgc3RkOjp0aHJlYWQgdGhyZWFkXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfVEhSRUFEKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfU1REX1RIUkVBRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvc3RyYW5kX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zdHJhbmRfc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTY2ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC9zdHJhbmRfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8KLS8vIGRldGFpbC9zdHJhbmRfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfU1RSQU5EX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1NUUkFORF9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbXV0ZXguaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL29wX3F1ZXVlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Njb3BlZF9wdHIuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLS8vIERlZmF1bHQgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBzdHJhbmQuCi1jbGFzcyBzdHJhbmRfc2VydmljZQotICA6IHB1YmxpYyBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxzdHJhbmRfc2VydmljZT4KLXsKLXByaXZhdGU6Ci0gIC8vIEhlbHBlciBjbGFzcyB0byByZS1wb3N0IHRoZSBzdHJhbmQgb24gZXhpdC4KLSAgc3RydWN0IG9uX2RvX2NvbXBsZXRlX2V4aXQ7Ci0KLSAgLy8gSGVscGVyIGNsYXNzIHRvIHJlLXBvc3QgdGhlIHN0cmFuZCBvbiBleGl0LgotICBzdHJ1Y3Qgb25fZGlzcGF0Y2hfZXhpdDsKLQotcHVibGljOgotCi0gIC8vIFRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIGEgc3RyYW5kLgotICBjbGFzcyBzdHJhbmRfaW1wbAotICAgIDogcHVibGljIG9wZXJhdGlvbgotICB7Ci0gIHB1YmxpYzoKLSAgICBzdHJhbmRfaW1wbCgpOwotCi0gIHByaXZhdGU6Ci0gICAgLy8gT25seSB0aGlzIHNlcnZpY2Ugd2lsbCBoYXZlIGFjY2VzcyB0byB0aGUgaW50ZXJuYWwgdmFsdWVzLgotICAgIGZyaWVuZCBjbGFzcyBzdHJhbmRfc2VydmljZTsKLSAgICBmcmllbmQgc3RydWN0IG9uX2RvX2NvbXBsZXRlX2V4aXQ7Ci0gICAgZnJpZW5kIHN0cnVjdCBvbl9kaXNwYXRjaF9leGl0OwotCi0gICAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhY2Nlc3MgdG8gaW50ZXJuYWwgZGF0YS4KLSAgICBhc2lvOjpkZXRhaWw6Om11dGV4IG11dGV4XzsKLQotICAgIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJhbmQgaXMgY3VycmVudGx5ICJsb2NrZWQiIGJ5IGEgaGFuZGxlci4gVGhpcwotICAgIC8vIG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBoYW5kbGVyIHVwY2FsbCBpbiBwcm9ncmVzcywgb3IgdGhhdCB0aGUgc3RyYW5kCi0gICAgLy8gaXRzZWxmIGhhcyBiZWVuIHNjaGVkdWxlZCBpbiBvcmRlciB0byBpbnZva2Ugc29tZSBwZW5kaW5nIGhhbmRsZXJzLgotICAgIGJvb2wgbG9ja2VkXzsKLQotICAgIC8vIFRoZSBoYW5kbGVycyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSBzdHJhbmQgYnV0IHNob3VsZCBub3QgYmUgcnVuIHVudGlsCi0gICAgLy8gYWZ0ZXIgdGhlIG5leHQgdGltZSB0aGUgc3RyYW5kIGlzIHNjaGVkdWxlZC4gVGhpcyBxdWV1ZSBtdXN0IG9ubHkgYmUKLSAgICAvLyBtb2RpZmllZCB3aGlsZSB0aGUgbXV0ZXggaXMgbG9ja2VkLgotICAgIG9wX3F1ZXVlPG9wZXJhdGlvbj4gd2FpdGluZ19xdWV1ZV87Ci0KLSAgICAvLyBUaGUgaGFuZGxlcnMgdGhhdCBhcmUgcmVhZHkgdG8gYmUgcnVuLiBMb2dpY2FsbHkgc3BlYWtpbmcsIHRoZXNlIGFyZSB0aGUKLSAgICAvLyBoYW5kbGVycyB0aGF0IGhvbGQgdGhlIHN0cmFuZCdzIGxvY2suIFRoZSByZWFkeSBxdWV1ZSBpcyBvbmx5IG1vZGlmaWVkCi0gICAgLy8gZnJvbSB3aXRoaW4gdGhlIHN0cmFuZCBhbmQgc28gbWF5IGJlIGFjY2Vzc2VkIHdpdGhvdXQgbG9ja2luZyB0aGUgbXV0ZXguCi0gICAgb3BfcXVldWU8b3BlcmF0aW9uPiByZWFkeV9xdWV1ZV87Ci0gIH07Ci0KLSAgdHlwZWRlZiBzdHJhbmRfaW1wbCogaW1wbGVtZW50YXRpb25fdHlwZTsKLQotICAvLyBDb25zdHJ1Y3QgYSBuZXcgc3RyYW5kIHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgaW9fc2VydmljZS4KLSAgQVNJT19ERUNMIGV4cGxpY2l0IHN0cmFuZF9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpOwotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIEFTSU9fREVDTCB2b2lkIHNodXRkb3duX3NlcnZpY2UoKTsKLQotICAvLyBDb25zdHJ1Y3QgYSBuZXcgc3RyYW5kIGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBjb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCk7Ci0KLSAgLy8gUmVxdWVzdCB0aGUgaW9fc2VydmljZSB0byBpbnZva2UgdGhlIGdpdmVuIGhhbmRsZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGRpc3BhdGNoKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIEhhbmRsZXImIGhhbmRsZXIpOwotCi0gIC8vIFJlcXVlc3QgdGhlIGlvX3NlcnZpY2UgdG8gaW52b2tlIHRoZSBnaXZlbiBoYW5kbGVyIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIHBvc3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgSGFuZGxlciYgaGFuZGxlcik7Ci0KLSAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0cmFuZCBpcyBydW5uaW5nIGluIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgQVNJT19ERUNMIGJvb2wgcnVubmluZ19pbl90aGlzX3RocmVhZCgKLSAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0OwotCi1wcml2YXRlOgotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZGlzcGF0Y2ggYSBoYW5kbGVyLiBSZXR1cm5zIHRydWUgaWYgdGhlIGhhbmRsZXIgc2hvdWxkCi0gIC8vIGJlIGRpc3BhdGNoZWQgaW1tZWRpYXRlbHkuCi0gIEFTSU9fREVDTCBib29sIGRvX2Rpc3BhdGNoKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIG9wZXJhdGlvbiogb3ApOwotCi0gIC8vIEhlbHBlciBmaXVuY3Rpb24gdG8gcG9zdCBhIGhhbmRsZXIuCi0gIEFTSU9fREVDTCB2b2lkIGRvX3Bvc3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIG9wZXJhdGlvbiogb3AsIGJvb2wgaXNfY29udGludWF0aW9uKTsKLQotICBBU0lPX0RFQ0wgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwKLSAgICAgIG9wZXJhdGlvbiogYmFzZSwgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCk7Ci0KLSAgLy8gVGhlIGlvX3NlcnZpY2UgaW1wbGVtZW50YXRpb24gdXNlZCB0byBwb3N0IGNvbXBsZXRpb25zLgotICBpb19zZXJ2aWNlX2ltcGwmIGlvX3NlcnZpY2VfOwotCi0gIC8vIE11dGV4IHRvIHByb3RlY3QgYWNjZXNzIHRvIHRoZSBhcnJheSBvZiBpbXBsZW1lbnRhdGlvbnMuCi0gIGFzaW86OmRldGFpbDo6bXV0ZXggbXV0ZXhfOwotCi0gIC8vIE51bWJlciBvZiBpbXBsZW1lbnRhdGlvbnMgc2hhcmVkIGJldHdlZW4gYWxsIHN0cmFuZCBvYmplY3RzLgotI2lmIGRlZmluZWQoQVNJT19TVFJBTkRfSU1QTEVNRU5UQVRJT05TKQotICBlbnVtIHsgbnVtX2ltcGxlbWVudGF0aW9ucyA9IEFTSU9fU1RSQU5EX0lNUExFTUVOVEFUSU9OUyB9OwotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX1NUUkFORF9JTVBMRU1FTlRBVElPTlMpCi0gIGVudW0geyBudW1faW1wbGVtZW50YXRpb25zID0gMTkzIH07Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1NUUkFORF9JTVBMRU1FTlRBVElPTlMpCi0KLSAgLy8gUG9vbCBvZiBpbXBsZW1lbnRhdGlvbnMuCi0gIHNjb3BlZF9wdHI8c3RyYW5kX2ltcGw+IGltcGxlbWVudGF0aW9uc19bbnVtX2ltcGxlbWVudGF0aW9uc107Ci0KLSAgLy8gRXh0cmEgdmFsdWUgdXNlZCB3aGVuIGhhc2hpbmcgdG8gcHJldmVudCByZWN5Y2xlZCBtZW1vcnkgbG9jYXRpb25zIGZyb20KLSAgLy8gZ2V0dGluZyB0aGUgc2FtZSBzdHJhbmQgaW1wbGVtZW50YXRpb24uCi0gIHN0ZDo6c2l6ZV90IHNhbHRfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3N0cmFuZF9zZXJ2aWNlLmhwcCIKLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvc3RyYW5kX3NlcnZpY2UuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1NUUkFORF9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90YXNrX2lvX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90YXNrX2lvX3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGQ1OTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGFza19pb19zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3Rhc2tfaW9fc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1RBU0tfSU9fU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfVEFTS19JT19TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2luY2x1ZGUgImFzaW8vZXJyb3JfY29kZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hdG9taWNfY291bnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NhbGxfc3RhY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2V2ZW50LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9tdXRleC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BfcXVldWUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3JfZndkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90YXNrX2lvX3NlcnZpY2Vfb3BlcmF0aW9uLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1zdHJ1Y3QgdGFza19pb19zZXJ2aWNlX3RocmVhZF9pbmZvOwotCi1jbGFzcyB0YXNrX2lvX3NlcnZpY2UKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8dGFza19pb19zZXJ2aWNlPgotewotcHVibGljOgotICB0eXBlZGVmIHRhc2tfaW9fc2VydmljZV9vcGVyYXRpb24gb3BlcmF0aW9uOwotCi0gIC8vIENvbnN0cnVjdG9yLiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHRocmVhZHMgdGhhdCBhcmUgbGlrZWx5IHRvCi0gIC8vIHJ1biB0aGUgaW9fc2VydmljZS4gSWYgc2V0IHRvIDEgY2VydGFpbiBvcHRpbWlzYXRpb24gYXJlIHBlcmZvcm1lZC4KLSAgQVNJT19ERUNMIHRhc2tfaW9fc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgc3RkOjpzaXplX3QgY29uY3VycmVuY3lfaGludCA9IDApOwotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIEFTSU9fREVDTCB2b2lkIHNodXRkb3duX3NlcnZpY2UoKTsKLQotICAvLyBJbml0aWFsaXNlIHRoZSB0YXNrLCBpZiByZXF1aXJlZC4KLSAgQVNJT19ERUNMIHZvaWQgaW5pdF90YXNrKCk7Ci0KLSAgLy8gUnVuIHRoZSBldmVudCBsb29wIHVudGlsIGludGVycnVwdGVkIG9yIG5vIG1vcmUgd29yay4KLSAgQVNJT19ERUNMIHN0ZDo6c2l6ZV90IHJ1bihhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gUnVuIHVudGlsIGludGVycnVwdGVkIG9yIG9uZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgotICBBU0lPX0RFQ0wgc3RkOjpzaXplX3QgcnVuX29uZShhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gUG9sbCBmb3Igb3BlcmF0aW9ucyB3aXRob3V0IGJsb2NraW5nLgotICBBU0lPX0RFQ0wgc3RkOjpzaXplX3QgcG9sbChhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gUG9sbCBmb3Igb25lIG9wZXJhdGlvbiB3aXRob3V0IGJsb2NraW5nLgotICBBU0lPX0RFQ0wgc3RkOjpzaXplX3QgcG9sbF9vbmUoYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIEludGVycnVwdCB0aGUgZXZlbnQgcHJvY2Vzc2luZyBsb29wLgotICBBU0lPX0RFQ0wgdm9pZCBzdG9wKCk7Ci0KLSAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGlvX3NlcnZpY2UgaXMgc3RvcHBlZC4KLSAgQVNJT19ERUNMIGJvb2wgc3RvcHBlZCgpIGNvbnN0OwotCi0gIC8vIFJlc2V0IGluIHByZXBhcmF0aW9uIGZvciBhIHN1YnNlcXVlbnQgcnVuIGludm9jYXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIHJlc2V0KCk7Ci0KLSAgLy8gTm90aWZ5IHRoYXQgc29tZSB3b3JrIGhhcyBzdGFydGVkLgotICB2b2lkIHdvcmtfc3RhcnRlZCgpCi0gIHsKLSAgICArK291dHN0YW5kaW5nX3dvcmtfOwotICB9Ci0KLSAgLy8gTm90aWZ5IHRoYXQgc29tZSB3b3JrIGhhcyBmaW5pc2hlZC4KLSAgdm9pZCB3b3JrX2ZpbmlzaGVkKCkKLSAgewotICAgIGlmICgtLW91dHN0YW5kaW5nX3dvcmtfID09IDApCi0gICAgICBzdG9wKCk7Ci0gIH0KLQotICAvLyBSZXR1cm4gd2hldGhlciBhIGhhbmRsZXIgY2FuIGJlIGRpc3BhdGNoZWQgaW1tZWRpYXRlbHkuCi0gIGJvb2wgY2FuX2Rpc3BhdGNoKCkKLSAgewotICAgIHJldHVybiB0aHJlYWRfY2FsbF9zdGFjazo6Y29udGFpbnModGhpcykgIT0gMDsKLSAgfQotCi0gIC8vIFJlcXVlc3QgaW52b2NhdGlvbiBvZiB0aGUgZ2l2ZW4gaGFuZGxlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgZGlzcGF0Y2goSGFuZGxlciYgaGFuZGxlcik7Ci0KLSAgLy8gUmVxdWVzdCBpbnZvY2F0aW9uIG9mIHRoZSBnaXZlbiBoYW5kbGVyIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIHBvc3QoSGFuZGxlciYgaGFuZGxlcik7Ci0KLSAgLy8gUmVxdWVzdCBpbnZvY2F0aW9uIG9mIHRoZSBnaXZlbiBvcGVyYXRpb24gYW5kIHJldHVybiBpbW1lZGlhdGVseS4gQXNzdW1lcwotICAvLyB0aGF0IHdvcmtfc3RhcnRlZCgpIGhhcyBub3QgeWV0IGJlZW4gY2FsbGVkIGZvciB0aGUgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBwb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKAotICAgICAgb3BlcmF0aW9uKiBvcCwgYm9vbCBpc19jb250aW51YXRpb24pOwotCi0gIC8vIFJlcXVlc3QgaW52b2NhdGlvbiBvZiB0aGUgZ2l2ZW4gb3BlcmF0aW9uIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuIEFzc3VtZXMKLSAgLy8gdGhhdCB3b3JrX3N0YXJ0ZWQoKSB3YXMgcHJldmlvdXNseSBjYWxsZWQgZm9yIHRoZSBvcGVyYXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIHBvc3RfZGVmZXJyZWRfY29tcGxldGlvbihvcGVyYXRpb24qIG9wKTsKLQotICAvLyBSZXF1ZXN0IGludm9jYXRpb24gb2YgdGhlIGdpdmVuIG9wZXJhdGlvbnMgYW5kIHJldHVybiBpbW1lZGlhdGVseS4gQXNzdW1lcwotICAvLyB0aGF0IHdvcmtfc3RhcnRlZCgpIHdhcyBwcmV2aW91c2x5IGNhbGxlZCBmb3IgZWFjaCBvcGVyYXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIHBvc3RfZGVmZXJyZWRfY29tcGxldGlvbnMob3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzKTsKLQotICAvLyBQcm9jZXNzIHVuZmluaXNoZWQgb3BlcmF0aW9ucyBhcyBwYXJ0IG9mIGEgc2h1dGRvd25fc2VydmljZSBvcGVyYXRpb24uCi0gIC8vIEFzc3VtZXMgdGhhdCB3b3JrX3N0YXJ0ZWQoKSB3YXMgcHJldmlvdXNseSBjYWxsZWQgZm9yIHRoZSBvcGVyYXRpb25zLgotICBBU0lPX0RFQ0wgdm9pZCBhYmFuZG9uX29wZXJhdGlvbnMob3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzKTsKLQotcHJpdmF0ZToKLSAgLy8gU3RydWN0dXJlIGNvbnRhaW5pbmcgdGhyZWFkLXNwZWNpZmljIGRhdGEuCi0gIHR5cGVkZWYgdGFza19pb19zZXJ2aWNlX3RocmVhZF9pbmZvIHRocmVhZF9pbmZvOwotCi0gIC8vIEVucXVldWUgdGhlIGdpdmVuIG9wZXJhdGlvbiBmb2xsb3dpbmcgYSBmYWlsZWQgYXR0ZW1wdCB0byBkaXNwYXRjaCB0aGUKLSAgLy8gb3BlcmF0aW9uIGZvciBpbW1lZGlhdGUgaW52b2NhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgZG9fZGlzcGF0Y2gob3BlcmF0aW9uKiBvcCk7Ci0KLSAgLy8gUnVuIGF0IG1vc3Qgb25lIG9wZXJhdGlvbi4gTWF5IGJsb2NrLgotICBBU0lPX0RFQ0wgc3RkOjpzaXplX3QgZG9fcnVuX29uZShtdXRleDo6c2NvcGVkX2xvY2smIGxvY2ssCi0gICAgICB0aHJlYWRfaW5mbyYgdGhpc190aHJlYWQsIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBQb2xsIGZvciBhdCBtb3N0IG9uZSBvcGVyYXRpb24uCi0gIEFTSU9fREVDTCBzdGQ6OnNpemVfdCBkb19wb2xsX29uZShtdXRleDo6c2NvcGVkX2xvY2smIGxvY2ssCi0gICAgICB0aHJlYWRfaW5mbyYgdGhpc190aHJlYWQsIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBTdG9wIHRoZSB0YXNrIGFuZCBhbGwgaWRsZSB0aHJlYWRzLgotICBBU0lPX0RFQ0wgdm9pZCBzdG9wX2FsbF90aHJlYWRzKG11dGV4OjpzY29wZWRfbG9jayYgbG9jayk7Ci0KLSAgLy8gV2FrZSBhIHNpbmdsZSBpZGxlIHRocmVhZCwgb3IgdGhlIHRhc2ssIGFuZCBhbHdheXMgdW5sb2NrIHRoZSBtdXRleC4KLSAgQVNJT19ERUNMIHZvaWQgd2FrZV9vbmVfdGhyZWFkX2FuZF91bmxvY2soCi0gICAgICBtdXRleDo6c2NvcGVkX2xvY2smIGxvY2spOwotCi0gIC8vIEhlbHBlciBjbGFzcyB0byBwZXJmb3JtIHRhc2stcmVsYXRlZCBvcGVyYXRpb25zIG9uIGJsb2NrIGV4aXQuCi0gIHN0cnVjdCB0YXNrX2NsZWFudXA7Ci0gIGZyaWVuZCBzdHJ1Y3QgdGFza19jbGVhbnVwOwotCi0gIC8vIEhlbHBlciBjbGFzcyB0byBjYWxsIHdvcmstcmVsYXRlZCBvcGVyYXRpb25zIG9uIGJsb2NrIGV4aXQuCi0gIHN0cnVjdCB3b3JrX2NsZWFudXA7Ci0gIGZyaWVuZCBzdHJ1Y3Qgd29ya19jbGVhbnVwOwotCi0gIC8vIFdoZXRoZXIgdG8gb3B0aW1pc2UgZm9yIHNpbmdsZS10aHJlYWRlZCB1c2UgY2FzZXMuCi0gIGNvbnN0IGJvb2wgb25lX3RocmVhZF87Ci0KLSAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhY2Nlc3MgdG8gaW50ZXJuYWwgZGF0YS4KLSAgbXV0YWJsZSBtdXRleCBtdXRleF87Ci0KLSAgLy8gRXZlbnQgdG8gd2FrZSB1cCBibG9ja2VkIHRocmVhZHMuCi0gIGV2ZW50IHdha2V1cF9ldmVudF87Ci0KLSAgLy8gVGhlIHRhc2sgdG8gYmUgcnVuIGJ5IHRoaXMgc2VydmljZS4KLSAgcmVhY3RvciogdGFza187Ci0KLSAgLy8gT3BlcmF0aW9uIG9iamVjdCB0byByZXByZXNlbnQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0YXNrIGluIHRoZSBxdWV1ZS4KLSAgc3RydWN0IHRhc2tfb3BlcmF0aW9uIDogb3BlcmF0aW9uCi0gIHsKLSAgICB0YXNrX29wZXJhdGlvbigpIDogb3BlcmF0aW9uKDApIHt9Ci0gIH0gdGFza19vcGVyYXRpb25fOwotCi0gIC8vIFdoZXRoZXIgdGhlIHRhc2sgaGFzIGJlZW4gaW50ZXJydXB0ZWQuCi0gIGJvb2wgdGFza19pbnRlcnJ1cHRlZF87Ci0KLSAgLy8gVGhlIGNvdW50IG9mIHVuZmluaXNoZWQgd29yay4KLSAgYXRvbWljX2NvdW50IG91dHN0YW5kaW5nX3dvcmtfOwotCi0gIC8vIFRoZSBxdWV1ZSBvZiBoYW5kbGVycyB0aGF0IGFyZSByZWFkeSB0byBiZSBkZWxpdmVyZWQuCi0gIG9wX3F1ZXVlPG9wZXJhdGlvbj4gb3BfcXVldWVfOwotCi0gIC8vIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGlzcGF0Y2hlciBoYXMgYmVlbiBzdG9wcGVkLgotICBib29sIHN0b3BwZWRfOwotCi0gIC8vIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGlzcGF0Y2hlciBoYXMgYmVlbiBzaHV0IGRvd24uCi0gIGJvb2wgc2h1dGRvd25fOwotCi0gIC8vIFBlci10aHJlYWQgY2FsbCBzdGFjayB0byB0cmFjayB0aGUgc3RhdGUgb2YgZWFjaCB0aHJlYWQgaW4gdGhlIGlvX3NlcnZpY2UuCi0gIHR5cGVkZWYgY2FsbF9zdGFjazx0YXNrX2lvX3NlcnZpY2UsIHRocmVhZF9pbmZvPiB0aHJlYWRfY2FsbF9zdGFjazsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC90YXNrX2lvX3NlcnZpY2UuaHBwIgotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC90YXNrX2lvX3NlcnZpY2UuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9UQVNLX0lPX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Rhc2tfaW9fc2VydmljZV9vcGVyYXRpb24uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90YXNrX2lvX3NlcnZpY2Vfb3BlcmF0aW9uLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiNzg2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Rhc2tfaW9fc2VydmljZV9vcGVyYXRpb24uaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC90YXNrX2lvX3NlcnZpY2Vfb3BlcmF0aW9uLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1RBU0tfSU9fU0VSVklDRV9PUEVSQVRJT05fSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1RBU0tfSU9fU0VSVklDRV9PUEVSQVRJT05fSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZXJyb3JfY29kZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90cmFja2luZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BfcXVldWUuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHRhc2tfaW9fc2VydmljZTsKLQotLy8gQmFzZSBjbGFzcyBmb3IgYWxsIG9wZXJhdGlvbnMuIEEgZnVuY3Rpb24gcG9pbnRlciBpcyB1c2VkIGluc3RlYWQgb2YgdmlydHVhbAotLy8gZnVuY3Rpb25zIHRvIGF2b2lkIHRoZSBhc3NvY2lhdGVkIG92ZXJoZWFkLgotY2xhc3MgdGFza19pb19zZXJ2aWNlX29wZXJhdGlvbiBBU0lPX0lOSEVSSVRfVFJBQ0tFRF9IQU5ETEVSCi17Ci1wdWJsaWM6Ci0gIHZvaWQgY29tcGxldGUodGFza19pb19zZXJ2aWNlJiBvd25lciwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLCBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCkKLSAgewotICAgIGZ1bmNfKCZvd25lciwgdGhpcywgZWMsIGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgfQotCi0gIHZvaWQgZGVzdHJveSgpCi0gIHsKLSAgICBmdW5jXygwLCB0aGlzLCBhc2lvOjplcnJvcl9jb2RlKCksIDApOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgdHlwZWRlZiB2b2lkICgqZnVuY190eXBlKSh0YXNrX2lvX3NlcnZpY2UqLAotICAgICAgdGFza19pb19zZXJ2aWNlX29wZXJhdGlvbiosCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiwgc3RkOjpzaXplX3QpOwotCi0gIHRhc2tfaW9fc2VydmljZV9vcGVyYXRpb24oZnVuY190eXBlIGZ1bmMpCi0gICAgOiBuZXh0XygwKSwKLSAgICAgIGZ1bmNfKGZ1bmMpLAotICAgICAgdGFza19yZXN1bHRfKDApCi0gIHsKLSAgfQotCi0gIC8vIFByZXZlbnRzIGRlbGV0aW9uIHRocm91Z2ggdGhpcyB0eXBlLgotICB+dGFza19pb19zZXJ2aWNlX29wZXJhdGlvbigpCi0gIHsKLSAgfQotCi1wcml2YXRlOgotICBmcmllbmQgY2xhc3Mgb3BfcXVldWVfYWNjZXNzOwotICB0YXNrX2lvX3NlcnZpY2Vfb3BlcmF0aW9uKiBuZXh0XzsKLSAgZnVuY190eXBlIGZ1bmNfOwotcHJvdGVjdGVkOgotICBmcmllbmQgY2xhc3MgdGFza19pb19zZXJ2aWNlOwotICB1bnNpZ25lZCBpbnQgdGFza19yZXN1bHRfOyAvLyBQYXNzZWQgaW50byBieXRlcyB0cmFuc2ZlcnJlZC4KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfVEFTS19JT19TRVJWSUNFX09QRVJBVElPTl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGFza19pb19zZXJ2aWNlX3RocmVhZF9pbmZvLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGFza19pb19zZXJ2aWNlX3RocmVhZF9pbmZvLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiNWNmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Rhc2tfaW9fc2VydmljZV90aHJlYWRfaW5mby5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3Rhc2tfaW9fc2VydmljZV90aHJlYWRfaW5mby5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1RBU0tfSU9fU0VSVklDRV9USFJFQURfSU5GT19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfVEFTS19JT19TRVJWSUNFX1RIUkVBRF9JTkZPX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcF9xdWV1ZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyZWFkX2luZm9fYmFzZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3MgdGFza19pb19zZXJ2aWNlOwotY2xhc3MgdGFza19pb19zZXJ2aWNlX29wZXJhdGlvbjsKLQotc3RydWN0IHRhc2tfaW9fc2VydmljZV90aHJlYWRfaW5mbyA6IHB1YmxpYyB0aHJlYWRfaW5mb19iYXNlCi17Ci0gIG9wX3F1ZXVlPHRhc2tfaW9fc2VydmljZV9vcGVyYXRpb24+IHByaXZhdGVfb3BfcXVldWU7Ci0gIGxvbmcgcHJpdmF0ZV9vdXRzdGFuZGluZ193b3JrOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9UQVNLX0lPX1NFUlZJQ0VfVEhSRUFEX0lORk9fSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3RocmVhZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3RocmVhZC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OTJhNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aHJlYWQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC90aHJlYWQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9USFJFQURfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1RIUkVBRF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL251bGxfdGhyZWFkLmhwcCIKLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotIyBpZiBkZWZpbmVkKFVOREVSX0NFKQotIyAgaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luY2VfdGhyZWFkLmhwcCIKLSMgZWxzZQotIyAgaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX3RocmVhZC5ocHAiCi0jIGVuZGlmCi0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9wb3NpeF90aHJlYWQuaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19TVERfVEhSRUFEKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9zdGRfdGhyZWFkLmhwcCIKLSNlbHNlCi0jIGVycm9yIE9ubHkgV2luZG93cywgUE9TSVggYW5kIHN0ZDo6dGhyZWFkIGFyZSBzdXBwb3J0ZWQhCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotdHlwZWRlZiBudWxsX3RocmVhZCB0aHJlYWQ7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSMgaWYgZGVmaW5lZChVTkRFUl9DRSkKLXR5cGVkZWYgd2luY2VfdGhyZWFkIHRocmVhZDsKLSMgZWxzZQotdHlwZWRlZiB3aW5fdGhyZWFkIHRocmVhZDsKLSMgZW5kaWYKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfUFRIUkVBRFMpCi10eXBlZGVmIHBvc2l4X3RocmVhZCB0aHJlYWQ7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9USFJFQUQpCi10eXBlZGVmIHN0ZF90aHJlYWQgdGhyZWFkOwotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfVEhSRUFEX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aHJlYWRfaW5mb19iYXNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGhyZWFkX2luZm9fYmFzZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNTI0NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aHJlYWRfaW5mb19iYXNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvdGhyZWFkX2luZm9fYmFzZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9USFJFQURfSU5GT19CQVNFX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9USFJFQURfSU5GT19CQVNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHRocmVhZF9pbmZvX2Jhc2UKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIHRocmVhZF9pbmZvX2Jhc2UoKQotICAgIDogcmV1c2FibGVfbWVtb3J5XygwKQotICB7Ci0gIH0KLQotICB+dGhyZWFkX2luZm9fYmFzZSgpCi0gIHsKLSAgICBpZiAocmV1c2FibGVfbWVtb3J5XykKLSAgICAgIDo6b3BlcmF0b3IgZGVsZXRlKHJldXNhYmxlX21lbW9yeV8pOwotICB9Ci0KLSAgc3RhdGljIHZvaWQqIGFsbG9jYXRlKHRocmVhZF9pbmZvX2Jhc2UqIHRoaXNfdGhyZWFkLCBzdGQ6OnNpemVfdCBzaXplKQotICB7Ci0gICAgaWYgKHRoaXNfdGhyZWFkICYmIHRoaXNfdGhyZWFkLT5yZXVzYWJsZV9tZW1vcnlfKQotICAgIHsKLSAgICAgIHZvaWQqIGNvbnN0IHBvaW50ZXIgPSB0aGlzX3RocmVhZC0+cmV1c2FibGVfbWVtb3J5XzsKLSAgICAgIHRoaXNfdGhyZWFkLT5yZXVzYWJsZV9tZW1vcnlfID0gMDsKLQotICAgICAgdW5zaWduZWQgY2hhciogY29uc3QgbWVtID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KHBvaW50ZXIpOwotICAgICAgaWYgKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihtZW1bMF0pID49IHNpemUpCi0gICAgICB7Ci0gICAgICAgIG1lbVtzaXplXSA9IG1lbVswXTsKLSAgICAgICAgcmV0dXJuIHBvaW50ZXI7Ci0gICAgICB9Ci0KLSAgICAgIDo6b3BlcmF0b3IgZGVsZXRlKHBvaW50ZXIpOwotICAgIH0KLQotICAgIHZvaWQqIGNvbnN0IHBvaW50ZXIgPSA6Om9wZXJhdG9yIG5ldyhzaXplICsgMSk7Ci0gICAgdW5zaWduZWQgY2hhciogY29uc3QgbWVtID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KHBvaW50ZXIpOwotICAgIG1lbVtzaXplXSA9IChzaXplIDw9IFVDSEFSX01BWCkgPyBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihzaXplKSA6IDA7Ci0gICAgcmV0dXJuIHBvaW50ZXI7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBkZWFsbG9jYXRlKHRocmVhZF9pbmZvX2Jhc2UqIHRoaXNfdGhyZWFkLAotICAgICAgdm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSkKLSAgewotICAgIGlmIChzaXplIDw9IFVDSEFSX01BWCkKLSAgICB7Ci0gICAgICBpZiAodGhpc190aHJlYWQgJiYgdGhpc190aHJlYWQtPnJldXNhYmxlX21lbW9yeV8gPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciogY29uc3QgbWVtID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KHBvaW50ZXIpOwotICAgICAgICBtZW1bMF0gPSBtZW1bc2l6ZV07Ci0gICAgICAgIHRoaXNfdGhyZWFkLT5yZXVzYWJsZV9tZW1vcnlfID0gcG9pbnRlcjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIDo6b3BlcmF0b3IgZGVsZXRlKHBvaW50ZXIpOwotICB9Ci0KLXByaXZhdGU6Ci0gIHZvaWQqIHJldXNhYmxlX21lbW9yeV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1RIUkVBRF9JTkZPX0JBU0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZmNjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8KLS8vIGRldGFpbC90aHJvd19lcnJvci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfVEhST1dfRVJST1JfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1RIUk9XX0VSUk9SX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3JfY29kZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotQVNJT19ERUNMIHZvaWQgZG9fdGhyb3dfZXJyb3IoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyKTsKLQotQVNJT19ERUNMIHZvaWQgZG9fdGhyb3dfZXJyb3IoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyLAotICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uKTsKLQotaW5saW5lIHZvaWQgdGhyb3dfZXJyb3IoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyKQotewotICBpZiAoZXJyKQotICAgIGRvX3Rocm93X2Vycm9yKGVycik7Ci19Ci0KLWlubGluZSB2b2lkIHRocm93X2Vycm9yKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVyciwKLSAgICBjb25zdCBjaGFyKiBsb2NhdGlvbikKLXsKLSAgaWYgKGVycikKLSAgICBkb190aHJvd19lcnJvcihlcnIsIGxvY2F0aW9uKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvdGhyb3dfZXJyb3IuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1RIUk9XX0VSUk9SX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aHJvd19leGNlcHRpb24uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aHJvd19leGNlcHRpb24uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2VjMzE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGhyb3dfZXhjZXB0aW9uLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvdGhyb3dfZXhjZXB0aW9uLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfVEhST1dfRVhDRVBUSU9OX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9USFJPV19FWENFUFRJT05fSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX1RIUk9XX0VYQ0VQVElPTikKLSMgaW5jbHVkZSA8Ym9vc3QvdGhyb3dfZXhjZXB0aW9uLmhwcD4KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fQk9PU1RfVEhST1dfRVhDRVBUSU9OKQotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfVEhST1dfRVhDRVBUSU9OKQotdXNpbmcgYm9vc3Q6OnRocm93X2V4Y2VwdGlvbjsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfVEhST1dfRVhDRVBUSU9OKQotCi0vLyBEZWNsYXJlIHRoZSB0aHJvd19leGNlcHRpb24gZnVuY3Rpb24gZm9yIGFsbCB0YXJnZXRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIEV4Y2VwdGlvbj4KLXZvaWQgdGhyb3dfZXhjZXB0aW9uKGNvbnN0IEV4Y2VwdGlvbiYgZSk7Ci0KLS8vIE9ubHkgZGVmaW5lIHRoZSB0aHJvd19leGNlcHRpb24gZnVuY3Rpb24gd2hlbiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgotLy8gT3RoZXJ3aXNlLCBpdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBhIGRlZmluaXRpb24gb2YgdGhpcwotLy8gZnVuY3Rpb24uCi0jIGlmICFkZWZpbmVkKEFTSU9fTk9fRVhDRVBUSU9OUykKLXRlbXBsYXRlIDx0eXBlbmFtZSBFeGNlcHRpb24+Ci12b2lkIHRocm93X2V4Y2VwdGlvbihjb25zdCBFeGNlcHRpb24mIGUpCi17Ci0gIHRocm93IGU7Ci19Ci0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fRVhDRVBUSU9OUykKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfVEhST1dfRVhDRVBUSU9OKQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1RIUk9XX0VYQ0VQVElPTl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGltZXJfcXVldWUuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aW1lcl9xdWV1ZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZDlmN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aW1lcl9xdWV1ZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLy8KLS8vIGRldGFpbC90aW1lcl9xdWV1ZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfVElNRVJfUVVFVUVfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1RJTUVSX1FVRVVFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NzdGRpbnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2RhdGVfdGltZV9md2QuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2xpbWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BfcXVldWUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dhaXRfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLWNsYXNzIHRpbWVyX3F1ZXVlCi0gIDogcHVibGljIHRpbWVyX3F1ZXVlX2Jhc2UKLXsKLXB1YmxpYzoKLSAgLy8gVGhlIHRpbWUgdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBUaW1lX1RyYWl0czo6dGltZV90eXBlIHRpbWVfdHlwZTsKLQotICAvLyBUaGUgZHVyYXRpb24gdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBUaW1lX1RyYWl0czo6ZHVyYXRpb25fdHlwZSBkdXJhdGlvbl90eXBlOwotCi0gIC8vIFBlci10aW1lciBkYXRhLgotICBjbGFzcyBwZXJfdGltZXJfZGF0YQotICB7Ci0gIHB1YmxpYzoKLSAgICBwZXJfdGltZXJfZGF0YSgpIDogbmV4dF8oMCksIHByZXZfKDApIHt9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgdGltZXJfcXVldWU7Ci0KLSAgICAvLyBUaGUgb3BlcmF0aW9ucyB3YWl0aW5nIG9uIHRoZSB0aW1lci4KLSAgICBvcF9xdWV1ZTx3YWl0X29wPiBvcF9xdWV1ZV87Ci0KLSAgICAvLyBUaGUgaW5kZXggb2YgdGhlIHRpbWVyIGluIHRoZSBoZWFwLgotICAgIHN0ZDo6c2l6ZV90IGhlYXBfaW5kZXhfOwotCi0gICAgLy8gUG9pbnRlcnMgdG8gYWRqYWNlbnQgdGltZXJzIGluIGEgbGlua2VkIGxpc3QuCi0gICAgcGVyX3RpbWVyX2RhdGEqIG5leHRfOwotICAgIHBlcl90aW1lcl9kYXRhKiBwcmV2XzsKLSAgfTsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgdGltZXJfcXVldWUoKQotICAgIDogdGltZXJzXygpLAotICAgICAgaGVhcF8oKQotICB7Ci0gIH0KLQotICAvLyBBZGQgYSBuZXcgdGltZXIgdG8gdGhlIHF1ZXVlLiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyB0aGUgdGltZXIgdGhhdCBpcwotICAvLyBlYXJsaWVzdCBpbiB0aGUgcXVldWUsIGluIHdoaWNoIGNhc2UgdGhlIHJlYWN0b3IncyBldmVudCBkZW11bHRpcGxleGluZwotICAvLyBmdW5jdGlvbiBjYWxsIG1heSBuZWVkIHRvIGJlIGludGVycnVwdGVkIGFuZCByZXN0YXJ0ZWQuCi0gIGJvb2wgZW5xdWV1ZV90aW1lcihjb25zdCB0aW1lX3R5cGUmIHRpbWUsIHBlcl90aW1lcl9kYXRhJiB0aW1lciwgd2FpdF9vcCogb3ApCi0gIHsKLSAgICAvLyBFbnF1ZXVlIHRoZSB0aW1lciBvYmplY3QuCi0gICAgaWYgKHRpbWVyLnByZXZfID09IDAgJiYgJnRpbWVyICE9IHRpbWVyc18pCi0gICAgewotICAgICAgaWYgKHRoaXMtPmlzX3Bvc2l0aXZlX2luZmluaXR5KHRpbWUpKQotICAgICAgewotICAgICAgICAvLyBObyBoZWFwIGVudHJ5IGlzIHJlcXVpcmVkIGZvciB0aW1lcnMgdGhhdCBuZXZlciBleHBpcmUuCi0gICAgICAgIHRpbWVyLmhlYXBfaW5kZXhfID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgpKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFB1dCB0aGUgbmV3IHRpbWVyIGF0IHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBoZWFwLiBUaGlzIGlzIGRvbmUKLSAgICAgICAgLy8gZmlyc3Qgc2luY2UgcHVzaF9iYWNrKCkgY2FuIHRocm93IGR1ZSB0byBhbGxvY2F0aW9uIGZhaWx1cmUuCi0gICAgICAgIHRpbWVyLmhlYXBfaW5kZXhfID0gaGVhcF8uc2l6ZSgpOwotICAgICAgICBoZWFwX2VudHJ5IGVudHJ5ID0geyB0aW1lLCAmdGltZXIgfTsKLSAgICAgICAgaGVhcF8ucHVzaF9iYWNrKGVudHJ5KTsKLSAgICAgICAgdXBfaGVhcChoZWFwXy5zaXplKCkgLSAxKTsKLSAgICAgIH0KLQotICAgICAgLy8gSW5zZXJ0IHRoZSBuZXcgdGltZXIgaW50byB0aGUgbGlua2VkIGxpc3Qgb2YgYWN0aXZlIHRpbWVycy4KLSAgICAgIHRpbWVyLm5leHRfID0gdGltZXJzXzsKLSAgICAgIHRpbWVyLnByZXZfID0gMDsKLSAgICAgIGlmICh0aW1lcnNfKQotICAgICAgICB0aW1lcnNfLT5wcmV2XyA9ICZ0aW1lcjsKLSAgICAgIHRpbWVyc18gPSAmdGltZXI7Ci0gICAgfQotCi0gICAgLy8gRW5xdWV1ZSB0aGUgaW5kaXZpZHVhbCB0aW1lciBvcGVyYXRpb24uCi0gICAgdGltZXIub3BfcXVldWVfLnB1c2gob3ApOwotCi0gICAgLy8gSW50ZXJydXB0IHJlYWN0b3Igb25seSBpZiBuZXdseSBhZGRlZCB0aW1lciBpcyBmaXJzdCB0byBleHBpcmUuCi0gICAgcmV0dXJuIHRpbWVyLmhlYXBfaW5kZXhfID09IDAgJiYgdGltZXIub3BfcXVldWVfLmZyb250KCkgPT0gb3A7Ci0gIH0KLQotICAvLyBXaGV0aGVyIHRoZXJlIGFyZSBubyB0aW1lcnMgaW4gdGhlIHF1ZXVlLgotICB2aXJ0dWFsIGJvb2wgZW1wdHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRpbWVyc18gPT0gMDsKLSAgfQotCi0gIC8vIEdldCB0aGUgdGltZSBmb3IgdGhlIHRpbWVyIHRoYXQgaXMgZWFybGllc3QgaW4gdGhlIHF1ZXVlLgotICB2aXJ0dWFsIGxvbmcgd2FpdF9kdXJhdGlvbl9tc2VjKGxvbmcgbWF4X2R1cmF0aW9uKSBjb25zdAotICB7Ci0gICAgaWYgKGhlYXBfLmVtcHR5KCkpCi0gICAgICByZXR1cm4gbWF4X2R1cmF0aW9uOwotCi0gICAgcmV0dXJuIHRoaXMtPnRvX21zZWMoCi0gICAgICAgIFRpbWVfVHJhaXRzOjp0b19wb3NpeF9kdXJhdGlvbigKLSAgICAgICAgICBUaW1lX1RyYWl0czo6c3VidHJhY3QoaGVhcF9bMF0udGltZV8sIFRpbWVfVHJhaXRzOjpub3coKSkpLAotICAgICAgICBtYXhfZHVyYXRpb24pOwotICB9Ci0KLSAgLy8gR2V0IHRoZSB0aW1lIGZvciB0aGUgdGltZXIgdGhhdCBpcyBlYXJsaWVzdCBpbiB0aGUgcXVldWUuCi0gIHZpcnR1YWwgbG9uZyB3YWl0X2R1cmF0aW9uX3VzZWMobG9uZyBtYXhfZHVyYXRpb24pIGNvbnN0Ci0gIHsKLSAgICBpZiAoaGVhcF8uZW1wdHkoKSkKLSAgICAgIHJldHVybiBtYXhfZHVyYXRpb247Ci0KLSAgICByZXR1cm4gdGhpcy0+dG9fdXNlYygKLSAgICAgICAgVGltZV9UcmFpdHM6OnRvX3Bvc2l4X2R1cmF0aW9uKAotICAgICAgICAgIFRpbWVfVHJhaXRzOjpzdWJ0cmFjdChoZWFwX1swXS50aW1lXywgVGltZV9UcmFpdHM6Om5vdygpKSksCi0gICAgICAgIG1heF9kdXJhdGlvbik7Ci0gIH0KLQotICAvLyBEZXF1ZXVlIGFsbCB0aW1lcnMgbm90IGxhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdGltZS4KLSAgdmlydHVhbCB2b2lkIGdldF9yZWFkeV90aW1lcnMob3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzKQotICB7Ci0gICAgaWYgKCFoZWFwXy5lbXB0eSgpKQotICAgIHsKLSAgICAgIGNvbnN0IHRpbWVfdHlwZSBub3cgPSBUaW1lX1RyYWl0czo6bm93KCk7Ci0gICAgICB3aGlsZSAoIWhlYXBfLmVtcHR5KCkgJiYgIVRpbWVfVHJhaXRzOjpsZXNzX3RoYW4obm93LCBoZWFwX1swXS50aW1lXykpCi0gICAgICB7Ci0gICAgICAgIHBlcl90aW1lcl9kYXRhKiB0aW1lciA9IGhlYXBfWzBdLnRpbWVyXzsKLSAgICAgICAgb3BzLnB1c2godGltZXItPm9wX3F1ZXVlXyk7Ci0gICAgICAgIHJlbW92ZV90aW1lcigqdGltZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIERlcXVldWUgYWxsIHRpbWVycy4KLSAgdmlydHVhbCB2b2lkIGdldF9hbGxfdGltZXJzKG9wX3F1ZXVlPG9wZXJhdGlvbj4mIG9wcykKLSAgewotICAgIHdoaWxlICh0aW1lcnNfKQotICAgIHsKLSAgICAgIHBlcl90aW1lcl9kYXRhKiB0aW1lciA9IHRpbWVyc187Ci0gICAgICB0aW1lcnNfID0gdGltZXJzXy0+bmV4dF87Ci0gICAgICBvcHMucHVzaCh0aW1lci0+b3BfcXVldWVfKTsKLSAgICAgIHRpbWVyLT5uZXh0XyA9IDA7Ci0gICAgICB0aW1lci0+cHJldl8gPSAwOwotICAgIH0KLQotICAgIGhlYXBfLmNsZWFyKCk7Ci0gIH0KLQotICAvLyBDYW5jZWwgYW5kIGRlcXVldWUgb3BlcmF0aW9ucyBmb3IgdGhlIGdpdmVuIHRpbWVyLgotICBzdGQ6OnNpemVfdCBjYW5jZWxfdGltZXIocGVyX3RpbWVyX2RhdGEmIHRpbWVyLCBvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMsCi0gICAgICBzdGQ6OnNpemVfdCBtYXhfY2FuY2VsbGVkID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgpKCkpCi0gIHsKLSAgICBzdGQ6OnNpemVfdCBudW1fY2FuY2VsbGVkID0gMDsKLSAgICBpZiAodGltZXIucHJldl8gIT0gMCB8fCAmdGltZXIgPT0gdGltZXJzXykKLSAgICB7Ci0gICAgICB3aGlsZSAod2FpdF9vcCogb3AgPSAobnVtX2NhbmNlbGxlZCAhPSBtYXhfY2FuY2VsbGVkKQotICAgICAgICAgID8gdGltZXIub3BfcXVldWVfLmZyb250KCkgOiAwKQotICAgICAgewotICAgICAgICBvcC0+ZWNfID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkOwotICAgICAgICB0aW1lci5vcF9xdWV1ZV8ucG9wKCk7Ci0gICAgICAgIG9wcy5wdXNoKG9wKTsKLSAgICAgICAgKytudW1fY2FuY2VsbGVkOwotICAgICAgfQotICAgICAgaWYgKHRpbWVyLm9wX3F1ZXVlXy5lbXB0eSgpKQotICAgICAgICByZW1vdmVfdGltZXIodGltZXIpOwotICAgIH0KLSAgICByZXR1cm4gbnVtX2NhbmNlbGxlZDsKLSAgfQotCi1wcml2YXRlOgotICAvLyBNb3ZlIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBpbmRleCB1cCB0aGUgaGVhcCB0byBpdHMgY29ycmVjdCBwb3NpdGlvbi4KLSAgdm9pZCB1cF9oZWFwKHN0ZDo6c2l6ZV90IGluZGV4KQotICB7Ci0gICAgd2hpbGUgKGluZGV4ID4gMCkKLSAgICB7Ci0gICAgICBzdGQ6OnNpemVfdCBwYXJlbnQgPSAoaW5kZXggLSAxKSAvIDI7Ci0gICAgICBpZiAoIVRpbWVfVHJhaXRzOjpsZXNzX3RoYW4oaGVhcF9baW5kZXhdLnRpbWVfLCBoZWFwX1twYXJlbnRdLnRpbWVfKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBzd2FwX2hlYXAoaW5kZXgsIHBhcmVudCk7Ci0gICAgICBpbmRleCA9IHBhcmVudDsKLSAgICB9Ci0gIH0KLQotICAvLyBNb3ZlIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBpbmRleCBkb3duIHRoZSBoZWFwIHRvIGl0cyBjb3JyZWN0IHBvc2l0aW9uLgotICB2b2lkIGRvd25faGVhcChzdGQ6OnNpemVfdCBpbmRleCkKLSAgewotICAgIHN0ZDo6c2l6ZV90IGNoaWxkID0gaW5kZXggKiAyICsgMTsKLSAgICB3aGlsZSAoY2hpbGQgPCBoZWFwXy5zaXplKCkpCi0gICAgewotICAgICAgc3RkOjpzaXplX3QgbWluX2NoaWxkID0gKGNoaWxkICsgMSA9PSBoZWFwXy5zaXplKCkKLSAgICAgICAgICB8fCBUaW1lX1RyYWl0czo6bGVzc190aGFuKAotICAgICAgICAgICAgaGVhcF9bY2hpbGRdLnRpbWVfLCBoZWFwX1tjaGlsZCArIDFdLnRpbWVfKSkKLSAgICAgICAgPyBjaGlsZCA6IGNoaWxkICsgMTsKLSAgICAgIGlmIChUaW1lX1RyYWl0czo6bGVzc190aGFuKGhlYXBfW2luZGV4XS50aW1lXywgaGVhcF9bbWluX2NoaWxkXS50aW1lXykpCi0gICAgICAgIGJyZWFrOwotICAgICAgc3dhcF9oZWFwKGluZGV4LCBtaW5fY2hpbGQpOwotICAgICAgaW5kZXggPSBtaW5fY2hpbGQ7Ci0gICAgICBjaGlsZCA9IGluZGV4ICogMiArIDE7Ci0gICAgfQotICB9Ci0KLSAgLy8gU3dhcCB0d28gZW50cmllcyBpbiB0aGUgaGVhcC4KLSAgdm9pZCBzd2FwX2hlYXAoc3RkOjpzaXplX3QgaW5kZXgxLCBzdGQ6OnNpemVfdCBpbmRleDIpCi0gIHsKLSAgICBoZWFwX2VudHJ5IHRtcCA9IGhlYXBfW2luZGV4MV07Ci0gICAgaGVhcF9baW5kZXgxXSA9IGhlYXBfW2luZGV4Ml07Ci0gICAgaGVhcF9baW5kZXgyXSA9IHRtcDsKLSAgICBoZWFwX1tpbmRleDFdLnRpbWVyXy0+aGVhcF9pbmRleF8gPSBpbmRleDE7Ci0gICAgaGVhcF9baW5kZXgyXS50aW1lcl8tPmhlYXBfaW5kZXhfID0gaW5kZXgyOwotICB9Ci0KLSAgLy8gUmVtb3ZlIGEgdGltZXIgZnJvbSB0aGUgaGVhcCBhbmQgbGlzdCBvZiB0aW1lcnMuCi0gIHZvaWQgcmVtb3ZlX3RpbWVyKHBlcl90aW1lcl9kYXRhJiB0aW1lcikKLSAgewotICAgIC8vIFJlbW92ZSB0aGUgdGltZXIgZnJvbSB0aGUgaGVhcC4KLSAgICBzdGQ6OnNpemVfdCBpbmRleCA9IHRpbWVyLmhlYXBfaW5kZXhfOwotICAgIGlmICghaGVhcF8uZW1wdHkoKSAmJiBpbmRleCA8IGhlYXBfLnNpemUoKSkKLSAgICB7Ci0gICAgICBpZiAoaW5kZXggPT0gaGVhcF8uc2l6ZSgpIC0gMSkKLSAgICAgIHsKLSAgICAgICAgaGVhcF8ucG9wX2JhY2soKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3dhcF9oZWFwKGluZGV4LCBoZWFwXy5zaXplKCkgLSAxKTsKLSAgICAgICAgaGVhcF8ucG9wX2JhY2soKTsKLSAgICAgICAgaWYgKGluZGV4ID4gMCAmJiBUaW1lX1RyYWl0czo6bGVzc190aGFuKAotICAgICAgICAgICAgICBoZWFwX1tpbmRleF0udGltZV8sIGhlYXBfWyhpbmRleCAtIDEpIC8gMl0udGltZV8pKQotICAgICAgICAgIHVwX2hlYXAoaW5kZXgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZG93bl9oZWFwKGluZGV4KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIGxpbmtlZCBsaXN0IG9mIGFjdGl2ZSB0aW1lcnMuCi0gICAgaWYgKHRpbWVyc18gPT0gJnRpbWVyKQotICAgICAgdGltZXJzXyA9IHRpbWVyLm5leHRfOwotICAgIGlmICh0aW1lci5wcmV2XykKLSAgICAgIHRpbWVyLnByZXZfLT5uZXh0XyA9IHRpbWVyLm5leHRfOwotICAgIGlmICh0aW1lci5uZXh0XykKLSAgICAgIHRpbWVyLm5leHRfLT5wcmV2Xz0gdGltZXIucHJldl87Ci0gICAgdGltZXIubmV4dF8gPSAwOwotICAgIHRpbWVyLnByZXZfID0gMDsKLSAgfQotCi0gIC8vIERldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIGFic29sdXRlIHRpbWUgaXMgcG9zaXRpdmUgaW5maW5pdHkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1R5cGU+Ci0gIHN0YXRpYyBib29sIGlzX3Bvc2l0aXZlX2luZmluaXR5KGNvbnN0IFRpbWVfVHlwZSYpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBEZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCBhYnNvbHV0ZSB0aW1lIGlzIHBvc2l0aXZlIGluZmluaXR5LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVGltZVN5c3RlbT4KLSAgc3RhdGljIGJvb2wgaXNfcG9zaXRpdmVfaW5maW5pdHkoCi0gICAgICBjb25zdCBib29zdDo6ZGF0ZV90aW1lOjpiYXNlX3RpbWU8VCwgVGltZVN5c3RlbT4mIHRpbWUpCi0gIHsKLSAgICByZXR1cm4gdGltZS5pc19wb3NfaW5maW5pdHkoKTsKLSAgfQotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGEgZHVyYXRpb24gaW50byBtaWxsaXNlY29uZHMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBEdXJhdGlvbj4KLSAgbG9uZyB0b19tc2VjKGNvbnN0IER1cmF0aW9uJiBkLCBsb25nIG1heF9kdXJhdGlvbikgY29uc3QKLSAgewotICAgIGlmIChkLnRpY2tzKCkgPD0gMCkKLSAgICAgIHJldHVybiAwOwotICAgIGludDY0X3QgbXNlYyA9IGQudG90YWxfbWlsbGlzZWNvbmRzKCk7Ci0gICAgaWYgKG1zZWMgPT0gMCkKLSAgICAgIHJldHVybiAxOwotICAgIGlmIChtc2VjID4gbWF4X2R1cmF0aW9uKQotICAgICAgcmV0dXJuIG1heF9kdXJhdGlvbjsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4obXNlYyk7Ci0gIH0KLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBhIGR1cmF0aW9uIGludG8gbWljcm9zZWNvbmRzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHVyYXRpb24+Ci0gIGxvbmcgdG9fdXNlYyhjb25zdCBEdXJhdGlvbiYgZCwgbG9uZyBtYXhfZHVyYXRpb24pIGNvbnN0Ci0gIHsKLSAgICBpZiAoZC50aWNrcygpIDw9IDApCi0gICAgICByZXR1cm4gMDsKLSAgICBpbnQ2NF90IHVzZWMgPSBkLnRvdGFsX21pY3Jvc2Vjb25kcygpOwotICAgIGlmICh1c2VjID09IDApCi0gICAgICByZXR1cm4gMTsKLSAgICBpZiAodXNlYyA+IG1heF9kdXJhdGlvbikKLSAgICAgIHJldHVybiBtYXhfZHVyYXRpb247Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KHVzZWMpOwotICB9Ci0KLSAgLy8gVGhlIGhlYWQgb2YgYSBsaW5rZWQgbGlzdCBvZiBhbGwgYWN0aXZlIHRpbWVycy4KLSAgcGVyX3RpbWVyX2RhdGEqIHRpbWVyc187Ci0KLSAgc3RydWN0IGhlYXBfZW50cnkKLSAgewotICAgIC8vIFRoZSB0aW1lIHdoZW4gdGhlIHRpbWVyIHNob3VsZCBmaXJlLgotICAgIHRpbWVfdHlwZSB0aW1lXzsKLQotICAgIC8vIFRoZSBhc3NvY2lhdGVkIHRpbWVyIHdpdGggZW5xdWV1ZWQgb3BlcmF0aW9ucy4KLSAgICBwZXJfdGltZXJfZGF0YSogdGltZXJfOwotICB9OwotCi0gIC8vIFRoZSBoZWFwIG9mIHRpbWVycywgd2l0aCB0aGUgZWFybGllc3QgdGltZXIgYXQgdGhlIGZyb250LgotICBzdGQ6OnZlY3RvcjxoZWFwX2VudHJ5PiBoZWFwXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfVElNRVJfUVVFVUVfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX2Jhc2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9iYXNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxMDFmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX2Jhc2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8KLS8vIGRldGFpbC90aW1lcl9xdWV1ZV9iYXNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1RJTUVSX1FVRVVFX0JBU0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1RJTUVSX1FVRVVFX0JBU0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL29wX3F1ZXVlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHRpbWVyX3F1ZXVlX2Jhc2UKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICB0aW1lcl9xdWV1ZV9iYXNlKCkgOiBuZXh0XygwKSB7fQotCi0gIC8vIERlc3RydWN0b3IuCi0gIHZpcnR1YWwgfnRpbWVyX3F1ZXVlX2Jhc2UoKSB7fQotCi0gIC8vIFdoZXRoZXIgdGhlcmUgYXJlIG5vIHRpbWVycyBpbiB0aGUgcXVldWUuCi0gIHZpcnR1YWwgYm9vbCBlbXB0eSgpIGNvbnN0ID0gMDsKLQotICAvLyBHZXQgdGhlIHRpbWUgdG8gd2FpdCB1bnRpbCB0aGUgbmV4dCB0aW1lci4KLSAgdmlydHVhbCBsb25nIHdhaXRfZHVyYXRpb25fbXNlYyhsb25nIG1heF9kdXJhdGlvbikgY29uc3QgPSAwOwotCi0gIC8vIEdldCB0aGUgdGltZSB0byB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWVyLgotICB2aXJ0dWFsIGxvbmcgd2FpdF9kdXJhdGlvbl91c2VjKGxvbmcgbWF4X2R1cmF0aW9uKSBjb25zdCA9IDA7Ci0KLSAgLy8gRGVxdWV1ZSBhbGwgcmVhZHkgdGltZXJzLgotICB2aXJ0dWFsIHZvaWQgZ2V0X3JlYWR5X3RpbWVycyhvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpID0gMDsKLQotICAvLyBEZXF1ZXVlIGFsbCB0aW1lcnMuCi0gIHZpcnR1YWwgdm9pZCBnZXRfYWxsX3RpbWVycyhvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpID0gMDsKLQotcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIHRpbWVyX3F1ZXVlX3NldDsKLQotICAvLyBOZXh0IHRpbWVyIHF1ZXVlIGluIHRoZSBzZXQuCi0gIHRpbWVyX3F1ZXVlX2Jhc2UqIG5leHRfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotY2xhc3MgdGltZXJfcXVldWU7Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfVElNRVJfUVVFVUVfQkFTRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGltZXJfcXVldWVfcHRpbWUuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9wdGltZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjJmZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9wdGltZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLwotLy8gZGV0YWlsL3RpbWVyX3F1ZXVlX3B0aW1lLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9USU1FUl9RVUVVRV9QVElNRV9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfVElNRVJfUVVFVUVfUFRJTUVfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vdGltZV90cmFpdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXN0cnVjdCBmb3J3YXJkaW5nX3Bvc2l4X3RpbWVfdHJhaXRzIDogdGltZV90cmFpdHM8Ym9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lPiB7fTsKLQotLy8gVGVtcGxhdGUgc3BlY2lhbGlzYXRpb24gZm9yIHRoZSBjb21tb25seSB1c2VkIGluc3RhbnRhdGlvbi4KLXRlbXBsYXRlIDw+Ci1jbGFzcyB0aW1lcl9xdWV1ZTx0aW1lX3RyYWl0czxib29zdDo6cG9zaXhfdGltZTo6cHRpbWU+ID4KLSAgOiBwdWJsaWMgdGltZXJfcXVldWVfYmFzZQotewotcHVibGljOgotICAvLyBUaGUgdGltZSB0eXBlLgotICB0eXBlZGVmIGJvb3N0Ojpwb3NpeF90aW1lOjpwdGltZSB0aW1lX3R5cGU7Ci0KLSAgLy8gVGhlIGR1cmF0aW9uIHR5cGUuCi0gIHR5cGVkZWYgYm9vc3Q6OnBvc2l4X3RpbWU6OnRpbWVfZHVyYXRpb24gZHVyYXRpb25fdHlwZTsKLQotICAvLyBQZXItdGltZXIgZGF0YS4KLSAgdHlwZWRlZiB0aW1lcl9xdWV1ZTxmb3J3YXJkaW5nX3Bvc2l4X3RpbWVfdHJhaXRzPjo6cGVyX3RpbWVyX2RhdGEKLSAgICBwZXJfdGltZXJfZGF0YTsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIHRpbWVyX3F1ZXVlKCk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIHZpcnR1YWwgfnRpbWVyX3F1ZXVlKCk7Ci0KLSAgLy8gQWRkIGEgbmV3IHRpbWVyIHRvIHRoZSBxdWV1ZS4gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHRpbWVyIHRoYXQgaXMKLSAgLy8gZWFybGllc3QgaW4gdGhlIHF1ZXVlLCBpbiB3aGljaCBjYXNlIHRoZSByZWFjdG9yJ3MgZXZlbnQgZGVtdWx0aXBsZXhpbmcKLSAgLy8gZnVuY3Rpb24gY2FsbCBtYXkgbmVlZCB0byBiZSBpbnRlcnJ1cHRlZCBhbmQgcmVzdGFydGVkLgotICBBU0lPX0RFQ0wgYm9vbCBlbnF1ZXVlX3RpbWVyKGNvbnN0IHRpbWVfdHlwZSYgdGltZSwKLSAgICAgIHBlcl90aW1lcl9kYXRhJiB0aW1lciwgd2FpdF9vcCogb3ApOwotCi0gIC8vIFdoZXRoZXIgdGhlcmUgYXJlIG5vIHRpbWVycyBpbiB0aGUgcXVldWUuCi0gIEFTSU9fREVDTCB2aXJ0dWFsIGJvb2wgZW1wdHkoKSBjb25zdDsKLQotICAvLyBHZXQgdGhlIHRpbWUgZm9yIHRoZSB0aW1lciB0aGF0IGlzIGVhcmxpZXN0IGluIHRoZSBxdWV1ZS4KLSAgQVNJT19ERUNMIHZpcnR1YWwgbG9uZyB3YWl0X2R1cmF0aW9uX21zZWMobG9uZyBtYXhfZHVyYXRpb24pIGNvbnN0OwotCi0gIC8vIEdldCB0aGUgdGltZSBmb3IgdGhlIHRpbWVyIHRoYXQgaXMgZWFybGllc3QgaW4gdGhlIHF1ZXVlLgotICBBU0lPX0RFQ0wgdmlydHVhbCBsb25nIHdhaXRfZHVyYXRpb25fdXNlYyhsb25nIG1heF9kdXJhdGlvbikgY29uc3Q7Ci0KLSAgLy8gRGVxdWV1ZSBhbGwgdGltZXJzIG5vdCBsYXRlciB0aGFuIHRoZSBjdXJyZW50IHRpbWUuCi0gIEFTSU9fREVDTCB2aXJ0dWFsIHZvaWQgZ2V0X3JlYWR5X3RpbWVycyhvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpOwotCi0gIC8vIERlcXVldWUgYWxsIHRpbWVycy4KLSAgQVNJT19ERUNMIHZpcnR1YWwgdm9pZCBnZXRfYWxsX3RpbWVycyhvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpOwotCi0gIC8vIENhbmNlbCBhbmQgZGVxdWV1ZSBvcGVyYXRpb25zIGZvciB0aGUgZ2l2ZW4gdGltZXIuCi0gIEFTSU9fREVDTCBzdGQ6OnNpemVfdCBjYW5jZWxfdGltZXIoCi0gICAgICBwZXJfdGltZXJfZGF0YSYgdGltZXIsIG9wX3F1ZXVlPG9wZXJhdGlvbj4mIG9wcywKLSAgICAgIHN0ZDo6c2l6ZV90IG1heF9jYW5jZWxsZWQgPSAoc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnNpemVfdD46Om1heCkoKSk7Ci0KLXByaXZhdGU6Ci0gIHRpbWVyX3F1ZXVlPGZvcndhcmRpbmdfcG9zaXhfdGltZV90cmFpdHM+IGltcGxfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC90aW1lcl9xdWV1ZV9wdGltZS5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfVElNRVJfUVVFVUVfUFRJTUVfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX3NldC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX3NldC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YmY2NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9zZXQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC90aW1lcl9xdWV1ZV9zZXQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9USU1FUl9RVUVVRV9TRVRfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1RJTUVSX1FVRVVFX1NFVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aW1lcl9xdWV1ZV9iYXNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyB0aW1lcl9xdWV1ZV9zZXQKLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIEFTSU9fREVDTCB0aW1lcl9xdWV1ZV9zZXQoKTsKLQotICAvLyBBZGQgYSB0aW1lciBxdWV1ZSB0byB0aGUgc2V0LgotICBBU0lPX0RFQ0wgdm9pZCBpbnNlcnQodGltZXJfcXVldWVfYmFzZSogcSk7Ci0KLSAgLy8gUmVtb3ZlIGEgdGltZXIgcXVldWUgZnJvbSB0aGUgc2V0LgotICBBU0lPX0RFQ0wgdm9pZCBlcmFzZSh0aW1lcl9xdWV1ZV9iYXNlKiBxKTsKLQotICAvLyBEZXRlcm1pbmUgd2hldGhlciBhbGwgcXVldWVzIGFyZSBlbXB0eS4KLSAgQVNJT19ERUNMIGJvb2wgYWxsX2VtcHR5KCkgY29uc3Q7Ci0KLSAgLy8gR2V0IHRoZSB3YWl0IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KLSAgQVNJT19ERUNMIGxvbmcgd2FpdF9kdXJhdGlvbl9tc2VjKGxvbmcgbWF4X2R1cmF0aW9uKSBjb25zdDsKLQotICAvLyBHZXQgdGhlIHdhaXQgZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzLgotICBBU0lPX0RFQ0wgbG9uZyB3YWl0X2R1cmF0aW9uX3VzZWMobG9uZyBtYXhfZHVyYXRpb24pIGNvbnN0OwotCi0gIC8vIERlcXVldWUgYWxsIHJlYWR5IHRpbWVycy4KLSAgQVNJT19ERUNMIHZvaWQgZ2V0X3JlYWR5X3RpbWVycyhvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpOwotCi0gIC8vIERlcXVldWUgYWxsIHRpbWVycy4KLSAgQVNJT19ERUNMIHZvaWQgZ2V0X2FsbF90aW1lcnMob3BfcXVldWU8b3BlcmF0aW9uPiYgb3BzKTsKLQotcHJpdmF0ZToKLSAgdGltZXJfcXVldWVfYmFzZSogZmlyc3RfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvdGltZXJfcXVldWVfc2V0LmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9USU1FUl9RVUVVRV9TRVRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3RpbWVyX3NjaGVkdWxlci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3RpbWVyX3NjaGVkdWxlci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjgyNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90aW1lcl9zY2hlZHVsZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8KLS8vIGRldGFpbC90aW1lcl9zY2hlZHVsZXIuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9USU1FUl9TQ0hFRFVMRVJfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1RJTUVSX1NDSEVEVUxFUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aW1lcl9zY2hlZHVsZXJfZndkLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnJ0X3RpbWVyX3NjaGVkdWxlci5ocHAiCi0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX2lvX3NlcnZpY2UuaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19FUE9MTCkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvZXBvbGxfcmVhY3Rvci5ocHAiCi0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0tRVUVVRSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwva3F1ZXVlX3JlYWN0b3IuaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19ERVZfUE9MTCkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvZGV2X3BvbGxfcmVhY3Rvci5ocHAiCi0jZWxzZQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9zZWxlY3RfcmVhY3Rvci5ocHAiCi0jZW5kaWYKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1RJTUVSX1NDSEVEVUxFUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGltZXJfc2NoZWR1bGVyX2Z3ZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3RpbWVyX3NjaGVkdWxlcl9md2QuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWIwNTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdGltZXJfc2NoZWR1bGVyX2Z3ZC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3RpbWVyX3NjaGVkdWxlcl9md2QuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfVElNRVJfU0NIRURVTEVSX0ZXRF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfVElNRVJfU0NIRURVTEVSX0ZXRF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotdHlwZWRlZiBjbGFzcyB3aW5ydF90aW1lcl9zY2hlZHVsZXIgdGltZXJfc2NoZWR1bGVyOwotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotdHlwZWRlZiBjbGFzcyB3aW5faW9jcF9pb19zZXJ2aWNlIHRpbWVyX3NjaGVkdWxlcjsKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfRVBPTEwpCi10eXBlZGVmIGNsYXNzIGVwb2xsX3JlYWN0b3IgdGltZXJfc2NoZWR1bGVyOwotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19LUVVFVUUpCi10eXBlZGVmIGNsYXNzIGtxdWV1ZV9yZWFjdG9yIHRpbWVyX3NjaGVkdWxlcjsKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfREVWX1BPTEwpCi10eXBlZGVmIGNsYXNzIGRldl9wb2xsX3JlYWN0b3IgdGltZXJfc2NoZWR1bGVyOwotI2Vsc2UKLXR5cGVkZWYgY2xhc3Mgc2VsZWN0X3JlYWN0b3IgdGltZXJfc2NoZWR1bGVyOwotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfVElNRVJfU0NIRURVTEVSX0ZXRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdHNzX3B0ci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3Rzc19wdHIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjgwZjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdHNzX3B0ci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3Rzc19wdHIuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfVFNTX1BUUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfVFNTX1BUUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL251bGxfdHNzX3B0ci5ocHAiCi0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRF9LRVlXT1JEX0VYVEVOU0lPTikKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwva2V5d29yZF90c3NfcHRyLmhwcCIKLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC93aW5fdHNzX3B0ci5ocHAiCi0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9wb3NpeF90c3NfcHRyLmhwcCIKLSNlbHNlCi0jIGVycm9yIE9ubHkgV2luZG93cyBhbmQgUE9TSVggYXJlIHN1cHBvcnRlZCEKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgdHNzX3B0cgotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1RIUkVBRFMpCi0gIDogcHVibGljIG51bGxfdHNzX3B0cjxUPgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19USFJFQURfS0VZV09SRF9FWFRFTlNJT04pCi0gIDogcHVibGljIGtleXdvcmRfdHNzX3B0cjxUPgotI2VsaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gIDogcHVibGljIHdpbl90c3NfcHRyPFQ+Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1BUSFJFQURTKQotICA6IHB1YmxpYyBwb3NpeF90c3NfcHRyPFQ+Ci0jZW5kaWYKLXsKLXB1YmxpYzoKLSAgdm9pZCBvcGVyYXRvcj0oVCogdmFsdWUpCi0gIHsKLSNpZiAhZGVmaW5lZChBU0lPX0hBU19USFJFQURTKQotICAgIG51bGxfdHNzX3B0cjxUPjo6b3BlcmF0b3I9KHZhbHVlKTsKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfVEhSRUFEX0tFWVdPUkRfRVhURU5TSU9OKQotICAgIGtleXdvcmRfdHNzX3B0cjxUPjo6b3BlcmF0b3I9KHZhbHVlKTsKLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotICAgIHdpbl90c3NfcHRyPFQ+OjpvcGVyYXRvcj0odmFsdWUpOwotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19QVEhSRUFEUykKLSAgICBwb3NpeF90c3NfcHRyPFQ+OjpvcGVyYXRvcj0odmFsdWUpOwotI2VuZGlmCi0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfVFNTX1BUUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvdHlwZV90cmFpdHMuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90eXBlX3RyYWl0cy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NjE0ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC90eXBlX3RyYWl0cy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3R5cGVfdHJhaXRzLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9UWVBFX1RSQUlUU19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfVFlQRV9UUkFJVFNfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9UWVBFX1RSQUlUUykKLSMgaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1RZUEVfVFJBSVRTKQotIyBpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9hZGRfY29uc3QuaHBwPgotIyBpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19jb25zdC5ocHA+Ci0jIGluY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX2NvbnZlcnRpYmxlLmhwcD4KLSMgaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfZnVuY3Rpb24uaHBwPgotIyBpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19zYW1lLmhwcD4KLSMgaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvcmVtb3ZlX3BvaW50ZXIuaHBwPgotIyBpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9yZW1vdmVfcmVmZXJlbmNlLmhwcD4KLSMgaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9lbmFibGVfaWYuaHBwPgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfVFlQRV9UUkFJVFMpCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU1REX1RZUEVfVFJBSVRTKQotdXNpbmcgc3RkOjphZGRfY29uc3Q7Ci11c2luZyBzdGQ6OmVuYWJsZV9pZjsKLXVzaW5nIHN0ZDo6aXNfY29uc3Q7Ci11c2luZyBzdGQ6OmlzX2NvbnZlcnRpYmxlOwotdXNpbmcgc3RkOjppc19mdW5jdGlvbjsKLXVzaW5nIHN0ZDo6aXNfc2FtZTsKLXVzaW5nIHN0ZDo6cmVtb3ZlX3BvaW50ZXI7Ci11c2luZyBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U7Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9UWVBFX1RSQUlUUykKLXVzaW5nIGJvb3N0OjphZGRfY29uc3Q7Ci10ZW1wbGF0ZSA8Ym9vbCBDb25kaXRpb24sIHR5cGVuYW1lIFR5cGUgPSB2b2lkPgotc3RydWN0IGVuYWJsZV9pZiA6IGJvb3N0OjplbmFibGVfaWZfYzxDb25kaXRpb24sIFR5cGU+IHt9OwotdXNpbmcgYm9vc3Q6OmlzX2NvbnN0OwotdXNpbmcgYm9vc3Q6OmlzX2NvbnZlcnRpYmxlOwotdXNpbmcgYm9vc3Q6OmlzX2Z1bmN0aW9uOwotdXNpbmcgYm9vc3Q6OmlzX3NhbWU7Ci11c2luZyBib29zdDo6cmVtb3ZlX3BvaW50ZXI7Ci11c2luZyBib29zdDo6cmVtb3ZlX3JlZmVyZW5jZTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9UWVBFX1RSQUlUUykKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfVFlQRV9UUkFJVFNfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3ZhcmlhZGljX3RlbXBsYXRlcy5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3ZhcmlhZGljX3RlbXBsYXRlcy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMmJhOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC92YXJpYWRpY190ZW1wbGF0ZXMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8KLS8vIGRldGFpbC92YXJpYWRpY190ZW1wbGF0ZXMuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9WQVJJQURJQ19URU1QTEFURVNfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1ZBUklBRElDX1RFTVBMQVRFU19IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fSEFTX1ZBUklBRElDX1RFTVBMQVRFUykKLQotIyBkZWZpbmUgQVNJT19WQVJJQURJQ19UUEFSQU1TKG4pIEFTSU9fVkFSSUFESUNfVFBBUkFNU18jI24KLQotIyBkZWZpbmUgQVNJT19WQVJJQURJQ19UUEFSQU1TXzEgXAotICB0eXBlbmFtZSBUMQotIyBkZWZpbmUgQVNJT19WQVJJQURJQ19UUEFSQU1TXzIgXAotICB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIKLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfVFBBUkFNU18zIFwKLSAgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMwotIyBkZWZpbmUgQVNJT19WQVJJQURJQ19UUEFSQU1TXzQgXAotICB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNAotIyBkZWZpbmUgQVNJT19WQVJJQURJQ19UUEFSQU1TXzUgXAotICB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUKLQotIyBkZWZpbmUgQVNJT19WQVJJQURJQ19UQVJHUyhuKSBBU0lPX1ZBUklBRElDX1RBUkdTXyMjbgotCi0jIGRlZmluZSBBU0lPX1ZBUklBRElDX1RBUkdTXzEgeDEKLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfVEFSR1NfMiB4MSwgeDIKLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfVEFSR1NfMyB4MSwgeDIsIHgzCi0jIGRlZmluZSBBU0lPX1ZBUklBRElDX1RBUkdTXzQgeDEsIHgyLCB4MywgeDQKLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfVEFSR1NfNSB4MSwgeDIsIHgzLCB4NCwgeDUKLQotIyBkZWZpbmUgQVNJT19WQVJJQURJQ19QQVJBTVMobikgQVNJT19WQVJJQURJQ19QQVJBTVNfIyNuCi0KLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfUEFSQU1TXzEgVDEgeDEKLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfUEFSQU1TXzIgVDEgeDEsIFQyIHgyCi0jIGRlZmluZSBBU0lPX1ZBUklBRElDX1BBUkFNU18zIFQxIHgxLCBUMiB4MiwgVDMgeDMKLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfUEFSQU1TXzQgVDEgeDEsIFQyIHgyLCBUMyB4MywgVDQgeDQKLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfUEFSQU1TXzUgVDEgeDEsIFQyIHgyLCBUMyB4MywgVDQgeDQsIFQ1IHg1Ci0KLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfQVJHUyhuKSBBU0lPX1ZBUklBRElDX0FSR1NfIyNuCi0KLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfQVJHU18xIHgxCi0jIGRlZmluZSBBU0lPX1ZBUklBRElDX0FSR1NfMiB4MSwgeDIKLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfQVJHU18zIHgxLCB4MiwgeDMKLSMgZGVmaW5lIEFTSU9fVkFSSUFESUNfQVJHU180IHgxLCB4MiwgeDMsIHg0Ci0jIGRlZmluZSBBU0lPX1ZBUklBRElDX0FSR1NfNSB4MSwgeDIsIHgzLCB4NCwgeDUKLQotIyBkZWZpbmUgQVNJT19WQVJJQURJQ19HRU5FUkFURShtKSBtKDEpIG0oMikgbSgzKSBtKDQpIG0oNSkKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fSEFTX1ZBUklBRElDX1RFTVBMQVRFUykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1ZBUklBRElDX1RFTVBMQVRFU19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2FpdF9oYW5kbGVyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2FpdF9oYW5kbGVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4YTAwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dhaXRfaGFuZGxlci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dhaXRfaGFuZGxlci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dBSVRfSEFORExFUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0FJVF9IQU5ETEVSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dhaXRfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyB3YWl0X2hhbmRsZXIgOiBwdWJsaWMgd2FpdF9vcAotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUih3YWl0X2hhbmRsZXIpOwotCi0gIHdhaXRfaGFuZGxlcihIYW5kbGVyJiBoKQotICAgIDogd2FpdF9vcCgmd2FpdF9oYW5kbGVyOjpkb19jb21wbGV0ZSksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoKSkKLSAgewotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgLyplYyovLAotICAgICAgc3RkOjpzaXplX3QgLypieXRlc190cmFuc2ZlcnJlZCovKQotICB7Ci0gICAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIGhhbmRsZXIgb2JqZWN0LgotICAgIHdhaXRfaGFuZGxlciogaChzdGF0aWNfY2FzdDx3YWl0X2hhbmRsZXIqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGgtPmhhbmRsZXJfKSwgaCwgaCB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKGgpKTsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBkZXRhaWw6OmJpbmRlcjE8SGFuZGxlciwgYXNpbzo6ZXJyb3JfY29kZT4KLSAgICAgIGhhbmRsZXIoaC0+aGFuZGxlcl8sIGgtPmVjXyk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBIYW5kbGVyIGhhbmRsZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XQUlUX0hBTkRMRVJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dhaXRfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93YWl0X29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzZDEwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dhaXRfb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93YWl0X29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dBSVRfT1BfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dBSVRfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BlcmF0aW9uLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyB3YWl0X29wCi0gIDogcHVibGljIG9wZXJhdGlvbgotewotcHVibGljOgotICAvLyBUaGUgZXJyb3IgY29kZSB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbXBsZXRpb24gaGFuZGxlci4KLSAgYXNpbzo6ZXJyb3JfY29kZSBlY187Ci0KLXByb3RlY3RlZDoKLSAgd2FpdF9vcChmdW5jX3R5cGUgZnVuYykKLSAgICA6IG9wZXJhdGlvbihmdW5jKQotICB7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0FJVF9PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2Vha19wdHIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93ZWFrX3B0ci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2YwYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93ZWFrX3B0ci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dlYWtfcHRyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XRUFLX1BUUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0VBS19QVFJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9TSEFSRURfUFRSKQotIyBpbmNsdWRlIDxtZW1vcnk+Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9TSEFSRURfUFRSKQotIyBpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfU0hBUkVEX1BUUikKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9TSEFSRURfUFRSKQotdXNpbmcgc3RkOjp3ZWFrX3B0cjsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX1NIQVJFRF9QVFIpCi11c2luZyBib29zdDo6d2Vha19wdHI7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfU0hBUkVEX1BUUikKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XRUFLX1BUUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2V2ZW50LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2V2ZW50LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxNzBiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9ldmVudC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5fZXZlbnQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5fRVZFTlRfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTl9FVkVOVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYXNzZXJ0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyB3aW5fZXZlbnQKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgd2luX2V2ZW50KCk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIH53aW5fZXZlbnQoKTsKLQotICAvLyBTaWduYWwgdGhlIGV2ZW50LiAoUmV0YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuKQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgdm9pZCBzaWduYWwoTG9jayYgbG9jaykKLSAgewotICAgIHRoaXMtPnNpZ25hbF9hbGwobG9jayk7Ci0gIH0KLQotICAvLyBTaWduYWwgYWxsIHdhaXRlcnMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb2NrPgotICB2b2lkIHNpZ25hbF9hbGwoTG9jayYgbG9jaykKLSAgewotICAgIEFTSU9fQVNTRVJUKGxvY2subG9ja2VkKCkpOwotICAgICh2b2lkKWxvY2s7Ci0gICAgc3RhdGVfIHw9IDE7Ci0gICAgOjpTZXRFdmVudChldmVudHNfWzBdKTsKLSAgfQotCi0gIC8vIFVubG9jayB0aGUgbXV0ZXggYW5kIHNpZ25hbCBvbmUgd2FpdGVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgdm9pZCB1bmxvY2tfYW5kX3NpZ25hbF9vbmUoTG9jayYgbG9jaykKLSAgewotICAgIEFTSU9fQVNTRVJUKGxvY2subG9ja2VkKCkpOwotICAgIHN0YXRlXyB8PSAxOwotICAgIGJvb2wgaGF2ZV93YWl0ZXJzID0gKHN0YXRlXyA+IDEpOwotICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgaWYgKGhhdmVfd2FpdGVycykKLSAgICAgIDo6U2V0RXZlbnQoZXZlbnRzX1sxXSk7Ci0gIH0KLQotICAvLyBJZiB0aGVyZSdzIGEgd2FpdGVyLCB1bmxvY2sgdGhlIG11dGV4IGFuZCBzaWduYWwgaXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBMb2NrPgotICBib29sIG1heWJlX3VubG9ja19hbmRfc2lnbmFsX29uZShMb2NrJiBsb2NrKQotICB7Ci0gICAgQVNJT19BU1NFUlQobG9jay5sb2NrZWQoKSk7Ci0gICAgc3RhdGVfIHw9IDE7Ci0gICAgaWYgKHN0YXRlXyA+IDEpCi0gICAgewotICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgIDo6U2V0RXZlbnQoZXZlbnRzX1sxXSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmVzZXQgdGhlIGV2ZW50LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgdm9pZCBjbGVhcihMb2NrJiBsb2NrKQotICB7Ci0gICAgQVNJT19BU1NFUlQobG9jay5sb2NrZWQoKSk7Ci0gICAgKHZvaWQpbG9jazsKLSAgICA6OlJlc2V0RXZlbnQoZXZlbnRzX1swXSk7Ci0gICAgc3RhdGVfICY9IH5zdGQ6OnNpemVfdCgxKTsKLSAgfQotCi0gIC8vIFdhaXQgZm9yIHRoZSBldmVudCB0byBiZWNvbWUgc2lnbmFsbGVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9jaz4KLSAgdm9pZCB3YWl0KExvY2smIGxvY2spCi0gIHsKLSAgICBBU0lPX0FTU0VSVChsb2NrLmxvY2tlZCgpKTsKLSAgICB3aGlsZSAoKHN0YXRlXyAmIDEpID09IDApCi0gICAgewotICAgICAgc3RhdGVfICs9IDI7Ci0gICAgICBsb2NrLnVubG9jaygpOwotICAgICAgOjpXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsIGV2ZW50c18sIGZhbHNlLCBJTkZJTklURSk7Ci0gICAgICBsb2NrLmxvY2soKTsKLSAgICAgIHN0YXRlXyAtPSAyOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBIQU5ETEUgZXZlbnRzX1syXTsKLSAgc3RkOjpzaXplX3Qgc3RhdGVfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvd2luX2V2ZW50LmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9FVkVOVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2ZkX3NldF9hZGFwdGVyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2ZkX3NldF9hZGFwdGVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwNWNlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9mZF9zZXRfYWRhcHRlci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5fZmRfc2V0X2FkYXB0ZXIuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5fRkRfU0VUX0FEQVBURVJfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTl9GRF9TRVRfQURBUFRFUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcF9xdWV1ZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLyBBZGFwdHMgdGhlIEZEX1NFVCB0eXBlIHRvIG1lZXQgdGhlIERlc2NyaXB0b3JfU2V0IGNvbmNlcHQncyByZXF1aXJlbWVudHMuCi1jbGFzcyB3aW5fZmRfc2V0X2FkYXB0ZXIgOiBub25jb3B5YWJsZQotewotcHVibGljOgotICBlbnVtIHsgZGVmYXVsdF9mZF9zZXRfc2l6ZSA9IDEwMjQgfTsKLQotICB3aW5fZmRfc2V0X2FkYXB0ZXIoKQotICAgIDogY2FwYWNpdHlfKGRlZmF1bHRfZmRfc2V0X3NpemUpLAotICAgICAgbWF4X2Rlc2NyaXB0b3JfKGludmFsaWRfc29ja2V0KQotICB7Ci0gICAgZmRfc2V0XyA9IHN0YXRpY19jYXN0PHdpbl9mZF9zZXQqPig6Om9wZXJhdG9yIG5ldygKLSAgICAgICAgICBzaXplb2Yod2luX2ZkX3NldCkgLSBzaXplb2YoU09DS0VUKQotICAgICAgICAgICsgc2l6ZW9mKFNPQ0tFVCkgKiAoY2FwYWNpdHlfKSkpOwotICAgIGZkX3NldF8tPmZkX2NvdW50ID0gMDsKLSAgfQotCi0gIH53aW5fZmRfc2V0X2FkYXB0ZXIoKQotICB7Ci0gICAgOjpvcGVyYXRvciBkZWxldGUoZmRfc2V0Xyk7Ci0gIH0KLQotICB2b2lkIHJlc2V0KCkKLSAgewotICAgIGZkX3NldF8tPmZkX2NvdW50ID0gMDsKLSAgICBtYXhfZGVzY3JpcHRvcl8gPSBpbnZhbGlkX3NvY2tldDsKLSAgfQotCi0gIGJvb2wgc2V0KHNvY2tldF90eXBlIGRlc2NyaXB0b3IpCi0gIHsKLSAgICBmb3IgKHVfaW50IGkgPSAwOyBpIDwgZmRfc2V0Xy0+ZmRfY291bnQ7ICsraSkKLSAgICAgIGlmIChmZF9zZXRfLT5mZF9hcnJheVtpXSA9PSBkZXNjcmlwdG9yKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJlc2VydmUoZmRfc2V0Xy0+ZmRfY291bnQgKyAxKTsKLSAgICBmZF9zZXRfLT5mZF9hcnJheVtmZF9zZXRfLT5mZF9jb3VudCsrXSA9IGRlc2NyaXB0b3I7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIHNldChyZWFjdG9yX29wX3F1ZXVlPHNvY2tldF90eXBlPiYgb3BlcmF0aW9ucywgb3BfcXVldWU8b3BlcmF0aW9uPiYpCi0gIHsKLSAgICByZWFjdG9yX29wX3F1ZXVlPHNvY2tldF90eXBlPjo6aXRlcmF0b3IgaSA9IG9wZXJhdGlvbnMuYmVnaW4oKTsKLSAgICB3aGlsZSAoaSAhPSBvcGVyYXRpb25zLmVuZCgpKQotICAgIHsKLSAgICAgIHJlYWN0b3Jfb3BfcXVldWU8c29ja2V0X3R5cGU+OjppdGVyYXRvciBvcF9pdGVyID0gaSsrOwotICAgICAgcmVzZXJ2ZShmZF9zZXRfLT5mZF9jb3VudCArIDEpOwotICAgICAgZmRfc2V0Xy0+ZmRfYXJyYXlbZmRfc2V0Xy0+ZmRfY291bnQrK10gPSBvcF9pdGVyLT5maXJzdDsKLSAgICB9Ci0gIH0KLQotICBib29sIGlzX3NldChzb2NrZXRfdHlwZSBkZXNjcmlwdG9yKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICEhX19XU0FGRElzU2V0KGRlc2NyaXB0b3IsCi0gICAgICAgIGNvbnN0X2Nhc3Q8ZmRfc2V0Kj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBmZF9zZXQqPihmZF9zZXRfKSkpOwotICB9Ci0KLSAgb3BlcmF0b3IgZmRfc2V0KigpCi0gIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxmZF9zZXQqPihmZF9zZXRfKTsKLSAgfQotCi0gIHNvY2tldF90eXBlIG1heF9kZXNjcmlwdG9yKCkgY29uc3QKLSAgewotICAgIHJldHVybiBtYXhfZGVzY3JpcHRvcl87Ci0gIH0KLQotICB2b2lkIHBlcmZvcm0ocmVhY3Rvcl9vcF9xdWV1ZTxzb2NrZXRfdHlwZT4mIG9wZXJhdGlvbnMsCi0gICAgICBvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpIGNvbnN0Ci0gIHsKLSAgICBmb3IgKHVfaW50IGkgPSAwOyBpIDwgZmRfc2V0Xy0+ZmRfY291bnQ7ICsraSkKLSAgICAgIG9wZXJhdGlvbnMucGVyZm9ybV9vcGVyYXRpb25zKGZkX3NldF8tPmZkX2FycmF5W2ldLCBvcHMpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIFRoaXMgc3RydWN0dXJlIGlzIGRlZmluZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBXaW5kb3dzIEFQSSBmZF9zZXQKLSAgLy8gc3RydWN0dXJlLCBidXQgd2l0aG91dCBiZWluZyBkZXBlbmRlbnQgb24gdGhlIHZhbHVlIG9mIEZEX1NFVFNJWkUuIFdlIHVzZQotICAvLyB0aGUgInN0cnVjdCBoYWNrIiB0byBhbGxvdyB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRvIGJlIHZhcmllZCBhdAotICAvLyBydW50aW1lLgotICBzdHJ1Y3Qgd2luX2ZkX3NldAotICB7Ci0gICAgdV9pbnQgZmRfY291bnQ7Ci0gICAgU09DS0VUIGZkX2FycmF5WzFdOwotICB9OwotCi0gIC8vIEluY3JlYXNlIHRoZSBmZF9zZXRfIGNhcGFjaXR5IHRvIGF0IGxlYXN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgotICB2b2lkIHJlc2VydmUodV9pbnQgbikKLSAgewotICAgIGlmIChuIDw9IGNhcGFjaXR5XykKLSAgICAgIHJldHVybjsKLQotICAgIHVfaW50IG5ld19jYXBhY2l0eSA9IGNhcGFjaXR5XyArIGNhcGFjaXR5XyAvIDI7Ci0gICAgaWYgKG5ld19jYXBhY2l0eSA8IG4pCi0gICAgICBuZXdfY2FwYWNpdHkgPSBuOwotCi0gICAgd2luX2ZkX3NldCogbmV3X2ZkX3NldCA9IHN0YXRpY19jYXN0PHdpbl9mZF9zZXQqPig6Om9wZXJhdG9yIG5ldygKLSAgICAgICAgICBzaXplb2Yod2luX2ZkX3NldCkgLSBzaXplb2YoU09DS0VUKQotICAgICAgICAgICsgc2l6ZW9mKFNPQ0tFVCkgKiAobmV3X2NhcGFjaXR5KSkpOwotCi0gICAgbmV3X2ZkX3NldC0+ZmRfY291bnQgPSBmZF9zZXRfLT5mZF9jb3VudDsKLSAgICBmb3IgKHVfaW50IGkgPSAwOyBpIDwgZmRfc2V0Xy0+ZmRfY291bnQ7ICsraSkKLSAgICAgIG5ld19mZF9zZXQtPmZkX2FycmF5W2ldID0gZmRfc2V0Xy0+ZmRfYXJyYXlbaV07Ci0KLSAgICA6Om9wZXJhdG9yIGRlbGV0ZShmZF9zZXRfKTsKLSAgICBmZF9zZXRfID0gbmV3X2ZkX3NldDsKLSAgICBjYXBhY2l0eV8gPSBuZXdfY2FwYWNpdHk7Ci0gIH0KLQotICB3aW5fZmRfc2V0KiBmZF9zZXRfOwotICB1X2ludCBjYXBhY2l0eV87Ci0gIHNvY2tldF90eXBlIG1heF9kZXNjcmlwdG9yXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9GRF9TRVRfQURBUFRFUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2ZlbmNlZF9ibG9jay5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9mZW5jZWRfYmxvY2suaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTBmMjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2ZlbmNlZF9ibG9jay5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9mZW5jZWRfYmxvY2suaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOX0ZFTkNFRF9CTE9DS19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOX0ZFTkNFRF9CTE9DS19IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgd2luX2ZlbmNlZF9ibG9jawotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgZW51bSBoYWxmX3QgeyBoYWxmIH07Ci0gIGVudW0gZnVsbF90IHsgZnVsbCB9OwotCi0gIC8vIENvbnN0cnVjdG9yIGZvciBhIGhhbGYgZmVuY2VkIGJsb2NrLgotICBleHBsaWNpdCB3aW5fZmVuY2VkX2Jsb2NrKGhhbGZfdCkKLSAgewotICB9Ci0KLSAgLy8gQ29uc3RydWN0b3IgZm9yIGEgZnVsbCBmZW5jZWQgYmxvY2suCi0gIGV4cGxpY2l0IHdpbl9mZW5jZWRfYmxvY2soZnVsbF90KQotICB7Ci0jaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0gICAgTE9ORyBiYXJyaWVyID0gMDsKLSAgICA6OkludGVybG9ja2VkRXhjaGFuZ2UoJmJhcnJpZXIsIDEpOwotI2VsaWYgZGVmaW5lZChBU0lPX01TVkMpIFwKLSAgJiYgKChBU0lPX01TVkMgPCAxNDAwKSB8fCAhZGVmaW5lZChNZW1vcnlCYXJyaWVyKSkKLSMgaWYgZGVmaW5lZChfTV9JWDg2KQotIyAgcHJhZ21hIHdhcm5pbmcocHVzaCkKLSMgIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDc5MykKLSAgICBMT05HIGJhcnJpZXI7Ci0gICAgX19hc20geyB4Y2hnIGJhcnJpZXIsIGVheCB9Ci0jICBwcmFnbWEgd2FybmluZyhwb3ApCi0jIGVuZGlmIC8vIGRlZmluZWQoX01fSVg4NikKLSNlbHNlCi0gICAgTWVtb3J5QmFycmllcigpOwotI2VuZGlmCi0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+d2luX2ZlbmNlZF9ibG9jaygpCi0gIHsKLSNpZiBkZWZpbmVkKF9fQk9STEFORENfXykKLSAgICBMT05HIGJhcnJpZXIgPSAwOwotICAgIDo6SW50ZXJsb2NrZWRFeGNoYW5nZSgmYmFycmllciwgMSk7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fTVNWQykgXAotICAmJiAoKEFTSU9fTVNWQyA8IDE0MDApIHx8ICFkZWZpbmVkKE1lbW9yeUJhcnJpZXIpKQotIyBpZiBkZWZpbmVkKF9NX0lYODYpCi0jICBwcmFnbWEgd2FybmluZyhwdXNoKQotIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0NzkzKQotICAgIExPTkcgYmFycmllcjsKLSAgICBfX2FzbSB7IHhjaGcgYmFycmllciwgZWF4IH0KLSMgIHByYWdtYSB3YXJuaW5nKHBvcCkKLSMgZW5kaWYgLy8gZGVmaW5lZChfTV9JWDg2KQotI2Vsc2UKLSAgICBNZW1vcnlCYXJyaWVyKCk7Ci0jZW5kaWYKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgJiYgIWRlZmluZWQoVU5ERVJfQ0UpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5fRkVOQ0VEX0JMT0NLX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9oYW5kbGVfcmVhZF9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX2hhbmRsZV9yZWFkX29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkOTJlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX2hhbmRsZV9yZWFkX29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9pb2NwX2hhbmRsZV9yZWFkX29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IFJlcCBJbnZhcmlhbnQgU3lzdGVtcywgSW5jLiAoaW5mb0ByZXBpbnZhcmlhbnQuY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5fSU9DUF9IQU5ETEVfUkVBRF9PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOX0lPQ1BfSEFORExFX1JFQURfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyB3aW5faW9jcF9oYW5kbGVfcmVhZF9vcCA6IHB1YmxpYyBvcGVyYXRpb24KLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIod2luX2lvY3BfaGFuZGxlX3JlYWRfb3ApOwotCi0gIHdpbl9pb2NwX2hhbmRsZV9yZWFkX29wKAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogb3BlcmF0aW9uKCZ3aW5faW9jcF9oYW5kbGVfcmVhZF9vcDo6ZG9fY29tcGxldGUpLAotICAgICAgYnVmZmVyc18oYnVmZmVycyksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgcmVzdWx0X2VjLAotICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjKHJlc3VsdF9lYyk7Ci0KLSAgICAvLyBUYWtlIG93bmVyc2hpcCBvZiB0aGUgb3BlcmF0aW9uIG9iamVjdC4KLSAgICB3aW5faW9jcF9oYW5kbGVfcmVhZF9vcCogbyhzdGF0aWNfY2FzdDx3aW5faW9jcF9oYW5kbGVfcmVhZF9vcCo+KGJhc2UpKTsKLSAgICBwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2Yoby0+aGFuZGxlcl8pLCBvLCBvIH07Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ09NUExFVElPTigobykpOwotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICAvLyBDaGVjayB3aGV0aGVyIGJ1ZmZlcnMgYXJlIHN0aWxsIHZhbGlkLgotICAgICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6bXV0YWJsZV9idWZmZXIsCi0gICAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPjo6dmFsaWRhdGUoby0+YnVmZmVyc18pOwotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0KLSAgICAvLyBNYXAgbm9uLXBvcnRhYmxlIGVycm9ycyB0byB0aGVpciBwb3J0YWJsZSBjb3VudGVycGFydHMuCi0gICAgaWYgKGVjLnZhbHVlKCkgPT0gRVJST1JfSEFORExFX0VPRikKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmVvZjsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBkZXRhaWw6OmJpbmRlcjI8SGFuZGxlciwgYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3Q+Ci0gICAgICBoYW5kbGVyKG8tPmhhbmRsZXJfLCBlYywgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIHAuaCA9IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIuaGFuZGxlcl8pOwotICAgIHAucmVzZXQoKTsKLQotICAgIC8vIE1ha2UgdGhlIHVwY2FsbCBpZiByZXF1aXJlZC4KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgZmVuY2VkX2Jsb2NrIGIoZmVuY2VkX2Jsb2NrOjpoYWxmKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKChoYW5kbGVyLmFyZzFfLCBoYW5kbGVyLmFyZzJfKSk7Ci0gICAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoYW5kbGVyLCBoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0VORDsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlIGJ1ZmZlcnNfOwotICBIYW5kbGVyIGhhbmRsZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5fSU9DUF9IQU5ETEVfUkVBRF9PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3BfaGFuZGxlX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9oYW5kbGVfc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTc0ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9oYW5kbGVfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5faW9jcF9oYW5kbGVfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vIENvcHlyaWdodCAoYykgMjAwOCBSZXAgSW52YXJpYW50IFN5c3RlbXMsIEluYy4gKGluZm9AcmVwaW52YXJpYW50LmNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOX0lPQ1BfSEFORExFX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTl9JT0NQX0hBTkRMRV9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jc3RkaW50LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL211dGV4LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX2hhbmRsZV9yZWFkX29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9oYW5kbGVfd3JpdGVfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX2lvX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHdpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBuYXRpdmUgdHlwZSBvZiBhIHN0cmVhbSBoYW5kbGUuCi0gIHR5cGVkZWYgSEFORExFIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICAvLyBUaGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiB0aGUgc3RyZWFtIGhhbmRsZS4KLSAgY2xhc3MgaW1wbGVtZW50YXRpb25fdHlwZQotICB7Ci0gIHB1YmxpYzoKLSAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgIGltcGxlbWVudGF0aW9uX3R5cGUoKQotICAgICAgOiBoYW5kbGVfKElOVkFMSURfSEFORExFX1ZBTFVFKSwKLSAgICAgICAgc2FmZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkXygwKSwKLSAgICAgICAgbmV4dF8oMCksCi0gICAgICAgIHByZXZfKDApCi0gICAgewotICAgIH0KLQotICBwcml2YXRlOgotICAgIC8vIE9ubHkgdGhpcyBzZXJ2aWNlIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlIGludGVybmFsIHZhbHVlcy4KLSAgICBmcmllbmQgY2xhc3Mgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2U7Ci0KLSAgICAvLyBUaGUgbmF0aXZlIHN0cmVhbSBoYW5kbGUgcmVwcmVzZW50YXRpb24uCi0gICAgbmF0aXZlX2hhbmRsZV90eXBlIGhhbmRsZV87Ci0KLSAgICAvLyBUaGUgSUQgb2YgdGhlIHRocmVhZCBmcm9tIHdoaWNoIGl0IGlzIHNhZmUgdG8gY2FuY2VsIGFzeW5jaHJvbm91cwotICAgIC8vIG9wZXJhdGlvbnMuIDAgbWVhbnMgbm8gYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHN0YXJ0ZWQgeWV0LgotICAgIC8vIH4wIG1lYW5zIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGhhdmUgYmVlbiBzdGFydGVkIGZyb20gbW9yZSB0aGFuIG9uZQotICAgIC8vIHRocmVhZCwgYW5kIGNhbmNlbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgaGFuZGxlLgotICAgIERXT1JEIHNhZmVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZF87Ci0KLSAgICAvLyBQb2ludGVycyB0byBhZGphY2VudCBoYW5kbGUgaW1wbGVtZW50YXRpb25zIGluIGxpbmtlZCBsaXN0LgotICAgIGltcGxlbWVudGF0aW9uX3R5cGUqIG5leHRfOwotICAgIGltcGxlbWVudGF0aW9uX3R5cGUqIHByZXZfOwotICB9OwotCi0gIEFTSU9fREVDTCB3aW5faW9jcF9oYW5kbGVfc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKTsKLQotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICBBU0lPX0RFQ0wgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCk7Ci0KLSAgLy8gQ29uc3RydWN0IGEgbmV3IGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpOwotCi0gIC8vIE1vdmUtY29uc3RydWN0IGEgbmV3IGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpOwotCi0gIC8vIE1vdmUtYXNzaWduIGZyb20gYW5vdGhlciBoYW5kbGUgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIG1vdmVfYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICB3aW5faW9jcF9oYW5kbGVfc2VydmljZSYgb3RoZXJfc2VydmljZSwKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpOwotCi0gIC8vIERlc3Ryb3kgYSBoYW5kbGUgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIGRlc3Ryb3koaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCk7Ci0KLSAgLy8gQXNzaWduIGEgbmF0aXZlIGhhbmRsZSB0byBhIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIGhhbmRsZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBoYW5kbGUgaXMgb3Blbi4KLSAgYm9vbCBpc19vcGVuKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaW1wbC5oYW5kbGVfICE9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICB9Ci0KLSAgLy8gRGVzdHJveSBhIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBHZXQgdGhlIG5hdGl2ZSBoYW5kbGUgcmVwcmVzZW50YXRpb24uCi0gIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaW1wbC5oYW5kbGVfOwotICB9Ci0KLSAgLy8gQ2FuY2VsIGFsbCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlLgotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBXcml0ZSB0aGUgZ2l2ZW4gZGF0YS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzaXplX3Qgd3JpdGVfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gd3JpdGVfc29tZV9hdChpbXBsLCAwLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgZ2l2ZW4gZGF0YSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gIC8vIHdyaXR0ZW4uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzaXplX3Qgd3JpdGVfc29tZV9hdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCB1aW50NjRfdCBvZmZzZXQsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGFzaW86OmNvbnN0X2J1ZmZlciBidWZmZXIgPQotICAgICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6Y29uc3RfYnVmZmVyLAotICAgICAgICBDb25zdEJ1ZmZlclNlcXVlbmNlPjo6Zmlyc3QoYnVmZmVycyk7Ci0KLSAgICByZXR1cm4gZG9fd3JpdGUoaW1wbCwgb2Zmc2V0LCBidWZmZXIsIGVjKTsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3cml0ZS4gVGhlIGRhdGEgYmVpbmcgd3JpdHRlbiBtdXN0IGJlIHZhbGlkIGZvciB0aGUKLSAgLy8gbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3dyaXRlX3NvbWUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgd2luX2lvY3BfaGFuZGxlX3dyaXRlX29wPENvbnN0QnVmZmVyU2VxdWVuY2UsIEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGJ1ZmZlcnMsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJoYW5kbGUiLCAmaW1wbCwgImFzeW5jX3dyaXRlX3NvbWUiKSk7Ci0KLSAgICBzdGFydF93cml0ZV9vcChpbXBsLCAwLAotICAgICAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjpjb25zdF9idWZmZXIsCi0gICAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZT46OmZpcnN0KGJ1ZmZlcnMpLCBwLnApOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd3JpdGUgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0LiBUaGUgZGF0YSBiZWluZyB3cml0dGVuCi0gIC8vIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfd3JpdGVfc29tZV9hdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCB1aW50NjRfdCBvZmZzZXQsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHdpbl9pb2NwX2hhbmRsZV93cml0ZV9vcDxDb25zdEJ1ZmZlclNlcXVlbmNlLCBIYW5kbGVyPiBvcDsKLSAgICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplb2Yob3ApLCBoYW5kbGVyKSwgMCB9OwotICAgIHAucCA9IG5ldyAocC52KSBvcChidWZmZXJzLCBoYW5kbGVyKTsKLQotICAgIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAiaGFuZGxlIiwgJmltcGwsICJhc3luY193cml0ZV9zb21lX2F0IikpOwotCi0gICAgc3RhcnRfd3JpdGVfb3AoaW1wbCwgb2Zmc2V0LAotICAgICAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjpjb25zdF9idWZmZXIsCi0gICAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZT46OmZpcnN0KGJ1ZmZlcnMpLCBwLnApOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBSZWFkIHNvbWUgZGF0YS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzaXplX3QgcmVhZF9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHJlYWRfc29tZV9hdChpbXBsLCAwLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLyBSZWFkIHNvbWUgZGF0YSBhdCBhIHNwZWNpZmllZCBvZmZzZXQuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc2l6ZV90IHJlYWRfc29tZV9hdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCB1aW50NjRfdCBvZmZzZXQsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgYXNpbzo6bXV0YWJsZV9idWZmZXIgYnVmZmVyID0KLSAgICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86Om11dGFibGVfYnVmZmVyLAotICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+OjpmaXJzdChidWZmZXJzKTsKLQotICAgIHJldHVybiBkb19yZWFkKGltcGwsIG9mZnNldCwgYnVmZmVyLCBlYyk7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVhZC4gVGhlIGJ1ZmZlciBmb3IgdGhlIGRhdGEgYmVpbmcgcmVjZWl2ZWQgbXVzdCBiZQotICAvLyB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3JlYWRfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHdpbl9pb2NwX2hhbmRsZV9yZWFkX29wPE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgSGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoYnVmZmVycywgaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgImhhbmRsZSIsICZpbXBsLCAiYXN5bmNfcmVhZF9zb21lIikpOwotCi0gICAgc3RhcnRfcmVhZF9vcChpbXBsLCAwLAotICAgICAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+OjpmaXJzdChidWZmZXJzKSwgcC5wKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlYWQgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0LiBUaGUgYnVmZmVyIGZvciB0aGUgZGF0YQotICAvLyBiZWluZyByZWNlaXZlZCBtdXN0IGJlIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cwotICAvLyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVhZF9zb21lX2F0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIHVpbnQ2NF90IG9mZnNldCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiB3aW5faW9jcF9oYW5kbGVfcmVhZF9vcDxNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGJ1ZmZlcnMsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJoYW5kbGUiLCAmaW1wbCwgImFzeW5jX3JlYWRfc29tZV9hdCIpKTsKLQotICAgIHN0YXJ0X3JlYWRfb3AoaW1wbCwgb2Zmc2V0LAotICAgICAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+OjpmaXJzdChidWZmZXJzKSwgcC5wKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIFByZXZlbnQgdGhlIHVzZSBvZiB0aGUgbnVsbF9idWZmZXJzIHR5cGUgd2l0aCB0aGlzIHNlcnZpY2UuCi0gIHNpemVfdCB3cml0ZV9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBudWxsX2J1ZmZlcnMmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLSAgc2l6ZV90IHdyaXRlX3NvbWVfYXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgdWludDY0X3Qgb2Zmc2V0LAotICAgICAgY29uc3QgbnVsbF9idWZmZXJzJiBidWZmZXJzLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3dyaXRlX3NvbWUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IG51bGxfYnVmZmVycyYgYnVmZmVycywgSGFuZGxlciYgaGFuZGxlcik7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3dyaXRlX3NvbWVfYXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgdWludDY0X3Qgb2Zmc2V0LAotICAgICAgY29uc3QgbnVsbF9idWZmZXJzJiBidWZmZXJzLCBIYW5kbGVyJiBoYW5kbGVyKTsKLSAgc2l6ZV90IHJlYWRfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgbnVsbF9idWZmZXJzJiBidWZmZXJzLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0gIHNpemVfdCByZWFkX3NvbWVfYXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgdWludDY0X3Qgb2Zmc2V0LAotICAgICAgY29uc3QgbnVsbF9idWZmZXJzJiBidWZmZXJzLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3JlYWRfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgbnVsbF9idWZmZXJzJiBidWZmZXJzLCBIYW5kbGVyJiBoYW5kbGVyKTsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVhZF9zb21lX2F0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIHVpbnQ2NF90IG9mZnNldCwKLSAgICAgIGNvbnN0IG51bGxfYnVmZmVycyYgYnVmZmVycywgSGFuZGxlciYgaGFuZGxlcik7Ci0KLSAgLy8gSGVscGVyIGNsYXNzIGZvciB3YWl0aW5nIGZvciBzeW5jaHJvbm91cyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlLgotICBjbGFzcyBvdmVybGFwcGVkX3dyYXBwZXI7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYSBzeW5jaHJvbm91cyB3cml0ZSBvcGVyYXRpb24uCi0gIEFTSU9fREVDTCBzaXplX3QgZG9fd3JpdGUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgYXNpbzo6Y29uc3RfYnVmZmVyJiBidWZmZXIsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHN0YXJ0IGEgd3JpdGUgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF93cml0ZV9vcChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBhc2lvOjpjb25zdF9idWZmZXImIGJ1ZmZlciwKLSAgICAgIG9wZXJhdGlvbiogb3ApOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBwZXJmb3JtIGEgc3luY2hyb25vdXMgd3JpdGUgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgc2l6ZV90IGRvX3JlYWQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgYXNpbzo6bXV0YWJsZV9idWZmZXImIGJ1ZmZlciwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gc3RhcnQgYSByZWFkIG9wZXJhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfcmVhZF9vcChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlciYgYnVmZmVyLAotICAgICAgb3BlcmF0aW9uKiBvcCk7Ci0KLSAgLy8gVXBkYXRlIHRoZSBJRCBvZiB0aGUgdGhyZWFkIGZyb20gd2hpY2ggY2FuY2VsbGF0aW9uIGlzIHNhZmUuCi0gIEFTSU9fREVDTCB2b2lkIHVwZGF0ZV9jYW5jZWxsYXRpb25fdGhyZWFkX2lkKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjbG9zZSBhIGhhbmRsZSB3aGVuIHRoZSBhc3NvY2lhdGVkIG9iamVjdCBpcyBiZWluZwotICAvLyBkZXN0cm95ZWQuCi0gIEFTSU9fREVDTCB2b2lkIGNsb3NlX2Zvcl9kZXN0cnVjdGlvbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKTsKLQotICAvLyBUaGUgSU9DUCBzZXJ2aWNlIHVzZWQgZm9yIHJ1bm5pbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYW5kIGRpc3BhdGNoaW5nCi0gIC8vIGhhbmRsZXJzLgotICB3aW5faW9jcF9pb19zZXJ2aWNlJiBpb2NwX3NlcnZpY2VfOwotCi0gIC8vIE11dGV4IHRvIHByb3RlY3QgYWNjZXNzIHRvIHRoZSBsaW5rZWQgbGlzdCBvZiBpbXBsZW1lbnRhdGlvbnMuCi0gIG11dGV4IG11dGV4XzsKLQotICAvLyBUaGUgaGVhZCBvZiBhIGxpbmtlZCBsaXN0IG9mIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gIGltcGxlbWVudGF0aW9uX3R5cGUqIGltcGxfbGlzdF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9oYW5kbGVfc2VydmljZS5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0lOX0lPQ1BfSEFORExFX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX2hhbmRsZV93cml0ZV9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX2hhbmRsZV93cml0ZV9vcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZWRjNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9oYW5kbGVfd3JpdGVfb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2luX2lvY3BfaGFuZGxlX3dyaXRlX29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vIENvcHlyaWdodCAoYykgMjAwOCBSZXAgSW52YXJpYW50IFN5c3RlbXMsIEluYy4gKGluZm9AcmVwaW52YXJpYW50LmNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOX0lPQ1BfSEFORExFX1dSSVRFX09QX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5fSU9DUF9IQU5ETEVfV1JJVEVfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotY2xhc3Mgd2luX2lvY3BfaGFuZGxlX3dyaXRlX29wIDogcHVibGljIG9wZXJhdGlvbgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUih3aW5faW9jcF9oYW5kbGVfd3JpdGVfb3ApOwotCi0gIHdpbl9pb2NwX2hhbmRsZV93cml0ZV9vcChjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogb3BlcmF0aW9uKCZ3aW5faW9jcF9oYW5kbGVfd3JpdGVfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIGJ1ZmZlcnNfKGJ1ZmZlcnMpLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLCBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCkKLSAgewotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBvcGVyYXRpb24gb2JqZWN0LgotICAgIHdpbl9pb2NwX2hhbmRsZV93cml0ZV9vcCogbyhzdGF0aWNfY2FzdDx3aW5faW9jcF9oYW5kbGVfd3JpdGVfb3AqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKG8tPmhhbmRsZXJfKSwgbywgbyB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORykKLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgLy8gQ2hlY2sgd2hldGhlciBidWZmZXJzIGFyZSBzdGlsbCB2YWxpZC4KLSAgICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86OmNvbnN0X2J1ZmZlciwKLSAgICAgICAgICBDb25zdEJ1ZmZlclNlcXVlbmNlPjo6dmFsaWRhdGUoby0+YnVmZmVyc18pOwotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0KLSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgaGFuZGxlciBzbyB0aGF0IHRoZSBtZW1vcnkgY2FuIGJlIGRlYWxsb2NhdGVkIGJlZm9yZQotICAgIC8vIHRoZSB1cGNhbGwgaXMgbWFkZS4gRXZlbiBpZiB3ZSdyZSBub3QgYWJvdXQgdG8gbWFrZSBhbiB1cGNhbGwsIGEKLSAgICAvLyBzdWItb2JqZWN0IG9mIHRoZSBoYW5kbGVyIG1heSBiZSB0aGUgdHJ1ZSBvd25lciBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKLSAgICAvLyB3aXRoIHRoZSBoYW5kbGVyLiBDb25zZXF1ZW50bHksIGEgbG9jYWwgY29weSBvZiB0aGUgaGFuZGxlciBpcyByZXF1aXJlZAotICAgIC8vIHRvIGVuc3VyZSB0aGF0IGFueSBvd25pbmcgc3ViLW9iamVjdCByZW1haW5zIHZhbGlkIHVudGlsIGFmdGVyIHdlIGhhdmUKLSAgICAvLyBkZWFsbG9jYXRlZCB0aGUgbWVtb3J5IGhlcmUuCi0gICAgZGV0YWlsOjpiaW5kZXIyPEhhbmRsZXIsIGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90PgotICAgICAgaGFuZGxlcihvLT5oYW5kbGVyXywgZWMsIGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICBwLmggPSBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICBwLnJlc2V0KCk7Ci0KLSAgICAvLyBNYWtlIHRoZSB1cGNhbGwgaWYgcmVxdWlyZWQuCi0gICAgaWYgKG93bmVyKQotICAgIHsKLSAgICAgIGZlbmNlZF9ibG9jayBiKGZlbmNlZF9ibG9jazo6aGFsZik7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9CRUdJTigoaGFuZGxlci5hcmcxXywgaGFuZGxlci5hcmcyXykpOwotICAgICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoaGFuZGxlciwgaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9FTkQ7Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIENvbnN0QnVmZmVyU2VxdWVuY2UgYnVmZmVyc187Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9JT0NQX0hBTkRMRV9XUklURV9PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3BfaW9fc2VydmljZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX2lvX3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZjZTA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3BfaW9fc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5faW9jcF9pb19zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTl9JT0NQX0lPX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTl9JT0NQX0lPX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NhbGxfc3RhY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2xpbWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbXV0ZXguaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL29wX3F1ZXVlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zY29wZWRfcHRyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RocmVhZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGltZXJfcXVldWVfYmFzZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGltZXJfcXVldWVfc2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93YWl0X29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9vcGVyYXRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX3RocmVhZF9pbmZvLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyB3YWl0X29wOwotCi1jbGFzcyB3aW5faW9jcF9pb19zZXJ2aWNlCi0gIDogcHVibGljIGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPHdpbl9pb2NwX2lvX3NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0KLSAgLy8gQ29uc3RydWN0b3IuIFNwZWNpZmllcyBhIGNvbmN1cnJlbmN5IGhpbnQgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCB0byB0aGUKLSAgLy8gdW5kZXJseWluZyBJL08gY29tcGxldGlvbiBwb3J0LgotICBBU0lPX0RFQ0wgd2luX2lvY3BfaW9fc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgc2l6ZV90IGNvbmN1cnJlbmN5X2hpbnQgPSAwKTsKLQotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICBBU0lPX0RFQ0wgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCk7Ci0KLSAgLy8gSW5pdGlhbGlzZSB0aGUgdGFzay4gTm90aGluZyB0byBkbyBoZXJlLgotICB2b2lkIGluaXRfdGFzaygpCi0gIHsKLSAgfQotCi0gIC8vIFJlZ2lzdGVyIGEgaGFuZGxlIHdpdGggdGhlIElPIGNvbXBsZXRpb24gcG9ydC4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgcmVnaXN0ZXJfaGFuZGxlKAotICAgICAgSEFORExFIGhhbmRsZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIFJ1biB0aGUgZXZlbnQgbG9vcCB1bnRpbCBzdG9wcGVkIG9yIG5vIG1vcmUgd29yay4KLSAgQVNJT19ERUNMIHNpemVfdCBydW4oYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIFJ1biB1bnRpbCBzdG9wcGVkIG9yIG9uZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgotICBBU0lPX0RFQ0wgc2l6ZV90IHJ1bl9vbmUoYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIFBvbGwgZm9yIG9wZXJhdGlvbnMgd2l0aG91dCBibG9ja2luZy4KLSAgQVNJT19ERUNMIHNpemVfdCBwb2xsKGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBQb2xsIGZvciBvbmUgb3BlcmF0aW9uIHdpdGhvdXQgYmxvY2tpbmcuCi0gIEFTSU9fREVDTCBzaXplX3QgcG9sbF9vbmUoYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIFN0b3AgdGhlIGV2ZW50IHByb2Nlc3NpbmcgbG9vcC4KLSAgQVNJT19ERUNMIHZvaWQgc3RvcCgpOwotCi0gIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBpb19zZXJ2aWNlIGlzIHN0b3BwZWQuCi0gIGJvb2wgc3RvcHBlZCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gOjpJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCZzdG9wcGVkXywgMCkgIT0gMDsKLSAgfQotCi0gIC8vIFJlc2V0IGluIHByZXBhcmF0aW9uIGZvciBhIHN1YnNlcXVlbnQgcnVuIGludm9jYXRpb24uCi0gIHZvaWQgcmVzZXQoKQotICB7Ci0gICAgOjpJbnRlcmxvY2tlZEV4Y2hhbmdlKCZzdG9wcGVkXywgMCk7Ci0gIH0KLQotICAvLyBOb3RpZnkgdGhhdCBzb21lIHdvcmsgaGFzIHN0YXJ0ZWQuCi0gIHZvaWQgd29ya19zdGFydGVkKCkKLSAgewotICAgIDo6SW50ZXJsb2NrZWRJbmNyZW1lbnQoJm91dHN0YW5kaW5nX3dvcmtfKTsKLSAgfQotCi0gIC8vIE5vdGlmeSB0aGF0IHNvbWUgd29yayBoYXMgZmluaXNoZWQuCi0gIHZvaWQgd29ya19maW5pc2hlZCgpCi0gIHsKLSAgICBpZiAoOjpJbnRlcmxvY2tlZERlY3JlbWVudCgmb3V0c3RhbmRpbmdfd29ya18pID09IDApCi0gICAgICBzdG9wKCk7Ci0gIH0KLQotICAvLyBSZXR1cm4gd2hldGhlciBhIGhhbmRsZXIgY2FuIGJlIGRpc3BhdGNoZWQgaW1tZWRpYXRlbHkuCi0gIGJvb2wgY2FuX2Rpc3BhdGNoKCkKLSAgewotICAgIHJldHVybiB0aHJlYWRfY2FsbF9zdGFjazo6Y29udGFpbnModGhpcykgIT0gMDsKLSAgfQotCi0gIC8vIFJlcXVlc3QgaW52b2NhdGlvbiBvZiB0aGUgZ2l2ZW4gaGFuZGxlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgZGlzcGF0Y2goSGFuZGxlciYgaGFuZGxlcik7Ci0KLSAgLy8gUmVxdWVzdCBpbnZvY2F0aW9uIG9mIHRoZSBnaXZlbiBoYW5kbGVyIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIHBvc3QoSGFuZGxlciYgaGFuZGxlcik7Ci0KLSAgLy8gUmVxdWVzdCBpbnZvY2F0aW9uIG9mIHRoZSBnaXZlbiBvcGVyYXRpb24gYW5kIHJldHVybiBpbW1lZGlhdGVseS4gQXNzdW1lcwotICAvLyB0aGF0IHdvcmtfc3RhcnRlZCgpIGhhcyBub3QgeWV0IGJlZW4gY2FsbGVkIGZvciB0aGUgb3BlcmF0aW9uLgotICB2b2lkIHBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24od2luX2lvY3Bfb3BlcmF0aW9uKiBvcCwgYm9vbCkKLSAgewotICAgIHdvcmtfc3RhcnRlZCgpOwotICAgIHBvc3RfZGVmZXJyZWRfY29tcGxldGlvbihvcCk7Ci0gIH0KLQotICAvLyBSZXF1ZXN0IGludm9jYXRpb24gb2YgdGhlIGdpdmVuIG9wZXJhdGlvbiBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LiBBc3N1bWVzCi0gIC8vIHRoYXQgd29ya19zdGFydGVkKCkgd2FzIHByZXZpb3VzbHkgY2FsbGVkIGZvciB0aGUgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBwb3N0X2RlZmVycmVkX2NvbXBsZXRpb24od2luX2lvY3Bfb3BlcmF0aW9uKiBvcCk7Ci0KLSAgLy8gUmVxdWVzdCBpbnZvY2F0aW9uIG9mIHRoZSBnaXZlbiBvcGVyYXRpb24gYW5kIHJldHVybiBpbW1lZGlhdGVseS4gQXNzdW1lcwotICAvLyB0aGF0IHdvcmtfc3RhcnRlZCgpIHdhcyBwcmV2aW91c2x5IGNhbGxlZCBmb3IgdGhlIG9wZXJhdGlvbnMuCi0gIEFTSU9fREVDTCB2b2lkIHBvc3RfZGVmZXJyZWRfY29tcGxldGlvbnMoCi0gICAgICBvcF9xdWV1ZTx3aW5faW9jcF9vcGVyYXRpb24+JiBvcHMpOwotCi0gIC8vIFJlcXVlc3QgaW52b2NhdGlvbiBvZiB0aGUgZ2l2ZW4gb3BlcmF0aW9uIHVzaW5nIHRoZSB0aHJlYWQtcHJpdmF0ZSBxdWV1ZQotICAvLyBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LiBBc3N1bWVzIHRoYXQgd29ya19zdGFydGVkKCkgaGFzIG5vdCB5ZXQgYmVlbgotICAvLyBjYWxsZWQgZm9yIHRoZSBvcGVyYXRpb24uCi0gIHZvaWQgcG9zdF9wcml2YXRlX2ltbWVkaWF0ZV9jb21wbGV0aW9uKHdpbl9pb2NwX29wZXJhdGlvbiogb3ApCi0gIHsKLSAgICBwb3N0X2ltbWVkaWF0ZV9jb21wbGV0aW9uKG9wLCBmYWxzZSk7Ci0gIH0KLQotICAvLyBSZXF1ZXN0IGludm9jYXRpb24gb2YgdGhlIGdpdmVuIG9wZXJhdGlvbiB1c2luZyB0aGUgdGhyZWFkLXByaXZhdGUgcXVldWUKLSAgLy8gYW5kIHJldHVybiBpbW1lZGlhdGVseS4gQXNzdW1lcyB0aGF0IHdvcmtfc3RhcnRlZCgpIHdhcyBwcmV2aW91c2x5IGNhbGxlZAotICAvLyBmb3IgdGhlIG9wZXJhdGlvbi4KLSAgdm9pZCBwb3N0X3ByaXZhdGVfZGVmZXJyZWRfY29tcGxldGlvbih3aW5faW9jcF9vcGVyYXRpb24qIG9wKQotICB7Ci0gICAgcG9zdF9kZWZlcnJlZF9jb21wbGV0aW9uKG9wKTsKLSAgfQotCi0gIC8vIFByb2Nlc3MgdW5maW5pc2hlZCBvcGVyYXRpb25zIGFzIHBhcnQgb2YgYSBzaHV0ZG93bl9zZXJ2aWNlIG9wZXJhdGlvbi4KLSAgLy8gQXNzdW1lcyB0aGF0IHdvcmtfc3RhcnRlZCgpIHdhcyBwcmV2aW91c2x5IGNhbGxlZCBmb3IgdGhlIG9wZXJhdGlvbnMuCi0gIEFTSU9fREVDTCB2b2lkIGFiYW5kb25fb3BlcmF0aW9ucyhvcF9xdWV1ZTxvcGVyYXRpb24+JiBvcHMpOwotCi0gIC8vIENhbGxlZCBhZnRlciBzdGFydGluZyBhbiBvdmVybGFwcGVkIEkvTyBvcGVyYXRpb24gdGhhdCBkaWQgbm90IGNvbXBsZXRlCi0gIC8vIGltbWVkaWF0ZWx5LiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBhbHJlYWR5IGNhbGxlZCB3b3JrX3N0YXJ0ZWQoKSBwcmlvciB0bwotICAvLyBzdGFydGluZyB0aGUgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBvbl9wZW5kaW5nKHdpbl9pb2NwX29wZXJhdGlvbiogb3ApOwotCi0gIC8vIENhbGxlZCBhZnRlciBzdGFydGluZyBhbiBvdmVybGFwcGVkIEkvTyBvcGVyYXRpb24gdGhhdCBjb21wbGV0ZWQKLSAgLy8gaW1tZWRpYXRlbHkuIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGFscmVhZHkgY2FsbGVkIHdvcmtfc3RhcnRlZCgpIHByaW9yIHRvCi0gIC8vIHN0YXJ0aW5nIHRoZSBvcGVyYXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIG9uX2NvbXBsZXRpb24od2luX2lvY3Bfb3BlcmF0aW9uKiBvcCwKLSAgICAgIERXT1JEIGxhc3RfZXJyb3IgPSAwLCBEV09SRCBieXRlc190cmFuc2ZlcnJlZCA9IDApOwotCi0gIC8vIENhbGxlZCBhZnRlciBzdGFydGluZyBhbiBvdmVybGFwcGVkIEkvTyBvcGVyYXRpb24gdGhhdCBjb21wbGV0ZWQKLSAgLy8gaW1tZWRpYXRlbHkuIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGFscmVhZHkgY2FsbGVkIHdvcmtfc3RhcnRlZCgpIHByaW9yIHRvCi0gIC8vIHN0YXJ0aW5nIHRoZSBvcGVyYXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIG9uX2NvbXBsZXRpb24od2luX2lvY3Bfb3BlcmF0aW9uKiBvcCwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLCBEV09SRCBieXRlc190cmFuc2ZlcnJlZCA9IDApOwotCi0gIC8vIEFkZCBhIG5ldyB0aW1lciBxdWV1ZSB0byB0aGUgc2VydmljZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotICB2b2lkIGFkZF90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHRpbWVyX3F1ZXVlKTsKLQotICAvLyBSZW1vdmUgYSB0aW1lciBxdWV1ZSBmcm9tIHRoZSBzZXJ2aWNlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci0gIHZvaWQgcmVtb3ZlX3RpbWVyX3F1ZXVlKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgdGltZXJfcXVldWUpOwotCi0gIC8vIFNjaGVkdWxlIGEgbmV3IG9wZXJhdGlvbiBpbiB0aGUgZ2l2ZW4gdGltZXIgcXVldWUgdG8gZXhwaXJlIGF0IHRoZQotICAvLyBzcGVjaWZpZWQgYWJzb2x1dGUgdGltZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotICB2b2lkIHNjaGVkdWxlX3RpbWVyKHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPiYgcXVldWUsCi0gICAgICBjb25zdCB0eXBlbmFtZSBUaW1lX1RyYWl0czo6dGltZV90eXBlJiB0aW1lLAotICAgICAgdHlwZW5hbWUgdGltZXJfcXVldWU8VGltZV9UcmFpdHM+OjpwZXJfdGltZXJfZGF0YSYgdGltZXIsIHdhaXRfb3AqIG9wKTsKLQotICAvLyBDYW5jZWwgdGhlIHRpbWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdG9rZW4uIFJldHVybnMgdGhlIG51bWJlciBvZgotICAvLyBoYW5kbGVycyB0aGF0IGhhdmUgYmVlbiBwb3N0ZWQgb3IgZGlzcGF0Y2hlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotICBzdGQ6OnNpemVfdCBjYW5jZWxfdGltZXIodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSwKLSAgICAgIHR5cGVuYW1lIHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPjo6cGVyX3RpbWVyX2RhdGEmIHRpbWVyLAotICAgICAgc3RkOjpzaXplX3QgbWF4X2NhbmNlbGxlZCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHN0ZDo6c2l6ZV90Pjo6bWF4KSgpKTsKLQotcHJpdmF0ZToKLSNpZiBkZWZpbmVkKFdJTlZFUikgJiYgKFdJTlZFUiA8IDB4MDUwMCkKLSAgdHlwZWRlZiBEV09SRCBkd29yZF9wdHJfdDsKLSAgdHlwZWRlZiBVTE9ORyB1bG9uZ19wdHJfdDsKLSNlbHNlIC8vIGRlZmluZWQoV0lOVkVSKSAmJiAoV0lOVkVSIDwgMHgwNTAwKQotICB0eXBlZGVmIERXT1JEX1BUUiBkd29yZF9wdHJfdDsKLSAgdHlwZWRlZiBVTE9OR19QVFIgdWxvbmdfcHRyX3Q7Ci0jZW5kaWYgLy8gZGVmaW5lZChXSU5WRVIpICYmIChXSU5WRVIgPCAweDA1MDApCi0KLSAgLy8gRGVxdWV1ZXMgYXQgbW9zdCBvbmUgb3BlcmF0aW9uIGZyb20gdGhlIEkvTyBjb21wbGV0aW9uIHBvcnQsIGFuZCB0aGVuCi0gIC8vIGV4ZWN1dGVzIGl0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyB0aGF0IHdlcmUgZGVxdWV1ZWQgKGkuZS4KLSAgLy8gZWl0aGVyIDAgb3IgMSkuCi0gIEFTSU9fREVDTCBzaXplX3QgZG9fb25lKGJvb2wgYmxvY2ssIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBIZWxwZXIgdG8gY2FsY3VsYXRlIHRoZSBHZXRRdWV1ZWRDb21wbGV0aW9uU3RhdHVzIHRpbWVvdXQuCi0gIEFTSU9fREVDTCBzdGF0aWMgRFdPUkQgZ2V0X2dxY3NfdGltZW91dCgpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBhZGQgYSBuZXcgdGltZXIgcXVldWUuCi0gIEFTSU9fREVDTCB2b2lkIGRvX2FkZF90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZV9iYXNlJiBxdWV1ZSk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVyIHF1ZXVlLgotICBBU0lPX0RFQ0wgdm9pZCBkb19yZW1vdmVfdGltZXJfcXVldWUodGltZXJfcXVldWVfYmFzZSYgcXVldWUpOwotCi0gIC8vIENhbGxlZCB0byByZWNhbGN1bGF0ZSBhbmQgdXBkYXRlIHRoZSB0aW1lb3V0LgotICBBU0lPX0RFQ0wgdm9pZCB1cGRhdGVfdGltZW91dCgpOwotCi0gIC8vIEhlbHBlciBjbGFzcyB0byBjYWxsIHdvcmtfZmluaXNoZWQoKSBvbiBibG9jayBleGl0LgotICBzdHJ1Y3Qgd29ya19maW5pc2hlZF9vbl9ibG9ja19leGl0OwotCi0gIC8vIEhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgYSBIQU5ETEUuCi0gIHN0cnVjdCBhdXRvX2hhbmRsZQotICB7Ci0gICAgSEFORExFIGhhbmRsZTsKLSAgICBhdXRvX2hhbmRsZSgpIDogaGFuZGxlKDApIHt9Ci0gICAgfmF1dG9faGFuZGxlKCkgeyBpZiAoaGFuZGxlKSA6OkNsb3NlSGFuZGxlKGhhbmRsZSk7IH0KLSAgfTsKLQotICAvLyBUaGUgSU8gY29tcGxldGlvbiBwb3J0IHVzZWQgZm9yIHF1ZXVlaW5nIG9wZXJhdGlvbnMuCi0gIGF1dG9faGFuZGxlIGlvY3BfOwotCi0gIC8vIFRoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHdvcmsuCi0gIGxvbmcgb3V0c3RhbmRpbmdfd29ya187Ci0KLSAgLy8gRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBldmVudCBsb29wIGhhcyBiZWVuIHN0b3BwZWQuCi0gIG11dGFibGUgbG9uZyBzdG9wcGVkXzsKLQotICAvLyBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgYW4gaW4tZmxpZ2h0IHN0b3AgZXZlbnQuIEV2ZXJ5IGV2ZW50Ci0gIC8vIHBvc3RlZCB1c2luZyBQb3N0UXVldWVkQ29tcGxldGlvblN0YXR1cyBjb25zdW1lcyBub24tcGFnZWQgcG9vbCwgc28gdG8KLSAgLy8gYXZvaWQgZXhoYXVzdGluZyB0aGlzIHJlc291Y2Ugd2UgbGltaXQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBldmVudHMuCi0gIGxvbmcgc3RvcF9ldmVudF9wb3N0ZWRfOwotCi0gIC8vIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgc2VydmljZSBoYXMgYmVlbiBzaHV0IGRvd24uCi0gIGxvbmcgc2h1dGRvd25fOwotCi0gIGVudW0KLSAgewotICAgIC8vIFRpbWVvdXQgdG8gdXNlIHdpdGggR2V0UXVldWVkQ29tcGxldGlvblN0YXR1cyBvbiBvbGRlciB2ZXJzaW9ucyBvZgotICAgIC8vIFdpbmRvd3MuIFNvbWUgdmVyc2lvbnMgb2Ygd2luZG93cyBoYXZlIGEgImJ1ZyIgd2hlcmUgYSBjYWxsIHRvCi0gICAgLy8gR2V0UXVldWVkQ29tcGxldGlvblN0YXR1cyBjYW4gYXBwZWFyIHN0dWNrIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSBldmVudHMKLSAgICAvLyB3YWl0aW5nIG9uIHRoZSBxdWV1ZS4gVXNpbmcgYSB0aW1lb3V0IGhlbHBzIHRvIHdvcmsgYXJvdW5kIHRoZSBpc3N1ZS4KLSAgICBkZWZhdWx0X2dxY3NfdGltZW91dCA9IDUwMCwKLQotICAgIC8vIE1heGltdW0gd2FpdGFibGUgdGltZXIgdGltZW91dCwgaW4gbWlsbGlzZWNvbmRzLgotICAgIG1heF90aW1lb3V0X21zZWMgPSA1ICogNjAgKiAxMDAwLAotCi0gICAgLy8gTWF4aW11bSB3YWl0YWJsZSB0aW1lciB0aW1lb3V0LCBpbiBtaWNyb3NlY29uZHMuCi0gICAgbWF4X3RpbWVvdXRfdXNlYyA9IG1heF90aW1lb3V0X21zZWMgKiAxMDAwLAotCi0gICAgLy8gQ29tcGxldGlvbiBrZXkgdmFsdWUgdXNlZCB0byB3YWtlIHVwIGEgdGhyZWFkIHRvIGRpc3BhdGNoIHRpbWVycyBvcgotICAgIC8vIGNvbXBsZXRlZCBvcGVyYXRpb25zLgotICAgIHdha2VfZm9yX2Rpc3BhdGNoID0gMSwKLQotICAgIC8vIENvbXBsZXRpb24ga2V5IHZhbHVlIHRvIGluZGljYXRlIHRoYXQgYW4gb3BlcmF0aW9uIGhhcyBwb3N0ZWQgd2l0aCB0aGUKLSAgICAvLyBvcmlnaW5hbCBsYXN0X2Vycm9yIGFuZCBieXRlc190cmFuc2ZlcnJlZCB2YWx1ZXMgc3RvcmVkIGluIHRoZSBmaWVsZHMgb2YKLSAgICAvLyB0aGUgT1ZFUkxBUFBFRCBzdHJ1Y3R1cmUuCi0gICAgb3ZlcmxhcHBlZF9jb250YWluc19yZXN1bHQgPSAyCi0gIH07Ci0KLSAgLy8gVGltZW91dCB0byB1c2Ugd2l0aCBHZXRRdWV1ZWRDb21wbGV0aW9uU3RhdHVzLgotICBjb25zdCBEV09SRCBncWNzX3RpbWVvdXRfOwotCi0gIC8vIEZ1bmN0aW9uIG9iamVjdCBmb3IgcHJvY2Vzc2luZyB0aW1lb3V0cyBpbiBhIGJhY2tncm91bmQgdGhyZWFkLgotICBzdHJ1Y3QgdGltZXJfdGhyZWFkX2Z1bmN0aW9uOwotICBmcmllbmQgc3RydWN0IHRpbWVyX3RocmVhZF9mdW5jdGlvbjsKLQotICAvLyBCYWNrZ3JvdW5kIHRocmVhZCB1c2VkIGZvciBwcm9jZXNzaW5nIHRpbWVvdXRzLgotICBzY29wZWRfcHRyPHRocmVhZD4gdGltZXJfdGhyZWFkXzsKLQotICAvLyBBIHdhaXRhYmxlIHRpbWVyIG9iamVjdCB1c2VkIGZvciB3YWl0aW5nIGZvciB0aW1lb3V0cy4KLSAgYXV0b19oYW5kbGUgd2FpdGFibGVfdGltZXJfOwotCi0gIC8vIE5vbi16ZXJvIGlmIHRpbWVycyBvciBjb21wbGV0ZWQgb3BlcmF0aW9ucyBuZWVkIHRvIGJlIGRpc3BhdGNoZWQuCi0gIGxvbmcgZGlzcGF0Y2hfcmVxdWlyZWRfOwotCi0gIC8vIE11dGV4IGZvciBwcm90ZWN0aW5nIGFjY2VzcyB0byB0aGUgdGltZXIgcXVldWVzIGFuZCBjb21wbGV0ZWQgb3BlcmF0aW9ucy4KLSAgbXV0ZXggZGlzcGF0Y2hfbXV0ZXhfOwotCi0gIC8vIFRoZSB0aW1lciBxdWV1ZXMuCi0gIHRpbWVyX3F1ZXVlX3NldCB0aW1lcl9xdWV1ZXNfOwotCi0gIC8vIFRoZSBvcGVyYXRpb25zIHRoYXQgYXJlIHJlYWR5IHRvIGRpc3BhdGNoLgotICBvcF9xdWV1ZTx3aW5faW9jcF9vcGVyYXRpb24+IGNvbXBsZXRlZF9vcHNfOwotCi0gIC8vIFBlci10aHJlYWQgY2FsbCBzdGFjayB0byB0cmFjayB0aGUgc3RhdGUgb2YgZWFjaCB0aHJlYWQgaW4gdGhlIGlvX3NlcnZpY2UuCi0gIHR5cGVkZWYgY2FsbF9zdGFjazx3aW5faW9jcF9pb19zZXJ2aWNlLAotICAgICAgd2luX2lvY3BfdGhyZWFkX2luZm8+IHRocmVhZF9jYWxsX3N0YWNrOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3dpbl9pb2NwX2lvX3NlcnZpY2UuaHBwIgotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9pb19zZXJ2aWNlLmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5fSU9DUF9JT19TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9udWxsX2J1ZmZlcnNfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9udWxsX2J1ZmZlcnNfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2YxYzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3BfbnVsbF9idWZmZXJzX29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9pb2NwX251bGxfYnVmZmVyc19vcC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTl9JT0NQX05VTExfQlVGRkVSU19PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOX0lPQ1BfTlVMTF9CVUZGRVJTX09QX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyB3aW5faW9jcF9udWxsX2J1ZmZlcnNfb3AgOiBwdWJsaWMgcmVhY3Rvcl9vcAotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUih3aW5faW9jcF9udWxsX2J1ZmZlcnNfb3ApOwotCi0gIHdpbl9pb2NwX251bGxfYnVmZmVyc19vcChzb2NrZXRfb3BzOjp3ZWFrX2NhbmNlbF90b2tlbl90eXBlIGNhbmNlbF90b2tlbiwKLSAgICAgIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiByZWFjdG9yX29wKCZ3aW5faW9jcF9udWxsX2J1ZmZlcnNfb3A6OmRvX3BlcmZvcm0sCi0gICAgICAgICZ3aW5faW9jcF9udWxsX2J1ZmZlcnNfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIGNhbmNlbF90b2tlbl8oY2FuY2VsX3Rva2VuKSwKLSAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKGhhbmRsZXIpKQotICB7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBkb19wZXJmb3JtKHJlYWN0b3Jfb3AqKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBkb19jb21wbGV0ZShpb19zZXJ2aWNlX2ltcGwqIG93bmVyLCBvcGVyYXRpb24qIGJhc2UsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiByZXN1bHRfZWMsCi0gICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMocmVzdWx0X2VjKTsKLQotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBvcGVyYXRpb24gb2JqZWN0LgotICAgIHdpbl9pb2NwX251bGxfYnVmZmVyc19vcCogbyhzdGF0aWNfY2FzdDx3aW5faW9jcF9udWxsX2J1ZmZlcnNfb3AqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKG8tPmhhbmRsZXJfKSwgbywgbyB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotICAgIC8vIFRoZSByZWFjdG9yIG1heSBoYXZlIHN0b3JlZCBhIHJlc3VsdCBpbiB0aGUgb3BlcmF0aW9uIG9iamVjdC4KLSAgICBpZiAoby0+ZWNfKQotICAgICAgZWMgPSBvLT5lY187Ci0KLSAgICAvLyBNYXAgbm9uLXBvcnRhYmxlIGVycm9ycyB0byB0aGVpciBwb3J0YWJsZSBjb3VudGVycGFydHMuCi0gICAgaWYgKGVjLnZhbHVlKCkgPT0gRVJST1JfTkVUTkFNRV9ERUxFVEVEKQotICAgIHsKLSAgICAgIGlmIChvLT5jYW5jZWxfdG9rZW5fLmV4cGlyZWQoKSkKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQ7Ci0gICAgICBlbHNlCi0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmNvbm5lY3Rpb25fcmVzZXQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVjLnZhbHVlKCkgPT0gRVJST1JfUE9SVF9VTlJFQUNIQUJMRSkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjpjb25uZWN0aW9uX3JlZnVzZWQ7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBkZWFsbG9jYXRlZCBiZWZvcmUKLSAgICAvLyB0aGUgdXBjYWxsIGlzIG1hZGUuIEV2ZW4gaWYgd2UncmUgbm90IGFib3V0IHRvIG1ha2UgYW4gdXBjYWxsLCBhCi0gICAgLy8gc3ViLW9iamVjdCBvZiB0aGUgaGFuZGxlciBtYXkgYmUgdGhlIHRydWUgb3duZXIgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkCi0gICAgLy8gd2l0aCB0aGUgaGFuZGxlci4gQ29uc2VxdWVudGx5LCBhIGxvY2FsIGNvcHkgb2YgdGhlIGhhbmRsZXIgaXMgcmVxdWlyZWQKLSAgICAvLyB0byBlbnN1cmUgdGhhdCBhbnkgb3duaW5nIHN1Yi1vYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlciB3ZSBoYXZlCi0gICAgLy8gZGVhbGxvY2F0ZWQgdGhlIG1lbW9yeSBoZXJlLgotICAgIGRldGFpbDo6YmluZGVyMjxIYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdD4KLSAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIGVjLCBieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sIGhhbmRsZXIuYXJnMl8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBzb2NrZXRfb3BzOjp3ZWFrX2NhbmNlbF90b2tlbl90eXBlIGNhbmNlbF90b2tlbl87Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9JT0NQX05VTExfQlVGRkVSU19PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfb3BlcmF0aW9uLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfb3BlcmF0aW9uLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwYjFiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX29wZXJhdGlvbi5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9pb2NwX29wZXJhdGlvbi5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTl9JT0NQX09QRVJBVElPTl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOX0lPQ1BfT1BFUkFUSU9OX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90cmFja2luZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BfcXVldWUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvcl9jb2RlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyB3aW5faW9jcF9pb19zZXJ2aWNlOwotCi0vLyBCYXNlIGNsYXNzIGZvciBhbGwgb3BlcmF0aW9ucy4gQSBmdW5jdGlvbiBwb2ludGVyIGlzIHVzZWQgaW5zdGVhZCBvZiB2aXJ0dWFsCi0vLyBmdW5jdGlvbnMgdG8gYXZvaWQgdGhlIGFzc29jaWF0ZWQgb3ZlcmhlYWQuCi1jbGFzcyB3aW5faW9jcF9vcGVyYXRpb24KLSAgOiBwdWJsaWMgT1ZFUkxBUFBFRAotICAgIEFTSU9fQUxTT19JTkhFUklUX1RSQUNLRURfSEFORExFUgotewotcHVibGljOgotICB2b2lkIGNvbXBsZXRlKHdpbl9pb2NwX2lvX3NlcnZpY2UmIG93bmVyLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCkKLSAgewotICAgIGZ1bmNfKCZvd25lciwgdGhpcywgZWMsIGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgfQotCi0gIHZvaWQgZGVzdHJveSgpCi0gIHsKLSAgICBmdW5jXygwLCB0aGlzLCBhc2lvOjplcnJvcl9jb2RlKCksIDApOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgdHlwZWRlZiB2b2lkICgqZnVuY190eXBlKSgKLSAgICAgIHdpbl9pb2NwX2lvX3NlcnZpY2UqLCB3aW5faW9jcF9vcGVyYXRpb24qLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYsIHN0ZDo6c2l6ZV90KTsKLQotICB3aW5faW9jcF9vcGVyYXRpb24oZnVuY190eXBlIGZ1bmMpCi0gICAgOiBuZXh0XygwKSwKLSAgICAgIGZ1bmNfKGZ1bmMpCi0gIHsKLSAgICByZXNldCgpOwotICB9Ci0KLSAgLy8gUHJldmVudHMgZGVsZXRpb24gdGhyb3VnaCB0aGlzIHR5cGUuCi0gIH53aW5faW9jcF9vcGVyYXRpb24oKQotICB7Ci0gIH0KLQotICB2b2lkIHJlc2V0KCkKLSAgewotICAgIEludGVybmFsID0gMDsKLSAgICBJbnRlcm5hbEhpZ2ggPSAwOwotICAgIE9mZnNldCA9IDA7Ci0gICAgT2Zmc2V0SGlnaCA9IDA7Ci0gICAgaEV2ZW50ID0gMDsKLSAgICByZWFkeV8gPSAwOwotICB9Ci0KLXByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBvcF9xdWV1ZV9hY2Nlc3M7Ci0gIGZyaWVuZCBjbGFzcyB3aW5faW9jcF9pb19zZXJ2aWNlOwotICB3aW5faW9jcF9vcGVyYXRpb24qIG5leHRfOwotICBmdW5jX3R5cGUgZnVuY187Ci0gIGxvbmcgcmVhZHlfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5fSU9DUF9PUEVSQVRJT05fSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX292ZXJsYXBwZWRfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9vdmVybGFwcGVkX29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyNTJkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX292ZXJsYXBwZWRfb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5faW9jcF9vdmVybGFwcGVkX29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTl9JT0NQX09WRVJMQVBQRURfT1BfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTl9JT0NQX09WRVJMQVBQRURfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL29wZXJhdGlvbi5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyB3aW5faW9jcF9vdmVybGFwcGVkX29wIDogcHVibGljIG9wZXJhdGlvbgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUih3aW5faW9jcF9vdmVybGFwcGVkX29wKTsKLQotICB3aW5faW9jcF9vdmVybGFwcGVkX29wKEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiBvcGVyYXRpb24oJndpbl9pb2NwX292ZXJsYXBwZWRfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKGhhbmRsZXIpKQotICB7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBkb19jb21wbGV0ZShpb19zZXJ2aWNlX2ltcGwqIG93bmVyLCBvcGVyYXRpb24qIGJhc2UsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQpCi0gIHsKLSAgICAvLyBUYWtlIG93bmVyc2hpcCBvZiB0aGUgb3BlcmF0aW9uIG9iamVjdC4KLSAgICB3aW5faW9jcF9vdmVybGFwcGVkX29wKiBvKHN0YXRpY19jYXN0PHdpbl9pb2NwX292ZXJsYXBwZWRfb3AqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKG8tPmhhbmRsZXJfKSwgbywgbyB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBkZXRhaWw6OmJpbmRlcjI8SGFuZGxlciwgYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3Q+Ci0gICAgICBoYW5kbGVyKG8tPmhhbmRsZXJfLCBlYywgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIHAuaCA9IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIuaGFuZGxlcl8pOwotICAgIHAucmVzZXQoKTsKLQotICAgIC8vIE1ha2UgdGhlIHVwY2FsbCBpZiByZXF1aXJlZC4KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgZmVuY2VkX2Jsb2NrIGIoZmVuY2VkX2Jsb2NrOjpoYWxmKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKChoYW5kbGVyLmFyZzFfLCBoYW5kbGVyLmFyZzJfKSk7Ci0gICAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoYW5kbGVyLCBoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0VORDsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgSGFuZGxlciBoYW5kbGVyXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0lOX0lPQ1BfT1ZFUkxBUFBFRF9PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfb3ZlcmxhcHBlZF9wdHIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9vdmVybGFwcGVkX3B0ci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMmFlZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9vdmVybGFwcGVkX3B0ci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5faW9jcF9vdmVybGFwcGVkX3B0ci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOX0lPQ1BfT1ZFUkxBUFBFRF9QVFJfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTl9JT0NQX09WRVJMQVBQRURfUFRSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX292ZXJsYXBwZWRfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX2lvX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLS8vIFdyYXBzIGEgaGFuZGxlciB0byBjcmVhdGUgYW4gT1ZFUkxBUFBFRCBvYmplY3QgZm9yIHVzZSB3aXRoIG92ZXJsYXBwZWQgSS9PLgotY2xhc3Mgd2luX2lvY3Bfb3ZlcmxhcHBlZF9wdHIKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdCBhbiBlbXB0eSB3aW5faW9jcF9vdmVybGFwcGVkX3B0ci4KLSAgd2luX2lvY3Bfb3ZlcmxhcHBlZF9wdHIoKQotICAgIDogcHRyXygwKSwKLSAgICAgIGlvY3Bfc2VydmljZV8oMCkKLSAgewotICB9Ci0KLSAgLy8gQ29uc3RydWN0IGFuIHdpbl9pb2NwX292ZXJsYXBwZWRfcHRyIHRvIGNvbnRhaW4gdGhlIHNwZWNpZmllZCBoYW5kbGVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgZXhwbGljaXQgd2luX2lvY3Bfb3ZlcmxhcHBlZF9wdHIoCi0gICAgICBhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLCBBU0lPX01PVkVfQVJHKEhhbmRsZXIpIGhhbmRsZXIpCi0gICAgOiBwdHJfKDApLAotICAgICAgaW9jcF9zZXJ2aWNlXygwKQotICB7Ci0gICAgdGhpcy0+cmVzZXQoaW9fc2VydmljZSwgQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci0KLSAgLy8gRGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGZyZWVzIHRoZSBPVkVSTEFQUEVEIG9iamVjdCB1bmxlc3MgcmVsZWFzZWQuCi0gIH53aW5faW9jcF9vdmVybGFwcGVkX3B0cigpCi0gIHsKLSAgICByZXNldCgpOwotICB9Ci0KLSAgLy8gUmVzZXQgdG8gZW1wdHkuCi0gIHZvaWQgcmVzZXQoKQotICB7Ci0gICAgaWYgKHB0cl8pCi0gICAgewotICAgICAgcHRyXy0+ZGVzdHJveSgpOwotICAgICAgcHRyXyA9IDA7Ci0gICAgICBpb2NwX3NlcnZpY2VfLT53b3JrX2ZpbmlzaGVkKCk7Ci0gICAgICBpb2NwX3NlcnZpY2VfID0gMDsKLSAgICB9Ci0gIH0KLQotICAvLyBSZXNldCB0byBjb250YWluIHRoZSBzcGVjaWZpZWQgaGFuZGxlciwgZnJlZWluZyBhbnkgY3VycmVudCBPVkVSTEFQUEVECi0gIC8vIG9iamVjdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgcmVzZXQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwgSGFuZGxlciBoYW5kbGVyKQotICB7Ci0gICAgdHlwZWRlZiB3aW5faW9jcF9vdmVybGFwcGVkX29wPEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJpb19zZXJ2aWNlIiwKLSAgICAgICAgICAmaW9fc2VydmljZS5pbXBsXywgIm92ZXJsYXBwZWQiKSk7Ci0KLSAgICBpb19zZXJ2aWNlLmltcGxfLndvcmtfc3RhcnRlZCgpOwotICAgIHJlc2V0KCk7Ci0gICAgcHRyXyA9IHAucDsKLSAgICBwLnYgPSBwLnAgPSAwOwotICAgIGlvY3Bfc2VydmljZV8gPSAmaW9fc2VydmljZS5pbXBsXzsKLSAgfQotCi0gIC8vIEdldCB0aGUgY29udGFpbmVkIE9WRVJMQVBQRUQgb2JqZWN0LgotICBPVkVSTEFQUEVEKiBnZXQoKQotICB7Ci0gICAgcmV0dXJuIHB0cl87Ci0gIH0KLQotICAvLyBHZXQgdGhlIGNvbnRhaW5lZCBPVkVSTEFQUEVEIG9iamVjdC4KLSAgY29uc3QgT1ZFUkxBUFBFRCogZ2V0KCkgY29uc3QKLSAgewotICAgIHJldHVybiBwdHJfOwotICB9Ci0KLSAgLy8gUmVsZWFzZSBvd25lcnNoaXAgb2YgdGhlIE9WRVJMQVBQRUQgb2JqZWN0LgotICBPVkVSTEFQUEVEKiByZWxlYXNlKCkKLSAgewotICAgIGlmIChwdHJfKQotICAgICAgaW9jcF9zZXJ2aWNlXy0+b25fcGVuZGluZyhwdHJfKTsKLQotICAgIE9WRVJMQVBQRUQqIHRtcCA9IHB0cl87Ci0gICAgcHRyXyA9IDA7Ci0gICAgaW9jcF9zZXJ2aWNlXyA9IDA7Ci0gICAgcmV0dXJuIHRtcDsKLSAgfQotCi0gIC8vIFBvc3QgY29tcGxldGlvbiBub3RpZmljYXRpb24gZm9yIG92ZXJsYXBwZWQgb3BlcmF0aW9uLiBSZWxlYXNlcyBvd25lcnNoaXAuCi0gIHZvaWQgY29tcGxldGUoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCkKLSAgewotICAgIGlmIChwdHJfKQotICAgIHsKLSAgICAgIGlvY3Bfc2VydmljZV8tPm9uX2NvbXBsZXRpb24ocHRyXywgZWMsCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8RFdPUkQ+KGJ5dGVzX3RyYW5zZmVycmVkKSk7Ci0gICAgICBwdHJfID0gMDsKLSAgICAgIGlvY3Bfc2VydmljZV8gPSAwOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICB3aW5faW9jcF9vcGVyYXRpb24qIHB0cl87Ci0gIHdpbl9pb2NwX2lvX3NlcnZpY2UqIGlvY3Bfc2VydmljZV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9JT0NQX09WRVJMQVBQRURfUFRSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfc2VyaWFsX3BvcnRfc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmRjYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vIENvcHlyaWdodCAoYykgMjAwOCBSZXAgSW52YXJpYW50IFN5c3RlbXMsIEluYy4gKGluZm9AcmVwaW52YXJpYW50LmNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOX0lPQ1BfU0VSSUFMX1BPUlRfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOX0lPQ1BfU0VSSUFMX1BPUlRfU0VSVklDRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkgJiYgZGVmaW5lZChBU0lPX0hBU19TRVJJQUxfUE9SVCkKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX2hhbmRsZV9zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLyBFeHRlbmQgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2UgdG8gcHJvdmlkZSBzZXJpYWwgcG9ydCBzdXBwb3J0LgotY2xhc3Mgd2luX2lvY3Bfc2VyaWFsX3BvcnRfc2VydmljZQotewotcHVibGljOgotICAvLyBUaGUgbmF0aXZlIHR5cGUgb2YgYSBzZXJpYWwgcG9ydC4KLSAgdHlwZWRlZiB3aW5faW9jcF9oYW5kbGVfc2VydmljZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICAvLyBUaGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiB0aGUgc2VyaWFsIHBvcnQuCi0gIHR5cGVkZWYgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIHdpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2UoCi0gICAgICBhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKTsKLQotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICBBU0lPX0RFQ0wgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCk7Ci0KLSAgLy8gQ29uc3RydWN0IGEgbmV3IHNlcmlhbCBwb3J0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgaGFuZGxlX3NlcnZpY2VfLmNvbnN0cnVjdChpbXBsKTsKLSAgfQotCi0gIC8vIE1vdmUtY29uc3RydWN0IGEgbmV3IHNlcmlhbCBwb3J0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotICB7Ci0gICAgaGFuZGxlX3NlcnZpY2VfLm1vdmVfY29uc3RydWN0KGltcGwsIG90aGVyX2ltcGwpOwotICB9Ci0KLSAgLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIHNlcmlhbCBwb3J0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICB3aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlJiBvdGhlcl9zZXJ2aWNlLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIGhhbmRsZV9zZXJ2aWNlXy5tb3ZlX2Fzc2lnbihpbXBsLAotICAgICAgICBvdGhlcl9zZXJ2aWNlLmhhbmRsZV9zZXJ2aWNlXywgb3RoZXJfaW1wbCk7Ci0gIH0KLQotICAvLyBEZXN0cm95IGEgc2VyaWFsIHBvcnQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgZGVzdHJveShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgaGFuZGxlX3NlcnZpY2VfLmRlc3Ryb3koaW1wbCk7Ci0gIH0KLQotICAvLyBPcGVuIHRoZSBzZXJpYWwgcG9ydCB1c2luZyB0aGUgc3BlY2lmaWVkIGRldmljZSBuYW1lLgotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBvcGVuKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gQXNzaWduIGEgbmF0aXZlIGhhbmRsZSB0byBhIHNlcmlhbCBwb3J0IGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBoYW5kbGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIGhhbmRsZV9zZXJ2aWNlXy5hc3NpZ24oaW1wbCwgaGFuZGxlLCBlYyk7Ci0gIH0KLQotICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgc2VyaWFsIHBvcnQgaXMgb3Blbi4KLSAgYm9vbCBpc19vcGVuKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaGFuZGxlX3NlcnZpY2VfLmlzX29wZW4oaW1wbCk7Ci0gIH0KLQotICAvLyBEZXN0cm95IGEgc2VyaWFsIHBvcnQgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIGhhbmRsZV9zZXJ2aWNlXy5jbG9zZShpbXBsLCBlYyk7Ci0gIH0KLQotICAvLyBHZXQgdGhlIG5hdGl2ZSBzZXJpYWwgcG9ydCByZXByZXNlbnRhdGlvbi4KLSAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBoYW5kbGVfc2VydmljZV8ubmF0aXZlX2hhbmRsZShpbXBsKTsKLSAgfQotCi0gIC8vIENhbmNlbCBhbGwgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZS4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIGhhbmRsZV9zZXJ2aWNlXy5jYW5jZWwoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8gU2V0IGFuIG9wdGlvbiBvbiB0aGUgc2VyaWFsIHBvcnQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgc2V0X29wdGlvbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgU2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uJiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIGRvX3NldF9vcHRpb24oaW1wbCwKLSAgICAgICAgJndpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2U6OnN0b3JlX29wdGlvbjxTZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24+LAotICAgICAgICAmb3B0aW9uLCBlYyk7Ci0gIH0KLQotICAvLyBHZXQgYW4gb3B0aW9uIGZyb20gdGhlIHNlcmlhbCBwb3J0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgR2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIGdldF9vcHRpb24oY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIEdldHRhYmxlU2VyaWFsUG9ydE9wdGlvbiYgb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBkb19nZXRfb3B0aW9uKGltcGwsCi0gICAgICAgICZ3aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlOjpsb2FkX29wdGlvbjxHZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24+LAotICAgICAgICAmb3B0aW9uLCBlYyk7Ci0gIH0KLQotICAvLyBTZW5kIGEgYnJlYWsgc2VxdWVuY2UgdG8gdGhlIHNlcmlhbCBwb3J0LgotICBhc2lvOjplcnJvcl9jb2RlIHNlbmRfYnJlYWsoaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBnaXZlbiBkYXRhLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHNpemVfdCB3cml0ZV9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBoYW5kbGVfc2VydmljZV8ud3JpdGVfc29tZShpbXBsLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd3JpdGUuIFRoZSBkYXRhIGJlaW5nIHdyaXR0ZW4gbXVzdCBiZSB2YWxpZCBmb3IgdGhlCi0gIC8vIGxpZmV0aW1lIG9mIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY193cml0ZV9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgaGFuZGxlX3NlcnZpY2VfLmFzeW5jX3dyaXRlX3NvbWUoaW1wbCwgYnVmZmVycywgaGFuZGxlcik7Ci0gIH0KLQotICAvLyBSZWFkIHNvbWUgZGF0YS4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzaXplX3QgcmVhZF9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIGhhbmRsZV9zZXJ2aWNlXy5yZWFkX3NvbWUoaW1wbCwgYnVmZmVycywgZWMpOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlYWQuIFRoZSBidWZmZXIgZm9yIHRoZSBkYXRhIGJlaW5nIHJlY2VpdmVkIG11c3QgYmUKLSAgLy8gdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19yZWFkX3NvbWUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGhhbmRsZV9zZXJ2aWNlXy5hc3luY19yZWFkX3NvbWUoaW1wbCwgYnVmZmVycywgaGFuZGxlcik7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gRnVuY3Rpb24gcG9pbnRlciB0eXBlIGZvciBzdG9yaW5nIGEgc2VyaWFsIHBvcnQgb3B0aW9uLgotICB0eXBlZGVmIGFzaW86OmVycm9yX2NvZGUgKCpzdG9yZV9mdW5jdGlvbl90eXBlKSgKLSAgICAgIGNvbnN0IHZvaWQqLCA6OkRDQiYsIGFzaW86OmVycm9yX2NvZGUmKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdGVtcGxhdGUgdG8gc3RvcmUgYSBzZXJpYWwgcG9ydCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24+Ci0gIHN0YXRpYyBhc2lvOjplcnJvcl9jb2RlIHN0b3JlX29wdGlvbihjb25zdCB2b2lkKiBvcHRpb24sCi0gICAgICA6OkRDQiYgc3RvcmFnZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgU2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uKj4ob3B0aW9uKS0+c3RvcmUoCi0gICAgICAgIHN0b3JhZ2UsIGVjKTsKLSAgfQotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBzZXQgYSBzZXJpYWwgcG9ydCBvcHRpb24uCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGRvX3NldF9vcHRpb24oCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBzdG9yZV9mdW5jdGlvbl90eXBlIHN0b3JlLAotICAgICAgY29uc3Qgdm9pZCogb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gRnVuY3Rpb24gcG9pbnRlciB0eXBlIGZvciBsb2FkaW5nIGEgc2VyaWFsIHBvcnQgb3B0aW9uLgotICB0eXBlZGVmIGFzaW86OmVycm9yX2NvZGUgKCpsb2FkX2Z1bmN0aW9uX3R5cGUpKAotICAgICAgdm9pZCosIGNvbnN0IDo6RENCJiwgYXNpbzo6ZXJyb3JfY29kZSYpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0ZW1wbGF0ZSB0byBsb2FkIGEgc2VyaWFsIHBvcnQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgR2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uPgotICBzdGF0aWMgYXNpbzo6ZXJyb3JfY29kZSBsb2FkX29wdGlvbih2b2lkKiBvcHRpb24sCi0gICAgICBjb25zdCA6OkRDQiYgc3RvcmFnZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8R2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uKj4ob3B0aW9uKS0+bG9hZChzdG9yYWdlLCBlYyk7Ci0gIH0KLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGEgc2VyaWFsIHBvcnQgb3B0aW9uLgotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBkb19nZXRfb3B0aW9uKAotICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgbG9hZF9mdW5jdGlvbl90eXBlIGxvYWQsCi0gICAgICB2b2lkKiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdDsKLQotICAvLyBUaGUgaW1wbGVtZW50YXRpb24gdXNlZCBmb3IgaW5pdGlhdGluZyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KLSAgd2luX2lvY3BfaGFuZGxlX3NlcnZpY2UgaGFuZGxlX3NlcnZpY2VfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3Bfc2VyaWFsX3BvcnRfc2VydmljZS5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKSAmJiBkZWZpbmVkKEFTSU9fSEFTX1NFUklBTF9QT1JUKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0lOX0lPQ1BfU0VSSUFMX1BPUlRfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X2FjY2VwdF9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9hY2NlcHRfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTBkMDRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X2FjY2VwdF9vcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5faW9jcF9zb2NrZXRfYWNjZXB0X29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9BQ0NFUFRfT1BfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9BQ0NFUFRfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTb2NrZXQsIHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBIYW5kbGVyPgotY2xhc3Mgd2luX2lvY3Bfc29ja2V0X2FjY2VwdF9vcCA6IHB1YmxpYyBvcGVyYXRpb24KLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIod2luX2lvY3Bfc29ja2V0X2FjY2VwdF9vcCk7Ci0KLSAgd2luX2lvY3Bfc29ja2V0X2FjY2VwdF9vcCh3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlJiBzb2NrZXRfc2VydmljZSwKLSAgICAgIHNvY2tldF90eXBlIHNvY2tldCwgU29ja2V0JiBwZWVyLCBjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wsCi0gICAgICB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQqIHBlZXJfZW5kcG9pbnQsCi0gICAgICBib29sIGVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWQsIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiBvcGVyYXRpb24oJndpbl9pb2NwX3NvY2tldF9hY2NlcHRfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIHNvY2tldF9zZXJ2aWNlXyhzb2NrZXRfc2VydmljZSksCi0gICAgICBzb2NrZXRfKHNvY2tldCksCi0gICAgICBwZWVyXyhwZWVyKSwKLSAgICAgIHByb3RvY29sXyhwcm90b2NvbCksCi0gICAgICBwZWVyX2VuZHBvaW50XyhwZWVyX2VuZHBvaW50KSwKLSAgICAgIGVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWRfKGVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWQpLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpCi0gIHsKLSAgfQotCi0gIHNvY2tldF9ob2xkZXImIG5ld19zb2NrZXQoKQotICB7Ci0gICAgcmV0dXJuIG5ld19zb2NrZXRfOwotICB9Ci0KLSAgdm9pZCogb3V0cHV0X2J1ZmZlcigpCi0gIHsKLSAgICByZXR1cm4gb3V0cHV0X2J1ZmZlcl87Ci0gIH0KLQotICBEV09SRCBhZGRyZXNzX2xlbmd0aCgpCi0gIHsKLSAgICByZXR1cm4gc2l6ZW9mKHNvY2thZGRyX3N0b3JhZ2VfdHlwZSkgKyAxNjsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIHJlc3VsdF9lYywKLSAgICAgIHN0ZDo6c2l6ZV90IC8qYnl0ZXNfdHJhbnNmZXJyZWQqLykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMocmVzdWx0X2VjKTsKLQotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBvcGVyYXRpb24gb2JqZWN0LgotICAgIHdpbl9pb2NwX3NvY2tldF9hY2NlcHRfb3AqIG8oc3RhdGljX2Nhc3Q8d2luX2lvY3Bfc29ja2V0X2FjY2VwdF9vcCo+KGJhc2UpKTsKLSAgICBwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2Yoby0+aGFuZGxlcl8pLCBvLCBvIH07Ci0KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50IHBlZXJfZW5kcG9pbnQ7Ci0gICAgICBzdGQ6OnNpemVfdCBhZGRyX2xlbiA9IHBlZXJfZW5kcG9pbnQuY2FwYWNpdHkoKTsKLSAgICAgIHNvY2tldF9vcHM6OmNvbXBsZXRlX2lvY3BfYWNjZXB0KG8tPnNvY2tldF8sCi0gICAgICAgICAgby0+b3V0cHV0X2J1ZmZlcigpLCBvLT5hZGRyZXNzX2xlbmd0aCgpLAotICAgICAgICAgIHBlZXJfZW5kcG9pbnQuZGF0YSgpLCAmYWRkcl9sZW4sCi0gICAgICAgICAgby0+bmV3X3NvY2tldF8uZ2V0KCksIGVjKTsKLQotICAgICAgLy8gUmVzdGFydCB0aGUgYWNjZXB0IG9wZXJhdGlvbiBpZiB3ZSBnb3QgdGhlIGNvbm5lY3Rpb25fYWJvcnRlZCBlcnJvcgotICAgICAgLy8gYW5kIHRoZSBlbmFibGVfY29ubmVjdGlvbl9hYm9ydGVkIHNvY2tldCBvcHRpb24gaXMgbm90IHNldC4KLSAgICAgIGlmIChlYyA9PSBhc2lvOjplcnJvcjo6Y29ubmVjdGlvbl9hYm9ydGVkCi0gICAgICAgICAgJiYgIW8tPmVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWRfKQotICAgICAgewotICAgICAgICBvLT5yZXNldCgpOwotICAgICAgICBvLT5zb2NrZXRfc2VydmljZV8ucmVzdGFydF9hY2NlcHRfb3Aoby0+c29ja2V0XywKLSAgICAgICAgICAgIG8tPm5ld19zb2NrZXRfLCBvLT5wcm90b2NvbF8uZmFtaWx5KCksCi0gICAgICAgICAgICBvLT5wcm90b2NvbF8udHlwZSgpLCBvLT5wcm90b2NvbF8ucHJvdG9jb2woKSwKLSAgICAgICAgICAgIG8tPm91dHB1dF9idWZmZXIoKSwgby0+YWRkcmVzc19sZW5ndGgoKSwgbyk7Ci0gICAgICAgIHAudiA9IHAucCA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlIHNvY2tldCB3YXMgc3VjY2Vzc2Z1bGx5IGFjY2VwdGVkLCB0cmFuc2ZlciBvd25lcnNoaXAgb2YgdGhlCi0gICAgICAvLyBzb2NrZXQgdG8gdGhlIHBlZXIgb2JqZWN0LgotICAgICAgaWYgKCFlYykKLSAgICAgIHsKLSAgICAgICAgby0+cGVlcl8uYXNzaWduKG8tPnByb3RvY29sXywKLSAgICAgICAgICAgIHR5cGVuYW1lIFNvY2tldDo6bmF0aXZlX2hhbmRsZV90eXBlKAotICAgICAgICAgICAgICBvLT5uZXdfc29ja2V0Xy5nZXQoKSwgcGVlcl9lbmRwb2ludCksIGVjKTsKLSAgICAgICAgaWYgKCFlYykKLSAgICAgICAgICBvLT5uZXdfc29ja2V0Xy5yZWxlYXNlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFBhc3MgZW5kcG9pbnQgYmFjayB0byBjYWxsZXIuCi0gICAgICBpZiAoby0+cGVlcl9lbmRwb2ludF8pCi0gICAgICAgICpvLT5wZWVyX2VuZHBvaW50XyA9IHBlZXJfZW5kcG9pbnQ7Ci0gICAgfQotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBkZXRhaWw6OmJpbmRlcjE8SGFuZGxlciwgYXNpbzo6ZXJyb3JfY29kZT4KLSAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIGVjKTsKLSAgICBwLmggPSBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICBwLnJlc2V0KCk7Ci0KLSAgICAvLyBNYWtlIHRoZSB1cGNhbGwgaWYgcmVxdWlyZWQuCi0gICAgaWYgKG93bmVyKQotICAgIHsKLSAgICAgIGZlbmNlZF9ibG9jayBiKGZlbmNlZF9ibG9jazo6aGFsZik7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9CRUdJTigoaGFuZGxlci5hcmcxXykpOwotICAgICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoaGFuZGxlciwgaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9FTkQ7Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2UmIHNvY2tldF9zZXJ2aWNlXzsKLSAgc29ja2V0X3R5cGUgc29ja2V0XzsKLSAgc29ja2V0X2hvbGRlciBuZXdfc29ja2V0XzsKLSAgU29ja2V0JiBwZWVyXzsKLSAgUHJvdG9jb2wgcHJvdG9jb2xfOwotICB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQqIHBlZXJfZW5kcG9pbnRfOwotICB1bnNpZ25lZCBjaGFyIG91dHB1dF9idWZmZXJfWyhzaXplb2Yoc29ja2FkZHJfc3RvcmFnZV90eXBlKSArIDE2KSAqIDJdOwotICBib29sIGVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWRfOwotICBIYW5kbGVyIGhhbmRsZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5fSU9DUF9TT0NLRVRfQUNDRVBUX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfY29ubmVjdF9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2MTc0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9DT05ORUNUX09QX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5fSU9DUF9TT0NLRVRfQ09OTkVDVF9PUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgd2luX2lvY3Bfc29ja2V0X2Nvbm5lY3Rfb3BfYmFzZSA6IHB1YmxpYyByZWFjdG9yX29wCi17Ci1wdWJsaWM6Ci0gIHdpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wX2Jhc2Uoc29ja2V0X3R5cGUgc29ja2V0LCBmdW5jX3R5cGUgY29tcGxldGVfZnVuYykKLSAgICA6IHJlYWN0b3Jfb3AoJndpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wX2Jhc2U6OmRvX3BlcmZvcm0sIGNvbXBsZXRlX2Z1bmMpLAotICAgICAgc29ja2V0Xyhzb2NrZXQpLAotICAgICAgY29ubmVjdF9leF8oZmFsc2UpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyBib29sIGRvX3BlcmZvcm0ocmVhY3Rvcl9vcCogYmFzZSkKLSAgewotICAgIHdpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wX2Jhc2UqIG8oCi0gICAgICAgIHN0YXRpY19jYXN0PHdpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wX2Jhc2UqPihiYXNlKSk7Ci0KLSAgICByZXR1cm4gc29ja2V0X29wczo6bm9uX2Jsb2NraW5nX2Nvbm5lY3Qoby0+c29ja2V0Xywgby0+ZWNfKTsKLSAgfQotCi0gIHNvY2tldF90eXBlIHNvY2tldF87Ci0gIGJvb2wgY29ubmVjdF9leF87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIHdpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wIDogcHVibGljIHdpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wX2Jhc2UKLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIod2luX2lvY3Bfc29ja2V0X2Nvbm5lY3Rfb3ApOwotCi0gIHdpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wKHNvY2tldF90eXBlIHNvY2tldCwgSGFuZGxlciYgaGFuZGxlcikKLSAgICA6IHdpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wX2Jhc2Uoc29ja2V0LAotICAgICAgICAmd2luX2lvY3Bfc29ja2V0X2Nvbm5lY3Rfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKGhhbmRsZXIpKQotICB7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBkb19jb21wbGV0ZShpb19zZXJ2aWNlX2ltcGwqIG93bmVyLCBvcGVyYXRpb24qIGJhc2UsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiByZXN1bHRfZWMsCi0gICAgICBzdGQ6OnNpemVfdCAvKmJ5dGVzX3RyYW5zZmVycmVkKi8pCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjKHJlc3VsdF9lYyk7Ci0KLSAgICAvLyBUYWtlIG93bmVyc2hpcCBvZiB0aGUgb3BlcmF0aW9uIG9iamVjdC4KLSAgICB3aW5faW9jcF9zb2NrZXRfY29ubmVjdF9vcCogbygKLSAgICAgICAgc3RhdGljX2Nhc3Q8d2luX2lvY3Bfc29ja2V0X2Nvbm5lY3Rfb3AqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKG8tPmhhbmRsZXJfKSwgbywgbyB9OwotCi0gICAgaWYgKG93bmVyKQotICAgIHsKLSAgICAgIGlmIChvLT5jb25uZWN0X2V4XykKLSAgICAgICAgc29ja2V0X29wczo6Y29tcGxldGVfaW9jcF9jb25uZWN0KG8tPnNvY2tldF8sIGVjKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZWMgPSBvLT5lY187Ci0gICAgfQotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBkZXRhaWw6OmJpbmRlcjE8SGFuZGxlciwgYXNpbzo6ZXJyb3JfY29kZT4KLSAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIGVjKTsKLSAgICBwLmggPSBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICBwLnJlc2V0KCk7Ci0KLSAgICAvLyBNYWtlIHRoZSB1cGNhbGwgaWYgcmVxdWlyZWQuCi0gICAgaWYgKG93bmVyKQotICAgIHsKLSAgICAgIGZlbmNlZF9ibG9jayBiKGZlbmNlZF9ibG9jazo6aGFsZik7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9CRUdJTigoaGFuZGxlci5hcmcxXykpOwotICAgICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoaGFuZGxlciwgaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgICBBU0lPX0hBTkRMRVJfSU5WT0NBVElPTl9FTkQ7Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9DT05ORUNUX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfcmVjdl9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9yZWN2X29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2NjdmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9yZWN2X29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9yZWN2X29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5fSU9DUF9TT0NLRVRfUkVDVl9PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOX0lPQ1BfU09DS0VUX1JFQ1ZfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyB3aW5faW9jcF9zb2NrZXRfcmVjdl9vcCA6IHB1YmxpYyBvcGVyYXRpb24KLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIod2luX2lvY3Bfc29ja2V0X3JlY3Zfb3ApOwotCi0gIHdpbl9pb2NwX3NvY2tldF9yZWN2X29wKHNvY2tldF9vcHM6OnN0YXRlX3R5cGUgc3RhdGUsCi0gICAgICBzb2NrZXRfb3BzOjp3ZWFrX2NhbmNlbF90b2tlbl90eXBlIGNhbmNlbF90b2tlbiwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgSGFuZGxlciYgaGFuZGxlcikKLSAgICA6IG9wZXJhdGlvbigmd2luX2lvY3Bfc29ja2V0X3JlY3Zfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIHN0YXRlXyhzdGF0ZSksCi0gICAgICBjYW5jZWxfdG9rZW5fKGNhbmNlbF90b2tlbiksCi0gICAgICBidWZmZXJzXyhidWZmZXJzKSwKLSAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKGhhbmRsZXIpKQotICB7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBkb19jb21wbGV0ZShpb19zZXJ2aWNlX2ltcGwqIG93bmVyLCBvcGVyYXRpb24qIGJhc2UsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiByZXN1bHRfZWMsCi0gICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMocmVzdWx0X2VjKTsKLQotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBvcGVyYXRpb24gb2JqZWN0LgotICAgIHdpbl9pb2NwX3NvY2tldF9yZWN2X29wKiBvKHN0YXRpY19jYXN0PHdpbl9pb2NwX3NvY2tldF9yZWN2X29wKj4oYmFzZSkpOwotICAgIHB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihvLT5oYW5kbGVyXyksIG8sIG8gfTsKLQotICAgIEFTSU9fSEFORExFUl9DT01QTEVUSU9OKChvKSk7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gICAgLy8gQ2hlY2sgd2hldGhlciBidWZmZXJzIGFyZSBzdGlsbCB2YWxpZC4KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6bXV0YWJsZV9idWZmZXIsCi0gICAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPjo6dmFsaWRhdGUoby0+YnVmZmVyc18pOwotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0KLSAgICBzb2NrZXRfb3BzOjpjb21wbGV0ZV9pb2NwX3JlY3Yoby0+c3RhdGVfLCBvLT5jYW5jZWxfdG9rZW5fLAotICAgICAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+OjphbGxfZW1wdHkoby0+YnVmZmVyc18pLAotICAgICAgICBlYywgYnl0ZXNfdHJhbnNmZXJyZWQpOwotCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBkZWFsbG9jYXRlZCBiZWZvcmUKLSAgICAvLyB0aGUgdXBjYWxsIGlzIG1hZGUuIEV2ZW4gaWYgd2UncmUgbm90IGFib3V0IHRvIG1ha2UgYW4gdXBjYWxsLCBhCi0gICAgLy8gc3ViLW9iamVjdCBvZiB0aGUgaGFuZGxlciBtYXkgYmUgdGhlIHRydWUgb3duZXIgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkCi0gICAgLy8gd2l0aCB0aGUgaGFuZGxlci4gQ29uc2VxdWVudGx5LCBhIGxvY2FsIGNvcHkgb2YgdGhlIGhhbmRsZXIgaXMgcmVxdWlyZWQKLSAgICAvLyB0byBlbnN1cmUgdGhhdCBhbnkgb3duaW5nIHN1Yi1vYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlciB3ZSBoYXZlCi0gICAgLy8gZGVhbGxvY2F0ZWQgdGhlIG1lbW9yeSBoZXJlLgotICAgIGRldGFpbDo6YmluZGVyMjxIYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdD4KLSAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIGVjLCBieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sIGhhbmRsZXIuYXJnMl8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBzb2NrZXRfb3BzOjpzdGF0ZV90eXBlIHN0YXRlXzsKLSAgc29ja2V0X29wczo6d2Vha19jYW5jZWxfdG9rZW5fdHlwZSBjYW5jZWxfdG9rZW5fOwotICBNdXRhYmxlQnVmZmVyU2VxdWVuY2UgYnVmZmVyc187Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9SRUNWX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfcmVjdmZyb21fb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfcmVjdmZyb21fb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTIyZDdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3JlY3Zmcm9tX29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9yZWN2ZnJvbV9vcC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9SRUNWRlJPTV9PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOX0lPQ1BfU09DS0VUX1JFQ1ZGUk9NX09QX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BlcmF0aW9uLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfb3BzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBFbmRwb2ludCwgdHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIHdpbl9pb2NwX3NvY2tldF9yZWN2ZnJvbV9vcCA6IHB1YmxpYyBvcGVyYXRpb24KLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIod2luX2lvY3Bfc29ja2V0X3JlY3Zmcm9tX29wKTsKLQotICB3aW5faW9jcF9zb2NrZXRfcmVjdmZyb21fb3AoRW5kcG9pbnQmIGVuZHBvaW50LAotICAgICAgc29ja2V0X29wczo6d2Vha19jYW5jZWxfdG9rZW5fdHlwZSBjYW5jZWxfdG9rZW4sCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiBvcGVyYXRpb24oJndpbl9pb2NwX3NvY2tldF9yZWN2ZnJvbV9vcDo6ZG9fY29tcGxldGUpLAotICAgICAgZW5kcG9pbnRfKGVuZHBvaW50KSwKLSAgICAgIGVuZHBvaW50X3NpemVfKHN0YXRpY19jYXN0PGludD4oZW5kcG9pbnQuY2FwYWNpdHkoKSkpLAotICAgICAgY2FuY2VsX3Rva2VuXyhjYW5jZWxfdG9rZW4pLAotICAgICAgYnVmZmVyc18oYnVmZmVycyksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSAgaW50JiBlbmRwb2ludF9zaXplKCkKLSAgewotICAgIHJldHVybiBlbmRwb2ludF9zaXplXzsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIHJlc3VsdF9lYywKLSAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhyZXN1bHRfZWMpOwotCi0gICAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIG9wZXJhdGlvbiBvYmplY3QuCi0gICAgd2luX2lvY3Bfc29ja2V0X3JlY3Zmcm9tX29wKiBvKAotICAgICAgICBzdGF0aWNfY2FzdDx3aW5faW9jcF9zb2NrZXRfcmVjdmZyb21fb3AqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKG8tPmhhbmRsZXJfKSwgbywgbyB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORykKLSAgICAvLyBDaGVjayB3aGV0aGVyIGJ1ZmZlcnMgYXJlIHN0aWxsIHZhbGlkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ojp2YWxpZGF0ZShvLT5idWZmZXJzXyk7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORykKLQotICAgIHNvY2tldF9vcHM6OmNvbXBsZXRlX2lvY3BfcmVjdmZyb20oby0+Y2FuY2VsX3Rva2VuXywgZWMpOwotCi0gICAgLy8gUmVjb3JkIHRoZSBzaXplIG9mIHRoZSBlbmRwb2ludCByZXR1cm5lZCBieSB0aGUgb3BlcmF0aW9uLgotICAgIG8tPmVuZHBvaW50Xy5yZXNpemUoby0+ZW5kcG9pbnRfc2l6ZV8pOwotCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBkZWFsbG9jYXRlZCBiZWZvcmUKLSAgICAvLyB0aGUgdXBjYWxsIGlzIG1hZGUuIEV2ZW4gaWYgd2UncmUgbm90IGFib3V0IHRvIG1ha2UgYW4gdXBjYWxsLCBhCi0gICAgLy8gc3ViLW9iamVjdCBvZiB0aGUgaGFuZGxlciBtYXkgYmUgdGhlIHRydWUgb3duZXIgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkCi0gICAgLy8gd2l0aCB0aGUgaGFuZGxlci4gQ29uc2VxdWVudGx5LCBhIGxvY2FsIGNvcHkgb2YgdGhlIGhhbmRsZXIgaXMgcmVxdWlyZWQKLSAgICAvLyB0byBlbnN1cmUgdGhhdCBhbnkgb3duaW5nIHN1Yi1vYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlciB3ZSBoYXZlCi0gICAgLy8gZGVhbGxvY2F0ZWQgdGhlIG1lbW9yeSBoZXJlLgotICAgIGRldGFpbDo6YmluZGVyMjxIYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdD4KLSAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIGVjLCBieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sIGhhbmRsZXIuYXJnMl8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBFbmRwb2ludCYgZW5kcG9pbnRfOwotICBpbnQgZW5kcG9pbnRfc2l6ZV87Ci0gIHNvY2tldF9vcHM6OndlYWtfY2FuY2VsX3Rva2VuX3R5cGUgY2FuY2VsX3Rva2VuXzsKLSAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlIGJ1ZmZlcnNfOwotICBIYW5kbGVyIGhhbmRsZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5fSU9DUF9TT0NLRVRfUkVDVkZST01fT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9yZWN2bXNnX29wLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3JlY3Ztc2dfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzg3NDFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3JlY3Ztc2dfb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2luX2lvY3Bfc29ja2V0X3JlY3Ztc2dfb3AuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9SRUNWTVNHX09QX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5fSU9DUF9TT0NLRVRfUkVDVk1TR19PUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL29wZXJhdGlvbi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9zb2NrZXRfYmFzZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIHdpbl9pb2NwX3NvY2tldF9yZWN2bXNnX29wIDogcHVibGljIG9wZXJhdGlvbgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUih3aW5faW9jcF9zb2NrZXRfcmVjdm1zZ19vcCk7Ci0KLSAgd2luX2lvY3Bfc29ja2V0X3JlY3Ztc2dfb3AoCi0gICAgICBzb2NrZXRfb3BzOjp3ZWFrX2NhbmNlbF90b2tlbl90eXBlIGNhbmNlbF90b2tlbiwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiBvdXRfZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiBvcGVyYXRpb24oJndpbl9pb2NwX3NvY2tldF9yZWN2bXNnX29wOjpkb19jb21wbGV0ZSksCi0gICAgICBjYW5jZWxfdG9rZW5fKGNhbmNlbF90b2tlbiksCi0gICAgICBidWZmZXJzXyhidWZmZXJzKSwKLSAgICAgIG91dF9mbGFnc18ob3V0X2ZsYWdzKSwKLSAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKGhhbmRsZXIpKQotICB7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBkb19jb21wbGV0ZShpb19zZXJ2aWNlX2ltcGwqIG93bmVyLCBvcGVyYXRpb24qIGJhc2UsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiByZXN1bHRfZWMsCi0gICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMocmVzdWx0X2VjKTsKLQotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBvcGVyYXRpb24gb2JqZWN0LgotICAgIHdpbl9pb2NwX3NvY2tldF9yZWN2bXNnX29wKiBvKAotICAgICAgICBzdGF0aWNfY2FzdDx3aW5faW9jcF9zb2NrZXRfcmVjdm1zZ19vcCo+KGJhc2UpKTsKLSAgICBwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2Yoby0+aGFuZGxlcl8pLCBvLCBvIH07Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ09NUExFVElPTigobykpOwotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotICAgIC8vIENoZWNrIHdoZXRoZXIgYnVmZmVycyBhcmUgc3RpbGwgdmFsaWQuCi0gICAgaWYgKG93bmVyKQotICAgIHsKLSAgICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86Om11dGFibGVfYnVmZmVyLAotICAgICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZT46OnZhbGlkYXRlKG8tPmJ1ZmZlcnNfKTsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotCi0gICAgc29ja2V0X29wczo6Y29tcGxldGVfaW9jcF9yZWN2bXNnKG8tPmNhbmNlbF90b2tlbl8sIGVjKTsKLSAgICBvLT5vdXRfZmxhZ3NfID0gMDsKLQotICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIHNvIHRoYXQgdGhlIG1lbW9yeSBjYW4gYmUgZGVhbGxvY2F0ZWQgYmVmb3JlCi0gICAgLy8gdGhlIHVwY2FsbCBpcyBtYWRlLiBFdmVuIGlmIHdlJ3JlIG5vdCBhYm91dCB0byBtYWtlIGFuIHVwY2FsbCwgYQotICAgIC8vIHN1Yi1vYmplY3Qgb2YgdGhlIGhhbmRsZXIgbWF5IGJlIHRoZSB0cnVlIG93bmVyIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIGhhbmRsZXIuIENvbnNlcXVlbnRseSwgYSBsb2NhbCBjb3B5IG9mIHRoZSBoYW5kbGVyIGlzIHJlcXVpcmVkCi0gICAgLy8gdG8gZW5zdXJlIHRoYXQgYW55IG93bmluZyBzdWItb2JqZWN0IHJlbWFpbnMgdmFsaWQgdW50aWwgYWZ0ZXIgd2UgaGF2ZQotICAgIC8vIGRlYWxsb2NhdGVkIHRoZSBtZW1vcnkgaGVyZS4KLSAgICBkZXRhaWw6OmJpbmRlcjI8SGFuZGxlciwgYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3Q+Ci0gICAgICBoYW5kbGVyKG8tPmhhbmRsZXJfLCBlYywgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIHAuaCA9IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIuaGFuZGxlcl8pOwotICAgIHAucmVzZXQoKTsKLQotICAgIC8vIE1ha2UgdGhlIHVwY2FsbCBpZiByZXF1aXJlZC4KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgZmVuY2VkX2Jsb2NrIGIoZmVuY2VkX2Jsb2NrOjpoYWxmKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKChoYW5kbGVyLmFyZzFfLCBoYW5kbGVyLmFyZzJfKSk7Ci0gICAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoYW5kbGVyLCBoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0VORDsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgc29ja2V0X29wczo6d2Vha19jYW5jZWxfdG9rZW5fdHlwZSBjYW5jZWxfdG9rZW5fOwotICBNdXRhYmxlQnVmZmVyU2VxdWVuY2UgYnVmZmVyc187Ci0gIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiBvdXRfZmxhZ3NfOwotICBIYW5kbGVyIGhhbmRsZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5fSU9DUF9TT0NLRVRfUkVDVk1TR19PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3NlbmRfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfc2VuZF9vcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MGM3MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfc2VuZF9vcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5faW9jcF9zb2NrZXRfc2VuZF9vcC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOX0lPQ1BfU09DS0VUX1NFTkRfT1BfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9TRU5EX09QX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvb3BlcmF0aW9uLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfb3BzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIHdpbl9pb2NwX3NvY2tldF9zZW5kX29wIDogcHVibGljIG9wZXJhdGlvbgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUih3aW5faW9jcF9zb2NrZXRfc2VuZF9vcCk7Ci0KLSAgd2luX2lvY3Bfc29ja2V0X3NlbmRfb3Aoc29ja2V0X29wczo6d2Vha19jYW5jZWxfdG9rZW5fdHlwZSBjYW5jZWxfdG9rZW4sCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogb3BlcmF0aW9uKCZ3aW5faW9jcF9zb2NrZXRfc2VuZF9vcDo6ZG9fY29tcGxldGUpLAotICAgICAgY2FuY2VsX3Rva2VuXyhjYW5jZWxfdG9rZW4pLAotICAgICAgYnVmZmVyc18oYnVmZmVycyksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgcmVzdWx0X2VjLAotICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjKHJlc3VsdF9lYyk7Ci0KLSAgICAvLyBUYWtlIG93bmVyc2hpcCBvZiB0aGUgb3BlcmF0aW9uIG9iamVjdC4KLSAgICB3aW5faW9jcF9zb2NrZXRfc2VuZF9vcCogbyhzdGF0aWNfY2FzdDx3aW5faW9jcF9zb2NrZXRfc2VuZF9vcCo+KGJhc2UpKTsKLSAgICBwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2Yoby0+aGFuZGxlcl8pLCBvLCBvIH07Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ09NUExFVElPTigobykpOwotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotICAgIC8vIENoZWNrIHdoZXRoZXIgYnVmZmVycyBhcmUgc3RpbGwgdmFsaWQuCi0gICAgaWYgKG93bmVyKQotICAgIHsKLSAgICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86OmNvbnN0X2J1ZmZlciwKLSAgICAgICAgICBDb25zdEJ1ZmZlclNlcXVlbmNlPjo6dmFsaWRhdGUoby0+YnVmZmVyc18pOwotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0KLSAgICBzb2NrZXRfb3BzOjpjb21wbGV0ZV9pb2NwX3NlbmQoby0+Y2FuY2VsX3Rva2VuXywgZWMpOwotCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBkZWFsbG9jYXRlZCBiZWZvcmUKLSAgICAvLyB0aGUgdXBjYWxsIGlzIG1hZGUuIEV2ZW4gaWYgd2UncmUgbm90IGFib3V0IHRvIG1ha2UgYW4gdXBjYWxsLCBhCi0gICAgLy8gc3ViLW9iamVjdCBvZiB0aGUgaGFuZGxlciBtYXkgYmUgdGhlIHRydWUgb3duZXIgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkCi0gICAgLy8gd2l0aCB0aGUgaGFuZGxlci4gQ29uc2VxdWVudGx5LCBhIGxvY2FsIGNvcHkgb2YgdGhlIGhhbmRsZXIgaXMgcmVxdWlyZWQKLSAgICAvLyB0byBlbnN1cmUgdGhhdCBhbnkgb3duaW5nIHN1Yi1vYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlciB3ZSBoYXZlCi0gICAgLy8gZGVhbGxvY2F0ZWQgdGhlIG1lbW9yeSBoZXJlLgotICAgIGRldGFpbDo6YmluZGVyMjxIYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdD4KLSAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIGVjLCBieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sIGhhbmRsZXIuYXJnMl8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBzb2NrZXRfb3BzOjp3ZWFrX2NhbmNlbF90b2tlbl90eXBlIGNhbmNlbF90b2tlbl87Ci0gIENvbnN0QnVmZmVyU2VxdWVuY2UgYnVmZmVyc187Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9TRU5EX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfc2VydmljZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzMjY5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyNSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5fSU9DUF9TT0NLRVRfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOX0lPQ1BfU09DS0VUX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9zb2NrZXRfYmFzZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbXV0ZXguaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL29wZXJhdGlvbi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3Rvcl9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X2hvbGRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9udWxsX2J1ZmZlcnNfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9hY2NlcHRfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9jb25uZWN0X29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfcmVjdmZyb21fb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9zZW5kX29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci1jbGFzcyB3aW5faW9jcF9zb2NrZXRfc2VydmljZSA6IHB1YmxpYyB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBwcm90b2NvbCB0eXBlLgotICB0eXBlZGVmIFByb3RvY29sIHByb3RvY29sX3R5cGU7Ci0KLSAgLy8gVGhlIGVuZHBvaW50IHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLSAgLy8gVGhlIG5hdGl2ZSB0eXBlIG9mIGEgc29ja2V0LgotICBjbGFzcyBuYXRpdmVfaGFuZGxlX3R5cGUKLSAgewotICBwdWJsaWM6Ci0gICAgbmF0aXZlX2hhbmRsZV90eXBlKHNvY2tldF90eXBlIHMpCi0gICAgICA6IHNvY2tldF8ocyksCi0gICAgICAgIGhhdmVfcmVtb3RlX2VuZHBvaW50XyhmYWxzZSkKLSAgICB7Ci0gICAgfQotCi0gICAgbmF0aXZlX2hhbmRsZV90eXBlKHNvY2tldF90eXBlIHMsIGNvbnN0IGVuZHBvaW50X3R5cGUmIGVwKQotICAgICAgOiBzb2NrZXRfKHMpLAotICAgICAgICBoYXZlX3JlbW90ZV9lbmRwb2ludF8odHJ1ZSksCi0gICAgICAgIHJlbW90ZV9lbmRwb2ludF8oZXApCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgb3BlcmF0b3I9KHNvY2tldF90eXBlIHMpCi0gICAgewotICAgICAgc29ja2V0XyA9IHM7Ci0gICAgICBoYXZlX3JlbW90ZV9lbmRwb2ludF8gPSBmYWxzZTsKLSAgICAgIHJlbW90ZV9lbmRwb2ludF8gPSBlbmRwb2ludF90eXBlKCk7Ci0gICAgfQotCi0gICAgb3BlcmF0b3Igc29ja2V0X3R5cGUoKSBjb25zdAotICAgIHsKLSAgICAgIHJldHVybiBzb2NrZXRfOwotICAgIH0KLQotICAgIGJvb2wgaGF2ZV9yZW1vdGVfZW5kcG9pbnQoKSBjb25zdAotICAgIHsKLSAgICAgIHJldHVybiBoYXZlX3JlbW90ZV9lbmRwb2ludF87Ci0gICAgfQotCi0gICAgZW5kcG9pbnRfdHlwZSByZW1vdGVfZW5kcG9pbnQoKSBjb25zdAotICAgIHsKLSAgICAgIHJldHVybiByZW1vdGVfZW5kcG9pbnRfOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHNvY2tldF90eXBlIHNvY2tldF87Ci0gICAgYm9vbCBoYXZlX3JlbW90ZV9lbmRwb2ludF87Ci0gICAgZW5kcG9pbnRfdHlwZSByZW1vdGVfZW5kcG9pbnRfOwotICB9OwotCi0gIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiB0eXBlIG9mIHRoZSBzb2NrZXQuCi0gIHN0cnVjdCBpbXBsZW1lbnRhdGlvbl90eXBlIDoKLSAgICB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlOjpiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUKLSAgewotICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgaW1wbGVtZW50YXRpb25fdHlwZSgpCi0gICAgICA6IHByb3RvY29sXyhlbmRwb2ludF90eXBlKCkucHJvdG9jb2woKSksCi0gICAgICAgIGhhdmVfcmVtb3RlX2VuZHBvaW50XyhmYWxzZSksCi0gICAgICAgIHJlbW90ZV9lbmRwb2ludF8oKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBUaGUgcHJvdG9jb2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2NrZXQuCi0gICAgcHJvdG9jb2xfdHlwZSBwcm90b2NvbF87Ci0KLSAgICAvLyBXaGV0aGVyIHdlIGhhdmUgYSBjYWNoZWQgcmVtb3RlIGVuZHBvaW50LgotICAgIGJvb2wgaGF2ZV9yZW1vdGVfZW5kcG9pbnRfOwotCi0gICAgLy8gQSBjYWNoZWQgcmVtb3RlIGVuZHBvaW50LgotICAgIGVuZHBvaW50X3R5cGUgcmVtb3RlX2VuZHBvaW50XzsKLSAgfTsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2UoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2UoaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8gTW92ZS1jb25zdHJ1Y3QgYSBuZXcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotICB7Ci0gICAgdGhpcy0+YmFzZV9tb3ZlX2NvbnN0cnVjdChpbXBsLCBvdGhlcl9pbXBsKTsKLQotICAgIGltcGwucHJvdG9jb2xfID0gb3RoZXJfaW1wbC5wcm90b2NvbF87Ci0gICAgb3RoZXJfaW1wbC5wcm90b2NvbF8gPSBlbmRwb2ludF90eXBlKCkucHJvdG9jb2woKTsKLQotICAgIGltcGwuaGF2ZV9yZW1vdGVfZW5kcG9pbnRfID0gb3RoZXJfaW1wbC5oYXZlX3JlbW90ZV9lbmRwb2ludF87Ci0gICAgb3RoZXJfaW1wbC5oYXZlX3JlbW90ZV9lbmRwb2ludF8gPSBmYWxzZTsKLQotICAgIGltcGwucmVtb3RlX2VuZHBvaW50XyA9IG90aGVyX2ltcGwucmVtb3RlX2VuZHBvaW50XzsKLSAgICBvdGhlcl9pbXBsLnJlbW90ZV9lbmRwb2ludF8gPSBlbmRwb2ludF90eXBlKCk7Ci0gIH0KLQotICAvLyBNb3ZlLWFzc2lnbiBmcm9tIGFub3RoZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICB3aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlJiBvdGhlcl9zZXJ2aWNlLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHRoaXMtPmJhc2VfbW92ZV9hc3NpZ24oaW1wbCwgb3RoZXJfc2VydmljZSwgb3RoZXJfaW1wbCk7Ci0KLSAgICBpbXBsLnByb3RvY29sXyA9IG90aGVyX2ltcGwucHJvdG9jb2xfOwotICAgIG90aGVyX2ltcGwucHJvdG9jb2xfID0gZW5kcG9pbnRfdHlwZSgpLnByb3RvY29sKCk7Ci0KLSAgICBpbXBsLmhhdmVfcmVtb3RlX2VuZHBvaW50XyA9IG90aGVyX2ltcGwuaGF2ZV9yZW1vdGVfZW5kcG9pbnRfOwotICAgIG90aGVyX2ltcGwuaGF2ZV9yZW1vdGVfZW5kcG9pbnRfID0gZmFsc2U7Ci0KLSAgICBpbXBsLnJlbW90ZV9lbmRwb2ludF8gPSBvdGhlcl9pbXBsLnJlbW90ZV9lbmRwb2ludF87Ci0gICAgb3RoZXJfaW1wbC5yZW1vdGVfZW5kcG9pbnRfID0gZW5kcG9pbnRfdHlwZSgpOwotICB9Ci0KLSAgLy8gTW92ZS1jb25zdHJ1Y3QgYSBuZXcgc29ja2V0IGltcGxlbWVudGF0aW9uIGZyb20gYW5vdGhlciBwcm90b2NvbCB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxPgotICB2b2lkIGNvbnZlcnRpbmdfbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHR5cGVuYW1lIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlPAotICAgICAgICBQcm90b2NvbDE+OjppbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotICB7Ci0gICAgdGhpcy0+YmFzZV9tb3ZlX2NvbnN0cnVjdChpbXBsLCBvdGhlcl9pbXBsKTsKLQotICAgIGltcGwucHJvdG9jb2xfID0gcHJvdG9jb2xfdHlwZShvdGhlcl9pbXBsLnByb3RvY29sXyk7Ci0gICAgb3RoZXJfaW1wbC5wcm90b2NvbF8gPSB0eXBlbmFtZSBQcm90b2NvbDE6OmVuZHBvaW50KCkucHJvdG9jb2woKTsKLQotICAgIGltcGwuaGF2ZV9yZW1vdGVfZW5kcG9pbnRfID0gb3RoZXJfaW1wbC5oYXZlX3JlbW90ZV9lbmRwb2ludF87Ci0gICAgb3RoZXJfaW1wbC5oYXZlX3JlbW90ZV9lbmRwb2ludF8gPSBmYWxzZTsKLQotICAgIGltcGwucmVtb3RlX2VuZHBvaW50XyA9IG90aGVyX2ltcGwucmVtb3RlX2VuZHBvaW50XzsKLSAgICBvdGhlcl9pbXBsLnJlbW90ZV9lbmRwb2ludF8gPSB0eXBlbmFtZSBQcm90b2NvbDE6OmVuZHBvaW50KCk7Ci0gIH0KLQotICAvLyBPcGVuIGEgbmV3IHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBvcGVuKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBpZiAoIWRvX29wZW4oaW1wbCwgcHJvdG9jb2wuZmFtaWx5KCksCi0gICAgICAgICAgcHJvdG9jb2wudHlwZSgpLCBwcm90b2NvbC5wcm90b2NvbCgpLCBlYykpCi0gICAgewotICAgICAgaW1wbC5wcm90b2NvbF8gPSBwcm90b2NvbDsKLSAgICAgIGltcGwuaGF2ZV9yZW1vdGVfZW5kcG9pbnRfID0gZmFsc2U7Ci0gICAgICBpbXBsLnJlbW90ZV9lbmRwb2ludF8gPSBlbmRwb2ludF90eXBlKCk7Ci0gICAgfQotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIEFzc2lnbiBhIG5hdGl2ZSBzb2NrZXQgdG8gYSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBuYXRpdmVfc29ja2V0LAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBpZiAoIWRvX2Fzc2lnbihpbXBsLCBwcm90b2NvbC50eXBlKCksIG5hdGl2ZV9zb2NrZXQsIGVjKSkKLSAgICB7Ci0gICAgICBpbXBsLnByb3RvY29sXyA9IHByb3RvY29sOwotICAgICAgaW1wbC5oYXZlX3JlbW90ZV9lbmRwb2ludF8gPSBuYXRpdmVfc29ja2V0LmhhdmVfcmVtb3RlX2VuZHBvaW50KCk7Ci0gICAgICBpbXBsLnJlbW90ZV9lbmRwb2ludF8gPSBuYXRpdmVfc29ja2V0LnJlbW90ZV9lbmRwb2ludCgpOwotICAgIH0KLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBHZXQgdGhlIG5hdGl2ZSBzb2NrZXQgcmVwcmVzZW50YXRpb24uCi0gIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBpZiAoaW1wbC5oYXZlX3JlbW90ZV9lbmRwb2ludF8pCi0gICAgICByZXR1cm4gbmF0aXZlX2hhbmRsZV90eXBlKGltcGwuc29ja2V0XywgaW1wbC5yZW1vdGVfZW5kcG9pbnRfKTsKLSAgICByZXR1cm4gbmF0aXZlX2hhbmRsZV90eXBlKGltcGwuc29ja2V0Xyk7Ci0gIH0KLQotICAvLyBCaW5kIHRoZSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhbCBlbmRwb2ludC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBiaW5kKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBzb2NrZXRfb3BzOjpiaW5kKGltcGwuc29ja2V0XywgZW5kcG9pbnQuZGF0YSgpLCBlbmRwb2ludC5zaXplKCksIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBTZXQgYSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIHNldF9vcHRpb24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE9wdGlvbiYgb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHNvY2tldF9vcHM6OnNldHNvY2tvcHQoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywKLSAgICAgICAgb3B0aW9uLmxldmVsKGltcGwucHJvdG9jb2xfKSwgb3B0aW9uLm5hbWUoaW1wbC5wcm90b2NvbF8pLAotICAgICAgICBvcHRpb24uZGF0YShpbXBsLnByb3RvY29sXyksIG9wdGlvbi5zaXplKGltcGwucHJvdG9jb2xfKSwgZWMpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFNldCBhIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgZ2V0X29wdGlvbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgT3B0aW9uJiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgc3RkOjpzaXplX3Qgc2l6ZSA9IG9wdGlvbi5zaXplKGltcGwucHJvdG9jb2xfKTsKLSAgICBzb2NrZXRfb3BzOjpnZXRzb2Nrb3B0KGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sCi0gICAgICAgIG9wdGlvbi5sZXZlbChpbXBsLnByb3RvY29sXyksIG9wdGlvbi5uYW1lKGltcGwucHJvdG9jb2xfKSwKLSAgICAgICAgb3B0aW9uLmRhdGEoaW1wbC5wcm90b2NvbF8pLCAmc2l6ZSwgZWMpOwotICAgIGlmICghZWMpCi0gICAgICBvcHRpb24ucmVzaXplKGltcGwucHJvdG9jb2xfLCBzaXplKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGxvY2FsIGVuZHBvaW50LgotICBlbmRwb2ludF90eXBlIGxvY2FsX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIGVuZHBvaW50X3R5cGUgZW5kcG9pbnQ7Ci0gICAgc3RkOjpzaXplX3QgYWRkcl9sZW4gPSBlbmRwb2ludC5jYXBhY2l0eSgpOwotICAgIGlmIChzb2NrZXRfb3BzOjpnZXRzb2NrbmFtZShpbXBsLnNvY2tldF8sIGVuZHBvaW50LmRhdGEoKSwgJmFkZHJfbGVuLCBlYykpCi0gICAgICByZXR1cm4gZW5kcG9pbnRfdHlwZSgpOwotICAgIGVuZHBvaW50LnJlc2l6ZShhZGRyX2xlbik7Ci0gICAgcmV0dXJuIGVuZHBvaW50OwotICB9Ci0KLSAgLy8gR2V0IHRoZSByZW1vdGUgZW5kcG9pbnQuCi0gIGVuZHBvaW50X3R5cGUgcmVtb3RlX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIGVuZHBvaW50X3R5cGUgZW5kcG9pbnQgPSBpbXBsLnJlbW90ZV9lbmRwb2ludF87Ci0gICAgc3RkOjpzaXplX3QgYWRkcl9sZW4gPSBlbmRwb2ludC5jYXBhY2l0eSgpOwotICAgIGlmIChzb2NrZXRfb3BzOjpnZXRwZWVybmFtZShpbXBsLnNvY2tldF8sIGVuZHBvaW50LmRhdGEoKSwKLSAgICAgICAgICAmYWRkcl9sZW4sIGltcGwuaGF2ZV9yZW1vdGVfZW5kcG9pbnRfLCBlYykpCi0gICAgICByZXR1cm4gZW5kcG9pbnRfdHlwZSgpOwotICAgIGVuZHBvaW50LnJlc2l6ZShhZGRyX2xlbik7Ci0gICAgcmV0dXJuIGVuZHBvaW50OwotICB9Ci0KLSAgLy8gU2VuZCBhIGRhdGFncmFtIHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcwotICAvLyBzZW50LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc2l6ZV90IHNlbmRfdG8oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIGRlc3RpbmF0aW9uLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6Y29uc3RfYnVmZmVyLAotICAgICAgICBDb25zdEJ1ZmZlclNlcXVlbmNlPiBidWZzKGJ1ZmZlcnMpOwotCi0gICAgcmV0dXJuIHNvY2tldF9vcHM6OnN5bmNfc2VuZHRvKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sCi0gICAgICAgIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksIGZsYWdzLAotICAgICAgICBkZXN0aW5hdGlvbi5kYXRhKCksIGRlc3RpbmF0aW9uLnNpemUoKSwgZWMpOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCBkYXRhIGNhbiBiZSBzZW50IHdpdGhvdXQgYmxvY2tpbmcuCi0gIHNpemVfdCBzZW5kX3RvKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGNvbnN0IG51bGxfYnVmZmVycyYsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIC8vIFdhaXQgZm9yIHNvY2tldCB0byBiZWNvbWUgcmVhZHkuCi0gICAgc29ja2V0X29wczo6cG9sbF93cml0ZShpbXBsLnNvY2tldF8sIGltcGwuc3RhdGVfLCBlYyk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBzZW5kLiBUaGUgZGF0YSBiZWluZyBzZW50IG11c3QgYmUgdmFsaWQgZm9yIHRoZQotICAvLyBsaWZldGltZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfc2VuZF90byhpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgY29uc3QgZW5kcG9pbnRfdHlwZSYgZGVzdGluYXRpb24sCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiB3aW5faW9jcF9zb2NrZXRfc2VuZF9vcDxDb25zdEJ1ZmZlclNlcXVlbmNlLCBIYW5kbGVyPiBvcDsKLSAgICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplb2Yob3ApLCBoYW5kbGVyKSwgMCB9OwotICAgIHAucCA9IG5ldyAocC52KSBvcChpbXBsLmNhbmNlbF90b2tlbl8sIGJ1ZmZlcnMsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLCAmaW1wbCwgImFzeW5jX3NlbmRfdG8iKSk7Ci0KLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjpjb25zdF9idWZmZXIsCi0gICAgICAgIENvbnN0QnVmZmVyU2VxdWVuY2U+IGJ1ZnMoYnVmZmVycyk7Ci0KLSAgICBzdGFydF9zZW5kX3RvX29wKGltcGwsIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksCi0gICAgICAgIGRlc3RpbmF0aW9uLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihkZXN0aW5hdGlvbi5zaXplKCkpLAotICAgICAgICBmbGFncywgcC5wKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdhaXQgdW50aWwgZGF0YSBjYW4gYmUgc2VudCB3aXRob3V0IGJsb2NraW5nLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19zZW5kX3RvKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGNvbnN0IG51bGxfYnVmZmVycyYsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgd2luX2lvY3BfbnVsbF9idWZmZXJzX29wPEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGltcGwuY2FuY2VsX3Rva2VuXywgaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgInNvY2tldCIsCi0gICAgICAgICAgJmltcGwsICJhc3luY19zZW5kX3RvKG51bGxfYnVmZmVycykiKSk7Ci0KLSAgICBzdGFydF9yZWFjdG9yX29wKGltcGwsIHJlYWN0b3I6OndyaXRlX29wLCBwLnApOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBSZWNlaXZlIGEgZGF0YWdyYW0gd2l0aCB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbmRlci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gIC8vIGJ5dGVzIHJlY2VpdmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzaXplX3QgcmVjZWl2ZV9mcm9tKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBlbmRwb2ludF90eXBlJiBzZW5kZXJfZW5kcG9pbnQsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPiBidWZzKGJ1ZmZlcnMpOwotCi0gICAgc3RkOjpzaXplX3QgYWRkcl9sZW4gPSBzZW5kZXJfZW5kcG9pbnQuY2FwYWNpdHkoKTsKLSAgICBzdGQ6OnNpemVfdCBieXRlc19yZWN2ZCA9IHNvY2tldF9vcHM6OnN5bmNfcmVjdmZyb20oCi0gICAgICAgIGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksCi0gICAgICAgIGZsYWdzLCBzZW5kZXJfZW5kcG9pbnQuZGF0YSgpLCAmYWRkcl9sZW4sIGVjKTsKLQotICAgIGlmICghZWMpCi0gICAgICBzZW5kZXJfZW5kcG9pbnQucmVzaXplKGFkZHJfbGVuKTsKLQotICAgIHJldHVybiBieXRlc19yZWN2ZDsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgZGF0YSBjYW4gYmUgcmVjZWl2ZWQgd2l0aG91dCBibG9ja2luZy4KLSAgc2l6ZV90IHJlY2VpdmVfZnJvbShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgbnVsbF9idWZmZXJzJiwgZW5kcG9pbnRfdHlwZSYgc2VuZGVyX2VuZHBvaW50LAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgLy8gV2FpdCBmb3Igc29ja2V0IHRvIGJlY29tZSByZWFkeS4KLSAgICBzb2NrZXRfb3BzOjpwb2xsX3JlYWQoaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywgZWMpOwotCi0gICAgLy8gUmVzZXQgZW5kcG9pbnQgc2luY2UgaXQgY2FuIGJlIGdpdmVuIG5vIHNlbnNpYmxlIHZhbHVlIGF0IHRoaXMgdGltZS4KLSAgICBzZW5kZXJfZW5kcG9pbnQgPSBlbmRwb2ludF90eXBlKCk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWNlaXZlLiBUaGUgYnVmZmVyIGZvciB0aGUgZGF0YSBiZWluZyByZWNlaXZlZCBhbmQKLSAgLy8gdGhlIHNlbmRlcl9lbmRwb2ludCBvYmplY3QgbXVzdCBib3RoIGJlIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlCi0gIC8vIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVjZWl2ZV9mcm9tKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGVuZHBvaW50X3R5cGUmIHNlbmRlcl9lbmRwLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgd2luX2lvY3Bfc29ja2V0X3JlY3Zmcm9tX29wPAotICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCBlbmRwb2ludF90eXBlLCBIYW5kbGVyPiBvcDsKLSAgICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplb2Yob3ApLCBoYW5kbGVyKSwgMCB9OwotICAgIHAucCA9IG5ldyAocC52KSBvcChzZW5kZXJfZW5kcCwgaW1wbC5jYW5jZWxfdG9rZW5fLCBidWZmZXJzLCBoYW5kbGVyKTsKLQotICAgIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAic29ja2V0IiwgJmltcGwsICJhc3luY19yZWNlaXZlX2Zyb20iKSk7Ci0KLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPiBidWZzKGJ1ZmZlcnMpOwotCi0gICAgc3RhcnRfcmVjZWl2ZV9mcm9tX29wKGltcGwsIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksCi0gICAgICAgIHNlbmRlcl9lbmRwLmRhdGEoKSwgZmxhZ3MsICZwLnAtPmVuZHBvaW50X3NpemUoKSwgcC5wKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCBkYXRhIGNhbiBiZSByZWNlaXZlZCB3aXRob3V0IGJsb2NraW5nLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19yZWNlaXZlX2Zyb20oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IG51bGxfYnVmZmVycyYsIGVuZHBvaW50X3R5cGUmIHNlbmRlcl9lbmRwb2ludCwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHdpbl9pb2NwX251bGxfYnVmZmVyc19vcDxIYW5kbGVyPiBvcDsKLSAgICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplb2Yob3ApLCBoYW5kbGVyKSwgMCB9OwotICAgIHAucCA9IG5ldyAocC52KSBvcChpbXBsLmNhbmNlbF90b2tlbl8sIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLCAmaW1wbCwKLSAgICAgICAgICAiYXN5bmNfcmVjZWl2ZV9mcm9tKG51bGxfYnVmZmVycykiKSk7Ci0KLSAgICAvLyBSZXNldCBlbmRwb2ludCBzaW5jZSBpdCBjYW4gYmUgZ2l2ZW4gbm8gc2Vuc2libGUgdmFsdWUgYXQgdGhpcyB0aW1lLgotICAgIHNlbmRlcl9lbmRwb2ludCA9IGVuZHBvaW50X3R5cGUoKTsKLQotICAgIHN0YXJ0X251bGxfYnVmZmVyc19yZWNlaXZlX29wKGltcGwsIGZsYWdzLCBwLnApOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBBY2NlcHQgYSBuZXcgY29ubmVjdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvY2tldD4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhY2NlcHQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgU29ja2V0JiBwZWVyLAotICAgICAgZW5kcG9pbnRfdHlwZSogcGVlcl9lbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICAvLyBXZSBjYW5ub3QgYWNjZXB0IGEgc29ja2V0IHRoYXQgaXMgYWxyZWFkeSBvcGVuLgotICAgIGlmIChwZWVyLmlzX29wZW4oKSkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjphbHJlYWR5X29wZW47Ci0gICAgICByZXR1cm4gZWM7Ci0gICAgfQotCi0gICAgc3RkOjpzaXplX3QgYWRkcl9sZW4gPSBwZWVyX2VuZHBvaW50ID8gcGVlcl9lbmRwb2ludC0+Y2FwYWNpdHkoKSA6IDA7Ci0gICAgc29ja2V0X2hvbGRlciBuZXdfc29ja2V0KHNvY2tldF9vcHM6OnN5bmNfYWNjZXB0KGltcGwuc29ja2V0XywKLSAgICAgICAgICBpbXBsLnN0YXRlXywgcGVlcl9lbmRwb2ludCA/IHBlZXJfZW5kcG9pbnQtPmRhdGEoKSA6IDAsCi0gICAgICAgICAgcGVlcl9lbmRwb2ludCA/ICZhZGRyX2xlbiA6IDAsIGVjKSk7Ci0KLSAgICAvLyBPbiBzdWNjZXNzLCBhc3NpZ24gbmV3IGNvbm5lY3Rpb24gdG8gcGVlciBzb2NrZXQgb2JqZWN0LgotICAgIGlmIChuZXdfc29ja2V0LmdldCgpICE9IGludmFsaWRfc29ja2V0KQotICAgIHsKLSAgICAgIGlmIChwZWVyX2VuZHBvaW50KQotICAgICAgICBwZWVyX2VuZHBvaW50LT5yZXNpemUoYWRkcl9sZW4pOwotICAgICAgaWYgKCFwZWVyLmFzc2lnbihpbXBsLnByb3RvY29sXywgbmV3X3NvY2tldC5nZXQoKSwgZWMpKQotICAgICAgICBuZXdfc29ja2V0LnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgYWNjZXB0LiBUaGUgcGVlciBhbmQgcGVlcl9lbmRwb2ludCBvYmplY3RzCi0gIC8vIG11c3QgYmUgdmFsaWQgdW50aWwgdGhlIGFjY2VwdCdzIGhhbmRsZXIgaXMgaW52b2tlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvY2tldCwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19hY2NlcHQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgU29ja2V0JiBwZWVyLAotICAgICAgZW5kcG9pbnRfdHlwZSogcGVlcl9lbmRwb2ludCwgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiB3aW5faW9jcF9zb2NrZXRfYWNjZXB0X29wPFNvY2tldCwgcHJvdG9jb2xfdHlwZSwgSGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBib29sIGVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWQgPQotICAgICAgKGltcGwuc3RhdGVfICYgc29ja2V0X29wczo6ZW5hYmxlX2Nvbm5lY3Rpb25fYWJvcnRlZCkgIT0gMDsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoKnRoaXMsIGltcGwuc29ja2V0XywgcGVlciwgaW1wbC5wcm90b2NvbF8sCi0gICAgICAgIHBlZXJfZW5kcG9pbnQsIGVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWQsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLCAmaW1wbCwgImFzeW5jX2FjY2VwdCIpKTsKLQotICAgIHN0YXJ0X2FjY2VwdF9vcChpbXBsLCBwZWVyLmlzX29wZW4oKSwgcC5wLT5uZXdfc29ja2V0KCksCi0gICAgICAgIGltcGwucHJvdG9jb2xfLmZhbWlseSgpLCBpbXBsLnByb3RvY29sXy50eXBlKCksCi0gICAgICAgIGltcGwucHJvdG9jb2xfLnByb3RvY29sKCksIHAucC0+b3V0cHV0X2J1ZmZlcigpLAotICAgICAgICBwLnAtPmFkZHJlc3NfbGVuZ3RoKCksIHAucCk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotCi0gIC8vIENvbm5lY3QgdGhlIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LgotICBhc2lvOjplcnJvcl9jb2RlIGNvbm5lY3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIHBlZXJfZW5kcG9pbnQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgc29ja2V0X29wczo6c3luY19jb25uZWN0KGltcGwuc29ja2V0XywKLSAgICAgICAgcGVlcl9lbmRwb2ludC5kYXRhKCksIHBlZXJfZW5kcG9pbnQuc2l6ZSgpLCBlYyk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIGNvbm5lY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX2Nvbm5lY3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIHBlZXJfZW5kcG9pbnQsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgd2luX2lvY3Bfc29ja2V0X2Nvbm5lY3Rfb3A8SGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaW1wbC5zb2NrZXRfLCBoYW5kbGVyKTsKLQotICAgIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAic29ja2V0IiwgJmltcGwsICJhc3luY19jb25uZWN0IikpOwotCi0gICAgc3RhcnRfY29ubmVjdF9vcChpbXBsLCBpbXBsLnByb3RvY29sXy5mYW1pbHkoKSwgaW1wbC5wcm90b2NvbF8udHlwZSgpLAotICAgICAgICBwZWVyX2VuZHBvaW50LmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihwZWVyX2VuZHBvaW50LnNpemUoKSksIHAucCk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5fSU9DUF9TT0NLRVRfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2JhZDdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MjQgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5faW9jcF9zb2NrZXRfc2VydmljZV9iYXNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9TRVJWSUNFX0JBU0VfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTl9JT0NQX1NPQ0tFVF9TRVJWSUNFX0JBU0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc29ja2V0X2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL211dGV4LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlYWN0b3Jfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9ob2xkZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX2lvY3BfaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX2lvY3BfbnVsbF9idWZmZXJzX29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfY29ubmVjdF9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3NlbmRfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX3NvY2tldF9yZWN2X29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfcmVjdm1zZ19vcC5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZQotewotcHVibGljOgotICAvLyBUaGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiB0aGUgc29ja2V0LgotICBzdHJ1Y3QgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlCi0gIHsKLSAgICAvLyBUaGUgbmF0aXZlIHNvY2tldCByZXByZXNlbnRhdGlvbi4KLSAgICBzb2NrZXRfdHlwZSBzb2NrZXRfOwotCi0gICAgLy8gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNvY2tldC4KLSAgICBzb2NrZXRfb3BzOjpzdGF0ZV90eXBlIHN0YXRlXzsKLQotICAgIC8vIFdlIHVzZSBhIHNoYXJlZCBwb2ludGVyIGFzIGEgY2FuY2VsbGF0aW9uIHRva2VuIGhlcmUgdG8gd29yayBhcm91bmQgdGhlCi0gICAgLy8gYnJva2VuIFdpbmRvd3Mgc3VwcG9ydCBmb3IgY2FuY2VsbGF0aW9uLiBNU0ROIHNheXMgdGhhdCB3aGVuIHlvdSBjYWxsCi0gICAgLy8gY2xvc2Vzb2NrZXQgYW55IG91dHN0YW5kaW5nIFdTQVJlY3Ygb3IgV1NBU2VuZCBvcGVyYXRpb25zIHdpbGwgY29tcGxldGUKLSAgICAvLyB3aXRoIHRoZSBlcnJvciBFUlJPUl9PUEVSQVRJT05fQUJPUlRFRC4gSW4gcHJhY3RpY2UgdGhleSBjb21wbGV0ZSB3aXRoCi0gICAgLy8gRVJST1JfTkVUTkFNRV9ERUxFVEVELCB3aGljaCBtZWFucyB5b3UgY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gICAgLy8gYSBsb2NhbCBjYW5jZWxsYXRpb24gYW5kIHRoZSBzb2NrZXQgYmVpbmcgaGFyZC1jbG9zZWQgYnkgdGhlIHBlZXIuCi0gICAgc29ja2V0X29wczo6c2hhcmVkX2NhbmNlbF90b2tlbl90eXBlIGNhbmNlbF90b2tlbl87Ci0KLSAgICAvLyBQZXItZGVzY3JpcHRvciBkYXRhIHVzZWQgYnkgdGhlIHJlYWN0b3IuCi0gICAgcmVhY3Rvcjo6cGVyX2Rlc2NyaXB0b3JfZGF0YSByZWFjdG9yX2RhdGFfOwotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9DQU5DRUxJTykKLSAgICAvLyBUaGUgSUQgb2YgdGhlIHRocmVhZCBmcm9tIHdoaWNoIGl0IGlzIHNhZmUgdG8gY2FuY2VsIGFzeW5jaHJvbm91cwotICAgIC8vIG9wZXJhdGlvbnMuIDAgbWVhbnMgbm8gYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIHN0YXJ0ZWQgeWV0LgotICAgIC8vIH4wIG1lYW5zIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGhhdmUgYmVlbiBzdGFydGVkIGZyb20gbW9yZSB0aGFuIG9uZQotICAgIC8vIHRocmVhZCwgYW5kIGNhbmNlbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgc29ja2V0LgotICAgIERXT1JEIHNhZmVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZF87Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9DQU5DRUxJTykKLQotICAgIC8vIFBvaW50ZXJzIHRvIGFkamFjZW50IHNvY2tldCBpbXBsZW1lbnRhdGlvbnMgaW4gbGlua2VkIGxpc3QuCi0gICAgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlKiBuZXh0XzsKLSAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUqIHByZXZfOwotICB9OwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZSgKLSAgICAgIGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpOwotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIEFTSU9fREVDTCB2b2lkIHNodXRkb3duX3NlcnZpY2UoKTsKLQotICAvLyBDb25zdHJ1Y3QgYSBuZXcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBjb25zdHJ1Y3QoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKTsKLQotICAvLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIGJhc2VfbW92ZV9jb25zdHJ1Y3QoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKTsKLQotICAvLyBNb3ZlLWFzc2lnbiBmcm9tIGFub3RoZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBiYXNlX21vdmVfYXNzaWduKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHdpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2UmIG90aGVyX3NlcnZpY2UsCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpOwotCi0gIC8vIERlc3Ryb3kgYSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIGRlc3Ryb3koYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKTsKLQotICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgc29ja2V0IGlzIG9wZW4uCi0gIGJvb2wgaXNfb3Blbihjb25zdCBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaW1wbC5zb2NrZXRfICE9IGludmFsaWRfc29ja2V0OwotICB9Ci0KLSAgLy8gRGVzdHJveSBhIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBDYW5jZWwgYWxsIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2NrZXQuCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGNhbmNlbCgKLSAgICAgIGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgYXQgdGhlIG91dC1vZi1iYW5kIGRhdGEgbWFyay4KLSAgYm9vbCBhdF9tYXJrKGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNvY2tldF9vcHM6OnNvY2thdG1hcmsoaW1wbC5zb2NrZXRfLCBlYyk7Ci0gIH0KLQotICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcuCi0gIHN0ZDo6c2l6ZV90IGF2YWlsYWJsZShjb25zdCBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzb2NrZXRfb3BzOjphdmFpbGFibGUoaW1wbC5zb2NrZXRfLCBlYyk7Ci0gIH0KLQotICAvLyBQbGFjZSB0aGUgc29ja2V0IGludG8gdGhlIHN0YXRlIHdoZXJlIGl0IHdpbGwgbGlzdGVuIGZvciBuZXcgY29ubmVjdGlvbnMuCi0gIGFzaW86OmVycm9yX2NvZGUgbGlzdGVuKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGludCBiYWNrbG9nLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHNvY2tldF9vcHM6Omxpc3RlbihpbXBsLnNvY2tldF8sIGJhY2tsb2csIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBQZXJmb3JtIGFuIElPIGNvbnRyb2wgY29tbWFuZCBvbiB0aGUgc29ja2V0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSU9fQ29udHJvbF9Db21tYW5kPgotICBhc2lvOjplcnJvcl9jb2RlIGlvX2NvbnRyb2woYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgSU9fQ29udHJvbF9Db21tYW5kJiBjb21tYW5kLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHNvY2tldF9vcHM6OmlvY3RsKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sIGNvbW1hbmQubmFtZSgpLAotICAgICAgICBzdGF0aWNfY2FzdDxpb2N0bF9hcmdfdHlwZSo+KGNvbW1hbmQuZGF0YSgpKSwgZWMpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIEdldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBzb2NrZXQuCi0gIGJvb2wgbm9uX2Jsb2NraW5nKGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiAoaW1wbC5zdGF0ZV8gJiBzb2NrZXRfb3BzOjp1c2VyX3NldF9ub25fYmxvY2tpbmcpICE9IDA7Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIG5vbl9ibG9ja2luZyhiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBib29sIG1vZGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgc29ja2V0X29wczo6c2V0X3VzZXJfbm9uX2Jsb2NraW5nKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sIG1vZGUsIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBHZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYm9vbCBuYXRpdmVfbm9uX2Jsb2NraW5nKGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiAoaW1wbC5zdGF0ZV8gJiBzb2NrZXRfb3BzOjppbnRlcm5hbF9ub25fYmxvY2tpbmcpICE9IDA7Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBuYXRpdmVfbm9uX2Jsb2NraW5nKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBzb2NrZXRfb3BzOjpzZXRfaW50ZXJuYWxfbm9uX2Jsb2NraW5nKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sIG1vZGUsIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBEaXNhYmxlIHNlbmRzIG9yIHJlY2VpdmVzIG9uIHRoZSBzb2NrZXQuCi0gIGFzaW86OmVycm9yX2NvZGUgc2h1dGRvd24oYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgc29ja2V0X2Jhc2U6OnNodXRkb3duX3R5cGUgd2hhdCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBzb2NrZXRfb3BzOjpzaHV0ZG93bihpbXBsLnNvY2tldF8sIHdoYXQsIGVjKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBTZW5kIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBwZWVyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHNpemVfdCBzZW5kKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjpjb25zdF9idWZmZXIsCi0gICAgICAgIENvbnN0QnVmZmVyU2VxdWVuY2U+IGJ1ZnMoYnVmZmVycyk7Ci0KLSAgICByZXR1cm4gc29ja2V0X29wczo6c3luY19zZW5kKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sCi0gICAgICAgIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksIGZsYWdzLCBidWZzLmFsbF9lbXB0eSgpLCBlYyk7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIGRhdGEgY2FuIGJlIHNlbnQgd2l0aG91dCBibG9ja2luZy4KLSAgc2l6ZV90IHNlbmQoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBjb25zdCBudWxsX2J1ZmZlcnMmLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgLy8gV2FpdCBmb3Igc29ja2V0IHRvIGJlY29tZSByZWFkeS4KLSAgICBzb2NrZXRfb3BzOjpwb2xsX3dyaXRlKGltcGwuc29ja2V0XywgaW1wbC5zdGF0ZV8sIGVjKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQuIFRoZSBkYXRhIGJlaW5nIHNlbnQgbXVzdCBiZSB2YWxpZCBmb3IgdGhlCi0gIC8vIGxpZmV0aW1lIG9mIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19zZW5kKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiB3aW5faW9jcF9zb2NrZXRfc2VuZF9vcDxDb25zdEJ1ZmZlclNlcXVlbmNlLCBIYW5kbGVyPiBvcDsKLSAgICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplb2Yob3ApLCBoYW5kbGVyKSwgMCB9OwotICAgIHAucCA9IG5ldyAocC52KSBvcChpbXBsLmNhbmNlbF90b2tlbl8sIGJ1ZmZlcnMsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLCAmaW1wbCwgImFzeW5jX3NlbmQiKSk7Ci0KLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjpjb25zdF9idWZmZXIsCi0gICAgICAgIENvbnN0QnVmZmVyU2VxdWVuY2U+IGJ1ZnMoYnVmZmVycyk7Ci0KLSAgICBzdGFydF9zZW5kX29wKGltcGwsIGJ1ZnMuYnVmZmVycygpLCBidWZzLmNvdW50KCksIGZsYWdzLAotICAgICAgICAoaW1wbC5zdGF0ZV8gJiBzb2NrZXRfb3BzOjpzdHJlYW1fb3JpZW50ZWQpICE9IDAgJiYgYnVmcy5hbGxfZW1wdHkoKSwKLSAgICAgICAgcC5wKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdhaXQgdW50aWwgZGF0YSBjYW4gYmUgc2VudCB3aXRob3V0IGJsb2NraW5nLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19zZW5kKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgY29uc3QgbnVsbF9idWZmZXJzJiwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHdpbl9pb2NwX251bGxfYnVmZmVyc19vcDxIYW5kbGVyPiBvcDsKLSAgICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplb2Yob3ApLCBoYW5kbGVyKSwgMCB9OwotICAgIHAucCA9IG5ldyAocC52KSBvcChpbXBsLmNhbmNlbF90b2tlbl8sIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLAotICAgICAgICAgICZpbXBsLCAiYXN5bmNfc2VuZChudWxsX2J1ZmZlcnMpIikpOwotCi0gICAgc3RhcnRfcmVhY3Rvcl9vcChpbXBsLCByZWFjdG9yOjp3cml0ZV9vcCwgcC5wKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci0KLSAgLy8gUmVjZWl2ZSBzb21lIGRhdGEgZnJvbSB0aGUgcGVlci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzaXplX3QgcmVjZWl2ZShiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPiBidWZzKGJ1ZmZlcnMpOwotCi0gICAgcmV0dXJuIHNvY2tldF9vcHM6OnN5bmNfcmVjdihpbXBsLnNvY2tldF8sIGltcGwuc3RhdGVfLAotICAgICAgICBidWZzLmJ1ZmZlcnMoKSwgYnVmcy5jb3VudCgpLCBmbGFncywgYnVmcy5hbGxfZW1wdHkoKSwgZWMpOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCBkYXRhIGNhbiBiZSByZWNlaXZlZCB3aXRob3V0IGJsb2NraW5nLgotICBzaXplX3QgcmVjZWl2ZShiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGNvbnN0IG51bGxfYnVmZmVycyYsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICAvLyBXYWl0IGZvciBzb2NrZXQgdG8gYmVjb21lIHJlYWR5LgotICAgIHNvY2tldF9vcHM6OnBvbGxfcmVhZChpbXBsLnNvY2tldF8sIGltcGwuc3RhdGVfLCBlYyk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWNlaXZlLiBUaGUgYnVmZmVyIGZvciB0aGUgZGF0YSBiZWluZyByZWNlaXZlZAotICAvLyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVjZWl2ZShiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiB3aW5faW9jcF9zb2NrZXRfcmVjdl9vcDxNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGltcGwuc3RhdGVfLCBpbXBsLmNhbmNlbF90b2tlbl8sIGJ1ZmZlcnMsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLCAmaW1wbCwgImFzeW5jX3JlY2VpdmUiKSk7Ci0KLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPiBidWZzKGJ1ZmZlcnMpOwotCi0gICAgc3RhcnRfcmVjZWl2ZV9vcChpbXBsLCBidWZzLmJ1ZmZlcnMoKSwgYnVmcy5jb3VudCgpLCBmbGFncywKLSAgICAgICAgKGltcGwuc3RhdGVfICYgc29ja2V0X29wczo6c3RyZWFtX29yaWVudGVkKSAhPSAwICYmIGJ1ZnMuYWxsX2VtcHR5KCksCi0gICAgICAgIHAucCk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgZGF0YSBjYW4gYmUgcmVjZWl2ZWQgd2l0aG91dCBibG9ja2luZy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVjZWl2ZShiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGNvbnN0IG51bGxfYnVmZmVycyYsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiB3aW5faW9jcF9udWxsX2J1ZmZlcnNfb3A8SGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaW1wbC5jYW5jZWxfdG9rZW5fLCBoYW5kbGVyKTsKLQotICAgIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAic29ja2V0IiwKLSAgICAgICAgICAmaW1wbCwgImFzeW5jX3JlY2VpdmUobnVsbF9idWZmZXJzKSIpKTsKLQotICAgIHN0YXJ0X251bGxfYnVmZmVyc19yZWNlaXZlX29wKGltcGwsIGZsYWdzLCBwLnApOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBSZWNlaXZlIHNvbWUgZGF0YSB3aXRoIGFzc29jaWF0ZWQgZmxhZ3MuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcwotICAvLyByZWNlaXZlZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc2l6ZV90IHJlY2VpdmVfd2l0aF9mbGFncyhiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBpbl9mbGFncywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiBvdXRfZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6bXV0YWJsZV9idWZmZXIsCi0gICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4gYnVmcyhidWZmZXJzKTsKLQotICAgIHJldHVybiBzb2NrZXRfb3BzOjpzeW5jX3JlY3Ztc2coaW1wbC5zb2NrZXRfLCBpbXBsLnN0YXRlXywKLSAgICAgICAgYnVmcy5idWZmZXJzKCksIGJ1ZnMuY291bnQoKSwgaW5fZmxhZ3MsIG91dF9mbGFncywgZWMpOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCBkYXRhIGNhbiBiZSByZWNlaXZlZCB3aXRob3V0IGJsb2NraW5nLgotICBzaXplX3QgcmVjZWl2ZV93aXRoX2ZsYWdzKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IG51bGxfYnVmZmVycyYsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MmIG91dF9mbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICAvLyBXYWl0IGZvciBzb2NrZXQgdG8gYmVjb21lIHJlYWR5LgotICAgIHNvY2tldF9vcHM6OnBvbGxfcmVhZChpbXBsLnNvY2tldF8sIGltcGwuc3RhdGVfLCBlYyk7Ci0KLSAgICAvLyBDbGVhciBvdXRfZmxhZ3MsIHNpbmNlIHdlIGNhbm5vdCBnaXZlIGl0IGFueSBvdGhlciBzZW5zaWJsZSB2YWx1ZSB3aGVuCi0gICAgLy8gcGVyZm9ybWluZyBhIG51bGxfYnVmZmVycyBvcGVyYXRpb24uCi0gICAgb3V0X2ZsYWdzID0gMDsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUuIFRoZSBidWZmZXIgZm9yIHRoZSBkYXRhIGJlaW5nIHJlY2VpdmVkCi0gIC8vIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19yZWNlaXZlX3dpdGhfZmxhZ3MoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBpbl9mbGFncywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiBvdXRfZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgd2luX2lvY3Bfc29ja2V0X3JlY3Ztc2dfb3A8TXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCBIYW5kbGVyPiBvcDsKLSAgICB0eXBlbmFtZSBvcDo6cHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIpLAotICAgICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplb2Yob3ApLCBoYW5kbGVyKSwgMCB9OwotICAgIHAucCA9IG5ldyAocC52KSBvcChpbXBsLmNhbmNlbF90b2tlbl8sIGJ1ZmZlcnMsIG91dF9mbGFncywgaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgInNvY2tldCIsCi0gICAgICAgICAgJmltcGwsICJhc3luY19yZWNlaXZlX3dpdGhfZmxhZ3MiKSk7Ci0KLSAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjptdXRhYmxlX2J1ZmZlciwKLSAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPiBidWZzKGJ1ZmZlcnMpOwotCi0gICAgc3RhcnRfcmVjZWl2ZV9vcChpbXBsLCBidWZzLmJ1ZmZlcnMoKSwgYnVmcy5jb3VudCgpLCBpbl9mbGFncywgZmFsc2UsIHAucCk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotCi0gIC8vIFdhaXQgdW50aWwgZGF0YSBjYW4gYmUgcmVjZWl2ZWQgd2l0aG91dCBibG9ja2luZy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVjZWl2ZV93aXRoX2ZsYWdzKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IG51bGxfYnVmZmVycyYsIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGluX2ZsYWdzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MmIG91dF9mbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiB3aW5faW9jcF9udWxsX2J1ZmZlcnNfb3A8SGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaW1wbC5jYW5jZWxfdG9rZW5fLCBoYW5kbGVyKTsKLQotICAgIEFTSU9fSEFORExFUl9DUkVBVElPTigocC5wLCAic29ja2V0IiwgJmltcGwsCi0gICAgICAgICAgImFzeW5jX3JlY2VpdmVfd2l0aF9mbGFncyhudWxsX2J1ZmZlcnMpIikpOwotCi0gICAgLy8gUmVzZXQgb3V0X2ZsYWdzIHNpbmNlIGl0IGNhbiBiZSBnaXZlbiBubyBzZW5zaWJsZSB2YWx1ZSBhdCB0aGlzIHRpbWUuCi0gICAgb3V0X2ZsYWdzID0gMDsKLQotICAgIHN0YXJ0X251bGxfYnVmZmVyc19yZWNlaXZlX29wKGltcGwsIGluX2ZsYWdzLCBwLnApOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gcmVzdGFydCBhbiBhc3luY2hyb25vdXMgYWNjZXB0IG9wZXJhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgcmVzdGFydF9hY2NlcHRfb3Aoc29ja2V0X3R5cGUgcywKLSAgICAgIHNvY2tldF9ob2xkZXImIG5ld19zb2NrZXQsIGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsCi0gICAgICB2b2lkKiBvdXRwdXRfYnVmZmVyLCBEV09SRCBhZGRyZXNzX2xlbmd0aCwgb3BlcmF0aW9uKiBvcCk7Ci0KLXByb3RlY3RlZDoKLSAgLy8gT3BlbiBhIG5ldyBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGRvX29wZW4oCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGludCBmYW1pbHksIGludCB0eXBlLAotICAgICAgaW50IHByb3RvY29sLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gQXNzaWduIGEgbmF0aXZlIHNvY2tldCB0byBhIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgZG9fYXNzaWduKAotICAgICAgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBpbnQgdHlwZSwKLSAgICAgIHNvY2tldF90eXBlIG5hdGl2ZV9zb2NrZXQsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gc3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF9zZW5kX29wKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIFdTQUJVRiogYnVmZmVycywgc3RkOjpzaXplX3QgYnVmZmVyX2NvdW50LAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGJvb2wgbm9vcCwgb3BlcmF0aW9uKiBvcCk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHN0YXJ0IGFuIGFzeW5jaHJvbm91cyBzZW5kX3RvIG9wZXJhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfc2VuZF90b19vcChiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBXU0FCVUYqIGJ1ZmZlcnMsIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9jb3VudCwKLSAgICAgIGNvbnN0IHNvY2tldF9hZGRyX3R5cGUqIGFkZHIsIGludCBhZGRybGVuLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIG9wZXJhdGlvbiogb3ApOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBzdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZSBvcGVyYXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIHN0YXJ0X3JlY2VpdmVfb3AoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgV1NBQlVGKiBidWZmZXJzLCBzdGQ6OnNpemVfdCBidWZmZXJfY291bnQsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgYm9vbCBub29wLCBvcGVyYXRpb24qIG9wKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gc3RhcnQgYW4gYXN5bmNocm9ub3VzIG51bGxfYnVmZmVycyByZWNlaXZlIG9wZXJhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfbnVsbF9idWZmZXJzX3JlY2VpdmVfb3AoCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgcmVhY3Rvcl9vcCogb3ApOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBzdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZV9mcm9tIG9wZXJhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfcmVjZWl2ZV9mcm9tX29wKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIFdTQUJVRiogYnVmZmVycywgc3RkOjpzaXplX3QgYnVmZmVyX2NvdW50LCBzb2NrZXRfYWRkcl90eXBlKiBhZGRyLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGludCogYWRkcmxlbiwgb3BlcmF0aW9uKiBvcCk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHN0YXJ0IGFuIGFzeW5jaHJvbm91cyBhY2NlcHQgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF9hY2NlcHRfb3AoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYm9vbCBwZWVyX2lzX29wZW4sIHNvY2tldF9ob2xkZXImIG5ld19zb2NrZXQsIGludCBmYW1pbHksIGludCB0eXBlLAotICAgICAgaW50IHByb3RvY29sLCB2b2lkKiBvdXRwdXRfYnVmZmVyLCBEV09SRCBhZGRyZXNzX2xlbmd0aCwgb3BlcmF0aW9uKiBvcCk7Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uIHVzaW5nIHRoZSByZWFjdG9yLgotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF9yZWFjdG9yX29wKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGludCBvcF90eXBlLCByZWFjdG9yX29wKiBvcCk7Ci0KLSAgLy8gU3RhcnQgdGhlIGFzeW5jaHJvbm91cyBjb25uZWN0IG9wZXJhdGlvbiB1c2luZyB0aGUgcmVhY3Rvci4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfY29ubmVjdF9vcChiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgY29uc3Qgc29ja2V0X2FkZHJfdHlwZSogcmVtb3RlX2FkZHIsCi0gICAgICBzdGQ6OnNpemVfdCByZW1vdGVfYWRkcmxlbiwgd2luX2lvY3Bfc29ja2V0X2Nvbm5lY3Rfb3BfYmFzZSogb3ApOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjbG9zZSBhIHNvY2tldCB3aGVuIHRoZSBhc3NvY2lhdGVkIG9iamVjdCBpcyBiZWluZwotICAvLyBkZXN0cm95ZWQuCi0gIEFTSU9fREVDTCB2b2lkIGNsb3NlX2Zvcl9kZXN0cnVjdGlvbihiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpOwotCi0gIC8vIFVwZGF0ZSB0aGUgSUQgb2YgdGhlIHRocmVhZCBmcm9tIHdoaWNoIGNhbmNlbGxhdGlvbiBpcyBzYWZlLgotICBBU0lPX0RFQ0wgdm9pZCB1cGRhdGVfY2FuY2VsbGF0aW9uX3RocmVhZF9pZCgKLSAgICAgIGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgcmVhY3Rvci4gSWYgbm8gcmVhY3RvciBoYXMgYmVlbiBjcmVhdGVkIHlldCwgYQotICAvLyBuZXcgb25lIGlzIG9idGFpbmVkIGZyb20gdGhlIGlvX3NlcnZpY2UgYW5kIGEgcG9pbnRlciB0byBpdCBpcyBjYWNoZWQgaW4KLSAgLy8gdGhpcyBzZXJ2aWNlLgotICBBU0lPX0RFQ0wgcmVhY3RvciYgZ2V0X3JlYWN0b3IoKTsKLQotICAvLyBUaGUgdHlwZSBvZiBhIENvbm5lY3RFeCBmdW5jdGlvbiBwb2ludGVyLCBhcyBvbGQgU0RLcyBtYXkgbm90IHByb3ZpZGUgaXQuCi0gIHR5cGVkZWYgQk9PTCAoUEFTQ0FMICpjb25uZWN0X2V4X2ZuKShTT0NLRVQsCi0gICAgICBjb25zdCBzb2NrZXRfYWRkcl90eXBlKiwgaW50LCB2b2lkKiwgRFdPUkQsIERXT1JEKiwgT1ZFUkxBUFBFRCopOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIENvbm5lY3RFeCBwb2ludGVyLiBJZiBubyBDb25uZWN0RXggcG9pbnRlciBoYXMKLSAgLy8gYmVlbiBvYnRhaW5lZCB5ZXQsIG9uZSBpcyBvYnRhaW5lZCB1c2luZyBXU0FJb2N0bCBhbmQgdGhlIHBvaW50ZXIgaXMKLSAgLy8gY2FjaGVkLiBSZXR1cm5zIGEgbnVsbCBwb2ludGVyIGlmIENvbm5lY3RFeCBpcyBub3QgYXZhaWxhYmxlLgotICBBU0lPX0RFQ0wgY29ubmVjdF9leF9mbiBnZXRfY29ubmVjdF9leCgKLSAgICAgIGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgaW50IHR5cGUpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBlbXVsYXRlIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlciBmdW5jdGlvbmFsaXR5Ci0gIC8vIGZvcjoKLSAgLy8gLSB2ZXJ5IG9sZCBQbGF0Zm9ybSBTREtzOyBhbmQKLSAgLy8gLSBwbGF0Zm9ybSBTREtzIHdoZXJlIE1TVkMncyAvV3A2NCBvcHRpb24gY2F1c2VzIHNwdXJpb3VzIHdhcm5pbmdzLgotICBBU0lPX0RFQ0wgdm9pZCogaW50ZXJsb2NrZWRfY29tcGFyZV9leGNoYW5nZV9wb2ludGVyKAotICAgICAgdm9pZCoqIGRlc3QsIHZvaWQqIGV4Y2gsIHZvaWQqIGNtcCk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGVtdWxhdGUgSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIgZnVuY3Rpb25hbGl0eSBmb3I6Ci0gIC8vIC0gdmVyeSBvbGQgUGxhdGZvcm0gU0RLczsgYW5kCi0gIC8vIC0gcGxhdGZvcm0gU0RLcyB3aGVyZSBNU1ZDJ3MgL1dwNjQgb3B0aW9uIGNhdXNlcyBzcHVyaW91cyB3YXJuaW5ncy4KLSAgQVNJT19ERUNMIHZvaWQqIGludGVybG9ja2VkX2V4Y2hhbmdlX3BvaW50ZXIodm9pZCoqIGRlc3QsIHZvaWQqIHZhbCk7Ci0KLSAgLy8gVGhlIGlvX3NlcnZpY2UgdXNlZCB0byBvYnRhaW4gdGhlIHJlYWN0b3IsIGlmIHJlcXVpcmVkLgotICBhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlXzsKLQotICAvLyBUaGUgSU9DUCBzZXJ2aWNlIHVzZWQgZm9yIHJ1bm5pbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYW5kIGRpc3BhdGNoaW5nCi0gIC8vIGhhbmRsZXJzLgotICB3aW5faW9jcF9pb19zZXJ2aWNlJiBpb2NwX3NlcnZpY2VfOwotCi0gIC8vIFRoZSByZWFjdG9yIHVzZWQgZm9yIHBlcmZvcm1pbmcgY29ubmVjdCBvcGVyYXRpb25zLiBUaGlzIG9iamVjdCBpcyBjcmVhdGVkCi0gIC8vIG9ubHkgaWYgbmVlZGVkLgotICByZWFjdG9yKiByZWFjdG9yXzsKLQotICAvLyBQb2ludGVyIHRvIENvbm5lY3RFeCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCogY29ubmVjdF9leF87Ci0KLSAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIGxpbmtlZCBsaXN0IG9mIGltcGxlbWVudGF0aW9ucy4gCi0gIGFzaW86OmRldGFpbDo6bXV0ZXggbXV0ZXhfOwotCi0gIC8vIFRoZSBoZWFkIG9mIGEgbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlKiBpbXBsX2xpc3RfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3Bfc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0lOX0lPQ1BfU09DS0VUX1NFUlZJQ0VfQkFTRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX2lvY3BfdGhyZWFkX2luZm8uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF90aHJlYWRfaW5mby5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjk4ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5faW9jcF90aHJlYWRfaW5mby5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9pb2NwX3RocmVhZF9pbmZvLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5fSU9DUF9USFJFQURfSU5GT19IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOX0lPQ1BfVEhSRUFEX0lORk9fSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RocmVhZF9pbmZvX2Jhc2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXN0cnVjdCB3aW5faW9jcF90aHJlYWRfaW5mbyA6IHB1YmxpYyB0aHJlYWRfaW5mb19iYXNlCi17Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9JT0NQX1RIUkVBRF9JTkZPX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5fbXV0ZXguaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5fbXV0ZXguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDM5M2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX211dGV4LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2luX211dGV4LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOX01VVEVYX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5fTVVURVhfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL25vbmNvcHlhYmxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zY29wZWRfbG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyB3aW5fbXV0ZXgKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjpzY29wZWRfbG9jazx3aW5fbXV0ZXg+IHNjb3BlZF9sb2NrOwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgd2luX211dGV4KCk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgfndpbl9tdXRleCgpCi0gIHsKLSAgICA6OkRlbGV0ZUNyaXRpY2FsU2VjdGlvbigmY3JpdF9zZWN0aW9uXyk7Ci0gIH0KLQotICAvLyBMb2NrIHRoZSBtdXRleC4KLSAgdm9pZCBsb2NrKCkKLSAgewotICAgIDo6RW50ZXJDcml0aWNhbFNlY3Rpb24oJmNyaXRfc2VjdGlvbl8pOwotICB9Ci0KLSAgLy8gVW5sb2NrIHRoZSBtdXRleC4KLSAgdm9pZCB1bmxvY2soKQotICB7Ci0gICAgOjpMZWF2ZUNyaXRpY2FsU2VjdGlvbigmY3JpdF9zZWN0aW9uXyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gSW5pdGlhbGlzYXRpb24gbXVzdCBiZSBwZXJmb3JtZWQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbiB0byB0aGUgY29uc3RydWN0b3IKLSAgLy8gc2luY2UgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHVzZSBvZiBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbnMgYW5kCi0gIC8vIEMrKyBleGNlcHRpb25zIGluIHRoZSBzYW1lIGZ1bmN0aW9uLgotICBBU0lPX0RFQ0wgaW50IGRvX2luaXQoKTsKLQotICA6OkNSSVRJQ0FMX1NFQ1RJT04gY3JpdF9zZWN0aW9uXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3dpbl9tdXRleC5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5fTVVURVhfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkMmZjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2luX29iamVjdF9oYW5kbGVfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDExIEJvcmlzIFNjaGFlbGluZyAoYm9yaXNAaGlnaHNjb3JlLmRlKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5fT0JKRUNUX0hBTkRMRV9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5fT0JKRUNUX0hBTkRMRV9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX09CSkVDVF9IQU5ETEUpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2FpdF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHdpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UKLXsKLXB1YmxpYzoKLSAgLy8gVGhlIG5hdGl2ZSB0eXBlIG9mIGFuIG9iamVjdCBoYW5kbGUuCi0gIHR5cGVkZWYgSEFORExFIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICAvLyBUaGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiB0aGUgb2JqZWN0IGhhbmRsZS4KLSAgY2xhc3MgaW1wbGVtZW50YXRpb25fdHlwZQotICB7Ci0gICBwdWJsaWM6Ci0gICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICBpbXBsZW1lbnRhdGlvbl90eXBlKCkKLSAgICAgIDogaGFuZGxlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSksCi0gICAgICAgIHdhaXRfaGFuZGxlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSksCi0gICAgICAgIG93bmVyXygwKSwKLSAgICAgICAgbmV4dF8oMCksCi0gICAgICAgIHByZXZfKDApCi0gICAgewotICAgIH0KLQotICBwcml2YXRlOgotICAgIC8vIE9ubHkgdGhpcyBzZXJ2aWNlIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlIGludGVybmFsIHZhbHVlcy4KLSAgICBmcmllbmQgY2xhc3Mgd2luX29iamVjdF9oYW5kbGVfc2VydmljZTsKLQotICAgIC8vIFRoZSBuYXRpdmUgb2JqZWN0IGhhbmRsZSByZXByZXNlbnRhdGlvbi4gTWF5IGJlIGFjY2Vzc2VkIG9yIG1vZGlmaWVkCi0gICAgLy8gd2l0aG91dCBsb2NraW5nIHRoZSBtdXRleC4KLSAgICBuYXRpdmVfaGFuZGxlX3R5cGUgaGFuZGxlXzsKLQotICAgIC8vIFRoZSBoYW5kbGUgdXNlZCB0byB1bnJlZ2lzdGVyIHRoZSB3YWl0IG9wZXJhdGlvbi4gVGhlIG11dGV4IG11c3QgYmUKLSAgICAvLyBsb2NrZWQgd2hlbiBhY2Nlc3Npbmcgb3IgbW9kaWZ5aW5nIHRoaXMgbWVtYmVyLgotICAgIEhBTkRMRSB3YWl0X2hhbmRsZV87Ci0KLSAgICAvLyBUaGUgb3BlcmF0aW9ucyB3YWl0aW5nIG9uIHRoZSBvYmplY3QgaGFuZGxlLiBJZiB0aGVyZSBpcyBhIHJlZ2lzdGVyZWQKLSAgICAvLyB3YWl0IHRoZW4gdGhlIG11dGV4IG11c3QgYmUgbG9ja2VkIHdoZW4gYWNjZXNzaW5nIG9yIG1vZGlmeWluZyB0aGlzCi0gICAgLy8gbWVtYmVyCi0gICAgb3BfcXVldWU8d2FpdF9vcD4gb3BfcXVldWVfOwotCi0gICAgLy8gVGhlIHNlcnZpY2UgaW5zdGFuY2UgdGhhdCBvd25zIHRoZSBvYmplY3QgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICAgIHdpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UqIG93bmVyXzsKLQotICAgIC8vIFBvaW50ZXJzIHRvIGFkamFjZW50IGhhbmRsZSBpbXBsZW1lbnRhdGlvbnMgaW4gbGlua2VkIGxpc3QuIFRoZSBtdXRleAotICAgIC8vIG11c3QgYmUgbG9ja2VkIHdoZW4gYWNjZXNzaW5nIG9yIG1vZGlmeWluZyB0aGVzZSBtZW1iZXJzLgotICAgIGltcGxlbWVudGF0aW9uX3R5cGUqIG5leHRfOwotICAgIGltcGxlbWVudGF0aW9uX3R5cGUqIHByZXZfOwotICB9OwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgd2luX29iamVjdF9oYW5kbGVfc2VydmljZSgKLSAgICAgIGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpOwotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIEFTSU9fREVDTCB2b2lkIHNodXRkb3duX3NlcnZpY2UoKTsKLQotICAvLyBDb25zdHJ1Y3QgYSBuZXcgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBjb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCk7Ci0KLSAgLy8gTW92ZS1jb25zdHJ1Y3QgYSBuZXcgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBtb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCk7Ci0KLSAgLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgbW92ZV9hc3NpZ24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHdpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UmIG90aGVyX3NlcnZpY2UsCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKTsKLQotICAvLyBEZXN0cm95IGEgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBkZXN0cm95KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpOwotCi0gIC8vIEFzc2lnbiBhIG5hdGl2ZSBoYW5kbGUgdG8gYSBoYW5kbGUgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBoYW5kbGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgaGFuZGxlIGlzIG9wZW4uCi0gIGJvb2wgaXNfb3Blbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGltcGwuaGFuZGxlXyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSAmJiBpbXBsLmhhbmRsZV8gIT0gMDsKLSAgfQotCi0gIC8vIERlc3Ryb3kgYSBoYW5kbGUgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGNsb3NlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gR2V0IHRoZSBuYXRpdmUgaGFuZGxlIHJlcHJlc2VudGF0aW9uLgotICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZShjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGltcGwuaGFuZGxlXzsKLSAgfQotCi0gIC8vIENhbmNlbCBhbGwgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZS4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgY2FuY2VsKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gUGVyZm9ybSBhIHN5bmNocm9ub3VzIHdhaXQgZm9yIHRoZSBvYmplY3QgdG8gZW50ZXIgYSBzaWduYWxsZWQgc3RhdGUuCi0gIEFTSU9fREVDTCB2b2lkIHdhaXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdhaXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3dhaXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiB3YWl0X2hhbmRsZXI8SGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgIm9iamVjdF9oYW5kbGUiLCAmaW1wbCwgImFzeW5jX3dhaXQiKSk7Ci0KLSAgICBzdGFydF93YWl0X29wKGltcGwsIHAucCk7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotCi1wcml2YXRlOgotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gc3RhcnQgYW4gYXN5bmNocm9ub3VzIHdhaXQgb3BlcmF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF93YWl0X29wKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIHdhaXRfb3AqIG9wKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYSB3YWl0IG9wZXJhdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgcmVnaXN0ZXJfd2FpdF9jYWxsYmFjaygKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIG11dGV4OjpzY29wZWRfbG9jayYgbG9jayk7Ci0KLSAgLy8gQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHRoZSByZWdpc3RlcmVkIHdhaXQgY29tcGxldGVzLgotICBzdGF0aWMgQVNJT19ERUNMIFZPSUQgQ0FMTEJBQ0sgd2FpdF9jYWxsYmFjaygKLSAgICAgIFBWT0lEIHBhcmFtLCBCT09MRUFOIHRpbWVvdXQpOwotCi0gIC8vIFRoZSBpb19zZXJ2aWNlIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gcG9zdCBjb21wbGV0aW9ucy4KLSAgaW9fc2VydmljZV9pbXBsJiBpb19zZXJ2aWNlXzsKLQotICAvLyBNdXRleCB0byBwcm90ZWN0IGFjY2VzcyB0byBpbnRlcm5hbCBzdGF0ZS4KLSAgbXV0ZXggbXV0ZXhfOwotCi0gIC8vIFRoZSBoZWFkIG9mIGEgbGlua2VkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgaW1wbGVtZW50YXRpb25fdHlwZSogaW1wbF9saXN0XzsKLQotICAvLyBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIGRpc3BhdGNoZXIgaGFzIGJlZW4gc2h1dCBkb3duLgotICBib29sIHNodXRkb3duXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3dpbl9vYmplY3RfaGFuZGxlX3NlcnZpY2UuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19PQkpFQ1RfSEFORExFKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0lOX09CSkVDVF9IQU5ETEVfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX3N0YXRpY19tdXRleC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl9zdGF0aWNfbXV0ZXguaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGZmNmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX3N0YXRpY19tdXRleC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbl9zdGF0aWNfbXV0ZXguaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOX1NUQVRJQ19NVVRFWF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOX1NUQVRJQ19NVVRFWF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc2NvcGVkX2xvY2suaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXN0cnVjdCB3aW5fc3RhdGljX211dGV4Ci17Ci0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjpzY29wZWRfbG9jazx3aW5fc3RhdGljX211dGV4PiBzY29wZWRfbG9jazsKLQotICAvLyBJbml0aWFsaXNlIHRoZSBtdXRleC4KLSAgQVNJT19ERUNMIHZvaWQgaW5pdCgpOwotCi0gIC8vIEluaXRpYWxpc2F0aW9uIG11c3QgYmUgcGVyZm9ybWVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gdG8gdGhlICJwdWJsaWMiCi0gIC8vIGluaXQoKSBmdW5jdGlvbiBzaW5jZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdXNlIG9mIHN0cnVjdHVyZWQKLSAgLy8gZXhjZXB0aW9ucyBhbmQgQysrIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgZnVuY3Rpb24uCi0gIEFTSU9fREVDTCBpbnQgZG9faW5pdCgpOwotCi0gIC8vIExvY2sgdGhlIG11dGV4LgotICB2b2lkIGxvY2soKQotICB7Ci0gICAgOjpFbnRlckNyaXRpY2FsU2VjdGlvbigmY3JpdF9zZWN0aW9uXyk7Ci0gIH0KLQotICAvLyBVbmxvY2sgdGhlIG11dGV4LgotICB2b2lkIHVubG9jaygpCi0gIHsKLSAgICA6OkxlYXZlQ3JpdGljYWxTZWN0aW9uKCZjcml0X3NlY3Rpb25fKTsKLSAgfQotCi0gIGJvb2wgaW5pdGlhbGlzZWRfOwotICA6OkNSSVRJQ0FMX1NFQ1RJT04gY3JpdF9zZWN0aW9uXzsKLX07Ci0KLSNpZiBkZWZpbmVkKFVOREVSX0NFKQotIyBkZWZpbmUgQVNJT19XSU5fU1RBVElDX01VVEVYX0lOSVQgeyBmYWxzZSwgeyAwLCAwLCAwLCAwLCAwIH0gfQotI2Vsc2UgLy8gZGVmaW5lZChVTkRFUl9DRSkKLSMgZGVmaW5lIEFTSU9fV0lOX1NUQVRJQ19NVVRFWF9JTklUIHsgZmFsc2UsIHsgMCwgMCwgMCwgMCwgMCwgMCB9IH0KLSNlbmRpZiAvLyBkZWZpbmVkKFVOREVSX0NFKQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC93aW5fc3RhdGljX211dGV4LmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9TVEFUSUNfTVVURVhfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl90aHJlYWQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5fdGhyZWFkLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4NjgxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl90aHJlYWQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2luX3RocmVhZC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5fVEhSRUFEX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5fVEhSRUFEX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKFVOREVSX0NFKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotQVNJT19ERUNMIHVuc2lnbmVkIGludCBfX3N0ZGNhbGwgd2luX3RocmVhZF9mdW5jdGlvbih2b2lkKiBhcmcpOwotCi0jaWYgZGVmaW5lZChXSU5WRVIpICYmIChXSU5WRVIgPCAweDA1MDApCi1BU0lPX0RFQ0wgdm9pZCBfX3N0ZGNhbGwgYXBjX2Z1bmN0aW9uKFVMT05HIGRhdGEpOwotI2Vsc2UKLUFTSU9fREVDTCB2b2lkIF9fc3RkY2FsbCBhcGNfZnVuY3Rpb24oVUxPTkdfUFRSIGRhdGEpOwotI2VuZGlmCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3Mgd2luX3RocmVhZF9iYXNlCi17Ci1wdWJsaWM6Ci0gIHN0YXRpYyBib29sIHRlcm1pbmF0ZV90aHJlYWRzKCkKLSAgewotICAgIHJldHVybiA6OkludGVybG9ja2VkRXhjaGFuZ2VBZGQoJnRlcm1pbmF0ZV90aHJlYWRzXywgMCkgIT0gMDsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIHNldF90ZXJtaW5hdGVfdGhyZWFkcyhib29sIGIpCi0gIHsKLSAgICA6OkludGVybG9ja2VkRXhjaGFuZ2UoJnRlcm1pbmF0ZV90aHJlYWRzXywgYiA/IDEgOiAwKTsKLSAgfQotCi1wcml2YXRlOgotICBzdGF0aWMgbG9uZyB0ZXJtaW5hdGVfdGhyZWFkc187Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWxvbmcgd2luX3RocmVhZF9iYXNlPFQ+Ojp0ZXJtaW5hdGVfdGhyZWFkc18gPSAwOwotCi1jbGFzcyB3aW5fdGhyZWFkCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZSwKLSAgICBwdWJsaWMgd2luX3RocmVhZF9iYXNlPHdpbl90aHJlYWQ+Ci17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHdpbl90aHJlYWQoRnVuY3Rpb24gZiwgdW5zaWduZWQgaW50IHN0YWNrX3NpemUgPSAwKQotICAgIDogdGhyZWFkXygwKSwKLSAgICAgIGV4aXRfZXZlbnRfKDApCi0gIHsKLSAgICBzdGFydF90aHJlYWQobmV3IGZ1bmM8RnVuY3Rpb24+KGYpLCBzdGFja19zaXplKTsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IuCi0gIEFTSU9fREVDTCB+d2luX3RocmVhZCgpOwotCi0gIC8vIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZXhpdC4KLSAgQVNJT19ERUNMIHZvaWQgam9pbigpOwotCi1wcml2YXRlOgotICBmcmllbmQgQVNJT19ERUNMIHVuc2lnbmVkIGludCBfX3N0ZGNhbGwgd2luX3RocmVhZF9mdW5jdGlvbih2b2lkKiBhcmcpOwotCi0jaWYgZGVmaW5lZChXSU5WRVIpICYmIChXSU5WRVIgPCAweDA1MDApCi0gIGZyaWVuZCBBU0lPX0RFQ0wgdm9pZCBfX3N0ZGNhbGwgYXBjX2Z1bmN0aW9uKFVMT05HKTsKLSNlbHNlCi0gIGZyaWVuZCBBU0lPX0RFQ0wgdm9pZCBfX3N0ZGNhbGwgYXBjX2Z1bmN0aW9uKFVMT05HX1BUUik7Ci0jZW5kaWYKLQotICBjbGFzcyBmdW5jX2Jhc2UKLSAgewotICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+ZnVuY19iYXNlKCkge30KLSAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOwotICAgIDo6SEFORExFIGVudHJ5X2V2ZW50XzsKLSAgICA6OkhBTkRMRSBleGl0X2V2ZW50XzsKLSAgfTsKLQotICBzdHJ1Y3QgYXV0b19mdW5jX2Jhc2VfcHRyCi0gIHsKLSAgICBmdW5jX2Jhc2UqIHB0cjsKLSAgICB+YXV0b19mdW5jX2Jhc2VfcHRyKCkgeyBkZWxldGUgcHRyOyB9Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICBjbGFzcyBmdW5jCi0gICAgOiBwdWJsaWMgZnVuY19iYXNlCi0gIHsKLSAgcHVibGljOgotICAgIGZ1bmMoRnVuY3Rpb24gZikKLSAgICAgIDogZl8oZikKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHJ1bigpCi0gICAgewotICAgICAgZl8oKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBGdW5jdGlvbiBmXzsKLSAgfTsKLQotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF90aHJlYWQoZnVuY19iYXNlKiBhcmcsIHVuc2lnbmVkIGludCBzdGFja19zaXplKTsKLQotICA6OkhBTkRMRSB0aHJlYWRfOwotICA6OkhBTkRMRSBleGl0X2V2ZW50XzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3dpbl90aHJlYWQuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChVTkRFUl9DRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTl9USFJFQURfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbl90c3NfcHRyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX3Rzc19wdHIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGE5ZGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2luX3Rzc19wdHIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5fdHNzX3B0ci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOX1RTU19QVFJfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTl9UU1NfUFRSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHRocmVhZC1zcGVjaWZpYyBzdG9yYWdlLgotQVNJT19ERUNMIERXT1JEIHdpbl90c3NfcHRyX2NyZWF0ZSgpOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIHdpbl90c3NfcHRyCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgd2luX3Rzc19wdHIoKQotICAgIDogdHNzX2tleV8od2luX3Rzc19wdHJfY3JlYXRlKCkpCi0gIHsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IuCi0gIH53aW5fdHNzX3B0cigpCi0gIHsKLSAgICA6OlRsc0ZyZWUodHNzX2tleV8pOwotICB9Ci0KLSAgLy8gR2V0IHRoZSB2YWx1ZS4KLSAgb3BlcmF0b3IgVCooKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPig6OlRsc0dldFZhbHVlKHRzc19rZXlfKSk7Ci0gIH0KLQotICAvLyBTZXQgdGhlIHZhbHVlLgotICB2b2lkIG9wZXJhdG9yPShUKiB2YWx1ZSkKLSAgewotICAgIDo6VGxzU2V0VmFsdWUodHNzX2tleV8sIHZhbHVlKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBUaHJlYWQtc3BlY2lmaWMgc3RvcmFnZSB0byBhbGxvdyB1bmxvY2tlZCBhY2Nlc3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYQotICAvLyB0aHJlYWQgaXMgYSBtZW1iZXIgb2YgdGhlIHBvb2wuCi0gIERXT1JEIHRzc19rZXlfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvd2luX3Rzc19wdHIuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0lOX1RTU19QVFJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbmNlX3RocmVhZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbmNlX3RocmVhZC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWFkM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5jZV90aHJlYWQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2luY2VfdGhyZWFkLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOQ0VfVEhSRUFEX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5DRV9USFJFQURfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgJiYgZGVmaW5lZChVTkRFUl9DRSkKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotRFdPUkQgV0lOQVBJIHdpbmNlX3RocmVhZF9mdW5jdGlvbihMUFZPSUQgYXJnKTsKLQotY2xhc3Mgd2luY2VfdGhyZWFkCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICAvLyBDb25zdHJ1Y3Rvci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotICB3aW5jZV90aHJlYWQoRnVuY3Rpb24gZiwgdW5zaWduZWQgaW50ID0gMCkKLSAgewotICAgIHN0ZDo6YXV0b19wdHI8ZnVuY19iYXNlPiBhcmcobmV3IGZ1bmM8RnVuY3Rpb24+KGYpKTsKLSAgICBEV09SRCB0aHJlYWRfaWQgPSAwOwotICAgIHRocmVhZF8gPSA6OkNyZWF0ZVRocmVhZCgwLCAwLCB3aW5jZV90aHJlYWRfZnVuY3Rpb24sCi0gICAgICAgIGFyZy5nZXQoKSwgMCwgJnRocmVhZF9pZCk7Ci0gICAgaWYgKCF0aHJlYWRfKQotICAgIHsKLSAgICAgIERXT1JEIGxhc3RfZXJyb3IgPSA6OkdldExhc3RFcnJvcigpOwotICAgICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhsYXN0X2Vycm9yLAotICAgICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCkpOwotICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInRocmVhZCIpOwotICAgIH0KLSAgICBhcmcucmVsZWFzZSgpOwotICB9Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgfndpbmNlX3RocmVhZCgpCi0gIHsKLSAgICA6OkNsb3NlSGFuZGxlKHRocmVhZF8pOwotICB9Ci0KLSAgLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBleGl0LgotICB2b2lkIGpvaW4oKQotICB7Ci0gICAgOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZF8sIElORklOSVRFKTsKLSAgfQotCi1wcml2YXRlOgotICBmcmllbmQgRFdPUkQgV0lOQVBJIHdpbmNlX3RocmVhZF9mdW5jdGlvbihMUFZPSUQgYXJnKTsKLQotICBjbGFzcyBmdW5jX2Jhc2UKLSAgewotICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+ZnVuY19iYXNlKCkge30KLSAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOwotICB9OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgY2xhc3MgZnVuYwotICAgIDogcHVibGljIGZ1bmNfYmFzZQotICB7Ci0gIHB1YmxpYzoKLSAgICBmdW5jKEZ1bmN0aW9uIGYpCi0gICAgICA6IGZfKGYpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGZfKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgRnVuY3Rpb24gZl87Ci0gIH07Ci0KLSAgOjpIQU5ETEUgdGhyZWFkXzsKLX07Ci0KLWlubGluZSBEV09SRCBXSU5BUEkgd2luY2VfdGhyZWFkX2Z1bmN0aW9uKExQVk9JRCBhcmcpCi17Ci0gIHN0ZDo6YXV0b19wdHI8d2luY2VfdGhyZWFkOjpmdW5jX2Jhc2U+IGZ1bmMoCi0gICAgICBzdGF0aWNfY2FzdDx3aW5jZV90aHJlYWQ6OmZ1bmNfYmFzZSo+KGFyZykpOwotICBmdW5jLT5ydW4oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmIGRlZmluZWQoVU5ERVJfQ0UpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5DRV9USFJFQURfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X2FzeW5jX21hbmFnZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF9hc3luY19tYW5hZ2VyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5OTY2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X2FzeW5jX21hbmFnZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2lucnRfYXN5bmNfbWFuYWdlci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5SVF9BU1lOQ19NQU5BR0VSX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5SVF9BU1lOQ19NQU5BR0VSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hdG9taWNfY291bnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnJ0X2FzeW5jX29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHdpbnJ0X2FzeW5jX21hbmFnZXIKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8d2lucnRfYXN5bmNfbWFuYWdlcj4KLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIHdpbnJ0X2FzeW5jX21hbmFnZXIoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPHdpbnJ0X2FzeW5jX21hbmFnZXI+KGlvX3NlcnZpY2UpLAotICAgICAgaW9fc2VydmljZV8odXNlX3NlcnZpY2U8aW9fc2VydmljZV9pbXBsPihpb19zZXJ2aWNlKSksCi0gICAgICBvdXRzdGFuZGluZ19vcHNfKDEpCi0gIHsKLSAgfQotCi0gIC8vIERlc3RydWN0b3IuCi0gIH53aW5ydF9hc3luY19tYW5hZ2VyKCkKLSAgewotICB9Ci0KLSAgLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCkKLSAgewotICAgIGlmICgtLW91dHN0YW5kaW5nX29wc18gPiAwKQotICAgIHsKLSAgICAgIC8vIEJsb2NrIHVudGlsIGxhc3Qgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgotICAgICAgc3RkOjpmdXR1cmU8dm9pZD4gZiA9IHByb21pc2VfLmdldF9mdXR1cmUoKTsKLSAgICAgIGYud2FpdCgpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc3luYyhXaW5kb3dzOjpGb3VuZGF0aW9uOjpJQXN5bmNBY3Rpb25eIGFjdGlvbiwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OkZvdW5kYXRpb247Ci0gICAgdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6QXN5bmNTdGF0dXM7Ci0KLSAgICBhdXRvIHByb21pc2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6cHJvbWlzZTxhc2lvOjplcnJvcl9jb2RlPj4oKTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UtPmdldF9mdXR1cmUoKTsKLQotICAgIGFjdGlvbi0+Q29tcGxldGVkID0gcmVmIG5ldyBBc3luY0FjdGlvbkNvbXBsZXRlZEhhbmRsZXIoCi0gICAgICBbcHJvbWlzZV0oSUFzeW5jQWN0aW9uXiBhY3Rpb24sIEFzeW5jU3RhdHVzIHN0YXR1cykKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChzdGF0dXMpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBBc3luY1N0YXR1czo6Q2FuY2VsZWQ6Ci0gICAgICAgICAgcHJvbWlzZS0+c2V0X3ZhbHVlKGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQXN5bmNTdGF0dXM6OkVycm9yOgotICAgICAgICBjYXNlIEFzeW5jU3RhdHVzOjpDb21wbGV0ZWQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSBlYygKLSAgICAgICAgICAgICAgYWN0aW9uLT5FcnJvckNvZGUuVmFsdWUsCi0gICAgICAgICAgICAgIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgICAgICBwcm9taXNlLT5zZXRfdmFsdWUoZWMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgIGVjID0gZnV0dXJlLmdldCgpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRSZXN1bHQ+Ci0gIFRSZXN1bHQgc3luYyhXaW5kb3dzOjpGb3VuZGF0aW9uOjpJQXN5bmNPcGVyYXRpb248VFJlc3VsdD5eIG9wZXJhdGlvbiwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OkZvdW5kYXRpb247Ci0gICAgdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6QXN5bmNTdGF0dXM7Ci0KLSAgICBhdXRvIHByb21pc2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6cHJvbWlzZTxhc2lvOjplcnJvcl9jb2RlPj4oKTsKLSAgICBhdXRvIGZ1dHVyZSA9IHByb21pc2UtPmdldF9mdXR1cmUoKTsKLQotICAgIG9wZXJhdGlvbi0+Q29tcGxldGVkID0gcmVmIG5ldyBBc3luY09wZXJhdGlvbkNvbXBsZXRlZEhhbmRsZXI8VFJlc3VsdD4oCi0gICAgICBbcHJvbWlzZV0oSUFzeW5jT3BlcmF0aW9uPFRSZXN1bHQ+XiBvcGVyYXRpb24sIEFzeW5jU3RhdHVzIHN0YXR1cykKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChzdGF0dXMpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBBc3luY1N0YXR1czo6Q2FuY2VsZWQ6Ci0gICAgICAgICAgcHJvbWlzZS0+c2V0X3ZhbHVlKGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQXN5bmNTdGF0dXM6OkVycm9yOgotICAgICAgICBjYXNlIEFzeW5jU3RhdHVzOjpDb21wbGV0ZWQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSBlYygKLSAgICAgICAgICAgICAgb3BlcmF0aW9uLT5FcnJvckNvZGUuVmFsdWUsCi0gICAgICAgICAgICAgIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgICAgICBwcm9taXNlLT5zZXRfdmFsdWUoZWMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgIGVjID0gZnV0dXJlLmdldCgpOwotICAgIHJldHVybiBvcGVyYXRpb24tPkdldFJlc3VsdHMoKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUUmVzdWx0LCB0eXBlbmFtZSBUUHJvZ3Jlc3M+Ci0gIFRSZXN1bHQgc3luYygKLSAgICAgIFdpbmRvd3M6OkZvdW5kYXRpb246OklBc3luY09wZXJhdGlvbldpdGhQcm9ncmVzczwKLSAgICAgICAgVFJlc3VsdCwgVFByb2dyZXNzPl4gb3BlcmF0aW9uLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICB1c2luZyBuYW1lc3BhY2UgV2luZG93czo6Rm91bmRhdGlvbjsKLSAgICB1c2luZyBXaW5kb3dzOjpGb3VuZGF0aW9uOjpBc3luY1N0YXR1czsKLQotICAgIGF1dG8gcHJvbWlzZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjpwcm9taXNlPGFzaW86OmVycm9yX2NvZGU+PigpOwotICAgIGF1dG8gZnV0dXJlID0gcHJvbWlzZS0+Z2V0X2Z1dHVyZSgpOwotCi0gICAgb3BlcmF0aW9uLT5Db21wbGV0ZWQKLSAgICAgID0gcmVmIG5ldyBBc3luY09wZXJhdGlvbldpdGhQcm9ncmVzc0NvbXBsZXRlZEhhbmRsZXI8VFJlc3VsdCwgVFByb2dyZXNzPigKLSAgICAgICAgW3Byb21pc2VdKElBc3luY09wZXJhdGlvbldpdGhQcm9ncmVzczxUUmVzdWx0LCBUUHJvZ3Jlc3M+XiBvcGVyYXRpb24sCi0gICAgICAgICAgQXN5bmNTdGF0dXMgc3RhdHVzKQotICAgICAgICB7Ci0gICAgICAgICAgc3dpdGNoIChzdGF0dXMpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgQXN5bmNTdGF0dXM6OkNhbmNlbGVkOgotICAgICAgICAgICAgcHJvbWlzZS0+c2V0X3ZhbHVlKGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIEFzeW5jU3RhdHVzOjpTdGFydGVkOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBBc3luY1N0YXR1czo6RXJyb3I6Ci0gICAgICAgICAgY2FzZSBBc3luY1N0YXR1czo6Q29tcGxldGVkOgotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhc2lvOjplcnJvcl9jb2RlIGVjKAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi0+RXJyb3JDb2RlLlZhbHVlLAotICAgICAgICAgICAgICAgIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgICAgICAgIHByb21pc2UtPnNldF92YWx1ZShlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgZWMgPSBmdXR1cmUuZ2V0KCk7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbi0+R2V0UmVzdWx0cygpOwotICB9Ci0KLSAgdm9pZCBhc3luYyhXaW5kb3dzOjpGb3VuZGF0aW9uOjpJQXN5bmNBY3Rpb25eIGFjdGlvbiwKLSAgICAgIHdpbnJ0X2FzeW5jX29wPHZvaWQ+KiBoYW5kbGVyKQotICB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OkZvdW5kYXRpb247Ci0gICAgdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6QXN5bmNTdGF0dXM7Ci0KLSAgICBhdXRvIG9uX2NvbXBsZXRlZCA9IHJlZiBuZXcgQXN5bmNBY3Rpb25Db21wbGV0ZWRIYW5kbGVyKAotICAgICAgW3RoaXMsIGhhbmRsZXJdKElBc3luY0FjdGlvbl4gYWN0aW9uLCBBc3luY1N0YXR1cyBzdGF0dXMpCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdHVzKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgQXN5bmNTdGF0dXM6OkNhbmNlbGVkOgotICAgICAgICAgIGhhbmRsZXItPmVjXyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBc3luY1N0YXR1czo6U3RhcnRlZDoKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgQXN5bmNTdGF0dXM6OkNvbXBsZXRlZDoKLSAgICAgICAgY2FzZSBBc3luY1N0YXR1czo6RXJyb3I6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaGFuZGxlci0+ZWNfID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgICAgICAgICAgYWN0aW9uLT5FcnJvckNvZGUuVmFsdWUsCi0gICAgICAgICAgICAgIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpb19zZXJ2aWNlXy5wb3N0X2RlZmVycmVkX2NvbXBsZXRpb24oaGFuZGxlcik7Ci0gICAgICAgIGlmICgtLW91dHN0YW5kaW5nX29wc18gPT0gMCkKLSAgICAgICAgICBwcm9taXNlXy5zZXRfdmFsdWUoKTsKLSAgICAgIH0pOwotCi0gICAgaW9fc2VydmljZV8ud29ya19zdGFydGVkKCk7Ci0gICAgKytvdXRzdGFuZGluZ19vcHNfOwotICAgIGFjdGlvbi0+Q29tcGxldGVkID0gb25fY29tcGxldGVkOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRSZXN1bHQ+Ci0gIHZvaWQgYXN5bmMoV2luZG93czo6Rm91bmRhdGlvbjo6SUFzeW5jT3BlcmF0aW9uPFRSZXN1bHQ+XiBvcGVyYXRpb24sCi0gICAgICB3aW5ydF9hc3luY19vcDxUUmVzdWx0PiogaGFuZGxlcikKLSAgewotICAgIHVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpGb3VuZGF0aW9uOwotICAgIHVzaW5nIFdpbmRvd3M6OkZvdW5kYXRpb246OkFzeW5jU3RhdHVzOwotCi0gICAgYXV0byBvbl9jb21wbGV0ZWQgPSByZWYgbmV3IEFzeW5jT3BlcmF0aW9uQ29tcGxldGVkSGFuZGxlcjxUUmVzdWx0PigKLSAgICAgIFt0aGlzLCBoYW5kbGVyXShJQXN5bmNPcGVyYXRpb248VFJlc3VsdD5eIG9wZXJhdGlvbiwgQXN5bmNTdGF0dXMgc3RhdHVzKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKHN0YXR1cykKLSAgICAgICAgewotICAgICAgICBjYXNlIEFzeW5jU3RhdHVzOjpDYW5jZWxlZDoKLSAgICAgICAgICBoYW5kbGVyLT5lY18gPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQXN5bmNTdGF0dXM6OlN0YXJ0ZWQ6Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIEFzeW5jU3RhdHVzOjpDb21wbGV0ZWQ6Ci0gICAgICAgICAgaGFuZGxlci0+cmVzdWx0XyA9IG9wZXJhdGlvbi0+R2V0UmVzdWx0cygpOwotICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaC4KLSAgICAgICAgY2FzZSBBc3luY1N0YXR1czo6RXJyb3I6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaGFuZGxlci0+ZWNfID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgICAgICAgICAgb3BlcmF0aW9uLT5FcnJvckNvZGUuVmFsdWUsCi0gICAgICAgICAgICAgIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpb19zZXJ2aWNlXy5wb3N0X2RlZmVycmVkX2NvbXBsZXRpb24oaGFuZGxlcik7Ci0gICAgICAgIGlmICgtLW91dHN0YW5kaW5nX29wc18gPT0gMCkKLSAgICAgICAgICBwcm9taXNlXy5zZXRfdmFsdWUoKTsKLSAgICAgIH0pOwotCi0gICAgaW9fc2VydmljZV8ud29ya19zdGFydGVkKCk7Ci0gICAgKytvdXRzdGFuZGluZ19vcHNfOwotICAgIG9wZXJhdGlvbi0+Q29tcGxldGVkID0gb25fY29tcGxldGVkOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRSZXN1bHQsIHR5cGVuYW1lIFRQcm9ncmVzcz4KLSAgdm9pZCBhc3luYygKLSAgICAgIFdpbmRvd3M6OkZvdW5kYXRpb246OklBc3luY09wZXJhdGlvbldpdGhQcm9ncmVzczwKLSAgICAgICAgVFJlc3VsdCwgVFByb2dyZXNzPl4gb3BlcmF0aW9uLAotICAgICAgd2lucnRfYXN5bmNfb3A8VFJlc3VsdD4qIGhhbmRsZXIpCi0gIHsKLSAgICB1c2luZyBuYW1lc3BhY2UgV2luZG93czo6Rm91bmRhdGlvbjsKLSAgICB1c2luZyBXaW5kb3dzOjpGb3VuZGF0aW9uOjpBc3luY1N0YXR1czsKLQotICAgIGF1dG8gb25fY29tcGxldGVkCi0gICAgICA9IHJlZiBuZXcgQXN5bmNPcGVyYXRpb25XaXRoUHJvZ3Jlc3NDb21wbGV0ZWRIYW5kbGVyPFRSZXN1bHQsIFRQcm9ncmVzcz4oCi0gICAgICAgIFt0aGlzLCBoYW5kbGVyXShJQXN5bmNPcGVyYXRpb25XaXRoUHJvZ3Jlc3M8Ci0gICAgICAgICAgVFJlc3VsdCwgVFByb2dyZXNzPl4gb3BlcmF0aW9uLCBBc3luY1N0YXR1cyBzdGF0dXMpCi0gICAgICAgIHsKLSAgICAgICAgICBzd2l0Y2ggKHN0YXR1cykKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBBc3luY1N0YXR1czo6Q2FuY2VsZWQ6Ci0gICAgICAgICAgICBoYW5kbGVyLT5lY18gPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIEFzeW5jU3RhdHVzOjpTdGFydGVkOgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIGNhc2UgQXN5bmNTdGF0dXM6OkNvbXBsZXRlZDoKLSAgICAgICAgICAgIGhhbmRsZXItPnJlc3VsdF8gPSBvcGVyYXRpb24tPkdldFJlc3VsdHMoKTsKLSAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaC4KLSAgICAgICAgICBjYXNlIEFzeW5jU3RhdHVzOjpFcnJvcjoKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaGFuZGxlci0+ZWNfID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24tPkVycm9yQ29kZS5WYWx1ZSwKLSAgICAgICAgICAgICAgICBhc2lvOjpzeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW9fc2VydmljZV8ucG9zdF9kZWZlcnJlZF9jb21wbGV0aW9uKGhhbmRsZXIpOwotICAgICAgICAgIGlmICgtLW91dHN0YW5kaW5nX29wc18gPT0gMCkKLSAgICAgICAgICAgIHByb21pc2VfLnNldF92YWx1ZSgpOwotICAgICAgICB9KTsKLQotICAgIGlvX3NlcnZpY2VfLndvcmtfc3RhcnRlZCgpOwotICAgICsrb3V0c3RhbmRpbmdfb3BzXzsKLSAgICBvcGVyYXRpb24tPkNvbXBsZXRlZCA9IG9uX2NvbXBsZXRlZDsKLSAgfQotCi1wcml2YXRlOgotICAvLyBUaGUgaW9fc2VydmljZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHBvc3QgY29tcGxldGVkIGhhbmRsZXJzLgotICBpb19zZXJ2aWNlX2ltcGwmIGlvX3NlcnZpY2VfOwotCi0gIC8vIENvdW50IG9mIG91dHN0YW5kaW5nIG9wZXJhdGlvbnMuCi0gIGF0b21pY19jb3VudCBvdXRzdGFuZGluZ19vcHNfOwotCi0gIC8vIFVzZWQgdG8ga2VlcCB3YWl0IGZvciBvdXRzdGFuZGluZyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlLgotICBzdGQ6OnByb21pc2U8dm9pZD4gcHJvbWlzZV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5SVF9BU1lOQ19NQU5BR0VSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF9hc3luY19vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X2FzeW5jX29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYzBkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X2FzeW5jX29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2lucnRfYXN5bmNfb3AuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTlJUX0FTWU5DX09QX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5SVF9BU1lOQ19PUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9vcGVyYXRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUUmVzdWx0PgotY2xhc3Mgd2lucnRfYXN5bmNfb3AKLSAgOiBwdWJsaWMgb3BlcmF0aW9uCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBlcnJvciBjb2RlIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGxldGlvbiBoYW5kbGVyLgotICBhc2lvOjplcnJvcl9jb2RlIGVjXzsKLQotICAvLyBUaGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24sIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGxldGlvbiBoYW5kbGVyLgotICBUUmVzdWx0IHJlc3VsdF87Ci0KLXByb3RlY3RlZDoKLSAgd2lucnRfYXN5bmNfb3AoZnVuY190eXBlIGNvbXBsZXRlX2Z1bmMpCi0gICAgOiBvcGVyYXRpb24oY29tcGxldGVfZnVuYyksCi0gICAgICByZXN1bHRfKCkKLSAgewotICB9Ci19OwotCi10ZW1wbGF0ZSA8PgotY2xhc3Mgd2lucnRfYXN5bmNfb3A8dm9pZD4KLSAgOiBwdWJsaWMgb3BlcmF0aW9uCi17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBlcnJvciBjb2RlIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGxldGlvbiBoYW5kbGVyLgotICBhc2lvOjplcnJvcl9jb2RlIGVjXzsKLQotcHJvdGVjdGVkOgotICB3aW5ydF9hc3luY19vcChmdW5jX3R5cGUgY29tcGxldGVfZnVuYykKLSAgICA6IG9wZXJhdGlvbihjb21wbGV0ZV9mdW5jKQotICB7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0lOUlRfQVNZTkNfT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3Jlc29sdmVfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF9yZXNvbHZlX29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0NTJmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3Jlc29sdmVfb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2lucnRfcmVzb2x2ZV9vcC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5SVF9SRVNPTFZFX09QX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5SVF9SRVNPTFZFX09QX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2lucnRfYXN5bmNfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIHdpbnJ0X3Jlc29sdmVfb3AgOgotICBwdWJsaWMgd2lucnRfYXN5bmNfb3A8Ci0gICAgV2luZG93czo6Rm91bmRhdGlvbjo6Q29sbGVjdGlvbnM6OklWZWN0b3JWaWV3PAotICAgICAgV2luZG93czo6TmV0d29ya2luZzo6RW5kcG9pbnRQYWlyXj5ePgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUih3aW5ydF9yZXNvbHZlX29wKTsKLQotICB0eXBlZGVmIHR5cGVuYW1lIFByb3RvY29sOjplbmRwb2ludCBlbmRwb2ludF90eXBlOwotICB0eXBlZGVmIGFzaW86OmlwOjpiYXNpY19yZXNvbHZlcl9xdWVyeTxQcm90b2NvbD4gcXVlcnlfdHlwZTsKLSAgdHlwZWRlZiBhc2lvOjppcDo6YmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3I8UHJvdG9jb2w+IGl0ZXJhdG9yX3R5cGU7Ci0KLSAgd2lucnRfcmVzb2x2ZV9vcChjb25zdCBxdWVyeV90eXBlJiBxdWVyeSwgSGFuZGxlciYgaGFuZGxlcikKLSAgICA6IHdpbnJ0X2FzeW5jX29wPAotICAgICAgICBXaW5kb3dzOjpGb3VuZGF0aW9uOjpDb2xsZWN0aW9uczo6SVZlY3RvclZpZXc8Ci0gICAgICAgICAgV2luZG93czo6TmV0d29ya2luZzo6RW5kcG9pbnRQYWlyXj5ePigKLSAgICAgICAgICAgICZ3aW5ydF9yZXNvbHZlX29wOjpkb19jb21wbGV0ZSksCi0gICAgICBxdWVyeV8ocXVlcnkpLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmLCBzdGQ6OnNpemVfdCkKLSAgewotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBvcGVyYXRpb24gb2JqZWN0LgotICAgIHdpbnJ0X3Jlc29sdmVfb3AqIG8oc3RhdGljX2Nhc3Q8d2lucnRfcmVzb2x2ZV9vcCo+KGJhc2UpKTsKLSAgICBwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2Yoby0+aGFuZGxlcl8pLCBvLCBvIH07Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ09NUExFVElPTigobykpOwotCi0gICAgaXRlcmF0b3JfdHlwZSBpdGVyYXRvciA9IGl0ZXJhdG9yX3R5cGUoKTsKLSAgICBpZiAoIW8tPmVjXykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaXRlcmF0b3IgPSBpdGVyYXRvcl90eXBlOjpjcmVhdGUoCi0gICAgICAgICAgICBvLT5yZXN1bHRfLCBvLT5xdWVyeV8uaGludHMoKSwKLSAgICAgICAgICAgIG8tPnF1ZXJ5Xy5ob3N0X25hbWUoKSwgby0+cXVlcnlfLnNlcnZpY2VfbmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChQbGF0Zm9ybTo6RXhjZXB0aW9uXiBlKQotICAgICAgewotICAgICAgICBvLT5lY18gPSBhc2lvOjplcnJvcl9jb2RlKGUtPkhSZXN1bHQsCi0gICAgICAgICAgICBhc2lvOjpzeXN0ZW1fY2F0ZWdvcnkoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBkZWFsbG9jYXRlZCBiZWZvcmUKLSAgICAvLyB0aGUgdXBjYWxsIGlzIG1hZGUuIEV2ZW4gaWYgd2UncmUgbm90IGFib3V0IHRvIG1ha2UgYW4gdXBjYWxsLCBhCi0gICAgLy8gc3ViLW9iamVjdCBvZiB0aGUgaGFuZGxlciBtYXkgYmUgdGhlIHRydWUgb3duZXIgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkCi0gICAgLy8gd2l0aCB0aGUgaGFuZGxlci4gQ29uc2VxdWVudGx5LCBhIGxvY2FsIGNvcHkgb2YgdGhlIGhhbmRsZXIgaXMgcmVxdWlyZWQKLSAgICAvLyB0byBlbnN1cmUgdGhhdCBhbnkgb3duaW5nIHN1Yi1vYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlciB3ZSBoYXZlCi0gICAgLy8gZGVhbGxvY2F0ZWQgdGhlIG1lbW9yeSBoZXJlLgotICAgIGRldGFpbDo6YmluZGVyMjxIYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlLCBpdGVyYXRvcl90eXBlPgotICAgICAgaGFuZGxlcihvLT5oYW5kbGVyXywgby0+ZWNfLCBpdGVyYXRvcik7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sIGhhbmRsZXIuYXJnMl8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBxdWVyeV90eXBlIHF1ZXJ5XzsKLSAgSGFuZGxlciBoYW5kbGVyXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTlJUX1JFU09MVkVfT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3Jlc29sdmVyX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF9yZXNvbHZlcl9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyMDcxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3Jlc29sdmVyX3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2lucnRfcmVzb2x2ZXJfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5SVF9SRVNPTFZFUl9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5SVF9SRVNPTFZFUl9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfcXVlcnkuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfb3BzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5ydF9hc3luY19tYW5hZ2VyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5ydF9yZXNvbHZlX29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5ydF91dGlscy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotY2xhc3Mgd2lucnRfcmVzb2x2ZXJfc2VydmljZQotewotcHVibGljOgotICAvLyBUaGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiB0aGUgcmVzb2x2ZXIuIEEgY2FuY2VsbGF0aW9uIHRva2VuIGlzIHVzZWQgdG8KLSAgLy8gaW5kaWNhdGUgdG8gdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdGhhdCB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuCi0gIC8vIGNhbmNlbGxlZC4KLSAgdHlwZWRlZiBzb2NrZXRfb3BzOjpzaGFyZWRfY2FuY2VsX3Rva2VuX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLQotICAvLyBUaGUgZW5kcG9pbnQgdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQgZW5kcG9pbnRfdHlwZTsKLQotICAvLyBUaGUgcXVlcnkgdHlwZS4KLSAgdHlwZWRlZiBhc2lvOjppcDo6YmFzaWNfcmVzb2x2ZXJfcXVlcnk8UHJvdG9jb2w+IHF1ZXJ5X3R5cGU7Ci0KLSAgLy8gVGhlIGl0ZXJhdG9yIHR5cGUuCi0gIHR5cGVkZWYgYXNpbzo6aXA6OmJhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yPFByb3RvY29sPiBpdGVyYXRvcl90eXBlOwotCi0gIC8vIENvbnN0cnVjdG9yLgotICB3aW5ydF9yZXNvbHZlcl9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBpb19zZXJ2aWNlXyh1c2Vfc2VydmljZTxpb19zZXJ2aWNlX2ltcGw+KGlvX3NlcnZpY2UpKSwKLSAgICAgIGFzeW5jX21hbmFnZXJfKHVzZV9zZXJ2aWNlPHdpbnJ0X2FzeW5jX21hbmFnZXI+KGlvX3NlcnZpY2UpKQotICB7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+d2lucnRfcmVzb2x2ZXJfc2VydmljZSgpCi0gIHsKLSAgfQotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIHZvaWQgc2h1dGRvd25fc2VydmljZSgpCi0gIHsKLSAgfQotCi0gIC8vIFBlcmZvcm0gYW55IGZvcmstcmVsYXRlZCBob3VzZWtlZXBpbmcuCi0gIHZvaWQgZm9ya19zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfZXZlbnQpCi0gIHsKLSAgfQotCi0gIC8vIENvbnN0cnVjdCBhIG5ldyByZXNvbHZlciBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBjb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYpCi0gIHsKLSAgfQotCi0gIC8vIERlc3Ryb3kgYSByZXNvbHZlciBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBkZXN0cm95KGltcGxlbWVudGF0aW9uX3R5cGUmKQotICB7Ci0gIH0KLQotICAvLyBDYW5jZWwgcGVuZGluZyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KLSAgdm9pZCBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYpCi0gIHsKLSAgfQotCi0gIC8vIFJlc29sdmUgYSBxdWVyeSB0byBhIGxpc3Qgb2YgZW50cmllcy4KLSAgaXRlcmF0b3JfdHlwZSByZXNvbHZlKGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgY29uc3QgcXVlcnlfdHlwZSYgcXVlcnksIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6Ok5ldHdvcmtpbmc6OlNvY2tldHM7Ci0gICAgICBhdXRvIGVuZHBvaW50X3BhaXJzID0gYXN5bmNfbWFuYWdlcl8uc3luYygKLSAgICAgICAgICBEYXRhZ3JhbVNvY2tldDo6R2V0RW5kcG9pbnRQYWlyc0FzeW5jKAotICAgICAgICAgICAgd2lucnRfdXRpbHM6Omhvc3RfbmFtZShxdWVyeS5ob3N0X25hbWUoKSksCi0gICAgICAgICAgICB3aW5ydF91dGlsczo6c3RyaW5nKHF1ZXJ5LnNlcnZpY2VfbmFtZSgpKSksIGVjKTsKLQotICAgICAgaWYgKGVjKQotICAgICAgICByZXR1cm4gaXRlcmF0b3JfdHlwZSgpOwotCi0gICAgICByZXR1cm4gaXRlcmF0b3JfdHlwZTo6Y3JlYXRlKAotICAgICAgICAgIGVuZHBvaW50X3BhaXJzLCBxdWVyeS5oaW50cygpLAotICAgICAgICAgIHF1ZXJ5Lmhvc3RfbmFtZSgpLCBxdWVyeS5zZXJ2aWNlX25hbWUoKSk7Ci0gICAgfQotICAgIGNhdGNoIChQbGF0Zm9ybTo6RXhjZXB0aW9uXiBlKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZShlLT5IUmVzdWx0LAotICAgICAgICAgIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgIHJldHVybiBpdGVyYXRvcl90eXBlKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQXN5bmNocm9ub3VzbHkgcmVzb2x2ZSBhIHF1ZXJ5IHRvIGEgbGlzdCBvZiBlbnRyaWVzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19yZXNvbHZlKGltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgY29uc3QgcXVlcnlfdHlwZSYgcXVlcnksIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBib29sIGlzX2NvbnRpbnVhdGlvbiA9Ci0gICAgICBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oaGFuZGxlcik7Ci0KLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgd2lucnRfcmVzb2x2ZV9vcDxQcm90b2NvbCwgSGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AocXVlcnksIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJyZXNvbHZlciIsICZpbXBsLCAiYXN5bmNfcmVzb2x2ZSIpKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIHVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpOZXR3b3JraW5nOjpTb2NrZXRzOwotICAgICAgYXN5bmNfbWFuYWdlcl8uYXN5bmMoRGF0YWdyYW1Tb2NrZXQ6OkdldEVuZHBvaW50UGFpcnNBc3luYygKLSAgICAgICAgICAgIHdpbnJ0X3V0aWxzOjpob3N0X25hbWUocXVlcnkuaG9zdF9uYW1lKCkpLAotICAgICAgICAgICAgd2lucnRfdXRpbHM6OnN0cmluZyhxdWVyeS5zZXJ2aWNlX25hbWUoKSkpLCBwLnApOwotICAgICAgcC52ID0gcC5wID0gMDsKLSAgICB9Ci0gICAgY2F0Y2ggKFBsYXRmb3JtOjpFeGNlcHRpb25eIGUpCi0gICAgewotICAgICAgcC5wLT5lY18gPSBhc2lvOjplcnJvcl9jb2RlKAotICAgICAgICAgIGUtPkhSZXN1bHQsIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICAgIGlvX3NlcnZpY2VfLnBvc3RfaW1tZWRpYXRlX2NvbXBsZXRpb24ocC5wLCBpc19jb250aW51YXRpb24pOwotICAgICAgcC52ID0gcC5wID0gMDsKLSAgICB9Ci0gIH0KLQotICAvLyBSZXNvbHZlIGFuIGVuZHBvaW50IHRvIGEgbGlzdCBvZiBlbnRyaWVzLgotICBpdGVyYXRvcl90eXBlIHJlc29sdmUoaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gaXRlcmF0b3JfdHlwZSgpOwotICB9Ci0KLSAgLy8gQXN5bmNocm9ub3VzbHkgcmVzb2x2ZSBhbiBlbmRwb2ludCB0byBhIGxpc3Qgb2YgZW50cmllcy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVzb2x2ZShpbXBsZW1lbnRhdGlvbl90eXBlJiwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICBjb25zdCBpdGVyYXRvcl90eXBlIGl0ZXJhdG9yOwotICAgIGlvX3NlcnZpY2VfLmdldF9pb19zZXJ2aWNlKCkucG9zdCgKLSAgICAgICAgZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlciwgZWMsIGl0ZXJhdG9yKSk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgaW9fc2VydmljZV9pbXBsJiBpb19zZXJ2aWNlXzsKLSAgd2lucnRfYXN5bmNfbWFuYWdlciYgYXN5bmNfbWFuYWdlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5SVF9SRVNPTFZFUl9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF9zb2NrZXRfY29ubmVjdF9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3NvY2tldF9jb25uZWN0X29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmNDJiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3NvY2tldF9jb25uZWN0X29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2lucnRfc29ja2V0X2Nvbm5lY3Rfb3AuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTlJUX1NPQ0tFVF9DT05ORUNUX09QX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5SVF9TT0NLRVRfQ09OTkVDVF9PUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ZlbmNlZF9ibG9jay5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5ydF9hc3luY19vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyB3aW5ydF9zb2NrZXRfY29ubmVjdF9vcCA6Ci0gIHB1YmxpYyB3aW5ydF9hc3luY19vcDx2b2lkPgotewotcHVibGljOgotICBBU0lPX0RFRklORV9IQU5ETEVSX1BUUih3aW5ydF9zb2NrZXRfY29ubmVjdF9vcCk7Ci0KLSAgd2lucnRfc29ja2V0X2Nvbm5lY3Rfb3AoSGFuZGxlciYgaGFuZGxlcikKLSAgICA6IHdpbnJ0X2FzeW5jX29wPHZvaWQ+KCZ3aW5ydF9zb2NrZXRfY29ubmVjdF9vcDo6ZG9fY29tcGxldGUpLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmLCBzdGQ6OnNpemVfdCkKLSAgewotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBvcGVyYXRpb24gb2JqZWN0LgotICAgIHdpbnJ0X3NvY2tldF9jb25uZWN0X29wKiBvKHN0YXRpY19jYXN0PHdpbnJ0X3NvY2tldF9jb25uZWN0X29wKj4oYmFzZSkpOwotICAgIHB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihvLT5oYW5kbGVyXyksIG8sIG8gfTsKLQotICAgIEFTSU9fSEFORExFUl9DT01QTEVUSU9OKChvKSk7Ci0KLSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgaGFuZGxlciBzbyB0aGF0IHRoZSBtZW1vcnkgY2FuIGJlIGRlYWxsb2NhdGVkIGJlZm9yZQotICAgIC8vIHRoZSB1cGNhbGwgaXMgbWFkZS4gRXZlbiBpZiB3ZSdyZSBub3QgYWJvdXQgdG8gbWFrZSBhbiB1cGNhbGwsIGEKLSAgICAvLyBzdWItb2JqZWN0IG9mIHRoZSBoYW5kbGVyIG1heSBiZSB0aGUgdHJ1ZSBvd25lciBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKLSAgICAvLyB3aXRoIHRoZSBoYW5kbGVyLiBDb25zZXF1ZW50bHksIGEgbG9jYWwgY29weSBvZiB0aGUgaGFuZGxlciBpcyByZXF1aXJlZAotICAgIC8vIHRvIGVuc3VyZSB0aGF0IGFueSBvd25pbmcgc3ViLW9iamVjdCByZW1haW5zIHZhbGlkIHVudGlsIGFmdGVyIHdlIGhhdmUKLSAgICAvLyBkZWFsbG9jYXRlZCB0aGUgbWVtb3J5IGhlcmUuCi0gICAgZGV0YWlsOjpiaW5kZXIxPEhhbmRsZXIsIGFzaW86OmVycm9yX2NvZGU+Ci0gICAgICBoYW5kbGVyKG8tPmhhbmRsZXJfLCBvLT5lY18pOwotICAgIHAuaCA9IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKGhhbmRsZXIuaGFuZGxlcl8pOwotICAgIHAucmVzZXQoKTsKLQotICAgIC8vIE1ha2UgdGhlIHVwY2FsbCBpZiByZXF1aXJlZC4KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgZmVuY2VkX2Jsb2NrIGIoZmVuY2VkX2Jsb2NrOjpoYWxmKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0JFR0lOKChoYW5kbGVyLmFyZzFfLCBoYW5kbGVyLmFyZzJfKSk7Ci0gICAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoYW5kbGVyLCBoYW5kbGVyLmhhbmRsZXJfKTsKLSAgICAgIEFTSU9fSEFORExFUl9JTlZPQ0FUSU9OX0VORDsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZToKLSAgSGFuZGxlciBoYW5kbGVyXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTlJUX1NPQ0tFVF9DT05ORUNUX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF9zb2NrZXRfcmVjdl9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3NvY2tldF9yZWN2X29wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NDQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3NvY2tldF9yZWN2X29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbnJ0X3NvY2tldF9yZWN2X29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0RFVEFJTF9XSU5SVF9TT0NLRVRfUkVDVl9PUF9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOUlRfU09DS0VUX1JFQ1ZfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYWRkcmVzc29mLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9mZW5jZWRfYmxvY2suaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2lucnRfYXN5bmNfb3AuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyB3aW5ydF9zb2NrZXRfcmVjdl9vcCA6Ci0gIHB1YmxpYyB3aW5ydF9hc3luY19vcDxXaW5kb3dzOjpTdG9yYWdlOjpTdHJlYW1zOjpJQnVmZmVyXj4KLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIod2lucnRfc29ja2V0X3JlY3Zfb3ApOwotCi0gIHdpbnJ0X3NvY2tldF9yZWN2X29wKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgSGFuZGxlciYgaGFuZGxlcikKLSAgICA6IHdpbnJ0X2FzeW5jX29wPFdpbmRvd3M6OlN0b3JhZ2U6OlN0cmVhbXM6OklCdWZmZXJePigKLSAgICAgICAgICAmd2lucnRfc29ja2V0X3JlY3Zfb3A6OmRvX2NvbXBsZXRlKSwKLSAgICAgIGJ1ZmZlcnNfKGJ1ZmZlcnMpLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpCi0gIHsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIGRvX2NvbXBsZXRlKGlvX3NlcnZpY2VfaW1wbCogb3duZXIsIG9wZXJhdGlvbiogYmFzZSwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmLCBzdGQ6OnNpemVfdCkKLSAgewotICAgIC8vIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBvcGVyYXRpb24gb2JqZWN0LgotICAgIHdpbnJ0X3NvY2tldF9yZWN2X29wKiBvKHN0YXRpY19jYXN0PHdpbnJ0X3NvY2tldF9yZWN2X29wKj4oYmFzZSkpOwotICAgIHB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihvLT5oYW5kbGVyXyksIG8sIG8gfTsKLQotICAgIEFTSU9fSEFORExFUl9DT01QTEVUSU9OKChvKSk7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0gICAgLy8gQ2hlY2sgd2hldGhlciBidWZmZXJzIGFyZSBzdGlsbCB2YWxpZC4KLSAgICBpZiAob3duZXIpCi0gICAgewotICAgICAgYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6bXV0YWJsZV9idWZmZXIsCi0gICAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPjo6dmFsaWRhdGUoby0+YnVmZmVyc18pOwotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX0JVRkZFUl9ERUJVR0dJTkcpCi0KLSAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IG8tPnJlc3VsdF8gPyBvLT5yZXN1bHRfLT5MZW5ndGggOiAwOwotICAgIGlmIChieXRlc190cmFuc2ZlcnJlZCA9PSAwICYmICFvLT5lY18gJiYKLSAgICAgICAgIWJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86Om11dGFibGVfYnVmZmVyLAotICAgICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZT46OmFsbF9lbXB0eShvLT5idWZmZXJzXykpCi0gICAgewotICAgICAgby0+ZWNfID0gYXNpbzo6ZXJyb3I6OmVvZjsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgaGFuZGxlciBzbyB0aGF0IHRoZSBtZW1vcnkgY2FuIGJlIGRlYWxsb2NhdGVkIGJlZm9yZQotICAgIC8vIHRoZSB1cGNhbGwgaXMgbWFkZS4gRXZlbiBpZiB3ZSdyZSBub3QgYWJvdXQgdG8gbWFrZSBhbiB1cGNhbGwsIGEKLSAgICAvLyBzdWItb2JqZWN0IG9mIHRoZSBoYW5kbGVyIG1heSBiZSB0aGUgdHJ1ZSBvd25lciBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQKLSAgICAvLyB3aXRoIHRoZSBoYW5kbGVyLiBDb25zZXF1ZW50bHksIGEgbG9jYWwgY29weSBvZiB0aGUgaGFuZGxlciBpcyByZXF1aXJlZAotICAgIC8vIHRvIGVuc3VyZSB0aGF0IGFueSBvd25pbmcgc3ViLW9iamVjdCByZW1haW5zIHZhbGlkIHVudGlsIGFmdGVyIHdlIGhhdmUKLSAgICAvLyBkZWFsbG9jYXRlZCB0aGUgbWVtb3J5IGhlcmUuCi0gICAgZGV0YWlsOjpiaW5kZXIyPEhhbmRsZXIsIGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90PgotICAgICAgaGFuZGxlcihvLT5oYW5kbGVyXywgby0+ZWNfLCBieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sIGhhbmRsZXIuYXJnMl8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBNdXRhYmxlQnVmZmVyU2VxdWVuY2UgYnVmZmVyc187Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5SVF9TT0NLRVRfUkVDVl9PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2lucnRfc29ja2V0X3NlbmRfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF9zb2NrZXRfc2VuZF9vcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MzQ1NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF9zb2NrZXRfc2VuZF9vcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5ydF9zb2NrZXRfc2VuZF9vcC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOUlRfU09DS0VUX1NFTkRfT1BfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTlJUX1NPQ0tFVF9TRU5EX09QX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FkZHJlc3NvZi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZmVuY2VkX2Jsb2NrLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnJ0X2FzeW5jX29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIHdpbnJ0X3NvY2tldF9zZW5kX29wIDoKLSAgcHVibGljIHdpbnJ0X2FzeW5jX29wPHVuc2lnbmVkIGludD4KLXsKLXB1YmxpYzoKLSAgQVNJT19ERUZJTkVfSEFORExFUl9QVFIod2lucnRfc29ja2V0X3NlbmRfb3ApOwotCi0gIHdpbnJ0X3NvY2tldF9zZW5kX29wKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIEhhbmRsZXImIGhhbmRsZXIpCi0gICAgOiB3aW5ydF9hc3luY19vcDx1bnNpZ25lZCBpbnQ+KCZ3aW5ydF9zb2NrZXRfc2VuZF9vcDo6ZG9fY29tcGxldGUpLAotICAgICAgYnVmZmVyc18oYnVmZmVycyksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSAgc3RhdGljIHZvaWQgZG9fY29tcGxldGUoaW9fc2VydmljZV9pbXBsKiBvd25lciwgb3BlcmF0aW9uKiBiYXNlLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYsIHN0ZDo6c2l6ZV90KQotICB7Ci0gICAgLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIG9wZXJhdGlvbiBvYmplY3QuCi0gICAgd2lucnRfc29ja2V0X3NlbmRfb3AqIG8oc3RhdGljX2Nhc3Q8d2lucnRfc29ja2V0X3NlbmRfb3AqPihiYXNlKSk7Ci0gICAgcHRyIHAgPSB7IGFzaW86OmRldGFpbDo6YWRkcmVzc29mKG8tPmhhbmRsZXJfKSwgbywgbyB9OwotCi0gICAgQVNJT19IQU5ETEVSX0NPTVBMRVRJT04oKG8pKTsKLQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfQlVGRkVSX0RFQlVHR0lORykKLSAgICAvLyBDaGVjayB3aGV0aGVyIGJ1ZmZlcnMgYXJlIHN0aWxsIHZhbGlkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjpjb25zdF9idWZmZXIsCi0gICAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZT46OnZhbGlkYXRlKG8tPmJ1ZmZlcnNfKTsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9CVUZGRVJfREVCVUdHSU5HKQotCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBkZWFsbG9jYXRlZCBiZWZvcmUKLSAgICAvLyB0aGUgdXBjYWxsIGlzIG1hZGUuIEV2ZW4gaWYgd2UncmUgbm90IGFib3V0IHRvIG1ha2UgYW4gdXBjYWxsLCBhCi0gICAgLy8gc3ViLW9iamVjdCBvZiB0aGUgaGFuZGxlciBtYXkgYmUgdGhlIHRydWUgb3duZXIgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkCi0gICAgLy8gd2l0aCB0aGUgaGFuZGxlci4gQ29uc2VxdWVudGx5LCBhIGxvY2FsIGNvcHkgb2YgdGhlIGhhbmRsZXIgaXMgcmVxdWlyZWQKLSAgICAvLyB0byBlbnN1cmUgdGhhdCBhbnkgb3duaW5nIHN1Yi1vYmplY3QgcmVtYWlucyB2YWxpZCB1bnRpbCBhZnRlciB3ZSBoYXZlCi0gICAgLy8gZGVhbGxvY2F0ZWQgdGhlIG1lbW9yeSBoZXJlLgotICAgIGRldGFpbDo6YmluZGVyMjxIYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdD4KLSAgICAgIGhhbmRsZXIoby0+aGFuZGxlcl8sIG8tPmVjXywgby0+cmVzdWx0Xyk7Ci0gICAgcC5oID0gYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlci5oYW5kbGVyXyk7Ci0gICAgcC5yZXNldCgpOwotCi0gICAgLy8gTWFrZSB0aGUgdXBjYWxsIGlmIHJlcXVpcmVkLgotICAgIGlmIChvd25lcikKLSAgICB7Ci0gICAgICBmZW5jZWRfYmxvY2sgYihmZW5jZWRfYmxvY2s6OmhhbGYpOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fQkVHSU4oKGhhbmRsZXIuYXJnMV8sIGhhbmRsZXIuYXJnMl8pKTsKLSAgICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKGhhbmRsZXIsIGhhbmRsZXIuaGFuZGxlcl8pOwotICAgICAgQVNJT19IQU5ETEVSX0lOVk9DQVRJT05fRU5EOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBDb25zdEJ1ZmZlclNlcXVlbmNlIGJ1ZmZlcnNfOwotICBIYW5kbGVyIGhhbmRsZXJfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0lOUlRfU09DS0VUX1NFTkRfT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3Nzb2NrZXRfc2VydmljZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3Nzb2NrZXRfc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMTE5MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF9zc29ja2V0X3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2lucnRfc3NvY2tldF9zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOUlRfU1NPQ0tFVF9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5SVF9TU09DS0VUX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnJ0X3NvY2tldF9jb25uZWN0X29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2lucnRfdXRpbHMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLWNsYXNzIHdpbnJ0X3Nzb2NrZXRfc2VydmljZSA6Ci0gIHB1YmxpYyB3aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZQotewotcHVibGljOgotICAvLyBUaGUgcHJvdG9jb2wgdHlwZS4KLSAgdHlwZWRlZiBQcm90b2NvbCBwcm90b2NvbF90eXBlOwotCi0gIC8vIFRoZSBlbmRwb2ludCB0eXBlLgotICB0eXBlZGVmIHR5cGVuYW1lIFByb3RvY29sOjplbmRwb2ludCBlbmRwb2ludF90eXBlOwotCi0gIC8vIFRoZSBuYXRpdmUgdHlwZSBvZiBhIHNvY2tldC4KLSAgdHlwZWRlZiBXaW5kb3dzOjpOZXR3b3JraW5nOjpTb2NrZXRzOjpTdHJlYW1Tb2NrZXReIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICAvLyBUaGUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiB0aGUgc29ja2V0LgotICBzdHJ1Y3QgaW1wbGVtZW50YXRpb25fdHlwZSA6IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZQotICB7Ci0gICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICBpbXBsZW1lbnRhdGlvbl90eXBlKCkKLSAgICAgIDogYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlKCksCi0gICAgICAgIHByb3RvY29sXyhlbmRwb2ludF90eXBlKCkucHJvdG9jb2woKSkKLSAgICB7Ci0gICAgfQotCi0gICAgLy8gVGhlIHByb3RvY29sIGFzc29jaWF0ZWQgd2l0aCB0aGUgc29ja2V0LgotICAgIHByb3RvY29sX3R5cGUgcHJvdG9jb2xfOwotICB9OwotCi0gIC8vIENvbnN0cnVjdG9yLgotICB3aW5ydF9zc29ja2V0X3NlcnZpY2UoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlKGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vIE1vdmUtY29uc3RydWN0IGEgbmV3IHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHRoaXMtPmJhc2VfbW92ZV9jb25zdHJ1Y3QoaW1wbCwgb3RoZXJfaW1wbCk7Ci0KLSAgICBpbXBsLnByb3RvY29sXyA9IG90aGVyX2ltcGwucHJvdG9jb2xfOwotICAgIG90aGVyX2ltcGwucHJvdG9jb2xfID0gZW5kcG9pbnRfdHlwZSgpLnByb3RvY29sKCk7Ci0gIH0KLQotICAvLyBNb3ZlLWFzc2lnbiBmcm9tIGFub3RoZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICB3aW5ydF9zc29ja2V0X3NlcnZpY2UmIG90aGVyX3NlcnZpY2UsCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotICB7Ci0gICAgdGhpcy0+YmFzZV9tb3ZlX2Fzc2lnbihpbXBsLCBvdGhlcl9zZXJ2aWNlLCBvdGhlcl9pbXBsKTsKLQotICAgIGltcGwucHJvdG9jb2xfID0gb3RoZXJfaW1wbC5wcm90b2NvbF87Ci0gICAgb3RoZXJfaW1wbC5wcm90b2NvbF8gPSBlbmRwb2ludF90eXBlKCkucHJvdG9jb2woKTsKLSAgfQotCi0gIC8vIE1vdmUtY29uc3RydWN0IGEgbmV3IHNvY2tldCBpbXBsZW1lbnRhdGlvbiBmcm9tIGFub3RoZXIgcHJvdG9jb2wgdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sMT4KLSAgdm9pZCBjb252ZXJ0aW5nX21vdmVfY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICB0eXBlbmFtZSB3aW5ydF9zc29ja2V0X3NlcnZpY2U8Ci0gICAgICAgIFByb3RvY29sMT46OmltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi0gIHsKLSAgICB0aGlzLT5iYXNlX21vdmVfY29uc3RydWN0KGltcGwsIG90aGVyX2ltcGwpOwotCi0gICAgaW1wbC5wcm90b2NvbF8gPSBwcm90b2NvbF90eXBlKG90aGVyX2ltcGwucHJvdG9jb2xfKTsKLSAgICBvdGhlcl9pbXBsLnByb3RvY29sXyA9IHR5cGVuYW1lIFByb3RvY29sMTo6ZW5kcG9pbnQoKS5wcm90b2NvbCgpOwotICB9Ci0KLSAgLy8gT3BlbiBhIG5ldyBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgb3BlbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgaWYgKGlzX29wZW4oaW1wbCkpCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6YWxyZWFkeV9vcGVuOwotICAgICAgcmV0dXJuIGVjOwotICAgIH0KLQotICAgIHRyeQotICAgIHsKLSAgICAgIGltcGwuc29ja2V0XyA9IHJlZiBuZXcgV2luZG93czo6TmV0d29ya2luZzo6U29ja2V0czo6U3RyZWFtU29ja2V0OwotICAgICAgaW1wbC5wcm90b2NvbF8gPSBwcm90b2NvbDsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIH0KLSAgICBjYXRjaCAoUGxhdGZvcm06OkV4Y2VwdGlvbl4gZSkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoZS0+SFJlc3VsdCwKLSAgICAgICAgICAgIGFzaW86OnN5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBBc3NpZ24gYSBuYXRpdmUgc29ja2V0IHRvIGEgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX3NvY2tldCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgaWYgKGlzX29wZW4oaW1wbCkpCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6YWxyZWFkeV9vcGVuOwotICAgICAgcmV0dXJuIGVjOwotICAgIH0KLQotICAgIGltcGwuc29ja2V0XyA9IG5hdGl2ZV9zb2NrZXQ7Ci0gICAgaW1wbC5wcm90b2NvbF8gPSBwcm90b2NvbDsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLQotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIEJpbmQgdGhlIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIGxvY2FsIGVuZHBvaW50LgotICBhc2lvOjplcnJvcl9jb2RlIGJpbmQoaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGxvY2FsIGVuZHBvaW50LgotICBlbmRwb2ludF90eXBlIGxvY2FsX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIGVuZHBvaW50X3R5cGUgZW5kcG9pbnQ7Ci0gICAgZW5kcG9pbnQucmVzaXplKGRvX2dldF9lbmRwb2ludChpbXBsLCB0cnVlLAotICAgICAgICAgIGVuZHBvaW50LmRhdGEoKSwgZW5kcG9pbnQuc2l6ZSgpLCBlYykpOwotICAgIHJldHVybiBlbmRwb2ludDsKLSAgfQotCi0gIC8vIEdldCB0aGUgcmVtb3RlIGVuZHBvaW50LgotICBlbmRwb2ludF90eXBlIHJlbW90ZV9lbmRwb2ludChjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICBlbmRwb2ludF90eXBlIGVuZHBvaW50OwotICAgIGVuZHBvaW50LnJlc2l6ZShkb19nZXRfZW5kcG9pbnQoaW1wbCwgZmFsc2UsCi0gICAgICAgICAgZW5kcG9pbnQuZGF0YSgpLCBlbmRwb2ludC5zaXplKCksIGVjKSk7Ci0gICAgcmV0dXJuIGVuZHBvaW50OwotICB9Ci0KLSAgLy8gU2V0IGEgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wdGlvbj4KLSAgYXNpbzo6ZXJyb3JfY29kZSBzZXRfb3B0aW9uKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBPcHRpb24mIG9wdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gZG9fc2V0X29wdGlvbihpbXBsLCBvcHRpb24ubGV2ZWwoaW1wbC5wcm90b2NvbF8pLAotICAgICAgICBvcHRpb24ubmFtZShpbXBsLnByb3RvY29sXyksIG9wdGlvbi5kYXRhKGltcGwucHJvdG9jb2xfKSwKLSAgICAgICAgb3B0aW9uLnNpemUoaW1wbC5wcm90b2NvbF8pLCBlYyk7Ci0gIH0KLQotICAvLyBHZXQgYSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIGdldF9vcHRpb24oY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIE9wdGlvbiYgb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHN0ZDo6c2l6ZV90IHNpemUgPSBvcHRpb24uc2l6ZShpbXBsLnByb3RvY29sXyk7Ci0gICAgZG9fZ2V0X29wdGlvbihpbXBsLCBvcHRpb24ubGV2ZWwoaW1wbC5wcm90b2NvbF8pLAotICAgICAgICBvcHRpb24ubmFtZShpbXBsLnByb3RvY29sXyksCi0gICAgICAgIG9wdGlvbi5kYXRhKGltcGwucHJvdG9jb2xfKSwgJnNpemUsIGVjKTsKLSAgICBpZiAoIWVjKQotICAgICAgb3B0aW9uLnJlc2l6ZShpbXBsLnByb3RvY29sXywgc2l6ZSk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gQ29ubmVjdCB0aGUgc29ja2V0IHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gIGFzaW86OmVycm9yX2NvZGUgY29ubmVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgcGVlcl9lbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gZG9fY29ubmVjdChpbXBsLCBwZWVyX2VuZHBvaW50LmRhdGEoKSwgZWMpOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIGNvbm5lY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX2Nvbm5lY3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIHBlZXJfZW5kcG9pbnQsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBib29sIGlzX2NvbnRpbnVhdGlvbiA9Ci0gICAgICBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oaGFuZGxlcik7Ci0KLSAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGFuIG9wZXJhdGlvbiB0byB3cmFwIHRoZSBoYW5kbGVyLgotICAgIHR5cGVkZWYgd2lucnRfc29ja2V0X2Nvbm5lY3Rfb3A8SGFuZGxlcj4gb3A7Ci0gICAgdHlwZW5hbWUgb3A6OnB0ciBwID0geyBhc2lvOjpkZXRhaWw6OmFkZHJlc3NvZihoYW5kbGVyKSwKLSAgICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZW9mKG9wKSwgaGFuZGxlciksIDAgfTsKLSAgICBwLnAgPSBuZXcgKHAudikgb3AoaGFuZGxlcik7Ci0KLSAgICBBU0lPX0hBTkRMRVJfQ1JFQVRJT04oKHAucCwgInNvY2tldCIsICZpbXBsLCAiYXN5bmNfY29ubmVjdCIpKTsKLQotICAgIHN0YXJ0X2Nvbm5lY3Rfb3AoaW1wbCwgcGVlcl9lbmRwb2ludC5kYXRhKCksIHAucCwgaXNfY29udGludWF0aW9uKTsKLSAgICBwLnYgPSBwLnAgPSAwOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XSU5SVF9TU09DS0VUX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjkwNjUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTlJUX1NTT0NLRVRfU0VSVklDRV9CQVNFX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5SVF9TU09DS0VUX1NFUlZJQ0VfQkFTRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0KLSNpbmNsdWRlICJhc2lvL2J1ZmZlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NvY2tldF9iYXNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2J1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnJ0X2FzeW5jX21hbmFnZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnJ0X3NvY2tldF9yZWN2X29wLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5ydF9zb2NrZXRfc2VuZF9vcC5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgd2lucnRfc3NvY2tldF9zZXJ2aWNlX2Jhc2UKLXsKLXB1YmxpYzoKLSAgLy8gVGhlIG5hdGl2ZSB0eXBlIG9mIGEgc29ja2V0LgotICB0eXBlZGVmIFdpbmRvd3M6Ok5ldHdvcmtpbmc6OlNvY2tldHM6OlN0cmVhbVNvY2tldF4gbmF0aXZlX2hhbmRsZV90eXBlOwotCi0gIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiB0eXBlIG9mIHRoZSBzb2NrZXQuCi0gIHN0cnVjdCBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUKLSAgewotICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlKCkKLSAgICAgIDogc29ja2V0XyhudWxscHRyKSwKLSAgICAgICAgbmV4dF8oMCksCi0gICAgICAgIHByZXZfKDApCi0gICAgewotICAgIH0KLQotICAgIC8vIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBzb2NrZXQuCi0gICAgbmF0aXZlX2hhbmRsZV90eXBlIHNvY2tldF87Ci0KLSAgICAvLyBQb2ludGVycyB0byBhZGphY2VudCBzb2NrZXQgaW1wbGVtZW50YXRpb25zIGluIGxpbmtlZCBsaXN0LgotICAgIGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSogbmV4dF87Ci0gICAgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlKiBwcmV2XzsKLSAgfTsKLQotICAvLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlKAotICAgICAgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSk7Ci0KLSAgLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgQVNJT19ERUNMIHZvaWQgc2h1dGRvd25fc2VydmljZSgpOwotCi0gIC8vIENvbnN0cnVjdCBhIG5ldyBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIGNvbnN0cnVjdChiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmKTsKLQotICAvLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIEFTSU9fREVDTCB2b2lkIGJhc2VfbW92ZV9jb25zdHJ1Y3QoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKTsKLQotICAvLyBNb3ZlLWFzc2lnbiBmcm9tIGFub3RoZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBiYXNlX21vdmVfYXNzaWduKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHdpbnJ0X3Nzb2NrZXRfc2VydmljZV9iYXNlJiBvdGhlcl9zZXJ2aWNlLAotICAgICAgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKTsKLQotICAvLyBEZXN0cm95IGEgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBBU0lPX0RFQ0wgdm9pZCBkZXN0cm95KGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCk7Ci0KLSAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBvcGVuLgotICBib29sIGlzX29wZW4oY29uc3QgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGltcGwuc29ja2V0XyAhPSBudWxscHRyOwotICB9Ci0KLSAgLy8gRGVzdHJveSBhIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBHZXQgdGhlIG5hdGl2ZSBzb2NrZXQgcmVwcmVzZW50YXRpb24uCi0gIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBpbXBsLnNvY2tldF87Ci0gIH0KLQotICAvLyBDYW5jZWwgYWxsIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2NrZXQuCi0gIGFzaW86OmVycm9yX2NvZGUgY2FuY2VsKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgYXQgdGhlIG91dC1vZi1iYW5kIGRhdGEgbWFyay4KLSAgYm9vbCBhdF9tYXJrKGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgcmVhZGluZy4KLSAgc3RkOjpzaXplX3QgYXZhaWxhYmxlKGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gUGVyZm9ybSBhbiBJTyBjb250cm9sIGNvbW1hbmQgb24gdGhlIHNvY2tldC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElPX0NvbnRyb2xfQ29tbWFuZD4KLSAgYXNpbzo6ZXJyb3JfY29kZSBpb19jb250cm9sKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBJT19Db250cm9sX0NvbW1hbmQmLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIEdldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBzb2NrZXQuCi0gIGJvb2wgbm9uX2Jsb2NraW5nKGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIG5vbl9ibG9ja2luZyhiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgYm9vbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBHZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYm9vbCBuYXRpdmVfbm9uX2Jsb2NraW5nKGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBuYXRpdmVfbm9uX2Jsb2NraW5nKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYsCi0gICAgICBib29sLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIERpc2FibGUgc2VuZHMgb3IgcmVjZWl2ZXMgb24gdGhlIHNvY2tldC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBzaHV0ZG93bihiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmLAotICAgICAgc29ja2V0X2Jhc2U6OnNodXRkb3duX3R5cGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gU2VuZCB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgcGVlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHNlbmQoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBkb19zZW5kKGltcGwsCi0gICAgICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86OmNvbnN0X2J1ZmZlciwKLSAgICAgICAgICBDb25zdEJ1ZmZlclNlcXVlbmNlPjo6Zmlyc3QoYnVmZmVycyksIGZsYWdzLCBlYyk7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIGRhdGEgY2FuIGJlIHNlbnQgd2l0aG91dCBibG9ja2luZy4KLSAgc3RkOjpzaXplX3Qgc2VuZChiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmLCBjb25zdCBudWxsX2J1ZmZlcnMmLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgc2VuZC4gVGhlIGRhdGEgYmVpbmcgc2VudCBtdXN0IGJlIHZhbGlkIGZvciB0aGUKLSAgLy8gbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3NlbmQoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYm9vbCBpc19jb250aW51YXRpb24gPQotICAgICAgYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotCi0gICAgLy8gQWxsb2NhdGUgYW5kIGNvbnN0cnVjdCBhbiBvcGVyYXRpb24gdG8gd3JhcCB0aGUgaGFuZGxlci4KLSAgICB0eXBlZGVmIHdpbnJ0X3NvY2tldF9zZW5kX29wPENvbnN0QnVmZmVyU2VxdWVuY2UsIEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGJ1ZmZlcnMsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLCAmaW1wbCwgImFzeW5jX3NlbmQiKSk7Ci0KLSAgICBzdGFydF9zZW5kX29wKGltcGwsCi0gICAgICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86OmNvbnN0X2J1ZmZlciwKLSAgICAgICAgICBDb25zdEJ1ZmZlclNlcXVlbmNlPjo6Zmlyc3QoYnVmZmVycyksCi0gICAgICAgIGZsYWdzLCBwLnAsIGlzX2NvbnRpbnVhdGlvbik7Ci0gICAgcC52ID0gcC5wID0gMDsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3YWl0IHVudGlsIGRhdGEgY2FuIGJlIHNlbnQgd2l0aG91dCBibG9ja2luZy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfc2VuZChiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmLCBjb25zdCBudWxsX2J1ZmZlcnMmLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MsIEhhbmRsZXImIGhhbmRsZXIpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjID0gYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkOwotICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLSAgICBpb19zZXJ2aWNlXy5nZXRfaW9fc2VydmljZSgpLnBvc3QoCi0gICAgICAgIGRldGFpbDo6YmluZF9oYW5kbGVyKGhhbmRsZXIsIGVjLCBieXRlc190cmFuc2ZlcnJlZCkpOwotICB9Ci0KLSAgLy8gUmVjZWl2ZSBzb21lIGRhdGEgZnJvbSB0aGUgcGVlci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWNlaXZlKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBkb19yZWNlaXZlKGltcGwsCi0gICAgICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86Om11dGFibGVfYnVmZmVyLAotICAgICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZT46OmZpcnN0KGJ1ZmZlcnMpLCBmbGFncywgZWMpOwotICB9Ci0KLSAgLy8gV2FpdCB1bnRpbCBkYXRhIGNhbiBiZSByZWNlaXZlZCB3aXRob3V0IGJsb2NraW5nLgotICBzdGQ6OnNpemVfdCByZWNlaXZlKGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYsIGNvbnN0IG51bGxfYnVmZmVycyYsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWNlaXZlLiBUaGUgYnVmZmVyIGZvciB0aGUgZGF0YSBiZWluZyByZWNlaXZlZAotICAvLyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVjZWl2ZShiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgSGFuZGxlciYgaGFuZGxlcikKLSAgewotICAgIGJvb2wgaXNfY29udGludWF0aW9uID0KLSAgICAgIGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbihoYW5kbGVyKTsKLQotICAgIC8vIEFsbG9jYXRlIGFuZCBjb25zdHJ1Y3QgYW4gb3BlcmF0aW9uIHRvIHdyYXAgdGhlIGhhbmRsZXIuCi0gICAgdHlwZWRlZiB3aW5ydF9zb2NrZXRfcmVjdl9vcDxNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIEhhbmRsZXI+IG9wOwotICAgIHR5cGVuYW1lIG9wOjpwdHIgcCA9IHsgYXNpbzo6ZGV0YWlsOjphZGRyZXNzb2YoaGFuZGxlciksCi0gICAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVvZihvcCksIGhhbmRsZXIpLCAwIH07Ci0gICAgcC5wID0gbmV3IChwLnYpIG9wKGJ1ZmZlcnMsIGhhbmRsZXIpOwotCi0gICAgQVNJT19IQU5ETEVSX0NSRUFUSU9OKChwLnAsICJzb2NrZXQiLCAmaW1wbCwgImFzeW5jX3JlY2VpdmUiKSk7Ci0KLSAgICBzdGFydF9yZWNlaXZlX29wKGltcGwsCi0gICAgICAgIGJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPGFzaW86Om11dGFibGVfYnVmZmVyLAotICAgICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZT46OmZpcnN0KGJ1ZmZlcnMpLAotICAgICAgICBmbGFncywgcC5wLCBpc19jb250aW51YXRpb24pOwotICAgIHAudiA9IHAucCA9IDA7Ci0gIH0KLQotICAvLyBXYWl0IHVudGlsIGRhdGEgY2FuIGJlIHJlY2VpdmVkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGFzeW5jX3JlY2VpdmUoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiwgY29uc3QgbnVsbF9idWZmZXJzJiwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzLCBIYW5kbGVyJiBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fbm90X3N1cHBvcnRlZDsKLSAgICBjb25zdCBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IDA7Ci0gICAgaW9fc2VydmljZV8uZ2V0X2lvX3NlcnZpY2UoKS5wb3N0KAotICAgICAgICBkZXRhaWw6OmJpbmRfaGFuZGxlcihoYW5kbGVyLCBlYywgYnl0ZXNfdHJhbnNmZXJyZWQpKTsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBvYnRhaW4gZW5kcG9pbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ubmVjdGlvbi4KLSAgQVNJT19ERUNMIHN0ZDo6c2l6ZV90IGRvX2dldF9lbmRwb2ludCgKLSAgICAgIGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgYm9vbCBsb2NhbCwKLSAgICAgIHZvaWQqIGFkZHIsIHN0ZDo6c2l6ZV90IGFkZHJfbGVuLCBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3Q7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNldCBhIHNvY2tldCBvcHRpb24uCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGRvX3NldF9vcHRpb24oCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjb25zdCB2b2lkKiBvcHR2YWwsCi0gICAgICBzdGQ6OnNpemVfdCBvcHRsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGEgc29ja2V0IG9wdGlvbi4KLSAgQVNJT19ERUNMIHZvaWQgZG9fZ2V0X29wdGlvbigKLSAgICAgIGNvbnN0IGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIHZvaWQqIG9wdHZhbCwKLSAgICAgIHN0ZDo6c2l6ZV90KiBvcHRsZW4sIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdDsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gcGVyZm9ybSBhIHN5bmNocm9ub3VzIGNvbm5lY3QuCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGRvX2Nvbm5lY3QoCi0gICAgICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCB2b2lkKiBhZGRyLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHN0YXJ0IGFuIGFzeW5jaHJvbm91cyBjb25uZWN0LgotICBBU0lPX0RFQ0wgdm9pZCBzdGFydF9jb25uZWN0X29wKAotICAgICAgYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBjb25zdCB2b2lkKiBhZGRyLAotICAgICAgd2lucnRfYXN5bmNfb3A8dm9pZD4qIG9wLCBib29sIGlzX2NvbnRpbnVhdGlvbik7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYSBzeW5jaHJvbm91cyBzZW5kLgotICBBU0lPX0RFQ0wgc3RkOjpzaXplX3QgZG9fc2VuZCgKLSAgICAgIGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgY29uc3QgYXNpbzo6Y29uc3RfYnVmZmVyJiBkYXRhLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gc3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQuCi0gIEFTSU9fREVDTCB2b2lkIHN0YXJ0X3NlbmRfb3AoYmFzZV9pbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgYXNpbzo6Y29uc3RfYnVmZmVyJiBkYXRhLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIHdpbnJ0X2FzeW5jX29wPHVuc2lnbmVkIGludD4qIG9wLCBib29sIGlzX2NvbnRpbnVhdGlvbik7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHBlcmZvcm0gYSBzeW5jaHJvbm91cyByZWNlaXZlLgotICBBU0lPX0RFQ0wgc3RkOjpzaXplX3QgZG9fcmVjZWl2ZSgKLSAgICAgIGJhc2VfaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgY29uc3QgYXNpbzo6bXV0YWJsZV9idWZmZXImIGRhdGEsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBzdGFydCBhbiBhc3luY2hyb25vdXMgcmVjZWl2ZS4KLSAgQVNJT19ERUNMIHZvaWQgc3RhcnRfcmVjZWl2ZV9vcChiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlciYgZGF0YSwgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsCi0gICAgICB3aW5ydF9hc3luY19vcDxXaW5kb3dzOjpTdG9yYWdlOjpTdHJlYW1zOjpJQnVmZmVyXj4qIG9wLAotICAgICAgYm9vbCBpc19jb250aW51YXRpb24pOwotCi0gIC8vIFRoZSBpb19zZXJ2aWNlIGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIGRlbGl2ZXJpbmcgY29tcGxldGlvbnMuCi0gIGlvX3NlcnZpY2VfaW1wbCYgaW9fc2VydmljZV87Ci0KLSAgLy8gVGhlIG1hbmFnZXIgdGhhdCBrZWVwcyB0cmFjayBvZiBvdXRzdGFuZGluZyBvcGVyYXRpb25zLgotICB3aW5ydF9hc3luY19tYW5hZ2VyJiBhc3luY19tYW5hZ2VyXzsKLQotICAvLyBNdXRleCB0byBwcm90ZWN0IGFjY2VzcyB0byB0aGUgbGlua2VkIGxpc3Qgb2YgaW1wbGVtZW50YXRpb25zLiAKLSAgYXNpbzo6ZGV0YWlsOjptdXRleCBtdXRleF87Ci0KLSAgLy8gVGhlIGhlYWQgb2YgYSBsaW5rZWQgbGlzdCBvZiBhbGwgaW1wbGVtZW50YXRpb25zLgotICBiYXNlX2ltcGxlbWVudGF0aW9uX3R5cGUqIGltcGxfbGlzdF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC93aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTlJUX1NTT0NLRVRfU0VSVklDRV9CQVNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ4NzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2lucnRfdGltZXJfc2NoZWR1bGVyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dpbnJ0X3RpbWVyX3NjaGVkdWxlci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dJTlJUX1RJTUVSX1NDSEVEVUxFUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV0lOUlRfVElNRVJfU0NIRURVTEVSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZXZlbnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2xpbWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbXV0ZXguaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL29wX3F1ZXVlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJlYWQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3RpbWVyX3F1ZXVlX3NldC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2FpdF9vcC5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyZWFkLmhwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgd2lucnRfdGltZXJfc2NoZWR1bGVyCi0gIDogcHVibGljIGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPHdpbnJ0X3RpbWVyX3NjaGVkdWxlcj4KLXsKLXB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuCi0gIEFTSU9fREVDTCB3aW5ydF90aW1lcl9zY2hlZHVsZXIoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIH53aW5ydF90aW1lcl9zY2hlZHVsZXIoKTsKLQotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICBBU0lPX0RFQ0wgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCk7Ci0KLSAgLy8gUmVjcmVhdGUgaW50ZXJuYWwgZGVzY3JpcHRvcnMgZm9sbG93aW5nIGEgZm9yay4KLSAgQVNJT19ERUNMIHZvaWQgZm9ya19zZXJ2aWNlKAotICAgICAgYXNpbzo6aW9fc2VydmljZTo6Zm9ya19ldmVudCBmb3JrX2V2KTsKLQotICAvLyBJbml0aWFsaXNlIHRoZSB0YXNrLiBObyBlZmZlY3QgYXMgdGhpcyBjbGFzcyB1c2VzIGl0cyBvd24gdGhyZWFkLgotICBBU0lPX0RFQ0wgdm9pZCBpbml0X3Rhc2soKTsKLQotICAvLyBBZGQgYSBuZXcgdGltZXIgcXVldWUgdG8gdGhlIHJlYWN0b3IuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLSAgdm9pZCBhZGRfdGltZXJfcXVldWUodGltZXJfcXVldWU8VGltZV9UcmFpdHM+JiBxdWV1ZSk7Ci0KLSAgLy8gUmVtb3ZlIGEgdGltZXIgcXVldWUgZnJvbSB0aGUgcmVhY3Rvci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWVfVHJhaXRzPgotICB2b2lkIHJlbW92ZV90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlKTsKLQotICAvLyBTY2hlZHVsZSBhIG5ldyBvcGVyYXRpb24gaW4gdGhlIGdpdmVuIHRpbWVyIHF1ZXVlIHRvIGV4cGlyZSBhdCB0aGUKLSAgLy8gc3BlY2lmaWVkIGFic29sdXRlIHRpbWUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUaW1lX1RyYWl0cz4KLSAgdm9pZCBzY2hlZHVsZV90aW1lcih0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlLAotICAgICAgY29uc3QgdHlwZW5hbWUgVGltZV9UcmFpdHM6OnRpbWVfdHlwZSYgdGltZSwKLSAgICAgIHR5cGVuYW1lIHRpbWVyX3F1ZXVlPFRpbWVfVHJhaXRzPjo6cGVyX3RpbWVyX2RhdGEmIHRpbWVyLCB3YWl0X29wKiBvcCk7Ci0KLSAgLy8gQ2FuY2VsIHRoZSB0aW1lciBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdG9rZW4uIFJldHVybnMgdGhlCi0gIC8vIG51bWJlciBvZiBvcGVyYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHBvc3RlZCBvciBkaXNwYXRjaGVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVGltZV9UcmFpdHM+Ci0gIHN0ZDo6c2l6ZV90IGNhbmNlbF90aW1lcih0aW1lcl9xdWV1ZTxUaW1lX1RyYWl0cz4mIHF1ZXVlLAotICAgICAgdHlwZW5hbWUgdGltZXJfcXVldWU8VGltZV9UcmFpdHM+OjpwZXJfdGltZXJfZGF0YSYgdGltZXIsCi0gICAgICBzdGQ6OnNpemVfdCBtYXhfY2FuY2VsbGVkID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgpKCkpOwotCi1wcml2YXRlOgotICAvLyBSdW4gdGhlIHNlbGVjdCBsb29wIGluIHRoZSB0aHJlYWQuCi0gIEFTSU9fREVDTCB2b2lkIHJ1bl90aHJlYWQoKTsKLQotICAvLyBFbnRyeSBwb2ludCBmb3IgdGhlIHNlbGVjdCBsb29wIHRocmVhZC4KLSAgQVNJT19ERUNMIHN0YXRpYyB2b2lkIGNhbGxfcnVuX3RocmVhZCh3aW5ydF90aW1lcl9zY2hlZHVsZXIqIHJlYWN0b3IpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBhZGQgYSBuZXcgdGltZXIgcXVldWUuCi0gIEFTSU9fREVDTCB2b2lkIGRvX2FkZF90aW1lcl9xdWV1ZSh0aW1lcl9xdWV1ZV9iYXNlJiBxdWV1ZSk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVyIHF1ZXVlLgotICBBU0lPX0RFQ0wgdm9pZCBkb19yZW1vdmVfdGltZXJfcXVldWUodGltZXJfcXVldWVfYmFzZSYgcXVldWUpOwotCi0gIC8vIFRoZSBpb19zZXJ2aWNlIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gcG9zdCBjb21wbGV0aW9ucy4KLSAgaW9fc2VydmljZV9pbXBsJiBpb19zZXJ2aWNlXzsKLQotICAvLyBNdXRleCB1c2VkIHRvIHByb3RlY3QgaW50ZXJuYWwgdmFyaWFibGVzLgotICBhc2lvOjpkZXRhaWw6Om11dGV4IG11dGV4XzsKLQotICAvLyBFdmVudCB1c2VkIHRvIHdha2UgdXAgYmFja2dyb3VuZCB0aHJlYWQuCi0gIGFzaW86OmRldGFpbDo6ZXZlbnQgZXZlbnRfOwotCi0gIC8vIFRoZSB0aW1lciBxdWV1ZXMuCi0gIHRpbWVyX3F1ZXVlX3NldCB0aW1lcl9xdWV1ZXNfOwotCi0gIC8vIFRoZSBiYWNrZ3JvdW5kIHRocmVhZCB0aGF0IGlzIHdhaXRpbmcgZm9yIHRpbWVycyB0byBleHBpcmUuCi0gIGFzaW86OmRldGFpbDo6dGhyZWFkKiB0aHJlYWRfOwotCi0gIC8vIERvZXMgdGhlIGJhY2tncm91bmQgdGhyZWFkIG5lZWQgdG8gc3RvcC4KLSAgYm9vbCBzdG9wX3RocmVhZF87Ci0KLSAgLy8gV2hldGhlciB0aGUgc2VydmljZSBoYXMgYmVlbiBzaHV0IGRvd24uCi0gIGJvb2wgc2h1dGRvd25fOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3dpbnJ0X3RpbWVyX3NjaGVkdWxlci5ocHAiCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3dpbnJ0X3RpbWVyX3NjaGVkdWxlci5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2VuZGlmIC8vIEFTSU9fREVUQUlMX1dJTlJUX1RJTUVSX1NDSEVEVUxFUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd2lucnRfdXRpbHMuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF91dGlscy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZTYzMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5ydF91dGlscy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8KLS8vIGRldGFpbC93aW5ydF91dGlscy5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOUlRfVVRJTFNfSFBQCi0jZGVmaW5lIEFTSU9fREVUQUlMX1dJTlJUX1VUSUxTX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotI2luY2x1ZGUgPGNvZGVjdnQ+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxmdXR1cmU+Ci0jaW5jbHVkZSA8bG9jYWxlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxyb2J1ZmZlci5oPgotI2luY2x1ZGUgPHdpbmRvd3Muc3RvcmFnZS5zdHJlYW1zLmg+Ci0jaW5jbHVkZSA8d3JsL2ltcGxlbWVudHMuaD4KLSNpbmNsdWRlICJhc2lvL2J1ZmZlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvcl9jb2RlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hZGRyZXNzb2YuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci1uYW1lc3BhY2Ugd2lucnRfdXRpbHMgewotCi1pbmxpbmUgUGxhdGZvcm06OlN0cmluZ14gc3RyaW5nKGNvbnN0IGNoYXIqIGZyb20pCi17Ci0gIHN0ZDo6d3N0cmluZyB0bXAoZnJvbSwgZnJvbSArIHN0ZDo6c3RybGVuKGZyb20pKTsKLSAgcmV0dXJuIHJlZiBuZXcgUGxhdGZvcm06OlN0cmluZyh0bXAuY19zdHIoKSk7Ci19Ci0KLWlubGluZSBQbGF0Zm9ybTo6U3RyaW5nXiBzdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZyb20pCi17Ci0gIHN0ZDo6d3N0cmluZyB0bXAoZnJvbS5iZWdpbigpLCBmcm9tLmVuZCgpKTsKLSAgcmV0dXJuIHJlZiBuZXcgUGxhdGZvcm06OlN0cmluZyh0bXAuY19zdHIoKSk7Ci19Ci0KLWlubGluZSBzdGQ6OnN0cmluZyBzdHJpbmcoUGxhdGZvcm06OlN0cmluZ14gZnJvbSkKLXsKLSAgc3RkOjp3c3RyaW5nX2NvbnZlcnQ8c3RkOjpjb2RlY3Z0X3V0Zjg8d2NoYXJfdD4+IGNvbnZlcnRlcjsKLSAgcmV0dXJuIGNvbnZlcnRlci50b19ieXRlcyhmcm9tLT5EYXRhKCkpOwotfQotCi1pbmxpbmUgUGxhdGZvcm06OlN0cmluZ14gc3RyaW5nKHVuc2lnbmVkIHNob3J0IGZyb20pCi17Ci0gIHJldHVybiBzdHJpbmcoc3RkOjp0b19zdHJpbmcoZnJvbSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBQbGF0Zm9ybTo6U3RyaW5nXiBzdHJpbmcoY29uc3QgVCYgZnJvbSkKLXsKLSAgcmV0dXJuIHN0cmluZyhmcm9tLnRvX3N0cmluZygpKTsKLX0KLQotaW5saW5lIGludCBpbnRlZ2VyKFBsYXRmb3JtOjpTdHJpbmdeIGZyb20pCi17Ci0gIHJldHVybiBfd3RvaShmcm9tLT5EYXRhKCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBXaW5kb3dzOjpOZXR3b3JraW5nOjpIb3N0TmFtZV4gaG9zdF9uYW1lKGNvbnN0IFQmIGZyb20pCi17Ci0gIHJldHVybiByZWYgbmV3IFdpbmRvd3M6Ok5ldHdvcmtpbmc6Okhvc3ROYW1lKChzdHJpbmcpKGZyb20pKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci1pbmxpbmUgV2luZG93czo6U3RvcmFnZTo6U3RyZWFtczo6SUJ1ZmZlcl4gYnVmZmVyX2R1cCgKLSAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotewotICB1c2luZyBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyOwotICBzdGQ6OnNpemVfdCBzaXplID0gYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVycyk7Ci0gIGF1dG8gYiA9IHJlZiBuZXcgV2luZG93czo6U3RvcmFnZTo6U3RyZWFtczo6QnVmZmVyKHNpemUpOwotICBDb21QdHI8SUluc3BlY3RhYmxlPiBpbnNwID0gcmVpbnRlcnByZXRfY2FzdDxJSW5zcGVjdGFibGUqPihiKTsKLSAgQ29tUHRyPFdpbmRvd3M6OlN0b3JhZ2U6OlN0cmVhbXM6OklCdWZmZXJCeXRlQWNjZXNzPiBiYWNjOwotICBpbnNwLkFzKCZiYWNjKTsKLSAgYnl0ZSogYnl0ZXMgPSBudWxscHRyOwotICBiYWNjLT5CdWZmZXIoJmJ5dGVzKTsKLSAgYXNpbzo6YnVmZmVyX2NvcHkoYXNpbzo6YnVmZmVyKGJ5dGVzLCBzaXplKSwgYnVmZmVycyk7Ci0gIGItPkxlbmd0aCA9IHNpemU7Ci0gIHJldHVybiBiOwotfQotCi19IC8vIG5hbWVzcGFjZSB3aW5ydF91dGlscwotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0lOUlRfVVRJTFNfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnNvY2tfaW5pdC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZGV0YWlsL3dpbnNvY2tfaW5pdC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWM5ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93aW5zb2NrX2luaXQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvd2luc29ja19pbml0LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19ERVRBSUxfV0lOU09DS19JTklUX0hQUAotI2RlZmluZSBBU0lPX0RFVEFJTF9XSU5TT0NLX0lOSVRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIHdpbnNvY2tfaW5pdF9iYXNlCi17Ci1wcm90ZWN0ZWQ6Ci0gIC8vIFN0cnVjdHVyZSB0byB0cmFjayByZXN1bHQgb2YgaW5pdGlhbGlzYXRpb24gYW5kIG51bWJlciBvZiB1c2VzLiBQT0QgaXMgdXNlZAotICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgdmFsdWVzIGFyZSB6ZXJvLWluaXRpYWxpc2VkIHByaW9yIHRvIGFueSBjb2RlIGJlaW5nIHJ1bi4KLSAgc3RydWN0IGRhdGEKLSAgewotICAgIGxvbmcgaW5pdF9jb3VudF87Ci0gICAgbG9uZyByZXN1bHRfOwotICB9OwotCi0gIEFTSU9fREVDTCBzdGF0aWMgdm9pZCBzdGFydHVwKGRhdGEmIGQsCi0gICAgICB1bnNpZ25lZCBjaGFyIG1ham9yLCB1bnNpZ25lZCBjaGFyIG1pbm9yKTsKLQotICBBU0lPX0RFQ0wgc3RhdGljIHZvaWQgbWFudWFsX3N0YXJ0dXAoZGF0YSYgZCk7Ci0KLSAgQVNJT19ERUNMIHN0YXRpYyB2b2lkIGNsZWFudXAoZGF0YSYgZCk7Ci0KLSAgQVNJT19ERUNMIHN0YXRpYyB2b2lkIG1hbnVhbF9jbGVhbnVwKGRhdGEmIGQpOwotCi0gIEFTSU9fREVDTCBzdGF0aWMgdm9pZCB0aHJvd19vbl9lcnJvcihkYXRhJiBkKTsKLX07Ci0KLXRlbXBsYXRlIDxpbnQgTWFqb3IgPSAyLCBpbnQgTWlub3IgPSAwPgotY2xhc3Mgd2luc29ja19pbml0IDogcHJpdmF0ZSB3aW5zb2NrX2luaXRfYmFzZQotewotcHVibGljOgotICB3aW5zb2NrX2luaXQoYm9vbCBhbGxvd190aHJvdyA9IHRydWUpCi0gIHsKLSAgICBzdGFydHVwKGRhdGFfLCBNYWpvciwgTWlub3IpOwotICAgIGlmIChhbGxvd190aHJvdykKLSAgICAgIHRocm93X29uX2Vycm9yKGRhdGFfKTsKLSAgfQotCi0gIHdpbnNvY2tfaW5pdChjb25zdCB3aW5zb2NrX2luaXQmKQotICB7Ci0gICAgc3RhcnR1cChkYXRhXywgTWFqb3IsIE1pbm9yKTsKLSAgICB0aHJvd19vbl9lcnJvcihkYXRhXyk7Ci0gIH0KLQotICB+d2luc29ja19pbml0KCkKLSAgewotICAgIGNsZWFudXAoZGF0YV8pOwotICB9Ci0KLSAgLy8gVGhpcyBjbGFzcyBtYXkgYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHVzZXIgY29kZSB3aWxsIG1hbmFnZSBXaW5zb2NrCi0gIC8vIGluaXRpYWxpc2F0aW9uIGFuZCBjbGVhbnVwLiBUaGlzIG1heSBiZSByZXF1aXJlZCBpbiB0aGUgY2FzZSBvZiBhIERMTCwgZm9yCi0gIC8vIGV4YW1wbGUsIHdoZXJlIGl0IGlzIG5vdCBzYWZlIHRvIGluaXRpYWxpc2UgV2luc29jayBmcm9tIGdsb2JhbCBvYmplY3QKLSAgLy8gY29uc3RydWN0b3JzLgotICAvLwotICAvLyBUbyBwcmV2ZW50IGFzaW8gZnJvbSBpbml0aWFsaXNpbmcgV2luc29jaywgdGhlIG9iamVjdCBtdXN0IGJlIGNvbnN0cnVjdGVkCi0gIC8vIGJlZm9yZSBhbnkgQXNpbydzIG93biBnbG9iYWwgb2JqZWN0cy4gV2l0aCBNU1ZDLCB0aGlzIG1heSBiZSBhY2NvbXBsaXNoZWQKLSAgLy8gYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgY29kZSB0byB0aGUgRExMOgotICAvLwotICAvLyAgICNwcmFnbWEgd2FybmluZyhwdXNoKQotICAvLyAgICNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQwNzMpCi0gIC8vICAgI3ByYWdtYSBpbml0X3NlZyhsaWIpCi0gIC8vICAgYXNpbzo6ZGV0YWlsOjp3aW5zb2NrX2luaXQ8Pjo6bWFudWFsIG1hbnVhbF93aW5zb2NrX2luaXQ7Ci0gIC8vICAgI3ByYWdtYSB3YXJuaW5nKHBvcCkKLSAgY2xhc3MgbWFudWFsCi0gIHsKLSAgcHVibGljOgotICAgIG1hbnVhbCgpCi0gICAgewotICAgICAgbWFudWFsX3N0YXJ0dXAoZGF0YV8pOwotICAgIH0KLQotICAgIG1hbnVhbChjb25zdCBtYW51YWwmKQotICAgIHsKLSAgICAgIG1hbnVhbF9zdGFydHVwKGRhdGFfKTsKLSAgICB9Ci0KLSAgICB+bWFudWFsKCkKLSAgICB7Ci0gICAgICBtYW51YWxfY2xlYW51cChkYXRhXyk7Ci0gICAgfQotICB9OwotCi1wcml2YXRlOgotICBmcmllbmQgY2xhc3MgbWFudWFsOwotICBzdGF0aWMgZGF0YSBkYXRhXzsKLX07Ci0KLXRlbXBsYXRlIDxpbnQgTWFqb3IsIGludCBNaW5vcj4KLXdpbnNvY2tfaW5pdF9iYXNlOjpkYXRhIHdpbnNvY2tfaW5pdDxNYWpvciwgTWlub3I+OjpkYXRhXzsKLQotLy8gU3RhdGljIHZhcmlhYmxlIHRvIGVuc3VyZSB0aGF0IHdpbnNvY2sgaXMgaW5pdGlhbGlzZWQgYmVmb3JlIG1haW4sIGFuZAotLy8gdGhlcmVmb3JlIGJlZm9yZSBhbnkgb3RoZXIgdGhyZWFkcyBjYW4gZ2V0IHN0YXJ0ZWQuCi1zdGF0aWMgY29uc3Qgd2luc29ja19pbml0PD4mIHdpbnNvY2tfaW5pdF9pbnN0YW5jZSA9IHdpbnNvY2tfaW5pdDw+KGZhbHNlKTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvd2luc29ja19pbml0LmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotCi0jZW5kaWYgLy8gQVNJT19ERVRBSUxfV0lOU09DS19JTklUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93cmFwcGVkX2hhbmRsZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2RldGFpbC93cmFwcGVkX2hhbmRsZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjhlZGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9kZXRhaWwvd3JhcHBlZF9oYW5kbGVyLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vLwotLy8gZGV0YWlsL3dyYXBwZWRfaGFuZGxlci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fREVUQUlMX1dSQVBQRURfSEFORExFUl9IUFAKLSNkZWZpbmUgQVNJT19ERVRBSUxfV1JBUFBFRF9IQU5ETEVSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9jb250X2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXN0cnVjdCBpc19jb250aW51YXRpb25fZGVsZWdhdGVkCi17Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaGVyLCB0eXBlbmFtZSBIYW5kbGVyPgotICBib29sIG9wZXJhdG9yKCkoRGlzcGF0Y2hlciYsIEhhbmRsZXImIGhhbmRsZXIpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKGhhbmRsZXIpOwotICB9Ci19OwotCi1zdHJ1Y3QgaXNfY29udGludWF0aW9uX2lmX3J1bm5pbmcKLXsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIERpc3BhdGNoZXIsIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIGJvb2wgb3BlcmF0b3IoKShEaXNwYXRjaGVyJiBkaXNwYXRjaGVyLCBIYW5kbGVyJikgY29uc3QKLSAgewotICAgIHJldHVybiBkaXNwYXRjaGVyLnJ1bm5pbmdfaW5fdGhpc190aHJlYWQoKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIERpc3BhdGNoZXIsIHR5cGVuYW1lIEhhbmRsZXIsCi0gICAgdHlwZW5hbWUgSXNDb250aW51YXRpb24gPSBpc19jb250aW51YXRpb25fZGVsZWdhdGVkPgotY2xhc3Mgd3JhcHBlZF9oYW5kbGVyCi17Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdm9pZCByZXN1bHRfdHlwZTsKLQotICB3cmFwcGVkX2hhbmRsZXIoRGlzcGF0Y2hlciBkaXNwYXRjaGVyLCBIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogZGlzcGF0Y2hlcl8oZGlzcGF0Y2hlciksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gIHdyYXBwZWRfaGFuZGxlcihjb25zdCB3cmFwcGVkX2hhbmRsZXImIG90aGVyKQotICAgIDogZGlzcGF0Y2hlcl8ob3RoZXIuZGlzcGF0Y2hlcl8pLAotICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gIHsKLSAgfQotCi0gIHdyYXBwZWRfaGFuZGxlcih3cmFwcGVkX2hhbmRsZXImJiBvdGhlcikKLSAgICA6IGRpc3BhdGNoZXJfKG90aGVyLmRpc3BhdGNoZXJfKSwKLSAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKEhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgewotICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gIHZvaWQgb3BlcmF0b3IoKSgpCi0gIHsKLSAgICBkaXNwYXRjaGVyXy5kaXNwYXRjaChBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyXykpOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcigpKCkgY29uc3QKLSAgewotICAgIGRpc3BhdGNoZXJfLmRpc3BhdGNoKGhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxPgotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgQXJnMSYgYXJnMSkKLSAgewotICAgIGRpc3BhdGNoZXJfLmRpc3BhdGNoKGRldGFpbDo6YmluZF9oYW5kbGVyKGhhbmRsZXJfLCBhcmcxKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMT4KLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IEFyZzEmIGFyZzEpIGNvbnN0Ci0gIHsKLSAgICBkaXNwYXRjaGVyXy5kaXNwYXRjaChkZXRhaWw6OmJpbmRfaGFuZGxlcihoYW5kbGVyXywgYXJnMSkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyKQotICB7Ci0gICAgZGlzcGF0Y2hlcl8uZGlzcGF0Y2goZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlcl8sIGFyZzEsIGFyZzIpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMikgY29uc3QKLSAgewotICAgIGRpc3BhdGNoZXJfLmRpc3BhdGNoKGRldGFpbDo6YmluZF9oYW5kbGVyKGhhbmRsZXJfLCBhcmcxLCBhcmcyKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMz4KLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IEFyZzEmIGFyZzEsIGNvbnN0IEFyZzImIGFyZzIsIGNvbnN0IEFyZzMmIGFyZzMpCi0gIHsKLSAgICBkaXNwYXRjaGVyXy5kaXNwYXRjaChkZXRhaWw6OmJpbmRfaGFuZGxlcihoYW5kbGVyXywgYXJnMSwgYXJnMiwgYXJnMykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzM+Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLCBjb25zdCBBcmczJiBhcmczKSBjb25zdAotICB7Ci0gICAgZGlzcGF0Y2hlcl8uZGlzcGF0Y2goZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlcl8sIGFyZzEsIGFyZzIsIGFyZzMpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLCB0eXBlbmFtZSBBcmc0PgotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMiwgY29uc3QgQXJnMyYgYXJnMywKLSAgICAgIGNvbnN0IEFyZzQmIGFyZzQpCi0gIHsKLSAgICBkaXNwYXRjaGVyXy5kaXNwYXRjaCgKLSAgICAgICAgZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlcl8sIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLCB0eXBlbmFtZSBBcmc0PgotICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMiwgY29uc3QgQXJnMyYgYXJnMywKLSAgICAgIGNvbnN0IEFyZzQmIGFyZzQpIGNvbnN0Ci0gIHsKLSAgICBkaXNwYXRjaGVyXy5kaXNwYXRjaCgKLSAgICAgICAgZGV0YWlsOjpiaW5kX2hhbmRsZXIoaGFuZGxlcl8sIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLCB0eXBlbmFtZSBBcmc0LAotICAgICAgdHlwZW5hbWUgQXJnNT4KLSAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IEFyZzEmIGFyZzEsIGNvbnN0IEFyZzImIGFyZzIsIGNvbnN0IEFyZzMmIGFyZzMsCi0gICAgICBjb25zdCBBcmc0JiBhcmc0LCBjb25zdCBBcmc1JiBhcmc1KQotICB7Ci0gICAgZGlzcGF0Y2hlcl8uZGlzcGF0Y2goCi0gICAgICAgIGRldGFpbDo6YmluZF9oYW5kbGVyKGhhbmRsZXJfLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywgdHlwZW5hbWUgQXJnNCwKLSAgICAgIHR5cGVuYW1lIEFyZzU+Ci0gIHZvaWQgb3BlcmF0b3IoKShjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLCBjb25zdCBBcmczJiBhcmczLAotICAgICAgY29uc3QgQXJnNCYgYXJnNCwgY29uc3QgQXJnNSYgYXJnNSkgY29uc3QKLSAgewotICAgIGRpc3BhdGNoZXJfLmRpc3BhdGNoKAotICAgICAgICBkZXRhaWw6OmJpbmRfaGFuZGxlcihoYW5kbGVyXywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkpOwotICB9Ci0KLS8vcHJpdmF0ZToKLSAgRGlzcGF0Y2hlciBkaXNwYXRjaGVyXzsKLSAgSGFuZGxlciBoYW5kbGVyXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBDb250ZXh0PgotY2xhc3MgcmV3cmFwcGVkX2hhbmRsZXIKLXsKLXB1YmxpYzoKLSAgZXhwbGljaXQgcmV3cmFwcGVkX2hhbmRsZXIoSGFuZGxlciYgaGFuZGxlciwgY29uc3QgQ29udGV4dCYgY29udGV4dCkKLSAgICA6IGNvbnRleHRfKGNvbnRleHQpLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpCi0gIHsKLSAgfQotCi0gIGV4cGxpY2l0IHJld3JhcHBlZF9oYW5kbGVyKGNvbnN0IEhhbmRsZXImIGhhbmRsZXIsIGNvbnN0IENvbnRleHQmIGNvbnRleHQpCi0gICAgOiBjb250ZXh0Xyhjb250ZXh0KSwKLSAgICAgIGhhbmRsZXJfKGhhbmRsZXIpCi0gIHsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICByZXdyYXBwZWRfaGFuZGxlcihjb25zdCByZXdyYXBwZWRfaGFuZGxlciYgb3RoZXIpCi0gICAgOiBjb250ZXh0XyhvdGhlci5jb250ZXh0XyksCi0gICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgewotICB9Ci0KLSAgcmV3cmFwcGVkX2hhbmRsZXIocmV3cmFwcGVkX2hhbmRsZXImJiBvdGhlcikKLSAgICA6IGNvbnRleHRfKEFTSU9fTU9WRV9DQVNUKENvbnRleHQpKG90aGVyLmNvbnRleHRfKSksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShvdGhlci5oYW5kbGVyXykpCi0gIHsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICB2b2lkIG9wZXJhdG9yKCkoKQotICB7Ci0gICAgaGFuZGxlcl8oKTsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3IoKSgpIGNvbnN0Ci0gIHsKLSAgICBoYW5kbGVyXygpOwotICB9Ci0KLS8vcHJpdmF0ZToKLSAgQ29udGV4dCBjb250ZXh0XzsKLSAgSGFuZGxlciBoYW5kbGVyXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaGVyLCB0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBJc0NvbnRpbnVhdGlvbj4KLWlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICB3cmFwcGVkX2hhbmRsZXI8RGlzcGF0Y2hlciwgSGFuZGxlciwgSXNDb250aW51YXRpb24+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIHJldHVybiBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERpc3BhdGNoZXIsIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIElzQ29udGludWF0aW9uPgotaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUodm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICB3cmFwcGVkX2hhbmRsZXI8RGlzcGF0Y2hlciwgSGFuZGxlciwgSXNDb250aW51YXRpb24+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjpkZWFsbG9jYXRlKAotICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaGVyLCB0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBJc0NvbnRpbnVhdGlvbj4KLWlubGluZSBib29sIGFzaW9faGFuZGxlcl9pc19jb250aW51YXRpb24oCi0gICAgd3JhcHBlZF9oYW5kbGVyPERpc3BhdGNoZXIsIEhhbmRsZXIsIElzQ29udGludWF0aW9uPiogdGhpc19oYW5kbGVyKQotewotICByZXR1cm4gSXNDb250aW51YXRpb24oKSh0aGlzX2hhbmRsZXItPmRpc3BhdGNoZXJfLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBEaXNwYXRjaGVyLAotICAgIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIElzQ29udGludWF0aW9uPgotaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2ludm9rZShGdW5jdGlvbiYgZnVuY3Rpb24sCi0gICAgd3JhcHBlZF9oYW5kbGVyPERpc3BhdGNoZXIsIEhhbmRsZXIsIElzQ29udGludWF0aW9uPiogdGhpc19oYW5kbGVyKQotewotICB0aGlzX2hhbmRsZXItPmRpc3BhdGNoZXJfLmRpc3BhdGNoKAotICAgICAgcmV3cmFwcGVkX2hhbmRsZXI8RnVuY3Rpb24sIEhhbmRsZXI+KAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXykpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIERpc3BhdGNoZXIsCi0gICAgdHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgSXNDb250aW51YXRpb24+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICB3cmFwcGVkX2hhbmRsZXI8RGlzcGF0Y2hlciwgSGFuZGxlciwgSXNDb250aW51YXRpb24+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIHRoaXNfaGFuZGxlci0+ZGlzcGF0Y2hlcl8uZGlzcGF0Y2goCi0gICAgICByZXdyYXBwZWRfaGFuZGxlcjxGdW5jdGlvbiwgSGFuZGxlcj4oCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBDb250ZXh0PgotaW5saW5lIHZvaWQqIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzdGQ6OnNpemVfdCBzaXplLAotICAgIHJld3JhcHBlZF9oYW5kbGVyPEhhbmRsZXIsIENvbnRleHQ+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIHJldHVybiBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmNvbnRleHRfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIENvbnRleHQ+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgIHJld3JhcHBlZF9oYW5kbGVyPEhhbmRsZXIsIENvbnRleHQ+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjpkZWFsbG9jYXRlKAotICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5jb250ZXh0Xyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEaXNwYXRjaGVyLCB0eXBlbmFtZSBDb250ZXh0PgotaW5saW5lIGJvb2wgYXNpb19oYW5kbGVyX2lzX2NvbnRpbnVhdGlvbigKLSAgICByZXdyYXBwZWRfaGFuZGxlcjxEaXNwYXRjaGVyLCBDb250ZXh0PiogdGhpc19oYW5kbGVyKQotewotICByZXR1cm4gYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKAotICAgICAgdGhpc19oYW5kbGVyLT5jb250ZXh0Xyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgQ29udGV4dD4KLWlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgIHJld3JhcHBlZF9oYW5kbGVyPEhhbmRsZXIsIENvbnRleHQ+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+Y29udGV4dF8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIENvbnRleHQ+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICByZXdyYXBwZWRfaGFuZGxlcjxIYW5kbGVyLCBDb250ZXh0PiogdGhpc19oYW5kbGVyKQotewotICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmNvbnRleHRfKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0RFVEFJTF9XUkFQUEVEX0hBTkRMRVJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZXJyb3IuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Vycm9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2MzYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZXJyb3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vCi0vLyBlcnJvci5ocHAKLS8vIH5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0VSUk9SX0hQUAotI2RlZmluZSBBU0lPX0VSUk9SX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3JfY29kZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9zeXN0ZW1fZXJyb3IuaHBwIgotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSBcCi0gIHx8IGRlZmluZWQoX19DWUdXSU5fXykgXAotICB8fCBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotIyBpbmNsdWRlIDx3aW5lcnJvci5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8Y2Vycm5vPgotIyBpbmNsdWRlIDxuZXRkYi5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLS8vLyBJTlRFUk5BTCBPTkxZLgotIyBkZWZpbmUgQVNJT19OQVRJVkVfRVJST1IoZSkgaW1wbGVtZW50YXRpb25fZGVmaW5lZAotLy8vIElOVEVSTkFMIE9OTFkuCi0jIGRlZmluZSBBU0lPX1NPQ0tFVF9FUlJPUihlKSBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkCi0vLy8gSU5URVJOQUwgT05MWS4KLSMgZGVmaW5lIEFTSU9fTkVUREJfRVJST1IoZSkgaW1wbGVtZW50YXRpb25fZGVmaW5lZAotLy8vIElOVEVSTkFMIE9OTFkuCi0jIGRlZmluZSBBU0lPX0dFVEFERFJJTkZPX0VSUk9SKGUpIGltcGxlbWVudGF0aW9uX2RlZmluZWQKLS8vLyBJTlRFUk5BTCBPTkxZLgotIyBkZWZpbmUgQVNJT19XSU5fT1JfUE9TSVgoZV93aW4sIGVfcG9zaXgpIGltcGxlbWVudGF0aW9uX2RlZmluZWQKLSNlbGlmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0jIGRlZmluZSBBU0lPX05BVElWRV9FUlJPUihlKSBfX0hSRVNVTFRfRlJPTV9XSU4zMihlKQotIyBkZWZpbmUgQVNJT19TT0NLRVRfRVJST1IoZSkgX19IUkVTVUxUX0ZST01fV0lOMzIoV1NBICMjIGUpCi0jIGRlZmluZSBBU0lPX05FVERCX0VSUk9SKGUpIF9fSFJFU1VMVF9GUk9NX1dJTjMyKFdTQSAjIyBlKQotIyBkZWZpbmUgQVNJT19HRVRBRERSSU5GT19FUlJPUihlKSBfX0hSRVNVTFRfRlJPTV9XSU4zMihXU0EgIyMgZSkKLSMgZGVmaW5lIEFTSU9fV0lOX09SX1BPU0lYKGVfd2luLCBlX3Bvc2l4KSBlX3dpbgotI2VsaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSMgZGVmaW5lIEFTSU9fTkFUSVZFX0VSUk9SKGUpIGUKLSMgZGVmaW5lIEFTSU9fU09DS0VUX0VSUk9SKGUpIFdTQSAjIyBlCi0jIGRlZmluZSBBU0lPX05FVERCX0VSUk9SKGUpIFdTQSAjIyBlCi0jIGRlZmluZSBBU0lPX0dFVEFERFJJTkZPX0VSUk9SKGUpIFdTQSAjIyBlCi0jIGRlZmluZSBBU0lPX1dJTl9PUl9QT1NJWChlX3dpbiwgZV9wb3NpeCkgZV93aW4KLSNlbHNlCi0jIGRlZmluZSBBU0lPX05BVElWRV9FUlJPUihlKSBlCi0jIGRlZmluZSBBU0lPX1NPQ0tFVF9FUlJPUihlKSBlCi0jIGRlZmluZSBBU0lPX05FVERCX0VSUk9SKGUpIGUKLSMgZGVmaW5lIEFTSU9fR0VUQUREUklORk9fRVJST1IoZSkgZQotIyBkZWZpbmUgQVNJT19XSU5fT1JfUE9TSVgoZV93aW4sIGVfcG9zaXgpIGVfcG9zaXgKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGVycm9yIHsKLQotZW51bSBiYXNpY19lcnJvcnMKLXsKLSAgLy8vIFBlcm1pc3Npb24gZGVuaWVkLgotICBhY2Nlc3NfZGVuaWVkID0gQVNJT19TT0NLRVRfRVJST1IoRUFDQ0VTKSwKLQotICAvLy8gQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbC4KLSAgYWRkcmVzc19mYW1pbHlfbm90X3N1cHBvcnRlZCA9IEFTSU9fU09DS0VUX0VSUk9SKEVBRk5PU1VQUE9SVCksCi0KLSAgLy8vIEFkZHJlc3MgYWxyZWFkeSBpbiB1c2UuCi0gIGFkZHJlc3NfaW5fdXNlID0gQVNJT19TT0NLRVRfRVJST1IoRUFERFJJTlVTRSksCi0KLSAgLy8vIFRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZC4KLSAgYWxyZWFkeV9jb25uZWN0ZWQgPSBBU0lPX1NPQ0tFVF9FUlJPUihFSVNDT05OKSwKLQotICAvLy8gT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MuCi0gIGFscmVhZHlfc3RhcnRlZCA9IEFTSU9fU09DS0VUX0VSUk9SKEVBTFJFQURZKSwKLQotICAvLy8gQnJva2VuIHBpcGUuCi0gIGJyb2tlbl9waXBlID0gQVNJT19XSU5fT1JfUE9TSVgoCi0gICAgICBBU0lPX05BVElWRV9FUlJPUihFUlJPUl9CUk9LRU5fUElQRSksCi0gICAgICBBU0lPX05BVElWRV9FUlJPUihFUElQRSkpLAotCi0gIC8vLyBBIGNvbm5lY3Rpb24gaGFzIGJlZW4gYWJvcnRlZC4KLSAgY29ubmVjdGlvbl9hYm9ydGVkID0gQVNJT19TT0NLRVRfRVJST1IoRUNPTk5BQk9SVEVEKSwKLQotICAvLy8gQ29ubmVjdGlvbiByZWZ1c2VkLgotICBjb25uZWN0aW9uX3JlZnVzZWQgPSBBU0lPX1NPQ0tFVF9FUlJPUihFQ09OTlJFRlVTRUQpLAotCi0gIC8vLyBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIuCi0gIGNvbm5lY3Rpb25fcmVzZXQgPSBBU0lPX1NPQ0tFVF9FUlJPUihFQ09OTlJFU0VUKSwKLQotICAvLy8gQmFkIGZpbGUgZGVzY3JpcHRvci4KLSAgYmFkX2Rlc2NyaXB0b3IgPSBBU0lPX1NPQ0tFVF9FUlJPUihFQkFERiksCi0KLSAgLy8vIEJhZCBhZGRyZXNzLgotICBmYXVsdCA9IEFTSU9fU09DS0VUX0VSUk9SKEVGQVVMVCksCi0KLSAgLy8vIE5vIHJvdXRlIHRvIGhvc3QuCi0gIGhvc3RfdW5yZWFjaGFibGUgPSBBU0lPX1NPQ0tFVF9FUlJPUihFSE9TVFVOUkVBQ0gpLAotCi0gIC8vLyBPcGVyYXRpb24gbm93IGluIHByb2dyZXNzLgotICBpbl9wcm9ncmVzcyA9IEFTSU9fU09DS0VUX0VSUk9SKEVJTlBST0dSRVNTKSwKLQotICAvLy8gSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwuCi0gIGludGVycnVwdGVkID0gQVNJT19TT0NLRVRfRVJST1IoRUlOVFIpLAotCi0gIC8vLyBJbnZhbGlkIGFyZ3VtZW50LgotICBpbnZhbGlkX2FyZ3VtZW50ID0gQVNJT19TT0NLRVRfRVJST1IoRUlOVkFMKSwKLQotICAvLy8gTWVzc2FnZSB0b28gbG9uZy4KLSAgbWVzc2FnZV9zaXplID0gQVNJT19TT0NLRVRfRVJST1IoRU1TR1NJWkUpLAotCi0gIC8vLyBUaGUgbmFtZSB3YXMgdG9vIGxvbmcuCi0gIG5hbWVfdG9vX2xvbmcgPSBBU0lPX1NPQ0tFVF9FUlJPUihFTkFNRVRPT0xPTkcpLAotCi0gIC8vLyBOZXR3b3JrIGlzIGRvd24uCi0gIG5ldHdvcmtfZG93biA9IEFTSU9fU09DS0VUX0VSUk9SKEVORVRET1dOKSwKLQotICAvLy8gTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gb24gcmVzZXQuCi0gIG5ldHdvcmtfcmVzZXQgPSBBU0lPX1NPQ0tFVF9FUlJPUihFTkVUUkVTRVQpLAotCi0gIC8vLyBOZXR3b3JrIGlzIHVucmVhY2hhYmxlLgotICBuZXR3b3JrX3VucmVhY2hhYmxlID0gQVNJT19TT0NLRVRfRVJST1IoRU5FVFVOUkVBQ0gpLAotCi0gIC8vLyBUb28gbWFueSBvcGVuIGZpbGVzLgotICBub19kZXNjcmlwdG9ycyA9IEFTSU9fU09DS0VUX0VSUk9SKEVNRklMRSksCi0KLSAgLy8vIE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUuCi0gIG5vX2J1ZmZlcl9zcGFjZSA9IEFTSU9fU09DS0VUX0VSUk9SKEVOT0JVRlMpLAotCi0gIC8vLyBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5LgotICBub19tZW1vcnkgPSBBU0lPX1dJTl9PUl9QT1NJWCgKLSAgICAgIEFTSU9fTkFUSVZFX0VSUk9SKEVSUk9SX09VVE9GTUVNT1JZKSwKLSAgICAgIEFTSU9fTkFUSVZFX0VSUk9SKEVOT01FTSkpLAotCi0gIC8vLyBPcGVyYXRpb24gbm90IHBlcm1pdHRlZC4KLSAgbm9fcGVybWlzc2lvbiA9IEFTSU9fV0lOX09SX1BPU0lYKAotICAgICAgQVNJT19OQVRJVkVfRVJST1IoRVJST1JfQUNDRVNTX0RFTklFRCksCi0gICAgICBBU0lPX05BVElWRV9FUlJPUihFUEVSTSkpLAotCi0gIC8vLyBQcm90b2NvbCBub3QgYXZhaWxhYmxlLgotICBub19wcm90b2NvbF9vcHRpb24gPSBBU0lPX1NPQ0tFVF9FUlJPUihFTk9QUk9UT09QVCksCi0KLSAgLy8vIE5vIHN1Y2ggZGV2aWNlLgotICBub19zdWNoX2RldmljZSA9IEFTSU9fV0lOX09SX1BPU0lYKAotICAgICAgQVNJT19OQVRJVkVfRVJST1IoRVJST1JfQkFEX1VOSVQpLAotICAgICAgQVNJT19OQVRJVkVfRVJST1IoRU5PREVWKSksCi0KLSAgLy8vIFRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkLgotICBub3RfY29ubmVjdGVkID0gQVNJT19TT0NLRVRfRVJST1IoRU5PVENPTk4pLAotCi0gIC8vLyBTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQuCi0gIG5vdF9zb2NrZXQgPSBBU0lPX1NPQ0tFVF9FUlJPUihFTk9UU09DSyksCi0KLSAgLy8vIE9wZXJhdGlvbiBjYW5jZWxsZWQuCi0gIG9wZXJhdGlvbl9hYm9ydGVkID0gQVNJT19XSU5fT1JfUE9TSVgoCi0gICAgICBBU0lPX05BVElWRV9FUlJPUihFUlJPUl9PUEVSQVRJT05fQUJPUlRFRCksCi0gICAgICBBU0lPX05BVElWRV9FUlJPUihFQ0FOQ0VMRUQpKSwKLQotICAvLy8gT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQuCi0gIG9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkID0gQVNJT19TT0NLRVRfRVJST1IoRU9QTk9UU1VQUCksCi0KLSAgLy8vIENhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93bi4KLSAgc2h1dF9kb3duID0gQVNJT19TT0NLRVRfRVJST1IoRVNIVVRET1dOKSwKLQotICAvLy8gQ29ubmVjdGlvbiB0aW1lZCBvdXQuCi0gIHRpbWVkX291dCA9IEFTSU9fU09DS0VUX0VSUk9SKEVUSU1FRE9VVCksCi0KLSAgLy8vIFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLgotICB0cnlfYWdhaW4gPSBBU0lPX1dJTl9PUl9QT1NJWCgKLSAgICAgIEFTSU9fTkFUSVZFX0VSUk9SKEVSUk9SX1JFVFJZKSwKLSAgICAgIEFTSU9fTkFUSVZFX0VSUk9SKEVBR0FJTikpLAotCi0gIC8vLyBUaGUgc29ja2V0IGlzIG1hcmtlZCBub24tYmxvY2tpbmcgYW5kIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIHdvdWxkIGJsb2NrLgotICB3b3VsZF9ibG9jayA9IEFTSU9fU09DS0VUX0VSUk9SKEVXT1VMREJMT0NLKQotfTsKLQotZW51bSBuZXRkYl9lcnJvcnMKLXsKLSAgLy8vIEhvc3Qgbm90IGZvdW5kIChhdXRob3JpdGF0aXZlKS4KLSAgaG9zdF9ub3RfZm91bmQgPSBBU0lPX05FVERCX0VSUk9SKEhPU1RfTk9UX0ZPVU5EKSwKLQotICAvLy8gSG9zdCBub3QgZm91bmQgKG5vbi1hdXRob3JpdGF0aXZlKS4KLSAgaG9zdF9ub3RfZm91bmRfdHJ5X2FnYWluID0gQVNJT19ORVREQl9FUlJPUihUUllfQUdBSU4pLAotCi0gIC8vLyBUaGUgcXVlcnkgaXMgdmFsaWQgYnV0IGRvZXMgbm90IGhhdmUgYXNzb2NpYXRlZCBhZGRyZXNzIGRhdGEuCi0gIG5vX2RhdGEgPSBBU0lPX05FVERCX0VSUk9SKE5PX0RBVEEpLAotCi0gIC8vLyBBIG5vbi1yZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZC4KLSAgbm9fcmVjb3ZlcnkgPSBBU0lPX05FVERCX0VSUk9SKE5PX1JFQ09WRVJZKQotfTsKLQotZW51bSBhZGRyaW5mb19lcnJvcnMKLXsKLSAgLy8vIFRoZSBzZXJ2aWNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBnaXZlbiBzb2NrZXQgdHlwZS4KLSAgc2VydmljZV9ub3RfZm91bmQgPSBBU0lPX1dJTl9PUl9QT1NJWCgKLSAgICAgIEFTSU9fTkFUSVZFX0VSUk9SKFdTQVRZUEVfTk9UX0ZPVU5EKSwKLSAgICAgIEFTSU9fR0VUQUREUklORk9fRVJST1IoRUFJX1NFUlZJQ0UpKSwKLQotICAvLy8gVGhlIHNvY2tldCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuCi0gIHNvY2tldF90eXBlX25vdF9zdXBwb3J0ZWQgPSBBU0lPX1dJTl9PUl9QT1NJWCgKLSAgICAgIEFTSU9fTkFUSVZFX0VSUk9SKFdTQUVTT0NLVE5PU1VQUE9SVCksCi0gICAgICBBU0lPX0dFVEFERFJJTkZPX0VSUk9SKEVBSV9TT0NLVFlQRSkpCi19OwotCi1lbnVtIG1pc2NfZXJyb3JzCi17Ci0gIC8vLyBBbHJlYWR5IG9wZW4uCi0gIGFscmVhZHlfb3BlbiA9IDEsCi0KLSAgLy8vIEVuZCBvZiBmaWxlIG9yIHN0cmVhbS4KLSAgZW9mLAotCi0gIC8vLyBFbGVtZW50IG5vdCBmb3VuZC4KLSAgbm90X2ZvdW5kLAotCi0gIC8vLyBUaGUgZGVzY3JpcHRvciBjYW5ub3QgZml0IGludG8gdGhlIHNlbGVjdCBzeXN0ZW0gY2FsbCdzIGZkX3NldC4KLSAgZmRfc2V0X2ZhaWx1cmUKLX07Ci0KLWlubGluZSBjb25zdCBhc2lvOjplcnJvcl9jYXRlZ29yeSYgZ2V0X3N5c3RlbV9jYXRlZ29yeSgpCi17Ci0gIHJldHVybiBhc2lvOjpzeXN0ZW1fY2F0ZWdvcnkoKTsKLX0KLQotI2lmICFkZWZpbmVkKEFTSU9fV0lORE9XUykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotZXh0ZXJuIEFTSU9fREVDTAotY29uc3QgYXNpbzo6ZXJyb3JfY2F0ZWdvcnkmIGdldF9uZXRkYl9jYXRlZ29yeSgpOwotCi1leHRlcm4gQVNJT19ERUNMCi1jb25zdCBhc2lvOjplcnJvcl9jYXRlZ29yeSYgZ2V0X2FkZHJpbmZvX2NhdGVnb3J5KCk7Ci0KLSNlbHNlIC8vICFkZWZpbmVkKEFTSU9fV0lORE9XUykgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLQotaW5saW5lIGNvbnN0IGFzaW86OmVycm9yX2NhdGVnb3J5JiBnZXRfbmV0ZGJfY2F0ZWdvcnkoKQotewotICByZXR1cm4gZ2V0X3N5c3RlbV9jYXRlZ29yeSgpOwotfQotCi1pbmxpbmUgY29uc3QgYXNpbzo6ZXJyb3JfY2F0ZWdvcnkmIGdldF9hZGRyaW5mb19jYXRlZ29yeSgpCi17Ci0gIHJldHVybiBnZXRfc3lzdGVtX2NhdGVnb3J5KCk7Ci19Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLWV4dGVybiBBU0lPX0RFQ0wKLWNvbnN0IGFzaW86OmVycm9yX2NhdGVnb3J5JiBnZXRfbWlzY19jYXRlZ29yeSgpOwotCi1zdGF0aWMgY29uc3QgYXNpbzo6ZXJyb3JfY2F0ZWdvcnkmIHN5c3RlbV9jYXRlZ29yeQotICA9IGFzaW86OmVycm9yOjpnZXRfc3lzdGVtX2NhdGVnb3J5KCk7Ci1zdGF0aWMgY29uc3QgYXNpbzo6ZXJyb3JfY2F0ZWdvcnkmIG5ldGRiX2NhdGVnb3J5Ci0gID0gYXNpbzo6ZXJyb3I6OmdldF9uZXRkYl9jYXRlZ29yeSgpOwotc3RhdGljIGNvbnN0IGFzaW86OmVycm9yX2NhdGVnb3J5JiBhZGRyaW5mb19jYXRlZ29yeQotICA9IGFzaW86OmVycm9yOjpnZXRfYWRkcmluZm9fY2F0ZWdvcnkoKTsKLXN0YXRpYyBjb25zdCBhc2lvOjplcnJvcl9jYXRlZ29yeSYgbWlzY19jYXRlZ29yeQotICA9IGFzaW86OmVycm9yOjpnZXRfbWlzY19jYXRlZ29yeSgpOwotCi19IC8vIG5hbWVzcGFjZSBlcnJvcgotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TVERfU1lTVEVNX0VSUk9SKQotbmFtZXNwYWNlIHN0ZCB7Ci0KLXRlbXBsYXRlPD4gc3RydWN0IGlzX2Vycm9yX2NvZGVfZW51bTxhc2lvOjplcnJvcjo6YmFzaWNfZXJyb3JzPgotewotICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Ci19OwotCi10ZW1wbGF0ZTw+IHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08YXNpbzo6ZXJyb3I6Om5ldGRiX2Vycm9ycz4KLXsKLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOwotfTsKLQotdGVtcGxhdGU8PiBzdHJ1Y3QgaXNfZXJyb3JfY29kZV9lbnVtPGFzaW86OmVycm9yOjphZGRyaW5mb19lcnJvcnM+Ci17Ci0gIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKLX07Ci0KLXRlbXBsYXRlPD4gc3RydWN0IGlzX2Vycm9yX2NvZGVfZW51bTxhc2lvOjplcnJvcjo6bWlzY19lcnJvcnM+Ci17Ci0gIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHN0ZAotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX1NZU1RFTV9FUlJPUikKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGVycm9yIHsKLQotaW5saW5lIGFzaW86OmVycm9yX2NvZGUgbWFrZV9lcnJvcl9jb2RlKGJhc2ljX2Vycm9ycyBlKQotewotICByZXR1cm4gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgIHN0YXRpY19jYXN0PGludD4oZSksIGdldF9zeXN0ZW1fY2F0ZWdvcnkoKSk7Ci19Ci0KLWlubGluZSBhc2lvOjplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShuZXRkYl9lcnJvcnMgZSkKLXsKLSAgcmV0dXJuIGFzaW86OmVycm9yX2NvZGUoCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KGUpLCBnZXRfbmV0ZGJfY2F0ZWdvcnkoKSk7Ci19Ci0KLWlubGluZSBhc2lvOjplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShhZGRyaW5mb19lcnJvcnMgZSkKLXsKLSAgcmV0dXJuIGFzaW86OmVycm9yX2NvZGUoCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KGUpLCBnZXRfYWRkcmluZm9fY2F0ZWdvcnkoKSk7Ci19Ci0KLWlubGluZSBhc2lvOjplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShtaXNjX2Vycm9ycyBlKQotewotICByZXR1cm4gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgIHN0YXRpY19jYXN0PGludD4oZSksIGdldF9taXNjX2NhdGVnb3J5KCkpOwotfQotCi19IC8vIG5hbWVzcGFjZSBlcnJvcgotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jdW5kZWYgQVNJT19OQVRJVkVfRVJST1IKLSN1bmRlZiBBU0lPX1NPQ0tFVF9FUlJPUgotI3VuZGVmIEFTSU9fTkVUREJfRVJST1IKLSN1bmRlZiBBU0lPX0dFVEFERFJJTkZPX0VSUk9SCi0jdW5kZWYgQVNJT19XSU5fT1JfUE9TSVgKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9pbXBsL2Vycm9yLmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBBU0lPX0VSUk9SX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Vycm9yX2NvZGUuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2Vycm9yX2NvZGUuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTI0OGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9lcnJvcl9jb2RlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLwotLy8gZXJyb3JfY29kZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fRVJST1JfQ09ERV9IUFAKLSNkZWZpbmUgQVNJT19FUlJPUl9DT0RFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TVERfU1lTVEVNX0VSUk9SKQotIyBpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0jIGluY2x1ZGUgPHN0cmluZz4KLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotIyBpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotIyAgaW5jbHVkZSA8aW9zZndkPgotIyBlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX1NZU1RFTV9FUlJPUikKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU1REX1NZU1RFTV9FUlJPUikKLQotdHlwZWRlZiBzdGQ6OmVycm9yX2NhdGVnb3J5IGVycm9yX2NhdGVnb3J5OwotCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0KLS8vLyBCYXNlIGNsYXNzIGZvciBhbGwgZXJyb3IgY2F0ZWdvcmllcy4KLWNsYXNzIGVycm9yX2NhdGVnb3J5IDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICAvLy8gRGVzdHJ1Y3Rvci4KLSAgdmlydHVhbCB+ZXJyb3JfY2F0ZWdvcnkoKQotICB7Ci0gIH0KLQotICAvLy8gUmV0dXJucyBhIHN0cmluZyBuYW1pbmcgdGhlIGVycm9yIGdhdGVnb3J5LgotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCA9IDA7Ci0KLSAgLy8vIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IgZGVub3RlZCBieSBAYyB2YWx1ZS4KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBtZXNzYWdlKGludCB2YWx1ZSkgY29uc3QgPSAwOwotCi0gIC8vLyBFcXVhbGl0eSBvcGVyYXRvciB0byBjb21wYXJlIHR3byBlcnJvciBjYXRlZ29yaWVzLgotICBib29sIG9wZXJhdG9yPT0oY29uc3QgZXJyb3JfY2F0ZWdvcnkmIHJocykgY29uc3QKLSAgewotICAgIHJldHVybiB0aGlzID09ICZyaHM7Ci0gIH0KLQotICAvLy8gSW5lcXVhbGl0eSBvcGVyYXRvciB0byBjb21wYXJlIHR3byBlcnJvciBjYXRlZ29yaWVzLgotICBib29sIG9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY2F0ZWdvcnkmIHJocykgY29uc3QKLSAgewotICAgIHJldHVybiAhKCp0aGlzID09IHJocyk7Ci0gIH0KLX07Ci0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0KLS8vLyBSZXR1cm5zIHRoZSBlcnJvciBjYXRlZ29yeSB1c2VkIGZvciB0aGUgc3lzdGVtIGVycm9ycyBwcm9kdWNlZCBieSBhc2lvLgotZXh0ZXJuIEFTSU9fREVDTCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgc3lzdGVtX2NhdGVnb3J5KCk7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0KLXR5cGVkZWYgc3RkOjplcnJvcl9jb2RlIGVycm9yX2NvZGU7Ci0KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX1NZU1RFTV9FUlJPUikKLQotLy8vIENsYXNzIHRvIHJlcHJlc2VudCBhbiBlcnJvciBjb2RlIHZhbHVlLgotY2xhc3MgZXJyb3JfY29kZQotewotcHVibGljOgotICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgZXJyb3JfY29kZSgpCi0gICAgOiB2YWx1ZV8oMCksCi0gICAgICBjYXRlZ29yeV8oJnN5c3RlbV9jYXRlZ29yeSgpKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IHdpdGggc3BlY2lmaWMgZXJyb3IgY29kZSBhbmQgY2F0ZWdvcnkuCi0gIGVycm9yX2NvZGUoaW50IHYsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBjKQotICAgIDogdmFsdWVfKHYpLAotICAgICAgY2F0ZWdvcnlfKCZjKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGZyb20gYW4gZXJyb3IgY29kZSBlbnVtLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRXJyb3JFbnVtPgotICBlcnJvcl9jb2RlKEVycm9yRW51bSBlKQotICB7Ci0gICAgKnRoaXMgPSBtYWtlX2Vycm9yX2NvZGUoZSk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBlcnJvciB2YWx1ZS4KLSAgaW50IHZhbHVlKCkgY29uc3QKLSAgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBlcnJvciBjYXRlZ29yeS4KLSAgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGNhdGVnb3J5KCkgY29uc3QKLSAgewotICAgIHJldHVybiAqY2F0ZWdvcnlfOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgotICBzdGQ6OnN0cmluZyBtZXNzYWdlKCkgY29uc3QKLSAgewotICAgIHJldHVybiBjYXRlZ29yeV8tPm1lc3NhZ2UodmFsdWVfKTsKLSAgfQotCi0gIHN0cnVjdCB1bnNwZWNpZmllZF9ib29sX3R5cGVfdAotICB7Ci0gIH07Ci0KLSAgdHlwZWRlZiB2b2lkICgqdW5zcGVjaWZpZWRfYm9vbF90eXBlKSh1bnNwZWNpZmllZF9ib29sX3R5cGVfdCk7Ci0KLSAgc3RhdGljIHZvaWQgdW5zcGVjaWZpZWRfYm9vbF90cnVlKHVuc3BlY2lmaWVkX2Jvb2xfdHlwZV90KSB7fQotCi0gIC8vLyBPcGVyYXRvciByZXR1cm5zIG5vbi1udWxsIGlmIHRoZXJlIGlzIGEgbm9uLXN1Y2Nlc3MgZXJyb3IgY29kZS4KLSAgb3BlcmF0b3IgdW5zcGVjaWZpZWRfYm9vbF90eXBlKCkgY29uc3QKLSAgewotICAgIGlmICh2YWx1ZV8gPT0gMCkKLSAgICAgIHJldHVybiAwOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAmZXJyb3JfY29kZTo6dW5zcGVjaWZpZWRfYm9vbF90cnVlOwotICB9Ci0KLSAgLy8vIE9wZXJhdG9yIHRvIHRlc3QgaWYgdGhlIGVycm9yIHJlcHJlc2VudHMgc3VjY2Vzcy4KLSAgYm9vbCBvcGVyYXRvciEoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHZhbHVlXyA9PSAwOwotICB9Ci0KLSAgLy8vIEVxdWFsaXR5IG9wZXJhdG9yIHRvIGNvbXBhcmUgdHdvIGVycm9yIG9iamVjdHMuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgZXJyb3JfY29kZSYgZTEsIGNvbnN0IGVycm9yX2NvZGUmIGUyKQotICB7Ci0gICAgcmV0dXJuIGUxLnZhbHVlXyA9PSBlMi52YWx1ZV8gJiYgZTEuY2F0ZWdvcnlfID09IGUyLmNhdGVnb3J5XzsKLSAgfQotCi0gIC8vLyBJbmVxdWFsaXR5IG9wZXJhdG9yIHRvIGNvbXBhcmUgdHdvIGVycm9yIG9iamVjdHMuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY29kZSYgZTEsIGNvbnN0IGVycm9yX2NvZGUmIGUyKQotICB7Ci0gICAgcmV0dXJuIGUxLnZhbHVlXyAhPSBlMi52YWx1ZV8gfHwgZTEuY2F0ZWdvcnlfICE9IGUyLmNhdGVnb3J5XzsKLSAgfQotCi1wcml2YXRlOgotICAvLyBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvciBjb2RlLgotICBpbnQgdmFsdWVfOwotCi0gIC8vIFRoZSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yIGNvZGUuCi0gIGNvbnN0IGVycm9yX2NhdGVnb3J5KiBjYXRlZ29yeV87Ci19OwotCi0jIGlmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8vLyBPdXRwdXQgYW4gZXJyb3IgY29kZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtLCB0eXBlbmFtZSBUcmFpdHM+Ci1zdGQ6OmJhc2ljX29zdHJlYW08RWxlbSwgVHJhaXRzPiYgb3BlcmF0b3I8PCgKLSAgICBzdGQ6OmJhc2ljX29zdHJlYW08RWxlbSwgVHJhaXRzPiYgb3MsIGNvbnN0IGVycm9yX2NvZGUmIGVjKQotewotICBvcyA8PCBlYy5jYXRlZ29yeSgpLm5hbWUoKSA8PCAnOicgPDwgZWMudmFsdWUoKTsKLSAgcmV0dXJuIG9zOwotfQotCi0jIGVuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9pbXBsL2Vycm9yX2NvZGUuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIEFTSU9fRVJST1JfQ09ERV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9nZW5lcmljL2Jhc2ljX2VuZHBvaW50LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9nZW5lcmljL2Jhc2ljX2VuZHBvaW50LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1ZmJjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZ2VuZXJpYy9iYXNpY19lbmRwb2ludC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLy8KLS8vIGdlbmVyaWMvYmFzaWNfZW5kcG9pbnQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0dFTkVSSUNfQkFTSUNfRU5EUE9JTlRfSFBQCi0jZGVmaW5lIEFTSU9fR0VORVJJQ19CQVNJQ19FTkRQT0lOVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2dlbmVyaWMvZGV0YWlsL2VuZHBvaW50LmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBnZW5lcmljIHsKLQotLy8vIERlc2NyaWJlcyBhbiBlbmRwb2ludCBmb3IgYW55IHNvY2tldCB0eXBlLgotLyoqCi0gKiBUaGUgYXNpbzo6Z2VuZXJpYzo6YmFzaWNfZW5kcG9pbnQgY2xhc3MgdGVtcGxhdGUgZGVzY3JpYmVzIGFuIGVuZHBvaW50Ci0gKiB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggYW55IHNvY2tldCB0eXBlLgotICoKLSAqIEBub3RlIFRoZSBzb2NrZXQgdHlwZXMgc29ja2FkZHIgdHlwZSBtdXN0IGJlIGFibGUgdG8gZml0IGludG8gYQotICogQGMgc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3R1cmUuCi0gKgotICogQHBhciBUaHJlYWQgU2FmZXR5Ci0gKiBAZSBEaXN0aW5jdCBAZSBvYmplY3RzOiBTYWZlLkBuCi0gKiBAZSBTaGFyZWQgQGUgb2JqZWN0czogVW5zYWZlLgotICoKLSAqIEBwYXIgQ29uY2VwdHM6Ci0gKiBFbmRwb2ludC4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotY2xhc3MgYmFzaWNfZW5kcG9pbnQKLXsKLXB1YmxpYzoKLSAgLy8vIFRoZSBwcm90b2NvbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuCi0gIHR5cGVkZWYgUHJvdG9jb2wgcHJvdG9jb2xfdHlwZTsKLQotICAvLy8gVGhlIHR5cGUgb2YgdGhlIGVuZHBvaW50IHN0cnVjdHVyZS4gVGhpcyB0eXBlIGlzIGRlcGVuZGVudCBvbiB0aGUKLSAgLy8vIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvY2tldCBsYXllci4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIGRhdGFfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfYWRkcl90eXBlIGRhdGFfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBiYXNpY19lbmRwb2ludCgpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gZW5kcG9pbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNvY2tldCBhZGRyZXNzLgotICBiYXNpY19lbmRwb2ludChjb25zdCB2b2lkKiBzb2NrZXRfYWRkcmVzcywKLSAgICAgIHN0ZDo6c2l6ZV90IHNvY2tldF9hZGRyZXNzX3NpemUsIGludCBzb2NrZXRfcHJvdG9jb2wgPSAwKQotICAgIDogaW1wbF8oc29ja2V0X2FkZHJlc3MsIHNvY2tldF9hZGRyZXNzX3NpemUsIHNvY2tldF9wcm90b2NvbCkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbiBlbmRwb2ludCBmcm9tIHRoZSBzcGVjaWZpYyBlbmRwb2ludCB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRW5kcG9pbnQ+Ci0gIGJhc2ljX2VuZHBvaW50KGNvbnN0IEVuZHBvaW50JiBlbmRwb2ludCkKLSAgICA6IGltcGxfKGVuZHBvaW50LmRhdGEoKSwgZW5kcG9pbnQuc2l6ZSgpLCBlbmRwb2ludC5wcm90b2NvbCgpLnByb3RvY29sKCkpCi0gIHsKLSAgfQotCi0gIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgotICBiYXNpY19lbmRwb2ludChjb25zdCBiYXNpY19lbmRwb2ludCYgb3RoZXIpCi0gICAgOiBpbXBsXyhvdGhlci5pbXBsXykKLSAgewotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gIC8vLyBNb3ZlIGNvbnN0cnVjdG9yLgotICBiYXNpY19lbmRwb2ludChiYXNpY19lbmRwb2ludCYmIG90aGVyKQotICAgIDogaW1wbF8ob3RoZXIuaW1wbF8pCi0gIHsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAvLy8gQXNzaWduIGZyb20gYW5vdGhlciBlbmRwb2ludC4KLSAgYmFzaWNfZW5kcG9pbnQmIG9wZXJhdG9yPShjb25zdCBiYXNpY19lbmRwb2ludCYgb3RoZXIpCi0gIHsKLSAgICBpbXBsXyA9IG90aGVyLmltcGxfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAvLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIGVuZHBvaW50LgotICBiYXNpY19lbmRwb2ludCYgb3BlcmF0b3I9KGJhc2ljX2VuZHBvaW50JiYgb3RoZXIpCi0gIHsKLSAgICBpbXBsXyA9IG90aGVyLmltcGxfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAvLy8gVGhlIHByb3RvY29sIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuCi0gIHByb3RvY29sX3R5cGUgcHJvdG9jb2woKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHByb3RvY29sX3R5cGUoaW1wbF8uZmFtaWx5KCksIGltcGxfLnByb3RvY29sKCkpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgdW5kZXJseWluZyBlbmRwb2ludCBpbiB0aGUgbmF0aXZlIHR5cGUuCi0gIGRhdGFfdHlwZSogZGF0YSgpCi0gIHsKLSAgICByZXR1cm4gaW1wbF8uZGF0YSgpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgdW5kZXJseWluZyBlbmRwb2ludCBpbiB0aGUgbmF0aXZlIHR5cGUuCi0gIGNvbnN0IGRhdGFfdHlwZSogZGF0YSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaW1wbF8uZGF0YSgpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgdW5kZXJseWluZyBzaXplIG9mIHRoZSBlbmRwb2ludCBpbiB0aGUgbmF0aXZlIHR5cGUuCi0gIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGltcGxfLnNpemUoKTsKLSAgfQotCi0gIC8vLyBTZXQgdGhlIHVuZGVybHlpbmcgc2l6ZSBvZiB0aGUgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICB2b2lkIHJlc2l6ZShzdGQ6OnNpemVfdCBuZXdfc2l6ZSkKLSAgewotICAgIGltcGxfLnJlc2l6ZShuZXdfc2l6ZSk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBjYXBhY2l0eSBvZiB0aGUgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBzdGQ6OnNpemVfdCBjYXBhY2l0eSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaW1wbF8uY2FwYWNpdHkoKTsKLSAgfQotCi0gIC8vLyBDb21wYXJlIHR3byBlbmRwb2ludHMgZm9yIGVxdWFsaXR5LgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGJhc2ljX2VuZHBvaW50PFByb3RvY29sPiYgZTEsCi0gICAgICBjb25zdCBiYXNpY19lbmRwb2ludDxQcm90b2NvbD4mIGUyKQotICB7Ci0gICAgcmV0dXJuIGUxLmltcGxfID09IGUyLmltcGxfOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgdHdvIGVuZHBvaW50cyBmb3IgaW5lcXVhbGl0eS4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBiYXNpY19lbmRwb2ludDxQcm90b2NvbD4mIGUxLAotICAgICAgY29uc3QgYmFzaWNfZW5kcG9pbnQ8UHJvdG9jb2w+JiBlMikKLSAgewotICAgIHJldHVybiAhKGUxLmltcGxfID09IGUyLmltcGxfKTsKLSAgfQotCi0gIC8vLyBDb21wYXJlIGVuZHBvaW50cyBmb3Igb3JkZXJpbmcuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBiYXNpY19lbmRwb2ludDxQcm90b2NvbD4mIGUxLAotICAgICAgY29uc3QgYmFzaWNfZW5kcG9pbnQ8UHJvdG9jb2w+JiBlMikKLSAgewotICAgIHJldHVybiBlMS5pbXBsXyA8IGUyLmltcGxfOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgZW5kcG9pbnRzIGZvciBvcmRlcmluZy4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGJhc2ljX2VuZHBvaW50PFByb3RvY29sPiYgZTEsCi0gICAgICBjb25zdCBiYXNpY19lbmRwb2ludDxQcm90b2NvbD4mIGUyKQotICB7Ci0gICAgcmV0dXJuIGUyLmltcGxfIDwgZTEuaW1wbF87Ci0gIH0KLQotICAvLy8gQ29tcGFyZSBlbmRwb2ludHMgZm9yIG9yZGVyaW5nLgotICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGJhc2ljX2VuZHBvaW50PFByb3RvY29sPiYgZTEsCi0gICAgICBjb25zdCBiYXNpY19lbmRwb2ludDxQcm90b2NvbD4mIGUyKQotICB7Ci0gICAgcmV0dXJuICEoZTIgPCBlMSk7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSBlbmRwb2ludHMgZm9yIG9yZGVyaW5nLgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGJhc2ljX2VuZHBvaW50PFByb3RvY29sPiYgZTEsCi0gICAgICBjb25zdCBiYXNpY19lbmRwb2ludDxQcm90b2NvbD4mIGUyKQotICB7Ci0gICAgcmV0dXJuICEoZTEgPCBlMik7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gVGhlIHVuZGVybHlpbmcgZ2VuZXJpYyBlbmRwb2ludC4KLSAgYXNpbzo6Z2VuZXJpYzo6ZGV0YWlsOjplbmRwb2ludCBpbXBsXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGdlbmVyaWMKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fR0VORVJJQ19CQVNJQ19FTkRQT0lOVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9nZW5lcmljL2RhdGFncmFtX3Byb3RvY29sLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9nZW5lcmljL2RhdGFncmFtX3Byb3RvY29sLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZDRmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZ2VuZXJpYy9kYXRhZ3JhbV9wcm90b2NvbC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8KLS8vIGdlbmVyaWMvZGF0YWdyYW1fcHJvdG9jb2wuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0dFTkVSSUNfREFUQUdSQU1fUFJPVE9DT0xfSFBQCi0jZGVmaW5lIEFTSU9fR0VORVJJQ19EQVRBR1JBTV9QUk9UT0NPTF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2luY2x1ZGUgPHR5cGVpbmZvPgotI2luY2x1ZGUgImFzaW8vYmFzaWNfZGF0YWdyYW1fc29ja2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2V4Y2VwdGlvbi5ocHAiCi0jaW5jbHVkZSAiYXNpby9nZW5lcmljL2Jhc2ljX2VuZHBvaW50LmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBnZW5lcmljIHsKLQotLy8vIEVuY2Fwc3VsYXRlcyB0aGUgZmxhZ3MgbmVlZGVkIGZvciBhIGdlbmVyaWMgZGF0YWdyYW0tb3JpZW50ZWQgc29ja2V0LgotLyoqCi0gKiBUaGUgYXNpbzo6Z2VuZXJpYzo6ZGF0YWdyYW1fcHJvdG9jb2wgY2xhc3MgY29udGFpbnMgZmxhZ3MgbmVjZXNzYXJ5Ci0gKiBmb3IgZGF0YWdyYW0tb3JpZW50ZWQgc29ja2V0cyBvZiBhbnkgYWRkcmVzcyBmYW1pbHkgYW5kIHByb3RvY29sLgotICoKLSAqIEBwYXIgRXhhbXBsZXMKLSAqIENvbnN0cnVjdGluZyB1c2luZyBhIG5hdGl2ZSBhZGRyZXNzIGZhbWlseSBhbmQgc29ja2V0IHByb3RvY29sOgotICogQGNvZGUgZGF0YWdyYW1fcHJvdG9jb2wgcChBRl9JTkVULCBJUFBST1RPX1VEUCk7IEBlbmRjb2RlCi0gKiBDb25zdHJ1Y3RpbmcgZnJvbSBhIHNwZWNpZmljIHByb3RvY29sIHR5cGU6Ci0gKiBAY29kZSBkYXRhZ3JhbV9wcm90b2NvbCBwKGFzaW86OmlwOjp1ZHA6OnY0KCkpOyBAZW5kY29kZQotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFNhZmUuCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIFByb3RvY29sLgotICovCi1jbGFzcyBkYXRhZ3JhbV9wcm90b2NvbAotewotcHVibGljOgotICAvLy8gQ29uc3RydWN0IGEgcHJvdG9jb2wgb2JqZWN0IGZvciBhIHNwZWNpZmljIGFkZHJlc3MgZmFtaWx5IGFuZCBwcm90b2NvbC4KLSAgZGF0YWdyYW1fcHJvdG9jb2woaW50IGFkZHJlc3NfZmFtaWx5LCBpbnQgc29ja2V0X3Byb3RvY29sKQotICAgIDogZmFtaWx5XyhhZGRyZXNzX2ZhbWlseSksCi0gICAgICBwcm90b2NvbF8oc29ja2V0X3Byb3RvY29sKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgZ2VuZXJpYyBwcm90b2NvbCBvYmplY3QgZnJvbSBhIHNwZWNpZmljIHByb3RvY29sLgotICAvKioKLSAgICogQHRocm93cyBAYyBiYWRfY2FzdCBUaHJvd24gaWYgdGhlIHNvdXJjZSBwcm90b2NvbCBpcyBub3QgZGF0YWdyYW0tb3JpZW50ZWQuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIGRhdGFncmFtX3Byb3RvY29sKGNvbnN0IFByb3RvY29sJiBzb3VyY2VfcHJvdG9jb2wpCi0gICAgOiBmYW1pbHlfKHNvdXJjZV9wcm90b2NvbC5mYW1pbHkoKSksCi0gICAgICBwcm90b2NvbF8oc291cmNlX3Byb3RvY29sLnByb3RvY29sKCkpCi0gIHsKLSAgICBpZiAoc291cmNlX3Byb3RvY29sLnR5cGUoKSAhPSB0eXBlKCkpCi0gICAgewotICAgICAgc3RkOjpiYWRfY2FzdCBleDsKLSAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKGV4KTsKLSAgICB9Ci0gIH0KLQotICAvLy8gT2J0YWluIGFuIGlkZW50aWZpZXIgZm9yIHRoZSB0eXBlIG9mIHRoZSBwcm90b2NvbC4KLSAgaW50IHR5cGUoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIEFTSU9fT1NfREVGKFNPQ0tfREdSQU0pOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wuCi0gIGludCBwcm90b2NvbCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gcHJvdG9jb2xfOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wgZmFtaWx5LgotICBpbnQgZmFtaWx5KCkgY29uc3QKLSAgewotICAgIHJldHVybiBmYW1pbHlfOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgdHdvIHByb3RvY29scyBmb3IgZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgZGF0YWdyYW1fcHJvdG9jb2wmIHAxLAotICAgICAgY29uc3QgZGF0YWdyYW1fcHJvdG9jb2wmIHAyKQotICB7Ci0gICAgcmV0dXJuIHAxLmZhbWlseV8gPT0gcDIuZmFtaWx5XyAmJiBwMS5wcm90b2NvbF8gPT0gcDIucHJvdG9jb2xfOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgdHdvIHByb3RvY29scyBmb3IgaW5lcXVhbGl0eS4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBkYXRhZ3JhbV9wcm90b2NvbCYgcDEsCi0gICAgICBjb25zdCBkYXRhZ3JhbV9wcm90b2NvbCYgcDIpCi0gIHsKLSAgICByZXR1cm4gIShwMSA9PSBwMik7Ci0gIH0KLQotICAvLy8gVGhlIHR5cGUgb2YgYW4gZW5kcG9pbnQuCi0gIHR5cGVkZWYgYmFzaWNfZW5kcG9pbnQ8ZGF0YWdyYW1fcHJvdG9jb2w+IGVuZHBvaW50OwotCi0gIC8vLyBUaGUgZ2VuZXJpYyBzb2NrZXQgdHlwZS4KLSAgdHlwZWRlZiBiYXNpY19kYXRhZ3JhbV9zb2NrZXQ8ZGF0YWdyYW1fcHJvdG9jb2w+IHNvY2tldDsKLQotcHJpdmF0ZToKLSAgaW50IGZhbWlseV87Ci0gIGludCBwcm90b2NvbF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBnZW5lcmljCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0dFTkVSSUNfREFUQUdSQU1fUFJPVE9DT0xfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZ2VuZXJpYy9kZXRhaWwvZW5kcG9pbnQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2dlbmVyaWMvZGV0YWlsL2VuZHBvaW50LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlZWRlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZ2VuZXJpYy9kZXRhaWwvZW5kcG9pbnQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vCi0vLyBnZW5lcmljL2RldGFpbC9lbmRwb2ludC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0dFTkVSSUNfREVUQUlMX0VORFBPSU5UX0hQUAotI2RlZmluZSBBU0lPX0dFTkVSSUNfREVUQUlMX0VORFBPSU5UX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGdlbmVyaWMgewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLS8vIEhlbHBlciBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIGEgZ2VuZXJpYyBzb2NrZXQgZW5kcG9pbnQuCi1jbGFzcyBlbmRwb2ludAotewotcHVibGljOgotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgZW5kcG9pbnQoKTsKLQotICAvLyBDb25zdHJ1Y3QgYW4gZW5kcG9pbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHJhdyBieXRlcy4KLSAgQVNJT19ERUNMIGVuZHBvaW50KGNvbnN0IHZvaWQqIHNvY2tfYWRkciwKLSAgICAgIHN0ZDo6c2l6ZV90IHNvY2tfYWRkcl9zaXplLCBpbnQgc29ja19wcm90b2NvbCk7Ci0KLSAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KLSAgZW5kcG9pbnQoY29uc3QgZW5kcG9pbnQmIG90aGVyKQotICAgIDogZGF0YV8ob3RoZXIuZGF0YV8pLAotICAgICAgc2l6ZV8ob3RoZXIuc2l6ZV8pLAotICAgICAgcHJvdG9jb2xfKG90aGVyLnByb3RvY29sXykKLSAgewotICB9Ci0KLSAgLy8gQXNzaWduIGZyb20gYW5vdGhlciBlbmRwb2ludC4KLSAgZW5kcG9pbnQmIG9wZXJhdG9yPShjb25zdCBlbmRwb2ludCYgb3RoZXIpCi0gIHsKLSAgICBkYXRhXyA9IG90aGVyLmRhdGFfOwotICAgIHNpemVfID0gb3RoZXIuc2l6ZV87Ci0gICAgcHJvdG9jb2xfID0gb3RoZXIucHJvdG9jb2xfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEdldCB0aGUgYWRkcmVzcyBmYW1pbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmRwb2ludC4KLSAgaW50IGZhbWlseSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gZGF0YV8uYmFzZS5zYV9mYW1pbHk7Ci0gIH0KLQotICAvLyBHZXQgdGhlIHNvY2tldCBwcm90b2NvbCBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LgotICBpbnQgcHJvdG9jb2woKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHByb3RvY29sXzsKLSAgfQotCi0gIC8vIEdldCB0aGUgdW5kZXJseWluZyBlbmRwb2ludCBpbiB0aGUgbmF0aXZlIHR5cGUuCi0gIGFzaW86OmRldGFpbDo6c29ja2V0X2FkZHJfdHlwZSogZGF0YSgpCi0gIHsKLSAgICByZXR1cm4gJmRhdGFfLmJhc2U7Ci0gIH0KLQotICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBjb25zdCBhc2lvOjpkZXRhaWw6OnNvY2tldF9hZGRyX3R5cGUqIGRhdGEoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICZkYXRhXy5iYXNlOwotICB9Ci0KLSAgLy8gR2V0IHRoZSB1bmRlcmx5aW5nIHNpemUgb2YgdGhlIGVuZHBvaW50IGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2l6ZV87Ci0gIH0KLQotICAvLyBTZXQgdGhlIHVuZGVybHlpbmcgc2l6ZSBvZiB0aGUgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBBU0lPX0RFQ0wgdm9pZCByZXNpemUoc3RkOjpzaXplX3Qgc2l6ZSk7Ci0KLSAgLy8gR2V0IHRoZSBjYXBhY2l0eSBvZiB0aGUgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBzdGQ6OnNpemVfdCBjYXBhY2l0eSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2l6ZW9mKGFzaW86OmRldGFpbDo6c29ja2FkZHJfc3RvcmFnZV90eXBlKTsKLSAgfQotCi0gIC8vIENvbXBhcmUgdHdvIGVuZHBvaW50cyBmb3IgZXF1YWxpdHkuCi0gIEFTSU9fREVDTCBmcmllbmQgYm9vbCBvcGVyYXRvcj09KAotICAgICAgY29uc3QgZW5kcG9pbnQmIGUxLCBjb25zdCBlbmRwb2ludCYgZTIpOwotCi0gIC8vIENvbXBhcmUgZW5kcG9pbnRzIGZvciBvcmRlcmluZy4KLSAgQVNJT19ERUNMIGZyaWVuZCBib29sIG9wZXJhdG9yPCgKLSAgICAgIGNvbnN0IGVuZHBvaW50JiBlMSwgY29uc3QgZW5kcG9pbnQmIGUyKTsKLQotcHJpdmF0ZToKLSAgLy8gVGhlIHVuZGVybHlpbmcgc29ja2V0IGFkZHJlc3MuCi0gIHVuaW9uIGRhdGFfdW5pb24KLSAgewotICAgIGFzaW86OmRldGFpbDo6c29ja2V0X2FkZHJfdHlwZSBiYXNlOwotICAgIGFzaW86OmRldGFpbDo6c29ja2FkZHJfc3RvcmFnZV90eXBlIGdlbmVyaWM7Ci0gIH0gZGF0YV87Ci0KLSAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgc29ja2V0IGFkZHJlc3Mgc3RvcmVkIGluIHRoZSBlbmRwb2ludC4KLSAgc3RkOjpzaXplX3Qgc2l6ZV87Ci0KLSAgLy8gVGhlIHNvY2tldCBwcm90b2NvbCBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LgotICBpbnQgcHJvdG9jb2xfOwotCi0gIC8vIEluaXRpYWxpc2Ugd2l0aCBhIHNwZWNpZmllZCBtZW1vcnkuCi0gIEFTSU9fREVDTCB2b2lkIGluaXQoY29uc3Qgdm9pZCogc29ja19hZGRyLAotICAgICAgc3RkOjpzaXplX3Qgc29ja19hZGRyX3NpemUsIGludCBzb2NrX3Byb3RvY29sKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgZ2VuZXJpYwotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2dlbmVyaWMvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIEFTSU9fR0VORVJJQ19ERVRBSUxfRU5EUE9JTlRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZ2VuZXJpYy9kZXRhaWwvaW1wbC9lbmRwb2ludC5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZ2VuZXJpYy9kZXRhaWwvaW1wbC9lbmRwb2ludC5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNjE4MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2dlbmVyaWMvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vCi0vLyBnZW5lcmljL2RldGFpbC9pbXBsL2VuZHBvaW50LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19HRU5FUklDX0RFVEFJTF9JTVBMX0VORFBPSU5UX0lQUAotI2RlZmluZSBBU0lPX0dFTkVSSUNfREVUQUlMX0lNUExfRU5EUE9JTlRfSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHR5cGVpbmZvPgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19leGNlcHRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZ2VuZXJpYy9kZXRhaWwvZW5kcG9pbnQuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGdlbmVyaWMgewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWVuZHBvaW50OjplbmRwb2ludCgpCi17Ci0gIGluaXQoMCwgMCwgMCk7Ci19Ci0KLWVuZHBvaW50OjplbmRwb2ludChjb25zdCB2b2lkKiBzb2NrX2FkZHIsCi0gICAgc3RkOjpzaXplX3Qgc29ja19hZGRyX3NpemUsIGludCBzb2NrX3Byb3RvY29sKQotewotICBpbml0KHNvY2tfYWRkciwgc29ja19hZGRyX3NpemUsIHNvY2tfcHJvdG9jb2wpOwotfQotCi12b2lkIGVuZHBvaW50OjpyZXNpemUoc3RkOjpzaXplX3QgbmV3X3NpemUpCi17Ci0gIGlmIChuZXdfc2l6ZSA+IHNpemVvZihhc2lvOjpkZXRhaWw6OnNvY2thZGRyX3N0b3JhZ2VfdHlwZSkpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjKGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50KTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBzaXplXyA9IG5ld19zaXplOwotICAgIHByb3RvY29sXyA9IDA7Ci0gIH0KLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IGVuZHBvaW50JiBlMSwgY29uc3QgZW5kcG9pbnQmIGUyKQotewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3IgbWVtY21wLgotICByZXR1cm4gZTEuc2l6ZSgpID09IGUyLnNpemUoKSAmJiBtZW1jbXAoZTEuZGF0YSgpLCBlMi5kYXRhKCksIGUxLnNpemUoKSkgPT0gMDsKLX0KLQotYm9vbCBvcGVyYXRvcjwoY29uc3QgZW5kcG9pbnQmIGUxLCBjb25zdCBlbmRwb2ludCYgZTIpCi17Ci0gIGlmIChlMS5wcm90b2NvbCgpIDwgZTIucHJvdG9jb2woKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoZTEucHJvdG9jb2woKSA+IGUyLnByb3RvY29sKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1jbXAuCi0gIHN0ZDo6c2l6ZV90IGNvbXBhcmVfc2l6ZSA9IGUxLnNpemUoKSA8IGUyLnNpemUoKSA/IGUxLnNpemUoKSA6IGUyLnNpemUoKTsKLSAgaW50IGNvbXBhcmVfcmVzdWx0ID0gbWVtY21wKGUxLmRhdGEoKSwgZTIuZGF0YSgpLCBjb21wYXJlX3NpemUpOwotCi0gIGlmIChjb21wYXJlX3Jlc3VsdCA8IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGNvbXBhcmVfcmVzdWx0ID4gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGUxLnNpemUoKSA8IGUyLnNpemUoKTsKLX0KLQotdm9pZCBlbmRwb2ludDo6aW5pdChjb25zdCB2b2lkKiBzb2NrX2FkZHIsCi0gICAgc3RkOjpzaXplX3Qgc29ja19hZGRyX3NpemUsIGludCBzb2NrX3Byb3RvY29sKQotewotICBpZiAoc29ja19hZGRyX3NpemUgPiBzaXplb2YoYXNpbzo6ZGV0YWlsOjpzb2NrYWRkcl9zdG9yYWdlX3R5cGUpKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudCk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIH0KLQotICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3IgbWVtc2V0IGFuZCBtZW1jcHkuCi0gIG1lbXNldCgmZGF0YV8uZ2VuZXJpYywgMCwgc2l6ZW9mKGFzaW86OmRldGFpbDo6c29ja2FkZHJfc3RvcmFnZV90eXBlKSk7Ci0gIG1lbWNweSgmZGF0YV8uZ2VuZXJpYywgc29ja19hZGRyLCBzb2NrX2FkZHJfc2l6ZSk7Ci0KLSAgc2l6ZV8gPSBzb2NrX2FkZHJfc2l6ZTsKLSAgcHJvdG9jb2xfID0gc29ja19wcm90b2NvbDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBnZW5lcmljCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0dFTkVSSUNfREVUQUlMX0lNUExfRU5EUE9JTlRfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZ2VuZXJpYy9yYXdfcHJvdG9jb2wuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2dlbmVyaWMvcmF3X3Byb3RvY29sLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2MzI1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZ2VuZXJpYy9yYXdfcHJvdG9jb2wuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vCi0vLyBnZW5lcmljL3Jhd19wcm90b2NvbC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0dFTkVSSUNfUkFXX1BST1RPQ09MX0hQUAotI2RlZmluZSBBU0lPX0dFTkVSSUNfUkFXX1BST1RPQ09MX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaW5jbHVkZSA8dHlwZWluZm8+Ci0jaW5jbHVkZSAiYXNpby9iYXNpY19yYXdfc29ja2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2V4Y2VwdGlvbi5ocHAiCi0jaW5jbHVkZSAiYXNpby9nZW5lcmljL2Jhc2ljX2VuZHBvaW50LmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBnZW5lcmljIHsKLQotLy8vIEVuY2Fwc3VsYXRlcyB0aGUgZmxhZ3MgbmVlZGVkIGZvciBhIGdlbmVyaWMgcmF3IHNvY2tldC4KLS8qKgotICogVGhlIGFzaW86OmdlbmVyaWM6OnJhd19wcm90b2NvbCBjbGFzcyBjb250YWlucyBmbGFncyBuZWNlc3NhcnkgZm9yCi0gKiByYXcgc29ja2V0cyBvZiBhbnkgYWRkcmVzcyBmYW1pbHkgYW5kIHByb3RvY29sLgotICoKLSAqIEBwYXIgRXhhbXBsZXMKLSAqIENvbnN0cnVjdGluZyB1c2luZyBhIG5hdGl2ZSBhZGRyZXNzIGZhbWlseSBhbmQgc29ja2V0IHByb3RvY29sOgotICogQGNvZGUgcmF3X3Byb3RvY29sIHAoQUZfSU5FVCwgSVBQUk9UT19JQ01QKTsgQGVuZGNvZGUKLSAqIENvbnN0cnVjdGluZyBmcm9tIGEgc3BlY2lmaWMgcHJvdG9jb2wgdHlwZToKLSAqIEBjb2RlIHJhd19wcm90b2NvbCBwKGFzaW86OmlwOjppY21wOjp2NCgpKTsgQGVuZGNvZGUKLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBTYWZlLgotICoKLSAqIEBwYXIgQ29uY2VwdHM6Ci0gKiBQcm90b2NvbC4KLSAqLwotY2xhc3MgcmF3X3Byb3RvY29sCi17Ci1wdWJsaWM6Ci0gIC8vLyBDb25zdHJ1Y3QgYSBwcm90b2NvbCBvYmplY3QgZm9yIGEgc3BlY2lmaWMgYWRkcmVzcyBmYW1pbHkgYW5kIHByb3RvY29sLgotICByYXdfcHJvdG9jb2woaW50IGFkZHJlc3NfZmFtaWx5LCBpbnQgc29ja2V0X3Byb3RvY29sKQotICAgIDogZmFtaWx5XyhhZGRyZXNzX2ZhbWlseSksCi0gICAgICBwcm90b2NvbF8oc29ja2V0X3Byb3RvY29sKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgZ2VuZXJpYyBwcm90b2NvbCBvYmplY3QgZnJvbSBhIHNwZWNpZmljIHByb3RvY29sLgotICAvKioKLSAgICogQHRocm93cyBAYyBiYWRfY2FzdCBUaHJvd24gaWYgdGhlIHNvdXJjZSBwcm90b2NvbCBpcyBub3QgcmF3LW9yaWVudGVkLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICByYXdfcHJvdG9jb2woY29uc3QgUHJvdG9jb2wmIHNvdXJjZV9wcm90b2NvbCkKLSAgICA6IGZhbWlseV8oc291cmNlX3Byb3RvY29sLmZhbWlseSgpKSwKLSAgICAgIHByb3RvY29sXyhzb3VyY2VfcHJvdG9jb2wucHJvdG9jb2woKSkKLSAgewotICAgIGlmIChzb3VyY2VfcHJvdG9jb2wudHlwZSgpICE9IHR5cGUoKSkKLSAgICB7Ci0gICAgICBzdGQ6OmJhZF9jYXN0IGV4OwotICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICAgIH0KLSAgfQotCi0gIC8vLyBPYnRhaW4gYW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgdGhlIHByb3RvY29sLgotICBpbnQgdHlwZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gQVNJT19PU19ERUYoU09DS19SQVcpOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wuCi0gIGludCBwcm90b2NvbCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gcHJvdG9jb2xfOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wgZmFtaWx5LgotICBpbnQgZmFtaWx5KCkgY29uc3QKLSAgewotICAgIHJldHVybiBmYW1pbHlfOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgdHdvIHByb3RvY29scyBmb3IgZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgcmF3X3Byb3RvY29sJiBwMSwgY29uc3QgcmF3X3Byb3RvY29sJiBwMikKLSAgewotICAgIHJldHVybiBwMS5mYW1pbHlfID09IHAyLmZhbWlseV8gJiYgcDEucHJvdG9jb2xfID09IHAyLnByb3RvY29sXzsKLSAgfQotCi0gIC8vLyBDb21wYXJlIHR3byBwcm90b2NvbHMgZm9yIGluZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgcmF3X3Byb3RvY29sJiBwMSwgY29uc3QgcmF3X3Byb3RvY29sJiBwMikKLSAgewotICAgIHJldHVybiAhKHAxID09IHAyKTsKLSAgfQotCi0gIC8vLyBUaGUgdHlwZSBvZiBhbiBlbmRwb2ludC4KLSAgdHlwZWRlZiBiYXNpY19lbmRwb2ludDxyYXdfcHJvdG9jb2w+IGVuZHBvaW50OwotCi0gIC8vLyBUaGUgZ2VuZXJpYyBzb2NrZXQgdHlwZS4KLSAgdHlwZWRlZiBiYXNpY19yYXdfc29ja2V0PHJhd19wcm90b2NvbD4gc29ja2V0OwotCi1wcml2YXRlOgotICBpbnQgZmFtaWx5XzsKLSAgaW50IHByb3RvY29sXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGdlbmVyaWMKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fR0VORVJJQ19SQVdfUFJPVE9DT0xfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vZ2VuZXJpYy9zZXFfcGFja2V0X3Byb3RvY29sLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9nZW5lcmljL3NlcV9wYWNrZXRfcHJvdG9jb2wuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU1Y2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9nZW5lcmljL3NlcV9wYWNrZXRfcHJvdG9jb2wuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vCi0vLyBnZW5lcmljL3NlcV9wYWNrZXRfcHJvdG9jb2wuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fR0VORVJJQ19TRVFfUEFDS0VUX1BST1RPQ09MX0hQUAotI2RlZmluZSBBU0lPX0dFTkVSSUNfU0VRX1BBQ0tFVF9QUk9UT0NPTF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2luY2x1ZGUgPHR5cGVpbmZvPgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXhjZXB0aW9uLmhwcCIKLSNpbmNsdWRlICJhc2lvL2dlbmVyaWMvYmFzaWNfZW5kcG9pbnQuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGdlbmVyaWMgewotCi0vLy8gRW5jYXBzdWxhdGVzIHRoZSBmbGFncyBuZWVkZWQgZm9yIGEgZ2VuZXJpYyBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldC4KLS8qKgotICogVGhlIGFzaW86OmdlbmVyaWM6OnNlcV9wYWNrZXRfcHJvdG9jb2wgY2xhc3MgY29udGFpbnMgZmxhZ3MgbmVjZXNzYXJ5Ci0gKiBmb3Igc2VxX3BhY2tldC1vcmllbnRlZCBzb2NrZXRzIG9mIGFueSBhZGRyZXNzIGZhbWlseSBhbmQgcHJvdG9jb2wuCi0gKgotICogQHBhciBFeGFtcGxlcwotICogQ29uc3RydWN0aW5nIHVzaW5nIGEgbmF0aXZlIGFkZHJlc3MgZmFtaWx5IGFuZCBzb2NrZXQgcHJvdG9jb2w6Ci0gKiBAY29kZSBzZXFfcGFja2V0X3Byb3RvY29sIHAoQUZfSU5FVCwgSVBQUk9UT19TQ1RQKTsgQGVuZGNvZGUKLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBTYWZlLgotICoKLSAqIEBwYXIgQ29uY2VwdHM6Ci0gKiBQcm90b2NvbC4KLSAqLwotY2xhc3Mgc2VxX3BhY2tldF9wcm90b2NvbAotewotcHVibGljOgotICAvLy8gQ29uc3RydWN0IGEgcHJvdG9jb2wgb2JqZWN0IGZvciBhIHNwZWNpZmljIGFkZHJlc3MgZmFtaWx5IGFuZCBwcm90b2NvbC4KLSAgc2VxX3BhY2tldF9wcm90b2NvbChpbnQgYWRkcmVzc19mYW1pbHksIGludCBzb2NrZXRfcHJvdG9jb2wpCi0gICAgOiBmYW1pbHlfKGFkZHJlc3NfZmFtaWx5KSwKLSAgICAgIHByb3RvY29sXyhzb2NrZXRfcHJvdG9jb2wpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBnZW5lcmljIHByb3RvY29sIG9iamVjdCBmcm9tIGEgc3BlY2lmaWMgcHJvdG9jb2wuCi0gIC8qKgotICAgKiBAdGhyb3dzIEBjIGJhZF9jYXN0IFRocm93biBpZiB0aGUgc291cmNlIHByb3RvY29sIGlzIG5vdCBiYXNlZCBhcm91bmQKLSAgICogc2VxdWVuY2VkIHBhY2tldHMuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIHNlcV9wYWNrZXRfcHJvdG9jb2woY29uc3QgUHJvdG9jb2wmIHNvdXJjZV9wcm90b2NvbCkKLSAgICA6IGZhbWlseV8oc291cmNlX3Byb3RvY29sLmZhbWlseSgpKSwKLSAgICAgIHByb3RvY29sXyhzb3VyY2VfcHJvdG9jb2wucHJvdG9jb2woKSkKLSAgewotICAgIGlmIChzb3VyY2VfcHJvdG9jb2wudHlwZSgpICE9IHR5cGUoKSkKLSAgICB7Ci0gICAgICBzdGQ6OmJhZF9jYXN0IGV4OwotICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICAgIH0KLSAgfQotCi0gIC8vLyBPYnRhaW4gYW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgdGhlIHByb3RvY29sLgotICBpbnQgdHlwZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gQVNJT19PU19ERUYoU09DS19TRVFQQUNLRVQpOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wuCi0gIGludCBwcm90b2NvbCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gcHJvdG9jb2xfOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wgZmFtaWx5LgotICBpbnQgZmFtaWx5KCkgY29uc3QKLSAgewotICAgIHJldHVybiBmYW1pbHlfOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgdHdvIHByb3RvY29scyBmb3IgZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3Qgc2VxX3BhY2tldF9wcm90b2NvbCYgcDEsCi0gICAgICBjb25zdCBzZXFfcGFja2V0X3Byb3RvY29sJiBwMikKLSAgewotICAgIHJldHVybiBwMS5mYW1pbHlfID09IHAyLmZhbWlseV8gJiYgcDEucHJvdG9jb2xfID09IHAyLnByb3RvY29sXzsKLSAgfQotCi0gIC8vLyBDb21wYXJlIHR3byBwcm90b2NvbHMgZm9yIGluZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3Qgc2VxX3BhY2tldF9wcm90b2NvbCYgcDEsCi0gICAgICBjb25zdCBzZXFfcGFja2V0X3Byb3RvY29sJiBwMikKLSAgewotICAgIHJldHVybiAhKHAxID09IHAyKTsKLSAgfQotCi0gIC8vLyBUaGUgdHlwZSBvZiBhbiBlbmRwb2ludC4KLSAgdHlwZWRlZiBiYXNpY19lbmRwb2ludDxzZXFfcGFja2V0X3Byb3RvY29sPiBlbmRwb2ludDsKLQotICAvLy8gVGhlIGdlbmVyaWMgc29ja2V0IHR5cGUuCi0gIHR5cGVkZWYgYmFzaWNfc2VxX3BhY2tldF9zb2NrZXQ8c2VxX3BhY2tldF9wcm90b2NvbD4gc29ja2V0OwotCi1wcml2YXRlOgotICBpbnQgZmFtaWx5XzsKLSAgaW50IHByb3RvY29sXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGdlbmVyaWMKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fR0VORVJJQ19TRVFfUEFDS0VUX1BST1RPQ09MX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2dlbmVyaWMvc3RyZWFtX3Byb3RvY29sLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9nZW5lcmljL3N0cmVhbV9wcm90b2NvbC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDU3YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2dlbmVyaWMvc3RyZWFtX3Byb3RvY29sLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vLwotLy8gZ2VuZXJpYy9zdHJlYW1fcHJvdG9jb2wuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19HRU5FUklDX1NUUkVBTV9QUk9UT0NPTF9IUFAKLSNkZWZpbmUgQVNJT19HRU5FUklDX1NUUkVBTV9QUk9UT0NPTF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2luY2x1ZGUgPHR5cGVpbmZvPgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc29ja2V0X2lvc3RyZWFtLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3N0cmVhbV9zb2NrZXQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXhjZXB0aW9uLmhwcCIKLSNpbmNsdWRlICJhc2lvL2dlbmVyaWMvYmFzaWNfZW5kcG9pbnQuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGdlbmVyaWMgewotCi0vLy8gRW5jYXBzdWxhdGVzIHRoZSBmbGFncyBuZWVkZWQgZm9yIGEgZ2VuZXJpYyBzdHJlYW0tb3JpZW50ZWQgc29ja2V0LgotLyoqCi0gKiBUaGUgYXNpbzo6Z2VuZXJpYzo6c3RyZWFtX3Byb3RvY29sIGNsYXNzIGNvbnRhaW5zIGZsYWdzIG5lY2Vzc2FyeSBmb3IKLSAqIHN0cmVhbS1vcmllbnRlZCBzb2NrZXRzIG9mIGFueSBhZGRyZXNzIGZhbWlseSBhbmQgcHJvdG9jb2wuCi0gKgotICogQHBhciBFeGFtcGxlcwotICogQ29uc3RydWN0aW5nIHVzaW5nIGEgbmF0aXZlIGFkZHJlc3MgZmFtaWx5IGFuZCBzb2NrZXQgcHJvdG9jb2w6Ci0gKiBAY29kZSBzdHJlYW1fcHJvdG9jb2wgcChBRl9JTkVULCBJUFBST1RPX1RDUCk7IEBlbmRjb2RlCi0gKiBDb25zdHJ1Y3RpbmcgZnJvbSBhIHNwZWNpZmljIHByb3RvY29sIHR5cGU6Ci0gKiBAY29kZSBzdHJlYW1fcHJvdG9jb2wgcChhc2lvOjppcDo6dGNwOjp2NCgpKTsgQGVuZGNvZGUKLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBTYWZlLgotICoKLSAqIEBwYXIgQ29uY2VwdHM6Ci0gKiBQcm90b2NvbC4KLSAqLwotY2xhc3Mgc3RyZWFtX3Byb3RvY29sCi17Ci1wdWJsaWM6Ci0gIC8vLyBDb25zdHJ1Y3QgYSBwcm90b2NvbCBvYmplY3QgZm9yIGEgc3BlY2lmaWMgYWRkcmVzcyBmYW1pbHkgYW5kIHByb3RvY29sLgotICBzdHJlYW1fcHJvdG9jb2woaW50IGFkZHJlc3NfZmFtaWx5LCBpbnQgc29ja2V0X3Byb3RvY29sKQotICAgIDogZmFtaWx5XyhhZGRyZXNzX2ZhbWlseSksCi0gICAgICBwcm90b2NvbF8oc29ja2V0X3Byb3RvY29sKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgZ2VuZXJpYyBwcm90b2NvbCBvYmplY3QgZnJvbSBhIHNwZWNpZmljIHByb3RvY29sLgotICAvKioKLSAgICogQHRocm93cyBAYyBiYWRfY2FzdCBUaHJvd24gaWYgdGhlIHNvdXJjZSBwcm90b2NvbCBpcyBub3Qgc3RyZWFtLW9yaWVudGVkLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBzdHJlYW1fcHJvdG9jb2woY29uc3QgUHJvdG9jb2wmIHNvdXJjZV9wcm90b2NvbCkKLSAgICA6IGZhbWlseV8oc291cmNlX3Byb3RvY29sLmZhbWlseSgpKSwKLSAgICAgIHByb3RvY29sXyhzb3VyY2VfcHJvdG9jb2wucHJvdG9jb2woKSkKLSAgewotICAgIGlmIChzb3VyY2VfcHJvdG9jb2wudHlwZSgpICE9IHR5cGUoKSkKLSAgICB7Ci0gICAgICBzdGQ6OmJhZF9jYXN0IGV4OwotICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICAgIH0KLSAgfQotCi0gIC8vLyBPYnRhaW4gYW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgdGhlIHByb3RvY29sLgotICBpbnQgdHlwZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gQVNJT19PU19ERUYoU09DS19TVFJFQU0pOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wuCi0gIGludCBwcm90b2NvbCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gcHJvdG9jb2xfOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wgZmFtaWx5LgotICBpbnQgZmFtaWx5KCkgY29uc3QKLSAgewotICAgIHJldHVybiBmYW1pbHlfOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgdHdvIHByb3RvY29scyBmb3IgZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3Qgc3RyZWFtX3Byb3RvY29sJiBwMSwgY29uc3Qgc3RyZWFtX3Byb3RvY29sJiBwMikKLSAgewotICAgIHJldHVybiBwMS5mYW1pbHlfID09IHAyLmZhbWlseV8gJiYgcDEucHJvdG9jb2xfID09IHAyLnByb3RvY29sXzsKLSAgfQotCi0gIC8vLyBDb21wYXJlIHR3byBwcm90b2NvbHMgZm9yIGluZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3Qgc3RyZWFtX3Byb3RvY29sJiBwMSwgY29uc3Qgc3RyZWFtX3Byb3RvY29sJiBwMikKLSAgewotICAgIHJldHVybiAhKHAxID09IHAyKTsKLSAgfQotCi0gIC8vLyBUaGUgdHlwZSBvZiBhbiBlbmRwb2ludC4KLSAgdHlwZWRlZiBiYXNpY19lbmRwb2ludDxzdHJlYW1fcHJvdG9jb2w+IGVuZHBvaW50OwotCi0gIC8vLyBUaGUgZ2VuZXJpYyBzb2NrZXQgdHlwZS4KLSAgdHlwZWRlZiBiYXNpY19zdHJlYW1fc29ja2V0PHN0cmVhbV9wcm90b2NvbD4gc29ja2V0OwotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLSAgLy8vIFRoZSBnZW5lcmljIHNvY2tldCBpb3N0cmVhbSB0eXBlLgotICB0eXBlZGVmIGJhc2ljX3NvY2tldF9pb3N0cmVhbTxzdHJlYW1fcHJvdG9jb2w+IGlvc3RyZWFtOwotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLXByaXZhdGU6Ci0gIGludCBmYW1pbHlfOwotICBpbnQgcHJvdG9jb2xfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgZ2VuZXJpYwotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19HRU5FUklDX1NUUkVBTV9QUk9UT0NPTF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9oYW5kbGVyX2FsbG9jX2hvb2suaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2hhbmRsZXJfYWxsb2NfaG9vay5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTkyY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2hhbmRsZXJfYWxsb2NfaG9vay5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLwotLy8gaGFuZGxlcl9hbGxvY19ob29rLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0hBTkRMRVJfQUxMT0NfSE9PS19IUFAKLSNkZWZpbmUgQVNJT19IQU5ETEVSX0FMTE9DX0hPT0tfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIERlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbiBmb3IgaGFuZGxlcnMuCi0vKioKLSAqIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zIG1heSBuZWVkIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBvYmplY3RzLiBTaW5jZQotICogYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgaGF2ZSBhIGhhbmRsZXIgZnVuY3Rpb24gb2JqZWN0LCB0aGVzZSB0ZW1wb3JhcnkKLSAqIG9iamVjdHMgY2FuIGJlIHNhaWQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGVyLgotICoKLSAqIEltcGxlbWVudCBhc2lvX2hhbmRsZXJfYWxsb2NhdGUgYW5kIGFzaW9faGFuZGxlcl9kZWFsbG9jYXRlIGZvciB5b3VyIG93bgotICogaGFuZGxlcnMgdG8gcHJvdmlkZSBjdXN0b20gYWxsb2NhdGlvbiBmb3IgdGhlc2UgdGVtcG9yYXJ5IG9iamVjdHMuCi0gKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgYWxsb2NhdGlvbiBob29rcyB1c2VzIDx0dD46Om9wZXJhdG9yCi0gKiBuZXc8L3R0PiBhbmQgPHR0Pjo6b3BlcmF0b3IgZGVsZXRlPC90dD4uCi0gKgotICogQG5vdGUgQWxsIHRlbXBvcmFyeSBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCBhIGhhbmRsZXIgd2lsbCBiZSBkZWFsbG9jYXRlZAotICogYmVmb3JlIHRoZSB1cGNhbGwgdG8gdGhlIGhhbmRsZXIgaXMgcGVyZm9ybWVkLiBUaGlzIGFsbG93cyB0aGUgc2FtZSBtZW1vcnkgdG8KLSAqIGJlIHJldXNlZCBmb3IgYSBzdWJzZXF1ZW50IGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaW5pdGlhdGVkIGJ5IHRoZSBoYW5kbGVyLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogQGNvZGUKLSAqIGNsYXNzIG15X2hhbmRsZXI7Ci0gKgotICogdm9pZCogYXNpb19oYW5kbGVyX2FsbG9jYXRlKHN0ZDo6c2l6ZV90IHNpemUsIG15X2hhbmRsZXIqIGNvbnRleHQpCi0gKiB7Ci0gKiAgIHJldHVybiA6Om9wZXJhdG9yIG5ldyhzaXplKTsKLSAqIH0KLSAqCi0gKiB2b2lkIGFzaW9faGFuZGxlcl9kZWFsbG9jYXRlKHZvaWQqIHBvaW50ZXIsIHN0ZDo6c2l6ZV90IHNpemUsCi0gKiAgICAgbXlfaGFuZGxlciogY29udGV4dCkKLSAqIHsKLSAqICAgOjpvcGVyYXRvciBkZWxldGUocG9pbnRlcik7Ci0gKiB9Ci0gKiBAZW5kY29kZQotICovCi1BU0lPX0RFQ0wgdm9pZCogYXNpb19oYW5kbGVyX2FsbG9jYXRlKAotICAgIHN0ZDo6c2l6ZV90IHNpemUsIC4uLik7Ci0KLS8vLyBEZWZhdWx0IGRlYWxsb2NhdGlvbiBmdW5jdGlvbiBmb3IgaGFuZGxlcnMuCi0vKioKLSAqIEltcGxlbWVudCBhc2lvX2hhbmRsZXJfYWxsb2NhdGUgYW5kIGFzaW9faGFuZGxlcl9kZWFsbG9jYXRlIGZvciB5b3VyIG93bgotICogaGFuZGxlcnMgdG8gcHJvdmlkZSBjdXN0b20gYWxsb2NhdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgdGVtcG9yYXJ5IG9iamVjdHMuCi0gKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgYWxsb2NhdGlvbiBob29rcyB1c2VzIDx0dD46Om9wZXJhdG9yCi0gKiBuZXc8L3R0PiBhbmQgPHR0Pjo6b3BlcmF0b3IgZGVsZXRlPC90dD4uCi0gKgotICogQHNhIGFzaW9faGFuZGxlcl9hbGxvY2F0ZS4KLSAqLwotQVNJT19ERUNMIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUoCi0gICAgdm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwgLi4uKTsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2ltcGwvaGFuZGxlcl9hbGxvY19ob29rLmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBBU0lPX0hBTkRMRVJfQUxMT0NfSE9PS19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9oYW5kbGVyX2NvbnRpbnVhdGlvbl9ob29rLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9oYW5kbGVyX2NvbnRpbnVhdGlvbl9ob29rLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2MDUxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaGFuZGxlcl9jb250aW51YXRpb25faG9vay5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLwotLy8gaGFuZGxlcl9jb250aW51YXRpb25faG9vay5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSEFORExFUl9DT05USU5VQVRJT05fSE9PS19IUFAKLSNkZWZpbmUgQVNJT19IQU5ETEVSX0NPTlRJTlVBVElPTl9IT09LX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0vLy8gRGVmYXVsdCBjb250aW51YXRpb24gZnVuY3Rpb24gZm9yIGhhbmRsZXJzLgotLyoqCi0gKiBBc3luY2hyb25vdXMgb3BlcmF0aW9ucyBtYXkgcmVwcmVzZW50IGEgY29udGludWF0aW9uIG9mIHRoZSBhc3luY2hyb25vdXMKLSAqIGNvbnRyb2wgZmxvdyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgaGFuZGxlci4gVGhlIGltcGxlbWVudGF0aW9uIGNhbiB1c2UKLSAqIHRoaXMga25vd2xlZGdlIHRvIG9wdGltaXNlIHNjaGVkdWxpbmcgb2YgdGhlIGhhbmRsZXIuCi0gKgotICogSW1wbGVtZW50IGFzaW9faGFuZGxlcl9pc19jb250aW51YXRpb24gZm9yIHlvdXIgb3duIGhhbmRsZXJzIHRvIGluZGljYXRlCi0gKiB3aGVuIGEgaGFuZGxlciByZXByZXNlbnRzIGEgY29udGludWF0aW9uLgotICoKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb250aW51YXRpb24gaG9vayByZXR1cm5zIDx0dD5mYWxzZTwvdHQ+LgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogQGNvZGUKLSAqIGNsYXNzIG15X2hhbmRsZXI7Ci0gKgotICogYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKG15X2hhbmRsZXIqIGNvbnRleHQpCi0gKiB7Ci0gKiAgIHJldHVybiB0cnVlOwotICogfQotICogQGVuZGNvZGUKLSAqLwotaW5saW5lIGJvb2wgYXNpb19oYW5kbGVyX2lzX2NvbnRpbnVhdGlvbiguLi4pCi17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19IQU5ETEVSX0NPTlRJTlVBVElPTl9IT09LX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2hhbmRsZXJfaW52b2tlX2hvb2suaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2hhbmRsZXJfaW52b2tlX2hvb2suaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTJlZDQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9oYW5kbGVyX2ludm9rZV9ob29rLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vCi0vLyBoYW5kbGVyX2ludm9rZV9ob29rLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19IQU5ETEVSX0lOVk9LRV9IT09LX0hQUAotI2RlZmluZSBBU0lPX0hBTkRMRVJfSU5WT0tFX0hPT0tfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8qKiBAZGVmZ3JvdXAgYXNpb19oYW5kbGVyX2ludm9rZSBhc2lvOjphc2lvX2hhbmRsZXJfaW52b2tlCi0gKgotICogQGJyaWVmIERlZmF1bHQgaW52b2tlIGZ1bmN0aW9uIGZvciBoYW5kbGVycy4KLSAqCi0gKiBDb21wbGV0aW9uIGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhcmUgaW52b2tlZCBieSB0aGUKLSAqIGlvX3NlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCAoZS5nLiBhIHNvY2tldCBvcgotICogZGVhZGxpbmVfdGltZXIpLiBDZXJ0YWluIGd1YXJhbnRlZXMgYXJlIG1hZGUgb24gd2hlbiB0aGUgaGFuZGxlciBtYXkgYmUKLSAqIGludm9rZWQsIGluIHBhcnRpY3VsYXIgdGhhdCBhIGhhbmRsZXIgY2FuIG9ubHkgYmUgaW52b2tlZCBmcm9tIGEgdGhyZWFkIHRoYXQKLSAqIGlzIGN1cnJlbnRseSBjYWxsaW5nIEBjIHJ1bigpIG9uIHRoZSBjb3JyZXNwb25kaW5nIGlvX3NlcnZpY2Ugb2JqZWN0LgotICogSGFuZGxlcnMgbWF5IHN1YnNlcXVlbnRseSBiZSBpbnZva2VkIHRocm91Z2ggb3RoZXIgb2JqZWN0cyAoc3VjaCBhcwotICogaW9fc2VydmljZTo6c3RyYW5kIG9iamVjdHMpIHRoYXQgcHJvdmlkZSBhZGRpdGlvbmFsIGd1YXJhbnRlZXMuCi0gKgotICogV2hlbiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhcmUgY29tcG9zZWQgZnJvbSBvdGhlciBhc3luY2hyb25vdXMKLSAqIG9wZXJhdGlvbnMsIGFsbCBpbnRlcm1lZGlhdGUgaGFuZGxlcnMgc2hvdWxkIGJlIGludm9rZWQgdXNpbmcgdGhlIHNhbWUKLSAqIG1ldGhvZCBhcyB0aGUgZmluYWwgaGFuZGxlci4gVGhpcyBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCB1c2VyLWRlZmluZWQKLSAqIG9iamVjdHMgYXJlIG5vdCBhY2Nlc3NlZCBpbiBhIHdheSB0aGF0IG1heSB2aW9sYXRlIHRoZSBndWFyYW50ZWVzLiBUaGlzCi0gKiBob29raW5nIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCB0aGUgaW52b2tlZCBtZXRob2QgdXNlZCBmb3IgdGhlIGZpbmFsIGhhbmRsZXIKLSAqIGlzIGFjY2Vzc2libGUgYXQgZWFjaCBpbnRlcm1lZGlhdGUgc3RlcC4KLSAqCi0gKiBJbXBsZW1lbnQgYXNpb19oYW5kbGVyX2ludm9rZSBmb3IgeW91ciBvd24gaGFuZGxlcnMgdG8gc3BlY2lmeSBhIGN1c3RvbQotICogaW52b2NhdGlvbiBzdHJhdGVneS4KLSAqCi0gKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW52b2tlcyB0aGUgZnVuY3Rpb24gb2JqZWN0IGxpa2Ugc286Ci0gKiBAY29kZSBmdW5jdGlvbigpOyBAZW5kY29kZQotICogSWYgbmVjZXNzYXJ5LCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtYWtlcyBhIGNvcHkgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdAotICogc28gdGhhdCB0aGUgbm9uLWNvbnN0IG9wZXJhdG9yKCkgY2FuIGJlIHVzZWQuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBAY29kZQotICogY2xhc3MgbXlfaGFuZGxlcjsKLSAqCi0gKiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci0gKiB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoRnVuY3Rpb24gZnVuY3Rpb24sIG15X2hhbmRsZXIqIGNvbnRleHQpCi0gKiB7Ci0gKiAgIGNvbnRleHQtPnN0cmFuZF8uZGlzcGF0Y2goZnVuY3Rpb24pOwotICogfQotICogQGVuZGNvZGUKLSAqLwotLypAeyovCi0KLS8vLyBEZWZhdWx0IGhhbmRsZXIgaW52b2NhdGlvbiBob29rIHVzZWQgZm9yIG5vbi1jb25zdCBmdW5jdGlvbiBvYmplY3RzLgotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2ludm9rZShGdW5jdGlvbiYgZnVuY3Rpb24sIC4uLikKLXsKLSAgZnVuY3Rpb24oKTsKLX0KLQotLy8vIERlZmF1bHQgaGFuZGxlciBpbnZvY2F0aW9uIGhvb2sgdXNlZCBmb3IgY29uc3QgZnVuY3Rpb24gb2JqZWN0cy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLWlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLCAuLi4pCi17Ci0gIEZ1bmN0aW9uIHRtcChmdW5jdGlvbik7Ci0gIHRtcCgpOwotfQotCi0vKkB9Ki8KLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19IQU5ETEVSX0lOVk9LRV9IT09LX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2hhbmRsZXJfdHlwZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaGFuZGxlcl90eXBlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmNzViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaGFuZGxlcl90eXBlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLwotLy8gaGFuZGxlcl90eXBlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0hBTkRMRVJfVFlQRV9IUFAKLSNkZWZpbmUgQVNJT19IQU5ETEVSX1RZUEVfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBEZWZhdWx0IGhhbmRsZXIgdHlwZSB0cmFpdHMgcHJvdmlkZWQgZm9yIGFsbCBoYW5kbGVycy4KLS8qKgotICogVGhlIGhhbmRsZXJfdHlwZSB0cmFpdHMgY2xhc3MgaXMgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIGNvbmNyZXRlIGhhbmRsZXIKLSAqIHR5cGUgdG8gYmUgdXNlZCBmb3IgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4gSXQgYWxsb3dzIHRoZSBoYW5kbGVyIHR5cGUgdG8KLSAqIGJlIGRldGVybWluZWQgYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBzcGVjaWZpYyBjb21wbGV0aW9uIGhhbmRsZXIgc2lnbmF0dXJlCi0gKiBpcyBrbm93bi4KLSAqCi0gKiBUaGlzIHRlbXBsYXRlIG1heSBiZSBzcGVjaWFsaXNlZCBmb3IgdXNlci1kZWZpbmVkIGhhbmRsZXIgdHlwZXMuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBTaWduYXR1cmU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlCi17Ci0gIC8vLyBUaGUgaGFuZGxlciB0eXBlIGZvciB0aGUgc3BlY2lmaWMgc2lnbmF0dXJlLgotICB0eXBlZGVmIEhhbmRsZXIgdHlwZTsKLX07Ci0KLSNpZiAhZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBTaWduYXR1cmU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPGNvbnN0IEhhbmRsZXIsIFNpZ25hdHVyZT4KLSAgOiBoYW5kbGVyX3R5cGU8SGFuZGxlciwgU2lnbmF0dXJlPiB7fTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIFNpZ25hdHVyZT4KLXN0cnVjdCBoYW5kbGVyX3R5cGU8dm9sYXRpbGUgSGFuZGxlciwgU2lnbmF0dXJlPgotICA6IGhhbmRsZXJfdHlwZTxIYW5kbGVyLCBTaWduYXR1cmU+IHt9OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgU2lnbmF0dXJlPgotc3RydWN0IGhhbmRsZXJfdHlwZTxjb25zdCB2b2xhdGlsZSBIYW5kbGVyLCBTaWduYXR1cmU+Ci0gIDogaGFuZGxlcl90eXBlPEhhbmRsZXIsIFNpZ25hdHVyZT4ge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBTaWduYXR1cmU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPGNvbnN0IEhhbmRsZXImLCBTaWduYXR1cmU+Ci0gIDogaGFuZGxlcl90eXBlPEhhbmRsZXIsIFNpZ25hdHVyZT4ge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBTaWduYXR1cmU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPHZvbGF0aWxlIEhhbmRsZXImLCBTaWduYXR1cmU+Ci0gIDogaGFuZGxlcl90eXBlPEhhbmRsZXIsIFNpZ25hdHVyZT4ge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBTaWduYXR1cmU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPGNvbnN0IHZvbGF0aWxlIEhhbmRsZXImLCBTaWduYXR1cmU+Ci0gIDogaGFuZGxlcl90eXBlPEhhbmRsZXIsIFNpZ25hdHVyZT4ge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBTaWduYXR1cmU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPEhhbmRsZXImLCBTaWduYXR1cmU+Ci0gIDogaGFuZGxlcl90eXBlPEhhbmRsZXIsIFNpZ25hdHVyZT4ge307Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgU2lnbmF0dXJlPgotc3RydWN0IGhhbmRsZXJfdHlwZTxIYW5kbGVyJiYsIFNpZ25hdHVyZT4KLSAgOiBoYW5kbGVyX3R5cGU8SGFuZGxlciwgU2lnbmF0dXJlPiB7fTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXR1cm5UeXBlLCB0eXBlbmFtZSBTaWduYXR1cmU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPFJldHVyblR5cGUoKSwgU2lnbmF0dXJlPgotICA6IGhhbmRsZXJfdHlwZTxSZXR1cm5UeXBlKCopKCksIFNpZ25hdHVyZT4ge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXR1cm5UeXBlLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBTaWduYXR1cmU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPFJldHVyblR5cGUoQXJnMSksIFNpZ25hdHVyZT4KLSAgOiBoYW5kbGVyX3R5cGU8UmV0dXJuVHlwZSgqKShBcmcxKSwgU2lnbmF0dXJlPiB7fTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJldHVyblR5cGUsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIFNpZ25hdHVyZT4KLXN0cnVjdCBoYW5kbGVyX3R5cGU8UmV0dXJuVHlwZShBcmcxLCBBcmcyKSwgU2lnbmF0dXJlPgotICA6IGhhbmRsZXJfdHlwZTxSZXR1cm5UeXBlKCopKEFyZzEsIEFyZzIpLCBTaWduYXR1cmU+IHt9OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUmV0dXJuVHlwZSwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKLSAgICB0eXBlbmFtZSBTaWduYXR1cmU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPFJldHVyblR5cGUoQXJnMSwgQXJnMiwgQXJnMyksIFNpZ25hdHVyZT4KLSAgOiBoYW5kbGVyX3R5cGU8UmV0dXJuVHlwZSgqKShBcmcxLCBBcmcyLCBBcmczKSwgU2lnbmF0dXJlPiB7fTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJldHVyblR5cGUsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCi0gICAgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgU2lnbmF0dXJlPgotc3RydWN0IGhhbmRsZXJfdHlwZTxSZXR1cm5UeXBlKEFyZzEsIEFyZzIsIEFyZzMsIEFyZzQpLCBTaWduYXR1cmU+Ci0gIDogaGFuZGxlcl90eXBlPFJldHVyblR5cGUoKikoQXJnMSwgQXJnMiwgQXJnMywgQXJnNCksIFNpZ25hdHVyZT4ge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXR1cm5UeXBlLCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAotICAgIHR5cGVuYW1lIEFyZzQsIHR5cGVuYW1lIEFyZzUsIHR5cGVuYW1lIFNpZ25hdHVyZT4KLXN0cnVjdCBoYW5kbGVyX3R5cGU8UmV0dXJuVHlwZShBcmcxLCBBcmcyLCBBcmczLCBBcmc0LCBBcmc1KSwgU2lnbmF0dXJlPgotICA6IGhhbmRsZXJfdHlwZTxSZXR1cm5UeXBlKCopKEFyZzEsIEFyZzIsIEFyZzMsIEFyZzQsIEFyZzUpLCBTaWduYXR1cmU+IHt9OwotCi0jZW5kaWYgLy8gIWRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNkZWZpbmUgQVNJT19IQU5ETEVSX1RZUEUoaCwgc2lnKSBcCi0gIHR5cGVuYW1lIGhhbmRsZXJfdHlwZTxoLCBzaWc+Ojp0eXBlCi0KLSNlbmRpZiAvLyBBU0lPX0hBTkRMRVJfVFlQRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9oaWdoX3Jlc29sdXRpb25fdGltZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2hpZ2hfcmVzb2x1dGlvbl90aW1lci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjEzMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2hpZ2hfcmVzb2x1dGlvbl90aW1lci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLwotLy8gaGlnaF9yZXNvbHV0aW9uX3RpbWVyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0hJR0hfUkVTT0xVVElPTl9USU1FUl9IUFAKLSNkZWZpbmUgQVNJT19ISUdIX1JFU09MVVRJT05fVElNRVJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk8pIFwKLSAgfHwgZGVmaW5lZChBU0lPX0hBU19CT09TVF9DSFJPTk8pIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk8pCi0jIGluY2x1ZGUgPGNocm9ubz4KLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ0hST05PKQotIyBpbmNsdWRlIDxib29zdC9jaHJvbm8vc3lzdGVtX2Nsb2Nrcy5ocHA+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFzaW8vYmFzaWNfd2FpdGFibGVfdGltZXIuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLS8vLyBUeXBlZGVmIGZvciBhIHRpbWVyIGJhc2VkIG9uIHRoZSBoaWdoIHJlc29sdXRpb24gY2xvY2suCi0vKioKLSAqIFRoaXMgdHlwZWRlZiB1c2VzIHRoZSBDKysxMSBAYyAmbHQ7Y2hyb25vJmd0OyBzdGFuZGFyZCBsaWJyYXJ5IGZhY2lsaXR5LCBpZgotICogYXZhaWxhYmxlLiBPdGhlcndpc2UsIGl0IG1heSB1c2UgdGhlIEJvb3N0LkNocm9ubyBsaWJyYXJ5LiBUbyBleHBsaWNpdGx5Ci0gKiB1dGlsaXNlIEJvb3N0LkNocm9ubywgdXNlIHRoZSBiYXNpY193YWl0YWJsZV90aW1lciB0ZW1wbGF0ZSBkaXJlY3RseToKLSAqIEBjb2RlCi0gKiB0eXBlZGVmIGJhc2ljX3dhaXRhYmxlX3RpbWVyPGJvb3N0OjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jaz4gdGltZXI7Ci0gKiBAZW5kY29kZQotICovCi10eXBlZGVmIGJhc2ljX3dhaXRhYmxlX3RpbWVyPAotICAgIGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrPgotICBoaWdoX3Jlc29sdXRpb25fdGltZXI7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk8pCi10eXBlZGVmIGJhc2ljX3dhaXRhYmxlX3RpbWVyPAotICAgIHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s+Ci0gIGhpZ2hfcmVzb2x1dGlvbl90aW1lcjsKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ0hST05PKQotdHlwZWRlZiBiYXNpY193YWl0YWJsZV90aW1lcjwKLSAgICBib29zdDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s+Ci0gIGhpZ2hfcmVzb2x1dGlvbl90aW1lcjsKLSNlbmRpZgotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk8pIAotICAgICAgIC8vICAgfHwgZGVmaW5lZChBU0lPX0hBU19CT09TVF9DSFJPTk8pCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2VuZGlmIC8vIEFTSU9fSElHSF9SRVNPTFVUSU9OX1RJTUVSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvYnVmZmVyZWRfcmVhZF9zdHJlYW0uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvYnVmZmVyZWRfcmVhZF9zdHJlYW0uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWJmZDk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL2J1ZmZlcmVkX3JlYWRfc3RyZWFtLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vLwotLy8gaW1wbC9idWZmZXJlZF9yZWFkX3N0cmVhbS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSU1QTF9CVUZGRVJFRF9SRUFEX1NUUkVBTV9IUFAKLSNkZWZpbmUgQVNJT19JTVBMX0JVRkZFUkVEX1JFQURfU1RSRUFNX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfY29udF9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLXN0ZDo6c2l6ZV90IGJ1ZmZlcmVkX3JlYWRfc3RyZWFtPFN0cmVhbT46OmZpbGwoKQotewotICBkZXRhaWw6OmJ1ZmZlcl9yZXNpemVfZ3VhcmQ8ZGV0YWlsOjpidWZmZXJlZF9zdHJlYW1fc3RvcmFnZT4KLSAgICByZXNpemVfZ3VhcmQoc3RvcmFnZV8pOwotICBzdGQ6OnNpemVfdCBwcmV2aW91c19zaXplID0gc3RvcmFnZV8uc2l6ZSgpOwotICBzdG9yYWdlXy5yZXNpemUoc3RvcmFnZV8uY2FwYWNpdHkoKSk7Ci0gIHN0b3JhZ2VfLnJlc2l6ZShwcmV2aW91c19zaXplICsgbmV4dF9sYXllcl8ucmVhZF9zb21lKGJ1ZmZlcigKLSAgICAgICAgICBzdG9yYWdlXy5kYXRhKCkgKyBwcmV2aW91c19zaXplLAotICAgICAgICAgIHN0b3JhZ2VfLnNpemUoKSAtIHByZXZpb3VzX3NpemUpKSk7Ci0gIHJlc2l6ZV9ndWFyZC5jb21taXQoKTsKLSAgcmV0dXJuIHN0b3JhZ2VfLnNpemUoKSAtIHByZXZpb3VzX3NpemU7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0+Ci1zdGQ6OnNpemVfdCBidWZmZXJlZF9yZWFkX3N0cmVhbTxTdHJlYW0+OjpmaWxsKGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBkZXRhaWw6OmJ1ZmZlcl9yZXNpemVfZ3VhcmQ8ZGV0YWlsOjpidWZmZXJlZF9zdHJlYW1fc3RvcmFnZT4KLSAgICByZXNpemVfZ3VhcmQoc3RvcmFnZV8pOwotICBzdGQ6OnNpemVfdCBwcmV2aW91c19zaXplID0gc3RvcmFnZV8uc2l6ZSgpOwotICBzdG9yYWdlXy5yZXNpemUoc3RvcmFnZV8uY2FwYWNpdHkoKSk7Ci0gIHN0b3JhZ2VfLnJlc2l6ZShwcmV2aW91c19zaXplICsgbmV4dF9sYXllcl8ucmVhZF9zb21lKGJ1ZmZlcigKLSAgICAgICAgICBzdG9yYWdlXy5kYXRhKCkgKyBwcmV2aW91c19zaXplLAotICAgICAgICAgIHN0b3JhZ2VfLnNpemUoKSAtIHByZXZpb3VzX3NpemUpLAotICAgICAgICBlYykpOwotICByZXNpemVfZ3VhcmQuY29tbWl0KCk7Ci0gIHJldHVybiBzdG9yYWdlXy5zaXplKCkgLSBwcmV2aW91c19zaXplOwotfQotCi1uYW1lc3BhY2UgZGV0YWlsCi17Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgY2xhc3MgYnVmZmVyZWRfZmlsbF9oYW5kbGVyCi0gIHsKLSAgcHVibGljOgotICAgIGJ1ZmZlcmVkX2ZpbGxfaGFuZGxlcihkZXRhaWw6OmJ1ZmZlcmVkX3N0cmVhbV9zdG9yYWdlJiBzdG9yYWdlLAotICAgICAgICBzdGQ6OnNpemVfdCBwcmV2aW91c19zaXplLCBSZWFkSGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogc3RvcmFnZV8oc3RvcmFnZSksCi0gICAgICAgIHByZXZpb3VzX3NpemVfKHByZXZpb3VzX3NpemUpLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICBidWZmZXJlZF9maWxsX2hhbmRsZXIoY29uc3QgYnVmZmVyZWRfZmlsbF9oYW5kbGVyJiBvdGhlcikKLSAgICAgIDogc3RvcmFnZV8ob3RoZXIuc3RvcmFnZV8pLAotICAgICAgICBwcmV2aW91c19zaXplXyhvdGhlci5wcmV2aW91c19zaXplXyksCi0gICAgICAgIGhhbmRsZXJfKG90aGVyLmhhbmRsZXJfKQotICAgIHsKLSAgICB9Ci0KLSAgICBidWZmZXJlZF9maWxsX2hhbmRsZXIoYnVmZmVyZWRfZmlsbF9oYW5kbGVyJiYgb3RoZXIpCi0gICAgICA6IHN0b3JhZ2VfKG90aGVyLnN0b3JhZ2VfKSwKLSAgICAgICAgcHJldmlvdXNfc2l6ZV8ob3RoZXIucHJldmlvdXNfc2l6ZV8pLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgIHsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCkKLSAgICB7Ci0gICAgICBzdG9yYWdlXy5yZXNpemUocHJldmlvdXNfc2l6ZV8gKyBieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgICBoYW5kbGVyXyhlYywgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIH0KLQotICAvL3ByaXZhdGU6Ci0gICAgZGV0YWlsOjpidWZmZXJlZF9zdHJlYW1fc3RvcmFnZSYgc3RvcmFnZV87Ci0gICAgc3RkOjpzaXplX3QgcHJldmlvdXNfc2l6ZV87Ci0gICAgUmVhZEhhbmRsZXIgaGFuZGxlcl87Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCogYXNpb19oYW5kbGVyX2FsbG9jYXRlKHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgICBidWZmZXJlZF9maWxsX2hhbmRsZXI8UmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUodm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIGJ1ZmZlcmVkX2ZpbGxfaGFuZGxlcjxSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjpkZWFsbG9jYXRlKAotICAgICAgICBwb2ludGVyLCBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIGJvb2wgYXNpb19oYW5kbGVyX2lzX2NvbnRpbnVhdGlvbigKLSAgICAgIGJ1ZmZlcmVkX2ZpbGxfaGFuZGxlcjxSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIHJldHVybiBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oCi0gICAgICAgICAgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIGJ1ZmZlcmVkX2ZpbGxfaGFuZGxlcjxSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIGJ1ZmZlcmVkX2ZpbGxfaGFuZGxlcjxSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotdGVtcGxhdGUgPHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYnVmZmVyZWRfcmVhZF9zdHJlYW08U3RyZWFtPjo6YXN5bmNfZmlsbCgKLSAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotCi0gIHN0ZDo6c2l6ZV90IHByZXZpb3VzX3NpemUgPSBzdG9yYWdlXy5zaXplKCk7Ci0gIHN0b3JhZ2VfLnJlc2l6ZShzdG9yYWdlXy5jYXBhY2l0eSgpKTsKLSAgbmV4dF9sYXllcl8uYXN5bmNfcmVhZF9zb21lKAotICAgICAgYnVmZmVyKAotICAgICAgICBzdG9yYWdlXy5kYXRhKCkgKyBwcmV2aW91c19zaXplLAotICAgICAgICBzdG9yYWdlXy5zaXplKCkgLSBwcmV2aW91c19zaXplKSwKLSAgICAgIGRldGFpbDo6YnVmZmVyZWRfZmlsbF9oYW5kbGVyPEFTSU9fSEFORExFUl9UWVBFKAotICAgICAgICBSZWFkSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKT4oCi0gICAgICAgIHN0b3JhZ2VfLCBwcmV2aW91c19zaXplLCBpbml0LmhhbmRsZXIpKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0+Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotc3RkOjpzaXplX3QgYnVmZmVyZWRfcmVhZF9zdHJlYW08U3RyZWFtPjo6cmVhZF9zb21lKAotICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLXsKLSAgaWYgKGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcnMpID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHN0b3JhZ2VfLmVtcHR5KCkpCi0gICAgdGhpcy0+ZmlsbCgpOwotCi0gIHJldHVybiB0aGlzLT5jb3B5KGJ1ZmZlcnMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLXN0ZDo6c2l6ZV90IGJ1ZmZlcmVkX3JlYWRfc3RyZWFtPFN0cmVhbT46OnJlYWRfc29tZSgKLSAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLQotICBpZiAoYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVycykgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoc3RvcmFnZV8uZW1wdHkoKSAmJiAhdGhpcy0+ZmlsbChlYykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIHRoaXMtPmNvcHkoYnVmZmVycyk7Ci19Ci0KLW5hbWVzcGFjZSBkZXRhaWwKLXsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGNsYXNzIGJ1ZmZlcmVkX3JlYWRfc29tZV9oYW5kbGVyCi0gIHsKLSAgcHVibGljOgotICAgIGJ1ZmZlcmVkX3JlYWRfc29tZV9oYW5kbGVyKGRldGFpbDo6YnVmZmVyZWRfc3RyZWFtX3N0b3JhZ2UmIHN0b3JhZ2UsCi0gICAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgUmVhZEhhbmRsZXImIGhhbmRsZXIpCi0gICAgICA6IHN0b3JhZ2VfKHN0b3JhZ2UpLAotICAgICAgICBidWZmZXJzXyhidWZmZXJzKSwKLSAgICAgICAgaGFuZGxlcl8oaGFuZGxlcikKLSAgICB7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAgICAgYnVmZmVyZWRfcmVhZF9zb21lX2hhbmRsZXIoY29uc3QgYnVmZmVyZWRfcmVhZF9zb21lX2hhbmRsZXImIG90aGVyKQotICAgICAgICA6IHN0b3JhZ2VfKG90aGVyLnN0b3JhZ2VfKSwKLSAgICAgICAgICBidWZmZXJzXyhvdGhlci5idWZmZXJzXyksCi0gICAgICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZmZlcmVkX3JlYWRfc29tZV9oYW5kbGVyKGJ1ZmZlcmVkX3JlYWRfc29tZV9oYW5kbGVyJiYgb3RoZXIpCi0gICAgICAgIDogc3RvcmFnZV8ob3RoZXIuc3RvcmFnZV8pLAotICAgICAgICAgIGJ1ZmZlcnNfKG90aGVyLmJ1ZmZlcnNfKSwKLSAgICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgICAgewotICAgICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywgc3RkOjpzaXplX3QpCi0gICAgewotICAgICAgaWYgKGVjIHx8IHN0b3JhZ2VfLmVtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGxlbmd0aCA9IDA7Ci0gICAgICAgIGhhbmRsZXJfKGVjLCBsZW5ndGgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBieXRlc19jb3BpZWQgPSBhc2lvOjpidWZmZXJfY29weSgKLSAgICAgICAgICAgIGJ1ZmZlcnNfLCBzdG9yYWdlXy5kYXRhKCksIHN0b3JhZ2VfLnNpemUoKSk7Ci0gICAgICAgIHN0b3JhZ2VfLmNvbnN1bWUoYnl0ZXNfY29waWVkKTsKLSAgICAgICAgaGFuZGxlcl8oZWMsIGJ5dGVzX2NvcGllZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBkZXRhaWw6OmJ1ZmZlcmVkX3N0cmVhbV9zdG9yYWdlJiBzdG9yYWdlXzsKLSAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2UgYnVmZmVyc187Ci0gICAgUmVhZEhhbmRsZXIgaGFuZGxlcl87Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIGJ1ZmZlcmVkX3JlYWRfc29tZV9oYW5kbGVyPAotICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUodm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIGJ1ZmZlcmVkX3JlYWRfc29tZV9oYW5kbGVyPAotICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmRlYWxsb2NhdGUoCi0gICAgICAgIHBvaW50ZXIsIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSBib29sIGFzaW9faGFuZGxlcl9pc19jb250aW51YXRpb24oCi0gICAgICBidWZmZXJlZF9yZWFkX3NvbWVfaGFuZGxlcjwKLSAgICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCBSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIHJldHVybiBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oCi0gICAgICAgICAgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICAgIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIGJ1ZmZlcmVkX3JlYWRfc29tZV9oYW5kbGVyPAotICAgICAgICBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgICAgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgYnVmZmVyZWRfcmVhZF9zb21lX2hhbmRsZXI8Ci0gICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYnVmZmVyZWRfcmVhZF9zdHJlYW08U3RyZWFtPjo6YXN5bmNfcmVhZF9zb21lKAotICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotCi0gIGlmIChhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJzKSA9PSAwIHx8ICFzdG9yYWdlXy5lbXB0eSgpKQotICB7Ci0gICAgbmV4dF9sYXllcl8uYXN5bmNfcmVhZF9zb21lKGFzaW86Om11dGFibGVfYnVmZmVyc18xKDAsIDApLAotICAgICAgICBkZXRhaWw6OmJ1ZmZlcmVkX3JlYWRfc29tZV9oYW5kbGVyPAotICAgICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgQVNJT19IQU5ETEVSX1RZUEUoCi0gICAgICAgICAgICBSZWFkSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKT4oCi0gICAgICAgICAgICBzdG9yYWdlXywgYnVmZmVycywgaW5pdC5oYW5kbGVyKSk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgdGhpcy0+YXN5bmNfZmlsbChkZXRhaWw6OmJ1ZmZlcmVkX3JlYWRfc29tZV9oYW5kbGVyPAotICAgICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgQVNJT19IQU5ETEVSX1RZUEUoCi0gICAgICAgICAgICBSZWFkSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKT4oCi0gICAgICAgICAgICBzdG9yYWdlXywgYnVmZmVycywgaW5pdC5oYW5kbGVyKSk7Ci0gIH0KLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0+Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotc3RkOjpzaXplX3QgYnVmZmVyZWRfcmVhZF9zdHJlYW08U3RyZWFtPjo6cGVlaygKLSAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi17Ci0gIGlmIChzdG9yYWdlXy5lbXB0eSgpKQotICAgIHRoaXMtPmZpbGwoKTsKLSAgcmV0dXJuIHRoaXMtPnBlZWtfY29weShidWZmZXJzKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLXRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci1zdGQ6OnNpemVfdCBidWZmZXJlZF9yZWFkX3N0cmVhbTxTdHJlYW0+OjpwZWVrKAotICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICBpZiAoc3RvcmFnZV8uZW1wdHkoKSAmJiAhdGhpcy0+ZmlsbChlYykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiB0aGlzLT5wZWVrX2NvcHkoYnVmZmVycyk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSU1QTF9CVUZGRVJFRF9SRUFEX1NUUkVBTV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL2J1ZmZlcmVkX3dyaXRlX3N0cmVhbS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9idWZmZXJlZF93cml0ZV9zdHJlYW0uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTMwN2NmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL2J1ZmZlcmVkX3dyaXRlX3N0cmVhbS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLy8KLS8vIGltcGwvYnVmZmVyZWRfd3JpdGVfc3RyZWFtLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSU1QTF9CVUZGRVJFRF9XUklURV9TVFJFQU1fSFBQCi0jZGVmaW5lIEFTSU9fSU1QTF9CVUZGRVJFRF9XUklURV9TVFJFQU1fSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9jb250X2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfdHlwZV9yZXF1aXJlbWVudHMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotc3RkOjpzaXplX3QgYnVmZmVyZWRfd3JpdGVfc3RyZWFtPFN0cmVhbT46OmZsdXNoKCkKLXsKLSAgc3RkOjpzaXplX3QgYnl0ZXNfd3JpdHRlbiA9IHdyaXRlKG5leHRfbGF5ZXJfLAotICAgICAgYnVmZmVyKHN0b3JhZ2VfLmRhdGEoKSwgc3RvcmFnZV8uc2l6ZSgpKSk7Ci0gIHN0b3JhZ2VfLmNvbnN1bWUoYnl0ZXNfd3JpdHRlbik7Ci0gIHJldHVybiBieXRlc193cml0dGVuOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotc3RkOjpzaXplX3QgYnVmZmVyZWRfd3JpdGVfc3RyZWFtPFN0cmVhbT46OmZsdXNoKGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBzdGQ6OnNpemVfdCBieXRlc193cml0dGVuID0gd3JpdGUobmV4dF9sYXllcl8sCi0gICAgICBidWZmZXIoc3RvcmFnZV8uZGF0YSgpLCBzdG9yYWdlXy5zaXplKCkpLAotICAgICAgdHJhbnNmZXJfYWxsKCksIGVjKTsKLSAgc3RvcmFnZV8uY29uc3VtZShieXRlc193cml0dGVuKTsKLSAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Ci19Ci0KLW5hbWVzcGFjZSBkZXRhaWwKLXsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgY2xhc3MgYnVmZmVyZWRfZmx1c2hfaGFuZGxlcgotICB7Ci0gIHB1YmxpYzoKLSAgICBidWZmZXJlZF9mbHVzaF9oYW5kbGVyKGRldGFpbDo6YnVmZmVyZWRfc3RyZWFtX3N0b3JhZ2UmIHN0b3JhZ2UsCi0gICAgICAgIFdyaXRlSGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogc3RvcmFnZV8oc3RvcmFnZSksCi0gICAgICAgIGhhbmRsZXJfKGhhbmRsZXIpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICBidWZmZXJlZF9mbHVzaF9oYW5kbGVyKGNvbnN0IGJ1ZmZlcmVkX2ZsdXNoX2hhbmRsZXImIG90aGVyKQotICAgICAgOiBzdG9yYWdlXyhvdGhlci5zdG9yYWdlXyksCi0gICAgICAgIGhhbmRsZXJfKG90aGVyLmhhbmRsZXJfKQotICAgIHsKLSAgICB9Ci0KLSAgICBidWZmZXJlZF9mbHVzaF9oYW5kbGVyKGJ1ZmZlcmVkX2ZsdXNoX2hhbmRsZXImJiBvdGhlcikKLSAgICAgIDogc3RvcmFnZV8ob3RoZXIuc3RvcmFnZV8pLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgYnl0ZXNfd3JpdHRlbikKLSAgICB7Ci0gICAgICBzdG9yYWdlXy5jb25zdW1lKGJ5dGVzX3dyaXR0ZW4pOwotICAgICAgaGFuZGxlcl8oZWMsIGJ5dGVzX3dyaXR0ZW4pOwotICAgIH0KLQotICAvL3ByaXZhdGU6Ci0gICAgZGV0YWlsOjpidWZmZXJlZF9zdHJlYW1fc3RvcmFnZSYgc3RvcmFnZV87Ci0gICAgV3JpdGVIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIGJ1ZmZlcmVkX2ZsdXNoX2hhbmRsZXI8V3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgICAgYnVmZmVyZWRfZmx1c2hfaGFuZGxlcjxXcml0ZUhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6ZGVhbGxvY2F0ZSgKLSAgICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgICAgYnVmZmVyZWRfZmx1c2hfaGFuZGxlcjxXcml0ZUhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKAotICAgICAgICAgIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgYnVmZmVyZWRfZmx1c2hfaGFuZGxlcjxXcml0ZUhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgYnVmZmVyZWRfZmx1c2hfaGFuZGxlcjxXcml0ZUhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0+Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLWJ1ZmZlcmVkX3dyaXRlX3N0cmVhbTxTdHJlYW0+Ojphc3luY19mbHVzaCgKLSAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLXsKLSAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBXcml0ZUhhbmRsZXIuCi0gIEFTSU9fV1JJVEVfSEFORExFUl9DSEVDSyhXcml0ZUhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotCi0gIGFzeW5jX3dyaXRlKG5leHRfbGF5ZXJfLCBidWZmZXIoc3RvcmFnZV8uZGF0YSgpLCBzdG9yYWdlXy5zaXplKCkpLAotICAgICAgZGV0YWlsOjpidWZmZXJlZF9mbHVzaF9oYW5kbGVyPEFTSU9fSEFORExFUl9UWVBFKAotICAgICAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSk+KAotICAgICAgICBzdG9yYWdlXywgaW5pdC5oYW5kbGVyKSk7Ci0KLSAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci1zdGQ6OnNpemVfdCBidWZmZXJlZF93cml0ZV9zdHJlYW08U3RyZWFtPjo6d3JpdGVfc29tZSgKLSAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotewotICBpZiAoYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVycykgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoc3RvcmFnZV8uc2l6ZSgpID09IHN0b3JhZ2VfLmNhcGFjaXR5KCkpCi0gICAgdGhpcy0+Zmx1c2goKTsKLQotICByZXR1cm4gdGhpcy0+Y29weShidWZmZXJzKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotc3RkOjpzaXplX3QgYnVmZmVyZWRfd3JpdGVfc3RyZWFtPFN0cmVhbT46OndyaXRlX3NvbWUoCi0gICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotCi0gIGlmIChhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJzKSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGlmIChzdG9yYWdlXy5zaXplKCkgPT0gc3RvcmFnZV8uY2FwYWNpdHkoKSAmJiAhZmx1c2goZWMpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiB0aGlzLT5jb3B5KGJ1ZmZlcnMpOwotfQotCi1uYW1lc3BhY2UgZGV0YWlsCi17Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGNsYXNzIGJ1ZmZlcmVkX3dyaXRlX3NvbWVfaGFuZGxlcgotICB7Ci0gIHB1YmxpYzoKLSAgICBidWZmZXJlZF93cml0ZV9zb21lX2hhbmRsZXIoZGV0YWlsOjpidWZmZXJlZF9zdHJlYW1fc3RvcmFnZSYgc3RvcmFnZSwKLSAgICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgV3JpdGVIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBzdG9yYWdlXyhzdG9yYWdlKSwKLSAgICAgICAgYnVmZmVyc18oYnVmZmVycyksCi0gICAgICAgIGhhbmRsZXJfKGhhbmRsZXIpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICAgIGJ1ZmZlcmVkX3dyaXRlX3NvbWVfaGFuZGxlcihjb25zdCBidWZmZXJlZF93cml0ZV9zb21lX2hhbmRsZXImIG90aGVyKQotICAgICAgICA6IHN0b3JhZ2VfKG90aGVyLnN0b3JhZ2VfKSwKLSAgICAgICAgICBidWZmZXJzXyhvdGhlci5idWZmZXJzXyksCi0gICAgICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZmZlcmVkX3dyaXRlX3NvbWVfaGFuZGxlcihidWZmZXJlZF93cml0ZV9zb21lX2hhbmRsZXImJiBvdGhlcikKLSAgICAgICAgOiBzdG9yYWdlXyhvdGhlci5zdG9yYWdlXyksCi0gICAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgICAgewotICAgICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywgc3RkOjpzaXplX3QpCi0gICAgewotICAgICAgaWYgKGVjKQotICAgICAgewotICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBsZW5ndGggPSAwOwotICAgICAgICBoYW5kbGVyXyhlYywgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3RkOjpzaXplX3Qgb3JpZ19zaXplID0gc3RvcmFnZV8uc2l6ZSgpOwotICAgICAgICBzdGQ6OnNpemVfdCBzcGFjZV9hdmFpbCA9IHN0b3JhZ2VfLmNhcGFjaXR5KCkgLSBvcmlnX3NpemU7Ci0gICAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX2F2YWlsID0gYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVyc18pOwotICAgICAgICBzdGQ6OnNpemVfdCBsZW5ndGggPSBieXRlc19hdmFpbCA8IHNwYWNlX2F2YWlsCi0gICAgICAgICAgPyBieXRlc19hdmFpbCA6IHNwYWNlX2F2YWlsOwotICAgICAgICBzdG9yYWdlXy5yZXNpemUob3JpZ19zaXplICsgbGVuZ3RoKTsKLSAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgYnl0ZXNfY29waWVkID0gYXNpbzo6YnVmZmVyX2NvcHkoCi0gICAgICAgICAgICBzdG9yYWdlXy5kYXRhKCkgKyBvcmlnX3NpemUsIGJ1ZmZlcnNfLCBsZW5ndGgpOwotICAgICAgICBoYW5kbGVyXyhlYywgYnl0ZXNfY29waWVkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLy9wcml2YXRlOgotICAgIGRldGFpbDo6YnVmZmVyZWRfc3RyZWFtX3N0b3JhZ2UmIHN0b3JhZ2VfOwotICAgIENvbnN0QnVmZmVyU2VxdWVuY2UgYnVmZmVyc187Ci0gICAgV3JpdGVIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIGJ1ZmZlcmVkX3dyaXRlX3NvbWVfaGFuZGxlcjwKLSAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgV3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgICAgYnVmZmVyZWRfd3JpdGVfc29tZV9oYW5kbGVyPAotICAgICAgICBDb25zdEJ1ZmZlclNlcXVlbmNlLCBXcml0ZUhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6ZGVhbGxvY2F0ZSgKLSAgICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgICAgYnVmZmVyZWRfd3JpdGVfc29tZV9oYW5kbGVyPAotICAgICAgICBDb25zdEJ1ZmZlclNlcXVlbmNlLCBXcml0ZUhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKAotICAgICAgICAgIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgICAgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIGJ1ZmZlcmVkX3dyaXRlX3NvbWVfaGFuZGxlcjwKLSAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgV3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICAgIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2ludm9rZShjb25zdCBGdW5jdGlvbiYgZnVuY3Rpb24sCi0gICAgICBidWZmZXJlZF93cml0ZV9zb21lX2hhbmRsZXI8Ci0gICAgICAgIENvbnN0QnVmZmVyU2VxdWVuY2UsIFdyaXRlSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1idWZmZXJlZF93cml0ZV9zdHJlYW08U3RyZWFtPjo6YXN5bmNfd3JpdGVfc29tZSgKLSAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFdyaXRlSGFuZGxlci4KLSAgQVNJT19XUklURV9IQU5ETEVSX0NIRUNLKFdyaXRlSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIFdyaXRlSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgaWYgKGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcnMpID09IDAKLSAgICAgIHx8IHN0b3JhZ2VfLnNpemUoKSA8IHN0b3JhZ2VfLmNhcGFjaXR5KCkpCi0gIHsKLSAgICBuZXh0X2xheWVyXy5hc3luY193cml0ZV9zb21lKGFzaW86OmNvbnN0X2J1ZmZlcnNfMSgwLCAwKSwKLSAgICAgICAgZGV0YWlsOjpidWZmZXJlZF93cml0ZV9zb21lX2hhbmRsZXI8Ci0gICAgICAgICAgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgQVNJT19IQU5ETEVSX1RZUEUoCi0gICAgICAgICAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSk+KAotICAgICAgICAgICAgc3RvcmFnZV8sIGJ1ZmZlcnMsIGluaXQuaGFuZGxlcikpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIHRoaXMtPmFzeW5jX2ZsdXNoKGRldGFpbDo6YnVmZmVyZWRfd3JpdGVfc29tZV9oYW5kbGVyPAotICAgICAgICAgIENvbnN0QnVmZmVyU2VxdWVuY2UsIEFTSU9fSEFORExFUl9UWVBFKAotICAgICAgICAgICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpPigKLSAgICAgICAgICAgIHN0b3JhZ2VfLCBidWZmZXJzLCBpbml0LmhhbmRsZXIpKTsKLSAgfQotCi0gIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotc3RkOjpzaXplX3QgYnVmZmVyZWRfd3JpdGVfc3RyZWFtPFN0cmVhbT46OmNvcHkoCi0gICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLXsKLSAgc3RkOjpzaXplX3Qgb3JpZ19zaXplID0gc3RvcmFnZV8uc2l6ZSgpOwotICBzdGQ6OnNpemVfdCBzcGFjZV9hdmFpbCA9IHN0b3JhZ2VfLmNhcGFjaXR5KCkgLSBvcmlnX3NpemU7Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX2F2YWlsID0gYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVycyk7Ci0gIHN0ZDo6c2l6ZV90IGxlbmd0aCA9IGJ5dGVzX2F2YWlsIDwgc3BhY2VfYXZhaWwgPyBieXRlc19hdmFpbCA6IHNwYWNlX2F2YWlsOwotICBzdG9yYWdlXy5yZXNpemUob3JpZ19zaXplICsgbGVuZ3RoKTsKLSAgcmV0dXJuIGFzaW86OmJ1ZmZlcl9jb3B5KAotICAgICAgc3RvcmFnZV8uZGF0YSgpICsgb3JpZ19zaXplLCBidWZmZXJzLCBsZW5ndGgpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0lNUExfQlVGRkVSRURfV1JJVEVfU1RSRUFNX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvY29ubmVjdC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9jb25uZWN0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjZWM3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9jb25uZWN0LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vLwotLy8gaW1wbC9jb25uZWN0LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lNUExfQ09OTkVDVF9IUFAKLSNkZWZpbmUgQVNJT19JTVBMX0NPTk5FQ1RfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2JpbmRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uc3VtaW5nX2J1ZmZlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9jb250X2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfdHlwZV9yZXF1aXJlbWVudHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotbmFtZXNwYWNlIGRldGFpbAotewotICBzdHJ1Y3QgZGVmYXVsdF9jb25uZWN0X2NvbmRpdGlvbgotICB7Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgotICAgIEl0ZXJhdG9yIG9wZXJhdG9yKCkoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYsIEl0ZXJhdG9yIG5leHQpCi0gICAgewotICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgfQotICB9OwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsIHR5cGVuYW1lIEl0ZXJhdG9yPgotSXRlcmF0b3IgY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLCBJdGVyYXRvciBiZWdpbikKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgSXRlcmF0b3IgcmVzdWx0ID0gY29ubmVjdChzLCBiZWdpbiwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiY29ubmVjdCIpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsIHR5cGVuYW1lIEl0ZXJhdG9yPgotaW5saW5lIEl0ZXJhdG9yIGNvbm5lY3QoYmFzaWNfc29ja2V0PFByb3RvY29sLCBTb2NrZXRTZXJ2aWNlPiYgcywKLSAgICBJdGVyYXRvciBiZWdpbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHJldHVybiBjb25uZWN0KHMsIGJlZ2luLCBJdGVyYXRvcigpLCBkZXRhaWw6OmRlZmF1bHRfY29ubmVjdF9jb25kaXRpb24oKSwgZWMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsIHR5cGVuYW1lIEl0ZXJhdG9yPgotSXRlcmF0b3IgY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIEl0ZXJhdG9yIHJlc3VsdCA9IGNvbm5lY3QocywgYmVnaW4sIGVuZCwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiY29ubmVjdCIpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsIHR5cGVuYW1lIEl0ZXJhdG9yPgotaW5saW5lIEl0ZXJhdG9yIGNvbm5lY3QoYmFzaWNfc29ja2V0PFByb3RvY29sLCBTb2NrZXRTZXJ2aWNlPiYgcywKLSAgICBJdGVyYXRvciBiZWdpbiwgSXRlcmF0b3IgZW5kLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgcmV0dXJuIGNvbm5lY3QocywgYmVnaW4sIGVuZCwgZGV0YWlsOjpkZWZhdWx0X2Nvbm5lY3RfY29uZGl0aW9uKCksIGVjKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLAotICAgIHR5cGVuYW1lIEl0ZXJhdG9yLCB0eXBlbmFtZSBDb25uZWN0Q29uZGl0aW9uPgotSXRlcmF0b3IgY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBDb25uZWN0Q29uZGl0aW9uIGNvbm5lY3RfY29uZGl0aW9uKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBJdGVyYXRvciByZXN1bHQgPSBjb25uZWN0KHMsIGJlZ2luLCBjb25uZWN0X2NvbmRpdGlvbiwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiY29ubmVjdCIpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsCi0gICAgdHlwZW5hbWUgSXRlcmF0b3IsIHR5cGVuYW1lIENvbm5lY3RDb25kaXRpb24+Ci1pbmxpbmUgSXRlcmF0b3IgY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBDb25uZWN0Q29uZGl0aW9uIGNvbm5lY3RfY29uZGl0aW9uLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICByZXR1cm4gY29ubmVjdChzLCBiZWdpbiwgSXRlcmF0b3IoKSwgY29ubmVjdF9jb25kaXRpb24sIGVjKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLAotICAgIHR5cGVuYW1lIEl0ZXJhdG9yLCB0eXBlbmFtZSBDb25uZWN0Q29uZGl0aW9uPgotSXRlcmF0b3IgY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsIENvbm5lY3RDb25kaXRpb24gY29ubmVjdF9jb25kaXRpb24pCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIEl0ZXJhdG9yIHJlc3VsdCA9IGNvbm5lY3QocywgYmVnaW4sIGVuZCwgY29ubmVjdF9jb25kaXRpb24sIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNvbm5lY3QiKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLAotICAgIHR5cGVuYW1lIEl0ZXJhdG9yLCB0eXBlbmFtZSBDb25uZWN0Q29uZGl0aW9uPgotSXRlcmF0b3IgY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsIENvbm5lY3RDb25kaXRpb24gY29ubmVjdF9jb25kaXRpb24sCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotCi0gIGZvciAoSXRlcmF0b3IgaXRlciA9IGJlZ2luOyBpdGVyICE9IGVuZDsgKytpdGVyKQotICB7Ci0gICAgaXRlciA9IGNvbm5lY3RfY29uZGl0aW9uKGVjLCBpdGVyKTsKLSAgICBpZiAoaXRlciAhPSBlbmQpCi0gICAgewotICAgICAgcy5jbG9zZShlYyk7Ci0gICAgICBzLmNvbm5lY3QoKml0ZXIsIGVjKTsKLSAgICAgIGlmICghZWMpCi0gICAgICAgIHJldHVybiBpdGVyOwotICAgIH0KLSAgfQotCi0gIGlmICghZWMpCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6bm90X2ZvdW5kOwotCi0gIHJldHVybiBlbmQ7Ci19Ci0KLW5hbWVzcGFjZSBkZXRhaWwKLXsKLSAgLy8gRW5hYmxlIHRoZSBlbXB0eSBiYXNlIGNsYXNzIG9wdGltaXNhdGlvbiBmb3IgdGhlIGNvbm5lY3QgY29uZGl0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29ubmVjdENvbmRpdGlvbj4KLSAgY2xhc3MgYmFzZV9mcm9tX2Nvbm5lY3RfY29uZGl0aW9uCi0gIHsKLSAgcHJvdGVjdGVkOgotICAgIGV4cGxpY2l0IGJhc2VfZnJvbV9jb25uZWN0X2NvbmRpdGlvbigKLSAgICAgICAgY29uc3QgQ29ubmVjdENvbmRpdGlvbiYgY29ubmVjdF9jb25kaXRpb24pCi0gICAgICA6IGNvbm5lY3RfY29uZGl0aW9uXyhjb25uZWN0X2NvbmRpdGlvbikKLSAgICB7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgotICAgIHZvaWQgY2hlY2tfY29uZGl0aW9uKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBJdGVyYXRvciYgaXRlciwgSXRlcmF0b3ImIGVuZCkKLSAgICB7Ci0gICAgICBpZiAoaXRlciAhPSBlbmQpCi0gICAgICAgIGl0ZXIgPSBjb25uZWN0X2NvbmRpdGlvbl8oZWMsIHN0YXRpY19jYXN0PGNvbnN0IEl0ZXJhdG9yJj4oaXRlcikpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIENvbm5lY3RDb25kaXRpb24gY29ubmVjdF9jb25kaXRpb25fOwotICB9OwotCi0gIC8vIFRoZSBkZWZhdWx0X2Nvbm5lY3RfY29uZGl0aW9uIGltcGxlbWVudGF0aW9uIGlzIGVzc2VudGlhbGx5IGEgbm8tb3AuIFRoaXMKLSAgLy8gdGVtcGxhdGUgc3BlY2lhbGlzYXRpb24gbGV0cyB1cyBlbGltaW5hdGUgYWxsIGNvc3RzIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgdGVtcGxhdGUgPD4KLSAgY2xhc3MgYmFzZV9mcm9tX2Nvbm5lY3RfY29uZGl0aW9uPGRlZmF1bHRfY29ubmVjdF9jb25kaXRpb24+Ci0gIHsKLSAgcHJvdGVjdGVkOgotICAgIGV4cGxpY2l0IGJhc2VfZnJvbV9jb25uZWN0X2NvbmRpdGlvbihjb25zdCBkZWZhdWx0X2Nvbm5lY3RfY29uZGl0aW9uJikKLSAgICB7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgotICAgIHZvaWQgY2hlY2tfY29uZGl0aW9uKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmLCBJdGVyYXRvciYsIEl0ZXJhdG9yJikKLSAgICB7Ci0gICAgfQotICB9OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgU29ja2V0U2VydmljZSwgdHlwZW5hbWUgSXRlcmF0b3IsCi0gICAgICB0eXBlbmFtZSBDb25uZWN0Q29uZGl0aW9uLCB0eXBlbmFtZSBDb21wb3NlZENvbm5lY3RIYW5kbGVyPgotICBjbGFzcyBjb25uZWN0X29wIDogYmFzZV9mcm9tX2Nvbm5lY3RfY29uZGl0aW9uPENvbm5lY3RDb25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIGNvbm5lY3Rfb3AoYmFzaWNfc29ja2V0PFByb3RvY29sLCBTb2NrZXRTZXJ2aWNlPiYgc29jaywKLSAgICAgICAgY29uc3QgSXRlcmF0b3ImIGJlZ2luLCBjb25zdCBJdGVyYXRvciYgZW5kLAotICAgICAgICBjb25zdCBDb25uZWN0Q29uZGl0aW9uJiBjb25uZWN0X2NvbmRpdGlvbiwKLSAgICAgICAgQ29tcG9zZWRDb25uZWN0SGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogYmFzZV9mcm9tX2Nvbm5lY3RfY29uZGl0aW9uPENvbm5lY3RDb25kaXRpb24+KGNvbm5lY3RfY29uZGl0aW9uKSwKLSAgICAgICAgc29ja2V0Xyhzb2NrKSwKLSAgICAgICAgaXRlcl8oYmVnaW4pLAotICAgICAgICBlbmRfKGVuZCksCi0gICAgICAgIHN0YXJ0XygwKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoQ29tcG9zZWRDb25uZWN0SGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICBjb25uZWN0X29wKGNvbnN0IGNvbm5lY3Rfb3AmIG90aGVyKQotICAgICAgOiBiYXNlX2Zyb21fY29ubmVjdF9jb25kaXRpb248Q29ubmVjdENvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBzb2NrZXRfKG90aGVyLnNvY2tldF8pLAotICAgICAgICBpdGVyXyhvdGhlci5pdGVyXyksCi0gICAgICAgIGVuZF8ob3RoZXIuZW5kXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgY29ubmVjdF9vcChjb25uZWN0X29wJiYgb3RoZXIpCi0gICAgICA6IGJhc2VfZnJvbV9jb25uZWN0X2NvbmRpdGlvbjxDb25uZWN0Q29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIHNvY2tldF8ob3RoZXIuc29ja2V0XyksCi0gICAgICAgIGl0ZXJfKG90aGVyLml0ZXJfKSwKLSAgICAgICAgZW5kXyhvdGhlci5lbmRfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShhc2lvOjplcnJvcl9jb2RlIGVjLCBpbnQgc3RhcnQgPSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3RhcnRfID0gc3RhcnQpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIHRoaXMtPmNoZWNrX2NvbmRpdGlvbihlYywgaXRlcl8sIGVuZF8pOwotCi0gICAgICAgICAgaWYgKGl0ZXJfICE9IGVuZF8pCi0gICAgICAgICAgewotICAgICAgICAgICAgc29ja2V0Xy5jbG9zZShlYyk7Ci0gICAgICAgICAgICBzb2NrZXRfLmFzeW5jX2Nvbm5lY3QoKml0ZXJfLAotICAgICAgICAgICAgICAgIEFTSU9fTU9WRV9DQVNUKGNvbm5lY3Rfb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHN0YXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVjID0gYXNpbzo6ZXJyb3I6Om5vdF9mb3VuZDsKLSAgICAgICAgICAgIHNvY2tldF8uZ2V0X2lvX3NlcnZpY2UoKS5wb3N0KGRldGFpbDo6YmluZF9oYW5kbGVyKCp0aGlzLCBlYykpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGRlZmF1bHQ6Ci0KLSAgICAgICAgICBpZiAoaXRlcl8gPT0gZW5kXykKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgaWYgKCFzb2NrZXRfLmlzX29wZW4oKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlYyA9IGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICghZWMpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICsraXRlcl87Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyXyhzdGF0aWNfY2FzdDxjb25zdCBhc2lvOjplcnJvcl9jb2RlJj4oZWMpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgSXRlcmF0b3ImPihpdGVyXykpOwotICAgICAgfQotICAgIH0KLQotICAvL3ByaXZhdGU6Ci0gICAgYmFzaWNfc29ja2V0PFByb3RvY29sLCBTb2NrZXRTZXJ2aWNlPiYgc29ja2V0XzsKLSAgICBJdGVyYXRvciBpdGVyXzsKLSAgICBJdGVyYXRvciBlbmRfOwotICAgIGludCBzdGFydF87Ci0gICAgQ29tcG9zZWRDb25uZWN0SGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsIHR5cGVuYW1lIEl0ZXJhdG9yLAotICAgICAgdHlwZW5hbWUgQ29ubmVjdENvbmRpdGlvbiwgdHlwZW5hbWUgQ29tcG9zZWRDb25uZWN0SGFuZGxlcj4KLSAgaW5saW5lIHZvaWQqIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzdGQ6OnNpemVfdCBzaXplLAotICAgICAgY29ubmVjdF9vcDxQcm90b2NvbCwgU29ja2V0U2VydmljZSwgSXRlcmF0b3IsCi0gICAgICAgIENvbm5lY3RDb25kaXRpb24sIENvbXBvc2VkQ29ubmVjdEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgU29ja2V0U2VydmljZSwgdHlwZW5hbWUgSXRlcmF0b3IsCi0gICAgICB0eXBlbmFtZSBDb25uZWN0Q29uZGl0aW9uLCB0eXBlbmFtZSBDb21wb3NlZENvbm5lY3RIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgICAgY29ubmVjdF9vcDxQcm90b2NvbCwgU29ja2V0U2VydmljZSwgSXRlcmF0b3IsCi0gICAgICAgIENvbm5lY3RDb25kaXRpb24sIENvbXBvc2VkQ29ubmVjdEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6ZGVhbGxvY2F0ZSgKLSAgICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UsIHR5cGVuYW1lIEl0ZXJhdG9yLAotICAgICAgdHlwZW5hbWUgQ29ubmVjdENvbmRpdGlvbiwgdHlwZW5hbWUgQ29tcG9zZWRDb25uZWN0SGFuZGxlcj4KLSAgaW5saW5lIGJvb2wgYXNpb19oYW5kbGVyX2lzX2NvbnRpbnVhdGlvbigKLSAgICAgIGNvbm5lY3Rfb3A8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2UsIEl0ZXJhdG9yLAotICAgICAgICBDb25uZWN0Q29uZGl0aW9uLCBDb21wb3NlZENvbm5lY3RIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbigKLSAgICAgICAgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIFByb3RvY29sLAotICAgICAgdHlwZW5hbWUgU29ja2V0U2VydmljZSwgdHlwZW5hbWUgSXRlcmF0b3IsCi0gICAgICB0eXBlbmFtZSBDb25uZWN0Q29uZGl0aW9uLCB0eXBlbmFtZSBDb21wb3NlZENvbm5lY3RIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIGNvbm5lY3Rfb3A8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2UsIEl0ZXJhdG9yLAotICAgICAgICBDb25uZWN0Q29uZGl0aW9uLCBDb21wb3NlZENvbm5lY3RIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgUHJvdG9jb2wsCi0gICAgICB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLCB0eXBlbmFtZSBJdGVyYXRvciwKLSAgICAgIHR5cGVuYW1lIENvbm5lY3RDb25kaXRpb24sIHR5cGVuYW1lIENvbXBvc2VkQ29ubmVjdEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgY29ubmVjdF9vcDxQcm90b2NvbCwgU29ja2V0U2VydmljZSwgSXRlcmF0b3IsCi0gICAgICAgIENvbm5lY3RDb25kaXRpb24sIENvbXBvc2VkQ29ubmVjdEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLAotICAgIHR5cGVuYW1lIEl0ZXJhdG9yLCB0eXBlbmFtZSBDb21wb3NlZENvbm5lY3RIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgSXRlcmF0b3IpKQotYXN5bmNfY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBBU0lPX01PVkVfQVJHKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIpIGhhbmRsZXIpCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgQ29tcG9zZWRDb25uZWN0SGFuZGxlci4KLSAgQVNJT19DT01QT1NFRF9DT05ORUNUX0hBTkRMRVJfQ0hFQ0soCi0gICAgICBDb21wb3NlZENvbm5lY3RIYW5kbGVyLCBoYW5kbGVyLCBJdGVyYXRvcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PENvbXBvc2VkQ29ubmVjdEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgSXRlcmF0b3IpPiBpbml0KAotICAgICAgQVNJT19NT1ZFX0NBU1QoQ29tcG9zZWRDb25uZWN0SGFuZGxlcikoaGFuZGxlcikpOwotCi0gIGRldGFpbDo6Y29ubmVjdF9vcDxQcm90b2NvbCwgU29ja2V0U2VydmljZSwgSXRlcmF0b3IsCi0gICAgZGV0YWlsOjpkZWZhdWx0X2Nvbm5lY3RfY29uZGl0aW9uLCBBU0lPX0hBTkRMRVJfVFlQRSgKLSAgICAgIENvbXBvc2VkQ29ubmVjdEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIEl0ZXJhdG9yKSk+KHMsCi0gICAgICAgIGJlZ2luLCBJdGVyYXRvcigpLCBkZXRhaWw6OmRlZmF1bHRfY29ubmVjdF9jb25kaXRpb24oKSwgaW5pdC5oYW5kbGVyKSgKLSAgICAgICAgICBhc2lvOjplcnJvcl9jb2RlKCksIDEpOwotCi0gIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLAotICAgIHR5cGVuYW1lIEl0ZXJhdG9yLCB0eXBlbmFtZSBDb21wb3NlZENvbm5lY3RIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgSXRlcmF0b3IpKQotYXN5bmNfY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsCi0gICAgQVNJT19NT1ZFX0FSRyhDb21wb3NlZENvbm5lY3RIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIENvbXBvc2VkQ29ubmVjdEhhbmRsZXIuCi0gIEFTSU9fQ09NUE9TRURfQ09OTkVDVF9IQU5ETEVSX0NIRUNLKAotICAgICAgQ29tcG9zZWRDb25uZWN0SGFuZGxlciwgaGFuZGxlciwgSXRlcmF0b3IpIHR5cGVfY2hlY2s7Ci0KLSAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDxDb21wb3NlZENvbm5lY3RIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIEl0ZXJhdG9yKT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICBkZXRhaWw6OmNvbm5lY3Rfb3A8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2UsIEl0ZXJhdG9yLAotICAgIGRldGFpbDo6ZGVmYXVsdF9jb25uZWN0X2NvbmRpdGlvbiwgQVNJT19IQU5ETEVSX1RZUEUoCi0gICAgICBDb21wb3NlZENvbm5lY3RIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBJdGVyYXRvcikpPihzLAotICAgICAgICBiZWdpbiwgZW5kLCBkZXRhaWw6OmRlZmF1bHRfY29ubmVjdF9jb25kaXRpb24oKSwgaW5pdC5oYW5kbGVyKSgKLSAgICAgICAgICBhc2lvOjplcnJvcl9jb2RlKCksIDEpOwotCi0gIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLCB0eXBlbmFtZSBJdGVyYXRvciwKLSAgICB0eXBlbmFtZSBDb25uZWN0Q29uZGl0aW9uLCB0eXBlbmFtZSBDb21wb3NlZENvbm5lY3RIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgSXRlcmF0b3IpKQotYXN5bmNfY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBDb25uZWN0Q29uZGl0aW9uIGNvbm5lY3RfY29uZGl0aW9uLAotICAgIEFTSU9fTU9WRV9BUkcoQ29tcG9zZWRDb25uZWN0SGFuZGxlcikgaGFuZGxlcikKLXsKLSAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBDb21wb3NlZENvbm5lY3RIYW5kbGVyLgotICBBU0lPX0NPTVBPU0VEX0NPTk5FQ1RfSEFORExFUl9DSEVDSygKLSAgICAgIENvbXBvc2VkQ29ubmVjdEhhbmRsZXIsIGhhbmRsZXIsIEl0ZXJhdG9yKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Q29tcG9zZWRDb25uZWN0SGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBJdGVyYXRvcik+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChDb21wb3NlZENvbm5lY3RIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgZGV0YWlsOjpjb25uZWN0X29wPFByb3RvY29sLCBTb2NrZXRTZXJ2aWNlLCBJdGVyYXRvciwKLSAgICBDb25uZWN0Q29uZGl0aW9uLCBBU0lPX0hBTkRMRVJfVFlQRSgKLSAgICAgIENvbXBvc2VkQ29ubmVjdEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIEl0ZXJhdG9yKSk+KHMsCi0gICAgICAgIGJlZ2luLCBJdGVyYXRvcigpLCBjb25uZWN0X2NvbmRpdGlvbiwgaW5pdC5oYW5kbGVyKSgKLSAgICAgICAgICBhc2lvOjplcnJvcl9jb2RlKCksIDEpOwotCi0gIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLCB0eXBlbmFtZSBJdGVyYXRvciwKLSAgICB0eXBlbmFtZSBDb25uZWN0Q29uZGl0aW9uLCB0eXBlbmFtZSBDb21wb3NlZENvbm5lY3RIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgSXRlcmF0b3IpKQotYXN5bmNfY29ubmVjdChiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2U+JiBzLAotICAgIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQsIENvbm5lY3RDb25kaXRpb24gY29ubmVjdF9jb25kaXRpb24sCi0gICAgQVNJT19NT1ZFX0FSRyhDb21wb3NlZENvbm5lY3RIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIENvbXBvc2VkQ29ubmVjdEhhbmRsZXIuCi0gIEFTSU9fQ09NUE9TRURfQ09OTkVDVF9IQU5ETEVSX0NIRUNLKAotICAgICAgQ29tcG9zZWRDb25uZWN0SGFuZGxlciwgaGFuZGxlciwgSXRlcmF0b3IpIHR5cGVfY2hlY2s7Ci0KLSAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDxDb21wb3NlZENvbm5lY3RIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIEl0ZXJhdG9yKT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKENvbXBvc2VkQ29ubmVjdEhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICBkZXRhaWw6OmNvbm5lY3Rfb3A8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2UsIEl0ZXJhdG9yLAotICAgIENvbm5lY3RDb25kaXRpb24sIEFTSU9fSEFORExFUl9UWVBFKAotICAgICAgQ29tcG9zZWRDb25uZWN0SGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgSXRlcmF0b3IpKT4ocywKLSAgICAgICAgYmVnaW4sIGVuZCwgY29ubmVjdF9jb25kaXRpb24sIGluaXQuaGFuZGxlcikoCi0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAxKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSU1QTF9DT05ORUNUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvZXJyb3IuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvZXJyb3IuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzU5ZDBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL2Vycm9yLmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLwotLy8gaW1wbC9lcnJvci5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSU1QTF9FUlJPUl9JUFAKLSNkZWZpbmUgQVNJT19JTVBMX0VSUk9SX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBlcnJvciB7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBuZXRkYl9jYXRlZ29yeSA6IHB1YmxpYyBhc2lvOjplcnJvcl9jYXRlZ29yeQotewotcHVibGljOgotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgQVNJT19FUlJPUl9DQVRFR09SWV9OT0VYQ0VQVAotICB7Ci0gICAgcmV0dXJuICJhc2lvLm5ldGRiIjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIG1lc3NhZ2UoaW50IHZhbHVlKSBjb25zdAotICB7Ci0gICAgaWYgKHZhbHVlID09IGVycm9yOjpob3N0X25vdF9mb3VuZCkKLSAgICAgIHJldHVybiAiSG9zdCBub3QgZm91bmQgKGF1dGhvcml0YXRpdmUpIjsKLSAgICBpZiAodmFsdWUgPT0gZXJyb3I6Omhvc3Rfbm90X2ZvdW5kX3RyeV9hZ2FpbikKLSAgICAgIHJldHVybiAiSG9zdCBub3QgZm91bmQgKG5vbi1hdXRob3JpdGF0aXZlKSwgdHJ5IGFnYWluIGxhdGVyIjsKLSAgICBpZiAodmFsdWUgPT0gZXJyb3I6Om5vX2RhdGEpCi0gICAgICByZXR1cm4gIlRoZSBxdWVyeSBpcyB2YWxpZCwgYnV0IGl0IGRvZXMgbm90IGhhdmUgYXNzb2NpYXRlZCBkYXRhIjsKLSAgICBpZiAodmFsdWUgPT0gZXJyb3I6Om5vX3JlY292ZXJ5KQotICAgICAgcmV0dXJuICJBIG5vbi1yZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgZGF0YWJhc2UgbG9va3VwIjsKLSAgICByZXR1cm4gImFzaW8ubmV0ZGIgZXJyb3IiOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotY29uc3QgYXNpbzo6ZXJyb3JfY2F0ZWdvcnkmIGdldF9uZXRkYl9jYXRlZ29yeSgpCi17Ci0gIHN0YXRpYyBkZXRhaWw6Om5ldGRiX2NhdGVnb3J5IGluc3RhbmNlOwotICByZXR1cm4gaW5zdGFuY2U7Ci19Ci0KLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBhZGRyaW5mb19jYXRlZ29yeSA6IHB1YmxpYyBhc2lvOjplcnJvcl9jYXRlZ29yeQotewotcHVibGljOgotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgQVNJT19FUlJPUl9DQVRFR09SWV9OT0VYQ0VQVAotICB7Ci0gICAgcmV0dXJuICJhc2lvLmFkZHJpbmZvIjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIG1lc3NhZ2UoaW50IHZhbHVlKSBjb25zdAotICB7Ci0gICAgaWYgKHZhbHVlID09IGVycm9yOjpzZXJ2aWNlX25vdF9mb3VuZCkKLSAgICAgIHJldHVybiAiU2VydmljZSBub3QgZm91bmQiOwotICAgIGlmICh2YWx1ZSA9PSBlcnJvcjo6c29ja2V0X3R5cGVfbm90X3N1cHBvcnRlZCkKLSAgICAgIHJldHVybiAiU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZCI7Ci0gICAgcmV0dXJuICJhc2lvLmFkZHJpbmZvIGVycm9yIjsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLWNvbnN0IGFzaW86OmVycm9yX2NhdGVnb3J5JiBnZXRfYWRkcmluZm9fY2F0ZWdvcnkoKQotewotICBzdGF0aWMgZGV0YWlsOjphZGRyaW5mb19jYXRlZ29yeSBpbnN0YW5jZTsKLSAgcmV0dXJuIGluc3RhbmNlOwotfQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3MgbWlzY19jYXRlZ29yeSA6IHB1YmxpYyBhc2lvOjplcnJvcl9jYXRlZ29yeQotewotcHVibGljOgotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgQVNJT19FUlJPUl9DQVRFR09SWV9OT0VYQ0VQVAotICB7Ci0gICAgcmV0dXJuICJhc2lvLm1pc2MiOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgbWVzc2FnZShpbnQgdmFsdWUpIGNvbnN0Ci0gIHsKLSAgICBpZiAodmFsdWUgPT0gZXJyb3I6OmFscmVhZHlfb3BlbikKLSAgICAgIHJldHVybiAiQWxyZWFkeSBvcGVuIjsKLSAgICBpZiAodmFsdWUgPT0gZXJyb3I6OmVvZikKLSAgICAgIHJldHVybiAiRW5kIG9mIGZpbGUiOwotICAgIGlmICh2YWx1ZSA9PSBlcnJvcjo6bm90X2ZvdW5kKQotICAgICAgcmV0dXJuICJFbGVtZW50IG5vdCBmb3VuZCI7Ci0gICAgaWYgKHZhbHVlID09IGVycm9yOjpmZF9zZXRfZmFpbHVyZSkKLSAgICAgIHJldHVybiAiVGhlIGRlc2NyaXB0b3IgZG9lcyBub3QgZml0IGludG8gdGhlIHNlbGVjdCBjYWxsJ3MgZmRfc2V0IjsKLSAgICByZXR1cm4gImFzaW8ubWlzYyBlcnJvciI7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi1jb25zdCBhc2lvOjplcnJvcl9jYXRlZ29yeSYgZ2V0X21pc2NfY2F0ZWdvcnkoKQotewotICBzdGF0aWMgZGV0YWlsOjptaXNjX2NhdGVnb3J5IGluc3RhbmNlOwotICByZXR1cm4gaW5zdGFuY2U7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGVycm9yCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0lNUExfRVJST1JfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9lcnJvcl9jb2RlLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL2Vycm9yX2NvZGUuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2I3MGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL2Vycm9yX2NvZGUuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vCi0vLyBpbXBsL2Vycm9yX2NvZGUuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSU1QTF9FUlJPUl9DT0RFX0lQUAotI2RlZmluZSBBU0lPX0lNUExfRVJST1JfQ09ERV9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotIyBpbmNsdWRlIDx3aW5lcnJvci5oPgotI2VsaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSMgaW5jbHVkZSA8d2luZG93cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8Y2Vycm5vPgotIyBpbmNsdWRlIDxjc3RyaW5nPgotIyBpbmNsdWRlIDxzdHJpbmc+Ci0jZW5kaWYKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9sb2NhbF9mcmVlX29uX2Jsb2NrX2V4aXQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvcl9jb2RlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBzeXN0ZW1fY2F0ZWdvcnkgOiBwdWJsaWMgZXJyb3JfY2F0ZWdvcnkKLXsKLXB1YmxpYzoKLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IEFTSU9fRVJST1JfQ0FURUdPUllfTk9FWENFUFQKLSAgewotICAgIHJldHVybiAiYXNpby5zeXN0ZW0iOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgbWVzc2FnZShpbnQgdmFsdWUpIGNvbnN0Ci0gIHsKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICAgIGNoYXIqIG1zZyA9IDA7Ci0gICAgRFdPUkQgbGVuZ3RoID0gOjpGb3JtYXRNZXNzYWdlQShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIKLSAgICAgICAgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTQotICAgICAgICB8IEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLCAwLCB2YWx1ZSwKLSAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksIChjaGFyKikmbXNnLCAwLCAwKTsKLSAgICBkZXRhaWw6OmxvY2FsX2ZyZWVfb25fYmxvY2tfZXhpdCBsb2NhbF9mcmVlX29iaihtc2cpOwotICAgIGlmIChsZW5ndGggJiYgbXNnW2xlbmd0aCAtIDFdID09ICdcbicpCi0gICAgICBtc2dbLS1sZW5ndGhdID0gJ1wwJzsKLSAgICBpZiAobGVuZ3RoICYmIG1zZ1tsZW5ndGggLSAxXSA9PSAnXHInKQotICAgICAgbXNnWy0tbGVuZ3RoXSA9ICdcMCc7Ci0gICAgaWYgKGxlbmd0aCkKLSAgICAgIHJldHVybiBtc2c7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICJhc2lvLnN5c3RlbSBlcnJvciI7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAgIHN0ZDo6d3N0cmluZyB3bXNnKDEyOCwgd2NoYXJfdCgpKTsKLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIERXT1JEIHdsZW5ndGggPSA6OkZvcm1hdE1lc3NhZ2VXKEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNCi0gICAgICAgICAgfCBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywgMCwgdmFsdWUsCi0gICAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksICZ3bXNnWzBdLCB3bXNnLnNpemUoKSwgMCk7Ci0gICAgICBpZiAod2xlbmd0aCA9PSAwICYmIDo6R2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKLSAgICAgIHsKLSAgICAgICAgd21zZy5yZXNpemUod21zZy5zaXplKCkgKyB3bXNnLnNpemUoKSAvIDIpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmICh3bGVuZ3RoICYmIHdtc2dbd2xlbmd0aCAtIDFdID09ICdcbicpCi0gICAgICAgIC0td2xlbmd0aDsKLSAgICAgIGlmICh3bGVuZ3RoICYmIHdtc2dbd2xlbmd0aCAtIDFdID09ICdccicpCi0gICAgICAgIC0td2xlbmd0aDsKLSAgICAgIGlmICh3bGVuZ3RoKQotICAgICAgewotICAgICAgICBzdGQ6OnN0cmluZyBtc2cod2xlbmd0aCAqIDIsIGNoYXIoKSk7Ci0gICAgICAgIGludCBsZW5ndGggPSA6OldpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLAotICAgICAgICAgICAgd21zZy5jX3N0cigpLCBzdGF0aWNfY2FzdDxpbnQ+KHdsZW5ndGgpLAotICAgICAgICAgICAgJm1zZ1swXSwgc3RhdGljX2Nhc3Q8aW50Pih3bGVuZ3RoICogMiksIDAsIDApOwotICAgICAgICBpZiAobGVuZ3RoIDw9IDApCi0gICAgICAgICAgcmV0dXJuICJhc2lvLnN5c3RlbSBlcnJvciI7Ci0gICAgICAgIG1zZy5yZXNpemUoc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KGxlbmd0aCkpOwotICAgICAgICByZXR1cm4gbXNnOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gImFzaW8uc3lzdGVtIGVycm9yIjsKLSAgICB9Ci0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykKLSNpZiAhZGVmaW5lZChfX3N1bikKLSAgICBpZiAodmFsdWUgPT0gRUNBTkNFTEVEKQotICAgICAgcmV0dXJuICJPcGVyYXRpb24gYWJvcnRlZC4iOwotI2VuZGlmIC8vICFkZWZpbmVkKF9fc3VuKQotI2lmIGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChfX1NZTUJJQU4zMl9fKQotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gICAgcmV0dXJuIHN0cmVycm9yKHZhbHVlKTsKLSNlbGlmIGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKSBcCi0gIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgXAotICB8fCBkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoX19ocHV4KSB8fCBkZWZpbmVkKF9fb3NmX18pIFwKLSAgfHwgZGVmaW5lZChfX0FORFJPSURfXykKLSAgICBjaGFyIGJ1ZlsyNTZdID0gIiI7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLSAgICBzdHJlcnJvcl9yKHZhbHVlLCBidWYsIHNpemVvZihidWYpKTsKLSAgICByZXR1cm4gYnVmOwotI2Vsc2UKLSAgICBjaGFyIGJ1ZlsyNTZdID0gIiI7Ci0gICAgcmV0dXJuIHN0cmVycm9yX3IodmFsdWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotI2VuZGlmCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1MpCi0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi1jb25zdCBlcnJvcl9jYXRlZ29yeSYgc3lzdGVtX2NhdGVnb3J5KCkKLXsKLSAgc3RhdGljIGRldGFpbDo6c3lzdGVtX2NhdGVnb3J5IGluc3RhbmNlOwotICByZXR1cm4gaW5zdGFuY2U7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSU1QTF9FUlJPUl9DT0RFX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvaGFuZGxlcl9hbGxvY19ob29rLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL2hhbmRsZXJfYWxsb2NfaG9vay5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZmY3OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvaGFuZGxlcl9hbGxvY19ob29rLmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vCi0vLyBpbXBsL2hhbmRsZXJfYWxsb2NfaG9vay5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lNUExfSEFORExFUl9BTExPQ19IT09LX0lQUAotI2RlZmluZSBBU0lPX0lNUExfSEFORExFUl9BTExPQ19IT09LX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NhbGxfc3RhY2suaHBwIgotI2luY2x1ZGUgImFzaW8vaGFuZGxlcl9hbGxvY19ob29rLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TTUFMTF9CTE9DS19SRUNZQ0xJTkcpCi0jIGlmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSMgIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX3RocmVhZF9pbmZvLmhwcCIKLSMgZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jICBpbmNsdWRlICJhc2lvL2RldGFpbC90YXNrX2lvX3NlcnZpY2VfdGhyZWFkX2luZm8uaHBwIgotIyBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX1NNQUxMX0JMT0NLX1JFQ1lDTElORykKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLW5hbWVzcGFjZSBkZXRhaWwgeyBjbGFzcyB3aW5faW9jcF9pb19zZXJ2aWNlOyB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotCi12b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwgLi4uKQotewotI2lmICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TTUFMTF9CTE9DS19SRUNZQ0xJTkcpCi0jIGlmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSAgdHlwZWRlZiBkZXRhaWw6Ondpbl9pb2NwX2lvX3NlcnZpY2UgaW9fc2VydmljZV9pbXBsOwotICB0eXBlZGVmIGRldGFpbDo6d2luX2lvY3BfdGhyZWFkX2luZm8gdGhyZWFkX2luZm87Ci0jIGVsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotICB0eXBlZGVmIGRldGFpbDo6dGFza19pb19zZXJ2aWNlIGlvX3NlcnZpY2VfaW1wbDsKLSAgdHlwZWRlZiBkZXRhaWw6OnRhc2tfaW9fc2VydmljZV90aHJlYWRfaW5mbyB0aHJlYWRfaW5mbzsKLSMgZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19JT0NQKQotICB0eXBlZGVmIGRldGFpbDo6Y2FsbF9zdGFjazxpb19zZXJ2aWNlX2ltcGwsIHRocmVhZF9pbmZvPiBjYWxsX3N0YWNrOwotICByZXR1cm4gdGhyZWFkX2luZm86OmFsbG9jYXRlKGNhbGxfc3RhY2s6OnRvcCgpLCBzaXplKTsKLSNlbHNlIC8vICFkZWZpbmVkKEFTSU9fRElTQUJMRV9TTUFMTF9CTE9DS19SRUNZQ0xJTkcpCi0gIHJldHVybiA6Om9wZXJhdG9yIG5ldyhzaXplKTsKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0RJU0FCTEVfU01BTExfQkxPQ0tfUkVDWUNMSU5HKQotfQotCi12b2lkIGFzaW9faGFuZGxlcl9kZWFsbG9jYXRlKHZvaWQqIHBvaW50ZXIsIHN0ZDo6c2l6ZV90IHNpemUsIC4uLikKLXsKLSNpZiAhZGVmaW5lZChBU0lPX0RJU0FCTEVfU01BTExfQkxPQ0tfUkVDWUNMSU5HKQotIyBpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gIHR5cGVkZWYgZGV0YWlsOjp3aW5faW9jcF9pb19zZXJ2aWNlIGlvX3NlcnZpY2VfaW1wbDsKLSAgdHlwZWRlZiBkZXRhaWw6Ondpbl9pb2NwX3RocmVhZF9pbmZvIHRocmVhZF9pbmZvOwotIyBlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSAgdHlwZWRlZiBkZXRhaWw6OnRhc2tfaW9fc2VydmljZSBpb19zZXJ2aWNlX2ltcGw7Ci0gIHR5cGVkZWYgZGV0YWlsOjp0YXNrX2lvX3NlcnZpY2VfdGhyZWFkX2luZm8gdGhyZWFkX2luZm87Ci0jIGVuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSAgdHlwZWRlZiBkZXRhaWw6OmNhbGxfc3RhY2s8aW9fc2VydmljZV9pbXBsLCB0aHJlYWRfaW5mbz4gY2FsbF9zdGFjazsKLSAgdGhyZWFkX2luZm86OmRlYWxsb2NhdGUoY2FsbF9zdGFjazo6dG9wKCksIHBvaW50ZXIsIHNpemUpOwotI2Vsc2UgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX1NNQUxMX0JMT0NLX1JFQ1lDTElORykKLSAgKHZvaWQpc2l6ZTsKLSAgOjpvcGVyYXRvciBkZWxldGUocG9pbnRlcik7Ci0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19ESVNBQkxFX1NNQUxMX0JMT0NLX1JFQ1lDTElORykKLX0KLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19JTVBMX0hBTkRMRVJfQUxMT0NfSE9PS19JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL2lvX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvaW9fc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMGY1NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvaW9fc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8KLS8vIGltcGwvaW9fc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JTVBMX0lPX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fSU1QTF9JT19TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zZXJ2aWNlX3JlZ2lzdHJ5LmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2U+Ci1pbmxpbmUgU2VydmljZSYgdXNlX3NlcnZpY2UoaW9fc2VydmljZSYgaW9zKQotewotICAvLyBDaGVjayB0aGF0IFNlcnZpY2UgbWVldHMgdGhlIG5lY2Vzc2FyeSB0eXBlIHJlcXVpcmVtZW50cy4KLSAgKHZvaWQpc3RhdGljX2Nhc3Q8aW9fc2VydmljZTo6c2VydmljZSo+KHN0YXRpY19jYXN0PFNlcnZpY2UqPigwKSk7Ci0gICh2b2lkKXN0YXRpY19jYXN0PGNvbnN0IGlvX3NlcnZpY2U6OmlkKj4oJlNlcnZpY2U6OmlkKTsKLQotICByZXR1cm4gaW9zLnNlcnZpY2VfcmVnaXN0cnlfLT50ZW1wbGF0ZSB1c2Vfc2VydmljZTxTZXJ2aWNlPigpOwotfQotCi10ZW1wbGF0ZSA8PgotaW5saW5lIGRldGFpbDo6aW9fc2VydmljZV9pbXBsJiB1c2Vfc2VydmljZTxkZXRhaWw6OmlvX3NlcnZpY2VfaW1wbD4oCi0gICAgaW9fc2VydmljZSYgaW9zKQotewotICByZXR1cm4gaW9zLmltcGxfOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmljZT4KLWlubGluZSB2b2lkIGFkZF9zZXJ2aWNlKGlvX3NlcnZpY2UmIGlvcywgU2VydmljZSogc3ZjKQotewotICAvLyBDaGVjayB0aGF0IFNlcnZpY2UgbWVldHMgdGhlIG5lY2Vzc2FyeSB0eXBlIHJlcXVpcmVtZW50cy4KLSAgKHZvaWQpc3RhdGljX2Nhc3Q8aW9fc2VydmljZTo6c2VydmljZSo+KHN0YXRpY19jYXN0PFNlcnZpY2UqPigwKSk7Ci0gICh2b2lkKXN0YXRpY19jYXN0PGNvbnN0IGlvX3NlcnZpY2U6OmlkKj4oJlNlcnZpY2U6OmlkKTsKLQotICBpb3Muc2VydmljZV9yZWdpc3RyeV8tPnRlbXBsYXRlIGFkZF9zZXJ2aWNlPFNlcnZpY2U+KHN2Yyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2aWNlPgotaW5saW5lIGJvb2wgaGFzX3NlcnZpY2UoaW9fc2VydmljZSYgaW9zKQotewotICAvLyBDaGVjayB0aGF0IFNlcnZpY2UgbWVldHMgdGhlIG5lY2Vzc2FyeSB0eXBlIHJlcXVpcmVtZW50cy4KLSAgKHZvaWQpc3RhdGljX2Nhc3Q8aW9fc2VydmljZTo6c2VydmljZSo+KHN0YXRpY19jYXN0PFNlcnZpY2UqPigwKSk7Ci0gICh2b2lkKXN0YXRpY19jYXN0PGNvbnN0IGlvX3NlcnZpY2U6OmlkKj4oJlNlcnZpY2U6OmlkKTsKLQotICByZXR1cm4gaW9zLnNlcnZpY2VfcmVnaXN0cnlfLT50ZW1wbGF0ZSBoYXNfc2VydmljZTxTZXJ2aWNlPigpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX2lvX3NlcnZpY2UuaHBwIgotI2Vsc2UKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvdGFza19pb19zZXJ2aWNlLmhwcCIKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tcGxldGlvbkhhbmRsZXI+Ci1pbmxpbmUgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoQ29tcGxldGlvbkhhbmRsZXIsIHZvaWQgKCkpCi1pb19zZXJ2aWNlOjpkaXNwYXRjaChBU0lPX01PVkVfQVJHKENvbXBsZXRpb25IYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIENvbXBsZXRpb25IYW5kbGVyLgotICBBU0lPX0NPTVBMRVRJT05fSEFORExFUl9DSEVDSyhDb21wbGV0aW9uSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIENvbXBsZXRpb25IYW5kbGVyLCB2b2lkICgpPiBpbml0KAotICAgICAgQVNJT19NT1ZFX0NBU1QoQ29tcGxldGlvbkhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICBpbXBsXy5kaXNwYXRjaChpbml0LmhhbmRsZXIpOwotCi0gIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbXBsZXRpb25IYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKENvbXBsZXRpb25IYW5kbGVyLCB2b2lkICgpKQotaW9fc2VydmljZTo6cG9zdChBU0lPX01PVkVfQVJHKENvbXBsZXRpb25IYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIENvbXBsZXRpb25IYW5kbGVyLgotICBBU0lPX0NPTVBMRVRJT05fSEFORExFUl9DSEVDSyhDb21wbGV0aW9uSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIENvbXBsZXRpb25IYW5kbGVyLCB2b2lkICgpPiBpbml0KAotICAgICAgQVNJT19NT1ZFX0NBU1QoQ29tcGxldGlvbkhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICBpbXBsXy5wb3N0KGluaXQuaGFuZGxlcik7Ci0KLSAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLXVuc3BlY2lmaWVkCi0jZWxzZQotaW5saW5lIGRldGFpbDo6d3JhcHBlZF9oYW5kbGVyPGlvX3NlcnZpY2UmLCBIYW5kbGVyPgotI2VuZGlmCi1pb19zZXJ2aWNlOjp3cmFwKEhhbmRsZXIgaGFuZGxlcikKLXsKLSAgcmV0dXJuIGRldGFpbDo6d3JhcHBlZF9oYW5kbGVyPGlvX3NlcnZpY2UmLCBIYW5kbGVyPigqdGhpcywgaGFuZGxlcik7Ci19Ci0KLWlubGluZSBpb19zZXJ2aWNlOjp3b3JrOjp3b3JrKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gIDogaW9fc2VydmljZV9pbXBsXyhpb19zZXJ2aWNlLmltcGxfKQotewotICBpb19zZXJ2aWNlX2ltcGxfLndvcmtfc3RhcnRlZCgpOwotfQotCi1pbmxpbmUgaW9fc2VydmljZTo6d29yazo6d29yayhjb25zdCB3b3JrJiBvdGhlcikKLSAgOiBpb19zZXJ2aWNlX2ltcGxfKG90aGVyLmlvX3NlcnZpY2VfaW1wbF8pCi17Ci0gIGlvX3NlcnZpY2VfaW1wbF8ud29ya19zdGFydGVkKCk7Ci19Ci0KLWlubGluZSBpb19zZXJ2aWNlOjp3b3JrOjp+d29yaygpCi17Ci0gIGlvX3NlcnZpY2VfaW1wbF8ud29ya19maW5pc2hlZCgpOwotfQotCi1pbmxpbmUgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZTo6d29yazo6Z2V0X2lvX3NlcnZpY2UoKQotewotICByZXR1cm4gaW9fc2VydmljZV9pbXBsXy5nZXRfaW9fc2VydmljZSgpOwotfQotCi1pbmxpbmUgYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZTo6c2VydmljZTo6Z2V0X2lvX3NlcnZpY2UoKQotewotICByZXR1cm4gb3duZXJfOwotfQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0lNUExfSU9fU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL2lvX3NlcnZpY2UuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvaW9fc2VydmljZS5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmMxYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvaW9fc2VydmljZS5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8KLS8vIGltcGwvaW9fc2VydmljZS5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JTVBMX0lPX1NFUlZJQ0VfSVBQCi0jZGVmaW5lIEFTSU9fSU1QTF9JT19TRVJWSUNFX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbGltaXRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zY29wZWRfcHRyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zZXJ2aWNlX3JlZ2lzdHJ5LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbl9pb2NwX2lvX3NlcnZpY2UuaHBwIgotI2Vsc2UKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvdGFza19pb19zZXJ2aWNlLmhwcCIKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi1pb19zZXJ2aWNlOjppb19zZXJ2aWNlKCkKLSAgOiBzZXJ2aWNlX3JlZ2lzdHJ5XyhuZXcgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX3JlZ2lzdHJ5KAotICAgICAgICAqdGhpcywgc3RhdGljX2Nhc3Q8aW1wbF90eXBlKj4oMCksCi0gICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPHN0ZDo6c2l6ZV90Pjo6bWF4KSgpKSksCi0gICAgaW1wbF8oc2VydmljZV9yZWdpc3RyeV8tPmZpcnN0X3NlcnZpY2U8aW1wbF90eXBlPigpKQotewotfQotCi1pb19zZXJ2aWNlOjppb19zZXJ2aWNlKHN0ZDo6c2l6ZV90IGNvbmN1cnJlbmN5X2hpbnQpCi0gIDogc2VydmljZV9yZWdpc3RyeV8obmV3IGFzaW86OmRldGFpbDo6c2VydmljZV9yZWdpc3RyeSgKLSAgICAgICAgKnRoaXMsIHN0YXRpY19jYXN0PGltcGxfdHlwZSo+KDApLCBjb25jdXJyZW5jeV9oaW50KSksCi0gICAgaW1wbF8oc2VydmljZV9yZWdpc3RyeV8tPmZpcnN0X3NlcnZpY2U8aW1wbF90eXBlPigpKQotewotfQotCi1pb19zZXJ2aWNlOjp+aW9fc2VydmljZSgpCi17Ci0gIGRlbGV0ZSBzZXJ2aWNlX3JlZ2lzdHJ5XzsKLX0KLQotc3RkOjpzaXplX3QgaW9fc2VydmljZTo6cnVuKCkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc3RkOjpzaXplX3QgcyA9IGltcGxfLnJ1bihlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICByZXR1cm4gczsKLX0KLQotc3RkOjpzaXplX3QgaW9fc2VydmljZTo6cnVuKGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICByZXR1cm4gaW1wbF8ucnVuKGVjKTsKLX0KLQotc3RkOjpzaXplX3QgaW9fc2VydmljZTo6cnVuX29uZSgpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IHMgPSBpbXBsXy5ydW5fb25lKGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIHJldHVybiBzOwotfQotCi1zdGQ6OnNpemVfdCBpb19zZXJ2aWNlOjpydW5fb25lKGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICByZXR1cm4gaW1wbF8ucnVuX29uZShlYyk7Ci19Ci0KLXN0ZDo6c2l6ZV90IGlvX3NlcnZpY2U6OnBvbGwoKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBzdGQ6OnNpemVfdCBzID0gaW1wbF8ucG9sbChlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICByZXR1cm4gczsKLX0KLQotc3RkOjpzaXplX3QgaW9fc2VydmljZTo6cG9sbChhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgcmV0dXJuIGltcGxfLnBvbGwoZWMpOwotfQotCi1zdGQ6OnNpemVfdCBpb19zZXJ2aWNlOjpwb2xsX29uZSgpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IHMgPSBpbXBsXy5wb2xsX29uZShlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICByZXR1cm4gczsKLX0KLQotc3RkOjpzaXplX3QgaW9fc2VydmljZTo6cG9sbF9vbmUoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHJldHVybiBpbXBsXy5wb2xsX29uZShlYyk7Ci19Ci0KLXZvaWQgaW9fc2VydmljZTo6c3RvcCgpCi17Ci0gIGltcGxfLnN0b3AoKTsKLX0KLQotYm9vbCBpb19zZXJ2aWNlOjpzdG9wcGVkKCkgY29uc3QKLXsKLSAgcmV0dXJuIGltcGxfLnN0b3BwZWQoKTsKLX0KLQotdm9pZCBpb19zZXJ2aWNlOjpyZXNldCgpCi17Ci0gIGltcGxfLnJlc2V0KCk7Ci19Ci0KLXZvaWQgaW9fc2VydmljZTo6bm90aWZ5X2ZvcmsoYXNpbzo6aW9fc2VydmljZTo6Zm9ya19ldmVudCBldmVudCkKLXsKLSAgc2VydmljZV9yZWdpc3RyeV8tPm5vdGlmeV9mb3JrKGV2ZW50KTsKLX0KLQotaW9fc2VydmljZTo6c2VydmljZTo6c2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBvd25lcikKLSAgOiBvd25lcl8ob3duZXIpLAotICAgIG5leHRfKDApCi17Ci19Ci0KLWlvX3NlcnZpY2U6OnNlcnZpY2U6On5zZXJ2aWNlKCkKLXsKLX0KLQotdm9pZCBpb19zZXJ2aWNlOjpzZXJ2aWNlOjpmb3JrX3NlcnZpY2UoYXNpbzo6aW9fc2VydmljZTo6Zm9ya19ldmVudCkKLXsKLX0KLQotc2VydmljZV9hbHJlYWR5X2V4aXN0czo6c2VydmljZV9hbHJlYWR5X2V4aXN0cygpCi0gIDogc3RkOjpsb2dpY19lcnJvcigiU2VydmljZSBhbHJlYWR5IGV4aXN0cy4iKQotewotfQotCi1pbnZhbGlkX3NlcnZpY2Vfb3duZXI6OmludmFsaWRfc2VydmljZV9vd25lcigpCi0gIDogc3RkOjpsb2dpY19lcnJvcigiSW52YWxpZCBzZXJ2aWNlIG93bmVyLiIpCi17Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSU1QTF9JT19TRVJWSUNFX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvcmVhZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9yZWFkLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5YmI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9yZWFkLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1MyArMCwwIEBACi0vLwotLy8gaW1wbC9yZWFkLmhwcAotLy8gfn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lNUExfUkVBRF9IUFAKLSNkZWZpbmUgQVNJT19JTVBMX1JFQURfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlICJhc2lvL2J1ZmZlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9jb21wbGV0aW9uX2NvbmRpdGlvbi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYXJyYXlfZndkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iYXNlX2Zyb21fY29tcGxldGlvbl9jb25kLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbnN1bWluZ19idWZmZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9kZXBlbmRlbnRfdHlwZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2NvbnRfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotc3RkOjpzaXplX3QgcmVhZChTeW5jUmVhZFN0cmVhbSYgcywgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgYXNpbzo6ZGV0YWlsOjpjb25zdW1pbmdfYnVmZmVyczwKLSAgICBtdXRhYmxlX2J1ZmZlciwgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPiB0bXAoYnVmZmVycyk7Ci0gIHN0ZDo6c2l6ZV90IHRvdGFsX3RyYW5zZmVycmVkID0gMDsKLSAgdG1wLnByZXBhcmUoZGV0YWlsOjphZGFwdF9jb21wbGV0aW9uX2NvbmRpdGlvbl9yZXN1bHQoCi0gICAgICAgIGNvbXBsZXRpb25fY29uZGl0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZCkpKTsKLSAgd2hpbGUgKHRtcC5iZWdpbigpICE9IHRtcC5lbmQoKSkKLSAgewotICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gcy5yZWFkX3NvbWUodG1wLCBlYyk7Ci0gICAgdG1wLmNvbnN1bWUoYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIHRvdGFsX3RyYW5zZmVycmVkICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgIHRtcC5wcmVwYXJlKGRldGFpbDo6YWRhcHRfY29tcGxldGlvbl9jb25kaXRpb25fcmVzdWx0KAotICAgICAgICAgIGNvbXBsZXRpb25fY29uZGl0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZCkpKTsKLSAgfQotICByZXR1cm4gdG90YWxfdHJhbnNmZXJyZWQ7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotaW5saW5lIHN0ZDo6c2l6ZV90IHJlYWQoU3luY1JlYWRTdHJlYW0mIHMsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSByZWFkKHMsIGJ1ZmZlcnMsIHRyYW5zZmVyX2FsbCgpLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWFkIik7Ci0gIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci1pbmxpbmUgc3RkOjpzaXplX3QgcmVhZChTeW5jUmVhZFN0cmVhbSYgcywgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICByZXR1cm4gcmVhZChzLCBidWZmZXJzLCB0cmFuc2Zlcl9hbGwoKSwgZWMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotaW5saW5lIHN0ZDo6c2l6ZV90IHJlYWQoU3luY1JlYWRTdHJlYW0mIHMsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IHJlYWQocywgYnVmZmVycywgY29tcGxldGlvbl9jb25kaXRpb24sIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInJlYWQiKTsKLSAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotfQotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbj4KLXN0ZDo6c2l6ZV90IHJlYWQoU3luY1JlYWRTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICBzdGQ6OnNpemVfdCB0b3RhbF90cmFuc2ZlcnJlZCA9IDA7Ci0gIHN0ZDo6c2l6ZV90IG1heF9zaXplID0gZGV0YWlsOjphZGFwdF9jb21wbGV0aW9uX2NvbmRpdGlvbl9yZXN1bHQoCi0gICAgICAgIGNvbXBsZXRpb25fY29uZGl0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZCkpOwotICBzdGQ6OnNpemVfdCBieXRlc19hdmFpbGFibGUgPSByZWFkX3NpemVfaGVscGVyKGIsIG1heF9zaXplKTsKLSAgd2hpbGUgKGJ5dGVzX2F2YWlsYWJsZSA+IDApCi0gIHsKLSAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IHMucmVhZF9zb21lKGIucHJlcGFyZShieXRlc19hdmFpbGFibGUpLCBlYyk7Ci0gICAgYi5jb21taXQoYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIHRvdGFsX3RyYW5zZmVycmVkICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgIG1heF9zaXplID0gZGV0YWlsOjphZGFwdF9jb21wbGV0aW9uX2NvbmRpdGlvbl9yZXN1bHQoCi0gICAgICAgICAgY29tcGxldGlvbl9jb25kaXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkKSk7Ci0gICAgYnl0ZXNfYXZhaWxhYmxlID0gcmVhZF9zaXplX2hlbHBlcihiLCBtYXhfc2l6ZSk7Ci0gIH0KLSAgcmV0dXJuIHRvdGFsX3RyYW5zZmVycmVkOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvcj4KLWlubGluZSBzdGQ6OnNpemVfdCByZWFkKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IHJlYWQocywgYiwgdHJhbnNmZXJfYWxsKCksIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInJlYWQiKTsKLSAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvcj4KLWlubGluZSBzdGQ6OnNpemVfdCByZWFkKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICByZXR1cm4gcmVhZChzLCBiLCB0cmFuc2Zlcl9hbGwoKSwgZWMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotaW5saW5lIHN0ZDo6c2l6ZV90IHJlYWQoU3luY1JlYWRTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbikKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSByZWFkKHMsIGIsIGNvbXBsZXRpb25fY29uZGl0aW9uLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWFkIik7Ci0gIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLX0KLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLW5hbWVzcGFjZSBkZXRhaWwKLXsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGNsYXNzIHJlYWRfb3AKLSAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPgotICB7Ci0gIHB1YmxpYzoKLSAgICByZWFkX29wKEFzeW5jUmVhZFN0cmVhbSYgc3RyZWFtLCBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIFJlYWRIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Ci0gICAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbj4oY29tcGxldGlvbl9jb25kaXRpb24pLAotICAgICAgICBzdHJlYW1fKHN0cmVhbSksCi0gICAgICAgIGJ1ZmZlcnNfKGJ1ZmZlcnMpLAotICAgICAgICBzdGFydF8oMCksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXygwKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKQotICAgIHsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gICAgcmVhZF9vcChjb25zdCByZWFkX29wJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKG90aGVyLmhhbmRsZXJfKQotICAgIHsKLSAgICB9Ci0KLSAgICByZWFkX29wKHJlYWRfb3AmJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShvdGhlci5oYW5kbGVyXykpCi0gICAgewotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLSAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkLCBpbnQgc3RhcnQgPSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3RhcnRfID0gc3RhcnQpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgYnVmZmVyc18ucHJlcGFyZSh0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW1fLmFzeW5jX3JlYWRfc29tZShidWZmZXJzXywKLSAgICAgICAgICAgICAgQVNJT19NT1ZFX0NBU1QocmVhZF9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgICAgICAgIGJ1ZmZlcnNfLmNvbnN1bWUoYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgICAgICAgIGJ1ZmZlcnNfLnByZXBhcmUodGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXykpOwotICAgICAgICAgIGlmICgoIWVjICYmIGJ5dGVzX3RyYW5zZmVycmVkID09IDApCi0gICAgICAgICAgICAgIHx8IGJ1ZmZlcnNfLmJlZ2luKCkgPT0gYnVmZmVyc18uZW5kKCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGhhbmRsZXJfKGVjLCBzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnNpemVfdCY+KHRvdGFsX3RyYW5zZmVycmVkXykpOwotICAgICAgfQotICAgIH0KLQotICAvL3ByaXZhdGU6Ci0gICAgQXN5bmNSZWFkU3RyZWFtJiBzdHJlYW1fOwotICAgIGFzaW86OmRldGFpbDo6Y29uc3VtaW5nX2J1ZmZlcnM8Ci0gICAgICBtdXRhYmxlX2J1ZmZlciwgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPiBidWZmZXJzXzsKLSAgICBpbnQgc3RhcnRfOwotICAgIHN0ZDo6c2l6ZV90IHRvdGFsX3RyYW5zZmVycmVkXzsKLSAgICBSZWFkSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGNsYXNzIHJlYWRfb3A8QXN5bmNSZWFkU3RyZWFtLCBhc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSwKLSAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPgotICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIHJlYWRfb3AoQXN5bmNSZWFkU3RyZWFtJiBzdHJlYW0sCi0gICAgICAgIGNvbnN0IGFzaW86Om11dGFibGVfYnVmZmVyc18xJiBidWZmZXJzLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLCBSZWFkSGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPAotICAgICAgICAgIENvbXBsZXRpb25Db25kaXRpb24+KGNvbXBsZXRpb25fY29uZGl0aW9uKSwKLSAgICAgICAgc3RyZWFtXyhzdHJlYW0pLAotICAgICAgICBidWZmZXJfKGJ1ZmZlcnMpLAotICAgICAgICBzdGFydF8oMCksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXygwKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKQotICAgIHsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gICAgcmVhZF9vcChjb25zdCByZWFkX29wJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgYnVmZmVyXyhvdGhlci5idWZmZXJfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgcmVhZF9vcChyZWFkX29wJiYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIHN0cmVhbV8ob3RoZXIuc3RyZWFtXyksCi0gICAgICAgIGJ1ZmZlcl8ob3RoZXIuYnVmZmVyXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQsIGludCBzdGFydCA9IDApCi0gICAgewotICAgICAgc3RkOjpzaXplX3QgbiA9IDA7Ci0gICAgICBzd2l0Y2ggKHN0YXJ0XyA9IHN0YXJ0KQotICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKTsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbV8uYXN5bmNfcmVhZF9zb21lKAotICAgICAgICAgICAgICBhc2lvOjpidWZmZXIoYnVmZmVyXyArIHRvdGFsX3RyYW5zZmVycmVkXywgbiksCi0gICAgICAgICAgICAgIEFTSU9fTU9WRV9DQVNUKHJlYWRfb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgcmV0dXJuOyBkZWZhdWx0OgotICAgICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyArPSBieXRlc190cmFuc2ZlcnJlZDsKLSAgICAgICAgICBpZiAoKCFlYyAmJiBieXRlc190cmFuc2ZlcnJlZCA9PSAwKQotICAgICAgICAgICAgICB8fCAobiA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pKSA9PSAwCi0gICAgICAgICAgICAgIHx8IHRvdGFsX3RyYW5zZmVycmVkXyA9PSBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJfKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcl8oZWMsIHN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6c2l6ZV90Jj4odG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1JlYWRTdHJlYW0mIHN0cmVhbV87Ci0gICAgYXNpbzo6bXV0YWJsZV9idWZmZXIgYnVmZmVyXzsKLSAgICBpbnQgc3RhcnRfOwotICAgIHN0ZDo6c2l6ZV90IHRvdGFsX3RyYW5zZmVycmVkXzsKLSAgICBSZWFkSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBFbGVtLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGNsYXNzIHJlYWRfb3A8QXN5bmNSZWFkU3RyZWFtLCBib29zdDo6YXJyYXk8RWxlbSwgMj4sCi0gICAgICBDb21wbGV0aW9uQ29uZGl0aW9uLCBSZWFkSGFuZGxlcj4KLSAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPgotICB7Ci0gIHB1YmxpYzoKLSAgICByZWFkX29wKEFzeW5jUmVhZFN0cmVhbSYgc3RyZWFtLCBjb25zdCBib29zdDo6YXJyYXk8RWxlbSwgMj4mIGJ1ZmZlcnMsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIFJlYWRIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Ci0gICAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbj4oY29tcGxldGlvbl9jb25kaXRpb24pLAotICAgICAgICBzdHJlYW1fKHN0cmVhbSksCi0gICAgICAgIGJ1ZmZlcnNfKGJ1ZmZlcnMpLAotICAgICAgICBzdGFydF8oMCksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXygwKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKQotICAgIHsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gICAgcmVhZF9vcChjb25zdCByZWFkX29wJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKG90aGVyLmhhbmRsZXJfKQotICAgIHsKLSAgICB9Ci0KLSAgICByZWFkX29wKHJlYWRfb3AmJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShvdGhlci5oYW5kbGVyXykpCi0gICAgewotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLSAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkLCBpbnQgc3RhcnQgPSAwKQotICAgIHsKLSAgICAgIHR5cGVuYW1lIGFzaW86OmRldGFpbDo6ZGVwZW5kZW50X3R5cGU8RWxlbSwKLSAgICAgICAgICBib29zdDo6YXJyYXk8YXNpbzo6bXV0YWJsZV9idWZmZXIsIDI+ID46OnR5cGUgYnVmcyA9IHt7Ci0gICAgICAgIGFzaW86Om11dGFibGVfYnVmZmVyKGJ1ZmZlcnNfWzBdKSwKLSAgICAgICAgYXNpbzo6bXV0YWJsZV9idWZmZXIoYnVmZmVyc19bMV0pIH19OwotICAgICAgc3RkOjpzaXplX3QgYnVmZmVyX3NpemUwID0gYXNpbzo6YnVmZmVyX3NpemUoYnVmc1swXSk7Ci0gICAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZTEgPSBhc2lvOjpidWZmZXJfc2l6ZShidWZzWzFdKTsKLSAgICAgIHN0ZDo6c2l6ZV90IG4gPSAwOwotICAgICAgc3dpdGNoIChzdGFydF8gPSBzdGFydCkKLSAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICBuID0gdGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXyk7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBidWZzWzBdID0gYXNpbzo6YnVmZmVyKGJ1ZnNbMF0gKyB0b3RhbF90cmFuc2ZlcnJlZF8sIG4pOwotICAgICAgICAgIGJ1ZnNbMV0gPSBhc2lvOjpidWZmZXIoCi0gICAgICAgICAgICAgIGJ1ZnNbMV0gKyAodG90YWxfdHJhbnNmZXJyZWRfIDwgYnVmZmVyX3NpemUwCi0gICAgICAgICAgICAgICAgPyAwIDogdG90YWxfdHJhbnNmZXJyZWRfIC0gYnVmZmVyX3NpemUwKSwKLSAgICAgICAgICAgICAgbiAtIGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZnNbMF0pKTsKLSAgICAgICAgICBzdHJlYW1fLmFzeW5jX3JlYWRfc29tZShidWZzLCBBU0lPX01PVkVfQ0FTVChyZWFkX29wKSgqdGhpcykpOwotICAgICAgICAgIHJldHVybjsgZGVmYXVsdDoKLSAgICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8gKz0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0gICAgICAgICAgaWYgKCghZWMgJiYgYnl0ZXNfdHJhbnNmZXJyZWQgPT0gMCkKLSAgICAgICAgICAgICAgfHwgKG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKSkgPT0gMAotICAgICAgICAgICAgICB8fCB0b3RhbF90cmFuc2ZlcnJlZF8gPT0gYnVmZmVyX3NpemUwICsgYnVmZmVyX3NpemUxKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyXyhlYywgc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzaXplX3QmPih0b3RhbF90cmFuc2ZlcnJlZF8pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLy9wcml2YXRlOgotICAgIEFzeW5jUmVhZFN0cmVhbSYgc3RyZWFtXzsKLSAgICBib29zdDo6YXJyYXk8RWxlbSwgMj4gYnVmZmVyc187Ci0gICAgaW50IHN0YXJ0XzsKLSAgICBzdGQ6OnNpemVfdCB0b3RhbF90cmFuc2ZlcnJlZF87Ci0gICAgUmVhZEhhbmRsZXIgaGFuZGxlcl87Ci0gIH07Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9BUlJBWSkKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBFbGVtLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGNsYXNzIHJlYWRfb3A8QXN5bmNSZWFkU3RyZWFtLCBzdGQ6OmFycmF5PEVsZW0sIDI+LAotICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgUmVhZEhhbmRsZXI+Ci0gICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4KLSAgewotICBwdWJsaWM6Ci0gICAgcmVhZF9vcChBc3luY1JlYWRTdHJlYW0mIHN0cmVhbSwgY29uc3Qgc3RkOjphcnJheTxFbGVtLCAyPiYgYnVmZmVycywKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwgUmVhZEhhbmRsZXImIGhhbmRsZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDwKLSAgICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uPihjb21wbGV0aW9uX2NvbmRpdGlvbiksCi0gICAgICAgIHN0cmVhbV8oc3RyZWFtKSwKLSAgICAgICAgYnVmZmVyc18oYnVmZmVycyksCi0gICAgICAgIHN0YXJ0XygwKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKDApLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICByZWFkX29wKGNvbnN0IHJlYWRfb3AmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBzdHJlYW1fKG90aGVyLnN0cmVhbV8pLAotICAgICAgICBidWZmZXJzXyhvdGhlci5idWZmZXJzXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gICAgewotICAgIH0KLQotICAgIHJlYWRfb3AocmVhZF9vcCYmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBzdHJlYW1fKG90aGVyLnN0cmVhbV8pLAotICAgICAgICBidWZmZXJzXyhvdGhlci5idWZmZXJzXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQsIGludCBzdGFydCA9IDApCi0gICAgewotICAgICAgdHlwZW5hbWUgYXNpbzo6ZGV0YWlsOjpkZXBlbmRlbnRfdHlwZTxFbGVtLAotICAgICAgICAgIHN0ZDo6YXJyYXk8YXNpbzo6bXV0YWJsZV9idWZmZXIsIDI+ID46OnR5cGUgYnVmcyA9IHt7Ci0gICAgICAgIGFzaW86Om11dGFibGVfYnVmZmVyKGJ1ZmZlcnNfWzBdKSwKLSAgICAgICAgYXNpbzo6bXV0YWJsZV9idWZmZXIoYnVmZmVyc19bMV0pIH19OwotICAgICAgc3RkOjpzaXplX3QgYnVmZmVyX3NpemUwID0gYXNpbzo6YnVmZmVyX3NpemUoYnVmc1swXSk7Ci0gICAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZTEgPSBhc2lvOjpidWZmZXJfc2l6ZShidWZzWzFdKTsKLSAgICAgIHN0ZDo6c2l6ZV90IG4gPSAwOwotICAgICAgc3dpdGNoIChzdGFydF8gPSBzdGFydCkKLSAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICBuID0gdGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXyk7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBidWZzWzBdID0gYXNpbzo6YnVmZmVyKGJ1ZnNbMF0gKyB0b3RhbF90cmFuc2ZlcnJlZF8sIG4pOwotICAgICAgICAgIGJ1ZnNbMV0gPSBhc2lvOjpidWZmZXIoCi0gICAgICAgICAgICAgIGJ1ZnNbMV0gKyAodG90YWxfdHJhbnNmZXJyZWRfIDwgYnVmZmVyX3NpemUwCi0gICAgICAgICAgICAgICAgPyAwIDogdG90YWxfdHJhbnNmZXJyZWRfIC0gYnVmZmVyX3NpemUwKSwKLSAgICAgICAgICAgICAgbiAtIGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZnNbMF0pKTsKLSAgICAgICAgICBzdHJlYW1fLmFzeW5jX3JlYWRfc29tZShidWZzLCBBU0lPX01PVkVfQ0FTVChyZWFkX29wKSgqdGhpcykpOwotICAgICAgICAgIHJldHVybjsgZGVmYXVsdDoKLSAgICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8gKz0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0gICAgICAgICAgaWYgKCghZWMgJiYgYnl0ZXNfdHJhbnNmZXJyZWQgPT0gMCkKLSAgICAgICAgICAgICAgfHwgKG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKSkgPT0gMAotICAgICAgICAgICAgICB8fCB0b3RhbF90cmFuc2ZlcnJlZF8gPT0gYnVmZmVyX3NpemUwICsgYnVmZmVyX3NpemUxKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyXyhlYywgc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzaXplX3QmPih0b3RhbF90cmFuc2ZlcnJlZF8pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLy9wcml2YXRlOgotICAgIEFzeW5jUmVhZFN0cmVhbSYgc3RyZWFtXzsKLSAgICBzdGQ6OmFycmF5PEVsZW0sIDI+IGJ1ZmZlcnNfOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWRfOwotICAgIFJlYWRIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfQVJSQVkpCi0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIHJlYWRfb3A8QXN5bmNSZWFkU3RyZWFtLCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsCi0gICAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUodm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIHJlYWRfb3A8QXN5bmNSZWFkU3RyZWFtLCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmRlYWxsb2NhdGUoCi0gICAgICAgIHBvaW50ZXIsIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSBib29sIGFzaW9faGFuZGxlcl9pc19jb250aW51YXRpb24oCi0gICAgICByZWFkX29wPEFzeW5jUmVhZFN0cmVhbSwgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uLCBSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIHJldHVybiB0aGlzX2hhbmRsZXItPnN0YXJ0XyA9PSAwID8gdHJ1ZQotICAgICAgOiBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oCi0gICAgICAgICAgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwKLSAgICAgIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwKLSAgICAgIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIHJlYWRfb3A8QXN5bmNSZWFkU3RyZWFtLCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLAotICAgICAgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLAotICAgICAgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgcmVhZF9vcDxBc3luY1JlYWRTdHJlYW0sIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLWFzeW5jX3JlYWQoQXN5bmNSZWFkU3RyZWFtJiBzLCBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwKLSAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotCi0gIGRldGFpbDo6cmVhZF9vcDxBc3luY1JlYWRTdHJlYW0sIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uLCBBU0lPX0hBTkRMRVJfVFlQRSgKLSAgICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpPigKLSAgICAgICAgcywgYnVmZmVycywgY29tcGxldGlvbl9jb25kaXRpb24sIGluaXQuaGFuZGxlcikoCi0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAwLCAxKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLWlubGluZSBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkKEFzeW5jUmVhZFN0cmVhbSYgcywgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgUmVhZEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgZGV0YWlsOjpyZWFkX29wPEFzeW5jUmVhZFN0cmVhbSwgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgIGRldGFpbDo6dHJhbnNmZXJfYWxsX3QsIEFTSU9fSEFORExFUl9UWVBFKAotICAgICAgUmVhZEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSk+KAotICAgICAgICBzLCBidWZmZXJzLCB0cmFuc2Zlcl9hbGwoKSwgaW5pdC5oYW5kbGVyKSgKLSAgICAgICAgICBhc2lvOjplcnJvcl9jb2RlKCksIDAsIDEpOwotCi0gIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLX0KLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLW5hbWVzcGFjZSBkZXRhaWwKLXsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGNsYXNzIHJlYWRfc3RyZWFtYnVmX29wCi0gICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4KLSAgewotICBwdWJsaWM6Ci0gICAgcmVhZF9zdHJlYW1idWZfb3AoQXN5bmNSZWFkU3RyZWFtJiBzdHJlYW0sCi0gICAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBzdHJlYW1idWYsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIFJlYWRIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Ci0gICAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbj4oY29tcGxldGlvbl9jb25kaXRpb24pLAotICAgICAgICBzdHJlYW1fKHN0cmVhbSksCi0gICAgICAgIHN0cmVhbWJ1Zl8oc3RyZWFtYnVmKSwKLSAgICAgICAgc3RhcnRfKDApLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8oMCksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSkKLSAgICB7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAgIHJlYWRfc3RyZWFtYnVmX29wKGNvbnN0IHJlYWRfc3RyZWFtYnVmX29wJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgc3RyZWFtYnVmXyhvdGhlci5zdHJlYW1idWZfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgcmVhZF9zdHJlYW1idWZfb3AocmVhZF9zdHJlYW1idWZfb3AmJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgc3RyZWFtYnVmXyhvdGhlci5zdHJlYW1idWZfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgIHsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCwgaW50IHN0YXJ0ID0gMCkKLSAgICB7Ci0gICAgICBzdGQ6OnNpemVfdCBtYXhfc2l6ZSwgYnl0ZXNfYXZhaWxhYmxlOwotICAgICAgc3dpdGNoIChzdGFydF8gPSBzdGFydCkKLSAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICBtYXhfc2l6ZSA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pOwotICAgICAgICBieXRlc19hdmFpbGFibGUgPSByZWFkX3NpemVfaGVscGVyKHN0cmVhbWJ1Zl8sIG1heF9zaXplKTsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbV8uYXN5bmNfcmVhZF9zb21lKHN0cmVhbWJ1Zl8ucHJlcGFyZShieXRlc19hdmFpbGFibGUpLAotICAgICAgICAgICAgICBBU0lPX01PVkVfQ0FTVChyZWFkX3N0cmVhbWJ1Zl9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgICAgICAgIHN0cmVhbWJ1Zl8uY29tbWl0KGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICAgICAgICBtYXhfc2l6ZSA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pOwotICAgICAgICAgIGJ5dGVzX2F2YWlsYWJsZSA9IHJlYWRfc2l6ZV9oZWxwZXIoc3RyZWFtYnVmXywgbWF4X3NpemUpOwotICAgICAgICAgIGlmICgoIWVjICYmIGJ5dGVzX3RyYW5zZmVycmVkID09IDApIHx8IGJ5dGVzX2F2YWlsYWJsZSA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyXyhlYywgc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzaXplX3QmPih0b3RhbF90cmFuc2ZlcnJlZF8pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLy9wcml2YXRlOgotICAgIEFzeW5jUmVhZFN0cmVhbSYgc3RyZWFtXzsKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgc3RyZWFtYnVmXzsKLSAgICBpbnQgc3RhcnRfOwotICAgIHN0ZDo6c2l6ZV90IHRvdGFsX3RyYW5zZmVycmVkXzsKLSAgICBSZWFkSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQqIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzdGQ6OnNpemVfdCBzaXplLAotICAgICAgcmVhZF9zdHJlYW1idWZfb3A8QXN5bmNSZWFkU3RyZWFtLCBBbGxvY2F0b3IsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUodm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIHJlYWRfc3RyZWFtYnVmX29wPEFzeW5jUmVhZFN0cmVhbSwgQWxsb2NhdG9yLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uLCBSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjpkZWFsbG9jYXRlKAotICAgICAgICBwb2ludGVyLCBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgICAgcmVhZF9zdHJlYW1idWZfb3A8QXN5bmNSZWFkU3RyZWFtLCBBbGxvY2F0b3IsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIHRoaXNfaGFuZGxlci0+c3RhcnRfID09IDAgPyB0cnVlCi0gICAgICA6IGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbigKLSAgICAgICAgICB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLAotICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2ludm9rZShGdW5jdGlvbiYgZnVuY3Rpb24sCi0gICAgICByZWFkX3N0cmVhbWJ1Zl9vcDxBc3luY1JlYWRTdHJlYW0sIEFsbG9jYXRvciwKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sCi0gICAgICB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIHJlYWRfc3RyZWFtYnVmX29wPEFzeW5jUmVhZFN0cmVhbSwgQWxsb2NhdG9yLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uLCBSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci1pbmxpbmUgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYXN5bmNfcmVhZChBc3luY1JlYWRTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwKLSAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotCi0gIGRldGFpbDo6cmVhZF9zdHJlYW1idWZfb3A8QXN5bmNSZWFkU3RyZWFtLCBBbGxvY2F0b3IsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgQVNJT19IQU5ETEVSX1RZUEUoCi0gICAgICBSZWFkSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKT4oCi0gICAgICAgIHMsIGIsIGNvbXBsZXRpb25fY29uZGl0aW9uLCBpbml0LmhhbmRsZXIpKAotICAgICAgICAgIGFzaW86OmVycm9yX2NvZGUoKSwgMCwgMSk7Ci0KLSAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLWFzeW5jX3JlYWQoQXN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgUmVhZEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgZGV0YWlsOjpyZWFkX3N0cmVhbWJ1Zl9vcDxBc3luY1JlYWRTdHJlYW0sIEFsbG9jYXRvciwKLSAgICBkZXRhaWw6OnRyYW5zZmVyX2FsbF90LCBBU0lPX0hBTkRMRVJfVFlQRSgKLSAgICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpPigKLSAgICAgICAgcywgYiwgdHJhbnNmZXJfYWxsKCksIGluaXQuaGFuZGxlcikoCi0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAwLCAxKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0lNUExfUkVBRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3JlYWRfYXQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvcmVhZF9hdC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyM2I5ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvcmVhZF9hdC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MTAgKzAsMCBAQAotLy8KLS8vIGltcGwvcmVhZF9hdC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JTVBMX1JFQURfQVRfSFBQCi0jZGVmaW5lIEFTSU9fSU1QTF9SRUFEX0FUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSAiYXNpby9idWZmZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vY29tcGxldGlvbl9jb25kaXRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2FycmF5X2Z3ZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25zdW1pbmdfYnVmZmVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZGVwZW5kZW50X3R5cGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfYWxsb2NfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9jb250X2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfaW52b2tlX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfdHlwZV9yZXF1aXJlbWVudHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbj4KLXN0ZDo6c2l6ZV90IHJlYWRfYXQoU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICBhc2lvOjpkZXRhaWw6OmNvbnN1bWluZ19idWZmZXJzPAotICAgIG11dGFibGVfYnVmZmVyLCBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+IHRtcChidWZmZXJzKTsKLSAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWQgPSAwOwotICB0bXAucHJlcGFyZShkZXRhaWw6OmFkYXB0X2NvbXBsZXRpb25fY29uZGl0aW9uX3Jlc3VsdCgKLSAgICAgICAgY29tcGxldGlvbl9jb25kaXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkKSkpOwotICB3aGlsZSAodG1wLmJlZ2luKCkgIT0gdG1wLmVuZCgpKQotICB7Ci0gICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSBkLnJlYWRfc29tZV9hdCgKLSAgICAgICAgb2Zmc2V0ICsgdG90YWxfdHJhbnNmZXJyZWQsIHRtcCwgZWMpOwotICAgIHRtcC5jb25zdW1lKGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICB0b3RhbF90cmFuc2ZlcnJlZCArPSBieXRlc190cmFuc2ZlcnJlZDsKLSAgICB0bXAucHJlcGFyZShkZXRhaWw6OmFkYXB0X2NvbXBsZXRpb25fY29uZGl0aW9uX3Jlc3VsdCgKLSAgICAgICAgICBjb21wbGV0aW9uX2NvbmRpdGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWQpKSk7Ci0gIH0KLSAgcmV0dXJuIHRvdGFsX3RyYW5zZmVycmVkOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBzdGQ6OnNpemVfdCByZWFkX2F0KFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IHJlYWRfYXQoCi0gICAgICBkLCBvZmZzZXQsIGJ1ZmZlcnMsIHRyYW5zZmVyX2FsbCgpLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWFkX2F0Iik7Ci0gIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci1pbmxpbmUgc3RkOjpzaXplX3QgcmVhZF9hdChTeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgcmV0dXJuIHJlYWRfYXQoZCwgb2Zmc2V0LCBidWZmZXJzLCB0cmFuc2Zlcl9hbGwoKSwgZWMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotaW5saW5lIHN0ZDo6c2l6ZV90IHJlYWRfYXQoU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbikKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSByZWFkX2F0KAotICAgICAgZCwgb2Zmc2V0LCBidWZmZXJzLCBjb21wbGV0aW9uX2NvbmRpdGlvbiwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVhZF9hdCIpOwotICByZXR1cm4gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci19Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotc3RkOjpzaXplX3QgcmVhZF9hdChTeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWQgPSAwOwotICBzdGQ6OnNpemVfdCBtYXhfc2l6ZSA9IGRldGFpbDo6YWRhcHRfY29tcGxldGlvbl9jb25kaXRpb25fcmVzdWx0KAotICAgICAgICBjb21wbGV0aW9uX2NvbmRpdGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWQpKTsKLSAgc3RkOjpzaXplX3QgYnl0ZXNfYXZhaWxhYmxlID0gcmVhZF9zaXplX2hlbHBlcihiLCBtYXhfc2l6ZSk7Ci0gIHdoaWxlIChieXRlc19hdmFpbGFibGUgPiAwKQotICB7Ci0gICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSBkLnJlYWRfc29tZV9hdCgKLSAgICAgICAgb2Zmc2V0ICsgdG90YWxfdHJhbnNmZXJyZWQsIGIucHJlcGFyZShieXRlc19hdmFpbGFibGUpLCBlYyk7Ci0gICAgYi5jb21taXQoYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIHRvdGFsX3RyYW5zZmVycmVkICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgIG1heF9zaXplID0gZGV0YWlsOjphZGFwdF9jb21wbGV0aW9uX2NvbmRpdGlvbl9yZXN1bHQoCi0gICAgICAgICAgY29tcGxldGlvbl9jb25kaXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkKSk7Ci0gICAgYnl0ZXNfYXZhaWxhYmxlID0gcmVhZF9zaXplX2hlbHBlcihiLCBtYXhfc2l6ZSk7Ci0gIH0KLSAgcmV0dXJuIHRvdGFsX3RyYW5zZmVycmVkOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvcj4KLWlubGluZSBzdGQ6OnNpemVfdCByZWFkX2F0KFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gcmVhZF9hdCgKLSAgICAgIGQsIG9mZnNldCwgYiwgdHJhbnNmZXJfYWxsKCksIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInJlYWRfYXQiKTsKLSAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvcj4KLWlubGluZSBzdGQ6OnNpemVfdCByZWFkX2F0KFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHJldHVybiByZWFkX2F0KGQsIG9mZnNldCwgYiwgdHJhbnNmZXJfYWxsKCksIGVjKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbj4KLWlubGluZSBzdGQ6OnNpemVfdCByZWFkX2F0KFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbikKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSByZWFkX2F0KAotICAgICAgZCwgb2Zmc2V0LCBiLCBjb21wbGV0aW9uX2NvbmRpdGlvbiwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVhZF9hdCIpOwotICByZXR1cm4gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci19Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi1uYW1lc3BhY2UgZGV0YWlsCi17Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsCi0gICAgICB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sCi0gICAgICB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgY2xhc3MgcmVhZF9hdF9vcAotICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIHJlYWRfYXRfb3AoQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkZXZpY2UsCi0gICAgICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLCBSZWFkSGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPAotICAgICAgICAgIENvbXBsZXRpb25Db25kaXRpb24+KGNvbXBsZXRpb25fY29uZGl0aW9uKSwKLSAgICAgICAgZGV2aWNlXyhkZXZpY2UpLAotICAgICAgICBvZmZzZXRfKG9mZnNldCksCi0gICAgICAgIGJ1ZmZlcnNfKGJ1ZmZlcnMpLAotICAgICAgICBzdGFydF8oMCksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXygwKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKQotICAgIHsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gICAgcmVhZF9hdF9vcChjb25zdCByZWFkX2F0X29wJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgZGV2aWNlXyhvdGhlci5kZXZpY2VfKSwKLSAgICAgICAgb2Zmc2V0XyhvdGhlci5vZmZzZXRfKSwKLSAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKG90aGVyLmhhbmRsZXJfKQotICAgIHsKLSAgICB9Ci0KLSAgICByZWFkX2F0X29wKHJlYWRfYXRfb3AmJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgZGV2aWNlXyhvdGhlci5kZXZpY2VfKSwKLSAgICAgICAgb2Zmc2V0XyhvdGhlci5vZmZzZXRfKSwKLSAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShvdGhlci5oYW5kbGVyXykpCi0gICAgewotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLSAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkLCBpbnQgc3RhcnQgPSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3RhcnRfID0gc3RhcnQpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgYnVmZmVyc18ucHJlcGFyZSh0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBkZXZpY2VfLmFzeW5jX3JlYWRfc29tZV9hdChvZmZzZXRfICsgdG90YWxfdHJhbnNmZXJyZWRfLAotICAgICAgICAgICAgICBidWZmZXJzXywgQVNJT19NT1ZFX0NBU1QocmVhZF9hdF9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgICAgICAgIGJ1ZmZlcnNfLmNvbnN1bWUoYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgICAgICAgIGJ1ZmZlcnNfLnByZXBhcmUodGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXykpOwotICAgICAgICAgIGlmICgoIWVjICYmIGJ5dGVzX3RyYW5zZmVycmVkID09IDApCi0gICAgICAgICAgICAgIHx8IGJ1ZmZlcnNfLmJlZ2luKCkgPT0gYnVmZmVyc18uZW5kKCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGhhbmRsZXJfKGVjLCBzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnNpemVfdCY+KHRvdGFsX3RyYW5zZmVycmVkXykpOwotICAgICAgfQotICAgIH0KLQotICAvL3ByaXZhdGU6Ci0gICAgQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkZXZpY2VfOwotICAgIHVpbnQ2NF90IG9mZnNldF87Ci0gICAgYXNpbzo6ZGV0YWlsOjpjb25zdW1pbmdfYnVmZmVyczwKLSAgICAgIG11dGFibGVfYnVmZmVyLCBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+IGJ1ZmZlcnNfOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWRfOwotICAgIFJlYWRIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsCi0gICAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgY2xhc3MgcmVhZF9hdF9vcDxBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsCi0gICAgICBhc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSwgQ29tcGxldGlvbkNvbmRpdGlvbiwgUmVhZEhhbmRsZXI+Ci0gICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4KLSAgewotICBwdWJsaWM6Ci0gICAgcmVhZF9hdF9vcChBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UmIGRldmljZSwKLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSYgYnVmZmVycywKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwgUmVhZEhhbmRsZXImIGhhbmRsZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDwKLSAgICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uPihjb21wbGV0aW9uX2NvbmRpdGlvbiksCi0gICAgICAgIGRldmljZV8oZGV2aWNlKSwKLSAgICAgICAgb2Zmc2V0XyhvZmZzZXQpLAotICAgICAgICBidWZmZXJfKGJ1ZmZlcnMpLAotICAgICAgICBzdGFydF8oMCksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXygwKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKQotICAgIHsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gICAgcmVhZF9hdF9vcChjb25zdCByZWFkX2F0X29wJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgZGV2aWNlXyhvdGhlci5kZXZpY2VfKSwKLSAgICAgICAgb2Zmc2V0XyhvdGhlci5vZmZzZXRfKSwKLSAgICAgICAgYnVmZmVyXyhvdGhlci5idWZmZXJfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgcmVhZF9hdF9vcChyZWFkX2F0X29wJiYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIGRldmljZV8ob3RoZXIuZGV2aWNlXyksCi0gICAgICAgIG9mZnNldF8ob3RoZXIub2Zmc2V0XyksCi0gICAgICAgIGJ1ZmZlcl8ob3RoZXIuYnVmZmVyXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQsIGludCBzdGFydCA9IDApCi0gICAgewotICAgICAgc3RkOjpzaXplX3QgbiA9IDA7Ci0gICAgICBzd2l0Y2ggKHN0YXJ0XyA9IHN0YXJ0KQotICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKTsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIGRldmljZV8uYXN5bmNfcmVhZF9zb21lX2F0KG9mZnNldF8gKyB0b3RhbF90cmFuc2ZlcnJlZF8sCi0gICAgICAgICAgICAgIGFzaW86OmJ1ZmZlcihidWZmZXJfICsgdG90YWxfdHJhbnNmZXJyZWRfLCBuKSwKLSAgICAgICAgICAgICAgQVNJT19NT1ZFX0NBU1QocmVhZF9hdF9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgICAgICAgIGlmICgoIWVjICYmIGJ5dGVzX3RyYW5zZmVycmVkID09IDApCi0gICAgICAgICAgICAgIHx8IChuID0gdGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXykpID09IDAKLSAgICAgICAgICAgICAgfHwgdG90YWxfdHJhbnNmZXJyZWRfID09IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcl8pKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyXyhlYywgc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzaXplX3QmPih0b3RhbF90cmFuc2ZlcnJlZF8pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLy9wcml2YXRlOgotICAgIEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZGV2aWNlXzsKLSAgICB1aW50NjRfdCBvZmZzZXRfOwotICAgIGFzaW86Om11dGFibGVfYnVmZmVyIGJ1ZmZlcl87Ci0gICAgaW50IHN0YXJ0XzsKLSAgICBzdGQ6OnNpemVfdCB0b3RhbF90cmFuc2ZlcnJlZF87Ci0gICAgUmVhZEhhbmRsZXIgaGFuZGxlcl87Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgdHlwZW5hbWUgRWxlbSwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBjbGFzcyByZWFkX2F0X29wPEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgYm9vc3Q6OmFycmF5PEVsZW0sIDI+LAotICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgUmVhZEhhbmRsZXI+Ci0gICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4KLSAgewotICBwdWJsaWM6Ci0gICAgcmVhZF9hdF9vcChBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UmIGRldmljZSwKLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBib29zdDo6YXJyYXk8RWxlbSwgMj4mIGJ1ZmZlcnMsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIFJlYWRIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Ci0gICAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbj4oY29tcGxldGlvbl9jb25kaXRpb24pLAotICAgICAgICBkZXZpY2VfKGRldmljZSksCi0gICAgICAgIG9mZnNldF8ob2Zmc2V0KSwKLSAgICAgICAgYnVmZmVyc18oYnVmZmVycyksCi0gICAgICAgIHN0YXJ0XygwKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKDApLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICByZWFkX2F0X29wKGNvbnN0IHJlYWRfYXRfb3AmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBkZXZpY2VfKG90aGVyLmRldmljZV8pLAotICAgICAgICBvZmZzZXRfKG90aGVyLm9mZnNldF8pLAotICAgICAgICBidWZmZXJzXyhvdGhlci5idWZmZXJzXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gICAgewotICAgIH0KLQotICAgIHJlYWRfYXRfb3AocmVhZF9hdF9vcCYmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBkZXZpY2VfKG90aGVyLmRldmljZV8pLAotICAgICAgICBvZmZzZXRfKG90aGVyLm9mZnNldF8pLAotICAgICAgICBidWZmZXJzXyhvdGhlci5idWZmZXJzXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQsIGludCBzdGFydCA9IDApCi0gICAgewotICAgICAgdHlwZW5hbWUgYXNpbzo6ZGV0YWlsOjpkZXBlbmRlbnRfdHlwZTxFbGVtLAotICAgICAgICAgIGJvb3N0OjphcnJheTxhc2lvOjptdXRhYmxlX2J1ZmZlciwgMj4gPjo6dHlwZSBidWZzID0ge3sKLSAgICAgICAgYXNpbzo6bXV0YWJsZV9idWZmZXIoYnVmZmVyc19bMF0pLAotICAgICAgICBhc2lvOjptdXRhYmxlX2J1ZmZlcihidWZmZXJzX1sxXSkgfX07Ci0gICAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZTAgPSBhc2lvOjpidWZmZXJfc2l6ZShidWZzWzBdKTsKLSAgICAgIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplMSA9IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZnNbMV0pOwotICAgICAgc3RkOjpzaXplX3QgbiA9IDA7Ci0gICAgICBzd2l0Y2ggKHN0YXJ0XyA9IHN0YXJ0KQotICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKTsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIGJ1ZnNbMF0gPSBhc2lvOjpidWZmZXIoYnVmc1swXSArIHRvdGFsX3RyYW5zZmVycmVkXywgbik7Ci0gICAgICAgICAgYnVmc1sxXSA9IGFzaW86OmJ1ZmZlcigKLSAgICAgICAgICAgICAgYnVmc1sxXSArICh0b3RhbF90cmFuc2ZlcnJlZF8gPCBidWZmZXJfc2l6ZTAKLSAgICAgICAgICAgICAgICA/IDAgOiB0b3RhbF90cmFuc2ZlcnJlZF8gLSBidWZmZXJfc2l6ZTApLAotICAgICAgICAgICAgICBuIC0gYXNpbzo6YnVmZmVyX3NpemUoYnVmc1swXSkpOwotICAgICAgICAgIGRldmljZV8uYXN5bmNfcmVhZF9zb21lX2F0KG9mZnNldF8gKyB0b3RhbF90cmFuc2ZlcnJlZF8sCi0gICAgICAgICAgICAgIGJ1ZnMsIEFTSU9fTU9WRV9DQVNUKHJlYWRfYXRfb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgcmV0dXJuOyBkZWZhdWx0OgotICAgICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyArPSBieXRlc190cmFuc2ZlcnJlZDsKLSAgICAgICAgICBpZiAoKCFlYyAmJiBieXRlc190cmFuc2ZlcnJlZCA9PSAwKQotICAgICAgICAgICAgICB8fCAobiA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pKSA9PSAwCi0gICAgICAgICAgICAgIHx8IHRvdGFsX3RyYW5zZmVycmVkXyA9PSBidWZmZXJfc2l6ZTAgKyBidWZmZXJfc2l6ZTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGhhbmRsZXJfKGVjLCBzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnNpemVfdCY+KHRvdGFsX3RyYW5zZmVycmVkXykpOwotICAgICAgfQotICAgIH0KLQotICAvL3ByaXZhdGU6Ci0gICAgQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkZXZpY2VfOwotICAgIHVpbnQ2NF90IG9mZnNldF87Ci0gICAgYm9vc3Q6OmFycmF5PEVsZW0sIDI+IGJ1ZmZlcnNfOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWRfOwotICAgIFJlYWRIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TVERfQVJSQVkpCi0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgdHlwZW5hbWUgRWxlbSwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBjbGFzcyByZWFkX2F0X29wPEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgc3RkOjphcnJheTxFbGVtLCAyPiwKLSAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPgotICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIHJlYWRfYXRfb3AoQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkZXZpY2UsCi0gICAgICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3Qgc3RkOjphcnJheTxFbGVtLCAyPiYgYnVmZmVycywKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwgUmVhZEhhbmRsZXImIGhhbmRsZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDwKLSAgICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uPihjb21wbGV0aW9uX2NvbmRpdGlvbiksCi0gICAgICAgIGRldmljZV8oZGV2aWNlKSwKLSAgICAgICAgb2Zmc2V0XyhvZmZzZXQpLAotICAgICAgICBidWZmZXJzXyhidWZmZXJzKSwKLSAgICAgICAgc3RhcnRfKDApLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8oMCksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSkKLSAgICB7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAgIHJlYWRfYXRfb3AoY29uc3QgcmVhZF9hdF9vcCYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIGRldmljZV8ob3RoZXIuZGV2aWNlXyksCi0gICAgICAgIG9mZnNldF8ob3RoZXIub2Zmc2V0XyksCi0gICAgICAgIGJ1ZmZlcnNfKG90aGVyLmJ1ZmZlcnNfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgcmVhZF9hdF9vcChyZWFkX2F0X29wJiYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIGRldmljZV8ob3RoZXIuZGV2aWNlXyksCi0gICAgICAgIG9mZnNldF8ob3RoZXIub2Zmc2V0XyksCi0gICAgICAgIGJ1ZmZlcnNfKG90aGVyLmJ1ZmZlcnNfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgIHsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCwgaW50IHN0YXJ0ID0gMCkKLSAgICB7Ci0gICAgICB0eXBlbmFtZSBhc2lvOjpkZXRhaWw6OmRlcGVuZGVudF90eXBlPEVsZW0sCi0gICAgICAgICAgc3RkOjphcnJheTxhc2lvOjptdXRhYmxlX2J1ZmZlciwgMj4gPjo6dHlwZSBidWZzID0ge3sKLSAgICAgICAgYXNpbzo6bXV0YWJsZV9idWZmZXIoYnVmZmVyc19bMF0pLAotICAgICAgICBhc2lvOjptdXRhYmxlX2J1ZmZlcihidWZmZXJzX1sxXSkgfX07Ci0gICAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZTAgPSBhc2lvOjpidWZmZXJfc2l6ZShidWZzWzBdKTsKLSAgICAgIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplMSA9IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZnNbMV0pOwotICAgICAgc3RkOjpzaXplX3QgbiA9IDA7Ci0gICAgICBzd2l0Y2ggKHN0YXJ0XyA9IHN0YXJ0KQotICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKTsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIGJ1ZnNbMF0gPSBhc2lvOjpidWZmZXIoYnVmc1swXSArIHRvdGFsX3RyYW5zZmVycmVkXywgbik7Ci0gICAgICAgICAgYnVmc1sxXSA9IGFzaW86OmJ1ZmZlcigKLSAgICAgICAgICAgICAgYnVmc1sxXSArICh0b3RhbF90cmFuc2ZlcnJlZF8gPCBidWZmZXJfc2l6ZTAKLSAgICAgICAgICAgICAgICA/IDAgOiB0b3RhbF90cmFuc2ZlcnJlZF8gLSBidWZmZXJfc2l6ZTApLAotICAgICAgICAgICAgICBuIC0gYXNpbzo6YnVmZmVyX3NpemUoYnVmc1swXSkpOwotICAgICAgICAgIGRldmljZV8uYXN5bmNfcmVhZF9zb21lX2F0KG9mZnNldF8gKyB0b3RhbF90cmFuc2ZlcnJlZF8sCi0gICAgICAgICAgICAgIGJ1ZnMsIEFTSU9fTU9WRV9DQVNUKHJlYWRfYXRfb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgcmV0dXJuOyBkZWZhdWx0OgotICAgICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyArPSBieXRlc190cmFuc2ZlcnJlZDsKLSAgICAgICAgICBpZiAoKCFlYyAmJiBieXRlc190cmFuc2ZlcnJlZCA9PSAwKQotICAgICAgICAgICAgICB8fCAobiA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pKSA9PSAwCi0gICAgICAgICAgICAgIHx8IHRvdGFsX3RyYW5zZmVycmVkXyA9PSBidWZmZXJfc2l6ZTAgKyBidWZmZXJfc2l6ZTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGhhbmRsZXJfKGVjLCBzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnNpemVfdCY+KHRvdGFsX3RyYW5zZmVycmVkXykpOwotICAgICAgfQotICAgIH0KLQotICAvL3ByaXZhdGU6Ci0gICAgQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkZXZpY2VfOwotICAgIHVpbnQ2NF90IG9mZnNldF87Ci0gICAgc3RkOjphcnJheTxFbGVtLCAyPiBidWZmZXJzXzsKLSAgICBpbnQgc3RhcnRfOwotICAgIHN0ZDo6c2l6ZV90IHRvdGFsX3RyYW5zZmVycmVkXzsKLSAgICBSZWFkSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsCi0gICAgICB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sCi0gICAgICB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQqIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzdGQ6OnNpemVfdCBzaXplLAotICAgICAgcmVhZF9hdF9vcDxBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsCi0gICAgICB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sCi0gICAgICB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUodm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIHJlYWRfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmRlYWxsb2NhdGUoCi0gICAgICAgIHBvaW50ZXIsIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwKLSAgICAgIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwKLSAgICAgIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgICAgcmVhZF9hdF9vcDxBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gdGhpc19oYW5kbGVyLT5zdGFydF8gPT0gMCA/IHRydWUKLSAgICAgIDogYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKAotICAgICAgICAgIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsCi0gICAgICB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sCi0gICAgICB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2ludm9rZShGdW5jdGlvbiYgZnVuY3Rpb24sCi0gICAgICByZWFkX2F0X29wPEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uLCBSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwKLSAgICAgIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwKLSAgICAgIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIHJlYWRfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsCi0gICAgICB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sCi0gICAgICB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHJlYWRfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLAotICAgICAgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCBDb21wbGV0aW9uQ29uZGl0aW9uLCBSZWFkSGFuZGxlcj4KLSAgbWFrZV9yZWFkX2F0X29wKEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwKLSAgICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwgUmVhZEhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIHJldHVybiByZWFkX2F0X29wPEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwKLSAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgQ29tcGxldGlvbkNvbmRpdGlvbiwgUmVhZEhhbmRsZXI+KAotICAgICAgICBkLCBvZmZzZXQsIGJ1ZmZlcnMsIGNvbXBsZXRpb25fY29uZGl0aW9uLCBoYW5kbGVyKTsKLSAgfQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLWlubGluZSBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkX2F0KEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgUmVhZEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgZGV0YWlsOjpyZWFkX2F0X29wPEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgIENvbXBsZXRpb25Db25kaXRpb24sIEFTSU9fSEFORExFUl9UWVBFKFJlYWRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKT4oCi0gICAgICAgIGQsIG9mZnNldCwgYnVmZmVycywgY29tcGxldGlvbl9jb25kaXRpb24sIGluaXQuaGFuZGxlcikoCi0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAwLCAxKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLWlubGluZSBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkX2F0KEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotCi0gIGRldGFpbDo6cmVhZF9hdF9vcDxBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICBkZXRhaWw6OnRyYW5zZmVyX2FsbF90LCBBU0lPX0hBTkRMRVJfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSk+KAotICAgICAgICBkLCBvZmZzZXQsIGJ1ZmZlcnMsIHRyYW5zZmVyX2FsbCgpLCBpbml0LmhhbmRsZXIpKAotICAgICAgICAgIGFzaW86OmVycm9yX2NvZGUoKSwgMCwgMSk7Ci0KLSAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotfQotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotbmFtZXNwYWNlIGRldGFpbAotewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgY2xhc3MgcmVhZF9hdF9zdHJlYW1idWZfb3AKLSAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPgotICB7Ci0gIHB1YmxpYzoKLSAgICByZWFkX2F0X3N0cmVhbWJ1Zl9vcChBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UmIGRldmljZSwKLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0LCBiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgc3RyZWFtYnVmLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLCBSZWFkSGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPAotICAgICAgICAgIENvbXBsZXRpb25Db25kaXRpb24+KGNvbXBsZXRpb25fY29uZGl0aW9uKSwKLSAgICAgICAgZGV2aWNlXyhkZXZpY2UpLAotICAgICAgICBvZmZzZXRfKG9mZnNldCksCi0gICAgICAgIHN0cmVhbWJ1Zl8oc3RyZWFtYnVmKSwKLSAgICAgICAgc3RhcnRfKDApLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8oMCksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSkKLSAgICB7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAgIHJlYWRfYXRfc3RyZWFtYnVmX29wKGNvbnN0IHJlYWRfYXRfc3RyZWFtYnVmX29wJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgZGV2aWNlXyhvdGhlci5kZXZpY2VfKSwKLSAgICAgICAgb2Zmc2V0XyhvdGhlci5vZmZzZXRfKSwKLSAgICAgICAgc3RyZWFtYnVmXyhvdGhlci5zdHJlYW1idWZfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgcmVhZF9hdF9zdHJlYW1idWZfb3AocmVhZF9hdF9zdHJlYW1idWZfb3AmJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgZGV2aWNlXyhvdGhlci5kZXZpY2VfKSwKLSAgICAgICAgb2Zmc2V0XyhvdGhlci5vZmZzZXRfKSwKLSAgICAgICAgc3RyZWFtYnVmXyhvdGhlci5zdHJlYW1idWZfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgIHsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCwgaW50IHN0YXJ0ID0gMCkKLSAgICB7Ci0gICAgICBzdGQ6OnNpemVfdCBtYXhfc2l6ZSwgYnl0ZXNfYXZhaWxhYmxlOwotICAgICAgc3dpdGNoIChzdGFydF8gPSBzdGFydCkKLSAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICBtYXhfc2l6ZSA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pOwotICAgICAgICBieXRlc19hdmFpbGFibGUgPSByZWFkX3NpemVfaGVscGVyKHN0cmVhbWJ1Zl8sIG1heF9zaXplKTsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIGRldmljZV8uYXN5bmNfcmVhZF9zb21lX2F0KG9mZnNldF8gKyB0b3RhbF90cmFuc2ZlcnJlZF8sCi0gICAgICAgICAgICAgIHN0cmVhbWJ1Zl8ucHJlcGFyZShieXRlc19hdmFpbGFibGUpLAotICAgICAgICAgICAgICBBU0lPX01PVkVfQ0FTVChyZWFkX2F0X3N0cmVhbWJ1Zl9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgICAgICAgIHN0cmVhbWJ1Zl8uY29tbWl0KGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICAgICAgICBtYXhfc2l6ZSA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pOwotICAgICAgICAgIGJ5dGVzX2F2YWlsYWJsZSA9IHJlYWRfc2l6ZV9oZWxwZXIoc3RyZWFtYnVmXywgbWF4X3NpemUpOwotICAgICAgICAgIGlmICgoIWVjICYmIGJ5dGVzX3RyYW5zZmVycmVkID09IDApIHx8IGJ5dGVzX2F2YWlsYWJsZSA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyXyhlYywgc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzaXplX3QmPih0b3RhbF90cmFuc2ZlcnJlZF8pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLy9wcml2YXRlOgotICAgIEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZGV2aWNlXzsKLSAgICB1aW50NjRfdCBvZmZzZXRfOwotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBzdHJlYW1idWZfOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWRfOwotICAgIFJlYWRIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCogYXNpb19oYW5kbGVyX2FsbG9jYXRlKHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgICByZWFkX2F0X3N0cmVhbWJ1Zl9vcDxBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIEFsbG9jYXRvciwKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgICAgcmVhZF9hdF9zdHJlYW1idWZfb3A8QXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCBBbGxvY2F0b3IsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmRlYWxsb2NhdGUoCi0gICAgICAgIHBvaW50ZXIsIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSBib29sIGFzaW9faGFuZGxlcl9pc19jb250aW51YXRpb24oCi0gICAgICByZWFkX2F0X3N0cmVhbWJ1Zl9vcDxBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIEFsbG9jYXRvciwKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gdGhpc19oYW5kbGVyLT5zdGFydF8gPT0gMCA/IHRydWUKLSAgICAgIDogYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKAotICAgICAgICAgIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsCi0gICAgICB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIHJlYWRfYXRfc3RyZWFtYnVmX29wPEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgQWxsb2NhdG9yLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uLCBSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwKLSAgICAgIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgcmVhZF9hdF9zdHJlYW1idWZfb3A8QXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCBBbGxvY2F0b3IsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLWlubGluZSBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkX2F0KEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sCi0gICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLXsKLSAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBSZWFkSGFuZGxlci4KLSAgQVNJT19SRUFEX0hBTkRMRVJfQ0hFQ0soUmVhZEhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICBSZWFkSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICBkZXRhaWw6OnJlYWRfYXRfc3RyZWFtYnVmX29wPEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgQWxsb2NhdG9yLAotICAgIENvbXBsZXRpb25Db25kaXRpb24sIEFTSU9fSEFORExFUl9UWVBFKFJlYWRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKT4oCi0gICAgICAgIGQsIG9mZnNldCwgYiwgY29tcGxldGlvbl9jb25kaXRpb24sIGluaXQuaGFuZGxlcikoCi0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAwLCAxKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLWlubGluZSBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkX2F0KEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgUmVhZEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgZGV0YWlsOjpyZWFkX2F0X3N0cmVhbWJ1Zl9vcDxBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIEFsbG9jYXRvciwKLSAgICBkZXRhaWw6OnRyYW5zZmVyX2FsbF90LCBBU0lPX0hBTkRMRVJfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSk+KAotICAgICAgICBkLCBvZmZzZXQsIGIsIHRyYW5zZmVyX2FsbCgpLCBpbml0LmhhbmRsZXIpKAotICAgICAgICAgIGFzaW86OmVycm9yX2NvZGUoKSwgMCwgMSk7Ci0KLSAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotfQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19JTVBMX1JFQURfQVRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9yZWFkX3VudGlsLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3JlYWRfdW50aWwuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjM3NjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3JlYWRfdW50aWwuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NyArMCwwIEBACi0vLwotLy8gaW1wbC9yZWFkX3VudGlsLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lNUExfUkVBRF9VTlRJTF9IUFAKLSNkZWZpbmUgQVNJT19JTVBMX1JFQURfVU5USUxfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSAiYXNpby9idWZmZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vYnVmZmVyc19pdGVyYXRvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYmluZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2FsbG9jX2hlbHBlcnMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfY29udF9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2ludm9rZV9oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9saW1pdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1pbmxpbmUgc3RkOjpzaXplX3QgcmVhZF91bnRpbChTeW5jUmVhZFN0cmVhbSYgcywKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwgY2hhciBkZWxpbSkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSByZWFkX3VudGlsKHMsIGIsIGRlbGltLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWFkX3VudGlsIik7Ci0gIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1zdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBjaGFyIGRlbGltLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBzdGQ6OnNpemVfdCBzZWFyY2hfcG9zaXRpb24gPSAwOwotICBmb3IgKDs7KQotICB7Ci0gICAgLy8gRGV0ZXJtaW5lIHRoZSByYW5nZSBvZiB0aGUgZGF0YSB0byBiZSBzZWFyY2hlZC4KLSAgICB0eXBlZGVmIHR5cGVuYW1lIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjwKLSAgICAgIEFsbG9jYXRvcj46OmNvbnN0X2J1ZmZlcnNfdHlwZSBjb25zdF9idWZmZXJzX3R5cGU7Ci0gICAgdHlwZWRlZiBhc2lvOjpidWZmZXJzX2l0ZXJhdG9yPGNvbnN0X2J1ZmZlcnNfdHlwZT4gaXRlcmF0b3I7Ci0gICAgY29uc3RfYnVmZmVyc190eXBlIGJ1ZmZlcnMgPSBiLmRhdGEoKTsKLSAgICBpdGVyYXRvciBiZWdpbiA9IGl0ZXJhdG9yOjpiZWdpbihidWZmZXJzKTsKLSAgICBpdGVyYXRvciBzdGFydF9wb3MgPSBiZWdpbiArIHNlYXJjaF9wb3NpdGlvbjsKLSAgICBpdGVyYXRvciBlbmQgPSBpdGVyYXRvcjo6ZW5kKGJ1ZmZlcnMpOwotCi0gICAgLy8gTG9vayBmb3IgYSBtYXRjaC4KLSAgICBpdGVyYXRvciBpdGVyID0gc3RkOjpmaW5kKHN0YXJ0X3BvcywgZW5kLCBkZWxpbSk7Ci0gICAgaWYgKGl0ZXIgIT0gZW5kKQotICAgIHsKLSAgICAgIC8vIEZvdW5kIGEgbWF0Y2guIFdlJ3JlIGRvbmUuCi0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIHJldHVybiBpdGVyIC0gYmVnaW4gKyAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gTm8gbWF0Y2guIE5leHQgc2VhcmNoIGNhbiBzdGFydCB3aXRoIHRoZSBuZXcgZGF0YS4KLSAgICAgIHNlYXJjaF9wb3NpdGlvbiA9IGVuZCAtIGJlZ2luOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIGJ1ZmZlciBpcyBmdWxsLgotICAgIGlmIChiLnNpemUoKSA9PSBiLm1heF9zaXplKCkpCi0gICAgewotICAgICAgZWMgPSBlcnJvcjo6bm90X2ZvdW5kOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gTmVlZCBtb3JlIGRhdGEuCi0gICAgc3RkOjpzaXplX3QgYnl0ZXNfdG9fcmVhZCA9IHJlYWRfc2l6ZV9oZWxwZXIoYiwgNjU1MzYpOwotICAgIGIuY29tbWl0KHMucmVhZF9zb21lKGIucHJlcGFyZShieXRlc190b19yZWFkKSwgZWMpKTsKLSAgICBpZiAoZWMpCi0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvcj4KLWlubGluZSBzdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBjb25zdCBzdGQ6OnN0cmluZyYgZGVsaW0pCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gcmVhZF91bnRpbChzLCBiLCBkZWxpbSwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVhZF91bnRpbCIpOwotICByZXR1cm4gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci19Ci0KLW5hbWVzcGFjZSBkZXRhaWwKLXsKLSAgLy8gQWxnb3JpdGhtIHRoYXQgZmluZHMgYSBzdWJzZXF1ZW5jZSBvZiBlcXVhbCB2YWx1ZXMgaW4gYSBzZXF1ZW5jZS4gUmV0dXJucwotICAvLyAoaXRlcmF0b3IsdHJ1ZSkgaWYgYSBmdWxsIG1hdGNoIHdhcyBmb3VuZCwgaW4gd2hpY2ggY2FzZSB0aGUgaXRlcmF0b3IKLSAgLy8gcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hdGNoLiBSZXR1cm5zIChpdGVyYXRvcixmYWxzZSkgaWYgYQotICAvLyBwYXJ0aWFsIG1hdGNoIHdhcyBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZQotICAvLyB0aGUgaXRlcmF0b3IgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnRpYWwgbWF0Y2guIFJldHVybnMKLSAgLy8gKGxhc3QxLGZhbHNlKSBpZiBubyBmdWxsIG9yIHBhcnRpYWwgbWF0Y2ggd2FzIGZvdW5kLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3IxLCB0eXBlbmFtZSBJdGVyYXRvcjI+Ci0gIHN0ZDo6cGFpcjxJdGVyYXRvcjEsIGJvb2w+IHBhcnRpYWxfc2VhcmNoKAotICAgICAgSXRlcmF0b3IxIGZpcnN0MSwgSXRlcmF0b3IxIGxhc3QxLCBJdGVyYXRvcjIgZmlyc3QyLCBJdGVyYXRvcjIgbGFzdDIpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yMSBpdGVyMSA9IGZpcnN0MTsgaXRlcjEgIT0gbGFzdDE7ICsraXRlcjEpCi0gICAgewotICAgICAgSXRlcmF0b3IxIHRlc3RfaXRlcjEgPSBpdGVyMTsKLSAgICAgIEl0ZXJhdG9yMiB0ZXN0X2l0ZXIyID0gZmlyc3QyOwotICAgICAgZm9yICg7OyArK3Rlc3RfaXRlcjEsICsrdGVzdF9pdGVyMikKLSAgICAgIHsKLSAgICAgICAgaWYgKHRlc3RfaXRlcjIgPT0gbGFzdDIpCi0gICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXIxLCB0cnVlKTsKLSAgICAgICAgaWYgKHRlc3RfaXRlcjEgPT0gbGFzdDEpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodGVzdF9pdGVyMiAhPSBmaXJzdDIpCi0gICAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcjEsIGZhbHNlKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKnRlc3RfaXRlcjEgIT0gKnRlc3RfaXRlcjIpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihsYXN0MSwgZmFsc2UpOwotICB9Ci19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1zdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBjb25zdCBzdGQ6OnN0cmluZyYgZGVsaW0sCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHN0ZDo6c2l6ZV90IHNlYXJjaF9wb3NpdGlvbiA9IDA7Ci0gIGZvciAoOzspCi0gIHsKLSAgICAvLyBEZXRlcm1pbmUgdGhlIHJhbmdlIG9mIHRoZSBkYXRhIHRvIGJlIHNlYXJjaGVkLgotICAgIHR5cGVkZWYgdHlwZW5hbWUgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPAotICAgICAgQWxsb2NhdG9yPjo6Y29uc3RfYnVmZmVyc190eXBlIGNvbnN0X2J1ZmZlcnNfdHlwZTsKLSAgICB0eXBlZGVmIGFzaW86OmJ1ZmZlcnNfaXRlcmF0b3I8Y29uc3RfYnVmZmVyc190eXBlPiBpdGVyYXRvcjsKLSAgICBjb25zdF9idWZmZXJzX3R5cGUgYnVmZmVycyA9IGIuZGF0YSgpOwotICAgIGl0ZXJhdG9yIGJlZ2luID0gaXRlcmF0b3I6OmJlZ2luKGJ1ZmZlcnMpOwotICAgIGl0ZXJhdG9yIHN0YXJ0X3BvcyA9IGJlZ2luICsgc2VhcmNoX3Bvc2l0aW9uOwotICAgIGl0ZXJhdG9yIGVuZCA9IGl0ZXJhdG9yOjplbmQoYnVmZmVycyk7Ci0KLSAgICAvLyBMb29rIGZvciBhIG1hdGNoLgotICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0gZGV0YWlsOjpwYXJ0aWFsX3NlYXJjaCgKLSAgICAgICAgc3RhcnRfcG9zLCBlbmQsIGRlbGltLmJlZ2luKCksIGRlbGltLmVuZCgpKTsKLSAgICBpZiAocmVzdWx0LmZpcnN0ICE9IGVuZCkKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0LnNlY29uZCkKLSAgICAgIHsKLSAgICAgICAgLy8gRnVsbCBtYXRjaC4gV2UncmUgZG9uZS4KLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQuZmlyc3QgLSBiZWdpbiArIGRlbGltLmxlbmd0aCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBQYXJ0aWFsIG1hdGNoLiBOZXh0IHNlYXJjaCBuZWVkcyB0byBzdGFydCBmcm9tIGJlZ2lubmluZyBvZiBtYXRjaC4KLSAgICAgICAgc2VhcmNoX3Bvc2l0aW9uID0gcmVzdWx0LmZpcnN0IC0gYmVnaW47Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBObyBtYXRjaC4gTmV4dCBzZWFyY2ggY2FuIHN0YXJ0IHdpdGggdGhlIG5ldyBkYXRhLgotICAgICAgc2VhcmNoX3Bvc2l0aW9uID0gZW5kIC0gYmVnaW47Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgYnVmZmVyIGlzIGZ1bGwuCi0gICAgaWYgKGIuc2l6ZSgpID09IGIubWF4X3NpemUoKSkKLSAgICB7Ci0gICAgICBlYyA9IGVycm9yOjpub3RfZm91bmQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBOZWVkIG1vcmUgZGF0YS4KLSAgICBzdGQ6OnNpemVfdCBieXRlc190b19yZWFkID0gcmVhZF9zaXplX2hlbHBlcihiLCA2NTUzNik7Ci0gICAgYi5jb21taXQocy5yZWFkX3NvbWUoYi5wcmVwYXJlKGJ5dGVzX3RvX3JlYWQpLCBlYykpOwotICAgIGlmIChlYykKLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX1JFR0VYKQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvcj4KLWlubGluZSBzdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBjb25zdCBib29zdDo6cmVnZXgmIGV4cHIpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gcmVhZF91bnRpbChzLCBiLCBleHByLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWFkX3VudGlsIik7Ci0gIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1zdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBjb25zdCBib29zdDo6cmVnZXgmIGV4cHIsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHN0ZDo6c2l6ZV90IHNlYXJjaF9wb3NpdGlvbiA9IDA7Ci0gIGZvciAoOzspCi0gIHsKLSAgICAvLyBEZXRlcm1pbmUgdGhlIHJhbmdlIG9mIHRoZSBkYXRhIHRvIGJlIHNlYXJjaGVkLgotICAgIHR5cGVkZWYgdHlwZW5hbWUgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPAotICAgICAgQWxsb2NhdG9yPjo6Y29uc3RfYnVmZmVyc190eXBlIGNvbnN0X2J1ZmZlcnNfdHlwZTsKLSAgICB0eXBlZGVmIGFzaW86OmJ1ZmZlcnNfaXRlcmF0b3I8Y29uc3RfYnVmZmVyc190eXBlPiBpdGVyYXRvcjsKLSAgICBjb25zdF9idWZmZXJzX3R5cGUgYnVmZmVycyA9IGIuZGF0YSgpOwotICAgIGl0ZXJhdG9yIGJlZ2luID0gaXRlcmF0b3I6OmJlZ2luKGJ1ZmZlcnMpOwotICAgIGl0ZXJhdG9yIHN0YXJ0X3BvcyA9IGJlZ2luICsgc2VhcmNoX3Bvc2l0aW9uOwotICAgIGl0ZXJhdG9yIGVuZCA9IGl0ZXJhdG9yOjplbmQoYnVmZmVycyk7Ci0KLSAgICAvLyBMb29rIGZvciBhIG1hdGNoLgotICAgIGJvb3N0OjptYXRjaF9yZXN1bHRzPGl0ZXJhdG9yLAotICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnN1Yl9tYXRjaDxpdGVyYXRvcj4gPjo6YWxsb2NhdG9yX3R5cGU+Ci0gICAgICAgIG1hdGNoX3Jlc3VsdHM7Ci0gICAgaWYgKHJlZ2V4X3NlYXJjaChzdGFydF9wb3MsIGVuZCwgbWF0Y2hfcmVzdWx0cywgZXhwciwKLSAgICAgICAgICBib29zdDo6bWF0Y2hfZGVmYXVsdCB8IGJvb3N0OjptYXRjaF9wYXJ0aWFsKSkKLSAgICB7Ci0gICAgICBpZiAobWF0Y2hfcmVzdWx0c1swXS5tYXRjaGVkKQotICAgICAgewotICAgICAgICAvLyBGdWxsIG1hdGNoLiBXZSdyZSBkb25lLgotICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgICAgcmV0dXJuIG1hdGNoX3Jlc3VsdHNbMF0uc2Vjb25kIC0gYmVnaW47Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFBhcnRpYWwgbWF0Y2guIE5leHQgc2VhcmNoIG5lZWRzIHRvIHN0YXJ0IGZyb20gYmVnaW5uaW5nIG9mIG1hdGNoLgotICAgICAgICBzZWFyY2hfcG9zaXRpb24gPSBtYXRjaF9yZXN1bHRzWzBdLmZpcnN0IC0gYmVnaW47Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBObyBtYXRjaC4gTmV4dCBzZWFyY2ggY2FuIHN0YXJ0IHdpdGggdGhlIG5ldyBkYXRhLgotICAgICAgc2VhcmNoX3Bvc2l0aW9uID0gZW5kIC0gYmVnaW47Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgYnVmZmVyIGlzIGZ1bGwuCi0gICAgaWYgKGIuc2l6ZSgpID09IGIubWF4X3NpemUoKSkKLSAgICB7Ci0gICAgICBlYyA9IGVycm9yOjpub3RfZm91bmQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBOZWVkIG1vcmUgZGF0YS4KLSAgICBzdGQ6OnNpemVfdCBieXRlc190b19yZWFkID0gcmVhZF9zaXplX2hlbHBlcihiLCA2NTUzNik7Ci0gICAgYi5jb21taXQocy5yZWFkX3NvbWUoYi5wcmVwYXJlKGJ5dGVzX3RvX3JlYWQpLCBlYykpOwotICAgIGlmIChlYykKLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX1JFR0VYKQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgTWF0Y2hDb25kaXRpb24+Ci1zdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIE1hdGNoQ29uZGl0aW9uIG1hdGNoX2NvbmRpdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX21hdGNoX2NvbmRpdGlvbjxNYXRjaENvbmRpdGlvbj46OnZhbHVlPjo6dHlwZSopCi17Ci0gIHN0ZDo6c2l6ZV90IHNlYXJjaF9wb3NpdGlvbiA9IDA7Ci0gIGZvciAoOzspCi0gIHsKLSAgICAvLyBEZXRlcm1pbmUgdGhlIHJhbmdlIG9mIHRoZSBkYXRhIHRvIGJlIHNlYXJjaGVkLgotICAgIHR5cGVkZWYgdHlwZW5hbWUgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPAotICAgICAgQWxsb2NhdG9yPjo6Y29uc3RfYnVmZmVyc190eXBlIGNvbnN0X2J1ZmZlcnNfdHlwZTsKLSAgICB0eXBlZGVmIGFzaW86OmJ1ZmZlcnNfaXRlcmF0b3I8Y29uc3RfYnVmZmVyc190eXBlPiBpdGVyYXRvcjsKLSAgICBjb25zdF9idWZmZXJzX3R5cGUgYnVmZmVycyA9IGIuZGF0YSgpOwotICAgIGl0ZXJhdG9yIGJlZ2luID0gaXRlcmF0b3I6OmJlZ2luKGJ1ZmZlcnMpOwotICAgIGl0ZXJhdG9yIHN0YXJ0X3BvcyA9IGJlZ2luICsgc2VhcmNoX3Bvc2l0aW9uOwotICAgIGl0ZXJhdG9yIGVuZCA9IGl0ZXJhdG9yOjplbmQoYnVmZmVycyk7Ci0KLSAgICAvLyBMb29rIGZvciBhIG1hdGNoLgotICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0gbWF0Y2hfY29uZGl0aW9uKHN0YXJ0X3BvcywgZW5kKTsKLSAgICBpZiAocmVzdWx0LnNlY29uZCkKLSAgICB7Ci0gICAgICAvLyBGdWxsIG1hdGNoLiBXZSdyZSBkb25lLgotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0LmZpcnN0IC0gYmVnaW47Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlc3VsdC5maXJzdCAhPSBlbmQpCi0gICAgewotICAgICAgLy8gUGFydGlhbCBtYXRjaC4gTmV4dCBzZWFyY2ggbmVlZHMgdG8gc3RhcnQgZnJvbSBiZWdpbm5pbmcgb2YgbWF0Y2guCi0gICAgICBzZWFyY2hfcG9zaXRpb24gPSByZXN1bHQuZmlyc3QgLSBiZWdpbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIE5vIG1hdGNoLiBOZXh0IHNlYXJjaCBjYW4gc3RhcnQgd2l0aCB0aGUgbmV3IGRhdGEuCi0gICAgICBzZWFyY2hfcG9zaXRpb24gPSBlbmQgLSBiZWdpbjsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBpZiBidWZmZXIgaXMgZnVsbC4KLSAgICBpZiAoYi5zaXplKCkgPT0gYi5tYXhfc2l6ZSgpKQotICAgIHsKLSAgICAgIGVjID0gZXJyb3I6Om5vdF9mb3VuZDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIE5lZWQgbW9yZSBkYXRhLgotICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RvX3JlYWQgPSByZWFkX3NpemVfaGVscGVyKGIsIDY1NTM2KTsKLSAgICBiLmNvbW1pdChzLnJlYWRfc29tZShiLnByZXBhcmUoYnl0ZXNfdG9fcmVhZCksIGVjKSk7Ci0gICAgaWYgKGVjKQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIE1hdGNoQ29uZGl0aW9uPgotaW5saW5lIHN0ZDo6c2l6ZV90IHJlYWRfdW50aWwoU3luY1JlYWRTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsIE1hdGNoQ29uZGl0aW9uIG1hdGNoX2NvbmRpdGlvbiwKLSAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfbWF0Y2hfY29uZGl0aW9uPE1hdGNoQ29uZGl0aW9uPjo6dmFsdWU+Ojp0eXBlKikKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSByZWFkX3VudGlsKHMsIGIsIG1hdGNoX2NvbmRpdGlvbiwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVhZF91bnRpbCIpOwotICByZXR1cm4gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci19Ci0KLW5hbWVzcGFjZSBkZXRhaWwKLXsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgY2xhc3MgcmVhZF91bnRpbF9kZWxpbV9vcAotICB7Ci0gIHB1YmxpYzoKLSAgICByZWFkX3VudGlsX2RlbGltX29wKEFzeW5jUmVhZFN0cmVhbSYgc3RyZWFtLAotICAgICAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgc3RyZWFtYnVmLAotICAgICAgICBjaGFyIGRlbGltLCBSZWFkSGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogc3RyZWFtXyhzdHJlYW0pLAotICAgICAgICBzdHJlYW1idWZfKHN0cmVhbWJ1ZiksCi0gICAgICAgIGRlbGltXyhkZWxpbSksCi0gICAgICAgIHN0YXJ0XygwKSwKLSAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXygwKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKQotICAgIHsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gICAgcmVhZF91bnRpbF9kZWxpbV9vcChjb25zdCByZWFkX3VudGlsX2RlbGltX29wJiBvdGhlcikKLSAgICAgIDogc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgc3RyZWFtYnVmXyhvdGhlci5zdHJlYW1idWZfKSwKLSAgICAgICAgZGVsaW1fKG90aGVyLmRlbGltXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICBzZWFyY2hfcG9zaXRpb25fKG90aGVyLnNlYXJjaF9wb3NpdGlvbl8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgcmVhZF91bnRpbF9kZWxpbV9vcChyZWFkX3VudGlsX2RlbGltX29wJiYgb3RoZXIpCi0gICAgICA6IHN0cmVhbV8ob3RoZXIuc3RyZWFtXyksCi0gICAgICAgIHN0cmVhbWJ1Zl8ob3RoZXIuc3RyZWFtYnVmXyksCi0gICAgICAgIGRlbGltXyhvdGhlci5kZWxpbV8pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyhvdGhlci5zZWFyY2hfcG9zaXRpb25fKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQsIGludCBzdGFydCA9IDApCi0gICAgewotICAgICAgY29uc3Qgc3RkOjpzaXplX3Qgbm90X2ZvdW5kID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgpKCk7Ci0gICAgICBzdGQ6OnNpemVfdCBieXRlc190b19yZWFkOwotICAgICAgc3dpdGNoIChzdGFydF8gPSBzdGFydCkKLSAgICAgIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgcmFuZ2Ugb2YgdGhlIGRhdGEgdG8gYmUgc2VhcmNoZWQuCi0gICAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjwKLSAgICAgICAgICAgICAgQWxsb2NhdG9yPjo6Y29uc3RfYnVmZmVyc190eXBlIGNvbnN0X2J1ZmZlcnNfdHlwZTsKLSAgICAgICAgICAgIHR5cGVkZWYgYXNpbzo6YnVmZmVyc19pdGVyYXRvcjxjb25zdF9idWZmZXJzX3R5cGU+IGl0ZXJhdG9yOwotICAgICAgICAgICAgY29uc3RfYnVmZmVyc190eXBlIGJ1ZmZlcnMgPSBzdHJlYW1idWZfLmRhdGEoKTsKLSAgICAgICAgICAgIGl0ZXJhdG9yIGJlZ2luID0gaXRlcmF0b3I6OmJlZ2luKGJ1ZmZlcnMpOwotICAgICAgICAgICAgaXRlcmF0b3Igc3RhcnRfcG9zID0gYmVnaW4gKyBzZWFyY2hfcG9zaXRpb25fOwotICAgICAgICAgICAgaXRlcmF0b3IgZW5kID0gaXRlcmF0b3I6OmVuZChidWZmZXJzKTsKLQotICAgICAgICAgICAgLy8gTG9vayBmb3IgYSBtYXRjaC4KLSAgICAgICAgICAgIGl0ZXJhdG9yIGl0ZXIgPSBzdGQ6OmZpbmQoc3RhcnRfcG9zLCBlbmQsIGRlbGltXyk7Ci0gICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIEZvdW5kIGEgbWF0Y2guIFdlJ3JlIGRvbmUuCi0gICAgICAgICAgICAgIHNlYXJjaF9wb3NpdGlvbl8gPSBpdGVyIC0gYmVnaW4gKyAxOwotICAgICAgICAgICAgICBieXRlc190b19yZWFkID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm8gbWF0Y2ggeWV0LiBDaGVjayBpZiBidWZmZXIgaXMgZnVsbC4KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbWJ1Zl8uc2l6ZSgpID09IHN0cmVhbWJ1Zl8ubWF4X3NpemUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyA9IG5vdF9mb3VuZDsKLSAgICAgICAgICAgICAgYnl0ZXNfdG9fcmVhZCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gcmVhZCBzb21lIG1vcmUgZGF0YS4KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gTmV4dCBzZWFyY2ggY2FuIHN0YXJ0IHdpdGggdGhlIG5ldyBkYXRhLgotICAgICAgICAgICAgICBzZWFyY2hfcG9zaXRpb25fID0gZW5kIC0gYmVnaW47Ci0gICAgICAgICAgICAgIGJ5dGVzX3RvX3JlYWQgPSByZWFkX3NpemVfaGVscGVyKHN0cmVhbWJ1Zl8sIDY1NTM2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkb25lLgotICAgICAgICAgIGlmICghc3RhcnQgJiYgYnl0ZXNfdG9fcmVhZCA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAvLyBTdGFydCBhIG5ldyBhc3luY2hyb25vdXMgcmVhZCBvcGVyYXRpb24gdG8gb2J0YWluIG1vcmUgZGF0YS4KLSAgICAgICAgICBzdHJlYW1fLmFzeW5jX3JlYWRfc29tZShzdHJlYW1idWZfLnByZXBhcmUoYnl0ZXNfdG9fcmVhZCksCi0gICAgICAgICAgICAgIEFTSU9fTU9WRV9DQVNUKHJlYWRfdW50aWxfZGVsaW1fb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgcmV0dXJuOyBkZWZhdWx0OgotICAgICAgICAgIHN0cmVhbWJ1Zl8uY29tbWl0KGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICAgICAgICBpZiAoZWMgfHwgYnl0ZXNfdHJhbnNmZXJyZWQgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSByZXN1bHRfZWMgPQotICAgICAgICAgIChzZWFyY2hfcG9zaXRpb25fID09IG5vdF9mb3VuZCkKLSAgICAgICAgICA/IGVycm9yOjpub3RfZm91bmQgOiBlYzsKLQotICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCByZXN1bHRfbiA9Ci0gICAgICAgICAgKGVjIHx8IHNlYXJjaF9wb3NpdGlvbl8gPT0gbm90X2ZvdW5kKQotICAgICAgICAgID8gMCA6IHNlYXJjaF9wb3NpdGlvbl87Ci0KLSAgICAgICAgaGFuZGxlcl8ocmVzdWx0X2VjLCByZXN1bHRfbik7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1JlYWRTdHJlYW0mIHN0cmVhbV87Ci0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIHN0cmVhbWJ1Zl87Ci0gICAgY2hhciBkZWxpbV87Ci0gICAgaW50IHN0YXJ0XzsKLSAgICBzdGQ6OnNpemVfdCBzZWFyY2hfcG9zaXRpb25fOwotICAgIFJlYWRIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIHJlYWRfdW50aWxfZGVsaW1fb3A8QXN5bmNSZWFkU3RyZWFtLAotICAgICAgICBBbGxvY2F0b3IsIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgICAgcmVhZF91bnRpbF9kZWxpbV9vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6ZGVhbGxvY2F0ZSgKLSAgICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgICAgcmVhZF91bnRpbF9kZWxpbV9vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gdGhpc19oYW5kbGVyLT5zdGFydF8gPT0gMCA/IHRydWUKLSAgICAgIDogYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKAotICAgICAgICAgIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICAgIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIHJlYWRfdW50aWxfZGVsaW1fb3A8QXN5bmNSZWFkU3RyZWFtLAotICAgICAgICBBbGxvY2F0b3IsIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgICB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2ludm9rZShjb25zdCBGdW5jdGlvbiYgZnVuY3Rpb24sCi0gICAgICByZWFkX3VudGlsX2RlbGltX29wPEFzeW5jUmVhZFN0cmVhbSwKLSAgICAgICAgQWxsb2NhdG9yLCBSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYXN5bmNfcmVhZF91bnRpbChBc3luY1JlYWRTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsIGNoYXIgZGVsaW0sCi0gICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLXsKLSAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBSZWFkSGFuZGxlci4KLSAgQVNJT19SRUFEX0hBTkRMRVJfQ0hFQ0soUmVhZEhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICBSZWFkSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICBkZXRhaWw6OnJlYWRfdW50aWxfZGVsaW1fb3A8QXN5bmNSZWFkU3RyZWFtLAotICAgIEFsbG9jYXRvciwgQVNJT19IQU5ETEVSX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpPigKLSAgICAgICAgcywgYiwgZGVsaW0sIGluaXQuaGFuZGxlcikoCi0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAwLCAxKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLW5hbWVzcGFjZSBkZXRhaWwKLXsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgY2xhc3MgcmVhZF91bnRpbF9kZWxpbV9zdHJpbmdfb3AKLSAgewotICBwdWJsaWM6Ci0gICAgcmVhZF91bnRpbF9kZWxpbV9zdHJpbmdfb3AoQXN5bmNSZWFkU3RyZWFtJiBzdHJlYW0sCi0gICAgICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBzdHJlYW1idWYsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWxpbSwgUmVhZEhhbmRsZXImIGhhbmRsZXIpCi0gICAgICA6IHN0cmVhbV8oc3RyZWFtKSwKLSAgICAgICAgc3RyZWFtYnVmXyhzdHJlYW1idWYpLAotICAgICAgICBkZWxpbV8oZGVsaW0pLAotICAgICAgICBzdGFydF8oMCksCi0gICAgICAgIHNlYXJjaF9wb3NpdGlvbl8oMCksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSkKLSAgICB7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAgIHJlYWRfdW50aWxfZGVsaW1fc3RyaW5nX29wKGNvbnN0IHJlYWRfdW50aWxfZGVsaW1fc3RyaW5nX29wJiBvdGhlcikKLSAgICAgIDogc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgc3RyZWFtYnVmXyhvdGhlci5zdHJlYW1idWZfKSwKLSAgICAgICAgZGVsaW1fKG90aGVyLmRlbGltXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICBzZWFyY2hfcG9zaXRpb25fKG90aGVyLnNlYXJjaF9wb3NpdGlvbl8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgcmVhZF91bnRpbF9kZWxpbV9zdHJpbmdfb3AocmVhZF91bnRpbF9kZWxpbV9zdHJpbmdfb3AmJiBvdGhlcikKLSAgICAgIDogc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgc3RyZWFtYnVmXyhvdGhlci5zdHJlYW1idWZfKSwKLSAgICAgICAgZGVsaW1fKEFTSU9fTU9WRV9DQVNUKHN0ZDo6c3RyaW5nKShvdGhlci5kZWxpbV8pKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHNlYXJjaF9wb3NpdGlvbl8ob3RoZXIuc2VhcmNoX3Bvc2l0aW9uXyksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShvdGhlci5oYW5kbGVyXykpCi0gICAgewotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLSAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkLCBpbnQgc3RhcnQgPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IG5vdF9mb3VuZCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHN0ZDo6c2l6ZV90Pjo6bWF4KSgpOwotICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdG9fcmVhZDsKLSAgICAgIHN3aXRjaCAoc3RhcnRfID0gc3RhcnQpCi0gICAgICB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHJhbmdlIG9mIHRoZSBkYXRhIHRvIGJlIHNlYXJjaGVkLgotICAgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhc2lvOjpiYXNpY19zdHJlYW1idWY8Ci0gICAgICAgICAgICAgIEFsbG9jYXRvcj46OmNvbnN0X2J1ZmZlcnNfdHlwZSBjb25zdF9idWZmZXJzX3R5cGU7Ci0gICAgICAgICAgICB0eXBlZGVmIGFzaW86OmJ1ZmZlcnNfaXRlcmF0b3I8Y29uc3RfYnVmZmVyc190eXBlPiBpdGVyYXRvcjsKLSAgICAgICAgICAgIGNvbnN0X2J1ZmZlcnNfdHlwZSBidWZmZXJzID0gc3RyZWFtYnVmXy5kYXRhKCk7Ci0gICAgICAgICAgICBpdGVyYXRvciBiZWdpbiA9IGl0ZXJhdG9yOjpiZWdpbihidWZmZXJzKTsKLSAgICAgICAgICAgIGl0ZXJhdG9yIHN0YXJ0X3BvcyA9IGJlZ2luICsgc2VhcmNoX3Bvc2l0aW9uXzsKLSAgICAgICAgICAgIGl0ZXJhdG9yIGVuZCA9IGl0ZXJhdG9yOjplbmQoYnVmZmVycyk7Ci0KLSAgICAgICAgICAgIC8vIExvb2sgZm9yIGEgbWF0Y2guCi0gICAgICAgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IHJlc3VsdCA9IGRldGFpbDo6cGFydGlhbF9zZWFyY2goCi0gICAgICAgICAgICAgICAgc3RhcnRfcG9zLCBlbmQsIGRlbGltXy5iZWdpbigpLCBkZWxpbV8uZW5kKCkpOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCAhPSBlbmQgJiYgcmVzdWx0LnNlY29uZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gRnVsbCBtYXRjaC4gV2UncmUgZG9uZS4KLSAgICAgICAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyA9IHJlc3VsdC5maXJzdCAtIGJlZ2luICsgZGVsaW1fLmxlbmd0aCgpOwotICAgICAgICAgICAgICBieXRlc190b19yZWFkID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm8gbWF0Y2ggeWV0LiBDaGVjayBpZiBidWZmZXIgaXMgZnVsbC4KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbWJ1Zl8uc2l6ZSgpID09IHN0cmVhbWJ1Zl8ubWF4X3NpemUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyA9IG5vdF9mb3VuZDsKLSAgICAgICAgICAgICAgYnl0ZXNfdG9fcmVhZCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gcmVhZCBzb21lIG1vcmUgZGF0YS4KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCAhPSBlbmQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBQYXJ0aWFsIG1hdGNoLiBOZXh0IHNlYXJjaCBuZWVkcyB0byBzdGFydCBmcm9tIGJlZ2lubmluZyBvZgotICAgICAgICAgICAgICAgIC8vIG1hdGNoLgotICAgICAgICAgICAgICAgIHNlYXJjaF9wb3NpdGlvbl8gPSByZXN1bHQuZmlyc3QgLSBiZWdpbjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBOZXh0IHNlYXJjaCBjYW4gc3RhcnQgd2l0aCB0aGUgbmV3IGRhdGEuCi0gICAgICAgICAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyA9IGVuZCAtIGJlZ2luOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgYnl0ZXNfdG9fcmVhZCA9IHJlYWRfc2l6ZV9oZWxwZXIoc3RyZWFtYnVmXywgNjU1MzYpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGRvbmUuCi0gICAgICAgICAgaWYgKCFzdGFydCAmJiBieXRlc190b19yZWFkID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IGFzeW5jaHJvbm91cyByZWFkIG9wZXJhdGlvbiB0byBvYnRhaW4gbW9yZSBkYXRhLgotICAgICAgICAgIHN0cmVhbV8uYXN5bmNfcmVhZF9zb21lKHN0cmVhbWJ1Zl8ucHJlcGFyZShieXRlc190b19yZWFkKSwKLSAgICAgICAgICAgICAgQVNJT19NT1ZFX0NBU1QocmVhZF91bnRpbF9kZWxpbV9zdHJpbmdfb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgcmV0dXJuOyBkZWZhdWx0OgotICAgICAgICAgIHN0cmVhbWJ1Zl8uY29tbWl0KGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICAgICAgICBpZiAoZWMgfHwgYnl0ZXNfdHJhbnNmZXJyZWQgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSByZXN1bHRfZWMgPQotICAgICAgICAgIChzZWFyY2hfcG9zaXRpb25fID09IG5vdF9mb3VuZCkKLSAgICAgICAgICA/IGVycm9yOjpub3RfZm91bmQgOiBlYzsKLQotICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCByZXN1bHRfbiA9Ci0gICAgICAgICAgKGVjIHx8IHNlYXJjaF9wb3NpdGlvbl8gPT0gbm90X2ZvdW5kKQotICAgICAgICAgID8gMCA6IHNlYXJjaF9wb3NpdGlvbl87Ci0KLSAgICAgICAgaGFuZGxlcl8ocmVzdWx0X2VjLCByZXN1bHRfbik7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1JlYWRTdHJlYW0mIHN0cmVhbV87Ci0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIHN0cmVhbWJ1Zl87Ci0gICAgc3RkOjpzdHJpbmcgZGVsaW1fOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3Qgc2VhcmNoX3Bvc2l0aW9uXzsKLSAgICBSZWFkSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCogYXNpb19oYW5kbGVyX2FsbG9jYXRlKHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgICByZWFkX3VudGlsX2RlbGltX3N0cmluZ19vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9kZWFsbG9jYXRlKHZvaWQqIHBvaW50ZXIsIHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgICByZWFkX3VudGlsX2RlbGltX3N0cmluZ19vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6ZGVhbGxvY2F0ZSgKLSAgICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgICAgcmVhZF91bnRpbF9kZWxpbV9zdHJpbmdfb3A8QXN5bmNSZWFkU3RyZWFtLAotICAgICAgICBBbGxvY2F0b3IsIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIHRoaXNfaGFuZGxlci0+c3RhcnRfID09IDAgPyB0cnVlCi0gICAgICA6IGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbigKLSAgICAgICAgICB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLAotICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2ludm9rZShGdW5jdGlvbiYgZnVuY3Rpb24sCi0gICAgICByZWFkX3VudGlsX2RlbGltX3N0cmluZ19vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sCi0gICAgICB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIHJlYWRfdW50aWxfZGVsaW1fc3RyaW5nX29wPEFzeW5jUmVhZFN0cmVhbSwKLSAgICAgICAgQWxsb2NhdG9yLCBSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYXN5bmNfcmVhZF91bnRpbChBc3luY1JlYWRTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWxpbSwKLSAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotCi0gIGRldGFpbDo6cmVhZF91bnRpbF9kZWxpbV9zdHJpbmdfb3A8QXN5bmNSZWFkU3RyZWFtLAotICAgIEFsbG9jYXRvciwgQVNJT19IQU5ETEVSX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpPigKLSAgICAgICAgcywgYiwgZGVsaW0sIGluaXQuaGFuZGxlcikoCi0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAwLCAxKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX1JFR0VYKQotCi1uYW1lc3BhY2UgZGV0YWlsCi17Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICAgIHR5cGVuYW1lIFJlZ0V4LCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgY2xhc3MgcmVhZF91bnRpbF9leHByX29wCi0gIHsKLSAgcHVibGljOgotICAgIHJlYWRfdW50aWxfZXhwcl9vcChBc3luY1JlYWRTdHJlYW0mIHN0cmVhbSwKLSAgICAgICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIHN0cmVhbWJ1ZiwKLSAgICAgICAgY29uc3QgYm9vc3Q6OnJlZ2V4JiBleHByLCBSZWFkSGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogc3RyZWFtXyhzdHJlYW0pLAotICAgICAgICBzdHJlYW1idWZfKHN0cmVhbWJ1ZiksCi0gICAgICAgIGV4cHJfKGV4cHIpLAotICAgICAgICBzdGFydF8oMCksCi0gICAgICAgIHNlYXJjaF9wb3NpdGlvbl8oMCksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSkKLSAgICB7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAgIHJlYWRfdW50aWxfZXhwcl9vcChjb25zdCByZWFkX3VudGlsX2V4cHJfb3AmIG90aGVyKQotICAgICAgOiBzdHJlYW1fKG90aGVyLnN0cmVhbV8pLAotICAgICAgICBzdHJlYW1idWZfKG90aGVyLnN0cmVhbWJ1Zl8pLAotICAgICAgICBleHByXyhvdGhlci5leHByXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICBzZWFyY2hfcG9zaXRpb25fKG90aGVyLnNlYXJjaF9wb3NpdGlvbl8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgcmVhZF91bnRpbF9leHByX29wKHJlYWRfdW50aWxfZXhwcl9vcCYmIG90aGVyKQotICAgICAgOiBzdHJlYW1fKG90aGVyLnN0cmVhbV8pLAotICAgICAgICBzdHJlYW1idWZfKG90aGVyLnN0cmVhbWJ1Zl8pLAotICAgICAgICBleHByXyhvdGhlci5leHByXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICBzZWFyY2hfcG9zaXRpb25fKG90aGVyLnNlYXJjaF9wb3NpdGlvbl8pLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgIHsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCwgaW50IHN0YXJ0ID0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBzdGQ6OnNpemVfdCBub3RfZm91bmQgPSAoc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnNpemVfdD46Om1heCkoKTsKLSAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RvX3JlYWQ7Ci0gICAgICBzd2l0Y2ggKHN0YXJ0XyA9IHN0YXJ0KQotICAgICAgewotICAgICAgY2FzZSAxOgotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgewotICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSByYW5nZSBvZiB0aGUgZGF0YSB0byBiZSBzZWFyY2hlZC4KLSAgICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPAotICAgICAgICAgICAgICBBbGxvY2F0b3I+Ojpjb25zdF9idWZmZXJzX3R5cGUgY29uc3RfYnVmZmVyc190eXBlOwotICAgICAgICAgICAgdHlwZWRlZiBhc2lvOjpidWZmZXJzX2l0ZXJhdG9yPGNvbnN0X2J1ZmZlcnNfdHlwZT4gaXRlcmF0b3I7Ci0gICAgICAgICAgICBjb25zdF9idWZmZXJzX3R5cGUgYnVmZmVycyA9IHN0cmVhbWJ1Zl8uZGF0YSgpOwotICAgICAgICAgICAgaXRlcmF0b3IgYmVnaW4gPSBpdGVyYXRvcjo6YmVnaW4oYnVmZmVycyk7Ci0gICAgICAgICAgICBpdGVyYXRvciBzdGFydF9wb3MgPSBiZWdpbiArIHNlYXJjaF9wb3NpdGlvbl87Ci0gICAgICAgICAgICBpdGVyYXRvciBlbmQgPSBpdGVyYXRvcjo6ZW5kKGJ1ZmZlcnMpOwotCi0gICAgICAgICAgICAvLyBMb29rIGZvciBhIG1hdGNoLgotICAgICAgICAgICAgYm9vc3Q6Om1hdGNoX3Jlc3VsdHM8aXRlcmF0b3IsCi0gICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPGJvb3N0OjpzdWJfbWF0Y2g8aXRlcmF0b3I+ID46OmFsbG9jYXRvcl90eXBlPgotICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM7Ci0gICAgICAgICAgICBib29sIG1hdGNoID0gcmVnZXhfc2VhcmNoKHN0YXJ0X3BvcywgZW5kLCBtYXRjaF9yZXN1bHRzLCBleHByXywKLSAgICAgICAgICAgICAgICBib29zdDo6bWF0Y2hfZGVmYXVsdCB8IGJvb3N0OjptYXRjaF9wYXJ0aWFsKTsKLSAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaF9yZXN1bHRzWzBdLm1hdGNoZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIEZ1bGwgbWF0Y2guIFdlJ3JlIGRvbmUuCi0gICAgICAgICAgICAgIHNlYXJjaF9wb3NpdGlvbl8gPSBtYXRjaF9yZXN1bHRzWzBdLnNlY29uZCAtIGJlZ2luOwotICAgICAgICAgICAgICBieXRlc190b19yZWFkID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm8gbWF0Y2ggeWV0LiBDaGVjayBpZiBidWZmZXIgaXMgZnVsbC4KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbWJ1Zl8uc2l6ZSgpID09IHN0cmVhbWJ1Zl8ubWF4X3NpemUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyA9IG5vdF9mb3VuZDsKLSAgICAgICAgICAgICAgYnl0ZXNfdG9fcmVhZCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gcmVhZCBzb21lIG1vcmUgZGF0YS4KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG1hdGNoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gUGFydGlhbCBtYXRjaC4gTmV4dCBzZWFyY2ggbmVlZHMgdG8gc3RhcnQgZnJvbSBiZWdpbm5pbmcgb2YKLSAgICAgICAgICAgICAgICAvLyBtYXRjaC4KLSAgICAgICAgICAgICAgICBzZWFyY2hfcG9zaXRpb25fID0gbWF0Y2hfcmVzdWx0c1swXS5maXJzdCAtIGJlZ2luOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE5leHQgc2VhcmNoIGNhbiBzdGFydCB3aXRoIHRoZSBuZXcgZGF0YS4KLSAgICAgICAgICAgICAgICBzZWFyY2hfcG9zaXRpb25fID0gZW5kIC0gYmVnaW47Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBieXRlc190b19yZWFkID0gcmVhZF9zaXplX2hlbHBlcihzdHJlYW1idWZfLCA2NTUzNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZG9uZS4KLSAgICAgICAgICBpZiAoIXN0YXJ0ICYmIGJ5dGVzX3RvX3JlYWQgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgLy8gU3RhcnQgYSBuZXcgYXN5bmNocm9ub3VzIHJlYWQgb3BlcmF0aW9uIHRvIG9idGFpbiBtb3JlIGRhdGEuCi0gICAgICAgICAgc3RyZWFtXy5hc3luY19yZWFkX3NvbWUoc3RyZWFtYnVmXy5wcmVwYXJlKGJ5dGVzX3RvX3JlYWQpLAotICAgICAgICAgICAgICBBU0lPX01PVkVfQ0FTVChyZWFkX3VudGlsX2V4cHJfb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgcmV0dXJuOyBkZWZhdWx0OgotICAgICAgICAgIHN0cmVhbWJ1Zl8uY29tbWl0KGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICAgICAgICBpZiAoZWMgfHwgYnl0ZXNfdHJhbnNmZXJyZWQgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSByZXN1bHRfZWMgPQotICAgICAgICAgIChzZWFyY2hfcG9zaXRpb25fID09IG5vdF9mb3VuZCkKLSAgICAgICAgICA/IGVycm9yOjpub3RfZm91bmQgOiBlYzsKLQotICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCByZXN1bHRfbiA9Ci0gICAgICAgICAgKGVjIHx8IHNlYXJjaF9wb3NpdGlvbl8gPT0gbm90X2ZvdW5kKQotICAgICAgICAgID8gMCA6IHNlYXJjaF9wb3NpdGlvbl87Ci0KLSAgICAgICAgaGFuZGxlcl8ocmVzdWx0X2VjLCByZXN1bHRfbik7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1JlYWRTdHJlYW0mIHN0cmVhbV87Ci0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIHN0cmVhbWJ1Zl87Ci0gICAgUmVnRXggZXhwcl87Ci0gICAgaW50IHN0YXJ0XzsKLSAgICBzdGQ6OnNpemVfdCBzZWFyY2hfcG9zaXRpb25fOwotICAgIFJlYWRIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICAgIHR5cGVuYW1lIFJlZ0V4LCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQqIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzdGQ6OnNpemVfdCBzaXplLAotICAgICAgcmVhZF91bnRpbF9leHByX29wPEFzeW5jUmVhZFN0cmVhbSwKLSAgICAgICAgQWxsb2NhdG9yLCBSZWdFeCwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICAgIHR5cGVuYW1lIFJlZ0V4LCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUodm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIHJlYWRfdW50aWxfZXhwcl9vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgUmVnRXgsIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmRlYWxsb2NhdGUoCi0gICAgICAgIHBvaW50ZXIsIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgICAgdHlwZW5hbWUgUmVnRXgsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgICAgcmVhZF91bnRpbF9leHByX29wPEFzeW5jUmVhZFN0cmVhbSwKLSAgICAgICAgQWxsb2NhdG9yLCBSZWdFeCwgUmVhZEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gdGhpc19oYW5kbGVyLT5zdGFydF8gPT0gMCA/IHRydWUKLSAgICAgIDogYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKAotICAgICAgICAgIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICAgIHR5cGVuYW1lIFJlZ0V4LCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2ludm9rZShGdW5jdGlvbiYgZnVuY3Rpb24sCi0gICAgICByZWFkX3VudGlsX2V4cHJfb3A8QXN5bmNSZWFkU3RyZWFtLAotICAgICAgICBBbGxvY2F0b3IsIFJlZ0V4LCBSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgICAgdHlwZW5hbWUgUmVnRXgsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIHJlYWRfdW50aWxfZXhwcl9vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgUmVnRXgsIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci1BU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkX3VudGlsKEFzeW5jUmVhZFN0cmVhbSYgcywKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwgY29uc3QgYm9vc3Q6OnJlZ2V4JiBleHByLAotICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgUmVhZEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgZGV0YWlsOjpyZWFkX3VudGlsX2V4cHJfb3A8QXN5bmNSZWFkU3RyZWFtLCBBbGxvY2F0b3IsCi0gICAgYm9vc3Q6OnJlZ2V4LCBBU0lPX0hBTkRMRVJfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSk+KAotICAgICAgICBzLCBiLCBleHByLCBpbml0LmhhbmRsZXIpKAotICAgICAgICAgIGFzaW86OmVycm9yX2NvZGUoKSwgMCwgMSk7Ci0KLSAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotfQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19CT09TVF9SRUdFWCkKLQotbmFtZXNwYWNlIGRldGFpbAotewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgICB0eXBlbmFtZSBNYXRjaENvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGNsYXNzIHJlYWRfdW50aWxfbWF0Y2hfb3AKLSAgewotICBwdWJsaWM6Ci0gICAgcmVhZF91bnRpbF9tYXRjaF9vcChBc3luY1JlYWRTdHJlYW0mIHN0cmVhbSwKLSAgICAgICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIHN0cmVhbWJ1ZiwKLSAgICAgICAgTWF0Y2hDb25kaXRpb24gbWF0Y2hfY29uZGl0aW9uLCBSZWFkSGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogc3RyZWFtXyhzdHJlYW0pLAotICAgICAgICBzdHJlYW1idWZfKHN0cmVhbWJ1ZiksCi0gICAgICAgIG1hdGNoX2NvbmRpdGlvbl8obWF0Y2hfY29uZGl0aW9uKSwKLSAgICAgICAgc3RhcnRfKDApLAotICAgICAgICBzZWFyY2hfcG9zaXRpb25fKDApLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICByZWFkX3VudGlsX21hdGNoX29wKGNvbnN0IHJlYWRfdW50aWxfbWF0Y2hfb3AmIG90aGVyKQotICAgICAgOiBzdHJlYW1fKG90aGVyLnN0cmVhbV8pLAotICAgICAgICBzdHJlYW1idWZfKG90aGVyLnN0cmVhbWJ1Zl8pLAotICAgICAgICBtYXRjaF9jb25kaXRpb25fKG90aGVyLm1hdGNoX2NvbmRpdGlvbl8pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyhvdGhlci5zZWFyY2hfcG9zaXRpb25fKSwKLSAgICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gICAgewotICAgIH0KLQotICAgIHJlYWRfdW50aWxfbWF0Y2hfb3AocmVhZF91bnRpbF9tYXRjaF9vcCYmIG90aGVyKQotICAgICAgOiBzdHJlYW1fKG90aGVyLnN0cmVhbV8pLAotICAgICAgICBzdHJlYW1idWZfKG90aGVyLnN0cmVhbWJ1Zl8pLAotICAgICAgICBtYXRjaF9jb25kaXRpb25fKG90aGVyLm1hdGNoX2NvbmRpdGlvbl8pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyhvdGhlci5zZWFyY2hfcG9zaXRpb25fKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQsIGludCBzdGFydCA9IDApCi0gICAgewotICAgICAgY29uc3Qgc3RkOjpzaXplX3Qgbm90X2ZvdW5kID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgpKCk7Ci0gICAgICBzdGQ6OnNpemVfdCBieXRlc190b19yZWFkOwotICAgICAgc3dpdGNoIChzdGFydF8gPSBzdGFydCkKLSAgICAgIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgcmFuZ2Ugb2YgdGhlIGRhdGEgdG8gYmUgc2VhcmNoZWQuCi0gICAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjwKLSAgICAgICAgICAgICAgQWxsb2NhdG9yPjo6Y29uc3RfYnVmZmVyc190eXBlIGNvbnN0X2J1ZmZlcnNfdHlwZTsKLSAgICAgICAgICAgIHR5cGVkZWYgYXNpbzo6YnVmZmVyc19pdGVyYXRvcjxjb25zdF9idWZmZXJzX3R5cGU+IGl0ZXJhdG9yOwotICAgICAgICAgICAgY29uc3RfYnVmZmVyc190eXBlIGJ1ZmZlcnMgPSBzdHJlYW1idWZfLmRhdGEoKTsKLSAgICAgICAgICAgIGl0ZXJhdG9yIGJlZ2luID0gaXRlcmF0b3I6OmJlZ2luKGJ1ZmZlcnMpOwotICAgICAgICAgICAgaXRlcmF0b3Igc3RhcnRfcG9zID0gYmVnaW4gKyBzZWFyY2hfcG9zaXRpb25fOwotICAgICAgICAgICAgaXRlcmF0b3IgZW5kID0gaXRlcmF0b3I6OmVuZChidWZmZXJzKTsKLQotICAgICAgICAgICAgLy8gTG9vayBmb3IgYSBtYXRjaC4KLSAgICAgICAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0gbWF0Y2hfY29uZGl0aW9uXyhzdGFydF9wb3MsIGVuZCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gRnVsbCBtYXRjaC4gV2UncmUgZG9uZS4KLSAgICAgICAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyA9IHJlc3VsdC5maXJzdCAtIGJlZ2luOwotICAgICAgICAgICAgICBieXRlc190b19yZWFkID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm8gbWF0Y2ggeWV0LiBDaGVjayBpZiBidWZmZXIgaXMgZnVsbC4KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbWJ1Zl8uc2l6ZSgpID09IHN0cmVhbWJ1Zl8ubWF4X3NpemUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyA9IG5vdF9mb3VuZDsKLSAgICAgICAgICAgICAgYnl0ZXNfdG9fcmVhZCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gcmVhZCBzb21lIG1vcmUgZGF0YS4KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCAhPSBlbmQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBQYXJ0aWFsIG1hdGNoLiBOZXh0IHNlYXJjaCBuZWVkcyB0byBzdGFydCBmcm9tIGJlZ2lubmluZyBvZgotICAgICAgICAgICAgICAgIC8vIG1hdGNoLgotICAgICAgICAgICAgICAgIHNlYXJjaF9wb3NpdGlvbl8gPSByZXN1bHQuZmlyc3QgLSBiZWdpbjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBOZXh0IHNlYXJjaCBjYW4gc3RhcnQgd2l0aCB0aGUgbmV3IGRhdGEuCi0gICAgICAgICAgICAgICAgc2VhcmNoX3Bvc2l0aW9uXyA9IGVuZCAtIGJlZ2luOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgYnl0ZXNfdG9fcmVhZCA9IHJlYWRfc2l6ZV9oZWxwZXIoc3RyZWFtYnVmXywgNjU1MzYpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGRvbmUuCi0gICAgICAgICAgaWYgKCFzdGFydCAmJiBieXRlc190b19yZWFkID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IGFzeW5jaHJvbm91cyByZWFkIG9wZXJhdGlvbiB0byBvYnRhaW4gbW9yZSBkYXRhLgotICAgICAgICAgIHN0cmVhbV8uYXN5bmNfcmVhZF9zb21lKHN0cmVhbWJ1Zl8ucHJlcGFyZShieXRlc190b19yZWFkKSwKLSAgICAgICAgICAgICAgQVNJT19NT1ZFX0NBU1QocmVhZF91bnRpbF9tYXRjaF9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgc3RyZWFtYnVmXy5jb21taXQoYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgICAgICAgIGlmIChlYyB8fCBieXRlc190cmFuc2ZlcnJlZCA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlIHJlc3VsdF9lYyA9Ci0gICAgICAgICAgKHNlYXJjaF9wb3NpdGlvbl8gPT0gbm90X2ZvdW5kKQotICAgICAgICAgID8gZXJyb3I6Om5vdF9mb3VuZCA6IGVjOwotCi0gICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IHJlc3VsdF9uID0KLSAgICAgICAgICAoZWMgfHwgc2VhcmNoX3Bvc2l0aW9uXyA9PSBub3RfZm91bmQpCi0gICAgICAgICAgPyAwIDogc2VhcmNoX3Bvc2l0aW9uXzsKLQotICAgICAgICBoYW5kbGVyXyhyZXN1bHRfZWMsIHJlc3VsdF9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLy9wcml2YXRlOgotICAgIEFzeW5jUmVhZFN0cmVhbSYgc3RyZWFtXzsKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgc3RyZWFtYnVmXzsKLSAgICBNYXRjaENvbmRpdGlvbiBtYXRjaF9jb25kaXRpb25fOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3Qgc2VhcmNoX3Bvc2l0aW9uXzsKLSAgICBSZWFkSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgICB0eXBlbmFtZSBNYXRjaENvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIHJlYWRfdW50aWxfbWF0Y2hfb3A8QXN5bmNSZWFkU3RyZWFtLAotICAgICAgICBBbGxvY2F0b3IsIE1hdGNoQ29uZGl0aW9uLCBSZWFkSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIHJldHVybiBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgICAgdHlwZW5hbWUgTWF0Y2hDb25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgICAgcmVhZF91bnRpbF9tYXRjaF9vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgTWF0Y2hDb25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmRlYWxsb2NhdGUoCi0gICAgICAgIHBvaW50ZXIsIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgICAgdHlwZW5hbWUgTWF0Y2hDb25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBpbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgICAgcmVhZF91bnRpbF9tYXRjaF9vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgTWF0Y2hDb25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIHRoaXNfaGFuZGxlci0+c3RhcnRfID09IDAgPyB0cnVlCi0gICAgICA6IGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbigKLSAgICAgICAgICB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgICB0eXBlbmFtZSBNYXRjaENvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgcmVhZF91bnRpbF9tYXRjaF9vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgTWF0Y2hDb25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgICB0eXBlbmFtZSBNYXRjaENvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgcmVhZF91bnRpbF9tYXRjaF9vcDxBc3luY1JlYWRTdHJlYW0sCi0gICAgICAgIEFsbG9jYXRvciwgTWF0Y2hDb25kaXRpb24sIFJlYWRIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBNYXRjaENvbmRpdGlvbiwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci1BU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkX3VudGlsKEFzeW5jUmVhZFN0cmVhbSYgcywKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwKLSAgICBNYXRjaENvbmRpdGlvbiBtYXRjaF9jb25kaXRpb24sIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIsCi0gICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX21hdGNoX2NvbmRpdGlvbjxNYXRjaENvbmRpdGlvbj46OnZhbHVlPjo6dHlwZSopCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgUmVhZEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgZGV0YWlsOjpyZWFkX3VudGlsX21hdGNoX29wPEFzeW5jUmVhZFN0cmVhbSwgQWxsb2NhdG9yLAotICAgIE1hdGNoQ29uZGl0aW9uLCBBU0lPX0hBTkRMRVJfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSk+KAotICAgICAgICBzLCBiLCBtYXRjaF9jb25kaXRpb24sIGluaXQuaGFuZGxlcikoCi0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAwLCAxKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSU1QTF9SRUFEX1VOVElMX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvc2VyaWFsX3BvcnRfYmFzZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9zZXJpYWxfcG9ydF9iYXNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiOGNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9zZXJpYWxfcG9ydF9iYXNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vCi0vLyBpbXBsL3NlcmlhbF9wb3J0X2Jhc2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDggUmVwIEludmFyaWFudCBTeXN0ZW1zLCBJbmMuIChpbmZvQHJlcGludmFyaWFudC5jb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSU1QTF9TRVJJQUxfUE9SVF9CQVNFX0hQUAotI2RlZmluZSBBU0lPX0lNUExfU0VSSUFMX1BPUlRfQkFTRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi1pbmxpbmUgc2VyaWFsX3BvcnRfYmFzZTo6YmF1ZF9yYXRlOjpiYXVkX3JhdGUodW5zaWduZWQgaW50IHJhdGUpCi0gIDogdmFsdWVfKHJhdGUpCi17Ci19Ci0KLWlubGluZSB1bnNpZ25lZCBpbnQgc2VyaWFsX3BvcnRfYmFzZTo6YmF1ZF9yYXRlOjp2YWx1ZSgpIGNvbnN0Ci17Ci0gIHJldHVybiB2YWx1ZV87Ci19Ci0KLWlubGluZSBzZXJpYWxfcG9ydF9iYXNlOjpmbG93X2NvbnRyb2w6OnR5cGUKLXNlcmlhbF9wb3J0X2Jhc2U6OmZsb3dfY29udHJvbDo6dmFsdWUoKSBjb25zdAotewotICByZXR1cm4gdmFsdWVfOwotfQotCi1pbmxpbmUgc2VyaWFsX3BvcnRfYmFzZTo6cGFyaXR5Ojp0eXBlIHNlcmlhbF9wb3J0X2Jhc2U6OnBhcml0eTo6dmFsdWUoKSBjb25zdAotewotICByZXR1cm4gdmFsdWVfOwotfQotCi1pbmxpbmUgc2VyaWFsX3BvcnRfYmFzZTo6c3RvcF9iaXRzOjp0eXBlCi1zZXJpYWxfcG9ydF9iYXNlOjpzdG9wX2JpdHM6OnZhbHVlKCkgY29uc3QKLXsKLSAgcmV0dXJuIHZhbHVlXzsKLX0KLQotaW5saW5lIHVuc2lnbmVkIGludCBzZXJpYWxfcG9ydF9iYXNlOjpjaGFyYWN0ZXJfc2l6ZTo6dmFsdWUoKSBjb25zdAotewotICByZXR1cm4gdmFsdWVfOwotfQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0lNUExfU0VSSUFMX1BPUlRfQkFTRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3NlcmlhbF9wb3J0X2Jhc2UuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvc2VyaWFsX3BvcnRfYmFzZS5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzA2ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvc2VyaWFsX3BvcnRfYmFzZS5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLy8KLS8vIGltcGwvc2VyaWFsX3BvcnRfYmFzZS5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vIENvcHlyaWdodCAoYykgMjAwOCBSZXAgSW52YXJpYW50IFN5c3RlbXMsIEluYy4gKGluZm9AcmVwaW52YXJpYW50LmNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JTVBMX1NFUklBTF9QT1JUX0JBU0VfSVBQCi0jZGVmaW5lIEFTSU9fSU1QTF9TRVJJQUxfUE9SVF9CQVNFX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TRVJJQUxfUE9SVCkKLQotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NlcmlhbF9wb3J0X2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2V4Y2VwdGlvbi5ocHAiCi0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSMgZGVmaW5lIEFTSU9fT1BUSU9OX1NUT1JBR0UgaW1wbGVtZW50YXRpb25fZGVmaW5lZAotI2VsaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSMgZGVmaW5lIEFTSU9fT1BUSU9OX1NUT1JBR0UgRENCCi0jZWxzZQotIyBkZWZpbmUgQVNJT19PUFRJT05fU1RPUkFHRSB0ZXJtaW9zCi0jZW5kaWYKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotYXNpbzo6ZXJyb3JfY29kZSBzZXJpYWxfcG9ydF9iYXNlOjpiYXVkX3JhdGU6OnN0b3JlKAotICAgIEFTSU9fT1BUSU9OX1NUT1JBR0UmIHN0b3JhZ2UsIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotewotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIHN0b3JhZ2UuQmF1ZFJhdGUgPSB2YWx1ZV87Ci0jZWxzZQotICBzcGVlZF90IGJhdWQ7Ci0gIHN3aXRjaCAodmFsdWVfKQotICB7Ci0gIC8vIERvIFBPU0lYLXNwZWNpZmllZCByYXRlcyBmaXJzdC4KLSAgY2FzZSAwOiBiYXVkID0gQjA7IGJyZWFrOwotICBjYXNlIDUwOiBiYXVkID0gQjUwOyBicmVhazsKLSAgY2FzZSA3NTogYmF1ZCA9IEI3NTsgYnJlYWs7Ci0gIGNhc2UgMTEwOiBiYXVkID0gQjExMDsgYnJlYWs7Ci0gIGNhc2UgMTM0OiBiYXVkID0gQjEzNDsgYnJlYWs7Ci0gIGNhc2UgMTUwOiBiYXVkID0gQjE1MDsgYnJlYWs7Ci0gIGNhc2UgMjAwOiBiYXVkID0gQjIwMDsgYnJlYWs7Ci0gIGNhc2UgMzAwOiBiYXVkID0gQjMwMDsgYnJlYWs7Ci0gIGNhc2UgNjAwOiBiYXVkID0gQjYwMDsgYnJlYWs7Ci0gIGNhc2UgMTIwMDogYmF1ZCA9IEIxMjAwOyBicmVhazsKLSAgY2FzZSAxODAwOiBiYXVkID0gQjE4MDA7IGJyZWFrOwotICBjYXNlIDI0MDA6IGJhdWQgPSBCMjQwMDsgYnJlYWs7Ci0gIGNhc2UgNDgwMDogYmF1ZCA9IEI0ODAwOyBicmVhazsKLSAgY2FzZSA5NjAwOiBiYXVkID0gQjk2MDA7IGJyZWFrOwotICBjYXNlIDE5MjAwOiBiYXVkID0gQjE5MjAwOyBicmVhazsKLSAgY2FzZSAzODQwMDogYmF1ZCA9IEIzODQwMDsgYnJlYWs7Ci0gIC8vIEFuZCBub3cgdGhlIGV4dGVuZGVkIG9uZXMgY29uZGl0aW9uYWxseS4KLSMgaWZkZWYgQjcyMDAKLSAgY2FzZSA3MjAwOiBiYXVkID0gQjcyMDA7IGJyZWFrOwotIyBlbmRpZgotIyBpZmRlZiBCMTQ0MDAKLSAgY2FzZSAxNDQwMDogYmF1ZCA9IEIxNDQwMDsgYnJlYWs7Ci0jIGVuZGlmCi0jIGlmZGVmIEI1NzYwMAotICBjYXNlIDU3NjAwOiBiYXVkID0gQjU3NjAwOyBicmVhazsKLSMgZW5kaWYKLSMgaWZkZWYgQjExNTIwMAotICBjYXNlIDExNTIwMDogYmF1ZCA9IEIxMTUyMDA7IGJyZWFrOwotIyBlbmRpZgotIyBpZmRlZiBCMjMwNDAwCi0gIGNhc2UgMjMwNDAwOiBiYXVkID0gQjIzMDQwMDsgYnJlYWs7Ci0jIGVuZGlmCi0jIGlmZGVmIEI0NjA4MDAKLSAgY2FzZSA0NjA4MDA6IGJhdWQgPSBCNDYwODAwOyBicmVhazsKLSMgZW5kaWYKLSMgaWZkZWYgQjUwMDAwMAotICBjYXNlIDUwMDAwMDogYmF1ZCA9IEI1MDAwMDA7IGJyZWFrOwotIyBlbmRpZgotIyBpZmRlZiBCNTc2MDAwCi0gIGNhc2UgNTc2MDAwOiBiYXVkID0gQjU3NjAwMDsgYnJlYWs7Ci0jIGVuZGlmCi0jIGlmZGVmIEI5MjE2MDAKLSAgY2FzZSA5MjE2MDA6IGJhdWQgPSBCOTIxNjAwOyBicmVhazsKLSMgZW5kaWYKLSMgaWZkZWYgQjEwMDAwMDAKLSAgY2FzZSAxMDAwMDAwOiBiYXVkID0gQjEwMDAwMDA7IGJyZWFrOwotIyBlbmRpZgotIyBpZmRlZiBCMTE1MjAwMAotICBjYXNlIDExNTIwMDA6IGJhdWQgPSBCMTE1MjAwMDsgYnJlYWs7Ci0jIGVuZGlmCi0jIGlmZGVmIEIyMDAwMDAwCi0gIGNhc2UgMjAwMDAwMDogYmF1ZCA9IEIyMDAwMDAwOyBicmVhazsKLSMgZW5kaWYKLSMgaWZkZWYgQjMwMDAwMDAKLSAgY2FzZSAzMDAwMDAwOiBiYXVkID0gQjMwMDAwMDA7IGJyZWFrOwotIyBlbmRpZgotIyBpZmRlZiBCMzUwMDAwMAotICBjYXNlIDM1MDAwMDA6IGJhdWQgPSBCMzUwMDAwMDsgYnJlYWs7Ci0jIGVuZGlmCi0jIGlmZGVmIEI0MDAwMDAwCi0gIGNhc2UgNDAwMDAwMDogYmF1ZCA9IEI0MDAwMDAwOyBicmVhazsKLSMgZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgIHJldHVybiBlYzsKLSAgfQotIyBpZiBkZWZpbmVkKF9CU0RfU09VUkNFKQotICA6OmNmc2V0c3BlZWQoJnN0b3JhZ2UsIGJhdWQpOwotIyBlbHNlCi0gIDo6Y2ZzZXRpc3BlZWQoJnN0b3JhZ2UsIGJhdWQpOwotICA6OmNmc2V0b3NwZWVkKCZzdG9yYWdlLCBiYXVkKTsKLSMgZW5kaWYKLSNlbmRpZgotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIHNlcmlhbF9wb3J0X2Jhc2U6OmJhdWRfcmF0ZTo6bG9hZCgKLSAgICBjb25zdCBBU0lPX09QVElPTl9TVE9SQUdFJiBzdG9yYWdlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICB2YWx1ZV8gPSBzdG9yYWdlLkJhdWRSYXRlOwotI2Vsc2UKLSAgc3BlZWRfdCBiYXVkID0gOjpjZmdldG9zcGVlZCgmc3RvcmFnZSk7Ci0gIHN3aXRjaCAoYmF1ZCkKLSAgewotICAvLyBGaXJzdCBkbyB0aG9zZSBzcGVjaWZpZWQgYnkgUE9TSVguCi0gIGNhc2UgQjA6IHZhbHVlXyA9IDA7IGJyZWFrOwotICBjYXNlIEI1MDogdmFsdWVfID0gNTA7IGJyZWFrOwotICBjYXNlIEI3NTogdmFsdWVfID0gNzU7IGJyZWFrOwotICBjYXNlIEIxMTA6IHZhbHVlXyA9IDExMDsgYnJlYWs7Ci0gIGNhc2UgQjEzNDogdmFsdWVfID0gMTM0OyBicmVhazsKLSAgY2FzZSBCMTUwOiB2YWx1ZV8gPSAxNTA7IGJyZWFrOwotICBjYXNlIEIyMDA6IHZhbHVlXyA9IDIwMDsgYnJlYWs7Ci0gIGNhc2UgQjMwMDogdmFsdWVfID0gMzAwOyBicmVhazsKLSAgY2FzZSBCNjAwOiB2YWx1ZV8gPSA2MDA7IGJyZWFrOwotICBjYXNlIEIxMjAwOiB2YWx1ZV8gPSAxMjAwOyBicmVhazsKLSAgY2FzZSBCMTgwMDogdmFsdWVfID0gMTgwMDsgYnJlYWs7Ci0gIGNhc2UgQjI0MDA6IHZhbHVlXyA9IDI0MDA7IGJyZWFrOwotICBjYXNlIEI0ODAwOiB2YWx1ZV8gPSA0ODAwOyBicmVhazsKLSAgY2FzZSBCOTYwMDogdmFsdWVfID0gOTYwMDsgYnJlYWs7Ci0gIGNhc2UgQjE5MjAwOiB2YWx1ZV8gPSAxOTIwMDsgYnJlYWs7Ci0gIGNhc2UgQjM4NDAwOiB2YWx1ZV8gPSAzODQwMDsgYnJlYWs7Ci0gIC8vIE5vdyBjb25kaXRpb25hbGx5IGhhbmRsZSBhIGJ1bmNoIG9mIGV4dGVuZGVkIHJhdGVzLgotIyBpZmRlZiBCNzIwMAotICBjYXNlIEI3MjAwOiB2YWx1ZV8gPSA3MjAwOyBicmVhazsKLSMgZW5kaWYKLSMgaWZkZWYgQjE0NDAwCi0gIGNhc2UgQjE0NDAwOiB2YWx1ZV8gPSAxNDQwMDsgYnJlYWs7Ci0jIGVuZGlmCi0jIGlmZGVmIEI1NzYwMAotICBjYXNlIEI1NzYwMDogdmFsdWVfID0gNTc2MDA7IGJyZWFrOwotIyBlbmRpZgotIyBpZmRlZiBCMTE1MjAwCi0gIGNhc2UgQjExNTIwMDogdmFsdWVfID0gMTE1MjAwOyBicmVhazsKLSMgZW5kaWYKLSMgaWZkZWYgQjIzMDQwMAotICBjYXNlIEIyMzA0MDA6IHZhbHVlXyA9IDIzMDQwMDsgYnJlYWs7Ci0jIGVuZGlmCi0jIGlmZGVmIEI0NjA4MDAKLSAgY2FzZSBCNDYwODAwOiB2YWx1ZV8gPSA0NjA4MDA7IGJyZWFrOwotIyBlbmRpZgotIyBpZmRlZiBCNTAwMDAwCi0gIGNhc2UgQjUwMDAwMDogdmFsdWVfID0gNTAwMDAwOyBicmVhazsKLSMgZW5kaWYKLSMgaWZkZWYgQjU3NjAwMAotICBjYXNlIEI1NzYwMDA6IHZhbHVlXyA9IDU3NjAwMDsgYnJlYWs7Ci0jIGVuZGlmCi0jIGlmZGVmIEI5MjE2MDAKLSAgY2FzZSBCOTIxNjAwOiB2YWx1ZV8gPSA5MjE2MDA7IGJyZWFrOwotIyBlbmRpZgotIyBpZmRlZiBCMTAwMDAwMAotICBjYXNlIEIxMDAwMDAwOiB2YWx1ZV8gPSAxMDAwMDAwOyBicmVhazsKLSMgZW5kaWYKLSMgaWZkZWYgQjExNTIwMDAKLSAgY2FzZSBCMTE1MjAwMDogdmFsdWVfID0gMTE1MjAwMDsgYnJlYWs7Ci0jIGVuZGlmCi0jIGlmZGVmIEIyMDAwMDAwCi0gIGNhc2UgQjIwMDAwMDA6IHZhbHVlXyA9IDIwMDAwMDA7IGJyZWFrOwotIyBlbmRpZgotIyBpZmRlZiBCMzAwMDAwMAotICBjYXNlIEIzMDAwMDAwOiB2YWx1ZV8gPSAzMDAwMDAwOyBicmVhazsKLSMgZW5kaWYKLSMgaWZkZWYgQjM1MDAwMDAKLSAgY2FzZSBCMzUwMDAwMDogdmFsdWVfID0gMzUwMDAwMDsgYnJlYWs7Ci0jIGVuZGlmCi0jIGlmZGVmIEI0MDAwMDAwCi0gIGNhc2UgQjQwMDAwMDA6IHZhbHVlXyA9IDQwMDAwMDA7IGJyZWFrOwotIyBlbmRpZgotICBkZWZhdWx0OgotICAgIHZhbHVlXyA9IDA7Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLSNlbmRpZgotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi1zZXJpYWxfcG9ydF9iYXNlOjpmbG93X2NvbnRyb2w6OmZsb3dfY29udHJvbCgKLSAgICBzZXJpYWxfcG9ydF9iYXNlOjpmbG93X2NvbnRyb2w6OnR5cGUgdCkKLSAgOiB2YWx1ZV8odCkKLXsKLSAgaWYgKHQgIT0gbm9uZSAmJiB0ICE9IHNvZnR3YXJlICYmIHQgIT0gaGFyZHdhcmUpCi0gIHsKLSAgICBzdGQ6Om91dF9vZl9yYW5nZSBleCgiaW52YWxpZCBmbG93X2NvbnRyb2wgdmFsdWUiKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2V4Y2VwdGlvbihleCk7Ci0gIH0KLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBzZXJpYWxfcG9ydF9iYXNlOjpmbG93X2NvbnRyb2w6OnN0b3JlKAotICAgIEFTSU9fT1BUSU9OX1NUT1JBR0UmIHN0b3JhZ2UsIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotewotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIHN0b3JhZ2UuZk91dHhDdHNGbG93ID0gRkFMU0U7Ci0gIHN0b3JhZ2UuZk91dHhEc3JGbG93ID0gRkFMU0U7Ci0gIHN0b3JhZ2UuZlRYQ29udGludWVPblhvZmYgPSBUUlVFOwotICBzdG9yYWdlLmZEdHJDb250cm9sID0gRFRSX0NPTlRST0xfRU5BQkxFOwotICBzdG9yYWdlLmZEc3JTZW5zaXRpdml0eSA9IEZBTFNFOwotICBzdG9yYWdlLmZPdXRYID0gRkFMU0U7Ci0gIHN0b3JhZ2UuZkluWCA9IEZBTFNFOwotICBzdG9yYWdlLmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfRU5BQkxFOwotICBzd2l0Y2ggKHZhbHVlXykKLSAgewotICBjYXNlIG5vbmU6Ci0gICAgYnJlYWs7Ci0gIGNhc2Ugc29mdHdhcmU6Ci0gICAgc3RvcmFnZS5mT3V0WCA9IFRSVUU7Ci0gICAgc3RvcmFnZS5mSW5YID0gVFJVRTsKLSAgICBicmVhazsKLSAgY2FzZSBoYXJkd2FyZToKLSAgICBzdG9yYWdlLmZPdXR4Q3RzRmxvdyA9IFRSVUU7Ci0gICAgc3RvcmFnZS5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0hBTkRTSEFLRTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBicmVhazsKLSAgfQotI2Vsc2UKLSAgc3dpdGNoICh2YWx1ZV8pCi0gIHsKLSAgY2FzZSBub25lOgotICAgIHN0b3JhZ2UuY19pZmxhZyAmPSB+KElYT0ZGIHwgSVhPTik7Ci0jIGlmIGRlZmluZWQoX0JTRF9TT1VSQ0UpCi0gICAgc3RvcmFnZS5jX2NmbGFnICY9IH5DUlRTQ1RTOwotIyBlbGlmIGRlZmluZWQoX19RTlhOVE9fXykKLSAgICBzdG9yYWdlLmNfY2ZsYWcgJj0gfihJSEZMT1cgfCBPSEZMT1cpOwotIyBlbmRpZgotICAgIGJyZWFrOwotICBjYXNlIHNvZnR3YXJlOgotICAgIHN0b3JhZ2UuY19pZmxhZyB8PSBJWE9GRiB8IElYT047Ci0jIGlmIGRlZmluZWQoX0JTRF9TT1VSQ0UpCi0gICAgc3RvcmFnZS5jX2NmbGFnICY9IH5DUlRTQ1RTOwotIyBlbGlmIGRlZmluZWQoX19RTlhOVE9fXykKLSAgICBzdG9yYWdlLmNfY2ZsYWcgJj0gfihJSEZMT1cgfCBPSEZMT1cpOwotIyBlbmRpZgotICAgIGJyZWFrOwotICBjYXNlIGhhcmR3YXJlOgotIyBpZiBkZWZpbmVkKF9CU0RfU09VUkNFKQotICAgIHN0b3JhZ2UuY19pZmxhZyAmPSB+KElYT0ZGIHwgSVhPTik7Ci0gICAgc3RvcmFnZS5jX2NmbGFnIHw9IENSVFNDVFM7Ci0gICAgYnJlYWs7Ci0jIGVsaWYgZGVmaW5lZChfX1FOWE5UT19fKQotICAgIHN0b3JhZ2UuY19pZmxhZyAmPSB+KElYT0ZGIHwgSVhPTik7Ci0gICAgc3RvcmFnZS5jX2NmbGFnIHw9IChJSEZMT1cgfCBPSEZMT1cpOwotICAgIGJyZWFrOwotIyBlbHNlCi0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIGVjOwotIyBlbmRpZgotICBkZWZhdWx0OgotICAgIGJyZWFrOwotICB9Ci0jZW5kaWYKLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBzZXJpYWxfcG9ydF9iYXNlOjpmbG93X2NvbnRyb2w6OmxvYWQoCi0gICAgY29uc3QgQVNJT19PUFRJT05fU1RPUkFHRSYgc3RvcmFnZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgaWYgKHN0b3JhZ2UuZk91dFggJiYgc3RvcmFnZS5mSW5YKQotICB7Ci0gICAgdmFsdWVfID0gc29mdHdhcmU7Ci0gIH0KLSAgZWxzZSBpZiAoc3RvcmFnZS5mT3V0eEN0c0Zsb3cgJiYgc3RvcmFnZS5mUnRzQ29udHJvbCA9PSBSVFNfQ09OVFJPTF9IQU5EU0hBS0UpCi0gIHsKLSAgICB2YWx1ZV8gPSBoYXJkd2FyZTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICB2YWx1ZV8gPSBub25lOwotICB9Ci0jZWxzZQotICBpZiAoc3RvcmFnZS5jX2lmbGFnICYgKElYT0ZGIHwgSVhPTikpCi0gIHsKLSAgICB2YWx1ZV8gPSBzb2Z0d2FyZTsKLSAgfQotIyBpZiBkZWZpbmVkKF9CU0RfU09VUkNFKQotICBlbHNlIGlmIChzdG9yYWdlLmNfY2ZsYWcgJiBDUlRTQ1RTKQotICB7Ci0gICAgdmFsdWVfID0gaGFyZHdhcmU7Ci0gIH0KLSMgZWxpZiBkZWZpbmVkKF9fUU5YTlRPX18pCi0gIGVsc2UgaWYgKHN0b3JhZ2UuY19jZmxhZyAmIElIRkxPVyAmJiBzdG9yYWdlLmNfY2ZsYWcgJiBPSEZMT1cpCi0gIHsKLSAgICB2YWx1ZV8gPSBoYXJkd2FyZTsKLSAgfQotIyBlbmRpZgotICBlbHNlCi0gIHsKLSAgICB2YWx1ZV8gPSBub25lOwotICB9Ci0jZW5kaWYKLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotc2VyaWFsX3BvcnRfYmFzZTo6cGFyaXR5OjpwYXJpdHkoc2VyaWFsX3BvcnRfYmFzZTo6cGFyaXR5Ojp0eXBlIHQpCi0gIDogdmFsdWVfKHQpCi17Ci0gIGlmICh0ICE9IG5vbmUgJiYgdCAhPSBvZGQgJiYgdCAhPSBldmVuKQotICB7Ci0gICAgc3RkOjpvdXRfb2ZfcmFuZ2UgZXgoImludmFsaWQgcGFyaXR5IHZhbHVlIik7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICB9Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgc2VyaWFsX3BvcnRfYmFzZTo6cGFyaXR5OjpzdG9yZSgKLSAgICBBU0lPX09QVElPTl9TVE9SQUdFJiBzdG9yYWdlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLXsKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICBzd2l0Y2ggKHZhbHVlXykKLSAgewotICBjYXNlIG5vbmU6Ci0gICAgc3RvcmFnZS5mUGFyaXR5ID0gRkFMU0U7Ci0gICAgc3RvcmFnZS5QYXJpdHkgPSBOT1BBUklUWTsKLSAgICBicmVhazsKLSAgY2FzZSBvZGQ6Ci0gICAgc3RvcmFnZS5mUGFyaXR5ID0gVFJVRTsKLSAgICBzdG9yYWdlLlBhcml0eSA9IE9ERFBBUklUWTsKLSAgICBicmVhazsKLSAgY2FzZSBldmVuOgotICAgIHN0b3JhZ2UuZlBhcml0eSA9IFRSVUU7Ci0gICAgc3RvcmFnZS5QYXJpdHkgPSBFVkVOUEFSSVRZOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGJyZWFrOwotICB9Ci0jZWxzZQotICBzd2l0Y2ggKHZhbHVlXykKLSAgewotICBjYXNlIG5vbmU6Ci0gICAgc3RvcmFnZS5jX2lmbGFnIHw9IElHTlBBUjsKLSAgICBzdG9yYWdlLmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBQQVJPREQpOwotICAgIGJyZWFrOwotICBjYXNlIGV2ZW46Ci0gICAgc3RvcmFnZS5jX2lmbGFnICY9IH4oSUdOUEFSIHwgUEFSTVJLKTsKLSAgICBzdG9yYWdlLmNfaWZsYWcgfD0gSU5QQ0s7Ci0gICAgc3RvcmFnZS5jX2NmbGFnIHw9IFBBUkVOQjsKLSAgICBzdG9yYWdlLmNfY2ZsYWcgJj0gflBBUk9ERDsKLSAgICBicmVhazsKLSAgY2FzZSBvZGQ6Ci0gICAgc3RvcmFnZS5jX2lmbGFnICY9IH4oSUdOUEFSIHwgUEFSTVJLKTsKLSAgICBzdG9yYWdlLmNfaWZsYWcgfD0gSU5QQ0s7Ci0gICAgc3RvcmFnZS5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGJyZWFrOwotICB9Ci0jZW5kaWYKLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBzZXJpYWxfcG9ydF9iYXNlOjpwYXJpdHk6OmxvYWQoCi0gICAgY29uc3QgQVNJT19PUFRJT05fU1RPUkFHRSYgc3RvcmFnZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgaWYgKHN0b3JhZ2UuUGFyaXR5ID09IEVWRU5QQVJJVFkpCi0gIHsKLSAgICB2YWx1ZV8gPSBldmVuOwotICB9Ci0gIGVsc2UgaWYgKHN0b3JhZ2UuUGFyaXR5ID09IE9ERFBBUklUWSkKLSAgewotICAgIHZhbHVlXyA9IG9kZDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICB2YWx1ZV8gPSBub25lOwotICB9Ci0jZWxzZQotICBpZiAoc3RvcmFnZS5jX2NmbGFnICYgUEFSRU5CKQotICB7Ci0gICAgaWYgKHN0b3JhZ2UuY19jZmxhZyAmIFBBUk9ERCkKLSAgICB7Ci0gICAgICB2YWx1ZV8gPSBvZGQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZV8gPSBldmVuOwotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICB2YWx1ZV8gPSBub25lOwotICB9Ci0jZW5kaWYKLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotc2VyaWFsX3BvcnRfYmFzZTo6c3RvcF9iaXRzOjpzdG9wX2JpdHMoCi0gICAgc2VyaWFsX3BvcnRfYmFzZTo6c3RvcF9iaXRzOjp0eXBlIHQpCi0gIDogdmFsdWVfKHQpCi17Ci0gIGlmICh0ICE9IG9uZSAmJiB0ICE9IG9uZXBvaW50Zml2ZSAmJiB0ICE9IHR3bykKLSAgewotICAgIHN0ZDo6b3V0X29mX3JhbmdlIGV4KCJpbnZhbGlkIHN0b3BfYml0cyB2YWx1ZSIpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKGV4KTsKLSAgfQotfQotCi1hc2lvOjplcnJvcl9jb2RlIHNlcmlhbF9wb3J0X2Jhc2U6OnN0b3BfYml0czo6c3RvcmUoCi0gICAgQVNJT19PUFRJT05fU1RPUkFHRSYgc3RvcmFnZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgc3dpdGNoICh2YWx1ZV8pCi0gIHsKLSAgY2FzZSBvbmU6Ci0gICAgc3RvcmFnZS5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7Ci0gICAgYnJlYWs7Ci0gIGNhc2Ugb25lcG9pbnRmaXZlOgotICAgIHN0b3JhZ2UuU3RvcEJpdHMgPSBPTkU1U1RPUEJJVFM7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgdHdvOgotICAgIHN0b3JhZ2UuU3RvcEJpdHMgPSBUV09TVE9QQklUUzsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBicmVhazsKLSAgfQotI2Vsc2UKLSAgc3dpdGNoICh2YWx1ZV8pCi0gIHsKLSAgY2FzZSBvbmU6Ci0gICAgc3RvcmFnZS5jX2NmbGFnICY9IH5DU1RPUEI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgdHdvOgotICAgIHN0b3JhZ2UuY19jZmxhZyB8PSBDU1RPUEI7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0jZW5kaWYKLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBzZXJpYWxfcG9ydF9iYXNlOjpzdG9wX2JpdHM6OmxvYWQoCi0gICAgY29uc3QgQVNJT19PUFRJT05fU1RPUkFHRSYgc3RvcmFnZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgaWYgKHN0b3JhZ2UuU3RvcEJpdHMgPT0gT05FU1RPUEJJVCkKLSAgewotICAgIHZhbHVlXyA9IG9uZTsKLSAgfQotICBlbHNlIGlmIChzdG9yYWdlLlN0b3BCaXRzID09IE9ORTVTVE9QQklUUykKLSAgewotICAgIHZhbHVlXyA9IG9uZXBvaW50Zml2ZTsKLSAgfQotICBlbHNlIGlmIChzdG9yYWdlLlN0b3BCaXRzID09IFRXT1NUT1BCSVRTKQotICB7Ci0gICAgdmFsdWVfID0gdHdvOwotICB9Ci0gIGVsc2UKLSAgewotICAgIHZhbHVlXyA9IG9uZTsKLSAgfQotI2Vsc2UKLSAgdmFsdWVfID0gKHN0b3JhZ2UuY19jZmxhZyAmIENTVE9QQikgPyB0d28gOiBvbmU7Ci0jZW5kaWYKLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotc2VyaWFsX3BvcnRfYmFzZTo6Y2hhcmFjdGVyX3NpemU6OmNoYXJhY3Rlcl9zaXplKHVuc2lnbmVkIGludCB0KQotICA6IHZhbHVlXyh0KQotewotICBpZiAodCA8IDUgfHwgdCA+IDgpCi0gIHsKLSAgICBzdGQ6Om91dF9vZl9yYW5nZSBleCgiaW52YWxpZCBjaGFyYWN0ZXJfc2l6ZSB2YWx1ZSIpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKGV4KTsKLSAgfQotfQotCi1hc2lvOjplcnJvcl9jb2RlIHNlcmlhbF9wb3J0X2Jhc2U6OmNoYXJhY3Rlcl9zaXplOjpzdG9yZSgKLSAgICBBU0lPX09QVElPTl9TVE9SQUdFJiBzdG9yYWdlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLXsKLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICBzdG9yYWdlLkJ5dGVTaXplID0gdmFsdWVfOwotI2Vsc2UKLSAgc3RvcmFnZS5jX2NmbGFnICY9IH5DU0laRTsKLSAgc3dpdGNoICh2YWx1ZV8pCi0gIHsKLSAgY2FzZSA1OiBzdG9yYWdlLmNfY2ZsYWcgfD0gQ1M1OyBicmVhazsKLSAgY2FzZSA2OiBzdG9yYWdlLmNfY2ZsYWcgfD0gQ1M2OyBicmVhazsKLSAgY2FzZSA3OiBzdG9yYWdlLmNfY2ZsYWcgfD0gQ1M3OyBicmVhazsKLSAgY2FzZSA4OiBzdG9yYWdlLmNfY2ZsYWcgfD0gQ1M4OyBicmVhazsKLSAgZGVmYXVsdDogYnJlYWs7Ci0gIH0KLSNlbmRpZgotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIHNlcmlhbF9wb3J0X2Jhc2U6OmNoYXJhY3Rlcl9zaXplOjpsb2FkKAotICAgIGNvbnN0IEFTSU9fT1BUSU9OX1NUT1JBR0UmIHN0b3JhZ2UsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIHZhbHVlXyA9IHN0b3JhZ2UuQnl0ZVNpemU7Ci0jZWxzZQotICBpZiAoKHN0b3JhZ2UuY19jZmxhZyAmIENTSVpFKSA9PSBDUzUpIHsgdmFsdWVfID0gNTsgfQotICBlbHNlIGlmICgoc3RvcmFnZS5jX2NmbGFnICYgQ1NJWkUpID09IENTNikgeyB2YWx1ZV8gPSA2OyB9Ci0gIGVsc2UgaWYgKChzdG9yYWdlLmNfY2ZsYWcgJiBDU0laRSkgPT0gQ1M3KSB7IHZhbHVlXyA9IDc7IH0KLSAgZWxzZSBpZiAoKHN0b3JhZ2UuY19jZmxhZyAmIENTSVpFKSA9PSBDUzgpIHsgdmFsdWVfID0gODsgfQotICBlbHNlCi0gIHsKLSAgICAvLyBIbW1tLCB1c2UgOCBmb3Igbm93LgotICAgIHZhbHVlXyA9IDg7Ci0gIH0KLSNlbmRpZgotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSN1bmRlZiBBU0lPX09QVElPTl9TVE9SQUdFCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NFUklBTF9QT1JUKQotCi0jZW5kaWYgLy8gQVNJT19JTVBMX1NFUklBTF9QT1JUX0JBU0VfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9zcGF3bi5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9zcGF3bi5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGZkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvc3Bhd24uaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8vCi0vLyBpbXBsL3NwYXduLmhwcAotLy8gfn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JTVBMX1NQQVdOX0hQUAotI2RlZmluZSBBU0lPX0lNUExfU1BBV05fSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2F0b21pY19jb3VudC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2NvbnRfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NoYXJlZF9wdHIuaHBwIgotI2luY2x1ZGUgImFzaW8vaGFuZGxlcl90eXBlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBUPgotICBjbGFzcyBjb3JvX2hhbmRsZXIKLSAgewotICBwdWJsaWM6Ci0gICAgY29yb19oYW5kbGVyKGJhc2ljX3lpZWxkX2NvbnRleHQ8SGFuZGxlcj4gY3R4KQotICAgICAgOiBjb3JvXyhjdHguY29yb18ubG9jaygpKSwKLSAgICAgICAgY2FfKGN0eC5jYV8pLAotICAgICAgICBoYW5kbGVyXyhjdHguaGFuZGxlcl8pLAotICAgICAgICByZWFkeV8oMCksCi0gICAgICAgIGVjXyhjdHguZWNfKSwKLSAgICAgICAgdmFsdWVfKDApCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgb3BlcmF0b3IoKShUIHZhbHVlKQotICAgIHsKLSAgICAgICplY18gPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgICAqdmFsdWVfID0gQVNJT19NT1ZFX0NBU1QoVCkodmFsdWUpOwotICAgICAgaWYgKC0tKnJlYWR5XyA9PSAwKQotICAgICAgICAoKmNvcm9fKSgpOwotICAgIH0KLQotICAgIHZvaWQgb3BlcmF0b3IoKShhc2lvOjplcnJvcl9jb2RlIGVjLCBUIHZhbHVlKQotICAgIHsKLSAgICAgICplY18gPSBlYzsKLSAgICAgICp2YWx1ZV8gPSBBU0lPX01PVkVfQ0FTVChUKSh2YWx1ZSk7Ci0gICAgICBpZiAoLS0qcmVhZHlfID09IDApCi0gICAgICAgICgqY29yb18pKCk7Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBzaGFyZWRfcHRyPHR5cGVuYW1lIGJhc2ljX3lpZWxkX2NvbnRleHQ8SGFuZGxlcj46OmNhbGxlZV90eXBlPiBjb3JvXzsKLSAgICB0eXBlbmFtZSBiYXNpY195aWVsZF9jb250ZXh0PEhhbmRsZXI+OjpjYWxsZXJfdHlwZSYgY2FfOwotICAgIEhhbmRsZXImIGhhbmRsZXJfOwotICAgIGF0b21pY19jb3VudCogcmVhZHlfOwotICAgIGFzaW86OmVycm9yX2NvZGUqIGVjXzsKLSAgICBUKiB2YWx1ZV87Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIGNsYXNzIGNvcm9faGFuZGxlcjxIYW5kbGVyLCB2b2lkPgotICB7Ci0gIHB1YmxpYzoKLSAgICBjb3JvX2hhbmRsZXIoYmFzaWNfeWllbGRfY29udGV4dDxIYW5kbGVyPiBjdHgpCi0gICAgICA6IGNvcm9fKGN0eC5jb3JvXy5sb2NrKCkpLAotICAgICAgICBjYV8oY3R4LmNhXyksCi0gICAgICAgIGhhbmRsZXJfKGN0eC5oYW5kbGVyXyksCi0gICAgICAgIHJlYWR5XygwKSwKLSAgICAgICAgZWNfKGN0eC5lY18pCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgb3BlcmF0b3IoKSgpCi0gICAgewotICAgICAgKmVjXyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIGlmICgtLSpyZWFkeV8gPT0gMCkKLSAgICAgICAgKCpjb3JvXykoKTsKLSAgICB9Ci0KLSAgICB2b2lkIG9wZXJhdG9yKCkoYXNpbzo6ZXJyb3JfY29kZSBlYykKLSAgICB7Ci0gICAgICAqZWNfID0gZWM7Ci0gICAgICBpZiAoLS0qcmVhZHlfID09IDApCi0gICAgICAgICgqY29yb18pKCk7Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBzaGFyZWRfcHRyPHR5cGVuYW1lIGJhc2ljX3lpZWxkX2NvbnRleHQ8SGFuZGxlcj46OmNhbGxlZV90eXBlPiBjb3JvXzsKLSAgICB0eXBlbmFtZSBiYXNpY195aWVsZF9jb250ZXh0PEhhbmRsZXI+OjpjYWxsZXJfdHlwZSYgY2FfOwotICAgIEhhbmRsZXImIGhhbmRsZXJfOwotICAgIGF0b21pY19jb3VudCogcmVhZHlfOwotICAgIGFzaW86OmVycm9yX2NvZGUqIGVjXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgVD4KLSAgaW5saW5lIHZvaWQqIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzdGQ6OnNpemVfdCBzaXplLAotICAgICAgY29yb19oYW5kbGVyPEhhbmRsZXIsIFQ+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgICBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBUPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgICAgY29yb19oYW5kbGVyPEhhbmRsZXIsIFQ+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6ZGVhbGxvY2F0ZSgKLSAgICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgVD4KLSAgaW5saW5lIGJvb2wgYXNpb19oYW5kbGVyX2lzX2NvbnRpbnVhdGlvbihjb3JvX2hhbmRsZXI8SGFuZGxlciwgVD4qKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIFQ+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgY29yb19oYW5kbGVyPEhhbmRsZXIsIFQ+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgICAgZnVuY3Rpb24sIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBUPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIGNvcm9faGFuZGxlcjxIYW5kbGVyLCBUPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotI2lmICFkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIFJldHVyblR5cGU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPGJhc2ljX3lpZWxkX2NvbnRleHQ8SGFuZGxlcj4sIFJldHVyblR5cGUoKT4KLXsKLSAgdHlwZWRlZiBkZXRhaWw6OmNvcm9faGFuZGxlcjxIYW5kbGVyLCB2b2lkPiB0eXBlOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIFJldHVyblR5cGUsIHR5cGVuYW1lIEFyZzE+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPGJhc2ljX3lpZWxkX2NvbnRleHQ8SGFuZGxlcj4sIFJldHVyblR5cGUoQXJnMSk+Ci17Ci0gIHR5cGVkZWYgZGV0YWlsOjpjb3JvX2hhbmRsZXI8SGFuZGxlciwgQXJnMT4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBSZXR1cm5UeXBlPgotc3RydWN0IGhhbmRsZXJfdHlwZTxiYXNpY195aWVsZF9jb250ZXh0PEhhbmRsZXI+LAotICAgIFJldHVyblR5cGUoYXNpbzo6ZXJyb3JfY29kZSk+Ci17Ci0gIHR5cGVkZWYgZGV0YWlsOjpjb3JvX2hhbmRsZXI8SGFuZGxlciwgdm9pZD4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBSZXR1cm5UeXBlLCB0eXBlbmFtZSBBcmcyPgotc3RydWN0IGhhbmRsZXJfdHlwZTxiYXNpY195aWVsZF9jb250ZXh0PEhhbmRsZXI+LAotICAgIFJldHVyblR5cGUoYXNpbzo6ZXJyb3JfY29kZSwgQXJnMik+Ci17Ci0gIHR5cGVkZWYgZGV0YWlsOjpjb3JvX2hhbmRsZXI8SGFuZGxlciwgQXJnMj4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBUPgotY2xhc3MgYXN5bmNfcmVzdWx0PGRldGFpbDo6Y29yb19oYW5kbGVyPEhhbmRsZXIsIFQ+ID4KLXsKLXB1YmxpYzoKLSAgdHlwZWRlZiBUIHR5cGU7Ci0KLSAgZXhwbGljaXQgYXN5bmNfcmVzdWx0KGRldGFpbDo6Y29yb19oYW5kbGVyPEhhbmRsZXIsIFQ+JiBoKQotICAgIDogaGFuZGxlcl8oaCksCi0gICAgICBjYV8oaC5jYV8pLAotICAgICAgcmVhZHlfKDIpCi0gIHsKLSAgICBoLnJlYWR5XyA9ICZyZWFkeV87Ci0gICAgb3V0X2VjXyA9IGguZWNfOwotICAgIGlmICghb3V0X2VjXykgaC5lY18gPSAmZWNfOwotICAgIGgudmFsdWVfID0gJnZhbHVlXzsKLSAgfQotCi0gIHR5cGUgZ2V0KCkKLSAgewotICAgIGhhbmRsZXJfLmNvcm9fLnJlc2V0KCk7IC8vIE11c3Qgbm90IGhvbGQgc2hhcmVkX3B0ciB0byBjb3JvIHdoaWxlIHN1c3BlbmRlZC4KLSAgICBpZiAoLS1yZWFkeV8gIT0gMCkKLSAgICAgIGNhXygpOwotICAgIGlmICghb3V0X2VjXyAmJiBlY18pIHRocm93IGFzaW86OnN5c3RlbV9lcnJvcihlY18pOwotICAgIHJldHVybiBBU0lPX01PVkVfQ0FTVCh0eXBlKSh2YWx1ZV8pOwotICB9Ci0KLXByaXZhdGU6Ci0gIGRldGFpbDo6Y29yb19oYW5kbGVyPEhhbmRsZXIsIFQ+JiBoYW5kbGVyXzsKLSAgdHlwZW5hbWUgYmFzaWNfeWllbGRfY29udGV4dDxIYW5kbGVyPjo6Y2FsbGVyX3R5cGUmIGNhXzsKLSAgZGV0YWlsOjphdG9taWNfY291bnQgcmVhZHlfOwotICBhc2lvOjplcnJvcl9jb2RlKiBvdXRfZWNfOwotICBhc2lvOjplcnJvcl9jb2RlIGVjXzsKLSAgdHlwZSB2YWx1ZV87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIGFzeW5jX3Jlc3VsdDxkZXRhaWw6OmNvcm9faGFuZGxlcjxIYW5kbGVyLCB2b2lkPiA+Ci17Ci1wdWJsaWM6Ci0gIHR5cGVkZWYgdm9pZCB0eXBlOwotCi0gIGV4cGxpY2l0IGFzeW5jX3Jlc3VsdChkZXRhaWw6OmNvcm9faGFuZGxlcjxIYW5kbGVyLCB2b2lkPiYgaCkKLSAgICA6IGhhbmRsZXJfKGgpLAotICAgICAgY2FfKGguY2FfKSwKLSAgICAgIHJlYWR5XygyKQotICB7Ci0gICAgaC5yZWFkeV8gPSAmcmVhZHlfOwotICAgIG91dF9lY18gPSBoLmVjXzsKLSAgICBpZiAoIW91dF9lY18pIGguZWNfID0gJmVjXzsKLSAgfQotCi0gIHZvaWQgZ2V0KCkKLSAgewotICAgIGhhbmRsZXJfLmNvcm9fLnJlc2V0KCk7IC8vIE11c3Qgbm90IGhvbGQgc2hhcmVkX3B0ciB0byBjb3JvIHdoaWxlIHN1c3BlbmRlZC4KLSAgICBpZiAoLS1yZWFkeV8gIT0gMCkKLSAgICAgIGNhXygpOwotICAgIGlmICghb3V0X2VjXyAmJiBlY18pIHRocm93IGFzaW86OnN5c3RlbV9lcnJvcihlY18pOwotICB9Ci0KLXByaXZhdGU6Ci0gIGRldGFpbDo6Y29yb19oYW5kbGVyPEhhbmRsZXIsIHZvaWQ+JiBoYW5kbGVyXzsKLSAgdHlwZW5hbWUgYmFzaWNfeWllbGRfY29udGV4dDxIYW5kbGVyPjo6Y2FsbGVyX3R5cGUmIGNhXzsKLSAgZGV0YWlsOjphdG9taWNfY291bnQgcmVhZHlfOwotICBhc2lvOjplcnJvcl9jb2RlKiBvdXRfZWNfOwotICBhc2lvOjplcnJvcl9jb2RlIGVjXzsKLX07Ci0KLW5hbWVzcGFjZSBkZXRhaWwgewotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBGdW5jdGlvbj4KLSAgc3RydWN0IHNwYXduX2RhdGEgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi0gIHsKLSAgICBzcGF3bl9kYXRhKEFTSU9fTU9WRV9BUkcoSGFuZGxlcikgaGFuZGxlciwKLSAgICAgICAgYm9vbCBjYWxsX2hhbmRsZXIsIEFTSU9fTU9WRV9BUkcoRnVuY3Rpb24pIGZ1bmN0aW9uKQotICAgICAgOiBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSksCi0gICAgICAgIGNhbGxfaGFuZGxlcl8oY2FsbF9oYW5kbGVyKSwKLSAgICAgICAgZnVuY3Rpb25fKEFTSU9fTU9WRV9DQVNUKEZ1bmN0aW9uKShmdW5jdGlvbikpCi0gICAgewotICAgIH0KLQotICAgIHdlYWtfcHRyPHR5cGVuYW1lIGJhc2ljX3lpZWxkX2NvbnRleHQ8SGFuZGxlcj46OmNhbGxlZV90eXBlPiBjb3JvXzsKLSAgICBIYW5kbGVyIGhhbmRsZXJfOwotICAgIGJvb2wgY2FsbF9oYW5kbGVyXzsKLSAgICBGdW5jdGlvbiBmdW5jdGlvbl87Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEZ1bmN0aW9uPgotICBzdHJ1Y3QgY29yb19lbnRyeV9wb2ludAotICB7Ci0gICAgdm9pZCBvcGVyYXRvcigpKHR5cGVuYW1lIGJhc2ljX3lpZWxkX2NvbnRleHQ8SGFuZGxlcj46OmNhbGxlcl90eXBlJiBjYSkKLSAgICB7Ci0gICAgICBzaGFyZWRfcHRyPHNwYXduX2RhdGE8SGFuZGxlciwgRnVuY3Rpb24+ID4gZGF0YShkYXRhXyk7Ci0jaWYgIWRlZmluZWQoQk9PU1RfQ09ST1VUSU5FU19VTklESVJFQ1QpICYmICFkZWZpbmVkKEJPT1NUX0NPUk9VVElORVNfVjIpCi0gICAgICBjYSgpOyAvLyBZaWVsZCB1bnRpbCBjb3JvdXRpbmUgcG9pbnRlciBoYXMgYmVlbiBpbml0aWFsaXNlZC4KLSNlbmRpZiAvLyAhZGVmaW5lZChCT09TVF9DT1JPVVRJTkVTX1VOSURJUkVDVCkgJiYgIWRlZmluZWQoQk9PU1RfQ09ST1VUSU5FU19WMikKLSAgICAgIGNvbnN0IGJhc2ljX3lpZWxkX2NvbnRleHQ8SGFuZGxlcj4geWllbGQoCi0gICAgICAgICAgZGF0YS0+Y29yb18sIGNhLCBkYXRhLT5oYW5kbGVyXyk7Ci0gICAgICAoZGF0YS0+ZnVuY3Rpb25fKSh5aWVsZCk7Ci0gICAgICBpZiAoZGF0YS0+Y2FsbF9oYW5kbGVyXykKLSAgICAgICAgKGRhdGEtPmhhbmRsZXJfKSgpOwotICAgIH0KLQotICAgIHNoYXJlZF9wdHI8c3Bhd25fZGF0YTxIYW5kbGVyLCBGdW5jdGlvbj4gPiBkYXRhXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgRnVuY3Rpb24+Ci0gIHN0cnVjdCBzcGF3bl9oZWxwZXIKLSAgewotICAgIHZvaWQgb3BlcmF0b3IoKSgpCi0gICAgewotICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNpY195aWVsZF9jb250ZXh0PEhhbmRsZXI+OjpjYWxsZWVfdHlwZSBjYWxsZWVfdHlwZTsKLSAgICAgIGNvcm9fZW50cnlfcG9pbnQ8SGFuZGxlciwgRnVuY3Rpb24+IGVudHJ5X3BvaW50ID0geyBkYXRhXyB9OwotICAgICAgc2hhcmVkX3B0cjxjYWxsZWVfdHlwZT4gY29ybyhuZXcgY2FsbGVlX3R5cGUoZW50cnlfcG9pbnQsIGF0dHJpYnV0ZXNfKSk7Ci0gICAgICBkYXRhXy0+Y29yb18gPSBjb3JvOwotICAgICAgKCpjb3JvKSgpOwotICAgIH0KLQotICAgIHNoYXJlZF9wdHI8c3Bhd25fZGF0YTxIYW5kbGVyLCBGdW5jdGlvbj4gPiBkYXRhXzsKLSAgICBib29zdDo6Y29yb3V0aW5lczo6YXR0cmlidXRlcyBhdHRyaWJ1dGVzXzsKLSAgfTsKLQotICBpbmxpbmUgdm9pZCBkZWZhdWx0X3NwYXduX2hhbmRsZXIoKSB7fQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lIEZ1bmN0aW9uPgotdm9pZCBzcGF3bihBU0lPX01PVkVfQVJHKEhhbmRsZXIpIGhhbmRsZXIsCi0gICAgQVNJT19NT1ZFX0FSRyhGdW5jdGlvbikgZnVuY3Rpb24sCi0gICAgY29uc3QgYm9vc3Q6OmNvcm91dGluZXM6OmF0dHJpYnV0ZXMmIGF0dHJpYnV0ZXMpCi17Ci0gIGRldGFpbDo6c3Bhd25faGVscGVyPEhhbmRsZXIsIEZ1bmN0aW9uPiBoZWxwZXI7Ci0gIGhlbHBlci5kYXRhXy5yZXNldCgKLSAgICAgIG5ldyBkZXRhaWw6OnNwYXduX2RhdGE8SGFuZGxlciwgRnVuY3Rpb24+KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSwgdHJ1ZSwKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoRnVuY3Rpb24pKGZ1bmN0aW9uKSkpOwotICBoZWxwZXIuYXR0cmlidXRlc18gPSBhdHRyaWJ1dGVzOwotICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZShoZWxwZXIsIGhlbHBlci5kYXRhXy0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgRnVuY3Rpb24+Ci12b2lkIHNwYXduKGJhc2ljX3lpZWxkX2NvbnRleHQ8SGFuZGxlcj4gY3R4LAotICAgIEFTSU9fTU9WRV9BUkcoRnVuY3Rpb24pIGZ1bmN0aW9uLAotICAgIGNvbnN0IGJvb3N0Ojpjb3JvdXRpbmVzOjphdHRyaWJ1dGVzJiBhdHRyaWJ1dGVzKQotewotICBIYW5kbGVyIGhhbmRsZXIoY3R4LmhhbmRsZXJfKTsgLy8gRXhwbGljaXQgY29weSB0aGF0IG1pZ2h0IGJlIG1vdmVkIGZyb20uCi0gIGRldGFpbDo6c3Bhd25faGVscGVyPEhhbmRsZXIsIEZ1bmN0aW9uPiBoZWxwZXI7Ci0gIGhlbHBlci5kYXRhXy5yZXNldCgKLSAgICAgIG5ldyBkZXRhaWw6OnNwYXduX2RhdGE8SGFuZGxlciwgRnVuY3Rpb24+KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSwgZmFsc2UsCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKEZ1bmN0aW9uKShmdW5jdGlvbikpKTsKLSAgaGVscGVyLmF0dHJpYnV0ZXNfID0gYXR0cmlidXRlczsKLSAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoaGVscGVyLCBoZWxwZXIuZGF0YV8tPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uPgotdm9pZCBzcGF3bihhc2lvOjppb19zZXJ2aWNlOjpzdHJhbmQgc3RyYW5kLAotICAgIEFTSU9fTU9WRV9BUkcoRnVuY3Rpb24pIGZ1bmN0aW9uLAotICAgIGNvbnN0IGJvb3N0Ojpjb3JvdXRpbmVzOjphdHRyaWJ1dGVzJiBhdHRyaWJ1dGVzKQotewotICBhc2lvOjpzcGF3bihzdHJhbmQud3JhcCgmZGV0YWlsOjpkZWZhdWx0X3NwYXduX2hhbmRsZXIpLAotICAgICAgQVNJT19NT1ZFX0NBU1QoRnVuY3Rpb24pKGZ1bmN0aW9uKSwgYXR0cmlidXRlcyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLXZvaWQgc3Bhd24oYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwKLSAgICBBU0lPX01PVkVfQVJHKEZ1bmN0aW9uKSBmdW5jdGlvbiwKLSAgICBjb25zdCBib29zdDo6Y29yb3V0aW5lczo6YXR0cmlidXRlcyYgYXR0cmlidXRlcykKLXsKLSAgYXNpbzo6c3Bhd24oYXNpbzo6aW9fc2VydmljZTo6c3RyYW5kKGlvX3NlcnZpY2UpLAotICAgICAgQVNJT19NT1ZFX0NBU1QoRnVuY3Rpb24pKGZ1bmN0aW9uKSwgYXR0cmlidXRlcyk7Ci19Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSU1QTF9TUEFXTl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3NyYy5jcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9zcmMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Q4ODJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3NyYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLwotLy8gaW1wbC9zcmMuY3BwCi0vLyB+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSBcCi0gIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSBcCi0gIHx8IGRlZmluZWQoX19ETUNfXykKLSMgcHJhZ21hIG1lc3NhZ2UgKCBcCi0gICAgIlRoaXMgZmlsZSBpcyBkZXByZWNhdGVkLiAiIFwKLSAgICAiUGxlYXNlICNpbmNsdWRlIDxhc2lvL2ltcGwvc3JjLmhwcD4gaW5zdGVhZC4iKQotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgXAotICB8fCBkZWZpbmVkKF9fSFBfYUNDKSBcCi0gIHx8IGRlZmluZWQoX19TVU5QUk9fQ0MpIFwKLSAgfHwgZGVmaW5lZChfX0lCTUNQUF9fKQotIyB3YXJuaW5nICJUaGlzIGZpbGUgaXMgZGVwcmVjYXRlZC4iCi0jIHdhcm5pbmcgIlBsZWFzZSAjaW5jbHVkZSA8YXNpby9pbXBsL3NyYy5ocHA+IGluc3RlYWQuIgotI2VuZGlmCi0KLSNpbmNsdWRlICJhc2lvL2ltcGwvc3JjLmhwcCIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3NyYy5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaW1wbC9zcmMuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTk0MGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3NyYy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLwotLy8gaW1wbC9zcmMuaHBwCi0vLyB+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JTVBMX1NSQ19IUFAKLSNkZWZpbmUgQVNJT19JTVBMX1NSQ19IUFAKLQotI2RlZmluZSBBU0lPX1NPVVJDRQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgZXJyb3IgRG8gbm90IGNvbXBpbGUgQXNpbyBsaWJyYXJ5IHNvdXJjZSB3aXRoIEFTSU9fSEVBREVSX09OTFkgZGVmaW5lZAotI2VuZGlmCi0KLSNpbmNsdWRlICJhc2lvL2ltcGwvZXJyb3IuaXBwIgotI2luY2x1ZGUgImFzaW8vaW1wbC9lcnJvcl9jb2RlLmlwcCIKLSNpbmNsdWRlICJhc2lvL2ltcGwvaGFuZGxlcl9hbGxvY19ob29rLmlwcCIKLSNpbmNsdWRlICJhc2lvL2ltcGwvaW9fc2VydmljZS5pcHAiCi0jaW5jbHVkZSAiYXNpby9pbXBsL3NlcmlhbF9wb3J0X2Jhc2UuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvZGVzY3JpcHRvcl9vcHMuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvZGV2X3BvbGxfcmVhY3Rvci5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9lcG9sbF9yZWFjdG9yLmlwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL2V2ZW50ZmRfc2VsZWN0X2ludGVycnVwdGVyLmlwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL2hhbmRsZXJfdHJhY2tpbmcuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwva3F1ZXVlX3JlYWN0b3IuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvcGlwZV9zZWxlY3RfaW50ZXJydXB0ZXIuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvcG9zaXhfZXZlbnQuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvcG9zaXhfbXV0ZXguaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvcG9zaXhfdGhyZWFkLmlwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3Bvc2l4X3Rzc19wdHIuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlLmlwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3JlYWN0aXZlX3NlcmlhbF9wb3J0X3NlcnZpY2UuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvcmVhY3RpdmVfc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9yZXNvbHZlcl9zZXJ2aWNlX2Jhc2UuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvc2VsZWN0X3JlYWN0b3IuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvc2VydmljZV9yZWdpc3RyeS5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9zaWduYWxfc2V0X3NlcnZpY2UuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvc29ja2V0X29wcy5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC9zb2NrZXRfc2VsZWN0X2ludGVycnVwdGVyLmlwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3N0cmFuZF9zZXJ2aWNlLmlwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3Rhc2tfaW9fc2VydmljZS5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC90aHJvd19lcnJvci5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC90aW1lcl9xdWV1ZV9wdGltZS5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC90aW1lcl9xdWV1ZV9zZXQuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3BfaGFuZGxlX3NlcnZpY2UuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvd2luX2lvY3BfaW9fc2VydmljZS5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC93aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlLmlwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3dpbl9pb2NwX3NvY2tldF9zZXJ2aWNlX2Jhc2UuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvd2luX2V2ZW50LmlwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3dpbl9tdXRleC5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC93aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlLmlwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pbXBsL3dpbl9zdGF0aWNfbXV0ZXguaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvd2luX3RocmVhZC5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC93aW5fdHNzX3B0ci5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC93aW5ydF9zc29ja2V0X3NlcnZpY2VfYmFzZS5pcHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW1wbC93aW5ydF90aW1lcl9zY2hlZHVsZXIuaXBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2ltcGwvd2luc29ja19pbml0LmlwcCIKLSNpbmNsdWRlICJhc2lvL2dlbmVyaWMvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwIgotI2luY2x1ZGUgImFzaW8vaXAvaW1wbC9hZGRyZXNzLmlwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2ltcGwvYWRkcmVzc192NC5pcHAiCi0jaW5jbHVkZSAiYXNpby9pcC9pbXBsL2FkZHJlc3NfdjYuaXBwIgotI2luY2x1ZGUgImFzaW8vaXAvaW1wbC9ob3N0X25hbWUuaXBwIgotI2luY2x1ZGUgImFzaW8vaXAvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwIgotI2luY2x1ZGUgImFzaW8vbG9jYWwvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwIgotCi0jZW5kaWYgLy8gQVNJT19JTVBMX1NSQ19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3VzZV9mdXR1cmUuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvdXNlX2Z1dHVyZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMzg1N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvdXNlX2Z1dHVyZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8KLS8vIGltcGwvdXNlX2Z1dHVyZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JTVBMX1VTRV9GVVRVUkVfSFBQCi0jZGVmaW5lIEFTSU9fSU1QTF9VU0VfRlVUVVJFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlICJhc2lvL2FzeW5jX3Jlc3VsdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvcl9jb2RlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2hhbmRsZXJfdHlwZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9zeXN0ZW1fZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSAgLy8gQ29tcGxldGlvbiBoYW5kbGVyIHRvIGFkYXB0IGEgcHJvbWlzZSBhcyBhIGNvbXBsZXRpb24gaGFuZGxlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIGNsYXNzIHByb21pc2VfaGFuZGxlcgotICB7Ci0gIHB1YmxpYzoKLSAgICAvLyBDb25zdHJ1Y3QgZnJvbSB1c2VfZnV0dXJlIHNwZWNpYWwgdmFsdWUuCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvcj4KLSAgICBwcm9taXNlX2hhbmRsZXIodXNlX2Z1dHVyZV90PEFsbG9jYXRvcj4gdWYpCi0gICAgICA6IHByb21pc2VfKHN0ZDo6YWxsb2NhdGVfc2hhcmVkPHN0ZDo6cHJvbWlzZTxUPiA+KAotICAgICAgICAgICAgdWYuZ2V0X2FsbG9jYXRvcigpLCBzdGQ6OmFsbG9jYXRvcl9hcmcsIHVmLmdldF9hbGxvY2F0b3IoKSkpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgb3BlcmF0b3IoKShUIHQpCi0gICAgewotICAgICAgcHJvbWlzZV8tPnNldF92YWx1ZSh0KTsKLSAgICB9Ci0KLSAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIFQgdCkKLSAgICB7Ci0gICAgICBpZiAoZWMpCi0gICAgICAgIHByb21pc2VfLT5zZXRfZXhjZXB0aW9uKAotICAgICAgICAgICAgc3RkOjptYWtlX2V4Y2VwdGlvbl9wdHIoCi0gICAgICAgICAgICAgIGFzaW86OnN5c3RlbV9lcnJvcihlYykpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcHJvbWlzZV8tPnNldF92YWx1ZSh0KTsKLSAgICB9Ci0KLSAgLy9wcml2YXRlOgotICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnByb21pc2U8VD4gPiBwcm9taXNlXzsKLSAgfTsKLQotICAvLyBDb21wbGV0aW9uIGhhbmRsZXIgdG8gYWRhcHQgYSB2b2lkIHByb21pc2UgYXMgYSBjb21wbGV0aW9uIGhhbmRsZXIuCi0gIHRlbXBsYXRlIDw+Ci0gIGNsYXNzIHByb21pc2VfaGFuZGxlcjx2b2lkPgotICB7Ci0gIHB1YmxpYzoKLSAgICAvLyBDb25zdHJ1Y3QgZnJvbSB1c2VfZnV0dXJlIHNwZWNpYWwgdmFsdWUuIFVzZWQgZHVyaW5nIHJlYmluZGluZy4KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yPgotICAgIHByb21pc2VfaGFuZGxlcih1c2VfZnV0dXJlX3Q8QWxsb2NhdG9yPiB1ZikKLSAgICAgIDogcHJvbWlzZV8oc3RkOjphbGxvY2F0ZV9zaGFyZWQ8c3RkOjpwcm9taXNlPHZvaWQ+ID4oCi0gICAgICAgICAgICB1Zi5nZXRfYWxsb2NhdG9yKCksIHN0ZDo6YWxsb2NhdG9yX2FyZywgdWYuZ2V0X2FsbG9jYXRvcigpKSkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCBvcGVyYXRvcigpKCkKLSAgICB7Ci0gICAgICBwcm9taXNlXy0+c2V0X3ZhbHVlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjKQotICAgIHsKLSAgICAgIGlmIChlYykKLSAgICAgICAgcHJvbWlzZV8tPnNldF9leGNlcHRpb24oCi0gICAgICAgICAgICBzdGQ6Om1ha2VfZXhjZXB0aW9uX3B0cigKLSAgICAgICAgICAgICAgYXNpbzo6c3lzdGVtX2Vycm9yKGVjKSkpOwotICAgICAgZWxzZQotICAgICAgICBwcm9taXNlXy0+c2V0X3ZhbHVlKCk7Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpwcm9taXNlPHZvaWQ+ID4gcHJvbWlzZV87Ci0gIH07Ci0KLSAgLy8gRW5zdXJlIGFueSBleGNlcHRpb25zIHRocm93biBmcm9tIHRoZSBoYW5kbGVyIGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlCi0gIC8vIGNhbGxlciB2aWEgdGhlIGZ1dHVyZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBUPgotICB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoRnVuY3Rpb24gZiwgcHJvbWlzZV9oYW5kbGVyPFQ+KiBoKQotICB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6cHJvbWlzZTxUPiA+IHAoaC0+cHJvbWlzZV8pOwotICAgIHRyeQotICAgIHsKLSAgICAgIGYoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKC4uLikKLSAgICB7Ci0gICAgICBwLT5zZXRfZXhjZXB0aW9uKHN0ZDo6Y3VycmVudF9leGNlcHRpb24oKSk7Ci0gICAgfQotICB9Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi0jaWYgIWRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0vLyBIYW5kbGVyIHRyYWl0cyBzcGVjaWFsaXNhdGlvbiBmb3IgcHJvbWlzZV9oYW5kbGVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBhc3luY19yZXN1bHQ8ZGV0YWlsOjpwcm9taXNlX2hhbmRsZXI8VD4gPgotewotcHVibGljOgotICAvLyBUaGUgaW5pdGlhdGluZyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIGZ1dHVyZS4KLSAgdHlwZWRlZiBzdGQ6OmZ1dHVyZTxUPiB0eXBlOwotCi0gIC8vIENvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgcHJvbWlzZSBmb3IgdGhlIGFzeW5jIG9wZXJhdGlvbiwgYW5kIG9idGFpbnMgdGhlCi0gIC8vIGNvcnJlc3BvbmRpbmcgZnV0dXJlLgotICBleHBsaWNpdCBhc3luY19yZXN1bHQoZGV0YWlsOjpwcm9taXNlX2hhbmRsZXI8VD4mIGgpCi0gIHsKLSAgICB2YWx1ZV8gPSBoLnByb21pc2VfLT5nZXRfZnV0dXJlKCk7Ci0gIH0KLQotICAvLyBPYnRhaW4gdGhlIGZ1dHVyZSB0byBiZSByZXR1cm5lZCBmcm9tIHRoZSBpbml0aWF0aW5nIGZ1bmN0aW9uLgotICB0eXBlIGdldCgpIHsgcmV0dXJuIHN0ZDo6bW92ZSh2YWx1ZV8pOyB9Ci0KLXByaXZhdGU6Ci0gIHR5cGUgdmFsdWVfOwotfTsKLQotLy8gSGFuZGxlciB0eXBlIHNwZWNpYWxpc2F0aW9uIGZvciB1c2VfZnV0dXJlLgotdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgUmV0dXJuVHlwZT4KLXN0cnVjdCBoYW5kbGVyX3R5cGU8dXNlX2Z1dHVyZV90PEFsbG9jYXRvcj4sIFJldHVyblR5cGUoKT4KLXsKLSAgdHlwZWRlZiBkZXRhaWw6OnByb21pc2VfaGFuZGxlcjx2b2lkPiB0eXBlOwotfTsKLQotLy8gSGFuZGxlciB0eXBlIHNwZWNpYWxpc2F0aW9uIGZvciB1c2VfZnV0dXJlLgotdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgUmV0dXJuVHlwZSwgdHlwZW5hbWUgQXJnMT4KLXN0cnVjdCBoYW5kbGVyX3R5cGU8dXNlX2Z1dHVyZV90PEFsbG9jYXRvcj4sIFJldHVyblR5cGUoQXJnMSk+Ci17Ci0gIHR5cGVkZWYgZGV0YWlsOjpwcm9taXNlX2hhbmRsZXI8QXJnMT4gdHlwZTsKLX07Ci0KLS8vIEhhbmRsZXIgdHlwZSBzcGVjaWFsaXNhdGlvbiBmb3IgdXNlX2Z1dHVyZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJldHVyblR5cGU+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPHVzZV9mdXR1cmVfdDxBbGxvY2F0b3I+LAotICAgIFJldHVyblR5cGUoYXNpbzo6ZXJyb3JfY29kZSk+Ci17Ci0gIHR5cGVkZWYgZGV0YWlsOjpwcm9taXNlX2hhbmRsZXI8dm9pZD4gdHlwZTsKLX07Ci0KLS8vIEhhbmRsZXIgdHlwZSBzcGVjaWFsaXNhdGlvbiBmb3IgdXNlX2Z1dHVyZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJldHVyblR5cGUsIHR5cGVuYW1lIEFyZzI+Ci1zdHJ1Y3QgaGFuZGxlcl90eXBlPHVzZV9mdXR1cmVfdDxBbGxvY2F0b3I+LAotICAgIFJldHVyblR5cGUoYXNpbzo6ZXJyb3JfY29kZSwgQXJnMik+Ci17Ci0gIHR5cGVkZWYgZGV0YWlsOjpwcm9taXNlX2hhbmRsZXI8QXJnMj4gdHlwZTsKLX07Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSU1QTF9VU0VfRlVUVVJFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvd3JpdGUuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvd3JpdGUuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmFjNTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3dyaXRlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2NSArMCwwIEBACi0vLwotLy8gaW1wbC93cml0ZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSU1QTF9XUklURV9IUFAKLSNkZWZpbmUgQVNJT19JTVBMX1dSSVRFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2J1ZmZlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9jb21wbGV0aW9uX2NvbmRpdGlvbi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYXJyYXlfZndkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iYXNlX2Zyb21fY29tcGxldGlvbl9jb25kLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbnN1bWluZ19idWZmZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9kZXBlbmRlbnRfdHlwZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2NvbnRfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1dyaXRlU3RyZWFtLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24+Ci1zdGQ6OnNpemVfdCB3cml0ZShTeW5jV3JpdGVTdHJlYW0mIHMsIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICBhc2lvOjpkZXRhaWw6OmNvbnN1bWluZ19idWZmZXJzPAotICAgIGNvbnN0X2J1ZmZlciwgQ29uc3RCdWZmZXJTZXF1ZW5jZT4gdG1wKGJ1ZmZlcnMpOwotICBzdGQ6OnNpemVfdCB0b3RhbF90cmFuc2ZlcnJlZCA9IDA7Ci0gIHRtcC5wcmVwYXJlKGRldGFpbDo6YWRhcHRfY29tcGxldGlvbl9jb25kaXRpb25fcmVzdWx0KAotICAgICAgICBjb21wbGV0aW9uX2NvbmRpdGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWQpKSk7Ci0gIHdoaWxlICh0bXAuYmVnaW4oKSAhPSB0bXAuZW5kKCkpCi0gIHsKLSAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IHMud3JpdGVfc29tZSh0bXAsIGVjKTsKLSAgICB0bXAuY29uc3VtZShieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgdG90YWxfdHJhbnNmZXJyZWQgKz0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0gICAgdG1wLnByZXBhcmUoZGV0YWlsOjphZGFwdF9jb21wbGV0aW9uX2NvbmRpdGlvbl9yZXN1bHQoCi0gICAgICAgICAgY29tcGxldGlvbl9jb25kaXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkKSkpOwotICB9Ci0gIHJldHVybiB0b3RhbF90cmFuc2ZlcnJlZDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBzdGQ6OnNpemVfdCB3cml0ZShTeW5jV3JpdGVTdHJlYW0mIHMsIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gd3JpdGUocywgYnVmZmVycywgdHJhbnNmZXJfYWxsKCksIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIndyaXRlIik7Ci0gIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBzdGQ6OnNpemVfdCB3cml0ZShTeW5jV3JpdGVTdHJlYW0mIHMsIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHJldHVybiB3cml0ZShzLCBidWZmZXJzLCB0cmFuc2Zlcl9hbGwoKSwgZWMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1dyaXRlU3RyZWFtLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24+Ci1pbmxpbmUgc3RkOjpzaXplX3Qgd3JpdGUoU3luY1dyaXRlU3RyZWFtJiBzLCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24pCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gd3JpdGUocywgYnVmZmVycywgY29tcGxldGlvbl9jb25kaXRpb24sIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIndyaXRlIik7Ci0gIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLX0KLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jV3JpdGVTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotc3RkOjpzaXplX3Qgd3JpdGUoU3luY1dyaXRlU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IHdyaXRlKHMsIGIuZGF0YSgpLCBjb21wbGV0aW9uX2NvbmRpdGlvbiwgZWMpOwotICBiLmNvbnN1bWUoYnl0ZXNfdHJhbnNmZXJyZWQpOwotICByZXR1cm4gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jV3JpdGVTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvcj4KLWlubGluZSBzdGQ6OnNpemVfdCB3cml0ZShTeW5jV3JpdGVTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gd3JpdGUocywgYiwgdHJhbnNmZXJfYWxsKCksIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIndyaXRlIik7Ci0gIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yPgotaW5saW5lIHN0ZDo6c2l6ZV90IHdyaXRlKFN5bmNXcml0ZVN0cmVhbSYgcywKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgcmV0dXJuIHdyaXRlKHMsIGIsIHRyYW5zZmVyX2FsbCgpLCBlYyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jV3JpdGVTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotaW5saW5lIHN0ZDo6c2l6ZV90IHdyaXRlKFN5bmNXcml0ZVN0cmVhbSYgcywKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IHdyaXRlKHMsIGIsIGNvbXBsZXRpb25fY29uZGl0aW9uLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ3cml0ZSIpOwotICByZXR1cm4gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci19Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi1uYW1lc3BhY2UgZGV0YWlsCi17Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1dyaXRlU3RyZWFtLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBjbGFzcyB3cml0ZV9vcAotICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIHdyaXRlX29wKEFzeW5jV3JpdGVTdHJlYW0mIHN0cmVhbSwgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwgV3JpdGVIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Ci0gICAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbj4oY29tcGxldGlvbl9jb25kaXRpb24pLAotICAgICAgICBzdHJlYW1fKHN0cmVhbSksCi0gICAgICAgIGJ1ZmZlcnNfKGJ1ZmZlcnMpLAotICAgICAgICBzdGFydF8oMCksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXygwKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSkKLSAgICB7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAgIHdyaXRlX29wKGNvbnN0IHdyaXRlX29wJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKG90aGVyLmhhbmRsZXJfKQotICAgIHsKLSAgICB9Ci0KLSAgICB3cml0ZV9vcCh3cml0ZV9vcCYmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBzdHJlYW1fKG90aGVyLnN0cmVhbV8pLAotICAgICAgICBidWZmZXJzXyhvdGhlci5idWZmZXJzXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShvdGhlci5oYW5kbGVyXykpCi0gICAgewotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLSAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkLCBpbnQgc3RhcnQgPSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3RhcnRfID0gc3RhcnQpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgYnVmZmVyc18ucHJlcGFyZSh0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW1fLmFzeW5jX3dyaXRlX3NvbWUoYnVmZmVyc18sCi0gICAgICAgICAgICAgIEFTSU9fTU9WRV9DQVNUKHdyaXRlX29wKSgqdGhpcykpOwotICAgICAgICAgIHJldHVybjsgZGVmYXVsdDoKLSAgICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8gKz0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0gICAgICAgICAgYnVmZmVyc18uY29uc3VtZShieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgICAgICAgYnVmZmVyc18ucHJlcGFyZSh0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICAgICAgaWYgKCghZWMgJiYgYnl0ZXNfdHJhbnNmZXJyZWQgPT0gMCkKLSAgICAgICAgICAgICAgfHwgYnVmZmVyc18uYmVnaW4oKSA9PSBidWZmZXJzXy5lbmQoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcl8oZWMsIHN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6c2l6ZV90Jj4odG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1dyaXRlU3RyZWFtJiBzdHJlYW1fOwotICAgIGFzaW86OmRldGFpbDo6Y29uc3VtaW5nX2J1ZmZlcnM8Ci0gICAgICBjb25zdF9idWZmZXIsIENvbnN0QnVmZmVyU2VxdWVuY2U+IGJ1ZmZlcnNfOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWRfOwotICAgIFdyaXRlSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNXcml0ZVN0cmVhbSwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgY2xhc3Mgd3JpdGVfb3A8QXN5bmNXcml0ZVN0cmVhbSwgYXNpbzo6bXV0YWJsZV9idWZmZXJzXzEsCi0gICAgICBDb21wbGV0aW9uQ29uZGl0aW9uLCBXcml0ZUhhbmRsZXI+Ci0gICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4KLSAgewotICBwdWJsaWM6Ci0gICAgd3JpdGVfb3AoQXN5bmNXcml0ZVN0cmVhbSYgc3RyZWFtLAotICAgICAgICBjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSYgYnVmZmVycywKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwKLSAgICAgICAgV3JpdGVIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Ci0gICAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbj4oY29tcGxldGlvbl9jb25kaXRpb24pLAotICAgICAgICBzdHJlYW1fKHN0cmVhbSksCi0gICAgICAgIGJ1ZmZlcl8oYnVmZmVycyksCi0gICAgICAgIHN0YXJ0XygwKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKDApLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKQotICAgIHsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gICAgd3JpdGVfb3AoY29uc3Qgd3JpdGVfb3AmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBzdHJlYW1fKG90aGVyLnN0cmVhbV8pLAotICAgICAgICBidWZmZXJfKG90aGVyLmJ1ZmZlcl8pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKG90aGVyLmhhbmRsZXJfKQotICAgIHsKLSAgICB9Ci0KLSAgICB3cml0ZV9vcCh3cml0ZV9vcCYmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBzdHJlYW1fKG90aGVyLnN0cmVhbV8pLAotICAgICAgICBidWZmZXJfKG90aGVyLmJ1ZmZlcl8pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgIHsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCwgaW50IHN0YXJ0ID0gMCkKLSAgICB7Ci0gICAgICBzdGQ6OnNpemVfdCBuID0gMDsKLSAgICAgIHN3aXRjaCAoc3RhcnRfID0gc3RhcnQpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgbiA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pOwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgc3RyZWFtXy5hc3luY193cml0ZV9zb21lKAotICAgICAgICAgICAgICBhc2lvOjpidWZmZXIoYnVmZmVyXyArIHRvdGFsX3RyYW5zZmVycmVkXywgbiksCi0gICAgICAgICAgICAgIEFTSU9fTU9WRV9DQVNUKHdyaXRlX29wKSgqdGhpcykpOwotICAgICAgICAgIHJldHVybjsgZGVmYXVsdDoKLSAgICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8gKz0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0gICAgICAgICAgaWYgKCghZWMgJiYgYnl0ZXNfdHJhbnNmZXJyZWQgPT0gMCkKLSAgICAgICAgICAgICAgfHwgKG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKSkgPT0gMAotICAgICAgICAgICAgICB8fCB0b3RhbF90cmFuc2ZlcnJlZF8gPT0gYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVyXykpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGhhbmRsZXJfKGVjLCBzdGF0aWNfY2FzdDxjb25zdCBzdGQ6OnNpemVfdCY+KHRvdGFsX3RyYW5zZmVycmVkXykpOwotICAgICAgfQotICAgIH0KLQotICAvL3ByaXZhdGU6Ci0gICAgQXN5bmNXcml0ZVN0cmVhbSYgc3RyZWFtXzsKLSAgICBhc2lvOjptdXRhYmxlX2J1ZmZlciBidWZmZXJfOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWRfOwotICAgIFdyaXRlSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNXcml0ZVN0cmVhbSwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgY2xhc3Mgd3JpdGVfb3A8QXN5bmNXcml0ZVN0cmVhbSwgYXNpbzo6Y29uc3RfYnVmZmVyc18xLAotICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgV3JpdGVIYW5kbGVyPgotICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIHdyaXRlX29wKEFzeW5jV3JpdGVTdHJlYW0mIHN0cmVhbSwKLSAgICAgICAgY29uc3QgYXNpbzo6Y29uc3RfYnVmZmVyc18xJiBidWZmZXJzLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgICAgICBXcml0ZUhhbmRsZXImIGhhbmRsZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDwKLSAgICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uPihjb21wbGV0aW9uX2NvbmRpdGlvbiksCi0gICAgICAgIHN0cmVhbV8oc3RyZWFtKSwKLSAgICAgICAgYnVmZmVyXyhidWZmZXJzKSwKLSAgICAgICAgc3RhcnRfKDApLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8oMCksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICB3cml0ZV9vcChjb25zdCB3cml0ZV9vcCYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIHN0cmVhbV8ob3RoZXIuc3RyZWFtXyksCi0gICAgICAgIGJ1ZmZlcl8ob3RoZXIuYnVmZmVyXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gICAgewotICAgIH0KLQotICAgIHdyaXRlX29wKHdyaXRlX29wJiYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIHN0cmVhbV8ob3RoZXIuc3RyZWFtXyksCi0gICAgICAgIGJ1ZmZlcl8ob3RoZXIuYnVmZmVyXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShvdGhlci5oYW5kbGVyXykpCi0gICAgewotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLSAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkLCBpbnQgc3RhcnQgPSAwKQotICAgIHsKLSAgICAgIHN0ZDo6c2l6ZV90IG4gPSAwOwotICAgICAgc3dpdGNoIChzdGFydF8gPSBzdGFydCkKLSAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICBuID0gdGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXyk7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW1fLmFzeW5jX3dyaXRlX3NvbWUoCi0gICAgICAgICAgICAgIGFzaW86OmJ1ZmZlcihidWZmZXJfICsgdG90YWxfdHJhbnNmZXJyZWRfLCBuKSwKLSAgICAgICAgICAgICAgQVNJT19NT1ZFX0NBU1Qod3JpdGVfb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgcmV0dXJuOyBkZWZhdWx0OgotICAgICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyArPSBieXRlc190cmFuc2ZlcnJlZDsKLSAgICAgICAgICBpZiAoKCFlYyAmJiBieXRlc190cmFuc2ZlcnJlZCA9PSAwKQotICAgICAgICAgICAgICB8fCAobiA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pKSA9PSAwCi0gICAgICAgICAgICAgIHx8IHRvdGFsX3RyYW5zZmVycmVkXyA9PSBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJfKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcl8oZWMsIHN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6c2l6ZV90Jj4odG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1dyaXRlU3RyZWFtJiBzdHJlYW1fOwotICAgIGFzaW86OmNvbnN0X2J1ZmZlciBidWZmZXJfOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWRfOwotICAgIFdyaXRlSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgRWxlbSwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgY2xhc3Mgd3JpdGVfb3A8QXN5bmNXcml0ZVN0cmVhbSwgYm9vc3Q6OmFycmF5PEVsZW0sIDI+LAotICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgV3JpdGVIYW5kbGVyPgotICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIHdyaXRlX29wKEFzeW5jV3JpdGVTdHJlYW0mIHN0cmVhbSwgY29uc3QgYm9vc3Q6OmFycmF5PEVsZW0sIDI+JiBidWZmZXJzLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLCBXcml0ZUhhbmRsZXImIGhhbmRsZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDwKLSAgICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uPihjb21wbGV0aW9uX2NvbmRpdGlvbiksCi0gICAgICAgIHN0cmVhbV8oc3RyZWFtKSwKLSAgICAgICAgYnVmZmVyc18oYnVmZmVycyksCi0gICAgICAgIHN0YXJ0XygwKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKDApLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKQotICAgIHsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gICAgd3JpdGVfb3AoY29uc3Qgd3JpdGVfb3AmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBzdHJlYW1fKG90aGVyLnN0cmVhbV8pLAotICAgICAgICBidWZmZXJzXyhvdGhlci5idWZmZXJzXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gICAgewotICAgIH0KLQotICAgIHdyaXRlX29wKHdyaXRlX29wJiYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIHN0cmVhbV8ob3RoZXIuc3RyZWFtXyksCi0gICAgICAgIGJ1ZmZlcnNfKG90aGVyLmJ1ZmZlcnNfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQsIGludCBzdGFydCA9IDApCi0gICAgewotICAgICAgdHlwZW5hbWUgYXNpbzo6ZGV0YWlsOjpkZXBlbmRlbnRfdHlwZTxFbGVtLAotICAgICAgICAgIGJvb3N0OjphcnJheTxhc2lvOjpjb25zdF9idWZmZXIsIDI+ID46OnR5cGUgYnVmcyA9IHt7Ci0gICAgICAgIGFzaW86OmNvbnN0X2J1ZmZlcihidWZmZXJzX1swXSksCi0gICAgICAgIGFzaW86OmNvbnN0X2J1ZmZlcihidWZmZXJzX1sxXSkgfX07Ci0gICAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZTAgPSBhc2lvOjpidWZmZXJfc2l6ZShidWZzWzBdKTsKLSAgICAgIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplMSA9IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZnNbMV0pOwotICAgICAgc3RkOjpzaXplX3QgbiA9IDA7Ci0gICAgICBzd2l0Y2ggKHN0YXJ0XyA9IHN0YXJ0KQotICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKTsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIGJ1ZnNbMF0gPSBhc2lvOjpidWZmZXIoYnVmc1swXSArIHRvdGFsX3RyYW5zZmVycmVkXywgbik7Ci0gICAgICAgICAgYnVmc1sxXSA9IGFzaW86OmJ1ZmZlcigKLSAgICAgICAgICAgICAgYnVmc1sxXSArICh0b3RhbF90cmFuc2ZlcnJlZF8gPCBidWZmZXJfc2l6ZTAKLSAgICAgICAgICAgICAgICA/IDAgOiB0b3RhbF90cmFuc2ZlcnJlZF8gLSBidWZmZXJfc2l6ZTApLAotICAgICAgICAgICAgICBuIC0gYXNpbzo6YnVmZmVyX3NpemUoYnVmc1swXSkpOwotICAgICAgICAgIHN0cmVhbV8uYXN5bmNfd3JpdGVfc29tZShidWZzLCBBU0lPX01PVkVfQ0FTVCh3cml0ZV9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgICAgICAgIGlmICgoIWVjICYmIGJ5dGVzX3RyYW5zZmVycmVkID09IDApCi0gICAgICAgICAgICAgIHx8IChuID0gdGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXykpID09IDAKLSAgICAgICAgICAgICAgfHwgdG90YWxfdHJhbnNmZXJyZWRfID09IGJ1ZmZlcl9zaXplMCArIGJ1ZmZlcl9zaXplMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcl8oZWMsIHN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6c2l6ZV90Jj4odG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1dyaXRlU3RyZWFtJiBzdHJlYW1fOwotICAgIGJvb3N0OjphcnJheTxFbGVtLCAyPiBidWZmZXJzXzsKLSAgICBpbnQgc3RhcnRfOwotICAgIHN0ZDo6c2l6ZV90IHRvdGFsX3RyYW5zZmVycmVkXzsKLSAgICBXcml0ZUhhbmRsZXIgaGFuZGxlcl87Ci0gIH07Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9BUlJBWSkKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgRWxlbSwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgY2xhc3Mgd3JpdGVfb3A8QXN5bmNXcml0ZVN0cmVhbSwgc3RkOjphcnJheTxFbGVtLCAyPiwKLSAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFdyaXRlSGFuZGxlcj4KLSAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPgotICB7Ci0gIHB1YmxpYzoKLSAgICB3cml0ZV9vcChBc3luY1dyaXRlU3RyZWFtJiBzdHJlYW0sIGNvbnN0IHN0ZDo6YXJyYXk8RWxlbSwgMj4mIGJ1ZmZlcnMsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIFdyaXRlSGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPAotICAgICAgICAgIENvbXBsZXRpb25Db25kaXRpb24+KGNvbXBsZXRpb25fY29uZGl0aW9uKSwKLSAgICAgICAgc3RyZWFtXyhzdHJlYW0pLAotICAgICAgICBidWZmZXJzXyhidWZmZXJzKSwKLSAgICAgICAgc3RhcnRfKDApLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8oMCksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICB3cml0ZV9vcChjb25zdCB3cml0ZV9vcCYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIHN0cmVhbV8ob3RoZXIuc3RyZWFtXyksCi0gICAgICAgIGJ1ZmZlcnNfKG90aGVyLmJ1ZmZlcnNfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgd3JpdGVfb3Aod3JpdGVfb3AmJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgc3RyZWFtXyhvdGhlci5zdHJlYW1fKSwKLSAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgIHsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCwgaW50IHN0YXJ0ID0gMCkKLSAgICB7Ci0gICAgICB0eXBlbmFtZSBhc2lvOjpkZXRhaWw6OmRlcGVuZGVudF90eXBlPEVsZW0sCi0gICAgICAgICAgc3RkOjphcnJheTxhc2lvOjpjb25zdF9idWZmZXIsIDI+ID46OnR5cGUgYnVmcyA9IHt7Ci0gICAgICAgIGFzaW86OmNvbnN0X2J1ZmZlcihidWZmZXJzX1swXSksCi0gICAgICAgIGFzaW86OmNvbnN0X2J1ZmZlcihidWZmZXJzX1sxXSkgfX07Ci0gICAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZTAgPSBhc2lvOjpidWZmZXJfc2l6ZShidWZzWzBdKTsKLSAgICAgIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplMSA9IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZnNbMV0pOwotICAgICAgc3RkOjpzaXplX3QgbiA9IDA7Ci0gICAgICBzd2l0Y2ggKHN0YXJ0XyA9IHN0YXJ0KQotICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKTsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIGJ1ZnNbMF0gPSBhc2lvOjpidWZmZXIoYnVmc1swXSArIHRvdGFsX3RyYW5zZmVycmVkXywgbik7Ci0gICAgICAgICAgYnVmc1sxXSA9IGFzaW86OmJ1ZmZlcigKLSAgICAgICAgICAgICAgYnVmc1sxXSArICh0b3RhbF90cmFuc2ZlcnJlZF8gPCBidWZmZXJfc2l6ZTAKLSAgICAgICAgICAgICAgICA/IDAgOiB0b3RhbF90cmFuc2ZlcnJlZF8gLSBidWZmZXJfc2l6ZTApLAotICAgICAgICAgICAgICBuIC0gYXNpbzo6YnVmZmVyX3NpemUoYnVmc1swXSkpOwotICAgICAgICAgIHN0cmVhbV8uYXN5bmNfd3JpdGVfc29tZShidWZzLCBBU0lPX01PVkVfQ0FTVCh3cml0ZV9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgICAgICAgIGlmICgoIWVjICYmIGJ5dGVzX3RyYW5zZmVycmVkID09IDApCi0gICAgICAgICAgICAgIHx8IChuID0gdGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXykpID09IDAKLSAgICAgICAgICAgICAgfHwgdG90YWxfdHJhbnNmZXJyZWRfID09IGJ1ZmZlcl9zaXplMCArIGJ1ZmZlcl9zaXplMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcl8oZWMsIHN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6c2l6ZV90Jj4odG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1dyaXRlU3RyZWFtJiBzdHJlYW1fOwotICAgIHN0ZDo6YXJyYXk8RWxlbSwgMj4gYnVmZmVyc187Ci0gICAgaW50IHN0YXJ0XzsKLSAgICBzdGQ6OnNpemVfdCB0b3RhbF90cmFuc2ZlcnJlZF87Ci0gICAgV3JpdGVIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfQVJSQVkpCi0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jV3JpdGVTdHJlYW0sIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkKiBhc2lvX2hhbmRsZXJfYWxsb2NhdGUoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIHdyaXRlX29wPEFzeW5jV3JpdGVTdHJlYW0sIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFdyaXRlSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIHJldHVybiBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jV3JpdGVTdHJlYW0sIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9kZWFsbG9jYXRlKHZvaWQqIHBvaW50ZXIsIHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgICB3cml0ZV9vcDxBc3luY1dyaXRlU3RyZWFtLCBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uLCBXcml0ZUhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6ZGVhbGxvY2F0ZSgKLSAgICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgaW5saW5lIGJvb2wgYXNpb19oYW5kbGVyX2lzX2NvbnRpbnVhdGlvbigKLSAgICAgIHdyaXRlX29wPEFzeW5jV3JpdGVTdHJlYW0sIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFdyaXRlSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIHJldHVybiB0aGlzX2hhbmRsZXItPnN0YXJ0XyA9PSAwID8gdHJ1ZQotICAgICAgOiBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oCi0gICAgICAgICAgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEFzeW5jV3JpdGVTdHJlYW0sCi0gICAgICB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLAotICAgICAgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIHdyaXRlX29wPEFzeW5jV3JpdGVTdHJlYW0sIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFdyaXRlSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEFzeW5jV3JpdGVTdHJlYW0sCi0gICAgICB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLAotICAgICAgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIHdyaXRlX29wPEFzeW5jV3JpdGVTdHJlYW0sIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFdyaXRlSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZShBc3luY1dyaXRlU3RyZWFtJiBzLCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sCi0gICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV3JpdGVIYW5kbGVyLgotICBBU0lPX1dSSVRFX0hBTkRMRVJfQ0hFQ0soV3JpdGVIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICBkZXRhaWw6OndyaXRlX29wPEFzeW5jV3JpdGVTdHJlYW0sIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgQVNJT19IQU5ETEVSX1RZUEUoCi0gICAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSk+KAotICAgICAgICBzLCBidWZmZXJzLCBjb21wbGV0aW9uX2NvbmRpdGlvbiwgaW5pdC5oYW5kbGVyKSgKLSAgICAgICAgICBhc2lvOjplcnJvcl9jb2RlKCksIDAsIDEpOwotCi0gIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jV3JpdGVTdHJlYW0sIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZShBc3luY1dyaXRlU3RyZWFtJiBzLCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFdyaXRlSGFuZGxlci4KLSAgQVNJT19XUklURV9IQU5ETEVSX0NIRUNLKFdyaXRlSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIFdyaXRlSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgZGV0YWlsOjp3cml0ZV9vcDxBc3luY1dyaXRlU3RyZWFtLCBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgIGRldGFpbDo6dHJhbnNmZXJfYWxsX3QsIEFTSU9fSEFORExFUl9UWVBFKAotICAgICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpPigKLSAgICAgICAgcywgYnVmZmVycywgdHJhbnNmZXJfYWxsKCksIGluaXQuaGFuZGxlcikoCi0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAwLCAxKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi1uYW1lc3BhY2UgZGV0YWlsCi17Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgY2xhc3Mgd3JpdGVfc3RyZWFtYnVmX2hhbmRsZXIKLSAgewotICBwdWJsaWM6Ci0gICAgd3JpdGVfc3RyZWFtYnVmX2hhbmRsZXIoYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIHN0cmVhbWJ1ZiwKLSAgICAgICAgV3JpdGVIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBzdHJlYW1idWZfKHN0cmVhbWJ1ZiksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICB3cml0ZV9zdHJlYW1idWZfaGFuZGxlcihjb25zdCB3cml0ZV9zdHJlYW1idWZfaGFuZGxlciYgb3RoZXIpCi0gICAgICA6IHN0cmVhbWJ1Zl8ob3RoZXIuc3RyZWFtYnVmXyksCi0gICAgICAgIGhhbmRsZXJfKG90aGVyLmhhbmRsZXJfKQotICAgIHsKLSAgICB9Ci0KLSAgICB3cml0ZV9zdHJlYW1idWZfaGFuZGxlcih3cml0ZV9zdHJlYW1idWZfaGFuZGxlciYmIG90aGVyKQotICAgICAgOiBzdHJlYW1idWZfKG90aGVyLnN0cmVhbWJ1Zl8pLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQpCi0gICAgewotICAgICAgc3RyZWFtYnVmXy5jb25zdW1lKGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICAgIGhhbmRsZXJfKGVjLCBieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgc3RyZWFtYnVmXzsKLSAgICBXcml0ZUhhbmRsZXIgaGFuZGxlcl87Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgdm9pZCogYXNpb19oYW5kbGVyX2FsbG9jYXRlKHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgICB3cml0ZV9zdHJlYW1idWZfaGFuZGxlcjxBbGxvY2F0b3IsIFdyaXRlSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIHJldHVybiBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6YWxsb2NhdGUoCi0gICAgICAgIHNpemUsIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfZGVhbGxvY2F0ZSh2b2lkKiBwb2ludGVyLCBzdGQ6OnNpemVfdCBzaXplLAotICAgICAgd3JpdGVfc3RyZWFtYnVmX2hhbmRsZXI8QWxsb2NhdG9yLCBXcml0ZUhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6ZGVhbGxvY2F0ZSgKLSAgICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSBib29sIGFzaW9faGFuZGxlcl9pc19jb250aW51YXRpb24oCi0gICAgICB3cml0ZV9zdHJlYW1idWZfaGFuZGxlcjxBbGxvY2F0b3IsIFdyaXRlSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIHJldHVybiBhc2lvX2hhbmRsZXJfY29udF9oZWxwZXJzOjppc19jb250aW51YXRpb24oCi0gICAgICAgIHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2ludm9rZShGdW5jdGlvbiYgZnVuY3Rpb24sCi0gICAgICB3cml0ZV9zdHJlYW1idWZfaGFuZGxlcjxBbGxvY2F0b3IsIFdyaXRlSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9pbnZva2VfaGVscGVyczo6aW52b2tlKAotICAgICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKGNvbnN0IEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICAgIHdyaXRlX3N0cmVhbWJ1Zl9oYW5kbGVyPEFsbG9jYXRvciwgV3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1dyaXRlU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZShBc3luY1dyaXRlU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sCi0gICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV3JpdGVIYW5kbGVyLgotICBBU0lPX1dSSVRFX0hBTkRMRVJfQ0hFQ0soV3JpdGVIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICBhc3luY193cml0ZShzLCBiLmRhdGEoKSwgY29tcGxldGlvbl9jb25kaXRpb24sCi0gICAgZGV0YWlsOjp3cml0ZV9zdHJlYW1idWZfaGFuZGxlcjxBbGxvY2F0b3IsIEFTSU9fSEFORExFUl9UWVBFKAotICAgICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpPigKLSAgICAgICAgYiwgaW5pdC5oYW5kbGVyKSk7Ci0KLSAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci1pbmxpbmUgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLWFzeW5jX3dyaXRlKEFzeW5jV3JpdGVTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV3JpdGVIYW5kbGVyLgotICBBU0lPX1dSSVRFX0hBTkRMRVJfQ0hFQ0soV3JpdGVIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICBhc3luY193cml0ZShzLCBiLmRhdGEoKSwgdHJhbnNmZXJfYWxsKCksCi0gICAgZGV0YWlsOjp3cml0ZV9zdHJlYW1idWZfaGFuZGxlcjxBbGxvY2F0b3IsIEFTSU9fSEFORExFUl9UWVBFKAotICAgICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpPigKLSAgICAgICAgYiwgaW5pdC5oYW5kbGVyKSk7Ci0KLSAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotfQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19JTVBMX1dSSVRFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvd3JpdGVfYXQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2ltcGwvd3JpdGVfYXQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTI3OTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pbXBsL3dyaXRlX2F0LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyNSArMCwwIEBACi0vLwotLy8gaW1wbC93cml0ZV9hdC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSU1QTF9XUklURV9BVF9IUFAKLSNkZWZpbmUgQVNJT19JTVBMX1dSSVRFX0FUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2J1ZmZlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9jb21wbGV0aW9uX2NvbmRpdGlvbi5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYXJyYXlfZndkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iYXNlX2Zyb21fY29tcGxldGlvbl9jb25kLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9iaW5kX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbnN1bWluZ19idWZmZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9kZXBlbmRlbnRfdHlwZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9hbGxvY19oZWxwZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX2NvbnRfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl9pbnZva2VfaGVscGVycy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24+Ci1zdGQ6OnNpemVfdCB3cml0ZV9hdChTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgYXNpbzo6ZGV0YWlsOjpjb25zdW1pbmdfYnVmZmVyczwKLSAgICBjb25zdF9idWZmZXIsIENvbnN0QnVmZmVyU2VxdWVuY2U+IHRtcChidWZmZXJzKTsKLSAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWQgPSAwOwotICB0bXAucHJlcGFyZShkZXRhaWw6OmFkYXB0X2NvbXBsZXRpb25fY29uZGl0aW9uX3Jlc3VsdCgKLSAgICAgICAgY29tcGxldGlvbl9jb25kaXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkKSkpOwotICB3aGlsZSAodG1wLmJlZ2luKCkgIT0gdG1wLmVuZCgpKQotICB7Ci0gICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSBkLndyaXRlX3NvbWVfYXQoCi0gICAgICAgIG9mZnNldCArIHRvdGFsX3RyYW5zZmVycmVkLCB0bXAsIGVjKTsKLSAgICB0bXAuY29uc3VtZShieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgdG90YWxfdHJhbnNmZXJyZWQgKz0gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0gICAgdG1wLnByZXBhcmUoZGV0YWlsOjphZGFwdF9jb21wbGV0aW9uX2NvbmRpdGlvbl9yZXN1bHQoCi0gICAgICAgICAgY29tcGxldGlvbl9jb25kaXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkKSkpOwotICB9Ci0gIHJldHVybiB0b3RhbF90cmFuc2ZlcnJlZDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLWlubGluZSBzdGQ6OnNpemVfdCB3cml0ZV9hdChTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IHdyaXRlX2F0KAotICAgICAgZCwgb2Zmc2V0LCBidWZmZXJzLCB0cmFuc2Zlcl9hbGwoKSwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAid3JpdGVfYXQiKTsKLSAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotaW5saW5lIHN0ZDo6c2l6ZV90IHdyaXRlX2F0KFN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHJldHVybiB3cml0ZV9hdChkLCBvZmZzZXQsIGJ1ZmZlcnMsIHRyYW5zZmVyX2FsbCgpLCBlYyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UsIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbj4KLWlubGluZSBzdGQ6OnNpemVfdCB3cml0ZV9hdChTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24pCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gd3JpdGVfYXQoCi0gICAgICBkLCBvZmZzZXQsIGJ1ZmZlcnMsIGNvbXBsZXRpb25fY29uZGl0aW9uLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ3cml0ZV9hdCIpOwotICByZXR1cm4gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci19Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbj4KLXN0ZDo6c2l6ZV90IHdyaXRlX2F0KFN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCA9IHdyaXRlX2F0KAotICAgICAgZCwgb2Zmc2V0LCBiLmRhdGEoKSwgY29tcGxldGlvbl9jb25kaXRpb24sIGVjKTsKLSAgYi5jb25zdW1lKGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1pbmxpbmUgc3RkOjpzaXplX3Qgd3JpdGVfYXQoU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gd3JpdGVfYXQoZCwgb2Zmc2V0LCBiLCB0cmFuc2Zlcl9hbGwoKSwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAid3JpdGVfYXQiKTsKLSAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1pbmxpbmUgc3RkOjpzaXplX3Qgd3JpdGVfYXQoU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHJldHVybiB3cml0ZV9hdChkLCBvZmZzZXQsIGIsIHRyYW5zZmVyX2FsbCgpLCBlYyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotaW5saW5lIHN0ZDo6c2l6ZV90IHdyaXRlX2F0KFN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24pCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gd3JpdGVfYXQoCi0gICAgICBkLCBvZmZzZXQsIGIsIGNvbXBsZXRpb25fY29uZGl0aW9uLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ3cml0ZV9hdCIpOwotICByZXR1cm4gYnl0ZXNfdHJhbnNmZXJyZWQ7Ci19Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi1uYW1lc3BhY2UgZGV0YWlsCi17Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBjbGFzcyB3cml0ZV9hdF9vcAotICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIHdyaXRlX2F0X29wKEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGRldmljZSwKLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLCBXcml0ZUhhbmRsZXImIGhhbmRsZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDwKLSAgICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uPihjb21wbGV0aW9uX2NvbmRpdGlvbiksCi0gICAgICAgIGRldmljZV8oZGV2aWNlKSwKLSAgICAgICAgb2Zmc2V0XyhvZmZzZXQpLAotICAgICAgICBidWZmZXJzXyhidWZmZXJzKSwKLSAgICAgICAgc3RhcnRfKDApLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8oMCksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICB3cml0ZV9hdF9vcChjb25zdCB3cml0ZV9hdF9vcCYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIGRldmljZV8ob3RoZXIuZGV2aWNlXyksCi0gICAgICAgIG9mZnNldF8ob3RoZXIub2Zmc2V0XyksCi0gICAgICAgIGJ1ZmZlcnNfKG90aGVyLmJ1ZmZlcnNfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgd3JpdGVfYXRfb3Aod3JpdGVfYXRfb3AmJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgZGV2aWNlXyhvdGhlci5kZXZpY2VfKSwKLSAgICAgICAgb2Zmc2V0XyhvdGhlci5vZmZzZXRfKSwKLSAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgIHsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCwgaW50IHN0YXJ0ID0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHN0YXJ0XyA9IHN0YXJ0KQotICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIGJ1ZmZlcnNfLnByZXBhcmUodGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXykpOwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgZGV2aWNlXy5hc3luY193cml0ZV9zb21lX2F0KAotICAgICAgICAgICAgICBvZmZzZXRfICsgdG90YWxfdHJhbnNmZXJyZWRfLCBidWZmZXJzXywKLSAgICAgICAgICAgICAgQVNJT19NT1ZFX0NBU1Qod3JpdGVfYXRfb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgcmV0dXJuOyBkZWZhdWx0OgotICAgICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyArPSBieXRlc190cmFuc2ZlcnJlZDsKLSAgICAgICAgICBidWZmZXJzXy5jb25zdW1lKGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgICAgICAgICBidWZmZXJzXy5wcmVwYXJlKHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pKTsKLSAgICAgICAgICBpZiAoKCFlYyAmJiBieXRlc190cmFuc2ZlcnJlZCA9PSAwKQotICAgICAgICAgICAgICB8fCBidWZmZXJzXy5iZWdpbigpID09IGJ1ZmZlcnNfLmVuZCgpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyXyhlYywgc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzaXplX3QmPih0b3RhbF90cmFuc2ZlcnJlZF8pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLy9wcml2YXRlOgotICAgIEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGRldmljZV87Ci0gICAgdWludDY0X3Qgb2Zmc2V0XzsKLSAgICBhc2lvOjpkZXRhaWw6OmNvbnN1bWluZ19idWZmZXJzPAotICAgICAgY29uc3RfYnVmZmVyLCBDb25zdEJ1ZmZlclNlcXVlbmNlPiBidWZmZXJzXzsKLSAgICBpbnQgc3RhcnRfOwotICAgIHN0ZDo6c2l6ZV90IHRvdGFsX3RyYW5zZmVycmVkXzsKLSAgICBXcml0ZUhhbmRsZXIgaGFuZGxlcl87Ci0gIH07Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UsCi0gICAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGNsYXNzIHdyaXRlX2F0X29wPEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UsCi0gICAgICBhc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSwgQ29tcGxldGlvbkNvbmRpdGlvbiwgV3JpdGVIYW5kbGVyPgotICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIHdyaXRlX2F0X29wKEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGRldmljZSwKLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSYgYnVmZmVycywKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwKLSAgICAgICAgV3JpdGVIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Ci0gICAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbj4oY29tcGxldGlvbl9jb25kaXRpb24pLAotICAgICAgICBkZXZpY2VfKGRldmljZSksCi0gICAgICAgIG9mZnNldF8ob2Zmc2V0KSwKLSAgICAgICAgYnVmZmVyXyhidWZmZXJzKSwKLSAgICAgICAgc3RhcnRfKDApLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8oMCksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICB3cml0ZV9hdF9vcChjb25zdCB3cml0ZV9hdF9vcCYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIGRldmljZV8ob3RoZXIuZGV2aWNlXyksCi0gICAgICAgIG9mZnNldF8ob3RoZXIub2Zmc2V0XyksCi0gICAgICAgIGJ1ZmZlcl8ob3RoZXIuYnVmZmVyXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gICAgewotICAgIH0KLQotICAgIHdyaXRlX2F0X29wKHdyaXRlX2F0X29wJiYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIGRldmljZV8ob3RoZXIuZGV2aWNlXyksCi0gICAgICAgIG9mZnNldF8ob3RoZXIub2Zmc2V0XyksCi0gICAgICAgIGJ1ZmZlcl8ob3RoZXIuYnVmZmVyXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShvdGhlci5oYW5kbGVyXykpCi0gICAgewotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLSAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkLCBpbnQgc3RhcnQgPSAwKQotICAgIHsKLSAgICAgIHN0ZDo6c2l6ZV90IG4gPSAwOwotICAgICAgc3dpdGNoIChzdGFydF8gPSBzdGFydCkKLSAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICBuID0gdGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXyk7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBkZXZpY2VfLmFzeW5jX3dyaXRlX3NvbWVfYXQob2Zmc2V0XyArIHRvdGFsX3RyYW5zZmVycmVkXywKLSAgICAgICAgICAgICAgYXNpbzo6YnVmZmVyKGJ1ZmZlcl8gKyB0b3RhbF90cmFuc2ZlcnJlZF8sIG4pLAotICAgICAgICAgICAgICBBU0lPX01PVkVfQ0FTVCh3cml0ZV9hdF9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgICAgICAgIGlmICgoIWVjICYmIGJ5dGVzX3RyYW5zZmVycmVkID09IDApCi0gICAgICAgICAgICAgIHx8IChuID0gdGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXykpID09IDAKLSAgICAgICAgICAgICAgfHwgdG90YWxfdHJhbnNmZXJyZWRfID09IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcl8pKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyXyhlYywgc3RhdGljX2Nhc3Q8Y29uc3Qgc3RkOjpzaXplX3QmPih0b3RhbF90cmFuc2ZlcnJlZF8pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgLy9wcml2YXRlOgotICAgIEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGRldmljZV87Ci0gICAgdWludDY0X3Qgb2Zmc2V0XzsKLSAgICBhc2lvOjptdXRhYmxlX2J1ZmZlciBidWZmZXJfOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWRfOwotICAgIFdyaXRlSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgY2xhc3Mgd3JpdGVfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgYXNpbzo6Y29uc3RfYnVmZmVyc18xLAotICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgV3JpdGVIYW5kbGVyPgotICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIHdyaXRlX2F0X29wKEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGRldmljZSwKLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBhc2lvOjpjb25zdF9idWZmZXJzXzEmIGJ1ZmZlcnMsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sCi0gICAgICAgIFdyaXRlSGFuZGxlciYgaGFuZGxlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPAotICAgICAgICAgIENvbXBsZXRpb25Db25kaXRpb24+KGNvbXBsZXRpb25fY29uZGl0aW9uKSwKLSAgICAgICAgZGV2aWNlXyhkZXZpY2UpLAotICAgICAgICBvZmZzZXRfKG9mZnNldCksCi0gICAgICAgIGJ1ZmZlcl8oYnVmZmVycyksCi0gICAgICAgIHN0YXJ0XygwKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKDApLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKQotICAgIHsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gICAgd3JpdGVfYXRfb3AoY29uc3Qgd3JpdGVfYXRfb3AmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBkZXZpY2VfKG90aGVyLmRldmljZV8pLAotICAgICAgICBvZmZzZXRfKG90aGVyLm9mZnNldF8pLAotICAgICAgICBidWZmZXJfKG90aGVyLmJ1ZmZlcl8pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKG90aGVyLmhhbmRsZXJfKQotICAgIHsKLSAgICB9Ci0KLSAgICB3cml0ZV9hdF9vcCh3cml0ZV9hdF9vcCYmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBkZXZpY2VfKG90aGVyLmRldmljZV8pLAotICAgICAgICBvZmZzZXRfKG90aGVyLm9mZnNldF8pLAotICAgICAgICBidWZmZXJfKG90aGVyLmJ1ZmZlcl8pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgIHsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCwgaW50IHN0YXJ0ID0gMCkKLSAgICB7Ci0gICAgICBzdGQ6OnNpemVfdCBuID0gMDsKLSAgICAgIHN3aXRjaCAoc3RhcnRfID0gc3RhcnQpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgbiA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pOwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgZGV2aWNlXy5hc3luY193cml0ZV9zb21lX2F0KG9mZnNldF8gKyB0b3RhbF90cmFuc2ZlcnJlZF8sCi0gICAgICAgICAgICAgIGFzaW86OmJ1ZmZlcihidWZmZXJfICsgdG90YWxfdHJhbnNmZXJyZWRfLCBuKSwKLSAgICAgICAgICAgICAgQVNJT19NT1ZFX0NBU1Qod3JpdGVfYXRfb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgcmV0dXJuOyBkZWZhdWx0OgotICAgICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyArPSBieXRlc190cmFuc2ZlcnJlZDsKLSAgICAgICAgICBpZiAoKCFlYyAmJiBieXRlc190cmFuc2ZlcnJlZCA9PSAwKQotICAgICAgICAgICAgICB8fCAobiA9IHRoaXMtPmNoZWNrX2Zvcl9jb21wbGV0aW9uKGVjLCB0b3RhbF90cmFuc2ZlcnJlZF8pKSA9PSAwCi0gICAgICAgICAgICAgIHx8IHRvdGFsX3RyYW5zZmVycmVkXyA9PSBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXJfKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcl8oZWMsIHN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6c2l6ZV90Jj4odG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkZXZpY2VfOwotICAgIHVpbnQ2NF90IG9mZnNldF87Ci0gICAgYXNpbzo6Y29uc3RfYnVmZmVyIGJ1ZmZlcl87Ci0gICAgaW50IHN0YXJ0XzsKLSAgICBzdGQ6OnNpemVfdCB0b3RhbF90cmFuc2ZlcnJlZF87Ci0gICAgV3JpdGVIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBFbGVtLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBjbGFzcyB3cml0ZV9hdF9vcDxBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCBib29zdDo6YXJyYXk8RWxlbSwgMj4sCi0gICAgICBDb21wbGV0aW9uQ29uZGl0aW9uLCBXcml0ZUhhbmRsZXI+Ci0gICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4KLSAgewotICBwdWJsaWM6Ci0gICAgd3JpdGVfYXRfb3AoQXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSYgZGV2aWNlLAotICAgICAgICB1aW50NjRfdCBvZmZzZXQsIGNvbnN0IGJvb3N0OjphcnJheTxFbGVtLCAyPiYgYnVmZmVycywKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwgV3JpdGVIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Ci0gICAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbj4oY29tcGxldGlvbl9jb25kaXRpb24pLAotICAgICAgICBkZXZpY2VfKGRldmljZSksCi0gICAgICAgIG9mZnNldF8ob2Zmc2V0KSwKLSAgICAgICAgYnVmZmVyc18oYnVmZmVycyksCi0gICAgICAgIHN0YXJ0XygwKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKDApLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKQotICAgIHsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gICAgd3JpdGVfYXRfb3AoY29uc3Qgd3JpdGVfYXRfb3AmIG90aGVyKQotICAgICAgOiBkZXRhaWw6OmJhc2VfZnJvbV9jb21wbGV0aW9uX2NvbmQ8Q29tcGxldGlvbkNvbmRpdGlvbj4ob3RoZXIpLAotICAgICAgICBkZXZpY2VfKG90aGVyLmRldmljZV8pLAotICAgICAgICBvZmZzZXRfKG90aGVyLm9mZnNldF8pLAotICAgICAgICBidWZmZXJzXyhvdGhlci5idWZmZXJzXyksCi0gICAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8ob3RoZXIudG90YWxfdHJhbnNmZXJyZWRfKSwKLSAgICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gICAgewotICAgIH0KLQotICAgIHdyaXRlX2F0X29wKHdyaXRlX2F0X29wJiYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIGRldmljZV8ob3RoZXIuZGV2aWNlXyksCi0gICAgICAgIG9mZnNldF8ob3RoZXIub2Zmc2V0XyksCi0gICAgICAgIGJ1ZmZlcnNfKG90aGVyLmJ1ZmZlcnNfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKG90aGVyLmhhbmRsZXJfKSkKLSAgICB7Ci0gICAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQsIGludCBzdGFydCA9IDApCi0gICAgewotICAgICAgdHlwZW5hbWUgYXNpbzo6ZGV0YWlsOjpkZXBlbmRlbnRfdHlwZTxFbGVtLAotICAgICAgICAgIGJvb3N0OjphcnJheTxhc2lvOjpjb25zdF9idWZmZXIsIDI+ID46OnR5cGUgYnVmcyA9IHt7Ci0gICAgICAgIGFzaW86OmNvbnN0X2J1ZmZlcihidWZmZXJzX1swXSksCi0gICAgICAgIGFzaW86OmNvbnN0X2J1ZmZlcihidWZmZXJzX1sxXSkgfX07Ci0gICAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZTAgPSBhc2lvOjpidWZmZXJfc2l6ZShidWZzWzBdKTsKLSAgICAgIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplMSA9IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZnNbMV0pOwotICAgICAgc3RkOjpzaXplX3QgbiA9IDA7Ci0gICAgICBzd2l0Y2ggKHN0YXJ0XyA9IHN0YXJ0KQotICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKTsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIGJ1ZnNbMF0gPSBhc2lvOjpidWZmZXIoYnVmc1swXSArIHRvdGFsX3RyYW5zZmVycmVkXywgbik7Ci0gICAgICAgICAgYnVmc1sxXSA9IGFzaW86OmJ1ZmZlcigKLSAgICAgICAgICAgICAgYnVmc1sxXSArICh0b3RhbF90cmFuc2ZlcnJlZF8gPCBidWZmZXJfc2l6ZTAKLSAgICAgICAgICAgICAgICA/IDAgOiB0b3RhbF90cmFuc2ZlcnJlZF8gLSBidWZmZXJfc2l6ZTApLAotICAgICAgICAgICAgICBuIC0gYXNpbzo6YnVmZmVyX3NpemUoYnVmc1swXSkpOwotICAgICAgICAgIGRldmljZV8uYXN5bmNfd3JpdGVfc29tZV9hdChvZmZzZXRfICsgdG90YWxfdHJhbnNmZXJyZWRfLAotICAgICAgICAgICAgICBidWZzLCBBU0lPX01PVkVfQ0FTVCh3cml0ZV9hdF9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgICAgICAgIGlmICgoIWVjICYmIGJ5dGVzX3RyYW5zZmVycmVkID09IDApCi0gICAgICAgICAgICAgIHx8IChuID0gdGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXykpID09IDAKLSAgICAgICAgICAgICAgfHwgdG90YWxfdHJhbnNmZXJyZWRfID09IGJ1ZmZlcl9zaXplMCArIGJ1ZmZlcl9zaXplMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcl8oZWMsIHN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6c2l6ZV90Jj4odG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkZXZpY2VfOwotICAgIHVpbnQ2NF90IG9mZnNldF87Ci0gICAgYm9vc3Q6OmFycmF5PEVsZW0sIDI+IGJ1ZmZlcnNfOwotICAgIGludCBzdGFydF87Ci0gICAgc3RkOjpzaXplX3QgdG90YWxfdHJhbnNmZXJyZWRfOwotICAgIFdyaXRlSGFuZGxlciBoYW5kbGVyXzsKLSAgfTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBFbGVtLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBjbGFzcyB3cml0ZV9hdF9vcDxBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCBzdGQ6OmFycmF5PEVsZW0sIDI+LAotICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgV3JpdGVIYW5kbGVyPgotICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+Ci0gIHsKLSAgcHVibGljOgotICAgIHdyaXRlX2F0X29wKEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGRldmljZSwKLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBzdGQ6OmFycmF5PEVsZW0sIDI+JiBidWZmZXJzLAotICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLCBXcml0ZUhhbmRsZXImIGhhbmRsZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDwKLSAgICAgICAgICBDb21wbGV0aW9uQ29uZGl0aW9uPihjb21wbGV0aW9uX2NvbmRpdGlvbiksCi0gICAgICAgIGRldmljZV8oZGV2aWNlKSwKLSAgICAgICAgb2Zmc2V0XyhvZmZzZXQpLAotICAgICAgICBidWZmZXJzXyhidWZmZXJzKSwKLSAgICAgICAgc3RhcnRfKDApLAotICAgICAgICB0b3RhbF90cmFuc2ZlcnJlZF8oMCksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICB3cml0ZV9hdF9vcChjb25zdCB3cml0ZV9hdF9vcCYgb3RoZXIpCi0gICAgICA6IGRldGFpbDo6YmFzZV9mcm9tX2NvbXBsZXRpb25fY29uZDxDb21wbGV0aW9uQ29uZGl0aW9uPihvdGhlciksCi0gICAgICAgIGRldmljZV8ob3RoZXIuZGV2aWNlXyksCi0gICAgICAgIG9mZnNldF8ob3RoZXIub2Zmc2V0XyksCi0gICAgICAgIGJ1ZmZlcnNfKG90aGVyLmJ1ZmZlcnNfKSwKLSAgICAgICAgc3RhcnRfKG90aGVyLnN0YXJ0XyksCi0gICAgICAgIHRvdGFsX3RyYW5zZmVycmVkXyhvdGhlci50b3RhbF90cmFuc2ZlcnJlZF8pLAotICAgICAgICBoYW5kbGVyXyhvdGhlci5oYW5kbGVyXykKLSAgICB7Ci0gICAgfQotCi0gICAgd3JpdGVfYXRfb3Aod3JpdGVfYXRfb3AmJiBvdGhlcikKLSAgICAgIDogZGV0YWlsOjpiYXNlX2Zyb21fY29tcGxldGlvbl9jb25kPENvbXBsZXRpb25Db25kaXRpb24+KG90aGVyKSwKLSAgICAgICAgZGV2aWNlXyhvdGhlci5kZXZpY2VfKSwKLSAgICAgICAgb2Zmc2V0XyhvdGhlci5vZmZzZXRfKSwKLSAgICAgICAgYnVmZmVyc18ob3RoZXIuYnVmZmVyc18pLAotICAgICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfKG90aGVyLnRvdGFsX3RyYW5zZmVycmVkXyksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikob3RoZXIuaGFuZGxlcl8pKQotICAgIHsKLSAgICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCwgaW50IHN0YXJ0ID0gMCkKLSAgICB7Ci0gICAgICB0eXBlbmFtZSBhc2lvOjpkZXRhaWw6OmRlcGVuZGVudF90eXBlPEVsZW0sCi0gICAgICAgICAgc3RkOjphcnJheTxhc2lvOjpjb25zdF9idWZmZXIsIDI+ID46OnR5cGUgYnVmcyA9IHt7Ci0gICAgICAgIGFzaW86OmNvbnN0X2J1ZmZlcihidWZmZXJzX1swXSksCi0gICAgICAgIGFzaW86OmNvbnN0X2J1ZmZlcihidWZmZXJzX1sxXSkgfX07Ci0gICAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZTAgPSBhc2lvOjpidWZmZXJfc2l6ZShidWZzWzBdKTsKLSAgICAgIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplMSA9IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZnNbMV0pOwotICAgICAgc3RkOjpzaXplX3QgbiA9IDA7Ci0gICAgICBzd2l0Y2ggKHN0YXJ0XyA9IHN0YXJ0KQotICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIG4gPSB0aGlzLT5jaGVja19mb3JfY29tcGxldGlvbihlYywgdG90YWxfdHJhbnNmZXJyZWRfKTsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIGJ1ZnNbMF0gPSBhc2lvOjpidWZmZXIoYnVmc1swXSArIHRvdGFsX3RyYW5zZmVycmVkXywgbik7Ci0gICAgICAgICAgYnVmc1sxXSA9IGFzaW86OmJ1ZmZlcigKLSAgICAgICAgICAgICAgYnVmc1sxXSArICh0b3RhbF90cmFuc2ZlcnJlZF8gPCBidWZmZXJfc2l6ZTAKLSAgICAgICAgICAgICAgICA/IDAgOiB0b3RhbF90cmFuc2ZlcnJlZF8gLSBidWZmZXJfc2l6ZTApLAotICAgICAgICAgICAgICBuIC0gYXNpbzo6YnVmZmVyX3NpemUoYnVmc1swXSkpOwotICAgICAgICAgIGRldmljZV8uYXN5bmNfd3JpdGVfc29tZV9hdChvZmZzZXRfICsgdG90YWxfdHJhbnNmZXJyZWRfLAotICAgICAgICAgICAgICBidWZzLCBBU0lPX01PVkVfQ0FTVCh3cml0ZV9hdF9vcCkoKnRoaXMpKTsKLSAgICAgICAgICByZXR1cm47IGRlZmF1bHQ6Ci0gICAgICAgICAgdG90YWxfdHJhbnNmZXJyZWRfICs9IGJ5dGVzX3RyYW5zZmVycmVkOwotICAgICAgICAgIGlmICgoIWVjICYmIGJ5dGVzX3RyYW5zZmVycmVkID09IDApCi0gICAgICAgICAgICAgIHx8IChuID0gdGhpcy0+Y2hlY2tfZm9yX2NvbXBsZXRpb24oZWMsIHRvdGFsX3RyYW5zZmVycmVkXykpID09IDAKLSAgICAgICAgICAgICAgfHwgdG90YWxfdHJhbnNmZXJyZWRfID09IGJ1ZmZlcl9zaXplMCArIGJ1ZmZlcl9zaXplMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcl8oZWMsIHN0YXRpY19jYXN0PGNvbnN0IHN0ZDo6c2l6ZV90Jj4odG90YWxfdHJhbnNmZXJyZWRfKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8vcHJpdmF0ZToKLSAgICBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkZXZpY2VfOwotICAgIHVpbnQ2NF90IG9mZnNldF87Ci0gICAgc3RkOjphcnJheTxFbGVtLCAyPiBidWZmZXJzXzsKLSAgICBpbnQgc3RhcnRfOwotICAgIHN0ZDo6c2l6ZV90IHRvdGFsX3RyYW5zZmVycmVkXzsKLSAgICBXcml0ZUhhbmRsZXIgaGFuZGxlcl87Ci0gIH07Ci0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9BUlJBWSkKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQqIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzdGQ6OnNpemVfdCBzaXplLAotICAgICAgd3JpdGVfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgV3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQgYXNpb19oYW5kbGVyX2RlYWxsb2NhdGUodm9pZCogcG9pbnRlciwgc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIHdyaXRlX2F0X29wPEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UsIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgICAgIENvbXBsZXRpb25Db25kaXRpb24sIFdyaXRlSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLSAgewotICAgIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjpkZWFsbG9jYXRlKAotICAgICAgICBwb2ludGVyLCBzaXplLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgYm9vbCBhc2lvX2hhbmRsZXJfaXNfY29udGludWF0aW9uKAotICAgICAgd3JpdGVfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgV3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIHRoaXNfaGFuZGxlci0+c3RhcnRfID09IDAgPyB0cnVlCi0gICAgICA6IGFzaW9faGFuZGxlcl9jb250X2hlbHBlcnM6OmlzX2NvbnRpbnVhdGlvbigKLSAgICAgICAgICB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwKLSAgICAgIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sCi0gICAgICB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgd3JpdGVfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgV3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwKLSAgICAgIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sCi0gICAgICB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgd3JpdGVfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiwgV3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBpbmxpbmUgd3JpdGVfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwKLSAgICAgIENvbnN0QnVmZmVyU2VxdWVuY2UsIENvbXBsZXRpb25Db25kaXRpb24sIFdyaXRlSGFuZGxlcj4KLSAgbWFrZV93cml0ZV9hdF9vcChBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLAotICAgICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwgV3JpdGVIYW5kbGVyIGhhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gd3JpdGVfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwKLSAgICAgIENvbnN0QnVmZmVyU2VxdWVuY2UsIENvbXBsZXRpb25Db25kaXRpb24sIFdyaXRlSGFuZGxlcj4oCi0gICAgICAgIGQsIG9mZnNldCwgYnVmZmVycywgY29tcGxldGlvbl9jb25kaXRpb24sIGhhbmRsZXIpOwotICB9Ci19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UsIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZV9hdChBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotewotICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFdyaXRlSGFuZGxlci4KLSAgQVNJT19XUklURV9IQU5ETEVSX0NIRUNLKFdyaXRlSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgIFdyaXRlSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgZGV0YWlsOjp3cml0ZV9hdF9vcDxBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgIENvbXBsZXRpb25Db25kaXRpb24sIEFTSU9fSEFORExFUl9UWVBFKAotICAgICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpPigKLSAgICAgICAgZCwgb2Zmc2V0LCBidWZmZXJzLCBjb21wbGV0aW9uX2NvbmRpdGlvbiwgaW5pdC5oYW5kbGVyKSgKLSAgICAgICAgICBhc2lvOjplcnJvcl9jb2RlKCksIDAsIDEpOwotCi0gIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UsIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZV9hdChBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLXsKLSAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBXcml0ZUhhbmRsZXIuCi0gIEFTSU9fV1JJVEVfSEFORExFUl9DSEVDSyhXcml0ZUhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotCi0gIGRldGFpbDo6d3JpdGVfYXRfb3A8QXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICBkZXRhaWw6OnRyYW5zZmVyX2FsbF90LCBBU0lPX0hBTkRMRVJfVFlQRSgKLSAgICAgIFdyaXRlSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKT4oCi0gICAgICAgIGQsIG9mZnNldCwgYnVmZmVycywgdHJhbnNmZXJfYWxsKCksIGluaXQuaGFuZGxlcikoCi0gICAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAwLCAxKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi1uYW1lc3BhY2UgZGV0YWlsCi17Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgY2xhc3Mgd3JpdGVfYXRfc3RyZWFtYnVmX29wCi0gIHsKLSAgcHVibGljOgotICAgIHdyaXRlX2F0X3N0cmVhbWJ1Zl9vcCgKLSAgICAgICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIHN0cmVhbWJ1ZiwKLSAgICAgICAgV3JpdGVIYW5kbGVyJiBoYW5kbGVyKQotICAgICAgOiBzdHJlYW1idWZfKHN0cmVhbWJ1ZiksCi0gICAgICAgIGhhbmRsZXJfKEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpCi0gICAgewotICAgIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgICB3cml0ZV9hdF9zdHJlYW1idWZfb3AoY29uc3Qgd3JpdGVfYXRfc3RyZWFtYnVmX29wJiBvdGhlcikKLSAgICAgIDogc3RyZWFtYnVmXyhvdGhlci5zdHJlYW1idWZfKSwKLSAgICAgICAgaGFuZGxlcl8ob3RoZXIuaGFuZGxlcl8pCi0gICAgewotICAgIH0KLQotICAgIHdyaXRlX2F0X3N0cmVhbWJ1Zl9vcCh3cml0ZV9hdF9zdHJlYW1idWZfb3AmJiBvdGhlcikKLSAgICAgIDogc3RyZWFtYnVmXyhvdGhlci5zdHJlYW1idWZfKSwKLSAgICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShvdGhlci5oYW5kbGVyXykpCi0gICAgewotICAgIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLSAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkKQotICAgIHsKLSAgICAgIHN0cmVhbWJ1Zl8uY29uc3VtZShieXRlc190cmFuc2ZlcnJlZCk7Ci0gICAgICBoYW5kbGVyXyhlYywgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgIH0KLQotICAvL3ByaXZhdGU6Ci0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIHN0cmVhbWJ1Zl87Ci0gICAgV3JpdGVIYW5kbGVyIGhhbmRsZXJfOwotICB9OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgaW5saW5lIHZvaWQqIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzdGQ6OnNpemVfdCBzaXplLAotICAgICAgd3JpdGVfYXRfc3RyZWFtYnVmX29wPEFsbG9jYXRvciwgV3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgcmV0dXJuIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9kZWFsbG9jYXRlKHZvaWQqIHBvaW50ZXIsIHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgICB3cml0ZV9hdF9zdHJlYW1idWZfb3A8QWxsb2NhdG9yLCBXcml0ZUhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICBhc2lvX2hhbmRsZXJfYWxsb2NfaGVscGVyczo6ZGVhbGxvY2F0ZSgKLSAgICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSBib29sIGFzaW9faGFuZGxlcl9pc19jb250aW51YXRpb24oCi0gICAgICB3cml0ZV9hdF9zdHJlYW1idWZfb3A8QWxsb2NhdG9yLCBXcml0ZUhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKAotICAgICAgICB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgd3JpdGVfYXRfc3RyZWFtYnVmX29wPEFsbG9jYXRvciwgV3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIGlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgICAgd3JpdGVfYXRfc3RyZWFtYnVmX29wPEFsbG9jYXRvciwgV3JpdGVIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotICB7Ci0gICAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgaW5saW5lIHdyaXRlX2F0X3N0cmVhbWJ1Zl9vcDxBbGxvY2F0b3IsIFdyaXRlSGFuZGxlcj4KLSAgbWFrZV93cml0ZV9hdF9zdHJlYW1idWZfb3AoCi0gICAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwgV3JpdGVIYW5kbGVyIGhhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gd3JpdGVfYXRfc3RyZWFtYnVmX29wPEFsbG9jYXRvciwgV3JpdGVIYW5kbGVyPihiLCBoYW5kbGVyKTsKLSAgfQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbiwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZV9hdChBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwKLSAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLXsKLSAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBXcml0ZUhhbmRsZXIuCi0gIEFTSU9fV1JJVEVfSEFORExFUl9DSEVDSyhXcml0ZUhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotCi0gIGFzeW5jX3dyaXRlX2F0KGQsIG9mZnNldCwgYi5kYXRhKCksIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgIGRldGFpbDo6d3JpdGVfYXRfc3RyZWFtYnVmX29wPEFsbG9jYXRvciwgQVNJT19IQU5ETEVSX1RZUEUoCi0gICAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSk+KAotICAgICAgICBiLCBpbml0LmhhbmRsZXIpKTsKLQotICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotaW5saW5lIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZV9hdChBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi17Ci0gIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV3JpdGVIYW5kbGVyLgotICBBU0lPX1dSSVRFX0hBTkRMRVJfQ0hFQ0soV3JpdGVIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICBhc3luY193cml0ZV9hdChkLCBvZmZzZXQsIGIuZGF0YSgpLCB0cmFuc2Zlcl9hbGwoKSwKLSAgICBkZXRhaWw6OndyaXRlX2F0X3N0cmVhbWJ1Zl9vcDxBbGxvY2F0b3IsIEFTSU9fSEFORExFUl9UWVBFKAotICAgICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpPigKLSAgICAgICAgYiwgaW5pdC5oYW5kbGVyKSk7Ci0KLSAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotfQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19JTVBMX1dSSVRFX0FUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lvX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lvX3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTBmNzU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pb19zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc3MCArMCwwIEBACi0vLwotLy8gaW9fc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSU9fU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19JT19TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPHR5cGVpbmZvPgotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd3JhcHBlZF9oYW5kbGVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yX2NvZGUuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luc29ja19pbml0LmhwcCIKLSNlbGlmIGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoX19RTlhfXykgfHwgZGVmaW5lZChfX2hwdXgpIHx8IGRlZmluZWQoX0FJWCkgXAotICB8fCBkZWZpbmVkKF9fb3NmX18pCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3NpZ25hbF9pbml0LmhwcCIKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi1jbGFzcyBpb19zZXJ2aWNlOwotdGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2U+IFNlcnZpY2UmIHVzZV9zZXJ2aWNlKGlvX3NlcnZpY2UmIGlvcyk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmljZT4gdm9pZCBhZGRfc2VydmljZShpb19zZXJ2aWNlJiBpb3MsIFNlcnZpY2UqIHN2Yyk7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmljZT4gYm9vbCBoYXNfc2VydmljZShpb19zZXJ2aWNlJiBpb3MpOwotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gIHR5cGVkZWYgY2xhc3Mgd2luX2lvY3BfaW9fc2VydmljZSBpb19zZXJ2aWNlX2ltcGw7Ci0gIGNsYXNzIHdpbl9pb2NwX292ZXJsYXBwZWRfcHRyOwotI2Vsc2UKLSAgdHlwZWRlZiBjbGFzcyB0YXNrX2lvX3NlcnZpY2UgaW9fc2VydmljZV9pbXBsOwotI2VuZGlmCi0gIGNsYXNzIHNlcnZpY2VfcmVnaXN0cnk7Ci19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLQotLy8vIFByb3ZpZGVzIGNvcmUgSS9PIGZ1bmN0aW9uYWxpdHkuCi0vKioKLSAqIFRoZSBpb19zZXJ2aWNlIGNsYXNzIHByb3ZpZGVzIHRoZSBjb3JlIEkvTyBmdW5jdGlvbmFsaXR5IGZvciB1c2VycyBvZiB0aGUKLSAqIGFzeW5jaHJvbm91cyBJL08gb2JqZWN0cywgaW5jbHVkaW5nOgotICoKLSAqIEBsaSBhc2lvOjppcDo6dGNwOjpzb2NrZXQKLSAqIEBsaSBhc2lvOjppcDo6dGNwOjphY2NlcHRvcgotICogQGxpIGFzaW86OmlwOjp1ZHA6OnNvY2tldAotICogQGxpIGFzaW86OmRlYWRsaW5lX3RpbWVyLgotICoKLSAqIFRoZSBpb19zZXJ2aWNlIGNsYXNzIGFsc28gaW5jbHVkZXMgZmFjaWxpdGllcyBpbnRlbmRlZCBmb3IgZGV2ZWxvcGVycyBvZgotICogY3VzdG9tIGFzeW5jaHJvbm91cyBzZXJ2aWNlcy4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBTYWZlLCB3aXRoIHRoZSBzcGVjaWZpYyBleGNlcHRpb25zIG9mIHRoZSByZXNldCgpIGFuZAotICogbm90aWZ5X2ZvcmsoKSBmdW5jdGlvbnMuIENhbGxpbmcgcmVzZXQoKSB3aGlsZSB0aGVyZSBhcmUgdW5maW5pc2hlZCBydW4oKSwKLSAqIHJ1bl9vbmUoKSwgcG9sbCgpIG9yIHBvbGxfb25lKCkgY2FsbHMgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLiBUaGUKLSAqIG5vdGlmeV9mb3JrKCkgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hpbGUgYW55IGlvX3NlcnZpY2UgZnVuY3Rpb24sCi0gKiBvciBhbnkgZnVuY3Rpb24gb24gYW4gSS9PIG9iamVjdCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW9fc2VydmljZSwgaXMKLSAqIGJlaW5nIGNhbGxlZCBpbiBhbm90aGVyIHRocmVhZC4KLSAqCi0gKiBAcGFyIENvbmNlcHRzOgotICogRGlzcGF0Y2hlci4KLSAqCi0gKiBAcGFyIFN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucwotICoKLSAqIFN5bmNocm9ub3VzIG9wZXJhdGlvbnMgb24gSS9PIG9iamVjdHMgaW1wbGljaXRseSBydW4gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0Ci0gKiBmb3IgYW4gaW5kaXZpZHVhbCBvcGVyYXRpb24uIFRoZSBpb19zZXJ2aWNlIGZ1bmN0aW9ucyBydW4oKSwgcnVuX29uZSgpLAotICogcG9sbCgpIG9yIHBvbGxfb25lKCkgbXVzdCBiZSBjYWxsZWQgZm9yIHRoZSBpb19zZXJ2aWNlIHRvIHBlcmZvcm0KLSAqIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIG9uIGJlaGFsZiBvZiBhIEMrKyBwcm9ncmFtLiBOb3RpZmljYXRpb24gdGhhdCBhbgotICogYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkIGlzIGRlbGl2ZXJlZCBieSBpbnZvY2F0aW9uIG9mIHRoZQotICogYXNzb2NpYXRlZCBoYW5kbGVyLiBIYW5kbGVycyBhcmUgaW52b2tlZCBvbmx5IGJ5IGEgdGhyZWFkIHRoYXQgaXMgY3VycmVudGx5Ci0gKiBjYWxsaW5nIGFueSBvdmVybG9hZCBvZiBydW4oKSwgcnVuX29uZSgpLCBwb2xsKCkgb3IgcG9sbF9vbmUoKSBmb3IgdGhlCi0gKiBpb19zZXJ2aWNlLgotICoKLSAqIEBwYXIgRWZmZWN0IG9mIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gaGFuZGxlcnMKLSAqCi0gKiBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gYSBoYW5kbGVyLCB0aGUgZXhjZXB0aW9uIGlzIGFsbG93ZWQgdG8KLSAqIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSB0aHJvd2luZyB0aHJlYWQncyBpbnZvY2F0aW9uIG9mIHJ1bigpLCBydW5fb25lKCksCi0gKiBwb2xsKCkgb3IgcG9sbF9vbmUoKS4gTm8gb3RoZXIgdGhyZWFkcyB0aGF0IGFyZSBjYWxsaW5nIGFueSBvZiB0aGVzZQotICogZnVuY3Rpb25zIGFyZSBhZmZlY3RlZC4gSXQgaXMgdGhlbiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGFwcGxpY2F0aW9uIHRvCi0gKiBjYXRjaCB0aGUgZXhjZXB0aW9uLgotICoKLSAqIEFmdGVyIHRoZSBleGNlcHRpb24gaGFzIGJlZW4gY2F1Z2h0LCB0aGUgcnVuKCksIHJ1bl9vbmUoKSwgcG9sbCgpIG9yCi0gKiBwb2xsX29uZSgpIGNhbGwgbWF5IGJlIHJlc3RhcnRlZCBAZW0gd2l0aG91dCB0aGUgbmVlZCBmb3IgYW4gaW50ZXJ2ZW5pbmcKLSAqIGNhbGwgdG8gcmVzZXQoKS4gVGhpcyBhbGxvd3MgdGhlIHRocmVhZCB0byByZWpvaW4gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0J3MKLSAqIHRocmVhZCBwb29sIHdpdGhvdXQgaW1wYWN0aW5nIGFueSBvdGhlciB0aHJlYWRzIGluIHRoZSBwb29sLgotICoKLSAqIEZvciBleGFtcGxlOgotICoKLSAqIEBjb2RlCi0gKiBhc2lvOjppb19zZXJ2aWNlIGlvX3NlcnZpY2U7Ci0gKiAuLi4KLSAqIGZvciAoOzspCi0gKiB7Ci0gKiAgIHRyeQotICogICB7Ci0gKiAgICAgaW9fc2VydmljZS5ydW4oKTsKLSAqICAgICBicmVhazsgLy8gcnVuKCkgZXhpdGVkIG5vcm1hbGx5Ci0gKiAgIH0KLSAqICAgY2F0Y2ggKG15X2V4Y2VwdGlvbiYgZSkKLSAqICAgewotICogICAgIC8vIERlYWwgd2l0aCBleGNlcHRpb24gYXMgYXBwcm9wcmlhdGUuCi0gKiAgIH0KLSAqIH0KLSAqIEBlbmRjb2RlCi0gKgotICogQHBhciBTdG9wcGluZyB0aGUgaW9fc2VydmljZSBmcm9tIHJ1bm5pbmcgb3V0IG9mIHdvcmsKLSAqCi0gKiBTb21lIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byBwcmV2ZW50IGFuIGlvX3NlcnZpY2Ugb2JqZWN0J3MgcnVuKCkgY2FsbCBmcm9tCi0gKiByZXR1cm5pbmcgd2hlbiB0aGVyZSBpcyBubyBtb3JlIHdvcmsgdG8gZG8uIEZvciBleGFtcGxlLCB0aGUgaW9fc2VydmljZSBtYXkKLSAqIGJlIGJlaW5nIHJ1biBpbiBhIGJhY2tncm91bmQgdGhyZWFkIHRoYXQgaXMgbGF1bmNoZWQgcHJpb3IgdG8gdGhlCi0gKiBhcHBsaWNhdGlvbidzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLiBUaGUgcnVuKCkgY2FsbCBtYXkgYmUga2VwdCBydW5uaW5nIGJ5Ci0gKiBjcmVhdGluZyBhbiBvYmplY3Qgb2YgdHlwZSBhc2lvOjppb19zZXJ2aWNlOjp3b3JrOgotICoKLSAqIEBjb2RlIGFzaW86OmlvX3NlcnZpY2UgaW9fc2VydmljZTsKLSAqIGFzaW86OmlvX3NlcnZpY2U6Ondvcmsgd29yayhpb19zZXJ2aWNlKTsKLSAqIC4uLiBAZW5kY29kZQotICoKLSAqIFRvIGVmZmVjdCBhIHNodXRkb3duLCB0aGUgYXBwbGljYXRpb24gd2lsbCB0aGVuIG5lZWQgdG8gY2FsbCB0aGUgaW9fc2VydmljZQotICogb2JqZWN0J3Mgc3RvcCgpIG1lbWJlciBmdW5jdGlvbi4gVGhpcyB3aWxsIGNhdXNlIHRoZSBpb19zZXJ2aWNlIHJ1bigpIGNhbGwKLSAqIHRvIHJldHVybiBhcyBzb29uIGFzIHBvc3NpYmxlLCBhYmFuZG9uaW5nIHVuZmluaXNoZWQgb3BlcmF0aW9ucyBhbmQgd2l0aG91dAotICogcGVybWl0dGluZyByZWFkeSBoYW5kbGVycyB0byBiZSBkaXNwYXRjaGVkLgotICoKLSAqIEFsdGVybmF0aXZlbHksIGlmIHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IGFsbCBvcGVyYXRpb25zIGFuZCBoYW5kbGVycwotICogYmUgYWxsb3dlZCB0byBmaW5pc2ggbm9ybWFsbHksIHRoZSB3b3JrIG9iamVjdCBtYXkgYmUgZXhwbGljaXRseSBkZXN0cm95ZWQuCi0gKgotICogQGNvZGUgYXNpbzo6aW9fc2VydmljZSBpb19zZXJ2aWNlOwotICogYXV0b19wdHI8YXNpbzo6aW9fc2VydmljZTo6d29yaz4gd29yaygKLSAqICAgICBuZXcgYXNpbzo6aW9fc2VydmljZTo6d29yayhpb19zZXJ2aWNlKSk7Ci0gKiAuLi4KLSAqIHdvcmsucmVzZXQoKTsgLy8gQWxsb3cgcnVuKCkgdG8gZXhpdC4gQGVuZGNvZGUKLSAqCi0gKiBAcGFyIFRoZSBpb19zZXJ2aWNlIGNsYXNzIGFuZCBJL08gc2VydmljZXMKLSAqCi0gKiBDbGFzcyBpb19zZXJ2aWNlIGltcGxlbWVudHMgYW4gZXh0ZW5zaWJsZSwgdHlwZS1zYWZlLCBwb2x5bW9ycGhpYyBzZXQgb2YgSS9PCi0gKiBzZXJ2aWNlcywgaW5kZXhlZCBieSBzZXJ2aWNlIHR5cGUuIEFuIG9iamVjdCBvZiBjbGFzcyBpb19zZXJ2aWNlIG11c3QgYmUKLSAqIGluaXRpYWxpc2VkIGJlZm9yZSBJL08gb2JqZWN0cyBzdWNoIGFzIHNvY2tldHMsIHJlc29sdmVycyBhbmQgdGltZXJzIGNhbiBiZQotICogdXNlZC4gVGhlc2UgSS9PIG9iamVjdHMgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgaGF2aW5nIGNvbnN0cnVjdG9ycyB0aGF0IGFjY2VwdAotICogYW4gQGMgaW9fc2VydmljZSYgcGFyYW1ldGVyLgotICoKLSAqIEkvTyBzZXJ2aWNlcyBleGlzdCB0byBtYW5hZ2UgdGhlIGxvZ2ljYWwgaW50ZXJmYWNlIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi0gKiBiZWhhbGYgb2YgdGhlIEkvTyBvYmplY3RzLiBJbiBwYXJ0aWN1bGFyLCB0aGVyZSBhcmUgcmVzb3VyY2VzIHRoYXQgYXJlIHNoYXJlZAotICogYWNyb3NzIGEgY2xhc3Mgb2YgSS9PIG9iamVjdHMuIEZvciBleGFtcGxlLCB0aW1lcnMgbWF5IGJlIGltcGxlbWVudGVkIGluCi0gKiB0ZXJtcyBvZiBhIHNpbmdsZSB0aW1lciBxdWV1ZS4gVGhlIEkvTyBzZXJ2aWNlcyBtYW5hZ2UgdGhlc2Ugc2hhcmVkCi0gKiByZXNvdXJjZXMuCi0gKgotICogQWNjZXNzIHRvIHRoZSBzZXJ2aWNlcyBvZiBhbiBpb19zZXJ2aWNlIGlzIHZpYSB0aHJlZSBmdW5jdGlvbiB0ZW1wbGF0ZXMsCi0gKiB1c2Vfc2VydmljZSgpLCBhZGRfc2VydmljZSgpIGFuZCBoYXNfc2VydmljZSgpLgotICoKLSAqIEluIGEgY2FsbCB0byBAYyB1c2Vfc2VydmljZTxTZXJ2aWNlPigpLCB0aGUgdHlwZSBhcmd1bWVudCBjaG9vc2VzIGEgc2VydmljZSwKLSAqIG1ha2luZyBhdmFpbGFibGUgYWxsIG1lbWJlcnMgb2YgdGhlIG5hbWVkIHR5cGUuIElmIEBjIFNlcnZpY2UgaXMgbm90IHByZXNlbnQKLSAqIGluIGFuIGlvX3NlcnZpY2UsIGFuIG9iamVjdCBvZiB0eXBlIEBjIFNlcnZpY2UgaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlCi0gKiBpb19zZXJ2aWNlLiBBIEMrKyBwcm9ncmFtIGNhbiBjaGVjayBpZiBhbiBpb19zZXJ2aWNlIGltcGxlbWVudHMgYQotICogcGFydGljdWxhciBzZXJ2aWNlIHdpdGggdGhlIGZ1bmN0aW9uIHRlbXBsYXRlIEBjIGhhc19zZXJ2aWNlPFNlcnZpY2U+KCkuCi0gKgotICogU2VydmljZSBvYmplY3RzIG1heSBiZSBleHBsaWNpdGx5IGFkZGVkIHRvIGFuIGlvX3NlcnZpY2UgdXNpbmcgdGhlIGZ1bmN0aW9uCi0gKiB0ZW1wbGF0ZSBAYyBhZGRfc2VydmljZTxTZXJ2aWNlPigpLiBJZiB0aGUgQGMgU2VydmljZSBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZQotICogc2VydmljZV9hbHJlYWR5X2V4aXN0cyBleGNlcHRpb24gaXMgdGhyb3duLiBJZiB0aGUgb3duZXIgb2YgdGhlIHNlcnZpY2UgaXMKLSAqIG5vdCB0aGUgc2FtZSBvYmplY3QgYXMgdGhlIGlvX3NlcnZpY2UgcGFyYW1ldGVyLCB0aGUgaW52YWxpZF9zZXJ2aWNlX293bmVyCi0gKiBleGNlcHRpb24gaXMgdGhyb3duLgotICoKLSAqIE9uY2UgYSBzZXJ2aWNlIHJlZmVyZW5jZSBpcyBvYnRhaW5lZCBmcm9tIGFuIGlvX3NlcnZpY2Ugb2JqZWN0IGJ5IGNhbGxpbmcKLSAqIHVzZV9zZXJ2aWNlKCksIHRoYXQgcmVmZXJlbmNlIHJlbWFpbnMgdXNhYmxlIGFzIGxvbmcgYXMgdGhlIG93bmluZyBpb19zZXJ2aWNlCi0gKiBvYmplY3QgZXhpc3RzLgotICoKLSAqIEFsbCBJL08gc2VydmljZSBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBpb19zZXJ2aWNlOjpzZXJ2aWNlIGFzIGEgcHVibGljIGJhc2UKLSAqIGNsYXNzLiBDdXN0b20gSS9PIHNlcnZpY2VzIG1heSBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmluZyBmcm9tIHRoaXMgY2xhc3MgYW5kCi0gKiB0aGVuIGFkZGVkIHRvIGFuIGlvX3NlcnZpY2UgdXNpbmcgdGhlIGZhY2lsaXRpZXMgZGVzY3JpYmVkIGFib3ZlLgotICovCi1jbGFzcyBpb19zZXJ2aWNlCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHJpdmF0ZToKLSAgdHlwZWRlZiBkZXRhaWw6OmlvX3NlcnZpY2VfaW1wbCBpbXBsX3R5cGU7Ci0jaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotICBmcmllbmQgY2xhc3MgZGV0YWlsOjp3aW5faW9jcF9vdmVybGFwcGVkX3B0cjsKLSNlbmRpZgotCi1wdWJsaWM6Ci0gIGNsYXNzIHdvcms7Ci0gIGZyaWVuZCBjbGFzcyB3b3JrOwotCi0gIGNsYXNzIGlkOwotCi0gIGNsYXNzIHNlcnZpY2U7Ci0KLSAgY2xhc3Mgc3RyYW5kOwotCi0gIC8vLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIGlvX3NlcnZpY2UoKTsKLQotICAvLy8gQ29uc3RydWN0b3IuCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Qgd2l0aCBhIGhpbnQgYWJvdXQgdGhlIHJlcXVpcmVkIGxldmVsIG9mIGNvbmN1cnJlbmN5LgotICAgKgotICAgKiBAcGFyYW0gY29uY3VycmVuY3lfaGludCBBIHN1Z2dlc3Rpb24gdG8gdGhlIGltcGxlbWVudGF0aW9uIG9uIGhvdyBtYW55Ci0gICAqIHRocmVhZHMgaXQgc2hvdWxkIGFsbG93IHRvIHJ1biBzaW11bHRhbmVvdXNseS4KLSAgICovCi0gIEFTSU9fREVDTCBleHBsaWNpdCBpb19zZXJ2aWNlKHN0ZDo6c2l6ZV90IGNvbmN1cnJlbmN5X2hpbnQpOwotCi0gIC8vLyBEZXN0cnVjdG9yLgotICAvKioKLSAgICogT24gZGVzdHJ1Y3Rpb24sIHRoZSBpb19zZXJ2aWNlIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2YKLSAgICogb3BlcmF0aW9uczoKLSAgICoKLSAgICogQGxpIEZvciBlYWNoIHNlcnZpY2Ugb2JqZWN0IEBjIHN2YyBpbiB0aGUgaW9fc2VydmljZSBzZXQsIGluIHJldmVyc2Ugb3JkZXIKLSAgICogb2YgdGhlIGJlZ2lubmluZyBvZiBzZXJ2aWNlIG9iamVjdCBsaWZldGltZSwgcGVyZm9ybXMKLSAgICogQGMgc3ZjLT5zaHV0ZG93bl9zZXJ2aWNlKCkuCi0gICAqCi0gICAqIEBsaSBVbmludm9rZWQgaGFuZGxlciBvYmplY3RzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZm9yIGRlZmVycmVkIGludm9jYXRpb24KLSAgICogb24gdGhlIGlvX3NlcnZpY2UsIG9yIGFueSBhc3NvY2lhdGVkIHN0cmFuZCwgYXJlIGRlc3Ryb3llZC4KLSAgICoKLSAgICogQGxpIEZvciBlYWNoIHNlcnZpY2Ugb2JqZWN0IEBjIHN2YyBpbiB0aGUgaW9fc2VydmljZSBzZXQsIGluIHJldmVyc2Ugb3JkZXIKLSAgICogb2YgdGhlIGJlZ2lubmluZyBvZiBzZXJ2aWNlIG9iamVjdCBsaWZldGltZSwgcGVyZm9ybXMKLSAgICogPHR0PmRlbGV0ZSBzdGF0aWNfY2FzdDxpb19zZXJ2aWNlOjpzZXJ2aWNlKj4oc3ZjKTwvdHQ+LgotICAgKgotICAgKiBAbm90ZSBUaGUgZGVzdHJ1Y3Rpb24gc2VxdWVuY2UgZGVzY3JpYmVkIGFib3ZlIHBlcm1pdHMgcHJvZ3JhbXMgdG8KLSAgICogc2ltcGxpZnkgdGhlaXIgcmVzb3VyY2UgbWFuYWdlbWVudCBieSB1c2luZyBAYyBzaGFyZWRfcHRyPD4uIFdoZXJlIGFuCi0gICAqIG9iamVjdCdzIGxpZmV0aW1lIGlzIHRpZWQgdG8gdGhlIGxpZmV0aW1lIG9mIGEgY29ubmVjdGlvbiAob3Igc29tZSBvdGhlcgotICAgKiBzZXF1ZW5jZSBvZiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyksIGEgQGMgc2hhcmVkX3B0ciB0byB0aGUgb2JqZWN0IHdvdWxkCi0gICAqIGJlIGJvdW5kIGludG8gdGhlIGhhbmRsZXJzIGZvciBhbGwgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoCi0gICAqIGl0LiBUaGlzIHdvcmtzIGFzIGZvbGxvd3M6Ci0gICAqCi0gICAqIEBsaSBXaGVuIGEgc2luZ2xlIGNvbm5lY3Rpb24gZW5kcywgYWxsIGFzc29jaWF0ZWQgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMKLSAgICogY29tcGxldGUuIFRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZXIgb2JqZWN0cyBhcmUgZGVzdHJveWVkLCBhbmQgYWxsCi0gICAqIEBjIHNoYXJlZF9wdHIgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0cyBhcmUgZGVzdHJveWVkLgotICAgKgotICAgKiBAbGkgVG8gc2h1dCBkb3duIHRoZSB3aG9sZSBwcm9ncmFtLCB0aGUgaW9fc2VydmljZSBmdW5jdGlvbiBzdG9wKCkgaXMKLSAgICogY2FsbGVkIHRvIHRlcm1pbmF0ZSBhbnkgcnVuKCkgY2FsbHMgYXMgc29vbiBhcyBwb3NzaWJsZS4gVGhlIGlvX3NlcnZpY2UKLSAgICogZGVzdHJ1Y3RvciBkZWZpbmVkIGFib3ZlIGRlc3Ryb3lzIGFsbCBoYW5kbGVycywgY2F1c2luZyBhbGwgQGMgc2hhcmVkX3B0cgotICAgKiByZWZlcmVuY2VzIHRvIGFsbCBjb25uZWN0aW9uIG9iamVjdHMgdG8gYmUgZGVzdHJveWVkLgotICAgKi8KLSAgQVNJT19ERUNMIH5pb19zZXJ2aWNlKCk7Ci0KLSAgLy8vIFJ1biB0aGUgaW9fc2VydmljZSBvYmplY3QncyBldmVudCBwcm9jZXNzaW5nIGxvb3AuCi0gIC8qKgotICAgKiBUaGUgcnVuKCkgZnVuY3Rpb24gYmxvY2tzIHVudGlsIGFsbCB3b3JrIGhhcyBmaW5pc2hlZCBhbmQgdGhlcmUgYXJlIG5vCi0gICAqIG1vcmUgaGFuZGxlcnMgdG8gYmUgZGlzcGF0Y2hlZCwgb3IgdW50aWwgdGhlIGlvX3NlcnZpY2UgaGFzIGJlZW4gc3RvcHBlZC4KLSAgICoKLSAgICogTXVsdGlwbGUgdGhyZWFkcyBtYXkgY2FsbCB0aGUgcnVuKCkgZnVuY3Rpb24gdG8gc2V0IHVwIGEgcG9vbCBvZiB0aHJlYWRzCi0gICAqIGZyb20gd2hpY2ggdGhlIGlvX3NlcnZpY2UgbWF5IGV4ZWN1dGUgaGFuZGxlcnMuIEFsbCB0aHJlYWRzIHRoYXQgYXJlCi0gICAqIHdhaXRpbmcgaW4gdGhlIHBvb2wgYXJlIGVxdWl2YWxlbnQgYW5kIHRoZSBpb19zZXJ2aWNlIG1heSBjaG9vc2UgYW55IG9uZQotICAgKiBvZiB0aGVtIHRvIGludm9rZSBhIGhhbmRsZXIuCi0gICAqCi0gICAqIEEgbm9ybWFsIGV4aXQgZnJvbSB0aGUgcnVuKCkgZnVuY3Rpb24gaW1wbGllcyB0aGF0IHRoZSBpb19zZXJ2aWNlIG9iamVjdAotICAgKiBpcyBzdG9wcGVkICh0aGUgc3RvcHBlZCgpIGZ1bmN0aW9uIHJldHVybnMgQGMgdHJ1ZSkuIFN1YnNlcXVlbnQgY2FsbHMgdG8KLSAgICogcnVuKCksIHJ1bl9vbmUoKSwgcG9sbCgpIG9yIHBvbGxfb25lKCkgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgdW5sZXNzIHRoZXJlCi0gICAqIGlzIGEgcHJpb3IgY2FsbCB0byByZXNldCgpLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGFuZGxlcnMgdGhhdCB3ZXJlIGV4ZWN1dGVkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJ1bigpIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIGEgdGhyZWFkIHRoYXQgaXMgY3VycmVudGx5Ci0gICAqIGNhbGxpbmcgb25lIG9mIHJ1bigpLCBydW5fb25lKCksIHBvbGwoKSBvciBwb2xsX29uZSgpIG9uIHRoZSBzYW1lCi0gICAqIGlvX3NlcnZpY2Ugb2JqZWN0LgotICAgKgotICAgKiBUaGUgcG9sbCgpIGZ1bmN0aW9uIG1heSBhbHNvIGJlIHVzZWQgdG8gZGlzcGF0Y2ggcmVhZHkgaGFuZGxlcnMsIGJ1dAotICAgKiB3aXRob3V0IGJsb2NraW5nLgotICAgKi8KLSAgQVNJT19ERUNMIHN0ZDo6c2l6ZV90IHJ1bigpOwotCi0gIC8vLyBSdW4gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0J3MgZXZlbnQgcHJvY2Vzc2luZyBsb29wLgotICAvKioKLSAgICogVGhlIHJ1bigpIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCBhbGwgd29yayBoYXMgZmluaXNoZWQgYW5kIHRoZXJlIGFyZSBubwotICAgKiBtb3JlIGhhbmRsZXJzIHRvIGJlIGRpc3BhdGNoZWQsIG9yIHVudGlsIHRoZSBpb19zZXJ2aWNlIGhhcyBiZWVuIHN0b3BwZWQuCi0gICAqCi0gICAqIE11bHRpcGxlIHRocmVhZHMgbWF5IGNhbGwgdGhlIHJ1bigpIGZ1bmN0aW9uIHRvIHNldCB1cCBhIHBvb2wgb2YgdGhyZWFkcwotICAgKiBmcm9tIHdoaWNoIHRoZSBpb19zZXJ2aWNlIG1heSBleGVjdXRlIGhhbmRsZXJzLiBBbGwgdGhyZWFkcyB0aGF0IGFyZQotICAgKiB3YWl0aW5nIGluIHRoZSBwb29sIGFyZSBlcXVpdmFsZW50IGFuZCB0aGUgaW9fc2VydmljZSBtYXkgY2hvb3NlIGFueSBvbmUKLSAgICogb2YgdGhlbSB0byBpbnZva2UgYSBoYW5kbGVyLgotICAgKgotICAgKiBBIG5vcm1hbCBleGl0IGZyb20gdGhlIHJ1bigpIGZ1bmN0aW9uIGltcGxpZXMgdGhhdCB0aGUgaW9fc2VydmljZSBvYmplY3QKLSAgICogaXMgc3RvcHBlZCAodGhlIHN0b3BwZWQoKSBmdW5jdGlvbiByZXR1cm5zIEBjIHRydWUpLiBTdWJzZXF1ZW50IGNhbGxzIHRvCi0gICAqIHJ1bigpLCBydW5fb25lKCksIHBvbGwoKSBvciBwb2xsX29uZSgpIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHVubGVzcyB0aGVyZQotICAgKiBpcyBhIHByaW9yIGNhbGwgdG8gcmVzZXQoKS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBoYW5kbGVycyB0aGF0IHdlcmUgZXhlY3V0ZWQuCi0gICAqCi0gICAqIEBub3RlIFRoZSBydW4oKSBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBhIHRocmVhZCB0aGF0IGlzIGN1cnJlbnRseQotICAgKiBjYWxsaW5nIG9uZSBvZiBydW4oKSwgcnVuX29uZSgpLCBwb2xsKCkgb3IgcG9sbF9vbmUoKSBvbiB0aGUgc2FtZQotICAgKiBpb19zZXJ2aWNlIG9iamVjdC4KLSAgICoKLSAgICogVGhlIHBvbGwoKSBmdW5jdGlvbiBtYXkgYWxzbyBiZSB1c2VkIHRvIGRpc3BhdGNoIHJlYWR5IGhhbmRsZXJzLCBidXQKLSAgICogd2l0aG91dCBibG9ja2luZy4KLSAgICovCi0gIEFTSU9fREVDTCBzdGQ6OnNpemVfdCBydW4oYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBSdW4gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0J3MgZXZlbnQgcHJvY2Vzc2luZyBsb29wIHRvIGV4ZWN1dGUgYXQgbW9zdCBvbmUKLSAgLy8vIGhhbmRsZXIuCi0gIC8qKgotICAgKiBUaGUgcnVuX29uZSgpIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCBvbmUgaGFuZGxlciBoYXMgYmVlbiBkaXNwYXRjaGVkLCBvcgotICAgKiB1bnRpbCB0aGUgaW9fc2VydmljZSBoYXMgYmVlbiBzdG9wcGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGFuZGxlcnMgdGhhdCB3ZXJlIGV4ZWN1dGVkLiBBIHplcm8gcmV0dXJuIHZhbHVlCi0gICAqIGltcGxpZXMgdGhhdCB0aGUgaW9fc2VydmljZSBvYmplY3QgaXMgc3RvcHBlZCAodGhlIHN0b3BwZWQoKSBmdW5jdGlvbgotICAgKiByZXR1cm5zIEBjIHRydWUpLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHJ1bigpLCBydW5fb25lKCksIHBvbGwoKSBvcgotICAgKiBwb2xsX29uZSgpIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHVubGVzcyB0aGVyZSBpcyBhIHByaW9yIGNhbGwgdG8KLSAgICogcmVzZXQoKS4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICBBU0lPX0RFQ0wgc3RkOjpzaXplX3QgcnVuX29uZSgpOwotCi0gIC8vLyBSdW4gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0J3MgZXZlbnQgcHJvY2Vzc2luZyBsb29wIHRvIGV4ZWN1dGUgYXQgbW9zdCBvbmUKLSAgLy8vIGhhbmRsZXIuCi0gIC8qKgotICAgKiBUaGUgcnVuX29uZSgpIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCBvbmUgaGFuZGxlciBoYXMgYmVlbiBkaXNwYXRjaGVkLCBvcgotICAgKiB1bnRpbCB0aGUgaW9fc2VydmljZSBoYXMgYmVlbiBzdG9wcGVkLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGFuZGxlcnMgdGhhdCB3ZXJlIGV4ZWN1dGVkLiBBIHplcm8gcmV0dXJuIHZhbHVlCi0gICAqIGltcGxpZXMgdGhhdCB0aGUgaW9fc2VydmljZSBvYmplY3QgaXMgc3RvcHBlZCAodGhlIHN0b3BwZWQoKSBmdW5jdGlvbgotICAgKiByZXR1cm5zIEBjIHRydWUpLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHJ1bigpLCBydW5fb25lKCksIHBvbGwoKSBvcgotICAgKiBwb2xsX29uZSgpIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IHVubGVzcyB0aGVyZSBpcyBhIHByaW9yIGNhbGwgdG8KLSAgICogcmVzZXQoKS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGhhbmRsZXJzIHRoYXQgd2VyZSBleGVjdXRlZC4KLSAgICovCi0gIEFTSU9fREVDTCBzdGQ6OnNpemVfdCBydW5fb25lKGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gUnVuIHRoZSBpb19zZXJ2aWNlIG9iamVjdCdzIGV2ZW50IHByb2Nlc3NpbmcgbG9vcCB0byBleGVjdXRlIHJlYWR5Ci0gIC8vLyBoYW5kbGVycy4KLSAgLyoqCi0gICAqIFRoZSBwb2xsKCkgZnVuY3Rpb24gcnVucyBoYW5kbGVycyB0aGF0IGFyZSByZWFkeSB0byBydW4sIHdpdGhvdXQgYmxvY2tpbmcsCi0gICAqIHVudGlsIHRoZSBpb19zZXJ2aWNlIGhhcyBiZWVuIHN0b3BwZWQgb3IgdGhlcmUgYXJlIG5vIG1vcmUgcmVhZHkgaGFuZGxlcnMuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBoYW5kbGVycyB0aGF0IHdlcmUgZXhlY3V0ZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgQVNJT19ERUNMIHN0ZDo6c2l6ZV90IHBvbGwoKTsKLQotICAvLy8gUnVuIHRoZSBpb19zZXJ2aWNlIG9iamVjdCdzIGV2ZW50IHByb2Nlc3NpbmcgbG9vcCB0byBleGVjdXRlIHJlYWR5Ci0gIC8vLyBoYW5kbGVycy4KLSAgLyoqCi0gICAqIFRoZSBwb2xsKCkgZnVuY3Rpb24gcnVucyBoYW5kbGVycyB0aGF0IGFyZSByZWFkeSB0byBydW4sIHdpdGhvdXQgYmxvY2tpbmcsCi0gICAqIHVudGlsIHRoZSBpb19zZXJ2aWNlIGhhcyBiZWVuIHN0b3BwZWQgb3IgdGhlcmUgYXJlIG5vIG1vcmUgcmVhZHkgaGFuZGxlcnMuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGFuZGxlcnMgdGhhdCB3ZXJlIGV4ZWN1dGVkLgotICAgKi8KLSAgQVNJT19ERUNMIHN0ZDo6c2l6ZV90IHBvbGwoYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBSdW4gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0J3MgZXZlbnQgcHJvY2Vzc2luZyBsb29wIHRvIGV4ZWN1dGUgb25lIHJlYWR5Ci0gIC8vLyBoYW5kbGVyLgotICAvKioKLSAgICogVGhlIHBvbGxfb25lKCkgZnVuY3Rpb24gcnVucyBhdCBtb3N0IG9uZSBoYW5kbGVyIHRoYXQgaXMgcmVhZHkgdG8gcnVuLAotICAgKiB3aXRob3V0IGJsb2NraW5nLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGFuZGxlcnMgdGhhdCB3ZXJlIGV4ZWN1dGVkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIEFTSU9fREVDTCBzdGQ6OnNpemVfdCBwb2xsX29uZSgpOwotCi0gIC8vLyBSdW4gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0J3MgZXZlbnQgcHJvY2Vzc2luZyBsb29wIHRvIGV4ZWN1dGUgb25lIHJlYWR5Ci0gIC8vLyBoYW5kbGVyLgotICAvKioKLSAgICogVGhlIHBvbGxfb25lKCkgZnVuY3Rpb24gcnVucyBhdCBtb3N0IG9uZSBoYW5kbGVyIHRoYXQgaXMgcmVhZHkgdG8gcnVuLAotICAgKiB3aXRob3V0IGJsb2NraW5nLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGhhbmRsZXJzIHRoYXQgd2VyZSBleGVjdXRlZC4KLSAgICovCi0gIEFTSU9fREVDTCBzdGQ6OnNpemVfdCBwb2xsX29uZShhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIFN0b3AgdGhlIGlvX3NlcnZpY2Ugb2JqZWN0J3MgZXZlbnQgcHJvY2Vzc2luZyBsb29wLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBibG9jaywgYnV0IGluc3RlYWQgc2ltcGx5IHNpZ25hbHMgdGhlIGlvX3NlcnZpY2UgdG8KLSAgICogc3RvcC4gQWxsIGludm9jYXRpb25zIG9mIGl0cyBydW4oKSBvciBydW5fb25lKCkgbWVtYmVyIGZ1bmN0aW9ucyBzaG91bGQKLSAgICogcmV0dXJuIGFzIHNvb24gYXMgcG9zc2libGUuIFN1YnNlcXVlbnQgY2FsbHMgdG8gcnVuKCksIHJ1bl9vbmUoKSwgcG9sbCgpCi0gICAqIG9yIHBvbGxfb25lKCkgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgdW50aWwgcmVzZXQoKSBpcyBjYWxsZWQuCi0gICAqLwotICBBU0lPX0RFQ0wgdm9pZCBzdG9wKCk7Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBpb19zZXJ2aWNlIG9iamVjdCBoYXMgYmVlbiBzdG9wcGVkLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGlvX3NlcnZpY2Ugb2JqZWN0IGhhcyBiZWVuCi0gICAqIHN0b3BwZWQsIGVpdGhlciB0aHJvdWdoIGFuIGV4cGxpY2l0IGNhbGwgdG8gc3RvcCgpLCBvciBkdWUgdG8gcnVubmluZyBvdXQKLSAgICogb2Ygd29yay4gV2hlbiBhbiBpb19zZXJ2aWNlIG9iamVjdCBpcyBzdG9wcGVkLCBjYWxscyB0byBydW4oKSwgcnVuX29uZSgpLAotICAgKiBwb2xsKCkgb3IgcG9sbF9vbmUoKSB3aWxsIHJldHVybiBpbW1lZGlhdGVseSB3aXRob3V0IGludm9raW5nIGFueQotICAgKiBoYW5kbGVycy4KLSAgICoKLSAgICogQHJldHVybiBAYyB0cnVlIGlmIHRoZSBpb19zZXJ2aWNlIG9iamVjdCBpcyBzdG9wcGVkLCBvdGhlcndpc2UgQGMgZmFsc2UuCi0gICAqLwotICBBU0lPX0RFQ0wgYm9vbCBzdG9wcGVkKCkgY29uc3Q7Ci0KLSAgLy8vIFJlc2V0IHRoZSBpb19zZXJ2aWNlIGluIHByZXBhcmF0aW9uIGZvciBhIHN1YnNlcXVlbnQgcnVuKCkgaW52b2NhdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gYW55IHNlY29uZCBvciBsYXRlciBzZXQgb2YKLSAgICogaW52b2NhdGlvbnMgb2YgdGhlIHJ1bigpLCBydW5fb25lKCksIHBvbGwoKSBvciBwb2xsX29uZSgpIGZ1bmN0aW9ucyB3aGVuIGEKLSAgICogcHJldmlvdXMgaW52b2NhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgcmV0dXJuZWQgZHVlIHRvIHRoZSBpb19zZXJ2aWNlCi0gICAqIGJlaW5nIHN0b3BwZWQgb3IgcnVubmluZyBvdXQgb2Ygd29yay4gQWZ0ZXIgYSBjYWxsIHRvIHJlc2V0KCksIHRoZQotICAgKiBpb19zZXJ2aWNlIG9iamVjdCdzIHN0b3BwZWQoKSBmdW5jdGlvbiB3aWxsIHJldHVybiBAYyBmYWxzZS4KLSAgICoKLSAgICogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBjYWxsZWQgd2hpbGUgdGhlcmUgYXJlIGFueSB1bmZpbmlzaGVkIGNhbGxzIHRvCi0gICAqIHRoZSBydW4oKSwgcnVuX29uZSgpLCBwb2xsKCkgb3IgcG9sbF9vbmUoKSBmdW5jdGlvbnMuCi0gICAqLwotICBBU0lPX0RFQ0wgdm9pZCByZXNldCgpOwotCi0gIC8vLyBSZXF1ZXN0IHRoZSBpb19zZXJ2aWNlIHRvIGludm9rZSB0aGUgZ2l2ZW4gaGFuZGxlci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc2sgdGhlIGlvX3NlcnZpY2UgdG8gZXhlY3V0ZSB0aGUgZ2l2ZW4gaGFuZGxlci4KLSAgICoKLSAgICogVGhlIGlvX3NlcnZpY2UgZ3VhcmFudGVlcyB0aGF0IHRoZSBoYW5kbGVyIHdpbGwgb25seSBiZSBjYWxsZWQgaW4gYSB0aHJlYWQKLSAgICogaW4gd2hpY2ggdGhlIHJ1bigpLCBydW5fb25lKCksIHBvbGwoKSBvciBwb2xsX29uZSgpIG1lbWJlciBmdW5jdGlvbnMgaXMKLSAgICogY3VycmVudGx5IGJlaW5nIGludm9rZWQuIFRoZSBoYW5kbGVyIG1heSBiZSBleGVjdXRlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbgotICAgKiBpZiB0aGUgZ3VhcmFudGVlIGNhbiBiZSBtZXQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZC4gVGhlIGlvX3NlcnZpY2Ugd2lsbCBtYWtlCi0gICAqIGEgY29weSBvZiB0aGUgaGFuZGxlciBvYmplY3QgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gICAqIGhhbmRsZXIgbXVzdCBiZTogQGNvZGUgdm9pZCBoYW5kbGVyKCk7IEBlbmRjb2RlCi0gICAqCi0gICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbiBvbmx5IGlmOgotICAgKgotICAgKiBAbGkgdGhlIGhhbmRsZXIncyBAYyBhc2lvX2hhbmRsZXJfYWxsb2NhdGUgZnVuY3Rpb247IG9yCi0gICAqCi0gICAqIEBsaSB0aGUgaGFuZGxlcidzIGNvcHkgY29uc3RydWN0b3IKLSAgICoKLSAgICogdGhyb3dzIGFuIGV4Y2VwdGlvbi4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb21wbGV0aW9uSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoQ29tcGxldGlvbkhhbmRsZXIsIHZvaWQgKCkpCi0gIGRpc3BhdGNoKEFTSU9fTU9WRV9BUkcoQ29tcGxldGlvbkhhbmRsZXIpIGhhbmRsZXIpOwotCi0gIC8vLyBSZXF1ZXN0IHRoZSBpb19zZXJ2aWNlIHRvIGludm9rZSB0aGUgZ2l2ZW4gaGFuZGxlciBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzayB0aGUgaW9fc2VydmljZSB0byBleGVjdXRlIHRoZSBnaXZlbiBoYW5kbGVyLAotICAgKiBidXQgd2l0aG91dCBhbGxvd2luZyB0aGUgaW9fc2VydmljZSB0byBjYWxsIHRoZSBoYW5kbGVyIGZyb20gaW5zaWRlIHRoaXMKLSAgICogZnVuY3Rpb24uCi0gICAqCi0gICAqIFRoZSBpb19zZXJ2aWNlIGd1YXJhbnRlZXMgdGhhdCB0aGUgaGFuZGxlciB3aWxsIG9ubHkgYmUgY2FsbGVkIGluIGEgdGhyZWFkCi0gICAqIGluIHdoaWNoIHRoZSBydW4oKSwgcnVuX29uZSgpLCBwb2xsKCkgb3IgcG9sbF9vbmUoKSBtZW1iZXIgZnVuY3Rpb25zIGlzCi0gICAqIGN1cnJlbnRseSBiZWluZyBpbnZva2VkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQuIFRoZSBpb19zZXJ2aWNlIHdpbGwgbWFrZQotICAgKiBhIGNvcHkgb2YgdGhlIGhhbmRsZXIgb2JqZWN0IGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZQotICAgKiBoYW5kbGVyIG11c3QgYmU6IEBjb2RlIHZvaWQgaGFuZGxlcigpOyBAZW5kY29kZQotICAgKgotICAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIHRocm93cyBhbiBleGNlcHRpb24gb25seSBpZjoKLSAgICoKLSAgICogQGxpIHRoZSBoYW5kbGVyJ3MgQGMgYXNpb19oYW5kbGVyX2FsbG9jYXRlIGZ1bmN0aW9uOyBvcgotICAgKgotICAgKiBAbGkgdGhlIGhhbmRsZXIncyBjb3B5IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIHRocm93cyBhbiBleGNlcHRpb24uCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tcGxldGlvbkhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKENvbXBsZXRpb25IYW5kbGVyLCB2b2lkICgpKQotICBwb3N0KEFTSU9fTU9WRV9BUkcoQ29tcGxldGlvbkhhbmRsZXIpIGhhbmRsZXIpOwotCi0gIC8vLyBDcmVhdGUgYSBuZXcgaGFuZGxlciB0aGF0IGF1dG9tYXRpY2FsbHkgZGlzcGF0Y2hlcyB0aGUgd3JhcHBlZCBoYW5kbGVyCi0gIC8vLyBvbiB0aGUgaW9fc2VydmljZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgaGFuZGxlciBmdW5jdGlvbiBvYmplY3QgdGhhdCwgd2hlbgotICAgKiBpbnZva2VkLCB3aWxsIGF1dG9tYXRpY2FsbHkgcGFzcyB0aGUgd3JhcHBlZCBoYW5kbGVyIHRvIHRoZSBpb19zZXJ2aWNlCi0gICAqIG9iamVjdCdzIGRpc3BhdGNoIGZ1bmN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSB3cmFwcGVkLiBUaGUgaW9fc2VydmljZSB3aWxsIG1ha2UgYSBjb3B5Ci0gICAqIG9mIHRoZSBoYW5kbGVyIG9iamVjdCBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlcgotICAgKiBtdXN0IGJlOiBAY29kZSB2b2lkIGhhbmRsZXIoQTEgYTEsIC4uLiBBbiBhbik7IEBlbmRjb2RlCi0gICAqCi0gICAqIEByZXR1cm4gQSBmdW5jdGlvbiBvYmplY3QgdGhhdCwgd2hlbiBpbnZva2VkLCBwYXNzZXMgdGhlIHdyYXBwZWQgaGFuZGxlciB0bwotICAgKiB0aGUgaW9fc2VydmljZSBvYmplY3QncyBkaXNwYXRjaCBmdW5jdGlvbi4gR2l2ZW4gYSBmdW5jdGlvbiBvYmplY3Qgd2l0aCB0aGUKLSAgICogc2lnbmF0dXJlOgotICAgKiBAY29kZSBSIGYoQTEgYTEsIC4uLiBBbiBhbik7IEBlbmRjb2RlCi0gICAqIElmIHRoaXMgZnVuY3Rpb24gb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUgd3JhcCBmdW5jdGlvbiBsaWtlIHNvOgotICAgKiBAY29kZSBpb19zZXJ2aWNlLndyYXAoZik7IEBlbmRjb2RlCi0gICAqIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBhIGZ1bmN0aW9uIG9iamVjdCB3aXRoIHRoZSBzaWduYXR1cmUKLSAgICogQGNvZGUgdm9pZCBnKEExIGExLCAuLi4gQW4gYW4pOyBAZW5kY29kZQotICAgKiB0aGF0LCB3aGVuIGludm9rZWQsIGV4ZWN1dGVzIGNvZGUgZXF1aXZhbGVudCB0bzoKLSAgICogQGNvZGUgaW9fc2VydmljZS5kaXNwYXRjaChib29zdDo6YmluZChmLCBhMSwgLi4uIGFuKSk7IEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdW5zcGVjaWZpZWQKLSNlbHNlCi0gIGRldGFpbDo6d3JhcHBlZF9oYW5kbGVyPGlvX3NlcnZpY2UmLCBIYW5kbGVyPgotI2VuZGlmCi0gIHdyYXAoSGFuZGxlciBoYW5kbGVyKTsKLQotICAvLy8gRm9yay1yZWxhdGVkIGV2ZW50IG5vdGlmaWNhdGlvbnMuCi0gIGVudW0gZm9ya19ldmVudAotICB7Ci0gICAgLy8vIE5vdGlmeSB0aGUgaW9fc2VydmljZSB0aGF0IHRoZSBwcm9jZXNzIGlzIGFib3V0IHRvIGZvcmsuCi0gICAgZm9ya19wcmVwYXJlLAotCi0gICAgLy8vIE5vdGlmeSB0aGUgaW9fc2VydmljZSB0aGF0IHRoZSBwcm9jZXNzIGhhcyBmb3JrZWQgYW5kIGlzIHRoZSBwYXJlbnQuCi0gICAgZm9ya19wYXJlbnQsCi0KLSAgICAvLy8gTm90aWZ5IHRoZSBpb19zZXJ2aWNlIHRoYXQgdGhlIHByb2Nlc3MgaGFzIGZvcmtlZCBhbmQgaXMgdGhlIGNoaWxkLgotICAgIGZvcmtfY2hpbGQKLSAgfTsKLQotICAvLy8gTm90aWZ5IHRoZSBpb19zZXJ2aWNlIG9mIGEgZm9yay1yZWxhdGVkIGV2ZW50LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluZm9ybSB0aGUgaW9fc2VydmljZSB0aGF0IHRoZSBwcm9jZXNzIGlzIGFib3V0Ci0gICAqIHRvIGZvcmssIG9yIGhhcyBqdXN0IGZvcmtlZC4gVGhpcyBhbGxvd3MgdGhlIGlvX3NlcnZpY2UsIGFuZCB0aGUgc2VydmljZXMKLSAgICogaXQgY29udGFpbnMsIHRvIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSBob3VzZWtlZXBpbmcgdG8gZW5zdXJlIGNvcnJlY3QKLSAgICogb3BlcmF0aW9uIGZvbGxvd2luZyBhIGZvcmsuCi0gICAqCi0gICAqIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkIHdoaWxlIGFueSBvdGhlciBpb19zZXJ2aWNlIGZ1bmN0aW9uLCBvcgotICAgKiBhbnkgZnVuY3Rpb24gb24gYW4gSS9PIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGlvX3NlcnZpY2UsIGlzIGJlaW5nCi0gICAqIGNhbGxlZCBpbiBhbm90aGVyIHRocmVhZC4gSXQgaXMsIGhvd2V2ZXIsIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20KLSAgICogd2l0aGluIGEgY29tcGxldGlvbiBoYW5kbGVyLCBwcm92aWRlZCBubyBvdGhlciB0aHJlYWQgaXMgYWNjZXNzaW5nIHRoZQotICAgKiBpb19zZXJ2aWNlLgotICAgKgotICAgKiBAcGFyYW0gZXZlbnQgQSBmb3JrLXJlbGF0ZWQgZXZlbnQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLiBJZiB0aGUgbm90aWZpY2F0aW9uCi0gICAqIGZhaWxzIHRoZSBpb19zZXJ2aWNlIG9iamVjdCBzaG91bGQgbm8gbG9uZ2VyIGJlIHVzZWQgYW5kIHNob3VsZCBiZQotICAgKiBkZXN0cm95ZWQuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgaWxsdXN0cmF0ZXMgaG93IHRvIGluY29ycG9yYXRlIHRoZSBub3RpZnlfZm9yaygpCi0gICAqIGZ1bmN0aW9uOgotICAgKiBAY29kZSBteV9pb19zZXJ2aWNlLm5vdGlmeV9mb3JrKGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfcHJlcGFyZSk7Ci0gICAqIGlmIChmb3JrKCkgPT0gMCkKLSAgICogewotICAgKiAgIC8vIFRoaXMgaXMgdGhlIGNoaWxkIHByb2Nlc3MuCi0gICAqICAgbXlfaW9fc2VydmljZS5ub3RpZnlfZm9yayhhc2lvOjppb19zZXJ2aWNlOjpmb3JrX2NoaWxkKTsKLSAgICogfQotICAgKiBlbHNlCi0gICAqIHsKLSAgICogICAvLyBUaGlzIGlzIHRoZSBwYXJlbnQgcHJvY2Vzcy4KLSAgICogICBteV9pb19zZXJ2aWNlLm5vdGlmeV9mb3JrKGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfcGFyZW50KTsKLSAgICogfSBAZW5kY29kZQotICAgKgotICAgKiBAbm90ZSBGb3IgZWFjaCBzZXJ2aWNlIG9iamVjdCBAYyBzdmMgaW4gdGhlIGlvX3NlcnZpY2Ugc2V0LCBwZXJmb3JtcwotICAgKiA8dHQ+c3ZjLT5mb3JrX3NlcnZpY2UoKTs8L3R0Pi4gV2hlbiBwcm9jZXNzaW5nIHRoZSBmb3JrX3ByZXBhcmUgZXZlbnQsCi0gICAqIHNlcnZpY2VzIGFyZSB2aXNpdGVkIGluIHJldmVyc2Ugb3JkZXIgb2YgdGhlIGJlZ2lubmluZyBvZiBzZXJ2aWNlIG9iamVjdAotICAgKiBsaWZldGltZS4gT3RoZXJ3aXNlLCBzZXJ2aWNlcyBhcmUgdmlzaXRlZCBpbiBvcmRlciBvZiB0aGUgYmVnaW5uaW5nIG9mCi0gICAqIHNlcnZpY2Ugb2JqZWN0IGxpZmV0aW1lLgotICAgKi8KLSAgQVNJT19ERUNMIHZvaWQgbm90aWZ5X2ZvcmsoYXNpbzo6aW9fc2VydmljZTo6Zm9ya19ldmVudCBldmVudCk7Ci0KLSAgLy8vIE9idGFpbiB0aGUgc2VydmljZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdHlwZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2NhdGUgYSBzZXJ2aWNlIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvCi0gICAqIHRoZSBnaXZlbiBzZXJ2aWNlIHR5cGUuIElmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICAgKiBzZXJ2aWNlLCB0aGVuIHRoZSBpb19zZXJ2aWNlIHdpbGwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlLgotICAgKgotICAgKiBAcGFyYW0gaW9zIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IG93bnMgdGhlIHNlcnZpY2UuCi0gICAqCi0gICAqIEByZXR1cm4gVGhlIHNlcnZpY2UgaW50ZXJmYWNlIGltcGxlbWVudGluZyB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgdHlwZS4KLSAgICogT3duZXJzaGlwIG9mIHRoZSBzZXJ2aWNlIGludGVyZmFjZSBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2aWNlPgotICBmcmllbmQgU2VydmljZSYgdXNlX3NlcnZpY2UoaW9fc2VydmljZSYgaW9zKTsKLQotICAvLy8gQWRkIGEgc2VydmljZSBvYmplY3QgdG8gdGhlIGlvX3NlcnZpY2UuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGEgc2VydmljZSB0byB0aGUgaW9fc2VydmljZS4KLSAgICoKLSAgICogQHBhcmFtIGlvcyBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCBvd25zIHRoZSBzZXJ2aWNlLgotICAgKgotICAgKiBAcGFyYW0gc3ZjIFRoZSBzZXJ2aWNlIG9iamVjdC4gT24gc3VjY2Vzcywgb3duZXJzaGlwIG9mIHRoZSBzZXJ2aWNlIG9iamVjdAotICAgKiBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgaW9fc2VydmljZS4gV2hlbiB0aGUgaW9fc2VydmljZSBvYmplY3QgaXMgZGVzdHJveWVkLAotICAgKiBpdCB3aWxsIGRlc3Ryb3kgdGhlIHNlcnZpY2Ugb2JqZWN0IGJ5IHBlcmZvcm1pbmc6Ci0gICAqIEBjb2RlIGRlbGV0ZSBzdGF0aWNfY2FzdDxpb19zZXJ2aWNlOjpzZXJ2aWNlKj4oc3ZjKSBAZW5kY29kZQotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnNlcnZpY2VfYWxyZWFkeV9leGlzdHMgVGhyb3duIGlmIGEgc2VydmljZSBvZiB0aGUKLSAgICogZ2l2ZW4gdHlwZSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGlvX3NlcnZpY2UuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6aW52YWxpZF9zZXJ2aWNlX293bmVyIFRocm93biBpZiB0aGUgc2VydmljZSdzIG93bmluZwotICAgKiBpb19zZXJ2aWNlIGlzIG5vdCB0aGUgaW9fc2VydmljZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBpb3MgcGFyYW1ldGVyLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2U+Ci0gIGZyaWVuZCB2b2lkIGFkZF9zZXJ2aWNlKGlvX3NlcnZpY2UmIGlvcywgU2VydmljZSogc3ZjKTsKLQotICAvLy8gRGV0ZXJtaW5lIGlmIGFuIGlvX3NlcnZpY2UgY29udGFpbnMgYSBzcGVjaWZpZWQgc2VydmljZSB0eXBlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBpb19zZXJ2aWNlIGNvbnRhaW5zIGEKLSAgICogc2VydmljZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gc2VydmljZSB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gaW9zIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IG93bnMgdGhlIHNlcnZpY2UuCi0gICAqCi0gICAqIEByZXR1cm4gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgaW9fc2VydmljZSBjb250YWlucyB0aGUgc2VydmljZS4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2aWNlPgotICBmcmllbmQgYm9vbCBoYXNfc2VydmljZShpb19zZXJ2aWNlJiBpb3MpOwotCi1wcml2YXRlOgotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIGRldGFpbDo6d2luc29ja19pbml0PD4gaW5pdF87Ci0jZWxpZiBkZWZpbmVkKF9fc3VuKSB8fCBkZWZpbmVkKF9fUU5YX18pIHx8IGRlZmluZWQoX19ocHV4KSB8fCBkZWZpbmVkKF9BSVgpIFwKLSAgfHwgZGVmaW5lZChfX29zZl9fKQotICBkZXRhaWw6OnNpZ25hbF9pbml0PD4gaW5pdF87Ci0jZW5kaWYKLQotICAvLyBUaGUgc2VydmljZSByZWdpc3RyeS4KLSAgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX3JlZ2lzdHJ5KiBzZXJ2aWNlX3JlZ2lzdHJ5XzsKLQotICAvLyBUaGUgaW1wbGVtZW50YXRpb24uCi0gIGltcGxfdHlwZSYgaW1wbF87Ci19OwotCi0vLy8gQ2xhc3MgdG8gaW5mb3JtIHRoZSBpb19zZXJ2aWNlIHdoZW4gaXQgaGFzIHdvcmsgdG8gZG8uCi0vKioKLSAqIFRoZSB3b3JrIGNsYXNzIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSBpb19zZXJ2aWNlIHdoZW4gd29yayBzdGFydHMgYW5kCi0gKiBmaW5pc2hlcy4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGlvX3NlcnZpY2Ugb2JqZWN0J3MgcnVuKCkgZnVuY3Rpb24gd2lsbCBub3QKLSAqIGV4aXQgd2hpbGUgd29yayBpcyB1bmRlcndheSwgYW5kIHRoYXQgaXQgZG9lcyBleGl0IHdoZW4gdGhlcmUgaXMgbm8KLSAqIHVuZmluaXNoZWQgd29yayByZW1haW5pbmcuCi0gKgotICogVGhlIHdvcmsgY2xhc3MgaXMgY29weS1jb25zdHJ1Y3RpYmxlIHNvIHRoYXQgaXQgbWF5IGJlIHVzZWQgYXMgYSBkYXRhIG1lbWJlcgotICogaW4gYSBoYW5kbGVyIGNsYXNzLiBJdCBpcyBub3QgYXNzaWduYWJsZS4KLSAqLwotY2xhc3MgaW9fc2VydmljZTo6d29yawotewotcHVibGljOgotICAvLy8gQ29uc3RydWN0b3Igbm90aWZpZXMgdGhlIGlvX3NlcnZpY2UgdGhhdCB3b3JrIGlzIHN0YXJ0aW5nLgotICAvKioKLSAgICogVGhlIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSBpb19zZXJ2aWNlIHRoYXQgc29tZSB3b3JrIGhhcyBiZWd1bi4KLSAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGlvX3NlcnZpY2Ugb2JqZWN0J3MgcnVuKCkgZnVuY3Rpb24gd2lsbCBub3QgZXhpdAotICAgKiB3aGlsZSB0aGUgd29yayBpcyB1bmRlcndheS4KLSAgICovCi0gIGV4cGxpY2l0IHdvcmsoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSk7Ci0KLSAgLy8vIENvcHkgY29uc3RydWN0b3Igbm90aWZpZXMgdGhlIGlvX3NlcnZpY2UgdGhhdCB3b3JrIGlzIHN0YXJ0aW5nLgotICAvKioKLSAgICogVGhlIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSBpb19zZXJ2aWNlIHRoYXQgc29tZSB3b3JrIGhhcyBiZWd1bi4KLSAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGlvX3NlcnZpY2Ugb2JqZWN0J3MgcnVuKCkgZnVuY3Rpb24gd2lsbCBub3QgZXhpdAotICAgKiB3aGlsZSB0aGUgd29yayBpcyB1bmRlcndheS4KLSAgICovCi0gIHdvcmsoY29uc3Qgd29yayYgb3RoZXIpOwotCi0gIC8vLyBEZXN0cnVjdG9yIG5vdGlmaWVzIHRoZSBpb19zZXJ2aWNlIHRoYXQgdGhlIHdvcmsgaXMgY29tcGxldGUuCi0gIC8qKgotICAgKiBUaGUgZGVzdHJ1Y3RvciBpcyB1c2VkIHRvIGluZm9ybSB0aGUgaW9fc2VydmljZSB0aGF0IHNvbWUgd29yayBoYXMKLSAgICogZmluaXNoZWQuIE9uY2UgdGhlIGNvdW50IG9mIHVuZmluaXNoZWQgd29yayByZWFjaGVzIHplcm8sIHRoZSBpb19zZXJ2aWNlCi0gICAqIG9iamVjdCdzIHJ1bigpIGZ1bmN0aW9uIGlzIHBlcm1pdHRlZCB0byBleGl0LgotICAgKi8KLSAgfndvcmsoKTsKLQotICAvLy8gR2V0IHRoZSBpb19zZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd29yay4KLSAgYXNpbzo6aW9fc2VydmljZSYgZ2V0X2lvX3NlcnZpY2UoKTsKLQotcHJpdmF0ZToKLSAgLy8gUHJldmVudCBhc3NpZ25tZW50LgotICB2b2lkIG9wZXJhdG9yPShjb25zdCB3b3JrJiBvdGhlcik7Ci0KLSAgLy8gVGhlIGlvX3NlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gIGRldGFpbDo6aW9fc2VydmljZV9pbXBsJiBpb19zZXJ2aWNlX2ltcGxfOwotfTsKLQotLy8vIENsYXNzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBzZXJ2aWNlLgotY2xhc3MgaW9fc2VydmljZTo6aWQKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vLyBDb25zdHJ1Y3Rvci4KLSAgaWQoKSB7fQotfTsKLQotLy8vIEJhc2UgY2xhc3MgZm9yIGFsbCBpb19zZXJ2aWNlIHNlcnZpY2VzLgotY2xhc3MgaW9fc2VydmljZTo6c2VydmljZQotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8vIEdldCB0aGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCBvd25zIHRoZSBzZXJ2aWNlLgotICBhc2lvOjppb19zZXJ2aWNlJiBnZXRfaW9fc2VydmljZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gIC8vLyBDb25zdHJ1Y3Rvci4KLSAgLyoqCi0gICAqIEBwYXJhbSBvd25lciBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCBvd25zIHRoZSBzZXJ2aWNlLgotICAgKi8KLSAgQVNJT19ERUNMIHNlcnZpY2UoYXNpbzo6aW9fc2VydmljZSYgb3duZXIpOwotCi0gIC8vLyBEZXN0cnVjdG9yLgotICBBU0lPX0RFQ0wgdmlydHVhbCB+c2VydmljZSgpOwotCi1wcml2YXRlOgotICAvLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgdmlydHVhbCB2b2lkIHNodXRkb3duX3NlcnZpY2UoKSA9IDA7Ci0KLSAgLy8vIEhhbmRsZSBub3RpZmljYXRpb24gb2YgYSBmb3JrLXJlbGF0ZWQgZXZlbnQgdG8gcGVyZm9ybSBhbnkgbmVjZXNzYXJ5Ci0gIC8vLyBob3VzZWtlZXBpbmcuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhIHB1cmUgdmlydHVhbCBzbyB0aGF0IHNlcnZpY2VzIG9ubHkgaGF2ZSB0bwotICAgKiBpbXBsZW1lbnQgaXQgaWYgbmVjZXNzYXJ5LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0gICAqLwotICBBU0lPX0RFQ0wgdmlydHVhbCB2b2lkIGZvcmtfc2VydmljZSgKLSAgICAgIGFzaW86OmlvX3NlcnZpY2U6OmZvcmtfZXZlbnQgZXZlbnQpOwotCi0gIGZyaWVuZCBjbGFzcyBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfcmVnaXN0cnk7Ci0gIHN0cnVjdCBrZXkKLSAgewotICAgIGtleSgpIDogdHlwZV9pbmZvXygwKSwgaWRfKDApIHt9Ci0gICAgY29uc3Qgc3RkOjp0eXBlX2luZm8qIHR5cGVfaW5mb187Ci0gICAgY29uc3QgYXNpbzo6aW9fc2VydmljZTo6aWQqIGlkXzsKLSAgfSBrZXlfOwotCi0gIGFzaW86OmlvX3NlcnZpY2UmIG93bmVyXzsKLSAgc2VydmljZSogbmV4dF87Ci19OwotCi0vLy8gRXhjZXB0aW9uIHRocm93biB3aGVuIHRyeWluZyB0byBhZGQgYSBkdXBsaWNhdGUgc2VydmljZSB0byBhbiBpb19zZXJ2aWNlLgotY2xhc3Mgc2VydmljZV9hbHJlYWR5X2V4aXN0cwotICA6IHB1YmxpYyBzdGQ6OmxvZ2ljX2Vycm9yCi17Ci1wdWJsaWM6Ci0gIEFTSU9fREVDTCBzZXJ2aWNlX2FscmVhZHlfZXhpc3RzKCk7Ci19OwotCi0vLy8gRXhjZXB0aW9uIHRocm93biB3aGVuIHRyeWluZyB0byBhZGQgYSBzZXJ2aWNlIG9iamVjdCB0byBhbiBpb19zZXJ2aWNlIHdoZXJlCi0vLy8gdGhlIHNlcnZpY2UgaGFzIGEgZGlmZmVyZW50IG93bmVyLgotY2xhc3MgaW52YWxpZF9zZXJ2aWNlX293bmVyCi0gIDogcHVibGljIHN0ZDo6bG9naWNfZXJyb3IKLXsKLXB1YmxpYzoKLSAgQVNJT19ERUNMIGludmFsaWRfc2VydmljZV9vd25lcigpOwotfTsKLQotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLS8vIFNwZWNpYWwgZGVyaXZlZCBzZXJ2aWNlIGlkIHR5cGUgdG8ga2VlcCBjbGFzc2VzIGhlYWRlci1maWxlIG9ubHkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLWNsYXNzIHNlcnZpY2VfaWQKLSAgOiBwdWJsaWMgYXNpbzo6aW9fc2VydmljZTo6aWQKLXsKLX07Ci0KLS8vIFNwZWNpYWwgc2VydmljZSBiYXNlIGNsYXNzIHRvIGtlZXAgY2xhc3NlcyBoZWFkZXItZmlsZSBvbmx5LgotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci1jbGFzcyBzZXJ2aWNlX2Jhc2UKLSAgOiBwdWJsaWMgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZQotewotcHVibGljOgotICBzdGF0aWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2lkPFR5cGU+IGlkOwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBzZXJ2aWNlX2Jhc2UoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2UoaW9fc2VydmljZSkKLSAgewotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLWFzaW86OmRldGFpbDo6c2VydmljZV9pZDxUeXBlPiBzZXJ2aWNlX2Jhc2U8VHlwZT46OmlkOwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vaW1wbC9pb19zZXJ2aWNlLmhwcCIKLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vaW1wbC9pb19zZXJ2aWNlLmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBBU0lPX0lPX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvYWRkcmVzcy5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvYWRkcmVzcy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ODk2YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2FkZHJlc3MuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vCi0vLyBpcC9hZGRyZXNzLmhwcAotLy8gfn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JUF9BRERSRVNTX0hQUAotI2RlZmluZSBBU0lPX0lQX0FERFJFU1NfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImFzaW8vZXJyb3JfY29kZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9hZGRyZXNzX3Y0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2FkZHJlc3NfdjYuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLSMgaW5jbHVkZSA8aW9zZndkPgotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgaXAgewotCi0vLy8gSW1wbGVtZW50cyB2ZXJzaW9uLWluZGVwZW5kZW50IElQIGFkZHJlc3Nlcy4KLS8qKgotICogVGhlIGFzaW86OmlwOjphZGRyZXNzIGNsYXNzIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHVzZSBlaXRoZXIgSVAKLSAqIHZlcnNpb24gNCBvciB2ZXJzaW9uIDYgYWRkcmVzc2VzLgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqLwotY2xhc3MgYWRkcmVzcwotewotcHVibGljOgotICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIGFkZHJlc3MoKTsKLQotICAvLy8gQ29uc3RydWN0IGFuIGFkZHJlc3MgZnJvbSBhbiBJUHY0IGFkZHJlc3MuCi0gIEFTSU9fREVDTCBhZGRyZXNzKGNvbnN0IGFzaW86OmlwOjphZGRyZXNzX3Y0JiBpcHY0X2FkZHJlc3MpOwotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gYWRkcmVzcyBmcm9tIGFuIElQdjYgYWRkcmVzcy4KLSAgQVNJT19ERUNMIGFkZHJlc3MoY29uc3QgYXNpbzo6aXA6OmFkZHJlc3NfdjYmIGlwdjZfYWRkcmVzcyk7Ci0KLSAgLy8vIENvcHkgY29uc3RydWN0b3IuCi0gIEFTSU9fREVDTCBhZGRyZXNzKGNvbnN0IGFkZHJlc3MmIG90aGVyKTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgLy8vIE1vdmUgY29uc3RydWN0b3IuCi0gIEFTSU9fREVDTCBhZGRyZXNzKGFkZHJlc3MmJiBvdGhlcik7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gIC8vLyBBc3NpZ24gZnJvbSBhbm90aGVyIGFkZHJlc3MuCi0gIEFTSU9fREVDTCBhZGRyZXNzJiBvcGVyYXRvcj0oY29uc3QgYWRkcmVzcyYgb3RoZXIpOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAvLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIGFkZHJlc3MuCi0gIEFTSU9fREVDTCBhZGRyZXNzJiBvcGVyYXRvcj0oYWRkcmVzcyYmIG90aGVyKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLSAgLy8vIEFzc2lnbiBmcm9tIGFuIElQdjQgYWRkcmVzcy4KLSAgQVNJT19ERUNMIGFkZHJlc3MmIG9wZXJhdG9yPSgKLSAgICAgIGNvbnN0IGFzaW86OmlwOjphZGRyZXNzX3Y0JiBpcHY0X2FkZHJlc3MpOwotCi0gIC8vLyBBc3NpZ24gZnJvbSBhbiBJUHY2IGFkZHJlc3MuCi0gIEFTSU9fREVDTCBhZGRyZXNzJiBvcGVyYXRvcj0oCi0gICAgICBjb25zdCBhc2lvOjppcDo6YWRkcmVzc192NiYgaXB2Nl9hZGRyZXNzKTsKLQotICAvLy8gR2V0IHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYW4gSVAgdmVyc2lvbiA0IGFkZHJlc3MuCi0gIGJvb2wgaXNfdjQoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHR5cGVfID09IGlwdjQ7Ci0gIH0KLQotICAvLy8gR2V0IHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYW4gSVAgdmVyc2lvbiA2IGFkZHJlc3MuCi0gIGJvb2wgaXNfdjYoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHR5cGVfID09IGlwdjY7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBhZGRyZXNzIGFzIGFuIElQIHZlcnNpb24gNCBhZGRyZXNzLgotICBBU0lPX0RFQ0wgYXNpbzo6aXA6OmFkZHJlc3NfdjQgdG9fdjQoKSBjb25zdDsKLQotICAvLy8gR2V0IHRoZSBhZGRyZXNzIGFzIGFuIElQIHZlcnNpb24gNiBhZGRyZXNzLgotICBBU0lPX0RFQ0wgYXNpbzo6aXA6OmFkZHJlc3NfdjYgdG9fdjYoKSBjb25zdDsKLQotICAvLy8gR2V0IHRoZSBhZGRyZXNzIGFzIGEgc3RyaW5nIGluIGRvdHRlZCBkZWNpbWFsIGZvcm1hdC4KLSAgQVNJT19ERUNMIHN0ZDo6c3RyaW5nIHRvX3N0cmluZygpIGNvbnN0OwotCi0gIC8vLyBHZXQgdGhlIGFkZHJlc3MgYXMgYSBzdHJpbmcgaW4gZG90dGVkIGRlY2ltYWwgZm9ybWF0LgotICBBU0lPX0RFQ0wgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdDsKLQotICAvLy8gQ3JlYXRlIGFuIGFkZHJlc3MgZnJvbSBhbiBJUHY0IGFkZHJlc3Mgc3RyaW5nIGluIGRvdHRlZCBkZWNpbWFsIGZvcm0sCi0gIC8vLyBvciBmcm9tIGFuIElQdjYgYWRkcmVzcyBpbiBoZXhhZGVjaW1hbCBub3RhdGlvbi4KLSAgQVNJT19ERUNMIHN0YXRpYyBhZGRyZXNzIGZyb21fc3RyaW5nKGNvbnN0IGNoYXIqIHN0cik7Ci0KLSAgLy8vIENyZWF0ZSBhbiBhZGRyZXNzIGZyb20gYW4gSVB2NCBhZGRyZXNzIHN0cmluZyBpbiBkb3R0ZWQgZGVjaW1hbCBmb3JtLAotICAvLy8gb3IgZnJvbSBhbiBJUHY2IGFkZHJlc3MgaW4gaGV4YWRlY2ltYWwgbm90YXRpb24uCi0gIEFTSU9fREVDTCBzdGF0aWMgYWRkcmVzcyBmcm9tX3N0cmluZygKLSAgICAgIGNvbnN0IGNoYXIqIHN0ciwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBDcmVhdGUgYW4gYWRkcmVzcyBmcm9tIGFuIElQdjQgYWRkcmVzcyBzdHJpbmcgaW4gZG90dGVkIGRlY2ltYWwgZm9ybSwKLSAgLy8vIG9yIGZyb20gYW4gSVB2NiBhZGRyZXNzIGluIGhleGFkZWNpbWFsIG5vdGF0aW9uLgotICBBU0lPX0RFQ0wgc3RhdGljIGFkZHJlc3MgZnJvbV9zdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgLy8vIENyZWF0ZSBhbiBhZGRyZXNzIGZyb20gYW4gSVB2NCBhZGRyZXNzIHN0cmluZyBpbiBkb3R0ZWQgZGVjaW1hbCBmb3JtLAotICAvLy8gb3IgZnJvbSBhbiBJUHY2IGFkZHJlc3MgaW4gaGV4YWRlY2ltYWwgbm90YXRpb24uCi0gIEFTSU9fREVDTCBzdGF0aWMgYWRkcmVzcyBmcm9tX3N0cmluZygKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzLgotICBBU0lPX0RFQ0wgYm9vbCBpc19sb29wYmFjaygpIGNvbnN0OwotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYWRkcmVzcyBpcyB1bnNwZWNpZmllZC4KLSAgQVNJT19ERUNMIGJvb2wgaXNfdW5zcGVjaWZpZWQoKSBjb25zdDsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcy4KLSAgQVNJT19ERUNMIGJvb2wgaXNfbXVsdGljYXN0KCkgY29uc3Q7Ci0KLSAgLy8vIENvbXBhcmUgdHdvIGFkZHJlc3NlcyBmb3IgZXF1YWxpdHkuCi0gIEFTSU9fREVDTCBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGFkZHJlc3MmIGExLCBjb25zdCBhZGRyZXNzJiBhMik7Ci0KLSAgLy8vIENvbXBhcmUgdHdvIGFkZHJlc3NlcyBmb3IgaW5lcXVhbGl0eS4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBhZGRyZXNzJiBhMSwgY29uc3QgYWRkcmVzcyYgYTIpCi0gIHsKLSAgICByZXR1cm4gIShhMSA9PSBhMik7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSBhZGRyZXNzZXMgZm9yIG9yZGVyaW5nLgotICBBU0lPX0RFQ0wgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGFkZHJlc3MmIGExLCBjb25zdCBhZGRyZXNzJiBhMik7Ci0KLSAgLy8vIENvbXBhcmUgYWRkcmVzc2VzIGZvciBvcmRlcmluZy4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGFkZHJlc3MmIGExLCBjb25zdCBhZGRyZXNzJiBhMikKLSAgewotICAgIHJldHVybiBhMiA8IGExOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgYWRkcmVzc2VzIGZvciBvcmRlcmluZy4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdCBhZGRyZXNzJiBhMSwgY29uc3QgYWRkcmVzcyYgYTIpCi0gIHsKLSAgICByZXR1cm4gIShhMiA8IGExKTsKLSAgfQotCi0gIC8vLyBDb21wYXJlIGFkZHJlc3NlcyBmb3Igb3JkZXJpbmcuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3QgYWRkcmVzcyYgYTEsIGNvbnN0IGFkZHJlc3MmIGEyKQotICB7Ci0gICAgcmV0dXJuICEoYTEgPCBhMik7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gVGhlIHR5cGUgb2YgdGhlIGFkZHJlc3MuCi0gIGVudW0geyBpcHY0LCBpcHY2IH0gdHlwZV87Ci0KLSAgLy8gVGhlIHVuZGVybHlpbmcgSVB2NCBhZGRyZXNzLgotICBhc2lvOjppcDo6YWRkcmVzc192NCBpcHY0X2FkZHJlc3NfOwotCi0gIC8vIFRoZSB1bmRlcmx5aW5nIElQdjYgYWRkcmVzcy4KLSAgYXNpbzo6aXA6OmFkZHJlc3NfdjYgaXB2Nl9hZGRyZXNzXzsKLX07Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0vLy8gT3V0cHV0IGFuIGFkZHJlc3MgYXMgYSBzdHJpbmcuCi0vKioKLSAqIFVzZWQgdG8gb3V0cHV0IGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGZvciBhIHNwZWNpZmllZCBhZGRyZXNzLgotICoKLSAqIEBwYXJhbSBvcyBUaGUgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0aGUgc3RyaW5nIHdpbGwgYmUgd3JpdHRlbi4KLSAqCi0gKiBAcGFyYW0gYWRkciBUaGUgYWRkcmVzcyB0byBiZSB3cml0dGVuLgotICoKLSAqIEByZXR1cm4gVGhlIG91dHB1dCBzdHJlYW0uCi0gKgotICogQHJlbGF0ZXMgYXNpbzo6aXA6OmFkZHJlc3MKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW0sIHR5cGVuYW1lIFRyYWl0cz4KLXN0ZDo6YmFzaWNfb3N0cmVhbTxFbGVtLCBUcmFpdHM+JiBvcGVyYXRvcjw8KAotICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxFbGVtLCBUcmFpdHM+JiBvcywgY29uc3QgYWRkcmVzcyYgYWRkcik7Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi19IC8vIG5hbWVzcGFjZSBpcAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9pcC9pbXBsL2FkZHJlc3MuaHBwIgotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9pcC9pbXBsL2FkZHJlc3MuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIEFTSU9fSVBfQUREUkVTU19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9hZGRyZXNzX3Y0LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9hZGRyZXNzX3Y0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxYWZjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvYWRkcmVzc192NC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8KLS8vIGlwL2FkZHJlc3NfdjQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lQX0FERFJFU1NfVjRfSFBQCi0jZGVmaW5lIEFTSU9fSVBfQUREUkVTU19WNF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYXJyYXkuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luc29ja19pbml0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yX2NvZGUuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLSMgaW5jbHVkZSA8aW9zZndkPgotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgaXAgewotCi0vLy8gSW1wbGVtZW50cyBJUCB2ZXJzaW9uIDQgc3R5bGUgYWRkcmVzc2VzLgotLyoqCi0gKiBUaGUgYXNpbzo6aXA6OmFkZHJlc3NfdjQgY2xhc3MgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gdXNlIGFuZAotICogbWFuaXB1bGF0ZSBJUCB2ZXJzaW9uIDQgYWRkcmVzc2VzLgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqLwotY2xhc3MgYWRkcmVzc192NAotewotcHVibGljOgotICAvLy8gVGhlIHR5cGUgdXNlZCB0byByZXByZXNlbnQgYW4gYWRkcmVzcyBhcyBhbiBhcnJheSBvZiBieXRlcy4KLSAgLyoqCi0gICAqIEBub3RlIFRoaXMgdHlwZSBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIHRoZSBDKysweCB0ZW1wbGF0ZSBAYyBzdGQ6OmFycmF5Ci0gICAqIHdoZW4gaXQgaXMgYXZhaWxhYmxlLiBPdGhlcndpc2UsIGl0IHVzZXMgQGMgYm9vc3Q6YXJyYXkuCi0gICAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGFycmF5PHVuc2lnbmVkIGNoYXIsIDQ+IGJ5dGVzX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6YXJyYXk8dW5zaWduZWQgY2hhciwgND4gYnl0ZXNfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBhZGRyZXNzX3Y0KCkKLSAgewotICAgIGFkZHJfLnNfYWRkciA9IDA7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGFuIGFkZHJlc3MgZnJvbSByYXcgYnl0ZXMuCi0gIEFTSU9fREVDTCBleHBsaWNpdCBhZGRyZXNzX3Y0KGNvbnN0IGJ5dGVzX3R5cGUmIGJ5dGVzKTsKLQotICAvLy8gQ29uc3RydWN0IGFuIGFkZHJlc3MgZnJvbSBhIHVuc2lnbmVkIGxvbmcgaW4gaG9zdCBieXRlIG9yZGVyLgotICBBU0lPX0RFQ0wgZXhwbGljaXQgYWRkcmVzc192NCh1bnNpZ25lZCBsb25nIGFkZHIpOwotCi0gIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgotICBhZGRyZXNzX3Y0KGNvbnN0IGFkZHJlc3NfdjQmIG90aGVyKQotICAgIDogYWRkcl8ob3RoZXIuYWRkcl8pCi0gIHsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAvLy8gTW92ZSBjb25zdHJ1Y3Rvci4KLSAgYWRkcmVzc192NChhZGRyZXNzX3Y0JiYgb3RoZXIpCi0gICAgOiBhZGRyXyhvdGhlci5hZGRyXykKLSAgewotICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gIC8vLyBBc3NpZ24gZnJvbSBhbm90aGVyIGFkZHJlc3MuCi0gIGFkZHJlc3NfdjQmIG9wZXJhdG9yPShjb25zdCBhZGRyZXNzX3Y0JiBvdGhlcikKLSAgewotICAgIGFkZHJfID0gb3RoZXIuYWRkcl87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gIC8vLyBNb3ZlLWFzc2lnbiBmcm9tIGFub3RoZXIgYWRkcmVzcy4KLSAgYWRkcmVzc192NCYgb3BlcmF0b3I9KGFkZHJlc3NfdjQmJiBvdGhlcikKLSAgewotICAgIGFkZHJfID0gb3RoZXIuYWRkcl87Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gIC8vLyBHZXQgdGhlIGFkZHJlc3MgaW4gYnl0ZXMsIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KLSAgQVNJT19ERUNMIGJ5dGVzX3R5cGUgdG9fYnl0ZXMoKSBjb25zdDsKLQotICAvLy8gR2V0IHRoZSBhZGRyZXNzIGFzIGFuIHVuc2lnbmVkIGxvbmcgaW4gaG9zdCBieXRlIG9yZGVyCi0gIEFTSU9fREVDTCB1bnNpZ25lZCBsb25nIHRvX3Vsb25nKCkgY29uc3Q7Ci0KLSAgLy8vIEdldCB0aGUgYWRkcmVzcyBhcyBhIHN0cmluZyBpbiBkb3R0ZWQgZGVjaW1hbCBmb3JtYXQuCi0gIEFTSU9fREVDTCBzdGQ6OnN0cmluZyB0b19zdHJpbmcoKSBjb25zdDsKLQotICAvLy8gR2V0IHRoZSBhZGRyZXNzIGFzIGEgc3RyaW5nIGluIGRvdHRlZCBkZWNpbWFsIGZvcm1hdC4KLSAgQVNJT19ERUNMIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3Q7Ci0KLSAgLy8vIENyZWF0ZSBhbiBhZGRyZXNzIGZyb20gYW4gSVAgYWRkcmVzcyBzdHJpbmcgaW4gZG90dGVkIGRlY2ltYWwgZm9ybS4KLSAgQVNJT19ERUNMIHN0YXRpYyBhZGRyZXNzX3Y0IGZyb21fc3RyaW5nKGNvbnN0IGNoYXIqIHN0cik7Ci0KLSAgLy8vIENyZWF0ZSBhbiBhZGRyZXNzIGZyb20gYW4gSVAgYWRkcmVzcyBzdHJpbmcgaW4gZG90dGVkIGRlY2ltYWwgZm9ybS4KLSAgQVNJT19ERUNMIHN0YXRpYyBhZGRyZXNzX3Y0IGZyb21fc3RyaW5nKAotICAgICAgY29uc3QgY2hhciogc3RyLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIENyZWF0ZSBhbiBhZGRyZXNzIGZyb20gYW4gSVAgYWRkcmVzcyBzdHJpbmcgaW4gZG90dGVkIGRlY2ltYWwgZm9ybS4KLSAgQVNJT19ERUNMIHN0YXRpYyBhZGRyZXNzX3Y0IGZyb21fc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8vLyBDcmVhdGUgYW4gYWRkcmVzcyBmcm9tIGFuIElQIGFkZHJlc3Mgc3RyaW5nIGluIGRvdHRlZCBkZWNpbWFsIGZvcm0uCi0gIEFTSU9fREVDTCBzdGF0aWMgYWRkcmVzc192NCBmcm9tX3N0cmluZygKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzLgotICBBU0lPX0RFQ0wgYm9vbCBpc19sb29wYmFjaygpIGNvbnN0OwotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYWRkcmVzcyBpcyB1bnNwZWNpZmllZC4KLSAgQVNJT19ERUNMIGJvb2wgaXNfdW5zcGVjaWZpZWQoKSBjb25zdDsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBjbGFzcyBBIGFkZHJlc3MuCi0gIEFTSU9fREVDTCBib29sIGlzX2NsYXNzX2EoKSBjb25zdDsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBjbGFzcyBCIGFkZHJlc3MuCi0gIEFTSU9fREVDTCBib29sIGlzX2NsYXNzX2IoKSBjb25zdDsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBjbGFzcyBDIGFkZHJlc3MuCi0gIEFTSU9fREVDTCBib29sIGlzX2NsYXNzX2MoKSBjb25zdDsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcy4KLSAgQVNJT19ERUNMIGJvb2wgaXNfbXVsdGljYXN0KCkgY29uc3Q7Ci0KLSAgLy8vIENvbXBhcmUgdHdvIGFkZHJlc3NlcyBmb3IgZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgYWRkcmVzc192NCYgYTEsIGNvbnN0IGFkZHJlc3NfdjQmIGEyKQotICB7Ci0gICAgcmV0dXJuIGExLmFkZHJfLnNfYWRkciA9PSBhMi5hZGRyXy5zX2FkZHI7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSB0d28gYWRkcmVzc2VzIGZvciBpbmVxdWFsaXR5LgotICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGFkZHJlc3NfdjQmIGExLCBjb25zdCBhZGRyZXNzX3Y0JiBhMikKLSAgewotICAgIHJldHVybiBhMS5hZGRyXy5zX2FkZHIgIT0gYTIuYWRkcl8uc19hZGRyOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgYWRkcmVzc2VzIGZvciBvcmRlcmluZy4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGFkZHJlc3NfdjQmIGExLCBjb25zdCBhZGRyZXNzX3Y0JiBhMikKLSAgewotICAgIHJldHVybiBhMS50b191bG9uZygpIDwgYTIudG9fdWxvbmcoKTsKLSAgfQotCi0gIC8vLyBDb21wYXJlIGFkZHJlc3NlcyBmb3Igb3JkZXJpbmcuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPihjb25zdCBhZGRyZXNzX3Y0JiBhMSwgY29uc3QgYWRkcmVzc192NCYgYTIpCi0gIHsKLSAgICByZXR1cm4gYTEudG9fdWxvbmcoKSA+IGEyLnRvX3Vsb25nKCk7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSBhZGRyZXNzZXMgZm9yIG9yZGVyaW5nLgotICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGFkZHJlc3NfdjQmIGExLCBjb25zdCBhZGRyZXNzX3Y0JiBhMikKLSAgewotICAgIHJldHVybiBhMS50b191bG9uZygpIDw9IGEyLnRvX3Vsb25nKCk7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSBhZGRyZXNzZXMgZm9yIG9yZGVyaW5nLgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGFkZHJlc3NfdjQmIGExLCBjb25zdCBhZGRyZXNzX3Y0JiBhMikKLSAgewotICAgIHJldHVybiBhMS50b191bG9uZygpID49IGEyLnRvX3Vsb25nKCk7Ci0gIH0KLQotICAvLy8gT2J0YWluIGFuIGFkZHJlc3Mgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhbnkgYWRkcmVzcy4KLSAgc3RhdGljIGFkZHJlc3NfdjQgYW55KCkKLSAgewotICAgIHJldHVybiBhZGRyZXNzX3Y0KCk7Ci0gIH0KLQotICAvLy8gT2J0YWluIGFuIGFkZHJlc3Mgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbG9vcGJhY2sgYWRkcmVzcy4KLSAgc3RhdGljIGFkZHJlc3NfdjQgbG9vcGJhY2soKQotICB7Ci0gICAgcmV0dXJuIGFkZHJlc3NfdjQoMHg3RjAwMDAwMSk7Ci0gIH0KLQotICAvLy8gT2J0YWluIGFuIGFkZHJlc3Mgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgYnJvYWRjYXN0IGFkZHJlc3MuCi0gIHN0YXRpYyBhZGRyZXNzX3Y0IGJyb2FkY2FzdCgpCi0gIHsKLSAgICByZXR1cm4gYWRkcmVzc192NCgweEZGRkZGRkZGKTsKLSAgfQotCi0gIC8vLyBPYnRhaW4gYW4gYWRkcmVzcyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBicm9hZGNhc3QgYWRkcmVzcyB0aGF0Ci0gIC8vLyBjb3JyZXNwb25kcyB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kIG5ldG1hc2suCi0gIEFTSU9fREVDTCBzdGF0aWMgYWRkcmVzc192NCBicm9hZGNhc3QoCi0gICAgICBjb25zdCBhZGRyZXNzX3Y0JiBhZGRyLCBjb25zdCBhZGRyZXNzX3Y0JiBtYXNrKTsKLQotICAvLy8gT2J0YWluIHRoZSBuZXRtYXNrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGFkZHJlc3MsIGJhc2VkIG9uIGl0cyBhZGRyZXNzCi0gIC8vLyBjbGFzcy4KLSAgQVNJT19ERUNMIHN0YXRpYyBhZGRyZXNzX3Y0IG5ldG1hc2soY29uc3QgYWRkcmVzc192NCYgYWRkcik7Ci0KLXByaXZhdGU6Ci0gIC8vIFRoZSB1bmRlcmx5aW5nIElQdjQgYWRkcmVzcy4KLSAgYXNpbzo6ZGV0YWlsOjppbjRfYWRkcl90eXBlIGFkZHJfOwotfTsKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8vLyBPdXRwdXQgYW4gYWRkcmVzcyBhcyBhIHN0cmluZy4KLS8qKgotICogVXNlZCB0byBvdXRwdXQgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgZm9yIGEgc3BlY2lmaWVkIGFkZHJlc3MuCi0gKgotICogQHBhcmFtIG9zIFRoZSBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoZSBzdHJpbmcgd2lsbCBiZSB3cml0dGVuLgotICoKLSAqIEBwYXJhbSBhZGRyIFRoZSBhZGRyZXNzIHRvIGJlIHdyaXR0ZW4uCi0gKgotICogQHJldHVybiBUaGUgb3V0cHV0IHN0cmVhbS4KLSAqCi0gKiBAcmVsYXRlcyBhc2lvOjppcDo6YWRkcmVzc192NAotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbSwgdHlwZW5hbWUgVHJhaXRzPgotc3RkOjpiYXNpY19vc3RyZWFtPEVsZW0sIFRyYWl0cz4mIG9wZXJhdG9yPDwoCi0gICAgc3RkOjpiYXNpY19vc3RyZWFtPEVsZW0sIFRyYWl0cz4mIG9zLCBjb25zdCBhZGRyZXNzX3Y0JiBhZGRyKTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLX0gLy8gbmFtZXNwYWNlIGlwCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2lwL2ltcGwvYWRkcmVzc192NC5ocHAiCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2lwL2ltcGwvYWRkcmVzc192NC5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gQVNJT19JUF9BRERSRVNTX1Y0X0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2FkZHJlc3NfdjYuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2FkZHJlc3NfdjYuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODIzZDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9hZGRyZXNzX3Y2LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vLwotLy8gaXAvYWRkcmVzc192Ni5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfQUREUkVTU19WNl9IUFAKLSNkZWZpbmUgQVNJT19JUF9BRERSRVNTX1Y2X0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hcnJheS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5zb2NrX2luaXQuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3JfY29kZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9hZGRyZXNzX3Y0LmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0jIGluY2x1ZGUgPGlvc2Z3ZD4KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGlwIHsKLQotLy8vIEltcGxlbWVudHMgSVAgdmVyc2lvbiA2IHN0eWxlIGFkZHJlc3Nlcy4KLS8qKgotICogVGhlIGFzaW86OmlwOjphZGRyZXNzX3Y2IGNsYXNzIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHVzZSBhbmQKLSAqIG1hbmlwdWxhdGUgSVAgdmVyc2lvbiA2IGFkZHJlc3Nlcy4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKi8KLWNsYXNzIGFkZHJlc3NfdjYKLXsKLXB1YmxpYzoKLSAgLy8vIFRoZSB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IGFuIGFkZHJlc3MgYXMgYW4gYXJyYXkgb2YgYnl0ZXMuCi0gIC8qKgotICAgKiBAbm90ZSBUaGlzIHR5cGUgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiB0aGUgQysrMHggdGVtcGxhdGUgQGMgc3RkOjphcnJheQotICAgKiB3aGVuIGl0IGlzIGF2YWlsYWJsZS4gT3RoZXJ3aXNlLCBpdCB1c2VzIEBjIGJvb3N0OmFycmF5LgotICAgKi8KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBhcnJheTx1bnNpZ25lZCBjaGFyLCAxNj4gYnl0ZXNfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjphcnJheTx1bnNpZ25lZCBjaGFyLCAxNj4gYnl0ZXNfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgYWRkcmVzc192NigpOwotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gYWRkcmVzcyBmcm9tIHJhdyBieXRlcyBhbmQgc2NvcGUgSUQuCi0gIEFTSU9fREVDTCBleHBsaWNpdCBhZGRyZXNzX3Y2KGNvbnN0IGJ5dGVzX3R5cGUmIGJ5dGVzLAotICAgICAgdW5zaWduZWQgbG9uZyBzY29wZV9pZCA9IDApOwotCi0gIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgYWRkcmVzc192Nihjb25zdCBhZGRyZXNzX3Y2JiBvdGhlcik7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gIC8vLyBNb3ZlIGNvbnN0cnVjdG9yLgotICBBU0lPX0RFQ0wgYWRkcmVzc192NihhZGRyZXNzX3Y2JiYgb3RoZXIpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAvLy8gQXNzaWduIGZyb20gYW5vdGhlciBhZGRyZXNzLgotICBBU0lPX0RFQ0wgYWRkcmVzc192NiYgb3BlcmF0b3I9KGNvbnN0IGFkZHJlc3NfdjYmIG90aGVyKTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLSAgLy8vIE1vdmUtYXNzaWduIGZyb20gYW5vdGhlciBhZGRyZXNzLgotICBBU0lPX0RFQ0wgYWRkcmVzc192NiYgb3BlcmF0b3I9KGFkZHJlc3NfdjYmJiBvdGhlcik7Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotCi0gIC8vLyBUaGUgc2NvcGUgSUQgb2YgdGhlIGFkZHJlc3MuCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzY29wZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIElQdjYgYWRkcmVzcy4KLSAgICovCi0gIHVuc2lnbmVkIGxvbmcgc2NvcGVfaWQoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNjb3BlX2lkXzsKLSAgfQotCi0gIC8vLyBUaGUgc2NvcGUgSUQgb2YgdGhlIGFkZHJlc3MuCi0gIC8qKgotICAgKiBNb2RpZmllcyB0aGUgc2NvcGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJUHY2IGFkZHJlc3MuCi0gICAqLwotICB2b2lkIHNjb3BlX2lkKHVuc2lnbmVkIGxvbmcgaWQpCi0gIHsKLSAgICBzY29wZV9pZF8gPSBpZDsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIGFkZHJlc3MgaW4gYnl0ZXMsIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KLSAgQVNJT19ERUNMIGJ5dGVzX3R5cGUgdG9fYnl0ZXMoKSBjb25zdDsKLQotICAvLy8gR2V0IHRoZSBhZGRyZXNzIGFzIGEgc3RyaW5nLgotICBBU0lPX0RFQ0wgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8vIEdldCB0aGUgYWRkcmVzcyBhcyBhIHN0cmluZy4KLSAgQVNJT19ERUNMIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3Q7Ci0KLSAgLy8vIENyZWF0ZSBhbiBhZGRyZXNzIGZyb20gYW4gSVAgYWRkcmVzcyBzdHJpbmcuCi0gIEFTSU9fREVDTCBzdGF0aWMgYWRkcmVzc192NiBmcm9tX3N0cmluZyhjb25zdCBjaGFyKiBzdHIpOwotCi0gIC8vLyBDcmVhdGUgYW4gYWRkcmVzcyBmcm9tIGFuIElQIGFkZHJlc3Mgc3RyaW5nLgotICBBU0lPX0RFQ0wgc3RhdGljIGFkZHJlc3NfdjYgZnJvbV9zdHJpbmcoCi0gICAgICBjb25zdCBjaGFyKiBzdHIsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gQ3JlYXRlIGFuIGFkZHJlc3MgZnJvbSBhbiBJUCBhZGRyZXNzIHN0cmluZy4KLSAgQVNJT19ERUNMIHN0YXRpYyBhZGRyZXNzX3Y2IGZyb21fc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIC8vLyBDcmVhdGUgYW4gYWRkcmVzcyBmcm9tIGFuIElQIGFkZHJlc3Mgc3RyaW5nLgotICBBU0lPX0RFQ0wgc3RhdGljIGFkZHJlc3NfdjYgZnJvbV9zdHJpbmcoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIENvbnZlcnRzIGFuIElQdjQtbWFwcGVkIG9yIElQdjQtY29tcGF0aWJsZSBhZGRyZXNzIHRvIGFuIElQdjQgYWRkcmVzcy4KLSAgQVNJT19ERUNMIGFkZHJlc3NfdjQgdG9fdjQoKSBjb25zdDsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzLgotICBBU0lPX0RFQ0wgYm9vbCBpc19sb29wYmFjaygpIGNvbnN0OwotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYWRkcmVzcyBpcyB1bnNwZWNpZmllZC4KLSAgQVNJT19ERUNMIGJvb2wgaXNfdW5zcGVjaWZpZWQoKSBjb25zdDsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgbGluayBsb2NhbC4KLSAgQVNJT19ERUNMIGJvb2wgaXNfbGlua19sb2NhbCgpIGNvbnN0OwotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYWRkcmVzcyBpcyBzaXRlIGxvY2FsLgotICBBU0lPX0RFQ0wgYm9vbCBpc19zaXRlX2xvY2FsKCkgY29uc3Q7Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBhZGRyZXNzIGlzIGEgbWFwcGVkIElQdjQgYWRkcmVzcy4KLSAgQVNJT19ERUNMIGJvb2wgaXNfdjRfbWFwcGVkKCkgY29uc3Q7Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBhZGRyZXNzIGlzIGFuIElQdjQtY29tcGF0aWJsZSBhZGRyZXNzLgotICBBU0lPX0RFQ0wgYm9vbCBpc192NF9jb21wYXRpYmxlKCkgY29uc3Q7Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBhZGRyZXNzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3MuCi0gIEFTSU9fREVDTCBib29sIGlzX211bHRpY2FzdCgpIGNvbnN0OwotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYWRkcmVzcyBpcyBhIGdsb2JhbCBtdWx0aWNhc3QgYWRkcmVzcy4KLSAgQVNJT19ERUNMIGJvb2wgaXNfbXVsdGljYXN0X2dsb2JhbCgpIGNvbnN0OwotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYWRkcmVzcyBpcyBhIGxpbmstbG9jYWwgbXVsdGljYXN0IGFkZHJlc3MuCi0gIEFTSU9fREVDTCBib29sIGlzX211bHRpY2FzdF9saW5rX2xvY2FsKCkgY29uc3Q7Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBhZGRyZXNzIGlzIGEgbm9kZS1sb2NhbCBtdWx0aWNhc3QgYWRkcmVzcy4KLSAgQVNJT19ERUNMIGJvb2wgaXNfbXVsdGljYXN0X25vZGVfbG9jYWwoKSBjb25zdDsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBvcmctbG9jYWwgbXVsdGljYXN0IGFkZHJlc3MuCi0gIEFTSU9fREVDTCBib29sIGlzX211bHRpY2FzdF9vcmdfbG9jYWwoKSBjb25zdDsKLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBzaXRlLWxvY2FsIG11bHRpY2FzdCBhZGRyZXNzLgotICBBU0lPX0RFQ0wgYm9vbCBpc19tdWx0aWNhc3Rfc2l0ZV9sb2NhbCgpIGNvbnN0OwotCi0gIC8vLyBDb21wYXJlIHR3byBhZGRyZXNzZXMgZm9yIGVxdWFsaXR5LgotICBBU0lPX0RFQ0wgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PSgKLSAgICAgIGNvbnN0IGFkZHJlc3NfdjYmIGExLCBjb25zdCBhZGRyZXNzX3Y2JiBhMik7Ci0KLSAgLy8vIENvbXBhcmUgdHdvIGFkZHJlc3NlcyBmb3IgaW5lcXVhbGl0eS4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBhZGRyZXNzX3Y2JiBhMSwgY29uc3QgYWRkcmVzc192NiYgYTIpCi0gIHsKLSAgICByZXR1cm4gIShhMSA9PSBhMik7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSBhZGRyZXNzZXMgZm9yIG9yZGVyaW5nLgotICBBU0lPX0RFQ0wgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KAotICAgICAgY29uc3QgYWRkcmVzc192NiYgYTEsIGNvbnN0IGFkZHJlc3NfdjYmIGEyKTsKLQotICAvLy8gQ29tcGFyZSBhZGRyZXNzZXMgZm9yIG9yZGVyaW5nLgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgYWRkcmVzc192NiYgYTEsIGNvbnN0IGFkZHJlc3NfdjYmIGEyKQotICB7Ci0gICAgcmV0dXJuIGEyIDwgYTE7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSBhZGRyZXNzZXMgZm9yIG9yZGVyaW5nLgotICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGFkZHJlc3NfdjYmIGExLCBjb25zdCBhZGRyZXNzX3Y2JiBhMikKLSAgewotICAgIHJldHVybiAhKGEyIDwgYTEpOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgYWRkcmVzc2VzIGZvciBvcmRlcmluZy4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBhZGRyZXNzX3Y2JiBhMSwgY29uc3QgYWRkcmVzc192NiYgYTIpCi0gIHsKLSAgICByZXR1cm4gIShhMSA8IGEyKTsKLSAgfQotCi0gIC8vLyBPYnRhaW4gYW4gYWRkcmVzcyBvYmplY3QgdGhhdCByZXByZXNlbnRzIGFueSBhZGRyZXNzLgotICBzdGF0aWMgYWRkcmVzc192NiBhbnkoKQotICB7Ci0gICAgcmV0dXJuIGFkZHJlc3NfdjYoKTsKLSAgfQotCi0gIC8vLyBPYnRhaW4gYW4gYWRkcmVzcyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBsb29wYmFjayBhZGRyZXNzLgotICBBU0lPX0RFQ0wgc3RhdGljIGFkZHJlc3NfdjYgbG9vcGJhY2soKTsKLQotICAvLy8gQ3JlYXRlIGFuIElQdjQtbWFwcGVkIElQdjYgYWRkcmVzcy4KLSAgQVNJT19ERUNMIHN0YXRpYyBhZGRyZXNzX3Y2IHY0X21hcHBlZChjb25zdCBhZGRyZXNzX3Y0JiBhZGRyKTsKLQotICAvLy8gQ3JlYXRlIGFuIElQdjQtY29tcGF0aWJsZSBJUHY2IGFkZHJlc3MuCi0gIEFTSU9fREVDTCBzdGF0aWMgYWRkcmVzc192NiB2NF9jb21wYXRpYmxlKGNvbnN0IGFkZHJlc3NfdjQmIGFkZHIpOwotCi1wcml2YXRlOgotICAvLyBUaGUgdW5kZXJseWluZyBJUHY2IGFkZHJlc3MuCi0gIGFzaW86OmRldGFpbDo6aW42X2FkZHJfdHlwZSBhZGRyXzsKLQotICAvLyBUaGUgc2NvcGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzLgotICB1bnNpZ25lZCBsb25nIHNjb3BlX2lkXzsKLX07Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0vLy8gT3V0cHV0IGFuIGFkZHJlc3MgYXMgYSBzdHJpbmcuCi0vKioKLSAqIFVzZWQgdG8gb3V0cHV0IGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGZvciBhIHNwZWNpZmllZCBhZGRyZXNzLgotICoKLSAqIEBwYXJhbSBvcyBUaGUgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0aGUgc3RyaW5nIHdpbGwgYmUgd3JpdHRlbi4KLSAqCi0gKiBAcGFyYW0gYWRkciBUaGUgYWRkcmVzcyB0byBiZSB3cml0dGVuLgotICoKLSAqIEByZXR1cm4gVGhlIG91dHB1dCBzdHJlYW0uCi0gKgotICogQHJlbGF0ZXMgYXNpbzo6aXA6OmFkZHJlc3NfdjYKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW0sIHR5cGVuYW1lIFRyYWl0cz4KLXN0ZDo6YmFzaWNfb3N0cmVhbTxFbGVtLCBUcmFpdHM+JiBvcGVyYXRvcjw8KAotICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxFbGVtLCBUcmFpdHM+JiBvcywgY29uc3QgYWRkcmVzc192NiYgYWRkcik7Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi19IC8vIG5hbWVzcGFjZSBpcAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9pcC9pbXBsL2FkZHJlc3NfdjYuaHBwIgotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9pcC9pbXBsL2FkZHJlc3NfdjYuaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIEFTSU9fSVBfQUREUkVTU19WNl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9iYXNpY19lbmRwb2ludC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvYmFzaWNfZW5kcG9pbnQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWJhZTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9iYXNpY19lbmRwb2ludC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLy8KLS8vIGlwL2Jhc2ljX2VuZHBvaW50LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfQkFTSUNfRU5EUE9JTlRfSFBQCi0jZGVmaW5lIEFTSU9fSVBfQkFTSUNfRU5EUE9JTlRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9hZGRyZXNzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2RldGFpbC9lbmRwb2ludC5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotIyBpbmNsdWRlIDxpb3Nmd2Q+Ci0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBpcCB7Ci0KLS8vLyBEZXNjcmliZXMgYW4gZW5kcG9pbnQgZm9yIGEgdmVyc2lvbi1pbmRlcGVuZGVudCBJUCBzb2NrZXQuCi0vKioKLSAqIFRoZSBhc2lvOjppcDo6YmFzaWNfZW5kcG9pbnQgY2xhc3MgdGVtcGxhdGUgZGVzY3JpYmVzIGFuIGVuZHBvaW50IHRoYXQKLSAqIG1heSBiZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHNvY2tldC4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIEVuZHBvaW50LgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZXJuZXRQcm90b2NvbD4KLWNsYXNzIGJhc2ljX2VuZHBvaW50Ci17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgcHJvdG9jb2wgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LgotICB0eXBlZGVmIEludGVybmV0UHJvdG9jb2wgcHJvdG9jb2xfdHlwZTsKLQotICAvLy8gVGhlIHR5cGUgb2YgdGhlIGVuZHBvaW50IHN0cnVjdHVyZS4gVGhpcyB0eXBlIGlzIGRlcGVuZGVudCBvbiB0aGUKLSAgLy8vIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvY2tldCBsYXllci4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIGRhdGFfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfYWRkcl90eXBlIGRhdGFfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBiYXNpY19lbmRwb2ludCgpCi0gICAgOiBpbXBsXygpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gZW5kcG9pbnQgdXNpbmcgYSBwb3J0IG51bWJlciwgc3BlY2lmaWVkIGluIHRoZSBob3N0J3MgYnl0ZQotICAvLy8gb3JkZXIuIFRoZSBJUCBhZGRyZXNzIHdpbGwgYmUgdGhlIGFueSBhZGRyZXNzIChpLmUuIElOQUREUl9BTlkgb3IKLSAgLy8vIGluNmFkZHJfYW55KS4gVGhpcyBjb25zdHJ1Y3RvciB3b3VsZCB0eXBpY2FsbHkgYmUgdXNlZCBmb3IgYWNjZXB0aW5nIG5ldwotICAvLy8gY29ubmVjdGlvbnMuCi0gIC8qKgotICAgKiBAcGFyIEV4YW1wbGVzCi0gICAqIFRvIGluaXRpYWxpc2UgYW4gSVB2NCBUQ1AgZW5kcG9pbnQgZm9yIHBvcnQgMTIzNCwgdXNlOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjplbmRwb2ludCBlcChhc2lvOjppcDo6dGNwOjp2NCgpLCAxMjM0KTsKLSAgICogQGVuZGNvZGUKLSAgICoKLSAgICogVG8gc3BlY2lmeSBhbiBJUHY2IFVEUCBlbmRwb2ludCBmb3IgcG9ydCA5ODc2LCB1c2U6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp1ZHA6OmVuZHBvaW50IGVwKGFzaW86OmlwOjp1ZHA6OnY2KCksIDk4NzYpOwotICAgKiBAZW5kY29kZQotICAgKi8KLSAgYmFzaWNfZW5kcG9pbnQoY29uc3QgSW50ZXJuZXRQcm90b2NvbCYgaW50ZXJuZXRfcHJvdG9jb2wsCi0gICAgICB1bnNpZ25lZCBzaG9ydCBwb3J0X251bSkKLSAgICA6IGltcGxfKGludGVybmV0X3Byb3RvY29sLmZhbWlseSgpLCBwb3J0X251bSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbiBlbmRwb2ludCB1c2luZyBhIHBvcnQgbnVtYmVyIGFuZCBhbiBJUCBhZGRyZXNzLiBUaGlzCi0gIC8vLyBjb25zdHJ1Y3RvciBtYXkgYmUgdXNlZCBmb3IgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIG9uIGEgc3BlY2lmaWMgaW50ZXJmYWNlCi0gIC8vLyBvciBmb3IgbWFraW5nIGEgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBlbmRwb2ludC4KLSAgYmFzaWNfZW5kcG9pbnQoY29uc3QgYXNpbzo6aXA6OmFkZHJlc3MmIGFkZHIsIHVuc2lnbmVkIHNob3J0IHBvcnRfbnVtKQotICAgIDogaW1wbF8oYWRkciwgcG9ydF9udW0pCi0gIHsKLSAgfQotCi0gIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgotICBiYXNpY19lbmRwb2ludChjb25zdCBiYXNpY19lbmRwb2ludCYgb3RoZXIpCi0gICAgOiBpbXBsXyhvdGhlci5pbXBsXykKLSAgewotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gIC8vLyBNb3ZlIGNvbnN0cnVjdG9yLgotICBiYXNpY19lbmRwb2ludChiYXNpY19lbmRwb2ludCYmIG90aGVyKQotICAgIDogaW1wbF8ob3RoZXIuaW1wbF8pCi0gIHsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAvLy8gQXNzaWduIGZyb20gYW5vdGhlciBlbmRwb2ludC4KLSAgYmFzaWNfZW5kcG9pbnQmIG9wZXJhdG9yPShjb25zdCBiYXNpY19lbmRwb2ludCYgb3RoZXIpCi0gIHsKLSAgICBpbXBsXyA9IG90aGVyLmltcGxfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAvLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIGVuZHBvaW50LgotICBiYXNpY19lbmRwb2ludCYgb3BlcmF0b3I9KGJhc2ljX2VuZHBvaW50JiYgb3RoZXIpCi0gIHsKLSAgICBpbXBsXyA9IG90aGVyLmltcGxfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAvLy8gVGhlIHByb3RvY29sIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuCi0gIHByb3RvY29sX3R5cGUgcHJvdG9jb2woKSBjb25zdAotICB7Ci0gICAgaWYgKGltcGxfLmlzX3Y0KCkpCi0gICAgICByZXR1cm4gSW50ZXJuZXRQcm90b2NvbDo6djQoKTsKLSAgICByZXR1cm4gSW50ZXJuZXRQcm90b2NvbDo6djYoKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBkYXRhX3R5cGUqIGRhdGEoKQotICB7Ci0gICAgcmV0dXJuIGltcGxfLmRhdGEoKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBjb25zdCBkYXRhX3R5cGUqIGRhdGEoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGltcGxfLmRhdGEoKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgc2l6ZSBvZiB0aGUgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QKLSAgewotICAgIHJldHVybiBpbXBsXy5zaXplKCk7Ci0gIH0KLQotICAvLy8gU2V0IHRoZSB1bmRlcmx5aW5nIHNpemUgb2YgdGhlIGVuZHBvaW50IGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgdm9pZCByZXNpemUoc3RkOjpzaXplX3QgbmV3X3NpemUpCi0gIHsKLSAgICBpbXBsXy5yZXNpemUobmV3X3NpemUpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgY2FwYWNpdHkgb2YgdGhlIGVuZHBvaW50IGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgc3RkOjpzaXplX3QgY2FwYWNpdHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGltcGxfLmNhcGFjaXR5KCk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuIFRoZSBwb3J0IG51bWJlciBpcyBhbHdheXMgaW4KLSAgLy8vIHRoZSBob3N0J3MgYnl0ZSBvcmRlci4KLSAgdW5zaWduZWQgc2hvcnQgcG9ydCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaW1wbF8ucG9ydCgpOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LiBUaGUgcG9ydCBudW1iZXIgaXMgYWx3YXlzIGluCi0gIC8vLyB0aGUgaG9zdCdzIGJ5dGUgb3JkZXIuCi0gIHZvaWQgcG9ydCh1bnNpZ25lZCBzaG9ydCBwb3J0X251bSkKLSAgewotICAgIGltcGxfLnBvcnQocG9ydF9udW0pOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgSVAgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LgotICBhc2lvOjppcDo6YWRkcmVzcyBhZGRyZXNzKCkgY29uc3QKLSAgewotICAgIHJldHVybiBpbXBsXy5hZGRyZXNzKCk7Ci0gIH0KLQotICAvLy8gU2V0IHRoZSBJUCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuCi0gIHZvaWQgYWRkcmVzcyhjb25zdCBhc2lvOjppcDo6YWRkcmVzcyYgYWRkcikKLSAgewotICAgIGltcGxfLmFkZHJlc3MoYWRkcik7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSB0d28gZW5kcG9pbnRzIGZvciBlcXVhbGl0eS4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBiYXNpY19lbmRwb2ludDxJbnRlcm5ldFByb3RvY29sPiYgZTEsCi0gICAgICBjb25zdCBiYXNpY19lbmRwb2ludDxJbnRlcm5ldFByb3RvY29sPiYgZTIpCi0gIHsKLSAgICByZXR1cm4gZTEuaW1wbF8gPT0gZTIuaW1wbF87Ci0gIH0KLQotICAvLy8gQ29tcGFyZSB0d28gZW5kcG9pbnRzIGZvciBpbmVxdWFsaXR5LgotICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX2VuZHBvaW50PEludGVybmV0UHJvdG9jb2w+JiBlMSwKLSAgICAgIGNvbnN0IGJhc2ljX2VuZHBvaW50PEludGVybmV0UHJvdG9jb2w+JiBlMikKLSAgewotICAgIHJldHVybiAhKGUxID09IGUyKTsKLSAgfQotCi0gIC8vLyBDb21wYXJlIGVuZHBvaW50cyBmb3Igb3JkZXJpbmcuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBiYXNpY19lbmRwb2ludDxJbnRlcm5ldFByb3RvY29sPiYgZTEsCi0gICAgICBjb25zdCBiYXNpY19lbmRwb2ludDxJbnRlcm5ldFByb3RvY29sPiYgZTIpCi0gIHsKLSAgICByZXR1cm4gZTEuaW1wbF8gPCBlMi5pbXBsXzsKLSAgfQotCi0gIC8vLyBDb21wYXJlIGVuZHBvaW50cyBmb3Igb3JkZXJpbmcuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPihjb25zdCBiYXNpY19lbmRwb2ludDxJbnRlcm5ldFByb3RvY29sPiYgZTEsCi0gICAgICBjb25zdCBiYXNpY19lbmRwb2ludDxJbnRlcm5ldFByb3RvY29sPiYgZTIpCi0gIHsKLSAgICByZXR1cm4gZTIuaW1wbF8gPCBlMS5pbXBsXzsKLSAgfQotCi0gIC8vLyBDb21wYXJlIGVuZHBvaW50cyBmb3Igb3JkZXJpbmcuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oY29uc3QgYmFzaWNfZW5kcG9pbnQ8SW50ZXJuZXRQcm90b2NvbD4mIGUxLAotICAgICAgY29uc3QgYmFzaWNfZW5kcG9pbnQ8SW50ZXJuZXRQcm90b2NvbD4mIGUyKQotICB7Ci0gICAgcmV0dXJuICEoZTIgPCBlMSk7Ci0gIH0KLQotICAvLy8gQ29tcGFyZSBlbmRwb2ludHMgZm9yIG9yZGVyaW5nLgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGJhc2ljX2VuZHBvaW50PEludGVybmV0UHJvdG9jb2w+JiBlMSwKLSAgICAgIGNvbnN0IGJhc2ljX2VuZHBvaW50PEludGVybmV0UHJvdG9jb2w+JiBlMikKLSAgewotICAgIHJldHVybiAhKGUxIDwgZTIpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIFRoZSB1bmRlcmx5aW5nIElQIGVuZHBvaW50LgotICBhc2lvOjppcDo6ZGV0YWlsOjplbmRwb2ludCBpbXBsXzsKLX07Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0vLy8gT3V0cHV0IGFuIGVuZHBvaW50IGFzIGEgc3RyaW5nLgotLyoqCi0gKiBVc2VkIHRvIG91dHB1dCBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgYSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gKgotICogQHBhcmFtIG9zIFRoZSBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoZSBzdHJpbmcgd2lsbCBiZSB3cml0dGVuLgotICoKLSAqIEBwYXJhbSBlbmRwb2ludCBUaGUgZW5kcG9pbnQgdG8gYmUgd3JpdHRlbi4KLSAqCi0gKiBAcmV0dXJuIFRoZSBvdXRwdXQgc3RyZWFtLgotICoKLSAqIEByZWxhdGVzIGFzaW86OmlwOjpiYXNpY19lbmRwb2ludAotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbSwgdHlwZW5hbWUgVHJhaXRzLCB0eXBlbmFtZSBJbnRlcm5ldFByb3RvY29sPgotc3RkOjpiYXNpY19vc3RyZWFtPEVsZW0sIFRyYWl0cz4mIG9wZXJhdG9yPDwoCi0gICAgc3RkOjpiYXNpY19vc3RyZWFtPEVsZW0sIFRyYWl0cz4mIG9zLAotICAgIGNvbnN0IGJhc2ljX2VuZHBvaW50PEludGVybmV0UHJvdG9jb2w+JiBlbmRwb2ludCk7Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi19IC8vIG5hbWVzcGFjZSBpcAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9pcC9pbXBsL2Jhc2ljX2VuZHBvaW50LmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSVBfQkFTSUNfRU5EUE9JTlRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvYmFzaWNfcmVzb2x2ZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2Jhc2ljX3Jlc29sdmVyLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyZjQyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvYmFzaWNfcmVzb2x2ZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8vCi0vLyBpcC9iYXNpY19yZXNvbHZlci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lQX0JBU0lDX1JFU09MVkVSX0hQUAotI2RlZmluZSBBU0lPX0lQX0JBU0lDX1JFU09MVkVSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfaW9fb2JqZWN0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9iYXNpY19yZXNvbHZlcl9pdGVyYXRvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9iYXNpY19yZXNvbHZlcl9xdWVyeS5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9yZXNvbHZlcl9zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBpcCB7Ci0KLS8vLyBQcm92aWRlcyBlbmRwb2ludCByZXNvbHV0aW9uIGZ1bmN0aW9uYWxpdHkuCi0vKioKLSAqIFRoZSBiYXNpY19yZXNvbHZlciBjbGFzcyB0ZW1wbGF0ZSBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byByZXNvbHZlIGEgcXVlcnkKLSAqIHRvIGEgbGlzdCBvZiBlbmRwb2ludHMuCi0gKgotICogQHBhciBUaHJlYWQgU2FmZXR5Ci0gKiBAZSBEaXN0aW5jdCBAZSBvYmplY3RzOiBTYWZlLkBuCi0gKiBAZSBTaGFyZWQgQGUgb2JqZWN0czogVW5zYWZlLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZXJuZXRQcm90b2NvbCwKLSAgICB0eXBlbmFtZSBSZXNvbHZlclNlcnZpY2UgPSByZXNvbHZlcl9zZXJ2aWNlPEludGVybmV0UHJvdG9jb2w+ID4KLWNsYXNzIGJhc2ljX3Jlc29sdmVyCi0gIDogcHVibGljIGJhc2ljX2lvX29iamVjdDxSZXNvbHZlclNlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgcHJvdG9jb2wgdHlwZS4KLSAgdHlwZWRlZiBJbnRlcm5ldFByb3RvY29sIHByb3RvY29sX3R5cGU7Ci0KLSAgLy8vIFRoZSBlbmRwb2ludCB0eXBlLgotICB0eXBlZGVmIHR5cGVuYW1lIEludGVybmV0UHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLSAgLy8vIFRoZSBxdWVyeSB0eXBlLgotICB0eXBlZGVmIGJhc2ljX3Jlc29sdmVyX3F1ZXJ5PEludGVybmV0UHJvdG9jb2w+IHF1ZXJ5OwotCi0gIC8vLyBUaGUgaXRlcmF0b3IgdHlwZS4KLSAgdHlwZWRlZiBiYXNpY19yZXNvbHZlcl9pdGVyYXRvcjxJbnRlcm5ldFByb3RvY29sPiBpdGVyYXRvcjsKLQotICAvLy8gQ29uc3RydWN0b3IuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBiYXNpY19yZXNvbHZlci4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHJlc29sdmVyIHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSB0aW1lci4KLSAgICovCi0gIGV4cGxpY2l0IGJhc2ljX3Jlc29sdmVyKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8UmVzb2x2ZXJTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gQ2FuY2VsIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoZSByZXNvbHZlci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIHRoZSBjb21wbGV0aW9uIG9mIGFueSBwZW5kaW5nIGFzeW5jaHJvbm91cwotICAgKiBvcGVyYXRpb25zIG9uIHRoZSBob3N0IHJlc29sdmVyLiBUaGUgaGFuZGxlciBmb3IgZWFjaCBjYW5jZWxsZWQgb3BlcmF0aW9uCi0gICAqIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IgY29kZS4KLSAgICovCi0gIHZvaWQgY2FuY2VsKCkKLSAgewotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLmNhbmNlbCh0aGlzLT5pbXBsZW1lbnRhdGlvbik7Ci0gIH0KLQotICAvLy8gUGVyZm9ybSBmb3J3YXJkIHJlc29sdXRpb24gb2YgYSBxdWVyeSB0byBhIGxpc3Qgb2YgZW50cmllcy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXNvbHZlIGEgcXVlcnkgaW50byBhIGxpc3Qgb2YgZW5kcG9pbnQgZW50cmllcy4KLSAgICoKLSAgICogQHBhcmFtIHEgQSBxdWVyeSBvYmplY3QgdGhhdCBkZXRlcm1pbmVzIHdoYXQgZW5kcG9pbnRzIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAqCi0gICAqIEByZXR1cm5zIEEgZm9yd2FyZC1vbmx5IGl0ZXJhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGxpc3QKLSAgICogb2YgZW5kcG9pbnQgZW50cmllcy4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIEEgZGVmYXVsdCBjb25zdHJ1Y3RlZCBpdGVyYXRvciByZXByZXNlbnRzIHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0gICAqCi0gICAqIEEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gYXQgbGVhc3Qgb25lCi0gICAqIGVudHJ5LgotICAgKi8KLSAgaXRlcmF0b3IgcmVzb2x2ZShjb25zdCBxdWVyeSYgcSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgaXRlcmF0b3IgaSA9IHRoaXMtPnNlcnZpY2UucmVzb2x2ZSh0aGlzLT5pbXBsZW1lbnRhdGlvbiwgcSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZXNvbHZlIik7Ci0gICAgcmV0dXJuIGk7Ci0gIH0KLQotICAvLy8gUGVyZm9ybSBmb3J3YXJkIHJlc29sdXRpb24gb2YgYSBxdWVyeSB0byBhIGxpc3Qgb2YgZW50cmllcy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXNvbHZlIGEgcXVlcnkgaW50byBhIGxpc3Qgb2YgZW5kcG9pbnQgZW50cmllcy4KLSAgICoKLSAgICogQHBhcmFtIHEgQSBxdWVyeSBvYmplY3QgdGhhdCBkZXRlcm1pbmVzIHdoYXQgZW5kcG9pbnRzIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBBIGZvcndhcmQtb25seSBpdGVyYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYXZlcnNlIHRoZSBsaXN0Ci0gICAqIG9mIGVuZHBvaW50IGVudHJpZXMuIFJldHVybnMgYSBkZWZhdWx0IGNvbnN0cnVjdGVkIGl0ZXJhdG9yIGlmIGFuIGVycm9yCi0gICAqIG9jY3Vycy4KLSAgICoKLSAgICogQG5vdGUgQSBkZWZhdWx0IGNvbnN0cnVjdGVkIGl0ZXJhdG9yIHJlcHJlc2VudHMgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICoKLSAgICogQSBzdWNjZXNzZnVsIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBhdCBsZWFzdCBvbmUKLSAgICogZW50cnkuCi0gICAqLwotICBpdGVyYXRvciByZXNvbHZlKGNvbnN0IHF1ZXJ5JiBxLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLnJlc29sdmUodGhpcy0+aW1wbGVtZW50YXRpb24sIHEsIGVjKTsKLSAgfQotCi0gIC8vLyBBc3luY2hyb25vdXNseSBwZXJmb3JtIGZvcndhcmQgcmVzb2x1dGlvbiBvZiBhIHF1ZXJ5IHRvIGEgbGlzdCBvZiBlbnRyaWVzLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlc29sdmUgYSBxdWVyeSBpbnRvIGEgbGlzdCBvZgotICAgKiBlbmRwb2ludCBlbnRyaWVzLgotICAgKgotICAgKiBAcGFyYW0gcSBBIHF1ZXJ5IG9iamVjdCB0aGF0IGRldGVybWluZXMgd2hhdCBlbmRwb2ludHMgd2lsbCBiZSByZXR1cm5lZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlc29sdmUgb3BlcmF0aW9uCi0gICAqIGNvbXBsZXRlcy4gQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uCi0gICAqIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgcmVzb2x2ZXI6Oml0ZXJhdG9yIGl0ZXJhdG9yICAgICAgICAgICAgIC8vIEZvcndhcmQtb25seSBpdGVyYXRvciB0aGF0IGNhbgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSB1c2VkIHRvIHRyYXZlcnNlIHRoZSBsaXN0Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGVuZHBvaW50IGVudHJpZXMuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBub3RlIEEgZGVmYXVsdCBjb25zdHJ1Y3RlZCBpdGVyYXRvciByZXByZXNlbnRzIHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0gICAqCi0gICAqIEEgc3VjY2Vzc2Z1bCByZXNvbHZlIG9wZXJhdGlvbiBpcyBndWFyYW50ZWVkIHRvIHBhc3MgYXQgbGVhc3Qgb25lIGVudHJ5IHRvCi0gICAqIHRoZSBoYW5kbGVyLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc29sdmVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZXNvbHZlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIGl0ZXJhdG9yKSkKLSAgYXN5bmNfcmVzb2x2ZShjb25zdCBxdWVyeSYgcSwKLSAgICAgIEFTSU9fTU9WRV9BUkcoUmVzb2x2ZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVzb2x2ZUhhbmRsZXIuCi0gICAgQVNJT19SRVNPTFZFX0hBTkRMRVJfQ0hFQ0soCi0gICAgICAgIFJlc29sdmVIYW5kbGVyLCBoYW5kbGVyLCBpdGVyYXRvcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5zZXJ2aWNlLmFzeW5jX3Jlc29sdmUodGhpcy0+aW1wbGVtZW50YXRpb24sIHEsCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlc29sdmVIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLQotICAvLy8gUGVyZm9ybSByZXZlcnNlIHJlc29sdXRpb24gb2YgYW4gZW5kcG9pbnQgdG8gYSBsaXN0IG9mIGVudHJpZXMuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVzb2x2ZSBhbiBlbmRwb2ludCBpbnRvIGEgbGlzdCBvZiBlbmRwb2ludAotICAgKiBlbnRyaWVzLgotICAgKgotICAgKiBAcGFyYW0gZSBBbiBlbmRwb2ludCBvYmplY3QgdGhhdCBkZXRlcm1pbmVzIHdoYXQgZW5kcG9pbnRzIHdpbGwgYmUKLSAgICogcmV0dXJuZWQuCi0gICAqCi0gICAqIEByZXR1cm5zIEEgZm9yd2FyZC1vbmx5IGl0ZXJhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGxpc3QKLSAgICogb2YgZW5kcG9pbnQgZW50cmllcy4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIEEgZGVmYXVsdCBjb25zdHJ1Y3RlZCBpdGVyYXRvciByZXByZXNlbnRzIHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0gICAqCi0gICAqIEEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gYXQgbGVhc3Qgb25lCi0gICAqIGVudHJ5LgotICAgKi8KLSAgaXRlcmF0b3IgcmVzb2x2ZShjb25zdCBlbmRwb2ludF90eXBlJiBlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBpdGVyYXRvciBpID0gdGhpcy0+c2VydmljZS5yZXNvbHZlKHRoaXMtPmltcGxlbWVudGF0aW9uLCBlLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInJlc29sdmUiKTsKLSAgICByZXR1cm4gaTsKLSAgfQotCi0gIC8vLyBQZXJmb3JtIHJldmVyc2UgcmVzb2x1dGlvbiBvZiBhbiBlbmRwb2ludCB0byBhIGxpc3Qgb2YgZW50cmllcy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXNvbHZlIGFuIGVuZHBvaW50IGludG8gYSBsaXN0IG9mIGVuZHBvaW50Ci0gICAqIGVudHJpZXMuCi0gICAqCi0gICAqIEBwYXJhbSBlIEFuIGVuZHBvaW50IG9iamVjdCB0aGF0IGRldGVybWluZXMgd2hhdCBlbmRwb2ludHMgd2lsbCBiZQotICAgKiByZXR1cm5lZC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIEEgZm9yd2FyZC1vbmx5IGl0ZXJhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGxpc3QKLSAgICogb2YgZW5kcG9pbnQgZW50cmllcy4gUmV0dXJucyBhIGRlZmF1bHQgY29uc3RydWN0ZWQgaXRlcmF0b3IgaWYgYW4gZXJyb3IKLSAgICogb2NjdXJzLgotICAgKgotICAgKiBAbm90ZSBBIGRlZmF1bHQgY29uc3RydWN0ZWQgaXRlcmF0b3IgcmVwcmVzZW50cyB0aGUgZW5kIG9mIHRoZSBsaXN0LgotICAgKgotICAgKiBBIHN1Y2Nlc3NmdWwgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGF0IGxlYXN0IG9uZQotICAgKiBlbnRyeS4KLSAgICovCi0gIGl0ZXJhdG9yIHJlc29sdmUoY29uc3QgZW5kcG9pbnRfdHlwZSYgZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+c2VydmljZS5yZXNvbHZlKHRoaXMtPmltcGxlbWVudGF0aW9uLCBlLCBlYyk7Ci0gIH0KLQotICAvLy8gQXN5bmNocm9ub3VzbHkgcGVyZm9ybSByZXZlcnNlIHJlc29sdXRpb24gb2YgYW4gZW5kcG9pbnQgdG8gYSBsaXN0IG9mCi0gIC8vLyBlbnRyaWVzLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlc29sdmUgYW4gZW5kcG9pbnQgaW50byBhIGxpc3Qgb2YKLSAgICogZW5kcG9pbnQgZW50cmllcy4KLSAgICoKLSAgICogQHBhcmFtIGUgQW4gZW5kcG9pbnQgb2JqZWN0IHRoYXQgZGV0ZXJtaW5lcyB3aGF0IGVuZHBvaW50cyB3aWxsIGJlCi0gICAqIHJldHVybmVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcmVzb2x2ZSBvcGVyYXRpb24KLSAgICogY29tcGxldGVzLiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24KLSAgICogc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICByZXNvbHZlcjo6aXRlcmF0b3IgaXRlcmF0b3IgICAgICAgICAgICAgLy8gRm9yd2FyZC1vbmx5IGl0ZXJhdG9yIHRoYXQgY2FuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGxpc3QKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgZW5kcG9pbnQgZW50cmllcy4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICoKLSAgICogQG5vdGUgQSBkZWZhdWx0IGNvbnN0cnVjdGVkIGl0ZXJhdG9yIHJlcHJlc2VudHMgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICoKLSAgICogQSBzdWNjZXNzZnVsIHJlc29sdmUgb3BlcmF0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcGFzcyBhdCBsZWFzdCBvbmUgZW50cnkgdG8KLSAgICogdGhlIGhhbmRsZXIuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzb2x2ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlc29sdmVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgaXRlcmF0b3IpKQotICBhc3luY19yZXNvbHZlKGNvbnN0IGVuZHBvaW50X3R5cGUmIGUsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlc29sdmVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlc29sdmVIYW5kbGVyLgotICAgIEFTSU9fUkVTT0xWRV9IQU5ETEVSX0NIRUNLKAotICAgICAgICBSZXNvbHZlSGFuZGxlciwgaGFuZGxlciwgaXRlcmF0b3IpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+c2VydmljZS5hc3luY19yZXNvbHZlKHRoaXMtPmltcGxlbWVudGF0aW9uLCBlLAotICAgICAgICBBU0lPX01PVkVfQ0FTVChSZXNvbHZlSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBpcAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19JUF9CQVNJQ19SRVNPTFZFUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9iYXNpY19yZXNvbHZlcl9lbnRyeS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfZW50cnkuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQ0NWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9iYXNpY19yZXNvbHZlcl9lbnRyeS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLwotLy8gaXAvYmFzaWNfcmVzb2x2ZXJfZW50cnkuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JUF9CQVNJQ19SRVNPTFZFUl9FTlRSWV9IUFAKLSNkZWZpbmUgQVNJT19JUF9CQVNJQ19SRVNPTFZFUl9FTlRSWV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgaXAgewotCi0vLy8gQW4gZW50cnkgcHJvZHVjZWQgYnkgYSByZXNvbHZlci4KLS8qKgotICogVGhlIGFzaW86OmlwOjpiYXNpY19yZXNvbHZlcl9lbnRyeSBjbGFzcyB0ZW1wbGF0ZSBkZXNjcmliZXMgYW4gZW50cnkKLSAqIGFzIHJldHVybmVkIGJ5IGEgcmVzb2x2ZXIuCi0gKgotICogQHBhciBUaHJlYWQgU2FmZXR5Ci0gKiBAZSBEaXN0aW5jdCBAZSBvYmplY3RzOiBTYWZlLkBuCi0gKiBAZSBTaGFyZWQgQGUgb2JqZWN0czogVW5zYWZlLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZXJuZXRQcm90b2NvbD4KLWNsYXNzIGJhc2ljX3Jlc29sdmVyX2VudHJ5Ci17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgcHJvdG9jb2wgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50IGVudHJ5LgotICB0eXBlZGVmIEludGVybmV0UHJvdG9jb2wgcHJvdG9jb2xfdHlwZTsKLQotICAvLy8gVGhlIGVuZHBvaW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmRwb2ludCBlbnRyeS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBJbnRlcm5ldFByb3RvY29sOjplbmRwb2ludCBlbmRwb2ludF90eXBlOwotCi0gIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBiYXNpY19yZXNvbHZlcl9lbnRyeSgpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3Qgd2l0aCBzcGVjaWZpZWQgZW5kcG9pbnQsIGhvc3QgbmFtZSBhbmQgc2VydmljZSBuYW1lLgotICBiYXNpY19yZXNvbHZlcl9lbnRyeShjb25zdCBlbmRwb2ludF90eXBlJiBlcCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZSkKLSAgICA6IGVuZHBvaW50XyhlcCksCi0gICAgICBob3N0X25hbWVfKGhvc3QpLAotICAgICAgc2VydmljZV9uYW1lXyhzZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBlbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhlIGVudHJ5LgotICBlbmRwb2ludF90eXBlIGVuZHBvaW50KCkgY29uc3QKLSAgewotICAgIHJldHVybiBlbmRwb2ludF87Ci0gIH0KLQotICAvLy8gQ29udmVydCB0byB0aGUgZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeS4KLSAgb3BlcmF0b3IgZW5kcG9pbnRfdHlwZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gZW5kcG9pbnRfOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgaG9zdCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkuCi0gIHN0ZDo6c3RyaW5nIGhvc3RfbmFtZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaG9zdF9uYW1lXzsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHNlcnZpY2UgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVudHJ5LgotICBzdGQ6OnN0cmluZyBzZXJ2aWNlX25hbWUoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfbmFtZV87Ci0gIH0KLQotcHJpdmF0ZToKLSAgZW5kcG9pbnRfdHlwZSBlbmRwb2ludF87Ci0gIHN0ZDo6c3RyaW5nIGhvc3RfbmFtZV87Ci0gIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBpcAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19JUF9CQVNJQ19SRVNPTFZFUl9FTlRSWV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9iYXNpY19yZXNvbHZlcl9pdGVyYXRvci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWIxMzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9iYXNpY19yZXNvbHZlcl9pdGVyYXRvci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLy8KLS8vIGlwL2Jhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfQkFTSUNfUkVTT0xWRVJfSVRFUkFUT1JfSFBQCi0jZGVmaW5lIEFTSU9fSVBfQkFTSUNfUkVTT0xWRVJfSVRFUkFUT1JfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc2hhcmVkX3B0ci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyX2VudHJ5LmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnJ0X3V0aWxzLmhwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGlwIHsKLQotLy8vIEFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVudHJpZXMgcHJvZHVjZWQgYnkgYSByZXNvbHZlci4KLS8qKgotICogVGhlIGFzaW86OmlwOjpiYXNpY19yZXNvbHZlcl9pdGVyYXRvciBjbGFzcyB0ZW1wbGF0ZSBpcyB1c2VkIHRvIGRlZmluZQotICogaXRlcmF0b3JzIG92ZXIgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkgYSByZXNvbHZlci4KLSAqCi0gKiBUaGUgaXRlcmF0b3IncyB2YWx1ZV90eXBlLCBvYnRhaW5lZCB3aGVuIHRoZSBpdGVyYXRvciBpcyBkZXJlZmVyZW5jZWQsIGlzOgotICogQGNvZGUgY29uc3QgYmFzaWNfcmVzb2x2ZXJfZW50cnk8SW50ZXJuZXRQcm90b2NvbD4gQGVuZGNvZGUKLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbnRlcm5ldFByb3RvY29sPgotY2xhc3MgYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IKLXsKLXB1YmxpYzoKLSAgLy8vIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBpdGVyYXRvcnMuCi0gIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwotCi0gIC8vLyBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSB0aGUgaXRlcmF0b3IuCi0gIHR5cGVkZWYgYmFzaWNfcmVzb2x2ZXJfZW50cnk8SW50ZXJuZXRQcm90b2NvbD4gdmFsdWVfdHlwZTsKLQotICAvLy8gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBvcGVyYXRvci0+KCkgdG8gdGhlIGl0ZXJhdG9yLgotICB0eXBlZGVmIGNvbnN0IGJhc2ljX3Jlc29sdmVyX2VudHJ5PEludGVybmV0UHJvdG9jb2w+KiBwb2ludGVyOwotCi0gIC8vLyBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIG9wZXJhdG9yKigpIHRvIHRoZSBpdGVyYXRvci4KLSAgdHlwZWRlZiBjb25zdCBiYXNpY19yZXNvbHZlcl9lbnRyeTxJbnRlcm5ldFByb3RvY29sPiYgcmVmZXJlbmNlOwotCi0gIC8vLyBUaGUgaXRlcmF0b3IgY2F0ZWdvcnkuCi0gIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKLQotICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGVuZCBpdGVyYXRvci4KLSAgYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IoKQotICAgIDogaW5kZXhfKDApCi0gIHsKLSAgfQotCi0gIC8vLyBDcmVhdGUgYW4gaXRlcmF0b3IgZnJvbSBhbiBhZGRyaW5mbyBsaXN0IHJldHVybmVkIGJ5IGdldGFkZHJpbmZvLgotICBzdGF0aWMgYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IgY3JlYXRlKAotICAgICAgYXNpbzo6ZGV0YWlsOjphZGRyaW5mb190eXBlKiBhZGRyZXNzX2luZm8sCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdF9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lKQotICB7Ci0gICAgYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IgaXRlcjsKLSAgICBpZiAoIWFkZHJlc3NfaW5mbykKLSAgICAgIHJldHVybiBpdGVyOwotCi0gICAgc3RkOjpzdHJpbmcgYWN0dWFsX2hvc3RfbmFtZSA9IGhvc3RfbmFtZTsKLSAgICBpZiAoYWRkcmVzc19pbmZvLT5haV9jYW5vbm5hbWUpCi0gICAgICBhY3R1YWxfaG9zdF9uYW1lID0gYWRkcmVzc19pbmZvLT5haV9jYW5vbm5hbWU7Ci0KLSAgICBpdGVyLnZhbHVlc18ucmVzZXQobmV3IHZhbHVlc190eXBlKTsKLQotICAgIHdoaWxlIChhZGRyZXNzX2luZm8pCi0gICAgewotICAgICAgaWYgKGFkZHJlc3NfaW5mby0+YWlfZmFtaWx5ID09IEFTSU9fT1NfREVGKEFGX0lORVQpCi0gICAgICAgICAgfHwgYWRkcmVzc19pbmZvLT5haV9mYW1pbHkgPT0gQVNJT19PU19ERUYoQUZfSU5FVDYpKQotICAgICAgewotICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3IgbWVtY3B5LgotICAgICAgICB0eXBlbmFtZSBJbnRlcm5ldFByb3RvY29sOjplbmRwb2ludCBlbmRwb2ludDsKLSAgICAgICAgZW5kcG9pbnQucmVzaXplKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihhZGRyZXNzX2luZm8tPmFpX2FkZHJsZW4pKTsKLSAgICAgICAgbWVtY3B5KGVuZHBvaW50LmRhdGEoKSwgYWRkcmVzc19pbmZvLT5haV9hZGRyLAotICAgICAgICAgICAgYWRkcmVzc19pbmZvLT5haV9hZGRybGVuKTsKLSAgICAgICAgaXRlci52YWx1ZXNfLT5wdXNoX2JhY2soCi0gICAgICAgICAgICBiYXNpY19yZXNvbHZlcl9lbnRyeTxJbnRlcm5ldFByb3RvY29sPihlbmRwb2ludCwKLSAgICAgICAgICAgICAgYWN0dWFsX2hvc3RfbmFtZSwgc2VydmljZV9uYW1lKSk7Ci0gICAgICB9Ci0gICAgICBhZGRyZXNzX2luZm8gPSBhZGRyZXNzX2luZm8tPmFpX25leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGl0ZXI7Ci0gIH0KLQotICAvLy8gQ3JlYXRlIGFuIGl0ZXJhdG9yIGZyb20gYW4gZW5kcG9pbnQsIGhvc3QgbmFtZSBhbmQgc2VydmljZSBuYW1lLgotICBzdGF0aWMgYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IgY3JlYXRlKAotICAgICAgY29uc3QgdHlwZW5hbWUgSW50ZXJuZXRQcm90b2NvbDo6ZW5kcG9pbnQmIGVuZHBvaW50LAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3RfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSkKLSAgewotICAgIGJhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yIGl0ZXI7Ci0gICAgaXRlci52YWx1ZXNfLnJlc2V0KG5ldyB2YWx1ZXNfdHlwZSk7Ci0gICAgaXRlci52YWx1ZXNfLT5wdXNoX2JhY2soCi0gICAgICAgIGJhc2ljX3Jlc29sdmVyX2VudHJ5PEludGVybmV0UHJvdG9jb2w+KAotICAgICAgICAgIGVuZHBvaW50LCBob3N0X25hbWUsIHNlcnZpY2VfbmFtZSkpOwotICAgIHJldHVybiBpdGVyOwotICB9Ci0KLSAgLy8vIENyZWF0ZSBhbiBpdGVyYXRvciBmcm9tIGEgc2VxdWVuY2Ugb2YgZW5kcG9pbnRzLCBob3N0IGFuZCBzZXJ2aWNlIG5hbWUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBFbmRwb2ludEl0ZXJhdG9yPgotICBzdGF0aWMgYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IgY3JlYXRlKAotICAgICAgRW5kcG9pbnRJdGVyYXRvciBiZWdpbiwgRW5kcG9pbnRJdGVyYXRvciBlbmQsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdF9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lKQotICB7Ci0gICAgYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IgaXRlcjsKLSAgICBpZiAoYmVnaW4gIT0gZW5kKQotICAgIHsKLSAgICAgIGl0ZXIudmFsdWVzXy5yZXNldChuZXcgdmFsdWVzX3R5cGUpOwotICAgICAgZm9yIChFbmRwb2ludEl0ZXJhdG9yIGVwX2l0ZXIgPSBiZWdpbjsgZXBfaXRlciAhPSBlbmQ7ICsrZXBfaXRlcikKLSAgICAgIHsKLSAgICAgICAgaXRlci52YWx1ZXNfLT5wdXNoX2JhY2soCi0gICAgICAgICAgICBiYXNpY19yZXNvbHZlcl9lbnRyeTxJbnRlcm5ldFByb3RvY29sPigKLSAgICAgICAgICAgICAgKmVwX2l0ZXIsIGhvc3RfbmFtZSwgc2VydmljZV9uYW1lKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpdGVyOwotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICAvLy8gQ3JlYXRlIGFuIGl0ZXJhdG9yIGZyb20gYSBXaW5kb3dzIFJ1bnRpbWUgbGlzdCBvZiBFbmRwb2ludFBhaXIgb2JqZWN0cy4KLSAgc3RhdGljIGJhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yIGNyZWF0ZSgKLSAgICAgIFdpbmRvd3M6OkZvdW5kYXRpb246OkNvbGxlY3Rpb25zOjpJVmVjdG9yVmlldzwKLSAgICAgICAgV2luZG93czo6TmV0d29ya2luZzo6RW5kcG9pbnRQYWlyXj5eIGVuZHBvaW50cywKLSAgICAgIGNvbnN0IGFzaW86OmRldGFpbDo6YWRkcmluZm9fdHlwZSYgaGludHMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdF9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lKQotICB7Ci0gICAgYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IgaXRlcjsKLSAgICBpZiAoZW5kcG9pbnRzLT5TaXplKQotICAgIHsKLSAgICAgIGl0ZXIudmFsdWVzXy5yZXNldChuZXcgdmFsdWVzX3R5cGUpOwotICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBlbmRwb2ludHMtPlNpemU7ICsraSkKLSAgICAgIHsKLSAgICAgICAgYXV0byBwYWlyID0gZW5kcG9pbnRzLT5HZXRBdChpKTsKLQotICAgICAgICBpZiAoaGludHMuYWlfZmFtaWx5ID09IEFTSU9fT1NfREVGKEFGX0lORVQpCi0gICAgICAgICAgICAmJiBwYWlyLT5SZW1vdGVIb3N0TmFtZS0+VHlwZQotICAgICAgICAgICAgICAhPSBXaW5kb3dzOjpOZXR3b3JraW5nOjpIb3N0TmFtZVR5cGU6OklwdjQpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGhpbnRzLmFpX2ZhbWlseSA9PSBBU0lPX09TX0RFRihBRl9JTkVUNikKLSAgICAgICAgICAgICYmIHBhaXItPlJlbW90ZUhvc3ROYW1lLT5UeXBlCi0gICAgICAgICAgICAgICE9IFdpbmRvd3M6Ok5ldHdvcmtpbmc6Okhvc3ROYW1lVHlwZTo6SXB2NikKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpdGVyLnZhbHVlc18tPnB1c2hfYmFjaygKLSAgICAgICAgICAgIGJhc2ljX3Jlc29sdmVyX2VudHJ5PEludGVybmV0UHJvdG9jb2w+KAotICAgICAgICAgICAgICB0eXBlbmFtZSBJbnRlcm5ldFByb3RvY29sOjplbmRwb2ludCgKLSAgICAgICAgICAgICAgICBpcDo6YWRkcmVzczo6ZnJvbV9zdHJpbmcoCi0gICAgICAgICAgICAgICAgICBhc2lvOjpkZXRhaWw6OndpbnJ0X3V0aWxzOjpzdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHBhaXItPlJlbW90ZUhvc3ROYW1lLT5DYW5vbmljYWxOYW1lKSksCi0gICAgICAgICAgICAgICAgYXNpbzo6ZGV0YWlsOjp3aW5ydF91dGlsczo6aW50ZWdlcigKLSAgICAgICAgICAgICAgICAgIHBhaXItPlJlbW90ZVNlcnZpY2VOYW1lKSksCi0gICAgICAgICAgICAgIGhvc3RfbmFtZSwgc2VydmljZV9uYW1lKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpdGVyOwotICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLQotICAvLy8gRGVyZWZlcmVuY2UgYW4gaXRlcmF0b3IuCi0gIGNvbnN0IGJhc2ljX3Jlc29sdmVyX2VudHJ5PEludGVybmV0UHJvdG9jb2w+JiBvcGVyYXRvciooKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGRlcmVmZXJlbmNlKCk7Ci0gIH0KLQotICAvLy8gRGVyZWZlcmVuY2UgYW4gaXRlcmF0b3IuCi0gIGNvbnN0IGJhc2ljX3Jlc29sdmVyX2VudHJ5PEludGVybmV0UHJvdG9jb2w+KiBvcGVyYXRvci0+KCkgY29uc3QKLSAgewotICAgIHJldHVybiAmZGVyZWZlcmVuY2UoKTsKLSAgfQotCi0gIC8vLyBJbmNyZW1lbnQgb3BlcmF0b3IgKHByZWZpeCkuCi0gIGJhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkKLSAgewotICAgIGluY3JlbWVudCgpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vLyBJbmNyZW1lbnQgb3BlcmF0b3IgKHBvc3RmaXgpLgotICBiYXNpY19yZXNvbHZlcl9pdGVyYXRvciBvcGVyYXRvcisrKGludCkKLSAgewotICAgIGJhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yIHRtcCgqdGhpcyk7Ci0gICAgKysqdGhpczsKLSAgICByZXR1cm4gdG1wOwotICB9Ci0KLSAgLy8vIFRlc3QgdHdvIGl0ZXJhdG9ycyBmb3IgZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3ImIGEsCi0gICAgICBjb25zdCBiYXNpY19yZXNvbHZlcl9pdGVyYXRvciYgYikKLSAgewotICAgIHJldHVybiBhLmVxdWFsKGIpOwotICB9Ci0KLSAgLy8vIFRlc3QgdHdvIGl0ZXJhdG9ycyBmb3IgaW5lcXVhbGl0eS4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBiYXNpY19yZXNvbHZlcl9pdGVyYXRvciYgYSwKLSAgICAgIGNvbnN0IGJhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yJiBiKQotICB7Ci0gICAgcmV0dXJuICFhLmVxdWFsKGIpOwotICB9Ci0KLXByaXZhdGU6Ci0gIHZvaWQgaW5jcmVtZW50KCkKLSAgewotICAgIGlmICgrK2luZGV4XyA9PSB2YWx1ZXNfLT5zaXplKCkpCi0gICAgewotICAgICAgLy8gUmVzZXQgc3RhdGUgdG8gbWF0Y2ggYSBkZWZhdWx0IGNvbnN0cnVjdGVkIGVuZCBpdGVyYXRvci4KLSAgICAgIHZhbHVlc18ucmVzZXQoKTsKLSAgICAgIGluZGV4XyA9IDA7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBlcXVhbChjb25zdCBiYXNpY19yZXNvbHZlcl9pdGVyYXRvciYgb3RoZXIpIGNvbnN0Ci0gIHsKLSAgICBpZiAoIXZhbHVlc18gJiYgIW90aGVyLnZhbHVlc18pCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodmFsdWVzXyAhPSBvdGhlci52YWx1ZXNfKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBpbmRleF8gPT0gb3RoZXIuaW5kZXhfOwotICB9Ci0KLSAgY29uc3QgYmFzaWNfcmVzb2x2ZXJfZW50cnk8SW50ZXJuZXRQcm90b2NvbD4mIGRlcmVmZXJlbmNlKCkgY29uc3QKLSAgewotICAgIHJldHVybiAoKnZhbHVlc18pW2luZGV4X107Ci0gIH0KLQotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGJhc2ljX3Jlc29sdmVyX2VudHJ5PEludGVybmV0UHJvdG9jb2w+ID4gdmFsdWVzX3R5cGU7Ci0gIGFzaW86OmRldGFpbDo6c2hhcmVkX3B0cjx2YWx1ZXNfdHlwZT4gdmFsdWVzXzsKLSAgc3RkOjpzaXplX3QgaW5kZXhfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSVBfQkFTSUNfUkVTT0xWRVJfSVRFUkFUT1JfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfcXVlcnkuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2Jhc2ljX3Jlc29sdmVyX3F1ZXJ5LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkNTcyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfcXVlcnkuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8vCi0vLyBpcC9iYXNpY19yZXNvbHZlcl9xdWVyeS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lQX0JBU0lDX1JFU09MVkVSX1FVRVJZX0hQUAotI2RlZmluZSBBU0lPX0lQX0JBU0lDX1JFU09MVkVSX1FVRVJZX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfb3BzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL3Jlc29sdmVyX3F1ZXJ5X2Jhc2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGlwIHsKLQotLy8vIEFuIHF1ZXJ5IHRvIGJlIHBhc3NlZCB0byBhIHJlc29sdmVyLgotLyoqCi0gKiBUaGUgYXNpbzo6aXA6OmJhc2ljX3Jlc29sdmVyX3F1ZXJ5IGNsYXNzIHRlbXBsYXRlIGRlc2NyaWJlcyBhIHF1ZXJ5Ci0gKiB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gYSByZXNvbHZlci4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbnRlcm5ldFByb3RvY29sPgotY2xhc3MgYmFzaWNfcmVzb2x2ZXJfcXVlcnkKLSAgOiBwdWJsaWMgcmVzb2x2ZXJfcXVlcnlfYmFzZQotewotcHVibGljOgotICAvLy8gVGhlIHByb3RvY29sIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmRwb2ludCBxdWVyeS4KLSAgdHlwZWRlZiBJbnRlcm5ldFByb3RvY29sIHByb3RvY29sX3R5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdCB3aXRoIHNwZWNpZmllZCBzZXJ2aWNlIG5hbWUgZm9yIGFueSBwcm90b2NvbC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdHlwaWNhbGx5IHVzZWQgdG8gcGVyZm9ybSBuYW1lIHJlc29sdXRpb24gZm9yIGxvY2FsCi0gICAqIHNlcnZpY2UgYmluZGluZy4KLSAgICoKLSAgICogQHBhcmFtIHNlcnZpY2UgQSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlLiBUaGlzIG1heSBiZSBhCi0gICAqIGRlc2NyaXB0aXZlIG5hbWUgb3IgYSBudW1lcmljIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIGEgcG9ydCBudW1iZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZXNvbHZlX2ZsYWdzIEEgc2V0IG9mIGZsYWdzIHRoYXQgZGV0ZXJtaW5lIGhvdyBuYW1lIHJlc29sdXRpb24KLSAgICogc2hvdWxkIGJlIHBlcmZvcm1lZC4gVGhlIGRlZmF1bHQgZmxhZ3MgYXJlIHN1aXRhYmxlIGZvciBsb2NhbCBzZXJ2aWNlCi0gICAqIGJpbmRpbmcuCi0gICAqCi0gICAqIEBub3RlIE9uIFBPU0lYIHN5c3RlbXMsIHNlcnZpY2UgbmFtZXMgYXJlIHR5cGljYWxseSBkZWZpbmVkIGluIHRoZSBmaWxlCi0gICAqIDx0dD4vZXRjL3NlcnZpY2VzPC90dD4uIE9uIFdpbmRvd3MsIHNlcnZpY2UgbmFtZXMgbWF5IGJlIGZvdW5kIGluIHRoZSBmaWxlCi0gICAqIDx0dD5jOlxcd2luZG93c1xcc3lzdGVtMzJcXGRyaXZlcnNcXGV0Y1xcc2VydmljZXM8L3R0Pi4gT3BlcmF0aW5nIHN5c3RlbXMKLSAgICogbWF5IHVzZSBhZGRpdGlvbmFsIGxvY2F0aW9ucyB3aGVuIHJlc29sdmluZyBzZXJ2aWNlIG5hbWVzLgotICAgKi8KLSAgYmFzaWNfcmVzb2x2ZXJfcXVlcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2UsCi0gICAgICByZXNvbHZlcl9xdWVyeV9iYXNlOjpmbGFncyByZXNvbHZlX2ZsYWdzID0gcGFzc2l2ZSB8IGFkZHJlc3NfY29uZmlndXJlZCkKLSAgICA6IGhpbnRzXygpLAotICAgICAgaG9zdF9uYW1lXygpLAotICAgICAgc2VydmljZV9uYW1lXyhzZXJ2aWNlKQotICB7Ci0gICAgdHlwZW5hbWUgSW50ZXJuZXRQcm90b2NvbDo6ZW5kcG9pbnQgZW5kcG9pbnQ7Ci0gICAgaGludHNfLmFpX2ZsYWdzID0gc3RhdGljX2Nhc3Q8aW50PihyZXNvbHZlX2ZsYWdzKTsKLSAgICBoaW50c18uYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotICAgIGhpbnRzXy5haV9zb2NrdHlwZSA9IGVuZHBvaW50LnByb3RvY29sKCkudHlwZSgpOwotICAgIGhpbnRzXy5haV9wcm90b2NvbCA9IGVuZHBvaW50LnByb3RvY29sKCkucHJvdG9jb2woKTsKLSAgICBoaW50c18uYWlfYWRkcmxlbiA9IDA7Ci0gICAgaGludHNfLmFpX2Nhbm9ubmFtZSA9IDA7Ci0gICAgaGludHNfLmFpX2FkZHIgPSAwOwotICAgIGhpbnRzXy5haV9uZXh0ID0gMDsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3Qgd2l0aCBzcGVjaWZpZWQgc2VydmljZSBuYW1lIGZvciBhIGdpdmVuIHByb3RvY29sLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB0eXBpY2FsbHkgdXNlZCB0byBwZXJmb3JtIG5hbWUgcmVzb2x1dGlvbiBmb3IgbG9jYWwKLSAgICogc2VydmljZSBiaW5kaW5nIHdpdGggYSBzcGVjaWZpYyBwcm90b2NvbCB2ZXJzaW9uLgotICAgKgotICAgKiBAcGFyYW0gcHJvdG9jb2wgQSBwcm90b2NvbCBvYmplY3QsIG5vcm1hbGx5IHJlcHJlc2VudGluZyBlaXRoZXIgdGhlIElQdjQgb3IKLSAgICogSVB2NiB2ZXJzaW9uIG9mIGFuIGludGVybmV0IHByb3RvY29sLgotICAgKgotICAgKiBAcGFyYW0gc2VydmljZSBBIHN0cmluZyBpZGVudGlmeWluZyB0aGUgcmVxdWVzdGVkIHNlcnZpY2UuIFRoaXMgbWF5IGJlIGEKLSAgICogZGVzY3JpcHRpdmUgbmFtZSBvciBhIG51bWVyaWMgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gYSBwb3J0IG51bWJlci4KLSAgICoKLSAgICogQHBhcmFtIHJlc29sdmVfZmxhZ3MgQSBzZXQgb2YgZmxhZ3MgdGhhdCBkZXRlcm1pbmUgaG93IG5hbWUgcmVzb2x1dGlvbgotICAgKiBzaG91bGQgYmUgcGVyZm9ybWVkLiBUaGUgZGVmYXVsdCBmbGFncyBhcmUgc3VpdGFibGUgZm9yIGxvY2FsIHNlcnZpY2UKLSAgICogYmluZGluZy4KLSAgICoKLSAgICogQG5vdGUgT24gUE9TSVggc3lzdGVtcywgc2VydmljZSBuYW1lcyBhcmUgdHlwaWNhbGx5IGRlZmluZWQgaW4gdGhlIGZpbGUKLSAgICogPHR0Pi9ldGMvc2VydmljZXM8L3R0Pi4gT24gV2luZG93cywgc2VydmljZSBuYW1lcyBtYXkgYmUgZm91bmQgaW4gdGhlIGZpbGUKLSAgICogPHR0PmM6XFx3aW5kb3dzXFxzeXN0ZW0zMlxcZHJpdmVyc1xcZXRjXFxzZXJ2aWNlczwvdHQ+LiBPcGVyYXRpbmcgc3lzdGVtcwotICAgKiBtYXkgdXNlIGFkZGl0aW9uYWwgbG9jYXRpb25zIHdoZW4gcmVzb2x2aW5nIHNlcnZpY2UgbmFtZXMuCi0gICAqLwotICBiYXNpY19yZXNvbHZlcl9xdWVyeShjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlLAotICAgICAgcmVzb2x2ZXJfcXVlcnlfYmFzZTo6ZmxhZ3MgcmVzb2x2ZV9mbGFncyA9IHBhc3NpdmUgfCBhZGRyZXNzX2NvbmZpZ3VyZWQpCi0gICAgOiBoaW50c18oKSwKLSAgICAgIGhvc3RfbmFtZV8oKSwKLSAgICAgIHNlcnZpY2VfbmFtZV8oc2VydmljZSkKLSAgewotICAgIGhpbnRzXy5haV9mbGFncyA9IHN0YXRpY19jYXN0PGludD4ocmVzb2x2ZV9mbGFncyk7Ci0gICAgaGludHNfLmFpX2ZhbWlseSA9IHByb3RvY29sLmZhbWlseSgpOwotICAgIGhpbnRzXy5haV9zb2NrdHlwZSA9IHByb3RvY29sLnR5cGUoKTsKLSAgICBoaW50c18uYWlfcHJvdG9jb2wgPSBwcm90b2NvbC5wcm90b2NvbCgpOwotICAgIGhpbnRzXy5haV9hZGRybGVuID0gMDsKLSAgICBoaW50c18uYWlfY2Fub25uYW1lID0gMDsKLSAgICBoaW50c18uYWlfYWRkciA9IDA7Ci0gICAgaGludHNfLmFpX25leHQgPSAwOwotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCB3aXRoIHNwZWNpZmllZCBob3N0IG5hbWUgYW5kIHNlcnZpY2UgbmFtZSBmb3IgYW55IHByb3RvY29sLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB0eXBpY2FsbHkgdXNlZCB0byBwZXJmb3JtIG5hbWUgcmVzb2x1dGlvbiBmb3IKLSAgICogY29tbXVuaWNhdGlvbiB3aXRoIHJlbW90ZSBob3N0cy4KLSAgICoKLSAgICogQHBhcmFtIGhvc3QgQSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBsb2NhdGlvbi4gTWF5IGJlIGEgZGVzY3JpcHRpdmUgbmFtZSBvcgotICAgKiBhIG51bWVyaWMgYWRkcmVzcyBzdHJpbmcuIElmIGFuIGVtcHR5IHN0cmluZyBhbmQgdGhlIHBhc3NpdmUgZmxhZyBoYXMgYmVlbgotICAgKiBzcGVjaWZpZWQsIHRoZSByZXNvbHZlZCBlbmRwb2ludHMgYXJlIHN1aXRhYmxlIGZvciBsb2NhbCBzZXJ2aWNlIGJpbmRpbmcuCi0gICAqIElmIGFuIGVtcHR5IHN0cmluZyBhbmQgcGFzc2l2ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVzb2x2ZWQgZW5kcG9pbnRzCi0gICAqIHdpbGwgdXNlIHRoZSBsb29wYmFjayBhZGRyZXNzLgotICAgKgotICAgKiBAcGFyYW0gc2VydmljZSBBIHN0cmluZyBpZGVudGlmeWluZyB0aGUgcmVxdWVzdGVkIHNlcnZpY2UuIFRoaXMgbWF5IGJlIGEKLSAgICogZGVzY3JpcHRpdmUgbmFtZSBvciBhIG51bWVyaWMgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gYSBwb3J0IG51bWJlci4gTWF5Ci0gICAqIGJlIGFuIGVtcHR5IHN0cmluZywgaW4gd2hpY2ggY2FzZSBhbGwgcmVzb2x2ZWQgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIHBvcnQKLSAgICogbnVtYmVyIG9mIDAuCi0gICAqCi0gICAqIEBwYXJhbSByZXNvbHZlX2ZsYWdzIEEgc2V0IG9mIGZsYWdzIHRoYXQgZGV0ZXJtaW5lIGhvdyBuYW1lIHJlc29sdXRpb24KLSAgICogc2hvdWxkIGJlIHBlcmZvcm1lZC4gVGhlIGRlZmF1bHQgZmxhZ3MgYXJlIHN1aXRhYmxlIGZvciBjb21tdW5pY2F0aW9uIHdpdGgKLSAgICogcmVtb3RlIGhvc3RzLgotICAgKgotICAgKiBAbm90ZSBPbiBQT1NJWCBzeXN0ZW1zLCBob3N0IG5hbWVzIG1heSBiZSBsb2NhbGx5IGRlZmluZWQgaW4gdGhlIGZpbGUKLSAgICogPHR0Pi9ldGMvaG9zdHM8L3R0Pi4gT24gV2luZG93cywgaG9zdCBuYW1lcyBtYXkgYmUgZGVmaW5lZCBpbiB0aGUgZmlsZQotICAgKiA8dHQ+YzpcXHdpbmRvd3NcXHN5c3RlbTMyXFxkcml2ZXJzXFxldGNcXGhvc3RzPC90dD4uIFJlbW90ZSBob3N0IG5hbWUKLSAgICogcmVzb2x1dGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgRE5TLiBPcGVyYXRpbmcgc3lzdGVtcyBtYXkgdXNlIGFkZGl0aW9uYWwKLSAgICogbG9jYXRpb25zIHdoZW4gcmVzb2x2aW5nIGhvc3QgbmFtZXMgKHN1Y2ggYXMgTkVUQklPUyBuYW1lcyBvbiBXaW5kb3dzKS4KLSAgICoKLSAgICogT24gUE9TSVggc3lzdGVtcywgc2VydmljZSBuYW1lcyBhcmUgdHlwaWNhbGx5IGRlZmluZWQgaW4gdGhlIGZpbGUKLSAgICogPHR0Pi9ldGMvc2VydmljZXM8L3R0Pi4gT24gV2luZG93cywgc2VydmljZSBuYW1lcyBtYXkgYmUgZm91bmQgaW4gdGhlIGZpbGUKLSAgICogPHR0PmM6XFx3aW5kb3dzXFxzeXN0ZW0zMlxcZHJpdmVyc1xcZXRjXFxzZXJ2aWNlczwvdHQ+LiBPcGVyYXRpbmcgc3lzdGVtcwotICAgKiBtYXkgdXNlIGFkZGl0aW9uYWwgbG9jYXRpb25zIHdoZW4gcmVzb2x2aW5nIHNlcnZpY2UgbmFtZXMuCi0gICAqLwotICBiYXNpY19yZXNvbHZlcl9xdWVyeShjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2UsCi0gICAgICByZXNvbHZlcl9xdWVyeV9iYXNlOjpmbGFncyByZXNvbHZlX2ZsYWdzID0gYWRkcmVzc19jb25maWd1cmVkKQotICAgIDogaGludHNfKCksCi0gICAgICBob3N0X25hbWVfKGhvc3QpLAotICAgICAgc2VydmljZV9uYW1lXyhzZXJ2aWNlKQotICB7Ci0gICAgdHlwZW5hbWUgSW50ZXJuZXRQcm90b2NvbDo6ZW5kcG9pbnQgZW5kcG9pbnQ7Ci0gICAgaGludHNfLmFpX2ZsYWdzID0gc3RhdGljX2Nhc3Q8aW50PihyZXNvbHZlX2ZsYWdzKTsKLSAgICBoaW50c18uYWlfZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfVU5TUEVDKTsKLSAgICBoaW50c18uYWlfc29ja3R5cGUgPSBlbmRwb2ludC5wcm90b2NvbCgpLnR5cGUoKTsKLSAgICBoaW50c18uYWlfcHJvdG9jb2wgPSBlbmRwb2ludC5wcm90b2NvbCgpLnByb3RvY29sKCk7Ci0gICAgaGludHNfLmFpX2FkZHJsZW4gPSAwOwotICAgIGhpbnRzXy5haV9jYW5vbm5hbWUgPSAwOwotICAgIGhpbnRzXy5haV9hZGRyID0gMDsKLSAgICBoaW50c18uYWlfbmV4dCA9IDA7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IHdpdGggc3BlY2lmaWVkIGhvc3QgbmFtZSBhbmQgc2VydmljZSBuYW1lIGZvciBhIGdpdmVuIHByb3RvY29sLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB0eXBpY2FsbHkgdXNlZCB0byBwZXJmb3JtIG5hbWUgcmVzb2x1dGlvbiBmb3IKLSAgICogY29tbXVuaWNhdGlvbiB3aXRoIHJlbW90ZSBob3N0cy4KLSAgICoKLSAgICogQHBhcmFtIHByb3RvY29sIEEgcHJvdG9jb2wgb2JqZWN0LCBub3JtYWxseSByZXByZXNlbnRpbmcgZWl0aGVyIHRoZSBJUHY0IG9yCi0gICAqIElQdjYgdmVyc2lvbiBvZiBhbiBpbnRlcm5ldCBwcm90b2NvbC4KLSAgICoKLSAgICogQHBhcmFtIGhvc3QgQSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBsb2NhdGlvbi4gTWF5IGJlIGEgZGVzY3JpcHRpdmUgbmFtZSBvcgotICAgKiBhIG51bWVyaWMgYWRkcmVzcyBzdHJpbmcuIElmIGFuIGVtcHR5IHN0cmluZyBhbmQgdGhlIHBhc3NpdmUgZmxhZyBoYXMgYmVlbgotICAgKiBzcGVjaWZpZWQsIHRoZSByZXNvbHZlZCBlbmRwb2ludHMgYXJlIHN1aXRhYmxlIGZvciBsb2NhbCBzZXJ2aWNlIGJpbmRpbmcuCi0gICAqIElmIGFuIGVtcHR5IHN0cmluZyBhbmQgcGFzc2l2ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVzb2x2ZWQgZW5kcG9pbnRzCi0gICAqIHdpbGwgdXNlIHRoZSBsb29wYmFjayBhZGRyZXNzLgotICAgKgotICAgKiBAcGFyYW0gc2VydmljZSBBIHN0cmluZyBpZGVudGlmeWluZyB0aGUgcmVxdWVzdGVkIHNlcnZpY2UuIFRoaXMgbWF5IGJlIGEKLSAgICogZGVzY3JpcHRpdmUgbmFtZSBvciBhIG51bWVyaWMgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gYSBwb3J0IG51bWJlci4gTWF5Ci0gICAqIGJlIGFuIGVtcHR5IHN0cmluZywgaW4gd2hpY2ggY2FzZSBhbGwgcmVzb2x2ZWQgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIHBvcnQKLSAgICogbnVtYmVyIG9mIDAuCi0gICAqCi0gICAqIEBwYXJhbSByZXNvbHZlX2ZsYWdzIEEgc2V0IG9mIGZsYWdzIHRoYXQgZGV0ZXJtaW5lIGhvdyBuYW1lIHJlc29sdXRpb24KLSAgICogc2hvdWxkIGJlIHBlcmZvcm1lZC4gVGhlIGRlZmF1bHQgZmxhZ3MgYXJlIHN1aXRhYmxlIGZvciBjb21tdW5pY2F0aW9uIHdpdGgKLSAgICogcmVtb3RlIGhvc3RzLgotICAgKgotICAgKiBAbm90ZSBPbiBQT1NJWCBzeXN0ZW1zLCBob3N0IG5hbWVzIG1heSBiZSBsb2NhbGx5IGRlZmluZWQgaW4gdGhlIGZpbGUKLSAgICogPHR0Pi9ldGMvaG9zdHM8L3R0Pi4gT24gV2luZG93cywgaG9zdCBuYW1lcyBtYXkgYmUgZGVmaW5lZCBpbiB0aGUgZmlsZQotICAgKiA8dHQ+YzpcXHdpbmRvd3NcXHN5c3RlbTMyXFxkcml2ZXJzXFxldGNcXGhvc3RzPC90dD4uIFJlbW90ZSBob3N0IG5hbWUKLSAgICogcmVzb2x1dGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgRE5TLiBPcGVyYXRpbmcgc3lzdGVtcyBtYXkgdXNlIGFkZGl0aW9uYWwKLSAgICogbG9jYXRpb25zIHdoZW4gcmVzb2x2aW5nIGhvc3QgbmFtZXMgKHN1Y2ggYXMgTkVUQklPUyBuYW1lcyBvbiBXaW5kb3dzKS4KLSAgICoKLSAgICogT24gUE9TSVggc3lzdGVtcywgc2VydmljZSBuYW1lcyBhcmUgdHlwaWNhbGx5IGRlZmluZWQgaW4gdGhlIGZpbGUKLSAgICogPHR0Pi9ldGMvc2VydmljZXM8L3R0Pi4gT24gV2luZG93cywgc2VydmljZSBuYW1lcyBtYXkgYmUgZm91bmQgaW4gdGhlIGZpbGUKLSAgICogPHR0PmM6XFx3aW5kb3dzXFxzeXN0ZW0zMlxcZHJpdmVyc1xcZXRjXFxzZXJ2aWNlczwvdHQ+LiBPcGVyYXRpbmcgc3lzdGVtcwotICAgKiBtYXkgdXNlIGFkZGl0aW9uYWwgbG9jYXRpb25zIHdoZW4gcmVzb2x2aW5nIHNlcnZpY2UgbmFtZXMuCi0gICAqLwotICBiYXNpY19yZXNvbHZlcl9xdWVyeShjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZSwKLSAgICAgIHJlc29sdmVyX3F1ZXJ5X2Jhc2U6OmZsYWdzIHJlc29sdmVfZmxhZ3MgPSBhZGRyZXNzX2NvbmZpZ3VyZWQpCi0gICAgOiBoaW50c18oKSwKLSAgICAgIGhvc3RfbmFtZV8oaG9zdCksCi0gICAgICBzZXJ2aWNlX25hbWVfKHNlcnZpY2UpCi0gIHsKLSAgICBoaW50c18uYWlfZmxhZ3MgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlc29sdmVfZmxhZ3MpOwotICAgIGhpbnRzXy5haV9mYW1pbHkgPSBwcm90b2NvbC5mYW1pbHkoKTsKLSAgICBoaW50c18uYWlfc29ja3R5cGUgPSBwcm90b2NvbC50eXBlKCk7Ci0gICAgaGludHNfLmFpX3Byb3RvY29sID0gcHJvdG9jb2wucHJvdG9jb2woKTsKLSAgICBoaW50c18uYWlfYWRkcmxlbiA9IDA7Ci0gICAgaGludHNfLmFpX2Nhbm9ubmFtZSA9IDA7Ci0gICAgaGludHNfLmFpX2FkZHIgPSAwOwotICAgIGhpbnRzXy5haV9uZXh0ID0gMDsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIGhpbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcXVlcnkuCi0gIGNvbnN0IGFzaW86OmRldGFpbDo6YWRkcmluZm9fdHlwZSYgaGludHMoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGhpbnRzXzsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIGhvc3QgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHF1ZXJ5LgotICBzdGQ6OnN0cmluZyBob3N0X25hbWUoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGhvc3RfbmFtZV87Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBzZXJ2aWNlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBxdWVyeS4KLSAgc3RkOjpzdHJpbmcgc2VydmljZV9uYW1lKCkgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX25hbWVfOwotICB9Ci0KLXByaXZhdGU6Ci0gIGFzaW86OmRldGFpbDo6YWRkcmluZm9fdHlwZSBoaW50c187Ci0gIHN0ZDo6c3RyaW5nIGhvc3RfbmFtZV87Ci0gIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBpcAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19JUF9CQVNJQ19SRVNPTFZFUl9RVUVSWV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9kZXRhaWwvZW5kcG9pbnQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2RldGFpbC9lbmRwb2ludC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0N2NhNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2RldGFpbC9lbmRwb2ludC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8KLS8vIGlwL2RldGFpbC9lbmRwb2ludC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JUF9ERVRBSUxfRU5EUE9JTlRfSFBQCi0jZGVmaW5lIEFTSU9fSVBfREVUQUlMX0VORFBPSU5UX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnNvY2tfaW5pdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvcl9jb2RlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2FkZHJlc3MuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGlwIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLyBIZWxwZXIgY2xhc3MgZm9yIGltcGxlbWVudGF0aW5nIGFuIElQIGVuZHBvaW50LgotY2xhc3MgZW5kcG9pbnQKLXsKLXB1YmxpYzoKLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIGVuZHBvaW50KCk7Ci0KLSAgLy8gQ29uc3RydWN0IGFuIGVuZHBvaW50IHVzaW5nIGEgZmFtaWx5IGFuZCBwb3J0IG51bWJlci4KLSAgQVNJT19ERUNMIGVuZHBvaW50KGludCBmYW1pbHksIHVuc2lnbmVkIHNob3J0IHBvcnRfbnVtKTsKLQotICAvLyBDb25zdHJ1Y3QgYW4gZW5kcG9pbnQgdXNpbmcgYW4gYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIuCi0gIEFTSU9fREVDTCBlbmRwb2ludChjb25zdCBhc2lvOjppcDo6YWRkcmVzcyYgYWRkciwKLSAgICAgIHVuc2lnbmVkIHNob3J0IHBvcnRfbnVtKTsKLQotICAvLyBDb3B5IGNvbnN0cnVjdG9yLgotICBlbmRwb2ludChjb25zdCBlbmRwb2ludCYgb3RoZXIpCi0gICAgOiBkYXRhXyhvdGhlci5kYXRhXykKLSAgewotICB9Ci0KLSAgLy8gQXNzaWduIGZyb20gYW5vdGhlciBlbmRwb2ludC4KLSAgZW5kcG9pbnQmIG9wZXJhdG9yPShjb25zdCBlbmRwb2ludCYgb3RoZXIpCi0gIHsKLSAgICBkYXRhXyA9IG90aGVyLmRhdGFfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEdldCB0aGUgdW5kZXJseWluZyBlbmRwb2ludCBpbiB0aGUgbmF0aXZlIHR5cGUuCi0gIGFzaW86OmRldGFpbDo6c29ja2V0X2FkZHJfdHlwZSogZGF0YSgpCi0gIHsKLSAgICByZXR1cm4gJmRhdGFfLmJhc2U7Ci0gIH0KLQotICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBjb25zdCBhc2lvOjpkZXRhaWw6OnNvY2tldF9hZGRyX3R5cGUqIGRhdGEoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICZkYXRhXy5iYXNlOwotICB9Ci0KLSAgLy8gR2V0IHRoZSB1bmRlcmx5aW5nIHNpemUgb2YgdGhlIGVuZHBvaW50IGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0Ci0gIHsKLSAgICBpZiAoaXNfdjQoKSkKLSAgICAgIHJldHVybiBzaXplb2YoYXNpbzo6ZGV0YWlsOjpzb2NrYWRkcl9pbjRfdHlwZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHNpemVvZihhc2lvOjpkZXRhaWw6OnNvY2thZGRyX2luNl90eXBlKTsKLSAgfQotCi0gIC8vIFNldCB0aGUgdW5kZXJseWluZyBzaXplIG9mIHRoZSBlbmRwb2ludCBpbiB0aGUgbmF0aXZlIHR5cGUuCi0gIEFTSU9fREVDTCB2b2lkIHJlc2l6ZShzdGQ6OnNpemVfdCBuZXdfc2l6ZSk7Ci0KLSAgLy8gR2V0IHRoZSBjYXBhY2l0eSBvZiB0aGUgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBzdGQ6OnNpemVfdCBjYXBhY2l0eSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2l6ZW9mKGRhdGFfKTsKLSAgfQotCi0gIC8vIEdldCB0aGUgcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LgotICBBU0lPX0RFQ0wgdW5zaWduZWQgc2hvcnQgcG9ydCgpIGNvbnN0OwotCi0gIC8vIFNldCB0aGUgcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LgotICBBU0lPX0RFQ0wgdm9pZCBwb3J0KHVuc2lnbmVkIHNob3J0IHBvcnRfbnVtKTsKLQotICAvLyBHZXQgdGhlIElQIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmRwb2ludC4KLSAgQVNJT19ERUNMIGFzaW86OmlwOjphZGRyZXNzIGFkZHJlc3MoKSBjb25zdDsKLQotICAvLyBTZXQgdGhlIElQIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmRwb2ludC4KLSAgQVNJT19ERUNMIHZvaWQgYWRkcmVzcyhjb25zdCBhc2lvOjppcDo6YWRkcmVzcyYgYWRkcik7Ci0KLSAgLy8gQ29tcGFyZSB0d28gZW5kcG9pbnRzIGZvciBlcXVhbGl0eS4KLSAgQVNJT19ERUNMIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oCi0gICAgICBjb25zdCBlbmRwb2ludCYgZTEsIGNvbnN0IGVuZHBvaW50JiBlMik7Ci0KLSAgLy8gQ29tcGFyZSBlbmRwb2ludHMgZm9yIG9yZGVyaW5nLgotICBBU0lPX0RFQ0wgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KAotICAgICAgY29uc3QgZW5kcG9pbnQmIGUxLCBjb25zdCBlbmRwb2ludCYgZTIpOwotCi0gIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBlbmRwb2ludCBpcyBJUHY0LgotICBib29sIGlzX3Y0KCkgY29uc3QKLSAgewotICAgIHJldHVybiBkYXRhXy5iYXNlLnNhX2ZhbWlseSA9PSBBU0lPX09TX0RFRihBRl9JTkVUKTsKLSAgfQotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLSAgLy8gQ29udmVydCB0byBhIHN0cmluZy4KLSAgQVNJT19ERUNMIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3Q7Ci0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotcHJpdmF0ZToKLSAgLy8gVGhlIHVuZGVybHlpbmcgSVAgc29ja2V0IGFkZHJlc3MuCi0gIHVuaW9uIGRhdGFfdW5pb24KLSAgewotICAgIGFzaW86OmRldGFpbDo6c29ja2V0X2FkZHJfdHlwZSBiYXNlOwotICAgIGFzaW86OmRldGFpbDo6c29ja2FkZHJfaW40X3R5cGUgdjQ7Ci0gICAgYXNpbzo6ZGV0YWlsOjpzb2NrYWRkcl9pbjZfdHlwZSB2NjsKLSAgfSBkYXRhXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9pcC9kZXRhaWwvaW1wbC9lbmRwb2ludC5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gQVNJT19JUF9ERVRBSUxfRU5EUE9JTlRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2RldGFpbC9pbXBsL2VuZHBvaW50LmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5Mjc3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vCi0vLyBpcC9kZXRhaWwvaW1wbC9lbmRwb2ludC5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lQX0RFVEFJTF9JTVBMX0VORFBPSU5UX0lQUAotI2RlZmluZSBBU0lPX0lQX0RFVEFJTF9JTVBMX0VORFBPSU5UX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLSMgaW5jbHVkZSA8c3N0cmVhbT4KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2RldGFpbC9lbmRwb2ludC5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgaXAgewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWVuZHBvaW50OjplbmRwb2ludCgpCi0gIDogZGF0YV8oKQotewotICBkYXRhXy52NC5zaW5fZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVCk7Ci0gIGRhdGFfLnY0LnNpbl9wb3J0ID0gMDsKLSAgZGF0YV8udjQuc2luX2FkZHIuc19hZGRyID0gQVNJT19PU19ERUYoSU5BRERSX0FOWSk7Ci19Ci0KLWVuZHBvaW50OjplbmRwb2ludChpbnQgZmFtaWx5LCB1bnNpZ25lZCBzaG9ydCBwb3J0X251bSkKLSAgOiBkYXRhXygpCi17Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1jcHkuCi0gIGlmIChmYW1pbHkgPT0gQVNJT19PU19ERUYoQUZfSU5FVCkpCi0gIHsKLSAgICBkYXRhXy52NC5zaW5fZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVCk7Ci0gICAgZGF0YV8udjQuc2luX3BvcnQgPQotICAgICAgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjpob3N0X3RvX25ldHdvcmtfc2hvcnQocG9ydF9udW0pOwotICAgIGRhdGFfLnY0LnNpbl9hZGRyLnNfYWRkciA9IEFTSU9fT1NfREVGKElOQUREUl9BTlkpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGRhdGFfLnY2LnNpbjZfZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVDYpOwotICAgIGRhdGFfLnY2LnNpbjZfcG9ydCA9Ci0gICAgICBhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHM6Omhvc3RfdG9fbmV0d29ya19zaG9ydChwb3J0X251bSk7Ci0gICAgZGF0YV8udjYuc2luNl9mbG93aW5mbyA9IDA7Ci0gICAgZGF0YV8udjYuc2luNl9hZGRyLnM2X2FkZHJbMF0gPSAwOyBkYXRhXy52Ni5zaW42X2FkZHIuczZfYWRkclsxXSA9IDA7Ci0gICAgZGF0YV8udjYuc2luNl9hZGRyLnM2X2FkZHJbMl0gPSAwLCBkYXRhXy52Ni5zaW42X2FkZHIuczZfYWRkclszXSA9IDA7Ci0gICAgZGF0YV8udjYuc2luNl9hZGRyLnM2X2FkZHJbNF0gPSAwLCBkYXRhXy52Ni5zaW42X2FkZHIuczZfYWRkcls1XSA9IDA7Ci0gICAgZGF0YV8udjYuc2luNl9hZGRyLnM2X2FkZHJbNl0gPSAwLCBkYXRhXy52Ni5zaW42X2FkZHIuczZfYWRkcls3XSA9IDA7Ci0gICAgZGF0YV8udjYuc2luNl9hZGRyLnM2X2FkZHJbOF0gPSAwLCBkYXRhXy52Ni5zaW42X2FkZHIuczZfYWRkcls5XSA9IDA7Ci0gICAgZGF0YV8udjYuc2luNl9hZGRyLnM2X2FkZHJbMTBdID0gMCwgZGF0YV8udjYuc2luNl9hZGRyLnM2X2FkZHJbMTFdID0gMDsKLSAgICBkYXRhXy52Ni5zaW42X2FkZHIuczZfYWRkclsxMl0gPSAwLCBkYXRhXy52Ni5zaW42X2FkZHIuczZfYWRkclsxM10gPSAwOwotICAgIGRhdGFfLnY2LnNpbjZfYWRkci5zNl9hZGRyWzE0XSA9IDAsIGRhdGFfLnY2LnNpbjZfYWRkci5zNl9hZGRyWzE1XSA9IDA7Ci0gICAgZGF0YV8udjYuc2luNl9zY29wZV9pZCA9IDA7Ci0gIH0KLX0KLQotZW5kcG9pbnQ6OmVuZHBvaW50KGNvbnN0IGFzaW86OmlwOjphZGRyZXNzJiBhZGRyLAotICAgIHVuc2lnbmVkIHNob3J0IHBvcnRfbnVtKQotICA6IGRhdGFfKCkKLXsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbWNweS4KLSAgaWYgKGFkZHIuaXNfdjQoKSkKLSAgewotICAgIGRhdGFfLnY0LnNpbl9mYW1pbHkgPSBBU0lPX09TX0RFRihBRl9JTkVUKTsKLSAgICBkYXRhXy52NC5zaW5fcG9ydCA9Ci0gICAgICBhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHM6Omhvc3RfdG9fbmV0d29ya19zaG9ydChwb3J0X251bSk7Ci0gICAgZGF0YV8udjQuc2luX2FkZHIuc19hZGRyID0KLSAgICAgIGFzaW86OmRldGFpbDo6c29ja2V0X29wczo6aG9zdF90b19uZXR3b3JrX2xvbmcoCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8YXNpbzo6ZGV0YWlsOjp1X2xvbmdfdHlwZT4oCi0gICAgICAgICAgICBhZGRyLnRvX3Y0KCkudG9fdWxvbmcoKSkpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGRhdGFfLnY2LnNpbjZfZmFtaWx5ID0gQVNJT19PU19ERUYoQUZfSU5FVDYpOwotICAgIGRhdGFfLnY2LnNpbjZfcG9ydCA9Ci0gICAgICBhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHM6Omhvc3RfdG9fbmV0d29ya19zaG9ydChwb3J0X251bSk7Ci0gICAgZGF0YV8udjYuc2luNl9mbG93aW5mbyA9IDA7Ci0gICAgYXNpbzo6aXA6OmFkZHJlc3NfdjYgdjZfYWRkciA9IGFkZHIudG9fdjYoKTsKLSAgICBhc2lvOjppcDo6YWRkcmVzc192Njo6Ynl0ZXNfdHlwZSBieXRlcyA9IHY2X2FkZHIudG9fYnl0ZXMoKTsKLSAgICBtZW1jcHkoZGF0YV8udjYuc2luNl9hZGRyLnM2X2FkZHIsIGJ5dGVzLmRhdGEoKSwgMTYpOwotICAgIGRhdGFfLnY2LnNpbjZfc2NvcGVfaWQgPQotICAgICAgc3RhdGljX2Nhc3Q8YXNpbzo6ZGV0YWlsOjp1X2xvbmdfdHlwZT4oCi0gICAgICAgIHY2X2FkZHIuc2NvcGVfaWQoKSk7Ci0gIH0KLX0KLQotdm9pZCBlbmRwb2ludDo6cmVzaXplKHN0ZDo6c2l6ZV90IG5ld19zaXplKQotewotICBpZiAobmV3X3NpemUgPiBzaXplb2YoYXNpbzo6ZGV0YWlsOjpzb2NrYWRkcl9zdG9yYWdlX3R5cGUpKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYyhhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudCk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIH0KLX0KLQotdW5zaWduZWQgc2hvcnQgZW5kcG9pbnQ6OnBvcnQoKSBjb25zdAotewotICBpZiAoaXNfdjQoKSkKLSAgewotICAgIHJldHVybiBhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHM6Om5ldHdvcmtfdG9faG9zdF9zaG9ydCgKLSAgICAgICAgZGF0YV8udjQuc2luX3BvcnQpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIHJldHVybiBhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHM6Om5ldHdvcmtfdG9faG9zdF9zaG9ydCgKLSAgICAgICAgZGF0YV8udjYuc2luNl9wb3J0KTsKLSAgfQotfQotCi12b2lkIGVuZHBvaW50Ojpwb3J0KHVuc2lnbmVkIHNob3J0IHBvcnRfbnVtKQotewotICBpZiAoaXNfdjQoKSkKLSAgewotICAgIGRhdGFfLnY0LnNpbl9wb3J0Ci0gICAgICA9IGFzaW86OmRldGFpbDo6c29ja2V0X29wczo6aG9zdF90b19uZXR3b3JrX3Nob3J0KHBvcnRfbnVtKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBkYXRhXy52Ni5zaW42X3BvcnQKLSAgICAgID0gYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjpob3N0X3RvX25ldHdvcmtfc2hvcnQocG9ydF9udW0pOwotICB9Ci19Ci0KLWFzaW86OmlwOjphZGRyZXNzIGVuZHBvaW50OjphZGRyZXNzKCkgY29uc3QKLXsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbWNweS4KLSAgaWYgKGlzX3Y0KCkpCi0gIHsKLSAgICByZXR1cm4gYXNpbzo6aXA6OmFkZHJlc3NfdjQoCi0gICAgICAgIGFzaW86OmRldGFpbDo6c29ja2V0X29wczo6bmV0d29ya190b19ob3N0X2xvbmcoCi0gICAgICAgICAgZGF0YV8udjQuc2luX2FkZHIuc19hZGRyKSk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgYXNpbzo6aXA6OmFkZHJlc3NfdjY6OmJ5dGVzX3R5cGUgYnl0ZXM7Ci0jaWYgZGVmaW5lZChBU0lPX0hBU19TVERfQVJSQVkpCi0gICAgbWVtY3B5KGJ5dGVzLmRhdGEoKSwgZGF0YV8udjYuc2luNl9hZGRyLnM2X2FkZHIsIDE2KTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotICAgIG1lbWNweShieXRlcy5lbGVtcywgZGF0YV8udjYuc2luNl9hZGRyLnM2X2FkZHIsIDE2KTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9BUlJBWSkKLSAgICByZXR1cm4gYXNpbzo6aXA6OmFkZHJlc3NfdjYoYnl0ZXMsIGRhdGFfLnY2LnNpbjZfc2NvcGVfaWQpOwotICB9Ci19Ci0KLXZvaWQgZW5kcG9pbnQ6OmFkZHJlc3MoY29uc3QgYXNpbzo6aXA6OmFkZHJlc3MmIGFkZHIpCi17Ci0gIGVuZHBvaW50IHRtcF9lbmRwb2ludChhZGRyLCBwb3J0KCkpOwotICBkYXRhXyA9IHRtcF9lbmRwb2ludC5kYXRhXzsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IGVuZHBvaW50JiBlMSwgY29uc3QgZW5kcG9pbnQmIGUyKQotewotICByZXR1cm4gZTEuYWRkcmVzcygpID09IGUyLmFkZHJlc3MoKSAmJiBlMS5wb3J0KCkgPT0gZTIucG9ydCgpOwotfQotCi1ib29sIG9wZXJhdG9yPChjb25zdCBlbmRwb2ludCYgZTEsIGNvbnN0IGVuZHBvaW50JiBlMikKLXsKLSAgaWYgKGUxLmFkZHJlc3MoKSA8IGUyLmFkZHJlc3MoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGUxLmFkZHJlc3MoKSAhPSBlMi5hZGRyZXNzKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gZTEucG9ydCgpIDwgZTIucG9ydCgpOwotfQotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLXN0ZDo6c3RyaW5nIGVuZHBvaW50Ojp0b19zdHJpbmcoYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci17Ci0gIHN0ZDo6c3RyaW5nIGEgPSBhZGRyZXNzKCkudG9fc3RyaW5nKGVjKTsKLSAgaWYgKGVjKQotICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSB0bXBfb3M7Ci0gIHRtcF9vcy5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKLSAgaWYgKGlzX3Y0KCkpCi0gICAgdG1wX29zIDw8IGE7Ci0gIGVsc2UKLSAgICB0bXBfb3MgPDwgJ1snIDw8IGEgPDwgJ10nOwotICB0bXBfb3MgPDwgJzonIDw8IHBvcnQoKTsKLQotICByZXR1cm4gdG1wX29zLnN0cigpOwotfQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSVBfREVUQUlMX0lNUExfRU5EUE9JTlRfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvZGV0YWlsL3NvY2tldF9vcHRpb24uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2RldGFpbC9zb2NrZXRfb3B0aW9uLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwMjkxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvZGV0YWlsL3NvY2tldF9vcHRpb24uaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8vCi0vLyBkZXRhaWwvc29ja2V0X29wdGlvbi5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lQX0RFVEFJTF9TT0NLRVRfT1BUSU9OX0hQUAotI2RlZmluZSBBU0lPX0lQX0RFVEFJTF9TT0NLRVRfT1BUSU9OX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19leGNlcHRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYWRkcmVzcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgaXAgewotbmFtZXNwYWNlIGRldGFpbCB7Ci1uYW1lc3BhY2Ugc29ja2V0X29wdGlvbiB7Ci0KLS8vIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIG11bHRpY2FzdCBlbmFibGUgbG9vcGJhY2sgb3B0aW9ucy4KLXRlbXBsYXRlIDxpbnQgSVB2NF9MZXZlbCwgaW50IElQdjRfTmFtZSwgaW50IElQdjZfTGV2ZWwsIGludCBJUHY2X05hbWU+Ci1jbGFzcyBtdWx0aWNhc3RfZW5hYmxlX2xvb3BiYWNrCi17Ci1wdWJsaWM6Ci0jaWYgZGVmaW5lZChfX3N1bikgfHwgZGVmaW5lZChfX29zZl9fKQotICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgaXB2NF92YWx1ZV90eXBlOwotICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgaXB2Nl92YWx1ZV90eXBlOwotI2VsaWYgZGVmaW5lZChfQUlYKSB8fCBkZWZpbmVkKF9faHB1eCkgfHwgZGVmaW5lZChfX1FOWE5UT19fKSAKLSAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGlwdjRfdmFsdWVfdHlwZTsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgaXB2Nl92YWx1ZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBpbnQgaXB2NF92YWx1ZV90eXBlOwotICB0eXBlZGVmIGludCBpcHY2X3ZhbHVlX3R5cGU7Ci0jZW5kaWYKLQotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBtdWx0aWNhc3RfZW5hYmxlX2xvb3BiYWNrKCkKLSAgICA6IGlwdjRfdmFsdWVfKDApLAotICAgICAgaXB2Nl92YWx1ZV8oMCkKLSAgewotICB9Ci0KLSAgLy8gQ29uc3RydWN0IHdpdGggYSBzcGVjaWZpYyBvcHRpb24gdmFsdWUuCi0gIGV4cGxpY2l0IG11bHRpY2FzdF9lbmFibGVfbG9vcGJhY2soYm9vbCB2KQotICAgIDogaXB2NF92YWx1ZV8odiA/IDEgOiAwKSwKLSAgICAgIGlwdjZfdmFsdWVfKHYgPyAxIDogMCkKLSAgewotICB9Ci0KLSAgLy8gU2V0IHRoZSB2YWx1ZSBvZiB0aGUgYm9vbGVhbi4KLSAgbXVsdGljYXN0X2VuYWJsZV9sb29wYmFjayYgb3BlcmF0b3I9KGJvb2wgdikKLSAgewotICAgIGlwdjRfdmFsdWVfID0gdiA/IDEgOiAwOwotICAgIGlwdjZfdmFsdWVfID0gdiA/IDEgOiAwOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYm9vbGVhbi4KLSAgYm9vbCB2YWx1ZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gISFpcHY0X3ZhbHVlXzsKLSAgfQotCi0gIC8vIENvbnZlcnQgdG8gYm9vbC4KLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gISFpcHY0X3ZhbHVlXzsKLSAgfQotCi0gIC8vIFRlc3QgZm9yIGZhbHNlLgotICBib29sIG9wZXJhdG9yISgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gIWlwdjRfdmFsdWVfOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBsZXZlbCBvZiB0aGUgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBpbnQgbGV2ZWwoY29uc3QgUHJvdG9jb2wmIHByb3RvY29sKSBjb25zdAotICB7Ci0gICAgaWYgKHByb3RvY29sLmZhbWlseSgpID09IFBGX0lORVQ2KQotICAgICAgcmV0dXJuIElQdjZfTGV2ZWw7Ci0gICAgcmV0dXJuIElQdjRfTGV2ZWw7Ci0gIH0KLQotICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgaW50IG5hbWUoY29uc3QgUHJvdG9jb2wmIHByb3RvY29sKSBjb25zdAotICB7Ci0gICAgaWYgKHByb3RvY29sLmZhbWlseSgpID09IFBGX0lORVQ2KQotICAgICAgcmV0dXJuIElQdjZfTmFtZTsKLSAgICByZXR1cm4gSVB2NF9OYW1lOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBib29sZWFuIGRhdGEuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgdm9pZCogZGF0YShjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wpCi0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgICByZXR1cm4gJmlwdjZfdmFsdWVfOwotICAgIHJldHVybiAmaXB2NF92YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJvb2xlYW4gZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBjb25zdCB2b2lkKiBkYXRhKGNvbnN0IFByb3RvY29sJiBwcm90b2NvbCkgY29uc3QKLSAgewotICAgIGlmIChwcm90b2NvbC5mYW1pbHkoKSA9PSBQRl9JTkVUNikKLSAgICAgIHJldHVybiAmaXB2Nl92YWx1ZV87Ci0gICAgcmV0dXJuICZpcHY0X3ZhbHVlXzsKLSAgfQotCi0gIC8vIEdldCB0aGUgc2l6ZSBvZiB0aGUgYm9vbGVhbiBkYXRhLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIHN0ZDo6c2l6ZV90IHNpemUoY29uc3QgUHJvdG9jb2wmIHByb3RvY29sKSBjb25zdAotICB7Ci0gICAgaWYgKHByb3RvY29sLmZhbWlseSgpID09IFBGX0lORVQ2KQotICAgICAgcmV0dXJuIHNpemVvZihpcHY2X3ZhbHVlXyk7Ci0gICAgcmV0dXJuIHNpemVvZihpcHY0X3ZhbHVlXyk7Ci0gIH0KLQotICAvLyBTZXQgdGhlIHNpemUgb2YgdGhlIGJvb2xlYW4gZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICB2b2lkIHJlc2l6ZShjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wsIHN0ZDo6c2l6ZV90IHMpCi0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgewotICAgICAgaWYgKHMgIT0gc2l6ZW9mKGlwdjZfdmFsdWVfKSkKLSAgICAgIHsKLSAgICAgICAgc3RkOjpsZW5ndGhfZXJyb3IgZXgoIm11bHRpY2FzdF9lbmFibGVfbG9vcGJhY2sgc29ja2V0IG9wdGlvbiByZXNpemUiKTsKLSAgICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICAgICAgfQotICAgICAgaXB2NF92YWx1ZV8gPSBpcHY2X3ZhbHVlXyA/IDEgOiAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHMgIT0gc2l6ZW9mKGlwdjRfdmFsdWVfKSkKLSAgICAgIHsKLSAgICAgICAgc3RkOjpsZW5ndGhfZXJyb3IgZXgoIm11bHRpY2FzdF9lbmFibGVfbG9vcGJhY2sgc29ja2V0IG9wdGlvbiByZXNpemUiKTsKLSAgICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICAgICAgfQotICAgICAgaXB2Nl92YWx1ZV8gPSBpcHY0X3ZhbHVlXyA/IDEgOiAwOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICBpcHY0X3ZhbHVlX3R5cGUgaXB2NF92YWx1ZV87Ci0gIGlwdjZfdmFsdWVfdHlwZSBpcHY2X3ZhbHVlXzsKLX07Ci0KLS8vIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIHVuaWNhc3QgaG9wcyBvcHRpb25zLgotdGVtcGxhdGUgPGludCBJUHY0X0xldmVsLCBpbnQgSVB2NF9OYW1lLCBpbnQgSVB2Nl9MZXZlbCwgaW50IElQdjZfTmFtZT4KLWNsYXNzIHVuaWNhc3RfaG9wcwotewotcHVibGljOgotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICB1bmljYXN0X2hvcHMoKQotICAgIDogdmFsdWVfKDApCi0gIHsKLSAgfQotCi0gIC8vIENvbnN0cnVjdCB3aXRoIGEgc3BlY2lmaWMgb3B0aW9uIHZhbHVlLgotICBleHBsaWNpdCB1bmljYXN0X2hvcHMoaW50IHYpCi0gICAgOiB2YWx1ZV8odikKLSAgewotICB9Ci0KLSAgLy8gU2V0IHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICB1bmljYXN0X2hvcHMmIG9wZXJhdG9yPShpbnQgdikKLSAgewotICAgIHZhbHVlXyA9IHY7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gIGludCB2YWx1ZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdmFsdWVfOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBsZXZlbCBvZiB0aGUgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBpbnQgbGV2ZWwoY29uc3QgUHJvdG9jb2wmIHByb3RvY29sKSBjb25zdAotICB7Ci0gICAgaWYgKHByb3RvY29sLmZhbWlseSgpID09IFBGX0lORVQ2KQotICAgICAgcmV0dXJuIElQdjZfTGV2ZWw7Ci0gICAgcmV0dXJuIElQdjRfTGV2ZWw7Ci0gIH0KLQotICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgaW50IG5hbWUoY29uc3QgUHJvdG9jb2wmIHByb3RvY29sKSBjb25zdAotICB7Ci0gICAgaWYgKHByb3RvY29sLmZhbWlseSgpID09IFBGX0lORVQ2KQotICAgICAgcmV0dXJuIElQdjZfTmFtZTsKLSAgICByZXR1cm4gSVB2NF9OYW1lOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIGludCogZGF0YShjb25zdCBQcm90b2NvbCYpCi0gIHsKLSAgICByZXR1cm4gJnZhbHVlXzsKLSAgfQotCi0gIC8vIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBjb25zdCBpbnQqIGRhdGEoY29uc3QgUHJvdG9jb2wmKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICZ2YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIHNpemUgb2YgdGhlIGRhdGEuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgc3RkOjpzaXplX3Qgc2l6ZShjb25zdCBQcm90b2NvbCYpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2l6ZW9mKHZhbHVlXyk7Ci0gIH0KLQotICAvLyBTZXQgdGhlIHNpemUgb2YgdGhlIGRhdGEuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgdm9pZCByZXNpemUoY29uc3QgUHJvdG9jb2wmLCBzdGQ6OnNpemVfdCBzKQotICB7Ci0gICAgaWYgKHMgIT0gc2l6ZW9mKHZhbHVlXykpCi0gICAgewotICAgICAgc3RkOjpsZW5ndGhfZXJyb3IgZXgoInVuaWNhc3QgaG9wcyBzb2NrZXQgb3B0aW9uIHJlc2l6ZSIpOwotICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICAgIH0KLSNpZiBkZWZpbmVkKF9faHB1eCkKLSAgICBpZiAodmFsdWVfIDwgMCkKLSAgICAgIHZhbHVlXyA9IHZhbHVlXyAmIDB4RkY7Ci0jZW5kaWYKLSAgfQotCi1wcml2YXRlOgotICBpbnQgdmFsdWVfOwotfTsKLQotLy8gSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgbXVsdGljYXN0IGhvcHMgb3B0aW9ucy4KLXRlbXBsYXRlIDxpbnQgSVB2NF9MZXZlbCwgaW50IElQdjRfTmFtZSwgaW50IElQdjZfTGV2ZWwsIGludCBJUHY2X05hbWU+Ci1jbGFzcyBtdWx0aWNhc3RfaG9wcwotewotcHVibGljOgotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTKSAmJiBkZWZpbmVkKFVOREVSX0NFKQotICB0eXBlZGVmIGludCBpcHY0X3ZhbHVlX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgaXB2NF92YWx1ZV90eXBlOwotI2VuZGlmCi0gIHR5cGVkZWYgaW50IGlwdjZfdmFsdWVfdHlwZTsKLQotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBtdWx0aWNhc3RfaG9wcygpCi0gICAgOiBpcHY0X3ZhbHVlXygwKSwKLSAgICAgIGlwdjZfdmFsdWVfKDApCi0gIHsKLSAgfQotCi0gIC8vIENvbnN0cnVjdCB3aXRoIGEgc3BlY2lmaWMgb3B0aW9uIHZhbHVlLgotICBleHBsaWNpdCBtdWx0aWNhc3RfaG9wcyhpbnQgdikKLSAgewotICAgIGlmICh2IDwgMCB8fCB2ID4gMjU1KQotICAgIHsKLSAgICAgIHN0ZDo6b3V0X29mX3JhbmdlIGV4KCJtdWx0aWNhc3QgaG9wcyB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKGV4KTsKLSAgICB9Ci0gICAgaXB2NF92YWx1ZV8gPSAoaXB2NF92YWx1ZV90eXBlKXY7Ci0gICAgaXB2Nl92YWx1ZV8gPSB2OwotICB9Ci0KLSAgLy8gU2V0IHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLgotICBtdWx0aWNhc3RfaG9wcyYgb3BlcmF0b3I9KGludCB2KQotICB7Ci0gICAgaWYgKHYgPCAwIHx8IHYgPiAyNTUpCi0gICAgewotICAgICAgc3RkOjpvdXRfb2ZfcmFuZ2UgZXgoIm11bHRpY2FzdCBob3BzIHZhbHVlIG91dCBvZiByYW5nZSIpOwotICAgICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICAgIH0KLSAgICBpcHY0X3ZhbHVlXyA9IChpcHY0X3ZhbHVlX3R5cGUpdjsKLSAgICBpcHY2X3ZhbHVlXyA9IHY7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBvcHRpb24uCi0gIGludCB2YWx1ZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaXB2Nl92YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIGxldmVsIG9mIHRoZSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIGludCBsZXZlbChjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wpIGNvbnN0Ci0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgICByZXR1cm4gSVB2Nl9MZXZlbDsKLSAgICByZXR1cm4gSVB2NF9MZXZlbDsKLSAgfQotCi0gIC8vIEdldCB0aGUgbmFtZSBvZiB0aGUgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBpbnQgbmFtZShjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wpIGNvbnN0Ci0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgICByZXR1cm4gSVB2Nl9OYW1lOwotICAgIHJldHVybiBJUHY0X05hbWU7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgdm9pZCogZGF0YShjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wpCi0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgICByZXR1cm4gJmlwdjZfdmFsdWVfOwotICAgIHJldHVybiAmaXB2NF92YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgY29uc3Qgdm9pZCogZGF0YShjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wpIGNvbnN0Ci0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgICByZXR1cm4gJmlwdjZfdmFsdWVfOwotICAgIHJldHVybiAmaXB2NF92YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIHNpemUgb2YgdGhlIGRhdGEuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgc3RkOjpzaXplX3Qgc2l6ZShjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wpIGNvbnN0Ci0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgICByZXR1cm4gc2l6ZW9mKGlwdjZfdmFsdWVfKTsKLSAgICByZXR1cm4gc2l6ZW9mKGlwdjRfdmFsdWVfKTsKLSAgfQotCi0gIC8vIFNldCB0aGUgc2l6ZSBvZiB0aGUgZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICB2b2lkIHJlc2l6ZShjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wsIHN0ZDo6c2l6ZV90IHMpCi0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgewotICAgICAgaWYgKHMgIT0gc2l6ZW9mKGlwdjZfdmFsdWVfKSkKLSAgICAgIHsKLSAgICAgICAgc3RkOjpsZW5ndGhfZXJyb3IgZXgoIm11bHRpY2FzdCBob3BzIHNvY2tldCBvcHRpb24gcmVzaXplIik7Ci0gICAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKGV4KTsKLSAgICAgIH0KLSAgICAgIGlmIChpcHY2X3ZhbHVlXyA8IDApCi0gICAgICAgIGlwdjRfdmFsdWVfID0gMDsKLSAgICAgIGVsc2UgaWYgKGlwdjZfdmFsdWVfID4gMjU1KQotICAgICAgICBpcHY0X3ZhbHVlXyA9IDI1NTsKLSAgICAgIGVsc2UKLSAgICAgICAgaXB2NF92YWx1ZV8gPSAoaXB2NF92YWx1ZV90eXBlKWlwdjZfdmFsdWVfOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHMgIT0gc2l6ZW9mKGlwdjRfdmFsdWVfKSkKLSAgICAgIHsKLSAgICAgICAgc3RkOjpsZW5ndGhfZXJyb3IgZXgoIm11bHRpY2FzdCBob3BzIHNvY2tldCBvcHRpb24gcmVzaXplIik7Ci0gICAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKGV4KTsKLSAgICAgIH0KLSAgICAgIGlwdjZfdmFsdWVfID0gaXB2NF92YWx1ZV87Ci0gICAgfQotICB9Ci0KLXByaXZhdGU6Ci0gIGlwdjRfdmFsdWVfdHlwZSBpcHY0X3ZhbHVlXzsKLSAgaXB2Nl92YWx1ZV90eXBlIGlwdjZfdmFsdWVfOwotfTsKLQotLy8gSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgaXBfbXJlcS1iYXNlZCBvcHRpb25zLgotdGVtcGxhdGUgPGludCBJUHY0X0xldmVsLCBpbnQgSVB2NF9OYW1lLCBpbnQgSVB2Nl9MZXZlbCwgaW50IElQdjZfTmFtZT4KLWNsYXNzIG11bHRpY2FzdF9yZXF1ZXN0Ci17Ci1wdWJsaWM6Ci0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCi0gIG11bHRpY2FzdF9yZXF1ZXN0KCkKLSAgICA6IGlwdjRfdmFsdWVfKCksIC8vIFplcm8taW5pdGlhbGlzYXRpb24gZ2l2ZXMgdGhlICJhbnkiIGFkZHJlc3MuCi0gICAgICBpcHY2X3ZhbHVlXygpIC8vIFplcm8taW5pdGlhbGlzYXRpb24gZ2l2ZXMgdGhlICJhbnkiIGFkZHJlc3MuCi0gIHsKLSAgfQotCi0gIC8vIENvbnN0cnVjdCB3aXRoIG11bHRpY2FzdCBhZGRyZXNzIG9ubHkuCi0gIGV4cGxpY2l0IG11bHRpY2FzdF9yZXF1ZXN0KGNvbnN0IGFzaW86OmlwOjphZGRyZXNzJiBtdWx0aWNhc3RfYWRkcmVzcykKLSAgICA6IGlwdjRfdmFsdWVfKCksIC8vIFplcm8taW5pdGlhbGlzYXRpb24gZ2l2ZXMgdGhlICJhbnkiIGFkZHJlc3MuCi0gICAgICBpcHY2X3ZhbHVlXygpIC8vIFplcm8taW5pdGlhbGlzYXRpb24gZ2l2ZXMgdGhlICJhbnkiIGFkZHJlc3MuCi0gIHsKLSAgICBpZiAobXVsdGljYXN0X2FkZHJlc3MuaXNfdjYoKSkKLSAgICB7Ci0gICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3IgbWVtY3B5LgotICAgICAgYXNpbzo6aXA6OmFkZHJlc3NfdjYgaXB2Nl9hZGRyZXNzID0gbXVsdGljYXN0X2FkZHJlc3MudG9fdjYoKTsKLSAgICAgIGFzaW86OmlwOjphZGRyZXNzX3Y2OjpieXRlc190eXBlIGJ5dGVzID0gaXB2Nl9hZGRyZXNzLnRvX2J5dGVzKCk7Ci0gICAgICBtZW1jcHkoaXB2Nl92YWx1ZV8uaXB2Nm1yX211bHRpYWRkci5zNl9hZGRyLCBieXRlcy5kYXRhKCksIDE2KTsKLSAgICAgIGlwdjZfdmFsdWVfLmlwdjZtcl9pbnRlcmZhY2UgPSBpcHY2X2FkZHJlc3Muc2NvcGVfaWQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlwdjRfdmFsdWVfLmltcl9tdWx0aWFkZHIuc19hZGRyID0KLSAgICAgICAgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjpob3N0X3RvX25ldHdvcmtfbG9uZygKLSAgICAgICAgICAgIG11bHRpY2FzdF9hZGRyZXNzLnRvX3Y0KCkudG9fdWxvbmcoKSk7Ci0gICAgICBpcHY0X3ZhbHVlXy5pbXJfaW50ZXJmYWNlLnNfYWRkciA9Ci0gICAgICAgIGFzaW86OmRldGFpbDo6c29ja2V0X29wczo6aG9zdF90b19uZXR3b3JrX2xvbmcoCi0gICAgICAgICAgICBhc2lvOjppcDo6YWRkcmVzc192NDo6YW55KCkudG9fdWxvbmcoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29uc3RydWN0IHdpdGggbXVsdGljYXN0IGFkZHJlc3MgYW5kIElQdjQgYWRkcmVzcyBzcGVjaWZ5aW5nIGFuIGludGVyZmFjZS4KLSAgZXhwbGljaXQgbXVsdGljYXN0X3JlcXVlc3QoCi0gICAgICBjb25zdCBhc2lvOjppcDo6YWRkcmVzc192NCYgbXVsdGljYXN0X2FkZHJlc3MsCi0gICAgICBjb25zdCBhc2lvOjppcDo6YWRkcmVzc192NCYgbmV0d29ya19pbnRlcmZhY2UKLSAgICAgICAgPSBhc2lvOjppcDo6YWRkcmVzc192NDo6YW55KCkpCi0gICAgOiBpcHY2X3ZhbHVlXygpIC8vIFplcm8taW5pdGlhbGlzYXRpb24gZ2l2ZXMgdGhlICJhbnkiIGFkZHJlc3MuCi0gIHsKLSAgICBpcHY0X3ZhbHVlXy5pbXJfbXVsdGlhZGRyLnNfYWRkciA9Ci0gICAgICBhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHM6Omhvc3RfdG9fbmV0d29ya19sb25nKAotICAgICAgICAgIG11bHRpY2FzdF9hZGRyZXNzLnRvX3Vsb25nKCkpOwotICAgIGlwdjRfdmFsdWVfLmltcl9pbnRlcmZhY2Uuc19hZGRyID0KLSAgICAgIGFzaW86OmRldGFpbDo6c29ja2V0X29wczo6aG9zdF90b19uZXR3b3JrX2xvbmcoCi0gICAgICAgICAgbmV0d29ya19pbnRlcmZhY2UudG9fdWxvbmcoKSk7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3Qgd2l0aCBtdWx0aWNhc3QgYWRkcmVzcyBhbmQgSVB2NiBuZXR3b3JrIGludGVyZmFjZSBpbmRleC4KLSAgZXhwbGljaXQgbXVsdGljYXN0X3JlcXVlc3QoCi0gICAgICBjb25zdCBhc2lvOjppcDo6YWRkcmVzc192NiYgbXVsdGljYXN0X2FkZHJlc3MsCi0gICAgICB1bnNpZ25lZCBsb25nIG5ldHdvcmtfaW50ZXJmYWNlID0gMCkKLSAgICA6IGlwdjRfdmFsdWVfKCkgLy8gWmVyby1pbml0aWFsaXNhdGlvbiBnaXZlcyB0aGUgImFueSIgYWRkcmVzcy4KLSAgewotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1jcHkuCi0gICAgYXNpbzo6aXA6OmFkZHJlc3NfdjY6OmJ5dGVzX3R5cGUgYnl0ZXMgPQotICAgICAgbXVsdGljYXN0X2FkZHJlc3MudG9fYnl0ZXMoKTsKLSAgICBtZW1jcHkoaXB2Nl92YWx1ZV8uaXB2Nm1yX211bHRpYWRkci5zNl9hZGRyLCBieXRlcy5kYXRhKCksIDE2KTsKLSAgICBpZiAobmV0d29ya19pbnRlcmZhY2UpCi0gICAgICBpcHY2X3ZhbHVlXy5pcHY2bXJfaW50ZXJmYWNlID0gbmV0d29ya19pbnRlcmZhY2U7Ci0gICAgZWxzZQotICAgICAgaXB2Nl92YWx1ZV8uaXB2Nm1yX2ludGVyZmFjZSA9IG11bHRpY2FzdF9hZGRyZXNzLnNjb3BlX2lkKCk7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGxldmVsIG9mIHRoZSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIGludCBsZXZlbChjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wpIGNvbnN0Ci0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgICByZXR1cm4gSVB2Nl9MZXZlbDsKLSAgICByZXR1cm4gSVB2NF9MZXZlbDsKLSAgfQotCi0gIC8vIEdldCB0aGUgbmFtZSBvZiB0aGUgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBpbnQgbmFtZShjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wpIGNvbnN0Ci0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgICByZXR1cm4gSVB2Nl9OYW1lOwotICAgIHJldHVybiBJUHY0X05hbWU7Ci0gIH0KLQotICAvLyBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG9wdGlvbiBkYXRhLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIGNvbnN0IHZvaWQqIGRhdGEoY29uc3QgUHJvdG9jb2wmIHByb3RvY29sKSBjb25zdAotICB7Ci0gICAgaWYgKHByb3RvY29sLmZhbWlseSgpID09IFBGX0lORVQ2KQotICAgICAgcmV0dXJuICZpcHY2X3ZhbHVlXzsKLSAgICByZXR1cm4gJmlwdjRfdmFsdWVfOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBzaXplIG9mIHRoZSBvcHRpb24gZGF0YS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sPgotICBzdGQ6OnNpemVfdCBzaXplKGNvbnN0IFByb3RvY29sJiBwcm90b2NvbCkgY29uc3QKLSAgewotICAgIGlmIChwcm90b2NvbC5mYW1pbHkoKSA9PSBQRl9JTkVUNikKLSAgICAgIHJldHVybiBzaXplb2YoaXB2Nl92YWx1ZV8pOwotICAgIHJldHVybiBzaXplb2YoaXB2NF92YWx1ZV8pOwotICB9Ci0KLXByaXZhdGU6Ci0gIGFzaW86OmRldGFpbDo6aW40X21yZXFfdHlwZSBpcHY0X3ZhbHVlXzsKLSAgYXNpbzo6ZGV0YWlsOjppbjZfbXJlcV90eXBlIGlwdjZfdmFsdWVfOwotfTsKLQotLy8gSGVscGVyIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgb3B0aW9ucyB0aGF0IHNwZWNpZnkgYSBuZXR3b3JrIGludGVyZmFjZS4KLXRlbXBsYXRlIDxpbnQgSVB2NF9MZXZlbCwgaW50IElQdjRfTmFtZSwgaW50IElQdjZfTGV2ZWwsIGludCBJUHY2X05hbWU+Ci1jbGFzcyBuZXR3b3JrX2ludGVyZmFjZQotewotcHVibGljOgotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICBuZXR3b3JrX2ludGVyZmFjZSgpCi0gIHsKLSAgICBpcHY0X3ZhbHVlXy5zX2FkZHIgPQotICAgICAgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjpob3N0X3RvX25ldHdvcmtfbG9uZygKLSAgICAgICAgICBhc2lvOjppcDo6YWRkcmVzc192NDo6YW55KCkudG9fdWxvbmcoKSk7Ci0gICAgaXB2Nl92YWx1ZV8gPSAwOwotICB9Ci0KLSAgLy8gQ29uc3RydWN0IHdpdGggSVB2NCBpbnRlcmZhY2UuCi0gIGV4cGxpY2l0IG5ldHdvcmtfaW50ZXJmYWNlKGNvbnN0IGFzaW86OmlwOjphZGRyZXNzX3Y0JiBpcHY0X2ludGVyZmFjZSkKLSAgewotICAgIGlwdjRfdmFsdWVfLnNfYWRkciA9Ci0gICAgICBhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHM6Omhvc3RfdG9fbmV0d29ya19sb25nKAotICAgICAgICAgIGlwdjRfaW50ZXJmYWNlLnRvX3Vsb25nKCkpOwotICAgIGlwdjZfdmFsdWVfID0gMDsKLSAgfQotCi0gIC8vIENvbnN0cnVjdCB3aXRoIElQdjYgaW50ZXJmYWNlLgotICBleHBsaWNpdCBuZXR3b3JrX2ludGVyZmFjZSh1bnNpZ25lZCBpbnQgaXB2Nl9pbnRlcmZhY2UpCi0gIHsKLSAgICBpcHY0X3ZhbHVlXy5zX2FkZHIgPQotICAgICAgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjpob3N0X3RvX25ldHdvcmtfbG9uZygKLSAgICAgICAgICBhc2lvOjppcDo6YWRkcmVzc192NDo6YW55KCkudG9fdWxvbmcoKSk7Ci0gICAgaXB2Nl92YWx1ZV8gPSBpcHY2X2ludGVyZmFjZTsKLSAgfQotCi0gIC8vIEdldCB0aGUgbGV2ZWwgb2YgdGhlIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgaW50IGxldmVsKGNvbnN0IFByb3RvY29sJiBwcm90b2NvbCkgY29uc3QKLSAgewotICAgIGlmIChwcm90b2NvbC5mYW1pbHkoKSA9PSBQRl9JTkVUNikKLSAgICAgIHJldHVybiBJUHY2X0xldmVsOwotICAgIHJldHVybiBJUHY0X0xldmVsOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIGludCBuYW1lKGNvbnN0IFByb3RvY29sJiBwcm90b2NvbCkgY29uc3QKLSAgewotICAgIGlmIChwcm90b2NvbC5mYW1pbHkoKSA9PSBQRl9JTkVUNikKLSAgICAgIHJldHVybiBJUHY2X05hbWU7Ci0gICAgcmV0dXJuIElQdjRfTmFtZTsKLSAgfQotCi0gIC8vIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgb3B0aW9uIGRhdGEuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLSAgY29uc3Qgdm9pZCogZGF0YShjb25zdCBQcm90b2NvbCYgcHJvdG9jb2wpIGNvbnN0Ci0gIHsKLSAgICBpZiAocHJvdG9jb2wuZmFtaWx5KCkgPT0gUEZfSU5FVDYpCi0gICAgICByZXR1cm4gJmlwdjZfdmFsdWVfOwotICAgIHJldHVybiAmaXB2NF92YWx1ZV87Ci0gIH0KLQotICAvLyBHZXQgdGhlIHNpemUgb2YgdGhlIG9wdGlvbiBkYXRhLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci0gIHN0ZDo6c2l6ZV90IHNpemUoY29uc3QgUHJvdG9jb2wmIHByb3RvY29sKSBjb25zdAotICB7Ci0gICAgaWYgKHByb3RvY29sLmZhbWlseSgpID09IFBGX0lORVQ2KQotICAgICAgcmV0dXJuIHNpemVvZihpcHY2X3ZhbHVlXyk7Ci0gICAgcmV0dXJuIHNpemVvZihpcHY0X3ZhbHVlXyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgYXNpbzo6ZGV0YWlsOjppbjRfYWRkcl90eXBlIGlwdjRfdmFsdWVfOwotICB1bnNpZ25lZCBpbnQgaXB2Nl92YWx1ZV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBzb2NrZXRfb3B0aW9uCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGlwCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0lQX0RFVEFJTF9TT0NLRVRfT1BUSU9OX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2hvc3RfbmFtZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvaG9zdF9uYW1lLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkNmU1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvaG9zdF9uYW1lLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vCi0vLyBpcC9ob3N0X25hbWUuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfSE9TVF9OQU1FX0hQUAotI2RlZmluZSBBU0lPX0lQX0hPU1RfTkFNRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAiYXNpby9lcnJvcl9jb2RlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBpcCB7Ci0KLS8vLyBHZXQgdGhlIGN1cnJlbnQgaG9zdCBuYW1lLgotQVNJT19ERUNMIHN0ZDo6c3RyaW5nIGhvc3RfbmFtZSgpOwotCi0vLy8gR2V0IHRoZSBjdXJyZW50IGhvc3QgbmFtZS4KLUFTSU9fREVDTCBzdGQ6OnN0cmluZyBob3N0X25hbWUoYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi19IC8vIG5hbWVzcGFjZSBpcAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2lwL2ltcGwvaG9zdF9uYW1lLmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBBU0lPX0lQX0hPU1RfTkFNRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9pY21wLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9pY21wLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3NjZlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvaWNtcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8KLS8vIGlwL2ljbXAuaHBwCi0vLyB+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lQX0lDTVBfSFBQCi0jZGVmaW5lIEFTSU9fSVBfSUNNUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfcmF3X3NvY2tldC5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9iYXNpY19lbmRwb2ludC5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9iYXNpY19yZXNvbHZlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9iYXNpY19yZXNvbHZlcl9pdGVyYXRvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pcC9iYXNpY19yZXNvbHZlcl9xdWVyeS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgaXAgewotCi0vLy8gRW5jYXBzdWxhdGVzIHRoZSBmbGFncyBuZWVkZWQgZm9yIElDTVAuCi0vKioKLSAqIFRoZSBhc2lvOjppcDo6aWNtcCBjbGFzcyBjb250YWlucyBmbGFncyBuZWNlc3NhcnkgZm9yIElDTVAgc29ja2V0cy4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBTYWZlLgotICoKLSAqIEBwYXIgQ29uY2VwdHM6Ci0gKiBQcm90b2NvbCwgSW50ZXJuZXRQcm90b2NvbC4KLSAqLwotY2xhc3MgaWNtcAotewotcHVibGljOgotICAvLy8gVGhlIHR5cGUgb2YgYSBJQ01QIGVuZHBvaW50LgotICB0eXBlZGVmIGJhc2ljX2VuZHBvaW50PGljbXA+IGVuZHBvaW50OwotCi0gIC8vLyBDb25zdHJ1Y3QgdG8gcmVwcmVzZW50IHRoZSBJUHY0IElDTVAgcHJvdG9jb2wuCi0gIHN0YXRpYyBpY21wIHY0KCkKLSAgewotICAgIHJldHVybiBpY21wKEFTSU9fT1NfREVGKElQUFJPVE9fSUNNUCksCi0gICAgICAgIEFTSU9fT1NfREVGKEFGX0lORVQpKTsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgdG8gcmVwcmVzZW50IHRoZSBJUHY2IElDTVAgcHJvdG9jb2wuCi0gIHN0YXRpYyBpY21wIHY2KCkKLSAgewotICAgIHJldHVybiBpY21wKEFTSU9fT1NfREVGKElQUFJPVE9fSUNNUFY2KSwKLSAgICAgICAgQVNJT19PU19ERUYoQUZfSU5FVDYpKTsKLSAgfQotCi0gIC8vLyBPYnRhaW4gYW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgdGhlIHByb3RvY29sLgotICBpbnQgdHlwZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gQVNJT19PU19ERUYoU09DS19SQVcpOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wuCi0gIGludCBwcm90b2NvbCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gcHJvdG9jb2xfOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wgZmFtaWx5LgotICBpbnQgZmFtaWx5KCkgY29uc3QKLSAgewotICAgIHJldHVybiBmYW1pbHlfOwotICB9Ci0KLSAgLy8vIFRoZSBJQ01QIHNvY2tldCB0eXBlLgotICB0eXBlZGVmIGJhc2ljX3Jhd19zb2NrZXQ8aWNtcD4gc29ja2V0OwotCi0gIC8vLyBUaGUgSUNNUCByZXNvbHZlciB0eXBlLgotICB0eXBlZGVmIGJhc2ljX3Jlc29sdmVyPGljbXA+IHJlc29sdmVyOwotCi0gIC8vLyBDb21wYXJlIHR3byBwcm90b2NvbHMgZm9yIGVxdWFsaXR5LgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGljbXAmIHAxLCBjb25zdCBpY21wJiBwMikKLSAgewotICAgIHJldHVybiBwMS5wcm90b2NvbF8gPT0gcDIucHJvdG9jb2xfICYmIHAxLmZhbWlseV8gPT0gcDIuZmFtaWx5XzsKLSAgfQotCi0gIC8vLyBDb21wYXJlIHR3byBwcm90b2NvbHMgZm9yIGluZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgaWNtcCYgcDEsIGNvbnN0IGljbXAmIHAyKQotICB7Ci0gICAgcmV0dXJuIHAxLnByb3RvY29sXyAhPSBwMi5wcm90b2NvbF8gfHwgcDEuZmFtaWx5XyAhPSBwMi5mYW1pbHlfOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIENvbnN0cnVjdCB3aXRoIGEgc3BlY2lmaWMgZmFtaWx5LgotICBleHBsaWNpdCBpY21wKGludCBwcm90b2NvbF9pZCwgaW50IHByb3RvY29sX2ZhbWlseSkKLSAgICA6IHByb3RvY29sXyhwcm90b2NvbF9pZCksCi0gICAgICBmYW1pbHlfKHByb3RvY29sX2ZhbWlseSkKLSAgewotICB9Ci0KLSAgaW50IHByb3RvY29sXzsKLSAgaW50IGZhbWlseV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBpcAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19JUF9JQ01QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvYWRkcmVzcy5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvaW1wbC9hZGRyZXNzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlYTU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvaW1wbC9hZGRyZXNzLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vCi0vLyBpcC9pbXBsL2FkZHJlc3MuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfSU1QTF9BRERSRVNTX0hQUAotI2RlZmluZSBBU0lPX0lQX0lNUExfQUREUkVTU19IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBpcCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtLCB0eXBlbmFtZSBUcmFpdHM+Ci1zdGQ6OmJhc2ljX29zdHJlYW08RWxlbSwgVHJhaXRzPiYgb3BlcmF0b3I8PCgKLSAgICBzdGQ6OmJhc2ljX29zdHJlYW08RWxlbSwgVHJhaXRzPiYgb3MsIGNvbnN0IGFkZHJlc3MmIGFkZHIpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c3RyaW5nIHMgPSBhZGRyLnRvX3N0cmluZyhlYyk7Ci0gIGlmIChlYykKLSAgewotICAgIGlmIChvcy5leGNlcHRpb25zKCkgJiBzdGQ6OmJhc2ljX29zdHJlYW08RWxlbSwgVHJhaXRzPjo6ZmFpbGJpdCkKLSAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICAgIGVsc2UKLSAgICAgIG9zLnNldHN0YXRlKHN0ZDo6YmFzaWNfb3N0cmVhbTxFbGVtLCBUcmFpdHM+OjpmYWlsYml0KTsKLSAgfQotICBlbHNlCi0gICAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaSA9IHMuYmVnaW4oKTsgaSAhPSBzLmVuZCgpOyArK2kpCi0gICAgICBvcyA8PCBvcy53aWRlbigqaSk7Ci0gIHJldHVybiBvczsKLX0KLQotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLSNlbmRpZiAvLyBBU0lPX0lQX0lNUExfQUREUkVTU19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9pbXBsL2FkZHJlc3MuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvYWRkcmVzcy5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjUyYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvYWRkcmVzcy5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLy8KLS8vIGlwL2ltcGwvYWRkcmVzcy5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JUF9JTVBMX0FERFJFU1NfSVBQCi0jZGVmaW5lIEFTSU9fSVBfSU1QTF9BRERSRVNTX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPHR5cGVpbmZvPgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19leGNlcHRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYWRkcmVzcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9zeXN0ZW1fZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGlwIHsKLQotYWRkcmVzczo6YWRkcmVzcygpCi0gIDogdHlwZV8oaXB2NCksCi0gICAgaXB2NF9hZGRyZXNzXygpLAotICAgIGlwdjZfYWRkcmVzc18oKQotewotfQotCi1hZGRyZXNzOjphZGRyZXNzKGNvbnN0IGFzaW86OmlwOjphZGRyZXNzX3Y0JiBpcHY0X2FkZHJlc3MpCi0gIDogdHlwZV8oaXB2NCksCi0gICAgaXB2NF9hZGRyZXNzXyhpcHY0X2FkZHJlc3MpLAotICAgIGlwdjZfYWRkcmVzc18oKQotewotfQotCi1hZGRyZXNzOjphZGRyZXNzKGNvbnN0IGFzaW86OmlwOjphZGRyZXNzX3Y2JiBpcHY2X2FkZHJlc3MpCi0gIDogdHlwZV8oaXB2NiksCi0gICAgaXB2NF9hZGRyZXNzXygpLAotICAgIGlwdjZfYWRkcmVzc18oaXB2Nl9hZGRyZXNzKQotewotfQotCi1hZGRyZXNzOjphZGRyZXNzKGNvbnN0IGFkZHJlc3MmIG90aGVyKQotICA6IHR5cGVfKG90aGVyLnR5cGVfKSwKLSAgICBpcHY0X2FkZHJlc3NfKG90aGVyLmlwdjRfYWRkcmVzc18pLAotICAgIGlwdjZfYWRkcmVzc18ob3RoZXIuaXB2Nl9hZGRyZXNzXykKLXsKLX0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLWFkZHJlc3M6OmFkZHJlc3MoYWRkcmVzcyYmIG90aGVyKQotICA6IHR5cGVfKG90aGVyLnR5cGVfKSwKLSAgICBpcHY0X2FkZHJlc3NfKG90aGVyLmlwdjRfYWRkcmVzc18pLAotICAgIGlwdjZfYWRkcmVzc18ob3RoZXIuaXB2Nl9hZGRyZXNzXykKLXsKLX0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLWFkZHJlc3MmIGFkZHJlc3M6Om9wZXJhdG9yPShjb25zdCBhZGRyZXNzJiBvdGhlcikKLXsKLSAgdHlwZV8gPSBvdGhlci50eXBlXzsKLSAgaXB2NF9hZGRyZXNzXyA9IG90aGVyLmlwdjRfYWRkcmVzc187Ci0gIGlwdjZfYWRkcmVzc18gPSBvdGhlci5pcHY2X2FkZHJlc3NfOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi1hZGRyZXNzJiBhZGRyZXNzOjpvcGVyYXRvcj0oYWRkcmVzcyYmIG90aGVyKQotewotICB0eXBlXyA9IG90aGVyLnR5cGVfOwotICBpcHY0X2FkZHJlc3NfID0gb3RoZXIuaXB2NF9hZGRyZXNzXzsKLSAgaXB2Nl9hZGRyZXNzXyA9IG90aGVyLmlwdjZfYWRkcmVzc187Ci0gIHJldHVybiAqdGhpczsKLX0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0KLWFkZHJlc3MmIGFkZHJlc3M6Om9wZXJhdG9yPShjb25zdCBhc2lvOjppcDo6YWRkcmVzc192NCYgaXB2NF9hZGRyZXNzKQotewotICB0eXBlXyA9IGlwdjQ7Ci0gIGlwdjRfYWRkcmVzc18gPSBpcHY0X2FkZHJlc3M7Ci0gIGlwdjZfYWRkcmVzc18gPSBhc2lvOjppcDo6YWRkcmVzc192NigpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWFkZHJlc3MmIGFkZHJlc3M6Om9wZXJhdG9yPShjb25zdCBhc2lvOjppcDo6YWRkcmVzc192NiYgaXB2Nl9hZGRyZXNzKQotewotICB0eXBlXyA9IGlwdjY7Ci0gIGlwdjRfYWRkcmVzc18gPSBhc2lvOjppcDo6YWRkcmVzc192NCgpOwotICBpcHY2X2FkZHJlc3NfID0gaXB2Nl9hZGRyZXNzOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWFzaW86OmlwOjphZGRyZXNzX3Y0IGFkZHJlc3M6OnRvX3Y0KCkgY29uc3QKLXsKLSAgaWYgKHR5cGVfICE9IGlwdjQpCi0gIHsKLSAgICBzdGQ6OmJhZF9jYXN0IGV4OwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXhjZXB0aW9uKGV4KTsKLSAgfQotICByZXR1cm4gaXB2NF9hZGRyZXNzXzsKLX0KLQotYXNpbzo6aXA6OmFkZHJlc3NfdjYgYWRkcmVzczo6dG9fdjYoKSBjb25zdAotewotICBpZiAodHlwZV8gIT0gaXB2NikKLSAgewotICAgIHN0ZDo6YmFkX2Nhc3QgZXg7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICB9Ci0gIHJldHVybiBpcHY2X2FkZHJlc3NfOwotfQotCi1zdGQ6OnN0cmluZyBhZGRyZXNzOjp0b19zdHJpbmcoKSBjb25zdAotewotICBpZiAodHlwZV8gPT0gaXB2NikKLSAgICByZXR1cm4gaXB2Nl9hZGRyZXNzXy50b19zdHJpbmcoKTsKLSAgcmV0dXJuIGlwdjRfYWRkcmVzc18udG9fc3RyaW5nKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIGFkZHJlc3M6OnRvX3N0cmluZyhhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLXsKLSAgaWYgKHR5cGVfID09IGlwdjYpCi0gICAgcmV0dXJuIGlwdjZfYWRkcmVzc18udG9fc3RyaW5nKGVjKTsKLSAgcmV0dXJuIGlwdjRfYWRkcmVzc18udG9fc3RyaW5nKGVjKTsKLX0KLQotYWRkcmVzcyBhZGRyZXNzOjpmcm9tX3N0cmluZyhjb25zdCBjaGFyKiBzdHIpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIGFkZHJlc3MgYWRkciA9IGZyb21fc3RyaW5nKHN0ciwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjKTsKLSAgcmV0dXJuIGFkZHI7Ci19Ci0KLWFkZHJlc3MgYWRkcmVzczo6ZnJvbV9zdHJpbmcoY29uc3QgY2hhciogc3RyLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgYXNpbzo6aXA6OmFkZHJlc3NfdjYgaXB2Nl9hZGRyZXNzID0KLSAgICBhc2lvOjppcDo6YWRkcmVzc192Njo6ZnJvbV9zdHJpbmcoc3RyLCBlYyk7Ci0gIGlmICghZWMpCi0gIHsKLSAgICBhZGRyZXNzIHRtcDsKLSAgICB0bXAudHlwZV8gPSBpcHY2OwotICAgIHRtcC5pcHY2X2FkZHJlc3NfID0gaXB2Nl9hZGRyZXNzOwotICAgIHJldHVybiB0bXA7Ci0gIH0KLQotICBhc2lvOjppcDo6YWRkcmVzc192NCBpcHY0X2FkZHJlc3MgPQotICAgIGFzaW86OmlwOjphZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZyhzdHIsIGVjKTsKLSAgaWYgKCFlYykKLSAgewotICAgIGFkZHJlc3MgdG1wOwotICAgIHRtcC50eXBlXyA9IGlwdjQ7Ci0gICAgdG1wLmlwdjRfYWRkcmVzc18gPSBpcHY0X2FkZHJlc3M7Ci0gICAgcmV0dXJuIHRtcDsKLSAgfQotCi0gIHJldHVybiBhZGRyZXNzKCk7Ci19Ci0KLWFkZHJlc3MgYWRkcmVzczo6ZnJvbV9zdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikKLXsKLSAgcmV0dXJuIGZyb21fc3RyaW5nKHN0ci5jX3N0cigpKTsKLX0KLQotYWRkcmVzcyBhZGRyZXNzOjpmcm9tX3N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICByZXR1cm4gZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksIGVjKTsKLX0KLQotYm9vbCBhZGRyZXNzOjppc19sb29wYmFjaygpIGNvbnN0Ci17Ci0gIHJldHVybiAodHlwZV8gPT0gaXB2NCkKLSAgICA/IGlwdjRfYWRkcmVzc18uaXNfbG9vcGJhY2soKQotICAgIDogaXB2Nl9hZGRyZXNzXy5pc19sb29wYmFjaygpOwotfQotCi1ib29sIGFkZHJlc3M6OmlzX3Vuc3BlY2lmaWVkKCkgY29uc3QKLXsKLSAgcmV0dXJuICh0eXBlXyA9PSBpcHY0KQotICAgID8gaXB2NF9hZGRyZXNzXy5pc191bnNwZWNpZmllZCgpCi0gICAgOiBpcHY2X2FkZHJlc3NfLmlzX3Vuc3BlY2lmaWVkKCk7Ci19Ci0KLWJvb2wgYWRkcmVzczo6aXNfbXVsdGljYXN0KCkgY29uc3QKLXsKLSAgcmV0dXJuICh0eXBlXyA9PSBpcHY0KQotICAgID8gaXB2NF9hZGRyZXNzXy5pc19tdWx0aWNhc3QoKQotICAgIDogaXB2Nl9hZGRyZXNzXy5pc19tdWx0aWNhc3QoKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IGFkZHJlc3MmIGExLCBjb25zdCBhZGRyZXNzJiBhMikKLXsKLSAgaWYgKGExLnR5cGVfICE9IGEyLnR5cGVfKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGExLnR5cGVfID09IGFkZHJlc3M6OmlwdjYpCi0gICAgcmV0dXJuIGExLmlwdjZfYWRkcmVzc18gPT0gYTIuaXB2Nl9hZGRyZXNzXzsKLSAgcmV0dXJuIGExLmlwdjRfYWRkcmVzc18gPT0gYTIuaXB2NF9hZGRyZXNzXzsKLX0KLQotYm9vbCBvcGVyYXRvcjwoY29uc3QgYWRkcmVzcyYgYTEsIGNvbnN0IGFkZHJlc3MmIGEyKQotewotICBpZiAoYTEudHlwZV8gPCBhMi50eXBlXykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGExLnR5cGVfID4gYTIudHlwZV8pCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYTEudHlwZV8gPT0gYWRkcmVzczo6aXB2NikKLSAgICByZXR1cm4gYTEuaXB2Nl9hZGRyZXNzXyA8IGEyLmlwdjZfYWRkcmVzc187Ci0gIHJldHVybiBhMS5pcHY0X2FkZHJlc3NfIDwgYTIuaXB2NF9hZGRyZXNzXzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSVBfSU1QTF9BRERSRVNTX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvYWRkcmVzc192NC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvaW1wbC9hZGRyZXNzX3Y0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlNjVkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvaW1wbC9hZGRyZXNzX3Y0LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vCi0vLyBpcC9pbXBsL2FkZHJlc3NfdjQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfSU1QTF9BRERSRVNTX1Y0X0hQUAotI2RlZmluZSBBU0lPX0lQX0lNUExfQUREUkVTU19WNF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBpcCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtLCB0eXBlbmFtZSBUcmFpdHM+Ci1zdGQ6OmJhc2ljX29zdHJlYW08RWxlbSwgVHJhaXRzPiYgb3BlcmF0b3I8PCgKLSAgICBzdGQ6OmJhc2ljX29zdHJlYW08RWxlbSwgVHJhaXRzPiYgb3MsIGNvbnN0IGFkZHJlc3NfdjQmIGFkZHIpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHN0ZDo6c3RyaW5nIHMgPSBhZGRyLnRvX3N0cmluZyhlYyk7Ci0gIGlmIChlYykKLSAgewotICAgIGlmIChvcy5leGNlcHRpb25zKCkgJiBzdGQ6OmJhc2ljX29zdHJlYW08RWxlbSwgVHJhaXRzPjo6ZmFpbGJpdCkKLSAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICAgIGVsc2UKLSAgICAgIG9zLnNldHN0YXRlKHN0ZDo6YmFzaWNfb3N0cmVhbTxFbGVtLCBUcmFpdHM+OjpmYWlsYml0KTsKLSAgfQotICBlbHNlCi0gICAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaSA9IHMuYmVnaW4oKTsgaSAhPSBzLmVuZCgpOyArK2kpCi0gICAgICBvcyA8PCBvcy53aWRlbigqaSk7Ci0gIHJldHVybiBvczsKLX0KLQotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLSNlbmRpZiAvLyBBU0lPX0lQX0lNUExfQUREUkVTU19WNF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9pbXBsL2FkZHJlc3NfdjQuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvYWRkcmVzc192NC5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOTNjNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvYWRkcmVzc192NC5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8KLS8vIGlwL2ltcGwvYWRkcmVzc192NC5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JUF9JTVBMX0FERFJFU1NfVjRfSVBQCi0jZGVmaW5lIEFTSU9fSVBfSU1QTF9BRERSRVNTX1Y0X0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19leGNlcHRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYWRkcmVzc192NC5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgaXAgewotCi1hZGRyZXNzX3Y0OjphZGRyZXNzX3Y0KGNvbnN0IGFkZHJlc3NfdjQ6OmJ5dGVzX3R5cGUmIGJ5dGVzKQotewotI2lmIFVDSEFSX01BWCA+IDB4RkYKLSAgaWYgKGJ5dGVzWzBdID4gMHhGRiB8fCBieXRlc1sxXSA+IDB4RkYKLSAgICAgIHx8IGJ5dGVzWzJdID4gMHhGRiB8fCBieXRlc1szXSA+IDB4RkYpCi0gIHsKLSAgICBzdGQ6Om91dF9vZl9yYW5nZSBleCgiYWRkcmVzc192NCBmcm9tIGJ5dGVzX3R5cGUiKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2V4Y2VwdGlvbihleCk7Ci0gIH0KLSNlbmRpZiAvLyBVQ0hBUl9NQVggPiAweEZGCi0KLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbWNweS4KLSAgbWVtY3B5KCZhZGRyXy5zX2FkZHIsIGJ5dGVzLmRhdGEoKSwgNCk7Ci19Ci0KLWFkZHJlc3NfdjQ6OmFkZHJlc3NfdjQodW5zaWduZWQgbG9uZyBhZGRyKQotewotI2lmIFVMT05HX01BWCA+IDB4RkZGRkZGRkYKLSAgaWYgKGFkZHIgPiAweEZGRkZGRkZGKQotICB7Ci0gICAgc3RkOjpvdXRfb2ZfcmFuZ2UgZXgoImFkZHJlc3NfdjQgZnJvbSB1bnNpZ25lZCBsb25nIik7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICB9Ci0jZW5kaWYgLy8gVUxPTkdfTUFYID4gMHhGRkZGRkZGRgotCi0gIGFkZHJfLnNfYWRkciA9IGFzaW86OmRldGFpbDo6c29ja2V0X29wczo6aG9zdF90b19uZXR3b3JrX2xvbmcoCi0gICAgICBzdGF0aWNfY2FzdDxhc2lvOjpkZXRhaWw6OnVfbG9uZ190eXBlPihhZGRyKSk7Ci19Ci0KLWFkZHJlc3NfdjQ6OmJ5dGVzX3R5cGUgYWRkcmVzc192NDo6dG9fYnl0ZXMoKSBjb25zdAotewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3IgbWVtY3B5LgotICBieXRlc190eXBlIGJ5dGVzOwotI2lmIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotICBtZW1jcHkoYnl0ZXMuZGF0YSgpLCAmYWRkcl8uc19hZGRyLCA0KTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotICBtZW1jcHkoYnl0ZXMuZWxlbXMsICZhZGRyXy5zX2FkZHIsIDQpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotICByZXR1cm4gYnl0ZXM7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgYWRkcmVzc192NDo6dG9fdWxvbmcoKSBjb25zdAotewotICByZXR1cm4gYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjpuZXR3b3JrX3RvX2hvc3RfbG9uZyhhZGRyXy5zX2FkZHIpOwotfQotCi1zdGQ6OnN0cmluZyBhZGRyZXNzX3Y0Ojp0b19zdHJpbmcoKSBjb25zdAotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBzdGQ6OnN0cmluZyBhZGRyID0gdG9fc3RyaW5nKGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIHJldHVybiBhZGRyOwotfQotCi1zdGQ6OnN0cmluZyBhZGRyZXNzX3Y0Ojp0b19zdHJpbmcoYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci17Ci0gIGNoYXIgYWRkcl9zdHJbYXNpbzo6ZGV0YWlsOjptYXhfYWRkcl92NF9zdHJfbGVuXTsKLSAgY29uc3QgY2hhciogYWRkciA9Ci0gICAgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjppbmV0X250b3AoCi0gICAgICAgIEFTSU9fT1NfREVGKEFGX0lORVQpLCAmYWRkcl8sIGFkZHJfc3RyLAotICAgICAgICBhc2lvOjpkZXRhaWw6Om1heF9hZGRyX3Y0X3N0cl9sZW4sIDAsIGVjKTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKLSAgcmV0dXJuIGFkZHI7Ci19Ci0KLWFkZHJlc3NfdjQgYWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoY29uc3QgY2hhciogc3RyKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBhZGRyZXNzX3Y0IGFkZHIgPSBmcm9tX3N0cmluZyhzdHIsIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIHJldHVybiBhZGRyOwotfQotCi1hZGRyZXNzX3Y0IGFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIHN0ciwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGFkZHJlc3NfdjQgdG1wOwotICBpZiAoYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjppbmV0X3B0b24oCi0gICAgICAgIEFTSU9fT1NfREVGKEFGX0lORVQpLCBzdHIsICZ0bXAuYWRkcl8sIDAsIGVjKSA8PSAwKQotICAgIHJldHVybiBhZGRyZXNzX3Y0KCk7Ci0gIHJldHVybiB0bXA7Ci19Ci0KLWFkZHJlc3NfdjQgYWRkcmVzc192NDo6ZnJvbV9zdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikKLXsKLSAgcmV0dXJuIGZyb21fc3RyaW5nKHN0ci5jX3N0cigpKTsKLX0KLQotYWRkcmVzc192NCBhZGRyZXNzX3Y0Ojpmcm9tX3N0cmluZygKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgcmV0dXJuIGZyb21fc3RyaW5nKHN0ci5jX3N0cigpLCBlYyk7Ci19Ci0KLWJvb2wgYWRkcmVzc192NDo6aXNfbG9vcGJhY2soKSBjb25zdAotewotICByZXR1cm4gKHRvX3Vsb25nKCkgJiAweEZGMDAwMDAwKSA9PSAweDdGMDAwMDAwOwotfQotCi1ib29sIGFkZHJlc3NfdjQ6OmlzX3Vuc3BlY2lmaWVkKCkgY29uc3QKLXsKLSAgcmV0dXJuIHRvX3Vsb25nKCkgPT0gMDsKLX0KLQotYm9vbCBhZGRyZXNzX3Y0Ojppc19jbGFzc19hKCkgY29uc3QKLXsKLSAgcmV0dXJuICh0b191bG9uZygpICYgMHg4MDAwMDAwMCkgPT0gMDsKLX0KLQotYm9vbCBhZGRyZXNzX3Y0Ojppc19jbGFzc19iKCkgY29uc3QKLXsKLSAgcmV0dXJuICh0b191bG9uZygpICYgMHhDMDAwMDAwMCkgPT0gMHg4MDAwMDAwMDsKLX0KLQotYm9vbCBhZGRyZXNzX3Y0Ojppc19jbGFzc19jKCkgY29uc3QKLXsKLSAgcmV0dXJuICh0b191bG9uZygpICYgMHhFMDAwMDAwMCkgPT0gMHhDMDAwMDAwMDsKLX0KLQotYm9vbCBhZGRyZXNzX3Y0Ojppc19tdWx0aWNhc3QoKSBjb25zdAotewotICByZXR1cm4gKHRvX3Vsb25nKCkgJiAweEYwMDAwMDAwKSA9PSAweEUwMDAwMDAwOwotfQotCi1hZGRyZXNzX3Y0IGFkZHJlc3NfdjQ6OmJyb2FkY2FzdChjb25zdCBhZGRyZXNzX3Y0JiBhZGRyLCBjb25zdCBhZGRyZXNzX3Y0JiBtYXNrKQotewotICByZXR1cm4gYWRkcmVzc192NChhZGRyLnRvX3Vsb25nKCkgfCAobWFzay50b191bG9uZygpIF4gMHhGRkZGRkZGRikpOwotfQotCi1hZGRyZXNzX3Y0IGFkZHJlc3NfdjQ6Om5ldG1hc2soY29uc3QgYWRkcmVzc192NCYgYWRkcikKLXsKLSAgaWYgKGFkZHIuaXNfY2xhc3NfYSgpKQotICAgIHJldHVybiBhZGRyZXNzX3Y0KDB4RkYwMDAwMDApOwotICBpZiAoYWRkci5pc19jbGFzc19iKCkpCi0gICAgcmV0dXJuIGFkZHJlc3NfdjQoMHhGRkZGMDAwMCk7Ci0gIGlmIChhZGRyLmlzX2NsYXNzX2MoKSkKLSAgICByZXR1cm4gYWRkcmVzc192NCgweEZGRkZGRjAwKTsKLSAgcmV0dXJuIGFkZHJlc3NfdjQoMHhGRkZGRkZGRik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGlwCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0lQX0lNUExfQUREUkVTU19WNF9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9pbXBsL2FkZHJlc3NfdjYuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvYWRkcmVzc192Ni5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNmRlN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvYWRkcmVzc192Ni5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLwotLy8gaXAvaW1wbC9hZGRyZXNzX3Y2LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lQX0lNUExfQUREUkVTU19WNl9IUFAKLSNkZWZpbmUgQVNJT19JUF9JTVBMX0FERFJFU1NfVjZfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgaXAgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbSwgdHlwZW5hbWUgVHJhaXRzPgotc3RkOjpiYXNpY19vc3RyZWFtPEVsZW0sIFRyYWl0cz4mIG9wZXJhdG9yPDwoCi0gICAgc3RkOjpiYXNpY19vc3RyZWFtPEVsZW0sIFRyYWl0cz4mIG9zLCBjb25zdCBhZGRyZXNzX3Y2JiBhZGRyKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBzdGQ6OnN0cmluZyBzID0gYWRkci50b19zdHJpbmcoZWMpOwotICBpZiAoZWMpCi0gIHsKLSAgICBpZiAob3MuZXhjZXB0aW9ucygpICYgc3RkOjpiYXNpY19vc3RyZWFtPEVsZW0sIFRyYWl0cz46OmZhaWxiaXQpCi0gICAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjKTsKLSAgICBlbHNlCi0gICAgICBvcy5zZXRzdGF0ZShzdGQ6OmJhc2ljX29zdHJlYW08RWxlbSwgVHJhaXRzPjo6ZmFpbGJpdCk7Ci0gIH0KLSAgZWxzZQotICAgIGZvciAoc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGkgPSBzLmJlZ2luKCk7IGkgIT0gcy5lbmQoKTsgKytpKQotICAgICAgb3MgPDwgb3Mud2lkZW4oKmkpOwotICByZXR1cm4gb3M7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGlwCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0jZW5kaWYgLy8gQVNJT19JUF9JTVBMX0FERFJFU1NfVjZfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvaW1wbC9hZGRyZXNzX3Y2LmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9pbXBsL2FkZHJlc3NfdjYuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjQxMDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9pbXBsL2FkZHJlc3NfdjYuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vCi0vLyBpcC9pbXBsL2FkZHJlc3NfdjYuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfSU1QTF9BRERSRVNTX1Y2X0lQUAotI2RlZmluZSBBU0lPX0lQX0lNUExfQUREUkVTU19WNl9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNpbmNsdWRlIDx0eXBlaW5mbz4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfb3BzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXhjZXB0aW9uLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2FkZHJlc3NfdjYuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGlwIHsKLQotYWRkcmVzc192Njo6YWRkcmVzc192NigpCi0gIDogYWRkcl8oKSwKLSAgICBzY29wZV9pZF8oMCkKLXsKLX0KLQotYWRkcmVzc192Njo6YWRkcmVzc192Nihjb25zdCBhZGRyZXNzX3Y2OjpieXRlc190eXBlJiBieXRlcywKLSAgICB1bnNpZ25lZCBsb25nIHNjb3BlKQotICA6IHNjb3BlX2lkXyhzY29wZSkKLXsKLSNpZiBVQ0hBUl9NQVggPiAweEZGCi0gIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBieXRlcy5zaXplKCk7ICsraSkKLSAgewotICAgIGlmIChieXRlc1tpXSA+IDB4RkYpCi0gICAgewotICAgICAgc3RkOjpvdXRfb2ZfcmFuZ2UgZXgoImFkZHJlc3NfdjYgZnJvbSBieXRlc190eXBlIik7Ci0gICAgICBhc2lvOjpkZXRhaWw6OnRocm93X2V4Y2VwdGlvbihleCk7Ci0gICAgfQotICB9Ci0jZW5kaWYgLy8gVUNIQVJfTUFYID4gMHhGRgotCi0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1jcHkuCi0gIG1lbWNweShhZGRyXy5zNl9hZGRyLCBieXRlcy5kYXRhKCksIDE2KTsKLX0KLQotYWRkcmVzc192Njo6YWRkcmVzc192Nihjb25zdCBhZGRyZXNzX3Y2JiBvdGhlcikKLSAgOiBhZGRyXyhvdGhlci5hZGRyXyksCi0gICAgc2NvcGVfaWRfKG90aGVyLnNjb3BlX2lkXykKLXsKLX0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLWFkZHJlc3NfdjY6OmFkZHJlc3NfdjYoYWRkcmVzc192NiYmIG90aGVyKQotICA6IGFkZHJfKG90aGVyLmFkZHJfKSwKLSAgICBzY29wZV9pZF8ob3RoZXIuc2NvcGVfaWRfKQotewotfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotYWRkcmVzc192NiYgYWRkcmVzc192Njo6b3BlcmF0b3I9KGNvbnN0IGFkZHJlc3NfdjYmIG90aGVyKQotewotICBhZGRyXyA9IG90aGVyLmFkZHJfOwotICBzY29wZV9pZF8gPSBvdGhlci5zY29wZV9pZF87Ci0gIHJldHVybiAqdGhpczsKLX0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLWFkZHJlc3NfdjYmIGFkZHJlc3NfdjY6Om9wZXJhdG9yPShhZGRyZXNzX3Y2JiYgb3RoZXIpCi17Ci0gIGFkZHJfID0gb3RoZXIuYWRkcl87Ci0gIHNjb3BlX2lkXyA9IG90aGVyLnNjb3BlX2lkXzsKLSAgcmV0dXJuICp0aGlzOwotfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotYWRkcmVzc192Njo6Ynl0ZXNfdHlwZSBhZGRyZXNzX3Y2Ojp0b19ieXRlcygpIGNvbnN0Ci17Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBtZW1jcHkuCi0gIGJ5dGVzX3R5cGUgYnl0ZXM7Ci0jaWYgZGVmaW5lZChBU0lPX0hBU19TVERfQVJSQVkpCi0gIG1lbWNweShieXRlcy5kYXRhKCksIGFkZHJfLnM2X2FkZHIsIDE2KTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0FSUkFZKQotICBtZW1jcHkoYnl0ZXMuZWxlbXMsIGFkZHJfLnM2X2FkZHIsIDE2KTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9BUlJBWSkKLSAgcmV0dXJuIGJ5dGVzOwotfQotCi1zdGQ6OnN0cmluZyBhZGRyZXNzX3Y2Ojp0b19zdHJpbmcoKSBjb25zdAotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBzdGQ6OnN0cmluZyBhZGRyID0gdG9fc3RyaW5nKGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIHJldHVybiBhZGRyOwotfQotCi1zdGQ6OnN0cmluZyBhZGRyZXNzX3Y2Ojp0b19zdHJpbmcoYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci17Ci0gIGNoYXIgYWRkcl9zdHJbYXNpbzo6ZGV0YWlsOjptYXhfYWRkcl92Nl9zdHJfbGVuXTsKLSAgY29uc3QgY2hhciogYWRkciA9Ci0gICAgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjppbmV0X250b3AoCi0gICAgICAgIEFTSU9fT1NfREVGKEFGX0lORVQ2KSwgJmFkZHJfLCBhZGRyX3N0ciwKLSAgICAgICAgYXNpbzo6ZGV0YWlsOjptYXhfYWRkcl92Nl9zdHJfbGVuLCBzY29wZV9pZF8sIGVjKTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKLSAgcmV0dXJuIGFkZHI7Ci19Ci0KLWFkZHJlc3NfdjYgYWRkcmVzc192Njo6ZnJvbV9zdHJpbmcoY29uc3QgY2hhciogc3RyKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBhZGRyZXNzX3Y2IGFkZHIgPSBmcm9tX3N0cmluZyhzdHIsIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIHJldHVybiBhZGRyOwotfQotCi1hZGRyZXNzX3Y2IGFkZHJlc3NfdjY6OmZyb21fc3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIHN0ciwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGFkZHJlc3NfdjYgdG1wOwotICBpZiAoYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjppbmV0X3B0b24oCi0gICAgICAgIEFTSU9fT1NfREVGKEFGX0lORVQ2KSwgc3RyLCAmdG1wLmFkZHJfLCAmdG1wLnNjb3BlX2lkXywgZWMpIDw9IDApCi0gICAgcmV0dXJuIGFkZHJlc3NfdjYoKTsKLSAgcmV0dXJuIHRtcDsKLX0KLQotYWRkcmVzc192NiBhZGRyZXNzX3Y2Ojpmcm9tX3N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKQotewotICByZXR1cm4gZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCkpOwotfQotCi1hZGRyZXNzX3Y2IGFkZHJlc3NfdjY6OmZyb21fc3RyaW5nKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICByZXR1cm4gZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksIGVjKTsKLX0KLQotYWRkcmVzc192NCBhZGRyZXNzX3Y2Ojp0b192NCgpIGNvbnN0Ci17Ci0gIGlmICghaXNfdjRfbWFwcGVkKCkgJiYgIWlzX3Y0X2NvbXBhdGlibGUoKSkKLSAgewotICAgIHN0ZDo6YmFkX2Nhc3QgZXg7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19leGNlcHRpb24oZXgpOwotICB9Ci0KLSAgYWRkcmVzc192NDo6Ynl0ZXNfdHlwZSB2NF9ieXRlcyA9IHsgeyBhZGRyXy5zNl9hZGRyWzEyXSwKLSAgICBhZGRyXy5zNl9hZGRyWzEzXSwgYWRkcl8uczZfYWRkclsxNF0sIGFkZHJfLnM2X2FkZHJbMTVdIH0gfTsKLSAgcmV0dXJuIGFkZHJlc3NfdjQodjRfYnl0ZXMpOwotfQotCi1ib29sIGFkZHJlc3NfdjY6OmlzX2xvb3BiYWNrKCkgY29uc3QKLXsKLSAgcmV0dXJuICgoYWRkcl8uczZfYWRkclswXSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkclsxXSA9PSAwKQotICAgICAgJiYgKGFkZHJfLnM2X2FkZHJbMl0gPT0gMCkgJiYgKGFkZHJfLnM2X2FkZHJbM10gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzRdID09IDApICYmIChhZGRyXy5zNl9hZGRyWzVdID09IDApCi0gICAgICAmJiAoYWRkcl8uczZfYWRkcls2XSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkcls3XSA9PSAwKQotICAgICAgJiYgKGFkZHJfLnM2X2FkZHJbOF0gPT0gMCkgJiYgKGFkZHJfLnM2X2FkZHJbOV0gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzEwXSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkclsxMV0gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzEyXSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkclsxM10gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzE0XSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkclsxNV0gPT0gMSkpOwotfQotCi1ib29sIGFkZHJlc3NfdjY6OmlzX3Vuc3BlY2lmaWVkKCkgY29uc3QKLXsKLSAgcmV0dXJuICgoYWRkcl8uczZfYWRkclswXSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkclsxXSA9PSAwKQotICAgICAgJiYgKGFkZHJfLnM2X2FkZHJbMl0gPT0gMCkgJiYgKGFkZHJfLnM2X2FkZHJbM10gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzRdID09IDApICYmIChhZGRyXy5zNl9hZGRyWzVdID09IDApCi0gICAgICAmJiAoYWRkcl8uczZfYWRkcls2XSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkcls3XSA9PSAwKQotICAgICAgJiYgKGFkZHJfLnM2X2FkZHJbOF0gPT0gMCkgJiYgKGFkZHJfLnM2X2FkZHJbOV0gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzEwXSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkclsxMV0gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzEyXSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkclsxM10gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzE0XSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkclsxNV0gPT0gMCkpOwotfQotCi1ib29sIGFkZHJlc3NfdjY6OmlzX2xpbmtfbG9jYWwoKSBjb25zdAotewotICByZXR1cm4gKChhZGRyXy5zNl9hZGRyWzBdID09IDB4ZmUpICYmICgoYWRkcl8uczZfYWRkclsxXSAmIDB4YzApID09IDB4ODApKTsKLX0KLQotYm9vbCBhZGRyZXNzX3Y2Ojppc19zaXRlX2xvY2FsKCkgY29uc3QKLXsKLSAgcmV0dXJuICgoYWRkcl8uczZfYWRkclswXSA9PSAweGZlKSAmJiAoKGFkZHJfLnM2X2FkZHJbMV0gJiAweGMwKSA9PSAweGMwKSk7Ci19Ci0KLWJvb2wgYWRkcmVzc192Njo6aXNfdjRfbWFwcGVkKCkgY29uc3QKLXsKLSAgcmV0dXJuICgoYWRkcl8uczZfYWRkclswXSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkclsxXSA9PSAwKQotICAgICAgJiYgKGFkZHJfLnM2X2FkZHJbMl0gPT0gMCkgJiYgKGFkZHJfLnM2X2FkZHJbM10gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzRdID09IDApICYmIChhZGRyXy5zNl9hZGRyWzVdID09IDApCi0gICAgICAmJiAoYWRkcl8uczZfYWRkcls2XSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkcls3XSA9PSAwKQotICAgICAgJiYgKGFkZHJfLnM2X2FkZHJbOF0gPT0gMCkgJiYgKGFkZHJfLnM2X2FkZHJbOV0gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzEwXSA9PSAweGZmKSAmJiAoYWRkcl8uczZfYWRkclsxMV0gPT0gMHhmZikpOwotfQotCi1ib29sIGFkZHJlc3NfdjY6OmlzX3Y0X2NvbXBhdGlibGUoKSBjb25zdAotewotICByZXR1cm4gKChhZGRyXy5zNl9hZGRyWzBdID09IDApICYmIChhZGRyXy5zNl9hZGRyWzFdID09IDApCi0gICAgICAmJiAoYWRkcl8uczZfYWRkclsyXSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkclszXSA9PSAwKQotICAgICAgJiYgKGFkZHJfLnM2X2FkZHJbNF0gPT0gMCkgJiYgKGFkZHJfLnM2X2FkZHJbNV0gPT0gMCkKLSAgICAgICYmIChhZGRyXy5zNl9hZGRyWzZdID09IDApICYmIChhZGRyXy5zNl9hZGRyWzddID09IDApCi0gICAgICAmJiAoYWRkcl8uczZfYWRkcls4XSA9PSAwKSAmJiAoYWRkcl8uczZfYWRkcls5XSA9PSAwKQotICAgICAgJiYgKGFkZHJfLnM2X2FkZHJbMTBdID09IDApICYmIChhZGRyXy5zNl9hZGRyWzExXSA9PSAwKQotICAgICAgJiYgISgoYWRkcl8uczZfYWRkclsxMl0gPT0gMCkKLSAgICAgICAgJiYgKGFkZHJfLnM2X2FkZHJbMTNdID09IDApCi0gICAgICAgICYmIChhZGRyXy5zNl9hZGRyWzE0XSA9PSAwKQotICAgICAgICAmJiAoKGFkZHJfLnM2X2FkZHJbMTVdID09IDApIHx8IChhZGRyXy5zNl9hZGRyWzE1XSA9PSAxKSkpKTsKLX0KLQotYm9vbCBhZGRyZXNzX3Y2Ojppc19tdWx0aWNhc3QoKSBjb25zdAotewotICByZXR1cm4gKGFkZHJfLnM2X2FkZHJbMF0gPT0gMHhmZik7Ci19Ci0KLWJvb2wgYWRkcmVzc192Njo6aXNfbXVsdGljYXN0X2dsb2JhbCgpIGNvbnN0Ci17Ci0gIHJldHVybiAoKGFkZHJfLnM2X2FkZHJbMF0gPT0gMHhmZikgJiYgKChhZGRyXy5zNl9hZGRyWzFdICYgMHgwZikgPT0gMHgwZSkpOwotfQotCi1ib29sIGFkZHJlc3NfdjY6OmlzX211bHRpY2FzdF9saW5rX2xvY2FsKCkgY29uc3QKLXsKLSAgcmV0dXJuICgoYWRkcl8uczZfYWRkclswXSA9PSAweGZmKSAmJiAoKGFkZHJfLnM2X2FkZHJbMV0gJiAweDBmKSA9PSAweDAyKSk7Ci19Ci0KLWJvb2wgYWRkcmVzc192Njo6aXNfbXVsdGljYXN0X25vZGVfbG9jYWwoKSBjb25zdAotewotICByZXR1cm4gKChhZGRyXy5zNl9hZGRyWzBdID09IDB4ZmYpICYmICgoYWRkcl8uczZfYWRkclsxXSAmIDB4MGYpID09IDB4MDEpKTsKLX0KLQotYm9vbCBhZGRyZXNzX3Y2Ojppc19tdWx0aWNhc3Rfb3JnX2xvY2FsKCkgY29uc3QKLXsKLSAgcmV0dXJuICgoYWRkcl8uczZfYWRkclswXSA9PSAweGZmKSAmJiAoKGFkZHJfLnM2X2FkZHJbMV0gJiAweDBmKSA9PSAweDA4KSk7Ci19Ci0KLWJvb2wgYWRkcmVzc192Njo6aXNfbXVsdGljYXN0X3NpdGVfbG9jYWwoKSBjb25zdAotewotICByZXR1cm4gKChhZGRyXy5zNl9hZGRyWzBdID09IDB4ZmYpICYmICgoYWRkcl8uczZfYWRkclsxXSAmIDB4MGYpID09IDB4MDUpKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IGFkZHJlc3NfdjYmIGExLCBjb25zdCBhZGRyZXNzX3Y2JiBhMikKLXsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbWNtcC4KLSAgcmV0dXJuIG1lbWNtcCgmYTEuYWRkcl8sICZhMi5hZGRyXywKLSAgICAgIHNpemVvZihhc2lvOjpkZXRhaWw6OmluNl9hZGRyX3R5cGUpKSA9PSAwCi0gICAgJiYgYTEuc2NvcGVfaWRfID09IGEyLnNjb3BlX2lkXzsKLX0KLQotYm9vbCBvcGVyYXRvcjwoY29uc3QgYWRkcmVzc192NiYgYTEsIGNvbnN0IGFkZHJlc3NfdjYmIGEyKQotewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3IgbWVtY21wLgotICBpbnQgbWVtY21wX3Jlc3VsdCA9IG1lbWNtcCgmYTEuYWRkcl8sICZhMi5hZGRyXywKLSAgICAgIHNpemVvZihhc2lvOjpkZXRhaWw6OmluNl9hZGRyX3R5cGUpKTsKLSAgaWYgKG1lbWNtcF9yZXN1bHQgPCAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAobWVtY21wX3Jlc3VsdCA+IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gYTEuc2NvcGVfaWRfIDwgYTIuc2NvcGVfaWRfOwotfQotCi1hZGRyZXNzX3Y2IGFkZHJlc3NfdjY6Omxvb3BiYWNrKCkKLXsKLSAgYWRkcmVzc192NiB0bXA7Ci0gIHRtcC5hZGRyXy5zNl9hZGRyWzE1XSA9IDE7Ci0gIHJldHVybiB0bXA7Ci19Ci0KLWFkZHJlc3NfdjYgYWRkcmVzc192Njo6djRfbWFwcGVkKGNvbnN0IGFkZHJlc3NfdjQmIGFkZHIpCi17Ci0gIGFkZHJlc3NfdjQ6OmJ5dGVzX3R5cGUgdjRfYnl0ZXMgPSBhZGRyLnRvX2J5dGVzKCk7Ci0gIGJ5dGVzX3R5cGUgdjZfYnl0ZXMgPSB7IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHhGRiwgMHhGRiwKLSAgICB2NF9ieXRlc1swXSwgdjRfYnl0ZXNbMV0sIHY0X2J5dGVzWzJdLCB2NF9ieXRlc1szXSB9IH07Ci0gIHJldHVybiBhZGRyZXNzX3Y2KHY2X2J5dGVzKTsKLX0KLQotYWRkcmVzc192NiBhZGRyZXNzX3Y2Ojp2NF9jb21wYXRpYmxlKGNvbnN0IGFkZHJlc3NfdjQmIGFkZHIpCi17Ci0gIGFkZHJlc3NfdjQ6OmJ5dGVzX3R5cGUgdjRfYnl0ZXMgPSBhZGRyLnRvX2J5dGVzKCk7Ci0gIGJ5dGVzX3R5cGUgdjZfYnl0ZXMgPSB7IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICB2NF9ieXRlc1swXSwgdjRfYnl0ZXNbMV0sIHY0X2J5dGVzWzJdLCB2NF9ieXRlc1szXSB9IH07Ci0gIHJldHVybiBhZGRyZXNzX3Y2KHY2X2J5dGVzKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSVBfSU1QTF9BRERSRVNTX1Y2X0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvYmFzaWNfZW5kcG9pbnQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvYmFzaWNfZW5kcG9pbnQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE1YzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9pbXBsL2Jhc2ljX2VuZHBvaW50LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vCi0vLyBpcC9pbXBsL2Jhc2ljX2VuZHBvaW50LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JUF9JTVBMX0JBU0lDX0VORFBPSU5UX0hQUAotI2RlZmluZSBBU0lPX0lQX0lNUExfQkFTSUNfRU5EUE9JTlRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgaXAgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbSwgdHlwZW5hbWUgVHJhaXRzLCB0eXBlbmFtZSBJbnRlcm5ldFByb3RvY29sPgotc3RkOjpiYXNpY19vc3RyZWFtPEVsZW0sIFRyYWl0cz4mIG9wZXJhdG9yPDwoCi0gICAgc3RkOjpiYXNpY19vc3RyZWFtPEVsZW0sIFRyYWl0cz4mIG9zLAotICAgIGNvbnN0IGJhc2ljX2VuZHBvaW50PEludGVybmV0UHJvdG9jb2w+JiBlbmRwb2ludCkKLXsKLSAgYXNpbzo6aXA6OmRldGFpbDo6ZW5kcG9pbnQgdG1wX2VwKGVuZHBvaW50LmFkZHJlc3MoKSwgZW5kcG9pbnQucG9ydCgpKTsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc3RkOjpzdHJpbmcgcyA9IHRtcF9lcC50b19zdHJpbmcoZWMpOwotICBpZiAoZWMpCi0gIHsKLSAgICBpZiAob3MuZXhjZXB0aW9ucygpICYgc3RkOjpiYXNpY19vc3RyZWFtPEVsZW0sIFRyYWl0cz46OmZhaWxiaXQpCi0gICAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjKTsKLSAgICBlbHNlCi0gICAgICBvcy5zZXRzdGF0ZShzdGQ6OmJhc2ljX29zdHJlYW08RWxlbSwgVHJhaXRzPjo6ZmFpbGJpdCk7Ci0gIH0KLSAgZWxzZQotICAgIGZvciAoc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIGkgPSBzLmJlZ2luKCk7IGkgIT0gcy5lbmQoKTsgKytpKQotICAgICAgb3MgPDwgb3Mud2lkZW4oKmkpOwotICByZXR1cm4gb3M7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGlwCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0jZW5kaWYgLy8gQVNJT19JUF9JTVBMX0JBU0lDX0VORFBPSU5UX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvaG9zdF9uYW1lLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9pbXBsL2hvc3RfbmFtZS5pcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZGMzOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL2ltcGwvaG9zdF9uYW1lLmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vCi0vLyBpcC9pbXBsL2hvc3RfbmFtZS5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lQX0lNUExfSE9TVF9OQU1FX0lQUAotI2RlZmluZSBBU0lPX0lQX0lNUExfSE9TVF9OQU1FX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5zb2NrX2luaXQuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvaG9zdF9uYW1lLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBpcCB7Ci0KLXN0ZDo6c3RyaW5nIGhvc3RfbmFtZSgpCi17Ci0gIGNoYXIgbmFtZVsxMDI0XTsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgaWYgKGFzaW86OmRldGFpbDo6c29ja2V0X29wczo6Z2V0aG9zdG5hbWUobmFtZSwgc2l6ZW9mKG5hbWUpLCBlYykgIT0gMCkKLSAgewotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwotICB9Ci0gIHJldHVybiBzdGQ6OnN0cmluZyhuYW1lKTsKLX0KLQotc3RkOjpzdHJpbmcgaG9zdF9uYW1lKGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBjaGFyIG5hbWVbMTAyNF07Ci0gIGlmIChhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHM6OmdldGhvc3RuYW1lKG5hbWUsIHNpemVvZihuYW1lKSwgZWMpICE9IDApCi0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0gIHJldHVybiBzdGQ6OnN0cmluZyhuYW1lKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSVBfSU1QTF9IT1NUX05BTUVfSVBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvbXVsdGljYXN0LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9tdWx0aWNhc3QuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWYyYzNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9tdWx0aWNhc3QuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vCi0vLyBpcC9tdWx0aWNhc3QuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfTVVMVElDQVNUX0hQUAotI2RlZmluZSBBU0lPX0lQX01VTFRJQ0FTVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgImFzaW8vaXAvZGV0YWlsL3NvY2tldF9vcHRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGlwIHsKLW5hbWVzcGFjZSBtdWx0aWNhc3QgewotCi0vLy8gU29ja2V0IG9wdGlvbiB0byBqb2luIGEgbXVsdGljYXN0IGdyb3VwIG9uIGEgc3BlY2lmaWVkIGludGVyZmFjZS4KLS8qKgotICogSW1wbGVtZW50cyB0aGUgSVBQUk9UT19JUC9JUF9BRERfTUVNQkVSU0hJUCBzb2NrZXQgb3B0aW9uLgotICoKLSAqIEBwYXIgRXhhbXBsZXMKLSAqIFNldHRpbmcgdGhlIG9wdGlvbiB0byBqb2luIGEgbXVsdGljYXN0IGdyb3VwOgotICogQGNvZGUKLSAqIGFzaW86OmlwOjp1ZHA6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICogLi4uCi0gKiBhc2lvOjppcDo6YWRkcmVzcyBtdWx0aWNhc3RfYWRkcmVzcyA9Ci0gKiAgIGFzaW86OmlwOjphZGRyZXNzOjpmcm9tX3N0cmluZygiMjI1LjAuMC4xIik7Ci0gKiBhc2lvOjppcDo6bXVsdGljYXN0Ojpqb2luX2dyb3VwIG9wdGlvbihtdWx0aWNhc3RfYWRkcmVzcyk7Ci0gKiBzb2NrZXQuc2V0X29wdGlvbihvcHRpb24pOwotICogQGVuZGNvZGUKLSAqCi0gKiBAcGFyIENvbmNlcHRzOgotICogU2V0dGFibGVTb2NrZXRPcHRpb24uCi0gKi8KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLXR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBqb2luX2dyb3VwOwotI2Vsc2UKLXR5cGVkZWYgYXNpbzo6aXA6OmRldGFpbDo6c29ja2V0X29wdGlvbjo6bXVsdGljYXN0X3JlcXVlc3Q8Ci0gIEFTSU9fT1NfREVGKElQUFJPVE9fSVApLAotICBBU0lPX09TX0RFRihJUF9BRERfTUVNQkVSU0hJUCksCi0gIEFTSU9fT1NfREVGKElQUFJPVE9fSVBWNiksCi0gIEFTSU9fT1NfREVGKElQVjZfSk9JTl9HUk9VUCk+IGpvaW5fZ3JvdXA7Ci0jZW5kaWYKLQotLy8vIFNvY2tldCBvcHRpb24gdG8gbGVhdmUgYSBtdWx0aWNhc3QgZ3JvdXAgb24gYSBzcGVjaWZpZWQgaW50ZXJmYWNlLgotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBJUFBST1RPX0lQL0lQX0RST1BfTUVNQkVSU0hJUCBzb2NrZXQgb3B0aW9uLgotICoKLSAqIEBwYXIgRXhhbXBsZXMKLSAqIFNldHRpbmcgdGhlIG9wdGlvbiB0byBsZWF2ZSBhIG11bHRpY2FzdCBncm91cDoKLSAqIEBjb2RlCi0gKiBhc2lvOjppcDo6dWRwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAqIC4uLgotICogYXNpbzo6aXA6OmFkZHJlc3MgbXVsdGljYXN0X2FkZHJlc3MgPQotICogICBhc2lvOjppcDo6YWRkcmVzczo6ZnJvbV9zdHJpbmcoIjIyNS4wLjAuMSIpOwotICogYXNpbzo6aXA6Om11bHRpY2FzdDo6bGVhdmVfZ3JvdXAgb3B0aW9uKG11bHRpY2FzdF9hZGRyZXNzKTsKLSAqIHNvY2tldC5zZXRfb3B0aW9uKG9wdGlvbik7Ci0gKiBAZW5kY29kZQotICoKLSAqIEBwYXIgQ29uY2VwdHM6Ci0gKiBTZXR0YWJsZVNvY2tldE9wdGlvbi4KLSAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIGxlYXZlX2dyb3VwOwotI2Vsc2UKLXR5cGVkZWYgYXNpbzo6aXA6OmRldGFpbDo6c29ja2V0X29wdGlvbjo6bXVsdGljYXN0X3JlcXVlc3Q8Ci0gIEFTSU9fT1NfREVGKElQUFJPVE9fSVApLAotICBBU0lPX09TX0RFRihJUF9EUk9QX01FTUJFUlNISVApLAotICBBU0lPX09TX0RFRihJUFBST1RPX0lQVjYpLAotICBBU0lPX09TX0RFRihJUFY2X0xFQVZFX0dST1VQKT4gbGVhdmVfZ3JvdXA7Ci0jZW5kaWYKLQotLy8vIFNvY2tldCBvcHRpb24gZm9yIGxvY2FsIGludGVyZmFjZSB0byB1c2UgZm9yIG91dGdvaW5nIG11bHRpY2FzdCBwYWNrZXRzLgotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBJUFBST1RPX0lQL0lQX01VTFRJQ0FTVF9JRiBzb2NrZXQgb3B0aW9uLgotICoKLSAqIEBwYXIgRXhhbXBsZXMKLSAqIFNldHRpbmcgdGhlIG9wdGlvbjoKLSAqIEBjb2RlCi0gKiBhc2lvOjppcDo6dWRwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAqIC4uLgotICogYXNpbzo6aXA6OmFkZHJlc3NfdjQgbG9jYWxfaW50ZXJmYWNlID0KLSAqICAgYXNpbzo6aXA6OmFkZHJlc3NfdjQ6OmZyb21fc3RyaW5nKCIxLjIuMy40Iik7Ci0gKiBhc2lvOjppcDo6bXVsdGljYXN0OjpvdXRib3VuZF9pbnRlcmZhY2Ugb3B0aW9uKGxvY2FsX2ludGVyZmFjZSk7Ci0gKiBzb2NrZXQuc2V0X29wdGlvbihvcHRpb24pOwotICogQGVuZGNvZGUKLSAqCi0gKiBAcGFyIENvbmNlcHRzOgotICogU2V0dGFibGVTb2NrZXRPcHRpb24uCi0gKi8KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLXR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBvdXRib3VuZF9pbnRlcmZhY2U7Ci0jZWxzZQotdHlwZWRlZiBhc2lvOjppcDo6ZGV0YWlsOjpzb2NrZXRfb3B0aW9uOjpuZXR3b3JrX2ludGVyZmFjZTwKLSAgQVNJT19PU19ERUYoSVBQUk9UT19JUCksCi0gIEFTSU9fT1NfREVGKElQX01VTFRJQ0FTVF9JRiksCi0gIEFTSU9fT1NfREVGKElQUFJPVE9fSVBWNiksCi0gIEFTSU9fT1NfREVGKElQVjZfTVVMVElDQVNUX0lGKT4gb3V0Ym91bmRfaW50ZXJmYWNlOwotI2VuZGlmCi0KLS8vLyBTb2NrZXQgb3B0aW9uIGZvciB0aW1lLXRvLWxpdmUgYXNzb2NpYXRlZCB3aXRoIG91dGdvaW5nIG11bHRpY2FzdCBwYWNrZXRzLgotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBJUFBST1RPX0lQL0lQX01VTFRJQ0FTVF9UVEwgc29ja2V0IG9wdGlvbi4KLSAqCi0gKiBAcGFyIEV4YW1wbGVzCi0gKiBTZXR0aW5nIHRoZSBvcHRpb246Ci0gKiBAY29kZQotICogYXNpbzo6aXA6OnVkcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsgCi0gKiAuLi4KLSAqIGFzaW86OmlwOjptdWx0aWNhc3Q6OmhvcHMgb3B0aW9uKDQpOwotICogc29ja2V0LnNldF9vcHRpb24ob3B0aW9uKTsKLSAqIEBlbmRjb2RlCi0gKgotICogQHBhcgotICogR2V0dGluZyB0aGUgY3VycmVudCBvcHRpb24gdmFsdWU6Ci0gKiBAY29kZQotICogYXNpbzo6aXA6OnVkcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsgCi0gKiAuLi4KLSAqIGFzaW86OmlwOjptdWx0aWNhc3Q6OmhvcHMgb3B0aW9uOwotICogc29ja2V0LmdldF9vcHRpb24ob3B0aW9uKTsKLSAqIGludCB0dGwgPSBvcHRpb24udmFsdWUoKTsKLSAqIEBlbmRjb2RlCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIEdldHRhYmxlU29ja2V0T3B0aW9uLCBTZXR0YWJsZVNvY2tldE9wdGlvbi4KLSAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIGhvcHM7Ci0jZWxzZQotdHlwZWRlZiBhc2lvOjppcDo6ZGV0YWlsOjpzb2NrZXRfb3B0aW9uOjptdWx0aWNhc3RfaG9wczwKLSAgQVNJT19PU19ERUYoSVBQUk9UT19JUCksCi0gIEFTSU9fT1NfREVGKElQX01VTFRJQ0FTVF9UVEwpLAotICBBU0lPX09TX0RFRihJUFBST1RPX0lQVjYpLAotICBBU0lPX09TX0RFRihJUFY2X01VTFRJQ0FTVF9IT1BTKT4gaG9wczsKLSNlbmRpZgotCi0vLy8gU29ja2V0IG9wdGlvbiBkZXRlcm1pbmluZyB3aGV0aGVyIG91dGdvaW5nIG11bHRpY2FzdCBwYWNrZXRzIHdpbGwgYmUKLS8vLyByZWNlaXZlZCBvbiB0aGUgc2FtZSBzb2NrZXQgaWYgaXQgaXMgYSBtZW1iZXIgb2YgdGhlIG11bHRpY2FzdCBncm91cC4KLS8qKgotICogSW1wbGVtZW50cyB0aGUgSVBQUk9UT19JUC9JUF9NVUxUSUNBU1RfTE9PUCBzb2NrZXQgb3B0aW9uLgotICoKLSAqIEBwYXIgRXhhbXBsZXMKLSAqIFNldHRpbmcgdGhlIG9wdGlvbjoKLSAqIEBjb2RlCi0gKiBhc2lvOjppcDo6dWRwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAqIC4uLgotICogYXNpbzo6aXA6Om11bHRpY2FzdDo6ZW5hYmxlX2xvb3BiYWNrIG9wdGlvbih0cnVlKTsKLSAqIHNvY2tldC5zZXRfb3B0aW9uKG9wdGlvbik7Ci0gKiBAZW5kY29kZQotICoKLSAqIEBwYXIKLSAqIEdldHRpbmcgdGhlIGN1cnJlbnQgb3B0aW9uIHZhbHVlOgotICogQGNvZGUKLSAqIGFzaW86OmlwOjp1ZHA6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICogLi4uCi0gKiBhc2lvOjppcDo6bXVsdGljYXN0OjplbmFibGVfbG9vcGJhY2sgb3B0aW9uOwotICogc29ja2V0LmdldF9vcHRpb24ob3B0aW9uKTsKLSAqIGJvb2wgaXNfc2V0ID0gb3B0aW9uLnZhbHVlKCk7Ci0gKiBAZW5kY29kZQotICoKLSAqIEBwYXIgQ29uY2VwdHM6Ci0gKiBHZXR0YWJsZVNvY2tldE9wdGlvbiwgU2V0dGFibGVTb2NrZXRPcHRpb24uCi0gKi8KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLXR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBlbmFibGVfbG9vcGJhY2s7Ci0jZWxzZQotdHlwZWRlZiBhc2lvOjppcDo6ZGV0YWlsOjpzb2NrZXRfb3B0aW9uOjptdWx0aWNhc3RfZW5hYmxlX2xvb3BiYWNrPAotICBBU0lPX09TX0RFRihJUFBST1RPX0lQKSwKLSAgQVNJT19PU19ERUYoSVBfTVVMVElDQVNUX0xPT1ApLAotICBBU0lPX09TX0RFRihJUFBST1RPX0lQVjYpLAotICBBU0lPX09TX0RFRihJUFY2X01VTFRJQ0FTVF9MT09QKT4gZW5hYmxlX2xvb3BiYWNrOwotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIG11bHRpY2FzdAotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSVBfTVVMVElDQVNUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL3Jlc29sdmVyX3F1ZXJ5X2Jhc2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL3Jlc29sdmVyX3F1ZXJ5X2Jhc2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDFiZGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC9yZXNvbHZlcl9xdWVyeV9iYXNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vLwotLy8gaXAvcmVzb2x2ZXJfcXVlcnlfYmFzZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfUkVTT0xWRVJfUVVFUllfQkFTRV9IUFAKLSNkZWZpbmUgQVNJT19JUF9SRVNPTFZFUl9RVUVSWV9CQVNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgaXAgewotCi0vLy8gVGhlIHJlc29sdmVyX3F1ZXJ5X2Jhc2UgY2xhc3MgaXMgdXNlZCBhcyBhIGJhc2UgZm9yIHRoZQotLy8vIGJhc2ljX3Jlc29sdmVyX3F1ZXJ5IGNsYXNzIHRlbXBsYXRlcyB0byBwcm92aWRlIGEgY29tbW9uIHBsYWNlIHRvIGRlZmluZQotLy8vIHRoZSBmbGFnIGNvbnN0YW50cy4KLWNsYXNzIHJlc29sdmVyX3F1ZXJ5X2Jhc2UKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIEEgYml0bWFzayB0eXBlIChDKysgU3RkIFtsaWIuYml0bWFzay50eXBlc10pLgotICB0eXBlZGVmIHVuc3BlY2lmaWVkIGZsYWdzOwotCi0gIC8vLyBEZXRlcm1pbmUgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBob3N0IHNwZWNpZmllZCBpbiB0aGUgcXVlcnkuCi0gIHN0YXRpYyBjb25zdCBmbGFncyBjYW5vbmljYWxfbmFtZSA9IGltcGxlbWVudGF0aW9uX2RlZmluZWQ7Ci0KLSAgLy8vIEluZGljYXRlIHRoYXQgcmV0dXJuZWQgZW5kcG9pbnQgaXMgaW50ZW5kZWQgZm9yIHVzZSBhcyBhIGxvY2FsbHkgYm91bmQKLSAgLy8vIHNvY2tldCBlbmRwb2ludC4KLSAgc3RhdGljIGNvbnN0IGZsYWdzIHBhc3NpdmUgPSBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkOwotCi0gIC8vLyBIb3N0IG5hbWUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBudW1lcmljIHN0cmluZyBkZWZpbmluZyBhbiBJUHY0IG9yIElQdjYKLSAgLy8vIGFkZHJlc3MgYW5kIG5vIG5hbWUgcmVzb2x1dGlvbiBzaG91bGQgYmUgYXR0ZW1wdGVkLgotICBzdGF0aWMgY29uc3QgZmxhZ3MgbnVtZXJpY19ob3N0ID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZDsKLQotICAvLy8gU2VydmljZSBuYW1lIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgbnVtZXJpYyBzdHJpbmcgZGVmaW5pbmcgYSBwb3J0IG51bWJlcgotICAvLy8gYW5kIG5vIG5hbWUgcmVzb2x1dGlvbiBzaG91bGQgYmUgYXR0ZW1wdGVkLgotICBzdGF0aWMgY29uc3QgZmxhZ3MgbnVtZXJpY19zZXJ2aWNlID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZDsKLQotICAvLy8gSWYgdGhlIHF1ZXJ5IHByb3RvY29sIGZhbWlseSBpcyBzcGVjaWZpZWQgYXMgSVB2NiwgcmV0dXJuIElQdjQtbWFwcGVkCi0gIC8vLyBJUHY2IGFkZHJlc3NlcyBvbiBmaW5kaW5nIG5vIElQdjYgYWRkcmVzc2VzLgotICBzdGF0aWMgY29uc3QgZmxhZ3MgdjRfbWFwcGVkID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZDsKLQotICAvLy8gSWYgdXNlZCB3aXRoIHY0X21hcHBlZCwgcmV0dXJuIGFsbCBtYXRjaGluZyBJUHY2IGFuZCBJUHY0IGFkZHJlc3Nlcy4KLSAgc3RhdGljIGNvbnN0IGZsYWdzIGFsbF9tYXRjaGluZyA9IGltcGxlbWVudGF0aW9uX2RlZmluZWQ7Ci0KLSAgLy8vIE9ubHkgcmV0dXJuIElQdjQgYWRkcmVzc2VzIGlmIGEgbm9uLWxvb3BiYWNrIElQdjQgYWRkcmVzcyBpcyBjb25maWd1cmVkCi0gIC8vLyBmb3IgdGhlIHN5c3RlbS4gT25seSByZXR1cm4gSVB2NiBhZGRyZXNzZXMgaWYgYSBub24tbG9vcGJhY2sgSVB2NiBhZGRyZXNzCi0gIC8vLyBpcyBjb25maWd1cmVkIGZvciB0aGUgc3lzdGVtLgotICBzdGF0aWMgY29uc3QgZmxhZ3MgYWRkcmVzc19jb25maWd1cmVkID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZDsKLSNlbHNlCi0gIGVudW0gZmxhZ3MKLSAgewotICAgIGNhbm9uaWNhbF9uYW1lID0gQVNJT19PU19ERUYoQUlfQ0FOT05OQU1FKSwKLSAgICBwYXNzaXZlID0gQVNJT19PU19ERUYoQUlfUEFTU0lWRSksCi0gICAgbnVtZXJpY19ob3N0ID0gQVNJT19PU19ERUYoQUlfTlVNRVJJQ0hPU1QpLAotICAgIG51bWVyaWNfc2VydmljZSA9IEFTSU9fT1NfREVGKEFJX05VTUVSSUNTRVJWKSwKLSAgICB2NF9tYXBwZWQgPSBBU0lPX09TX0RFRihBSV9WNE1BUFBFRCksCi0gICAgYWxsX21hdGNoaW5nID0gQVNJT19PU19ERUYoQUlfQUxMKSwKLSAgICBhZGRyZXNzX2NvbmZpZ3VyZWQgPSBBU0lPX09TX0RFRihBSV9BRERSQ09ORklHKQotICB9OwotCi0gIC8vIEltcGxlbWVudCBiaXRtYXNrIG9wZXJhdGlvbnMgYXMgc2hvd24gaW4gQysrIFN0ZCBbbGliLmJpdG1hc2sudHlwZXNdLgotCi0gIGZyaWVuZCBmbGFncyBvcGVyYXRvciYoZmxhZ3MgeCwgZmxhZ3MgeSkKLSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbGFncz4oCi0gICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oeCkgJiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHkpKTsKLSAgfQotCi0gIGZyaWVuZCBmbGFncyBvcGVyYXRvcnwoZmxhZ3MgeCwgZmxhZ3MgeSkKLSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbGFncz4oCi0gICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oeCkgfCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHkpKTsKLSAgfQotCi0gIGZyaWVuZCBmbGFncyBvcGVyYXRvcl4oZmxhZ3MgeCwgZmxhZ3MgeSkKLSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbGFncz4oCi0gICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oeCkgXiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHkpKTsKLSAgfQotCi0gIGZyaWVuZCBmbGFncyBvcGVyYXRvcn4oZmxhZ3MgeCkKLSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbGFncz4ofnN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oeCkpOwotICB9Ci0KLSAgZnJpZW5kIGZsYWdzJiBvcGVyYXRvciY9KGZsYWdzJiB4LCBmbGFncyB5KQotICB7Ci0gICAgeCA9IHggJiB5OwotICAgIHJldHVybiB4OwotICB9Ci0KLSAgZnJpZW5kIGZsYWdzJiBvcGVyYXRvcnw9KGZsYWdzJiB4LCBmbGFncyB5KQotICB7Ci0gICAgeCA9IHggfCB5OwotICAgIHJldHVybiB4OwotICB9Ci0KLSAgZnJpZW5kIGZsYWdzJiBvcGVyYXRvcl49KGZsYWdzJiB4LCBmbGFncyB5KQotICB7Ci0gICAgeCA9IHggXiB5OwotICAgIHJldHVybiB4OwotICB9Ci0jZW5kaWYKLQotcHJvdGVjdGVkOgotICAvLy8gUHJvdGVjdGVkIGRlc3RydWN0b3IgdG8gcHJldmVudCBkZWxldGlvbiB0aHJvdWdoIHRoaXMgdHlwZS4KLSAgfnJlc29sdmVyX3F1ZXJ5X2Jhc2UoKQotICB7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGlwCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0lQX1JFU09MVkVSX1FVRVJZX0JBU0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvcmVzb2x2ZXJfc2VydmljZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvcmVzb2x2ZXJfc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMGI2YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL3Jlc29sdmVyX3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vCi0vLyBpcC9yZXNvbHZlcl9zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JUF9SRVNPTFZFUl9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX0lQX1JFU09MVkVSX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3JfY29kZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyX3F1ZXJ5LmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3dpbnJ0X3Jlc29sdmVyX3NlcnZpY2UuaHBwIgotI2Vsc2UKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVzb2x2ZXJfc2VydmljZS5ocHAiCi0jZW5kaWYKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBpcCB7Ci0KLS8vLyBEZWZhdWx0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gZm9yIGEgcmVzb2x2ZXIuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZXJuZXRQcm90b2NvbD4KLWNsYXNzIHJlc29sdmVyX3NlcnZpY2UKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgOiBwdWJsaWMgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZQotI2Vsc2UKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8Ci0gICAgICByZXNvbHZlcl9zZXJ2aWNlPEludGVybmV0UHJvdG9jb2w+ID4KLSNlbmRpZgotewotcHVibGljOgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gVGhlIHVuaXF1ZSBzZXJ2aWNlIGlkZW50aWZpZXIuCi0gIHN0YXRpYyBhc2lvOjppb19zZXJ2aWNlOjppZCBpZDsKLSNlbmRpZgotCi0gIC8vLyBUaGUgcHJvdG9jb2wgdHlwZS4KLSAgdHlwZWRlZiBJbnRlcm5ldFByb3RvY29sIHByb3RvY29sX3R5cGU7Ci0KLSAgLy8vIFRoZSBlbmRwb2ludCB0eXBlLgotICB0eXBlZGVmIHR5cGVuYW1lIEludGVybmV0UHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLSAgLy8vIFRoZSBxdWVyeSB0eXBlLgotICB0eXBlZGVmIGJhc2ljX3Jlc29sdmVyX3F1ZXJ5PEludGVybmV0UHJvdG9jb2w+IHF1ZXJ5X3R5cGU7Ci0KLSAgLy8vIFRoZSBpdGVyYXRvciB0eXBlLgotICB0eXBlZGVmIGJhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yPEludGVybmV0UHJvdG9jb2w+IGl0ZXJhdG9yX3R5cGU7Ci0KLXByaXZhdGU6Ci0gIC8vIFRoZSB0eXBlIG9mIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6d2lucnRfcmVzb2x2ZXJfc2VydmljZTxJbnRlcm5ldFByb3RvY29sPgotICAgIHNlcnZpY2VfaW1wbF90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBhc2lvOjpkZXRhaWw6OnJlc29sdmVyX3NlcnZpY2U8SW50ZXJuZXRQcm90b2NvbD4KLSAgICBzZXJ2aWNlX2ltcGxfdHlwZTsKLSNlbmRpZgotCi1wdWJsaWM6Ci0gIC8vLyBUaGUgdHlwZSBvZiBhIHJlc29sdmVyIGltcGxlbWVudGF0aW9uLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgdHlwZW5hbWUgc2VydmljZV9pbXBsX3R5cGU6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgcmVzb2x2ZXIgc2VydmljZSBmb3IgdGhlIHNwZWNpZmllZCBpb19zZXJ2aWNlLgotICBleHBsaWNpdCByZXNvbHZlcl9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTwKLSAgICAgICAgcmVzb2x2ZXJfc2VydmljZTxJbnRlcm5ldFByb3RvY29sPiA+KGlvX3NlcnZpY2UpLAotICAgICAgc2VydmljZV9pbXBsXyhpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgbmV3IHJlc29sdmVyIGltcGxlbWVudGF0aW9uLgotICB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5jb25zdHJ1Y3QoaW1wbCk7Ci0gIH0KLQotICAvLy8gRGVzdHJveSBhIHJlc29sdmVyIGltcGxlbWVudGF0aW9uLgotICB2b2lkIGRlc3Ryb3koaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8uZGVzdHJveShpbXBsKTsKLSAgfQotCi0gIC8vLyBDYW5jZWwgcGVuZGluZyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KLSAgdm9pZCBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8uY2FuY2VsKGltcGwpOwotICB9Ci0KLSAgLy8vIFJlc29sdmUgYSBxdWVyeSB0byBhIGxpc3Qgb2YgZW50cmllcy4KLSAgaXRlcmF0b3JfdHlwZSByZXNvbHZlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGNvbnN0IHF1ZXJ5X3R5cGUmIHF1ZXJ5LAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5yZXNvbHZlKGltcGwsIHF1ZXJ5LCBlYyk7Ci0gIH0KLQotICAvLy8gQXN5bmNocm9ub3VzbHkgcmVzb2x2ZSBhIHF1ZXJ5IHRvIGEgbGlzdCBvZiBlbnRyaWVzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzb2x2ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlc29sdmVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgaXRlcmF0b3JfdHlwZSkpCi0gIGFzeW5jX3Jlc29sdmUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgY29uc3QgcXVlcnlfdHlwZSYgcXVlcnksCi0gICAgICBBU0lPX01PVkVfQVJHKFJlc29sdmVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFJlc29sdmVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBpdGVyYXRvcl90eXBlKT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoUmVzb2x2ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICAgIHNlcnZpY2VfaW1wbF8uYXN5bmNfcmVzb2x2ZShpbXBsLCBxdWVyeSwgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBSZXNvbHZlIGFuIGVuZHBvaW50IHRvIGEgbGlzdCBvZiBlbnRyaWVzLgotICBpdGVyYXRvcl90eXBlIHJlc29sdmUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIGVuZHBvaW50LCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnJlc29sdmUoaW1wbCwgZW5kcG9pbnQsIGVjKTsKLSAgfQotCi0gIC8vLyBBc3luY2hyb25vdXNseSByZXNvbHZlIGFuIGVuZHBvaW50IHRvIGEgbGlzdCBvZiBlbnRyaWVzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzb2x2ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlc29sdmVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgaXRlcmF0b3JfdHlwZSkpCi0gIGFzeW5jX3Jlc29sdmUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgY29uc3QgZW5kcG9pbnRfdHlwZSYgZW5kcG9pbnQsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlc29sdmVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFJlc29sdmVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBpdGVyYXRvcl90eXBlKT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoUmVzb2x2ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICAgIHNlcnZpY2VfaW1wbF8uYXN5bmNfcmVzb2x2ZShpbXBsLCBlbmRwb2ludCwgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICB2b2lkIHNodXRkb3duX3NlcnZpY2UoKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5zaHV0ZG93bl9zZXJ2aWNlKCk7Ci0gIH0KLQotICAvLyBQZXJmb3JtIGFueSBmb3JrLXJlbGF0ZWQgaG91c2VrZWVwaW5nLgotICB2b2lkIGZvcmtfc2VydmljZShhc2lvOjppb19zZXJ2aWNlOjpmb3JrX2V2ZW50IGV2ZW50KQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5mb3JrX3NlcnZpY2UoZXZlbnQpOwotICB9Ci0KLSAgLy8gVGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotICBzZXJ2aWNlX2ltcGxfdHlwZSBzZXJ2aWNlX2ltcGxfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSVBfUkVTT0xWRVJfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC90Y3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL3RjcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMDA5ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL3RjcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8KLS8vIGlwL3RjcC5ocHAKLS8vIH5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JUF9UQ1BfSFBQCi0jZGVmaW5lIEFTSU9fSVBfVENQX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc29ja2V0X2FjY2VwdG9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3NvY2tldF9pb3N0cmVhbS5ocHAiCi0jaW5jbHVkZSAiYXNpby9iYXNpY19zdHJlYW1fc29ja2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfb3B0aW9uLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfZW5kcG9pbnQuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfcmVzb2x2ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfaXRlcmF0b3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaXAvYmFzaWNfcmVzb2x2ZXJfcXVlcnkuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGlwIHsKLQotLy8vIEVuY2Fwc3VsYXRlcyB0aGUgZmxhZ3MgbmVlZGVkIGZvciBUQ1AuCi0vKioKLSAqIFRoZSBhc2lvOjppcDo6dGNwIGNsYXNzIGNvbnRhaW5zIGZsYWdzIG5lY2Vzc2FyeSBmb3IgVENQIHNvY2tldHMuCi0gKgotICogQHBhciBUaHJlYWQgU2FmZXR5Ci0gKiBAZSBEaXN0aW5jdCBAZSBvYmplY3RzOiBTYWZlLkBuCi0gKiBAZSBTaGFyZWQgQGUgb2JqZWN0czogU2FmZS4KLSAqCi0gKiBAcGFyIENvbmNlcHRzOgotICogUHJvdG9jb2wsIEludGVybmV0UHJvdG9jb2wuCi0gKi8KLWNsYXNzIHRjcAotewotcHVibGljOgotICAvLy8gVGhlIHR5cGUgb2YgYSBUQ1AgZW5kcG9pbnQuCi0gIHR5cGVkZWYgYmFzaWNfZW5kcG9pbnQ8dGNwPiBlbmRwb2ludDsKLQotICAvLy8gQ29uc3RydWN0IHRvIHJlcHJlc2VudCB0aGUgSVB2NCBUQ1AgcHJvdG9jb2wuCi0gIHN0YXRpYyB0Y3AgdjQoKQotICB7Ci0gICAgcmV0dXJuIHRjcChBU0lPX09TX0RFRihBRl9JTkVUKSk7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IHRvIHJlcHJlc2VudCB0aGUgSVB2NiBUQ1AgcHJvdG9jb2wuCi0gIHN0YXRpYyB0Y3AgdjYoKQotICB7Ci0gICAgcmV0dXJuIHRjcChBU0lPX09TX0RFRihBRl9JTkVUNikpOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiB0aGUgcHJvdG9jb2wuCi0gIGludCB0eXBlKCkgY29uc3QKLSAgewotICAgIHJldHVybiBBU0lPX09TX0RFRihTT0NLX1NUUkVBTSk7Ci0gIH0KLQotICAvLy8gT2J0YWluIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm90b2NvbC4KLSAgaW50IHByb3RvY29sKCkgY29uc3QKLSAgewotICAgIHJldHVybiBBU0lPX09TX0RFRihJUFBST1RPX1RDUCk7Ci0gIH0KLQotICAvLy8gT2J0YWluIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm90b2NvbCBmYW1pbHkuCi0gIGludCBmYW1pbHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGZhbWlseV87Ci0gIH0KLQotICAvLy8gVGhlIFRDUCBzb2NrZXQgdHlwZS4KLSAgdHlwZWRlZiBiYXNpY19zdHJlYW1fc29ja2V0PHRjcD4gc29ja2V0OwotCi0gIC8vLyBUaGUgVENQIGFjY2VwdG9yIHR5cGUuCi0gIHR5cGVkZWYgYmFzaWNfc29ja2V0X2FjY2VwdG9yPHRjcD4gYWNjZXB0b3I7Ci0KLSAgLy8vIFRoZSBUQ1AgcmVzb2x2ZXIgdHlwZS4KLSAgdHlwZWRlZiBiYXNpY19yZXNvbHZlcjx0Y3A+IHJlc29sdmVyOwotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLSAgLy8vIFRoZSBUQ1AgaW9zdHJlYW0gdHlwZS4KLSAgdHlwZWRlZiBiYXNpY19zb2NrZXRfaW9zdHJlYW08dGNwPiBpb3N0cmVhbTsKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0gIC8vLyBTb2NrZXQgb3B0aW9uIGZvciBkaXNhYmxpbmcgdGhlIE5hZ2xlIGFsZ29yaXRobS4KLSAgLyoqCi0gICAqIEltcGxlbWVudHMgdGhlIElQUFJPVE9fVENQL1RDUF9OT0RFTEFZIHNvY2tldCBvcHRpb24uCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZXMKLSAgICogU2V0dGluZyB0aGUgb3B0aW9uOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAgICogLi4uCi0gICAqIGFzaW86OmlwOjp0Y3A6Om5vX2RlbGF5IG9wdGlvbih0cnVlKTsKLSAgICogc29ja2V0LnNldF9vcHRpb24ob3B0aW9uKTsKLSAgICogQGVuZGNvZGUKLSAgICoKLSAgICogQHBhcgotICAgKiBHZXR0aW5nIHRoZSBjdXJyZW50IG9wdGlvbiB2YWx1ZToKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsgCi0gICAqIC4uLgotICAgKiBhc2lvOjppcDo6dGNwOjpub19kZWxheSBvcHRpb247Ci0gICAqIHNvY2tldC5nZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIGJvb2wgaXNfc2V0ID0gb3B0aW9uLnZhbHVlKCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIgQ29uY2VwdHM6Ci0gICAqIFNvY2tldF9PcHRpb24sIEJvb2xlYW5fU29ja2V0X09wdGlvbi4KLSAgICovCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBub19kZWxheTsKLSNlbHNlCi0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3B0aW9uOjpib29sZWFuPAotICAgIEFTSU9fT1NfREVGKElQUFJPVE9fVENQKSwgQVNJT19PU19ERUYoVENQX05PREVMQVkpPiBub19kZWxheTsKLSNlbmRpZgotCi0gIC8vLyBDb21wYXJlIHR3byBwcm90b2NvbHMgZm9yIGVxdWFsaXR5LgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHRjcCYgcDEsIGNvbnN0IHRjcCYgcDIpCi0gIHsKLSAgICByZXR1cm4gcDEuZmFtaWx5XyA9PSBwMi5mYW1pbHlfOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgdHdvIHByb3RvY29scyBmb3IgaW5lcXVhbGl0eS4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCB0Y3AmIHAxLCBjb25zdCB0Y3AmIHAyKQotICB7Ci0gICAgcmV0dXJuIHAxLmZhbWlseV8gIT0gcDIuZmFtaWx5XzsKLSAgfQotCi1wcml2YXRlOgotICAvLyBDb25zdHJ1Y3Qgd2l0aCBhIHNwZWNpZmljIGZhbWlseS4KLSAgZXhwbGljaXQgdGNwKGludCBwcm90b2NvbF9mYW1pbHkpCi0gICAgOiBmYW1pbHlfKHByb3RvY29sX2ZhbWlseSkKLSAgewotICB9Ci0KLSAgaW50IGZhbWlseV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBpcAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19JUF9UQ1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvdWRwLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC91ZHAuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWMzZjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC91ZHAuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vCi0vLyBpcC91ZHAuaHBwCi0vLyB+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfVURQX0hQUAotI2RlZmluZSBBU0lPX0lQX1VEUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Jhc2ljX2RhdGFncmFtX3NvY2tldC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2Jhc2ljX2VuZHBvaW50LmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyX2l0ZXJhdG9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lwL2Jhc2ljX3Jlc29sdmVyX3F1ZXJ5LmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBpcCB7Ci0KLS8vLyBFbmNhcHN1bGF0ZXMgdGhlIGZsYWdzIG5lZWRlZCBmb3IgVURQLgotLyoqCi0gKiBUaGUgYXNpbzo6aXA6OnVkcCBjbGFzcyBjb250YWlucyBmbGFncyBuZWNlc3NhcnkgZm9yIFVEUCBzb2NrZXRzLgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFNhZmUuCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIFByb3RvY29sLCBJbnRlcm5ldFByb3RvY29sLgotICovCi1jbGFzcyB1ZHAKLXsKLXB1YmxpYzoKLSAgLy8vIFRoZSB0eXBlIG9mIGEgVURQIGVuZHBvaW50LgotICB0eXBlZGVmIGJhc2ljX2VuZHBvaW50PHVkcD4gZW5kcG9pbnQ7Ci0KLSAgLy8vIENvbnN0cnVjdCB0byByZXByZXNlbnQgdGhlIElQdjQgVURQIHByb3RvY29sLgotICBzdGF0aWMgdWRwIHY0KCkKLSAgewotICAgIHJldHVybiB1ZHAoQVNJT19PU19ERUYoQUZfSU5FVCkpOwotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCB0byByZXByZXNlbnQgdGhlIElQdjYgVURQIHByb3RvY29sLgotICBzdGF0aWMgdWRwIHY2KCkKLSAgewotICAgIHJldHVybiB1ZHAoQVNJT19PU19ERUYoQUZfSU5FVDYpKTsKLSAgfQotCi0gIC8vLyBPYnRhaW4gYW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgdGhlIHByb3RvY29sLgotICBpbnQgdHlwZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gQVNJT19PU19ERUYoU09DS19ER1JBTSk7Ci0gIH0KLQotICAvLy8gT2J0YWluIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm90b2NvbC4KLSAgaW50IHByb3RvY29sKCkgY29uc3QKLSAgewotICAgIHJldHVybiBBU0lPX09TX0RFRihJUFBST1RPX1VEUCk7Ci0gIH0KLQotICAvLy8gT2J0YWluIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm90b2NvbCBmYW1pbHkuCi0gIGludCBmYW1pbHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGZhbWlseV87Ci0gIH0KLQotICAvLy8gVGhlIFVEUCBzb2NrZXQgdHlwZS4KLSAgdHlwZWRlZiBiYXNpY19kYXRhZ3JhbV9zb2NrZXQ8dWRwPiBzb2NrZXQ7Ci0KLSAgLy8vIFRoZSBVRFAgcmVzb2x2ZXIgdHlwZS4KLSAgdHlwZWRlZiBiYXNpY19yZXNvbHZlcjx1ZHA+IHJlc29sdmVyOwotCi0gIC8vLyBDb21wYXJlIHR3byBwcm90b2NvbHMgZm9yIGVxdWFsaXR5LgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHVkcCYgcDEsIGNvbnN0IHVkcCYgcDIpCi0gIHsKLSAgICByZXR1cm4gcDEuZmFtaWx5XyA9PSBwMi5mYW1pbHlfOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgdHdvIHByb3RvY29scyBmb3IgaW5lcXVhbGl0eS4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCB1ZHAmIHAxLCBjb25zdCB1ZHAmIHAyKQotICB7Ci0gICAgcmV0dXJuIHAxLmZhbWlseV8gIT0gcDIuZmFtaWx5XzsKLSAgfQotCi1wcml2YXRlOgotICAvLyBDb25zdHJ1Y3Qgd2l0aCBhIHNwZWNpZmljIGZhbWlseS4KLSAgZXhwbGljaXQgdWRwKGludCBwcm90b2NvbF9mYW1pbHkpCi0gICAgOiBmYW1pbHlfKHByb3RvY29sX2ZhbWlseSkKLSAgewotICB9Ci0KLSAgaW50IGZhbWlseV87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBpcAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19JUF9VRFBfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvdW5pY2FzdC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvdW5pY2FzdC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwN2QxMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lwL3VuaWNhc3QuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8KLS8vIGlwL3VuaWNhc3QuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lQX1VOSUNBU1RfSFBQCi0jZGVmaW5lIEFTSU9fSVBfVU5JQ0FTVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgImFzaW8vaXAvZGV0YWlsL3NvY2tldF9vcHRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGlwIHsKLW5hbWVzcGFjZSB1bmljYXN0IHsKLQotLy8vIFNvY2tldCBvcHRpb24gZm9yIHRpbWUtdG8tbGl2ZSBhc3NvY2lhdGVkIHdpdGggb3V0Z29pbmcgdW5pY2FzdCBwYWNrZXRzLgotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBJUFBST1RPX0lQL0lQX1VOSUNBU1RfVFRMIHNvY2tldCBvcHRpb24uCi0gKgotICogQHBhciBFeGFtcGxlcwotICogU2V0dGluZyB0aGUgb3B0aW9uOgotICogQGNvZGUKLSAqIGFzaW86OmlwOjp1ZHA6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICogLi4uCi0gKiBhc2lvOjppcDo6dW5pY2FzdDo6aG9wcyBvcHRpb24oNCk7Ci0gKiBzb2NrZXQuc2V0X29wdGlvbihvcHRpb24pOwotICogQGVuZGNvZGUKLSAqCi0gKiBAcGFyCi0gKiBHZXR0aW5nIHRoZSBjdXJyZW50IG9wdGlvbiB2YWx1ZToKLSAqIEBjb2RlCi0gKiBhc2lvOjppcDo6dWRwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAqIC4uLgotICogYXNpbzo6aXA6OnVuaWNhc3Q6OmhvcHMgb3B0aW9uOwotICogc29ja2V0LmdldF9vcHRpb24ob3B0aW9uKTsKLSAqIGludCB0dGwgPSBvcHRpb24udmFsdWUoKTsKLSAqIEBlbmRjb2RlCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIEdldHRhYmxlU29ja2V0T3B0aW9uLCBTZXR0YWJsZVNvY2tldE9wdGlvbi4KLSAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIGhvcHM7Ci0jZWxzZQotdHlwZWRlZiBhc2lvOjppcDo6ZGV0YWlsOjpzb2NrZXRfb3B0aW9uOjp1bmljYXN0X2hvcHM8Ci0gIEFTSU9fT1NfREVGKElQUFJPVE9fSVApLAotICBBU0lPX09TX0RFRihJUF9UVEwpLAotICBBU0lPX09TX0RFRihJUFBST1RPX0lQVjYpLAotICBBU0lPX09TX0RFRihJUFY2X1VOSUNBU1RfSE9QUyk+IGhvcHM7Ci0jZW5kaWYKLQotfSAvLyBuYW1lc3BhY2UgdW5pY2FzdAotfSAvLyBuYW1lc3BhY2UgaXAKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSVBfVU5JQ0FTVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC92Nl9vbmx5LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pcC92Nl9vbmx5LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1MTA5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXAvdjZfb25seS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLwotLy8gaXAvdjZfb25seS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fSVBfVjZfT05MWV9IUFAKLSNkZWZpbmUgQVNJT19JUF9WNl9PTkxZX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHRpb24uaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGlwIHsKLQotLy8vIFNvY2tldCBvcHRpb24gZm9yIGRldGVybWluaW5nIHdoZXRoZXIgYW4gSVB2NiBzb2NrZXQgc3VwcG9ydHMgSVB2NgotLy8vIGNvbW11bmljYXRpb24gb25seS4KLS8qKgotICogSW1wbGVtZW50cyB0aGUgSVBQUk9UT19JUFY2L0lQX1Y2T05MWSBzb2NrZXQgb3B0aW9uLgotICoKLSAqIEBwYXIgRXhhbXBsZXMKLSAqIFNldHRpbmcgdGhlIG9wdGlvbjoKLSAqIEBjb2RlCi0gKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAqIC4uLgotICogYXNpbzo6aXA6OnY2X29ubHkgb3B0aW9uKHRydWUpOwotICogc29ja2V0LnNldF9vcHRpb24ob3B0aW9uKTsKLSAqIEBlbmRjb2RlCi0gKgotICogQHBhcgotICogR2V0dGluZyB0aGUgY3VycmVudCBvcHRpb24gdmFsdWU6Ci0gKiBAY29kZQotICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsgCi0gKiAuLi4KLSAqIGFzaW86OmlwOjp2Nl9vbmx5IG9wdGlvbjsKLSAqIHNvY2tldC5nZXRfb3B0aW9uKG9wdGlvbik7Ci0gKiBib29sIHY2X29ubHkgPSBvcHRpb24udmFsdWUoKTsKLSAqIEBlbmRjb2RlCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIEdldHRhYmxlU29ja2V0T3B0aW9uLCBTZXR0YWJsZVNvY2tldE9wdGlvbi4KLSAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIHY2X29ubHk7Ci0jZWxpZiBkZWZpbmVkKElQVjZfVjZPTkxZKQotdHlwZWRlZiBhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHRpb246OmJvb2xlYW48Ci0gICAgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWT4gdjZfb25seTsKLSNlbHNlCi10eXBlZGVmIGFzaW86OmRldGFpbDo6c29ja2V0X29wdGlvbjo6Ym9vbGVhbjwKLSAgICBhc2lvOjpkZXRhaWw6OmN1c3RvbV9zb2NrZXRfb3B0aW9uX2xldmVsLAotICAgIGFzaW86OmRldGFpbDo6YWx3YXlzX2ZhaWxfb3B0aW9uPiB2Nl9vbmx5OwotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIGlwCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0lQX1Y2X09OTFlfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXNfcmVhZF9idWZmZXJlZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXNfcmVhZF9idWZmZXJlZC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmY2ZhOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2lzX3JlYWRfYnVmZmVyZWQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8KLS8vIGlzX3JlYWRfYnVmZmVyZWQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0lTX1JFQURfQlVGRkVSRURfSFBQCi0jZGVmaW5lIEFTSU9fSVNfUkVBRF9CVUZGRVJFRF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2J1ZmZlcmVkX3JlYWRfc3RyZWFtX2Z3ZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9idWZmZXJlZF9zdHJlYW1fZndkLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0+Ci1jaGFyIGlzX3JlYWRfYnVmZmVyZWRfaGVscGVyKGJ1ZmZlcmVkX3N0cmVhbTxTdHJlYW0+KiBzKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLWNoYXIgaXNfcmVhZF9idWZmZXJlZF9oZWxwZXIoYnVmZmVyZWRfcmVhZF9zdHJlYW08U3RyZWFtPiogcyk7Ci0KLXN0cnVjdCBpc19yZWFkX2J1ZmZlcmVkX2JpZ190eXBlIHsgY2hhciBkYXRhWzEwXTsgfTsKLWlzX3JlYWRfYnVmZmVyZWRfYmlnX3R5cGUgaXNfcmVhZF9idWZmZXJlZF9oZWxwZXIoLi4uKTsKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi0KLS8vLyBUaGUgaXNfcmVhZF9idWZmZXJlZCBjbGFzcyBpcyBhIHRyYWl0cyBjbGFzcyB0aGF0IG1heSBiZSB1c2VkIHRvIGRldGVybWluZQotLy8vIHdoZXRoZXIgYSBzdHJlYW0gdHlwZSBzdXBwb3J0cyBidWZmZXJpbmcgb2YgcmVhZCBkYXRhLgotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLWNsYXNzIGlzX3JlYWRfYnVmZmVyZWQKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB2YWx1ZSBtZW1iZXIgaXMgdHJ1ZSBvbmx5IGlmIHRoZSBTdHJlYW0gdHlwZSBzdXBwb3J0cyBidWZmZXJpbmcgb2YKLSAgLy8vIHJlYWQgZGF0YS4KLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWU7Ci0jZWxzZQotICBBU0lPX1NUQVRJQ19DT05TVEFOVChib29sLAotICAgICAgdmFsdWUgPSBzaXplb2YoZGV0YWlsOjppc19yZWFkX2J1ZmZlcmVkX2hlbHBlcigoU3RyZWFtKikwKSkgPT0gMSk7Ci0jZW5kaWYKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fSVNfUkVBRF9CVUZGRVJFRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pc193cml0ZV9idWZmZXJlZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vaXNfd3JpdGVfYnVmZmVyZWQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjcxYjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9pc193cml0ZV9idWZmZXJlZC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLwotLy8gaXNfd3JpdGVfYnVmZmVyZWQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19JU19XUklURV9CVUZGRVJFRF9IUFAKLSNkZWZpbmUgQVNJT19JU19XUklURV9CVUZGRVJFRF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2J1ZmZlcmVkX3N0cmVhbV9md2QuaHBwIgotI2luY2x1ZGUgImFzaW8vYnVmZmVyZWRfd3JpdGVfc3RyZWFtX2Z3ZC5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLW5hbWVzcGFjZSBkZXRhaWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotY2hhciBpc193cml0ZV9idWZmZXJlZF9oZWxwZXIoYnVmZmVyZWRfc3RyZWFtPFN0cmVhbT4qIHMpOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotY2hhciBpc193cml0ZV9idWZmZXJlZF9oZWxwZXIoYnVmZmVyZWRfd3JpdGVfc3RyZWFtPFN0cmVhbT4qIHMpOwotCi1zdHJ1Y3QgaXNfd3JpdGVfYnVmZmVyZWRfYmlnX3R5cGUgeyBjaGFyIGRhdGFbMTBdOyB9OwotaXNfd3JpdGVfYnVmZmVyZWRfYmlnX3R5cGUgaXNfd3JpdGVfYnVmZmVyZWRfaGVscGVyKC4uLik7Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi0vLy8gVGhlIGlzX3dyaXRlX2J1ZmZlcmVkIGNsYXNzIGlzIGEgdHJhaXRzIGNsYXNzIHRoYXQgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lCi0vLy8gd2hldGhlciBhIHN0cmVhbSB0eXBlIHN1cHBvcnRzIGJ1ZmZlcmluZyBvZiB3cml0dGVuIGRhdGEuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotY2xhc3MgaXNfd3JpdGVfYnVmZmVyZWQKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB2YWx1ZSBtZW1iZXIgaXMgdHJ1ZSBvbmx5IGlmIHRoZSBTdHJlYW0gdHlwZSBzdXBwb3J0cyBidWZmZXJpbmcgb2YKLSAgLy8vIHdyaXR0ZW4gZGF0YS4KLSAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWU7Ci0jZWxzZQotICBBU0lPX1NUQVRJQ19DT05TVEFOVChib29sLAotICAgICAgdmFsdWUgPSBzaXplb2YoZGV0YWlsOjppc193cml0ZV9idWZmZXJlZF9oZWxwZXIoKFN0cmVhbSopMCkpID09IDEpOwotI2VuZGlmCi19OwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX0lTX1dSSVRFX0JVRkZFUkVEX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2xvY2FsL2Jhc2ljX2VuZHBvaW50LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9sb2NhbC9iYXNpY19lbmRwb2ludC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMTlhYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2xvY2FsL2Jhc2ljX2VuZHBvaW50LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vLwotLy8gbG9jYWwvYmFzaWNfZW5kcG9pbnQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vIERlcml2ZWQgZnJvbSBhIHB1YmxpYyBkb21haW4gaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSBEYW5pZWwgQ2FzaW1pcm8uCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fTE9DQUxfQkFTSUNfRU5EUE9JTlRfSFBQCi0jZGVmaW5lIEFTSU9fTE9DQUxfQkFTSUNfRU5EUE9JTlRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0xPQ0FMX1NPQ0tFVFMpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNpbmNsdWRlICJhc2lvL2xvY2FsL2RldGFpbC9lbmRwb2ludC5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotIyBpbmNsdWRlIDxpb3Nmd2Q+Ci0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBsb2NhbCB7Ci0KLS8vLyBEZXNjcmliZXMgYW4gZW5kcG9pbnQgZm9yIGEgVU5JWCBzb2NrZXQuCi0vKioKLSAqIFRoZSBhc2lvOjpsb2NhbDo6YmFzaWNfZW5kcG9pbnQgY2xhc3MgdGVtcGxhdGUgZGVzY3JpYmVzIGFuIGVuZHBvaW50Ci0gKiB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIFVOSVggc29ja2V0LgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqCi0gKiBAcGFyIENvbmNlcHRzOgotICogRW5kcG9pbnQuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLWNsYXNzIGJhc2ljX2VuZHBvaW50Ci17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgcHJvdG9jb2wgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LgotICB0eXBlZGVmIFByb3RvY29sIHByb3RvY29sX3R5cGU7Ci0KLSAgLy8vIFRoZSB0eXBlIG9mIHRoZSBlbmRwb2ludCBzdHJ1Y3R1cmUuIFRoaXMgdHlwZSBpcyBkZXBlbmRlbnQgb24gdGhlCi0gIC8vLyB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzb2NrZXQgbGF5ZXIuCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBkYXRhX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c29ja2V0X2FkZHJfdHlwZSBkYXRhX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgYmFzaWNfZW5kcG9pbnQoKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGFuIGVuZHBvaW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgcGF0aCBuYW1lLgotICBiYXNpY19lbmRwb2ludChjb25zdCBjaGFyKiBwYXRoX25hbWUpCi0gICAgOiBpbXBsXyhwYXRoX25hbWUpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYW4gZW5kcG9pbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXRoIG5hbWUuCi0gIGJhc2ljX2VuZHBvaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoX25hbWUpCi0gICAgOiBpbXBsXyhwYXRoX25hbWUpCi0gIHsKLSAgfQotCi0gIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgotICBiYXNpY19lbmRwb2ludChjb25zdCBiYXNpY19lbmRwb2ludCYgb3RoZXIpCi0gICAgOiBpbXBsXyhvdGhlci5pbXBsXykKLSAgewotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpCi0gIC8vLyBNb3ZlIGNvbnN0cnVjdG9yLgotICBiYXNpY19lbmRwb2ludChiYXNpY19lbmRwb2ludCYmIG90aGVyKQotICAgIDogaW1wbF8ob3RoZXIuaW1wbF8pCi0gIHsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAvLy8gQXNzaWduIGZyb20gYW5vdGhlciBlbmRwb2ludC4KLSAgYmFzaWNfZW5kcG9pbnQmIG9wZXJhdG9yPShjb25zdCBiYXNpY19lbmRwb2ludCYgb3RoZXIpCi0gIHsKLSAgICBpbXBsXyA9IG90aGVyLmltcGxfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICAvLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIGVuZHBvaW50LgotICBiYXNpY19lbmRwb2ludCYgb3BlcmF0b3I9KGJhc2ljX2VuZHBvaW50JiYgb3RoZXIpCi0gIHsKLSAgICBpbXBsXyA9IG90aGVyLmltcGxfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICAvLy8gVGhlIHByb3RvY29sIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuCi0gIHByb3RvY29sX3R5cGUgcHJvdG9jb2woKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHByb3RvY29sX3R5cGUoKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBkYXRhX3R5cGUqIGRhdGEoKQotICB7Ci0gICAgcmV0dXJuIGltcGxfLmRhdGEoKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBjb25zdCBkYXRhX3R5cGUqIGRhdGEoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGltcGxfLmRhdGEoKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgc2l6ZSBvZiB0aGUgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QKLSAgewotICAgIHJldHVybiBpbXBsXy5zaXplKCk7Ci0gIH0KLQotICAvLy8gU2V0IHRoZSB1bmRlcmx5aW5nIHNpemUgb2YgdGhlIGVuZHBvaW50IGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgdm9pZCByZXNpemUoc3RkOjpzaXplX3QgbmV3X3NpemUpCi0gIHsKLSAgICBpbXBsXy5yZXNpemUobmV3X3NpemUpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgY2FwYWNpdHkgb2YgdGhlIGVuZHBvaW50IGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgc3RkOjpzaXplX3QgY2FwYWNpdHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGltcGxfLmNhcGFjaXR5KCk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuCi0gIHN0ZDo6c3RyaW5nIHBhdGgoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIGltcGxfLnBhdGgoKTsKLSAgfQotCi0gIC8vLyBTZXQgdGhlIHBhdGggYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmRwb2ludC4KLSAgdm9pZCBwYXRoKGNvbnN0IGNoYXIqIHApCi0gIHsKLSAgICBpbXBsXy5wYXRoKHApOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LgotICB2b2lkIHBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHApCi0gIHsKLSAgICBpbXBsXy5wYXRoKHApOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgdHdvIGVuZHBvaW50cyBmb3IgZXF1YWxpdHkuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgYmFzaWNfZW5kcG9pbnQ8UHJvdG9jb2w+JiBlMSwKLSAgICAgIGNvbnN0IGJhc2ljX2VuZHBvaW50PFByb3RvY29sPiYgZTIpCi0gIHsKLSAgICByZXR1cm4gZTEuaW1wbF8gPT0gZTIuaW1wbF87Ci0gIH0KLQotICAvLy8gQ29tcGFyZSB0d28gZW5kcG9pbnRzIGZvciBpbmVxdWFsaXR5LgotICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX2VuZHBvaW50PFByb3RvY29sPiYgZTEsCi0gICAgICBjb25zdCBiYXNpY19lbmRwb2ludDxQcm90b2NvbD4mIGUyKQotICB7Ci0gICAgcmV0dXJuICEoZTEuaW1wbF8gPT0gZTIuaW1wbF8pOwotICB9Ci0KLSAgLy8vIENvbXBhcmUgZW5kcG9pbnRzIGZvciBvcmRlcmluZy4KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGJhc2ljX2VuZHBvaW50PFByb3RvY29sPiYgZTEsCi0gICAgICBjb25zdCBiYXNpY19lbmRwb2ludDxQcm90b2NvbD4mIGUyKQotICB7Ci0gICAgcmV0dXJuIGUxLmltcGxfIDwgZTIuaW1wbF87Ci0gIH0KLQotICAvLy8gQ29tcGFyZSBlbmRwb2ludHMgZm9yIG9yZGVyaW5nLgotICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgYmFzaWNfZW5kcG9pbnQ8UHJvdG9jb2w+JiBlMSwKLSAgICAgIGNvbnN0IGJhc2ljX2VuZHBvaW50PFByb3RvY29sPiYgZTIpCi0gIHsKLSAgICByZXR1cm4gZTIuaW1wbF8gPCBlMS5pbXBsXzsKLSAgfQotCi0gIC8vLyBDb21wYXJlIGVuZHBvaW50cyBmb3Igb3JkZXJpbmcuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oY29uc3QgYmFzaWNfZW5kcG9pbnQ8UHJvdG9jb2w+JiBlMSwKLSAgICAgIGNvbnN0IGJhc2ljX2VuZHBvaW50PFByb3RvY29sPiYgZTIpCi0gIHsKLSAgICByZXR1cm4gIShlMiA8IGUxKTsKLSAgfQotCi0gIC8vLyBDb21wYXJlIGVuZHBvaW50cyBmb3Igb3JkZXJpbmcuCi0gIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3QgYmFzaWNfZW5kcG9pbnQ8UHJvdG9jb2w+JiBlMSwKLSAgICAgIGNvbnN0IGJhc2ljX2VuZHBvaW50PFByb3RvY29sPiYgZTIpCi0gIHsKLSAgICByZXR1cm4gIShlMSA8IGUyKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBUaGUgdW5kZXJseWluZyBVTklYIGRvbWFpbiBlbmRwb2ludC4KLSAgYXNpbzo6bG9jYWw6OmRldGFpbDo6ZW5kcG9pbnQgaW1wbF87Ci19OwotCi0vLy8gT3V0cHV0IGFuIGVuZHBvaW50IGFzIGEgc3RyaW5nLgotLyoqCi0gKiBVc2VkIHRvIG91dHB1dCBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmb3IgYSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gKgotICogQHBhcmFtIG9zIFRoZSBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoZSBzdHJpbmcgd2lsbCBiZSB3cml0dGVuLgotICoKLSAqIEBwYXJhbSBlbmRwb2ludCBUaGUgZW5kcG9pbnQgdG8gYmUgd3JpdHRlbi4KLSAqCi0gKiBAcmV0dXJuIFRoZSBvdXRwdXQgc3RyZWFtLgotICoKLSAqIEByZWxhdGVzIGFzaW86OmxvY2FsOjpiYXNpY19lbmRwb2ludAotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbSwgdHlwZW5hbWUgVHJhaXRzLCB0eXBlbmFtZSBQcm90b2NvbD4KLXN0ZDo6YmFzaWNfb3N0cmVhbTxFbGVtLCBUcmFpdHM+JiBvcGVyYXRvcjw8KAotICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxFbGVtLCBUcmFpdHM+JiBvcywKLSAgICBjb25zdCBiYXNpY19lbmRwb2ludDxQcm90b2NvbD4mIGVuZHBvaW50KQotewotICBvcyA8PCBlbmRwb2ludC5wYXRoKCk7Ci0gIHJldHVybiBvczsKLX0KLQotfSAvLyBuYW1lc3BhY2UgbG9jYWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTE9DQUxfU09DS0VUUykKLSAgICAgICAvLyAgIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jZW5kaWYgLy8gQVNJT19MT0NBTF9CQVNJQ19FTkRQT0lOVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9sb2NhbC9jb25uZWN0X3BhaXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2xvY2FsL2Nvbm5lY3RfcGFpci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzg1ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2xvY2FsL2Nvbm5lY3RfcGFpci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8KLS8vIGxvY2FsL2Nvbm5lY3RfcGFpci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19MT0NBTF9DT05ORUNUX1BBSVJfSFBQCi0jZGVmaW5lIEFTSU9fTE9DQUxfQ09OTkVDVF9QQUlSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19MT0NBTF9TT0NLRVRTKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jaW5jbHVkZSAiYXNpby9iYXNpY19zb2NrZXQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2xvY2FsL2Jhc2ljX2VuZHBvaW50LmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBsb2NhbCB7Ci0KLS8vLyBDcmVhdGUgYSBwYWlyIG9mIGNvbm5lY3RlZCBzb2NrZXRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlMSwgdHlwZW5hbWUgU29ja2V0U2VydmljZTI+Ci12b2lkIGNvbm5lY3RfcGFpcigKLSAgICBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2UxPiYgc29ja2V0MSwKLSAgICBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2UyPiYgc29ja2V0Mik7Ci0KLS8vLyBDcmVhdGUgYSBwYWlyIG9mIGNvbm5lY3RlZCBzb2NrZXRzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlMSwgdHlwZW5hbWUgU29ja2V0U2VydmljZTI+Ci1hc2lvOjplcnJvcl9jb2RlIGNvbm5lY3RfcGFpcigKLSAgICBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2UxPiYgc29ja2V0MSwKLSAgICBiYXNpY19zb2NrZXQ8UHJvdG9jb2wsIFNvY2tldFNlcnZpY2UyPiYgc29ja2V0MiwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgU29ja2V0U2VydmljZTEsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UyPgotaW5saW5lIHZvaWQgY29ubmVjdF9wYWlyKAotICAgIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU29ja2V0U2VydmljZTE+JiBzb2NrZXQxLAotICAgIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU29ja2V0U2VydmljZTI+JiBzb2NrZXQyKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBjb25uZWN0X3BhaXIoc29ja2V0MSwgc29ja2V0MiwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiY29ubmVjdF9wYWlyIik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbCwgdHlwZW5hbWUgU29ja2V0U2VydmljZTEsIHR5cGVuYW1lIFNvY2tldFNlcnZpY2UyPgotaW5saW5lIGFzaW86OmVycm9yX2NvZGUgY29ubmVjdF9wYWlyKAotICAgIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU29ja2V0U2VydmljZTE+JiBzb2NrZXQxLAotICAgIGJhc2ljX3NvY2tldDxQcm90b2NvbCwgU29ja2V0U2VydmljZTI+JiBzb2NrZXQyLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICAvLyBDaGVjayB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBiZWluZyB1c2VkIHdpdGggYSBVTklYIGRvbWFpbiBzb2NrZXQuCi0gIGFzaW86OmxvY2FsOjpiYXNpY19lbmRwb2ludDxQcm90b2NvbD4qIHRtcAotICAgID0gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50Kj4oMCk7Ci0gICh2b2lkKXRtcDsKLQotICBQcm90b2NvbCBwcm90b2NvbDsKLSAgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfdHlwZSBzdlsyXTsKLSAgaWYgKGFzaW86OmRldGFpbDo6c29ja2V0X29wczo6c29ja2V0cGFpcihwcm90b2NvbC5mYW1pbHkoKSwKLSAgICAgICAgcHJvdG9jb2wudHlwZSgpLCBwcm90b2NvbC5wcm90b2NvbCgpLCBzdiwgZWMpCi0gICAgICA9PSBhc2lvOjpkZXRhaWw6OnNvY2tldF9lcnJvcl9yZXR2YWwpCi0gICAgcmV0dXJuIGVjOwotCi0gIGlmIChzb2NrZXQxLmFzc2lnbihwcm90b2NvbCwgc3ZbMF0sIGVjKSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgdGVtcF9lYzsKLSAgICBhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHM6OnN0YXRlX3R5cGUgc3RhdGVbMl0gPSB7IDAsIDAgfTsKLSAgICBhc2lvOjpkZXRhaWw6OnNvY2tldF9vcHM6OmNsb3NlKHN2WzBdLCBzdGF0ZVswXSwgdHJ1ZSwgdGVtcF9lYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjpjbG9zZShzdlsxXSwgc3RhdGVbMV0sIHRydWUsIHRlbXBfZWMpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIGlmIChzb2NrZXQyLmFzc2lnbihwcm90b2NvbCwgc3ZbMV0sIGVjKSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgdGVtcF9lYzsKLSAgICBzb2NrZXQxLmNsb3NlKHRlbXBfZWMpOwotICAgIGFzaW86OmRldGFpbDo6c29ja2V0X29wczo6c3RhdGVfdHlwZSBzdGF0ZSA9IDA7Ci0gICAgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3BzOjpjbG9zZShzdlsxXSwgc3RhdGUsIHRydWUsIHRlbXBfZWMpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIHJldHVybiBlYzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgbG9jYWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTE9DQUxfU09DS0VUUykKLSAgICAgICAvLyAgIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jZW5kaWYgLy8gQVNJT19MT0NBTF9DT05ORUNUX1BBSVJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vbG9jYWwvZGF0YWdyYW1fcHJvdG9jb2wuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2xvY2FsL2RhdGFncmFtX3Byb3RvY29sLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhMDYyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vbG9jYWwvZGF0YWdyYW1fcHJvdG9jb2wuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8KLS8vIGxvY2FsL2RhdGFncmFtX3Byb3RvY29sLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fTE9DQUxfREFUQUdSQU1fUFJPVE9DT0xfSFBQCi0jZGVmaW5lIEFTSU9fTE9DQUxfREFUQUdSQU1fUFJPVE9DT0xfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0xPQ0FMX1NPQ0tFVFMpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNpbmNsdWRlICJhc2lvL2Jhc2ljX2RhdGFncmFtX3NvY2tldC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2xvY2FsL2Jhc2ljX2VuZHBvaW50LmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBsb2NhbCB7Ci0KLS8vLyBFbmNhcHN1bGF0ZXMgdGhlIGZsYWdzIG5lZWRlZCBmb3IgZGF0YWdyYW0tb3JpZW50ZWQgVU5JWCBzb2NrZXRzLgotLyoqCi0gKiBUaGUgYXNpbzo6bG9jYWw6OmRhdGFncmFtX3Byb3RvY29sIGNsYXNzIGNvbnRhaW5zIGZsYWdzIG5lY2Vzc2FyeSBmb3IKLSAqIGRhdGFncmFtLW9yaWVudGVkIFVOSVggZG9tYWluIHNvY2tldHMuCi0gKgotICogQHBhciBUaHJlYWQgU2FmZXR5Ci0gKiBAZSBEaXN0aW5jdCBAZSBvYmplY3RzOiBTYWZlLkBuCi0gKiBAZSBTaGFyZWQgQGUgb2JqZWN0czogU2FmZS4KLSAqCi0gKiBAcGFyIENvbmNlcHRzOgotICogUHJvdG9jb2wuCi0gKi8KLWNsYXNzIGRhdGFncmFtX3Byb3RvY29sCi17Ci1wdWJsaWM6Ci0gIC8vLyBPYnRhaW4gYW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgdGhlIHByb3RvY29sLgotICBpbnQgdHlwZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gU09DS19ER1JBTTsKLSAgfQotCi0gIC8vLyBPYnRhaW4gYW4gaWRlbnRpZmllciBmb3IgdGhlIHByb3RvY29sLgotICBpbnQgcHJvdG9jb2woKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLy8gT2J0YWluIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm90b2NvbCBmYW1pbHkuCi0gIGludCBmYW1pbHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIEFGX1VOSVg7Ci0gIH0KLQotICAvLy8gVGhlIHR5cGUgb2YgYSBVTklYIGRvbWFpbiBlbmRwb2ludC4KLSAgdHlwZWRlZiBiYXNpY19lbmRwb2ludDxkYXRhZ3JhbV9wcm90b2NvbD4gZW5kcG9pbnQ7Ci0KLSAgLy8vIFRoZSBVTklYIGRvbWFpbiBzb2NrZXQgdHlwZS4KLSAgdHlwZWRlZiBiYXNpY19kYXRhZ3JhbV9zb2NrZXQ8ZGF0YWdyYW1fcHJvdG9jb2w+IHNvY2tldDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGxvY2FsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0xPQ0FMX1NPQ0tFVFMpCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2VuZGlmIC8vIEFTSU9fTE9DQUxfREFUQUdSQU1fUFJPVE9DT0xfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vbG9jYWwvZGV0YWlsL2VuZHBvaW50LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9sb2NhbC9kZXRhaWwvZW5kcG9pbnQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M2NjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9sb2NhbC9kZXRhaWwvZW5kcG9pbnQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vCi0vLyBsb2NhbC9kZXRhaWwvZW5kcG9pbnQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLyBEZXJpdmVkIGZyb20gYSBwdWJsaWMgZG9tYWluIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgRGFuaWVsIENhc2ltaXJvLgotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX0xPQ0FMX0RFVEFJTF9FTkRQT0lOVF9IUFAKLSNkZWZpbmUgQVNJT19MT0NBTF9ERVRBSUxfRU5EUE9JTlRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX0xPQ0FMX1NPQ0tFVFMpCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGxvY2FsIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0vLyBIZWxwZXIgY2xhc3MgZm9yIGltcGxlbWVudGluZyBhIFVOSVggZG9tYWluIGVuZHBvaW50LgotY2xhc3MgZW5kcG9pbnQKLXsKLXB1YmxpYzoKLSAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIGVuZHBvaW50KCk7Ci0KLSAgLy8gQ29uc3RydWN0IGFuIGVuZHBvaW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgcGF0aCBuYW1lLgotICBBU0lPX0RFQ0wgZW5kcG9pbnQoY29uc3QgY2hhciogcGF0aF9uYW1lKTsKLQotICAvLyBDb25zdHJ1Y3QgYW4gZW5kcG9pbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXRoIG5hbWUuCi0gIEFTSU9fREVDTCBlbmRwb2ludChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aF9uYW1lKTsKLQotICAvLyBDb3B5IGNvbnN0cnVjdG9yLgotICBlbmRwb2ludChjb25zdCBlbmRwb2ludCYgb3RoZXIpCi0gICAgOiBkYXRhXyhvdGhlci5kYXRhXyksCi0gICAgICBwYXRoX2xlbmd0aF8ob3RoZXIucGF0aF9sZW5ndGhfKQotICB7Ci0gIH0KLQotICAvLyBBc3NpZ24gZnJvbSBhbm90aGVyIGVuZHBvaW50LgotICBlbmRwb2ludCYgb3BlcmF0b3I9KGNvbnN0IGVuZHBvaW50JiBvdGhlcikKLSAgewotICAgIGRhdGFfID0gb3RoZXIuZGF0YV87Ci0gICAgcGF0aF9sZW5ndGhfID0gb3RoZXIucGF0aF9sZW5ndGhfOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vIEdldCB0aGUgdW5kZXJseWluZyBlbmRwb2ludCBpbiB0aGUgbmF0aXZlIHR5cGUuCi0gIGFzaW86OmRldGFpbDo6c29ja2V0X2FkZHJfdHlwZSogZGF0YSgpCi0gIHsKLSAgICByZXR1cm4gJmRhdGFfLmJhc2U7Ci0gIH0KLQotICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgZW5kcG9pbnQgaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBjb25zdCBhc2lvOjpkZXRhaWw6OnNvY2tldF9hZGRyX3R5cGUqIGRhdGEoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuICZkYXRhXy5iYXNlOwotICB9Ci0KLSAgLy8gR2V0IHRoZSB1bmRlcmx5aW5nIHNpemUgb2YgdGhlIGVuZHBvaW50IGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gcGF0aF9sZW5ndGhfCi0gICAgICArIG9mZnNldG9mKGFzaW86OmRldGFpbDo6c29ja2FkZHJfdW5fdHlwZSwgc3VuX3BhdGgpOwotICB9Ci0KLSAgLy8gU2V0IHRoZSB1bmRlcmx5aW5nIHNpemUgb2YgdGhlIGVuZHBvaW50IGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgQVNJT19ERUNMIHZvaWQgcmVzaXplKHN0ZDo6c2l6ZV90IHNpemUpOwotCi0gIC8vIEdldCB0aGUgY2FwYWNpdHkgb2YgdGhlIGVuZHBvaW50IGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgc3RkOjpzaXplX3QgY2FwYWNpdHkoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNpemVvZihhc2lvOjpkZXRhaWw6OnNvY2thZGRyX3VuX3R5cGUpOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuCi0gIEFTSU9fREVDTCBzdGQ6OnN0cmluZyBwYXRoKCkgY29uc3Q7Ci0KLSAgLy8gU2V0IHRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuCi0gIEFTSU9fREVDTCB2b2lkIHBhdGgoY29uc3QgY2hhciogcCk7Ci0KLSAgLy8gU2V0IHRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kcG9pbnQuCi0gIEFTSU9fREVDTCB2b2lkIHBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHApOwotCi0gIC8vIENvbXBhcmUgdHdvIGVuZHBvaW50cyBmb3IgZXF1YWxpdHkuCi0gIEFTSU9fREVDTCBmcmllbmQgYm9vbCBvcGVyYXRvcj09KAotICAgICAgY29uc3QgZW5kcG9pbnQmIGUxLCBjb25zdCBlbmRwb2ludCYgZTIpOwotCi0gIC8vIENvbXBhcmUgZW5kcG9pbnRzIGZvciBvcmRlcmluZy4KLSAgQVNJT19ERUNMIGZyaWVuZCBib29sIG9wZXJhdG9yPCgKLSAgICAgIGNvbnN0IGVuZHBvaW50JiBlMSwgY29uc3QgZW5kcG9pbnQmIGUyKTsKLQotcHJpdmF0ZToKLSAgLy8gVGhlIHVuZGVybHlpbmcgVU5JWCBzb2NrZXQgYWRkcmVzcy4KLSAgdW5pb24gZGF0YV91bmlvbgotICB7Ci0gICAgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfYWRkcl90eXBlIGJhc2U7Ci0gICAgYXNpbzo6ZGV0YWlsOjpzb2NrYWRkcl91bl90eXBlIGxvY2FsOwotICB9IGRhdGFfOwotCi0gIC8vIFRoZSBsZW5ndGggb2YgdGhlIHBhdGggYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmRwb2ludC4KLSAgc3RkOjpzaXplX3QgcGF0aF9sZW5ndGhfOwotCi0gIC8vIEluaXRpYWxpc2Ugd2l0aCBhIHNwZWNpZmllZCBwYXRoLgotICBBU0lPX0RFQ0wgdm9pZCBpbml0KGNvbnN0IGNoYXIqIHBhdGgsIHN0ZDo6c2l6ZV90IHBhdGhfbGVuZ3RoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2UgbG9jYWwKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9sb2NhbC9kZXRhaWwvaW1wbC9lbmRwb2ludC5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19MT0NBTF9TT0NLRVRTKQotCi0jZW5kaWYgLy8gQVNJT19MT0NBTF9ERVRBSUxfRU5EUE9JTlRfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vbG9jYWwvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2xvY2FsL2RldGFpbC9pbXBsL2VuZHBvaW50LmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkNzU1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vbG9jYWwvZGV0YWlsL2ltcGwvZW5kcG9pbnQuaXBwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vCi0vLyBsb2NhbC9kZXRhaWwvaW1wbC9lbmRwb2ludC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gRGVyaXZlZCBmcm9tIGEgcHVibGljIGRvbWFpbiBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGJ5IERhbmllbCBDYXNpbWlyby4KLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19MT0NBTF9ERVRBSUxfSU1QTF9FTkRQT0lOVF9JUFAKLSNkZWZpbmUgQVNJT19MT0NBTF9ERVRBSUxfSU1QTF9FTkRQT0lOVF9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTE9DQUxfU09DS0VUUykKLQotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vbG9jYWwvZGV0YWlsL2VuZHBvaW50LmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBsb2NhbCB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotZW5kcG9pbnQ6OmVuZHBvaW50KCkKLXsKLSAgaW5pdCgiIiwgMCk7Ci19Ci0KLWVuZHBvaW50OjplbmRwb2ludChjb25zdCBjaGFyKiBwYXRoX25hbWUpCi17Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBzdHJsZW4uCi0gIGluaXQocGF0aF9uYW1lLCBzdHJsZW4ocGF0aF9uYW1lKSk7Ci19Ci0KLWVuZHBvaW50OjplbmRwb2ludChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aF9uYW1lKQotewotICBpbml0KHBhdGhfbmFtZS5kYXRhKCksIHBhdGhfbmFtZS5sZW5ndGgoKSk7Ci19Ci0KLXZvaWQgZW5kcG9pbnQ6OnJlc2l6ZShzdGQ6OnNpemVfdCBuZXdfc2l6ZSkKLXsKLSAgaWYgKG5ld19zaXplID4gc2l6ZW9mKGFzaW86OmRldGFpbDo6c29ja2FkZHJfdW5fdHlwZSkpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjKGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50KTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjKTsKLSAgfQotICBlbHNlIGlmIChuZXdfc2l6ZSA9PSAwKQotICB7Ci0gICAgcGF0aF9sZW5ndGhfID0gMDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBwYXRoX2xlbmd0aF8gPSBuZXdfc2l6ZQotICAgICAgLSBvZmZzZXRvZihhc2lvOjpkZXRhaWw6OnNvY2thZGRyX3VuX3R5cGUsIHN1bl9wYXRoKTsKLQotICAgIC8vIFRoZSBwYXRoIHJldHVybmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG1heSBiZSBOVUwtdGVybWluYXRlZC4KLSAgICBpZiAocGF0aF9sZW5ndGhfID4gMCAmJiBkYXRhXy5sb2NhbC5zdW5fcGF0aFtwYXRoX2xlbmd0aF8gLSAxXSA9PSAwKQotICAgICAgLS1wYXRoX2xlbmd0aF87Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgZW5kcG9pbnQ6OnBhdGgoKSBjb25zdAotewotICByZXR1cm4gc3RkOjpzdHJpbmcoZGF0YV8ubG9jYWwuc3VuX3BhdGgsIHBhdGhfbGVuZ3RoXyk7Ci19Ci0KLXZvaWQgZW5kcG9pbnQ6OnBhdGgoY29uc3QgY2hhciogcCkKLXsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIHN0cmxlbi4KLSAgaW5pdChwLCBzdHJsZW4ocCkpOwotfQotCi12b2lkIGVuZHBvaW50OjpwYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwKQotewotICBpbml0KHAuZGF0YSgpLCBwLmxlbmd0aCgpKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IGVuZHBvaW50JiBlMSwgY29uc3QgZW5kcG9pbnQmIGUyKQotewotICByZXR1cm4gZTEucGF0aCgpID09IGUyLnBhdGgoKTsKLX0KLQotYm9vbCBvcGVyYXRvcjwoY29uc3QgZW5kcG9pbnQmIGUxLCBjb25zdCBlbmRwb2ludCYgZTIpCi17Ci0gIHJldHVybiBlMS5wYXRoKCkgPCBlMi5wYXRoKCk7Ci19Ci0KLXZvaWQgZW5kcG9pbnQ6OmluaXQoY29uc3QgY2hhciogcGF0aF9uYW1lLCBzdGQ6OnNpemVfdCBwYXRoX2xlbmd0aCkKLXsKLSAgaWYgKHBhdGhfbGVuZ3RoID4gc2l6ZW9mKGRhdGFfLmxvY2FsLnN1bl9wYXRoKSAtIDEpCi0gIHsKLSAgICAvLyBUaGUgYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gc3RvcmUgdGhpcyBhZGRyZXNzLgotICAgIGFzaW86OmVycm9yX2NvZGUgZWMoYXNpbzo6ZXJyb3I6Om5hbWVfdG9vX2xvbmcpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICB9Ci0KLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbWNweS4KLSAgZGF0YV8ubG9jYWwgPSBhc2lvOjpkZXRhaWw6OnNvY2thZGRyX3VuX3R5cGUoKTsKLSAgZGF0YV8ubG9jYWwuc3VuX2ZhbWlseSA9IEFGX1VOSVg7Ci0gIG1lbWNweShkYXRhXy5sb2NhbC5zdW5fcGF0aCwgcGF0aF9uYW1lLCBwYXRoX2xlbmd0aCk7Ci0gIHBhdGhfbGVuZ3RoXyA9IHBhdGhfbGVuZ3RoOwotCi0gIC8vIE5VTC10ZXJtaW5hdGUgbm9ybWFsIHBhdGggbmFtZXMuIE5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhIE5VTCBhcmUgaW4gdGhlCi0gIC8vIFVOSVggZG9tYWluIHByb3RvY29sJ3MgImFic3RyYWN0IG5hbWVzcGFjZSIgYW5kIGFyZSBub3QgTlVMLXRlcm1pbmF0ZWQuCi0gIGlmIChwYXRoX2xlbmd0aCA+IDAgJiYgZGF0YV8ubG9jYWwuc3VuX3BhdGhbMF0gPT0gMCkKLSAgICBkYXRhXy5sb2NhbC5zdW5fcGF0aFtwYXRoX2xlbmd0aF0gPSAwOwotfQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIGxvY2FsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0xPQ0FMX1NPQ0tFVFMpCi0KLSNlbmRpZiAvLyBBU0lPX0xPQ0FMX0RFVEFJTF9JTVBMX0VORFBPSU5UX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL2xvY2FsL3N0cmVhbV9wcm90b2NvbC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vbG9jYWwvc3RyZWFtX3Byb3RvY29sLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlOTc3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vbG9jYWwvc3RyZWFtX3Byb3RvY29sLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8vCi0vLyBsb2NhbC9zdHJlYW1fcHJvdG9jb2wuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fTE9DQUxfU1RSRUFNX1BST1RPQ09MX0hQUAotI2RlZmluZSBBU0lPX0xPQ0FMX1NUUkVBTV9QUk9UT0NPTF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTE9DQUxfU09DS0VUUykgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgImFzaW8vYmFzaWNfc29ja2V0X2FjY2VwdG9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3NvY2tldF9pb3N0cmVhbS5ocHAiCi0jaW5jbHVkZSAiYXNpby9iYXNpY19zdHJlYW1fc29ja2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vbG9jYWwvYmFzaWNfZW5kcG9pbnQuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGxvY2FsIHsKLQotLy8vIEVuY2Fwc3VsYXRlcyB0aGUgZmxhZ3MgbmVlZGVkIGZvciBzdHJlYW0tb3JpZW50ZWQgVU5JWCBzb2NrZXRzLgotLyoqCi0gKiBUaGUgYXNpbzo6bG9jYWw6OnN0cmVhbV9wcm90b2NvbCBjbGFzcyBjb250YWlucyBmbGFncyBuZWNlc3NhcnkgZm9yCi0gKiBzdHJlYW0tb3JpZW50ZWQgVU5JWCBkb21haW4gc29ja2V0cy4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBTYWZlLgotICoKLSAqIEBwYXIgQ29uY2VwdHM6Ci0gKiBQcm90b2NvbC4KLSAqLwotY2xhc3Mgc3RyZWFtX3Byb3RvY29sCi17Ci1wdWJsaWM6Ci0gIC8vLyBPYnRhaW4gYW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgdGhlIHByb3RvY29sLgotICBpbnQgdHlwZSgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gU09DS19TVFJFQU07Ci0gIH0KLQotICAvLy8gT2J0YWluIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm90b2NvbC4KLSAgaW50IHByb3RvY29sKCkgY29uc3QKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8vIE9idGFpbiBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvdG9jb2wgZmFtaWx5LgotICBpbnQgZmFtaWx5KCkgY29uc3QKLSAgewotICAgIHJldHVybiBBRl9VTklYOwotICB9Ci0KLSAgLy8vIFRoZSB0eXBlIG9mIGEgVU5JWCBkb21haW4gZW5kcG9pbnQuCi0gIHR5cGVkZWYgYmFzaWNfZW5kcG9pbnQ8c3RyZWFtX3Byb3RvY29sPiBlbmRwb2ludDsKLQotICAvLy8gVGhlIFVOSVggZG9tYWluIHNvY2tldCB0eXBlLgotICB0eXBlZGVmIGJhc2ljX3N0cmVhbV9zb2NrZXQ8c3RyZWFtX3Byb3RvY29sPiBzb2NrZXQ7Ci0KLSAgLy8vIFRoZSBVTklYIGRvbWFpbiBhY2NlcHRvciB0eXBlLgotICB0eXBlZGVmIGJhc2ljX3NvY2tldF9hY2NlcHRvcjxzdHJlYW1fcHJvdG9jb2w+IGFjY2VwdG9yOwotCi0jaWYgIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLSAgLy8vIFRoZSBVTklYIGRvbWFpbiBpb3N0cmVhbSB0eXBlLgotICB0eXBlZGVmIGJhc2ljX3NvY2tldF9pb3N0cmVhbTxzdHJlYW1fcHJvdG9jb2w+IGlvc3RyZWFtOwotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi19OwotCi19IC8vIG5hbWVzcGFjZSBsb2NhbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19MT0NBTF9TT0NLRVRTKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX0xPQ0FMX1NUUkVBTV9QUk9UT0NPTF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9wbGFjZWhvbGRlcnMuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3BsYWNlaG9sZGVycy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMWNmMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3BsYWNlaG9sZGVycy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8KLS8vIHBsYWNlaG9sZGVycy5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19QTEFDRUhPTERFUlNfSFBQCi0jZGVmaW5lIEFTSU9fUExBQ0VIT0xERVJTX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19CT09TVF9CSU5EKQotIyBpbmNsdWRlIDxib29zdC9iaW5kL2FyZy5ocHA+Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19CT09TVF9CSU5EKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7Ci0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotLy8vIEFuIGFyZ3VtZW50IHBsYWNlaG9sZGVyLCBmb3IgdXNlIHdpdGggYm9vc3Q6OmJpbmQoKSwgdGhhdCBjb3JyZXNwb25kcyB0bwotLy8vIHRoZSBlcnJvciBhcmd1bWVudCBvZiBhIGhhbmRsZXIgZm9yIGFueSBvZiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9ucy4KLXVuc3BlY2lmaWVkIGVycm9yOwotCi0vLy8gQW4gYXJndW1lbnQgcGxhY2Vob2xkZXIsIGZvciB1c2Ugd2l0aCBib29zdDo6YmluZCgpLCB0aGF0IGNvcnJlc3BvbmRzIHRvCi0vLy8gdGhlIGJ5dGVzX3RyYW5zZmVycmVkIGFyZ3VtZW50IG9mIGEgaGFuZGxlciBmb3IgYXN5bmNocm9ub3VzIGZ1bmN0aW9ucyBzdWNoCi0vLy8gYXMgYXNpbzo6YmFzaWNfc3RyZWFtX3NvY2tldDo6YXN5bmNfd3JpdGVfc29tZSBvcgotLy8vIGFzaW86OmFzeW5jX3dyaXRlLgotdW5zcGVjaWZpZWQgYnl0ZXNfdHJhbnNmZXJyZWQ7Ci0KLS8vLyBBbiBhcmd1bWVudCBwbGFjZWhvbGRlciwgZm9yIHVzZSB3aXRoIGJvb3N0OjpiaW5kKCksIHRoYXQgY29ycmVzcG9uZHMgdG8KLS8vLyB0aGUgaXRlcmF0b3IgYXJndW1lbnQgb2YgYSBoYW5kbGVyIGZvciBhc3luY2hyb25vdXMgZnVuY3Rpb25zIHN1Y2ggYXMKLS8vLyBhc2lvOjpiYXNpY19yZXNvbHZlcjo6YXN5bmNfcmVzb2x2ZS4KLXVuc3BlY2lmaWVkIGl0ZXJhdG9yOwotCi0vLy8gQW4gYXJndW1lbnQgcGxhY2Vob2xkZXIsIGZvciB1c2Ugd2l0aCBib29zdDo6YmluZCgpLCB0aGF0IGNvcnJlc3BvbmRzIHRvCi0vLy8gdGhlIHNpZ25hbF9udW1iZXIgYXJndW1lbnQgb2YgYSBoYW5kbGVyIGZvciBhc3luY2hyb25vdXMgZnVuY3Rpb25zIHN1Y2ggYXMKLS8vLyBhc2lvOjpzaWduYWxfc2V0Ojphc3luY193YWl0LgotdW5zcGVjaWZpZWQgc2lnbmFsX251bWJlcjsKLQotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19CT09TVF9CSU5EKQotIyBpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX0dOVUNfXykKLQotaW5saW5lIGJvb3N0Ojphcmc8MT4gZXJyb3IoKQotewotICByZXR1cm4gYm9vc3Q6OmFyZzwxPigpOwotfQotCi1pbmxpbmUgYm9vc3Q6OmFyZzwyPiBieXRlc190cmFuc2ZlcnJlZCgpCi17Ci0gIHJldHVybiBib29zdDo6YXJnPDI+KCk7Ci19Ci0KLWlubGluZSBib29zdDo6YXJnPDI+IGl0ZXJhdG9yKCkKLXsKLSAgcmV0dXJuIGJvb3N0Ojphcmc8Mj4oKTsKLX0KLQotaW5saW5lIGJvb3N0Ojphcmc8Mj4gc2lnbmFsX251bWJlcigpCi17Ci0gIHJldHVybiBib29zdDo6YXJnPDI+KCk7Ci19Ci0KLSMgZWxzZQotCi1uYW1lc3BhY2UgZGV0YWlsCi17Ci0gIHRlbXBsYXRlIDxpbnQgTnVtYmVyPgotICBzdHJ1Y3QgcGxhY2Vob2xkZXIKLSAgewotICAgIHN0YXRpYyBib29zdDo6YXJnPE51bWJlcj4mIGdldCgpCi0gICAgewotICAgICAgc3RhdGljIGJvb3N0Ojphcmc8TnVtYmVyPiByZXN1bHQ7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfTsKLX0KLQotIyAgaWYgZGVmaW5lZChBU0lPX01TVkMpICYmIChBU0lPX01TVkMgPCAxNDAwKQotCi1zdGF0aWMgYm9vc3Q6OmFyZzwxPiYgZXJyb3IKLSAgPSBhc2lvOjpwbGFjZWhvbGRlcnM6OmRldGFpbDo6cGxhY2Vob2xkZXI8MT46OmdldCgpOwotc3RhdGljIGJvb3N0Ojphcmc8Mj4mIGJ5dGVzX3RyYW5zZmVycmVkCi0gID0gYXNpbzo6cGxhY2Vob2xkZXJzOjpkZXRhaWw6OnBsYWNlaG9sZGVyPDI+OjpnZXQoKTsKLXN0YXRpYyBib29zdDo6YXJnPDI+JiBpdGVyYXRvcgotICA9IGFzaW86OnBsYWNlaG9sZGVyczo6ZGV0YWlsOjpwbGFjZWhvbGRlcjwyPjo6Z2V0KCk7Ci1zdGF0aWMgYm9vc3Q6OmFyZzwyPiYgc2lnbmFsX251bWJlcgotICA9IGFzaW86OnBsYWNlaG9sZGVyczo6ZGV0YWlsOjpwbGFjZWhvbGRlcjwyPjo6Z2V0KCk7Ci0KLSMgIGVsc2UKLQotbmFtZXNwYWNlCi17Ci0gIGJvb3N0Ojphcmc8MT4mIGVycm9yCi0gICAgPSBhc2lvOjpwbGFjZWhvbGRlcnM6OmRldGFpbDo6cGxhY2Vob2xkZXI8MT46OmdldCgpOwotICBib29zdDo6YXJnPDI+JiBieXRlc190cmFuc2ZlcnJlZAotICAgID0gYXNpbzo6cGxhY2Vob2xkZXJzOjpkZXRhaWw6OnBsYWNlaG9sZGVyPDI+OjpnZXQoKTsKLSAgYm9vc3Q6OmFyZzwyPiYgaXRlcmF0b3IKLSAgICA9IGFzaW86OnBsYWNlaG9sZGVyczo6ZGV0YWlsOjpwbGFjZWhvbGRlcjwyPjo6Z2V0KCk7Ci0gIGJvb3N0Ojphcmc8Mj4mIHNpZ25hbF9udW1iZXIKLSAgICA9IGFzaW86OnBsYWNlaG9sZGVyczo6ZGV0YWlsOjpwbGFjZWhvbGRlcjwyPjo6Z2V0KCk7Ci19IC8vIG5hbWVzcGFjZQotCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIHBsYWNlaG9sZGVycwotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19QTEFDRUhPTERFUlNfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vcG9zaXgvYmFzaWNfZGVzY3JpcHRvci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vcG9zaXgvYmFzaWNfZGVzY3JpcHRvci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZGEyOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3Bvc2l4L2Jhc2ljX2Rlc2NyaXB0b3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8vCi0vLyBwb3NpeC9iYXNpY19kZXNjcmlwdG9yLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19QT1NJWF9CQVNJQ19ERVNDUklQVE9SX0hQUAotI2RlZmluZSBBU0lPX1BPU0lYX0JBU0lDX0RFU0NSSVBUT1JfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1BPU0lYX1NUUkVBTV9ERVNDUklQVE9SKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jaW5jbHVkZSAiYXNpby9iYXNpY19pb19vYmplY3QuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL3Bvc2l4L2Rlc2NyaXB0b3JfYmFzZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgcG9zaXggewotCi0vLy8gUHJvdmlkZXMgUE9TSVggZGVzY3JpcHRvciBmdW5jdGlvbmFsaXR5LgotLyoqCi0gKiBUaGUgcG9zaXg6OmJhc2ljX2Rlc2NyaXB0b3IgY2xhc3MgdGVtcGxhdGUgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gd3JhcCBhCi0gKiBQT1NJWCBkZXNjcmlwdG9yLgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JTZXJ2aWNlPgotY2xhc3MgYmFzaWNfZGVzY3JpcHRvcgotICA6IHB1YmxpYyBiYXNpY19pb19vYmplY3Q8RGVzY3JpcHRvclNlcnZpY2U+LAotICAgIHB1YmxpYyBkZXNjcmlwdG9yX2Jhc2UKLXsKLXB1YmxpYzoKLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZV90eXBlLikgVGhlIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZiBhCi0gIC8vLyBkZXNjcmlwdG9yLgotICB0eXBlZGVmIHR5cGVuYW1lIERlc2NyaXB0b3JTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX3R5cGU7Ci0KLSAgLy8vIFRoZSBuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgYSBkZXNjcmlwdG9yLgotICB0eXBlZGVmIHR5cGVuYW1lIERlc2NyaXB0b3JTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZV90eXBlOwotCi0gIC8vLyBBIGJhc2ljX2Rlc2NyaXB0b3IgaXMgYWx3YXlzIHRoZSBsb3dlc3QgbGF5ZXIuCi0gIHR5cGVkZWYgYmFzaWNfZGVzY3JpcHRvcjxEZXNjcmlwdG9yU2VydmljZT4gbG93ZXN0X2xheWVyX3R5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX2Rlc2NyaXB0b3Igd2l0aG91dCBvcGVuaW5nIGl0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgZGVzY3JpcHRvciB3aXRob3V0IG9wZW5pbmcgaXQuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBkZXNjcmlwdG9yIHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZQotICAgKiBkZXNjcmlwdG9yLgotICAgKi8KLSAgZXhwbGljaXQgYmFzaWNfZGVzY3JpcHRvcihhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogYmFzaWNfaW9fb2JqZWN0PERlc2NyaXB0b3JTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgYmFzaWNfZGVzY3JpcHRvciBvbiBhbiBleGlzdGluZyBuYXRpdmUgZGVzY3JpcHRvci4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIGRlc2NyaXB0b3Igb2JqZWN0IHRvIGhvbGQgYW4gZXhpc3RpbmcgbmF0aXZlCi0gICAqIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBkZXNjcmlwdG9yIHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZQotICAgKiBkZXNjcmlwdG9yLgotICAgKgotICAgKiBAcGFyYW0gbmF0aXZlX2Rlc2NyaXB0b3IgQSBuYXRpdmUgZGVzY3JpcHRvci4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICBiYXNpY19kZXNjcmlwdG9yKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIG5hdGl2ZV9kZXNjcmlwdG9yKQotICAgIDogYmFzaWNfaW9fb2JqZWN0PERlc2NyaXB0b3JTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmFzc2lnbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwKLSAgICAgICAgbmF0aXZlX2Rlc2NyaXB0b3IsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiYXNzaWduIik7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIGJhc2ljX2Rlc2NyaXB0b3IgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhIGRlc2NyaXB0b3IgZnJvbSBvbmUgb2JqZWN0IHRvIGFub3RoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgYmFzaWNfZGVzY3JpcHRvciBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZSB3aWxsCi0gICAqIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfZGVzY3JpcHRvcihpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICBiYXNpY19kZXNjcmlwdG9yKGJhc2ljX2Rlc2NyaXB0b3ImJiBvdGhlcikKLSAgICA6IGJhc2ljX2lvX29iamVjdDxEZXNjcmlwdG9yU2VydmljZT4oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX2Rlc2NyaXB0b3IpKG90aGVyKSkKLSAgewotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGEgYmFzaWNfZGVzY3JpcHRvciBmcm9tIGFub3RoZXIuCi0gIC8qKgotICAgKiBUaGlzIGFzc2lnbm1lbnQgb3BlcmF0b3IgbW92ZXMgYSBkZXNjcmlwdG9yIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX2Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUgd2lsbAotICAgKiBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX2Rlc2NyaXB0b3IoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgYmFzaWNfZGVzY3JpcHRvciYgb3BlcmF0b3I9KGJhc2ljX2Rlc2NyaXB0b3ImJiBvdGhlcikKLSAgewotICAgIGJhc2ljX2lvX29iamVjdDxEZXNjcmlwdG9yU2VydmljZT46Om9wZXJhdG9yPSgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoYmFzaWNfZGVzY3JpcHRvcikob3RoZXIpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0gIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIGEgc3RhY2sgb2YKLSAgICogbGF5ZXJzLiBTaW5jZSBhIGJhc2ljX2Rlc2NyaXB0b3IgY2Fubm90IGNvbnRhaW4gYW55IGZ1cnRoZXIgbGF5ZXJzLCBpdAotICAgKiBzaW1wbHkgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdHNlbGYuCi0gICAqCi0gICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllciBpbiB0aGUgc3RhY2sgb2YgbGF5ZXJzLiBPd25lcnNoaXAKLSAgICogaXMgbm90IHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIuCi0gICAqLwotICBsb3dlc3RfbGF5ZXJfdHlwZSYgbG93ZXN0X2xheWVyKCkKLSAgewotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vLyBHZXQgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIGEgc3RhY2sgb2YKLSAgICogbGF5ZXJzLiBTaW5jZSBhIGJhc2ljX2Rlc2NyaXB0b3IgY2Fubm90IGNvbnRhaW4gYW55IGZ1cnRoZXIgbGF5ZXJzLCBpdAotICAgKiBzaW1wbHkgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdHNlbGYuCi0gICAqCi0gICAqIEByZXR1cm4gQSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllciBpbiB0aGUgc3RhY2sgb2YgbGF5ZXJzLgotICAgKiBPd25lcnNoaXAgaXMgbm90IHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIuCi0gICAqLwotICBjb25zdCBsb3dlc3RfbGF5ZXJfdHlwZSYgbG93ZXN0X2xheWVyKCkgY29uc3QKLSAgewotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8vLyBBc3NpZ24gYW4gZXhpc3RpbmcgbmF0aXZlIGRlc2NyaXB0b3IgdG8gdGhlIGRlc2NyaXB0b3IuCi0gIC8qCi0gICAqIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIGRlc2NyaXB0b3IgdG8gaG9sZCBhbiBleGlzdGluZyBuYXRpdmUgZGVzY3JpcHRvci4KLSAgICoKLSAgICogQHBhcmFtIG5hdGl2ZV9kZXNjcmlwdG9yIEEgbmF0aXZlIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBhc3NpZ24oY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBuYXRpdmVfZGVzY3JpcHRvcikKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3NpZ24odGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIG5hdGl2ZV9kZXNjcmlwdG9yLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImFzc2lnbiIpOwotICB9Ci0KLSAgLy8vIEFzc2lnbiBhbiBleGlzdGluZyBuYXRpdmUgZGVzY3JpcHRvciB0byB0aGUgZGVzY3JpcHRvci4KLSAgLyoKLSAgICogVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgZGVzY3JpcHRvciB0byBob2xkIGFuIGV4aXN0aW5nIG5hdGl2ZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiBAcGFyYW0gbmF0aXZlX2Rlc2NyaXB0b3IgQSBuYXRpdmUgZGVzY3JpcHRvci4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIG5hdGl2ZV9kZXNjcmlwdG9yLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3NpZ24oCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBuYXRpdmVfZGVzY3JpcHRvciwgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBkZXNjcmlwdG9yIGlzIG9wZW4uCi0gIGJvb2wgaXNfb3BlbigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5pc19vcGVuKHRoaXMtPmltcGxlbWVudGF0aW9uKTsKLSAgfQotCi0gIC8vLyBDbG9zZSB0aGUgZGVzY3JpcHRvci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbG9zZSB0aGUgZGVzY3JpcHRvci4gQW55IGFzeW5jaHJvbm91cyByZWFkIG9yCi0gICAqIHdyaXRlIG9wZXJhdGlvbnMgd2lsbCBiZSBjYW5jZWxsZWQgaW1tZWRpYXRlbHksIGFuZCB3aWxsIGNvbXBsZXRlIHdpdGggdGhlCi0gICAqIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvci4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIE5vdGUgdGhhdCwgZXZlbiBpZgotICAgKiB0aGUgZnVuY3Rpb24gaW5kaWNhdGVzIGFuIGVycm9yLCB0aGUgdW5kZXJseWluZyBkZXNjcmlwdG9yIGlzIGNsb3NlZC4KLSAgICovCi0gIHZvaWQgY2xvc2UoKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmNsb3NlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNsb3NlIik7Ci0gIH0KLQotICAvLy8gQ2xvc2UgdGhlIGRlc2NyaXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xvc2UgdGhlIGRlc2NyaXB0b3IuIEFueSBhc3luY2hyb25vdXMgcmVhZCBvcgotICAgKiB3cml0ZSBvcGVyYXRpb25zIHdpbGwgYmUgY2FuY2VsbGVkIGltbWVkaWF0ZWx5LCBhbmQgd2lsbCBjb21wbGV0ZSB3aXRoIHRoZQotICAgKiBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LiBOb3RlIHRoYXQsIGV2ZW4gaWYKLSAgICogdGhlIGZ1bmN0aW9uIGluZGljYXRlcyBhbiBlcnJvciwgdGhlIHVuZGVybHlpbmcgZGVzY3JpcHRvciBpcyBjbG9zZWQuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIGNsb3NlKGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuY2xvc2UodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgfQotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGUoKS4pIEdldCB0aGUgbmF0aXZlIGRlc2NyaXB0b3IKLSAgLy8vIHJlcHJlc2VudGF0aW9uLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAqIGRlc2NyaXB0b3IuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWxsb3cgYWNjZXNzIHRvIG5hdGl2ZSBkZXNjcmlwdG9yCi0gICAqIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkLgotICAgKi8KLSAgbmF0aXZlX3R5cGUgbmF0aXZlKCkKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLm5hdGl2ZV9oYW5kbGUodGhpcy0+aW1wbGVtZW50YXRpb24pOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbmF0aXZlIGRlc2NyaXB0b3IgcmVwcmVzZW50YXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIG9idGFpbiB0aGUgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICogZGVzY3JpcHRvci4gVGhpcyBpcyBpbnRlbmRlZCB0byBhbGxvdyBhY2Nlc3MgdG8gbmF0aXZlIGRlc2NyaXB0b3IKLSAgICogZnVuY3Rpb25hbGl0eSB0aGF0IGlzIG5vdCBvdGhlcndpc2UgcHJvdmlkZWQuCi0gICAqLwotICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfaGFuZGxlKHRoaXMtPmltcGxlbWVudGF0aW9uKTsKLSAgfQotCi0gIC8vLyBSZWxlYXNlIG93bmVyc2hpcCBvZiB0aGUgbmF0aXZlIGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIG9idGFpbiB0aGUgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICogZGVzY3JpcHRvci4gQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBAYyBpc19vcGVuKCkgcmV0dXJucyBmYWxzZS4gVGhlCi0gICAqIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgZGVzY3JpcHRvci4KLSAgICoKLSAgICogQWxsIG91dHN0YW5kaW5nIGFzeW5jaHJvbm91cyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMgd2lsbCBmaW5pc2gKLSAgICogaW1tZWRpYXRlbHksIGFuZCB0aGUgaGFuZGxlcnMgZm9yIGNhbmNlbGxlZCBvcGVyYXRpb25zIHdpbGwgYmUgcGFzc2VkIHRoZQotICAgKiBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gICAqLwotICBuYXRpdmVfaGFuZGxlX3R5cGUgcmVsZWFzZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZWxlYXNlKHRoaXMtPmltcGxlbWVudGF0aW9uKTsKLSAgfQotCi0gIC8vLyBDYW5jZWwgYWxsIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gY2F1c2VzIGFsbCBvdXRzdGFuZGluZyBhc3luY2hyb25vdXMgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCi0gICAqIHRvIGZpbmlzaCBpbW1lZGlhdGVseSwgYW5kIHRoZSBoYW5kbGVycyBmb3IgY2FuY2VsbGVkIG9wZXJhdGlvbnMgd2lsbCBiZQotICAgKiBwYXNzZWQgdGhlIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvci4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICB2b2lkIGNhbmNlbCgpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkuY2FuY2VsKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNhbmNlbCIpOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbGwgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXNjcmlwdG9yLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBjYXVzZXMgYWxsIG91dHN0YW5kaW5nIGFzeW5jaHJvbm91cyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKLSAgICogdG8gZmluaXNoIGltbWVkaWF0ZWx5LCBhbmQgdGhlIGhhbmRsZXJzIGZvciBjYW5jZWxsZWQgb3BlcmF0aW9ucyB3aWxsIGJlCi0gICAqIHBhc3NlZCB0aGUgYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgY2FuY2VsKGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuY2FuY2VsKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gIH0KLQotICAvLy8gUGVyZm9ybSBhbiBJTyBjb250cm9sIGNvbW1hbmQgb24gdGhlIGRlc2NyaXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZXhlY3V0ZSBhbiBJTyBjb250cm9sIGNvbW1hbmQgb24gdGhlIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBjb21tYW5kIFRoZSBJTyBjb250cm9sIGNvbW1hbmQgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQHNhIElvQ29udHJvbENvbW1hbmQgQG4KLSAgICogYXNpbzo6cG9zaXg6OmRlc2NyaXB0b3JfYmFzZTo6Ynl0ZXNfcmVhZGFibGUgQG4KLSAgICogYXNpbzo6cG9zaXg6OmRlc2NyaXB0b3JfYmFzZTo6bm9uX2Jsb2NraW5nX2lvCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBHZXR0aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZHkgdG8gcmVhZDoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6cG9zaXg6OnN0cmVhbV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IoaW9fc2VydmljZSk7Ci0gICAqIC4uLgotICAgKiBhc2lvOjpwb3NpeDo6c3RyZWFtX2Rlc2NyaXB0b3I6OmJ5dGVzX3JlYWRhYmxlIGNvbW1hbmQ7Ci0gICAqIGRlc2NyaXB0b3IuaW9fY29udHJvbChjb21tYW5kKTsKLSAgICogc3RkOjpzaXplX3QgYnl0ZXNfcmVhZGFibGUgPSBjb21tYW5kLmdldCgpOwotICAgKiBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIElvQ29udHJvbENvbW1hbmQ+Ci0gIHZvaWQgaW9fY29udHJvbChJb0NvbnRyb2xDb21tYW5kJiBjb21tYW5kKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmlvX2NvbnRyb2wodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGNvbW1hbmQsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiaW9fY29udHJvbCIpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gYW4gSU8gY29udHJvbCBjb21tYW5kIG9uIHRoZSBkZXNjcmlwdG9yLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGV4ZWN1dGUgYW4gSU8gY29udHJvbCBjb21tYW5kIG9uIHRoZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiBAcGFyYW0gY29tbWFuZCBUaGUgSU8gY29udHJvbCBjb21tYW5kIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgZGVzY3JpcHRvci4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBzYSBJb0NvbnRyb2xDb21tYW5kIEBuCi0gICAqIGFzaW86OnBvc2l4OjpkZXNjcmlwdG9yX2Jhc2U6OmJ5dGVzX3JlYWRhYmxlIEBuCi0gICAqIGFzaW86OnBvc2l4OjpkZXNjcmlwdG9yX2Jhc2U6Om5vbl9ibG9ja2luZ19pbwotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogR2V0dGluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWR5IHRvIHJlYWQ6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OnBvc2l4OjpzdHJlYW1fZGVzY3JpcHRvciBkZXNjcmlwdG9yKGlvX3NlcnZpY2UpOwotICAgKiAuLi4KLSAgICogYXNpbzo6cG9zaXg6OnN0cmVhbV9kZXNjcmlwdG9yOjpieXRlc19yZWFkYWJsZSBjb21tYW5kOwotICAgKiBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgKiBkZXNjcmlwdG9yLmlvX2NvbnRyb2woY29tbWFuZCwgZWMpOwotICAgKiBpZiAoZWMpCi0gICAqIHsKLSAgICogICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAgICogfQotICAgKiBzdGQ6OnNpemVfdCBieXRlc19yZWFkYWJsZSA9IGNvbW1hbmQuZ2V0KCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW9Db250cm9sQ29tbWFuZD4KLSAgYXNpbzo6ZXJyb3JfY29kZSBpb19jb250cm9sKElvQ29udHJvbENvbW1hbmQmIGNvbW1hbmQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmlvX2NvbnRyb2woCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBjb21tYW5kLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIGRlc2NyaXB0b3IuCi0gIC8qKgotICAgKiBAcmV0dXJucyBAYyB0cnVlIGlmIHRoZSBkZXNjcmlwdG9yJ3Mgc3luY2hyb25vdXMgb3BlcmF0aW9ucyB3aWxsIGZhaWwgd2l0aAotICAgKiBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sgaWYgdGhleSBhcmUgdW5hYmxlIHRvIHBlcmZvcm0gdGhlIHJlcXVlc3RlZAotICAgKiBvcGVyYXRpb24gaW1tZWRpYXRlbHkuIElmIEBjIGZhbHNlLCBzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgYmxvY2sKLSAgICogdW50aWwgY29tcGxldGUuCi0gICAqCi0gICAqIEBub3RlIFRoZSBub24tYmxvY2tpbmcgbW9kZSBoYXMgbm8gZWZmZWN0IG9uIHRoZSBiZWhhdmlvdXIgb2YgYXN5bmNocm9ub3VzCi0gICAqIG9wZXJhdGlvbnMuIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgbmV2ZXIgZmFpbCB3aXRoIHRoZSBlcnJvcgotICAgKiBhc2lvOjplcnJvcjo6d291bGRfYmxvY2suCi0gICAqLwotICBib29sIG5vbl9ibG9ja2luZygpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5ub25fYmxvY2tpbmcodGhpcy0+aW1wbGVtZW50YXRpb24pOwotICB9Ci0KLSAgLy8vIFNldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBkZXNjcmlwdG9yLgotICAvKioKLSAgICogQHBhcmFtIG1vZGUgSWYgQGMgdHJ1ZSwgdGhlIGRlc2NyaXB0b3IncyBzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgZmFpbAotICAgKiB3aXRoIGFzaW86OmVycm9yOjp3b3VsZF9ibG9jayBpZiB0aGV5IGFyZSB1bmFibGUgdG8gcGVyZm9ybSB0aGUKLSAgICogcmVxdWVzdGVkIG9wZXJhdGlvbiBpbW1lZGlhdGVseS4gSWYgQGMgZmFsc2UsIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMgd2lsbAotICAgKiBibG9jayB1bnRpbCBjb21wbGV0ZS4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIFRoZSBub24tYmxvY2tpbmcgbW9kZSBoYXMgbm8gZWZmZWN0IG9uIHRoZSBiZWhhdmlvdXIgb2YgYXN5bmNocm9ub3VzCi0gICAqIG9wZXJhdGlvbnMuIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgbmV2ZXIgZmFpbCB3aXRoIHRoZSBlcnJvcgotICAgKiBhc2lvOjplcnJvcjo6d291bGRfYmxvY2suCi0gICAqLwotICB2b2lkIG5vbl9ibG9ja2luZyhib29sIG1vZGUpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkubm9uX2Jsb2NraW5nKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBtb2RlLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIm5vbl9ibG9ja2luZyIpOwotICB9Ci0KLSAgLy8vIFNldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBkZXNjcmlwdG9yLgotICAvKioKLSAgICogQHBhcmFtIG1vZGUgSWYgQGMgdHJ1ZSwgdGhlIGRlc2NyaXB0b3IncyBzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgZmFpbAotICAgKiB3aXRoIGFzaW86OmVycm9yOjp3b3VsZF9ibG9jayBpZiB0aGV5IGFyZSB1bmFibGUgdG8gcGVyZm9ybSB0aGUKLSAgICogcmVxdWVzdGVkIG9wZXJhdGlvbiBpbW1lZGlhdGVseS4gSWYgQGMgZmFsc2UsIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMgd2lsbAotICAgKiBibG9jayB1bnRpbCBjb21wbGV0ZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIFRoZSBub24tYmxvY2tpbmcgbW9kZSBoYXMgbm8gZWZmZWN0IG9uIHRoZSBiZWhhdmlvdXIgb2YgYXN5bmNocm9ub3VzCi0gICAqIG9wZXJhdGlvbnMuIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHdpbGwgbmV2ZXIgZmFpbCB3aXRoIHRoZSBlcnJvcgotICAgKiBhc2lvOjplcnJvcjo6d291bGRfYmxvY2suCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIG5vbl9ibG9ja2luZygKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5ub25fYmxvY2tpbmcoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBtb2RlLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIG5hdGl2ZSBkZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgdW5kZXJseWluZwotICAgKiBuYXRpdmUgZGVzY3JpcHRvci4gVGhpcyBtb2RlIGhhcyBubyBlZmZlY3Qgb24gdGhlIGJlaGF2aW91ciBvZiB0aGUKLSAgICogZGVzY3JpcHRvciBvYmplY3QncyBzeW5jaHJvbm91cyBvcGVyYXRpb25zLgotICAgKgotICAgKiBAcmV0dXJucyBAYyB0cnVlIGlmIHRoZSB1bmRlcmx5aW5nIGRlc2NyaXB0b3IgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUgYW5kCi0gICAqIGRpcmVjdCBzeXN0ZW0gY2FsbHMgbWF5IGZhaWwgd2l0aCBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sgKG9yIHRoZQotICAgKiBlcXVpdmFsZW50IHN5c3RlbSBlcnJvcikuCi0gICAqCi0gICAqIEBub3RlIFRoZSBjdXJyZW50IG5vbi1ibG9ja2luZyBtb2RlIGlzIGNhY2hlZCBieSB0aGUgZGVzY3JpcHRvciBvYmplY3QuCi0gICAqIENvbnNlcXVlbnRseSwgdGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgaW5jb3JyZWN0IGlmIHRoZSBub24tYmxvY2tpbmcgbW9kZQotICAgKiB3YXMgc2V0IGRpcmVjdGx5IG9uIHRoZSBuYXRpdmUgZGVzY3JpcHRvci4KLSAgICovCi0gIGJvb2wgbmF0aXZlX25vbl9ibG9ja2luZygpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfbm9uX2Jsb2NraW5nKHRoaXMtPmltcGxlbWVudGF0aW9uKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgdW5kZXJseWluZwotICAgKiBuYXRpdmUgZGVzY3JpcHRvci4gSXQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBkZXNjcmlwdG9yCi0gICAqIG9iamVjdCdzIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSBtb2RlIElmIEBjIHRydWUsIHRoZSB1bmRlcmx5aW5nIGRlc2NyaXB0b3IgaXMgcHV0IGludG8gbm9uLWJsb2NraW5nCi0gICAqIG1vZGUgYW5kIGRpcmVjdCBzeXN0ZW0gY2FsbHMgbWF5IGZhaWwgd2l0aCBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICogKG9yIHRoZSBlcXVpdmFsZW50IHN5c3RlbSBlcnJvcikuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLiBJZiB0aGUgQGMgbW9kZSBpcwotICAgKiBAYyBmYWxzZSwgYnV0IHRoZSBjdXJyZW50IHZhbHVlIG9mIEBjIG5vbl9ibG9ja2luZygpIGlzIEBjIHRydWUsIHRoaXMKLSAgICogZnVuY3Rpb24gZmFpbHMgd2l0aCBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudCwgYXMgdGhlCi0gICAqIGNvbWJpbmF0aW9uIGRvZXMgbm90IG1ha2Ugc2Vuc2UuCi0gICAqLwotICB2b2lkIG5hdGl2ZV9ub25fYmxvY2tpbmcoYm9vbCBtb2RlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLm5hdGl2ZV9ub25fYmxvY2tpbmcoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBtb2RlLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIm5hdGl2ZV9ub25fYmxvY2tpbmciKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgdW5kZXJseWluZwotICAgKiBuYXRpdmUgZGVzY3JpcHRvci4gSXQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBkZXNjcmlwdG9yCi0gICAqIG9iamVjdCdzIHN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSBtb2RlIElmIEBjIHRydWUsIHRoZSB1bmRlcmx5aW5nIGRlc2NyaXB0b3IgaXMgcHV0IGludG8gbm9uLWJsb2NraW5nCi0gICAqIG1vZGUgYW5kIGRpcmVjdCBzeXN0ZW0gY2FsbHMgbWF5IGZhaWwgd2l0aCBhc2lvOjplcnJvcjo6d291bGRfYmxvY2sKLSAgICogKG9yIHRoZSBlcXVpdmFsZW50IHN5c3RlbSBlcnJvcikuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LiBJZiB0aGUgQGMgbW9kZSBpcwotICAgKiBAYyBmYWxzZSwgYnV0IHRoZSBjdXJyZW50IHZhbHVlIG9mIEBjIG5vbl9ibG9ja2luZygpIGlzIEBjIHRydWUsIHRoaXMKLSAgICogZnVuY3Rpb24gZmFpbHMgd2l0aCBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudCwgYXMgdGhlCi0gICAqIGNvbWJpbmF0aW9uIGRvZXMgbm90IG1ha2Ugc2Vuc2UuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIG5hdGl2ZV9ub25fYmxvY2tpbmcoCi0gICAgICBib29sIG1vZGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkubmF0aXZlX25vbl9ibG9ja2luZygKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG1vZGUsIGVjKTsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIC8vLyBQcm90ZWN0ZWQgZGVzdHJ1Y3RvciB0byBwcmV2ZW50IGRlbGV0aW9uIHRocm91Z2ggdGhpcyB0eXBlLgotICB+YmFzaWNfZGVzY3JpcHRvcigpCi0gIHsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgcG9zaXgKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfUE9TSVhfU1RSRUFNX0RFU0NSSVBUT1IpCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2VuZGlmIC8vIEFTSU9fUE9TSVhfQkFTSUNfREVTQ1JJUFRPUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9wb3NpeC9iYXNpY19zdHJlYW1fZGVzY3JpcHRvci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vcG9zaXgvYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3IuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTE5Y2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9wb3NpeC9iYXNpY19zdHJlYW1fZGVzY3JpcHRvci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLy8KLS8vIHBvc2l4L2Jhc2ljX3N0cmVhbV9kZXNjcmlwdG9yLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fUE9TSVhfQkFTSUNfU1RSRUFNX0RFU0NSSVBUT1JfSFBQCi0jZGVmaW5lIEFTSU9fUE9TSVhfQkFTSUNfU1RSRUFNX0RFU0NSSVBUT1JfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1BPU0lYX1NUUkVBTV9ERVNDUklQVE9SKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9wb3NpeC9iYXNpY19kZXNjcmlwdG9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL3Bvc2l4L3N0cmVhbV9kZXNjcmlwdG9yX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHBvc2l4IHsKLQotLy8vIFByb3ZpZGVzIHN0cmVhbS1vcmllbnRlZCBkZXNjcmlwdG9yIGZ1bmN0aW9uYWxpdHkuCi0vKioKLSAqIFRoZSBwb3NpeDo6YmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3IgY2xhc3MgdGVtcGxhdGUgcHJvdmlkZXMgYXN5bmNocm9ub3VzIGFuZAotICogYmxvY2tpbmcgc3RyZWFtLW9yaWVudGVkIGRlc2NyaXB0b3IgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIEFzeW5jUmVhZFN0cmVhbSwgQXN5bmNXcml0ZVN0cmVhbSwgU3RyZWFtLCBTeW5jUmVhZFN0cmVhbSwgU3luY1dyaXRlU3RyZWFtLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtRGVzY3JpcHRvclNlcnZpY2UgPSBzdHJlYW1fZGVzY3JpcHRvcl9zZXJ2aWNlPgotY2xhc3MgYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3IKLSAgOiBwdWJsaWMgYmFzaWNfZGVzY3JpcHRvcjxTdHJlYW1EZXNjcmlwdG9yU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZV90eXBlLikgVGhlIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZiBhCi0gIC8vLyBkZXNjcmlwdG9yLgotICB0eXBlZGVmIHR5cGVuYW1lIFN0cmVhbURlc2NyaXB0b3JTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX3R5cGU7Ci0KLSAgLy8vIFRoZSBuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgYSBkZXNjcmlwdG9yLgotICB0eXBlZGVmIHR5cGVuYW1lIFN0cmVhbURlc2NyaXB0b3JTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUKLSAgICBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX3N0cmVhbV9kZXNjcmlwdG9yIHdpdGhvdXQgb3BlbmluZyBpdC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIHN0cmVhbSBkZXNjcmlwdG9yIHdpdGhvdXQgb3BlbmluZyBpdC4gVGhlCi0gICAqIGRlc2NyaXB0b3IgbmVlZHMgdG8gYmUgb3BlbmVkIGFuZCB0aGVuIGNvbm5lY3RlZCBvciBhY2NlcHRlZCBiZWZvcmUgZGF0YQotICAgKiBjYW4gYmUgc2VudCBvciByZWNlaXZlZCBvbiBpdC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHN0cmVhbSBkZXNjcmlwdG9yIHdpbGwKLSAgICogdXNlIHRvIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZQotICAgKiBkZXNjcmlwdG9yLgotICAgKi8KLSAgZXhwbGljaXQgYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3IoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGJhc2ljX2Rlc2NyaXB0b3I8U3RyZWFtRGVzY3JpcHRvclNlcnZpY2U+KGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19zdHJlYW1fZGVzY3JpcHRvciBvbiBhbiBleGlzdGluZyBuYXRpdmUgZGVzY3JpcHRvci4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIHN0cmVhbSBkZXNjcmlwdG9yIG9iamVjdCB0byBob2xkIGFuIGV4aXN0aW5nCi0gICAqIG5hdGl2ZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgc3RyZWFtIGRlc2NyaXB0b3Igd2lsbAotICAgKiB1c2UgdG8gZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlCi0gICAqIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBuYXRpdmVfZGVzY3JpcHRvciBUaGUgbmV3IHVuZGVybHlpbmcgZGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICBiYXNpY19zdHJlYW1fZGVzY3JpcHRvcihhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLAotICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBuYXRpdmVfZGVzY3JpcHRvcikKLSAgICA6IGJhc2ljX2Rlc2NyaXB0b3I8U3RyZWFtRGVzY3JpcHRvclNlcnZpY2U+KGlvX3NlcnZpY2UsIG5hdGl2ZV9kZXNjcmlwdG9yKQotICB7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIGJhc2ljX3N0cmVhbV9kZXNjcmlwdG9yIGZyb20gYW5vdGhlci4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgbW92ZXMgYSBzdHJlYW0gZGVzY3JpcHRvciBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19zdHJlYW1fZGVzY3JpcHRvciBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZQotICAgKiB3aWxsIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3IoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3IoYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3ImJiBvdGhlcikKLSAgICA6IGJhc2ljX2Rlc2NyaXB0b3I8U3RyZWFtRGVzY3JpcHRvclNlcnZpY2U+KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChiYXNpY19zdHJlYW1fZGVzY3JpcHRvcikob3RoZXIpKQotICB7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gYSBiYXNpY19zdHJlYW1fZGVzY3JpcHRvciBmcm9tIGFub3RoZXIuCi0gIC8qKgotICAgKiBUaGlzIGFzc2lnbm1lbnQgb3BlcmF0b3IgbW92ZXMgYSBzdHJlYW0gZGVzY3JpcHRvciBmcm9tIG9uZSBvYmplY3QgdG8KLSAgICogYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19zdHJlYW1fZGVzY3JpcHRvciBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZQotICAgKiB3aWxsIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3IoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3ImIG9wZXJhdG9yPShiYXNpY19zdHJlYW1fZGVzY3JpcHRvciYmIG90aGVyKQotICB7Ci0gICAgYmFzaWNfZGVzY3JpcHRvcjxTdHJlYW1EZXNjcmlwdG9yU2VydmljZT46Om9wZXJhdG9yPSgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoYmFzaWNfc3RyZWFtX2Rlc2NyaXB0b3IpKG90aGVyKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKSB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotICAvLy8gV3JpdGUgc29tZSBkYXRhIHRvIHRoZSBkZXNjcmlwdG9yLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGRhdGEgdG8gdGhlIHN0cmVhbSBkZXNjcmlwdG9yLiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KLSAgICogc3VjY2Vzc2Z1bGx5LCBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSB3cml0dGVuIHRvIHRoZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLiBBbiBlcnJvciBjb2RlIG9mCi0gICAqIGFzaW86OmVycm9yOjplb2YgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBieSB0aGUKLSAgICogcGVlci4KLSAgICoKLSAgICogQG5vdGUgVGhlIHdyaXRlX3NvbWUgb3BlcmF0aW9uIG1heSBub3QgdHJhbnNtaXQgYWxsIG9mIHRoZSBkYXRhIHRvIHRoZQotICAgKiBwZWVyLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiB3cml0ZSBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdAotICAgKiBhbGwgZGF0YSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHdyaXRlIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogZGVzY3JpcHRvci53cml0ZV9zb21lKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSk7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gd3JpdGluZyBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLndyaXRlX3NvbWUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIndyaXRlX3NvbWUiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIGRlc2NyaXB0b3IuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgZGF0YSB0byB0aGUgc3RyZWFtIGRlc2NyaXB0b3IuIFRoZSBmdW5jdGlvbgotICAgKiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9yIG1vcmUgYnl0ZXMgb2YgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgotICAgKiBzdWNjZXNzZnVsbHksIG9yIHVudGlsIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIFJldHVybnMgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgICoKLSAgICogQG5vdGUgVGhlIHdyaXRlX3NvbWUgb3BlcmF0aW9uIG1heSBub3QgdHJhbnNtaXQgYWxsIG9mIHRoZSBkYXRhIHRvIHRoZQotICAgKiBwZWVyLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiB3cml0ZSBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdAotICAgKiBhbGwgZGF0YSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLndyaXRlX3NvbWUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdyaXRlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHdyaXRlIGRhdGEgdG8gdGhlIHN0cmVhbQotICAgKiBkZXNjcmlwdG9yLiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGRlc2NyaXB0b3IuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB3cml0ZSBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mCi0gICAqIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBub3RlIFRoZSB3cml0ZSBvcGVyYXRpb24gbWF5IG5vdCB0cmFuc21pdCBhbGwgb2YgdGhlIGRhdGEgdG8gdGhlIHBlZXIuCi0gICAqIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIGFzeW5jX3dyaXRlIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFsbAotICAgKiBkYXRhIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIFRvIHdyaXRlIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogZGVzY3JpcHRvci5hc3luY193cml0ZV9zb21lKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgaGFuZGxlcik7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gd3JpdGluZyBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfd3JpdGVfc29tZShjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV3JpdGVIYW5kbGVyLgotICAgIEFTSU9fV1JJVEVfSEFORExFUl9DSEVDSyhXcml0ZUhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY193cml0ZV9zb21lKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICBidWZmZXJzLCBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBSZWFkIHNvbWUgZGF0YSBmcm9tIHRoZSBkZXNjcmlwdG9yLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0gZGVzY3JpcHRvci4gVGhlIGZ1bmN0aW9uCi0gICAqIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiBkYXRhIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LAotICAgKiBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIEFuIGVycm9yIGNvZGUgb2YKLSAgICogYXNpbzo6ZXJyb3I6OmVvZiBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZQotICAgKiBwZWVyLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVhZF9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gICAqIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiByZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0Ci0gICAqIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWFkIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBkZXNjcmlwdG9yLnJlYWRfc29tZShhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSkpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlYWRpbmcgaW50byBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnJlYWRfc29tZSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVhZF9zb21lIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gUmVhZCBzb21lIGRhdGEgZnJvbSB0aGUgZGVzY3JpcHRvci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtIGRlc2NyaXB0b3IuIFRoZSBmdW5jdGlvbgotICAgKiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9yIG1vcmUgYnl0ZXMgb2YgZGF0YSBoYXMgYmVlbiByZWFkIHN1Y2Nlc3NmdWxseSwKLSAgICogb3IgdW50aWwgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZWFkX3NvbWUgb3BlcmF0aW9uIG1heSBub3QgcmVhZCBhbGwgb2YgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YKLSAgICogYnl0ZXMuIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIHJlYWQgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQKLSAgICogdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSBpcyByZWFkIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uCi0gICAqIGNvbXBsZXRlcy4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLnJlYWRfc29tZSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVhZC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtCi0gICAqIGRlc2NyaXB0b3IuIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICAgKiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUKLSAgICogdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gICAqIHRoYXQgdGhleSByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcmVhZCBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mCi0gICAqIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZWFkIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgotICAgKiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiBhc3luY19yZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZQotICAgKiByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24KLSAgICogY29tcGxldGVzLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gcmVhZCBpbnRvIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogZGVzY3JpcHRvci5hc3luY19yZWFkX3NvbWUoYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWFkaW5nIGludG8gbXVsdGlwbGUKLSAgICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAgICogc3RkOjp2ZWN0b3IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFJlYWRIYW5kbGVyLgotICAgIEFTSU9fUkVBRF9IQU5ETEVSX0NIRUNLKFJlYWRIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXN5bmNfcmVhZF9zb21lKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICBidWZmZXJzLCBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBwb3NpeAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19QT1NJWF9TVFJFQU1fREVTQ1JJUFRPUikKLSAgICAgICAvLyAgIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jZW5kaWYgLy8gQVNJT19QT1NJWF9CQVNJQ19TVFJFQU1fREVTQ1JJUFRPUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9wb3NpeC9kZXNjcmlwdG9yX2Jhc2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3Bvc2l4L2Rlc2NyaXB0b3JfYmFzZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiM2E1YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3Bvc2l4L2Rlc2NyaXB0b3JfYmFzZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vLwotLy8gcG9zaXgvZGVzY3JpcHRvcl9iYXNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1BPU0lYX0RFU0NSSVBUT1JfQkFTRV9IUFAKLSNkZWZpbmUgQVNJT19QT1NJWF9ERVNDUklQVE9SX0JBU0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1BPU0lYX1NUUkVBTV9ERVNDUklQVE9SKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaW9fY29udHJvbC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X29wdGlvbi5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgcG9zaXggewotCi0vLy8gVGhlIGRlc2NyaXB0b3JfYmFzZSBjbGFzcyBpcyB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIGJhc2ljX3N0cmVhbV9kZXNjcmlwdG9yCi0vLy8gY2xhc3MgdGVtcGxhdGUgc28gdGhhdCB3ZSBoYXZlIGEgY29tbW9uIHBsYWNlIHRvIGRlZmluZSB0aGUgYXNzb2NpYXRlZAotLy8vIElPIGNvbnRyb2wgY29tbWFuZHMuCi1jbGFzcyBkZXNjcmlwdG9yX2Jhc2UKLXsKLXB1YmxpYzoKLSAgLy8vIChEZXByZWNhdGVkOiBVc2Ugbm9uX2Jsb2NraW5nKCkuKSBJTyBjb250cm9sIGNvbW1hbmQgdG8gc2V0IHRoZSBibG9ja2luZwotICAvLy8gbW9kZSBvZiB0aGUgZGVzY3JpcHRvci4KLSAgLyoqCi0gICAqIEltcGxlbWVudHMgdGhlIEZJT05CSU8gSU8gY29udHJvbCBjb21tYW5kLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogQGNvZGUKLSAgICogYXNpbzo6cG9zaXg6OnN0cmVhbV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6ZGVzY3JpcHRvcl9iYXNlOjpub25fYmxvY2tpbmdfaW8gY29tbWFuZCh0cnVlKTsKLSAgICogZGVzY3JpcHRvci5pb19jb250cm9sKGNvbW1hbmQpOwotICAgKiBAZW5kY29kZQotICAgKgotICAgKiBAcGFyIENvbmNlcHRzOgotICAgKiBJb0NvbnRyb2xDb21tYW5kLgotICAgKi8KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIG5vbl9ibG9ja2luZ19pbzsKLSNlbHNlCi0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjppb19jb250cm9sOjpub25fYmxvY2tpbmdfaW8gbm9uX2Jsb2NraW5nX2lvOwotI2VuZGlmCi0KLSAgLy8vIElPIGNvbnRyb2wgY29tbWFuZCB0byBnZXQgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgY2FuIGJlIHJlYWQgd2l0aG91dAotICAvLy8gYmxvY2tpbmcuCi0gIC8qKgotICAgKiBJbXBsZW1lbnRzIHRoZSBGSU9OUkVBRCBJTyBjb250cm9sIGNvbW1hbmQuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBAY29kZQotICAgKiBhc2lvOjpwb3NpeDo6c3RyZWFtX2Rlc2NyaXB0b3IgZGVzY3JpcHRvcihpb19zZXJ2aWNlKTsgCi0gICAqIC4uLgotICAgKiBhc2lvOjpkZXNjcmlwdG9yX2Jhc2U6OmJ5dGVzX3JlYWRhYmxlIGNvbW1hbmQodHJ1ZSk7Ci0gICAqIGRlc2NyaXB0b3IuaW9fY29udHJvbChjb21tYW5kKTsKLSAgICogc3RkOjpzaXplX3QgYnl0ZXNfcmVhZGFibGUgPSBjb21tYW5kLmdldCgpOwotICAgKiBAZW5kY29kZQotICAgKgotICAgKiBAcGFyIENvbmNlcHRzOgotICAgKiBJb0NvbnRyb2xDb21tYW5kLgotICAgKi8KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIGJ5dGVzX3JlYWRhYmxlOwotI2Vsc2UKLSAgdHlwZWRlZiBhc2lvOjpkZXRhaWw6OmlvX2NvbnRyb2w6OmJ5dGVzX3JlYWRhYmxlIGJ5dGVzX3JlYWRhYmxlOwotI2VuZGlmCi0KLXByb3RlY3RlZDoKLSAgLy8vIFByb3RlY3RlZCBkZXN0cnVjdG9yIHRvIHByZXZlbnQgZGVsZXRpb24gdGhyb3VnaCB0aGlzIHR5cGUuCi0gIH5kZXNjcmlwdG9yX2Jhc2UoKQotICB7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHBvc2l4Ci19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1BPU0lYX1NUUkVBTV9ERVNDUklQVE9SKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1BPU0lYX0RFU0NSSVBUT1JfQkFTRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9wb3NpeC9zdHJlYW1fZGVzY3JpcHRvci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vcG9zaXgvc3RyZWFtX2Rlc2NyaXB0b3IuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM2MmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9wb3NpeC9zdHJlYW1fZGVzY3JpcHRvci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLwotLy8gcG9zaXgvc3RyZWFtX2Rlc2NyaXB0b3IuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19QT1NJWF9TVFJFQU1fREVTQ1JJUFRPUl9IUFAKLSNkZWZpbmUgQVNJT19QT1NJWF9TVFJFQU1fREVTQ1JJUFRPUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfUE9TSVhfU1RSRUFNX0RFU0NSSVBUT1IpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNpbmNsdWRlICJhc2lvL3Bvc2l4L2Jhc2ljX3N0cmVhbV9kZXNjcmlwdG9yLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHBvc2l4IHsKLQotLy8vIFR5cGVkZWYgZm9yIHRoZSB0eXBpY2FsIHVzYWdlIG9mIGEgc3RyZWFtLW9yaWVudGVkIGRlc2NyaXB0b3IuCi10eXBlZGVmIGJhc2ljX3N0cmVhbV9kZXNjcmlwdG9yPD4gc3RyZWFtX2Rlc2NyaXB0b3I7Ci0KLX0gLy8gbmFtZXNwYWNlIHBvc2l4Ci19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1BPU0lYX1NUUkVBTV9ERVNDUklQVE9SKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1BPU0lYX1NUUkVBTV9ERVNDUklQVE9SX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3Bvc2l4L3N0cmVhbV9kZXNjcmlwdG9yX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3Bvc2l4L3N0cmVhbV9kZXNjcmlwdG9yX3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmNkMWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9wb3NpeC9zdHJlYW1fZGVzY3JpcHRvcl9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vLwotLy8gcG9zaXgvc3RyZWFtX2Rlc2NyaXB0b3Jfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fUE9TSVhfU1RSRUFNX0RFU0NSSVBUT1JfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19QT1NJWF9TVFJFQU1fREVTQ1JJUFRPUl9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19QT1NJWF9TVFJFQU1fREVTQ1JJUFRPUikgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBwb3NpeCB7Ci0KLS8vLyBEZWZhdWx0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gZm9yIGEgc3RyZWFtIGRlc2NyaXB0b3IuCi1jbGFzcyBzdHJlYW1fZGVzY3JpcHRvcl9zZXJ2aWNlCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIDogcHVibGljIGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2UKLSNlbHNlCi0gIDogcHVibGljIGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPHN0cmVhbV9kZXNjcmlwdG9yX3NlcnZpY2U+Ci0jZW5kaWYKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB1bmlxdWUgc2VydmljZSBpZGVudGlmaWVyLgotICBzdGF0aWMgYXNpbzo6aW9fc2VydmljZTo6aWQgaWQ7Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAgLy8gVGhlIHR5cGUgb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotICB0eXBlZGVmIGRldGFpbDo6cmVhY3RpdmVfZGVzY3JpcHRvcl9zZXJ2aWNlIHNlcnZpY2VfaW1wbF90eXBlOwotCi1wdWJsaWM6Ci0gIC8vLyBUaGUgdHlwZSBvZiBhIHN0cmVhbSBkZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgc2VydmljZV9pbXBsX3R5cGU6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbmRpZgotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGVfdHlwZS4pIFRoZSBuYXRpdmUgZGVzY3JpcHRvciB0eXBlLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgbmF0aXZlX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHNlcnZpY2VfaW1wbF90eXBlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gVGhlIG5hdGl2ZSBkZXNjcmlwdG9yIHR5cGUuCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHNlcnZpY2VfaW1wbF90eXBlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZV90eXBlOwotI2VuZGlmCi0KLSAgLy8vIENvbnN0cnVjdCBhIG5ldyBzdHJlYW0gZGVzY3JpcHRvciBzZXJ2aWNlIGZvciB0aGUgc3BlY2lmaWVkIGlvX3NlcnZpY2UuCi0gIGV4cGxpY2l0IHN0cmVhbV9kZXNjcmlwdG9yX3NlcnZpY2UoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPHN0cmVhbV9kZXNjcmlwdG9yX3NlcnZpY2U+KGlvX3NlcnZpY2UpLAotICAgICAgc2VydmljZV9pbXBsXyhpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgbmV3IHN0cmVhbSBkZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uLgotICB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5jb25zdHJ1Y3QoaW1wbCk7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyBzdHJlYW0gZGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8ubW92ZV9jb25zdHJ1Y3QoaW1wbCwgb3RoZXJfaW1wbCk7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIHN0cmVhbSBkZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBzdHJlYW1fZGVzY3JpcHRvcl9zZXJ2aWNlJiBvdGhlcl9zZXJ2aWNlLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8ubW92ZV9hc3NpZ24oaW1wbCwgb3RoZXJfc2VydmljZS5zZXJ2aWNlX2ltcGxfLCBvdGhlcl9pbXBsKTsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIERlc3Ryb3kgYSBzdHJlYW0gZGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBkZXN0cm95KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmRlc3Ryb3koaW1wbCk7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBkZXNjcmlwdG9yIHRvIGEgc3RyZWFtIGRlc2NyaXB0b3IuCi0gIGFzaW86OmVycm9yX2NvZGUgYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIG5hdGl2ZV9kZXNjcmlwdG9yLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5hc3NpZ24oaW1wbCwgbmF0aXZlX2Rlc2NyaXB0b3IsIGVjKTsKLSAgfQotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVzY3JpcHRvciBpcyBvcGVuLgotICBib29sIGlzX29wZW4oY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmlzX29wZW4oaW1wbCk7Ci0gIH0KLQotICAvLy8gQ2xvc2UgYSBzdHJlYW0gZGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjbG9zZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5jbG9zZShpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlKCkuKSBHZXQgdGhlIG5hdGl2ZSBkZXNjcmlwdG9yCi0gIC8vLyBpbXBsZW1lbnRhdGlvbi4KLSAgbmF0aXZlX3R5cGUgbmF0aXZlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfaGFuZGxlKGltcGwpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbmF0aXZlIGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfaGFuZGxlKGltcGwpOwotICB9Ci0KLSAgLy8vIFJlbGVhc2Ugb3duZXJzaGlwIG9mIHRoZSBuYXRpdmUgZGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgbmF0aXZlX2hhbmRsZV90eXBlIHJlbGVhc2UoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnJlbGVhc2UoaW1wbCk7Ci0gIH0KLQotICAvLy8gQ2FuY2VsIGFsbCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IuCi0gIGFzaW86OmVycm9yX2NvZGUgY2FuY2VsKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNhbmNlbChpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gUGVyZm9ybSBhbiBJTyBjb250cm9sIGNvbW1hbmQgb24gdGhlIGRlc2NyaXB0b3IuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJb0NvbnRyb2xDb21tYW5kPgotICBhc2lvOjplcnJvcl9jb2RlIGlvX2NvbnRyb2woaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIElvQ29udHJvbENvbW1hbmQmIGNvbW1hbmQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uaW9fY29udHJvbChpbXBsLCBjb21tYW5kLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIGRlc2NyaXB0b3IuCi0gIGJvb2wgbm9uX2Jsb2NraW5nKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5ub25fYmxvY2tpbmcoaW1wbCk7Ci0gIH0KLQotICAvLy8gU2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIGRlc2NyaXB0b3IuCi0gIGFzaW86OmVycm9yX2NvZGUgbm9uX2Jsb2NraW5nKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBib29sIG1vZGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubm9uX2Jsb2NraW5nKGltcGwsIG1vZGUsIGVjKTsKLSAgfQotCi0gIC8vLyBHZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIGJvb2wgbmF0aXZlX25vbl9ibG9ja2luZyhjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX25vbl9ibG9ja2luZyhpbXBsKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIGRlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgbmF0aXZlX25vbl9ibG9ja2luZyhpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYm9vbCBtb2RlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5hdGl2ZV9ub25fYmxvY2tpbmcoaW1wbCwgbW9kZSwgZWMpOwotICB9Ci0KLSAgLy8vIFdyaXRlIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBzdHJlYW0uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLndyaXRlX3NvbWUoaW1wbCwgYnVmZmVycywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3cml0ZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY193cml0ZV9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICBhc2lvOjpkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV9pbXBsXy5hc3luY193cml0ZV9zb21lKGltcGwsIGJ1ZmZlcnMsIGluaXQuaGFuZGxlcik7Ci0KLSAgICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci0gIH0KLQotICAvLy8gUmVhZCBzb21lIGRhdGEgZnJvbSB0aGUgc3RyZWFtLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWFkX3NvbWUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5yZWFkX3NvbWUoaW1wbCwgYnVmZmVycywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWFkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlYWRfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGFzaW86OmRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBSZWFkSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV9pbXBsXy5hc3luY19yZWFkX3NvbWUoaW1wbCwgYnVmZmVycywgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICB2b2lkIHNodXRkb3duX3NlcnZpY2UoKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5zaHV0ZG93bl9zZXJ2aWNlKCk7Ci0gIH0KLQotICAvLyBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCi0gIHNlcnZpY2VfaW1wbF90eXBlIHNlcnZpY2VfaW1wbF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBwb3NpeAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19QT1NJWF9TVFJFQU1fREVTQ1JJUFRPUikKLSAgICAgICAvLyAgIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jZW5kaWYgLy8gQVNJT19QT1NJWF9TVFJFQU1fREVTQ1JJUFRPUl9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3Jhd19zb2NrZXRfc2VydmljZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vcmF3X3NvY2tldF9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjMTMxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vcmF3X3NvY2tldF9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi0vLwotLy8gcmF3X3NvY2tldF9zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1JBV19TT0NLRVRfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19SQVdfU09DS0VUX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2FzeW5jX3Jlc3VsdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdHlwZV90cmFpdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9udWxsX3NvY2tldF9zZXJ2aWNlLmhwcCIKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3NlcnZpY2UuaHBwIgotI2Vsc2UKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlcnZpY2UuaHBwIgotI2VuZGlmCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBEZWZhdWx0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gZm9yIGEgcmF3IHNvY2tldC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLWNsYXNzIHJhd19zb2NrZXRfc2VydmljZQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICA6IHB1YmxpYyBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlCi0jZWxzZQotICA6IHB1YmxpYyBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxyYXdfc29ja2V0X3NlcnZpY2U8UHJvdG9jb2w+ID4KLSNlbmRpZgotewotcHVibGljOgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gVGhlIHVuaXF1ZSBzZXJ2aWNlIGlkZW50aWZpZXIuCi0gIHN0YXRpYyBhc2lvOjppb19zZXJ2aWNlOjppZCBpZDsKLSNlbmRpZgotCi0gIC8vLyBUaGUgcHJvdG9jb2wgdHlwZS4KLSAgdHlwZWRlZiBQcm90b2NvbCBwcm90b2NvbF90eXBlOwotCi0gIC8vLyBUaGUgZW5kcG9pbnQgdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQgZW5kcG9pbnRfdHlwZTsKLQotcHJpdmF0ZToKLSAgLy8gVGhlIHR5cGUgb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gIHR5cGVkZWYgZGV0YWlsOjpudWxsX3NvY2tldF9zZXJ2aWNlPFByb3RvY29sPiBzZXJ2aWNlX2ltcGxfdHlwZTsKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSAgdHlwZWRlZiBkZXRhaWw6Ondpbl9pb2NwX3NvY2tldF9zZXJ2aWNlPFByb3RvY29sPiBzZXJ2aWNlX2ltcGxfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgZGV0YWlsOjpyZWFjdGl2ZV9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gc2VydmljZV9pbXBsX3R5cGU7Ci0jZW5kaWYKLQotcHVibGljOgotICAvLy8gVGhlIHR5cGUgb2YgYSByYXcgc29ja2V0LgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgdHlwZW5hbWUgc2VydmljZV9pbXBsX3R5cGU6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbmRpZgotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGVfdHlwZS4pIFRoZSBuYXRpdmUgc29ja2V0IHR5cGUuCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBuYXRpdmVfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgdHlwZW5hbWUgc2VydmljZV9pbXBsX3R5cGU6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBUaGUgbmF0aXZlIHNvY2tldCB0eXBlLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgbmF0aXZlX2hhbmRsZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiB0eXBlbmFtZSBzZXJ2aWNlX2ltcGxfdHlwZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgcmF3IHNvY2tldCBzZXJ2aWNlIGZvciB0aGUgc3BlY2lmaWVkIGlvX3NlcnZpY2UuCi0gIGV4cGxpY2l0IHJhd19zb2NrZXRfc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8Ci0gICAgICAgIHJhd19zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gPihpb19zZXJ2aWNlKSwKLSAgICAgIHNlcnZpY2VfaW1wbF8oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIG5ldyByYXcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5jb25zdHJ1Y3QoaW1wbCk7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyByYXcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5tb3ZlX2NvbnN0cnVjdChpbXBsLCBvdGhlcl9pbXBsKTsKLSAgfQotCi0gIC8vLyBNb3ZlLWFzc2lnbiBmcm9tIGFub3RoZXIgcmF3IHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2Fzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgcmF3X3NvY2tldF9zZXJ2aWNlJiBvdGhlcl9zZXJ2aWNlLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8ubW92ZV9hc3NpZ24oaW1wbCwgb3RoZXJfc2VydmljZS5zZXJ2aWNlX2ltcGxfLCBvdGhlcl9pbXBsKTsKLSAgfQotCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyByYXcgc29ja2V0IGltcGxlbWVudGF0aW9uIGZyb20gYW5vdGhlciBwcm90b2NvbAotICAvLy8gdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sMT4KLSAgdm9pZCBjb252ZXJ0aW5nX21vdmVfY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICB0eXBlbmFtZSByYXdfc29ja2V0X3NlcnZpY2U8Ci0gICAgICAgIFByb3RvY29sMT46OmltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwsCi0gICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8Ci0gICAgICAgIFByb3RvY29sMSwgUHJvdG9jb2w+Ojp2YWx1ZT46OnR5cGUqID0gMCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8udGVtcGxhdGUgY29udmVydGluZ19tb3ZlX2NvbnN0cnVjdDxQcm90b2NvbDE+KAotICAgICAgICBpbXBsLCBvdGhlcl9pbXBsKTsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIERlc3Ryb3kgYSByYXcgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIGRlc3Ryb3koaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8uZGVzdHJveShpbXBsKTsKLSAgfQotCi0gIC8vIE9wZW4gYSBuZXcgcmF3IHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBvcGVuKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBpZiAocHJvdG9jb2wudHlwZSgpID09IEFTSU9fT1NfREVGKFNPQ0tfUkFXKSkKLSAgICAgIHNlcnZpY2VfaW1wbF8ub3BlbihpbXBsLCBwcm90b2NvbCwgZWMpOwotICAgIGVsc2UKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8vIEFzc2lnbiBhbiBleGlzdGluZyBuYXRpdmUgc29ja2V0IHRvIGEgcmF3IHNvY2tldC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhc3NpZ24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sLCBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIG5hdGl2ZV9zb2NrZXQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmFzc2lnbihpbXBsLCBwcm90b2NvbCwgbmF0aXZlX3NvY2tldCwgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgb3Blbi4KLSAgYm9vbCBpc19vcGVuKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5pc19vcGVuKGltcGwpOwotICB9Ci0KLSAgLy8vIENsb3NlIGEgcmF3IHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjbG9zZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5jbG9zZShpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlKCkuKSBHZXQgdGhlIG5hdGl2ZSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIG5hdGl2ZV90eXBlIG5hdGl2ZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX2hhbmRsZShpbXBsKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIG5hdGl2ZSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfaGFuZGxlKGltcGwpOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbGwgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2NrZXQuCi0gIGFzaW86OmVycm9yX2NvZGUgY2FuY2VsKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNhbmNlbChpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBhdCB0aGUgb3V0LW9mLWJhbmQgZGF0YSBtYXJrLgotICBib29sIGF0X21hcmsoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uYXRfbWFyayhpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGZvciByZWFkaW5nLgotICBzdGQ6OnNpemVfdCBhdmFpbGFibGUoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uYXZhaWxhYmxlKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vIEJpbmQgdGhlIHJhdyBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhbCBlbmRwb2ludC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBiaW5kKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5iaW5kKGltcGwsIGVuZHBvaW50LCBlYyk7Ci0gIH0KLQotICAvLy8gQ29ubmVjdCB0aGUgcmF3IHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LgotICBhc2lvOjplcnJvcl9jb2RlIGNvbm5lY3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIHBlZXJfZW5kcG9pbnQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uY29ubmVjdChpbXBsLCBwZWVyX2VuZHBvaW50LCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIGNvbm5lY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25uZWN0SGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoQ29ubmVjdEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlKSkKLSAgYXN5bmNfY29ubmVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgcGVlcl9lbmRwb2ludCwKLSAgICAgIEFTSU9fTU9WRV9BUkcoQ29ubmVjdEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgICAgQ29ubmVjdEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChDb25uZWN0SGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV9pbXBsXy5hc3luY19jb25uZWN0KGltcGwsIHBlZXJfZW5kcG9pbnQsIGluaXQuaGFuZGxlcik7Ci0KLSAgICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci0gIH0KLQotICAvLy8gU2V0IGEgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNldHRhYmxlU29ja2V0T3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIHNldF9vcHRpb24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IFNldHRhYmxlU29ja2V0T3B0aW9uJiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2V0X29wdGlvbihpbXBsLCBvcHRpb24sIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgYSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgR2V0dGFibGVTb2NrZXRPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgZ2V0X29wdGlvbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgR2V0dGFibGVTb2NrZXRPcHRpb24mIG9wdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5nZXRfb3B0aW9uKGltcGwsIG9wdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gYW4gSU8gY29udHJvbCBjb21tYW5kIG9uIHRoZSBzb2NrZXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJb0NvbnRyb2xDb21tYW5kPgotICBhc2lvOjplcnJvcl9jb2RlIGlvX2NvbnRyb2woaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIElvQ29udHJvbENvbW1hbmQmIGNvbW1hbmQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uaW9fY29udHJvbChpbXBsLCBjb21tYW5kLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIHNvY2tldC4KLSAgYm9vbCBub25fYmxvY2tpbmcoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5vbl9ibG9ja2luZyhpbXBsKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIG5vbl9ibG9ja2luZyhpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYm9vbCBtb2RlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5vbl9ibG9ja2luZyhpbXBsLCBtb2RlLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIG5hdGl2ZSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIGJvb2wgbmF0aXZlX25vbl9ibG9ja2luZyhjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX25vbl9ibG9ja2luZyhpbXBsKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBuYXRpdmVfbm9uX2Jsb2NraW5nKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBib29sIG1vZGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX25vbl9ibG9ja2luZyhpbXBsLCBtb2RlLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBsb2NhbCBlbmRwb2ludC4KLSAgZW5kcG9pbnRfdHlwZSBsb2NhbF9lbmRwb2ludChjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5sb2NhbF9lbmRwb2ludChpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSByZW1vdGUgZW5kcG9pbnQuCi0gIGVuZHBvaW50X3R5cGUgcmVtb3RlX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnJlbW90ZV9lbmRwb2ludChpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gRGlzYWJsZSBzZW5kcyBvciByZWNlaXZlcyBvbiB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIHNodXRkb3duKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBzb2NrZXRfYmFzZTo6c2h1dGRvd25fdHlwZSB3aGF0LCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnNodXRkb3duKGltcGwsIHdoYXQsIGVjKTsKLSAgfQotCi0gIC8vLyBTZW5kIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBwZWVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgc2VuZChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnNlbmQoaW1wbCwgYnVmZmVycywgZmxhZ3MsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgc2VuZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19zZW5kKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFdyaXRlSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICAgIHNlcnZpY2VfaW1wbF8uYXN5bmNfc2VuZChpbXBsLCBidWZmZXJzLCBmbGFncywgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBTZW5kIHJhdyBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBzZW5kX3RvKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBjb25zdCBlbmRwb2ludF90eXBlJiBkZXN0aW5hdGlvbiwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnNlbmRfdG8oaW1wbCwgYnVmZmVycywgZGVzdGluYXRpb24sIGZsYWdzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfc2VuZF90byhpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgY29uc3QgZW5kcG9pbnRfdHlwZSYgZGVzdGluYXRpb24sCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywKLSAgICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFdyaXRlSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICAgIHNlcnZpY2VfaW1wbF8uYXN5bmNfc2VuZF90byhpbXBsLCBidWZmZXJzLAotICAgICAgICBkZXN0aW5hdGlvbiwgZmxhZ3MsIGluaXQuaGFuZGxlcik7Ci0KLSAgICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci0gIH0KLQotICAvLy8gUmVjZWl2ZSBzb21lIGRhdGEgZnJvbSB0aGUgcGVlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVjZWl2ZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ucmVjZWl2ZShpbXBsLCBidWZmZXJzLCBmbGFncywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWNlaXZlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlY2VpdmUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBSZWFkSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV9pbXBsXy5hc3luY19yZWNlaXZlKGltcGwsIGJ1ZmZlcnMsIGZsYWdzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLSAgLy8vIFJlY2VpdmUgcmF3IGRhdGEgd2l0aCB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbmRlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVjZWl2ZV9mcm9tKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGVuZHBvaW50X3R5cGUmIHNlbmRlcl9lbmRwb2ludCwKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnJlY2VpdmVfZnJvbShpbXBsLCBidWZmZXJzLCBzZW5kZXJfZW5kcG9pbnQsIGZsYWdzLAotICAgICAgICBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUgdGhhdCB3aWxsIGdldCB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlbmRlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19yZWNlaXZlX2Zyb20oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgZW5kcG9pbnRfdHlwZSYgc2VuZGVyX2VuZHBvaW50LAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3JlY2VpdmVfZnJvbShpbXBsLCBidWZmZXJzLAotICAgICAgICBzZW5kZXJfZW5kcG9pbnQsIGZsYWdzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIHZvaWQgc2h1dGRvd25fc2VydmljZSgpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLnNodXRkb3duX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSAgc2VydmljZV9pbXBsX3R5cGUgc2VydmljZV9pbXBsXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fUkFXX1NPQ0tFVF9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3JlYWQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3JlYWQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjhiNmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9yZWFkLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0vLwotLy8gcmVhZC5ocHAKLS8vIH5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fUkVBRF9IUFAKLSNkZWZpbmUgQVNJT19SRUFEX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc3RyZWFtYnVmX2Z3ZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8qKgotICogQGRlZmdyb3VwIHJlYWQgYXNpbzo6cmVhZAotICoKLSAqIEBicmllZiBBdHRlbXB0IHRvIHJlYWQgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGZyb20gYSBzdHJlYW0gYmVmb3JlCi0gKiByZXR1cm5pbmcuCi0gKi8KLS8qQHsqLwotCi0vLy8gQXR0ZW1wdCB0byByZWFkIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBmcm9tIGEgc3RyZWFtIGJlZm9yZSByZXR1cm5pbmcuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSBmcm9tIGEKLSAqIHN0cmVhbS4gVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIFRoZSBzdXBwbGllZCBidWZmZXJzIGFyZSBmdWxsLiBUaGF0IGlzLCB0aGUgYnl0ZXMgdHJhbnNmZXJyZWQgaXMgZXF1YWwgdG8KLSAqIHRoZSBzdW0gb2YgdGhlIGJ1ZmZlciBzaXplcy4KLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogcmVhZF9zb21lIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmVhZFN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuIFRoZSBzdW0KLSAqIG9mIHRoZSBidWZmZXIgc2l6ZXMgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlCi0gKiBzdHJlYW0uCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KLSAqCi0gKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHJlYWQgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSBhc2lvOjpyZWFkKHMsIGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSk7IEBlbmRjb2RlCi0gKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlYWRpbmcgaW50byBtdWx0aXBsZQotICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAqIHN0ZDo6dmVjdG9yLgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nOgotICogQGNvZGUgYXNpbzo6cmVhZCgKLSAqICAgICBzLCBidWZmZXJzLAotICogICAgIGFzaW86OnRyYW5zZmVyX2FsbCgpKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci1zdGQ6OnNpemVfdCByZWFkKFN5bmNSZWFkU3RyZWFtJiBzLCBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpOwotCi0vLy8gQXR0ZW1wdCB0byByZWFkIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBmcm9tIGEgc3RyZWFtIGJlZm9yZSByZXR1cm5pbmcuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSBmcm9tIGEKLSAqIHN0cmVhbS4gVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIFRoZSBzdXBwbGllZCBidWZmZXJzIGFyZSBmdWxsLiBUaGF0IGlzLCB0aGUgYnl0ZXMgdHJhbnNmZXJyZWQgaXMgZXF1YWwgdG8KLSAqIHRoZSBzdW0gb2YgdGhlIGJ1ZmZlciBzaXplcy4KLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogcmVhZF9zb21lIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmVhZFN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuIFRoZSBzdW0KLSAqIG9mIHRoZSBidWZmZXIgc2l6ZXMgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlCi0gKiBzdHJlYW0uCi0gKgotICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHJlYWQgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSBhc2lvOjpyZWFkKHMsIGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgZWMpOyBAZW5kY29kZQotICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWFkaW5nIGludG8gbXVsdGlwbGUKLSAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gKiBzdGQ6OnZlY3Rvci4KLSAqCi0gKiBAbm90ZSBUaGlzIG92ZXJsb2FkIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZzoKLSAqIEBjb2RlIGFzaW86OnJlYWQoCi0gKiAgICAgcywgYnVmZmVycywKLSAqICAgICBhc2lvOjp0cmFuc2Zlcl9hbGwoKSwgZWMpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLXN0ZDo6c2l6ZV90IHJlYWQoU3luY1JlYWRTdHJlYW0mIHMsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLS8vLyBBdHRlbXB0IHRvIHJlYWQgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGZyb20gYSBzdHJlYW0gYmVmb3JlIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGZyb20gYQotICogc3RyZWFtLiBUaGUgY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgVGhlIHN1cHBsaWVkIGJ1ZmZlcnMgYXJlIGZ1bGwuIFRoYXQgaXMsIHRoZSBieXRlcyB0cmFuc2ZlcnJlZCBpcyBlcXVhbCB0bwotICogdGhlIHN1bSBvZiB0aGUgYnVmZmVyIHNpemVzLgotICoKLSAqIEBsaSBUaGUgY29tcGxldGlvbl9jb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IHJldHVybnMgMC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiByZWFkX3NvbWUgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHJlYWQuIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNSZWFkU3RyZWFtIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4gVGhlIHN1bQotICogb2YgdGhlIGJ1ZmZlciBzaXplcyBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUKLSAqIHN0cmVhbS4KLSAqCi0gKiBAcGFyYW0gY29tcGxldGlvbl9jb25kaXRpb24gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lCi0gKiB3aGV0aGVyIHRoZSByZWFkIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gVGhlIHNpZ25hdHVyZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0Ci0gKiBtdXN0IGJlOgotICogQGNvZGUgc3RkOjpzaXplX3QgY29tcGxldGlvbl9jb25kaXRpb24oCi0gKiAgIC8vIFJlc3VsdCBvZiBsYXRlc3QgcmVhZF9zb21lIG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgc28gZmFyLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIEEgcmV0dXJuIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIHJlYWQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBBIG5vbi16ZXJvCi0gKiByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkIG9uIHRoZSBuZXh0Ci0gKiBjYWxsIHRvIHRoZSBzdHJlYW0ncyByZWFkX3NvbWUgZnVuY3Rpb24uCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KLSAqCi0gKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHJlYWQgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSBhc2lvOjpyZWFkKHMsIGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwKLSAqICAgICBhc2lvOjp0cmFuc2Zlcl9hdF9sZWFzdCgzMikpOyBAZW5kY29kZQotICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWFkaW5nIGludG8gbXVsdGlwbGUKLSAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gKiBzdGQ6OnZlY3Rvci4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsCi0gIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24+Ci1zdGQ6OnNpemVfdCByZWFkKFN5bmNSZWFkU3RyZWFtJiBzLCBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbik7Ci0KLS8vLyBBdHRlbXB0IHRvIHJlYWQgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGZyb20gYSBzdHJlYW0gYmVmb3JlIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGZyb20gYQotICogc3RyZWFtLiBUaGUgY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgVGhlIHN1cHBsaWVkIGJ1ZmZlcnMgYXJlIGZ1bGwuIFRoYXQgaXMsIHRoZSBieXRlcyB0cmFuc2ZlcnJlZCBpcyBlcXVhbCB0bwotICogdGhlIHN1bSBvZiB0aGUgYnVmZmVyIHNpemVzLgotICoKLSAqIEBsaSBUaGUgY29tcGxldGlvbl9jb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IHJldHVybnMgMC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiByZWFkX3NvbWUgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHJlYWQuIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNSZWFkU3RyZWFtIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4gVGhlIHN1bQotICogb2YgdGhlIGJ1ZmZlciBzaXplcyBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUKLSAqIHN0cmVhbS4KLSAqCi0gKiBAcGFyYW0gY29tcGxldGlvbl9jb25kaXRpb24gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lCi0gKiB3aGV0aGVyIHRoZSByZWFkIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gVGhlIHNpZ25hdHVyZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0Ci0gKiBtdXN0IGJlOgotICogQGNvZGUgc3RkOjpzaXplX3QgY29tcGxldGlvbl9jb25kaXRpb24oCi0gKiAgIC8vIFJlc3VsdCBvZiBsYXRlc3QgcmVhZF9zb21lIG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgc28gZmFyLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIEEgcmV0dXJuIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIHJlYWQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBBIG5vbi16ZXJvCi0gKiByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkIG9uIHRoZSBuZXh0Ci0gKiBjYWxsIHRvIHRoZSBzdHJlYW0ncyByZWFkX3NvbWUgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWFkLiBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybnMgdGhlIHRvdGFsCi0gKiBudW1iZXIgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkIHByaW9yIHRvIHRoZSBlcnJvci4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbj4KLXN0ZDo6c2l6ZV90IHJlYWQoU3luY1JlYWRTdHJlYW0mIHMsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0vLy8gQXR0ZW1wdCB0byByZWFkIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBmcm9tIGEgc3RyZWFtIGJlZm9yZSByZXR1cm5pbmcuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSBmcm9tIGEKLSAqIHN0cmVhbS4gVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIFRoZSBzdXBwbGllZCBidWZmZXIgaXMgZnVsbCAodGhhdCBpcywgaXQgaGFzIHJlYWNoZWQgbWF4aW11bSBzaXplKS4KLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogcmVhZF9zb21lIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmVhZFN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIFRoZSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQuCi0gKgotICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gKgotICogQG5vdGUgVGhpcyBvdmVybG9hZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmc6Ci0gKiBAY29kZSBhc2lvOjpyZWFkKAotICogICAgIHMsIGIsCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYWxsKCkpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvcj4KLXN0ZDo6c2l6ZV90IHJlYWQoU3luY1JlYWRTdHJlYW0mIHMsIGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiKTsKLQotLy8vIEF0dGVtcHQgdG8gcmVhZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgZnJvbSBhIHN0cmVhbSBiZWZvcmUgcmV0dXJuaW5nLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgZnJvbSBhCi0gKiBzdHJlYW0uIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBUaGUgc3VwcGxpZWQgYnVmZmVyIGlzIGZ1bGwgKHRoYXQgaXMsIGl0IGhhcyByZWFjaGVkIG1heGltdW0gc2l6ZSkuCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgc3RyZWFtJ3MKLSAqIHJlYWRfc29tZSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc3RyZWFtIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JlYWRTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYiBUaGUgYmFzaWNfc3RyZWFtYnVmIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAqCi0gKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nOgotICogQGNvZGUgYXNpbzo6cmVhZCgKLSAqICAgICBzLCBiLAotICogICAgIGFzaW86OnRyYW5zZmVyX2FsbCgpLCBlYyk7IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yPgotc3RkOjpzaXplX3QgcmVhZChTeW5jUmVhZFN0cmVhbSYgcywgYmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0vLy8gQXR0ZW1wdCB0byByZWFkIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBmcm9tIGEgc3RyZWFtIGJlZm9yZSByZXR1cm5pbmcuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSBmcm9tIGEKLSAqIHN0cmVhbS4gVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIFRoZSBzdXBwbGllZCBidWZmZXIgaXMgZnVsbCAodGhhdCBpcywgaXQgaGFzIHJlYWNoZWQgbWF4aW11bSBzaXplKS4KLSAqCi0gKiBAbGkgVGhlIGNvbXBsZXRpb25fY29uZGl0aW9uIGZ1bmN0aW9uIG9iamVjdCByZXR1cm5zIDAuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogcmVhZF9zb21lIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmVhZFN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIFRoZSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBjb21wbGV0aW9uX2NvbmRpdGlvbiBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUKLSAqIHdoZXRoZXIgdGhlIHJlYWQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QKLSAqIG11c3QgYmU6Ci0gKiBAY29kZSBzdGQ6OnNpemVfdCBjb21wbGV0aW9uX2NvbmRpdGlvbigKLSAqICAgLy8gUmVzdWx0IG9mIGxhdGVzdCByZWFkX3NvbWUgb3BlcmF0aW9uLgotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqCi0gKiAgIC8vIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBzbyBmYXIuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogQSByZXR1cm4gdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVhZCBvcGVyYXRpb24gaXMgY29tcGxldGUuIEEgbm9uLXplcm8KLSAqIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQgb24gdGhlIG5leHQKLSAqIGNhbGwgdG8gdGhlIHN0cmVhbSdzIHJlYWRfc29tZSBmdW5jdGlvbi4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLgotICoKLSAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotc3RkOjpzaXplX3QgcmVhZChTeW5jUmVhZFN0cmVhbSYgcywgYmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbik7Ci0KLS8vLyBBdHRlbXB0IHRvIHJlYWQgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGZyb20gYSBzdHJlYW0gYmVmb3JlIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGZyb20gYQotICogc3RyZWFtLiBUaGUgY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgVGhlIHN1cHBsaWVkIGJ1ZmZlciBpcyBmdWxsICh0aGF0IGlzLCBpdCBoYXMgcmVhY2hlZCBtYXhpbXVtIHNpemUpLgotICoKLSAqIEBsaSBUaGUgY29tcGxldGlvbl9jb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IHJldHVybnMgMC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiByZWFkX3NvbWUgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHJlYWQuIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNSZWFkU3RyZWFtIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIGIgVGhlIGJhc2ljX3N0cmVhbWJ1ZiBvYmplY3QgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgcmVhZCBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdAotICogbXVzdCBiZToKLSAqIEBjb2RlIHN0ZDo6c2l6ZV90IGNvbXBsZXRpb25fY29uZGl0aW9uKAotICogICAvLyBSZXN1bHQgb2YgbGF0ZXN0IHJlYWRfc29tZSBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhci4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBBIHJldHVybiB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSByZWFkIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQSBub24temVybwotICogcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBvbiB0aGUgbmV4dAotICogY2FsbCB0byB0aGUgc3RyZWFtJ3MgcmVhZF9zb21lIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm5zIHRoZSB0b3RhbAotICogbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCBwcmlvciB0byB0aGUgZXJyb3IuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24+Ci1zdGQ6OnNpemVfdCByZWFkKFN5bmNSZWFkU3RyZWFtJiBzLCBiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0vKkB9Ki8KLS8qKgotICogQGRlZmdyb3VwIGFzeW5jX3JlYWQgYXNpbzo6YXN5bmNfcmVhZAotICoKLSAqIEBicmllZiBTdGFydCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHJlYWQgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGZyb20KLSAqIGEgc3RyZWFtLgotICovCi0vKkB7Ki8KLQotLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gcmVhZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgZnJvbSBhCi0vLy8gc3RyZWFtLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mCi0gKiBkYXRhIGZyb20gYSBzdHJlYW0uIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LiBUaGUKLSAqIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2lsbCBjb250aW51ZSB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzCi0gKiB0cnVlOgotICoKLSAqIEBsaSBUaGUgc3VwcGxpZWQgYnVmZmVycyBhcmUgZnVsbC4gVGhhdCBpcywgdGhlIGJ5dGVzIHRyYW5zZmVycmVkIGlzIGVxdWFsIHRvCi0gKiB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgc3RyZWFtJ3MKLSAqIGFzeW5jX3JlYWRfc29tZSBmdW5jdGlvbiwgYW5kIGlzIGtub3duIGFzIGEgPGVtPmNvbXBvc2VkIG9wZXJhdGlvbjwvZW0+LiBUaGUKLSAqIHByb2dyYW0gbXVzdCBlbnN1cmUgdGhhdCB0aGUgc3RyZWFtIHBlcmZvcm1zIG5vIG90aGVyIHJlYWQgb3BlcmF0aW9ucyAoc3VjaAotICogYXMgYXN5bmNfcmVhZCwgdGhlIHN0cmVhbSdzIGFzeW5jX3JlYWRfc29tZSBmdW5jdGlvbiwgb3IgYW55IG90aGVyIGNvbXBvc2VkCi0gKiBvcGVyYXRpb25zIHRoYXQgcGVyZm9ybSByZWFkcykgdW50aWwgdGhpcyBvcGVyYXRpb24gY29tcGxldGVzLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBBc3luY1JlYWRTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLiBUaGUgc3VtCi0gKiBvZiB0aGUgYnVmZmVyIHNpemVzIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZQotICogc3RyZWFtLiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZgotICogdGhlIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gKgotICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlYWQgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gKiBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICoKLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBjb3BpZWQgaW50byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMuIElmIGFuIGVycm9yIG9jY3VycmVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGJlIHRoZSAgbnVtYmVyIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlcyBzdWNjZXNzZnVsbHkgdHJhbnNmZXJyZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW9yIHRvIHRoZSBlcnJvci4KLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbiBvZgotICogdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogVG8gcmVhZCBpbnRvIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAqIEBjb2RlCi0gKiBhc2lvOjphc3luY19yZWFkKHMsIGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgaGFuZGxlcik7Ci0gKiBAZW5kY29kZQotICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWFkaW5nIGludG8gbXVsdGlwbGUKLSAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gKiBzdGQ6OnZlY3Rvci4KLSAqCi0gKiBAbm90ZSBUaGlzIG92ZXJsb2FkIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZzoKLSAqIEBjb2RlIGFzaW86OmFzeW5jX3JlYWQoCi0gKiAgICAgcywgYnVmZmVycywKLSAqICAgICBhc2lvOjp0cmFuc2Zlcl9hbGwoKSwKLSAqICAgICBoYW5kbGVyKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYXN5bmNfcmVhZChBc3luY1JlYWRTdHJlYW0mIHMsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKTsKLQotLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gcmVhZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgZnJvbSBhCi0vLy8gc3RyZWFtLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mCi0gKiBkYXRhIGZyb20gYSBzdHJlYW0uIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LiBUaGUKLSAqIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2lsbCBjb250aW51ZSB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzCi0gKiB0cnVlOgotICoKLSAqIEBsaSBUaGUgc3VwcGxpZWQgYnVmZmVycyBhcmUgZnVsbC4gVGhhdCBpcywgdGhlIGJ5dGVzIHRyYW5zZmVycmVkIGlzIGVxdWFsIHRvCi0gKiB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIFRoZSBjb21wbGV0aW9uX2NvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyAwLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBBc3luY1JlYWRTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLiBUaGUgc3VtCi0gKiBvZiB0aGUgYnVmZmVyIHNpemVzIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZQotICogc3RyZWFtLiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZgotICogdGhlIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgcmVhZCBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdAotICogbXVzdCBiZToKLSAqIEBjb2RlIHN0ZDo6c2l6ZV90IGNvbXBsZXRpb25fY29uZGl0aW9uKAotICogICAvLyBSZXN1bHQgb2YgbGF0ZXN0IGFzeW5jX3JlYWRfc29tZSBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhci4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBBIHJldHVybiB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSByZWFkIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQSBub24temVybwotICogcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBvbiB0aGUgbmV4dAotICogY2FsbCB0byB0aGUgc3RyZWFtJ3MgYXN5bmNfcmVhZF9zb21lIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWFkIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZQotICogaGFuZGxlciBtdXN0IGJlOgotICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAqCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJzLiBJZiBhbiBlcnJvciBvY2N1cnJlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSB0aGUgIG51bWJlciBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZXMgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmlvciB0byB0aGUgZXJyb3IuCi0gKiApOyBAZW5kY29kZQotICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24gb2YKLSAqIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHJlYWQgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSBhc2lvOjphc3luY19yZWFkKHMsCi0gKiAgICAgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLAotICogICAgIGFzaW86OnRyYW5zZmVyX2F0X2xlYXN0KDMyKSwKLSAqICAgICBoYW5kbGVyKTsgQGVuZGNvZGUKLSAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gcmVhZGluZyBpbnRvIG11bHRpcGxlCi0gKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICogc3RkOjp2ZWN0b3IuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLWFzeW5jX3JlYWQoQXN5bmNSZWFkU3RyZWFtJiBzLCBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbiwKLSAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKTsKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHJlYWQgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGZyb20gYQotLy8vIHN0cmVhbS4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlYWQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZgotICogZGF0YSBmcm9tIGEgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4gVGhlCi0gKiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdpbGwgY29udGludWUgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcwotICogdHJ1ZToKLSAqCi0gKiBAbGkgVGhlIHN1cHBsaWVkIGJ1ZmZlciBpcyBmdWxsICh0aGF0IGlzLCBpdCBoYXMgcmVhY2hlZCBtYXhpbXVtIHNpemUpLgotICoKLSAqIEBsaSBBbiBlcnJvciBvY2N1cnJlZC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiBhc3luY19yZWFkX3NvbWUgZnVuY3Rpb24sIGFuZCBpcyBrbm93biBhcyBhIDxlbT5jb21wb3NlZCBvcGVyYXRpb248L2VtPi4gVGhlCi0gKiBwcm9ncmFtIG11c3QgZW5zdXJlIHRoYXQgdGhlIHN0cmVhbSBwZXJmb3JtcyBubyBvdGhlciByZWFkIG9wZXJhdGlvbnMgKHN1Y2gKLSAqIGFzIGFzeW5jX3JlYWQsIHRoZSBzdHJlYW0ncyBhc3luY19yZWFkX3NvbWUgZnVuY3Rpb24sIG9yIGFueSBvdGhlciBjb21wb3NlZAotICogb3BlcmF0aW9ucyB0aGF0IHBlcmZvcm0gcmVhZHMpIHVudGlsIHRoaXMgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc3RyZWFtIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgQXN5bmNSZWFkU3RyZWFtIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIGIgQSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLiBPd25lcnNoaXAKLSAqIG9mIHRoZSBzdHJlYW1idWYgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCBpdAotICogcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gKgotICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlYWQgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gKiBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICoKLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBjb3BpZWQgaW50byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMuIElmIGFuIGVycm9yIG9jY3VycmVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGJlIHRoZSAgbnVtYmVyIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlcyBzdWNjZXNzZnVsbHkgdHJhbnNmZXJyZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW9yIHRvIHRoZSBlcnJvci4KLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbiBvZgotICogdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nOgotICogQGNvZGUgYXNpbzo6YXN5bmNfcmVhZCgKLSAqICAgICBzLCBiLAotICogICAgIGFzaW86OnRyYW5zZmVyX2FsbCgpLAotICogICAgIGhhbmRsZXIpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYXN5bmNfcmVhZChBc3luY1JlYWRTdHJlYW0mIHMsIGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpOwotCi0vLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB0byByZWFkIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBmcm9tIGEKLS8vLyBzdHJlYW0uCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWFkIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YKLSAqIGRhdGEgZnJvbSBhIHN0cmVhbS4gVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuIFRoZQotICogYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aWxsIGNvbnRpbnVlIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMKLSAqIHRydWU6Ci0gKgotICogQGxpIFRoZSBzdXBwbGllZCBidWZmZXIgaXMgZnVsbCAodGhhdCBpcywgaXQgaGFzIHJlYWNoZWQgbWF4aW11bSBzaXplKS4KLSAqCi0gKiBAbGkgVGhlIGNvbXBsZXRpb25fY29uZGl0aW9uIGZ1bmN0aW9uIG9iamVjdCByZXR1cm5zIDAuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogYXN5bmNfcmVhZF9zb21lIGZ1bmN0aW9uLCBhbmQgaXMga25vd24gYXMgYSA8ZW0+Y29tcG9zZWQgb3BlcmF0aW9uPC9lbT4uIFRoZQotICogcHJvZ3JhbSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBzdHJlYW0gcGVyZm9ybXMgbm8gb3RoZXIgcmVhZCBvcGVyYXRpb25zIChzdWNoCi0gKiBhcyBhc3luY19yZWFkLCB0aGUgc3RyZWFtJ3MgYXN5bmNfcmVhZF9zb21lIGZ1bmN0aW9uLCBvciBhbnkgb3RoZXIgY29tcG9zZWQKLSAqIG9wZXJhdGlvbnMgdGhhdCBwZXJmb3JtIHJlYWRzKSB1bnRpbCB0aGlzIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHJlYWQuIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIEFzeW5jUmVhZFN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIEEgYmFzaWNfc3RyZWFtYnVmIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4gT3duZXJzaGlwCi0gKiBvZiB0aGUgc3RyZWFtYnVmIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlIHRoYXQgaXQKLSAqIHJlbWFpbnMgdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICoKLSAqIEBwYXJhbSBjb21wbGV0aW9uX2NvbmRpdGlvbiBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUKLSAqIHdoZXRoZXIgdGhlIHJlYWQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QKLSAqIG11c3QgYmU6Ci0gKiBAY29kZSBzdGQ6OnNpemVfdCBjb21wbGV0aW9uX2NvbmRpdGlvbigKLSAqICAgLy8gUmVzdWx0IG9mIGxhdGVzdCBhc3luY19yZWFkX3NvbWUgb3BlcmF0aW9uLgotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqCi0gKiAgIC8vIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBzbyBmYXIuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogQSByZXR1cm4gdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVhZCBvcGVyYXRpb24gaXMgY29tcGxldGUuIEEgbm9uLXplcm8KLSAqIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQgb24gdGhlIG5leHQKLSAqIGNhbGwgdG8gdGhlIHN0cmVhbSdzIGFzeW5jX3JlYWRfc29tZSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcmVhZCBvcGVyYXRpb24gY29tcGxldGVzLgotICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUKLSAqIGhhbmRsZXIgbXVzdCBiZToKLSAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gKgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycy4gSWYgYW4gZXJyb3Igb2NjdXJyZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgYmUgdGhlICBudW1iZXIgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGVzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpb3IgdG8gdGhlIGVycm9yLgotICogKTsgQGVuZGNvZGUKLSAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uIG9mCi0gKiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLWFzeW5jX3JlYWQoQXN5bmNSZWFkU3RyZWFtJiBzLCBiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpOwotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotLypAfSovCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vaW1wbC9yZWFkLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fUkVBRF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9yZWFkX2F0LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9yZWFkX2F0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyOTFmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vcmVhZF9hdC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotLy8KLS8vIHJlYWRfYXQuaHBwCi0vLyB+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1JFQURfQVRfSFBQCi0jZGVmaW5lIEFTSU9fUkVBRF9BVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3N0cmVhbWJ1Zl9md2QuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NzdGRpbnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0vKioKLSAqIEBkZWZncm91cCByZWFkX2F0IGFzaW86OnJlYWRfYXQKLSAqCi0gKiBAYnJpZWYgQXR0ZW1wdCB0byByZWFkIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldAotICogYmVmb3JlIHJldHVybmluZy4KLSAqLwotLypAeyovCi0KLS8vLyBBdHRlbXB0IHRvIHJlYWQgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGJlZm9yZQotLy8vIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGZyb20gYQotICogcmFuZG9tIGFjY2VzcyBkZXZpY2UgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lCi0gKiBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgVGhlIHN1cHBsaWVkIGJ1ZmZlcnMgYXJlIGZ1bGwuIFRoYXQgaXMsIHRoZSBieXRlcyB0cmFuc2ZlcnJlZCBpcyBlcXVhbCB0bwotICogdGhlIHN1bSBvZiB0aGUgYnVmZmVyIHNpemVzLgotICoKLSAqIEBsaSBBbiBlcnJvciBvY2N1cnJlZC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIGRldmljZSdzCi0gKiByZWFkX3NvbWVfYXQgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGQgVGhlIGRldmljZSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHJlYWQuIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAqCi0gKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLiBUaGUgc3VtCi0gKiBvZiB0aGUgYnVmZmVyIHNpemVzIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZQotICogZGV2aWNlLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQuCi0gKgotICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUbyByZWFkIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICogQGNvZGUgYXNpbzo6cmVhZF9hdChkLCA0MiwgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpKTsgQGVuZGNvZGUKLSAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gcmVhZGluZyBpbnRvIG11bHRpcGxlCi0gKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICogc3RkOjp2ZWN0b3IuCi0gKgotICogQG5vdGUgVGhpcyBvdmVybG9hZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmc6Ci0gKiBAY29kZSBhc2lvOjpyZWFkX2F0KAotICogICAgIGQsIDQyLCBidWZmZXJzLAotICogICAgIGFzaW86OnRyYW5zZmVyX2FsbCgpKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci1zdGQ6OnNpemVfdCByZWFkX2F0KFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKTsKLQotLy8vIEF0dGVtcHQgdG8gcmVhZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYmVmb3JlCi0vLy8gcmV0dXJuaW5nLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgZnJvbSBhCi0gKiByYW5kb20gYWNjZXNzIGRldmljZSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4gVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUKLSAqIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBUaGUgc3VwcGxpZWQgYnVmZmVycyBhcmUgZnVsbC4gVGhhdCBpcywgdGhlIGJ5dGVzIHRyYW5zZmVycmVkIGlzIGVxdWFsIHRvCi0gKiB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIHJlYWRfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZCBUaGUgZGV2aWNlIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UgY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuIFRoZSBzdW0KLSAqIG9mIHRoZSBidWZmZXIgc2l6ZXMgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlCi0gKiBkZXZpY2UuCi0gKgotICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHJlYWQgaW50byBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSBhc2lvOjpyZWFkX2F0KGQsIDQyLAotICogICAgIGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgZWMpOyBAZW5kY29kZQotICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiByZWFkaW5nIGludG8gbXVsdGlwbGUKLSAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gKiBzdGQ6OnZlY3Rvci4KLSAqCi0gKiBAbm90ZSBUaGlzIG92ZXJsb2FkIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZzoKLSAqIEBjb2RlIGFzaW86OnJlYWRfYXQoCi0gKiAgICAgZCwgNDIsIGJ1ZmZlcnMsCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYWxsKCksIGVjKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci1zdGQ6OnNpemVfdCByZWFkX2F0KFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotLy8vIEF0dGVtcHQgdG8gcmVhZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYmVmb3JlCi0vLy8gcmV0dXJuaW5nLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgZnJvbSBhCi0gKiByYW5kb20gYWNjZXNzIGRldmljZSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4gVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUKLSAqIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBUaGUgc3VwcGxpZWQgYnVmZmVycyBhcmUgZnVsbC4gVGhhdCBpcywgdGhlIGJ5dGVzIHRyYW5zZmVycmVkIGlzIGVxdWFsIHRvCi0gKiB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIFRoZSBjb21wbGV0aW9uX2NvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyAwLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIHJlYWRfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZCBUaGUgZGV2aWNlIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UgY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuIFRoZSBzdW0KLSAqIG9mIHRoZSBidWZmZXIgc2l6ZXMgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlCi0gKiBkZXZpY2UuCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgcmVhZCBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdAotICogbXVzdCBiZToKLSAqIEBjb2RlIHN0ZDo6c2l6ZV90IGNvbXBsZXRpb25fY29uZGl0aW9uKAotICogICAvLyBSZXN1bHQgb2YgbGF0ZXN0IHJlYWRfc29tZV9hdCBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhci4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBBIHJldHVybiB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSByZWFkIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQSBub24temVybwotICogcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBvbiB0aGUgbmV4dAotICogY2FsbCB0byB0aGUgZGV2aWNlJ3MgcmVhZF9zb21lX2F0IGZ1bmN0aW9uLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQuCi0gKgotICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUbyByZWFkIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICogQGNvZGUgYXNpbzo6cmVhZF9hdChkLCA0MiwgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLAotICogICAgIGFzaW86OnRyYW5zZmVyX2F0X2xlYXN0KDMyKSk7IEBlbmRjb2RlCi0gKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlYWRpbmcgaW50byBtdWx0aXBsZQotICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAqIHN0ZDo6dmVjdG9yLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotc3RkOjpzaXplX3QgcmVhZF9hdChTeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uKTsKLQotLy8vIEF0dGVtcHQgdG8gcmVhZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYmVmb3JlCi0vLy8gcmV0dXJuaW5nLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgZnJvbSBhCi0gKiByYW5kb20gYWNjZXNzIGRldmljZSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4gVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUKLSAqIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBUaGUgc3VwcGxpZWQgYnVmZmVycyBhcmUgZnVsbC4gVGhhdCBpcywgdGhlIGJ5dGVzIHRyYW5zZmVycmVkIGlzIGVxdWFsIHRvCi0gKiB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIFRoZSBjb21wbGV0aW9uX2NvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyAwLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIHJlYWRfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZCBUaGUgZGV2aWNlIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UgY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuIFRoZSBzdW0KLSAqIG9mIHRoZSBidWZmZXIgc2l6ZXMgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlCi0gKiBkZXZpY2UuCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgcmVhZCBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdAotICogbXVzdCBiZToKLSAqIEBjb2RlIHN0ZDo6c2l6ZV90IGNvbXBsZXRpb25fY29uZGl0aW9uKAotICogICAvLyBSZXN1bHQgb2YgbGF0ZXN0IHJlYWRfc29tZV9hdCBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhci4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBBIHJldHVybiB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSByZWFkIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQSBub24temVybwotICogcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBvbiB0aGUgbmV4dAotICogY2FsbCB0byB0aGUgZGV2aWNlJ3MgcmVhZF9zb21lX2F0IGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm5zIHRoZSB0b3RhbAotICogbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCBwcmlvciB0byB0aGUgZXJyb3IuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24+Ci1zdGQ6OnNpemVfdCByZWFkX2F0KFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8vLyBBdHRlbXB0IHRvIHJlYWQgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGJlZm9yZQotLy8vIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGZyb20gYQotICogcmFuZG9tIGFjY2VzcyBkZXZpY2UgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lCi0gKiBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBkZXZpY2UncwotICogcmVhZF9zb21lX2F0IGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBkIFRoZSBkZXZpY2UgZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gKgotICogQHBhcmFtIGIgVGhlIGJhc2ljX3N0cmVhbWJ1ZiBvYmplY3QgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KLSAqCi0gKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAqCi0gKiBAbm90ZSBUaGlzIG92ZXJsb2FkIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZzoKLSAqIEBjb2RlIGFzaW86OnJlYWRfYXQoCi0gKiAgICAgZCwgNDIsIGIsCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYWxsKCkpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvcj4KLXN0ZDo6c2l6ZV90IHJlYWRfYXQoU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYik7Ci0KLS8vLyBBdHRlbXB0IHRvIHJlYWQgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0IGJlZm9yZQotLy8vIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGZyb20gYQotICogcmFuZG9tIGFjY2VzcyBkZXZpY2UgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lCi0gKiBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBkZXZpY2UncwotICogcmVhZF9zb21lX2F0IGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBkIFRoZSBkZXZpY2UgZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gKgotICogQHBhcmFtIGIgVGhlIGJhc2ljX3N0cmVhbWJ1ZiBvYmplY3QgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gKgotICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KLSAqCi0gKiBAbm90ZSBUaGlzIG92ZXJsb2FkIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZzoKLSAqIEBjb2RlIGFzaW86OnJlYWRfYXQoCi0gKiAgICAgZCwgNDIsIGIsCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYWxsKCksIGVjKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1zdGQ6OnNpemVfdCByZWFkX2F0KFN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgYmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0vLy8gQXR0ZW1wdCB0byByZWFkIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBiZWZvcmUKLS8vLyByZXR1cm5pbmcuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSBmcm9tIGEKLSAqIHJhbmRvbSBhY2Nlc3MgZGV2aWNlIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiBUaGUgY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZQotICogb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIFRoZSBjb21wbGV0aW9uX2NvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyAwLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIHJlYWRfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZCBUaGUgZGV2aWNlIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UgY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBiIFRoZSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBjb21wbGV0aW9uX2NvbmRpdGlvbiBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUKLSAqIHdoZXRoZXIgdGhlIHJlYWQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QKLSAqIG11c3QgYmU6Ci0gKiBAY29kZSBzdGQ6OnNpemVfdCBjb21wbGV0aW9uX2NvbmRpdGlvbigKLSAqICAgLy8gUmVzdWx0IG9mIGxhdGVzdCByZWFkX3NvbWVfYXQgb3BlcmF0aW9uLgotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqCi0gKiAgIC8vIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBzbyBmYXIuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogQSByZXR1cm4gdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVhZCBvcGVyYXRpb24gaXMgY29tcGxldGUuIEEgbm9uLXplcm8KLSAqIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQgb24gdGhlIG5leHQKLSAqIGNhbGwgdG8gdGhlIGRldmljZSdzIHJlYWRfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLgotICoKLSAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotc3RkOjpzaXplX3QgcmVhZF9hdChTeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24pOwotCi0vLy8gQXR0ZW1wdCB0byByZWFkIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBiZWZvcmUKLS8vLyByZXR1cm5pbmcuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSBmcm9tIGEKLSAqIHJhbmRvbSBhY2Nlc3MgZGV2aWNlIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiBUaGUgY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZQotICogb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIFRoZSBjb21wbGV0aW9uX2NvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyAwLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIHJlYWRfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZCBUaGUgZGV2aWNlIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UgY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBiIFRoZSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBjb21wbGV0aW9uX2NvbmRpdGlvbiBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUKLSAqIHdoZXRoZXIgdGhlIHJlYWQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QKLSAqIG11c3QgYmU6Ci0gKiBAY29kZSBzdGQ6OnNpemVfdCBjb21wbGV0aW9uX2NvbmRpdGlvbigKLSAqICAgLy8gUmVzdWx0IG9mIGxhdGVzdCByZWFkX3NvbWVfYXQgb3BlcmF0aW9uLgotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqCi0gKiAgIC8vIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBzbyBmYXIuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogQSByZXR1cm4gdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVhZCBvcGVyYXRpb24gaXMgY29tcGxldGUuIEEgbm9uLXplcm8KLSAqIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQgb24gdGhlIG5leHQKLSAqIGNhbGwgdG8gdGhlIGRldmljZSdzIHJlYWRfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJucyB0aGUgdG90YWwKLSAqIG51bWJlciBvZiBieXRlcyBzdWNjZXNzZnVsbHkgdHJhbnNmZXJyZWQgcHJpb3IgdG8gdGhlIGVycm9yLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotc3RkOjpzaXplX3QgcmVhZF9hdChTeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwKLSAgICB1aW50NjRfdCBvZmZzZXQsIGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8qQH0qLwotLyoqCi0gKiBAZGVmZ3JvdXAgYXN5bmNfcmVhZF9hdCBhc2lvOjphc3luY19yZWFkX2F0Ci0gKgotICogQGJyaWVmIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gcmVhZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgYXQKLSAqIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICovCi0vKkB7Ki8KLQotLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gcmVhZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgYXQgdGhlCi0vLy8gc3BlY2lmaWVkIG9mZnNldC4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlYWQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZgotICogZGF0YSBmcm9tIGEgcmFuZG9tIGFjY2VzcyBkZXZpY2UgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuIFRoZSBmdW5jdGlvbiBjYWxsCi0gKiBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4gVGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2lsbCBjb250aW51ZSB1bnRpbAotICogb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBUaGUgc3VwcGxpZWQgYnVmZmVycyBhcmUgZnVsbC4gVGhhdCBpcywgdGhlIGJ5dGVzIHRyYW5zZmVycmVkIGlzIGVxdWFsIHRvCi0gKiB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIGFzeW5jX3JlYWRfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZCBUaGUgZGV2aWNlIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAqCi0gKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLiBUaGUgc3VtCi0gKiBvZiB0aGUgYnVmZmVyIHNpemVzIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZQotICogZGV2aWNlLiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZgotICogdGhlIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gKgotICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlYWQgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gKiBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIHRoZSBidWZmZXJzLiBJZiBhbiBlcnJvcgotICogICAvLyBvY2N1cnJlZCwgdGhpcyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5Ci0gKiAgIC8vIHRyYW5zZmVycmVkIHByaW9yIHRvIHRoZSBlcnJvci4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbiBvZgotICogdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogVG8gcmVhZCBpbnRvIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAqIEBjb2RlCi0gKiBhc2lvOjphc3luY19yZWFkX2F0KGQsIDQyLCBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIGhhbmRsZXIpOwotICogQGVuZGNvZGUKLSAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gcmVhZGluZyBpbnRvIG11bHRpcGxlCi0gKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICogc3RkOjp2ZWN0b3IuCi0gKgotICogQG5vdGUgVGhpcyBvdmVybG9hZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmc6Ci0gKiBAY29kZSBhc2lvOjphc3luY19yZWFkX2F0KAotICogICAgIGQsIDQyLCBidWZmZXJzLAotICogICAgIGFzaW86OnRyYW5zZmVyX2FsbCgpLAotICogICAgIGhhbmRsZXIpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsCi0gICAgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci1BU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkX2F0KEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwgdWludDY0X3Qgb2Zmc2V0LAotICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKTsKLQotLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gcmVhZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgYXQgdGhlCi0vLy8gc3BlY2lmaWVkIG9mZnNldC4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlYWQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZgotICogZGF0YSBmcm9tIGEgcmFuZG9tIGFjY2VzcyBkZXZpY2UgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuIFRoZSBmdW5jdGlvbiBjYWxsCi0gKiBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4gVGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2lsbCBjb250aW51ZSB1bnRpbAotICogb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBUaGUgc3VwcGxpZWQgYnVmZmVycyBhcmUgZnVsbC4gVGhhdCBpcywgdGhlIGJ5dGVzIHRyYW5zZmVycmVkIGlzIGVxdWFsIHRvCi0gKiB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIFRoZSBjb21wbGV0aW9uX2NvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyAwLgotICoKLSAqIEBwYXJhbSBkIFRoZSBkZXZpY2UgZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UgY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuIFRoZSBzdW0KLSAqIG9mIHRoZSBidWZmZXIgc2l6ZXMgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlCi0gKiBkZXZpY2UuIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mCi0gKiB0aGUgdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gKiB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAqCi0gKiBAcGFyYW0gY29tcGxldGlvbl9jb25kaXRpb24gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lCi0gKiB3aGV0aGVyIHRoZSByZWFkIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gVGhlIHNpZ25hdHVyZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0Ci0gKiBtdXN0IGJlOgotICogQGNvZGUgc3RkOjpzaXplX3QgY29tcGxldGlvbl9jb25kaXRpb24oCi0gKiAgIC8vIFJlc3VsdCBvZiBsYXRlc3QgYXN5bmNfcmVhZF9zb21lX2F0IG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgc28gZmFyLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIEEgcmV0dXJuIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIHJlYWQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBBIG5vbi16ZXJvCi0gKiByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkIG9uIHRoZSBuZXh0Ci0gKiBjYWxsIHRvIHRoZSBkZXZpY2UncyBhc3luY19yZWFkX3NvbWVfYXQgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlYWQgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gKiBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIHRoZSBidWZmZXJzLiBJZiBhbiBlcnJvcgotICogICAvLyBvY2N1cnJlZCwgdGhpcyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5Ci0gKiAgIC8vIHRyYW5zZmVycmVkIHByaW9yIHRvIHRoZSBlcnJvci4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbiBvZgotICogdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogVG8gcmVhZCBpbnRvIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAqIEBjb2RlIGFzaW86OmFzeW5jX3JlYWRfYXQoZCwgNDIsCi0gKiAgICAgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLAotICogICAgIGFzaW86OnRyYW5zZmVyX2F0X2xlYXN0KDMyKSwKLSAqICAgICBoYW5kbGVyKTsgQGVuZGNvZGUKLSAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gcmVhZGluZyBpbnRvIG11bHRpcGxlCi0gKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICogc3RkOjp2ZWN0b3IuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UsIHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLWFzeW5jX3JlYWRfYXQoQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sCi0gICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcik7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0vLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB0byByZWFkIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBhdCB0aGUKLS8vLyBzcGVjaWZpZWQgb2Zmc2V0LgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mCi0gKiBkYXRhIGZyb20gYSByYW5kb20gYWNjZXNzIGRldmljZSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4gVGhlIGZ1bmN0aW9uIGNhbGwKLSAqIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LiBUaGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aWxsIGNvbnRpbnVlIHVudGlsCi0gKiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIGFzeW5jX3JlYWRfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZCBUaGUgZGV2aWNlIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAqCi0gKiBAcGFyYW0gYiBBIGJhc2ljX3N0cmVhbWJ1ZiBvYmplY3QgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuIE93bmVyc2hpcAotICogb2YgdGhlIHN0cmVhbWJ1ZiBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZSB0aGF0IGl0Ci0gKiByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcmVhZCBvcGVyYXRpb24gY29tcGxldGVzLgotICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUKLSAqIGhhbmRsZXIgbXVzdCBiZToKLSAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAqICAgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIGJ1ZmZlcnMuIElmIGFuIGVycm9yCi0gKiAgIC8vIG9jY3VycmVkLCB0aGlzIHdpbGwgYmUgdGhlIG51bWJlciBvZiBieXRlcyBzdWNjZXNzZnVsbHkKLSAqICAgLy8gdHJhbnNmZXJyZWQgcHJpb3IgdG8gdGhlIGVycm9yLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uIG9mCi0gKiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gKgotICogQG5vdGUgVGhpcyBvdmVybG9hZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmc6Ci0gKiBAY29kZSBhc2lvOjphc3luY19yZWFkX2F0KAotICogICAgIGQsIDQyLCBiLAotICogICAgIGFzaW86OnRyYW5zZmVyX2FsbCgpLAotICogICAgIGhhbmRsZXIpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSYW5kb21BY2Nlc3NSZWFkRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci1BU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkX2F0KEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSYgZCwgdWludDY0X3Qgb2Zmc2V0LAotICAgIGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKTsKLQotLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gcmVhZCBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgYXQgdGhlCi0vLy8gc3BlY2lmaWVkIG9mZnNldC4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlYWQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZgotICogZGF0YSBmcm9tIGEgcmFuZG9tIGFjY2VzcyBkZXZpY2UgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuIFRoZSBmdW5jdGlvbiBjYWxsCi0gKiBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4gVGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2lsbCBjb250aW51ZSB1bnRpbAotICogb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBUaGUgY29tcGxldGlvbl9jb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IHJldHVybnMgMC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIGRldmljZSdzCi0gKiBhc3luY19yZWFkX3NvbWVfYXQgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGQgVGhlIGRldmljZSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHJlYWQuIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gKgotICogQHBhcmFtIGIgQSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLiBPd25lcnNoaXAKLSAqIG9mIHRoZSBzdHJlYW1idWYgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCBpdAotICogcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgcmVhZCBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdAotICogbXVzdCBiZToKLSAqIEBjb2RlIHN0ZDo6c2l6ZV90IGNvbXBsZXRpb25fY29uZGl0aW9uKAotICogICAvLyBSZXN1bHQgb2YgbGF0ZXN0IGFzeW5jX3JlYWRfc29tZV9hdCBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhci4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBBIHJldHVybiB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSByZWFkIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQSBub24temVybwotICogcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBvbiB0aGUgbmV4dAotICogY2FsbCB0byB0aGUgZGV2aWNlJ3MgYXN5bmNfcmVhZF9zb21lX2F0IGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWFkIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZQotICogaGFuZGxlciBtdXN0IGJlOgotICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICogICAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqCi0gKiAgIC8vIE51bWJlciBvZiBieXRlcyBjb3BpZWQgaW50byB0aGUgYnVmZmVycy4gSWYgYW4gZXJyb3IKLSAqICAgLy8gb2NjdXJyZWQsIHRoaXMgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseQotICogICAvLyB0cmFuc2ZlcnJlZCBwcmlvciB0byB0aGUgZXJyb3IuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24gb2YKLSAqIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzUmVhZERldmljZSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYXN5bmNfcmVhZF9hdChBc3luY1JhbmRvbUFjY2Vzc1JlYWREZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpOwotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotLypAfSovCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vaW1wbC9yZWFkX2F0LmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fUkVBRF9BVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9yZWFkX3VudGlsLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9yZWFkX3VudGlsLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhZjY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vcmVhZF91bnRpbC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MjMgKzAsMCBAQAotLy8KLS8vIHJlYWRfdW50aWwuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1JFQURfVU5USUxfSFBQCi0jZGVmaW5lIEFTSU9fUkVBRF9VTlRJTF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJhc2lvL2FzeW5jX3Jlc3VsdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9iYXNpY19zdHJlYW1idWYuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3JlZ2V4X2Z3ZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdHlwZV90cmFpdHMuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi1uYW1lc3BhY2UgZGV0YWlsCi17Ci0gIGNoYXIgKCZoYXNfcmVzdWx0X3R5cGVfaGVscGVyKC4uLikpWzJdOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBjaGFyIGhhc19yZXN1bHRfdHlwZV9oZWxwZXIoVCosIHR5cGVuYW1lIFQ6OnJlc3VsdF90eXBlKiA9IDApOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdHJ1Y3QgaGFzX3Jlc3VsdF90eXBlCi0gIHsKLSAgICBlbnVtIHsgdmFsdWUgPSAoc2l6ZW9mKChoYXNfcmVzdWx0X3R5cGVfaGVscGVyKSgoVCopKDApKSkgPT0gMSkgfTsKLSAgfTsKLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi0vLy8gVHlwZSB0cmFpdCB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgdHlwZSBjYW4gYmUgdXNlZCBhcyBhIG1hdGNoIGNvbmRpdGlvbgotLy8vIGZ1bmN0aW9uIHdpdGggcmVhZF91bnRpbCBhbmQgYXN5bmNfcmVhZF91bnRpbC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RydWN0IGlzX21hdGNoX2NvbmRpdGlvbgotewotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gVGhlIHZhbHVlIG1lbWJlciBpcyB0cnVlIGlmIHRoZSB0eXBlIG1heSBiZSB1c2VkIGFzIGEgbWF0Y2ggY29uZGl0aW9uLgotICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZTsKLSNlbHNlCi0gIGVudW0KLSAgewotICAgIHZhbHVlID0gYXNpbzo6aXNfZnVuY3Rpb248Ci0gICAgICAgIHR5cGVuYW1lIGFzaW86OnJlbW92ZV9wb2ludGVyPFQ+Ojp0eXBlPjo6dmFsdWUKLSAgICAgIHx8IGRldGFpbDo6aGFzX3Jlc3VsdF90eXBlPFQ+Ojp2YWx1ZQotICB9OwotI2VuZGlmCi19OwotCi0vKioKLSAqIEBkZWZncm91cCByZWFkX3VudGlsIGFzaW86OnJlYWRfdW50aWwKLSAqCi0gKiBAYnJpZWYgUmVhZCBkYXRhIGludG8gYSBzdHJlYW1idWYgdW50aWwgaXQgY29udGFpbnMgYSBkZWxpbWl0ZXIsIG1hdGNoZXMgYQotICogcmVndWxhciBleHByZXNzaW9uLCBvciBhIGZ1bmN0aW9uIG9iamVjdCBpbmRpY2F0ZXMgYSBtYXRjaC4KLSAqLwotLypAeyovCi0KLS8vLyBSZWFkIGRhdGEgaW50byBhIHN0cmVhbWJ1ZiB1bnRpbCBpdCBjb250YWlucyBhIHNwZWNpZmllZCBkZWxpbWl0ZXIuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIHN0cmVhbWJ1ZiB1bnRpbCB0aGUKLSAqIHN0cmVhbWJ1ZidzIGdldCBhcmVhIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyLiBUaGUgY2FsbCB3aWxsIGJsb2NrCi0gKiB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIFRoZSBnZXQgYXJlYSBvZiB0aGUgc3RyZWFtYnVmIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyLgotICoKLSAqIEBsaSBBbiBlcnJvciBvY2N1cnJlZC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiByZWFkX3NvbWUgZnVuY3Rpb24uIElmIHRoZSBzdHJlYW1idWYncyBnZXQgYXJlYSBhbHJlYWR5IGNvbnRhaW5zIHRoZQotICogZGVsaW1pdGVyLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseS4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc3RyZWFtIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JlYWRTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYiBBIHN0cmVhbWJ1ZiBvYmplY3QgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gKgotICogQHBhcmFtIGRlbGltIFRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmVhbWJ1ZidzIGdldCBhcmVhIHVwIHRvIGFuZCBpbmNsdWRpbmcKLSAqIHRoZSBkZWxpbWl0ZXIuCi0gKgotICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gKgotICogQG5vdGUgQWZ0ZXIgYSBzdWNjZXNzZnVsIHJlYWRfdW50aWwgb3BlcmF0aW9uLCB0aGUgc3RyZWFtYnVmIG1heSBjb250YWluCi0gKiBhZGRpdGlvbmFsIGRhdGEgYmV5b25kIHRoZSBkZWxpbWl0ZXIuIEFuIGFwcGxpY2F0aW9uIHdpbGwgdHlwaWNhbGx5IGxlYXZlCi0gKiB0aGF0IGRhdGEgaW4gdGhlIHN0cmVhbWJ1ZiBmb3IgYSBzdWJzZXF1ZW50IHJlYWRfdW50aWwgb3BlcmF0aW9uIHRvIGV4YW1pbmUuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUbyByZWFkIGRhdGEgaW50byBhIHN0cmVhbWJ1ZiB1bnRpbCBhIG5ld2xpbmUgaXMgZW5jb3VudGVyZWQ6Ci0gKiBAY29kZSBhc2lvOjpzdHJlYW1idWYgYjsKLSAqIGFzaW86OnJlYWRfdW50aWwocywgYiwgJ1xuJyk7Ci0gKiBzdGQ6OmlzdHJlYW0gaXMoJmIpOwotICogc3RkOjpzdHJpbmcgbGluZTsKLSAqIHN0ZDo6Z2V0bGluZShpcywgbGluZSk7IEBlbmRjb2RlCi0gKiBBZnRlciB0aGUgQGMgcmVhZF91bnRpbCBvcGVyYXRpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgdGhlIGJ1ZmZlciBAYyBiCi0gKiBjb250YWlucyB0aGUgZGVsaW1pdGVyOgotICogQGNvZGUgeyAnYScsICdiJywgLi4uLCAnYycsICdcbicsICdkJywgJ2UnLCAuLi4gfSBAZW5kY29kZQotICogVGhlIGNhbGwgdG8gQGMgc3RkOjpnZXRsaW5lIHRoZW4gZXh0cmFjdHMgdGhlIGRhdGEgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKLSAqIGRlbGltaXRlciwgc28gdGhhdCB0aGUgc3RyaW5nIEBjIGxpbmUgY29udGFpbnM6Ci0gKiBAY29kZSB7ICdhJywgJ2InLCAuLi4sICdjJywgJ1xuJyB9IEBlbmRjb2RlCi0gKiBUaGUgcmVtYWluaW5nIGRhdGEgaXMgbGVmdCBpbiB0aGUgYnVmZmVyIEBjIGIgYXMgZm9sbG93czoKLSAqIEBjb2RlIHsgJ2QnLCAnZScsIC4uLiB9IEBlbmRjb2RlCi0gKiBUaGlzIGRhdGEgbWF5IGJlIHRoZSBzdGFydCBvZiBhIG5ldyBsaW5lLCB0byBiZSBleHRyYWN0ZWQgYnkgYSBzdWJzZXF1ZW50Ci0gKiBAYyByZWFkX3VudGlsIG9wZXJhdGlvbi4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1zdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBjaGFyIGRlbGltKTsKLQotLy8vIFJlYWQgZGF0YSBpbnRvIGEgc3RyZWFtYnVmIHVudGlsIGl0IGNvbnRhaW5zIGEgc3BlY2lmaWVkIGRlbGltaXRlci4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtYnVmIHVudGlsIHRoZQotICogc3RyZWFtYnVmJ3MgZ2V0IGFyZWEgY29udGFpbnMgdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXIuIFRoZSBjYWxsIHdpbGwgYmxvY2sKLSAqIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgVGhlIGdldCBhcmVhIG9mIHRoZSBzdHJlYW1idWYgY29udGFpbnMgdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXIuCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgc3RyZWFtJ3MKLSAqIHJlYWRfc29tZSBmdW5jdGlvbi4gSWYgdGhlIHN0cmVhbWJ1ZidzIGdldCBhcmVhIGFscmVhZHkgY29udGFpbnMgdGhlCi0gKiBkZWxpbWl0ZXIsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5LgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmVhZFN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIEEgc3RyZWFtYnVmIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAqCi0gKiBAcGFyYW0gZGVsaW0gVGhlIGRlbGltaXRlciBjaGFyYWN0ZXIuCi0gKgotICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc3RyZWFtYnVmJ3MgZ2V0IGFyZWEgdXAgdG8gYW5kIGluY2x1ZGluZwotICogdGhlIGRlbGltaXRlci4gUmV0dXJucyAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIEBub3RlIEFmdGVyIGEgc3VjY2Vzc2Z1bCByZWFkX3VudGlsIG9wZXJhdGlvbiwgdGhlIHN0cmVhbWJ1ZiBtYXkgY29udGFpbgotICogYWRkaXRpb25hbCBkYXRhIGJleW9uZCB0aGUgZGVsaW1pdGVyLiBBbiBhcHBsaWNhdGlvbiB3aWxsIHR5cGljYWxseSBsZWF2ZQotICogdGhhdCBkYXRhIGluIHRoZSBzdHJlYW1idWYgZm9yIGEgc3Vic2VxdWVudCByZWFkX3VudGlsIG9wZXJhdGlvbiB0byBleGFtaW5lLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvcj4KLXN0ZDo6c2l6ZV90IHJlYWRfdW50aWwoU3luY1JlYWRTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsIGNoYXIgZGVsaW0sCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0vLy8gUmVhZCBkYXRhIGludG8gYSBzdHJlYW1idWYgdW50aWwgaXQgY29udGFpbnMgYSBzcGVjaWZpZWQgZGVsaW1pdGVyLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZCBzdHJlYW1idWYgdW50aWwgdGhlCi0gKiBzdHJlYW1idWYncyBnZXQgYXJlYSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGRlbGltaXRlci4gVGhlIGNhbGwgd2lsbCBibG9jawotICogdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBUaGUgZ2V0IGFyZWEgb2YgdGhlIHN0cmVhbWJ1ZiBjb250YWlucyB0aGUgc3BlY2lmaWVkIGRlbGltaXRlci4KLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogcmVhZF9zb21lIGZ1bmN0aW9uLiBJZiB0aGUgc3RyZWFtYnVmJ3MgZ2V0IGFyZWEgYWxyZWFkeSBjb250YWlucyB0aGUKLSAqIGRlbGltaXRlciwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHJlYWQuIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNSZWFkU3RyZWFtIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIGIgQSBzdHJlYW1idWYgb2JqZWN0IGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBkZWxpbSBUaGUgZGVsaW1pdGVyIHN0cmluZy4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJlYW1idWYncyBnZXQgYXJlYSB1cCB0byBhbmQgaW5jbHVkaW5nCi0gKiB0aGUgZGVsaW1pdGVyLgotICoKLSAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICoKLSAqIEBub3RlIEFmdGVyIGEgc3VjY2Vzc2Z1bCByZWFkX3VudGlsIG9wZXJhdGlvbiwgdGhlIHN0cmVhbWJ1ZiBtYXkgY29udGFpbgotICogYWRkaXRpb25hbCBkYXRhIGJleW9uZCB0aGUgZGVsaW1pdGVyLiBBbiBhcHBsaWNhdGlvbiB3aWxsIHR5cGljYWxseSBsZWF2ZQotICogdGhhdCBkYXRhIGluIHRoZSBzdHJlYW1idWYgZm9yIGEgc3Vic2VxdWVudCByZWFkX3VudGlsIG9wZXJhdGlvbiB0byBleGFtaW5lLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogVG8gcmVhZCBkYXRhIGludG8gYSBzdHJlYW1idWYgdW50aWwgYSBuZXdsaW5lIGlzIGVuY291bnRlcmVkOgotICogQGNvZGUgYXNpbzo6c3RyZWFtYnVmIGI7Ci0gKiBhc2lvOjpyZWFkX3VudGlsKHMsIGIsICJcclxuIik7Ci0gKiBzdGQ6OmlzdHJlYW0gaXMoJmIpOwotICogc3RkOjpzdHJpbmcgbGluZTsKLSAqIHN0ZDo6Z2V0bGluZShpcywgbGluZSk7IEBlbmRjb2RlCi0gKiBBZnRlciB0aGUgQGMgcmVhZF91bnRpbCBvcGVyYXRpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgdGhlIGJ1ZmZlciBAYyBiCi0gKiBjb250YWlucyB0aGUgZGVsaW1pdGVyOgotICogQGNvZGUgeyAnYScsICdiJywgLi4uLCAnYycsICdccicsICdcbicsICdkJywgJ2UnLCAuLi4gfSBAZW5kY29kZQotICogVGhlIGNhbGwgdG8gQGMgc3RkOjpnZXRsaW5lIHRoZW4gZXh0cmFjdHMgdGhlIGRhdGEgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKLSAqIGRlbGltaXRlciwgc28gdGhhdCB0aGUgc3RyaW5nIEBjIGxpbmUgY29udGFpbnM6Ci0gKiBAY29kZSB7ICdhJywgJ2InLCAuLi4sICdjJywgJ1xyJywgJ1xuJyB9IEBlbmRjb2RlCi0gKiBUaGUgcmVtYWluaW5nIGRhdGEgaXMgbGVmdCBpbiB0aGUgYnVmZmVyIEBjIGIgYXMgZm9sbG93czoKLSAqIEBjb2RlIHsgJ2QnLCAnZScsIC4uLiB9IEBlbmRjb2RlCi0gKiBUaGlzIGRhdGEgbWF5IGJlIHRoZSBzdGFydCBvZiBhIG5ldyBsaW5lLCB0byBiZSBleHRyYWN0ZWQgYnkgYSBzdWJzZXF1ZW50Ci0gKiBAYyByZWFkX3VudGlsIG9wZXJhdGlvbi4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1zdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBjb25zdCBzdGQ6OnN0cmluZyYgZGVsaW0pOwotCi0vLy8gUmVhZCBkYXRhIGludG8gYSBzdHJlYW1idWYgdW50aWwgaXQgY29udGFpbnMgYSBzcGVjaWZpZWQgZGVsaW1pdGVyLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZCBzdHJlYW1idWYgdW50aWwgdGhlCi0gKiBzdHJlYW1idWYncyBnZXQgYXJlYSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGRlbGltaXRlci4gVGhlIGNhbGwgd2lsbCBibG9jawotICogdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBUaGUgZ2V0IGFyZWEgb2YgdGhlIHN0cmVhbWJ1ZiBjb250YWlucyB0aGUgc3BlY2lmaWVkIGRlbGltaXRlci4KLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogcmVhZF9zb21lIGZ1bmN0aW9uLiBJZiB0aGUgc3RyZWFtYnVmJ3MgZ2V0IGFyZWEgYWxyZWFkeSBjb250YWlucyB0aGUKLSAqIGRlbGltaXRlciwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHJlYWQuIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNSZWFkU3RyZWFtIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIGIgQSBzdHJlYW1idWYgb2JqZWN0IGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICoKLSAqIEBwYXJhbSBkZWxpbSBUaGUgZGVsaW1pdGVyIHN0cmluZy4KLSAqCi0gKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJlYW1idWYncyBnZXQgYXJlYSB1cCB0byBhbmQgaW5jbHVkaW5nCi0gKiB0aGUgZGVsaW1pdGVyLiBSZXR1cm5zIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogQG5vdGUgQWZ0ZXIgYSBzdWNjZXNzZnVsIHJlYWRfdW50aWwgb3BlcmF0aW9uLCB0aGUgc3RyZWFtYnVmIG1heSBjb250YWluCi0gKiBhZGRpdGlvbmFsIGRhdGEgYmV5b25kIHRoZSBkZWxpbWl0ZXIuIEFuIGFwcGxpY2F0aW9uIHdpbGwgdHlwaWNhbGx5IGxlYXZlCi0gKiB0aGF0IGRhdGEgaW4gdGhlIHN0cmVhbWJ1ZiBmb3IgYSBzdWJzZXF1ZW50IHJlYWRfdW50aWwgb3BlcmF0aW9uIHRvIGV4YW1pbmUuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yPgotc3RkOjpzaXplX3QgcmVhZF91bnRpbChTeW5jUmVhZFN0cmVhbSYgcywKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGRlbGltLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfUkVHRVgpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLS8vLyBSZWFkIGRhdGEgaW50byBhIHN0cmVhbWJ1ZiB1bnRpbCBzb21lIHBhcnQgb2YgdGhlIGRhdGEgaXQgY29udGFpbnMgbWF0Y2hlcwotLy8vIGEgcmVndWxhciBleHByZXNzaW9uLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZCBzdHJlYW1idWYgdW50aWwgdGhlCi0gKiBzdHJlYW1idWYncyBnZXQgYXJlYSBjb250YWlucyBzb21lIGRhdGEgdGhhdCBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uLgotICogVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIEEgc3Vic3RyaW5nIG9mIHRoZSBzdHJlYW1idWYncyBnZXQgYXJlYSBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgc3RyZWFtJ3MKLSAqIHJlYWRfc29tZSBmdW5jdGlvbi4gSWYgdGhlIHN0cmVhbWJ1ZidzIGdldCBhcmVhIGFscmVhZHkgY29udGFpbnMgZGF0YSB0aGF0Ci0gKiBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIHRoZSBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5LgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmVhZFN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIEEgc3RyZWFtYnVmIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAqCi0gKiBAcGFyYW0gZXhwciBUaGUgcmVndWxhciBleHByZXNzaW9uLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmVhbWJ1ZidzIGdldCBhcmVhIHVwIHRvIGFuZCBpbmNsdWRpbmcKLSAqIHRoZSBzdWJzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi0gKgotICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gKgotICogQG5vdGUgQWZ0ZXIgYSBzdWNjZXNzZnVsIHJlYWRfdW50aWwgb3BlcmF0aW9uLCB0aGUgc3RyZWFtYnVmIG1heSBjb250YWluCi0gKiBhZGRpdGlvbmFsIGRhdGEgYmV5b25kIHRoYXQgd2hpY2ggbWF0Y2hlZCB0aGUgcmVndWxhciBleHByZXNzaW9uLiBBbgotICogYXBwbGljYXRpb24gd2lsbCB0eXBpY2FsbHkgbGVhdmUgdGhhdCBkYXRhIGluIHRoZSBzdHJlYW1idWYgZm9yIGEgc3Vic2VxdWVudAotICogcmVhZF91bnRpbCBvcGVyYXRpb24gdG8gZXhhbWluZS4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHJlYWQgZGF0YSBpbnRvIGEgc3RyZWFtYnVmIHVudGlsIGEgQ1ItTEYgc2VxdWVuY2UgaXMgZW5jb3VudGVyZWQ6Ci0gKiBAY29kZSBhc2lvOjpzdHJlYW1idWYgYjsKLSAqIGFzaW86OnJlYWRfdW50aWwocywgYiwgYm9vc3Q6OnJlZ2V4KCJcclxuIikpOwotICogc3RkOjppc3RyZWFtIGlzKCZiKTsKLSAqIHN0ZDo6c3RyaW5nIGxpbmU7Ci0gKiBzdGQ6OmdldGxpbmUoaXMsIGxpbmUpOyBAZW5kY29kZQotICogQWZ0ZXIgdGhlIEBjIHJlYWRfdW50aWwgb3BlcmF0aW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHRoZSBidWZmZXIgQGMgYgotICogY29udGFpbnMgdGhlIGRhdGEgd2hpY2ggbWF0Y2hlZCB0aGUgcmVndWxhciBleHByZXNzaW9uOgotICogQGNvZGUgeyAnYScsICdiJywgLi4uLCAnYycsICdccicsICdcbicsICdkJywgJ2UnLCAuLi4gfSBAZW5kY29kZQotICogVGhlIGNhbGwgdG8gQGMgc3RkOjpnZXRsaW5lIHRoZW4gZXh0cmFjdHMgdGhlIGRhdGEgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKLSAqIG1hdGNoLCBzbyB0aGF0IHRoZSBzdHJpbmcgQGMgbGluZSBjb250YWluczoKLSAqIEBjb2RlIHsgJ2EnLCAnYicsIC4uLiwgJ2MnLCAnXHInLCAnXG4nIH0gQGVuZGNvZGUKLSAqIFRoZSByZW1haW5pbmcgZGF0YSBpcyBsZWZ0IGluIHRoZSBidWZmZXIgQGMgYiBhcyBmb2xsb3dzOgotICogQGNvZGUgeyAnZCcsICdlJywgLi4uIH0gQGVuZGNvZGUKLSAqIFRoaXMgZGF0YSBtYXkgYmUgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpbmUsIHRvIGJlIGV4dHJhY3RlZCBieSBhIHN1YnNlcXVlbnQKLSAqIEBjIHJlYWRfdW50aWwgb3BlcmF0aW9uLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvcj4KLXN0ZDo6c2l6ZV90IHJlYWRfdW50aWwoU3luY1JlYWRTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsIGNvbnN0IGJvb3N0OjpyZWdleCYgZXhwcik7Ci0KLS8vLyBSZWFkIGRhdGEgaW50byBhIHN0cmVhbWJ1ZiB1bnRpbCBzb21lIHBhcnQgb2YgdGhlIGRhdGEgaXQgY29udGFpbnMgbWF0Y2hlcwotLy8vIGEgcmVndWxhciBleHByZXNzaW9uLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZCBzdHJlYW1idWYgdW50aWwgdGhlCi0gKiBzdHJlYW1idWYncyBnZXQgYXJlYSBjb250YWlucyBzb21lIGRhdGEgdGhhdCBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uLgotICogVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIEEgc3Vic3RyaW5nIG9mIHRoZSBzdHJlYW1idWYncyBnZXQgYXJlYSBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgc3RyZWFtJ3MKLSAqIHJlYWRfc29tZSBmdW5jdGlvbi4gSWYgdGhlIHN0cmVhbWJ1ZidzIGdldCBhcmVhIGFscmVhZHkgY29udGFpbnMgZGF0YSB0aGF0Ci0gKiBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIHRoZSBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5LgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmVhZFN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIEEgc3RyZWFtYnVmIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAqCi0gKiBAcGFyYW0gZXhwciBUaGUgcmVndWxhciBleHByZXNzaW9uLgotICoKLSAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmVhbWJ1ZidzIGdldCBhcmVhIHVwIHRvIGFuZCBpbmNsdWRpbmcKLSAqIHRoZSBzdWJzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uIFJldHVybnMgMCBpZiBhbiBlcnJvcgotICogb2NjdXJyZWQuCi0gKgotICogQG5vdGUgQWZ0ZXIgYSBzdWNjZXNzZnVsIHJlYWRfdW50aWwgb3BlcmF0aW9uLCB0aGUgc3RyZWFtYnVmIG1heSBjb250YWluCi0gKiBhZGRpdGlvbmFsIGRhdGEgYmV5b25kIHRoYXQgd2hpY2ggbWF0Y2hlZCB0aGUgcmVndWxhciBleHByZXNzaW9uLiBBbgotICogYXBwbGljYXRpb24gd2lsbCB0eXBpY2FsbHkgbGVhdmUgdGhhdCBkYXRhIGluIHRoZSBzdHJlYW1idWYgZm9yIGEgc3Vic2VxdWVudAotICogcmVhZF91bnRpbCBvcGVyYXRpb24gdG8gZXhhbWluZS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1zdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBjb25zdCBib29zdDo6cmVnZXgmIGV4cHIsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19CT09TVF9SRUdFWCkKLSAgICAgICAvLyB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotLy8vIFJlYWQgZGF0YSBpbnRvIGEgc3RyZWFtYnVmIHVudGlsIGEgZnVuY3Rpb24gb2JqZWN0IGluZGljYXRlcyBhIG1hdGNoLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZCBzdHJlYW1idWYgdW50aWwgYQotICogdXNlci1kZWZpbmVkIG1hdGNoIGNvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QsIHdoZW4gYXBwbGllZCB0byB0aGUgZGF0YQotICogY29udGFpbmVkIGluIHRoZSBzdHJlYW1idWYsIGluZGljYXRlcyBhIHN1Y2Nlc3NmdWwgbWF0Y2guIFRoZSBjYWxsIHdpbGwKLSAqIGJsb2NrIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgVGhlIG1hdGNoIGNvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyBhIHN0ZDo6cGFpciB3aGVyZSB0aGUgc2Vjb25kCi0gKiBlbGVtZW50IGV2YWx1YXRlcyB0byB0cnVlLgotICoKLSAqIEBsaSBBbiBlcnJvciBvY2N1cnJlZC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiByZWFkX3NvbWUgZnVuY3Rpb24uIElmIHRoZSBtYXRjaCBjb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IGFscmVhZHkgaW5kaWNhdGVzCi0gKiBhIG1hdGNoLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseS4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc3RyZWFtIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JlYWRTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYiBBIHN0cmVhbWJ1ZiBvYmplY3QgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gKgotICogQHBhcmFtIG1hdGNoX2NvbmRpdGlvbiBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlcgotICogYSBtYXRjaCBleGlzdHMuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCBtdXN0IGJlOgotICogQGNvZGUgcGFpcjxpdGVyYXRvciwgYm9vbD4gbWF0Y2hfY29uZGl0aW9uKGl0ZXJhdG9yIGJlZ2luLCBpdGVyYXRvciBlbmQpOwotICogQGVuZGNvZGUKLSAqIHdoZXJlIEBjIGl0ZXJhdG9yIHJlcHJlc2VudHMgdGhlIHR5cGU6Ci0gKiBAY29kZSBidWZmZXJzX2l0ZXJhdG9yPGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+Ojpjb25zdF9idWZmZXJzX3R5cGU+Ci0gKiBAZW5kY29kZQotICogVGhlIGl0ZXJhdG9yIHBhcmFtZXRlcnMgQGMgYmVnaW4gYW5kIEBjIGVuZCBkZWZpbmUgdGhlIHJhbmdlIG9mIGJ5dGVzIHRvIGJlCi0gKiBzY2FubmVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGEgbWF0Y2guIFRoZSBAYyBmaXJzdCBtZW1iZXIgb2YgdGhlCi0gKiByZXR1cm4gdmFsdWUgaXMgYW4gaXRlcmF0b3IgbWFya2luZyBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBieXRlcyB0aGF0IGhhdmUKLSAqIGJlZW4gY29uc3VtZWQgYnkgdGhlIG1hdGNoIGZ1bmN0aW9uLiBUaGlzIGl0ZXJhdG9yIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQotICogQGMgYmVnaW4gcGFyYW1ldGVyIGZvciBhbnkgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIHRoZSBtYXRjaCBjb25kaXRpb24uIFRoZQotICogQGMgc2Vjb25kIG1lbWJlciBvZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRydWUgaWYgYSBtYXRjaCBoYXMgYmVlbiBmb3VuZCwgZmFsc2UKLSAqIG90aGVyd2lzZS4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJlYW1idWYncyBnZXQgYXJlYSB0aGF0IGhhdmUgYmVlbiBmdWxseQotICogY29uc3VtZWQgYnkgdGhlIG1hdGNoIGZ1bmN0aW9uLgotICoKLSAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICoKLSAqIEBub3RlIEFmdGVyIGEgc3VjY2Vzc2Z1bCByZWFkX3VudGlsIG9wZXJhdGlvbiwgdGhlIHN0cmVhbWJ1ZiBtYXkgY29udGFpbgotICogYWRkaXRpb25hbCBkYXRhIGJleW9uZCB0aGF0IHdoaWNoIG1hdGNoZWQgdGhlIGZ1bmN0aW9uIG9iamVjdC4gQW4gYXBwbGljYXRpb24KLSAqIHdpbGwgdHlwaWNhbGx5IGxlYXZlIHRoYXQgZGF0YSBpbiB0aGUgc3RyZWFtYnVmIGZvciBhIHN1YnNlcXVlbnQKLSAqCi0gKiBAbm90ZSBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQGMgaXNfbWF0Y2hfY29uZGl0aW9uIHR5cGUgdHJhaXQKLSAqIGV2YWx1YXRlcyB0byB0cnVlIGZvciBmdW5jdGlvbiBwb2ludGVycyBhbmQgZnVuY3Rpb24gb2JqZWN0cyB3aXRoIGEKLSAqIEBjIHJlc3VsdF90eXBlIHR5cGVkZWYuIEl0IG11c3QgYmUgc3BlY2lhbGlzZWQgZm9yIG90aGVyIHVzZXItZGVmaW5lZAotICogZnVuY3Rpb24gb2JqZWN0cy4KLSAqCi0gKiBAcGFyIEV4YW1wbGVzCi0gKiBUbyByZWFkIGRhdGEgaW50byBhIHN0cmVhbWJ1ZiB1bnRpbCB3aGl0ZXNwYWNlIGlzIGVuY291bnRlcmVkOgotICogQGNvZGUgdHlwZWRlZiBhc2lvOjpidWZmZXJzX2l0ZXJhdG9yPAotICogICAgIGFzaW86OnN0cmVhbWJ1Zjo6Y29uc3RfYnVmZmVyc190eXBlPiBpdGVyYXRvcjsKLSAqCi0gKiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+Ci0gKiBtYXRjaF93aGl0ZXNwYWNlKGl0ZXJhdG9yIGJlZ2luLCBpdGVyYXRvciBlbmQpCi0gKiB7Ci0gKiAgIGl0ZXJhdG9yIGkgPSBiZWdpbjsKLSAqICAgd2hpbGUgKGkgIT0gZW5kKQotICogICAgIGlmIChzdGQ6Omlzc3BhY2UoKmkrKykpCi0gKiAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaSwgdHJ1ZSk7Ci0gKiAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpLCBmYWxzZSk7Ci0gKiB9Ci0gKiAuLi4KLSAqIGFzaW86OnN0cmVhbWJ1ZiBiOwotICogYXNpbzo6cmVhZF91bnRpbChzLCBiLCBtYXRjaF93aGl0ZXNwYWNlKTsKLSAqIEBlbmRjb2RlCi0gKgotICogVG8gcmVhZCBkYXRhIGludG8gYSBzdHJlYW1idWYgdW50aWwgYSBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgZm91bmQ6Ci0gKiBAY29kZSBjbGFzcyBtYXRjaF9jaGFyCi0gKiB7Ci0gKiBwdWJsaWM6Ci0gKiAgIGV4cGxpY2l0IG1hdGNoX2NoYXIoY2hhciBjKSA6IGNfKGMpIHt9Ci0gKgotICogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+Ci0gKiAgIHN0ZDo6cGFpcjxJdGVyYXRvciwgYm9vbD4gb3BlcmF0b3IoKSgKLSAqICAgICAgIEl0ZXJhdG9yIGJlZ2luLCBJdGVyYXRvciBlbmQpIGNvbnN0Ci0gKiAgIHsKLSAqICAgICBJdGVyYXRvciBpID0gYmVnaW47Ci0gKiAgICAgd2hpbGUgKGkgIT0gZW5kKQotICogICAgICAgaWYgKGNfID09ICppKyspCi0gKiAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpLCB0cnVlKTsKLSAqICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaSwgZmFsc2UpOwotICogICB9Ci0gKgotICogcHJpdmF0ZToKLSAqICAgY2hhciBjXzsKLSAqIH07Ci0gKgotICogbmFtZXNwYWNlIGFzaW8gewotICogICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfbWF0Y2hfY29uZGl0aW9uPG1hdGNoX2NoYXI+Ci0gKiAgICAgOiBwdWJsaWMgYm9vc3Q6OnRydWVfdHlwZSB7fTsKLSAqIH0gLy8gbmFtZXNwYWNlIGFzaW8KLSAqIC4uLgotICogYXNpbzo6c3RyZWFtYnVmIGI7Ci0gKiBhc2lvOjpyZWFkX3VudGlsKHMsIGIsIG1hdGNoX2NoYXIoJ2EnKSk7Ci0gKiBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgTWF0Y2hDb25kaXRpb24+Ci1zdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBNYXRjaENvbmRpdGlvbiBtYXRjaF9jb25kaXRpb24sCi0gICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX21hdGNoX2NvbmRpdGlvbjxNYXRjaENvbmRpdGlvbj46OnZhbHVlPjo6dHlwZSogPSAwKTsKLQotLy8vIFJlYWQgZGF0YSBpbnRvIGEgc3RyZWFtYnVmIHVudGlsIGEgZnVuY3Rpb24gb2JqZWN0IGluZGljYXRlcyBhIG1hdGNoLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZCBzdHJlYW1idWYgdW50aWwgYQotICogdXNlci1kZWZpbmVkIG1hdGNoIGNvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QsIHdoZW4gYXBwbGllZCB0byB0aGUgZGF0YQotICogY29udGFpbmVkIGluIHRoZSBzdHJlYW1idWYsIGluZGljYXRlcyBhIHN1Y2Nlc3NmdWwgbWF0Y2guIFRoZSBjYWxsIHdpbGwKLSAqIGJsb2NrIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgVGhlIG1hdGNoIGNvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyBhIHN0ZDo6cGFpciB3aGVyZSB0aGUgc2Vjb25kCi0gKiBlbGVtZW50IGV2YWx1YXRlcyB0byB0cnVlLgotICoKLSAqIEBsaSBBbiBlcnJvciBvY2N1cnJlZC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiByZWFkX3NvbWUgZnVuY3Rpb24uIElmIHRoZSBtYXRjaCBjb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IGFscmVhZHkgaW5kaWNhdGVzCi0gKiBhIG1hdGNoLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseS4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc3RyZWFtIGZyb20gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgcmVhZC4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JlYWRTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYiBBIHN0cmVhbWJ1ZiBvYmplY3QgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gKgotICogQHBhcmFtIG1hdGNoX2NvbmRpdGlvbiBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlcgotICogYSBtYXRjaCBleGlzdHMuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCBtdXN0IGJlOgotICogQGNvZGUgcGFpcjxpdGVyYXRvciwgYm9vbD4gbWF0Y2hfY29uZGl0aW9uKGl0ZXJhdG9yIGJlZ2luLCBpdGVyYXRvciBlbmQpOwotICogQGVuZGNvZGUKLSAqIHdoZXJlIEBjIGl0ZXJhdG9yIHJlcHJlc2VudHMgdGhlIHR5cGU6Ci0gKiBAY29kZSBidWZmZXJzX2l0ZXJhdG9yPGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+Ojpjb25zdF9idWZmZXJzX3R5cGU+Ci0gKiBAZW5kY29kZQotICogVGhlIGl0ZXJhdG9yIHBhcmFtZXRlcnMgQGMgYmVnaW4gYW5kIEBjIGVuZCBkZWZpbmUgdGhlIHJhbmdlIG9mIGJ5dGVzIHRvIGJlCi0gKiBzY2FubmVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGEgbWF0Y2guIFRoZSBAYyBmaXJzdCBtZW1iZXIgb2YgdGhlCi0gKiByZXR1cm4gdmFsdWUgaXMgYW4gaXRlcmF0b3IgbWFya2luZyBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBieXRlcyB0aGF0IGhhdmUKLSAqIGJlZW4gY29uc3VtZWQgYnkgdGhlIG1hdGNoIGZ1bmN0aW9uLiBUaGlzIGl0ZXJhdG9yIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQotICogQGMgYmVnaW4gcGFyYW1ldGVyIGZvciBhbnkgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIHRoZSBtYXRjaCBjb25kaXRpb24uIFRoZQotICogQGMgc2Vjb25kIG1lbWJlciBvZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRydWUgaWYgYSBtYXRjaCBoYXMgYmVlbiBmb3VuZCwgZmFsc2UKLSAqIG90aGVyd2lzZS4KLSAqCi0gKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJlYW1idWYncyBnZXQgYXJlYSB0aGF0IGhhdmUgYmVlbiBmdWxseQotICogY29uc3VtZWQgYnkgdGhlIG1hdGNoIGZ1bmN0aW9uLiBSZXR1cm5zIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogQG5vdGUgQWZ0ZXIgYSBzdWNjZXNzZnVsIHJlYWRfdW50aWwgb3BlcmF0aW9uLCB0aGUgc3RyZWFtYnVmIG1heSBjb250YWluCi0gKiBhZGRpdGlvbmFsIGRhdGEgYmV5b25kIHRoYXQgd2hpY2ggbWF0Y2hlZCB0aGUgZnVuY3Rpb24gb2JqZWN0LiBBbiBhcHBsaWNhdGlvbgotICogd2lsbCB0eXBpY2FsbHkgbGVhdmUgdGhhdCBkYXRhIGluIHRoZSBzdHJlYW1idWYgZm9yIGEgc3Vic2VxdWVudAotICoKLSAqIEBub3RlIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBAYyBpc19tYXRjaF9jb25kaXRpb24gdHlwZSB0cmFpdAotICogZXZhbHVhdGVzIHRvIHRydWUgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBmdW5jdGlvbiBvYmplY3RzIHdpdGggYQotICogQGMgcmVzdWx0X3R5cGUgdHlwZWRlZi4gSXQgbXVzdCBiZSBzcGVjaWFsaXNlZCBmb3Igb3RoZXIgdXNlci1kZWZpbmVkCi0gKiBmdW5jdGlvbiBvYmplY3RzLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgTWF0Y2hDb25kaXRpb24+Ci1zdGQ6OnNpemVfdCByZWFkX3VudGlsKFN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIE1hdGNoQ29uZGl0aW9uIG1hdGNoX2NvbmRpdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX21hdGNoX2NvbmRpdGlvbjxNYXRjaENvbmRpdGlvbj46OnZhbHVlPjo6dHlwZSogPSAwKTsKLQotLypAfSovCi0vKioKLSAqIEBkZWZncm91cCBhc3luY19yZWFkX3VudGlsIGFzaW86OmFzeW5jX3JlYWRfdW50aWwKLSAqCi0gKiBAYnJpZWYgU3RhcnQgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB0byByZWFkIGRhdGEgaW50byBhIHN0cmVhbWJ1ZiB1bnRpbCBpdAotICogY29udGFpbnMgYSBkZWxpbWl0ZXIsIG1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24sIG9yIGEgZnVuY3Rpb24gb2JqZWN0Ci0gKiBpbmRpY2F0ZXMgYSBtYXRjaC4KLSAqLwotLypAeyovCi0KLS8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHJlYWQgZGF0YSBpbnRvIGEgc3RyZWFtYnVmIHVudGlsIGl0Ci0vLy8gY29udGFpbnMgYSBzcGVjaWZpZWQgZGVsaW1pdGVyLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgcmVhZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZAotICogc3RyZWFtYnVmIHVudGlsIHRoZSBzdHJlYW1idWYncyBnZXQgYXJlYSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGRlbGltaXRlci4KLSAqIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LiBUaGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbgotICogd2lsbCBjb250aW51ZSB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIFRoZSBnZXQgYXJlYSBvZiB0aGUgc3RyZWFtYnVmIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyLgotICoKLSAqIEBsaSBBbiBlcnJvciBvY2N1cnJlZC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiBhc3luY19yZWFkX3NvbWUgZnVuY3Rpb24sIGFuZCBpcyBrbm93biBhcyBhIDxlbT5jb21wb3NlZCBvcGVyYXRpb248L2VtPi4gSWYKLSAqIHRoZSBzdHJlYW1idWYncyBnZXQgYXJlYSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBkZWxpbWl0ZXIsIHRoaXMgYXN5bmNocm9ub3VzCi0gKiBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5LiBUaGUgcHJvZ3JhbSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBzdHJlYW0KLSAqIHBlcmZvcm1zIG5vIG90aGVyIHJlYWQgb3BlcmF0aW9ucyAoc3VjaCBhcyBhc3luY19yZWFkLCBhc3luY19yZWFkX3VudGlsLCB0aGUKLSAqIHN0cmVhbSdzIGFzeW5jX3JlYWRfc29tZSBmdW5jdGlvbiwgb3IgYW55IG90aGVyIGNvbXBvc2VkIG9wZXJhdGlvbnMgdGhhdAotICogcGVyZm9ybSByZWFkcykgdW50aWwgdGhpcyBvcGVyYXRpb24gY29tcGxldGVzLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBBc3luY1JlYWRTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYiBBIHN0cmVhbWJ1ZiBvYmplY3QgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuIE93bmVyc2hpcCBvZgotICogdGhlIHN0cmVhbWJ1ZiBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZSB0aGF0IGl0IHJlbWFpbnMKLSAqIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAqCi0gKiBAcGFyYW0gZGVsaW0gVGhlIGRlbGltaXRlciBjaGFyYWN0ZXIuCi0gKgotICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlYWQgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gKiBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc3RyZWFtYnVmJ3MgZ2V0Ci0gKiAgIC8vIGFyZWEgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgZGVsaW1pdGVyLgotICogICAvLyAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uIG9mCi0gKiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gKgotICogQG5vdGUgQWZ0ZXIgYSBzdWNjZXNzZnVsIGFzeW5jX3JlYWRfdW50aWwgb3BlcmF0aW9uLCB0aGUgc3RyZWFtYnVmIG1heQotICogY29udGFpbiBhZGRpdGlvbmFsIGRhdGEgYmV5b25kIHRoZSBkZWxpbWl0ZXIuIEFuIGFwcGxpY2F0aW9uIHdpbGwgdHlwaWNhbGx5Ci0gKiBsZWF2ZSB0aGF0IGRhdGEgaW4gdGhlIHN0cmVhbWJ1ZiBmb3IgYSBzdWJzZXF1ZW50IGFzeW5jX3JlYWRfdW50aWwgb3BlcmF0aW9uCi0gKiB0byBleGFtaW5lLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogVG8gYXN5bmNocm9ub3VzbHkgcmVhZCBkYXRhIGludG8gYSBzdHJlYW1idWYgdW50aWwgYSBuZXdsaW5lIGlzIGVuY291bnRlcmVkOgotICogQGNvZGUgYXNpbzo6c3RyZWFtYnVmIGI7Ci0gKiAuLi4KLSAqIHZvaWQgaGFuZGxlcihjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlLCBzdGQ6OnNpemVfdCBzaXplKQotICogewotICogICBpZiAoIWUpCi0gKiAgIHsKLSAqICAgICBzdGQ6OmlzdHJlYW0gaXMoJmIpOwotICogICAgIHN0ZDo6c3RyaW5nIGxpbmU7Ci0gKiAgICAgc3RkOjpnZXRsaW5lKGlzLCBsaW5lKTsKLSAqICAgICAuLi4KLSAqICAgfQotICogfQotICogLi4uCi0gKiBhc2lvOjphc3luY19yZWFkX3VudGlsKHMsIGIsICdcbicsIGhhbmRsZXIpOyBAZW5kY29kZQotICogQWZ0ZXIgdGhlIEBjIGFzeW5jX3JlYWRfdW50aWwgb3BlcmF0aW9uIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHRoZSBidWZmZXIKLSAqIEBjIGIgY29udGFpbnMgdGhlIGRlbGltaXRlcjoKLSAqIEBjb2RlIHsgJ2EnLCAnYicsIC4uLiwgJ2MnLCAnXG4nLCAnZCcsICdlJywgLi4uIH0gQGVuZGNvZGUKLSAqIFRoZSBjYWxsIHRvIEBjIHN0ZDo6Z2V0bGluZSB0aGVuIGV4dHJhY3RzIHRoZSBkYXRhIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlCi0gKiBkZWxpbWl0ZXIsIHNvIHRoYXQgdGhlIHN0cmluZyBAYyBsaW5lIGNvbnRhaW5zOgotICogQGNvZGUgeyAnYScsICdiJywgLi4uLCAnYycsICdcbicgfSBAZW5kY29kZQotICogVGhlIHJlbWFpbmluZyBkYXRhIGlzIGxlZnQgaW4gdGhlIGJ1ZmZlciBAYyBiIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSB7ICdkJywgJ2UnLCAuLi4gfSBAZW5kY29kZQotICogVGhpcyBkYXRhIG1heSBiZSB0aGUgc3RhcnQgb2YgYSBuZXcgbGluZSwgdG8gYmUgZXh0cmFjdGVkIGJ5IGEgc3Vic2VxdWVudAotICogQGMgYXN5bmNfcmVhZF91bnRpbCBvcGVyYXRpb24uCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci1BU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkX3VudGlsKEFzeW5jUmVhZFN0cmVhbSYgcywKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwKLSAgICBjaGFyIGRlbGltLCBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKTsKLQotLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gcmVhZCBkYXRhIGludG8gYSBzdHJlYW1idWYgdW50aWwgaXQKLS8vLyBjb250YWlucyBhIHNwZWNpZmllZCBkZWxpbWl0ZXIuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWFkIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkCi0gKiBzdHJlYW1idWYgdW50aWwgdGhlIHN0cmVhbWJ1ZidzIGdldCBhcmVhIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyLgotICogVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuIFRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uCi0gKiB3aWxsIGNvbnRpbnVlIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgVGhlIGdldCBhcmVhIG9mIHRoZSBzdHJlYW1idWYgY29udGFpbnMgdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXIuCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgc3RyZWFtJ3MKLSAqIGFzeW5jX3JlYWRfc29tZSBmdW5jdGlvbiwgYW5kIGlzIGtub3duIGFzIGEgPGVtPmNvbXBvc2VkIG9wZXJhdGlvbjwvZW0+LiBJZgotICogdGhlIHN0cmVhbWJ1ZidzIGdldCBhcmVhIGFscmVhZHkgY29udGFpbnMgdGhlIGRlbGltaXRlciwgdGhpcyBhc3luY2hyb25vdXMKLSAqIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkuIFRoZSBwcm9ncmFtIG11c3QgZW5zdXJlIHRoYXQgdGhlIHN0cmVhbQotICogcGVyZm9ybXMgbm8gb3RoZXIgcmVhZCBvcGVyYXRpb25zIChzdWNoIGFzIGFzeW5jX3JlYWQsIGFzeW5jX3JlYWRfdW50aWwsIHRoZQotICogc3RyZWFtJ3MgYXN5bmNfcmVhZF9zb21lIGZ1bmN0aW9uLCBvciBhbnkgb3RoZXIgY29tcG9zZWQgb3BlcmF0aW9ucyB0aGF0Ci0gKiBwZXJmb3JtIHJlYWRzKSB1bnRpbCB0aGlzIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHJlYWQuIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIEFzeW5jUmVhZFN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIEEgc3RyZWFtYnVmIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4gT3duZXJzaGlwIG9mCi0gKiB0aGUgc3RyZWFtYnVmIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlIHRoYXQgaXQgcmVtYWlucwotICogdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICoKLSAqIEBwYXJhbSBkZWxpbSBUaGUgZGVsaW1pdGVyIHN0cmluZy4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcmVhZCBvcGVyYXRpb24gY29tcGxldGVzLgotICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUKLSAqIGhhbmRsZXIgbXVzdCBiZToKLSAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAqICAgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJlYW1idWYncyBnZXQKLSAqICAgLy8gYXJlYSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBkZWxpbWl0ZXIuCi0gKiAgIC8vIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24gb2YKLSAqIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAqCi0gKiBAbm90ZSBBZnRlciBhIHN1Y2Nlc3NmdWwgYXN5bmNfcmVhZF91bnRpbCBvcGVyYXRpb24sIHRoZSBzdHJlYW1idWYgbWF5Ci0gKiBjb250YWluIGFkZGl0aW9uYWwgZGF0YSBiZXlvbmQgdGhlIGRlbGltaXRlci4gQW4gYXBwbGljYXRpb24gd2lsbCB0eXBpY2FsbHkKLSAqIGxlYXZlIHRoYXQgZGF0YSBpbiB0aGUgc3RyZWFtYnVmIGZvciBhIHN1YnNlcXVlbnQgYXN5bmNfcmVhZF91bnRpbCBvcGVyYXRpb24KLSAqIHRvIGV4YW1pbmUuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUbyBhc3luY2hyb25vdXNseSByZWFkIGRhdGEgaW50byBhIHN0cmVhbWJ1ZiB1bnRpbCBhIG5ld2xpbmUgaXMgZW5jb3VudGVyZWQ6Ci0gKiBAY29kZSBhc2lvOjpzdHJlYW1idWYgYjsKLSAqIC4uLgotICogdm9pZCBoYW5kbGVyKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGUsIHN0ZDo6c2l6ZV90IHNpemUpCi0gKiB7Ci0gKiAgIGlmICghZSkKLSAqICAgewotICogICAgIHN0ZDo6aXN0cmVhbSBpcygmYik7Ci0gKiAgICAgc3RkOjpzdHJpbmcgbGluZTsKLSAqICAgICBzdGQ6OmdldGxpbmUoaXMsIGxpbmUpOwotICogICAgIC4uLgotICogICB9Ci0gKiB9Ci0gKiAuLi4KLSAqIGFzaW86OmFzeW5jX3JlYWRfdW50aWwocywgYiwgIlxyXG4iLCBoYW5kbGVyKTsgQGVuZGNvZGUKLSAqIEFmdGVyIHRoZSBAYyBhc3luY19yZWFkX3VudGlsIG9wZXJhdGlvbiBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCB0aGUgYnVmZmVyCi0gKiBAYyBiIGNvbnRhaW5zIHRoZSBkZWxpbWl0ZXI6Ci0gKiBAY29kZSB7ICdhJywgJ2InLCAuLi4sICdjJywgJ1xyJywgJ1xuJywgJ2QnLCAnZScsIC4uLiB9IEBlbmRjb2RlCi0gKiBUaGUgY2FsbCB0byBAYyBzdGQ6OmdldGxpbmUgdGhlbiBleHRyYWN0cyB0aGUgZGF0YSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZQotICogZGVsaW1pdGVyLCBzbyB0aGF0IHRoZSBzdHJpbmcgQGMgbGluZSBjb250YWluczoKLSAqIEBjb2RlIHsgJ2EnLCAnYicsIC4uLiwgJ2MnLCAnXHInLCAnXG4nIH0gQGVuZGNvZGUKLSAqIFRoZSByZW1haW5pbmcgZGF0YSBpcyBsZWZ0IGluIHRoZSBidWZmZXIgQGMgYiBhcyBmb2xsb3dzOgotICogQGNvZGUgeyAnZCcsICdlJywgLi4uIH0gQGVuZGNvZGUKLSAqIFRoaXMgZGF0YSBtYXkgYmUgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpbmUsIHRvIGJlIGV4dHJhY3RlZCBieSBhIHN1YnNlcXVlbnQKLSAqIEBjIGFzeW5jX3JlYWRfdW50aWwgb3BlcmF0aW9uLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSZWFkU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYXN5bmNfcmVhZF91bnRpbChBc3luY1JlYWRTdHJlYW0mIHMsCi0gICAgYXNpbzo6YmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWxpbSwKLSAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfUkVHRVgpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLS8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHJlYWQgZGF0YSBpbnRvIGEgc3RyZWFtYnVmIHVudGlsIHNvbWUKLS8vLyBwYXJ0IG9mIGl0cyBkYXRhIG1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWFkIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkCi0gKiBzdHJlYW1idWYgdW50aWwgdGhlIHN0cmVhbWJ1ZidzIGdldCBhcmVhIGNvbnRhaW5zIHNvbWUgZGF0YSB0aGF0IG1hdGNoZXMgYQotICogcmVndWxhciBleHByZXNzaW9uLiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4gVGhlCi0gKiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdpbGwgY29udGludWUgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQSBzdWJzdHJpbmcgb2YgdGhlIHN0cmVhbWJ1ZidzIGdldCBhcmVhIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogYXN5bmNfcmVhZF9zb21lIGZ1bmN0aW9uLCBhbmQgaXMga25vd24gYXMgYSA8ZW0+Y29tcG9zZWQgb3BlcmF0aW9uPC9lbT4uIElmCi0gKiB0aGUgc3RyZWFtYnVmJ3MgZ2V0IGFyZWEgYWxyZWFkeSBjb250YWlucyBkYXRhIHRoYXQgbWF0Y2hlcyB0aGUgcmVndWxhcgotICogZXhwcmVzc2lvbiwgdGhpcyBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseS4gVGhlIHByb2dyYW0KLSAqIG11c3QgZW5zdXJlIHRoYXQgdGhlIHN0cmVhbSBwZXJmb3JtcyBubyBvdGhlciByZWFkIG9wZXJhdGlvbnMgKHN1Y2ggYXMKLSAqIGFzeW5jX3JlYWQsIGFzeW5jX3JlYWRfdW50aWwsIHRoZSBzdHJlYW0ncyBhc3luY19yZWFkX3NvbWUgZnVuY3Rpb24sIG9yIGFueQotICogb3RoZXIgY29tcG9zZWQgb3BlcmF0aW9ucyB0aGF0IHBlcmZvcm0gcmVhZHMpIHVudGlsIHRoaXMgb3BlcmF0aW9uCi0gKiBjb21wbGV0ZXMuCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHJlYWQuIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIEFzeW5jUmVhZFN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIEEgc3RyZWFtYnVmIG9iamVjdCBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4gT3duZXJzaGlwIG9mCi0gKiB0aGUgc3RyZWFtYnVmIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlIHRoYXQgaXQgcmVtYWlucwotICogdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICoKLSAqIEBwYXJhbSBleHByIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi0gKgotICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlYWQgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gKiBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc3RyZWFtYnVmJ3MgZ2V0Ci0gKiAgIC8vIGFyZWEgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgc3Vic3RyaW5nCi0gKiAgIC8vIHRoYXQgbWF0Y2hlcyB0aGUgcmVndWxhci4gZXhwcmVzc2lvbi4KLSAqICAgLy8gMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbiBvZgotICogdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICoKLSAqIEBub3RlIEFmdGVyIGEgc3VjY2Vzc2Z1bCBhc3luY19yZWFkX3VudGlsIG9wZXJhdGlvbiwgdGhlIHN0cmVhbWJ1ZiBtYXkKLSAqIGNvbnRhaW4gYWRkaXRpb25hbCBkYXRhIGJleW9uZCB0aGF0IHdoaWNoIG1hdGNoZWQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gQW4KLSAqIGFwcGxpY2F0aW9uIHdpbGwgdHlwaWNhbGx5IGxlYXZlIHRoYXQgZGF0YSBpbiB0aGUgc3RyZWFtYnVmIGZvciBhIHN1YnNlcXVlbnQKLSAqIGFzeW5jX3JlYWRfdW50aWwgb3BlcmF0aW9uIHRvIGV4YW1pbmUuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUbyBhc3luY2hyb25vdXNseSByZWFkIGRhdGEgaW50byBhIHN0cmVhbWJ1ZiB1bnRpbCBhIENSLUxGIHNlcXVlbmNlIGlzCi0gKiBlbmNvdW50ZXJlZDoKLSAqIEBjb2RlIGFzaW86OnN0cmVhbWJ1ZiBiOwotICogLi4uCi0gKiB2b2lkIGhhbmRsZXIoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZSwgc3RkOjpzaXplX3Qgc2l6ZSkKLSAqIHsKLSAqICAgaWYgKCFlKQotICogICB7Ci0gKiAgICAgc3RkOjppc3RyZWFtIGlzKCZiKTsKLSAqICAgICBzdGQ6OnN0cmluZyBsaW5lOwotICogICAgIHN0ZDo6Z2V0bGluZShpcywgbGluZSk7Ci0gKiAgICAgLi4uCi0gKiAgIH0KLSAqIH0KLSAqIC4uLgotICogYXNpbzo6YXN5bmNfcmVhZF91bnRpbChzLCBiLCBib29zdDo6cmVnZXgoIlxyXG4iKSwgaGFuZGxlcik7IEBlbmRjb2RlCi0gKiBBZnRlciB0aGUgQGMgYXN5bmNfcmVhZF91bnRpbCBvcGVyYXRpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgdGhlIGJ1ZmZlcgotICogQGMgYiBjb250YWlucyB0aGUgZGF0YSB3aGljaCBtYXRjaGVkIHRoZSByZWd1bGFyIGV4cHJlc3Npb246Ci0gKiBAY29kZSB7ICdhJywgJ2InLCAuLi4sICdjJywgJ1xyJywgJ1xuJywgJ2QnLCAnZScsIC4uLiB9IEBlbmRjb2RlCi0gKiBUaGUgY2FsbCB0byBAYyBzdGQ6OmdldGxpbmUgdGhlbiBleHRyYWN0cyB0aGUgZGF0YSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZQotICogbWF0Y2gsIHNvIHRoYXQgdGhlIHN0cmluZyBAYyBsaW5lIGNvbnRhaW5zOgotICogQGNvZGUgeyAnYScsICdiJywgLi4uLCAnYycsICdccicsICdcbicgfSBAZW5kY29kZQotICogVGhlIHJlbWFpbmluZyBkYXRhIGlzIGxlZnQgaW4gdGhlIGJ1ZmZlciBAYyBiIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSB7ICdkJywgJ2UnLCAuLi4gfSBAZW5kY29kZQotICogVGhpcyBkYXRhIG1heSBiZSB0aGUgc3RhcnQgb2YgYSBuZXcgbGluZSwgdG8gYmUgZXh0cmFjdGVkIGJ5IGEgc3Vic2VxdWVudAotICogQGMgYXN5bmNfcmVhZF91bnRpbCBvcGVyYXRpb24uCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JlYWRTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci1BU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY19yZWFkX3VudGlsKEFzeW5jUmVhZFN0cmVhbSYgcywKLSAgICBhc2lvOjpiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwgY29uc3QgYm9vc3Q6OnJlZ2V4JiBleHByLAotICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpOwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19CT09TVF9SRUdFWCkKLSAgICAgICAvLyB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gcmVhZCBkYXRhIGludG8gYSBzdHJlYW1idWYgdW50aWwgYQotLy8vIGZ1bmN0aW9uIG9iamVjdCBpbmRpY2F0ZXMgYSBtYXRjaC4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlYWQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQKLSAqIHN0cmVhbWJ1ZiB1bnRpbCBhIHVzZXItZGVmaW5lZCBtYXRjaCBjb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0LCB3aGVuIGFwcGxpZWQKLSAqIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgc3RyZWFtYnVmLCBpbmRpY2F0ZXMgYSBzdWNjZXNzZnVsIG1hdGNoLiBUaGUKLSAqIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuIFRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdpbGwKLSAqIGNvbnRpbnVlIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgVGhlIG1hdGNoIGNvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyBhIHN0ZDo6cGFpciB3aGVyZSB0aGUgc2Vjb25kCi0gKiBlbGVtZW50IGV2YWx1YXRlcyB0byB0cnVlLgotICoKLSAqIEBsaSBBbiBlcnJvciBvY2N1cnJlZC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiBhc3luY19yZWFkX3NvbWUgZnVuY3Rpb24sIGFuZCBpcyBrbm93biBhcyBhIDxlbT5jb21wb3NlZCBvcGVyYXRpb248L2VtPi4gSWYKLSAqIHRoZSBtYXRjaCBjb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IGFscmVhZHkgaW5kaWNhdGVzIGEgbWF0Y2gsIHRoaXMKLSAqIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5LiBUaGUgcHJvZ3JhbSBtdXN0IGVuc3VyZSB0aGF0Ci0gKiB0aGUgc3RyZWFtIHBlcmZvcm1zIG5vIG90aGVyIHJlYWQgb3BlcmF0aW9ucyAoc3VjaCBhcyBhc3luY19yZWFkLAotICogYXN5bmNfcmVhZF91bnRpbCwgdGhlIHN0cmVhbSdzIGFzeW5jX3JlYWRfc29tZSBmdW5jdGlvbiwgb3IgYW55IG90aGVyCi0gKiBjb21wb3NlZCBvcGVyYXRpb25zIHRoYXQgcGVyZm9ybSByZWFkcykgdW50aWwgdGhpcyBvcGVyYXRpb24gY29tcGxldGVzLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSByZWFkLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBBc3luY1JlYWRTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYiBBIHN0cmVhbWJ1ZiBvYmplY3QgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gKgotICogQHBhcmFtIG1hdGNoX2NvbmRpdGlvbiBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlcgotICogYSBtYXRjaCBleGlzdHMuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCBtdXN0IGJlOgotICogQGNvZGUgcGFpcjxpdGVyYXRvciwgYm9vbD4gbWF0Y2hfY29uZGl0aW9uKGl0ZXJhdG9yIGJlZ2luLCBpdGVyYXRvciBlbmQpOwotICogQGVuZGNvZGUKLSAqIHdoZXJlIEBjIGl0ZXJhdG9yIHJlcHJlc2VudHMgdGhlIHR5cGU6Ci0gKiBAY29kZSBidWZmZXJzX2l0ZXJhdG9yPGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+Ojpjb25zdF9idWZmZXJzX3R5cGU+Ci0gKiBAZW5kY29kZQotICogVGhlIGl0ZXJhdG9yIHBhcmFtZXRlcnMgQGMgYmVnaW4gYW5kIEBjIGVuZCBkZWZpbmUgdGhlIHJhbmdlIG9mIGJ5dGVzIHRvIGJlCi0gKiBzY2FubmVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGEgbWF0Y2guIFRoZSBAYyBmaXJzdCBtZW1iZXIgb2YgdGhlCi0gKiByZXR1cm4gdmFsdWUgaXMgYW4gaXRlcmF0b3IgbWFya2luZyBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBieXRlcyB0aGF0IGhhdmUKLSAqIGJlZW4gY29uc3VtZWQgYnkgdGhlIG1hdGNoIGZ1bmN0aW9uLiBUaGlzIGl0ZXJhdG9yIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQotICogQGMgYmVnaW4gcGFyYW1ldGVyIGZvciBhbnkgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIHRoZSBtYXRjaCBjb25kaXRpb24uIFRoZQotICogQGMgc2Vjb25kIG1lbWJlciBvZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRydWUgaWYgYSBtYXRjaCBoYXMgYmVlbiBmb3VuZCwgZmFsc2UKLSAqIG90aGVyd2lzZS4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcmVhZCBvcGVyYXRpb24gY29tcGxldGVzLgotICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUKLSAqIGhhbmRsZXIgbXVzdCBiZToKLSAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAqICAgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJlYW1idWYncyBnZXQKLSAqICAgLy8gYXJlYSB0aGF0IGhhdmUgYmVlbiBmdWxseSBjb25zdW1lZCBieSB0aGUKLSAqICAgLy8gbWF0Y2ggZnVuY3Rpb24uIE8gaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24gb2YKLSAqIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAqCi0gKiBAbm90ZSBBZnRlciBhIHN1Y2Nlc3NmdWwgYXN5bmNfcmVhZF91bnRpbCBvcGVyYXRpb24sIHRoZSBzdHJlYW1idWYgbWF5Ci0gKiBjb250YWluIGFkZGl0aW9uYWwgZGF0YSBiZXlvbmQgdGhhdCB3aGljaCBtYXRjaGVkIHRoZSBmdW5jdGlvbiBvYmplY3QuIEFuCi0gKiBhcHBsaWNhdGlvbiB3aWxsIHR5cGljYWxseSBsZWF2ZSB0aGF0IGRhdGEgaW4gdGhlIHN0cmVhbWJ1ZiBmb3IgYSBzdWJzZXF1ZW50Ci0gKiBhc3luY19yZWFkX3VudGlsIG9wZXJhdGlvbiB0byBleGFtaW5lLgotICoKLSAqIEBub3RlIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBAYyBpc19tYXRjaF9jb25kaXRpb24gdHlwZSB0cmFpdAotICogZXZhbHVhdGVzIHRvIHRydWUgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBmdW5jdGlvbiBvYmplY3RzIHdpdGggYQotICogQGMgcmVzdWx0X3R5cGUgdHlwZWRlZi4gSXQgbXVzdCBiZSBzcGVjaWFsaXNlZCBmb3Igb3RoZXIgdXNlci1kZWZpbmVkCi0gKiBmdW5jdGlvbiBvYmplY3RzLgotICoKLSAqIEBwYXIgRXhhbXBsZXMKLSAqIFRvIGFzeW5jaHJvbm91c2x5IHJlYWQgZGF0YSBpbnRvIGEgc3RyZWFtYnVmIHVudGlsIHdoaXRlc3BhY2UgaXMgZW5jb3VudGVyZWQ6Ci0gKiBAY29kZSB0eXBlZGVmIGFzaW86OmJ1ZmZlcnNfaXRlcmF0b3I8Ci0gKiAgICAgYXNpbzo6c3RyZWFtYnVmOjpjb25zdF9idWZmZXJzX3R5cGU+IGl0ZXJhdG9yOwotICoKLSAqIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KLSAqIG1hdGNoX3doaXRlc3BhY2UoaXRlcmF0b3IgYmVnaW4sIGl0ZXJhdG9yIGVuZCkKLSAqIHsKLSAqICAgaXRlcmF0b3IgaSA9IGJlZ2luOwotICogICB3aGlsZSAoaSAhPSBlbmQpCi0gKiAgICAgaWYgKHN0ZDo6aXNzcGFjZSgqaSsrKSkKLSAqICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpLCB0cnVlKTsKLSAqICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGksIGZhbHNlKTsKLSAqIH0KLSAqIC4uLgotICogdm9pZCBoYW5kbGVyKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGUsIHN0ZDo6c2l6ZV90IHNpemUpOwotICogLi4uCi0gKiBhc2lvOjpzdHJlYW1idWYgYjsKLSAqIGFzaW86OmFzeW5jX3JlYWRfdW50aWwocywgYiwgbWF0Y2hfd2hpdGVzcGFjZSwgaGFuZGxlcik7Ci0gKiBAZW5kY29kZQotICoKLSAqIFRvIGFzeW5jaHJvbm91c2x5IHJlYWQgZGF0YSBpbnRvIGEgc3RyZWFtYnVmIHVudGlsIGEgbWF0Y2hpbmcgY2hhcmFjdGVyIGlzCi0gKiBmb3VuZDoKLSAqIEBjb2RlIGNsYXNzIG1hdGNoX2NoYXIKLSAqIHsKLSAqIHB1YmxpYzoKLSAqICAgZXhwbGljaXQgbWF0Y2hfY2hhcihjaGFyIGMpIDogY18oYykge30KLSAqCi0gKiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4KLSAqICAgc3RkOjpwYWlyPEl0ZXJhdG9yLCBib29sPiBvcGVyYXRvcigpKAotICogICAgICAgSXRlcmF0b3IgYmVnaW4sIEl0ZXJhdG9yIGVuZCkgY29uc3QKLSAqICAgewotICogICAgIEl0ZXJhdG9yIGkgPSBiZWdpbjsKLSAqICAgICB3aGlsZSAoaSAhPSBlbmQpCi0gKiAgICAgICBpZiAoY18gPT0gKmkrKykKLSAqICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGksIHRydWUpOwotICogICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpLCBmYWxzZSk7Ci0gKiAgIH0KLSAqCi0gKiBwcml2YXRlOgotICogICBjaGFyIGNfOwotICogfTsKLSAqCi0gKiBuYW1lc3BhY2UgYXNpbyB7Ci0gKiAgIHRlbXBsYXRlIDw+IHN0cnVjdCBpc19tYXRjaF9jb25kaXRpb248bWF0Y2hfY2hhcj4KLSAqICAgICA6IHB1YmxpYyBib29zdDo6dHJ1ZV90eXBlIHt9OwotICogfSAvLyBuYW1lc3BhY2UgYXNpbwotICogLi4uCi0gKiB2b2lkIGhhbmRsZXIoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZSwgc3RkOjpzaXplX3Qgc2l6ZSk7Ci0gKiAuLi4KLSAqIGFzaW86OnN0cmVhbWJ1ZiBiOwotICogYXNpbzo6YXN5bmNfcmVhZF91bnRpbChzLCBiLCBtYXRjaF9jaGFyKCdhJyksIGhhbmRsZXIpOwotICogQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmVhZFN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgIHR5cGVuYW1lIE1hdGNoQ29uZGl0aW9uLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLWFzeW5jX3JlYWRfdW50aWwoQXN5bmNSZWFkU3RyZWFtJiBzLAotICAgIGFzaW86OmJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLAotICAgIE1hdGNoQ29uZGl0aW9uIG1hdGNoX2NvbmRpdGlvbiwgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlciwKLSAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfbWF0Y2hfY29uZGl0aW9uPE1hdGNoQ29uZGl0aW9uPjo6dmFsdWU+Ojp0eXBlKiA9IDApOwotCi0vKkB9Ki8KLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9pbXBsL3JlYWRfdW50aWwuaHBwIgotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19JT1NUUkVBTSkKLQotI2VuZGlmIC8vIEFTSU9fUkVBRF9VTlRJTF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zZXFfcGFja2V0X3NvY2tldF9zZXJ2aWNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zZXFfcGFja2V0X3NvY2tldF9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI1ZWU1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc2VxX3BhY2tldF9zb2NrZXRfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLy8KLS8vIHNlcV9wYWNrZXRfc29ja2V0X3NlcnZpY2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NFUV9QQUNLRVRfU09DS0VUX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fU0VRX1BBQ0tFVF9TT0NLRVRfU0VSVklDRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90eXBlX3RyYWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL251bGxfc29ja2V0X3NlcnZpY2UuaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfc2VydmljZS5ocHAiCi0jZWxzZQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZS5ocHAiCi0jZW5kaWYKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIERlZmF1bHQgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLWNsYXNzIHNlcV9wYWNrZXRfc29ja2V0X3NlcnZpY2UKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgOiBwdWJsaWMgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZQotI2Vsc2UKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8Ci0gICAgICBzZXFfcGFja2V0X3NvY2tldF9zZXJ2aWNlPFByb3RvY29sPiA+Ci0jZW5kaWYKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB1bmlxdWUgc2VydmljZSBpZGVudGlmaWVyLgotICBzdGF0aWMgYXNpbzo6aW9fc2VydmljZTo6aWQgaWQ7Ci0jZW5kaWYKLQotICAvLy8gVGhlIHByb3RvY29sIHR5cGUuCi0gIHR5cGVkZWYgUHJvdG9jb2wgcHJvdG9jb2xfdHlwZTsKLQotICAvLy8gVGhlIGVuZHBvaW50IHR5cGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgUHJvdG9jb2w6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLXByaXZhdGU6Ci0gIC8vIFRoZSB0eXBlIG9mIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICB0eXBlZGVmIGRldGFpbDo6bnVsbF9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gc2VydmljZV9pbXBsX3R5cGU7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gIHR5cGVkZWYgZGV0YWlsOjp3aW5faW9jcF9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gc2VydmljZV9pbXBsX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIGRldGFpbDo6cmVhY3RpdmVfc29ja2V0X3NlcnZpY2U8UHJvdG9jb2w+IHNlcnZpY2VfaW1wbF90eXBlOwotI2VuZGlmCi0KLXB1YmxpYzoKLSAgLy8vIFRoZSB0eXBlIG9mIGEgc2VxdWVuY2VkIHBhY2tldCBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBpbXBsZW1lbnRhdGlvbl90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiB0eXBlbmFtZSBzZXJ2aWNlX2ltcGxfdHlwZTo6aW1wbGVtZW50YXRpb25fdHlwZSBpbXBsZW1lbnRhdGlvbl90eXBlOwotI2VuZGlmCi0KLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZV90eXBlLikgVGhlIG5hdGl2ZSBzb2NrZXQgdHlwZS4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIG5hdGl2ZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiB0eXBlbmFtZSBzZXJ2aWNlX2ltcGxfdHlwZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV90eXBlOwotI2VuZGlmCi0KLSAgLy8vIFRoZSBuYXRpdmUgc29ja2V0IHR5cGUuCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHR5cGVuYW1lIHNlcnZpY2VfaW1wbF90eXBlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZV90eXBlOwotI2VuZGlmCi0KLSAgLy8vIENvbnN0cnVjdCBhIG5ldyBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldCBzZXJ2aWNlIGZvciB0aGUgc3BlY2lmaWVkCi0gIC8vLyBpb19zZXJ2aWNlLgotICBleHBsaWNpdCBzZXFfcGFja2V0X3NvY2tldF9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTwKLSAgICAgICAgc2VxX3BhY2tldF9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gPihpb19zZXJ2aWNlKSwKLSAgICAgIHNlcnZpY2VfaW1wbF8oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIG5ldyBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBjb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8uY29uc3RydWN0KGltcGwpOwotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBuZXcgc2VxdWVuY2VkIHBhY2tldCBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLm1vdmVfY29uc3RydWN0KGltcGwsIG90aGVyX2ltcGwpOwotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGZyb20gYW5vdGhlciBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2Fzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgc2VxX3BhY2tldF9zb2NrZXRfc2VydmljZSYgb3RoZXJfc2VydmljZSwKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLm1vdmVfYXNzaWduKGltcGwsIG90aGVyX3NlcnZpY2Uuc2VydmljZV9pbXBsXywgb3RoZXJfaW1wbCk7Ci0gIH0KLQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBuZXcgc2VxdWVuY2VkIHBhY2tldCBzb2NrZXQgaW1wbGVtZW50YXRpb24gZnJvbSBhbm90aGVyCi0gIC8vLyBwcm90b2NvbCB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxPgotICB2b2lkIGNvbnZlcnRpbmdfbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHR5cGVuYW1lIHNlcV9wYWNrZXRfc29ja2V0X3NlcnZpY2U8Ci0gICAgICAgIFByb3RvY29sMT46OmltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwsCi0gICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8Ci0gICAgICAgIFByb3RvY29sMSwgUHJvdG9jb2w+Ojp2YWx1ZT46OnR5cGUqID0gMCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8udGVtcGxhdGUgY29udmVydGluZ19tb3ZlX2NvbnN0cnVjdDxQcm90b2NvbDE+KAotICAgICAgICBpbXBsLCBvdGhlcl9pbXBsKTsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIERlc3Ryb3kgYSBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBkZXN0cm95KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmRlc3Ryb3koaW1wbCk7Ci0gIH0KLQotICAvLy8gT3BlbiBhIHNlcXVlbmNlZCBwYWNrZXQgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIG9wZW4oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGlmIChwcm90b2NvbC50eXBlKCkgPT0gQVNJT19PU19ERUYoU09DS19TRVFQQUNLRVQpKQotICAgICAgc2VydmljZV9pbXBsXy5vcGVuKGltcGwsIHByb3RvY29sLCBlYyk7Ci0gICAgZWxzZQotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBzb2NrZXQgdG8gYSBzZXF1ZW5jZWQgcGFja2V0IHNvY2tldC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhc3NpZ24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sLCBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIG5hdGl2ZV9zb2NrZXQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmFzc2lnbihpbXBsLCBwcm90b2NvbCwgbmF0aXZlX3NvY2tldCwgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgb3Blbi4KLSAgYm9vbCBpc19vcGVuKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5pc19vcGVuKGltcGwpOwotICB9Ci0KLSAgLy8vIENsb3NlIGEgc2VxdWVuY2VkIHBhY2tldCBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uY2xvc2UoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZSgpLikgR2V0IHRoZSBuYXRpdmUgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBuYXRpdmVfdHlwZSBuYXRpdmUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5hdGl2ZV9oYW5kbGUoaW1wbCk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBuYXRpdmUgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX2hhbmRsZShpbXBsKTsKLSAgfQotCi0gIC8vLyBDYW5jZWwgYWxsIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIGNhbmNlbChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5jYW5jZWwoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzb2NrZXQgaXMgYXQgdGhlIG91dC1vZi1iYW5kIGRhdGEgbWFyay4KLSAgYm9vbCBhdF9tYXJrKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmF0X21hcmsoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgcmVhZGluZy4KLSAgc3RkOjpzaXplX3QgYXZhaWxhYmxlKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmF2YWlsYWJsZShpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gQmluZCB0aGUgc2VxdWVuY2VkIHBhY2tldCBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhbCBlbmRwb2ludC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBiaW5kKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5iaW5kKGltcGwsIGVuZHBvaW50LCBlYyk7Ci0gIH0KLQotICAvLy8gQ29ubmVjdCB0aGUgc2VxdWVuY2VkIHBhY2tldCBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBlbmRwb2ludC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjb25uZWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBwZWVyX2VuZHBvaW50LCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNvbm5lY3QoaW1wbCwgcGVlcl9lbmRwb2ludCwgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBjb25uZWN0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29ubmVjdEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKENvbm5lY3RIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSkpCi0gIGFzeW5jX2Nvbm5lY3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIHBlZXJfZW5kcG9pbnQsCi0gICAgICBBU0lPX01PVkVfQVJHKENvbm5lY3RIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIENvbm5lY3RIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlKT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoQ29ubmVjdEhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICAgIHNlcnZpY2VfaW1wbF8uYXN5bmNfY29ubmVjdChpbXBsLCBwZWVyX2VuZHBvaW50LCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLSAgLy8vIFNldCBhIHNvY2tldCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTZXR0YWJsZVNvY2tldE9wdGlvbj4KLSAgYXNpbzo6ZXJyb3JfY29kZSBzZXRfb3B0aW9uKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBTZXR0YWJsZVNvY2tldE9wdGlvbiYgb3B0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnNldF9vcHRpb24oaW1wbCwgb3B0aW9uLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0IGEgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEdldHRhYmxlU29ja2V0T3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIGdldF9vcHRpb24oY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIEdldHRhYmxlU29ja2V0T3B0aW9uJiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uZ2V0X29wdGlvbihpbXBsLCBvcHRpb24sIGVjKTsKLSAgfQotCi0gIC8vLyBQZXJmb3JtIGFuIElPIGNvbnRyb2wgY29tbWFuZCBvbiB0aGUgc29ja2V0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW9Db250cm9sQ29tbWFuZD4KLSAgYXNpbzo6ZXJyb3JfY29kZSBpb19jb250cm9sKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBJb0NvbnRyb2xDb21tYW5kJiBjb21tYW5kLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmlvX2NvbnRyb2woaW1wbCwgY29tbWFuZCwgZWMpOwotICB9Ci0KLSAgLy8vIEdldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBzb2NrZXQuCi0gIGJvb2wgbm9uX2Jsb2NraW5nKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5ub25fYmxvY2tpbmcoaW1wbCk7Ci0gIH0KLQotICAvLy8gU2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIHNvY2tldC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBub25fYmxvY2tpbmcoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5ub25fYmxvY2tpbmcoaW1wbCwgbW9kZSwgZWMpOwotICB9Ci0KLSAgLy8vIEdldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBuYXRpdmUgc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBib29sIG5hdGl2ZV9ub25fYmxvY2tpbmcoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5hdGl2ZV9ub25fYmxvY2tpbmcoaW1wbCk7Ci0gIH0KLQotICAvLy8gU2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIG5hdGl2ZSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgbmF0aXZlX25vbl9ibG9ja2luZyhpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYm9vbCBtb2RlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5hdGl2ZV9ub25fYmxvY2tpbmcoaW1wbCwgbW9kZSwgZWMpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbG9jYWwgZW5kcG9pbnQuCi0gIGVuZHBvaW50X3R5cGUgbG9jYWxfZW5kcG9pbnQoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubG9jYWxfZW5kcG9pbnQoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgcmVtb3RlIGVuZHBvaW50LgotICBlbmRwb2ludF90eXBlIHJlbW90ZV9lbmRwb2ludChjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5yZW1vdGVfZW5kcG9pbnQoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIERpc2FibGUgc2VuZHMgb3IgcmVjZWl2ZXMgb24gdGhlIHNvY2tldC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBzaHV0ZG93bihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgc29ja2V0X2Jhc2U6OnNodXRkb3duX3R5cGUgd2hhdCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5zaHV0ZG93bihpbXBsLCB3aGF0LCBlYyk7Ci0gIH0KLQotICAvLy8gU2VuZCB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgcGVlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHNlbmQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBmbGFncywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5zZW5kKGltcGwsIGJ1ZmZlcnMsIGZsYWdzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHNlbmQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfc2VuZChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgICAgV3JpdGVIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFdyaXRlSGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV9pbXBsXy5hc3luY19zZW5kKGltcGwsIGJ1ZmZlcnMsIGZsYWdzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLSAgLy8vIFJlY2VpdmUgc29tZSBkYXRhIGZyb20gdGhlIHBlZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlY2VpdmUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgaW5fZmxhZ3MsCi0gICAgICBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyYgb3V0X2ZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnJlY2VpdmVfd2l0aF9mbGFncyhpbXBsLAotICAgICAgICBidWZmZXJzLCBpbl9mbGFncywgb3V0X2ZsYWdzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlY2VpdmUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVjZWl2ZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBzb2NrZXRfYmFzZTo6bWVzc2FnZV9mbGFncyBpbl9mbGFncywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzJiBvdXRfZmxhZ3MsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3JlY2VpdmVfd2l0aF9mbGFncyhpbXBsLAotICAgICAgICBidWZmZXJzLCBpbl9mbGFncywgb3V0X2ZsYWdzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIHZvaWQgc2h1dGRvd25fc2VydmljZSgpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLnNodXRkb3duX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSAgc2VydmljZV9pbXBsX3R5cGUgc2VydmljZV9pbXBsXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU0VRX1BBQ0tFVF9TT0NLRVRfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zZXJpYWxfcG9ydC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc2VyaWFsX3BvcnQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWFjNzE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zZXJpYWxfcG9ydC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLwotLy8gc2VyaWFsX3BvcnQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vIENvcHlyaWdodCAoYykgMjAwOCBSZXAgSW52YXJpYW50IFN5c3RlbXMsIEluYy4gKGluZm9AcmVwaW52YXJpYW50LmNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TRVJJQUxfUE9SVF9IUFAKLSNkZWZpbmUgQVNJT19TRVJJQUxfUE9SVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU0VSSUFMX1BPUlQpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3NlcmlhbF9wb3J0LmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0vLy8gVHlwZWRlZiBmb3IgdGhlIHR5cGljYWwgdXNhZ2Ugb2YgYSBzZXJpYWwgcG9ydC4KLXR5cGVkZWYgYmFzaWNfc2VyaWFsX3BvcnQ8PiBzZXJpYWxfcG9ydDsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TRVJJQUxfUE9SVCkKLSAgICAgICAvLyAgIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jZW5kaWYgLy8gQVNJT19TRVJJQUxfUE9SVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zZXJpYWxfcG9ydF9iYXNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zZXJpYWxfcG9ydF9iYXNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkODY1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc2VyaWFsX3BvcnRfYmFzZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8KLS8vIHNlcmlhbF9wb3J0X2Jhc2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IFJlcCBJbnZhcmlhbnQgU3lzdGVtcywgSW5jLiAoaW5mb0ByZXBpbnZhcmlhbnQuY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NFUklBTF9QT1JUX0JBU0VfSFBQCi0jZGVmaW5lIEFTSU9fU0VSSUFMX1BPUlRfQkFTRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU0VSSUFMX1BPUlQpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0jIGluY2x1ZGUgPHRlcm1pb3MuaD4KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3JfY29kZS5ocHAiCi0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSMgZGVmaW5lIEFTSU9fT1BUSU9OX1NUT1JBR0UgaW1wbGVtZW50YXRpb25fZGVmaW5lZAotI2VsaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSMgZGVmaW5lIEFTSU9fT1BUSU9OX1NUT1JBR0UgRENCCi0jZWxzZQotIyBkZWZpbmUgQVNJT19PUFRJT05fU1RPUkFHRSB0ZXJtaW9zCi0jZW5kaWYKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIFRoZSBzZXJpYWxfcG9ydF9iYXNlIGNsYXNzIGlzIHVzZWQgYXMgYSBiYXNlIGZvciB0aGUgYmFzaWNfc2VyaWFsX3BvcnQgY2xhc3MKLS8vLyB0ZW1wbGF0ZSBzbyB0aGF0IHdlIGhhdmUgYSBjb21tb24gcGxhY2UgdG8gZGVmaW5lIHRoZSBzZXJpYWwgcG9ydCBvcHRpb25zLgotY2xhc3Mgc2VyaWFsX3BvcnRfYmFzZQotewotcHVibGljOgotICAvLy8gU2VyaWFsIHBvcnQgb3B0aW9uIHRvIHBlcm1pdCBjaGFuZ2luZyB0aGUgYmF1ZCByYXRlLgotICAvKioKLSAgICogSW1wbGVtZW50cyBjaGFuZ2luZyB0aGUgYmF1ZCByYXRlIGZvciBhIGdpdmVuIHNlcmlhbCBwb3J0LgotICAgKi8KLSAgY2xhc3MgYmF1ZF9yYXRlCi0gIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IGJhdWRfcmF0ZSh1bnNpZ25lZCBpbnQgcmF0ZSA9IDApOwotICAgIHVuc2lnbmVkIGludCB2YWx1ZSgpIGNvbnN0OwotICAgIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIHN0b3JlKAotICAgICAgICBBU0lPX09QVElPTl9TVE9SQUdFJiBzdG9yYWdlLAotICAgICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3Q7Ci0gICAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgbG9hZCgKLSAgICAgICAgY29uc3QgQVNJT19PUFRJT05fU1RPUkFHRSYgc3RvcmFnZSwKLSAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotICBwcml2YXRlOgotICAgIHVuc2lnbmVkIGludCB2YWx1ZV87Ci0gIH07Ci0KLSAgLy8vIFNlcmlhbCBwb3J0IG9wdGlvbiB0byBwZXJtaXQgY2hhbmdpbmcgdGhlIGZsb3cgY29udHJvbC4KLSAgLyoqCi0gICAqIEltcGxlbWVudHMgY2hhbmdpbmcgdGhlIGZsb3cgY29udHJvbCBmb3IgYSBnaXZlbiBzZXJpYWwgcG9ydC4KLSAgICovCi0gIGNsYXNzIGZsb3dfY29udHJvbAotICB7Ci0gIHB1YmxpYzoKLSAgICBlbnVtIHR5cGUgeyBub25lLCBzb2Z0d2FyZSwgaGFyZHdhcmUgfTsKLSAgICBBU0lPX0RFQ0wgZXhwbGljaXQgZmxvd19jb250cm9sKHR5cGUgdCA9IG5vbmUpOwotICAgIHR5cGUgdmFsdWUoKSBjb25zdDsKLSAgICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBzdG9yZSgKLSAgICAgICAgQVNJT19PUFRJT05fU1RPUkFHRSYgc3RvcmFnZSwKLSAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0OwotICAgIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGxvYWQoCi0gICAgICAgIGNvbnN0IEFTSU9fT1BUSU9OX1NUT1JBR0UmIHN0b3JhZ2UsCi0gICAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLSAgcHJpdmF0ZToKLSAgICB0eXBlIHZhbHVlXzsKLSAgfTsKLQotICAvLy8gU2VyaWFsIHBvcnQgb3B0aW9uIHRvIHBlcm1pdCBjaGFuZ2luZyB0aGUgcGFyaXR5LgotICAvKioKLSAgICogSW1wbGVtZW50cyBjaGFuZ2luZyB0aGUgcGFyaXR5IGZvciBhIGdpdmVuIHNlcmlhbCBwb3J0LgotICAgKi8KLSAgY2xhc3MgcGFyaXR5Ci0gIHsKLSAgcHVibGljOgotICAgIGVudW0gdHlwZSB7IG5vbmUsIG9kZCwgZXZlbiB9OwotICAgIEFTSU9fREVDTCBleHBsaWNpdCBwYXJpdHkodHlwZSB0ID0gbm9uZSk7Ci0gICAgdHlwZSB2YWx1ZSgpIGNvbnN0OwotICAgIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIHN0b3JlKAotICAgICAgICBBU0lPX09QVElPTl9TVE9SQUdFJiBzdG9yYWdlLAotICAgICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3Q7Ci0gICAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgbG9hZCgKLSAgICAgICAgY29uc3QgQVNJT19PUFRJT05fU1RPUkFHRSYgc3RvcmFnZSwKLSAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotICBwcml2YXRlOgotICAgIHR5cGUgdmFsdWVfOwotICB9OwotCi0gIC8vLyBTZXJpYWwgcG9ydCBvcHRpb24gdG8gcGVybWl0IGNoYW5naW5nIHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzLgotICAvKioKLSAgICogSW1wbGVtZW50cyBjaGFuZ2luZyB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cyBmb3IgYSBnaXZlbiBzZXJpYWwgcG9ydC4KLSAgICovCi0gIGNsYXNzIHN0b3BfYml0cwotICB7Ci0gIHB1YmxpYzoKLSAgICBlbnVtIHR5cGUgeyBvbmUsIG9uZXBvaW50Zml2ZSwgdHdvIH07Ci0gICAgQVNJT19ERUNMIGV4cGxpY2l0IHN0b3BfYml0cyh0eXBlIHQgPSBvbmUpOwotICAgIHR5cGUgdmFsdWUoKSBjb25zdDsKLSAgICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBzdG9yZSgKLSAgICAgICAgQVNJT19PUFRJT05fU1RPUkFHRSYgc3RvcmFnZSwKLSAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0OwotICAgIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGxvYWQoCi0gICAgICAgIGNvbnN0IEFTSU9fT1BUSU9OX1NUT1JBR0UmIHN0b3JhZ2UsCi0gICAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLSAgcHJpdmF0ZToKLSAgICB0eXBlIHZhbHVlXzsKLSAgfTsKLQotICAvLy8gU2VyaWFsIHBvcnQgb3B0aW9uIHRvIHBlcm1pdCBjaGFuZ2luZyB0aGUgY2hhcmFjdGVyIHNpemUuCi0gIC8qKgotICAgKiBJbXBsZW1lbnRzIGNoYW5naW5nIHRoZSBjaGFyYWN0ZXIgc2l6ZSBmb3IgYSBnaXZlbiBzZXJpYWwgcG9ydC4KLSAgICovCi0gIGNsYXNzIGNoYXJhY3Rlcl9zaXplCi0gIHsKLSAgcHVibGljOgotICAgIEFTSU9fREVDTCBleHBsaWNpdCBjaGFyYWN0ZXJfc2l6ZSh1bnNpZ25lZCBpbnQgdCA9IDgpOwotICAgIHVuc2lnbmVkIGludCB2YWx1ZSgpIGNvbnN0OwotICAgIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIHN0b3JlKAotICAgICAgICBBU0lPX09QVElPTl9TVE9SQUdFJiBzdG9yYWdlLAotICAgICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3Q7Ci0gICAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgbG9hZCgKLSAgICAgICAgY29uc3QgQVNJT19PUFRJT05fU1RPUkFHRSYgc3RvcmFnZSwKLSAgICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotICBwcml2YXRlOgotICAgIHVuc2lnbmVkIGludCB2YWx1ZV87Ci0gIH07Ci0KLXByb3RlY3RlZDoKLSAgLy8vIFByb3RlY3RlZCBkZXN0cnVjdG9yIHRvIHByZXZlbnQgZGVsZXRpb24gdGhyb3VnaCB0aGlzIHR5cGUuCi0gIH5zZXJpYWxfcG9ydF9iYXNlKCkKLSAgewotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSN1bmRlZiBBU0lPX09QVElPTl9TVE9SQUdFCi0KLSNpbmNsdWRlICJhc2lvL2ltcGwvc2VyaWFsX3BvcnRfYmFzZS5ocHAiCi0jaWYgZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotIyBpbmNsdWRlICJhc2lvL2ltcGwvc2VyaWFsX3BvcnRfYmFzZS5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TRVJJQUxfUE9SVCkKLSAgICAgICAvLyAgIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jZW5kaWYgLy8gQVNJT19TRVJJQUxfUE9SVF9CQVNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NlcmlhbF9wb3J0X3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NlcmlhbF9wb3J0X3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTNhMmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zZXJpYWxfcG9ydF9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vLwotLy8gc2VyaWFsX3BvcnRfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU0VSSUFMX1BPUlRfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19TRVJJQUxfUE9SVF9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TRVJJQUxfUE9SVCkgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdGl2ZV9zZXJpYWxfcG9ydF9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9zZXJpYWxfcG9ydF9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc2VyaWFsX3BvcnRfYmFzZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBEZWZhdWx0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gZm9yIGEgc2VyaWFsIHBvcnQuCi1jbGFzcyBzZXJpYWxfcG9ydF9zZXJ2aWNlCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIDogcHVibGljIGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2UKLSNlbHNlCi0gIDogcHVibGljIGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPHNlcmlhbF9wb3J0X3NlcnZpY2U+Ci0jZW5kaWYKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB1bmlxdWUgc2VydmljZSBpZGVudGlmaWVyLgotICBzdGF0aWMgYXNpbzo6aW9fc2VydmljZTo6aWQgaWQ7Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAgLy8gVGhlIHR5cGUgb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotI2lmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSAgdHlwZWRlZiBkZXRhaWw6Ondpbl9pb2NwX3NlcmlhbF9wb3J0X3NlcnZpY2Ugc2VydmljZV9pbXBsX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIGRldGFpbDo6cmVhY3RpdmVfc2VyaWFsX3BvcnRfc2VydmljZSBzZXJ2aWNlX2ltcGxfdHlwZTsKLSNlbmRpZgotCi1wdWJsaWM6Ci0gIC8vLyBUaGUgdHlwZSBvZiBhIHNlcmlhbCBwb3J0IGltcGxlbWVudGF0aW9uLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgc2VydmljZV9pbXBsX3R5cGU6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbmRpZgotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGVfdHlwZS4pIFRoZSBuYXRpdmUgaGFuZGxlIHR5cGUuCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBuYXRpdmVfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgc2VydmljZV9pbXBsX3R5cGU6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBUaGUgbmF0aXZlIGhhbmRsZSB0eXBlLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgbmF0aXZlX2hhbmRsZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBzZXJ2aWNlX2ltcGxfdHlwZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgc2VyaWFsIHBvcnQgc2VydmljZSBmb3IgdGhlIHNwZWNpZmllZCBpb19zZXJ2aWNlLgotICBleHBsaWNpdCBzZXJpYWxfcG9ydF9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxzZXJpYWxfcG9ydF9zZXJ2aWNlPihpb19zZXJ2aWNlKSwKLSAgICAgIHNlcnZpY2VfaW1wbF8oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIG5ldyBzZXJpYWwgcG9ydCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBjb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8uY29uc3RydWN0KGltcGwpOwotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBuZXcgc2VyaWFsIHBvcnQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLm1vdmVfY29uc3RydWN0KGltcGwsIG90aGVyX2ltcGwpOwotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGZyb20gYW5vdGhlciBzZXJpYWwgcG9ydCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2Fzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgc2VyaWFsX3BvcnRfc2VydmljZSYgb3RoZXJfc2VydmljZSwKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLm1vdmVfYXNzaWduKGltcGwsIG90aGVyX3NlcnZpY2Uuc2VydmljZV9pbXBsXywgb3RoZXJfaW1wbCk7Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0gIC8vLyBEZXN0cm95IGEgc2VyaWFsIHBvcnQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgZGVzdHJveShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5kZXN0cm95KGltcGwpOwotICB9Ci0KLSAgLy8vIE9wZW4gYSBzZXJpYWwgcG9ydC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBvcGVuKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm9wZW4oaW1wbCwgZGV2aWNlLCBlYyk7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUgdG8gYSBzZXJpYWwgcG9ydC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhc3NpZ24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgaGFuZGxlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmFzc2lnbihpbXBsLCBoYW5kbGUsIGVjKTsKLSAgfQotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgaGFuZGxlIGlzIG9wZW4uCi0gIGJvb2wgaXNfb3Blbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uaXNfb3BlbihpbXBsKTsKLSAgfQotCi0gIC8vLyBDbG9zZSBhIHNlcmlhbCBwb3J0IGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIGNsb3NlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNsb3NlKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGUoKS4pIEdldCB0aGUgbmF0aXZlIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgbmF0aXZlX3R5cGUgbmF0aXZlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfaGFuZGxlKGltcGwpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbmF0aXZlIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5hdGl2ZV9oYW5kbGUoaW1wbCk7Ci0gIH0KLQotICAvLy8gQ2FuY2VsIGFsbCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZS4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uY2FuY2VsKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyBTZXQgYSBzZXJpYWwgcG9ydCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgc2V0X29wdGlvbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgU2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uJiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2V0X29wdGlvbihpbXBsLCBvcHRpb24sIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgYSBzZXJpYWwgcG9ydCBvcHRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBHZXR0YWJsZVNlcmlhbFBvcnRPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgZ2V0X29wdGlvbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgR2V0dGFibGVTZXJpYWxQb3J0T3B0aW9uJiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uZ2V0X29wdGlvbihpbXBsLCBvcHRpb24sIGVjKTsKLSAgfQotCi0gIC8vLyBTZW5kIGEgYnJlYWsgc2VxdWVuY2UgdG8gdGhlIHNlcmlhbCBwb3J0LgotICBhc2lvOjplcnJvcl9jb2RlIHNlbmRfYnJlYWsoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2VuZF9icmVhayhpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gV3JpdGUgdGhlIGdpdmVuIGRhdGEgdG8gdGhlIHN0cmVhbS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHdyaXRlX3NvbWUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ud3JpdGVfc29tZShpbXBsLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdyaXRlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3dyaXRlX3NvbWUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3dyaXRlX3NvbWUoaW1wbCwgYnVmZmVycywgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBSZWFkIHNvbWUgZGF0YSBmcm9tIHRoZSBzdHJlYW0uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnJlYWRfc29tZShpbXBsLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlYWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVhZF9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3JlYWRfc29tZShpbXBsLCBidWZmZXJzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIHZvaWQgc2h1dGRvd25fc2VydmljZSgpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLnNodXRkb3duX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSAgc2VydmljZV9pbXBsX3R5cGUgc2VydmljZV9pbXBsXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU0VSSUFMX1BPUlQpCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2VuZGlmIC8vIEFTSU9fU0VSSUFMX1BPUlRfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zaWduYWxfc2V0LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zaWduYWxfc2V0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1YjZmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc2lnbmFsX3NldC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLwotLy8gc2lnbmFsX3NldC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU0lHTkFMX1NFVF9IUFAKLSNkZWZpbmUgQVNJT19TSUdOQUxfU0VUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc2lnbmFsX3NldC5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIFR5cGVkZWYgZm9yIHRoZSB0eXBpY2FsIHVzYWdlIG9mIGEgc2lnbmFsIHNldC4KLXR5cGVkZWYgYmFzaWNfc2lnbmFsX3NldDw+IHNpZ25hbF9zZXQ7Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIEFTSU9fU0lHTkFMX1NFVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zaWduYWxfc2V0X3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NpZ25hbF9zZXRfc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjVhZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NpZ25hbF9zZXRfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8KLS8vIHNpZ25hbF9zZXRfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TSUdOQUxfU0VUX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fU0lHTkFMX1NFVF9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zaWduYWxfc2V0X3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBEZWZhdWx0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gZm9yIGEgc2lnbmFsIHNldC4KLWNsYXNzIHNpZ25hbF9zZXRfc2VydmljZQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICA6IHB1YmxpYyBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlCi0jZWxzZQotICA6IHB1YmxpYyBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxzaWduYWxfc2V0X3NlcnZpY2U+Ci0jZW5kaWYKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB1bmlxdWUgc2VydmljZSBpZGVudGlmaWVyLgotICBzdGF0aWMgYXNpbzo6aW9fc2VydmljZTo6aWQgaWQ7Ci0jZW5kaWYKLQotcHVibGljOgotICAvLy8gVGhlIHR5cGUgb2YgYSBzaWduYWwgc2V0IGltcGxlbWVudGF0aW9uLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgZGV0YWlsOjpzaWduYWxfc2V0X3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgc2lnbmFsIHNldCBzZXJ2aWNlIGZvciB0aGUgc3BlY2lmaWVkIGlvX3NlcnZpY2UuCi0gIGV4cGxpY2l0IHNpZ25hbF9zZXRfc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8c2lnbmFsX3NldF9zZXJ2aWNlPihpb19zZXJ2aWNlKSwKLSAgICAgIHNlcnZpY2VfaW1wbF8oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIG5ldyBzaWduYWwgc2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5jb25zdHJ1Y3QoaW1wbCk7Ci0gIH0KLQotICAvLy8gRGVzdHJveSBhIHNpZ25hbCBzZXQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgZGVzdHJveShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5kZXN0cm95KGltcGwpOwotICB9Ci0KLSAgLy8vIEFkZCBhIHNpZ25hbCB0byBhIHNpZ25hbF9zZXQuCi0gIGFzaW86OmVycm9yX2NvZGUgYWRkKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBpbnQgc2lnbmFsX251bWJlciwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5hZGQoaW1wbCwgc2lnbmFsX251bWJlciwgZWMpOwotICB9Ci0KLSAgLy8vIFJlbW92ZSBhIHNpZ25hbCB0byBhIHNpZ25hbF9zZXQuCi0gIGFzaW86OmVycm9yX2NvZGUgcmVtb3ZlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBpbnQgc2lnbmFsX251bWJlciwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5yZW1vdmUoaW1wbCwgc2lnbmFsX251bWJlciwgZWMpOwotICB9Ci0KLSAgLy8vIFJlbW92ZSBhbGwgc2lnbmFscyBmcm9tIGEgc2lnbmFsX3NldC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjbGVhcihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5jbGVhcihpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gQ2FuY2VsIGFsbCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmFsIHNldC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uY2FuY2VsKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gd2FpdCBmb3IgYSBzaWduYWwgdG8gYmUgZGVsaXZlcmVkLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2lnbmFsSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoU2lnbmFsSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIGludCkpCi0gIGFzeW5jX3dhaXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIEFTSU9fTU9WRV9BUkcoU2lnbmFsSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBTaWduYWxIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBpbnQpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChTaWduYWxIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3dhaXQoaW1wbCwgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICB2b2lkIHNodXRkb3duX3NlcnZpY2UoKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5zaHV0ZG93bl9zZXJ2aWNlKCk7Ci0gIH0KLQotICAvLyBQZXJmb3JtIGFueSBmb3JrLXJlbGF0ZWQgaG91c2VrZWVwaW5nLgotICB2b2lkIGZvcmtfc2VydmljZShhc2lvOjppb19zZXJ2aWNlOjpmb3JrX2V2ZW50IGV2ZW50KQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5mb3JrX3NlcnZpY2UoZXZlbnQpOwotICB9Ci0KLSAgLy8gVGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotICBkZXRhaWw6OnNpZ25hbF9zZXRfc2VydmljZSBzZXJ2aWNlX2ltcGxfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19TSUdOQUxfU0VUX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc29ja2V0X2FjY2VwdG9yX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NvY2tldF9hY2NlcHRvcl9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkOTFmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc29ja2V0X2FjY2VwdG9yX3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8vCi0vLyBzb2NrZXRfYWNjZXB0b3Jfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NPQ0tFVF9BQ0NFUFRPUl9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX1NPQ0tFVF9BQ0NFUFRPUl9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vYmFzaWNfc29ja2V0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90eXBlX3RyYWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL251bGxfc29ja2V0X3NlcnZpY2UuaHBwIgotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9zb2NrZXRfc2VydmljZS5ocHAiCi0jZWxzZQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9yZWFjdGl2ZV9zb2NrZXRfc2VydmljZS5ocHAiCi0jZW5kaWYKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIERlZmF1bHQgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBzb2NrZXQgYWNjZXB0b3IuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2w+Ci1jbGFzcyBzb2NrZXRfYWNjZXB0b3Jfc2VydmljZQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICA6IHB1YmxpYyBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlCi0jZWxzZQotICA6IHB1YmxpYyBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxzb2NrZXRfYWNjZXB0b3Jfc2VydmljZTxQcm90b2NvbD4gPgotI2VuZGlmCi17Ci1wdWJsaWM6Ci0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBUaGUgdW5pcXVlIHNlcnZpY2UgaWRlbnRpZmllci4KLSAgc3RhdGljIGFzaW86OmlvX3NlcnZpY2U6OmlkIGlkOwotI2VuZGlmCi0KLSAgLy8vIFRoZSBwcm90b2NvbCB0eXBlLgotICB0eXBlZGVmIFByb3RvY29sIHByb3RvY29sX3R5cGU7Ci0KLSAgLy8vIFRoZSBlbmRwb2ludCB0eXBlLgotICB0eXBlZGVmIHR5cGVuYW1lIHByb3RvY29sX3R5cGU6OmVuZHBvaW50IGVuZHBvaW50X3R5cGU7Ci0KLXByaXZhdGU6Ci0gIC8vIFRoZSB0eXBlIG9mIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSNpZiBkZWZpbmVkKEFTSU9fV0lORE9XU19SVU5USU1FKQotICB0eXBlZGVmIGRldGFpbDo6bnVsbF9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gc2VydmljZV9pbXBsX3R5cGU7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0lPQ1ApCi0gIHR5cGVkZWYgZGV0YWlsOjp3aW5faW9jcF9zb2NrZXRfc2VydmljZTxQcm90b2NvbD4gc2VydmljZV9pbXBsX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIGRldGFpbDo6cmVhY3RpdmVfc29ja2V0X3NlcnZpY2U8UHJvdG9jb2w+IHNlcnZpY2VfaW1wbF90eXBlOwotI2VuZGlmCi0KLXB1YmxpYzoKLSAgLy8vIFRoZSBuYXRpdmUgdHlwZSBvZiB0aGUgc29ja2V0IGFjY2VwdG9yLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgdHlwZW5hbWUgc2VydmljZV9pbXBsX3R5cGU6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbmRpZgotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGVfdHlwZS4pIFRoZSBuYXRpdmUgYWNjZXB0b3IgdHlwZS4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIG5hdGl2ZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiB0eXBlbmFtZSBzZXJ2aWNlX2ltcGxfdHlwZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV90eXBlOwotI2VuZGlmCi0KLSAgLy8vIFRoZSBuYXRpdmUgYWNjZXB0b3IgdHlwZS4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgdHlwZW5hbWUgc2VydmljZV9pbXBsX3R5cGU6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gQ29uc3RydWN0IGEgbmV3IHNvY2tldCBhY2NlcHRvciBzZXJ2aWNlIGZvciB0aGUgc3BlY2lmaWVkIGlvX3NlcnZpY2UuCi0gIGV4cGxpY2l0IHNvY2tldF9hY2NlcHRvcl9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTwKLSAgICAgICAgc29ja2V0X2FjY2VwdG9yX3NlcnZpY2U8UHJvdG9jb2w+ID4oaW9fc2VydmljZSksCi0gICAgICBzZXJ2aWNlX2ltcGxfKGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgc29ja2V0IGFjY2VwdG9yIGltcGxlbWVudGF0aW9uLgotICB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5jb25zdHJ1Y3QoaW1wbCk7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyBzb2NrZXQgYWNjZXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLm1vdmVfY29uc3RydWN0KGltcGwsIG90aGVyX2ltcGwpOwotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGZyb20gYW5vdGhlciBzb2NrZXQgYWNjZXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgbW92ZV9hc3NpZ24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHNvY2tldF9hY2NlcHRvcl9zZXJ2aWNlJiBvdGhlcl9zZXJ2aWNlLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8ubW92ZV9hc3NpZ24oaW1wbCwgb3RoZXJfc2VydmljZS5zZXJ2aWNlX2ltcGxfLCBvdGhlcl9pbXBsKTsKLSAgfQotCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyBzb2NrZXQgYWNjZXB0b3IgaW1wbGVtZW50YXRpb24gZnJvbSBhbm90aGVyIHByb3RvY29sCi0gIC8vLyB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxPgotICB2b2lkIGNvbnZlcnRpbmdfbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHR5cGVuYW1lIHNvY2tldF9hY2NlcHRvcl9zZXJ2aWNlPAotICAgICAgICBQcm90b2NvbDE+OjppbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsLAotICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPAotICAgICAgICBQcm90b2NvbDEsIFByb3RvY29sPjo6dmFsdWU+Ojp0eXBlKiA9IDApCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLnRlbXBsYXRlIGNvbnZlcnRpbmdfbW92ZV9jb25zdHJ1Y3Q8UHJvdG9jb2wxPigKLSAgICAgICAgaW1wbCwgb3RoZXJfaW1wbCk7Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0gIC8vLyBEZXN0cm95IGEgc29ja2V0IGFjY2VwdG9yIGltcGxlbWVudGF0aW9uLgotICB2b2lkIGRlc3Ryb3koaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8uZGVzdHJveShpbXBsKTsKLSAgfQotCi0gIC8vLyBPcGVuIGEgbmV3IHNvY2tldCBhY2NlcHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBvcGVuKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBwcm90b2NvbF90eXBlJiBwcm90b2NvbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5vcGVuKGltcGwsIHByb3RvY29sLCBlYyk7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBhY2NlcHRvciB0byBhIHNvY2tldCBhY2NlcHRvci4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhc3NpZ24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sLCBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIG5hdGl2ZV9hY2NlcHRvciwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uYXNzaWduKGltcGwsIHByb3RvY29sLCBuYXRpdmVfYWNjZXB0b3IsIGVjKTsKLSAgfQotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYWNjZXB0b3IgaXMgb3Blbi4KLSAgYm9vbCBpc19vcGVuKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5pc19vcGVuKGltcGwpOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbGwgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NlcHRvci4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uY2FuY2VsKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyBCaW5kIHRoZSBzb2NrZXQgYWNjZXB0b3IgdG8gdGhlIHNwZWNpZmllZCBsb2NhbCBlbmRwb2ludC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBiaW5kKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5iaW5kKGltcGwsIGVuZHBvaW50LCBlYyk7Ci0gIH0KLQotICAvLy8gUGxhY2UgdGhlIHNvY2tldCBhY2NlcHRvciBpbnRvIHRoZSBzdGF0ZSB3aGVyZSBpdCB3aWxsIGxpc3RlbiBmb3IgbmV3Ci0gIC8vLyBjb25uZWN0aW9ucy4KLSAgYXNpbzo6ZXJyb3JfY29kZSBsaXN0ZW4oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgaW50IGJhY2tsb2csCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmxpc3RlbihpbXBsLCBiYWNrbG9nLCBlYyk7Ci0gIH0KLQotICAvLy8gQ2xvc2UgYSBzb2NrZXQgYWNjZXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uY2xvc2UoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZSgpLikgR2V0IHRoZSBuYXRpdmUgYWNjZXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIG5hdGl2ZV90eXBlIG5hdGl2ZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX2hhbmRsZShpbXBsKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIG5hdGl2ZSBhY2NlcHRvciBpbXBsZW1lbnRhdGlvbi4KLSAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5hdGl2ZV9oYW5kbGUoaW1wbCk7Ci0gIH0KLQotICAvLy8gU2V0IGEgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNldHRhYmxlU29ja2V0T3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIHNldF9vcHRpb24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IFNldHRhYmxlU29ja2V0T3B0aW9uJiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2V0X29wdGlvbihpbXBsLCBvcHRpb24sIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgYSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgR2V0dGFibGVTb2NrZXRPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgZ2V0X29wdGlvbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgR2V0dGFibGVTb2NrZXRPcHRpb24mIG9wdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5nZXRfb3B0aW9uKGltcGwsIG9wdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gYW4gSU8gY29udHJvbCBjb21tYW5kIG9uIHRoZSBzb2NrZXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJb0NvbnRyb2xDb21tYW5kPgotICBhc2lvOjplcnJvcl9jb2RlIGlvX2NvbnRyb2woaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIElvQ29udHJvbENvbW1hbmQmIGNvbW1hbmQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uaW9fY29udHJvbChpbXBsLCBjb21tYW5kLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIGFjY2VwdG9yLgotICBib29sIG5vbl9ibG9ja2luZyhjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubm9uX2Jsb2NraW5nKGltcGwpOwotICB9Ci0KLSAgLy8vIFNldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBhY2NlcHRvci4KLSAgYXNpbzo6ZXJyb3JfY29kZSBub25fYmxvY2tpbmcoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5ub25fYmxvY2tpbmcoaW1wbCwgbW9kZSwgZWMpOwotICB9Ci0KLSAgLy8vIEdldHMgdGhlIG5vbi1ibG9ja2luZyBtb2RlIG9mIHRoZSBuYXRpdmUgYWNjZXB0b3IgaW1wbGVtZW50YXRpb24uCi0gIGJvb2wgbmF0aXZlX25vbl9ibG9ja2luZyhjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX25vbl9ibG9ja2luZyhpbXBsKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIGFjY2VwdG9yIGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIG5hdGl2ZV9ub25fYmxvY2tpbmcoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGJvb2wgbW9kZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfbm9uX2Jsb2NraW5nKGltcGwsIG1vZGUsIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIGxvY2FsIGVuZHBvaW50LgotICBlbmRwb2ludF90eXBlIGxvY2FsX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmxvY2FsX2VuZHBvaW50KGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyBBY2NlcHQgYSBuZXcgY29ubmVjdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3RvY29sMSwgdHlwZW5hbWUgU29ja2V0U2VydmljZT4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhY2NlcHQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGJhc2ljX3NvY2tldDxQcm90b2NvbDEsIFNvY2tldFNlcnZpY2U+JiBwZWVyLAotICAgICAgZW5kcG9pbnRfdHlwZSogcGVlcl9lbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfY29udmVydGlibGU8UHJvdG9jb2wsIFByb3RvY29sMT46OnZhbHVlPjo6dHlwZSogPSAwKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uYWNjZXB0KGltcGwsIHBlZXIsIHBlZXJfZW5kcG9pbnQsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgYWNjZXB0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxLCB0eXBlbmFtZSBTb2NrZXRTZXJ2aWNlLCB0eXBlbmFtZSBBY2NlcHRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShBY2NlcHRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSkpCi0gIGFzeW5jX2FjY2VwdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYmFzaWNfc29ja2V0PFByb3RvY29sMSwgU29ja2V0U2VydmljZT4mIHBlZXIsCi0gICAgICBlbmRwb2ludF90eXBlKiBwZWVyX2VuZHBvaW50LAotICAgICAgQVNJT19NT1ZFX0FSRyhBY2NlcHRIYW5kbGVyKSBoYW5kbGVyLAotICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2NvbnZlcnRpYmxlPFByb3RvY29sLCBQcm90b2NvbDE+Ojp2YWx1ZT46OnR5cGUqID0gMCkKLSAgewotICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBBY2NlcHRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlKT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoQWNjZXB0SGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV9pbXBsXy5hc3luY19hY2NlcHQoaW1wbCwgcGVlciwgcGVlcl9lbmRwb2ludCwgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICB2b2lkIHNodXRkb3duX3NlcnZpY2UoKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5zaHV0ZG93bl9zZXJ2aWNlKCk7Ci0gIH0KLQotICAvLyBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCi0gIHNlcnZpY2VfaW1wbF90eXBlIHNlcnZpY2VfaW1wbF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NPQ0tFVF9BQ0NFUFRPUl9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NvY2tldF9iYXNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zb2NrZXRfYmFzZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YmY5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NvY2tldF9iYXNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vLwotLy8gc29ja2V0X2Jhc2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TT0NLRVRfQkFTRV9IUFAKLSNkZWZpbmUgQVNJT19TT0NLRVRfQkFTRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9pb19jb250cm9sLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfb3B0aW9uLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9zb2NrZXRfdHlwZXMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0vLy8gVGhlIHNvY2tldF9iYXNlIGNsYXNzIGlzIHVzZWQgYXMgYSBiYXNlIGZvciB0aGUgYmFzaWNfc3RyZWFtX3NvY2tldCBhbmQKLS8vLyBiYXNpY19kYXRhZ3JhbV9zb2NrZXQgY2xhc3MgdGVtcGxhdGVzIHNvIHRoYXQgd2UgaGF2ZSBhIGNvbW1vbiBwbGFjZSB0bwotLy8vIGRlZmluZSB0aGUgc2h1dGRvd25fdHlwZSBhbmQgZW51bS4KLWNsYXNzIHNvY2tldF9iYXNlCi17Ci1wdWJsaWM6Ci0gIC8vLyBEaWZmZXJlbnQgd2F5cyBhIHNvY2tldCBtYXkgYmUgc2h1dGRvd24uCi0gIGVudW0gc2h1dGRvd25fdHlwZQotICB7Ci0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gICAgLy8vIFNodXRkb3duIHRoZSByZWNlaXZlIHNpZGUgb2YgdGhlIHNvY2tldC4KLSAgICBzaHV0ZG93bl9yZWNlaXZlID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZCwKLQotICAgIC8vLyBTaHV0ZG93biB0aGUgc2VuZCBzaWRlIG9mIHRoZSBzb2NrZXQuCi0gICAgc2h1dGRvd25fc2VuZCA9IGltcGxlbWVudGF0aW9uX2RlZmluZWQsCi0KLSAgICAvLy8gU2h1dGRvd24gYm90aCBzZW5kIGFuZCByZWNlaXZlIG9uIHRoZSBzb2NrZXQuCi0gICAgc2h1dGRvd25fYm90aCA9IGltcGxlbWVudGF0aW9uX2RlZmluZWQKLSNlbHNlCi0gICAgc2h1dGRvd25fcmVjZWl2ZSA9IEFTSU9fT1NfREVGKFNIVVRfUkQpLAotICAgIHNodXRkb3duX3NlbmQgPSBBU0lPX09TX0RFRihTSFVUX1dSKSwKLSAgICBzaHV0ZG93bl9ib3RoID0gQVNJT19PU19ERUYoU0hVVF9SRFdSKQotI2VuZGlmCi0gIH07Ci0KLSAgLy8vIEJpdG1hc2sgdHlwZSBmb3IgZmxhZ3MgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHNlbmQgYW5kIHJlY2VpdmUgb3BlcmF0aW9ucy4KLSAgdHlwZWRlZiBpbnQgbWVzc2FnZV9mbGFnczsKLQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gUGVlayBhdCBpbmNvbWluZyBkYXRhIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgaW5wdXQgcXVldWUuCi0gIHN0YXRpYyBjb25zdCBpbnQgbWVzc2FnZV9wZWVrID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZDsKLQotICAvLy8gUHJvY2VzcyBvdXQtb2YtYmFuZCBkYXRhLgotICBzdGF0aWMgY29uc3QgaW50IG1lc3NhZ2Vfb3V0X29mX2JhbmQgPSBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkOwotCi0gIC8vLyBTcGVjaWZ5IHRoYXQgdGhlIGRhdGEgc2hvdWxkIG5vdCBiZSBzdWJqZWN0IHRvIHJvdXRpbmcuCi0gIHN0YXRpYyBjb25zdCBpbnQgbWVzc2FnZV9kb19ub3Rfcm91dGUgPSBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkOwotCi0gIC8vLyBTcGVjaWZpZXMgdGhhdCB0aGUgZGF0YSBtYXJrcyB0aGUgZW5kIG9mIGEgcmVjb3JkLgotICBzdGF0aWMgY29uc3QgaW50IG1lc3NhZ2VfZW5kX29mX3JlY29yZCA9IGltcGxlbWVudGF0aW9uX2RlZmluZWQ7Ci0jZWxzZQotICBBU0lPX1NUQVRJQ19DT05TVEFOVChpbnQsCi0gICAgICBtZXNzYWdlX3BlZWsgPSBBU0lPX09TX0RFRihNU0dfUEVFSykpOwotICBBU0lPX1NUQVRJQ19DT05TVEFOVChpbnQsCi0gICAgICBtZXNzYWdlX291dF9vZl9iYW5kID0gQVNJT19PU19ERUYoTVNHX09PQikpOwotICBBU0lPX1NUQVRJQ19DT05TVEFOVChpbnQsCi0gICAgICBtZXNzYWdlX2RvX25vdF9yb3V0ZSA9IEFTSU9fT1NfREVGKE1TR19ET05UUk9VVEUpKTsKLSAgQVNJT19TVEFUSUNfQ09OU1RBTlQoaW50LAotICAgICAgbWVzc2FnZV9lbmRfb2ZfcmVjb3JkID0gQVNJT19PU19ERUYoTVNHX0VPUikpOwotI2VuZGlmCi0KLSAgLy8vIFNvY2tldCBvcHRpb24gdG8gcGVybWl0IHNlbmRpbmcgb2YgYnJvYWRjYXN0IG1lc3NhZ2VzLgotICAvKioKLSAgICogSW1wbGVtZW50cyB0aGUgU09MX1NPQ0tFVC9TT19CUk9BRENBU1Qgc29ja2V0IG9wdGlvbi4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlcwotICAgKiBTZXR0aW5nIHRoZSBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp1ZHA6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmJyb2FkY2FzdCBvcHRpb24odHJ1ZSk7Ci0gICAqIHNvY2tldC5zZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIKLSAgICogR2V0dGluZyB0aGUgY3VycmVudCBvcHRpb24gdmFsdWU6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp1ZHA6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmJyb2FkY2FzdCBvcHRpb247Ci0gICAqIHNvY2tldC5nZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIGJvb2wgaXNfc2V0ID0gb3B0aW9uLnZhbHVlKCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIgQ29uY2VwdHM6Ci0gICAqIFNvY2tldF9PcHRpb24sIEJvb2xlYW5fU29ja2V0X09wdGlvbi4KLSAgICovCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBicm9hZGNhc3Q7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c29ja2V0X29wdGlvbjo6Ym9vbGVhbjwKLSAgICBBU0lPX09TX0RFRihTT0xfU09DS0VUKSwgQVNJT19PU19ERUYoU09fQlJPQURDQVNUKT4KLSAgICAgIGJyb2FkY2FzdDsKLSNlbmRpZgotCi0gIC8vLyBTb2NrZXQgb3B0aW9uIHRvIGVuYWJsZSBzb2NrZXQtbGV2ZWwgZGVidWdnaW5nLgotICAvKioKLSAgICogSW1wbGVtZW50cyB0aGUgU09MX1NPQ0tFVC9TT19ERUJVRyBzb2NrZXQgb3B0aW9uLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGVzCi0gICAqIFNldHRpbmcgdGhlIG9wdGlvbjoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsgCi0gICAqIC4uLgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6ZGVidWcgb3B0aW9uKHRydWUpOwotICAgKiBzb2NrZXQuc2V0X29wdGlvbihvcHRpb24pOwotICAgKiBAZW5kY29kZQotICAgKgotICAgKiBAcGFyCi0gICAqIEdldHRpbmcgdGhlIGN1cnJlbnQgb3B0aW9uIHZhbHVlOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAgICogLi4uCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpkZWJ1ZyBvcHRpb247Ci0gICAqIHNvY2tldC5nZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIGJvb2wgaXNfc2V0ID0gb3B0aW9uLnZhbHVlKCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIgQ29uY2VwdHM6Ci0gICAqIFNvY2tldF9PcHRpb24sIEJvb2xlYW5fU29ja2V0X09wdGlvbi4KLSAgICovCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBkZWJ1ZzsKLSNlbHNlCi0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3B0aW9uOjpib29sZWFuPAotICAgIEFTSU9fT1NfREVGKFNPTF9TT0NLRVQpLCBBU0lPX09TX0RFRihTT19ERUJVRyk+IGRlYnVnOwotI2VuZGlmCi0KLSAgLy8vIFNvY2tldCBvcHRpb24gdG8gcHJldmVudCByb3V0aW5nLCB1c2UgbG9jYWwgaW50ZXJmYWNlcyBvbmx5LgotICAvKioKLSAgICogSW1wbGVtZW50cyB0aGUgU09MX1NPQ0tFVC9TT19ET05UUk9VVEUgc29ja2V0IG9wdGlvbi4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlcwotICAgKiBTZXR0aW5nIHRoZSBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp1ZHA6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmRvX25vdF9yb3V0ZSBvcHRpb24odHJ1ZSk7Ci0gICAqIHNvY2tldC5zZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIKLSAgICogR2V0dGluZyB0aGUgY3VycmVudCBvcHRpb24gdmFsdWU6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp1ZHA6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmRvX25vdF9yb3V0ZSBvcHRpb247Ci0gICAqIHNvY2tldC5nZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIGJvb2wgaXNfc2V0ID0gb3B0aW9uLnZhbHVlKCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIgQ29uY2VwdHM6Ci0gICAqIFNvY2tldF9PcHRpb24sIEJvb2xlYW5fU29ja2V0X09wdGlvbi4KLSAgICovCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBkb19ub3Rfcm91dGU7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c29ja2V0X29wdGlvbjo6Ym9vbGVhbjwKLSAgICBBU0lPX09TX0RFRihTT0xfU09DS0VUKSwgQVNJT19PU19ERUYoU09fRE9OVFJPVVRFKT4KLSAgICAgIGRvX25vdF9yb3V0ZTsKLSNlbmRpZgotCi0gIC8vLyBTb2NrZXQgb3B0aW9uIHRvIHNlbmQga2VlcC1hbGl2ZXMuCi0gIC8qKgotICAgKiBJbXBsZW1lbnRzIHRoZSBTT0xfU09DS0VUL1NPX0tFRVBBTElWRSBzb2NrZXQgb3B0aW9uLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGVzCi0gICAqIFNldHRpbmcgdGhlIG9wdGlvbjoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6c29ja2V0IHNvY2tldChpb19zZXJ2aWNlKTsgCi0gICAqIC4uLgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6a2VlcF9hbGl2ZSBvcHRpb24odHJ1ZSk7Ci0gICAqIHNvY2tldC5zZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIKLSAgICogR2V0dGluZyB0aGUgY3VycmVudCBvcHRpb24gdmFsdWU6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmtlZXBfYWxpdmUgb3B0aW9uOwotICAgKiBzb2NrZXQuZ2V0X29wdGlvbihvcHRpb24pOwotICAgKiBib29sIGlzX3NldCA9IG9wdGlvbi52YWx1ZSgpOwotICAgKiBAZW5kY29kZQotICAgKgotICAgKiBAcGFyIENvbmNlcHRzOgotICAgKiBTb2NrZXRfT3B0aW9uLCBCb29sZWFuX1NvY2tldF9PcHRpb24uCi0gICAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQga2VlcF9hbGl2ZTsKLSNlbHNlCi0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3B0aW9uOjpib29sZWFuPAotICAgIEFTSU9fT1NfREVGKFNPTF9TT0NLRVQpLCBBU0lPX09TX0RFRihTT19LRUVQQUxJVkUpPiBrZWVwX2FsaXZlOwotI2VuZGlmCi0KLSAgLy8vIFNvY2tldCBvcHRpb24gZm9yIHRoZSBzZW5kIGJ1ZmZlciBzaXplIG9mIGEgc29ja2V0LgotICAvKioKLSAgICogSW1wbGVtZW50cyB0aGUgU09MX1NPQ0tFVC9TT19TTkRCVUYgc29ja2V0IG9wdGlvbi4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlcwotICAgKiBTZXR0aW5nIHRoZSBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnNlbmRfYnVmZmVyX3NpemUgb3B0aW9uKDgxOTIpOwotICAgKiBzb2NrZXQuc2V0X29wdGlvbihvcHRpb24pOwotICAgKiBAZW5kY29kZQotICAgKgotICAgKiBAcGFyCi0gICAqIEdldHRpbmcgdGhlIGN1cnJlbnQgb3B0aW9uIHZhbHVlOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAgICogLi4uCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpzZW5kX2J1ZmZlcl9zaXplIG9wdGlvbjsKLSAgICogc29ja2V0LmdldF9vcHRpb24ob3B0aW9uKTsKLSAgICogaW50IHNpemUgPSBvcHRpb24udmFsdWUoKTsKLSAgICogQGVuZGNvZGUKLSAgICoKLSAgICogQHBhciBDb25jZXB0czoKLSAgICogU29ja2V0X09wdGlvbiwgSW50ZWdlcl9Tb2NrZXRfT3B0aW9uLgotICAgKi8KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIHNlbmRfYnVmZmVyX3NpemU7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c29ja2V0X29wdGlvbjo6aW50ZWdlcjwKLSAgICBBU0lPX09TX0RFRihTT0xfU09DS0VUKSwgQVNJT19PU19ERUYoU09fU05EQlVGKT4KLSAgICAgIHNlbmRfYnVmZmVyX3NpemU7Ci0jZW5kaWYKLQotICAvLy8gU29ja2V0IG9wdGlvbiBmb3IgdGhlIHNlbmQgbG93IHdhdGVybWFyay4KLSAgLyoqCi0gICAqIEltcGxlbWVudHMgdGhlIFNPTF9TT0NLRVQvU09fU05ETE9XQVQgc29ja2V0IG9wdGlvbi4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlcwotICAgKiBTZXR0aW5nIHRoZSBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnNlbmRfbG93X3dhdGVybWFyayBvcHRpb24oMTAyNCk7Ci0gICAqIHNvY2tldC5zZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIKLSAgICogR2V0dGluZyB0aGUgY3VycmVudCBvcHRpb24gdmFsdWU6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnNlbmRfbG93X3dhdGVybWFyayBvcHRpb247Ci0gICAqIHNvY2tldC5nZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIGludCBzaXplID0gb3B0aW9uLnZhbHVlKCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIgQ29uY2VwdHM6Ci0gICAqIFNvY2tldF9PcHRpb24sIEludGVnZXJfU29ja2V0X09wdGlvbi4KLSAgICovCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBzZW5kX2xvd193YXRlcm1hcms7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c29ja2V0X29wdGlvbjo6aW50ZWdlcjwKLSAgICBBU0lPX09TX0RFRihTT0xfU09DS0VUKSwgQVNJT19PU19ERUYoU09fU05ETE9XQVQpPgotICAgICAgc2VuZF9sb3dfd2F0ZXJtYXJrOwotI2VuZGlmCi0KLSAgLy8vIFNvY2tldCBvcHRpb24gZm9yIHRoZSByZWNlaXZlIGJ1ZmZlciBzaXplIG9mIGEgc29ja2V0LgotICAvKioKLSAgICogSW1wbGVtZW50cyB0aGUgU09MX1NPQ0tFVC9TT19SQ1ZCVUYgc29ja2V0IG9wdGlvbi4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlcwotICAgKiBTZXR0aW5nIHRoZSBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnJlY2VpdmVfYnVmZmVyX3NpemUgb3B0aW9uKDgxOTIpOwotICAgKiBzb2NrZXQuc2V0X29wdGlvbihvcHRpb24pOwotICAgKiBAZW5kY29kZQotICAgKgotICAgKiBAcGFyCi0gICAqIEdldHRpbmcgdGhlIGN1cnJlbnQgb3B0aW9uIHZhbHVlOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAgICogLi4uCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpyZWNlaXZlX2J1ZmZlcl9zaXplIG9wdGlvbjsKLSAgICogc29ja2V0LmdldF9vcHRpb24ob3B0aW9uKTsKLSAgICogaW50IHNpemUgPSBvcHRpb24udmFsdWUoKTsKLSAgICogQGVuZGNvZGUKLSAgICoKLSAgICogQHBhciBDb25jZXB0czoKLSAgICogU29ja2V0X09wdGlvbiwgSW50ZWdlcl9Tb2NrZXRfT3B0aW9uLgotICAgKi8KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIHJlY2VpdmVfYnVmZmVyX3NpemU7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c29ja2V0X29wdGlvbjo6aW50ZWdlcjwKLSAgICBBU0lPX09TX0RFRihTT0xfU09DS0VUKSwgQVNJT19PU19ERUYoU09fUkNWQlVGKT4KLSAgICAgIHJlY2VpdmVfYnVmZmVyX3NpemU7Ci0jZW5kaWYKLQotICAvLy8gU29ja2V0IG9wdGlvbiBmb3IgdGhlIHJlY2VpdmUgbG93IHdhdGVybWFyay4KLSAgLyoqCi0gICAqIEltcGxlbWVudHMgdGhlIFNPTF9TT0NLRVQvU09fUkNWTE9XQVQgc29ja2V0IG9wdGlvbi4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlcwotICAgKiBTZXR0aW5nIHRoZSBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnJlY2VpdmVfbG93X3dhdGVybWFyayBvcHRpb24oMTAyNCk7Ci0gICAqIHNvY2tldC5zZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIKLSAgICogR2V0dGluZyB0aGUgY3VycmVudCBvcHRpb24gdmFsdWU6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OnJlY2VpdmVfbG93X3dhdGVybWFyayBvcHRpb247Ci0gICAqIHNvY2tldC5nZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIGludCBzaXplID0gb3B0aW9uLnZhbHVlKCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIgQ29uY2VwdHM6Ci0gICAqIFNvY2tldF9PcHRpb24sIEludGVnZXJfU29ja2V0X09wdGlvbi4KLSAgICovCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCByZWNlaXZlX2xvd193YXRlcm1hcms7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c29ja2V0X29wdGlvbjo6aW50ZWdlcjwKLSAgICBBU0lPX09TX0RFRihTT0xfU09DS0VUKSwgQVNJT19PU19ERUYoU09fUkNWTE9XQVQpPgotICAgICAgcmVjZWl2ZV9sb3dfd2F0ZXJtYXJrOwotI2VuZGlmCi0KLSAgLy8vIFNvY2tldCBvcHRpb24gdG8gYWxsb3cgdGhlIHNvY2tldCB0byBiZSBib3VuZCB0byBhbiBhZGRyZXNzIHRoYXQgaXMKLSAgLy8vIGFscmVhZHkgaW4gdXNlLgotICAvKioKLSAgICogSW1wbGVtZW50cyB0aGUgU09MX1NPQ0tFVC9TT19SRVVTRUFERFIgc29ja2V0IG9wdGlvbi4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlcwotICAgKiBTZXR0aW5nIHRoZSBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOyAKLSAgICogLi4uCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpyZXVzZV9hZGRyZXNzIG9wdGlvbih0cnVlKTsKLSAgICogYWNjZXB0b3Iuc2V0X29wdGlvbihvcHRpb24pOwotICAgKiBAZW5kY29kZQotICAgKgotICAgKiBAcGFyCi0gICAqIEdldHRpbmcgdGhlIGN1cnJlbnQgb3B0aW9uIHZhbHVlOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjphY2NlcHRvciBhY2NlcHRvcihpb19zZXJ2aWNlKTsgCi0gICAqIC4uLgotICAgKiBhc2lvOjpzb2NrZXRfYmFzZTo6cmV1c2VfYWRkcmVzcyBvcHRpb247Ci0gICAqIGFjY2VwdG9yLmdldF9vcHRpb24ob3B0aW9uKTsKLSAgICogYm9vbCBpc19zZXQgPSBvcHRpb24udmFsdWUoKTsKLSAgICogQGVuZGNvZGUKLSAgICoKLSAgICogQHBhciBDb25jZXB0czoKLSAgICogU29ja2V0X09wdGlvbiwgQm9vbGVhbl9Tb2NrZXRfT3B0aW9uLgotICAgKi8KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIHJldXNlX2FkZHJlc3M7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c29ja2V0X29wdGlvbjo6Ym9vbGVhbjwKLSAgICBBU0lPX09TX0RFRihTT0xfU09DS0VUKSwgQVNJT19PU19ERUYoU09fUkVVU0VBRERSKT4KLSAgICAgIHJldXNlX2FkZHJlc3M7Ci0jZW5kaWYKLQotICAvLy8gU29ja2V0IG9wdGlvbiB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIHNvY2tldCBsaW5nZXJzIG9uIGNsb3NlIGlmIHVuc2VudAotICAvLy8gZGF0YSBpcyBwcmVzZW50LgotICAvKioKLSAgICogSW1wbGVtZW50cyB0aGUgU09MX1NPQ0tFVC9TT19MSU5HRVIgc29ja2V0IG9wdGlvbi4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlcwotICAgKiBTZXR0aW5nIHRoZSBvcHRpb246Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmxpbmdlciBvcHRpb24odHJ1ZSwgMzApOwotICAgKiBzb2NrZXQuc2V0X29wdGlvbihvcHRpb24pOwotICAgKiBAZW5kY29kZQotICAgKgotICAgKiBAcGFyCi0gICAqIEdldHRpbmcgdGhlIGN1cnJlbnQgb3B0aW9uIHZhbHVlOgotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAgICogLi4uCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpsaW5nZXIgb3B0aW9uOwotICAgKiBzb2NrZXQuZ2V0X29wdGlvbihvcHRpb24pOwotICAgKiBib29sIGlzX3NldCA9IG9wdGlvbi5lbmFibGVkKCk7Ci0gICAqIHVuc2lnbmVkIHNob3J0IHRpbWVvdXQgPSBvcHRpb24udGltZW91dCgpOwotICAgKiBAZW5kY29kZQotICAgKgotICAgKiBAcGFyIENvbmNlcHRzOgotICAgKiBTb2NrZXRfT3B0aW9uLCBMaW5nZXJfU29ja2V0X09wdGlvbi4KLSAgICovCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBsaW5nZXI7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6c29ja2V0X29wdGlvbjo6bGluZ2VyPAotICAgIEFTSU9fT1NfREVGKFNPTF9TT0NLRVQpLCBBU0lPX09TX0RFRihTT19MSU5HRVIpPgotICAgICAgbGluZ2VyOwotI2VuZGlmCi0KLSAgLy8vIFNvY2tldCBvcHRpb24gdG8gcmVwb3J0IGFib3J0ZWQgY29ubmVjdGlvbnMgb24gYWNjZXB0LgotICAvKioKLSAgICogSW1wbGVtZW50cyBhIGN1c3RvbSBzb2NrZXQgb3B0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBhY2NlcHQKLSAgICogb3BlcmF0aW9uIGlzIHBlcm1pdHRlZCB0byBmYWlsIHdpdGggYXNpbzo6ZXJyb3I6OmNvbm5lY3Rpb25fYWJvcnRlZC4KLSAgICogQnkgZGVmYXVsdCB0aGUgb3B0aW9uIGlzIGZhbHNlLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGVzCi0gICAqIFNldHRpbmcgdGhlIG9wdGlvbjoKLSAgICogQGNvZGUKLSAgICogYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3IgYWNjZXB0b3IoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmVuYWJsZV9jb25uZWN0aW9uX2Fib3J0ZWQgb3B0aW9uKHRydWUpOwotICAgKiBhY2NlcHRvci5zZXRfb3B0aW9uKG9wdGlvbik7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIKLSAgICogR2V0dGluZyB0aGUgY3VycmVudCBvcHRpb24gdmFsdWU6Ci0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OmFjY2VwdG9yIGFjY2VwdG9yKGlvX3NlcnZpY2UpOyAKLSAgICogLi4uCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjplbmFibGVfY29ubmVjdGlvbl9hYm9ydGVkIG9wdGlvbjsKLSAgICogYWNjZXB0b3IuZ2V0X29wdGlvbihvcHRpb24pOwotICAgKiBib29sIGlzX3NldCA9IG9wdGlvbi52YWx1ZSgpOwotICAgKiBAZW5kY29kZQotICAgKgotICAgKiBAcGFyIENvbmNlcHRzOgotICAgKiBTb2NrZXRfT3B0aW9uLCBCb29sZWFuX1NvY2tldF9PcHRpb24uCi0gICAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgZW5hYmxlX2Nvbm5lY3Rpb25fYWJvcnRlZDsKLSNlbHNlCi0gIHR5cGVkZWYgYXNpbzo6ZGV0YWlsOjpzb2NrZXRfb3B0aW9uOjpib29sZWFuPAotICAgIGFzaW86OmRldGFpbDo6Y3VzdG9tX3NvY2tldF9vcHRpb25fbGV2ZWwsCi0gICAgYXNpbzo6ZGV0YWlsOjplbmFibGVfY29ubmVjdGlvbl9hYm9ydGVkX29wdGlvbj4KLSAgICBlbmFibGVfY29ubmVjdGlvbl9hYm9ydGVkOwotI2VuZGlmCi0KLSAgLy8vIChEZXByZWNhdGVkOiBVc2Ugbm9uX2Jsb2NraW5nKCkuKSBJTyBjb250cm9sIGNvbW1hbmQgdG8KLSAgLy8vIHNldCB0aGUgYmxvY2tpbmcgbW9kZSBvZiB0aGUgc29ja2V0LgotICAvKioKLSAgICogSW1wbGVtZW50cyB0aGUgRklPTkJJTyBJTyBjb250cm9sIGNvbW1hbmQuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBAY29kZQotICAgKiBhc2lvOjppcDo6dGNwOjpzb2NrZXQgc29ja2V0KGlvX3NlcnZpY2UpOyAKLSAgICogLi4uCi0gICAqIGFzaW86OnNvY2tldF9iYXNlOjpub25fYmxvY2tpbmdfaW8gY29tbWFuZCh0cnVlKTsKLSAgICogc29ja2V0LmlvX2NvbnRyb2woY29tbWFuZCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIgQ29uY2VwdHM6Ci0gICAqIElPX0NvbnRyb2xfQ29tbWFuZCwgQm9vbGVhbl9JT19Db250cm9sX0NvbW1hbmQuCi0gICAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgbm9uX2Jsb2NraW5nX2lvOwotI2Vsc2UKLSAgdHlwZWRlZiBhc2lvOjpkZXRhaWw6OmlvX2NvbnRyb2w6Om5vbl9ibG9ja2luZ19pbyBub25fYmxvY2tpbmdfaW87Ci0jZW5kaWYKLQotICAvLy8gSU8gY29udHJvbCBjb21tYW5kIHRvIGdldCB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBjYW4gYmUgcmVhZCB3aXRob3V0Ci0gIC8vLyBibG9ja2luZy4KLSAgLyoqCi0gICAqIEltcGxlbWVudHMgdGhlIEZJT05SRUFEIElPIGNvbnRyb2wgY29tbWFuZC4KLSAgICoKLSAgICogQHBhciBFeGFtcGxlCi0gICAqIEBjb2RlCi0gICAqIGFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQoaW9fc2VydmljZSk7IAotICAgKiAuLi4KLSAgICogYXNpbzo6c29ja2V0X2Jhc2U6OmJ5dGVzX3JlYWRhYmxlIGNvbW1hbmQodHJ1ZSk7Ci0gICAqIHNvY2tldC5pb19jb250cm9sKGNvbW1hbmQpOwotICAgKiBzdGQ6OnNpemVfdCBieXRlc19yZWFkYWJsZSA9IGNvbW1hbmQuZ2V0KCk7Ci0gICAqIEBlbmRjb2RlCi0gICAqCi0gICAqIEBwYXIgQ29uY2VwdHM6Ci0gICAqIElPX0NvbnRyb2xfQ29tbWFuZCwgU2l6ZV9JT19Db250cm9sX0NvbW1hbmQuCi0gICAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgYnl0ZXNfcmVhZGFibGU7Ci0jZWxzZQotICB0eXBlZGVmIGFzaW86OmRldGFpbDo6aW9fY29udHJvbDo6Ynl0ZXNfcmVhZGFibGUgYnl0ZXNfcmVhZGFibGU7Ci0jZW5kaWYKLQotICAvLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIGluY29taW5nIGNvbm5lY3Rpb25zLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICBzdGF0aWMgY29uc3QgaW50IG1heF9jb25uZWN0aW9ucyA9IGltcGxlbWVudGF0aW9uX2RlZmluZWQ7Ci0jZWxzZQotICBBU0lPX1NUQVRJQ19DT05TVEFOVChpbnQsIG1heF9jb25uZWN0aW9ucwotICAgICAgPSBBU0lPX09TX0RFRihTT01BWENPTk4pKTsKLSNlbmRpZgotCi1wcm90ZWN0ZWQ6Ci0gIC8vLyBQcm90ZWN0ZWQgZGVzdHJ1Y3RvciB0byBwcmV2ZW50IGRlbGV0aW9uIHRocm91Z2ggdGhpcyB0eXBlLgotICB+c29ja2V0X2Jhc2UoKQotICB7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU09DS0VUX0JBU0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3Bhd24uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NwYXduLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljYmJmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3Bhd24uaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vCi0vLyBzcGF3bi5ocHAKLS8vIH5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NQQVdOX0hQUAotI2RlZmluZSBBU0lPX1NQQVdOX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGJvb3N0L2Nvcm91dGluZS9hbGwuaHBwPgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dlYWtfcHRyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93cmFwcGVkX2hhbmRsZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9zdHJhbmQuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0vLy8gQ29udGV4dCBvYmplY3QgdGhlIHJlcHJlc2VudHMgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29yb3V0aW5lLgotLyoqCi0gKiBUaGUgYmFzaWNfeWllbGRfY29udGV4dCBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY3VycmVudGx5IGV4ZWN1dGluZwotICogc3RhY2tmdWwgY29yb3V0aW5lLiBBIGJhc2ljX3lpZWxkX2NvbnRleHQgbWF5IGJlIHBhc3NlZCBhcyBhIGhhbmRsZXIgdG8gYW4KLSAqIGFzeW5jaHJvbm91cyBvcGVyYXRpb24uIEZvciBleGFtcGxlOgotICoKLSAqIEBjb2RlIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICogdm9pZCBteV9jb3JvdXRpbmUoYmFzaWNfeWllbGRfY29udGV4dDxIYW5kbGVyPiB5aWVsZCkKLSAqIHsKLSAqICAgLi4uCi0gKiAgIHN0ZDo6c2l6ZV90IG4gPSBteV9zb2NrZXQuYXN5bmNfcmVhZF9zb21lKGJ1ZmZlciwgeWllbGQpOwotICogICAuLi4KLSAqIH0gQGVuZGNvZGUKLSAqCi0gKiBUaGUgaW5pdGlhdGluZyBmdW5jdGlvbiAoYXN5bmNfcmVhZF9zb21lIGluIHRoZSBhYm92ZSBleGFtcGxlKSBzdXNwZW5kcyB0aGUKLSAqIGN1cnJlbnQgY29yb3V0aW5lLiBUaGUgY29yb3V0aW5lIGlzIHJlc3VtZWQgd2hlbiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbgotICogY29tcGxldGVzLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGlzIHJldHVybmVkLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLWNsYXNzIGJhc2ljX3lpZWxkX2NvbnRleHQKLXsKLXB1YmxpYzoKLSAgLy8vIFRoZSBjb3JvdXRpbmUgY2FsbGVlIHR5cGUsIHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLgotICAvKioKLSAgICogV2hlbiB1c2luZyBCb29zdC5Db3JvdXRpbmUgdjEsIHRoaXMgdHlwZSBpczoKLSAgICogQGNvZGUgdHlwZW5hbWUgY29yb3V0aW5lPHZvaWQoKT4gQGVuZGNvZGUKLSAgICogV2hlbiB1c2luZyBCb29zdC5Db3JvdXRpbmUgdjIgKHVuaWRpcmVjdGlvbmFsIGNvcm91dGluZXMpLCB0aGlzIHR5cGUgaXM6Ci0gICAqIEBjb2RlIHB1c2hfY29yb3V0aW5lPHZvaWQ+IEBlbmRjb2RlCi0gICAqLwotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgY2FsbGVlX3R5cGU7Ci0jZWxpZiBkZWZpbmVkKEJPT1NUX0NPUk9VVElORVNfVU5JRElSRUNUKSB8fCBkZWZpbmVkKEJPT1NUX0NPUk9VVElORVNfVjIpCi0gIHR5cGVkZWYgYm9vc3Q6OmNvcm91dGluZXM6OnB1c2hfY29yb3V0aW5lPHZvaWQ+IGNhbGxlZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBib29zdDo6Y29yb3V0aW5lczo6Y29yb3V0aW5lPHZvaWQoKT4gY2FsbGVlX3R5cGU7Ci0jZW5kaWYKLSAgCi0gIC8vLyBUaGUgY29yb3V0aW5lIGNhbGxlciB0eXBlLCB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgLyoqCi0gICAqIFdoZW4gdXNpbmcgQm9vc3QuQ29yb3V0aW5lIHYxLCB0aGlzIHR5cGUgaXM6Ci0gICAqIEBjb2RlIHR5cGVuYW1lIGNvcm91dGluZTx2b2lkKCk+OjpjYWxsZXJfdHlwZSBAZW5kY29kZQotICAgKiBXaGVuIHVzaW5nIEJvb3N0LkNvcm91dGluZSB2MiAodW5pZGlyZWN0aW9uYWwgY29yb3V0aW5lcyksIHRoaXMgdHlwZSBpczoKLSAgICogQGNvZGUgcHVsbF9jb3JvdXRpbmU8dm9pZD4gQGVuZGNvZGUKLSAgICovCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBjYWxsZXJfdHlwZTsKLSNlbGlmIGRlZmluZWQoQk9PU1RfQ09ST1VUSU5FU19VTklESVJFQ1QpIHx8IGRlZmluZWQoQk9PU1RfQ09ST1VUSU5FU19WMikKLSAgdHlwZWRlZiBib29zdDo6Y29yb3V0aW5lczo6cHVsbF9jb3JvdXRpbmU8dm9pZD4gY2FsbGVyX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIGJvb3N0Ojpjb3JvdXRpbmVzOjpjb3JvdXRpbmU8dm9pZCgpPjo6Y2FsbGVyX3R5cGUgY2FsbGVyX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gQ29uc3RydWN0IGEgeWllbGQgY29udGV4dCB0byByZXByZXNlbnQgdGhlIHNwZWNpZmllZCBjb3JvdXRpbmUuCi0gIC8qKgotICAgKiBNb3N0IGFwcGxpY2F0aW9ucyBkbyBub3QgbmVlZCB0byB1c2UgdGhpcyBjb25zdHJ1Y3Rvci4gSW5zdGVhZCwgdGhlCi0gICAqIHNwYXduKCkgZnVuY3Rpb24gcGFzc2VzIGEgeWllbGQgY29udGV4dCBhcyBhbiBhcmd1bWVudCB0byB0aGUgY29yb3V0aW5lCi0gICAqIGZ1bmN0aW9uLgotICAgKi8KLSAgYmFzaWNfeWllbGRfY29udGV4dCgKLSAgICAgIGNvbnN0IGRldGFpbDo6d2Vha19wdHI8Y2FsbGVlX3R5cGU+JiBjb3JvLAotICAgICAgY2FsbGVyX3R5cGUmIGNhLCBIYW5kbGVyJiBoYW5kbGVyKQotICAgIDogY29yb18oY29ybyksCi0gICAgICBjYV8oY2EpLAotICAgICAgaGFuZGxlcl8oaGFuZGxlciksCi0gICAgICBlY18oMCkKLSAgewotICB9Ci0KLSAgLy8vIFJldHVybiBhIHlpZWxkIGNvbnRleHQgdGhhdCBzZXRzIHRoZSBzcGVjaWZpZWQgZXJyb3JfY29kZS4KLSAgLyoqCi0gICAqIEJ5IGRlZmF1bHQsIHdoZW4gYSB5aWVsZCBjb250ZXh0IGlzIHVzZWQgd2l0aCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLCBhCi0gICAqIG5vbi1zdWNjZXNzIGVycm9yX2NvZGUgaXMgY29udmVydGVkIHRvIHN5c3RlbV9lcnJvciBhbmQgdGhyb3duLiBUaGlzCi0gICAqIG9wZXJhdG9yIG1heSBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gZXJyb3JfY29kZSBvYmplY3QgdGhhdCBzaG91bGQgaW5zdGVhZCBiZQotICAgKiBzZXQgd2l0aCB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbidzIHJlc3VsdC4gRm9yIGV4YW1wbGU6Ci0gICAqCi0gICAqIEBjb2RlIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICAgKiB2b2lkIG15X2Nvcm91dGluZShiYXNpY195aWVsZF9jb250ZXh0PEhhbmRsZXI+IHlpZWxkKQotICAgKiB7Ci0gICAqICAgLi4uCi0gICAqICAgc3RkOjpzaXplX3QgbiA9IG15X3NvY2tldC5hc3luY19yZWFkX3NvbWUoYnVmZmVyLCB5aWVsZFtlY10pOwotICAgKiAgIGlmIChlYykKLSAgICogICB7Ci0gICAqICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KLSAgICogICB9Ci0gICAqICAgLi4uCi0gICAqIH0gQGVuZGNvZGUKLSAgICovCi0gIGJhc2ljX3lpZWxkX2NvbnRleHQgb3BlcmF0b3JbXShhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIGJhc2ljX3lpZWxkX2NvbnRleHQgdG1wKCp0aGlzKTsKLSAgICB0bXAuZWNfID0gJmVjOwotICAgIHJldHVybiB0bXA7Ci0gIH0KLQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotcHJpdmF0ZToKLSNlbmRpZiAvLyBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgZGV0YWlsOjp3ZWFrX3B0cjxjYWxsZWVfdHlwZT4gY29yb187Ci0gIGNhbGxlcl90eXBlJiBjYV87Ci0gIEhhbmRsZXImIGhhbmRsZXJfOwotICBhc2lvOjplcnJvcl9jb2RlKiBlY187Ci19OwotCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0vLy8gQ29udGV4dCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvcm91dGluZS4KLXR5cGVkZWYgYmFzaWNfeWllbGRfY29udGV4dDx1bnNwZWNpZmllZD4geWllbGRfY29udGV4dDsKLSNlbHNlIC8vIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotdHlwZWRlZiBiYXNpY195aWVsZF9jb250ZXh0PAotICBkZXRhaWw6OndyYXBwZWRfaGFuZGxlcjwKLSAgICBpb19zZXJ2aWNlOjpzdHJhbmQsIHZvaWQoKikoKSwKLSAgICBkZXRhaWw6OmlzX2NvbnRpbnVhdGlvbl9pZl9ydW5uaW5nPiA+IHlpZWxkX2NvbnRleHQ7Ci0jZW5kaWYgLy8gZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLS8qKgotICogQGRlZmdyb3VwIHNwYXduIGFzaW86OnNwYXduCi0gKgotICogQGJyaWVmIFN0YXJ0IGEgbmV3IHN0YWNrZnVsIGNvcm91dGluZS4KLSAqCi0gKiBUaGUgc3Bhd24oKSBmdW5jdGlvbiBpcyBhIGhpZ2gtbGV2ZWwgd3JhcHBlciBvdmVyIHRoZSBCb29zdC5Db3JvdXRpbmUKLSAqIGxpYnJhcnkuIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBwcm9ncmFtcyB0byBpbXBsZW1lbnQgYXN5bmNocm9ub3VzIGxvZ2ljIGluIGEKLSAqIHN5bmNocm9ub3VzIG1hbm5lciwgYXMgaWxsdXN0cmF0ZWQgYnkgdGhlIGZvbGxvd2luZyBleGFtcGxlOgotICoKLSAqIEBjb2RlIGFzaW86OnNwYXduKG15X3N0cmFuZCwgZG9fZWNobyk7Ci0gKgotICogLy8gLi4uCi0gKgotICogdm9pZCBkb19lY2hvKGFzaW86OnlpZWxkX2NvbnRleHQgeWllbGQpCi0gKiB7Ci0gKiAgIHRyeQotICogICB7Ci0gKiAgICAgY2hhciBkYXRhWzEyOF07Ci0gKiAgICAgZm9yICg7OykKLSAqICAgICB7Ci0gKiAgICAgICBzdGQ6OnNpemVfdCBsZW5ndGggPQotICogICAgICAgICBteV9zb2NrZXQuYXN5bmNfcmVhZF9zb21lKAotICogICAgICAgICAgIGFzaW86OmJ1ZmZlcihkYXRhKSwgeWllbGQpOwotICoKLSAqICAgICAgIGFzaW86OmFzeW5jX3dyaXRlKG15X3NvY2tldCwKLSAqICAgICAgICAgICBhc2lvOjpidWZmZXIoZGF0YSwgbGVuZ3RoKSwgeWllbGQpOwotICogICAgIH0KLSAqICAgfQotICogICBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpCi0gKiAgIHsKLSAqICAgICAvLyAuLi4KLSAqICAgfQotICogfSBAZW5kY29kZQotICovCi0vKkB7Ki8KLQotLy8vIFN0YXJ0IGEgbmV3IHN0YWNrZnVsIGNvcm91dGluZSwgY2FsbGluZyB0aGUgc3BlY2lmaWVkIGhhbmRsZXIgd2hlbiBpdAotLy8vIGNvbXBsZXRlcy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxhdW5jaCBhIG5ldyBjb3JvdXRpbmUuCi0gKgotICogQHBhcmFtIGhhbmRsZXIgQSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBjb3JvdXRpbmUgZXhpdHMuIE1vcmUKLSAqIGltcG9ydGFudGx5LCB0aGUgaGFuZGxlciBwcm92aWRlcyBhbiBleGVjdXRpb24gY29udGV4dCAodmlhIHRoZSB0aGUgaGFuZGxlcgotICogaW52b2NhdGlvbiBob29rKSBmb3IgdGhlIGNvcm91dGluZS4gVGhlIGhhbmRsZXIgbXVzdCBoYXZlIHRoZSBzaWduYXR1cmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoKTsgQGVuZGNvZGUKLSAqCi0gKiBAcGFyYW0gZnVuY3Rpb24gVGhlIGNvcm91dGluZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIG11c3QgaGF2ZSB0aGUgc2lnbmF0dXJlOgotICogQGNvZGUgdm9pZCBmdW5jdGlvbihiYXNpY195aWVsZF9jb250ZXh0PEhhbmRsZXI+IHlpZWxkKTsgQGVuZGNvZGUKLSAqCi0gKiBAcGFyYW0gYXR0cmlidXRlcyBCb29zdC5Db3JvdXRpbmUgYXR0cmlidXRlcyB1c2VkIHRvIGN1c3RvbWlzZSB0aGUgY29yb3V0aW5lLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlciwgdHlwZW5hbWUgRnVuY3Rpb24+Ci12b2lkIHNwYXduKEFTSU9fTU9WRV9BUkcoSGFuZGxlcikgaGFuZGxlciwKLSAgICBBU0lPX01PVkVfQVJHKEZ1bmN0aW9uKSBmdW5jdGlvbiwKLSAgICBjb25zdCBib29zdDo6Y29yb3V0aW5lczo6YXR0cmlidXRlcyYgYXR0cmlidXRlcwotICAgICAgPSBib29zdDo6Y29yb3V0aW5lczo6YXR0cmlidXRlcygpKTsKLQotLy8vIFN0YXJ0IGEgbmV3IHN0YWNrZnVsIGNvcm91dGluZSwgaW5oZXJpdGluZyB0aGUgZXhlY3V0aW9uIGNvbnRleHQgb2YgYW5vdGhlci4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxhdW5jaCBhIG5ldyBjb3JvdXRpbmUuCi0gKgotICogQHBhcmFtIGN0eCBJZGVudGlmaWVzIHRoZSBjdXJyZW50IGNvcm91dGluZSBhcyBhIHBhcmVudCBvZiB0aGUgbmV3Ci0gKiBjb3JvdXRpbmUuIFRoaXMgc3BlY2lmaWVzIHRoYXQgdGhlIG5ldyBjb3JvdXRpbmUgc2hvdWxkIGluaGVyaXQgdGhlCi0gKiBleGVjdXRpb24gY29udGV4dCBvZiB0aGUgcGFyZW50LiBGb3IgZXhhbXBsZSwgaWYgdGhlIHBhcmVudCBjb3JvdXRpbmUgaXMKLSAqIGV4ZWN1dGluZyBpbiBhIHBhcnRpY3VsYXIgc3RyYW5kLCB0aGVuIHRoZSBuZXcgY29yb3V0aW5lIHdpbGwgZXhlY3V0ZSBpbiB0aGUKLSAqIHNhbWUgc3RyYW5kLgotICoKLSAqIEBwYXJhbSBmdW5jdGlvbiBUaGUgY29yb3V0aW5lIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gbXVzdCBoYXZlIHRoZSBzaWduYXR1cmU6Ci0gKiBAY29kZSB2b2lkIGZ1bmN0aW9uKGJhc2ljX3lpZWxkX2NvbnRleHQ8SGFuZGxlcj4geWllbGQpOyBAZW5kY29kZQotICoKLSAqIEBwYXJhbSBhdHRyaWJ1dGVzIEJvb3N0LkNvcm91dGluZSBhdHRyaWJ1dGVzIHVzZWQgdG8gY3VzdG9taXNlIHRoZSBjb3JvdXRpbmUuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyLCB0eXBlbmFtZSBGdW5jdGlvbj4KLXZvaWQgc3Bhd24oYmFzaWNfeWllbGRfY29udGV4dDxIYW5kbGVyPiBjdHgsCi0gICAgQVNJT19NT1ZFX0FSRyhGdW5jdGlvbikgZnVuY3Rpb24sCi0gICAgY29uc3QgYm9vc3Q6OmNvcm91dGluZXM6OmF0dHJpYnV0ZXMmIGF0dHJpYnV0ZXMKLSAgICAgID0gYm9vc3Q6OmNvcm91dGluZXM6OmF0dHJpYnV0ZXMoKSk7Ci0KLS8vLyBTdGFydCBhIG5ldyBzdGFja2Z1bCBjb3JvdXRpbmUgdGhhdCBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiBhIHN0cmFuZC4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxhdW5jaCBhIG5ldyBjb3JvdXRpbmUuCi0gKgotICogQHBhcmFtIHN0cmFuZCBJZGVudGlmaWVzIGEgc3RyYW5kLiBCeSBzdGFydGluZyBtdWx0aXBsZSBjb3JvdXRpbmVzIG9uIHRoZQotICogc2FtZSBzdHJhbmQsIHRoZSBpbXBsZW1lbnRhdGlvbiBlbnN1cmVzIHRoYXQgbm9uZSBvZiB0aG9zZSBjb3JvdXRpbmVzIGNhbgotICogZXhlY3V0ZSBzaW11bHRhbmVvdXNseS4KLSAqCi0gKiBAcGFyYW0gZnVuY3Rpb24gVGhlIGNvcm91dGluZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIG11c3QgaGF2ZSB0aGUgc2lnbmF0dXJlOgotICogQGNvZGUgdm9pZCBmdW5jdGlvbih5aWVsZF9jb250ZXh0IHlpZWxkKTsgQGVuZGNvZGUKLSAqCi0gKiBAcGFyYW0gYXR0cmlidXRlcyBCb29zdC5Db3JvdXRpbmUgYXR0cmlidXRlcyB1c2VkIHRvIGN1c3RvbWlzZSB0aGUgY29yb3V0aW5lLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24+Ci12b2lkIHNwYXduKGFzaW86OmlvX3NlcnZpY2U6OnN0cmFuZCBzdHJhbmQsCi0gICAgQVNJT19NT1ZFX0FSRyhGdW5jdGlvbikgZnVuY3Rpb24sCi0gICAgY29uc3QgYm9vc3Q6OmNvcm91dGluZXM6OmF0dHJpYnV0ZXMmIGF0dHJpYnV0ZXMKLSAgICAgID0gYm9vc3Q6OmNvcm91dGluZXM6OmF0dHJpYnV0ZXMoKSk7Ci0KLS8vLyBTdGFydCBhIG5ldyBzdGFja2Z1bCBjb3JvdXRpbmUgdGhhdCBleGVjdXRlcyBvbiBhIGdpdmVuIGlvX3NlcnZpY2UuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsYXVuY2ggYSBuZXcgY29yb3V0aW5lLgotICoKLSAqIEBwYXJhbSBpb19zZXJ2aWNlIElkZW50aWZpZXMgdGhlIGlvX3NlcnZpY2UgdGhhdCB3aWxsIHJ1biB0aGUgY29yb3V0aW5lLiBUaGUKLSAqIG5ldyBjb3JvdXRpbmUgaXMgaW1wbGljaXRseSBnaXZlbiBpdHMgb3duIHN0cmFuZCB3aXRoaW4gdGhpcyBpb19zZXJ2aWNlLgotICoKLSAqIEBwYXJhbSBmdW5jdGlvbiBUaGUgY29yb3V0aW5lIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gbXVzdCBoYXZlIHRoZSBzaWduYXR1cmU6Ci0gKiBAY29kZSB2b2lkIGZ1bmN0aW9uKHlpZWxkX2NvbnRleHQgeWllbGQpOyBAZW5kY29kZQotICoKLSAqIEBwYXJhbSBhdHRyaWJ1dGVzIEJvb3N0LkNvcm91dGluZSBhdHRyaWJ1dGVzIHVzZWQgdG8gY3VzdG9taXNlIHRoZSBjb3JvdXRpbmUuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLXZvaWQgc3Bhd24oYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwKLSAgICBBU0lPX01PVkVfQVJHKEZ1bmN0aW9uKSBmdW5jdGlvbiwKLSAgICBjb25zdCBib29zdDo6Y29yb3V0aW5lczo6YXR0cmlidXRlcyYgYXR0cmlidXRlcwotICAgICAgPSBib29zdDo6Y29yb3V0aW5lczo6YXR0cmlidXRlcygpKTsKLQotLypAfSovCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vaW1wbC9zcGF3bi5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NQQVdOX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyMTQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vCi0vLyBzc2wuaHBwCi0vLyB+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX0hQUAotI2RlZmluZSBBU0lPX1NTTF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9zc2wvYmFzaWNfY29udGV4dC5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvY29udGV4dC5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvY29udGV4dF9iYXNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC9jb250ZXh0X3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC9yZmMyODE4X3ZlcmlmaWNhdGlvbi5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvc3RyZWFtLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC9zdHJlYW1fYmFzZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvc3RyZWFtX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL3ZlcmlmeV9jb250ZXh0LmhwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC92ZXJpZnlfbW9kZS5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvYmFzaWNfY29udGV4dC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2Jhc2ljX2NvbnRleHQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDQxYjE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvYmFzaWNfY29udGV4dC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLwotLy8gc3NsL2Jhc2ljX2NvbnRleHQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfQkFTSUNfQ09OVEVYVF9IUFAKLSNkZWZpbmUgQVNJT19TU0xfQkFTSUNfQ09OVEVYVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLSMgaW5jbHVkZSAiYXNpby9zc2wvb2xkL2Jhc2ljX2NvbnRleHQuaHBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi11c2luZyBhc2lvOjpzc2w6Om9sZDo6YmFzaWNfY29udGV4dDsKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9CQVNJQ19DT05URVhUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9jb250ZXh0LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvY29udGV4dC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNmU1ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9jb250ZXh0LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLwotLy8gc3NsL2NvbnRleHQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfQ09OVEVYVF9IUFAKLSNkZWZpbmUgQVNJT19TU0xfQ09OVEVYVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLSMgaW5jbHVkZSAiYXNpby9zc2wvYmFzaWNfY29udGV4dC5ocHAiCi0jIGluY2x1ZGUgImFzaW8vc3NsL2NvbnRleHRfc2VydmljZS5ocHAiCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0jIGluY2x1ZGUgPHN0cmluZz4KLSMgaW5jbHVkZSAiYXNpby9idWZmZXIuaHBwIgotIyBpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9jb250ZXh0X2Jhc2UuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvb3BlbnNzbF90eXBlcy5ocHAiCi0jIGluY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9vcGVuc3NsX2luaXQuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvcGFzc3dvcmRfY2FsbGJhY2suaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvdmVyaWZ5X2NhbGxiYWNrLmhwcCIKLSMgaW5jbHVkZSAiYXNpby9zc2wvdmVyaWZ5X21vZGUuaHBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0vLy8gVHlwZWRlZiBmb3IgdGhlIHR5cGljYWwgdXNhZ2Ugb2YgY29udGV4dC4KLXR5cGVkZWYgYmFzaWNfY29udGV4dDxjb250ZXh0X3NlcnZpY2U+IGNvbnRleHQ7Ci0KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotY2xhc3MgY29udGV4dAotICA6IHB1YmxpYyBjb250ZXh0X2Jhc2UsCi0gICAgcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHVibGljOgotICAvLy8gVGhlIG5hdGl2ZSBoYW5kbGUgdHlwZSBvZiB0aGUgU1NMIGNvbnRleHQuCi0gIHR5cGVkZWYgU1NMX0NUWCogbmF0aXZlX2hhbmRsZV90eXBlOwotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGVfdHlwZS4pIFRoZSBuYXRpdmUgdHlwZSBvZiB0aGUgU1NMIGNvbnRleHQuCi0gIHR5cGVkZWYgU1NMX0NUWCogaW1wbF90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIGV4cGxpY2l0IGNvbnRleHQobWV0aG9kIG0pOwotCi0gIC8vLyBEZXByZWNhdGVkIGNvbnN0cnVjdG9yIHRha2luZyBhIHJlZmVyZW5jZSB0byBhbiBpb19zZXJ2aWNlIG9iamVjdC4KLSAgQVNJT19ERUNMIGNvbnRleHQoYXNpbzo6aW9fc2VydmljZSYsIG1ldGhvZCBtKTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIGNvbnRleHQgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhbiBTU0wgY29udGV4dCBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBjb250ZXh0IG9iamVjdCBmcm9tIHdoaWNoIHRoZSBtb3ZlIHdpbGwgb2NjdXIuCi0gICAqCi0gICAqIEBub3RlIEZvbGxvd2luZyB0aGUgbW92ZSwgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIG9ubHkgYXJlIHZhbGlkIGZvciB0aGUKLSAgICogbW92ZWQtZnJvbSBvYmplY3Q6Ci0gICAqIEBsaSBEZXN0cnVjdGlvbi4KLSAgICogQGxpIEFzIGEgdGFyZ2V0IGZvciBtb3ZlLWFzc2lnbm1lbnQuCi0gICAqLwotICBBU0lPX0RFQ0wgY29udGV4dChjb250ZXh0JiYgb3RoZXIpOwotCi0gIC8vLyBNb3ZlLWFzc2lnbiBhIGNvbnRleHQgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBhc3NpZ25tZW50IG9wZXJhdG9yIG1vdmVzIGFuIFNTTCBjb250ZXh0IGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGNvbnRleHQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUgd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgb25seSBhcmUgdmFsaWQgZm9yIHRoZQotICAgKiBtb3ZlZC1mcm9tIG9iamVjdDoKLSAgICogQGxpIERlc3RydWN0aW9uLgotICAgKiBAbGkgQXMgYSB0YXJnZXQgZm9yIG1vdmUtYXNzaWdubWVudC4KLSAgICovCi0gIEFTSU9fREVDTCBjb250ZXh0JiBvcGVyYXRvcj0oY29udGV4dCYmIG90aGVyKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0gIC8vLyBEZXN0cnVjdG9yLgotICBBU0lPX0RFQ0wgfmNvbnRleHQoKTsKLQotICAvLy8gR2V0IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICAgKiBjb250ZXh0LiBUaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGFjY2VzcyB0byBjb250ZXh0IGZ1bmN0aW9uYWxpdHkgdGhhdCBpcwotICAgKiBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkLgotICAgKi8KLSAgQVNJT19ERUNMIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKCk7Ci0KLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZSgpLikgR2V0IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGluCi0gIC8vLyB0aGUgbmF0aXZlIHR5cGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIG9idGFpbiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAgICogY29udGV4dC4gVGhpcyBpcyBpbnRlbmRlZCB0byBhbGxvdyBhY2Nlc3MgdG8gY29udGV4dCBmdW5jdGlvbmFsaXR5IHRoYXQgaXMKLSAgICogbm90IG90aGVyd2lzZSBwcm92aWRlZC4KLSAgICovCi0gIEFTSU9fREVDTCBpbXBsX3R5cGUgaW1wbCgpOwotCi0gIC8vLyBDbGVhciBvcHRpb25zIG9uIHRoZSBjb250ZXh0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIFNTTCBvcHRpb25zIHVzZWQgYnkgdGhlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBvIEEgYml0bWFzayBvZiBvcHRpb25zLiBUaGUgYXZhaWxhYmxlIG9wdGlvbiB2YWx1ZXMgYXJlIGRlZmluZWQgaW4KLSAgICogdGhlIGNvbnRleHRfYmFzZSBjbGFzcy4gVGhlIHNwZWNpZmllZCBvcHRpb25zLCBpZiBjdXJyZW50bHkgZW5hYmxlZCBvbiB0aGUKLSAgICogY29udGV4dCwgYXJlIGNsZWFyZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBDYWxscyBAYyBTU0xfQ1RYX2NsZWFyX29wdGlvbnMuCi0gICAqLwotICBBU0lPX0RFQ0wgdm9pZCBjbGVhcl9vcHRpb25zKG9wdGlvbnMgbyk7Ci0KLSAgLy8vIENsZWFyIG9wdGlvbnMgb24gdGhlIGNvbnRleHQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgU1NMIG9wdGlvbnMgdXNlZCBieSB0aGUgY29udGV4dC4KLSAgICoKLSAgICogQHBhcmFtIG8gQSBiaXRtYXNrIG9mIG9wdGlvbnMuIFRoZSBhdmFpbGFibGUgb3B0aW9uIHZhbHVlcyBhcmUgZGVmaW5lZCBpbgotICAgKiB0aGUgY29udGV4dF9iYXNlIGNsYXNzLiBUaGUgc3BlY2lmaWVkIG9wdGlvbnMsIGlmIGN1cnJlbnRseSBlbmFibGVkIG9uIHRoZQotICAgKiBjb250ZXh0LCBhcmUgY2xlYXJlZC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfY2xlYXJfb3B0aW9ucy4KLSAgICovCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGNsZWFyX29wdGlvbnMob3B0aW9ucyBvLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBTZXQgb3B0aW9ucyBvbiB0aGUgY29udGV4dC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBTU0wgb3B0aW9ucyB1c2VkIGJ5IHRoZSBjb250ZXh0LgotICAgKgotICAgKiBAcGFyYW0gbyBBIGJpdG1hc2sgb2Ygb3B0aW9ucy4gVGhlIGF2YWlsYWJsZSBvcHRpb24gdmFsdWVzIGFyZSBkZWZpbmVkIGluCi0gICAqIHRoZSBjb250ZXh0X2Jhc2UgY2xhc3MuIFRoZSBvcHRpb25zIGFyZSBiaXR3aXNlLW9yZWQgd2l0aCBhbnkgZXhpc3RpbmcKLSAgICogdmFsdWUgZm9yIHRoZSBvcHRpb25zLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF9zZXRfb3B0aW9ucy4KLSAgICovCi0gIEFTSU9fREVDTCB2b2lkIHNldF9vcHRpb25zKG9wdGlvbnMgbyk7Ci0KLSAgLy8vIFNldCBvcHRpb25zIG9uIHRoZSBjb250ZXh0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIFNTTCBvcHRpb25zIHVzZWQgYnkgdGhlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBvIEEgYml0bWFzayBvZiBvcHRpb25zLiBUaGUgYXZhaWxhYmxlIG9wdGlvbiB2YWx1ZXMgYXJlIGRlZmluZWQgaW4KLSAgICogdGhlIGNvbnRleHRfYmFzZSBjbGFzcy4gVGhlIG9wdGlvbnMgYXJlIGJpdHdpc2Utb3JlZCB3aXRoIGFueSBleGlzdGluZwotICAgKiB2YWx1ZSBmb3IgdGhlIG9wdGlvbnMuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAbm90ZSBDYWxscyBAYyBTU0xfQ1RYX3NldF9vcHRpb25zLgotICAgKi8KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgc2V0X29wdGlvbnMob3B0aW9ucyBvLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBTZXQgdGhlIHBlZXIgdmVyaWZpY2F0aW9uIG1vZGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgcGVlciB2ZXJpZmljYXRpb24gbW9kZSB1c2VkIGJ5Ci0gICAqIHRoZSBjb250ZXh0LgotICAgKgotICAgKiBAcGFyYW0gdiBBIGJpdG1hc2sgb2YgcGVlciB2ZXJpZmljYXRpb24gbW9kZXMuIFNlZSBAcmVmIHZlcmlmeV9tb2RlIGZvcgotICAgKiBhdmFpbGFibGUgdmFsdWVzLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF9zZXRfdmVyaWZ5LgotICAgKi8KLSAgQVNJT19ERUNMIHZvaWQgc2V0X3ZlcmlmeV9tb2RlKHZlcmlmeV9tb2RlIHYpOwotCi0gIC8vLyBTZXQgdGhlIHBlZXIgdmVyaWZpY2F0aW9uIG1vZGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgcGVlciB2ZXJpZmljYXRpb24gbW9kZSB1c2VkIGJ5Ci0gICAqIHRoZSBjb250ZXh0LgotICAgKgotICAgKiBAcGFyYW0gdiBBIGJpdG1hc2sgb2YgcGVlciB2ZXJpZmljYXRpb24gbW9kZXMuIFNlZSBAcmVmIHZlcmlmeV9tb2RlIGZvcgotICAgKiBhdmFpbGFibGUgdmFsdWVzLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF9zZXRfdmVyaWZ5LgotICAgKi8KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgc2V0X3ZlcmlmeV9tb2RlKAotICAgICAgdmVyaWZ5X21vZGUgdiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBTZXQgdGhlIHBlZXIgdmVyaWZpY2F0aW9uIGRlcHRoLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIG1heGltdW0gdmVyaWZpY2F0aW9uIGRlcHRoCi0gICAqIGFsbG93ZWQgYnkgdGhlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBkZXB0aCBNYXhpbXVtIGRlcHRoIGZvciB0aGUgY2VydGlmaWNhdGUgY2hhaW4gdmVyaWZpY2F0aW9uIHRoYXQKLSAgICogc2hhbGwgYmUgYWxsb3dlZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aC4KLSAgICovCi0gIEFTSU9fREVDTCB2b2lkIHNldF92ZXJpZnlfZGVwdGgoaW50IGRlcHRoKTsKLQotICAvLy8gU2V0IHRoZSBwZWVyIHZlcmlmaWNhdGlvbiBkZXB0aC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtYXhpbXVtIHZlcmlmaWNhdGlvbiBkZXB0aAotICAgKiBhbGxvd2VkIGJ5IHRoZSBjb250ZXh0LgotICAgKgotICAgKiBAcGFyYW0gZGVwdGggTWF4aW11bSBkZXB0aCBmb3IgdGhlIGNlcnRpZmljYXRlIGNoYWluIHZlcmlmaWNhdGlvbiB0aGF0Ci0gICAqIHNoYWxsIGJlIGFsbG93ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAbm90ZSBDYWxscyBAYyBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGguCi0gICAqLwotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBzZXRfdmVyaWZ5X2RlcHRoKAotICAgICAgaW50IGRlcHRoLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIFNldCB0aGUgY2FsbGJhY2sgdXNlZCB0byB2ZXJpZnkgcGVlciBjZXJ0aWZpY2F0ZXMuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICogYnkgdGhlIGltcGxlbWVudGF0aW9uIHdoZW4gaXQgbmVlZHMgdG8gdmVyaWZ5IGEgcGVlciBjZXJ0aWZpY2F0ZS4KLSAgICoKLSAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgdXNlZCBmb3IgdmVyaWZ5aW5nIGEgY2VydGlmaWNhdGUuCi0gICAqIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgYm9vbCB2ZXJpZnlfY2FsbGJhY2soCi0gICAqICAgYm9vbCBwcmV2ZXJpZmllZCwgLy8gVHJ1ZSBpZiB0aGUgY2VydGlmaWNhdGUgcGFzc2VkIHByZS12ZXJpZmljYXRpb24uCi0gICAqICAgdmVyaWZ5X2NvbnRleHQmIGN0eCAvLyBUaGUgcGVlciBjZXJ0aWZpY2F0ZSBhbmQgb3RoZXIgY29udGV4dC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sgaXMgdHJ1ZSBpZiB0aGUgY2VydGlmaWNhdGUgaGFzIHBhc3NlZAotICAgKiB2ZXJpZmljYXRpb24sIGZhbHNlIG90aGVyd2lzZS4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfc2V0X3ZlcmlmeS4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBWZXJpZnlDYWxsYmFjaz4KLSAgdm9pZCBzZXRfdmVyaWZ5X2NhbGxiYWNrKFZlcmlmeUNhbGxiYWNrIGNhbGxiYWNrKTsKLQotICAvLy8gU2V0IHRoZSBjYWxsYmFjayB1c2VkIHRvIHZlcmlmeSBwZWVyIGNlcnRpZmljYXRlcy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgKiBieSB0aGUgaW1wbGVtZW50YXRpb24gd2hlbiBpdCBuZWVkcyB0byB2ZXJpZnkgYSBwZWVyIGNlcnRpZmljYXRlLgotICAgKgotICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBiZSB1c2VkIGZvciB2ZXJpZnlpbmcgYSBjZXJ0aWZpY2F0ZS4KLSAgICogVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSBib29sIHZlcmlmeV9jYWxsYmFjaygKLSAgICogICBib29sIHByZXZlcmlmaWVkLCAvLyBUcnVlIGlmIHRoZSBjZXJ0aWZpY2F0ZSBwYXNzZWQgcHJlLXZlcmlmaWNhdGlvbi4KLSAgICogICB2ZXJpZnlfY29udGV4dCYgY3R4IC8vIFRoZSBwZWVyIGNlcnRpZmljYXRlIGFuZCBvdGhlciBjb250ZXh0LgotICAgKiApOyBAZW5kY29kZQotICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjYWxsYmFjayBpcyB0cnVlIGlmIHRoZSBjZXJ0aWZpY2F0ZSBoYXMgcGFzc2VkCi0gICAqIHZlcmlmaWNhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF9zZXRfdmVyaWZ5LgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFZlcmlmeUNhbGxiYWNrPgotICBhc2lvOjplcnJvcl9jb2RlIHNldF92ZXJpZnlfY2FsbGJhY2soVmVyaWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIExvYWQgYSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBmaWxlIGZvciBwZXJmb3JtaW5nIHZlcmlmaWNhdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIG9uZSBvciBtb3JlIHRydXN0ZWQgY2VydGlmaWNhdGlvbiBhdXRob3JpdGllcwotICAgKiBmcm9tIGEgZmlsZS4KLSAgICoKLSAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5Ci0gICAqIGNlcnRpZmljYXRlcyBpbiBQRU0gZm9ybWF0LgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMuCi0gICAqLwotICBBU0lPX0RFQ0wgdm9pZCBsb2FkX3ZlcmlmeV9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7Ci0KLSAgLy8vIExvYWQgYSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBmaWxlIGZvciBwZXJmb3JtaW5nIHZlcmlmaWNhdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIHRoZSBjZXJ0aWZpY2F0ZXMgZm9yIG9uZSBvciBtb3JlIHRydXN0ZWQKLSAgICogY2VydGlmaWNhdGlvbiBhdXRob3JpdGllcyBmcm9tIGEgZmlsZS4KLSAgICoKLSAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5Ci0gICAqIGNlcnRpZmljYXRlcyBpbiBQRU0gZm9ybWF0LgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMuCi0gICAqLwotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBsb2FkX3ZlcmlmeV9maWxlKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIEFkZCBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBmb3IgcGVyZm9ybWluZyB2ZXJpZmljYXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIG9uZSB0cnVzdGVkIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5Ci0gICAqIGZyb20gYSBtZW1vcnkgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gY2EgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBjZXJ0aWZpY2F0ZS4KLSAgICogVGhlIGNlcnRpZmljYXRlIG11c3QgdXNlIHRoZSBQRU0gZm9ybWF0LgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF9nZXRfY2VydF9zdG9yZSBhbmQgQGMgWDUwOV9TVE9SRV9hZGRfY2VydC4KLSAgICovCi0gIEFTSU9fREVDTCB2b2lkIGFkZF9jZXJ0aWZpY2F0ZV9hdXRob3JpdHkoY29uc3QgY29uc3RfYnVmZmVyJiBjYSk7Ci0KLSAgLy8vIEFkZCBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBmb3IgcGVyZm9ybWluZyB2ZXJpZmljYXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIG9uZSB0cnVzdGVkIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5Ci0gICAqIGZyb20gYSBtZW1vcnkgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gY2EgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBjZXJ0aWZpY2F0ZS4KLSAgICogVGhlIGNlcnRpZmljYXRlIG11c3QgdXNlIHRoZSBQRU0gZm9ybWF0LgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF9nZXRfY2VydF9zdG9yZSBhbmQgQGMgWDUwOV9TVE9SRV9hZGRfY2VydC4KLSAgICovCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGFkZF9jZXJ0aWZpY2F0ZV9hdXRob3JpdHkoCi0gICAgICBjb25zdCBjb25zdF9idWZmZXImIGNhLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIENvbmZpZ3VyZXMgdGhlIGNvbnRleHQgdG8gdXNlIHRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzIGZvciBmaW5kaW5nCi0gIC8vLyBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBjZXJ0aWZpY2F0ZXMuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHNwZWNpZmllcyB0aGF0IHRoZSBjb250ZXh0IHNob3VsZCB1c2UgdGhlIGRlZmF1bHQsCi0gICAqIHN5c3RlbS1kZXBlbmRlbnQgZGlyZWN0b3JpZXMgZm9yIGxvY2F0aW5nIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5Ci0gICAqIGNlcnRpZmljYXRlcy4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzLgotICAgKi8KLSAgQVNJT19ERUNMIHZvaWQgc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKCk7Ci0KLSAgLy8vIENvbmZpZ3VyZXMgdGhlIGNvbnRleHQgdG8gdXNlIHRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzIGZvciBmaW5kaW5nCi0gIC8vLyBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBjZXJ0aWZpY2F0ZXMuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHNwZWNpZmllcyB0aGF0IHRoZSBjb250ZXh0IHNob3VsZCB1c2UgdGhlIGRlZmF1bHQsCi0gICAqIHN5c3RlbS1kZXBlbmRlbnQgZGlyZWN0b3JpZXMgZm9yIGxvY2F0aW5nIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5Ci0gICAqIGNlcnRpZmljYXRlcy4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzLgotICAgKi8KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBBZGQgYSBkaXJlY3RvcnkgY29udGFpbmluZyBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgZmlsZXMgdG8gYmUgdXNlZCBmb3IKLSAgLy8vIHBlcmZvcm1pbmcgdmVyaWZpY2F0aW9uLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkgY29udGFpbmluZwotICAgKiBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBjZXJ0aWZpY2F0ZXMuIEVhY2ggZmlsZSBpbiB0aGUgZGlyZWN0b3J5IG11c3QKLSAgICogY29udGFpbiBhIHNpbmdsZSBjZXJ0aWZpY2F0ZS4gVGhlIGZpbGVzIG11c3QgYmUgbmFtZWQgdXNpbmcgdGhlIHN1YmplY3QKLSAgICogbmFtZSdzIGhhc2ggYW5kIGFuIGV4dGVuc2lvbiBvZiAiLjAiLgotICAgKgotICAgKiBAcGFyYW0gcGF0aCBUaGUgbmFtZSBvZiBhIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZXMuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBDYWxscyBAYyBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucy4KLSAgICovCi0gIEFTSU9fREVDTCB2b2lkIGFkZF92ZXJpZnlfcGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7Ci0KLSAgLy8vIEFkZCBhIGRpcmVjdG9yeSBjb250YWluaW5nIGNlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlcyB0byBiZSB1c2VkIGZvcgotICAvLy8gcGVyZm9ybWluZyB2ZXJpZmljYXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSBjb250YWluaW5nCi0gICAqIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5IGNlcnRpZmljYXRlcy4gRWFjaCBmaWxlIGluIHRoZSBkaXJlY3RvcnkgbXVzdAotICAgKiBjb250YWluIGEgc2luZ2xlIGNlcnRpZmljYXRlLiBUaGUgZmlsZXMgbXVzdCBiZSBuYW1lZCB1c2luZyB0aGUgc3ViamVjdAotICAgKiBuYW1lJ3MgaGFzaCBhbmQgYW4gZXh0ZW5zaW9uIG9mICIuMCIuCi0gICAqCi0gICAqIEBwYXJhbSBwYXRoIFRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNlcnRpZmljYXRlcy4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zLgotICAgKi8KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgYWRkX3ZlcmlmeV9wYXRoKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gVXNlIGEgY2VydGlmaWNhdGUgZnJvbSBhIG1lbW9yeSBidWZmZXIuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCBhIGNlcnRpZmljYXRlIGludG8gdGhlIGNvbnRleHQgZnJvbSBhIGJ1ZmZlci4KLSAgICoKLSAgICogQHBhcmFtIGNlcnRpZmljYXRlIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUuCi0gICAqCi0gICAqIEBwYXJhbSBmb3JtYXQgVGhlIGNlcnRpZmljYXRlIGZvcm1hdCAoQVNOLjEgb3IgUEVNKS4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlIG9yIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX0FTTjEuCi0gICAqLwotICBBU0lPX0RFQ0wgdm9pZCB1c2VfY2VydGlmaWNhdGUoCi0gICAgICBjb25zdCBjb25zdF9idWZmZXImIGNlcnRpZmljYXRlLCBmaWxlX2Zvcm1hdCBmb3JtYXQpOwotCi0gIC8vLyBVc2UgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIGEgY2VydGlmaWNhdGUgaW50byB0aGUgY29udGV4dCBmcm9tIGEgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gY2VydGlmaWNhdGUgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZS4KLSAgICoKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgY2VydGlmaWNhdGUgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF91c2VfY2VydGlmaWNhdGUgb3IgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfQVNOMS4KLSAgICovCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIHVzZV9jZXJ0aWZpY2F0ZSgKLSAgICAgIGNvbnN0IGNvbnN0X2J1ZmZlciYgY2VydGlmaWNhdGUsIGZpbGVfZm9ybWF0IGZvcm1hdCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gVXNlIGEgY2VydGlmaWNhdGUgZnJvbSBhIGZpbGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCBhIGNlcnRpZmljYXRlIGludG8gdGhlIGNvbnRleHQgZnJvbSBhIGZpbGUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZS4KLSAgICoKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgZmlsZSBmb3JtYXQgKEFTTi4xIG9yIFBFTSkuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBDYWxscyBAYyBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlLgotICAgKi8KLSAgQVNJT19ERUNMIHZvaWQgdXNlX2NlcnRpZmljYXRlX2ZpbGUoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGZpbGVfZm9ybWF0IGZvcm1hdCk7Ci0KLSAgLy8vIFVzZSBhIGNlcnRpZmljYXRlIGZyb20gYSBmaWxlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgYSBjZXJ0aWZpY2F0ZSBpbnRvIHRoZSBjb250ZXh0IGZyb20gYSBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUuCi0gICAqCi0gICAqIEBwYXJhbSBmb3JtYXQgVGhlIGZpbGUgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZS4KLSAgICovCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIHVzZV9jZXJ0aWZpY2F0ZV9maWxlKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBmaWxlX2Zvcm1hdCBmb3JtYXQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIFVzZSBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gYSBtZW1vcnkgYnVmZmVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBpbnRvIHRoZSBjb250ZXh0IGZyb20gYQotICAgKiBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSBjaGFpbiBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNlcnRpZmljYXRlIGNoYWluLiBUaGUgY2VydGlmaWNhdGUKLSAgICogY2hhaW4gbXVzdCB1c2UgdGhlIFBFTSBmb3JtYXQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBDYWxscyBAYyBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZSBhbmQgU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydC4KLSAgICovCi0gIEFTSU9fREVDTCB2b2lkIHVzZV9jZXJ0aWZpY2F0ZV9jaGFpbihjb25zdCBjb25zdF9idWZmZXImIGNoYWluKTsKLQotICAvLy8gVXNlIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBhIG1lbW9yeSBidWZmZXIuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGludG8gdGhlIGNvbnRleHQgZnJvbSBhCi0gICAqIGJ1ZmZlci4KLSAgICoKLSAgICogQHBhcmFtIGNoYWluIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUgY2hhaW4uIFRoZSBjZXJ0aWZpY2F0ZQotICAgKiBjaGFpbiBtdXN0IHVzZSB0aGUgUEVNIGZvcm1hdC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlIGFuZCBTU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0LgotICAgKi8KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgdXNlX2NlcnRpZmljYXRlX2NoYWluKAotICAgICAgY29uc3QgY29uc3RfYnVmZmVyJiBjaGFpbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBVc2UgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIGEgZmlsZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gaW50byB0aGUgY29udGV4dCBmcm9tIGEKLSAgICogZmlsZS4KLSAgICoKLSAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGNlcnRpZmljYXRlLiBUaGUgZmlsZQotICAgKiBtdXN0IHVzZSB0aGUgUEVNIGZvcm1hdC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUuCi0gICAqLwotICBBU0lPX0RFQ0wgdm9pZCB1c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOwotCi0gIC8vLyBVc2UgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIGEgZmlsZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gaW50byB0aGUgY29udGV4dCBmcm9tIGEKLSAgICogZmlsZS4KLSAgICoKLSAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGNlcnRpZmljYXRlLiBUaGUgZmlsZQotICAgKiBtdXN0IHVzZSB0aGUgUEVNIGZvcm1hdC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUuCi0gICAqLwotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSB1c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBVc2UgYSBwcml2YXRlIGtleSBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIGEgcHJpdmF0ZSBrZXkgaW50byB0aGUgY29udGV4dCBmcm9tIGEgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gcHJpdmF0ZV9rZXkgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleS4KLSAgICoKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgcHJpdmF0ZSBrZXkgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF91c2VfUHJpdmF0ZUtleSBvciBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X0FTTjEuCi0gICAqLwotICBBU0lPX0RFQ0wgdm9pZCB1c2VfcHJpdmF0ZV9rZXkoCi0gICAgICBjb25zdCBjb25zdF9idWZmZXImIHByaXZhdGVfa2V5LCBmaWxlX2Zvcm1hdCBmb3JtYXQpOwotCi0gIC8vLyBVc2UgYSBwcml2YXRlIGtleSBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIGEgcHJpdmF0ZSBrZXkgaW50byB0aGUgY29udGV4dCBmcm9tIGEgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gcHJpdmF0ZV9rZXkgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleS4KLSAgICoKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgcHJpdmF0ZSBrZXkgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF91c2VfUHJpdmF0ZUtleSBvciBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X0FTTjEuCi0gICAqLwotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSB1c2VfcHJpdmF0ZV9rZXkoCi0gICAgICBjb25zdCBjb25zdF9idWZmZXImIHByaXZhdGVfa2V5LCBmaWxlX2Zvcm1hdCBmb3JtYXQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIFVzZSBhIHByaXZhdGUga2V5IGZyb20gYSBmaWxlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgYSBwcml2YXRlIGtleSBpbnRvIHRoZSBjb250ZXh0IGZyb20gYSBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcHJpdmF0ZSBrZXkuCi0gICAqCi0gICAqIEBwYXJhbSBmb3JtYXQgVGhlIGZpbGUgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlLgotICAgKi8KLSAgQVNJT19ERUNMIHZvaWQgdXNlX3ByaXZhdGVfa2V5X2ZpbGUoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGZpbGVfZm9ybWF0IGZvcm1hdCk7Ci0KLSAgLy8vIFVzZSBhIHByaXZhdGUga2V5IGZyb20gYSBmaWxlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgYSBwcml2YXRlIGtleSBpbnRvIHRoZSBjb250ZXh0IGZyb20gYSBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcHJpdmF0ZSBrZXkuCi0gICAqCi0gICAqIEBwYXJhbSBmb3JtYXQgVGhlIGZpbGUgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlLgotICAgKi8KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgdXNlX3ByaXZhdGVfa2V5X2ZpbGUoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGZpbGVfZm9ybWF0IGZvcm1hdCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gVXNlIGFuIFJTQSBwcml2YXRlIGtleSBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIGFuIFJTQSBwcml2YXRlIGtleSBpbnRvIHRoZSBjb250ZXh0IGZyb20gYQotICAgKiBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSBwcml2YXRlX2tleSBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFJTQSBwcml2YXRlIGtleS4KLSAgICoKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgcHJpdmF0ZSBrZXkgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleSBvciBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEuCi0gICAqLwotICBBU0lPX0RFQ0wgdm9pZCB1c2VfcnNhX3ByaXZhdGVfa2V5KAotICAgICAgY29uc3QgY29uc3RfYnVmZmVyJiBwcml2YXRlX2tleSwgZmlsZV9mb3JtYXQgZm9ybWF0KTsKLQotICAvLy8gVXNlIGFuIFJTQSBwcml2YXRlIGtleSBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIGFuIFJTQSBwcml2YXRlIGtleSBpbnRvIHRoZSBjb250ZXh0IGZyb20gYQotICAgKiBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSBwcml2YXRlX2tleSBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFJTQSBwcml2YXRlIGtleS4KLSAgICoKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgcHJpdmF0ZSBrZXkgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleSBvciBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEuCi0gICAqLwotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSB1c2VfcnNhX3ByaXZhdGVfa2V5KAotICAgICAgY29uc3QgY29uc3RfYnVmZmVyJiBwcml2YXRlX2tleSwgZmlsZV9mb3JtYXQgZm9ybWF0LAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vLyBVc2UgYW4gUlNBIHByaXZhdGUga2V5IGZyb20gYSBmaWxlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgYW4gUlNBIHByaXZhdGUga2V5IGludG8gdGhlIGNvbnRleHQgZnJvbSBhCi0gICAqIGZpbGUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBSU0EgcHJpdmF0ZSBrZXkuCi0gICAqCi0gICAqIEBwYXJhbSBmb3JtYXQgVGhlIGZpbGUgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlLgotICAgKi8KLSAgQVNJT19ERUNMIHZvaWQgdXNlX3JzYV9wcml2YXRlX2tleV9maWxlKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBmaWxlX2Zvcm1hdCBmb3JtYXQpOwotCi0gIC8vLyBVc2UgYW4gUlNBIHByaXZhdGUga2V5IGZyb20gYSBmaWxlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgYW4gUlNBIHByaXZhdGUga2V5IGludG8gdGhlIGNvbnRleHQgZnJvbSBhCi0gICAqIGZpbGUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBSU0EgcHJpdmF0ZSBrZXkuCi0gICAqCi0gICAqIEBwYXJhbSBmb3JtYXQgVGhlIGZpbGUgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlLgotICAgKi8KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgdXNlX3JzYV9wcml2YXRlX2tleV9maWxlKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBmaWxlX2Zvcm1hdCBmb3JtYXQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8vIFVzZSB0aGUgc3BlY2lmaWVkIG1lbW9yeSBidWZmZXIgdG8gb2J0YWluIHRoZSB0ZW1wb3JhcnkgRGlmZmllLUhlbGxtYW4KLSAgLy8vIHBhcmFtZXRlcnMuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzIGludG8gdGhlIGNvbnRleHQKLSAgICogZnJvbSBhIGJ1ZmZlci4KLSAgICoKLSAgICogQHBhcmFtIGRoIFRoZSBtZW1vcnkgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIERpZmZpZS1IZWxsbWFuIHBhcmFtZXRlcnMuIFRoZQotICAgKiBidWZmZXIgbXVzdCB1c2UgdGhlIFBFTSBmb3JtYXQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBDYWxscyBAYyBTU0xfQ1RYX3NldF90bXBfZGguCi0gICAqLwotICBBU0lPX0RFQ0wgdm9pZCB1c2VfdG1wX2RoKGNvbnN0IGNvbnN0X2J1ZmZlciYgZGgpOwotCi0gIC8vLyBVc2UgdGhlIHNwZWNpZmllZCBtZW1vcnkgYnVmZmVyIHRvIG9idGFpbiB0aGUgdGVtcG9yYXJ5IERpZmZpZS1IZWxsbWFuCi0gIC8vLyBwYXJhbWV0ZXJzLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgRGlmZmllLUhlbGxtYW4gcGFyYW1ldGVycyBpbnRvIHRoZSBjb250ZXh0Ci0gICAqIGZyb20gYSBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSBkaCBUaGUgbWVtb3J5IGJ1ZmZlciBjb250YWluaW5nIHRoZSBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzLiBUaGUKLSAgICogYnVmZmVyIG11c3QgdXNlIHRoZSBQRU0gZm9ybWF0LgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF9zZXRfdG1wX2RoLgotICAgKi8KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgdXNlX3RtcF9kaCgKLSAgICAgIGNvbnN0IGNvbnN0X2J1ZmZlciYgZGgsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gVXNlIHRoZSBzcGVjaWZpZWQgZmlsZSB0byBvYnRhaW4gdGhlIHRlbXBvcmFyeSBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgRGlmZmllLUhlbGxtYW4gcGFyYW1ldGVycyBpbnRvIHRoZSBjb250ZXh0Ci0gICAqIGZyb20gYSBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgRGlmZmllLUhlbGxtYW4KLSAgICogcGFyYW1ldGVycy4gVGhlIGZpbGUgbXVzdCB1c2UgdGhlIFBFTSBmb3JtYXQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBDYWxscyBAYyBTU0xfQ1RYX3NldF90bXBfZGguCi0gICAqLwotICBBU0lPX0RFQ0wgdm9pZCB1c2VfdG1wX2RoX2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKLQotICAvLy8gVXNlIHRoZSBzcGVjaWZpZWQgZmlsZSB0byBvYnRhaW4gdGhlIHRlbXBvcmFyeSBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgRGlmZmllLUhlbGxtYW4gcGFyYW1ldGVycyBpbnRvIHRoZSBjb250ZXh0Ci0gICAqIGZyb20gYSBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgRGlmZmllLUhlbGxtYW4KLSAgICogcGFyYW1ldGVycy4gVGhlIGZpbGUgbXVzdCB1c2UgdGhlIFBFTSBmb3JtYXQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAbm90ZSBDYWxscyBAYyBTU0xfQ1RYX3NldF90bXBfZGguCi0gICAqLwotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSB1c2VfdG1wX2RoX2ZpbGUoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLy8gU2V0IHRoZSBwYXNzd29yZCBjYWxsYmFjay4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gb2J0YWluIHBhc3N3b3JkCi0gICAqIGluZm9ybWF0aW9uIGFib3V0IGFuIGVuY3J5cHRlZCBrZXkgaW4gUEVNIGZvcm1hdC4KLSAgICoKLSAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgdXNlZCBmb3Igb2J0YWluaW5nIHRoZSBwYXNzd29yZC4KLSAgICogVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSBzdGQ6OnN0cmluZyBwYXNzd29yZF9jYWxsYmFjaygKLSAgICogICBzdGQ6OnNpemVfdCBtYXhfbGVuZ3RoLCAgLy8gVGhlIG1heGltdW0gc2l6ZSBmb3IgYSBwYXNzd29yZC4KLSAgICogICBwYXNzd29yZF9wdXJwb3NlIHB1cnBvc2UgLy8gV2hldGhlciBwYXNzd29yZCBpcyBmb3IgcmVhZGluZyBvciB3cml0aW5nLgotICAgKiApOyBAZW5kY29kZQotICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjYWxsYmFjayBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBwYXNzd29yZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhc3N3b3JkQ2FsbGJhY2s+Ci0gIHZvaWQgc2V0X3Bhc3N3b3JkX2NhbGxiYWNrKFBhc3N3b3JkQ2FsbGJhY2sgY2FsbGJhY2spOwotCi0gIC8vLyBTZXQgdGhlIHBhc3N3b3JkIGNhbGxiYWNrLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBvYnRhaW4gcGFzc3dvcmQKLSAgICogaW5mb3JtYXRpb24gYWJvdXQgYW4gZW5jcnlwdGVkIGtleSBpbiBQRU0gZm9ybWF0LgotICAgKgotICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIHBhc3N3b3JkLgotICAgKiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHN0ZDo6c3RyaW5nIHBhc3N3b3JkX2NhbGxiYWNrKAotICAgKiAgIHN0ZDo6c2l6ZV90IG1heF9sZW5ndGgsICAvLyBUaGUgbWF4aW11bSBzaXplIGZvciBhIHBhc3N3b3JkLgotICAgKiAgIHBhc3N3b3JkX3B1cnBvc2UgcHVycG9zZSAvLyBXaGV0aGVyIHBhc3N3b3JkIGlzIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNhbGxiYWNrIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhc3N3b3JkLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc3dvcmRDYWxsYmFjaz4KLSAgYXNpbzo6ZXJyb3JfY29kZSBzZXRfcGFzc3dvcmRfY2FsbGJhY2soUGFzc3dvcmRDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotcHJpdmF0ZToKLSAgc3RydWN0IGJpb19jbGVhbnVwOwotICBzdHJ1Y3QgeDUwOV9jbGVhbnVwOwotICBzdHJ1Y3QgZXZwX3BrZXlfY2xlYW51cDsKLSAgc3RydWN0IHJzYV9jbGVhbnVwOwotICBzdHJ1Y3QgZGhfY2xlYW51cDsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBzZXQgYSBwZWVyIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBjYWxsYmFjay4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgZG9fc2V0X3ZlcmlmeV9jYWxsYmFjaygKLSAgICAgIGRldGFpbDo6dmVyaWZ5X2NhbGxiYWNrX2Jhc2UqIGNhbGxiYWNrLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gQ2FsbGJhY2sgdXNlZCB3aGVuIHRoZSBTU0wgaW1wbGVtZW50YXRpb24gd2FudHMgdG8gdmVyaWZ5IGEgY2VydGlmaWNhdGUuCi0gIEFTSU9fREVDTCBzdGF0aWMgaW50IHZlcmlmeV9jYWxsYmFja19mdW5jdGlvbigKLSAgICAgIGludCBwcmV2ZXJpZmllZCwgWDUwOV9TVE9SRV9DVFgqIGN0eCk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gc2V0IGEgcGFzc3dvcmQgY2FsbGJhY2suCi0gIEFTSU9fREVDTCBhc2lvOjplcnJvcl9jb2RlIGRvX3NldF9wYXNzd29yZF9jYWxsYmFjaygKLSAgICAgIGRldGFpbDo6cGFzc3dvcmRfY2FsbGJhY2tfYmFzZSogY2FsbGJhY2ssIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBDYWxsYmFjayB1c2VkIHdoZW4gdGhlIFNTTCBpbXBsZW1lbnRhdGlvbiB3YW50cyBhIHBhc3N3b3JkLgotICBBU0lPX0RFQ0wgc3RhdGljIGludCBwYXNzd29yZF9jYWxsYmFja19mdW5jdGlvbigKLSAgICAgIGNoYXIqIGJ1ZiwgaW50IHNpemUsIGludCBwdXJwb3NlLCB2b2lkKiBkYXRhKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHRoZSB0ZW1wb3JhcnkgRGlmZmllLUhlbGxtYW4gcGFyYW1ldGVycyBmcm9tIGEgQklPLgotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBkb191c2VfdG1wX2RoKAotICAgICAgQklPKiBiaW8sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gbWFrZSBhIEJJTyBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4KLSAgQVNJT19ERUNMIEJJTyogbWFrZV9idWZmZXJfYmlvKGNvbnN0IGNvbnN0X2J1ZmZlciYgYik7Ci0KLSAgLy8gVGhlIHVuZGVybHlpbmcgbmF0aXZlIGltcGxlbWVudGF0aW9uLgotICBuYXRpdmVfaGFuZGxlX3R5cGUgaGFuZGxlXzsKLQotICAvLyBFbnN1cmUgb3BlbnNzbCBpcyBpbml0aWFsaXNlZC4KLSAgYXNpbzo6c3NsOjpkZXRhaWw6Om9wZW5zc2xfaW5pdDw+IGluaXRfOwotfTsKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL3NzbC9pbXBsL2NvbnRleHQuaHBwIgotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9zc2wvaW1wbC9jb250ZXh0LmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9DT05URVhUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9jb250ZXh0X2Jhc2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9jb250ZXh0X2Jhc2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmEyZjQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvY29udGV4dF9iYXNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vLwotLy8gc3NsL2NvbnRleHRfYmFzZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX0NPTlRFWFRfQkFTRV9IUFAKLSNkZWZpbmUgQVNJT19TU0xfQ09OVEVYVF9CQVNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9vcGVuc3NsX3R5cGVzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotCi0vLy8gVGhlIGNvbnRleHRfYmFzZSBjbGFzcyBpcyB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIGJhc2ljX2NvbnRleHQgY2xhc3MKLS8vLyB0ZW1wbGF0ZSBzbyB0aGF0IHdlIGhhdmUgYSBjb21tb24gcGxhY2UgdG8gZGVmaW5lIHZhcmlvdXMgZW51bXMuCi1jbGFzcyBjb250ZXh0X2Jhc2UKLXsKLXB1YmxpYzoKLSAgLy8vIERpZmZlcmVudCBtZXRob2RzIHN1cHBvcnRlZCBieSBhIGNvbnRleHQuCi0gIGVudW0gbWV0aG9kCi0gIHsKLSAgICAvLy8gR2VuZXJpYyBTU0wgdmVyc2lvbiAyLgotICAgIHNzbHYyLAotCi0gICAgLy8vIFNTTCB2ZXJzaW9uIDIgY2xpZW50LgotICAgIHNzbHYyX2NsaWVudCwKLQotICAgIC8vLyBTU0wgdmVyc2lvbiAyIHNlcnZlci4KLSAgICBzc2x2Ml9zZXJ2ZXIsCi0KLSAgICAvLy8gR2VuZXJpYyBTU0wgdmVyc2lvbiAzLgotICAgIHNzbHYzLAotCi0gICAgLy8vIFNTTCB2ZXJzaW9uIDMgY2xpZW50LgotICAgIHNzbHYzX2NsaWVudCwKLQotICAgIC8vLyBTU0wgdmVyc2lvbiAzIHNlcnZlci4KLSAgICBzc2x2M19zZXJ2ZXIsCi0KLSAgICAvLy8gR2VuZXJpYyBUTFMgdmVyc2lvbiAxLgotICAgIHRsc3YxLAotCi0gICAgLy8vIFRMUyB2ZXJzaW9uIDEgY2xpZW50LgotICAgIHRsc3YxX2NsaWVudCwKLQotICAgIC8vLyBUTFMgdmVyc2lvbiAxIHNlcnZlci4KLSAgICB0bHN2MV9zZXJ2ZXIsCi0KLSAgICAvLy8gR2VuZXJpYyBTU0wvVExTLgotICAgIHNzbHYyMywKLQotICAgIC8vLyBTU0wvVExTIGNsaWVudC4KLSAgICBzc2x2MjNfY2xpZW50LAotCi0gICAgLy8vIFNTTC9UTFMgc2VydmVyLgotICAgIHNzbHYyM19zZXJ2ZXIsCi0KLSAgICAvLy8gR2VuZXJpYyBUTFMgdmVyc2lvbiAxLjEuCi0gICAgdGxzdjExLAotCi0gICAgLy8vIFRMUyB2ZXJzaW9uIDEuMSBjbGllbnQuCi0gICAgdGxzdjExX2NsaWVudCwKLQotICAgIC8vLyBUTFMgdmVyc2lvbiAxLjEgc2VydmVyLgotICAgIHRsc3YxMV9zZXJ2ZXIsCi0KLSAgICAvLy8gR2VuZXJpYyBUTFMgdmVyc2lvbiAxLjIuCi0gICAgdGxzdjEyLAotCi0gICAgLy8vIFRMUyB2ZXJzaW9uIDEuMiBjbGllbnQuCi0gICAgdGxzdjEyX2NsaWVudCwKLQotICAgIC8vLyBUTFMgdmVyc2lvbiAxLjIgc2VydmVyLgotICAgIHRsc3YxMl9zZXJ2ZXIKLSAgfTsKLQotICAvLy8gQml0bWFzayB0eXBlIGZvciBTU0wgb3B0aW9ucy4KLSAgdHlwZWRlZiBsb25nIG9wdGlvbnM7Ci0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIEltcGxlbWVudCB2YXJpb3VzIGJ1ZyB3b3JrYXJvdW5kcy4KLSAgc3RhdGljIGNvbnN0IGxvbmcgZGVmYXVsdF93b3JrYXJvdW5kcyA9IGltcGxlbWVudGF0aW9uX2RlZmluZWQ7Ci0KLSAgLy8vIEFsd2F5cyBjcmVhdGUgYSBuZXcga2V5IHdoZW4gdXNpbmcgdG1wX2RoIHBhcmFtZXRlcnMuCi0gIHN0YXRpYyBjb25zdCBsb25nIHNpbmdsZV9kaF91c2UgPSBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkOwotCi0gIC8vLyBEaXNhYmxlIFNTTCB2Mi4KLSAgc3RhdGljIGNvbnN0IGxvbmcgbm9fc3NsdjIgPSBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkOwotCi0gIC8vLyBEaXNhYmxlIFNTTCB2My4KLSAgc3RhdGljIGNvbnN0IGxvbmcgbm9fc3NsdjMgPSBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkOwotCi0gIC8vLyBEaXNhYmxlIFRMUyB2MS4KLSAgc3RhdGljIGNvbnN0IGxvbmcgbm9fdGxzdjEgPSBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkOwotCi0gIC8vLyBEaXNhYmxlIFRMUyB2MS4xLgotICBzdGF0aWMgY29uc3QgbG9uZyBub190bHN2MV8xID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZDsKLQotICAvLy8gRGlzYWJsZSBUTFMgdjEuMi4KLSAgc3RhdGljIGNvbnN0IGxvbmcgbm9fdGxzdjFfMiA9IGltcGxlbWVudGF0aW9uX2RlZmluZWQ7Ci0KLSAgLy8vIERpc2FibGUgY29tcHJlc3Npb24uIENvbXByZXNzaW9uIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0gIHN0YXRpYyBjb25zdCBsb25nIG5vX2NvbXByZXNzaW9uID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZDsKLSNlbHNlCi0gIEFTSU9fU1RBVElDX0NPTlNUQU5UKGxvbmcsIGRlZmF1bHRfd29ya2Fyb3VuZHMgPSBTU0xfT1BfQUxMKTsKLSAgQVNJT19TVEFUSUNfQ09OU1RBTlQobG9uZywgc2luZ2xlX2RoX3VzZSA9IFNTTF9PUF9TSU5HTEVfREhfVVNFKTsKLSAgQVNJT19TVEFUSUNfQ09OU1RBTlQobG9uZywgbm9fc3NsdjIgPSBTU0xfT1BfTk9fU1NMdjIpOwotICBBU0lPX1NUQVRJQ19DT05TVEFOVChsb25nLCBub19zc2x2MyA9IFNTTF9PUF9OT19TU0x2Myk7Ci0gIEFTSU9fU1RBVElDX0NPTlNUQU5UKGxvbmcsIG5vX3Rsc3YxID0gU1NMX09QX05PX1RMU3YxKTsKLSMgaWYgZGVmaW5lZChTU0xfT1BfTk9fVExTdjFfMSkKLSAgQVNJT19TVEFUSUNfQ09OU1RBTlQobG9uZywgbm9fdGxzdjFfMSA9IFNTTF9PUF9OT19UTFN2MV8xKTsKLSMgZWxzZSAvLyBkZWZpbmVkKFNTTF9PUF9OT19UTFN2MV8xKQotICBBU0lPX1NUQVRJQ19DT05TVEFOVChsb25nLCBub190bHN2MV8xID0gMHgxMDAwMDAwMEwpOwotIyBlbmRpZiAvLyBkZWZpbmVkKFNTTF9PUF9OT19UTFN2MV8xKQotIyBpZiBkZWZpbmVkKFNTTF9PUF9OT19UTFN2MV8yKQotICBBU0lPX1NUQVRJQ19DT05TVEFOVChsb25nLCBub190bHN2MV8yID0gU1NMX09QX05PX1RMU3YxXzIpOwotIyBlbHNlIC8vIGRlZmluZWQoU1NMX09QX05PX1RMU3YxXzIpCi0gIEFTSU9fU1RBVElDX0NPTlNUQU5UKGxvbmcsIG5vX3Rsc3YxXzIgPSAweDA4MDAwMDAwTCk7Ci0jIGVuZGlmIC8vIGRlZmluZWQoU1NMX09QX05PX1RMU3YxXzIpCi0jIGlmIGRlZmluZWQoU1NMX09QX05PX0NPTVBSRVNTSU9OKQotICBBU0lPX1NUQVRJQ19DT05TVEFOVChsb25nLCBub19jb21wcmVzc2lvbiA9IFNTTF9PUF9OT19DT01QUkVTU0lPTik7Ci0jIGVsc2UgLy8gZGVmaW5lZChTU0xfT1BfTk9fQ09NUFJFU1NJT04pCi0gIEFTSU9fU1RBVElDX0NPTlNUQU5UKGxvbmcsIG5vX2NvbXByZXNzaW9uID0gMHgyMDAwMEwpOwotIyBlbmRpZiAvLyBkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikKLSNlbmRpZgotCi0gIC8vLyBGaWxlIGZvcm1hdCB0eXBlcy4KLSAgZW51bSBmaWxlX2Zvcm1hdAotICB7Ci0gICAgLy8vIEFTTi4xIGZpbGUuCi0gICAgYXNuMSwKLQotICAgIC8vLyBQRU0gZmlsZS4KLSAgICBwZW0KLSAgfTsKLQotI2lmICFkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8gVGhlIGZvbGxvd2luZyB0eXBlcyBhbmQgY29uc3RhbnRzIGFyZSBwcmVzZXJ2ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0gIC8vIE5ldyBwcm9ncmFtcyBzaG91bGQgdXNlIHRoZSBlcXVpdmFsZW50cyBvZiB0aGUgc2FtZSBuYW1lcyB0aGF0IGFyZSBkZWZpbmVkCi0gIC8vIGluIHRoZSBhc2lvOjpzc2wgbmFtZXNwYWNlLgotICB0eXBlZGVmIGludCB2ZXJpZnlfbW9kZTsKLSAgQVNJT19TVEFUSUNfQ09OU1RBTlQoaW50LCB2ZXJpZnlfbm9uZSA9IFNTTF9WRVJJRllfTk9ORSk7Ci0gIEFTSU9fU1RBVElDX0NPTlNUQU5UKGludCwgdmVyaWZ5X3BlZXIgPSBTU0xfVkVSSUZZX1BFRVIpOwotICBBU0lPX1NUQVRJQ19DT05TVEFOVChpbnQsCi0gICAgICB2ZXJpZnlfZmFpbF9pZl9ub19wZWVyX2NlcnQgPSBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKTsKLSAgQVNJT19TVEFUSUNfQ09OU1RBTlQoaW50LCB2ZXJpZnlfY2xpZW50X29uY2UgPSBTU0xfVkVSSUZZX0NMSUVOVF9PTkNFKTsKLSNlbmRpZgotCi0gIC8vLyBQdXJwb3NlIG9mIFBFTSBwYXNzd29yZC4KLSAgZW51bSBwYXNzd29yZF9wdXJwb3NlCi0gIHsKLSAgICAvLy8gVGhlIHBhc3N3b3JkIGlzIG5lZWRlZCBmb3IgcmVhZGluZy9kZWNyeXB0aW9uLgotICAgIGZvcl9yZWFkaW5nLAotCi0gICAgLy8vIFRoZSBwYXNzd29yZCBpcyBuZWVkZWQgZm9yIHdyaXRpbmcvZW5jcnlwdGlvbi4KLSAgICBmb3Jfd3JpdGluZwotICB9OwotCi1wcm90ZWN0ZWQ6Ci0gIC8vLyBQcm90ZWN0ZWQgZGVzdHJ1Y3RvciB0byBwcmV2ZW50IGRlbGV0aW9uIHRocm91Z2ggdGhpcyB0eXBlLgotICB+Y29udGV4dF9iYXNlKCkKLSAgewotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX0NPTlRFWFRfQkFTRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvY29udGV4dF9zZXJ2aWNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvY29udGV4dF9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmZmU5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2NvbnRleHRfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLwotLy8gc3NsL2NvbnRleHRfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX0NPTlRFWFRfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19TU0xfQ09OVEVYVF9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotICAKLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0jIGluY2x1ZGUgImFzaW8vc3NsL29sZC9jb250ZXh0X3NlcnZpY2UuaHBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi11c2luZyBhc2lvOjpzc2w6Om9sZDo6Y29udGV4dF9zZXJ2aWNlOwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX0NPTlRFWFRfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL2J1ZmZlcmVkX2hhbmRzaGFrZV9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC9idWZmZXJlZF9oYW5kc2hha2Vfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTNlNzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL2J1ZmZlcmVkX2hhbmRzaGFrZV9vcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8KLS8vIHNzbC9kZXRhaWwvYnVmZmVyZWRfaGFuZHNoYWtlX29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX0RFVEFJTF9CVUZGRVJFRF9IQU5EU0hBS0VfT1BfSFBQCi0jZGVmaW5lIEFTSU9fU1NMX0RFVEFJTF9CVUZGRVJFRF9IQU5EU0hBS0VfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvZW5naW5lLmhwcCIKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotY2xhc3MgYnVmZmVyZWRfaGFuZHNoYWtlX29wCi17Ci1wdWJsaWM6Ci0gIGJ1ZmZlcmVkX2hhbmRzaGFrZV9vcChzdHJlYW1fYmFzZTo6aGFuZHNoYWtlX3R5cGUgdHlwZSwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gICAgOiB0eXBlXyh0eXBlKSwKLSAgICAgIGJ1ZmZlcnNfKGJ1ZmZlcnMpLAotICAgICAgdG90YWxfYnVmZmVyX3NpemVfKGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcnNfKSkKLSAgewotICB9Ci0KLSAgZW5naW5lOjp3YW50IG9wZXJhdG9yKCkoZW5naW5lJiBlbmcsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgIHN0ZDo6c2l6ZV90JiBieXRlc190cmFuc2ZlcnJlZCkgY29uc3QKLSAgewotICAgIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBidWZmZXJzXy5iZWdpbigpOwotICAgIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGJ1ZmZlcnNfLmVuZCgpOwotICAgIHN0ZDo6c2l6ZV90IGFjY3VtdWxhdGVkX3NpemUgPSAwOwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICBlbmdpbmU6OndhbnQgd2FudCA9IGVuZy5oYW5kc2hha2UodHlwZV8sIGVjKTsKLSAgICAgIGlmICh3YW50ICE9IGVuZ2luZTo6d2FudF9pbnB1dF9hbmRfcmV0cnkKLSAgICAgICAgICB8fCBieXRlc190cmFuc2ZlcnJlZCA9PSB0b3RhbF9idWZmZXJfc2l6ZV8pCi0gICAgICAgIHJldHVybiB3YW50OwotCi0gICAgICAvLyBGaW5kIHRoZSBuZXh0IGJ1ZmZlciBwaWVjZSB0byBiZSBmZWQgdG8gdGhlIGVuZ2luZS4KLSAgICAgIHdoaWxlIChpdGVyICE9IGVuZCkKLSAgICAgIHsKLSAgICAgICAgY29uc3RfYnVmZmVyIGJ1ZmZlcigqaXRlcik7Ci0KLSAgICAgICAgLy8gU2tpcCBvdmVyIGFueSBidWZmZXJzIHdoaWNoIGhhdmUgYWxyZWFkeSBiZWVuIGNvbnN1bWVkIGJ5IHRoZSBlbmdpbmUuCi0gICAgICAgIGlmIChieXRlc190cmFuc2ZlcnJlZCA+PSBhY2N1bXVsYXRlZF9zaXplICsgYnVmZmVyX3NpemUoYnVmZmVyKSkKLSAgICAgICAgewotICAgICAgICAgIGFjY3VtdWxhdGVkX3NpemUgKz0gYnVmZmVyX3NpemUoYnVmZmVyKTsKLSAgICAgICAgICArK2l0ZXI7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgY3VycmVudCBidWZmZXIgbWF5IGhhdmUgYmVlbiBwYXJ0aWFsbHkgY29uc3VtZWQgYnkgdGhlIGVuZ2luZSBvbgotICAgICAgICAvLyBhIHByZXZpb3VzIGl0ZXJhdGlvbi4gSWYgc28sIGFkanVzdCB0aGUgYnVmZmVyIHRvIHBvaW50IHRvIHRoZQotICAgICAgICAvLyB1bnVzZWQgcG9ydGlvbi4KLSAgICAgICAgaWYgKGJ5dGVzX3RyYW5zZmVycmVkID4gYWNjdW11bGF0ZWRfc2l6ZSkKLSAgICAgICAgICBidWZmZXIgPSBidWZmZXIgKyAoYnl0ZXNfdHJhbnNmZXJyZWQgLSBhY2N1bXVsYXRlZF9zaXplKTsKLQotICAgICAgICAvLyBQYXNzIHRoZSBidWZmZXIgdG8gdGhlIGVuZ2luZSwgYW5kIHVwZGF0ZSB0aGUgYnl0ZXMgdHJhbnNmZXJyZWQgdG8KLSAgICAgICAgLy8gcmVmbGVjdCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIHNvIGZhci4KLSAgICAgICAgYnl0ZXNfdHJhbnNmZXJyZWQgKz0gYnVmZmVyX3NpemUoYnVmZmVyKTsKLSAgICAgICAgYnVmZmVyID0gZW5nLnB1dF9pbnB1dChidWZmZXIpOwotICAgICAgICBieXRlc190cmFuc2ZlcnJlZCAtPSBidWZmZXJfc2l6ZShidWZmZXIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBjYWxsX2hhbmRsZXIoSGFuZGxlciYgaGFuZGxlciwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgY29uc3Qgc3RkOjpzaXplX3QmIGJ5dGVzX3RyYW5zZmVycmVkKSBjb25zdAotICB7Ci0gICAgaGFuZGxlcihlYywgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICB9Ci0KLXByaXZhdGU6Ci0gIHN0cmVhbV9iYXNlOjpoYW5kc2hha2VfdHlwZSB0eXBlXzsKLSAgQ29uc3RCdWZmZXJTZXF1ZW5jZSBidWZmZXJzXzsKLSAgc3RkOjpzaXplX3QgdG90YWxfYnVmZmVyX3NpemVfOwotfTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9ERVRBSUxfQlVGRkVSRURfSEFORFNIQUtFX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvZW5naW5lLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL2VuZ2luZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NmVkMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvZW5naW5lLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLwotLy8gc3NsL2RldGFpbC9lbmdpbmUuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfREVUQUlMX0VOR0lORV9IUFAKLSNkZWZpbmUgQVNJT19TU0xfREVUQUlMX0VOR0lORV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0jIGluY2x1ZGUgImFzaW8vYnVmZmVyLmhwcCIKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvc3RhdGljX211dGV4LmhwcCIKLSMgaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL29wZW5zc2xfdHlwZXMuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvdmVyaWZ5X2NhbGxiYWNrLmhwcCIKLSMgaW5jbHVkZSAiYXNpby9zc2wvc3RyZWFtX2Jhc2UuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC92ZXJpZnlfbW9kZS5ocHAiCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi1jbGFzcyBlbmdpbmUKLXsKLXB1YmxpYzoKLSAgZW51bSB3YW50Ci0gIHsKLSAgICAvLyBSZXR1cm5lZCBieSBmdW5jdGlvbnMgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZW5naW5lIHdhbnRzIGlucHV0LiBUaGUgaW5wdXQKLSAgICAvLyBidWZmZXIgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGRhdGEuIFRoZSBlbmdpbmUgdGhlbiBuZWVkcyB0bwotICAgIC8vIGJlIGNhbGxlZCBhZ2FpbiB0byByZXRyeSB0aGUgb3BlcmF0aW9uLgotICAgIHdhbnRfaW5wdXRfYW5kX3JldHJ5ID0gLTIsCi0KLSAgICAvLyBSZXR1cm5lZCBieSBmdW5jdGlvbnMgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZW5naW5lIHdhbnRzIHRvIHdyaXRlIG91dHB1dC4KLSAgICAvLyBUaGUgb3V0cHV0IGJ1ZmZlciBwb2ludHMgdG8gdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4gVGhlIGVuZ2luZSB0aGVuCi0gICAgLy8gbmVlZHMgdG8gYmUgY2FsbGVkIGFnYWluIHRvIHJldHJ5IHRoZSBvcGVyYXRpb24uCi0gICAgd2FudF9vdXRwdXRfYW5kX3JldHJ5ID0gLTEsCi0KLSAgICAvLyBSZXR1cm5lZCBieSBmdW5jdGlvbnMgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZW5naW5lIGRvZXNuJ3QgbmVlZCBpbnB1dCBvcgotICAgIC8vIG91dHB1dC4KLSAgICB3YW50X25vdGhpbmcgPSAwLAotCi0gICAgLy8gUmV0dXJuZWQgYnkgZnVuY3Rpb25zIHRvIGluZGljYXRlIHRoYXQgdGhlIGVuZ2luZSB3YW50cyB0byB3cml0ZSBvdXRwdXQuCi0gICAgLy8gVGhlIG91dHB1dCBidWZmZXIgcG9pbnRzIHRvIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uIEFmdGVyIHRoYXQgdGhlCi0gICAgLy8gb3BlcmF0aW9uIGlzIGNvbXBsZXRlLCBhbmQgdGhlIGVuZ2luZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGNhbGxlZCBhZ2Fpbi4KLSAgICB3YW50X291dHB1dCA9IDEKLSAgfTsKLQotICAvLyBDb25zdHJ1Y3QgYSBuZXcgZW5naW5lIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRleHQuCi0gIEFTSU9fREVDTCBleHBsaWNpdCBlbmdpbmUoU1NMX0NUWCogY29udGV4dCk7Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4KLSAgQVNJT19ERUNMIH5lbmdpbmUoKTsKLQotICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaW4gdGhlIG5hdGl2ZSB0eXBlLgotICBBU0lPX0RFQ0wgU1NMKiBuYXRpdmVfaGFuZGxlKCk7Ci0KLSAgLy8gU2V0IHRoZSBwZWVyIHZlcmlmaWNhdGlvbiBtb2RlLgotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBzZXRfdmVyaWZ5X21vZGUoCi0gICAgICB2ZXJpZnlfbW9kZSB2LCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gU2V0IHRoZSBwZWVyIHZlcmlmaWNhdGlvbiBkZXB0aC4KLSAgQVNJT19ERUNMIGFzaW86OmVycm9yX2NvZGUgc2V0X3ZlcmlmeV9kZXB0aCgKLSAgICAgIGludCBkZXB0aCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0gIC8vIFNldCBhIHBlZXIgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGNhbGxiYWNrLgotICBBU0lPX0RFQ0wgYXNpbzo6ZXJyb3JfY29kZSBzZXRfdmVyaWZ5X2NhbGxiYWNrKAotICAgICAgdmVyaWZ5X2NhbGxiYWNrX2Jhc2UqIGNhbGxiYWNrLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gUGVyZm9ybSBhbiBTU0wgaGFuZHNoYWtlIHVzaW5nIGVpdGhlciBTU0xfY29ubmVjdCAoY2xpZW50LXNpZGUpIG9yCi0gIC8vIFNTTF9hY2NlcHQgKHNlcnZlci1zaWRlKS4KLSAgQVNJT19ERUNMIHdhbnQgaGFuZHNoYWtlKAotICAgICAgc3RyZWFtX2Jhc2U6OmhhbmRzaGFrZV90eXBlIHR5cGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotICAvLyBQZXJmb3JtIGEgZ3JhY2VmdWwgc2h1dGRvd24gb2YgdGhlIFNTTCBzZXNzaW9uLgotICBBU0lPX0RFQ0wgd2FudCBzaHV0ZG93bihhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSAgLy8gV3JpdGUgYnl0ZXMgdG8gdGhlIFNTTCBzZXNzaW9uLgotICBBU0lPX0RFQ0wgd2FudCB3cml0ZShjb25zdCBhc2lvOjpjb25zdF9idWZmZXImIGRhdGEsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYywgc3RkOjpzaXplX3QmIGJ5dGVzX3RyYW5zZmVycmVkKTsKLQotICAvLyBSZWFkIGJ5dGVzIGZyb20gdGhlIFNTTCBzZXNzaW9uLgotICBBU0lPX0RFQ0wgd2FudCByZWFkKGNvbnN0IGFzaW86Om11dGFibGVfYnVmZmVyJiBkYXRhLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIHN0ZDo6c2l6ZV90JiBieXRlc190cmFuc2ZlcnJlZCk7Ci0KLSAgLy8gR2V0IG91dHB1dCBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHRyYW5zcG9ydC4KLSAgQVNJT19ERUNMIGFzaW86Om11dGFibGVfYnVmZmVyc18xIGdldF9vdXRwdXQoCi0gICAgICBjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlciYgZGF0YSk7Ci0KLSAgLy8gUHV0IGlucHV0IGRhdGEgdGhhdCB3YXMgcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQuCi0gIEFTSU9fREVDTCBhc2lvOjpjb25zdF9idWZmZXIgcHV0X2lucHV0KAotICAgICAgY29uc3QgYXNpbzo6Y29uc3RfYnVmZmVyJiBkYXRhKTsKLQotICAvLyBNYXAgYW4gZXJyb3I6OmVvZiBjb2RlIHJldHVybmVkIGJ5IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBhY2NvcmRpbmcgdG8KLSAgLy8gdGhlIHR5cGUgYW5kIHN0YXRlIG9mIHRoZSBTU0wgc2Vzc2lvbi4gUmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUKLSAgLy8gZXJyb3IgY29kZSBvYmplY3QsIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGEgY29tcGxldGlvbiBoYW5kbGVyLgotICBBU0lPX0RFQ0wgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgbWFwX2Vycm9yX2NvZGUoCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gIC8vIERpc2FsbG93IGNvcHlpbmcgYW5kIGFzc2lnbm1lbnQuCi0gIGVuZ2luZShjb25zdCBlbmdpbmUmKTsKLSAgZW5naW5lJiBvcGVyYXRvcj0oY29uc3QgZW5naW5lJik7Ci0KLSAgLy8gQ2FsbGJhY2sgdXNlZCB3aGVuIHRoZSBTU0wgaW1wbGVtZW50YXRpb24gd2FudHMgdG8gdmVyaWZ5IGEgY2VydGlmaWNhdGUuCi0gIEFTSU9fREVDTCBzdGF0aWMgaW50IHZlcmlmeV9jYWxsYmFja19mdW5jdGlvbigKLSAgICAgIGludCBwcmV2ZXJpZmllZCwgWDUwOV9TVE9SRV9DVFgqIGN0eCk7Ci0KLSAgLy8gVGhlIFNTTF9hY2NlcHQgZnVuY3Rpb24gbWF5IG5vdCBiZSB0aHJlYWQgc2FmZS4gVGhpcyBtdXRleCBpcyB1c2VkIHRvCi0gIC8vIHByb3RlY3QgYWxsIGNhbGxzIHRvIHRoZSBTU0xfYWNjZXB0IGZ1bmN0aW9uLgotICBBU0lPX0RFQ0wgc3RhdGljIGFzaW86OmRldGFpbDo6c3RhdGljX211dGV4JiBhY2NlcHRfbXV0ZXgoKTsKLQotICAvLyBQZXJmb3JtIG9uZSBvcGVyYXRpb24uIFJldHVybnMgPj0gMCBvbiBzdWNjZXNzIG9yIGVycm9yLCB3YW50X3JlYWQgaWYgdGhlCi0gIC8vIG9wZXJhdGlvbiBuZWVkcyBtb3JlIGlucHV0LCBvciB3YW50X3dyaXRlIGlmIGl0IG5lZWRzIHRvIHdyaXRlIHNvbWUgb3V0cHV0Ci0gIC8vIGJlZm9yZSB0aGUgb3BlcmF0aW9uIGNhbiBjb21wbGV0ZS4KLSAgQVNJT19ERUNMIHdhbnQgcGVyZm9ybShpbnQgKGVuZ2luZTo6KiBvcCkodm9pZCosIHN0ZDo6c2l6ZV90KSwKLSAgICAgIHZvaWQqIGRhdGEsIHN0ZDo6c2l6ZV90IGxlbmd0aCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICBzdGQ6OnNpemVfdCogYnl0ZXNfdHJhbnNmZXJyZWQpOwotCi0gIC8vIEFkYXB0IHRoZSBTU0xfYWNjZXB0IGZ1bmN0aW9uIHRvIHRoZSBzaWduYXR1cmUgbmVlZGVkIGZvciBwZXJmb3JtKCkuCi0gIEFTSU9fREVDTCBpbnQgZG9fYWNjZXB0KHZvaWQqLCBzdGQ6OnNpemVfdCk7Ci0KLSAgLy8gQWRhcHQgdGhlIFNTTF9jb25uZWN0IGZ1bmN0aW9uIHRvIHRoZSBzaWduYXR1cmUgbmVlZGVkIGZvciBwZXJmb3JtKCkuCi0gIEFTSU9fREVDTCBpbnQgZG9fY29ubmVjdCh2b2lkKiwgc3RkOjpzaXplX3QpOwotCi0gIC8vIEFkYXB0IHRoZSBTU0xfc2h1dGRvd24gZnVuY3Rpb24gdG8gdGhlIHNpZ25hdHVyZSBuZWVkZWQgZm9yIHBlcmZvcm0oKS4KLSAgQVNJT19ERUNMIGludCBkb19zaHV0ZG93bih2b2lkKiwgc3RkOjpzaXplX3QpOwotCi0gIC8vIEFkYXB0IHRoZSBTU0xfcmVhZCBmdW5jdGlvbiB0byB0aGUgc2lnbmF0dXJlIG5lZWRlZCBmb3IgcGVyZm9ybSgpLgotICBBU0lPX0RFQ0wgaW50IGRvX3JlYWQodm9pZCogZGF0YSwgc3RkOjpzaXplX3QgbGVuZ3RoKTsKLQotICAvLyBBZGFwdCB0aGUgU1NMX3dyaXRlIGZ1bmN0aW9uIHRvIHRoZSBzaWduYXR1cmUgbmVlZGVkIGZvciBwZXJmb3JtKCkuCi0gIEFTSU9fREVDTCBpbnQgZG9fd3JpdGUodm9pZCogZGF0YSwgc3RkOjpzaXplX3QgbGVuZ3RoKTsKLQotICBTU0wqIHNzbF87Ci0gIEJJTyogZXh0X2Jpb187Ci19OwotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL2ltcGwvZW5naW5lLmlwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9ERVRBSUxfRU5HSU5FX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvaGFuZHNoYWtlX29wLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL2hhbmRzaGFrZV9vcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NmUwMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvaGFuZHNoYWtlX29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vCi0vLyBzc2wvZGV0YWlsL2hhbmRzaGFrZV9vcC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9ERVRBSUxfSEFORFNIQUtFX09QX0hQUAotI2RlZmluZSBBU0lPX1NTTF9ERVRBSUxfSEFORFNIQUtFX09QX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLSMgaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL2VuZ2luZS5ocHAiCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi1jbGFzcyBoYW5kc2hha2Vfb3AKLXsKLXB1YmxpYzoKLSAgaGFuZHNoYWtlX29wKHN0cmVhbV9iYXNlOjpoYW5kc2hha2VfdHlwZSB0eXBlKQotICAgIDogdHlwZV8odHlwZSkKLSAgewotICB9Ci0KLSAgZW5naW5lOjp3YW50IG9wZXJhdG9yKCkoZW5naW5lJiBlbmcsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgIHN0ZDo6c2l6ZV90JiBieXRlc190cmFuc2ZlcnJlZCkgY29uc3QKLSAgewotICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLSAgICByZXR1cm4gZW5nLmhhbmRzaGFrZSh0eXBlXywgZWMpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgY2FsbF9oYW5kbGVyKEhhbmRsZXImIGhhbmRsZXIsCi0gICAgICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90JikgY29uc3QKLSAgewotICAgIGhhbmRsZXIoZWMpOwotICB9Ci0KLXByaXZhdGU6Ci0gIHN0cmVhbV9iYXNlOjpoYW5kc2hha2VfdHlwZSB0eXBlXzsKLX07Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIHNzbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19TU0xfREVUQUlMX0hBTkRTSEFLRV9PUF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL2ltcGwvZW5naW5lLmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL2ltcGwvZW5naW5lLmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5ZDczOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC9pbXBsL2VuZ2luZS5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLy8KLS8vIHNzbC9kZXRhaWwvaW1wbC9lbmdpbmUuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9ERVRBSUxfSU1QTF9FTkdJTkVfSVBQCi0jZGVmaW5lIEFTSU9fU1NMX0RFVEFJTF9JTVBMX0VOR0lORV9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSMgaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jIGluY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9lbmdpbmUuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9lcnJvci5ocHAiCi0jIGluY2x1ZGUgImFzaW8vc3NsL3ZlcmlmeV9jb250ZXh0LmhwcCIKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLWVuZ2luZTo6ZW5naW5lKFNTTF9DVFgqIGNvbnRleHQpCi0gIDogc3NsXyg6OlNTTF9uZXcoY29udGV4dCkpCi17Ci0gIGlmICghc3NsXykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWMoCi0gICAgICAgIHN0YXRpY19jYXN0PGludD4oOjpFUlJfZ2V0X2Vycm9yKCkpLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3NzbF9jYXRlZ29yeSgpKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiZW5naW5lIik7Ci0gIH0KLQotICBhY2NlcHRfbXV0ZXgoKS5pbml0KCk7Ci0KLSAgOjpTU0xfc2V0X21vZGUoc3NsXywgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUpOwotICA6OlNTTF9zZXRfbW9kZShzc2xfLCBTU0xfTU9ERV9BQ0NFUFRfTU9WSU5HX1dSSVRFX0JVRkZFUik7Ci0jaWYgZGVmaW5lZChTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMpCi0gIDo6U1NMX3NldF9tb2RlKHNzbF8sIFNTTF9NT0RFX1JFTEVBU0VfQlVGRkVSUyk7Ci0jZW5kaWYgLy8gZGVmaW5lZChTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMpCi0KLSAgOjpCSU8qIGludF9iaW8gPSAwOwotICA6OkJJT19uZXdfYmlvX3BhaXIoJmludF9iaW8sIDAsICZleHRfYmlvXywgMCk7Ci0gIDo6U1NMX3NldF9iaW8oc3NsXywgaW50X2JpbywgaW50X2Jpbyk7Ci19Ci0KLWVuZ2luZTo6fmVuZ2luZSgpCi17Ci0gIGlmIChTU0xfZ2V0X2FwcF9kYXRhKHNzbF8pKQotICB7Ci0gICAgZGVsZXRlIHN0YXRpY19jYXN0PHZlcmlmeV9jYWxsYmFja19iYXNlKj4oU1NMX2dldF9hcHBfZGF0YShzc2xfKSk7Ci0gICAgU1NMX3NldF9hcHBfZGF0YShzc2xfLCAwKTsKLSAgfQotCi0gIDo6QklPX2ZyZWUoZXh0X2Jpb18pOwotICA6OlNTTF9mcmVlKHNzbF8pOwotfQotCi1TU0wqIGVuZ2luZTo6bmF0aXZlX2hhbmRsZSgpCi17Ci0gIHJldHVybiBzc2xfOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIGVuZ2luZTo6c2V0X3ZlcmlmeV9tb2RlKAotICAgIHZlcmlmeV9tb2RlIHYsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICA6OlNTTF9zZXRfdmVyaWZ5KHNzbF8sIHYsIDo6U1NMX2dldF92ZXJpZnlfY2FsbGJhY2soc3NsXykpOwotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgZW5naW5lOjpzZXRfdmVyaWZ5X2RlcHRoKAotICAgIGludCBkZXB0aCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIDo6U1NMX3NldF92ZXJpZnlfZGVwdGgoc3NsXywgZGVwdGgpOwotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgZW5naW5lOjpzZXRfdmVyaWZ5X2NhbGxiYWNrKAotICAgIHZlcmlmeV9jYWxsYmFja19iYXNlKiBjYWxsYmFjaywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChTU0xfZ2V0X2FwcF9kYXRhKHNzbF8pKQotICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDx2ZXJpZnlfY2FsbGJhY2tfYmFzZSo+KFNTTF9nZXRfYXBwX2RhdGEoc3NsXykpOwotCi0gIFNTTF9zZXRfYXBwX2RhdGEoc3NsXywgY2FsbGJhY2spOwotCi0gIDo6U1NMX3NldF92ZXJpZnkoc3NsXywgOjpTU0xfZ2V0X3ZlcmlmeV9tb2RlKHNzbF8pLAotICAgICAgJmVuZ2luZTo6dmVyaWZ5X2NhbGxiYWNrX2Z1bmN0aW9uKTsKLQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi1pbnQgZW5naW5lOjp2ZXJpZnlfY2FsbGJhY2tfZnVuY3Rpb24oaW50IHByZXZlcmlmaWVkLCBYNTA5X1NUT1JFX0NUWCogY3R4KQotewotICBpZiAoY3R4KQotICB7Ci0gICAgaWYgKFNTTCogc3NsID0gc3RhdGljX2Nhc3Q8U1NMKj4oCi0gICAgICAgICAgOjpYNTA5X1NUT1JFX0NUWF9nZXRfZXhfZGF0YSgKLSAgICAgICAgICAgIGN0eCwgOjpTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkpKSkKLSAgICB7Ci0gICAgICBpZiAoU1NMX2dldF9hcHBfZGF0YShzc2wpKQotICAgICAgewotICAgICAgICB2ZXJpZnlfY2FsbGJhY2tfYmFzZSogY2FsbGJhY2sgPQotICAgICAgICAgIHN0YXRpY19jYXN0PHZlcmlmeV9jYWxsYmFja19iYXNlKj4oCi0gICAgICAgICAgICAgIFNTTF9nZXRfYXBwX2RhdGEoc3NsKSk7Ci0KLSAgICAgICAgdmVyaWZ5X2NvbnRleHQgdmVyaWZ5X2N0eChjdHgpOwotICAgICAgICByZXR1cm4gY2FsbGJhY2stPmNhbGwocHJldmVyaWZpZWQgIT0gMCwgdmVyaWZ5X2N0eCkgPyAxIDogMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotZW5naW5lOjp3YW50IGVuZ2luZTo6aGFuZHNoYWtlKAotICAgIHN0cmVhbV9iYXNlOjpoYW5kc2hha2VfdHlwZSB0eXBlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgcmV0dXJuIHBlcmZvcm0oKHR5cGUgPT0gYXNpbzo6c3NsOjpzdHJlYW1fYmFzZTo6Y2xpZW50KQotICAgICAgPyAmZW5naW5lOjpkb19jb25uZWN0IDogJmVuZ2luZTo6ZG9fYWNjZXB0LCAwLCAwLCBlYywgMCk7Ci19Ci0KLWVuZ2luZTo6d2FudCBlbmdpbmU6OnNodXRkb3duKGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICByZXR1cm4gcGVyZm9ybSgmZW5naW5lOjpkb19zaHV0ZG93biwgMCwgMCwgZWMsIDApOwotfQotCi1lbmdpbmU6OndhbnQgZW5naW5lOjp3cml0ZShjb25zdCBhc2lvOjpjb25zdF9idWZmZXImIGRhdGEsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIHN0ZDo6c2l6ZV90JiBieXRlc190cmFuc2ZlcnJlZCkKLXsKLSAgaWYgKGFzaW86OmJ1ZmZlcl9zaXplKGRhdGEpID09IDApCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gZW5naW5lOjp3YW50X25vdGhpbmc7Ci0gIH0KLQotICByZXR1cm4gcGVyZm9ybSgmZW5naW5lOjpkb193cml0ZSwKLSAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KGFzaW86OmJ1ZmZlcl9jYXN0PGNvbnN0IHZvaWQqPihkYXRhKSksCi0gICAgICBhc2lvOjpidWZmZXJfc2l6ZShkYXRhKSwgZWMsICZieXRlc190cmFuc2ZlcnJlZCk7Ci19Ci0KLWVuZ2luZTo6d2FudCBlbmdpbmU6OnJlYWQoY29uc3QgYXNpbzo6bXV0YWJsZV9idWZmZXImIGRhdGEsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMsIHN0ZDo6c2l6ZV90JiBieXRlc190cmFuc2ZlcnJlZCkKLXsKLSAgaWYgKGFzaW86OmJ1ZmZlcl9zaXplKGRhdGEpID09IDApCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gZW5naW5lOjp3YW50X25vdGhpbmc7Ci0gIH0KLQotICByZXR1cm4gcGVyZm9ybSgmZW5naW5lOjpkb19yZWFkLAotICAgICAgYXNpbzo6YnVmZmVyX2Nhc3Q8dm9pZCo+KGRhdGEpLAotICAgICAgYXNpbzo6YnVmZmVyX3NpemUoZGF0YSksIGVjLCAmYnl0ZXNfdHJhbnNmZXJyZWQpOwotfQotCi1hc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSBlbmdpbmU6OmdldF9vdXRwdXQoCi0gICAgY29uc3QgYXNpbzo6bXV0YWJsZV9idWZmZXImIGRhdGEpCi17Ci0gIGludCBsZW5ndGggPSA6OkJJT19yZWFkKGV4dF9iaW9fLAotICAgICAgYXNpbzo6YnVmZmVyX2Nhc3Q8dm9pZCo+KGRhdGEpLAotICAgICAgc3RhdGljX2Nhc3Q8aW50Pihhc2lvOjpidWZmZXJfc2l6ZShkYXRhKSkpOwotCi0gIHJldHVybiBhc2lvOjpidWZmZXIoZGF0YSwKLSAgICAgIGxlbmd0aCA+IDAgPyBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4obGVuZ3RoKSA6IDApOwotfQotCi1hc2lvOjpjb25zdF9idWZmZXIgZW5naW5lOjpwdXRfaW5wdXQoCi0gICAgY29uc3QgYXNpbzo6Y29uc3RfYnVmZmVyJiBkYXRhKQotewotICBpbnQgbGVuZ3RoID0gOjpCSU9fd3JpdGUoZXh0X2Jpb18sCi0gICAgICBhc2lvOjpidWZmZXJfY2FzdDxjb25zdCB2b2lkKj4oZGF0YSksCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFzaW86OmJ1ZmZlcl9zaXplKGRhdGEpKSk7Ci0KLSAgcmV0dXJuIGFzaW86OmJ1ZmZlcihkYXRhICsKLSAgICAgIChsZW5ndGggPiAwID8gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KGxlbmd0aCkgOiAwKSk7Ci19Ci0KLWNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVuZ2luZTo6bWFwX2Vycm9yX2NvZGUoCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci17Ci0gIC8vIFdlIG9ubHkgd2FudCB0byBtYXAgdGhlIGVycm9yOjplb2YgY29kZS4KLSAgaWYgKGVjICE9IGFzaW86OmVycm9yOjplb2YpCi0gICAgcmV0dXJuIGVjOwotCi0gIC8vIElmIHRoZXJlJ3MgZGF0YSB5ZXQgdG8gYmUgcmVhZCwgaXQncyBhbiBlcnJvci4KLSAgaWYgKEJJT193cGVuZGluZyhleHRfYmlvXykpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoCi0gICAgICAgIEVSUl9QQUNLKEVSUl9MSUJfU1NMLCAwLCBTU0xfUl9TSE9SVF9SRUFEKSwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zc2xfY2F0ZWdvcnkoKSk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gU1NMIHYyIGRvZXNuJ3QgcHJvdmlkZSBhIHByb3RvY29sLWxldmVsIHNodXRkb3duLCBzbyBhbiBlb2Ygb24gdGhlCi0gIC8vIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlzIHBhc3NlZCB0aHJvdWdoLgotICBpZiAoc3NsXy0+dmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04pCi0gICAgcmV0dXJuIGVjOwotCi0gIC8vIE90aGVyd2lzZSwgdGhlIHBlZXIgc2hvdWxkIGhhdmUgbmVnb3RpYXRlZCBhIHByb3BlciBzaHV0ZG93bi4KLSAgaWYgKCg6OlNTTF9nZXRfc2h1dGRvd24oc3NsXykgJiBTU0xfUkVDRUlWRURfU0hVVERPV04pID09IDApCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoCi0gICAgICAgIEVSUl9QQUNLKEVSUl9MSUJfU1NMLCAwLCBTU0xfUl9TSE9SVF9SRUFEKSwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zc2xfY2F0ZWdvcnkoKSk7Ci0gIH0KLQotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmRldGFpbDo6c3RhdGljX211dGV4JiBlbmdpbmU6OmFjY2VwdF9tdXRleCgpCi17Ci0gIHN0YXRpYyBhc2lvOjpkZXRhaWw6OnN0YXRpY19tdXRleCBtdXRleCA9IEFTSU9fU1RBVElDX01VVEVYX0lOSVQ7Ci0gIHJldHVybiBtdXRleDsKLX0KLQotZW5naW5lOjp3YW50IGVuZ2luZTo6cGVyZm9ybShpbnQgKGVuZ2luZTo6KiBvcCkodm9pZCosIHN0ZDo6c2l6ZV90KSwKLSAgICB2b2lkKiBkYXRhLCBzdGQ6OnNpemVfdCBsZW5ndGgsIGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgIHN0ZDo6c2l6ZV90KiBieXRlc190cmFuc2ZlcnJlZCkKLXsKLSAgc3RkOjpzaXplX3QgcGVuZGluZ19vdXRwdXRfYmVmb3JlID0gOjpCSU9fY3RybF9wZW5kaW5nKGV4dF9iaW9fKTsKLSAgOjpFUlJfY2xlYXJfZXJyb3IoKTsKLSAgaW50IHJlc3VsdCA9ICh0aGlzLT4qb3ApKGRhdGEsIGxlbmd0aCk7Ci0gIGludCBzc2xfZXJyb3IgPSA6OlNTTF9nZXRfZXJyb3Ioc3NsXywgcmVzdWx0KTsKLSAgaW50IHN5c19lcnJvciA9IHN0YXRpY19jYXN0PGludD4oOjpFUlJfZ2V0X2Vycm9yKCkpOwotICBzdGQ6OnNpemVfdCBwZW5kaW5nX291dHB1dF9hZnRlciA9IDo6QklPX2N0cmxfcGVuZGluZyhleHRfYmlvXyk7Ci0KLSAgaWYgKHNzbF9lcnJvciA9PSBTU0xfRVJST1JfU1NMKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKHN5c19lcnJvciwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zc2xfY2F0ZWdvcnkoKSk7Ci0gICAgcmV0dXJuIHdhbnRfbm90aGluZzsKLSAgfQotCi0gIGlmIChzc2xfZXJyb3IgPT0gU1NMX0VSUk9SX1NZU0NBTEwpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoc3lzX2Vycm9yLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3N5c3RlbV9jYXRlZ29yeSgpKTsKLSAgICByZXR1cm4gd2FudF9ub3RoaW5nOwotICB9Ci0KLSAgaWYgKHJlc3VsdCA+IDAgJiYgYnl0ZXNfdHJhbnNmZXJyZWQpCi0gICAgKmJ5dGVzX3RyYW5zZmVycmVkID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHJlc3VsdCk7Ci0KLSAgaWYgKHNzbF9lcnJvciA9PSBTU0xfRVJST1JfV0FOVF9XUklURSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiB3YW50X291dHB1dF9hbmRfcmV0cnk7Ci0gIH0KLSAgZWxzZSBpZiAocGVuZGluZ19vdXRwdXRfYWZ0ZXIgPiBwZW5kaW5nX291dHB1dF9iZWZvcmUpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gcmVzdWx0ID4gMCA/IHdhbnRfb3V0cHV0IDogd2FudF9vdXRwdXRfYW5kX3JldHJ5OwotICB9Ci0gIGVsc2UgaWYgKHNzbF9lcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIHdhbnRfaW5wdXRfYW5kX3JldHJ5OwotICB9Ci0gIGVsc2UgaWYgKDo6U1NMX2dldF9zaHV0ZG93bihzc2xfKSAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3I6OmVvZjsKLSAgICByZXR1cm4gd2FudF9ub3RoaW5nOwotICB9Ci0gIGVsc2UKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiB3YW50X25vdGhpbmc7Ci0gIH0KLX0KLQotaW50IGVuZ2luZTo6ZG9fYWNjZXB0KHZvaWQqLCBzdGQ6OnNpemVfdCkKLXsKLSAgYXNpbzo6ZGV0YWlsOjpzdGF0aWNfbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soYWNjZXB0X211dGV4KCkpOwotICByZXR1cm4gOjpTU0xfYWNjZXB0KHNzbF8pOwotfQotCi1pbnQgZW5naW5lOjpkb19jb25uZWN0KHZvaWQqLCBzdGQ6OnNpemVfdCkKLXsKLSAgcmV0dXJuIDo6U1NMX2Nvbm5lY3Qoc3NsXyk7Ci19Ci0KLWludCBlbmdpbmU6OmRvX3NodXRkb3duKHZvaWQqLCBzdGQ6OnNpemVfdCkKLXsKLSAgaW50IHJlc3VsdCA9IDo6U1NMX3NodXRkb3duKHNzbF8pOwotICBpZiAocmVzdWx0ID09IDApCi0gICAgcmVzdWx0ID0gOjpTU0xfc2h1dGRvd24oc3NsXyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBlbmdpbmU6OmRvX3JlYWQodm9pZCogZGF0YSwgc3RkOjpzaXplX3QgbGVuZ3RoKQotewotICByZXR1cm4gOjpTU0xfcmVhZChzc2xfLCBkYXRhLAotICAgICAgbGVuZ3RoIDwgSU5UX01BWCA/IHN0YXRpY19jYXN0PGludD4obGVuZ3RoKSA6IElOVF9NQVgpOwotfQotCi1pbnQgZW5naW5lOjpkb193cml0ZSh2b2lkKiBkYXRhLCBzdGQ6OnNpemVfdCBsZW5ndGgpCi17Ci0gIHJldHVybiA6OlNTTF93cml0ZShzc2xfLCBkYXRhLAotICAgICAgbGVuZ3RoIDwgSU5UX01BWCA/IHN0YXRpY19jYXN0PGludD4obGVuZ3RoKSA6IElOVF9NQVgpOwotfQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX0RFVEFJTF9JTVBMX0VOR0lORV9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL2ltcGwvb3BlbnNzbF9pbml0LmlwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL2ltcGwvb3BlbnNzbF9pbml0LmlwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2NmZjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC9pbXBsL29wZW5zc2xfaW5pdC5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8KLS8vIHNzbC9kZXRhaWwvaW1wbC9vcGVuc3NsX2luaXQuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwNSBWb2lwc3RlciAvIEluZHJlayBkb3QgSnVoYW5pIGF0IHZvaXBzdGVyIGRvdCBjb20KLS8vIENvcHlyaWdodCAoYykgMjAwNS0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9ERVRBSUxfSU1QTF9PUEVOU1NMX0lOSVRfSVBQCi0jZGVmaW5lIEFTSU9fU1NMX0RFVEFJTF9JTVBMX09QRU5TU0xfSU5JVF9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYXNzZXJ0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9tdXRleC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdHNzX3B0ci5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL29wZW5zc2xfaW5pdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL29wZW5zc2xfdHlwZXMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgb3BlbnNzbF9pbml0X2Jhc2U6OmRvX2luaXQKLXsKLXB1YmxpYzoKLSAgZG9faW5pdCgpCi0gIHsKLSAgICA6OlNTTF9saWJyYXJ5X2luaXQoKTsKLSAgICA6OlNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsgICAgICAgIAotICAgIDo6T3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsKLQotICAgIG11dGV4ZXNfLnJlc2l6ZSg6OkNSWVBUT19udW1fbG9ja3MoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtdXRleGVzXy5zaXplKCk7ICsraSkKLSAgICAgIG11dGV4ZXNfW2ldLnJlc2V0KG5ldyBhc2lvOjpkZXRhaWw6Om11dGV4KTsKLSAgICA6OkNSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjaygmZG9faW5pdDo6b3BlbnNzbF9sb2NraW5nX2Z1bmMpOwotICAgIDo6Q1JZUFRPX3NldF9pZF9jYWxsYmFjaygmZG9faW5pdDo6b3BlbnNzbF9pZF9mdW5jKTsKLQotI2lmICFkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikgXAotICAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDAwTCkKLSAgICBudWxsX2NvbXByZXNzaW9uX21ldGhvZHNfID0gc2tfU1NMX0NPTVBfbmV3X251bGwoKTsKLSNlbmRpZiAvLyAhZGVmaW5lZChTU0xfT1BfTk9fQ09NUFJFU1NJT04pCi0gICAgICAgLy8gJiYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwODAwMEwpCi0gIH0KLQotICB+ZG9faW5pdCgpCi0gIHsKLSNpZiAhZGVmaW5lZChTU0xfT1BfTk9fQ09NUFJFU1NJT04pIFwKLSAgJiYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwODAwMEwpCi0gICAgc2tfU1NMX0NPTVBfZnJlZShudWxsX2NvbXByZXNzaW9uX21ldGhvZHNfKTsKLSNlbmRpZiAvLyAhZGVmaW5lZChTU0xfT1BfTk9fQ09NUFJFU1NJT04pCi0gICAgICAgLy8gJiYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwODAwMEwpCi0KLSAgICA6OkNSWVBUT19zZXRfaWRfY2FsbGJhY2soMCk7Ci0gICAgOjpDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soMCk7Ci0gICAgOjpFUlJfZnJlZV9zdHJpbmdzKCk7Ci0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgxMDAwMDAwMEwpCi0gICAgOjpFUlJfcmVtb3ZlX3RocmVhZF9zdGF0ZShOVUxMKTsKLSNlbHNlIC8vIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAwMDAwMDBMKQotICAgIDo6RVJSX3JlbW92ZV9zdGF0ZSgwKTsKLSNlbmRpZiAvLyAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMDAwMDAwTCkKLSAgICA6OkVWUF9jbGVhbnVwKCk7Ci0gICAgOjpDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOwotICAgIDo6Q09ORl9tb2R1bGVzX3VubG9hZCgxKTsKLSNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0VOR0lORSkKLSAgICA6OkVOR0lORV9jbGVhbnVwKCk7Ci0jZW5kaWYgLy8gIWRlZmluZWQoT1BFTlNTTF9OT19FTkdJTkUpCi0gIH0KLQotI2lmICFkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikgXAotICAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDAwTCkKLSAgU1RBQ0tfT0YoU1NMX0NPTVApKiBnZXRfbnVsbF9jb21wcmVzc2lvbl9tZXRob2RzKCkgY29uc3QKLSAgewotICAgIHJldHVybiBudWxsX2NvbXByZXNzaW9uX21ldGhvZHNfOwotICB9Ci0jZW5kaWYgLy8gIWRlZmluZWQoU1NMX09QX05PX0NPTVBSRVNTSU9OKQotICAgICAgIC8vICYmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDgwMDBMKQotCi1wcml2YXRlOgotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBvcGVuc3NsX2lkX2Z1bmMoKQotICB7Ci0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1MpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgICByZXR1cm4gOjpHZXRDdXJyZW50VGhyZWFkSWQoKTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0gICAgdm9pZCogaWQgPSBpbnN0YW5jZSgpLT50aHJlYWRfaWRfOwotICAgIGlmIChpZCA9PSAwKQotICAgICAgaW5zdGFuY2UoKS0+dGhyZWFkX2lkXyA9IGlkID0gJmlkOyAvLyBVZ2guCi0gICAgQVNJT19BU1NFUlQoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID49IHNpemVvZih2b2lkKikpOwotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGxvbmc+KGlkKTsKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotICB9Ci0KLSAgc3RhdGljIHZvaWQgb3BlbnNzbF9sb2NraW5nX2Z1bmMoaW50IG1vZGUsIGludCBuLCAKLSAgICBjb25zdCBjaGFyKiAvKmZpbGUqLywgaW50IC8qbGluZSovKQotICB7Ci0gICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKLSAgICAgIGluc3RhbmNlKCktPm11dGV4ZXNfW25dLT5sb2NrKCk7Ci0gICAgZWxzZQotICAgICAgaW5zdGFuY2UoKS0+bXV0ZXhlc19bbl0tPnVubG9jaygpOwotICB9Ci0KLSAgLy8gTXV0ZXhlcyB0byBiZSB1c2VkIGluIGxvY2tpbmcgY2FsbGJhY2tzLgotICBzdGQ6OnZlY3Rvcjxhc2lvOjpkZXRhaWw6OnNoYXJlZF9wdHI8Ci0gICAgICAgIGFzaW86OmRldGFpbDo6bXV0ZXg+ID4gbXV0ZXhlc187Ci0KLSNpZiAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIC8vIFRoZSB0aHJlYWQgaWRlbnRpZmllcnMgdG8gYmUgdXNlZCBieSBvcGVuc3NsLgotICBhc2lvOjpkZXRhaWw6OnRzc19wdHI8dm9pZD4gdGhyZWFkX2lkXzsKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLSNpZiAhZGVmaW5lZChTU0xfT1BfTk9fQ09NUFJFU1NJT04pIFwKLSAgJiYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwODAwMEwpCi0gIFNUQUNLX09GKFNTTF9DT01QKSogbnVsbF9jb21wcmVzc2lvbl9tZXRob2RzXzsKLSNlbmRpZiAvLyAhZGVmaW5lZChTU0xfT1BfTk9fQ09NUFJFU1NJT04pCi0gICAgICAgLy8gJiYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwODAwMEwpCi19OwotCi1hc2lvOjpkZXRhaWw6OnNoYXJlZF9wdHI8b3BlbnNzbF9pbml0X2Jhc2U6OmRvX2luaXQ+Ci1vcGVuc3NsX2luaXRfYmFzZTo6aW5zdGFuY2UoKQotewotICBzdGF0aWMgYXNpbzo6ZGV0YWlsOjpzaGFyZWRfcHRyPGRvX2luaXQ+IGluaXQobmV3IGRvX2luaXQpOwotICByZXR1cm4gaW5pdDsKLX0KLQotI2lmICFkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikgXAotICAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDAwTCkKLVNUQUNLX09GKFNTTF9DT01QKSogb3BlbnNzbF9pbml0X2Jhc2U6OmdldF9udWxsX2NvbXByZXNzaW9uX21ldGhvZHMoKQotewotICByZXR1cm4gaW5zdGFuY2UoKS0+Z2V0X251bGxfY29tcHJlc3Npb25fbWV0aG9kcygpOwotfQotI2VuZGlmIC8vICFkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikKLSAgICAgICAvLyAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDAwTCkKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX0RFVEFJTF9JTVBMX09QRU5TU0xfSU5JVF9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL2lvLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL2lvLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NTMxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC9pby5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLy8KLS8vIHNzbC9kZXRhaWwvaW8uaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9ERVRBSUxfSU9fSFBQCi0jZGVmaW5lIEFTSU9fU1NMX0RFVEFJTF9JT19IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0jIGluY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9lbmdpbmUuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvc3RyZWFtX2NvcmUuaHBwIgotIyBpbmNsdWRlICJhc2lvL3dyaXRlLmhwcCIKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0sIHR5cGVuYW1lIE9wZXJhdGlvbj4KLXN0ZDo6c2l6ZV90IGlvKFN0cmVhbSYgbmV4dF9sYXllciwgc3RyZWFtX2NvcmUmIGNvcmUsCi0gICAgY29uc3QgT3BlcmF0aW9uJiBvcCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLSAgZG8gc3dpdGNoIChvcChjb3JlLmVuZ2luZV8sIGVjLCBieXRlc190cmFuc2ZlcnJlZCkpCi0gIHsKLSAgY2FzZSBlbmdpbmU6OndhbnRfaW5wdXRfYW5kX3JldHJ5OgotCi0gICAgLy8gSWYgdGhlIGlucHV0IGJ1ZmZlciBpcyBlbXB0eSB0aGVuIHdlIG5lZWQgdG8gcmVhZCBzb21lIG1vcmUgZGF0YSBmcm9tCi0gICAgLy8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICAgIGlmIChhc2lvOjpidWZmZXJfc2l6ZShjb3JlLmlucHV0XykgPT0gMCkKLSAgICAgIGNvcmUuaW5wdXRfID0gYXNpbzo6YnVmZmVyKGNvcmUuaW5wdXRfYnVmZmVyXywKLSAgICAgICAgICBuZXh0X2xheWVyLnJlYWRfc29tZShjb3JlLmlucHV0X2J1ZmZlcl8sIGVjKSk7Ci0KLSAgICAvLyBQYXNzIHRoZSBuZXcgaW5wdXQgZGF0YSB0byB0aGUgZW5naW5lLgotICAgIGNvcmUuaW5wdXRfID0gY29yZS5lbmdpbmVfLnB1dF9pbnB1dChjb3JlLmlucHV0Xyk7Ci0KLSAgICAvLyBUcnkgdGhlIG9wZXJhdGlvbiBhZ2Fpbi4KLSAgICBjb250aW51ZTsKLQotICBjYXNlIGVuZ2luZTo6d2FudF9vdXRwdXRfYW5kX3JldHJ5OgotCi0gICAgLy8gR2V0IG91dHB1dCBkYXRhIGZyb20gdGhlIGVuZ2luZSBhbmQgd3JpdGUgaXQgdG8gdGhlIHVuZGVybHlpbmcKLSAgICAvLyB0cmFuc3BvcnQuCi0gICAgYXNpbzo6d3JpdGUobmV4dF9sYXllciwKLSAgICAgICAgY29yZS5lbmdpbmVfLmdldF9vdXRwdXQoY29yZS5vdXRwdXRfYnVmZmVyXyksIGVjKTsKLQotICAgIC8vIFRyeSB0aGUgb3BlcmF0aW9uIGFnYWluLgotICAgIGNvbnRpbnVlOwotCi0gIGNhc2UgZW5naW5lOjp3YW50X291dHB1dDoKLQotICAgIC8vIEdldCBvdXRwdXQgZGF0YSBmcm9tIHRoZSBlbmdpbmUgYW5kIHdyaXRlIGl0IHRvIHRoZSB1bmRlcmx5aW5nCi0gICAgLy8gdHJhbnNwb3J0LgotICAgIGFzaW86OndyaXRlKG5leHRfbGF5ZXIsCi0gICAgICAgIGNvcmUuZW5naW5lXy5nZXRfb3V0cHV0KGNvcmUub3V0cHV0X2J1ZmZlcl8pLCBlYyk7Ci0KLSAgICAvLyBPcGVyYXRpb24gaXMgY29tcGxldGUuIFJldHVybiByZXN1bHQgdG8gY2FsbGVyLgotICAgIGNvcmUuZW5naW5lXy5tYXBfZXJyb3JfY29kZShlYyk7Ci0gICAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotCi0gIGRlZmF1bHQ6Ci0KLSAgICAvLyBPcGVyYXRpb24gaXMgY29tcGxldGUuIFJldHVybiByZXN1bHQgdG8gY2FsbGVyLgotICAgIGNvcmUuZW5naW5lXy5tYXBfZXJyb3JfY29kZShlYyk7Ci0gICAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotCi0gIH0gd2hpbGUgKCFlYyk7Ci0KLSAgLy8gT3BlcmF0aW9uIGZhaWxlZC4gUmV0dXJuIHJlc3VsdCB0byBjYWxsZXIuCi0gIGNvcmUuZW5naW5lXy5tYXBfZXJyb3JfY29kZShlYyk7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtLCB0eXBlbmFtZSBPcGVyYXRpb24sIHR5cGVuYW1lIEhhbmRsZXI+Ci1jbGFzcyBpb19vcAotewotcHVibGljOgotICBpb19vcChTdHJlYW0mIG5leHRfbGF5ZXIsIHN0cmVhbV9jb3JlJiBjb3JlLAotICAgICAgY29uc3QgT3BlcmF0aW9uJiBvcCwgSGFuZGxlciYgaGFuZGxlcikKLSAgICA6IG5leHRfbGF5ZXJfKG5leHRfbGF5ZXIpLAotICAgICAgY29yZV8oY29yZSksCi0gICAgICBvcF8ob3ApLAotICAgICAgc3RhcnRfKDApLAotICAgICAgd2FudF8oZW5naW5lOjp3YW50X25vdGhpbmcpLAotICAgICAgYnl0ZXNfdHJhbnNmZXJyZWRfKDApLAotICAgICAgaGFuZGxlcl8oQVNJT19NT1ZFX0NBU1QoSGFuZGxlcikoaGFuZGxlcikpCi0gIHsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKQotICBpb19vcChjb25zdCBpb19vcCYgb3RoZXIpCi0gICAgOiBuZXh0X2xheWVyXyhvdGhlci5uZXh0X2xheWVyXyksCi0gICAgICBjb3JlXyhvdGhlci5jb3JlXyksCi0gICAgICBvcF8ob3RoZXIub3BfKSwKLSAgICAgIHN0YXJ0XyhvdGhlci5zdGFydF8pLAotICAgICAgd2FudF8ob3RoZXIud2FudF8pLAotICAgICAgZWNfKG90aGVyLmVjXyksCi0gICAgICBieXRlc190cmFuc2ZlcnJlZF8ob3RoZXIuYnl0ZXNfdHJhbnNmZXJyZWRfKSwKLSAgICAgIGhhbmRsZXJfKG90aGVyLmhhbmRsZXJfKQotICB7Ci0gIH0KLQotICBpb19vcChpb19vcCYmIG90aGVyKQotICAgIDogbmV4dF9sYXllcl8ob3RoZXIubmV4dF9sYXllcl8pLAotICAgICAgY29yZV8ob3RoZXIuY29yZV8pLAotICAgICAgb3BfKG90aGVyLm9wXyksCi0gICAgICBzdGFydF8ob3RoZXIuc3RhcnRfKSwKLSAgICAgIHdhbnRfKG90aGVyLndhbnRfKSwKLSAgICAgIGVjXyhvdGhlci5lY18pLAotICAgICAgYnl0ZXNfdHJhbnNmZXJyZWRfKG90aGVyLmJ5dGVzX3RyYW5zZmVycmVkXyksCi0gICAgICBoYW5kbGVyXyhBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShvdGhlci5oYW5kbGVyXykpCi0gIHsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkKLQotICB2b2lkIG9wZXJhdG9yKCkoYXNpbzo6ZXJyb3JfY29kZSBlYywKLSAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gfnN0ZDo6c2l6ZV90KDApLCBpbnQgc3RhcnQgPSAwKQotICB7Ci0gICAgc3dpdGNoIChzdGFydF8gPSBzdGFydCkKLSAgICB7Ci0gICAgY2FzZSAxOiAvLyBDYWxsZWQgYWZ0ZXIgYXQgbGVhc3Qgb25lIGFzeW5jIG9wZXJhdGlvbi4KLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAod2FudF8gPSBvcF8oY29yZV8uZW5naW5lXywgZWNfLCBieXRlc190cmFuc2ZlcnJlZF8pKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgZW5naW5lOjp3YW50X2lucHV0X2FuZF9yZXRyeToKLQotICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBidWZmZXIgYWxyZWFkeSBoYXMgZGF0YSBpbiBpdCB3ZSBjYW4gcGFzcyBpdCB0byB0aGUKLSAgICAgICAgICAvLyBlbmdpbmUgYW5kIHRoZW4gcmV0cnkgdGhlIG9wZXJhdGlvbiBpbW1lZGlhdGVseS4KLSAgICAgICAgICBpZiAoYXNpbzo6YnVmZmVyX3NpemUoY29yZV8uaW5wdXRfKSAhPSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvcmVfLmlucHV0XyA9IGNvcmVfLmVuZ2luZV8ucHV0X2lucHV0KGNvcmVfLmlucHV0Xyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBUaGUgZW5naW5lIHdhbnRzIG1vcmUgZGF0YSB0byBiZSByZWFkIGZyb20gaW5wdXQuIEhvd2V2ZXIsIHdlCi0gICAgICAgICAgLy8gY2Fubm90IGFsbG93IG1vcmUgdGhhbiBvbmUgcmVhZCBvcGVyYXRpb24gYXQgYSB0aW1lIG9uIHRoZQotICAgICAgICAgIC8vIHVuZGVybHlpbmcgdHJhbnNwb3J0LiBUaGUgcGVuZGluZ19yZWFkXyB0aW1lcidzIGV4cGlyeSBpcyBzZXQgdG8KLSAgICAgICAgICAvLyBwb3NfaW5maW4gaWYgYSByZWFkIGlzIGluIHByb2dyZXNzLCBhbmQgbmVnX2luZmluIG90aGVyd2lzZS4KLSAgICAgICAgICBpZiAoY29yZV8ucGVuZGluZ19yZWFkXy5leHBpcmVzX2F0KCkgPT0gY29yZV8ubmVnX2luZmluKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gUHJldmVudCBvdGhlciByZWFkIG9wZXJhdGlvbnMgZnJvbSBiZWluZyBzdGFydGVkLgotICAgICAgICAgICAgY29yZV8ucGVuZGluZ19yZWFkXy5leHBpcmVzX2F0KGNvcmVfLnBvc19pbmZpbigpKTsKLQotICAgICAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBzb21lIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gICAgICAgICAgICBuZXh0X2xheWVyXy5hc3luY19yZWFkX3NvbWUoCi0gICAgICAgICAgICAgICAgYXNpbzo6YnVmZmVyKGNvcmVfLmlucHV0X2J1ZmZlcl8pLAotICAgICAgICAgICAgICAgIEFTSU9fTU9WRV9DQVNUKGlvX29wKSgqdGhpcykpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgY3VycmVudCByZWFkIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAgICAgICAgICBjb3JlXy5wZW5kaW5nX3JlYWRfLmFzeW5jX3dhaXQoQVNJT19NT1ZFX0NBU1QoaW9fb3ApKCp0aGlzKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gWWllbGQgY29udHJvbCB1bnRpbCBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcy4gQ29udHJvbAotICAgICAgICAgIC8vIHJlc3VtZXMgYXQgdGhlICJkZWZhdWx0OiIgbGFiZWwgYmVsb3cuCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGNhc2UgZW5naW5lOjp3YW50X291dHB1dF9hbmRfcmV0cnk6Ci0gICAgICAgIGNhc2UgZW5naW5lOjp3YW50X291dHB1dDoKLQotICAgICAgICAgIC8vIFRoZSBlbmdpbmUgd2FudHMgc29tZSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dC4gSG93ZXZlciwgd2UKLSAgICAgICAgICAvLyBjYW5ub3QgYWxsb3cgbW9yZSB0aGFuIG9uZSB3cml0ZSBvcGVyYXRpb24gYXQgYSB0aW1lIG9uIHRoZQotICAgICAgICAgIC8vIHVuZGVybHlpbmcgdHJhbnNwb3J0LiBUaGUgcGVuZGluZ193cml0ZV8gdGltZXIncyBleHBpcnkgaXMgc2V0IHRvCi0gICAgICAgICAgLy8gcG9zX2luZmluIGlmIGEgd3JpdGUgaXMgaW4gcHJvZ3Jlc3MsIGFuZCBuZWdfaW5maW4gb3RoZXJ3aXNlLgotICAgICAgICAgIGlmIChjb3JlXy5wZW5kaW5nX3dyaXRlXy5leHBpcmVzX2F0KCkgPT0gY29yZV8ubmVnX2luZmluKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gUHJldmVudCBvdGhlciB3cml0ZSBvcGVyYXRpb25zIGZyb20gYmVpbmcgc3RhcnRlZC4KLSAgICAgICAgICAgIGNvcmVfLnBlbmRpbmdfd3JpdGVfLmV4cGlyZXNfYXQoY29yZV8ucG9zX2luZmluKCkpOwotCi0gICAgICAgICAgICAvLyBTdGFydCB3cml0aW5nIGFsbCB0aGUgZGF0YSB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gICAgICAgICAgICBhc2lvOjphc3luY193cml0ZShuZXh0X2xheWVyXywKLSAgICAgICAgICAgICAgICBjb3JlXy5lbmdpbmVfLmdldF9vdXRwdXQoY29yZV8ub3V0cHV0X2J1ZmZlcl8pLAotICAgICAgICAgICAgICAgIEFTSU9fTU9WRV9DQVNUKGlvX29wKSgqdGhpcykpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgY3VycmVudCB3cml0ZSBvcGVyYXRpb24gY29tcGxldGVzLgotICAgICAgICAgICAgY29yZV8ucGVuZGluZ193cml0ZV8uYXN5bmNfd2FpdChBU0lPX01PVkVfQ0FTVChpb19vcCkoKnRoaXMpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBZaWVsZCBjb250cm9sIHVudGlsIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzLiBDb250cm9sCi0gICAgICAgICAgLy8gcmVzdW1lcyBhdCB0aGUgImRlZmF1bHQ6IiBsYWJlbCBiZWxvdy4KLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZGVmYXVsdDoKLQotICAgICAgICAgIC8vIFRoZSBTU0wgb3BlcmF0aW9uIGlzIGRvbmUgYW5kIHdlIGNhbiBpbnZva2UgdGhlIGhhbmRsZXIsIGJ1dCB3ZQotICAgICAgICAgIC8vIGhhdmUgdG8ga2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBmdW5jdGlvbiBtaWdodCBiZSBiZWluZyBjYWxsZWQgZnJvbQotICAgICAgICAgIC8vIHRoZSBhc3luYyBvcGVyYXRpb24ncyBpbml0aWF0aW5nIGZ1bmN0aW9uLiBJbiB0aGlzIGNhc2Ugd2UncmUgbm90Ci0gICAgICAgICAgLy8gYWxsb3dlZCB0byBjYWxsIHRoZSBoYW5kbGVyIGRpcmVjdGx5LiBJbnN0ZWFkLCBpc3N1ZSBhIHplcm8tc2l6ZWQKLSAgICAgICAgICAvLyByZWFkIHNvIHRoZSBoYW5kbGVyIHJ1bnMgImFzLWlmIiBwb3N0ZWQgdXNpbmcgaW9fc2VydmljZTo6cG9zdCgpLgotICAgICAgICAgIGlmIChzdGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0X2xheWVyXy5hc3luY19yZWFkX3NvbWUoCi0gICAgICAgICAgICAgICAgYXNpbzo6YnVmZmVyKGNvcmVfLmlucHV0X2J1ZmZlcl8sIDApLAotICAgICAgICAgICAgICAgIEFTSU9fTU9WRV9DQVNUKGlvX29wKSgqdGhpcykpOwotCi0gICAgICAgICAgICAvLyBZaWVsZCBjb250cm9sIHVudGlsIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzLiBDb250cm9sCi0gICAgICAgICAgICAvLyByZXN1bWVzIGF0IHRoZSAiZGVmYXVsdDoiIGxhYmVsIGJlbG93LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQ29udGludWUgb24gdG8gcnVuIGhhbmRsZXIgZGlyZWN0bHkuCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoYnl0ZXNfdHJhbnNmZXJyZWQgPT0gfnN0ZDo6c2l6ZV90KDApKQotICAgICAgICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsgLy8gVGltZXIgY2FuY2VsbGF0aW9uLCBubyBkYXRhIHRyYW5zZmVycmVkLgotICAgICAgICBlbHNlIGlmICghZWNfKQotICAgICAgICAgIGVjXyA9IGVjOwotCi0gICAgICAgIHN3aXRjaCAod2FudF8pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBlbmdpbmU6OndhbnRfaW5wdXRfYW5kX3JldHJ5OgotCi0gICAgICAgICAgLy8gQWRkIHJlY2VpdmVkIGRhdGEgdG8gdGhlIGVuZ2luZSdzIGlucHV0LgotICAgICAgICAgIGNvcmVfLmlucHV0XyA9IGFzaW86OmJ1ZmZlcigKLSAgICAgICAgICAgICAgY29yZV8uaW5wdXRfYnVmZmVyXywgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICAgICAgICAgIGNvcmVfLmlucHV0XyA9IGNvcmVfLmVuZ2luZV8ucHV0X2lucHV0KGNvcmVfLmlucHV0Xyk7Ci0KLSAgICAgICAgICAvLyBSZWxlYXNlIGFueSB3YWl0aW5nIHJlYWQgb3BlcmF0aW9ucy4KLSAgICAgICAgICBjb3JlXy5wZW5kaW5nX3JlYWRfLmV4cGlyZXNfYXQoY29yZV8ubmVnX2luZmluKCkpOwotCi0gICAgICAgICAgLy8gVHJ5IHRoZSBvcGVyYXRpb24gYWdhaW4uCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgY2FzZSBlbmdpbmU6OndhbnRfb3V0cHV0X2FuZF9yZXRyeToKLQotICAgICAgICAgIC8vIFJlbGVhc2UgYW55IHdhaXRpbmcgd3JpdGUgb3BlcmF0aW9ucy4KLSAgICAgICAgICBjb3JlXy5wZW5kaW5nX3dyaXRlXy5leHBpcmVzX2F0KGNvcmVfLm5lZ19pbmZpbigpKTsKLQotICAgICAgICAgIC8vIFRyeSB0aGUgb3BlcmF0aW9uIGFnYWluLgotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGNhc2UgZW5naW5lOjp3YW50X291dHB1dDoKLQotICAgICAgICAgIC8vIFJlbGVhc2UgYW55IHdhaXRpbmcgd3JpdGUgb3BlcmF0aW9ucy4KLSAgICAgICAgICBjb3JlXy5wZW5kaW5nX3dyaXRlXy5leHBpcmVzX2F0KGNvcmVfLm5lZ19pbmZpbigpKTsKLQotICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBjYWxsIGhhbmRsZXIuCi0KLSAgICAgICAgZGVmYXVsdDoKLQotICAgICAgICAgIC8vIFBhc3MgdGhlIHJlc3VsdCB0byB0aGUgaGFuZGxlci4KLSAgICAgICAgICBvcF8uY2FsbF9oYW5kbGVyKGhhbmRsZXJfLAotICAgICAgICAgICAgICBjb3JlXy5lbmdpbmVfLm1hcF9lcnJvcl9jb2RlKGVjXyksCi0gICAgICAgICAgICAgIGVjXyA/IDAgOiBieXRlc190cmFuc2ZlcnJlZF8pOwotCi0gICAgICAgICAgLy8gT3VyIHdvcmsgaGVyZSBpcyBkb25lLgotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfSB3aGlsZSAoIWVjXyk7Ci0KLSAgICAgIC8vIE9wZXJhdGlvbiBmYWlsZWQuIFBhc3MgdGhlIHJlc3VsdCB0byB0aGUgaGFuZGxlci4KLSAgICAgIG9wXy5jYWxsX2hhbmRsZXIoaGFuZGxlcl8sIGNvcmVfLmVuZ2luZV8ubWFwX2Vycm9yX2NvZGUoZWNfKSwgMCk7Ci0gICAgfQotICB9Ci0KLS8vcHJpdmF0ZToKLSAgU3RyZWFtJiBuZXh0X2xheWVyXzsKLSAgc3RyZWFtX2NvcmUmIGNvcmVfOwotICBPcGVyYXRpb24gb3BfOwotICBpbnQgc3RhcnRfOwotICBlbmdpbmU6OndhbnQgd2FudF87Ci0gIGFzaW86OmVycm9yX2NvZGUgZWNfOwotICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZF87Ci0gIEhhbmRsZXIgaGFuZGxlcl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtLCB0eXBlbmFtZSBPcGVyYXRpb24sICB0eXBlbmFtZSBIYW5kbGVyPgotaW5saW5lIHZvaWQqIGFzaW9faGFuZGxlcl9hbGxvY2F0ZShzdGQ6OnNpemVfdCBzaXplLAotICAgIGlvX29wPFN0cmVhbSwgT3BlcmF0aW9uLCBIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotewotICByZXR1cm4gYXNpb19oYW5kbGVyX2FsbG9jX2hlbHBlcnM6OmFsbG9jYXRlKAotICAgICAgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0sIHR5cGVuYW1lIE9wZXJhdGlvbiwgdHlwZW5hbWUgSGFuZGxlcj4KLWlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9kZWFsbG9jYXRlKHZvaWQqIHBvaW50ZXIsIHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgaW9fb3A8U3RyZWFtLCBPcGVyYXRpb24sIEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIGFzaW9faGFuZGxlcl9hbGxvY19oZWxwZXJzOjpkZWFsbG9jYXRlKAotICAgICAgcG9pbnRlciwgc2l6ZSwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0sIHR5cGVuYW1lIE9wZXJhdGlvbiwgdHlwZW5hbWUgSGFuZGxlcj4KLWlubGluZSBib29sIGFzaW9faGFuZGxlcl9pc19jb250aW51YXRpb24oCi0gICAgaW9fb3A8U3RyZWFtLCBPcGVyYXRpb24sIEhhbmRsZXI+KiB0aGlzX2hhbmRsZXIpCi17Ci0gIHJldHVybiB0aGlzX2hhbmRsZXItPnN0YXJ0XyA9PSAwID8gdHJ1ZQotICAgIDogYXNpb19oYW5kbGVyX2NvbnRfaGVscGVyczo6aXNfY29udGludWF0aW9uKHRoaXNfaGFuZGxlci0+aGFuZGxlcl8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIFN0cmVhbSwKLSAgICB0eXBlbmFtZSBPcGVyYXRpb24sIHR5cGVuYW1lIEhhbmRsZXI+Ci1pbmxpbmUgdm9pZCBhc2lvX2hhbmRsZXJfaW52b2tlKEZ1bmN0aW9uJiBmdW5jdGlvbiwKLSAgICBpb19vcDxTdHJlYW0sIE9wZXJhdGlvbiwgSGFuZGxlcj4qIHRoaXNfaGFuZGxlcikKLXsKLSAgYXNpb19oYW5kbGVyX2ludm9rZV9oZWxwZXJzOjppbnZva2UoCi0gICAgICBmdW5jdGlvbiwgdGhpc19oYW5kbGVyLT5oYW5kbGVyXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgU3RyZWFtLAotICAgIHR5cGVuYW1lIE9wZXJhdGlvbiwgdHlwZW5hbWUgSGFuZGxlcj4KLWlubGluZSB2b2lkIGFzaW9faGFuZGxlcl9pbnZva2UoY29uc3QgRnVuY3Rpb24mIGZ1bmN0aW9uLAotICAgIGlvX29wPFN0cmVhbSwgT3BlcmF0aW9uLCBIYW5kbGVyPiogdGhpc19oYW5kbGVyKQotewotICBhc2lvX2hhbmRsZXJfaW52b2tlX2hlbHBlcnM6Omludm9rZSgKLSAgICAgIGZ1bmN0aW9uLCB0aGlzX2hhbmRsZXItPmhhbmRsZXJfKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgT3BlcmF0aW9uLCB0eXBlbmFtZSBIYW5kbGVyPgotaW5saW5lIHZvaWQgYXN5bmNfaW8oU3RyZWFtJiBuZXh0X2xheWVyLCBzdHJlYW1fY29yZSYgY29yZSwKLSAgICBjb25zdCBPcGVyYXRpb24mIG9wLCBIYW5kbGVyJiBoYW5kbGVyKQotewotICBpb19vcDxTdHJlYW0sIE9wZXJhdGlvbiwgSGFuZGxlcj4oCi0gICAgbmV4dF9sYXllciwgY29yZSwgb3AsIGhhbmRsZXIpKAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSgpLCAwLCAxKTsKLX0KLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9ERVRBSUxfSU9fSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC9vcGVuc3NsX2luaXQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvb3BlbnNzbF9pbml0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjOTI5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC9vcGVuc3NsX2luaXQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vCi0vLyBzc2wvZGV0YWlsL29wZW5zc2xfaW5pdC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9ERVRBSUxfT1BFTlNTTF9JTklUX0hQUAotI2RlZmluZSBBU0lPX1NTTF9ERVRBSUxfT1BFTlNTTF9JTklUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NoYXJlZF9wdHIuaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9vcGVuc3NsX3R5cGVzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLWNsYXNzIG9wZW5zc2xfaW5pdF9iYXNlCi0gIDogcHJpdmF0ZSBub25jb3B5YWJsZQotewotcHJvdGVjdGVkOgotICAvLyBDbGFzcyB0aGF0IHBlcmZvcm1zIHRoZSBhY3R1YWwgaW5pdGlhbGlzYXRpb24uCi0gIGNsYXNzIGRvX2luaXQ7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIG1hbmFnZSBhIGRvX2luaXQgc2luZ2xldG9uLiBUaGUgc3RhdGljIGluc3RhbmNlIG9mIHRoZQotICAvLyBvcGVuc3NsX2luaXQgb2JqZWN0IGVuc3VyZXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgYmVmb3JlCi0gIC8vIG1haW4sIGFuZCB0aGVyZWZvcmUgYmVmb3JlIGFueSBvdGhlciB0aHJlYWRzIGNhbiBnZXQgc3RhcnRlZC4gVGhlIGRvX2luaXQKLSAgLy8gaW5zdGFuY2UgbXVzdCBiZSBzdGF0aWMgaW4gdGhpcyBmdW5jdGlvbiB0byBlbnN1cmUgdGhhdCBpdCBnZXRzCi0gIC8vIGluaXRpYWxpc2VkIGJlZm9yZSBhbnkgb3RoZXIgZ2xvYmFsIG9iamVjdHMgdHJ5IHRvIHVzZSBpdC4KLSAgQVNJT19ERUNMIHN0YXRpYyBhc2lvOjpkZXRhaWw6OnNoYXJlZF9wdHI8ZG9faW5pdD4gaW5zdGFuY2UoKTsKLQotI2lmICFkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikgXAotICAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDAwTCkKLSAgLy8gR2V0IGFuIGVtcHR5IHN0YWNrIG9mIGNvbXByZXNzaW9uIG1ldGhvZHMsIHRvIGJlIHVzZWQgd2hlbiBkaXNhYmxpbmcKLSAgLy8gY29tcHJlc3Npb24uCi0gIEFTSU9fREVDTCBzdGF0aWMgU1RBQ0tfT0YoU1NMX0NPTVApKiBnZXRfbnVsbF9jb21wcmVzc2lvbl9tZXRob2RzKCk7Ci0jZW5kaWYgLy8gIWRlZmluZWQoU1NMX09QX05PX0NPTVBSRVNTSU9OKQotICAgICAgIC8vICYmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDgwMDBMKQotfTsKLQotdGVtcGxhdGUgPGJvb2wgRG9fSW5pdCA9IHRydWU+Ci1jbGFzcyBvcGVuc3NsX2luaXQgOiBwcml2YXRlIG9wZW5zc2xfaW5pdF9iYXNlCi17Ci1wdWJsaWM6Ci0gIC8vIENvbnN0cnVjdG9yLgotICBvcGVuc3NsX2luaXQoKQotICAgIDogcmVmXyhpbnN0YW5jZSgpKQotICB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbW1vdmUuCi0KLSAgICAvLyBFbnN1cmUgb3BlbnNzbF9pbml0OjppbnN0YW5jZV8gaXMgbGlua2VkIGluLgotICAgIG9wZW5zc2xfaW5pdCogdG1wID0gJmluc3RhbmNlXzsKLSAgICBtZW1tb3ZlKCZ0bXAsICZ0bXAsIHNpemVvZihvcGVuc3NsX2luaXQqKSk7Ci0gIH0KLQotICAvLyBEZXN0cnVjdG9yLgotICB+b3BlbnNzbF9pbml0KCkKLSAgewotICB9Ci0KLSNpZiAhZGVmaW5lZChTU0xfT1BfTk9fQ09NUFJFU1NJT04pIFwKLSAgJiYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwODAwMEwpCi0gIHVzaW5nIG9wZW5zc2xfaW5pdF9iYXNlOjpnZXRfbnVsbF9jb21wcmVzc2lvbl9tZXRob2RzOwotI2VuZGlmIC8vICFkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikKLSAgICAgICAvLyAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDAwTCkKLQotcHJpdmF0ZToKLSAgLy8gSW5zdGFuY2UgdG8gZm9yY2UgaW5pdGlhbGlzYXRpb24gb2Ygb3BlbnNzbCBhdCBnbG9iYWwgc2NvcGUuCi0gIHN0YXRpYyBvcGVuc3NsX2luaXQgaW5zdGFuY2VfOwotCi0gIC8vIFJlZmVyZW5jZSB0byBzaW5nbGV0b24gZG9faW5pdCBvYmplY3QgdG8gZW5zdXJlIHRoYXQgb3BlbnNzbCBkb2VzIG5vdCBnZXQKLSAgLy8gY2xlYW5lZCB1cCB1bnRpbCB0aGUgbGFzdCB1c2VyIGhhcyBmaW5pc2hlZCB3aXRoIGl0LgotICBhc2lvOjpkZXRhaWw6OnNoYXJlZF9wdHI8ZG9faW5pdD4gcmVmXzsKLX07Ci0KLXRlbXBsYXRlIDxib29sIERvX0luaXQ+Ci1vcGVuc3NsX2luaXQ8RG9fSW5pdD4gb3BlbnNzbF9pbml0PERvX0luaXQ+OjppbnN0YW5jZV87Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9pbXBsL29wZW5zc2xfaW5pdC5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gQVNJT19TU0xfREVUQUlMX09QRU5TU0xfSU5JVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL29wZW5zc2xfdHlwZXMuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvb3BlbnNzbF90eXBlcy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMTQxNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvb3BlbnNzbF90eXBlcy5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLwotLy8gc3NsL2RldGFpbC9vcGVuc3NsX3R5cGVzLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9ERVRBSUxfT1BFTlNTTF9UWVBFU19IUFAKLSNkZWZpbmUgQVNJT19TU0xfREVUQUlMX09QRU5TU0xfVFlQRVNfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLSNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0VOR0lORSkKLSMgaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KLSNlbmRpZiAvLyAhZGVmaW5lZChPUEVOU1NMX05PX0VOR0lORSkKLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc29ja2V0X3R5cGVzLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX0RFVEFJTF9PUEVOU1NMX1RZUEVTX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvcGFzc3dvcmRfY2FsbGJhY2suaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvcGFzc3dvcmRfY2FsbGJhY2suaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzk0MjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL3Bhc3N3b3JkX2NhbGxiYWNrLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vCi0vLyBzc2wvZGV0YWlsL3Bhc3N3b3JkX2NhbGxiYWNrLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfREVUQUlMX1BBU1NXT1JEX0NBTExCQUNLX0hQUAotI2RlZmluZSBBU0lPX1NTTF9ERVRBSUxfUEFTU1dPUkRfQ0FMTEJBQ0tfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotIyBpbmNsdWRlIDxjc3RkZGVmPgotIyBpbmNsdWRlIDxzdHJpbmc+Ci0jIGluY2x1ZGUgImFzaW8vc3NsL2NvbnRleHRfYmFzZS5ocHAiCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi1jbGFzcyBwYXNzd29yZF9jYWxsYmFja19iYXNlCi17Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgfnBhc3N3b3JkX2NhbGxiYWNrX2Jhc2UoKQotICB7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGNhbGwoc3RkOjpzaXplX3Qgc2l6ZSwKLSAgICAgIGNvbnRleHRfYmFzZTo6cGFzc3dvcmRfcHVycG9zZSBwdXJwb3NlKSA9IDA7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc3dvcmRDYWxsYmFjaz4KLWNsYXNzIHBhc3N3b3JkX2NhbGxiYWNrIDogcHVibGljIHBhc3N3b3JkX2NhbGxiYWNrX2Jhc2UKLXsKLXB1YmxpYzoKLSAgZXhwbGljaXQgcGFzc3dvcmRfY2FsbGJhY2soUGFzc3dvcmRDYWxsYmFjayBjYWxsYmFjaykKLSAgICA6IGNhbGxiYWNrXyhjYWxsYmFjaykKLSAgewotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBjYWxsKHN0ZDo6c2l6ZV90IHNpemUsCi0gICAgICBjb250ZXh0X2Jhc2U6OnBhc3N3b3JkX3B1cnBvc2UgcHVycG9zZSkKLSAgewotICAgIHJldHVybiBjYWxsYmFja18oc2l6ZSwgcHVycG9zZSk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgUGFzc3dvcmRDYWxsYmFjayBjYWxsYmFja187Ci19OwotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotfSAvLyBuYW1lc3BhY2UgZGV0YWlsCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX0RFVEFJTF9QQVNTV09SRF9DQUxMQkFDS19IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL3JlYWRfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvcmVhZF9vcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTQ5ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvcmVhZF9vcC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLwotLy8gc3NsL2RldGFpbC9yZWFkX29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9ERVRBSUxfUkVBRF9PUF9IUFAKLSNkZWZpbmUgQVNJT19TU0xfREVUQUlMX1JFQURfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5ocHAiCi0jIGluY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9lbmdpbmUuaHBwIgotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2Ugc3NsIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLWNsYXNzIHJlYWRfb3AKLXsKLXB1YmxpYzoKLSAgcmVhZF9vcChjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gICAgOiBidWZmZXJzXyhidWZmZXJzKQotICB7Ci0gIH0KLQotICBlbmdpbmU6OndhbnQgb3BlcmF0b3IoKShlbmdpbmUmIGVuZywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgc3RkOjpzaXplX3QmIGJ5dGVzX3RyYW5zZmVycmVkKSBjb25zdAotICB7Ci0gICAgYXNpbzo6bXV0YWJsZV9idWZmZXIgYnVmZmVyID0KLSAgICAgIGFzaW86OmRldGFpbDo6YnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXI8YXNpbzo6bXV0YWJsZV9idWZmZXIsCi0gICAgICAgIE11dGFibGVCdWZmZXJTZXF1ZW5jZT46OmZpcnN0KGJ1ZmZlcnNfKTsKLQotICAgIHJldHVybiBlbmcucmVhZChidWZmZXIsIGVjLCBieXRlc190cmFuc2ZlcnJlZCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBjYWxsX2hhbmRsZXIoSGFuZGxlciYgaGFuZGxlciwKLSAgICAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVjLAotICAgICAgY29uc3Qgc3RkOjpzaXplX3QmIGJ5dGVzX3RyYW5zZmVycmVkKSBjb25zdAotICB7Ci0gICAgaGFuZGxlcihlYywgYnl0ZXNfdHJhbnNmZXJyZWQpOwotICB9Ci0KLXByaXZhdGU6Ci0gIE11dGFibGVCdWZmZXJTZXF1ZW5jZSBidWZmZXJzXzsKLX07Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIHNzbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19TU0xfREVUQUlMX1JFQURfT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC9zaHV0ZG93bl9vcC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC9zaHV0ZG93bl9vcC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjdkZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvc2h1dGRvd25fb3AuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8KLS8vIHNzbC9kZXRhaWwvc2h1dGRvd25fb3AuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9ERVRBSUxfU0hVVERPV05fT1BfSFBQCi0jZGVmaW5lIEFTSU9fU1NMX0RFVEFJTF9TSFVURE9XTl9PUF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0jIGluY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9lbmdpbmUuaHBwIgotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2Ugc3NsIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotY2xhc3Mgc2h1dGRvd25fb3AKLXsKLXB1YmxpYzoKLSAgZW5naW5lOjp3YW50IG9wZXJhdG9yKCkoZW5naW5lJiBlbmcsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgIHN0ZDo6c2l6ZV90JiBieXRlc190cmFuc2ZlcnJlZCkgY29uc3QKLSAgewotICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLSAgICByZXR1cm4gZW5nLnNodXRkb3duKGVjKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGNhbGxfaGFuZGxlcihIYW5kbGVyJiBoYW5kbGVyLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICBjb25zdCBzdGQ6OnNpemVfdCYpIGNvbnN0Ci0gIHsKLSAgICBoYW5kbGVyKGVjKTsKLSAgfQotfTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9ERVRBSUxfU0hVVERPV05fT1BfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC9zdHJlYW1fY29yZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC9zdHJlYW1fY29yZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNWM4NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvc3RyZWFtX2NvcmUuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vCi0vLyBzc2wvZGV0YWlsL3N0cmVhbV9jb3JlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfREVUQUlMX1NUUkVBTV9DT1JFX0hQUAotI2RlZmluZSBBU0lPX1NTTF9ERVRBSUxfU1RSRUFNX0NPUkVfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotIyBpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkKLSMgIGluY2x1ZGUgImFzaW8vZGVhZGxpbmVfdGltZXIuaHBwIgotIyBlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfREFURV9USU1FKQotIyAgaW5jbHVkZSAiYXNpby9zdGVhZHlfdGltZXIuaHBwIgotIyBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0RBVEVfVElNRSkKLSMgaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL2VuZ2luZS5ocHAiCi0jIGluY2x1ZGUgImFzaW8vYnVmZmVyLmhwcCIKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLXN0cnVjdCBzdHJlYW1fY29yZQotewotICAvLyBBY2NvcmRpbmcgdG8gdGhlIE9wZW5TU0wgZG9jdW1lbnRhdGlvbiwgdGhpcyBpcyB0aGUgYnVmZmVyIHNpemUgdGhhdCBpcwotICAvLyBzdWZmaWNpZW50IHRvIGhvbGQgdGhlIGxhcmdlc3QgcG9zc2libGUgVExTIHJlY29yZC4KLSAgZW51bSB7IG1heF90bHNfcmVjb3JkX3NpemUgPSAxNyAqIDEwMjQgfTsKLQotICBzdHJlYW1fY29yZShTU0xfQ1RYKiBjb250ZXh0LCBhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogZW5naW5lXyhjb250ZXh0KSwKLSAgICAgIHBlbmRpbmdfcmVhZF8oaW9fc2VydmljZSksCi0gICAgICBwZW5kaW5nX3dyaXRlXyhpb19zZXJ2aWNlKSwKLSAgICAgIG91dHB1dF9idWZmZXJfc3BhY2VfKG1heF90bHNfcmVjb3JkX3NpemUpLAotICAgICAgb3V0cHV0X2J1ZmZlcl8oYXNpbzo6YnVmZmVyKG91dHB1dF9idWZmZXJfc3BhY2VfKSksCi0gICAgICBpbnB1dF9idWZmZXJfc3BhY2VfKG1heF90bHNfcmVjb3JkX3NpemUpLAotICAgICAgaW5wdXRfYnVmZmVyXyhhc2lvOjpidWZmZXIoaW5wdXRfYnVmZmVyX3NwYWNlXykpCi0gIHsKLSAgICBwZW5kaW5nX3JlYWRfLmV4cGlyZXNfYXQobmVnX2luZmluKCkpOwotICAgIHBlbmRpbmdfd3JpdGVfLmV4cGlyZXNfYXQobmVnX2luZmluKCkpOwotICB9Ci0KLSAgfnN0cmVhbV9jb3JlKCkKLSAgewotICB9Ci0KLSAgLy8gVGhlIFNTTCBlbmdpbmUuCi0gIGVuZ2luZSBlbmdpbmVfOwotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19CT09TVF9EQVRFX1RJTUUpCi0gIC8vIFRpbWVyIHVzZWQgZm9yIHN0b3JpbmcgcXVldWVkIHJlYWQgb3BlcmF0aW9ucy4KLSAgYXNpbzo6ZGVhZGxpbmVfdGltZXIgcGVuZGluZ19yZWFkXzsKLQotICAvLyBUaW1lciB1c2VkIGZvciBzdG9yaW5nIHF1ZXVlZCB3cml0ZSBvcGVyYXRpb25zLgotICBhc2lvOjpkZWFkbGluZV90aW1lciBwZW5kaW5nX3dyaXRlXzsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIG9idGFpbmluZyBhIHRpbWUgdmFsdWUgdGhhdCBhbHdheXMgZmlyZXMuCi0gIHN0YXRpYyBhc2lvOjpkZWFkbGluZV90aW1lcjo6dGltZV90eXBlIG5lZ19pbmZpbigpCi0gIHsKLSAgICByZXR1cm4gYm9vc3Q6OnBvc2l4X3RpbWU6Om5lZ19pbmZpbjsKLSAgfQotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiBmb3Igb2J0YWluaW5nIGEgdGltZSB2YWx1ZSB0aGF0IG5ldmVyIGZpcmVzLgotICBzdGF0aWMgYXNpbzo6ZGVhZGxpbmVfdGltZXI6OnRpbWVfdHlwZSBwb3NfaW5maW4oKQotICB7Ci0gICAgcmV0dXJuIGJvb3N0Ojpwb3NpeF90aW1lOjpwb3NfaW5maW47Ci0gIH0KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfREFURV9USU1FKQotICAvLyBUaW1lciB1c2VkIGZvciBzdG9yaW5nIHF1ZXVlZCByZWFkIG9wZXJhdGlvbnMuCi0gIGFzaW86OnN0ZWFkeV90aW1lciBwZW5kaW5nX3JlYWRfOwotCi0gIC8vIFRpbWVyIHVzZWQgZm9yIHN0b3JpbmcgcXVldWVkIHdyaXRlIG9wZXJhdGlvbnMuCi0gIGFzaW86OnN0ZWFkeV90aW1lciBwZW5kaW5nX3dyaXRlXzsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIG9idGFpbmluZyBhIHRpbWUgdmFsdWUgdGhhdCBhbHdheXMgZmlyZXMuCi0gIHN0YXRpYyBhc2lvOjpzdGVhZHlfdGltZXI6OnRpbWVfcG9pbnQgbmVnX2luZmluKCkKLSAgewotICAgIHJldHVybiAoYXNpbzo6c3RlYWR5X3RpbWVyOjp0aW1lX3BvaW50OjptaW4pKCk7Ci0gIH0KLQotICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIG9idGFpbmluZyBhIHRpbWUgdmFsdWUgdGhhdCBuZXZlciBmaXJlcy4KLSAgc3RhdGljIGFzaW86OnN0ZWFkeV90aW1lcjo6dGltZV9wb2ludCBwb3NfaW5maW4oKQotICB7Ci0gICAgcmV0dXJuIChhc2lvOjpzdGVhZHlfdGltZXI6OnRpbWVfcG9pbnQ6Om1heCkoKTsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfREFURV9USU1FKQotCi0gIC8vIEJ1ZmZlciBzcGFjZSB1c2VkIHRvIHByZXBhcmUgb3V0cHV0IGludGVuZGVkIGZvciB0aGUgdHJhbnNwb3J0LgotICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBvdXRwdXRfYnVmZmVyX3NwYWNlXzsKLQotICAvLyBBIGJ1ZmZlciB0aGF0IG1heSBiZSB1c2VkIHRvIHByZXBhcmUgb3V0cHV0IGludGVuZGVkIGZvciB0aGUgdHJhbnNwb3J0LgotICBjb25zdCBhc2lvOjptdXRhYmxlX2J1ZmZlcnNfMSBvdXRwdXRfYnVmZmVyXzsKLQotICAvLyBCdWZmZXIgc3BhY2UgdXNlZCB0byByZWFkIGlucHV0IGludGVuZGVkIGZvciB0aGUgZW5naW5lLgotICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBpbnB1dF9idWZmZXJfc3BhY2VfOwotCi0gIC8vIEEgYnVmZmVyIHRoYXQgbWF5IGJlIHVzZWQgdG8gcmVhZCBpbnB1dCBpbnRlbmRlZCBmb3IgdGhlIGVuZ2luZS4KLSAgY29uc3QgYXNpbzo6bXV0YWJsZV9idWZmZXJzXzEgaW5wdXRfYnVmZmVyXzsKLQotICAvLyBUaGUgYnVmZmVyIHBvaW50aW5nIHRvIHRoZSBlbmdpbmUncyB1bmNvbnN1bWVkIGlucHV0LgotICBhc2lvOjpjb25zdF9idWZmZXIgaW5wdXRfOwotfTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9ERVRBSUxfU1RSRUFNX0NPUkVfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC92ZXJpZnlfY2FsbGJhY2suaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvdmVyaWZ5X2NhbGxiYWNrLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0NmI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2RldGFpbC92ZXJpZnlfY2FsbGJhY2suaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8KLS8vIHNzbC9kZXRhaWwvdmVyaWZ5X2NhbGxiYWNrLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfREVUQUlMX1ZFUklGWV9DQUxMQkFDS19IUFAKLSNkZWZpbmUgQVNJT19TU0xfREVUQUlMX1ZFUklGWV9DQUxMQkFDS19IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0jIGluY2x1ZGUgImFzaW8vc3NsL3ZlcmlmeV9jb250ZXh0LmhwcCIKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLWNsYXNzIHZlcmlmeV9jYWxsYmFja19iYXNlCi17Ci1wdWJsaWM6Ci0gIHZpcnR1YWwgfnZlcmlmeV9jYWxsYmFja19iYXNlKCkKLSAgewotICB9Ci0KLSAgdmlydHVhbCBib29sIGNhbGwoYm9vbCBwcmV2ZXJpZmllZCwgdmVyaWZ5X2NvbnRleHQmIGN0eCkgPSAwOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFZlcmlmeUNhbGxiYWNrPgotY2xhc3MgdmVyaWZ5X2NhbGxiYWNrIDogcHVibGljIHZlcmlmeV9jYWxsYmFja19iYXNlCi17Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IHZlcmlmeV9jYWxsYmFjayhWZXJpZnlDYWxsYmFjayBjYWxsYmFjaykKLSAgICA6IGNhbGxiYWNrXyhjYWxsYmFjaykKLSAgewotICB9Ci0KLSAgdmlydHVhbCBib29sIGNhbGwoYm9vbCBwcmV2ZXJpZmllZCwgdmVyaWZ5X2NvbnRleHQmIGN0eCkKLSAgewotICAgIHJldHVybiBjYWxsYmFja18ocHJldmVyaWZpZWQsIGN0eCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgVmVyaWZ5Q2FsbGJhY2sgY2FsbGJhY2tfOwotfTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9ERVRBSUxfVkVSSUZZX0NBTExCQUNLX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvd3JpdGVfb3AuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9kZXRhaWwvd3JpdGVfb3AuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmZlYjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvZGV0YWlsL3dyaXRlX29wLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vCi0vLyBzc2wvZGV0YWlsL3dyaXRlX29wLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfREVUQUlMX1dSSVRFX09QX0hQUAotI2RlZmluZSBBU0lPX1NTTF9ERVRBSUxfV1JJVEVfT1BfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5ocHAiCi0jIGluY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9lbmdpbmUuaHBwIgotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2Ugc3NsIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi0jaWYgIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci1jbGFzcyB3cml0ZV9vcAotewotcHVibGljOgotICB3cml0ZV9vcChjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotICAgIDogYnVmZmVyc18oYnVmZmVycykKLSAgewotICB9Ci0KLSAgZW5naW5lOjp3YW50IG9wZXJhdG9yKCkoZW5naW5lJiBlbmcsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgIHN0ZDo6c2l6ZV90JiBieXRlc190cmFuc2ZlcnJlZCkgY29uc3QKLSAgewotICAgIGFzaW86OmNvbnN0X2J1ZmZlciBidWZmZXIgPQotICAgICAgYXNpbzo6ZGV0YWlsOjpidWZmZXJfc2VxdWVuY2VfYWRhcHRlcjxhc2lvOjpjb25zdF9idWZmZXIsCi0gICAgICAgIENvbnN0QnVmZmVyU2VxdWVuY2U+OjpmaXJzdChidWZmZXJzXyk7Ci0KLSAgICByZXR1cm4gZW5nLndyaXRlKGJ1ZmZlciwgZWMsIGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIGNhbGxfaGFuZGxlcihIYW5kbGVyJiBoYW5kbGVyLAotICAgICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZWMsCi0gICAgICBjb25zdCBzdGQ6OnNpemVfdCYgYnl0ZXNfdHJhbnNmZXJyZWQpIGNvbnN0Ci0gIHsKLSAgICBoYW5kbGVyKGVjLCBieXRlc190cmFuc2ZlcnJlZCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgQ29uc3RCdWZmZXJTZXF1ZW5jZSBidWZmZXJzXzsKLX07Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIHNzbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19TU0xfREVUQUlMX1dSSVRFX09QX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9lcnJvci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2Vycm9yLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4NWQyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2Vycm9yLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vCi0vLyBzc2wvZXJyb3IuaHBwCi0vLyB+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX0VSUk9SX0hQUAotI2RlZmluZSBBU0lPX1NTTF9FUlJPUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yX2NvZGUuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIGVycm9yIHsKLQotZW51bSBzc2xfZXJyb3JzCi17Ci19OwotCi1leHRlcm4gQVNJT19ERUNMCi1jb25zdCBhc2lvOjplcnJvcl9jYXRlZ29yeSYgZ2V0X3NzbF9jYXRlZ29yeSgpOwotCi1zdGF0aWMgY29uc3QgYXNpbzo6ZXJyb3JfY2F0ZWdvcnkmIHNzbF9jYXRlZ29yeQotICA9IGFzaW86OmVycm9yOjpnZXRfc3NsX2NhdGVnb3J5KCk7Ci0KLX0gLy8gbmFtZXNwYWNlIGVycm9yCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi1uYW1lc3BhY2Ugc3RkIHsKLQotdGVtcGxhdGU8PiBzdHJ1Y3QgaXNfZXJyb3JfY29kZV9lbnVtPGFzaW86OmVycm9yOjpzc2xfZXJyb3JzPgotewotICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBzdGQKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBlcnJvciB7Ci0KLWlubGluZSBhc2lvOjplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShzc2xfZXJyb3JzIGUpCi17Ci0gIHJldHVybiBhc2lvOjplcnJvcl9jb2RlKAotICAgICAgc3RhdGljX2Nhc3Q8aW50PihlKSwgZ2V0X3NzbF9jYXRlZ29yeSgpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgZXJyb3IKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgaW5jbHVkZSAiYXNpby9zc2wvaW1wbC9lcnJvci5pcHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hFQURFUl9PTkxZKQotCi0jZW5kaWYgLy8gQVNJT19TU0xfRVJST1JfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2ltcGwvY29udGV4dC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2ltcGwvY29udGV4dC5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjIzZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9pbXBsL2NvbnRleHQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8KLS8vIHNzbC9pbXBsL2NvbnRleHQuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwNSBWb2lwc3RlciAvIEluZHJlayBkb3QgSnVoYW5pIGF0IHZvaXBzdGVyIGRvdCBjb20KLS8vIENvcHlyaWdodCAoYykgMjAwNS0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9JTVBMX0NPTlRFWFRfSFBQCi0jZGVmaW5lIEFTSU9fU1NMX0lNUExfQ09OVEVYVF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVmVyaWZ5Q2FsbGJhY2s+Ci12b2lkIGNvbnRleHQ6OnNldF92ZXJpZnlfY2FsbGJhY2soVmVyaWZ5Q2FsbGJhY2sgY2FsbGJhY2spCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHRoaXMtPnNldF92ZXJpZnlfY2FsbGJhY2soY2FsbGJhY2ssIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNldF92ZXJpZnlfY2FsbGJhY2siKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFZlcmlmeUNhbGxiYWNrPgotYXNpbzo6ZXJyb3JfY29kZSBjb250ZXh0OjpzZXRfdmVyaWZ5X2NhbGxiYWNrKAotICAgIFZlcmlmeUNhbGxiYWNrIGNhbGxiYWNrLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgcmV0dXJuIGRvX3NldF92ZXJpZnlfY2FsbGJhY2soCi0gICAgICBuZXcgZGV0YWlsOjp2ZXJpZnlfY2FsbGJhY2s8VmVyaWZ5Q2FsbGJhY2s+KGNhbGxiYWNrKSwgZWMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc3dvcmRDYWxsYmFjaz4KLXZvaWQgY29udGV4dDo6c2V0X3Bhc3N3b3JkX2NhbGxiYWNrKFBhc3N3b3JkQ2FsbGJhY2sgY2FsbGJhY2spCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHRoaXMtPnNldF9wYXNzd29yZF9jYWxsYmFjayhjYWxsYmFjaywgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic2V0X3Bhc3N3b3JkX2NhbGxiYWNrIik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQYXNzd29yZENhbGxiYWNrPgotYXNpbzo6ZXJyb3JfY29kZSBjb250ZXh0OjpzZXRfcGFzc3dvcmRfY2FsbGJhY2soCi0gICAgUGFzc3dvcmRDYWxsYmFjayBjYWxsYmFjaywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIHJldHVybiBkb19zZXRfcGFzc3dvcmRfY2FsbGJhY2soCi0gICAgICBuZXcgZGV0YWlsOjpwYXNzd29yZF9jYWxsYmFjazxQYXNzd29yZENhbGxiYWNrPihjYWxsYmFjayksIGVjKTsKLX0KLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLX0gLy8gbmFtZXNwYWNlIHNzbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19TU0xfSU1QTF9DT05URVhUX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9pbXBsL2NvbnRleHQuaXBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9pbXBsL2NvbnRleHQuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTY2YTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvaW1wbC9jb250ZXh0LmlwcAorKysgL2Rldi9udWxsCkBAIC0xLDk3NCArMCwwIEBACi0vLwotLy8gc3NsL2ltcGwvY29udGV4dC5pcHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDA1IFZvaXBzdGVyIC8gSW5kcmVrIGRvdCBKdWhhbmkgYXQgdm9pcHN0ZXIgZG90IGNvbQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX0lNUExfQ09OVEVYVF9JUFAKLSNkZWZpbmUgQVNJT19TU0xfSU1QTF9DT05URVhUX0lQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLSMgaW5jbHVkZSA8Y3N0cmluZz4KLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotIyBpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSMgaW5jbHVkZSAiYXNpby9zc2wvY29udGV4dC5ocHAiCi0jIGluY2x1ZGUgImFzaW8vc3NsL2Vycm9yLmhwcCIKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi1zdHJ1Y3QgY29udGV4dDo6YmlvX2NsZWFudXAKLXsKLSAgQklPKiBwOwotICB+YmlvX2NsZWFudXAoKSB7IGlmIChwKSA6OkJJT19mcmVlKHApOyB9Ci19OwotCi1zdHJ1Y3QgY29udGV4dDo6eDUwOV9jbGVhbnVwCi17Ci0gIFg1MDkqIHA7Ci0gIH54NTA5X2NsZWFudXAoKSB7IGlmIChwKSA6Olg1MDlfZnJlZShwKTsgfQotfTsKLQotc3RydWN0IGNvbnRleHQ6OmV2cF9wa2V5X2NsZWFudXAKLXsKLSAgRVZQX1BLRVkqIHA7Ci0gIH5ldnBfcGtleV9jbGVhbnVwKCkgeyBpZiAocCkgOjpFVlBfUEtFWV9mcmVlKHApOyB9Ci19OwotCi1zdHJ1Y3QgY29udGV4dDo6cnNhX2NsZWFudXAKLXsKLSAgUlNBKiBwOwotICB+cnNhX2NsZWFudXAoKSB7IGlmIChwKSA6OlJTQV9mcmVlKHApOyB9Ci19OwotCi1zdHJ1Y3QgY29udGV4dDo6ZGhfY2xlYW51cAotewotICBESCogcDsKLSAgfmRoX2NsZWFudXAoKSB7IGlmIChwKSA6OkRIX2ZyZWUocCk7IH0KLX07Ci0KLWNvbnRleHQ6OmNvbnRleHQoY29udGV4dDo6bWV0aG9kIG0pCi0gIDogaGFuZGxlXygwKQotewotICA6OkVSUl9jbGVhcl9lcnJvcigpOwotCi0gIHN3aXRjaCAobSkKLSAgewotI2lmIGRlZmluZWQoT1BFTlNTTF9OT19TU0wyKQotICBjYXNlIGNvbnRleHQ6OnNzbHYyOgotICBjYXNlIGNvbnRleHQ6OnNzbHYyX2NsaWVudDoKLSAgY2FzZSBjb250ZXh0Ojpzc2x2Ml9zZXJ2ZXI6Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcigKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQsICJjb250ZXh0Iik7Ci0gICAgYnJlYWs7Ci0jZWxzZSAvLyBkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMikKLSAgY2FzZSBjb250ZXh0Ojpzc2x2MjoKLSAgICBoYW5kbGVfID0gOjpTU0xfQ1RYX25ldyg6OlNTTHYyX21ldGhvZCgpKTsKLSAgICBicmVhazsKLSAgY2FzZSBjb250ZXh0Ojpzc2x2Ml9jbGllbnQ6Ci0gICAgaGFuZGxlXyA9IDo6U1NMX0NUWF9uZXcoOjpTU0x2Ml9jbGllbnRfbWV0aG9kKCkpOwotICAgIGJyZWFrOwotICBjYXNlIGNvbnRleHQ6OnNzbHYyX3NlcnZlcjoKLSAgICBoYW5kbGVfID0gOjpTU0xfQ1RYX25ldyg6OlNTTHYyX3NlcnZlcl9tZXRob2QoKSk7Ci0gICAgYnJlYWs7Ci0jZW5kaWYgLy8gZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpCi0gIGNhc2UgY29udGV4dDo6c3NsdjM6Ci0gICAgaGFuZGxlXyA9IDo6U1NMX0NUWF9uZXcoOjpTU0x2M19tZXRob2QoKSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgY29udGV4dDo6c3NsdjNfY2xpZW50OgotICAgIGhhbmRsZV8gPSA6OlNTTF9DVFhfbmV3KDo6U1NMdjNfY2xpZW50X21ldGhvZCgpKTsKLSAgICBicmVhazsKLSAgY2FzZSBjb250ZXh0Ojpzc2x2M19zZXJ2ZXI6Ci0gICAgaGFuZGxlXyA9IDo6U1NMX0NUWF9uZXcoOjpTU0x2M19zZXJ2ZXJfbWV0aG9kKCkpOwotICAgIGJyZWFrOwotICBjYXNlIGNvbnRleHQ6OnRsc3YxOgotICAgIGhhbmRsZV8gPSA6OlNTTF9DVFhfbmV3KDo6VExTdjFfbWV0aG9kKCkpOwotICAgIGJyZWFrOwotICBjYXNlIGNvbnRleHQ6OnRsc3YxX2NsaWVudDoKLSAgICBoYW5kbGVfID0gOjpTU0xfQ1RYX25ldyg6OlRMU3YxX2NsaWVudF9tZXRob2QoKSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgY29udGV4dDo6dGxzdjFfc2VydmVyOgotICAgIGhhbmRsZV8gPSA6OlNTTF9DVFhfbmV3KDo6VExTdjFfc2VydmVyX21ldGhvZCgpKTsKLSAgICBicmVhazsKLSAgY2FzZSBjb250ZXh0Ojpzc2x2MjM6Ci0gICAgaGFuZGxlXyA9IDo6U1NMX0NUWF9uZXcoOjpTU0x2MjNfbWV0aG9kKCkpOwotICAgIGJyZWFrOwotICBjYXNlIGNvbnRleHQ6OnNzbHYyM19jbGllbnQ6Ci0gICAgaGFuZGxlXyA9IDo6U1NMX0NUWF9uZXcoOjpTU0x2MjNfY2xpZW50X21ldGhvZCgpKTsKLSAgICBicmVhazsKLSAgY2FzZSBjb250ZXh0Ojpzc2x2MjNfc2VydmVyOgotICAgIGhhbmRsZV8gPSA6OlNTTF9DVFhfbmV3KDo6U1NMdjIzX3NlcnZlcl9tZXRob2QoKSk7Ci0gICAgYnJlYWs7Ci0jaWYgZGVmaW5lZChTU0xfVFhUX1RMU1YxXzEpCi0gIGNhc2UgY29udGV4dDo6dGxzdjExOgotICAgIGhhbmRsZV8gPSA6OlNTTF9DVFhfbmV3KDo6VExTdjFfMV9tZXRob2QoKSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgY29udGV4dDo6dGxzdjExX2NsaWVudDoKLSAgICBoYW5kbGVfID0gOjpTU0xfQ1RYX25ldyg6OlRMU3YxXzFfY2xpZW50X21ldGhvZCgpKTsKLSAgICBicmVhazsKLSAgY2FzZSBjb250ZXh0Ojp0bHN2MTFfc2VydmVyOgotICAgIGhhbmRsZV8gPSA6OlNTTF9DVFhfbmV3KDo6VExTdjFfMV9zZXJ2ZXJfbWV0aG9kKCkpOwotICAgIGJyZWFrOwotI2Vsc2UgLy8gZGVmaW5lZChTU0xfVFhUX1RMU1YxXzEpCi0gIGNhc2UgY29udGV4dDo6dGxzdjExOgotICBjYXNlIGNvbnRleHQ6OnRsc3YxMV9jbGllbnQ6Ci0gIGNhc2UgY29udGV4dDo6dGxzdjExX3NlcnZlcjoKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKAotICAgICAgICBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudCwgImNvbnRleHQiKTsKLSAgICBicmVhazsKLSNlbmRpZiAvLyBkZWZpbmVkKFNTTF9UWFRfVExTVjFfMSkKLSNpZiBkZWZpbmVkKFNTTF9UWFRfVExTVjFfMikKLSAgY2FzZSBjb250ZXh0Ojp0bHN2MTI6Ci0gICAgaGFuZGxlXyA9IDo6U1NMX0NUWF9uZXcoOjpUTFN2MV8yX21ldGhvZCgpKTsKLSAgICBicmVhazsKLSAgY2FzZSBjb250ZXh0Ojp0bHN2MTJfY2xpZW50OgotICAgIGhhbmRsZV8gPSA6OlNTTF9DVFhfbmV3KDo6VExTdjFfMl9jbGllbnRfbWV0aG9kKCkpOwotICAgIGJyZWFrOwotICBjYXNlIGNvbnRleHQ6OnRsc3YxMl9zZXJ2ZXI6Ci0gICAgaGFuZGxlXyA9IDo6U1NMX0NUWF9uZXcoOjpUTFN2MV8yX3NlcnZlcl9tZXRob2QoKSk7Ci0gICAgYnJlYWs7Ci0jZWxzZSAvLyBkZWZpbmVkKFNTTF9UWFRfVExTVjFfMikgCi0gIGNhc2UgY29udGV4dDo6dGxzdjEyOgotICBjYXNlIGNvbnRleHQ6OnRsc3YxMl9jbGllbnQ6Ci0gIGNhc2UgY29udGV4dDo6dGxzdjEyX3NlcnZlcjoKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKAotICAgICAgICBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudCwgImNvbnRleHQiKTsKLSAgICBicmVhazsKLSNlbmRpZiAvLyBkZWZpbmVkKFNTTF9UWFRfVExTVjFfMikgCi0gIGRlZmF1bHQ6Ci0gICAgaGFuZGxlXyA9IDo6U1NMX0NUWF9uZXcoMCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoaGFuZGxlXyA9PSAwKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYygKLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pig6OkVSUl9nZXRfZXJyb3IoKSksCi0gICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3NsX2NhdGVnb3J5KCkpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJjb250ZXh0Iik7Ci0gIH0KLQotICBzZXRfb3B0aW9ucyhub19jb21wcmVzc2lvbik7Ci19Ci0KLWNvbnRleHQ6OmNvbnRleHQoYXNpbzo6aW9fc2VydmljZSYsIGNvbnRleHQ6Om1ldGhvZCBtKQotICA6IGhhbmRsZV8oMCkKLXsKLSAgY29udGV4dCB0bXAobSk7Ci0gIGhhbmRsZV8gPSB0bXAuaGFuZGxlXzsKLSAgdG1wLmhhbmRsZV8gPSAwOwotfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKSB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLWNvbnRleHQ6OmNvbnRleHQoY29udGV4dCYmIG90aGVyKQotewotICBoYW5kbGVfID0gb3RoZXIuaGFuZGxlXzsKLSAgb3RoZXIuaGFuZGxlXyA9IDA7Ci19Ci0KLWNvbnRleHQmIGNvbnRleHQ6Om9wZXJhdG9yPShjb250ZXh0JiYgb3RoZXIpCi17Ci0gIGNvbnRleHQgdG1wKEFTSU9fTU9WRV9DQVNUKGNvbnRleHQpKCp0aGlzKSk7Ci0gIGhhbmRsZV8gPSBvdGhlci5oYW5kbGVfOwotICBvdGhlci5oYW5kbGVfID0gMDsKLSAgcmV0dXJuICp0aGlzOwotfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLWNvbnRleHQ6On5jb250ZXh0KCkKLXsKLSAgaWYgKGhhbmRsZV8pCi0gIHsKLSAgICBpZiAoaGFuZGxlXy0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpCi0gICAgewotICAgICAgZGV0YWlsOjpwYXNzd29yZF9jYWxsYmFja19iYXNlKiBjYWxsYmFjayA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGRldGFpbDo6cGFzc3dvcmRfY2FsbGJhY2tfYmFzZSo+KAotICAgICAgICAgICAgaGFuZGxlXy0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpOwotICAgICAgZGVsZXRlIGNhbGxiYWNrOwotICAgICAgaGFuZGxlXy0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEgPSAwOwotICAgIH0KLQotICAgIGlmIChTU0xfQ1RYX2dldF9hcHBfZGF0YShoYW5kbGVfKSkKLSAgICB7Ci0gICAgICBkZXRhaWw6OnZlcmlmeV9jYWxsYmFja19iYXNlKiBjYWxsYmFjayA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGRldGFpbDo6dmVyaWZ5X2NhbGxiYWNrX2Jhc2UqPigKLSAgICAgICAgICAgIFNTTF9DVFhfZ2V0X2FwcF9kYXRhKGhhbmRsZV8pKTsKLSAgICAgIGRlbGV0ZSBjYWxsYmFjazsKLSAgICAgIFNTTF9DVFhfc2V0X2FwcF9kYXRhKGhhbmRsZV8sIDApOwotICAgIH0KLQotICAgIDo6U1NMX0NUWF9mcmVlKGhhbmRsZV8pOwotICB9Ci19Ci0KLWNvbnRleHQ6Om5hdGl2ZV9oYW5kbGVfdHlwZSBjb250ZXh0OjpuYXRpdmVfaGFuZGxlKCkKLXsKLSAgcmV0dXJuIGhhbmRsZV87Ci19Ci0KLWNvbnRleHQ6OmltcGxfdHlwZSBjb250ZXh0OjppbXBsKCkKLXsKLSAgcmV0dXJuIGhhbmRsZV87Ci19Ci0KLXZvaWQgY29udGV4dDo6Y2xlYXJfb3B0aW9ucyhjb250ZXh0OjpvcHRpb25zIG8pCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIGNsZWFyX29wdGlvbnMobywgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiY2xlYXJfb3B0aW9ucyIpOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIGNvbnRleHQ6OmNsZWFyX29wdGlvbnMoCi0gICAgY29udGV4dDo6b3B0aW9ucyBvLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MERGTCkgXAotICAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiAhPSAweDAwOTA5MDAwTCkKLSMgaWYgIWRlZmluZWQoU1NMX09QX05PX0NPTVBSRVNTSU9OKQotICBpZiAoKG8gJiBjb250ZXh0Ojpub19jb21wcmVzc2lvbikgIT0gMCkKLSAgewotIyBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDAwTCkKLSAgICBoYW5kbGVfLT5jb21wX21ldGhvZHMgPSBTU0xfQ09NUF9nZXRfY29tcHJlc3Npb25fbWV0aG9kcygpOwotIyBlbmRpZiAvLyAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDAwTCkKLSAgICBvIF49IGNvbnRleHQ6Om5vX2NvbXByZXNzaW9uOwotICB9Ci0jIGVuZGlmIC8vICFkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikKLQotICA6OlNTTF9DVFhfY2xlYXJfb3B0aW9ucyhoYW5kbGVfLCBvKTsKLQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSNlbHNlIC8vIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDgwREZMKQotICAgICAgLy8gICAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiAhPSAweDAwOTA5MDAwTCkKLSAgKHZvaWQpbzsKLSAgZWMgPSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX25vdF9zdXBwb3J0ZWQ7Ci0jZW5kaWYgLy8gKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwODBERkwpCi0gICAgICAgLy8gICAmJiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiAhPSAweDAwOTA5MDAwTCkKLSAgcmV0dXJuIGVjOwotfQotCi12b2lkIGNvbnRleHQ6OnNldF9vcHRpb25zKGNvbnRleHQ6Om9wdGlvbnMgbykKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc2V0X29wdGlvbnMobywgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic2V0X29wdGlvbnMiKTsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBjb250ZXh0OjpzZXRfb3B0aW9ucygKLSAgICBjb250ZXh0OjpvcHRpb25zIG8sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotI2lmICFkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikKLSAgaWYgKChvICYgY29udGV4dDo6bm9fY29tcHJlc3Npb24pICE9IDApCi0gIHsKLSNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDAwOTA4MDAwTCkKLSAgICBoYW5kbGVfLT5jb21wX21ldGhvZHMgPQotICAgICAgYXNpbzo6c3NsOjpkZXRhaWw6Om9wZW5zc2xfaW5pdDw+OjpnZXRfbnVsbF9jb21wcmVzc2lvbl9tZXRob2RzKCk7Ci0jZW5kaWYgLy8gKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwODAwMEwpCi0gICAgbyBePSBjb250ZXh0Ojpub19jb21wcmVzc2lvbjsKLSAgfQotI2VuZGlmIC8vICFkZWZpbmVkKFNTTF9PUF9OT19DT01QUkVTU0lPTikKLQotICA6OlNTTF9DVFhfc2V0X29wdGlvbnMoaGFuZGxlXywgbyk7Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotdm9pZCBjb250ZXh0OjpzZXRfdmVyaWZ5X21vZGUodmVyaWZ5X21vZGUgdikKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc2V0X3ZlcmlmeV9tb2RlKHYsIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNldF92ZXJpZnlfbW9kZSIpOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIGNvbnRleHQ6OnNldF92ZXJpZnlfbW9kZSgKLSAgICB2ZXJpZnlfbW9kZSB2LCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgOjpTU0xfQ1RYX3NldF92ZXJpZnkoaGFuZGxlXywgdiwgOjpTU0xfQ1RYX2dldF92ZXJpZnlfY2FsbGJhY2soaGFuZGxlXykpOwotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLXZvaWQgY29udGV4dDo6c2V0X3ZlcmlmeV9kZXB0aChpbnQgZGVwdGgpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHNldF92ZXJpZnlfZGVwdGgoZGVwdGgsIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNldF92ZXJpZnlfZGVwdGgiKTsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBjb250ZXh0OjpzZXRfdmVyaWZ5X2RlcHRoKAotICAgIGludCBkZXB0aCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIDo6U1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKGhhbmRsZV8sIGRlcHRoKTsKLQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi12b2lkIGNvbnRleHQ6OmxvYWRfdmVyaWZ5X2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICBsb2FkX3ZlcmlmeV9maWxlKGZpbGVuYW1lLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJsb2FkX3ZlcmlmeV9maWxlIik7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgY29udGV4dDo6bG9hZF92ZXJpZnlfZmlsZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICA6OkVSUl9jbGVhcl9lcnJvcigpOwotCi0gIGlmICg6OlNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGhhbmRsZV8sIGZpbGVuYW1lLmNfc3RyKCksIDApICE9IDEpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoCi0gICAgICAgIHN0YXRpY19jYXN0PGludD4oOjpFUlJfZ2V0X2Vycm9yKCkpLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3NzbF9jYXRlZ29yeSgpKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi12b2lkIGNvbnRleHQ6OmFkZF9jZXJ0aWZpY2F0ZV9hdXRob3JpdHkoY29uc3QgY29uc3RfYnVmZmVyJiBjYSkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgYWRkX2NlcnRpZmljYXRlX2F1dGhvcml0eShjYSwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiYWRkX2NlcnRpZmljYXRlX2F1dGhvcml0eSIpOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIGNvbnRleHQ6OmFkZF9jZXJ0aWZpY2F0ZV9hdXRob3JpdHkoCi0gICAgY29uc3QgY29uc3RfYnVmZmVyJiBjYSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIDo6RVJSX2NsZWFyX2Vycm9yKCk7Ci0KLSAgYmlvX2NsZWFudXAgYmlvID0geyBtYWtlX2J1ZmZlcl9iaW8oY2EpIH07Ci0gIGlmIChiaW8ucCkKLSAgewotICAgIHg1MDlfY2xlYW51cCBjZXJ0ID0geyA6OlBFTV9yZWFkX2Jpb19YNTA5KGJpby5wLCAwLCAwLCAwKSB9OwotICAgIGlmIChjZXJ0LnApCi0gICAgewotICAgICAgaWYgKFg1MDlfU1RPUkUqIHN0b3JlID0gOjpTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKGhhbmRsZV8pKQotICAgICAgewotICAgICAgICBpZiAoOjpYNTA5X1NUT1JFX2FkZF9jZXJ0KHN0b3JlLCBjZXJ0LnApID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgICAgICByZXR1cm4gZWM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KDo6RVJSX2dldF9lcnJvcigpKSwKLSAgICAgIGFzaW86OmVycm9yOjpnZXRfc3NsX2NhdGVnb3J5KCkpOwotICByZXR1cm4gZWM7Ci19Ci0KLXZvaWQgY29udGV4dDo6c2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKCkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyIpOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIGNvbnRleHQ6OnNldF9kZWZhdWx0X3ZlcmlmeV9wYXRocygKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgOjpFUlJfY2xlYXJfZXJyb3IoKTsKLQotICBpZiAoOjpTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhoYW5kbGVfKSAhPSAxKQotICB7Ci0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKAotICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KDo6RVJSX2dldF9lcnJvcigpKSwKLSAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zc2xfY2F0ZWdvcnkoKSk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotdm9pZCBjb250ZXh0OjphZGRfdmVyaWZ5X3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIGFkZF92ZXJpZnlfcGF0aChwYXRoLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJhZGRfdmVyaWZ5X3BhdGgiKTsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBjb250ZXh0OjphZGRfdmVyaWZ5X3BhdGgoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICA6OkVSUl9jbGVhcl9lcnJvcigpOwotCi0gIGlmICg6OlNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGhhbmRsZV8sIDAsIHBhdGguY19zdHIoKSkgIT0gMSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pig6OkVSUl9nZXRfZXJyb3IoKSksCi0gICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3NsX2NhdGVnb3J5KCkpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLXZvaWQgY29udGV4dDo6dXNlX2NlcnRpZmljYXRlKAotICAgIGNvbnN0IGNvbnN0X2J1ZmZlciYgY2VydGlmaWNhdGUsIGZpbGVfZm9ybWF0IGZvcm1hdCkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgdXNlX2NlcnRpZmljYXRlKGNlcnRpZmljYXRlLCBmb3JtYXQsIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInVzZV9jZXJ0aWZpY2F0ZSIpOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIGNvbnRleHQ6OnVzZV9jZXJ0aWZpY2F0ZSgKLSAgICBjb25zdCBjb25zdF9idWZmZXImIGNlcnRpZmljYXRlLCBmaWxlX2Zvcm1hdCBmb3JtYXQsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIDo6RVJSX2NsZWFyX2Vycm9yKCk7Ci0KLSAgaWYgKGZvcm1hdCA9PSBjb250ZXh0X2Jhc2U6OmFzbjEpCi0gIHsKLSAgICBpZiAoOjpTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9BU04xKGhhbmRsZV8sCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihidWZmZXJfc2l6ZShjZXJ0aWZpY2F0ZSkpLAotICAgICAgICAgIGJ1ZmZlcl9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihjZXJ0aWZpY2F0ZSkpID09IDEpCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgICByZXR1cm4gZWM7Ci0gICAgfQotICB9Ci0gIGVsc2UgaWYgKGZvcm1hdCA9PSBjb250ZXh0X2Jhc2U6OnBlbSkKLSAgewotICAgIGJpb19jbGVhbnVwIGJpbyA9IHsgbWFrZV9idWZmZXJfYmlvKGNlcnRpZmljYXRlKSB9OwotICAgIGlmIChiaW8ucCkKLSAgICB7Ci0gICAgICB4NTA5X2NsZWFudXAgY2VydCA9IHsgOjpQRU1fcmVhZF9iaW9fWDUwOShiaW8ucCwgMCwgMCwgMCkgfTsKLSAgICAgIGlmIChjZXJ0LnApCi0gICAgICB7Ci0gICAgICAgIGlmICg6OlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKGhhbmRsZV8sIGNlcnQucCkgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgICAgIHJldHVybiBlYzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgIHN0YXRpY19jYXN0PGludD4oOjpFUlJfZ2V0X2Vycm9yKCkpLAotICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zc2xfY2F0ZWdvcnkoKSk7Ci0gIHJldHVybiBlYzsKLX0KLQotdm9pZCBjb250ZXh0Ojp1c2VfY2VydGlmaWNhdGVfZmlsZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGZpbGVfZm9ybWF0IGZvcm1hdCkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgdXNlX2NlcnRpZmljYXRlX2ZpbGUoZmlsZW5hbWUsIGZvcm1hdCwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAidXNlX2NlcnRpZmljYXRlX2ZpbGUiKTsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBjb250ZXh0Ojp1c2VfY2VydGlmaWNhdGVfZmlsZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGZpbGVfZm9ybWF0IGZvcm1hdCwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaW50IGZpbGVfdHlwZTsKLSAgc3dpdGNoIChmb3JtYXQpCi0gIHsKLSAgY2FzZSBjb250ZXh0X2Jhc2U6OmFzbjE6Ci0gICAgZmlsZV90eXBlID0gU1NMX0ZJTEVUWVBFX0FTTjE7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgY29udGV4dF9iYXNlOjpwZW06Ci0gICAgZmlsZV90eXBlID0gU1NMX0ZJTEVUWVBFX1BFTTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgcmV0dXJuIGVjOwotICAgIH0KLSAgfQotCi0gIDo6RVJSX2NsZWFyX2Vycm9yKCk7Ci0KLSAgaWYgKDo6U1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShoYW5kbGVfLCBmaWxlbmFtZS5jX3N0cigpLCBmaWxlX3R5cGUpICE9IDEpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoCi0gICAgICAgIHN0YXRpY19jYXN0PGludD4oOjpFUlJfZ2V0X2Vycm9yKCkpLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3NzbF9jYXRlZ29yeSgpKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi12b2lkIGNvbnRleHQ6OnVzZV9jZXJ0aWZpY2F0ZV9jaGFpbihjb25zdCBjb25zdF9idWZmZXImIGNoYWluKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICB1c2VfY2VydGlmaWNhdGVfY2hhaW4oY2hhaW4sIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInVzZV9jZXJ0aWZpY2F0ZV9jaGFpbiIpOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIGNvbnRleHQ6OnVzZV9jZXJ0aWZpY2F0ZV9jaGFpbigKLSAgICBjb25zdCBjb25zdF9idWZmZXImIGNoYWluLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgOjpFUlJfY2xlYXJfZXJyb3IoKTsKLQotICBiaW9fY2xlYW51cCBiaW8gPSB7IG1ha2VfYnVmZmVyX2JpbyhjaGFpbikgfTsKLSAgaWYgKGJpby5wKQotICB7Ci0gICAgeDUwOV9jbGVhbnVwIGNlcnQgPSB7Ci0gICAgICA6OlBFTV9yZWFkX2Jpb19YNTA5X0FVWChiaW8ucCwgMCwKLSAgICAgICAgICBoYW5kbGVfLT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjaywKLSAgICAgICAgICBoYW5kbGVfLT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSkgfTsKLSAgICBpZiAoIWNlcnQucCkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoRVJSX1JfUEVNX0xJQiwKLSAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3NzbF9jYXRlZ29yeSgpKTsKLSAgICAgIHJldHVybiBlYzsKLSAgICB9Ci0KLSAgICBpbnQgcmVzdWx0ID0gOjpTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZShoYW5kbGVfLCBjZXJ0LnApOwotICAgIGlmIChyZXN1bHQgPT0gMCB8fCA6OkVSUl9wZWVrX2Vycm9yKCkgIT0gMCkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pig6OkVSUl9nZXRfZXJyb3IoKSksCi0gICAgICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zc2xfY2F0ZWdvcnkoKSk7Ci0gICAgICByZXR1cm4gZWM7Ci0gICAgfQotCi0gICAgaWYgKGhhbmRsZV8tPmV4dHJhX2NlcnRzKQotICAgIHsKLSAgICAgIDo6c2tfWDUwOV9wb3BfZnJlZShoYW5kbGVfLT5leHRyYV9jZXJ0cywgWDUwOV9mcmVlKTsKLSAgICAgIGhhbmRsZV8tPmV4dHJhX2NlcnRzID0gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoWDUwOSogY2FjZXJ0ID0gOjpQRU1fcmVhZF9iaW9fWDUwOShiaW8ucCwgMCwKLSAgICAgICAgICBoYW5kbGVfLT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjaywKLSAgICAgICAgICBoYW5kbGVfLT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSkpCi0gICAgewotICAgICAgaWYgKCE6OlNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoaGFuZGxlXywgY2FjZXJ0KSkKLSAgICAgIHsKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pig6OkVSUl9nZXRfZXJyb3IoKSksCi0gICAgICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3NzbF9jYXRlZ29yeSgpKTsKLSAgICAgICAgcmV0dXJuIGVjOwotICAgICAgfQotICAgIH0KLSAgCi0gICAgcmVzdWx0ID0gOjpFUlJfcGVla19sYXN0X2Vycm9yKCk7Ci0gICAgaWYgKChFUlJfR0VUX0xJQihyZXN1bHQpID09IEVSUl9MSUJfUEVNKQotICAgICAgICAmJiAoRVJSX0dFVF9SRUFTT04ocmVzdWx0KSA9PSBQRU1fUl9OT19TVEFSVF9MSU5FKSkKLSAgICB7Ci0gICAgICA6OkVSUl9jbGVhcl9lcnJvcigpOwotICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgICByZXR1cm4gZWM7Ci0gICAgfQotICB9Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKAotICAgICAgc3RhdGljX2Nhc3Q8aW50Pig6OkVSUl9nZXRfZXJyb3IoKSksCi0gICAgICBhc2lvOjplcnJvcjo6Z2V0X3NzbF9jYXRlZ29yeSgpKTsKLSAgcmV0dXJuIGVjOwotfQotCi12b2lkIGNvbnRleHQ6OnVzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoZmlsZW5hbWUsIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInVzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlIik7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgY29udGV4dDo6dXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgOjpFUlJfY2xlYXJfZXJyb3IoKTsKLQotICBpZiAoOjpTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGhhbmRsZV8sIGZpbGVuYW1lLmNfc3RyKCkpICE9IDEpCi0gIHsKLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoCi0gICAgICAgIHN0YXRpY19jYXN0PGludD4oOjpFUlJfZ2V0X2Vycm9yKCkpLAotICAgICAgICBhc2lvOjplcnJvcjo6Z2V0X3NzbF9jYXRlZ29yeSgpKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgcmV0dXJuIGVjOwotfQotCi12b2lkIGNvbnRleHQ6OnVzZV9wcml2YXRlX2tleSgKLSAgICBjb25zdCBjb25zdF9idWZmZXImIHByaXZhdGVfa2V5LCBjb250ZXh0OjpmaWxlX2Zvcm1hdCBmb3JtYXQpCi17Ci0gIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gIHVzZV9wcml2YXRlX2tleShwcml2YXRlX2tleSwgZm9ybWF0LCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ1c2VfcHJpdmF0ZV9rZXkiKTsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBjb250ZXh0Ojp1c2VfcHJpdmF0ZV9rZXkoCi0gICAgY29uc3QgY29uc3RfYnVmZmVyJiBwcml2YXRlX2tleSwgY29udGV4dDo6ZmlsZV9mb3JtYXQgZm9ybWF0LAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICA6OkVSUl9jbGVhcl9lcnJvcigpOwotCi0gIGJpb19jbGVhbnVwIGJpbyA9IHsgbWFrZV9idWZmZXJfYmlvKHByaXZhdGVfa2V5KSB9OwotICBpZiAoYmlvLnApCi0gIHsKLSAgICBldnBfcGtleV9jbGVhbnVwIGV2cF9wcml2YXRlX2tleSA9IHsgMCB9OwotICAgIHN3aXRjaCAoZm9ybWF0KQotICAgIHsKLSAgICBjYXNlIGNvbnRleHRfYmFzZTo6YXNuMToKLSAgICAgIGV2cF9wcml2YXRlX2tleS5wID0gOjpkMmlfUHJpdmF0ZUtleV9iaW8oYmlvLnAsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb250ZXh0X2Jhc2U6OnBlbToKLSAgICAgIGV2cF9wcml2YXRlX2tleS5wID0gOjpQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleSgKLSAgICAgICAgICBiaW8ucCwgMCwgaGFuZGxlXy0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2ssCi0gICAgICAgICAgaGFuZGxlXy0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgICAgcmV0dXJuIGVjOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChldnBfcHJpdmF0ZV9rZXkucCkKLSAgICB7Ci0gICAgICBpZiAoOjpTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5KGhhbmRsZV8sIGV2cF9wcml2YXRlX2tleS5wKSA9PSAxKQotICAgICAgewotICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgICAgcmV0dXJuIGVjOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgIHN0YXRpY19jYXN0PGludD4oOjpFUlJfZ2V0X2Vycm9yKCkpLAotICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zc2xfY2F0ZWdvcnkoKSk7Ci0gIHJldHVybiBlYzsKLX0KLQotdm9pZCBjb250ZXh0Ojp1c2VfcHJpdmF0ZV9rZXlfZmlsZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnRleHQ6OmZpbGVfZm9ybWF0IGZvcm1hdCkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgdXNlX3ByaXZhdGVfa2V5X2ZpbGUoZmlsZW5hbWUsIGZvcm1hdCwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAidXNlX3ByaXZhdGVfa2V5X2ZpbGUiKTsKLX0KLQotdm9pZCBjb250ZXh0Ojp1c2VfcnNhX3ByaXZhdGVfa2V5KAotICAgIGNvbnN0IGNvbnN0X2J1ZmZlciYgcHJpdmF0ZV9rZXksIGNvbnRleHQ6OmZpbGVfZm9ybWF0IGZvcm1hdCkKLXsKLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgdXNlX3JzYV9wcml2YXRlX2tleShwcml2YXRlX2tleSwgZm9ybWF0LCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ1c2VfcnNhX3ByaXZhdGVfa2V5Iik7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgY29udGV4dDo6dXNlX3JzYV9wcml2YXRlX2tleSgKLSAgICBjb25zdCBjb25zdF9idWZmZXImIHByaXZhdGVfa2V5LCBjb250ZXh0OjpmaWxlX2Zvcm1hdCBmb3JtYXQsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIDo6RVJSX2NsZWFyX2Vycm9yKCk7Ci0KLSAgYmlvX2NsZWFudXAgYmlvID0geyBtYWtlX2J1ZmZlcl9iaW8ocHJpdmF0ZV9rZXkpIH07Ci0gIGlmIChiaW8ucCkKLSAgewotICAgIHJzYV9jbGVhbnVwIHJzYV9wcml2YXRlX2tleSA9IHsgMCB9OwotICAgIHN3aXRjaCAoZm9ybWF0KQotICAgIHsKLSAgICBjYXNlIGNvbnRleHRfYmFzZTo6YXNuMToKLSAgICAgIHJzYV9wcml2YXRlX2tleS5wID0gOjpkMmlfUlNBUHJpdmF0ZUtleV9iaW8oYmlvLnAsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb250ZXh0X2Jhc2U6OnBlbToKLSAgICAgIHJzYV9wcml2YXRlX2tleS5wID0gOjpQRU1fcmVhZF9iaW9fUlNBUHJpdmF0ZUtleSgKLSAgICAgICAgICBiaW8ucCwgMCwgaGFuZGxlXy0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2ssCi0gICAgICAgICAgaGFuZGxlXy0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgICAgcmV0dXJuIGVjOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChyc2FfcHJpdmF0ZV9rZXkucCkKLSAgICB7Ci0gICAgICBpZiAoOjpTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5KGhhbmRsZV8sIHJzYV9wcml2YXRlX2tleS5wKSA9PSAxKQotICAgICAgewotICAgICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgICAgcmV0dXJuIGVjOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgIHN0YXRpY19jYXN0PGludD4oOjpFUlJfZ2V0X2Vycm9yKCkpLAotICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zc2xfY2F0ZWdvcnkoKSk7Ci0gIHJldHVybiBlYzsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBjb250ZXh0Ojp1c2VfcHJpdmF0ZV9rZXlfZmlsZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnRleHQ6OmZpbGVfZm9ybWF0IGZvcm1hdCwKLSAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgaW50IGZpbGVfdHlwZTsKLSAgc3dpdGNoIChmb3JtYXQpCi0gIHsKLSAgY2FzZSBjb250ZXh0X2Jhc2U6OmFzbjE6Ci0gICAgZmlsZV90eXBlID0gU1NMX0ZJTEVUWVBFX0FTTjE7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgY29udGV4dF9iYXNlOjpwZW06Ci0gICAgZmlsZV90eXBlID0gU1NMX0ZJTEVUWVBFX1BFTTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgcmV0dXJuIGVjOwotICAgIH0KLSAgfQotCi0gIDo6RVJSX2NsZWFyX2Vycm9yKCk7Ci0KLSAgaWYgKDo6U1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKGhhbmRsZV8sIGZpbGVuYW1lLmNfc3RyKCksIGZpbGVfdHlwZSkgIT0gMSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pig6OkVSUl9nZXRfZXJyb3IoKSksCi0gICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3NsX2NhdGVnb3J5KCkpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLXZvaWQgY29udGV4dDo6dXNlX3JzYV9wcml2YXRlX2tleV9maWxlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29udGV4dDo6ZmlsZV9mb3JtYXQgZm9ybWF0KQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICB1c2VfcnNhX3ByaXZhdGVfa2V5X2ZpbGUoZmlsZW5hbWUsIGZvcm1hdCwgZWMpOwotICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAidXNlX3JzYV9wcml2YXRlX2tleV9maWxlIik7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgY29udGV4dDo6dXNlX3JzYV9wcml2YXRlX2tleV9maWxlKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29udGV4dDo6ZmlsZV9mb3JtYXQgZm9ybWF0LAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICBpbnQgZmlsZV90eXBlOwotICBzd2l0Y2ggKGZvcm1hdCkKLSAgewotICBjYXNlIGNvbnRleHRfYmFzZTo6YXNuMToKLSAgICBmaWxlX3R5cGUgPSBTU0xfRklMRVRZUEVfQVNOMTsKLSAgICBicmVhazsKLSAgY2FzZSBjb250ZXh0X2Jhc2U6OnBlbToKLSAgICBmaWxlX3R5cGUgPSBTU0xfRklMRVRZUEVfUEVNOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgICByZXR1cm4gZWM7Ci0gICAgfQotICB9Ci0KLSAgOjpFUlJfY2xlYXJfZXJyb3IoKTsKLQotICBpZiAoOjpTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUoCi0gICAgICAgIGhhbmRsZV8sIGZpbGVuYW1lLmNfc3RyKCksIGZpbGVfdHlwZSkgIT0gMSkKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pig6OkVSUl9nZXRfZXJyb3IoKSksCi0gICAgICAgIGFzaW86OmVycm9yOjpnZXRfc3NsX2NhdGVnb3J5KCkpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLXZvaWQgY29udGV4dDo6dXNlX3RtcF9kaChjb25zdCBjb25zdF9idWZmZXImIGRoKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICB1c2VfdG1wX2RoKGRoLCBlYyk7Ci0gIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ1c2VfdG1wX2RoIik7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgY29udGV4dDo6dXNlX3RtcF9kaCgKLSAgICBjb25zdCBjb25zdF9idWZmZXImIGRoLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLXsKLSAgOjpFUlJfY2xlYXJfZXJyb3IoKTsKLQotICBiaW9fY2xlYW51cCBiaW8gPSB7IG1ha2VfYnVmZmVyX2JpbyhkaCkgfTsKLSAgaWYgKGJpby5wKQotICB7Ci0gICAgcmV0dXJuIGRvX3VzZV90bXBfZGgoYmlvLnAsIGVjKTsKLSAgfQotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgIHN0YXRpY19jYXN0PGludD4oOjpFUlJfZ2V0X2Vycm9yKCkpLAotICAgICAgYXNpbzo6ZXJyb3I6OmdldF9zc2xfY2F0ZWdvcnkoKSk7Ci0gIHJldHVybiBlYzsKLX0KLQotdm9pZCBjb250ZXh0Ojp1c2VfdG1wX2RoX2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQotewotICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICB1c2VfdG1wX2RoX2ZpbGUoZmlsZW5hbWUsIGVjKTsKLSAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInVzZV90bXBfZGhfZmlsZSIpOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIGNvbnRleHQ6OnVzZV90bXBfZGhfZmlsZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICA6OkVSUl9jbGVhcl9lcnJvcigpOwotCi0gIGJpb19jbGVhbnVwIGJpbyA9IHsgOjpCSU9fbmV3X2ZpbGUoZmlsZW5hbWUuY19zdHIoKSwgInIiKSB9OwotICBpZiAoYmlvLnApCi0gIHsKLSAgICByZXR1cm4gZG9fdXNlX3RtcF9kaChiaW8ucCwgZWMpOwotICB9Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKAotICAgICAgc3RhdGljX2Nhc3Q8aW50Pig6OkVSUl9nZXRfZXJyb3IoKSksCi0gICAgICBhc2lvOjplcnJvcjo6Z2V0X3NzbF9jYXRlZ29yeSgpKTsKLSAgcmV0dXJuIGVjOwotfQotCi1hc2lvOjplcnJvcl9jb2RlIGNvbnRleHQ6OmRvX3VzZV90bXBfZGgoCi0gICAgQklPKiBiaW8sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotewotICA6OkVSUl9jbGVhcl9lcnJvcigpOwotCi0gIGRoX2NsZWFudXAgZGggPSB7IDo6UEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgMCwgMCwgMCkgfTsKLSAgaWYgKGRoLnApCi0gIHsKLSAgICBpZiAoOjpTU0xfQ1RYX3NldF90bXBfZGgoaGFuZGxlXywgZGgucCkgPT0gMSkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICAgIHJldHVybiBlYzsKLSAgICB9Ci0gIH0KLQotICBlYyA9IGFzaW86OmVycm9yX2NvZGUoCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KDo6RVJSX2dldF9lcnJvcigpKSwKLSAgICAgIGFzaW86OmVycm9yOjpnZXRfc3NsX2NhdGVnb3J5KCkpOwotICByZXR1cm4gZWM7Ci19Ci0KLWFzaW86OmVycm9yX2NvZGUgY29udGV4dDo6ZG9fc2V0X3ZlcmlmeV9jYWxsYmFjaygKLSAgICBkZXRhaWw6OnZlcmlmeV9jYWxsYmFja19iYXNlKiBjYWxsYmFjaywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChTU0xfQ1RYX2dldF9hcHBfZGF0YShoYW5kbGVfKSkKLSAgewotICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxkZXRhaWw6OnZlcmlmeV9jYWxsYmFja19iYXNlKj4oCi0gICAgICAgIFNTTF9DVFhfZ2V0X2FwcF9kYXRhKGhhbmRsZV8pKTsKLSAgfQotCi0gIFNTTF9DVFhfc2V0X2FwcF9kYXRhKGhhbmRsZV8sIGNhbGxiYWNrKTsKLQotICA6OlNTTF9DVFhfc2V0X3ZlcmlmeShoYW5kbGVfLAotICAgICAgOjpTU0xfQ1RYX2dldF92ZXJpZnlfbW9kZShoYW5kbGVfKSwKLSAgICAgICZjb250ZXh0Ojp2ZXJpZnlfY2FsbGJhY2tfZnVuY3Rpb24pOwotCi0gIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICByZXR1cm4gZWM7Ci19Ci0KLWludCBjb250ZXh0Ojp2ZXJpZnlfY2FsbGJhY2tfZnVuY3Rpb24oaW50IHByZXZlcmlmaWVkLCBYNTA5X1NUT1JFX0NUWCogY3R4KQotewotICBpZiAoY3R4KQotICB7Ci0gICAgaWYgKFNTTCogc3NsID0gc3RhdGljX2Nhc3Q8U1NMKj4oCi0gICAgICAgICAgOjpYNTA5X1NUT1JFX0NUWF9nZXRfZXhfZGF0YSgKLSAgICAgICAgICAgIGN0eCwgOjpTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkpKSkKLSAgICB7Ci0gICAgICBpZiAoU1NMX0NUWCogaGFuZGxlID0gOjpTU0xfZ2V0X1NTTF9DVFgoc3NsKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKFNTTF9DVFhfZ2V0X2FwcF9kYXRhKGhhbmRsZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBkZXRhaWw6OnZlcmlmeV9jYWxsYmFja19iYXNlKiBjYWxsYmFjayA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxkZXRhaWw6OnZlcmlmeV9jYWxsYmFja19iYXNlKj4oCi0gICAgICAgICAgICAgICAgU1NMX0NUWF9nZXRfYXBwX2RhdGEoaGFuZGxlKSk7Ci0KLSAgICAgICAgICB2ZXJpZnlfY29udGV4dCB2ZXJpZnlfY3R4KGN0eCk7Ci0gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLT5jYWxsKHByZXZlcmlmaWVkICE9IDAsIHZlcmlmeV9jdHgpID8gMSA6IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotYXNpbzo6ZXJyb3JfY29kZSBjb250ZXh0Ojpkb19zZXRfcGFzc3dvcmRfY2FsbGJhY2soCi0gICAgZGV0YWlsOjpwYXNzd29yZF9jYWxsYmFja19iYXNlKiBjYWxsYmFjaywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi17Ci0gIGlmIChoYW5kbGVfLT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSkKLSAgICBkZWxldGUgc3RhdGljX2Nhc3Q8ZGV0YWlsOjpwYXNzd29yZF9jYWxsYmFja19iYXNlKj4oCi0gICAgICAgIGhhbmRsZV8tPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKTsKLQotICBoYW5kbGVfLT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSA9IGNhbGxiYWNrOwotCi0gIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKGhhbmRsZV8sICZjb250ZXh0OjpwYXNzd29yZF9jYWxsYmFja19mdW5jdGlvbik7Ci0KLSAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gIHJldHVybiBlYzsKLX0KLQotaW50IGNvbnRleHQ6OnBhc3N3b3JkX2NhbGxiYWNrX2Z1bmN0aW9uKAotICAgIGNoYXIqIGJ1ZiwgaW50IHNpemUsIGludCBwdXJwb3NlLCB2b2lkKiBkYXRhKQotewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOyAvLyBGb3Igc3RybmNhdCBhbmQgc3RybGVuLgotCi0gIGlmIChkYXRhKQotICB7Ci0gICAgZGV0YWlsOjpwYXNzd29yZF9jYWxsYmFja19iYXNlKiBjYWxsYmFjayA9Ci0gICAgICBzdGF0aWNfY2FzdDxkZXRhaWw6OnBhc3N3b3JkX2NhbGxiYWNrX2Jhc2UqPihkYXRhKTsKLQotICAgIHN0ZDo6c3RyaW5nIHBhc3N3ZCA9IGNhbGxiYWNrLT5jYWxsKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzaXplKSwKLSAgICAgICAgcHVycG9zZSA/IGNvbnRleHRfYmFzZTo6Zm9yX3dyaXRpbmcgOiBjb250ZXh0X2Jhc2U6OmZvcl9yZWFkaW5nKTsKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLSAgICBzdHJjcHlfcyhidWYsIHNpemUsIHBhc3N3ZC5jX3N0cigpKTsKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLSAgICAqYnVmID0gJ1wwJzsKLSAgICBzdHJuY2F0KGJ1ZiwgcGFzc3dkLmNfc3RyKCksIHNpemUpOwotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU0VDVVJFX1JUTCkKLQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHN0cmxlbihidWYpKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1CSU8qIGNvbnRleHQ6Om1ha2VfYnVmZmVyX2Jpbyhjb25zdCBjb25zdF9idWZmZXImIGIpCi17Ci0gIHJldHVybiA6OkJJT19uZXdfbWVtX2J1ZigKLSAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KGJ1ZmZlcl9jYXN0PGNvbnN0IHZvaWQqPihiKSksCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZmZlcl9zaXplKGIpKSk7Ci19Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX0lNUExfQ09OVEVYVF9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvaW1wbC9lcnJvci5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2ltcGwvZXJyb3IuaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc2MDM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvaW1wbC9lcnJvci5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLwotLy8gc3NsL2ltcGwvZXJyb3IuaXBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfSU1QTF9FUlJPUl9JUFAKLSNkZWZpbmUgQVNJT19TU0xfSU1QTF9FUlJPUl9JUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL29wZW5zc2xfaW5pdC5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2UgZXJyb3IgewotCi1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgc3NsX2NhdGVnb3J5IDogcHVibGljIGFzaW86OmVycm9yX2NhdGVnb3J5Ci17Ci1wdWJsaWM6Ci0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCBBU0lPX0VSUk9SX0NBVEVHT1JZX05PRVhDRVBUCi0gIHsKLSAgICByZXR1cm4gImFzaW8uc3NsIjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIG1lc3NhZ2UoaW50IHZhbHVlKSBjb25zdAotICB7Ci0gICAgY29uc3QgY2hhciogcyA9IDo6RVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcodmFsdWUpOwotICAgIHJldHVybiBzID8gcyA6ICJhc2lvLnNzbCBlcnJvciI7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGRldGFpbAotCi1jb25zdCBhc2lvOjplcnJvcl9jYXRlZ29yeSYgZ2V0X3NzbF9jYXRlZ29yeSgpCi17Ci0gIHN0YXRpYyBkZXRhaWw6OnNzbF9jYXRlZ29yeSBpbnN0YW5jZTsKLSAgcmV0dXJuIGluc3RhbmNlOwotfQotCi19IC8vIG5hbWVzcGFjZSBlcnJvcgotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19TU0xfSU1QTF9FUlJPUl9JUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvaW1wbC9yZmMyODE4X3ZlcmlmaWNhdGlvbi5pcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2ltcGwvcmZjMjgxOF92ZXJpZmljYXRpb24uaXBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTg2NmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvaW1wbC9yZmMyODE4X3ZlcmlmaWNhdGlvbi5pcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLy8KLS8vIHNzbC9pbXBsL3JmYzI4MThfdmVyaWZpY2F0aW9uLmlwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX0lNUExfUkZDMjgxOF9WRVJJRklDQVRJT05fSVBQCi0jZGVmaW5lIEFTSU9fU1NMX0lNUExfUkZDMjgxOF9WRVJJRklDQVRJT05fSVBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotIyBpbmNsdWRlIDxjY3R5cGU+Ci0jIGluY2x1ZGUgPGNzdHJpbmc+Ci0jIGluY2x1ZGUgImFzaW8vaXAvYWRkcmVzcy5ocHAiCi0jIGluY2x1ZGUgImFzaW8vc3NsL3JmYzI4MThfdmVyaWZpY2F0aW9uLmhwcCIKLSMgaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL29wZW5zc2xfdHlwZXMuaHBwIgotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2Ugc3NsIHsKLQotI2lmICFkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLWJvb2wgcmZjMjgxOF92ZXJpZmljYXRpb246Om9wZXJhdG9yKCkoCi0gICAgYm9vbCBwcmV2ZXJpZmllZCwgdmVyaWZ5X2NvbnRleHQmIGN0eCkgY29uc3QKLXsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIG1lbWNtcC4KLQotICAvLyBEb24ndCBib3RoZXIgbG9va2luZyBhdCBjZXJ0aWZpY2F0ZXMgdGhhdCBoYXZlIGZhaWxlZCBwcmUtdmVyaWZpY2F0aW9uLgotICBpZiAoIXByZXZlcmlmaWVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvLyBXZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gY2hlY2tpbmcgdGhlIGNlcnRpZmljYXRlIGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluLgotICBpbnQgZGVwdGggPSBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoY3R4Lm5hdGl2ZV9oYW5kbGUoKSk7Ci0gIGlmIChkZXB0aCA+IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLy8gVHJ5IGNvbnZlcnRpbmcgdGhlIGhvc3QgbmFtZSB0byBhbiBhZGRyZXNzLiBJZiBpdCBpcyBhbiBhZGRyZXNzIHRoZW4gd2UKLSAgLy8gbmVlZCB0byBsb29rIGZvciBhbiBJUCBhZGRyZXNzIGluIHRoZSBjZXJ0aWZpY2F0ZSByYXRoZXIgdGhhbiBhIGhvc3QgbmFtZS4KLSAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgaXA6OmFkZHJlc3MgYWRkcmVzcyA9IGlwOjphZGRyZXNzOjpmcm9tX3N0cmluZyhob3N0XywgZWMpOwotICBib29sIGlzX2FkZHJlc3MgPSAhZWM7Ci0KLSAgWDUwOSogY2VydCA9IFg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoY3R4Lm5hdGl2ZV9oYW5kbGUoKSk7Ci0KLSAgLy8gR28gdGhyb3VnaCB0aGUgYWx0ZXJuYXRlIG5hbWVzIGluIHRoZSBjZXJ0aWZpY2F0ZSBsb29raW5nIGZvciBtYXRjaGluZyBETlMKLSAgLy8gb3IgSVAgYWRkcmVzcyBlbnRyaWVzLgotICBHRU5FUkFMX05BTUVTKiBnZW5zID0gc3RhdGljX2Nhc3Q8R0VORVJBTF9OQU1FUyo+KAotICAgICAgWDUwOV9nZXRfZXh0X2QyaShjZXJ0LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgMCwgMCkpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oZ2Vucyk7ICsraSkKLSAgewotICAgIEdFTkVSQUxfTkFNRSogZ2VuID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGdlbnMsIGkpOwotICAgIGlmIChnZW4tPnR5cGUgPT0gR0VOX0ROUyAmJiAhaXNfYWRkcmVzcykKLSAgICB7Ci0gICAgICBBU04xX0lBNVNUUklORyogZG9tYWluID0gZ2VuLT5kLmROU05hbWU7Ci0gICAgICBpZiAoZG9tYWluLT50eXBlID09IFZfQVNOMV9JQTVTVFJJTkcgJiYgZG9tYWluLT5kYXRhICYmIGRvbWFpbi0+bGVuZ3RoKQotICAgICAgewotICAgICAgICBjb25zdCBjaGFyKiBwYXR0ZXJuID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZG9tYWluLT5kYXRhKTsKLSAgICAgICAgc3RkOjpzaXplX3QgcGF0dGVybl9sZW5ndGggPSBkb21haW4tPmxlbmd0aDsKLSAgICAgICAgaWYgKG1hdGNoX3BhdHRlcm4ocGF0dGVybiwgcGF0dGVybl9sZW5ndGgsIGhvc3RfLmNfc3RyKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgR0VORVJBTF9OQU1FU19mcmVlKGdlbnMpOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGdlbi0+dHlwZSA9PSBHRU5fSVBBREQgJiYgaXNfYWRkcmVzcykKLSAgICB7Ci0gICAgICBBU04xX09DVEVUX1NUUklORyogaXBfYWRkcmVzcyA9IGdlbi0+ZC5pUEFkZHJlc3M7Ci0gICAgICBpZiAoaXBfYWRkcmVzcy0+dHlwZSA9PSBWX0FTTjFfT0NURVRfU1RSSU5HICYmIGlwX2FkZHJlc3MtPmRhdGEpCi0gICAgICB7Ci0gICAgICAgIGlmIChhZGRyZXNzLmlzX3Y0KCkgJiYgaXBfYWRkcmVzcy0+bGVuZ3RoID09IDQpCi0gICAgICAgIHsKLSAgICAgICAgICBpcDo6YWRkcmVzc192NDo6Ynl0ZXNfdHlwZSBieXRlcyA9IGFkZHJlc3MudG9fdjQoKS50b19ieXRlcygpOwotICAgICAgICAgIGlmIChtZW1jbXAoYnl0ZXMuZGF0YSgpLCBpcF9hZGRyZXNzLT5kYXRhLCA0KSA9PSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEdFTkVSQUxfTkFNRVNfZnJlZShnZW5zKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhZGRyZXNzLmlzX3Y2KCkgJiYgaXBfYWRkcmVzcy0+bGVuZ3RoID09IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgaXA6OmFkZHJlc3NfdjY6OmJ5dGVzX3R5cGUgYnl0ZXMgPSBhZGRyZXNzLnRvX3Y2KCkudG9fYnl0ZXMoKTsKLSAgICAgICAgICBpZiAobWVtY21wKGJ5dGVzLmRhdGEoKSwgaXBfYWRkcmVzcy0+ZGF0YSwgMTYpID09IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgR0VORVJBTF9OQU1FU19mcmVlKGdlbnMpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIEdFTkVSQUxfTkFNRVNfZnJlZShnZW5zKTsKLQotICAvLyBObyBtYXRjaCBpbiB0aGUgYWx0ZXJuYXRlIG5hbWVzLCBzbyB0cnkgdGhlIGNvbW1vbiBuYW1lcy4gV2Ugc2hvdWxkIG9ubHkKLSAgLy8gdXNlIHRoZSAibW9zdCBzcGVjaWZpYyIgY29tbW9uIG5hbWUsIHdoaWNoIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgbGlzdC4KLSAgWDUwOV9OQU1FKiBuYW1lID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpOwotICBpbnQgaSA9IC0xOwotICBBU04xX1NUUklORyogY29tbW9uX25hbWUgPSAwOwotICB3aGlsZSAoKGkgPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLCBOSURfY29tbW9uTmFtZSwgaSkpID49IDApCi0gIHsKLSAgICBYNTA5X05BTUVfRU5UUlkqIG5hbWVfZW50cnkgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG5hbWUsIGkpOwotICAgIGNvbW1vbl9uYW1lID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKG5hbWVfZW50cnkpOwotICB9Ci0gIGlmIChjb21tb25fbmFtZSAmJiBjb21tb25fbmFtZS0+ZGF0YSAmJiBjb21tb25fbmFtZS0+bGVuZ3RoKQotICB7Ci0gICAgY29uc3QgY2hhciogcGF0dGVybiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGNvbW1vbl9uYW1lLT5kYXRhKTsKLSAgICBzdGQ6OnNpemVfdCBwYXR0ZXJuX2xlbmd0aCA9IGNvbW1vbl9uYW1lLT5sZW5ndGg7Ci0gICAgaWYgKG1hdGNoX3BhdHRlcm4ocGF0dGVybiwgcGF0dGVybl9sZW5ndGgsIGhvc3RfLmNfc3RyKCkpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgcmZjMjgxOF92ZXJpZmljYXRpb246Om1hdGNoX3BhdHRlcm4oY29uc3QgY2hhciogcGF0dGVybiwKLSAgICBzdGQ6OnNpemVfdCBwYXR0ZXJuX2xlbmd0aCwgY29uc3QgY2hhciogaG9zdCkKLXsKLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsgLy8gRm9yIHRvbG93ZXIuCi0KLSAgY29uc3QgY2hhciogcCA9IHBhdHRlcm47Ci0gIGNvbnN0IGNoYXIqIHBfZW5kID0gcCArIHBhdHRlcm5fbGVuZ3RoOwotICBjb25zdCBjaGFyKiBoID0gaG9zdDsKLQotICB3aGlsZSAocCAhPSBwX2VuZCAmJiAqaCkKLSAgewotICAgIGlmICgqcCA9PSAnKicpCi0gICAgewotICAgICAgKytwOwotICAgICAgd2hpbGUgKCpoICYmICpoICE9ICcuJykKLSAgICAgICAgaWYgKG1hdGNoX3BhdHRlcm4ocCwgcF9lbmQgLSBwLCBoKyspKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIGlmICh0b2xvd2VyKCpwKSA9PSB0b2xvd2VyKCpoKSkKLSAgICB7Ci0gICAgICArK3A7Ci0gICAgICArK2g7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHAgPT0gcF9lbmQgJiYgISpoOwotfQotCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9JTVBMX1JGQzI4MThfVkVSSUZJQ0FUSU9OX0lQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9pbXBsL3NyYy5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2ltcGwvc3JjLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiMzVjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL2ltcGwvc3JjLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vCi0vLyBpbXBsL3NzbC9zcmMuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX0lNUExfU1JDX0hQUAotI2RlZmluZSBBU0lPX1NTTF9JTVBMX1NSQ19IUFAKLQotI2RlZmluZSBBU0lPX1NPVVJDRQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLSMgZXJyb3IgRG8gbm90IGNvbXBpbGUgQXNpbyBsaWJyYXJ5IHNvdXJjZSB3aXRoIEFTSU9fSEVBREVSX09OTFkgZGVmaW5lZAotI2VuZGlmCi0KLSNpbmNsdWRlICJhc2lvL3NzbC9pbXBsL2NvbnRleHQuaXBwIgotI2luY2x1ZGUgImFzaW8vc3NsL2ltcGwvZXJyb3IuaXBwIgotI2luY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9pbXBsL2VuZ2luZS5pcHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL2ltcGwvb3BlbnNzbF9pbml0LmlwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC9pbXBsL3JmYzI4MThfdmVyaWZpY2F0aW9uLmlwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX0lNUExfU1JDX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9vbGQvYmFzaWNfY29udGV4dC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL29sZC9iYXNpY19jb250ZXh0LmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBmZWNhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL29sZC9iYXNpY19jb250ZXh0LmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vLwotLy8gc3NsL29sZC9iYXNpY19jb250ZXh0LmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwNSBWb2lwc3RlciAvIEluZHJlayBkb3QgSnVoYW5pIGF0IHZvaXBzdGVyIGRvdCBjb20KLS8vIENvcHlyaWdodCAoYykgMjAwNS0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9PTERfQkFTSUNfQ09OVEVYVF9IUFAKLSNkZWZpbmUgQVNJT19TU0xfT0xEX0JBU0lDX0NPTlRFWFRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC9jb250ZXh0X2Jhc2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci1uYW1lc3BhY2Ugb2xkIHsKLQotLy8vIFNTTCBjb250ZXh0LgotdGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZpY2U+Ci1jbGFzcyBiYXNpY19jb250ZXh0Ci0gIDogcHVibGljIGNvbnRleHRfYmFzZSwKLSAgICBwcml2YXRlIGJvb3N0Ojpub25jb3B5YWJsZQotewotcHVibGljOgotICAvLy8gVGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcHJvdmlkZSBjb250ZXh0IG9wZXJhdGlvbnMuCi0gIHR5cGVkZWYgU2VydmljZSBzZXJ2aWNlX3R5cGU7Ci0KLSAgLy8vIFRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24gdHlwZSBvZiB0aGUgU1NMIGNvbnRleHQuCi0gIHR5cGVkZWYgdHlwZW5hbWUgc2VydmljZV90eXBlOjppbXBsX3R5cGUgaW1wbF90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3Rvci4KLSAgYmFzaWNfY29udGV4dChhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlLCBtZXRob2QgbSkKLSAgICA6IHNlcnZpY2VfKGFzaW86OnVzZV9zZXJ2aWNlPFNlcnZpY2U+KGlvX3NlcnZpY2UpKSwKLSAgICAgIGltcGxfKHNlcnZpY2VfLm51bGwoKSkKLSAgewotICAgIHNlcnZpY2VfLmNyZWF0ZShpbXBsXywgbSk7Ci0gIH0KLQotICAvLy8gRGVzdHJ1Y3Rvci4KLSAgfmJhc2ljX2NvbnRleHQoKQotICB7Ci0gICAgc2VydmljZV8uZGVzdHJveShpbXBsXyk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGluIHRoZSBuYXRpdmUgdHlwZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICAgKiBjb250ZXh0LiBUaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGFjY2VzcyB0byBjb250ZXh0IGZ1bmN0aW9uYWxpdHkgdGhhdCBpcwotICAgKiBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkLgotICAgKi8KLSAgaW1wbF90eXBlIGltcGwoKQotICB7Ci0gICAgcmV0dXJuIGltcGxfOwotICB9Ci0KLSAgLy8vIFNldCBvcHRpb25zIG9uIHRoZSBjb250ZXh0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIFNTTCBvcHRpb25zIHVzZWQgYnkgdGhlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBvIEEgYml0bWFzayBvZiBvcHRpb25zLiBUaGUgYXZhaWxhYmxlIG9wdGlvbiB2YWx1ZXMgYXJlIGRlZmluZWQgaW4KLSAgICogdGhlIGNvbnRleHRfYmFzZSBjbGFzcy4gVGhlIG9wdGlvbnMgYXJlIGJpdHdpc2Utb3JlZCB3aXRoIGFueSBleGlzdGluZwotICAgKiB2YWx1ZSBmb3IgdGhlIG9wdGlvbnMuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBzZXRfb3B0aW9ucyhvcHRpb25zIG8pCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHNlcnZpY2VfLnNldF9vcHRpb25zKGltcGxfLCBvLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIH0KLQotICAvLy8gU2V0IG9wdGlvbnMgb24gdGhlIGNvbnRleHQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgU1NMIG9wdGlvbnMgdXNlZCBieSB0aGUgY29udGV4dC4KLSAgICoKLSAgICogQHBhcmFtIG8gQSBiaXRtYXNrIG9mIG9wdGlvbnMuIFRoZSBhdmFpbGFibGUgb3B0aW9uIHZhbHVlcyBhcmUgZGVmaW5lZCBpbgotICAgKiB0aGUgY29udGV4dF9iYXNlIGNsYXNzLiBUaGUgb3B0aW9ucyBhcmUgYml0d2lzZS1vcmVkIHdpdGggYW55IGV4aXN0aW5nCi0gICAqIHZhbHVlIGZvciB0aGUgb3B0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIHNldF9vcHRpb25zKG9wdGlvbnMgbywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfLnNldF9vcHRpb25zKGltcGxfLCBvLCBlYyk7Ci0gIH0KLQotICAvLy8gU2V0IHRoZSBwZWVyIHZlcmlmaWNhdGlvbiBtb2RlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHBlZXIgdmVyaWZpY2F0aW9uIG1vZGUgdXNlZCBieQotICAgKiB0aGUgY29udGV4dC4KLSAgICoKLSAgICogQHBhcmFtIHYgQSBiaXRtYXNrIG9mIHBlZXIgdmVyaWZpY2F0aW9uIG1vZGVzLiBUaGUgYXZhaWxhYmxlIHZlcmlmeV9tb2RlCi0gICAqIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiB0aGUgY29udGV4dF9iYXNlIGNsYXNzLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIHZvaWQgc2V0X3ZlcmlmeV9tb2RlKHZlcmlmeV9tb2RlIHYpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHNlcnZpY2VfLnNldF92ZXJpZnlfbW9kZShpbXBsXywgdiwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgcGVlciB2ZXJpZmljYXRpb24gbW9kZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwZWVyIHZlcmlmaWNhdGlvbiBtb2RlIHVzZWQgYnkKLSAgICogdGhlIGNvbnRleHQuCi0gICAqCi0gICAqIEBwYXJhbSB2IEEgYml0bWFzayBvZiBwZWVyIHZlcmlmaWNhdGlvbiBtb2Rlcy4gVGhlIGF2YWlsYWJsZSB2ZXJpZnlfbW9kZQotICAgKiB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbnRleHRfYmFzZSBjbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIHNldF92ZXJpZnlfbW9kZSh2ZXJpZnlfbW9kZSB2LAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV8uc2V0X3ZlcmlmeV9tb2RlKGltcGxfLCB2LCBlYyk7Ci0gIH0KLQotICAvLy8gTG9hZCBhIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5IGZpbGUgZm9yIHBlcmZvcm1pbmcgdmVyaWZpY2F0aW9uLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgb25lIG9yIG1vcmUgdHJ1c3RlZCBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0aWVzCi0gICAqIGZyb20gYSBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgY2VydGlmaWNhdGlvbiBhdXRob3JpdHkKLSAgICogY2VydGlmaWNhdGVzIGluIFBFTSBmb3JtYXQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBsb2FkX3ZlcmlmeV9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc2VydmljZV8ubG9hZF92ZXJpZnlfZmlsZShpbXBsXywgZmlsZW5hbWUsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjKTsKLSAgfQotCi0gIC8vLyBMb2FkIGEgY2VydGlmaWNhdGlvbiBhdXRob3JpdHkgZmlsZSBmb3IgcGVyZm9ybWluZyB2ZXJpZmljYXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCB0aGUgY2VydGlmaWNhdGVzIGZvciBvbmUgb3IgbW9yZSB0cnVzdGVkCi0gICAqIGNlcnRpZmljYXRpb24gYXV0aG9yaXRpZXMgZnJvbSBhIGZpbGUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eQotICAgKiBjZXJ0aWZpY2F0ZXMgaW4gUEVNIGZvcm1hdC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIGxvYWRfdmVyaWZ5X2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV8ubG9hZF92ZXJpZnlfZmlsZShpbXBsXywgZmlsZW5hbWUsIGVjKTsKLSAgfQotCi0gIC8vLyBBZGQgYSBkaXJlY3RvcnkgY29udGFpbmluZyBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgZmlsZXMgdG8gYmUgdXNlZCBmb3IKLSAgLy8vIHBlcmZvcm1pbmcgdmVyaWZpY2F0aW9uLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkgY29udGFpbmluZwotICAgKiBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBjZXJ0aWZpY2F0ZXMuIEVhY2ggZmlsZSBpbiB0aGUgZGlyZWN0b3J5IG11c3QKLSAgICogY29udGFpbiBhIHNpbmdsZSBjZXJ0aWZpY2F0ZS4gVGhlIGZpbGVzIG11c3QgYmUgbmFtZWQgdXNpbmcgdGhlIHN1YmplY3QKLSAgICogbmFtZSdzIGhhc2ggYW5kIGFuIGV4dGVuc2lvbiBvZiAiLjAiLgotICAgKgotICAgKiBAcGFyYW0gcGF0aCBUaGUgbmFtZSBvZiBhIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZXMuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBhZGRfdmVyaWZ5X3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHNlcnZpY2VfLmFkZF92ZXJpZnlfcGF0aChpbXBsXywgcGF0aCwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICB9Ci0KLSAgLy8vIEFkZCBhIGRpcmVjdG9yeSBjb250YWluaW5nIGNlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlcyB0byBiZSB1c2VkIGZvcgotICAvLy8gcGVyZm9ybWluZyB2ZXJpZmljYXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSBjb250YWluaW5nCi0gICAqIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5IGNlcnRpZmljYXRlcy4gRWFjaCBmaWxlIGluIHRoZSBkaXJlY3RvcnkgbXVzdAotICAgKiBjb250YWluIGEgc2luZ2xlIGNlcnRpZmljYXRlLiBUaGUgZmlsZXMgbXVzdCBiZSBuYW1lZCB1c2luZyB0aGUgc3ViamVjdAotICAgKiBuYW1lJ3MgaGFzaCBhbmQgYW4gZXh0ZW5zaW9uIG9mICIuMCIuCi0gICAqCi0gICAqIEBwYXJhbSBwYXRoIFRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNlcnRpZmljYXRlcy4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIGFkZF92ZXJpZnlfcGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfLmFkZF92ZXJpZnlfcGF0aChpbXBsXywgcGF0aCwgZWMpOwotICB9Ci0KLSAgLy8vIFVzZSBhIGNlcnRpZmljYXRlIGZyb20gYSBmaWxlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgYSBjZXJ0aWZpY2F0ZSBpbnRvIHRoZSBjb250ZXh0IGZyb20gYSBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUuCi0gICAqCi0gICAqIEBwYXJhbSBmb3JtYXQgVGhlIGZpbGUgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIHZvaWQgdXNlX2NlcnRpZmljYXRlX2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBmaWxlX2Zvcm1hdCBmb3JtYXQpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHNlcnZpY2VfLnVzZV9jZXJ0aWZpY2F0ZV9maWxlKGltcGxfLCBmaWxlbmFtZSwgZm9ybWF0LCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIH0KLQotICAvLy8gVXNlIGEgY2VydGlmaWNhdGUgZnJvbSBhIGZpbGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCBhIGNlcnRpZmljYXRlIGludG8gdGhlIGNvbnRleHQgZnJvbSBhIGZpbGUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZS4KLSAgICoKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgZmlsZSBmb3JtYXQgKEFTTi4xIG9yIFBFTSkuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSB1c2VfY2VydGlmaWNhdGVfZmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCi0gICAgICBmaWxlX2Zvcm1hdCBmb3JtYXQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfLnVzZV9jZXJ0aWZpY2F0ZV9maWxlKGltcGxfLCBmaWxlbmFtZSwgZm9ybWF0LCBlYyk7Ci0gIH0KLQotICAvLy8gVXNlIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBhIGZpbGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGludG8gdGhlIGNvbnRleHQgZnJvbSBhCi0gICAqIGZpbGUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZS4gVGhlIGZpbGUKLSAgICogbXVzdCB1c2UgdGhlIFBFTSBmb3JtYXQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCB1c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHNlcnZpY2VfLnVzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGltcGxfLCBmaWxlbmFtZSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICB9Ci0KLSAgLy8vIFVzZSBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gYSBmaWxlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBpbnRvIHRoZSBjb250ZXh0IGZyb20gYQotICAgKiBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGUuIFRoZSBmaWxlCi0gICAqIG11c3QgdXNlIHRoZSBQRU0gZm9ybWF0LgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfLnVzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGltcGxfLCBmaWxlbmFtZSwgZWMpOwotICB9Ci0KLSAgLy8vIFVzZSBhIHByaXZhdGUga2V5IGZyb20gYSBmaWxlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgYSBwcml2YXRlIGtleSBpbnRvIHRoZSBjb250ZXh0IGZyb20gYSBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcHJpdmF0ZSBrZXkuCi0gICAqCi0gICAqIEBwYXJhbSBmb3JtYXQgVGhlIGZpbGUgZm9ybWF0IChBU04uMSBvciBQRU0pLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIHZvaWQgdXNlX3ByaXZhdGVfa2V5X2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBmaWxlX2Zvcm1hdCBmb3JtYXQpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHNlcnZpY2VfLnVzZV9wcml2YXRlX2tleV9maWxlKGltcGxfLCBmaWxlbmFtZSwgZm9ybWF0LCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIH0KLQotICAvLy8gVXNlIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIGZpbGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCBhIHByaXZhdGUga2V5IGludG8gdGhlIGNvbnRleHQgZnJvbSBhIGZpbGUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleS4KLSAgICoKLSAgICogQHBhcmFtIGZvcm1hdCBUaGUgZmlsZSBmb3JtYXQgKEFTTi4xIG9yIFBFTSkuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSB1c2VfcHJpdmF0ZV9rZXlfZmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCi0gICAgICBmaWxlX2Zvcm1hdCBmb3JtYXQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfLnVzZV9wcml2YXRlX2tleV9maWxlKGltcGxfLCBmaWxlbmFtZSwgZm9ybWF0LCBlYyk7Ci0gIH0KLQotICAvLy8gVXNlIGFuIFJTQSBwcml2YXRlIGtleSBmcm9tIGEgZmlsZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIGFuIFJTQSBwcml2YXRlIGtleSBpbnRvIHRoZSBjb250ZXh0IGZyb20gYQotICAgKiBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgUlNBIHByaXZhdGUga2V5LgotICAgKgotICAgKiBAcGFyYW0gZm9ybWF0IFRoZSBmaWxlIGZvcm1hdCAoQVNOLjEgb3IgUEVNKS4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICB2b2lkIHVzZV9yc2FfcHJpdmF0ZV9rZXlfZmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGZpbGVfZm9ybWF0IGZvcm1hdCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc2VydmljZV8udXNlX3JzYV9wcml2YXRlX2tleV9maWxlKGltcGxfLCBmaWxlbmFtZSwgZm9ybWF0LCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIH0KLQotICAvLy8gVXNlIGFuIFJTQSBwcml2YXRlIGtleSBmcm9tIGEgZmlsZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkIGFuIFJTQSBwcml2YXRlIGtleSBpbnRvIHRoZSBjb250ZXh0IGZyb20gYQotICAgKiBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgUlNBIHByaXZhdGUga2V5LgotICAgKgotICAgKiBAcGFyYW0gZm9ybWF0IFRoZSBmaWxlIGZvcm1hdCAoQVNOLjEgb3IgUEVNKS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIHVzZV9yc2FfcHJpdmF0ZV9rZXlfZmlsZSgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgZmlsZV9mb3JtYXQgZm9ybWF0LAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV8udXNlX3JzYV9wcml2YXRlX2tleV9maWxlKGltcGxfLCBmaWxlbmFtZSwgZm9ybWF0LCBlYyk7Ci0gIH0KLQotICAvLy8gVXNlIHRoZSBzcGVjaWZpZWQgZmlsZSB0byBvYnRhaW4gdGhlIHRlbXBvcmFyeSBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgRGlmZmllLUhlbGxtYW4gcGFyYW1ldGVycyBpbnRvIHRoZSBjb250ZXh0Ci0gICAqIGZyb20gYSBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgRGlmZmllLUhlbGxtYW4KLSAgICogcGFyYW1ldGVycy4gVGhlIGZpbGUgbXVzdCB1c2UgdGhlIFBFTSBmb3JtYXQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCB1c2VfdG1wX2RoX2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzZXJ2aWNlXy51c2VfdG1wX2RoX2ZpbGUoaW1wbF8sIGZpbGVuYW1lLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gIH0KLQotICAvLy8gVXNlIHRoZSBzcGVjaWZpZWQgZmlsZSB0byBvYnRhaW4gdGhlIHRlbXBvcmFyeSBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQgRGlmZmllLUhlbGxtYW4gcGFyYW1ldGVycyBpbnRvIHRoZSBjb250ZXh0Ci0gICAqIGZyb20gYSBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgRGlmZmllLUhlbGxtYW4KLSAgICogcGFyYW1ldGVycy4gVGhlIGZpbGUgbXVzdCB1c2UgdGhlIFBFTSBmb3JtYXQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSB1c2VfdG1wX2RoX2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV8udXNlX3RtcF9kaF9maWxlKGltcGxfLCBmaWxlbmFtZSwgZWMpOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgcGFzc3dvcmQgY2FsbGJhY2suCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIG9idGFpbiBwYXNzd29yZAotICAgKiBpbmZvcm1hdGlvbiBhYm91dCBhbiBlbmNyeXB0ZWQga2V5IGluIFBFTSBmb3JtYXQuCi0gICAqCi0gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIHVzZWQgZm9yIG9idGFpbmluZyB0aGUgcGFzc3dvcmQuCi0gICAqIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgc3RkOjpzdHJpbmcgcGFzc3dvcmRfY2FsbGJhY2soCi0gICAqICAgc3RkOjpzaXplX3QgbWF4X2xlbmd0aCwgIC8vIFRoZSBtYXhpbXVtIHNpemUgZm9yIGEgcGFzc3dvcmQuCi0gICAqICAgcGFzc3dvcmRfcHVycG9zZSBwdXJwb3NlIC8vIFdoZXRoZXIgcGFzc3dvcmQgaXMgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcGFzc3dvcmQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhc3N3b3JkQ2FsbGJhY2s+Ci0gIHZvaWQgc2V0X3Bhc3N3b3JkX2NhbGxiYWNrKFBhc3N3b3JkQ2FsbGJhY2sgY2FsbGJhY2spCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHNlcnZpY2VfLnNldF9wYXNzd29yZF9jYWxsYmFjayhpbXBsXywgY2FsbGJhY2ssIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjKTsKLSAgfQotCi0gIC8vLyBTZXQgdGhlIHBhc3N3b3JkIGNhbGxiYWNrLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBvYnRhaW4gcGFzc3dvcmQKLSAgICogaW5mb3JtYXRpb24gYWJvdXQgYW4gZW5jcnlwdGVkIGtleSBpbiBQRU0gZm9ybWF0LgotICAgKgotICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIHBhc3N3b3JkLgotICAgKiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHN0ZDo6c3RyaW5nIHBhc3N3b3JkX2NhbGxiYWNrKAotICAgKiAgIHN0ZDo6c2l6ZV90IG1heF9sZW5ndGgsICAvLyBUaGUgbWF4aW11bSBzaXplIGZvciBhIHBhc3N3b3JkLgotICAgKiAgIHBhc3N3b3JkX3B1cnBvc2UgcHVycG9zZSAvLyBXaGV0aGVyIHBhc3N3b3JkIGlzIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNhbGxiYWNrIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhc3N3b3JkLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBQYXNzd29yZENhbGxiYWNrPgotICBhc2lvOjplcnJvcl9jb2RlIHNldF9wYXNzd29yZF9jYWxsYmFjayhQYXNzd29yZENhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV8uc2V0X3Bhc3N3b3JkX2NhbGxiYWNrKGltcGxfLCBjYWxsYmFjaywgZWMpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vLyBUaGUgYmFja2VuZCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICBzZXJ2aWNlX3R5cGUmIHNlcnZpY2VfOwotCi0gIC8vLyBUaGUgdW5kZXJseWluZyBuYXRpdmUgaW1wbGVtZW50YXRpb24uCi0gIGltcGxfdHlwZSBpbXBsXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIG9sZAotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9PTERfQkFTSUNfQ09OVEVYVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvb2xkL2NvbnRleHRfc2VydmljZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL29sZC9jb250ZXh0X3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYwYWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvb2xkL2NvbnRleHRfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8KLS8vIHNzbC9vbGQvY29udGV4dF9zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDA1IFZvaXBzdGVyIC8gSW5kcmVrIGRvdCBKdWhhbmkgYXQgdm9pcHN0ZXIgZG90IGNvbQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX09MRF9DT05URVhUX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fU1NMX09MRF9DT05URVhUX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL2NvbnRleHRfYmFzZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvb2xkL2RldGFpbC9vcGVuc3NsX2NvbnRleHRfc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2Ugc3NsIHsKLW5hbWVzcGFjZSBvbGQgewotCi0vLy8gRGVmYXVsdCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZvciBhIGNvbnRleHQuCi1jbGFzcyBjb250ZXh0X3NlcnZpY2UKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgOiBwdWJsaWMgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZQotI2Vsc2UKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8Y29udGV4dF9zZXJ2aWNlPgotI2VuZGlmCi17Ci1wcml2YXRlOgotICAvLyBUaGUgdHlwZSBvZiB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCi0gIHR5cGVkZWYgb2xkOjpkZXRhaWw6Om9wZW5zc2xfY29udGV4dF9zZXJ2aWNlIHNlcnZpY2VfaW1wbF90eXBlOwotCi1wdWJsaWM6Ci0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBUaGUgdW5pcXVlIHNlcnZpY2UgaWRlbnRpZmllci4KLSAgc3RhdGljIGFzaW86OmlvX3NlcnZpY2U6OmlkIGlkOwotI2VuZGlmCi0KLSAgLy8vIFRoZSB0eXBlIG9mIHRoZSBjb250ZXh0LgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgaW1wbF90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBzZXJ2aWNlX2ltcGxfdHlwZTo6aW1wbF90eXBlIGltcGxfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBDb25zdHJ1Y3Rvci4KLSAgZXhwbGljaXQgY29udGV4dF9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxjb250ZXh0X3NlcnZpY2U+KGlvX3NlcnZpY2UpLAotICAgICAgc2VydmljZV9pbXBsXyhhc2lvOjp1c2Vfc2VydmljZTxzZXJ2aWNlX2ltcGxfdHlwZT4oaW9fc2VydmljZSkpCi0gIHsKLSAgfQotCi0gIC8vLyBSZXR1cm4gYSBudWxsIGNvbnRleHQgaW1wbGVtZW50YXRpb24uCi0gIGltcGxfdHlwZSBudWxsKCkgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm51bGwoKTsKLSAgfQotCi0gIC8vLyBDcmVhdGUgYSBuZXcgY29udGV4dCBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBjcmVhdGUoaW1wbF90eXBlJiBpbXBsLCBjb250ZXh0X2Jhc2U6Om1ldGhvZCBtKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5jcmVhdGUoaW1wbCwgbSk7Ci0gIH0KLQotICAvLy8gRGVzdHJveSBhIGNvbnRleHQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgZGVzdHJveShpbXBsX3R5cGUmIGltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmRlc3Ryb3koaW1wbCk7Ci0gIH0KLQotICAvLy8gU2V0IG9wdGlvbnMgb24gdGhlIGNvbnRleHQuCi0gIGFzaW86OmVycm9yX2NvZGUgc2V0X29wdGlvbnMoaW1wbF90eXBlJiBpbXBsLAotICAgICAgY29udGV4dF9iYXNlOjpvcHRpb25zIG8sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2V0X29wdGlvbnMoaW1wbCwgbywgZWMpOwotICB9Ci0KLSAgLy8vIFNldCBwZWVyIHZlcmlmaWNhdGlvbiBtb2RlLgotICBhc2lvOjplcnJvcl9jb2RlIHNldF92ZXJpZnlfbW9kZShpbXBsX3R5cGUmIGltcGwsCi0gICAgICBjb250ZXh0X2Jhc2U6OnZlcmlmeV9tb2RlIHYsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2V0X3ZlcmlmeV9tb2RlKGltcGwsIHYsIGVjKTsKLSAgfQotCi0gIC8vLyBMb2FkIGEgY2VydGlmaWNhdGlvbiBhdXRob3JpdHkgZmlsZSBmb3IgcGVyZm9ybWluZyB2ZXJpZmljYXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgbG9hZF92ZXJpZnlfZmlsZShpbXBsX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubG9hZF92ZXJpZnlfZmlsZShpbXBsLCBmaWxlbmFtZSwgZWMpOwotICB9Ci0KLSAgLy8vIEFkZCBhIGRpcmVjdG9yeSBjb250YWluaW5nIGNlcnRpZmljYXRpb24gYXV0aG9yaXR5IGZpbGVzIHRvIGJlIHVzZWQgZm9yCi0gIC8vLyBwZXJmb3JtaW5nIHZlcmlmaWNhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhZGRfdmVyaWZ5X3BhdGgoaW1wbF90eXBlJiBpbXBsLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uYWRkX3ZlcmlmeV9wYXRoKGltcGwsIHBhdGgsIGVjKTsKLSAgfQotCi0gIC8vLyBVc2UgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZmlsZS4KLSAgYXNpbzo6ZXJyb3JfY29kZSB1c2VfY2VydGlmaWNhdGVfZmlsZShpbXBsX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnRleHRfYmFzZTo6ZmlsZV9mb3JtYXQgZm9ybWF0LAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy51c2VfY2VydGlmaWNhdGVfZmlsZShpbXBsLCBmaWxlbmFtZSwgZm9ybWF0LCBlYyk7Ci0gIH0KLQotICAvLy8gVXNlIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBhIGZpbGUuCi0gIGFzaW86OmVycm9yX2NvZGUgdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoaW1wbF90eXBlJiBpbXBsLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnVzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGltcGwsIGZpbGVuYW1lLCBlYyk7Ci0gIH0KLQotICAvLy8gVXNlIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIGZpbGUuCi0gIGFzaW86OmVycm9yX2NvZGUgdXNlX3ByaXZhdGVfa2V5X2ZpbGUoaW1wbF90eXBlJiBpbXBsLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb250ZXh0X2Jhc2U6OmZpbGVfZm9ybWF0IGZvcm1hdCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8udXNlX3ByaXZhdGVfa2V5X2ZpbGUoaW1wbCwgZmlsZW5hbWUsIGZvcm1hdCwgZWMpOwotICB9Ci0KLSAgLy8vIFVzZSBhbiBSU0EgcHJpdmF0ZSBrZXkgZnJvbSBhIGZpbGUuCi0gIGFzaW86OmVycm9yX2NvZGUgdXNlX3JzYV9wcml2YXRlX2tleV9maWxlKGltcGxfdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29udGV4dF9iYXNlOjpmaWxlX2Zvcm1hdCBmb3JtYXQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnVzZV9yc2FfcHJpdmF0ZV9rZXlfZmlsZShpbXBsLCBmaWxlbmFtZSwgZm9ybWF0LCBlYyk7Ci0gIH0KLQotICAvLy8gVXNlIHRoZSBzcGVjaWZpZWQgZmlsZSB0byBvYnRhaW4gdGhlIHRlbXBvcmFyeSBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzLgotICBhc2lvOjplcnJvcl9jb2RlIHVzZV90bXBfZGhfZmlsZShpbXBsX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8udXNlX3RtcF9kaF9maWxlKGltcGwsIGZpbGVuYW1lLCBlYyk7Ci0gIH0KLQotICAvLy8gU2V0IHRoZSBwYXNzd29yZCBjYWxsYmFjay4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhc3N3b3JkQ2FsbGJhY2s+Ci0gIGFzaW86OmVycm9yX2NvZGUgc2V0X3Bhc3N3b3JkX2NhbGxiYWNrKGltcGxfdHlwZSYgaW1wbCwKLSAgICAgIFBhc3N3b3JkQ2FsbGJhY2sgY2FsbGJhY2ssIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2V0X3Bhc3N3b3JkX2NhbGxiYWNrKGltcGwsIGNhbGxiYWNrLCBlYyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCkKLSAgewotICB9Ci0KLSAgLy8gVGhlIHNlcnZpY2UgdGhhdCBwcm92aWRlcyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCi0gIHNlcnZpY2VfaW1wbF90eXBlJiBzZXJ2aWNlX2ltcGxfOwotfTsKLQotfSAvLyBuYW1lc3BhY2Ugb2xkCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX09MRF9DT05URVhUX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL29sZC9kZXRhaWwvb3BlbnNzbF9jb250ZXh0X3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9vbGQvZGV0YWlsL29wZW5zc2xfY29udGV4dF9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhYmQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL29sZC9kZXRhaWwvb3BlbnNzbF9jb250ZXh0X3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8vCi0vLyBzc2wvb2xkL2RldGFpbC9vcGVuc3NsX2NvbnRleHRfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwNSBWb2lwc3RlciAvIEluZHJlayBkb3QgSnVoYW5pIGF0IHZvaXBzdGVyIGRvdCBjb20KLS8vIENvcHlyaWdodCAoYykgMjAwNS0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9PTERfREVUQUlMX09QRU5TU0xfQ09OVEVYVF9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX1NTTF9PTERfREVUQUlMX09QRU5TU0xfQ09OVEVYVF9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC9jb250ZXh0X2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9vcGVuc3NsX2luaXQuaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9vcGVuc3NsX3R5cGVzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotbmFtZXNwYWNlIG9sZCB7Ci1uYW1lc3BhY2UgZGV0YWlsIHsKLQotY2xhc3Mgb3BlbnNzbF9jb250ZXh0X3NlcnZpY2UKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8b3BlbnNzbF9jb250ZXh0X3NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gIC8vIFRoZSBuYXRpdmUgdHlwZSBvZiB0aGUgY29udGV4dC4KLSAgdHlwZWRlZiA6OlNTTF9DVFgqIGltcGxfdHlwZTsKLQotICAvLyBUaGUgdHlwZSBmb3IgdGhlIHBhc3N3b3JkIGNhbGxiYWNrIGZ1bmN0aW9uIG9iamVjdC4KLSAgdHlwZWRlZiBib29zdDo6ZnVuY3Rpb248c3RkOjpzdHJpbmcoc3RkOjpzaXplX3QsCi0gICAgICBjb250ZXh0X2Jhc2U6OnBhc3N3b3JkX3B1cnBvc2UpPiBwYXNzd29yZF9jYWxsYmFja190eXBlOwotCi0gIC8vIENvbnN0cnVjdG9yLgotICBvcGVuc3NsX2NvbnRleHRfc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8b3BlbnNzbF9jb250ZXh0X3NlcnZpY2U+KGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIHZvaWQgc2h1dGRvd25fc2VydmljZSgpCi0gIHsKLSAgfQotCi0gIC8vIFJldHVybiBhIG51bGwgY29udGV4dCBpbXBsZW1lbnRhdGlvbi4KLSAgc3RhdGljIGltcGxfdHlwZSBudWxsKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGEgbmV3IGNvbnRleHQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgY3JlYXRlKGltcGxfdHlwZSYgaW1wbCwgY29udGV4dF9iYXNlOjptZXRob2QgbSkKLSAgewotICAgIHN3aXRjaCAobSkKLSAgICB7Ci0jaWYgZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpCi0gICAgY2FzZSBjb250ZXh0X2Jhc2U6OnNzbHYyOgotICAgIGNhc2UgY29udGV4dF9iYXNlOjpzc2x2Ml9jbGllbnQ6Ci0gICAgY2FzZSBjb250ZXh0X2Jhc2U6OnNzbHYyX3NlcnZlcjoKLSAgICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQpOwotICAgICAgYnJlYWs7Ci0jZWxzZSAvLyBkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMikKLSAgICBjYXNlIGNvbnRleHRfYmFzZTo6c3NsdjI6Ci0gICAgICBpbXBsID0gOjpTU0xfQ1RYX25ldyg6OlNTTHYyX21ldGhvZCgpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29udGV4dF9iYXNlOjpzc2x2Ml9jbGllbnQ6Ci0gICAgICBpbXBsID0gOjpTU0xfQ1RYX25ldyg6OlNTTHYyX2NsaWVudF9tZXRob2QoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvbnRleHRfYmFzZTo6c3NsdjJfc2VydmVyOgotICAgICAgaW1wbCA9IDo6U1NMX0NUWF9uZXcoOjpTU0x2Ml9zZXJ2ZXJfbWV0aG9kKCkpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYgLy8gZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpCi0gICAgY2FzZSBjb250ZXh0X2Jhc2U6OnNzbHYzOgotICAgICAgaW1wbCA9IDo6U1NMX0NUWF9uZXcoOjpTU0x2M19tZXRob2QoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvbnRleHRfYmFzZTo6c3NsdjNfY2xpZW50OgotICAgICAgaW1wbCA9IDo6U1NMX0NUWF9uZXcoOjpTU0x2M19jbGllbnRfbWV0aG9kKCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb250ZXh0X2Jhc2U6OnNzbHYzX3NlcnZlcjoKLSAgICAgIGltcGwgPSA6OlNTTF9DVFhfbmV3KDo6U1NMdjNfc2VydmVyX21ldGhvZCgpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29udGV4dF9iYXNlOjp0bHN2MToKLSAgICAgIGltcGwgPSA6OlNTTF9DVFhfbmV3KDo6VExTdjFfbWV0aG9kKCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb250ZXh0X2Jhc2U6OnRsc3YxX2NsaWVudDoKLSAgICAgIGltcGwgPSA6OlNTTF9DVFhfbmV3KDo6VExTdjFfY2xpZW50X21ldGhvZCgpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29udGV4dF9iYXNlOjp0bHN2MV9zZXJ2ZXI6Ci0gICAgICBpbXBsID0gOjpTU0xfQ1RYX25ldyg6OlRMU3YxX3NlcnZlcl9tZXRob2QoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvbnRleHRfYmFzZTo6c3NsdjIzOgotICAgICAgaW1wbCA9IDo6U1NMX0NUWF9uZXcoOjpTU0x2MjNfbWV0aG9kKCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb250ZXh0X2Jhc2U6OnNzbHYyM19jbGllbnQ6Ci0gICAgICBpbXBsID0gOjpTU0xfQ1RYX25ldyg6OlNTTHYyM19jbGllbnRfbWV0aG9kKCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb250ZXh0X2Jhc2U6OnNzbHYyM19zZXJ2ZXI6Ci0gICAgICBpbXBsID0gOjpTU0xfQ1RYX25ldyg6OlNTTHYyM19zZXJ2ZXJfbWV0aG9kKCkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGltcGwgPSA6OlNTTF9DVFhfbmV3KDApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gRGVzdHJveSBhIGNvbnRleHQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgZGVzdHJveShpbXBsX3R5cGUmIGltcGwpCi0gIHsKLSAgICBpZiAoaW1wbCAhPSBudWxsKCkpCi0gICAgewotICAgICAgaWYgKGltcGwtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKQotICAgICAgewotICAgICAgICBwYXNzd29yZF9jYWxsYmFja190eXBlKiBjYWxsYmFjayA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8cGFzc3dvcmRfY2FsbGJhY2tfdHlwZSo+KAotICAgICAgICAgICAgICBpbXBsLT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSk7Ci0gICAgICAgIGRlbGV0ZSBjYWxsYmFjazsKLSAgICAgICAgaW1wbC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEgPSAwOwotICAgICAgfQotCi0gICAgICA6OlNTTF9DVFhfZnJlZShpbXBsKTsKLSAgICAgIGltcGwgPSBudWxsKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gU2V0IG9wdGlvbnMgb24gdGhlIGNvbnRleHQuCi0gIGFzaW86OmVycm9yX2NvZGUgc2V0X29wdGlvbnMoaW1wbF90eXBlJiBpbXBsLAotICAgICAgY29udGV4dF9iYXNlOjpvcHRpb25zIG8sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgOjpTU0xfQ1RYX3NldF9vcHRpb25zKGltcGwsIG8pOwotCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gU2V0IHBlZXIgdmVyaWZpY2F0aW9uIG1vZGUuCi0gIGFzaW86OmVycm9yX2NvZGUgc2V0X3ZlcmlmeV9tb2RlKGltcGxfdHlwZSYgaW1wbCwKLSAgICAgIGNvbnRleHRfYmFzZTo6dmVyaWZ5X21vZGUgdiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICA6OlNTTF9DVFhfc2V0X3ZlcmlmeShpbXBsLCB2LCAwKTsKLQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIExvYWQgYSBjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSBmaWxlIGZvciBwZXJmb3JtaW5nIHZlcmlmaWNhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBsb2FkX3ZlcmlmeV9maWxlKGltcGxfdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBpZiAoOjpTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhpbXBsLCBmaWxlbmFtZS5jX3N0cigpLCAwKSAhPSAxKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgICByZXR1cm4gZWM7Ci0gICAgfQotCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gQWRkIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgY2VydGlmaWNhdGlvbiBhdXRob3JpdHkgZmlsZXMgdG8gYmUgdXNlZCBmb3IKLSAgLy8gcGVyZm9ybWluZyB2ZXJpZmljYXRpb24uCi0gIGFzaW86OmVycm9yX2NvZGUgYWRkX3ZlcmlmeV9wYXRoKGltcGxfdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGlmICg6OlNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGltcGwsIDAsIHBhdGguY19zdHIoKSkgIT0gMSkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgcmV0dXJuIGVjOwotICAgIH0KLQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFVzZSBhIGNlcnRpZmljYXRlIGZyb20gYSBmaWxlLgotICBhc2lvOjplcnJvcl9jb2RlIHVzZV9jZXJ0aWZpY2F0ZV9maWxlKGltcGxfdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29udGV4dF9iYXNlOjpmaWxlX2Zvcm1hdCBmb3JtYXQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGludCBmaWxlX3R5cGU7Ci0gICAgc3dpdGNoIChmb3JtYXQpCi0gICAgewotICAgIGNhc2UgY29udGV4dF9iYXNlOjphc24xOgotICAgICAgZmlsZV90eXBlID0gU1NMX0ZJTEVUWVBFX0FTTjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvbnRleHRfYmFzZTo6cGVtOgotICAgICAgZmlsZV90eXBlID0gU1NMX0ZJTEVUWVBFX1BFTTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgICAgIHJldHVybiBlYzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoOjpTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKGltcGwsIGZpbGVuYW1lLmNfc3RyKCksIGZpbGVfdHlwZSkgIT0gMSkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgcmV0dXJuIGVjOwotICAgIH0KLQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFVzZSBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gYSBmaWxlLgotICBhc2lvOjplcnJvcl9jb2RlIHVzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGltcGxfdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBpZiAoOjpTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKGltcGwsIGZpbGVuYW1lLmNfc3RyKCkpICE9IDEpCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgIHJldHVybiBlYzsKLSAgICB9Ci0KLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBVc2UgYSBwcml2YXRlIGtleSBmcm9tIGEgZmlsZS4KLSAgYXNpbzo6ZXJyb3JfY29kZSB1c2VfcHJpdmF0ZV9rZXlfZmlsZShpbXBsX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnRleHRfYmFzZTo6ZmlsZV9mb3JtYXQgZm9ybWF0LAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBpbnQgZmlsZV90eXBlOwotICAgIHN3aXRjaCAoZm9ybWF0KQotICAgIHsKLSAgICBjYXNlIGNvbnRleHRfYmFzZTo6YXNuMToKLSAgICAgIGZpbGVfdHlwZSA9IFNTTF9GSUxFVFlQRV9BU04xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb250ZXh0X2Jhc2U6OnBlbToKLSAgICAgIGZpbGVfdHlwZSA9IFNTTF9GSUxFVFlQRV9QRU07Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgewotICAgICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgICByZXR1cm4gZWM7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKDo6U1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKGltcGwsIGZpbGVuYW1lLmNfc3RyKCksIGZpbGVfdHlwZSkgIT0gMSkKLSAgICB7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgcmV0dXJuIGVjOwotICAgIH0KLQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vIFVzZSBhbiBSU0EgcHJpdmF0ZSBrZXkgZnJvbSBhIGZpbGUuCi0gIGFzaW86OmVycm9yX2NvZGUgdXNlX3JzYV9wcml2YXRlX2tleV9maWxlKGltcGxfdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29udGV4dF9iYXNlOjpmaWxlX2Zvcm1hdCBmb3JtYXQsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGludCBmaWxlX3R5cGU7Ci0gICAgc3dpdGNoIChmb3JtYXQpCi0gICAgewotICAgIGNhc2UgY29udGV4dF9iYXNlOjphc24xOgotICAgICAgZmlsZV90eXBlID0gU1NMX0ZJTEVUWVBFX0FTTjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvbnRleHRfYmFzZTo6cGVtOgotICAgICAgZmlsZV90eXBlID0gU1NMX0ZJTEVUWVBFX1BFTTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgICAgIHJldHVybiBlYzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoOjpTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUoCi0gICAgICAgICAgaW1wbCwgZmlsZW5hbWUuY19zdHIoKSwgZmlsZV90eXBlKSAhPSAxKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgICByZXR1cm4gZWM7Ci0gICAgfQotCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8gVXNlIHRoZSBzcGVjaWZpZWQgZmlsZSB0byBvYnRhaW4gdGhlIHRlbXBvcmFyeSBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzLgotICBhc2lvOjplcnJvcl9jb2RlIHVzZV90bXBfZGhfZmlsZShpbXBsX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgOjpCSU8qIGJpbyA9IDo6QklPX25ld19maWxlKGZpbGVuYW1lLmNfc3RyKCksICJyIik7Ci0gICAgaWYgKCFiaW8pCi0gICAgewotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICAgIHJldHVybiBlYzsKLSAgICB9Ci0KLSAgICA6OkRIKiBkaCA9IDo6UEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgMCwgMCwgMCk7Ci0gICAgaWYgKCFkaCkKLSAgICB7Ci0gICAgICA6OkJJT19mcmVlKGJpbyk7Ci0gICAgICBlYyA9IGFzaW86OmVycm9yOjppbnZhbGlkX2FyZ3VtZW50OwotICAgICAgcmV0dXJuIGVjOwotICAgIH0KLQotICAgIDo6QklPX2ZyZWUoYmlvKTsKLSAgICBpbnQgcmVzdWx0ID0gOjpTU0xfQ1RYX3NldF90bXBfZGgoaW1wbCwgZGgpOwotICAgIDo6REhfZnJlZShkaCk7Ci0gICAgaWYgKHJlc3VsdCAhPSAxKQotICAgIHsKLSAgICAgIGVjID0gYXNpbzo6ZXJyb3I6OmludmFsaWRfYXJndW1lbnQ7Ci0gICAgICByZXR1cm4gZWM7Ci0gICAgfQotCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgc3RhdGljIGludCBwYXNzd29yZF9jYWxsYmFjayhjaGFyKiBidWYsIGludCBzaXplLCBpbnQgcHVycG9zZSwgdm9pZCogZGF0YSkKLSAgewotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7IC8vIEZvciBzdHJuY2F0IGFuZCBzdHJsZW4uCi0KLSAgICBpZiAoZGF0YSkKLSAgICB7Ci0gICAgICBwYXNzd29yZF9jYWxsYmFja190eXBlKiBjYWxsYmFjayA9Ci0gICAgICAgIHN0YXRpY19jYXN0PHBhc3N3b3JkX2NhbGxiYWNrX3R5cGUqPihkYXRhKTsKLSAgICAgIHN0ZDo6c3RyaW5nIHBhc3N3ZCA9ICgqY2FsbGJhY2spKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzaXplKSwKLSAgICAgICAgICBwdXJwb3NlID8gY29udGV4dF9iYXNlOjpmb3Jfd3JpdGluZyA6IGNvbnRleHRfYmFzZTo6Zm9yX3JlYWRpbmcpOwotICAgICAgKmJ1ZiA9ICdcMCc7Ci0gICAgICBzdHJuY2F0KGJ1ZiwgcGFzc3dkLmNfc3RyKCksIHNpemUpOwotICAgICAgcmV0dXJuIHN0cmxlbihidWYpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBwYXNzd29yZCBjYWxsYmFjay4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhc3N3b3JkX0NhbGxiYWNrPgotICBhc2lvOjplcnJvcl9jb2RlIHNldF9wYXNzd29yZF9jYWxsYmFjayhpbXBsX3R5cGUmIGltcGwsCi0gICAgICBQYXNzd29yZF9DYWxsYmFjayBjYWxsYmFjaywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICAvLyBBbGxvY2F0ZSBjYWxsYmFjayBmdW5jdGlvbiBvYmplY3QgaWYgbm90IGFscmVhZHkgcHJlc2VudC4KLSAgICBpZiAoaW1wbC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpCi0gICAgewotICAgICAgcGFzc3dvcmRfY2FsbGJhY2tfdHlwZSogY2FsbGJhY2tfZnVuY3Rpb24gPQotICAgICAgICBzdGF0aWNfY2FzdDxwYXNzd29yZF9jYWxsYmFja190eXBlKj4oCi0gICAgICAgICAgICBpbXBsLT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSk7Ci0gICAgICAqY2FsbGJhY2tfZnVuY3Rpb24gPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHBhc3N3b3JkX2NhbGxiYWNrX3R5cGUqIGNhbGxiYWNrX2Z1bmN0aW9uID0KLSAgICAgICAgbmV3IHBhc3N3b3JkX2NhbGxiYWNrX3R5cGUoY2FsbGJhY2spOwotICAgICAgaW1wbC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEgPSBjYWxsYmFja19mdW5jdGlvbjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHBhc3N3b3JkIGNhbGxiYWNrLgotICAgIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKGltcGwsCi0gICAgICAgICZvcGVuc3NsX2NvbnRleHRfc2VydmljZTo6cGFzc3dvcmRfY2FsbGJhY2spOwotCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIEVuc3VyZSBvcGVuc3NsIGlzIGluaXRpYWxpc2VkLgotICBhc2lvOjpzc2w6OmRldGFpbDo6b3BlbnNzbF9pbml0PD4gaW5pdF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIG9sZAotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9PTERfREVUQUlMX09QRU5TU0xfQ09OVEVYVF9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9vbGQvZGV0YWlsL29wZW5zc2xfb3BlcmF0aW9uLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvb2xkL2RldGFpbC9vcGVuc3NsX29wZXJhdGlvbi5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYTljOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9vbGQvZGV0YWlsL29wZW5zc2xfb3BlcmF0aW9uLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi0vLwotLy8gc3NsL29sZC9kZXRhaWwvb3BlbnNzbF9vcGVyYXRpb24uaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgVm9pcHN0ZXIgLyBJbmRyZWsgZG90IEp1aGFuaSBhdCB2b2lwc3RlciBkb3QgY29tCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX09MRF9ERVRBSUxfT1BFTlNTTF9PUEVSQVRJT05fSFBQCi0jZGVmaW5lIEFTSU9fU1NMX09MRF9ERVRBSUxfT1BFTlNTTF9PUEVSQVRJT05fSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgotI2luY2x1ZGUgPGJvb3N0L2JpbmQuaHBwPgotI2luY2x1ZGUgImFzaW8vYnVmZmVyLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9hc3NlcnQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF9vcHMuaHBwIgotI2luY2x1ZGUgImFzaW8vcGxhY2Vob2xkZXJzLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvb3BlbnNzbF90eXBlcy5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vc3RyYW5kLmhwcCIKLSNpbmNsdWRlICJhc2lvL3N5c3RlbV9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby93cml0ZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2Ugc3NsIHsKLW5hbWVzcGFjZSBvbGQgewotbmFtZXNwYWNlIGRldGFpbCB7Ci0KLXR5cGVkZWYgYm9vc3Q6OmZ1bmN0aW9uPGludCAoOjpTU0wqKT4gc3NsX3ByaW1pdGl2ZV9mdW5jOyAKLXR5cGVkZWYgYm9vc3Q6OmZ1bmN0aW9uPHZvaWQgKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmLCBpbnQpPgotICB1c2VyX2hhbmRsZXJfZnVuYzsKLQotLy8gTmV0d29yayBzZW5kXy9yZWN2IGJ1ZmZlciBpbXBsZW1lbnRhdGlvbgotLy8KLS8vCi1jbGFzcyBuZXRfYnVmZmVyCi17Ci0gIHN0YXRpYyBjb25zdCBpbnQgIE5FVF9CVUZfU0laRSA9IDE2KjEwMjQgKyAyNTY7IC8vIFNTTCByZWNvcmQgc2l6ZSArIHNwYXJlCi0KLSAgdW5zaWduZWQgY2hhciBidWZfW05FVF9CVUZfU0laRV07Ci0gIHVuc2lnbmVkIGNoYXIqIGRhdGFfc3RhcnRfOwotICB1bnNpZ25lZCBjaGFyKiBkYXRhX2VuZF87Ci0KLXB1YmxpYzoKLSAgbmV0X2J1ZmZlcigpCi0gIHsKLSAgICBkYXRhX3N0YXJ0XyA9IGRhdGFfZW5kXyA9IGJ1Zl87Ci0gIH0KLSAgdW5zaWduZWQgY2hhciogZ2V0X3VudXNlZF9zdGFydCgpIHsgcmV0dXJuIGRhdGFfZW5kXzsgfQotICB1bnNpZ25lZCBjaGFyKiBnZXRfZGF0YV9zdGFydCgpIHsgcmV0dXJuIGRhdGFfc3RhcnRfOyB9Ci0gIHNpemVfdCBnZXRfdW51c2VkX2xlbigpIHsgcmV0dXJuIChORVRfQlVGX1NJWkUgLSAoZGF0YV9lbmRfIC0gYnVmXykpOyB9ICAgIAotICBzaXplX3QgZ2V0X2RhdGFfbGVuKCkgeyByZXR1cm4gKGRhdGFfZW5kXyAtIGRhdGFfc3RhcnRfKTsgfSAgICAKLSAgdm9pZCBkYXRhX2FkZGVkKHNpemVfdCBjb3VudCkKLSAgeyAKLSAgICBkYXRhX2VuZF8gKz0gY291bnQ7IAotICAgIGRhdGFfZW5kXyA9IGRhdGFfZW5kXyA+IChidWZfICsgTkVUX0JVRl9TSVpFKT8gCi0gICAgICAoYnVmXyArIE5FVF9CVUZfU0laRSk6Ci0gICAgICBkYXRhX2VuZF87IAotICB9Ci0gIHZvaWQgZGF0YV9yZW1vdmVkKHNpemVfdCBjb3VudCkgCi0gIHsgCi0gICAgZGF0YV9zdGFydF8gKz0gY291bnQ7IAotICAgIGlmIChkYXRhX3N0YXJ0XyA+PSBkYXRhX2VuZF8pIHJlc2V0KCk7IAotICB9Ci0gIHZvaWQgcmVzZXQoKSB7IGRhdGFfc3RhcnRfID0gYnVmXzsgZGF0YV9lbmRfID0gYnVmXzsgfSAgICAgICAgICAgICAgIAotICBib29sIGhhc19kYXRhKCkgeyByZXR1cm4gKGRhdGFfc3RhcnRfIDwgZGF0YV9lbmRfKTsgfQotfTsgLy8gY2xhc3MgbmV0X2J1ZmZlcgotCi0vLwotLy8gT3BlcmF0aW9uIGNsYXNzCi0vLwotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0+Ci1jbGFzcyBvcGVuc3NsX29wZXJhdGlvbgotewotcHVibGljOgotCi0gIC8vIENvbnN0cnVjdG9yIGZvciBhc3luY2hyb25vdXMgb3BlcmF0aW9ucwotICBvcGVuc3NsX29wZXJhdGlvbihzc2xfcHJpbWl0aXZlX2Z1bmMgcHJpbWl0aXZlLAotICAgICAgICAgICAgICAgICAgICBTdHJlYW0mIHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgbmV0X2J1ZmZlciYgcmVjdl9idWYsCi0gICAgICAgICAgICAgICAgICAgIFNTTCogc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgQklPKiBzc2xfYmlvLAotICAgICAgICAgICAgICAgICAgICB1c2VyX2hhbmRsZXJfZnVuYyAgaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgYXNpbzo6aW9fc2VydmljZTo6c3RyYW5kJiBzdHJhbmQKLSAgICAgICAgICAgICAgICAgICAgKQotICAgIDogcHJpbWl0aXZlXyhwcmltaXRpdmUpCi0gICAgLCB1c2VyX2hhbmRsZXJfKGhhbmRsZXIpCi0gICAgLCBzdHJhbmRfKCZzdHJhbmQpCi0gICAgLCByZWN2X2J1Zl8ocmVjdl9idWYpCi0gICAgLCBzb2NrZXRfKHNvY2tldCkKLSAgICAsIHNzbF9iaW9fKHNzbF9iaW8pCi0gICAgLCBzZXNzaW9uXyhzZXNzaW9uKQotICB7Ci0gICAgd3JpdGVfID0gYm9vc3Q6OmJpbmQoCi0gICAgICAmb3BlbnNzbF9vcGVyYXRpb246OmRvX2FzeW5jX3dyaXRlLCAKLSAgICAgIHRoaXMsIGJvb3N0Ojphcmc8MT4oKSwgYm9vc3Q6OmFyZzwyPigpCi0gICAgKTsKLSAgICByZWFkXyA9IGJvb3N0OjpiaW5kKAotICAgICAgJm9wZW5zc2xfb3BlcmF0aW9uOjpkb19hc3luY19yZWFkLCAKLSAgICAgIHRoaXMKLSAgICApOwotICAgIGhhbmRsZXJfPSBib29zdDo6YmluZCgKLSAgICAgICZvcGVuc3NsX29wZXJhdGlvbjo6YXN5bmNfdXNlcl9oYW5kbGVyLCAKLSAgICAgIHRoaXMsIGJvb3N0Ojphcmc8MT4oKSwgYm9vc3Q6OmFyZzwyPigpCi0gICAgKTsKLSAgfQotCi0gIC8vIENvbnN0cnVjdG9yIGZvciBzeW5jaHJvbm91cyBvcGVyYXRpb25zCi0gIG9wZW5zc2xfb3BlcmF0aW9uKHNzbF9wcmltaXRpdmVfZnVuYyBwcmltaXRpdmUsCi0gICAgICAgICAgICAgICAgICAgIFN0cmVhbSYgc29ja2V0LAotICAgICAgICAgICAgICAgICAgICBuZXRfYnVmZmVyJiByZWN2X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgU1NMKiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICBCSU8qIHNzbF9iaW8pCi0gICAgOiBwcmltaXRpdmVfKHByaW1pdGl2ZSkKLSAgICAsIHN0cmFuZF8oMCkKLSAgICAsIHJlY3ZfYnVmXyhyZWN2X2J1ZikKLSAgICAsIHNvY2tldF8oc29ja2V0KQotICAgICwgc3NsX2Jpb18oc3NsX2JpbykKLSAgICAsIHNlc3Npb25fKHNlc3Npb24pCi0gIHsgICAgICAKLSAgICB3cml0ZV8gPSBib29zdDo6YmluZCgKLSAgICAgICZvcGVuc3NsX29wZXJhdGlvbjo6ZG9fc3luY193cml0ZSwgCi0gICAgICB0aGlzLCBib29zdDo6YXJnPDE+KCksIGJvb3N0Ojphcmc8Mj4oKQotICAgICk7Ci0gICAgcmVhZF8gPSBib29zdDo6YmluZCgKLSAgICAgICZvcGVuc3NsX29wZXJhdGlvbjo6ZG9fc3luY19yZWFkLCAKLSAgICAgIHRoaXMKLSAgICApOwotICAgIGhhbmRsZXJfID0gYm9vc3Q6OmJpbmQoCi0gICAgICAmb3BlbnNzbF9vcGVyYXRpb246OnN5bmNfdXNlcl9oYW5kbGVyLCAKLSAgICAgIHRoaXMsIGJvb3N0Ojphcmc8MT4oKSwgYm9vc3Q6OmFyZzwyPigpCi0gICAgICApOwotICB9Ci0KLSAgLy8gU3RhcnQgb3BlcmF0aW9uCi0gIC8vIEluIGNhc2Ugb2YgYXN5bmNocm9ub3VzIGl0IHJldHVybnMgMCwgaW4gc3luYyBtb2RlIHJldHVybnMgc3VjY2VzcyBjb2RlCi0gIC8vIG9yIHRocm93cyBhbiBlcnJvci4uLgotICBpbnQgc3RhcnQoKQotICB7Ci0gICAgaW50IHJjID0gcHJpbWl0aXZlXyggc2Vzc2lvbl8gKTsKLQotICAgIGJvb2wgaXNfb3BlcmF0aW9uX2RvbmUgPSAocmMgPiAwKTsgIAotICAgICAgICAgICAgICAgIC8vIEZvciBjb25uZWN0L2FjY2VwdC9zaHV0ZG93biwgdGhlIG9wZXJhdGlvbgotICAgICAgICAgICAgICAgIC8vIGlzIGRvbmUsIHdoZW4gcmV0dXJuIGNvZGUgaXMgMQotICAgICAgICAgICAgICAgIC8vIGZvciB3cml0ZSwgaXQgaXMgZG9uZSwgd2hlbiBpcyByZXRjb2RlID4gMAotICAgICAgICAgICAgICAgIC8vIGZvciByZWFkLCBpdCBpcyBkb25lIHdoZW4gcmV0Y29kZSA+IDAKLQotICAgIGludCBlcnJvcl9jb2RlID0gICFpc19vcGVyYXRpb25fZG9uZSA/Ci0gICAgICAgICAgOjpTU0xfZ2V0X2Vycm9yKCBzZXNzaW9uXywgcmMgKSA6Ci0gICAgICAgICAgMDsgICAgICAgIAotICAgIGludCBzeXNfZXJyb3JfY29kZSA9IEVSUl9nZXRfZXJyb3IoKTsKLQotICAgIGlmIChlcnJvcl9jb2RlID09IFNTTF9FUlJPUl9TU0wpCi0gICAgICByZXR1cm4gaGFuZGxlcl8oYXNpbzo6ZXJyb3JfY29kZSgKLSAgICAgICAgICAgIHN5c19lcnJvcl9jb2RlLCBhc2lvOjplcnJvcjo6Z2V0X3NzbF9jYXRlZ29yeSgpKSwgcmMpOwotCi0gICAgYm9vbCBpc19yZWFkX25lZWRlZCA9IChlcnJvcl9jb2RlID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOwotICAgIGJvb2wgaXNfd3JpdGVfbmVlZGVkID0gKGVycm9yX2NvZGUgPT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QklPX2N0cmxfcGVuZGluZyggc3NsX2Jpb18gKSk7Ci0gICAgYm9vbCBpc19zaHV0X2Rvd25fcmVjZWl2ZWQgPSAKLSAgICAgICgoOjpTU0xfZ2V0X3NodXRkb3duKCBzZXNzaW9uXyApICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKSA9PSAKLSAgICAgICAgICBTU0xfUkVDRUlWRURfU0hVVERPV04pOwotICAgIGJvb2wgaXNfc2h1dF9kb3duX3NlbnQgPSAKLSAgICAgICgoOjpTU0xfZ2V0X3NodXRkb3duKCBzZXNzaW9uXyApICYgU1NMX1NFTlRfU0hVVERPV04pID09Ci0gICAgICAgICAgICBTU0xfU0VOVF9TSFVURE9XTik7Ci0KLSAgICBpZiAoaXNfc2h1dF9kb3duX3NlbnQgJiYgaXNfc2h1dF9kb3duX3JlY2VpdmVkCi0gICAgICAgICYmIGlzX29wZXJhdGlvbl9kb25lICYmICFpc193cml0ZV9uZWVkZWQpCi0gICAgICAvLyBTU0wgY29ubmVjdGlvbiBpcyBzaHV0IGRvd24gY2xlYW5seQotICAgICAgcmV0dXJuIGhhbmRsZXJfKGFzaW86OmVycm9yX2NvZGUoKSwgMSk7Ci0KLSAgICBpZiAoaXNfc2h1dF9kb3duX3JlY2VpdmVkICYmICFpc19vcGVyYXRpb25fZG9uZSkKLSAgICAgIC8vIFNodXRkb3duIGhhcyBiZWVuIHJlcXVlc3RlZCwgd2hpbGUgd2Ugd2VyZSByZWFkaW5nIG9yIHdyaXRpbmcuLi4KLSAgICAgIC8vIGFib3J0IG91ciBhY3Rpb24uLi4KLSAgICAgIHJldHVybiBoYW5kbGVyXyhhc2lvOjplcnJvcjo6c2h1dF9kb3duLCAwKTsKLQotICAgIGlmICghaXNfb3BlcmF0aW9uX2RvbmUgJiYgIWlzX3JlYWRfbmVlZGVkICYmICFpc193cml0ZV9uZWVkZWQgCi0gICAgICAmJiAhaXNfc2h1dF9kb3duX3NlbnQpCi0gICAgewotICAgICAgLy8gVGhlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLi4uIEl0IGlzIG5vdCBjb21wbGV0ZWQgYW5kIGRvZXMgCi0gICAgICAvLyBub3Qgd2FudCBuZXR3b3JrIGNvbW11bmljYXRpb24gbm9yIGRvZXMgd2FudCB0byBzZW5kIHNodXRkb3duIG91dC4uLgotICAgICAgaWYgKGVycm9yX2NvZGUgPT0gU1NMX0VSUk9SX1NZU0NBTEwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyXyhhc2lvOjplcnJvcl9jb2RlKAotICAgICAgICAgICAgICBzeXNfZXJyb3JfY29kZSwgYXNpbzo6ZXJyb3I6OnN5c3RlbV9jYXRlZ29yeSksIHJjKTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyXyhhc2lvOjplcnJvcl9jb2RlKAotICAgICAgICAgICAgICBzeXNfZXJyb3JfY29kZSwgYXNpbzo6ZXJyb3I6OmdldF9zc2xfY2F0ZWdvcnkoKSksIHJjKTsgCi0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFpc19vcGVyYXRpb25fZG9uZSAmJiAhaXNfd3JpdGVfbmVlZGVkKQotICAgIHsKLSAgICAgIC8vIFdlIG1heSBoYXZlIGxlZnQgb3ZlciBkYXRhIHRoYXQgd2UgY2FuIHBhc3MgdG8gU1NMIGltbWVkaWF0ZWx5Ci0gICAgICBpZiAocmVjdl9idWZfLmdldF9kYXRhX2xlbigpID4gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gUGFzcyB0aGUgYnVmZmVyZWQgZGF0YSB0byBTU0wKLSAgICAgICAgaW50IHdyaXR0ZW4gPSA6OkJJT193cml0ZQotICAgICAgICAoIAotICAgICAgICAgIHNzbF9iaW9fLCAKLSAgICAgICAgICByZWN2X2J1Zl8uZ2V0X2RhdGFfc3RhcnQoKSwgCi0gICAgICAgICAgcmVjdl9idWZfLmdldF9kYXRhX2xlbigpIAotICAgICAgICApOwotCi0gICAgICAgIGlmICh3cml0dGVuID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlY3ZfYnVmXy5kYXRhX3JlbW92ZWQod3JpdHRlbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3JpdHRlbiA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIUJJT19zaG91bGRfcmV0cnkoc3NsX2Jpb18pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNvbWUgc2VyaW9zIGVycm9yIHdpdGggQklPLi4uLgotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJfKGFzaW86OmVycm9yOjpub19yZWNvdmVyeSwgMCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXJ0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpc19yZWFkX25lZWRlZCB8fCAoaXNfc2h1dF9kb3duX3NlbnQgJiYgIWlzX3NodXRfZG93bl9yZWNlaXZlZCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiByZWFkXygpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIENvbnRpbnVlIHdpdGggb3BlcmF0aW9uLCBmbHVzaCBhbnkgU1NMIGRhdGEgb3V0IHRvIG5ldHdvcmsuLi4KLSAgICByZXR1cm4gd3JpdGVfKGlzX29wZXJhdGlvbl9kb25lLCByYyk7IAotICB9Ci0KLS8vIFByaXZhdGUgaW1wbGVtZW50YXRpb24KLXByaXZhdGU6Ci0gIHR5cGVkZWYgYm9vc3Q6OmZ1bmN0aW9uPGludCAoY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYsIGludCk+Ci0gICAgaW50X2hhbmRsZXJfZnVuYzsKLSAgdHlwZWRlZiBib29zdDo6ZnVuY3Rpb248aW50IChib29sLCBpbnQpPiB3cml0ZV9mdW5jOwotICB0eXBlZGVmIGJvb3N0OjpmdW5jdGlvbjxpbnQgKCk+IHJlYWRfZnVuYzsKLQotICBzc2xfcHJpbWl0aXZlX2Z1bmMgIHByaW1pdGl2ZV87Ci0gIHVzZXJfaGFuZGxlcl9mdW5jICB1c2VyX2hhbmRsZXJfOwotICBhc2lvOjppb19zZXJ2aWNlOjpzdHJhbmQqIHN0cmFuZF87Ci0gIHdyaXRlX2Z1bmMgIHdyaXRlXzsKLSAgcmVhZF9mdW5jICByZWFkXzsKLSAgaW50X2hhbmRsZXJfZnVuYyBoYW5kbGVyXzsKLSAgICAKLSAgbmV0X2J1ZmZlciBzZW5kX2J1Zl87IC8vIGJ1ZmZlcnMgZm9yIG5ldHdvcmsgSU8KLQotICAvLyBUaGUgcmVjdiBidWZmZXIgaXMgb3duZWQgYnkgdGhlIHN0cmVhbSwgbm90IHRoZSBvcGVyYXRpb24sIHNpbmNlIHRoZXJlIGNhbgotICAvLyBiZSBsZWZ0IG92ZXIgYnl0ZXMgYWZ0ZXIgcGFzc2luZyB0aGUgZGF0YSB1cCB0byB0aGUgYXBwbGljYXRpb24sIGFuZCB0aGVzZQotICAvLyBieXRlcyBuZWVkIHRvIGJlIGtlcHQgYXJvdW5kIGZvciB0aGUgbmV4dCByZWFkIG9wZXJhdGlvbiBpc3N1ZWQgYnkgdGhlCi0gIC8vIGFwcGxpY2F0aW9uLgotICBuZXRfYnVmZmVyJiByZWN2X2J1Zl87Ci0KLSAgU3RyZWFtJiBzb2NrZXRfOwotICBCSU8qICAgIHNzbF9iaW9fOwotICBTU0wqICAgIHNlc3Npb25fOwotCi0gIC8vCi0gIGludCBzeW5jX3VzZXJfaGFuZGxlcihjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgaW50IHJjKQotICB7Ci0gICAgaWYgKCFlcnJvcikKLSAgICAgIHJldHVybiByYzsKLQotICAgIHRocm93IGFzaW86OnN5c3RlbV9lcnJvcihlcnJvcik7Ci0gIH0KLSAgICAKLSAgaW50IGFzeW5jX3VzZXJfaGFuZGxlcihhc2lvOjplcnJvcl9jb2RlIGVycm9yLCBpbnQgcmMpCi0gIHsKLSAgICBpZiAocmMgPCAwKQotICAgIHsKLSAgICAgIGlmICghZXJyb3IpCi0gICAgICAgIGVycm9yID0gYXNpbzo6ZXJyb3I6Om5vX3JlY292ZXJ5OwotICAgICAgcmMgPSAwOwotICAgIH0KLQotICAgIHVzZXJfaGFuZGxlcl8oZXJyb3IsIHJjKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFdyaXRlcyBieXRlcyBhc3luY2hyb25vdXNseSBmcm9tIFNTTCB0byBORVQKLSAgaW50ICBkb19hc3luY193cml0ZShib29sIGlzX29wZXJhdGlvbl9kb25lLCBpbnQgcmMpIAotICB7Ci0gICAgaW50IGxlbiA9IDo6QklPX2N0cmxfcGVuZGluZyggc3NsX2Jpb18gKTsKLSAgICBpZiAoIGxlbiApCi0gICAgeyAKLSAgICAgIC8vIFRoZXJlIGlzIHNvbWV0aGluZyB0byB3cml0ZSBpbnRvIG5ldCwgZG8gaXQuLi4KLSAgICAgIGxlbiA9IChpbnQpc2VuZF9idWZfLmdldF91bnVzZWRfbGVuKCkgPiBsZW4/IAotICAgICAgICBsZW46IAotICAgICAgICBzZW5kX2J1Zl8uZ2V0X3VudXNlZF9sZW4oKTsKLSAgICAgICAgCi0gICAgICBpZiAobGVuID09IDApCi0gICAgICB7Ci0gICAgICAgIC8vIEluIGNhc2Ugb3VyIHNlbmQgYnVmZmVyIGlzIGZ1bGwsIHdlIGhhdmUganVzdCB0byB3YWl0IHVudGlsIAotICAgICAgICAvLyBwcmV2aW91cyBzZW5kIHRvIGNvbXBsZXRlLi4uCi0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICAvLyBSZWFkIG91dGdvaW5nIGRhdGEgZnJvbSBiaW8KLSAgICAgIGxlbiA9IDo6QklPX3JlYWQoIHNzbF9iaW9fLCBzZW5kX2J1Zl8uZ2V0X3VudXNlZF9zdGFydCgpLCBsZW4pOyAKLSAgICAgICAgIAotICAgICAgaWYgKGxlbiA+IDApCi0gICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGFfc3RhcnQgPSBzZW5kX2J1Zl8uZ2V0X3VudXNlZF9zdGFydCgpOwotICAgICAgICBzZW5kX2J1Zl8uZGF0YV9hZGRlZChsZW4pOwotIAotICAgICAgICBBU0lPX0FTU0VSVChzdHJhbmRfKTsKLSAgICAgICAgYXNpbzo6YXN5bmNfd3JpdGUKLSAgICAgICAgKCAKLSAgICAgICAgICBzb2NrZXRfLCAKLSAgICAgICAgICBhc2lvOjpidWZmZXIoZGF0YV9zdGFydCwgbGVuKSwKLSAgICAgICAgICBzdHJhbmRfLT53cmFwCi0gICAgICAgICAgKAotICAgICAgICAgICAgYm9vc3Q6OmJpbmQKLSAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgJm9wZW5zc2xfb3BlcmF0aW9uOjphc3luY193cml0ZV9oYW5kbGVyLCAKLSAgICAgICAgICAgICAgdGhpcywgCi0gICAgICAgICAgICAgIGlzX29wZXJhdGlvbl9kb25lLAotICAgICAgICAgICAgICByYywgCi0gICAgICAgICAgICAgIGFzaW86OnBsYWNlaG9sZGVyczo6ZXJyb3IsIAotICAgICAgICAgICAgICBhc2lvOjpwbGFjZWhvbGRlcnM6OmJ5dGVzX3RyYW5zZmVycmVkCi0gICAgICAgICAgICApCi0gICAgICAgICAgKQotICAgICAgICApOwotICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIUJJT19zaG91bGRfcmV0cnkoc3NsX2Jpb18pKQotICAgICAgewotICAgICAgICAvLyBTZWVtcyBsaWtlIGZhdGFsIGVycm9yCi0gICAgICAgIC8vIHJlYWRpbmcgZnJvbSBTU0wgQklPIGhhcyBmYWlsZWQuLi4KLSAgICAgICAgaGFuZGxlcl8oYXNpbzo6ZXJyb3I6Om5vX3JlY292ZXJ5LCAwKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChpc19vcGVyYXRpb25fZG9uZSkKLSAgICB7Ci0gICAgICAvLyBGaW5pc2ggdGhlIG9wZXJhdGlvbiwgd2l0aCBzdWNjZXNzCi0gICAgICBoYW5kbGVyXyhhc2lvOjplcnJvcl9jb2RlKCksIHJjKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICAvLyBPUGVyYXRpb24gaXMgbm90IGRvbmUgYW5kIHdyaXRpbmcgdG8gbmV0IGhhcyBiZWVuIG1hZGUuLi4KLSAgICAvLyBzdGFydCBvcGVyYXRpb24gYWdhaW4KLSAgICBzdGFydCgpOwotICAgICAgICAgIAotICAgIHJldHVybiAwOwotICB9Ci0KLSAgdm9pZCBhc3luY193cml0ZV9oYW5kbGVyKGJvb2wgaXNfb3BlcmF0aW9uX2RvbmUsIGludCByYywgCi0gICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIHNpemVfdCBieXRlc19zZW50KQotICB7Ci0gICAgaWYgKCFlcnJvcikKLSAgICB7Ci0gICAgICAvLyBSZW1vdmUgZGF0YSBmcm9tIHNlbmQgYnVmZmVyCi0gICAgICBzZW5kX2J1Zl8uZGF0YV9yZW1vdmVkKGJ5dGVzX3NlbnQpOwotCi0gICAgICBpZiAoaXNfb3BlcmF0aW9uX2RvbmUpCi0gICAgICAgIGhhbmRsZXJfKGFzaW86OmVycm9yX2NvZGUoKSwgcmMpOwotICAgICAgZWxzZQotICAgICAgICAvLyBTaW5jZSB0aGUgb3BlcmF0aW9uIHdhcyBub3QgY29tcGxldGVkLCB0cnkgaXQgYWdhaW4uLi4KLSAgICAgICAgc3RhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICAgIGhhbmRsZXJfKGVycm9yLCByYyk7Ci0gIH0KLQotICBpbnQgZG9fYXN5bmNfcmVhZCgpCi0gIHsKLSAgICAvLyBXYWl0IGZvciBuZXcgZGF0YQotICAgIEFTSU9fQVNTRVJUKHN0cmFuZF8pOwotICAgIHNvY2tldF8uYXN5bmNfcmVhZF9zb21lCi0gICAgKCAKLSAgICAgIGFzaW86OmJ1ZmZlcihyZWN2X2J1Zl8uZ2V0X3VudXNlZF9zdGFydCgpLAotICAgICAgICByZWN2X2J1Zl8uZ2V0X3VudXNlZF9sZW4oKSksCi0gICAgICBzdHJhbmRfLT53cmFwCi0gICAgICAoCi0gICAgICAgIGJvb3N0OjpiaW5kCi0gICAgICAgICgKLSAgICAgICAgICAmb3BlbnNzbF9vcGVyYXRpb246OmFzeW5jX3JlYWRfaGFuZGxlciwgCi0gICAgICAgICAgdGhpcywgCi0gICAgICAgICAgYXNpbzo6cGxhY2Vob2xkZXJzOjplcnJvciwgCi0gICAgICAgICAgYXNpbzo6cGxhY2Vob2xkZXJzOjpieXRlc190cmFuc2ZlcnJlZAotICAgICAgICApCi0gICAgICApCi0gICAgKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHZvaWQgYXN5bmNfcmVhZF9oYW5kbGVyKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICAgICAgc2l6ZV90IGJ5dGVzX3JlY3ZkKQotICB7Ci0gICAgaWYgKCFlcnJvcikKLSAgICB7Ci0gICAgICByZWN2X2J1Zl8uZGF0YV9hZGRlZChieXRlc19yZWN2ZCk7Ci0KLSAgICAgIC8vIFBhc3MgdGhlIHJlY2VpdmVkIGRhdGEgdG8gU1NMCi0gICAgICBpbnQgd3JpdHRlbiA9IDo6QklPX3dyaXRlCi0gICAgICAoIAotICAgICAgICBzc2xfYmlvXywgCi0gICAgICAgIHJlY3ZfYnVmXy5nZXRfZGF0YV9zdGFydCgpLCAKLSAgICAgICAgcmVjdl9idWZfLmdldF9kYXRhX2xlbigpIAotICAgICAgKTsKLQotICAgICAgaWYgKHdyaXR0ZW4gPiAwKQotICAgICAgewotICAgICAgICByZWN2X2J1Zl8uZGF0YV9yZW1vdmVkKHdyaXR0ZW4pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAod3JpdHRlbiA8IDApCi0gICAgICB7Ci0gICAgICAgIGlmICghQklPX3Nob3VsZF9yZXRyeShzc2xfYmlvXykpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBTb21lIHNlcmlvcyBlcnJvciB3aXRoIEJJTy4uLi4KLSAgICAgICAgICBoYW5kbGVyXyhhc2lvOjplcnJvcjo6bm9fcmVjb3ZlcnksIDApOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBhbmQgdHJ5IHRoZSBTU0wgcHJpbWl0aXZlIGFnYWluCi0gICAgICBzdGFydCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gRXJyb3IgaW4gbmV0d29yayBsZXZlbC4uLgotICAgICAgLy8gU1NMIGNhbid0IGNvbnRpbnVlIGVpdGhlci4uLgotICAgICAgaGFuZGxlcl8oZXJyb3IsIDApOwotICAgIH0KLSAgfQotCi0gIC8vIFN5bmNyb25vdXMgZnVuY3Rpb25zLi4uCi0gIGludCBkb19zeW5jX3dyaXRlKGJvb2wgaXNfb3BlcmF0aW9uX2RvbmUsIGludCByYykKLSAgewotICAgIGludCBsZW4gPSA6OkJJT19jdHJsX3BlbmRpbmcoIHNzbF9iaW9fICk7Ci0gICAgaWYgKCBsZW4gKQotICAgIHsgCi0gICAgICAvLyBUaGVyZSBpcyBzb21ldGhpbmcgdG8gd3JpdGUgaW50byBuZXQsIGRvIGl0Li4uCi0gICAgICBsZW4gPSAoaW50KXNlbmRfYnVmXy5nZXRfdW51c2VkX2xlbigpID4gbGVuPyAKLSAgICAgICAgbGVuOiAKLSAgICAgICAgc2VuZF9idWZfLmdldF91bnVzZWRfbGVuKCk7Ci0gICAgICAgIAotICAgICAgLy8gUmVhZCBvdXRnb2luZyBkYXRhIGZyb20gYmlvCi0gICAgICBsZW4gPSA6OkJJT19yZWFkKCBzc2xfYmlvXywgc2VuZF9idWZfLmdldF91bnVzZWRfc3RhcnQoKSwgbGVuKTsgCi0gICAgICAgICAKLSAgICAgIGlmIChsZW4gPiAwKQotICAgICAgewotICAgICAgICBzaXplX3Qgc2VudF9sZW4gPSBhc2lvOjp3cml0ZSggCi0gICAgICAgICAgICAgICAgICBzb2NrZXRfLCAKLSAgICAgICAgICAgICAgICAgIGFzaW86OmJ1ZmZlcihzZW5kX2J1Zl8uZ2V0X3VudXNlZF9zdGFydCgpLCBsZW4pCi0gICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgIHNlbmRfYnVmXy5kYXRhX2FkZGVkKGxlbik7Ci0gICAgICAgIHNlbmRfYnVmXy5kYXRhX3JlbW92ZWQoc2VudF9sZW4pOwotICAgICAgfSAgICAgICAgICAKLSAgICAgIGVsc2UgaWYgKCFCSU9fc2hvdWxkX3JldHJ5KHNzbF9iaW9fKSkKLSAgICAgIHsKLSAgICAgICAgLy8gU2VlbXMgbGlrZSBmYXRhbCBlcnJvcgotICAgICAgICAvLyByZWFkaW5nIGZyb20gU1NMIEJJTyBoYXMgZmFpbGVkLi4uCi0gICAgICAgIHRocm93IGFzaW86OnN5c3RlbV9lcnJvcihhc2lvOjplcnJvcjo6bm9fcmVjb3ZlcnkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoaXNfb3BlcmF0aW9uX2RvbmUpCi0gICAgICAvLyBGaW5pc2ggdGhlIG9wZXJhdGlvbiwgd2l0aCBzdWNjZXNzCi0gICAgICByZXR1cm4gcmM7Ci0gICAgICAgICAgICAgICAgCi0gICAgLy8gT3BlcmF0aW9uIGlzIG5vdCBmaW5pc2hlZCwgc3RhcnQgYWdhaW4uCi0gICAgcmV0dXJuIHN0YXJ0KCk7Ci0gIH0KLQotICBpbnQgZG9fc3luY19yZWFkKCkKLSAgewotICAgIHNpemVfdCBsZW4gPSBzb2NrZXRfLnJlYWRfc29tZQotICAgICAgKCAKLSAgICAgICAgYXNpbzo6YnVmZmVyKHJlY3ZfYnVmXy5nZXRfdW51c2VkX3N0YXJ0KCksCi0gICAgICAgICAgcmVjdl9idWZfLmdldF91bnVzZWRfbGVuKCkpCi0gICAgICApOwotCi0gICAgLy8gV3JpdGUgZGF0YSB0byBzc2wKLSAgICByZWN2X2J1Zl8uZGF0YV9hZGRlZChsZW4pOwotCi0gICAgLy8gUGFzcyB0aGUgcmVjZWl2ZWQgZGF0YSB0byBTU0wKLSAgICBpbnQgd3JpdHRlbiA9IDo6QklPX3dyaXRlCi0gICAgKCAKLSAgICAgIHNzbF9iaW9fLCAKLSAgICAgIHJlY3ZfYnVmXy5nZXRfZGF0YV9zdGFydCgpLCAKLSAgICAgIHJlY3ZfYnVmXy5nZXRfZGF0YV9sZW4oKSAKLSAgICApOwotCi0gICAgaWYgKHdyaXR0ZW4gPiAwKQotICAgIHsKLSAgICAgIHJlY3ZfYnVmXy5kYXRhX3JlbW92ZWQod3JpdHRlbik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHdyaXR0ZW4gPCAwKQotICAgIHsKLSAgICAgIGlmICghQklPX3Nob3VsZF9yZXRyeShzc2xfYmlvXykpCi0gICAgICB7Ci0gICAgICAgIC8vIFNvbWUgc2VyaW9zIGVycm9yIHdpdGggQklPLi4uLgotICAgICAgICB0aHJvdyBhc2lvOjpzeXN0ZW1fZXJyb3IoYXNpbzo6ZXJyb3I6Om5vX3JlY292ZXJ5KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUcnkgdGhlIG9wZXJhdGlvbiBhZ2FpbgotICAgIHJldHVybiBzdGFydCgpOwotICB9Ci19OyAvLyBjbGFzcyBvcGVuc3NsX29wZXJhdGlvbgotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIG9sZAotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9PTERfREVUQUlMX09QRU5TU0xfT1BFUkFUSU9OX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9vbGQvZGV0YWlsL29wZW5zc2xfc3RyZWFtX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9vbGQvZGV0YWlsL29wZW5zc2xfc3RyZWFtX3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjVjOWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvb2xkL2RldGFpbC9vcGVuc3NsX3N0cmVhbV9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3MSArMCwwIEBACi0vLwotLy8gc3NsL29sZC9kZXRhaWwvc3RyZWFtX3NlcnZpY2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgVm9pcHN0ZXIgLyBJbmRyZWsgZG90IEp1aGFuaSBhdCB2b2lwc3RlciBkb3QgY29tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfT0xEX0RFVEFJTF9PUEVOU1NMX1NUUkVBTV9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX1NTTF9PTERfREVUQUlMX09QRU5TU0xfU1RSRUFNX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgotI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KLSNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvYnVmZmVyX3NlcXVlbmNlX2FkYXB0ZXIuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvYmFzaWNfY29udGV4dC5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvc3RyZWFtX2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL29sZC9kZXRhaWwvb3BlbnNzbF9vcGVyYXRpb24uaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9vcGVuc3NsX3R5cGVzLmhwcCIKLSNpbmNsdWRlICJhc2lvL3N0cmFuZC5ocHAiCi0jaW5jbHVkZSAiYXNpby9zeXN0ZW1fZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci1uYW1lc3BhY2Ugb2xkIHsKLW5hbWVzcGFjZSBkZXRhaWwgewotCi1jbGFzcyBvcGVuc3NsX3N0cmVhbV9zZXJ2aWNlCi0gIDogcHVibGljIGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPG9wZW5zc2xfc3RyZWFtX3NlcnZpY2U+Ci17Ci1wcml2YXRlOgotICBlbnVtIHsgbWF4X2J1ZmZlcl9zaXplID0gSU5UX01BWCB9OwotCi0gIC8vQmFzZSBoYW5kbGVyIGZvciBhc3luY3Job25vdXMgb3BlcmF0aW9ucwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotICBjbGFzcyBiYXNlX2hhbmRsZXIKLSAgewotICBwdWJsaWM6Ci0gICAgdHlwZWRlZiBib29zdDo6ZnVuY3Rpb248Ci0gICAgICB2b2lkIChjb25zdCBhc2lvOjplcnJvcl9jb2RlJiwgc2l6ZV90KT4gZnVuY190OwotCi0gICAgYmFzZV9oYW5kbGVyKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgICA6IG9wXyhOVUxMKQotICAgICAgLCBpb19zZXJ2aWNlXyhpb19zZXJ2aWNlKQotICAgICAgLCB3b3JrXyhpb19zZXJ2aWNlKQotICAgIHt9Ci0gICAgCi0gICAgdm9pZCBkb19mdW5jKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCBzaXplX3Qgc2l6ZSkKLSAgICB7Ci0gICAgICBmdW5jXyhlcnJvciwgc2l6ZSk7Ci0gICAgfQotICAgICAgICAKLSAgICB2b2lkIHNldF9vcGVyYXRpb24ob3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPiogb3ApIHsgb3BfID0gb3A7IH0KLSAgICB2b2lkIHNldF9mdW5jKGZ1bmNfdCBmdW5jKSB7IGZ1bmNfID0gZnVuYzsgfQotCi0gICAgfmJhc2VfaGFuZGxlcigpCi0gICAgewotICAgICAgZGVsZXRlIG9wXzsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmdW5jX3QgZnVuY187Ci0gICAgb3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPiogb3BfOwotICAgIGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2VfOwotICAgIGFzaW86OmlvX3NlcnZpY2U6Ondvcmsgd29ya187Ci0gIH07ICAvLyBjbGFzcyBiYXNlX2hhbmRsZXIKLQotICAvLyBIYW5kbGVyIGZvciBhc3luY2hyb25vdXMgSU8gKHdyaXRlL3JlYWQpIG9wZXJhdGlvbnMKLSAgdGVtcGxhdGU8dHlwZW5hbWUgU3RyZWFtLCB0eXBlbmFtZSBIYW5kbGVyPgotICBjbGFzcyBpb19oYW5kbGVyIAotICAgIDogcHVibGljIGJhc2VfaGFuZGxlcjxTdHJlYW0+Ci0gIHsKLSAgcHVibGljOgotICAgIGlvX2hhbmRsZXIoSGFuZGxlciBoYW5kbGVyLCBhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgICAgOiBiYXNlX2hhbmRsZXI8U3RyZWFtPihpb19zZXJ2aWNlKQotICAgICAgLCBoYW5kbGVyXyhoYW5kbGVyKQotICAgIHsKLSAgICAgIHRoaXMtPnNldF9mdW5jKGJvb3N0OjpiaW5kKAotICAgICAgICAmaW9faGFuZGxlcjxTdHJlYW0sIEhhbmRsZXI+OjpoYW5kbGVyX2ltcGwsIAotICAgICAgICB0aGlzLCBib29zdDo6YXJnPDE+KCksIGJvb3N0Ojphcmc8Mj4oKSApKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBIYW5kbGVyIGhhbmRsZXJfOwotICAgIHZvaWQgaGFuZGxlcl9pbXBsKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCBzaXplX3Qgc2l6ZSkKLSAgICB7Ci0gICAgICBzdGQ6OmF1dG9fcHRyPGlvX2hhbmRsZXI8U3RyZWFtLCBIYW5kbGVyPiA+IHRoaXNfcHRyKHRoaXMpOwotICAgICAgaGFuZGxlcl8oZXJyb3IsIHNpemUpOwotICAgIH0KLSAgfTsgIC8vIGNsYXNzIGlvX2hhbmRsZXIgCi0KLSAgLy8gSGFuZGxlciBmb3IgYXN5bmNyaG9ub3VzIGhhbmRzaGFrZSAoY29ubmVjdCwgYWNjZXB0KSBmdW5jdGlvbnMKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgY2xhc3MgaGFuZHNoYWtlX2hhbmRsZXIKLSAgICA6IHB1YmxpYyBiYXNlX2hhbmRsZXI8U3RyZWFtPgotICB7Ci0gIHB1YmxpYzoKLSAgICBoYW5kc2hha2VfaGFuZGxlcihIYW5kbGVyIGhhbmRsZXIsIGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgICA6IGJhc2VfaGFuZGxlcjxTdHJlYW0+KGlvX3NlcnZpY2UpCi0gICAgICAsIGhhbmRsZXJfKGhhbmRsZXIpCi0gICAgewotICAgICAgdGhpcy0+c2V0X2Z1bmMoYm9vc3Q6OmJpbmQoCi0gICAgICAgICZoYW5kc2hha2VfaGFuZGxlcjxTdHJlYW0sIEhhbmRsZXI+OjpoYW5kbGVyX2ltcGwsIAotICAgICAgICB0aGlzLCBib29zdDo6YXJnPDE+KCksIGJvb3N0Ojphcmc8Mj4oKSApKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBIYW5kbGVyIGhhbmRsZXJfOwotICAgIHZvaWQgaGFuZGxlcl9pbXBsKGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCBzaXplX3QpCi0gICAgewotICAgICAgc3RkOjphdXRvX3B0cjxoYW5kc2hha2VfaGFuZGxlcjxTdHJlYW0sIEhhbmRsZXI+ID4gdGhpc19wdHIodGhpcyk7Ci0gICAgICBoYW5kbGVyXyhlcnJvcik7Ci0gICAgfQotCi0gIH07ICAvLyBjbGFzcyBoYW5kc2hha2VfaGFuZGxlcgotCi0gIC8vIEhhbmRsZXIgZm9yIGFzeW5jcmhvbm91cyBzaHV0ZG93bgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtLCB0eXBlbmFtZSBIYW5kbGVyPgotICBjbGFzcyBzaHV0ZG93bl9oYW5kbGVyCi0gICAgOiBwdWJsaWMgYmFzZV9oYW5kbGVyPFN0cmVhbT4KLSAgewotICBwdWJsaWM6Ci0gICAgc2h1dGRvd25faGFuZGxlcihIYW5kbGVyIGhhbmRsZXIsIGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgICA6IGJhc2VfaGFuZGxlcjxTdHJlYW0+KGlvX3NlcnZpY2UpLAotICAgICAgICBoYW5kbGVyXyhoYW5kbGVyKQotICAgIHsgCi0gICAgICB0aGlzLT5zZXRfZnVuYyhib29zdDo6YmluZCgKLSAgICAgICAgJnNodXRkb3duX2hhbmRsZXI8U3RyZWFtLCBIYW5kbGVyPjo6aGFuZGxlcl9pbXBsLCAKLSAgICAgICAgdGhpcywgYm9vc3Q6OmFyZzwxPigpLCBib29zdDo6YXJnPDI+KCkgKSk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgSGFuZGxlciBoYW5kbGVyXzsKLSAgICB2b2lkIGhhbmRsZXJfaW1wbChjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgc2l6ZV90KQotICAgIHsKLSAgICAgIHN0ZDo6YXV0b19wdHI8c2h1dGRvd25faGFuZGxlcjxTdHJlYW0sIEhhbmRsZXI+ID4gdGhpc19wdHIodGhpcyk7Ci0gICAgICBoYW5kbGVyXyhlcnJvcik7Ci0gICAgfQotICB9OyAgLy8gY2xhc3Mgc2h1dGRvd25faGFuZGxlcgotCi1wdWJsaWM6Ci0gIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiB0eXBlLgotICB0eXBlZGVmIHN0cnVjdCBpbXBsX3N0cnVjdAotICB7Ci0gICAgOjpTU0wqIHNzbDsKLSAgICA6OkJJTyogZXh0X2JpbzsKLSAgICBuZXRfYnVmZmVyIHJlY3ZfYnVmOwotICB9ICogaW1wbF90eXBlOwotCi0gIC8vIENvbnN0cnVjdCBhIG5ldyBzdHJlYW0gc29ja2V0IHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgaW9fc2VydmljZS4KLSAgZXhwbGljaXQgb3BlbnNzbF9zdHJlYW1fc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8b3BlbnNzbF9zdHJlYW1fc2VydmljZT4oaW9fc2VydmljZSksCi0gICAgICBzdHJhbmRfKGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIHZvaWQgc2h1dGRvd25fc2VydmljZSgpCi0gIHsKLSAgfQotCi0gIC8vIFJldHVybiBhIG51bGwgc3RyZWFtIGltcGxlbWVudGF0aW9uLgotICBpbXBsX3R5cGUgbnVsbCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIENyZWF0ZSBhIG5ldyBzdHJlYW0gaW1wbGVtZW50YXRpb24uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0sIHR5cGVuYW1lIENvbnRleHRfU2VydmljZT4KLSAgdm9pZCBjcmVhdGUoaW1wbF90eXBlJiBpbXBsLCBTdHJlYW0mIC8qbmV4dF9sYXllciovLAotICAgICAgYmFzaWNfY29udGV4dDxDb250ZXh0X1NlcnZpY2U+JiBjb250ZXh0KQotICB7Ci0gICAgaW1wbCA9IG5ldyBpbXBsX3N0cnVjdDsKLSAgICBpbXBsLT5zc2wgPSA6OlNTTF9uZXcoY29udGV4dC5pbXBsKCkpOwotICAgIDo6U1NMX3NldF9tb2RlKGltcGwtPnNzbCwgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUpOwotICAgIDo6U1NMX3NldF9tb2RlKGltcGwtPnNzbCwgU1NMX01PREVfQUNDRVBUX01PVklOR19XUklURV9CVUZGRVIpOwotICAgIDo6QklPKiBpbnRfYmlvID0gMDsKLSAgICBpbXBsLT5leHRfYmlvID0gMDsKLSAgICA6OkJJT19uZXdfYmlvX3BhaXIoJmludF9iaW8sIDgxOTIsICZpbXBsLT5leHRfYmlvLCA4MTkyKTsKLSAgICA6OlNTTF9zZXRfYmlvKGltcGwtPnNzbCwgaW50X2JpbywgaW50X2Jpbyk7Ci0gIH0KLQotICAvLyBEZXN0cm95IGEgc3RyZWFtIGltcGxlbWVudGF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotICB2b2lkIGRlc3Ryb3koaW1wbF90eXBlJiBpbXBsLCBTdHJlYW0mIC8qbmV4dF9sYXllciovKQotICB7Ci0gICAgaWYgKGltcGwgIT0gMCkKLSAgICB7Ci0gICAgICA6OkJJT19mcmVlKGltcGwtPmV4dF9iaW8pOwotICAgICAgOjpTU0xfZnJlZShpbXBsLT5zc2wpOwotICAgICAgZGVsZXRlIGltcGw7Ci0gICAgICBpbXBsID0gMDsKLSAgICB9Ci0gIH0KLQotICAvLyBQZXJmb3JtIFNTTCBoYW5kc2hha2luZy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLSAgYXNpbzo6ZXJyb3JfY29kZSBoYW5kc2hha2UoaW1wbF90eXBlJiBpbXBsLCBTdHJlYW0mIG5leHRfbGF5ZXIsCi0gICAgICBzdHJlYW1fYmFzZTo6aGFuZHNoYWtlX3R5cGUgdHlwZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBvcGVuc3NsX29wZXJhdGlvbjxTdHJlYW0+IG9wKAotICAgICAgICB0eXBlID09IHN0cmVhbV9iYXNlOjpjbGllbnQgPwotICAgICAgICAgICZzc2xfd3JhcDxtdXRleF90eXBlPjo6U1NMX2Nvbm5lY3Q6Ci0gICAgICAgICAgJnNzbF93cmFwPG11dGV4X3R5cGU+OjpTU0xfYWNjZXB0LAotICAgICAgICBuZXh0X2xheWVyLAotICAgICAgICBpbXBsLT5yZWN2X2J1ZiwKLSAgICAgICAgaW1wbC0+c3NsLAotICAgICAgICBpbXBsLT5leHRfYmlvKTsKLSAgICAgIG9wLnN0YXJ0KCk7Ci0gICAgfQotICAgIGNhdGNoIChhc2lvOjpzeXN0ZW1fZXJyb3ImIGUpCi0gICAgewotICAgICAgZWMgPSBlLmNvZGUoKTsKLSAgICAgIHJldHVybiBlYzsKLSAgICB9Ci0KLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgU1NMIGhhbmRzaGFrZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19oYW5kc2hha2UoaW1wbF90eXBlJiBpbXBsLCBTdHJlYW0mIG5leHRfbGF5ZXIsCi0gICAgICBzdHJlYW1fYmFzZTo6aGFuZHNoYWtlX3R5cGUgdHlwZSwgSGFuZGxlciBoYW5kbGVyKQotICB7Ci0gICAgdHlwZWRlZiBoYW5kc2hha2VfaGFuZGxlcjxTdHJlYW0sIEhhbmRsZXI+IGNvbm5lY3RfaGFuZGxlcjsKLQotICAgIGNvbm5lY3RfaGFuZGxlciogbG9jYWxfaGFuZGxlciA9IAotICAgICAgbmV3IGNvbm5lY3RfaGFuZGxlcihoYW5kbGVyLCBnZXRfaW9fc2VydmljZSgpKTsKLQotICAgIG9wZW5zc2xfb3BlcmF0aW9uPFN0cmVhbT4qIG9wID0gbmV3IG9wZW5zc2xfb3BlcmF0aW9uPFN0cmVhbT4KLSAgICAoCi0gICAgICB0eXBlID09IHN0cmVhbV9iYXNlOjpjbGllbnQgPwotICAgICAgICAmc3NsX3dyYXA8bXV0ZXhfdHlwZT46OlNTTF9jb25uZWN0OgotICAgICAgICAmc3NsX3dyYXA8bXV0ZXhfdHlwZT46OlNTTF9hY2NlcHQsCi0gICAgICBuZXh0X2xheWVyLAotICAgICAgaW1wbC0+cmVjdl9idWYsCi0gICAgICBpbXBsLT5zc2wsCi0gICAgICBpbXBsLT5leHRfYmlvLAotICAgICAgYm9vc3Q6OmJpbmQKLSAgICAgICgKLSAgICAgICAgJmJhc2VfaGFuZGxlcjxTdHJlYW0+Ojpkb19mdW5jLCAKLSAgICAgICAgbG9jYWxfaGFuZGxlciwKLSAgICAgICAgYm9vc3Q6OmFyZzwxPigpLAotICAgICAgICBib29zdDo6YXJnPDI+KCkKLSAgICAgICksCi0gICAgICBzdHJhbmRfCi0gICAgKTsKLSAgICBsb2NhbF9oYW5kbGVyLT5zZXRfb3BlcmF0aW9uKG9wKTsKLQotICAgIHN0cmFuZF8ucG9zdChib29zdDo6YmluZCgmb3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPjo6c3RhcnQsIG9wKSk7Ci0gIH0KLQotICAvLyBTaHV0IGRvd24gU1NMIG9uIHRoZSBzdHJlYW0uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0+Ci0gIGFzaW86OmVycm9yX2NvZGUgc2h1dGRvd24oaW1wbF90eXBlJiBpbXBsLCBTdHJlYW0mIG5leHRfbGF5ZXIsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIG9wZW5zc2xfb3BlcmF0aW9uPFN0cmVhbT4gb3AoCi0gICAgICAgICZzc2xfd3JhcDxtdXRleF90eXBlPjo6U1NMX3NodXRkb3duLAotICAgICAgICBuZXh0X2xheWVyLAotICAgICAgICBpbXBsLT5yZWN2X2J1ZiwKLSAgICAgICAgaW1wbC0+c3NsLAotICAgICAgICBpbXBsLT5leHRfYmlvKTsKLSAgICAgIG9wLnN0YXJ0KCk7Ci0gICAgfQotICAgIGNhdGNoIChhc2lvOjpzeXN0ZW1fZXJyb3ImIGUpCi0gICAgewotICAgICAgZWMgPSBlLmNvZGUoKTsKLSAgICAgIHJldHVybiBlYzsKLSAgICB9Ci0KLSAgICBlYyA9IGFzaW86OmVycm9yX2NvZGUoKTsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLyBBc3luY2hyb25vdXNseSBzaHV0IGRvd24gU1NMIG9uIHRoZSBzdHJlYW0uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0sIHR5cGVuYW1lIEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfc2h1dGRvd24oaW1wbF90eXBlJiBpbXBsLCBTdHJlYW0mIG5leHRfbGF5ZXIsIEhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIHR5cGVkZWYgc2h1dGRvd25faGFuZGxlcjxTdHJlYW0sIEhhbmRsZXI+IGRpc2Nvbm5lY3RfaGFuZGxlcjsKLQotICAgIGRpc2Nvbm5lY3RfaGFuZGxlciogbG9jYWxfaGFuZGxlciA9IAotICAgICAgbmV3IGRpc2Nvbm5lY3RfaGFuZGxlcihoYW5kbGVyLCBnZXRfaW9fc2VydmljZSgpKTsKLQotICAgIG9wZW5zc2xfb3BlcmF0aW9uPFN0cmVhbT4qIG9wID0gbmV3IG9wZW5zc2xfb3BlcmF0aW9uPFN0cmVhbT4KLSAgICAoCi0gICAgICAmc3NsX3dyYXA8bXV0ZXhfdHlwZT46OlNTTF9zaHV0ZG93biwKLSAgICAgIG5leHRfbGF5ZXIsCi0gICAgICBpbXBsLT5yZWN2X2J1ZiwKLSAgICAgIGltcGwtPnNzbCwKLSAgICAgIGltcGwtPmV4dF9iaW8sCi0gICAgICBib29zdDo6YmluZAotICAgICAgKAotICAgICAgICAmYmFzZV9oYW5kbGVyPFN0cmVhbT46OmRvX2Z1bmMsIAotICAgICAgICBsb2NhbF9oYW5kbGVyLCAKLSAgICAgICAgYm9vc3Q6OmFyZzwxPigpLAotICAgICAgICBib29zdDo6YXJnPDI+KCkKLSAgICAgICksCi0gICAgICBzdHJhbmRfCi0gICAgKTsKLSAgICBsb2NhbF9oYW5kbGVyLT5zZXRfb3BlcmF0aW9uKG9wKTsKLQotICAgIHN0cmFuZF8ucG9zdChib29zdDo6YmluZCgmb3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPjo6c3RhcnQsIG9wKSk7ICAgICAgICAKLSAgfQotCi0gIC8vIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgc3RyZWFtLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtLCB0eXBlbmFtZSBDb25zdF9CdWZmZXJzPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGltcGxfdHlwZSYgaW1wbCwgU3RyZWFtJiBuZXh0X2xheWVyLAotICAgICAgY29uc3QgQ29uc3RfQnVmZmVycyYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOwotICAgIHRyeQotICAgIHsKLSAgICAgIGFzaW86OmNvbnN0X2J1ZmZlciBidWZmZXIgPQotICAgICAgICBhc2lvOjpkZXRhaWw6OmJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPAotICAgICAgICAgIGFzaW86OmNvbnN0X2J1ZmZlciwgQ29uc3RfQnVmZmVycz46OmZpcnN0KGJ1ZmZlcnMpOwotCi0gICAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZSA9IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcik7Ci0gICAgICBpZiAoYnVmZmVyX3NpemUgPiBtYXhfYnVmZmVyX3NpemUpCi0gICAgICAgIGJ1ZmZlcl9zaXplID0gbWF4X2J1ZmZlcl9zaXplOwotICAgICAgZWxzZSBpZiAoYnVmZmVyX3NpemUgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBib29zdDo6ZnVuY3Rpb248aW50IChTU0wqKT4gc2VuZF9mdW5jID0KLSAgICAgICAgYm9vc3Q6OmJpbmQoYm9vc3Q6OnR5cGU8aW50PigpLCAmOjpTU0xfd3JpdGUsIGJvb3N0Ojphcmc8MT4oKSwgIAotICAgICAgICAgICAgYXNpbzo6YnVmZmVyX2Nhc3Q8Y29uc3Qgdm9pZCo+KGJ1ZmZlciksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZmZlcl9zaXplKSk7Ci0gICAgICBvcGVuc3NsX29wZXJhdGlvbjxTdHJlYW0+IG9wKAotICAgICAgICBzZW5kX2Z1bmMsCi0gICAgICAgIG5leHRfbGF5ZXIsCi0gICAgICAgIGltcGwtPnJlY3ZfYnVmLAotICAgICAgICBpbXBsLT5zc2wsCi0gICAgICAgIGltcGwtPmV4dF9iaW8KLSAgICAgICk7Ci0gICAgICBieXRlc190cmFuc2ZlcnJlZCA9IHN0YXRpY19jYXN0PHNpemVfdD4ob3Auc3RhcnQoKSk7Ci0gICAgfQotICAgIGNhdGNoIChhc2lvOjpzeXN0ZW1fZXJyb3ImIGUpCi0gICAgewotICAgICAgZWMgPSBlLmNvZGUoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiBieXRlc190cmFuc2ZlcnJlZDsKLSAgfQotCi0gIC8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3cml0ZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgQ29uc3RfQnVmZmVycywgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY193cml0ZV9zb21lKGltcGxfdHlwZSYgaW1wbCwgU3RyZWFtJiBuZXh0X2xheWVyLAotICAgICAgY29uc3QgQ29uc3RfQnVmZmVycyYgYnVmZmVycywgSGFuZGxlciBoYW5kbGVyKQotICB7Ci0gICAgdHlwZWRlZiBpb19oYW5kbGVyPFN0cmVhbSwgSGFuZGxlcj4gc2VuZF9oYW5kbGVyOwotCi0gICAgYXNpbzo6Y29uc3RfYnVmZmVyIGJ1ZmZlciA9Ci0gICAgICBhc2lvOjpkZXRhaWw6OmJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPAotICAgICAgICBhc2lvOjpjb25zdF9idWZmZXIsIENvbnN0X0J1ZmZlcnM+OjpmaXJzdChidWZmZXJzKTsKLQotICAgIHN0ZDo6c2l6ZV90IGJ1ZmZlcl9zaXplID0gYXNpbzo6YnVmZmVyX3NpemUoYnVmZmVyKTsKLSAgICBpZiAoYnVmZmVyX3NpemUgPiBtYXhfYnVmZmVyX3NpemUpCi0gICAgICBidWZmZXJfc2l6ZSA9IG1heF9idWZmZXJfc2l6ZTsKLSAgICBlbHNlIGlmIChidWZmZXJfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIGdldF9pb19zZXJ2aWNlKCkucG9zdChhc2lvOjpkZXRhaWw6OmJpbmRfaGFuZGxlcigKLSAgICAgICAgICAgIGhhbmRsZXIsIGFzaW86OmVycm9yX2NvZGUoKSwgMCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNlbmRfaGFuZGxlciogbG9jYWxfaGFuZGxlciA9IG5ldyBzZW5kX2hhbmRsZXIoaGFuZGxlciwgZ2V0X2lvX3NlcnZpY2UoKSk7Ci0KLSAgICBib29zdDo6ZnVuY3Rpb248aW50IChTU0wqKT4gc2VuZF9mdW5jID0KLSAgICAgIGJvb3N0OjpiaW5kKGJvb3N0Ojp0eXBlPGludD4oKSwgJjo6U1NMX3dyaXRlLCBib29zdDo6YXJnPDE+KCksCi0gICAgICAgICAgYXNpbzo6YnVmZmVyX2Nhc3Q8Y29uc3Qgdm9pZCo+KGJ1ZmZlciksCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihidWZmZXJfc2l6ZSkpOwotCi0gICAgb3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPiogb3AgPSBuZXcgb3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPgotICAgICgKLSAgICAgIHNlbmRfZnVuYywKLSAgICAgIG5leHRfbGF5ZXIsCi0gICAgICBpbXBsLT5yZWN2X2J1ZiwKLSAgICAgIGltcGwtPnNzbCwKLSAgICAgIGltcGwtPmV4dF9iaW8sCi0gICAgICBib29zdDo6YmluZAotICAgICAgKAotICAgICAgICAmYmFzZV9oYW5kbGVyPFN0cmVhbT46OmRvX2Z1bmMsIAotICAgICAgICBsb2NhbF9oYW5kbGVyLCAKLSAgICAgICAgYm9vc3Q6OmFyZzwxPigpLAotICAgICAgICBib29zdDo6YXJnPDI+KCkKLSAgICAgICksCi0gICAgICBzdHJhbmRfCi0gICAgKTsKLSAgICBsb2NhbF9oYW5kbGVyLT5zZXRfb3BlcmF0aW9uKG9wKTsKLQotICAgIHN0cmFuZF8ucG9zdChib29zdDo6YmluZCgmb3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPjo6c3RhcnQsIG9wKSk7ICAgICAgICAKLSAgfQotCi0gIC8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHN0cmVhbS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgTXV0YWJsZV9CdWZmZXJzPgotICBzdGQ6OnNpemVfdCByZWFkX3NvbWUoaW1wbF90eXBlJiBpbXBsLCBTdHJlYW0mIG5leHRfbGF5ZXIsCi0gICAgICBjb25zdCBNdXRhYmxlX0J1ZmZlcnMmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgc2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkID0gMDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBhc2lvOjptdXRhYmxlX2J1ZmZlciBidWZmZXIgPQotICAgICAgICBhc2lvOjpkZXRhaWw6OmJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPAotICAgICAgICAgIGFzaW86Om11dGFibGVfYnVmZmVyLCBNdXRhYmxlX0J1ZmZlcnM+OjpmaXJzdChidWZmZXJzKTsKLQotICAgICAgc3RkOjpzaXplX3QgYnVmZmVyX3NpemUgPSBhc2lvOjpidWZmZXJfc2l6ZShidWZmZXIpOwotICAgICAgaWYgKGJ1ZmZlcl9zaXplID4gbWF4X2J1ZmZlcl9zaXplKQotICAgICAgICBidWZmZXJfc2l6ZSA9IG1heF9idWZmZXJfc2l6ZTsKLSAgICAgIGVsc2UgaWYgKGJ1ZmZlcl9zaXplID09IDApCi0gICAgICB7Ci0gICAgICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgYm9vc3Q6OmZ1bmN0aW9uPGludCAoU1NMKik+IHJlY3ZfZnVuYyA9Ci0gICAgICAgIGJvb3N0OjpiaW5kKGJvb3N0Ojp0eXBlPGludD4oKSwgJjo6U1NMX3JlYWQsIGJvb3N0Ojphcmc8MT4oKSwKLSAgICAgICAgICAgIGFzaW86OmJ1ZmZlcl9jYXN0PHZvaWQqPihidWZmZXIpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihidWZmZXJfc2l6ZSkpOwotICAgICAgb3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPiBvcChyZWN2X2Z1bmMsCi0gICAgICAgIG5leHRfbGF5ZXIsCi0gICAgICAgIGltcGwtPnJlY3ZfYnVmLAotICAgICAgICBpbXBsLT5zc2wsCi0gICAgICAgIGltcGwtPmV4dF9iaW8KLSAgICAgICk7Ci0KLSAgICAgIGJ5dGVzX3RyYW5zZmVycmVkID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihvcC5zdGFydCgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKGFzaW86OnN5c3RlbV9lcnJvciYgZSkKLSAgICB7Ci0gICAgICBlYyA9IGUuY29kZSgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgZWMgPSBhc2lvOjplcnJvcl9jb2RlKCk7Ci0gICAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOwotICB9Ci0KLSAgLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlYWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0sIHR5cGVuYW1lIE11dGFibGVfQnVmZmVycywgdHlwZW5hbWUgSGFuZGxlcj4KLSAgdm9pZCBhc3luY19yZWFkX3NvbWUoaW1wbF90eXBlJiBpbXBsLCBTdHJlYW0mIG5leHRfbGF5ZXIsCi0gICAgICBjb25zdCBNdXRhYmxlX0J1ZmZlcnMmIGJ1ZmZlcnMsIEhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIHR5cGVkZWYgaW9faGFuZGxlcjxTdHJlYW0sIEhhbmRsZXI+IHJlY3ZfaGFuZGxlcjsKLQotICAgIGFzaW86Om11dGFibGVfYnVmZmVyIGJ1ZmZlciA9Ci0gICAgICBhc2lvOjpkZXRhaWw6OmJ1ZmZlcl9zZXF1ZW5jZV9hZGFwdGVyPAotICAgICAgICBhc2lvOjptdXRhYmxlX2J1ZmZlciwgTXV0YWJsZV9CdWZmZXJzPjo6Zmlyc3QoYnVmZmVycyk7Ci0KLSAgICBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZSA9IGFzaW86OmJ1ZmZlcl9zaXplKGJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZmZlcl9zaXplID4gbWF4X2J1ZmZlcl9zaXplKQotICAgICAgYnVmZmVyX3NpemUgPSBtYXhfYnVmZmVyX3NpemU7Ci0gICAgZWxzZSBpZiAoYnVmZmVyX3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICBnZXRfaW9fc2VydmljZSgpLnBvc3QoYXNpbzo6ZGV0YWlsOjpiaW5kX2hhbmRsZXIoCi0gICAgICAgICAgICBoYW5kbGVyLCBhc2lvOjplcnJvcl9jb2RlKCksIDApKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZWN2X2hhbmRsZXIqIGxvY2FsX2hhbmRsZXIgPSBuZXcgcmVjdl9oYW5kbGVyKGhhbmRsZXIsIGdldF9pb19zZXJ2aWNlKCkpOwotCi0gICAgYm9vc3Q6OmZ1bmN0aW9uPGludCAoU1NMKik+IHJlY3ZfZnVuYyA9Ci0gICAgICBib29zdDo6YmluZChib29zdDo6dHlwZTxpbnQ+KCksICY6OlNTTF9yZWFkLCBib29zdDo6YXJnPDE+KCksCi0gICAgICAgICAgYXNpbzo6YnVmZmVyX2Nhc3Q8dm9pZCo+KGJ1ZmZlciksCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihidWZmZXJfc2l6ZSkpOwotCi0gICAgb3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPiogb3AgPSBuZXcgb3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPgotICAgICgKLSAgICAgIHJlY3ZfZnVuYywKLSAgICAgIG5leHRfbGF5ZXIsCi0gICAgICBpbXBsLT5yZWN2X2J1ZiwKLSAgICAgIGltcGwtPnNzbCwKLSAgICAgIGltcGwtPmV4dF9iaW8sCi0gICAgICBib29zdDo6YmluZAotICAgICAgKAotICAgICAgICAmYmFzZV9oYW5kbGVyPFN0cmVhbT46OmRvX2Z1bmMsIAotICAgICAgICBsb2NhbF9oYW5kbGVyLCAKLSAgICAgICAgYm9vc3Q6OmFyZzwxPigpLAotICAgICAgICBib29zdDo6YXJnPDI+KCkKLSAgICAgICksCi0gICAgICBzdHJhbmRfCi0gICAgKTsKLSAgICBsb2NhbF9oYW5kbGVyLT5zZXRfb3BlcmF0aW9uKG9wKTsKLQotICAgIHN0cmFuZF8ucG9zdChib29zdDo6YmluZCgmb3BlbnNzbF9vcGVyYXRpb248U3RyZWFtPjo6c3RhcnQsIG9wKSk7ICAgICAgICAKLSAgfQotCi0gIC8vIFBlZWsgYXQgdGhlIGluY29taW5nIGRhdGEgb24gdGhlIHN0cmVhbS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgTXV0YWJsZV9CdWZmZXJzPgotICBzdGQ6OnNpemVfdCBwZWVrKGltcGxfdHlwZSYgLyppbXBsKi8sIFN0cmVhbSYgLypuZXh0X2xheWVyKi8sCi0gICAgICBjb25zdCBNdXRhYmxlX0J1ZmZlcnMmIC8qYnVmZmVycyovLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gRGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0+Ci0gIHN0ZDo6c2l6ZV90IGluX2F2YWlsKGltcGxfdHlwZSYgLyppbXBsKi8sIFN0cmVhbSYgLypuZXh0X2xheWVyKi8sCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGVjID0gYXNpbzo6ZXJyb3JfY29kZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLXByaXZhdGU6ICAKLSAgYXNpbzo6aW9fc2VydmljZTo6c3RyYW5kIHN0cmFuZF87Ci0KLSAgdHlwZWRlZiBhc2lvOjpkZXRhaWw6Om11dGV4IG11dGV4X3R5cGU7Ci0gIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBNdXRleD4KLSAgc3RydWN0IHNzbF93cmFwCi0gIHsKLSAgICBzdGF0aWMgTXV0ZXggc3NsX211dGV4XzsKLQotICAgIHN0YXRpYyBpbnQgU1NMX2FjY2VwdChTU0wgKnNzbCkKLSAgICB7Ci0gICAgICB0eXBlbmFtZSBNdXRleDo6c2NvcGVkX2xvY2sgbG9jayhzc2xfbXV0ZXhfKTsKLSAgICAgIHJldHVybiA6OlNTTF9hY2NlcHQoc3NsKTsKLSAgICB9Ci0gIAotICAgIHN0YXRpYyBpbnQgU1NMX2Nvbm5lY3QoU1NMICpzc2wpCi0gICAgewotICAgICAgdHlwZW5hbWUgTXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soc3NsX211dGV4Xyk7Ci0gICAgICByZXR1cm4gOjpTU0xfY29ubmVjdChzc2wpOwotICAgIH0KLSAgCi0gICAgc3RhdGljIGludCBTU0xfc2h1dGRvd24oU1NMICpzc2wpCi0gICAgewotICAgICAgdHlwZW5hbWUgTXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soc3NsX211dGV4Xyk7Ci0gICAgICByZXR1cm4gOjpTU0xfc2h1dGRvd24oc3NsKTsgIAotICAgIH0gICAgCi0gIH07ICAKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIE11dGV4PgotTXV0ZXggb3BlbnNzbF9zdHJlYW1fc2VydmljZTo6c3NsX3dyYXA8TXV0ZXg+Ojpzc2xfbXV0ZXhfOwotCi19IC8vIG5hbWVzcGFjZSBkZXRhaWwKLX0gLy8gbmFtZXNwYWNlIG9sZAotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9PTERfREVUQUlMX09QRU5TU0xfU1RSRUFNX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL29sZC9zdHJlYW0uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9vbGQvc3RyZWFtLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzMDA1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL29sZC9zdHJlYW0uaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8vCi0vLyBzc2wvb2xkL3N0cmVhbS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwNSBWb2lwc3RlciAvIEluZHJlayBkb3QgSnVoYW5pIGF0IHZvaXBzdGVyIGRvdCBjb20KLS8vIENvcHlyaWdodCAoYykgMjAwNS0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9PTERfU1RSRUFNX0hQUAotI2RlZmluZSBBU0lPX1NTTF9PTERfU1RSRUFNX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90eXBlX3RyYWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvYmFzaWNfY29udGV4dC5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvc3RyZWFtX2Jhc2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL3N0cmVhbV9zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotbmFtZXNwYWNlIG9sZCB7Ci0KLS8vLyBQcm92aWRlcyBzdHJlYW0tb3JpZW50ZWQgZnVuY3Rpb25hbGl0eSB1c2luZyBTU0wuCi0vKioKLSAqIFRoZSBzdHJlYW0gY2xhc3MgdGVtcGxhdGUgcHJvdmlkZXMgYXN5bmNocm9ub3VzIGFuZCBibG9ja2luZyBzdHJlYW0tb3JpZW50ZWQKLSAqIGZ1bmN0aW9uYWxpdHkgdXNpbmcgU1NMLgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHVzZSB0aGUgU1NMIHN0cmVhbSB0ZW1wbGF0ZSB3aXRoIGFuIGlwOjp0Y3A6OnNvY2tldCwgeW91IHdvdWxkIHdyaXRlOgotICogQGNvZGUKLSAqIGFzaW86OmlvX3NlcnZpY2UgaW9fc2VydmljZTsKLSAqIGFzaW86OnNzbDo6Y29udGV4dCBjb250ZXh0KGlvX3NlcnZpY2UsIGFzaW86OnNzbDo6Y29udGV4dDo6c3NsdjIzKTsKLSAqIGFzaW86OnNzbDo6c3RyZWFtPGFzaW86OmlwOjp0Y3A6OnNvY2tldD4gc29jayhpb19zZXJ2aWNlLCBjb250ZXh0KTsKLSAqIEBlbmRjb2RlCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIEFzeW5jUmVhZFN0cmVhbSwgQXN5bmNXcml0ZVN0cmVhbSwgU3RyZWFtLCBTeW5jUmVhZF9TdHJlYW0sIFN5bmNXcml0ZVN0cmVhbS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgU2VydmljZSA9IG9sZDo6c3RyZWFtX3NlcnZpY2U+Ci1jbGFzcyBzdHJlYW0KLSAgOiBwdWJsaWMgc3RyZWFtX2Jhc2UsCi0gICAgcHJpdmF0ZSBib29zdDo6bm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8vIFRoZSB0eXBlIG9mIHRoZSBuZXh0IGxheWVyLgotICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8U3RyZWFtPjo6dHlwZSBuZXh0X2xheWVyX3R5cGU7Ci0KLSAgLy8vIFRoZSB0eXBlIG9mIHRoZSBsb3dlc3QgbGF5ZXIuCi0gIHR5cGVkZWYgdHlwZW5hbWUgbmV4dF9sYXllcl90eXBlOjpsb3dlc3RfbGF5ZXJfdHlwZSBsb3dlc3RfbGF5ZXJfdHlwZTsKLQotICAvLy8gVGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcHJvdmlkZSBzdHJlYW0gb3BlcmF0aW9ucy4KLSAgdHlwZWRlZiBTZXJ2aWNlIHNlcnZpY2VfdHlwZTsKLQotICAvLy8gVGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiB0eXBlIG9mIHRoZSBzdHJlYW0uCi0gIHR5cGVkZWYgdHlwZW5hbWUgc2VydmljZV90eXBlOjppbXBsX3R5cGUgaW1wbF90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3QgYSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBzdHJlYW0gYW5kIGluaXRpYWxpc2VzIHRoZSB1bmRlcmx5aW5nIHN0cmVhbQotICAgKiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBhcmcgVGhlIGFyZ3VtZW50IHRvIGJlIHBhc3NlZCB0byBpbml0aWFsaXNlIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIGNvbnRleHQgVGhlIFNTTCBjb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSBzdHJlYW0uCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnLCB0eXBlbmFtZSBDb250ZXh0X1NlcnZpY2U+Ci0gIGV4cGxpY2l0IHN0cmVhbShBcmcmIGFyZywgYmFzaWNfY29udGV4dDxDb250ZXh0X1NlcnZpY2U+JiBjb250ZXh0KQotICAgIDogbmV4dF9sYXllcl8oYXJnKSwKLSAgICAgIHNlcnZpY2VfKGFzaW86OnVzZV9zZXJ2aWNlPFNlcnZpY2U+KG5leHRfbGF5ZXJfLmdldF9pb19zZXJ2aWNlKCkpKSwKLSAgICAgIGltcGxfKHNlcnZpY2VfLm51bGwoKSkKLSAgewotICAgIHNlcnZpY2VfLmNyZWF0ZShpbXBsXywgbmV4dF9sYXllcl8sIGNvbnRleHQpOwotICB9Ci0KLSAgLy8vIERlc3RydWN0b3IuCi0gIH5zdHJlYW0oKQotICB7Ci0gICAgc2VydmljZV8uZGVzdHJveShpbXBsXywgbmV4dF9sYXllcl8pOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgaW9fc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBzdHJlYW0KLSAgICogdXNlcyB0byBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgc3RyZWFtIHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzLiBPd25lcnNoaXAgaXMgbm90IHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIuCi0gICAqLwotICBhc2lvOjppb19zZXJ2aWNlJiBnZXRfaW9fc2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl8uZ2V0X2lvX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIG5leHQgbGF5ZXIuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG5leHQgbGF5ZXIgaW4gYSBzdGFjayBvZiBzdHJlYW0KLSAgICogbGF5ZXJzLgotICAgKgotICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IGxheWVyIGluIHRoZSBzdGFjayBvZiBzdHJlYW0gbGF5ZXJzLgotICAgKiBPd25lcnNoaXAgaXMgbm90IHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIuCi0gICAqLwotICBuZXh0X2xheWVyX3R5cGUmIG5leHRfbGF5ZXIoKQotICB7Ci0gICAgcmV0dXJuIG5leHRfbGF5ZXJfOwotICB9Ci0KLSAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIgaW4gYSBzdGFjayBvZgotICAgKiBzdHJlYW0gbGF5ZXJzLgotICAgKgotICAgKiBAcmV0dXJuIEEgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIgaW4gdGhlIHN0YWNrIG9mIHN0cmVhbSBsYXllcnMuCi0gICAqIE93bmVyc2hpcCBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlci4KLSAgICovCi0gIGxvd2VzdF9sYXllcl90eXBlJiBsb3dlc3RfbGF5ZXIoKQotICB7Ci0gICAgcmV0dXJuIG5leHRfbGF5ZXJfLmxvd2VzdF9sYXllcigpOwotICB9Ci0KLSAgLy8vIEdldCBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIgaW4gYSBzdGFjayBvZgotICAgKiBzdHJlYW0gbGF5ZXJzLgotICAgKgotICAgKiBAcmV0dXJuIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIgaW4gdGhlIHN0YWNrIG9mIHN0cmVhbQotICAgKiBsYXllcnMuIE93bmVyc2hpcCBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlci4KLSAgICovCi0gIGNvbnN0IGxvd2VzdF9sYXllcl90eXBlJiBsb3dlc3RfbGF5ZXIoKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIG5leHRfbGF5ZXJfLmxvd2VzdF9sYXllcigpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgbmF0aXZlIHR5cGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIG9idGFpbiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAgICogY29udGV4dC4gVGhpcyBpcyBpbnRlbmRlZCB0byBhbGxvdyBhY2Nlc3MgdG8gc3RyZWFtIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcwotICAgKiBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkLgotICAgKi8KLSAgaW1wbF90eXBlIGltcGwoKQotICB7Ci0gICAgcmV0dXJuIGltcGxfOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gU1NMIGhhbmRzaGFraW5nLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBlcmZvcm0gU1NMIGhhbmRzaGFraW5nIG9uIHRoZSBzdHJlYW0uIFRoZQotICAgKiBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgaGFuZHNoYWtpbmcgaXMgY29tcGxldGUgb3IgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBoYW5kc2hha2luZyB0byBiZSBwZXJmb3JtZWQsIGkuZS4gYXMgYSBjbGllbnQgb3IgYXMKLSAgICogYSBzZXJ2ZXIuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBoYW5kc2hha2UoaGFuZHNoYWtlX3R5cGUgdHlwZSkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc2VydmljZV8uaGFuZHNoYWtlKGltcGxfLCBuZXh0X2xheWVyXywgdHlwZSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gU1NMIGhhbmRzaGFraW5nLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBlcmZvcm0gU1NMIGhhbmRzaGFraW5nIG9uIHRoZSBzdHJlYW0uIFRoZQotICAgKiBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgaGFuZHNoYWtpbmcgaXMgY29tcGxldGUgb3IgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBoYW5kc2hha2luZyB0byBiZSBwZXJmb3JtZWQsIGkuZS4gYXMgYSBjbGllbnQgb3IgYXMKLSAgICogYSBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBoYW5kc2hha2UoaGFuZHNoYWtlX3R5cGUgdHlwZSwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfLmhhbmRzaGFrZShpbXBsXywgbmV4dF9sYXllcl8sIHR5cGUsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgU1NMIGhhbmRzaGFrZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSBwZXJmb3JtIGFuIFNTTCBoYW5kc2hha2Ugb24gdGhlCi0gICAqIHN0cmVhbS4gVGhpcyBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBoYW5kc2hha2luZyB0byBiZSBwZXJmb3JtZWQsIGkuZS4gYXMgYSBjbGllbnQgb3IgYXMKLSAgICogYSBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBoYW5kc2hha2Ugb3BlcmF0aW9uCi0gICAqIGNvbXBsZXRlcy4gQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGVxdWl2YWxlbnQKLSAgICogZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiApOyBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRzaGFrZUhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfaGFuZHNoYWtlKGhhbmRzaGFrZV90eXBlIHR5cGUsIEhhbmRzaGFrZUhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIHNlcnZpY2VfLmFzeW5jX2hhbmRzaGFrZShpbXBsXywgbmV4dF9sYXllcl8sIHR5cGUsIGhhbmRsZXIpOwotICB9Ci0KLSAgLy8vIFNodXQgZG93biBTU0wgb24gdGhlIHN0cmVhbS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzaHV0IGRvd24gU1NMIG9uIHRoZSBzdHJlYW0uIFRoZSBmdW5jdGlvbiBjYWxsCi0gICAqIHdpbGwgYmxvY2sgdW50aWwgU1NMIGhhcyBiZWVuIHNodXQgZG93biBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBzaHV0ZG93bigpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHNlcnZpY2VfLnNodXRkb3duKGltcGxfLCBuZXh0X2xheWVyXywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICB9Ci0KLSAgLy8vIFNodXQgZG93biBTU0wgb24gdGhlIHN0cmVhbS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzaHV0IGRvd24gU1NMIG9uIHRoZSBzdHJlYW0uIFRoZSBmdW5jdGlvbiBjYWxsCi0gICAqIHdpbGwgYmxvY2sgdW50aWwgU1NMIGhhcyBiZWVuIHNodXQgZG93biBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBzaHV0ZG93bihhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlXy5zaHV0ZG93bihpbXBsXywgbmV4dF9sYXllcl8sIGVjKTsKLSAgfQotCi0gIC8vLyBBc3luY2hyb25vdXNseSBzaHV0IGRvd24gU1NMIG9uIHRoZSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgc2h1dCBkb3duIFNTTCBvbiB0aGUgc3RyZWFtLiBUaGlzCi0gICAqIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBoYW5kc2hha2Ugb3BlcmF0aW9uCi0gICAqIGNvbXBsZXRlcy4gQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGVxdWl2YWxlbnQKLSAgICogZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiApOyBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNodXRkb3duSGFuZGxlcj4KLSAgdm9pZCBhc3luY19zaHV0ZG93bihTaHV0ZG93bkhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIHNlcnZpY2VfLmFzeW5jX3NodXRkb3duKGltcGxfLCBuZXh0X2xheWVyXywgaGFuZGxlcik7Ci0gIH0KLQotICAvLy8gV3JpdGUgc29tZSBkYXRhIHRvIHRoZSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgZGF0YSBvbiB0aGUgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsCi0gICAqIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBzdWNjZXNzZnVsbHksIG9yCi0gICAqIHVudGlsIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgVGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgVGhlIHdyaXRlX3NvbWUgb3BlcmF0aW9uIG1heSBub3QgdHJhbnNtaXQgYWxsIG9mIHRoZSBkYXRhIHRvIHRoZQotICAgKiBwZWVyLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiB3cml0ZSBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCBhbGwKLSAgICogZGF0YSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSBzZXJ2aWNlXy53cml0ZV9zb21lKGltcGxfLCBuZXh0X2xheWVyXywgYnVmZmVycywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgc3RyZWFtLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGRhdGEgb24gdGhlIHN0cmVhbS4gVGhlIGZ1bmN0aW9uIGNhbGwgd2lsbAotICAgKiBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LCBvcgotICAgKiB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gUmV0dXJucyAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgKgotICAgKiBAbm90ZSBUaGUgd3JpdGVfc29tZSBvcGVyYXRpb24gbWF5IG5vdCB0cmFuc21pdCBhbGwgb2YgdGhlIGRhdGEgdG8gdGhlCi0gICAqIHBlZXIuIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIHdyaXRlIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFsbAotICAgKiBkYXRhIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHdyaXRlX3NvbWUoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfLndyaXRlX3NvbWUoaW1wbF8sIG5leHRfbGF5ZXJfLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdyaXRlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHdyaXRlIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgdG8KLSAgICogdGhlIHN0cmVhbS4gVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4gQWx0aG91Z2ggdGhlIGJ1ZmZlcnMKLSAgICogb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVycyBpcwotICAgKiByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZSB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsCi0gICAqIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHdyaXRlIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uCi0gICAqIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB3cml0dGVuLgotICAgKiApOyBAZW5kY29kZQotICAgKgotICAgKiBAbm90ZSBUaGUgYXN5bmNfd3JpdGVfc29tZSBvcGVyYXRpb24gbWF5IG5vdCB0cmFuc21pdCBhbGwgb2YgdGhlIGRhdGEgdG8KLSAgICogdGhlIHBlZXIuIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIGFzeW5jX3dyaXRlIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvCi0gICAqIGVuc3VyZSB0aGF0IGFsbCBkYXRhIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgdm9pZCBhc3luY193cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBXcml0ZUhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIHNlcnZpY2VfLmFzeW5jX3dyaXRlX3NvbWUoaW1wbF8sIG5leHRfbGF5ZXJfLCBidWZmZXJzLCBoYW5kbGVyKTsKLSAgfQotCi0gIC8vLyBSZWFkIHNvbWUgZGF0YSBmcm9tIHRoZSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbS4gVGhlIGZ1bmN0aW9uIGNhbGwgd2lsbAotICAgKiBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiBkYXRhIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciB1bnRpbAotICAgKiBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIFRoZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVhZF9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gICAqIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiByZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZQotICAgKiByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWFkX3NvbWUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gc2VydmljZV8ucmVhZF9zb21lKGltcGxfLCBuZXh0X2xheWVyXywgYnVmZmVycywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLy8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHN0cmVhbS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsCi0gICAqIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgaGFzIGJlZW4gcmVhZCBzdWNjZXNzZnVsbHksIG9yIHVudGlsCi0gICAqIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgVGhlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJlYWRfc29tZSBvcGVyYXRpb24gbWF5IG5vdCByZWFkIGFsbCBvZiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgotICAgKiBieXRlcy4gQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgcmVhZCBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUKLSAgICogcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQgYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVhZF9zb21lKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfLnJlYWRfc29tZShpbXBsXywgbmV4dF9sYXllcl8sIGJ1ZmZlcnMsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVhZC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWFkIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgZnJvbQotICAgKiB0aGUgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgVGhlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuIEFsdGhvdWdoIHRoZQotICAgKiBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZSB1bmRlcmx5aW5nCi0gICAqIGJ1ZmZlcnMgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCB0aGV5IHJlbWFpbgotICAgKiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWFkIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uCi0gICAqIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyByZWFkLgotICAgKiApOyBAZW5kY29kZQotICAgKgotICAgKiBAbm90ZSBUaGUgYXN5bmNfcmVhZF9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQKLSAgICogbnVtYmVyIG9mIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiBhc3luY19yZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvCi0gICAqIGVuc3VyZSB0aGF0IHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGFzeW5jaHJvbm91cwotICAgKiBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVhZF9zb21lKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIFJlYWRIYW5kbGVyIGhhbmRsZXIpCi0gIHsKLSAgICBzZXJ2aWNlXy5hc3luY19yZWFkX3NvbWUoaW1wbF8sIG5leHRfbGF5ZXJfLCBidWZmZXJzLCBoYW5kbGVyKTsKLSAgfQotCi0gIC8vLyBQZWVrIGF0IHRoZSBpbmNvbWluZyBkYXRhIG9uIHRoZSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGVlayBhdCB0aGUgaW5jb21pbmcgZGF0YSBvbiB0aGUgc3RyZWFtLCB3aXRob3V0Ci0gICAqIHJlbW92aW5nIGl0IGZyb20gdGhlIGlucHV0IHF1ZXVlLiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIGRhdGEKLSAgICogaGFzIGJlZW4gcmVhZCBzdWNjZXNzZnVsbHkgb3IgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBUaGUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWFkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHBlZWsoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gc2VydmljZV8ucGVlayhpbXBsXywgbmV4dF9sYXllcl8sIGJ1ZmZlcnMsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBQZWVrIGF0IHRoZSBpbmNvbWluZyBkYXRhIG9uIHRoZSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGVlayBhdCB0aGUgaW5jb21pbmcgZGF0YSBvbiB0aGUgc3RyZWFtLCB3aXRob3V0eGkKLSAgICogcmVtb3ZpbmcgaXQgZnJvbSB0aGUgaW5wdXQgcXVldWUuIFRoZSBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgZGF0YQotICAgKiBoYXMgYmVlbiByZWFkIHN1Y2Nlc3NmdWxseSBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIFRoZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCBwZWVrKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfLnBlZWsoaW1wbF8sIG5leHRfbGF5ZXJfLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZGF0YSwgaW4gYnl0ZXMsIHRoYXQgbWF5Ci0gICAqIGJlIHJlYWQgZnJvbSB0aGUgc3RyZWFtIHdpdGhvdXQgYmxvY2tpbmcuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0aGF0IGNhbiBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgc3RkOjpzaXplX3QgaW5fYXZhaWwoKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzdGQ6OnNpemVfdCBzID0gc2VydmljZV8uaW5fYXZhaWwoaW1wbF8sIG5leHRfbGF5ZXJfLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYyk7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZGF0YSwgaW4gYnl0ZXMsIHRoYXQgbWF5Ci0gICAqIGJlIHJlYWQgZnJvbSB0aGUgc3RyZWFtIHdpdGhvdXQgYmxvY2tpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdGhhdCBjYW4gYmUgcmVhZCB3aXRob3V0IGJsb2NraW5nLgotICAgKi8KLSAgc3RkOjpzaXplX3QgaW5fYXZhaWwoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV8uaW5fYXZhaWwoaW1wbF8sIG5leHRfbGF5ZXJfLCBlYyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8vIFRoZSBuZXh0IGxheWVyLgotICBTdHJlYW0gbmV4dF9sYXllcl87Ci0KLSAgLy8vIFRoZSBiYWNrZW5kIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gIHNlcnZpY2VfdHlwZSYgc2VydmljZV87Ci0KLSAgLy8vIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi4KLSAgaW1wbF90eXBlIGltcGxfOwotfTsKLQotfSAvLyBuYW1lc3BhY2Ugb2xkCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX09MRF9TVFJFQU1fSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL29sZC9zdHJlYW1fc2VydmljZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL29sZC9zdHJlYW1fc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOWQ3OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9vbGQvc3RyZWFtX3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vCi0vLyBzc2wvb2xkL3N0cmVhbV9zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUgVm9pcHN0ZXIgLyBJbmRyZWsgZG90IEp1aGFuaSBhdCB2b2lwc3RlciBkb3QgY29tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfT0xEX1NUUkVBTV9TRVJWSUNFX0hQUAotI2RlZmluZSBBU0lPX1NTTF9PTERfU1RSRUFNX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+Ci0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC9iYXNpY19jb250ZXh0LmhwcCIKLSNpbmNsdWRlICJhc2lvL3NzbC9vbGQvZGV0YWlsL29wZW5zc2xfc3RyZWFtX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vc3NsL3N0cmVhbV9iYXNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotbmFtZXNwYWNlIG9sZCB7Ci0KLS8vLyBEZWZhdWx0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gZm9yIGFuIFNTTCBzdHJlYW0uCi1jbGFzcyBzdHJlYW1fc2VydmljZQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICA6IHB1YmxpYyBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlCi0jZWxzZQotICA6IHB1YmxpYyBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxzdHJlYW1fc2VydmljZT4KLSNlbmRpZgotewotcHJpdmF0ZToKLSAgLy8gVGhlIHR5cGUgb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotICB0eXBlZGVmIG9sZDo6ZGV0YWlsOjpvcGVuc3NsX3N0cmVhbV9zZXJ2aWNlIHNlcnZpY2VfaW1wbF90eXBlOwotCi1wdWJsaWM6Ci0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBUaGUgdW5pcXVlIHNlcnZpY2UgaWRlbnRpZmllci4KLSAgc3RhdGljIGFzaW86OmlvX3NlcnZpY2U6OmlkIGlkOwotI2VuZGlmCi0KLSAgLy8vIFRoZSB0eXBlIG9mIGEgc3RyZWFtIGltcGxlbWVudGF0aW9uLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgaW1wbF90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBzZXJ2aWNlX2ltcGxfdHlwZTo6aW1wbF90eXBlIGltcGxfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgc3RyZWFtIHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgaW9fc2VydmljZS4KLSAgZXhwbGljaXQgc3RyZWFtX3NlcnZpY2UoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPHN0cmVhbV9zZXJ2aWNlPihpb19zZXJ2aWNlKSwKLSAgICAgIHNlcnZpY2VfaW1wbF8oYXNpbzo6dXNlX3NlcnZpY2U8c2VydmljZV9pbXBsX3R5cGU+KGlvX3NlcnZpY2UpKQotICB7Ci0gIH0KLQotICAvLy8gUmV0dXJuIGEgbnVsbCBzdHJlYW0gaW1wbGVtZW50YXRpb24uCi0gIGltcGxfdHlwZSBudWxsKCkgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm51bGwoKTsKLSAgfQotCi0gIC8vLyBDcmVhdGUgYSBuZXcgc3RyZWFtIGltcGxlbWVudGF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtLCB0eXBlbmFtZSBDb250ZXh0X1NlcnZpY2U+Ci0gIHZvaWQgY3JlYXRlKGltcGxfdHlwZSYgaW1wbCwgU3RyZWFtJiBuZXh0X2xheWVyLAotICAgICAgYmFzaWNfY29udGV4dDxDb250ZXh0X1NlcnZpY2U+JiBjb250ZXh0KQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5jcmVhdGUoaW1wbCwgbmV4dF9sYXllciwgY29udGV4dCk7Ci0gIH0KLQotICAvLy8gRGVzdHJveSBhIHN0cmVhbSBpbXBsZW1lbnRhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLSAgdm9pZCBkZXN0cm95KGltcGxfdHlwZSYgaW1wbCwgU3RyZWFtJiBuZXh0X2xheWVyKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5kZXN0cm95KGltcGwsIG5leHRfbGF5ZXIpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gU1NMIGhhbmRzaGFraW5nLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotICBhc2lvOjplcnJvcl9jb2RlIGhhbmRzaGFrZShpbXBsX3R5cGUmIGltcGwsIFN0cmVhbSYgbmV4dF9sYXllciwKLSAgICAgIHN0cmVhbV9iYXNlOjpoYW5kc2hha2VfdHlwZSB0eXBlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmhhbmRzaGFrZShpbXBsLCBuZXh0X2xheWVyLCB0eXBlLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIFNTTCBoYW5kc2hha2UuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0sIHR5cGVuYW1lIEhhbmRzaGFrZUhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfaGFuZHNoYWtlKGltcGxfdHlwZSYgaW1wbCwgU3RyZWFtJiBuZXh0X2xheWVyLAotICAgICAgc3RyZWFtX2Jhc2U6OmhhbmRzaGFrZV90eXBlIHR5cGUsIEhhbmRzaGFrZUhhbmRsZXIgaGFuZGxlcikKLSAgewotICAgIHNlcnZpY2VfaW1wbF8uYXN5bmNfaGFuZHNoYWtlKGltcGwsIG5leHRfbGF5ZXIsIHR5cGUsIGhhbmRsZXIpOwotICB9Ci0KLSAgLy8vIFNodXQgZG93biBTU0wgb24gdGhlIHN0cmVhbS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbT4KLSAgYXNpbzo6ZXJyb3JfY29kZSBzaHV0ZG93bihpbXBsX3R5cGUmIGltcGwsIFN0cmVhbSYgbmV4dF9sYXllciwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2h1dGRvd24oaW1wbCwgbmV4dF9sYXllciwgZWMpOwotICB9Ci0KLSAgLy8vIEFzeW5jaHJvbm91c2x5IHNodXQgZG93biBTU0wgb24gdGhlIHN0cmVhbS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgU2h1dGRvd25IYW5kbGVyPgotICB2b2lkIGFzeW5jX3NodXRkb3duKGltcGxfdHlwZSYgaW1wbCwgU3RyZWFtJiBuZXh0X2xheWVyLAotICAgICAgU2h1dGRvd25IYW5kbGVyIGhhbmRsZXIpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3NodXRkb3duKGltcGwsIG5leHRfbGF5ZXIsIGhhbmRsZXIpOwotICB9Ci0KLSAgLy8vIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgc3RyZWFtLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGltcGxfdHlwZSYgaW1wbCwgU3RyZWFtJiBuZXh0X2xheWVyLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy53cml0ZV9zb21lKGltcGwsIG5leHRfbGF5ZXIsIGJ1ZmZlcnMsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd3JpdGUuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0sIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgICB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfd3JpdGVfc29tZShpbXBsX3R5cGUmIGltcGwsIFN0cmVhbSYgbmV4dF9sYXllciwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIFdyaXRlSGFuZGxlciBoYW5kbGVyKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5hc3luY193cml0ZV9zb21lKGltcGwsIG5leHRfbGF5ZXIsIGJ1ZmZlcnMsIGhhbmRsZXIpOwotICB9Ci0KLSAgLy8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHN0cmVhbS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWFkX3NvbWUoaW1wbF90eXBlJiBpbXBsLCBTdHJlYW0mIG5leHRfbGF5ZXIsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ucmVhZF9zb21lKGltcGwsIG5leHRfbGF5ZXIsIGJ1ZmZlcnMsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVhZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLAotICAgICAgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIHZvaWQgYXN5bmNfcmVhZF9zb21lKGltcGxfdHlwZSYgaW1wbCwgU3RyZWFtJiBuZXh0X2xheWVyLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBSZWFkSGFuZGxlciBoYW5kbGVyKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5hc3luY19yZWFkX3NvbWUoaW1wbCwgbmV4dF9sYXllciwgYnVmZmVycywgaGFuZGxlcik7Ci0gIH0KLQotICAvLy8gUGVlayBhdCB0aGUgaW5jb21pbmcgZGF0YSBvbiB0aGUgc3RyZWFtLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtLCB0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHBlZWsoaW1wbF90eXBlJiBpbXBsLCBTdHJlYW0mIG5leHRfbGF5ZXIsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ucGVlayhpbXBsLCBuZXh0X2xheWVyLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW0+Ci0gIHN0ZDo6c2l6ZV90IGluX2F2YWlsKGltcGxfdHlwZSYgaW1wbCwgU3RyZWFtJiBuZXh0X2xheWVyLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5pbl9hdmFpbChpbXBsLCBuZXh0X2xheWVyLCBlYyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCkKLSAgewotICB9Ci0KLSAgLy8gVGhlIHNlcnZpY2UgdGhhdCBwcm92aWRlcyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCi0gIHNlcnZpY2VfaW1wbF90eXBlJiBzZXJ2aWNlX2ltcGxfOwotfTsKLQotfSAvLyBuYW1lc3BhY2Ugb2xkCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX09MRF9TVFJFQU1fU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvcmZjMjgxOF92ZXJpZmljYXRpb24uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9yZmMyODE4X3ZlcmlmaWNhdGlvbi5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTMyZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9yZmMyODE4X3ZlcmlmaWNhdGlvbi5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8KLS8vIHNzbC9yZmMyODE4X3ZlcmlmaWNhdGlvbi5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfUkZDMjgxOF9WRVJJRklDQVRJT05fSFBQCi0jZGVmaW5lIEFTSU9fU1NMX1JGQzI4MThfVkVSSUZJQ0FUSU9OX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLSMgaW5jbHVkZSA8c3RyaW5nPgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvb3BlbnNzbF90eXBlcy5ocHAiCi0jIGluY2x1ZGUgImFzaW8vc3NsL3ZlcmlmeV9jb250ZXh0LmhwcCIKLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0vLy8gVmVyaWZpZXMgYSBjZXJ0aWZpY2F0ZSBhZ2FpbnN0IGEgaG9zdG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBkZXNjcmliZWQKLS8vLyBpbiBSRkMgMjgxOC4KLS8qKgotICogQHBhciBFeGFtcGxlCi0gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHN5bmNocm9ub3VzbHkgb3BlbiBhIHNlY3VyZSBjb25uZWN0aW9uIHRvCi0gKiBhIGdpdmVuIGhvc3QgbmFtZToKLSAqIEBjb2RlCi0gKiB1c2luZyBhc2lvOjppcDo6dGNwOwotICogbmFtZXNwYWNlIHNzbCA9IGFzaW86OnNzbDsKLSAqIHR5cGVkZWYgc3NsOjpzdHJlYW08dGNwOjpzb2NrZXQ+IHNzbF9zb2NrZXQ7Ci0gKgotICogLy8gQ3JlYXRlIGEgY29udGV4dCB0aGF0IHVzZXMgdGhlIGRlZmF1bHQgcGF0aHMgZm9yIGZpbmRpbmcgQ0EgY2VydGlmaWNhdGVzLgotICogc3NsOjpjb250ZXh0IGN0eChzc2w6OmNvbnRleHQ6OnNzbHYyMyk7Ci0gKiBjdHguc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKCk7Ci0gKgotICogLy8gT3BlbiBhIHNvY2tldCBhbmQgY29ubmVjdCBpdCB0byB0aGUgcmVtb3RlIGhvc3QuCi0gKiBhc2lvOjppb19zZXJ2aWNlIGlvX3NlcnZpY2U7Ci0gKiBzc2xfc29ja2V0IHNvY2soaW9fc2VydmljZSwgY3R4KTsKLSAqIHRjcDo6cmVzb2x2ZXIgcmVzb2x2ZXIoaW9fc2VydmljZSk7Ci0gKiB0Y3A6OnJlc29sdmVyOjpxdWVyeSBxdWVyeSgiaG9zdC5uYW1lIiwgImh0dHBzIik7Ci0gKiBhc2lvOjpjb25uZWN0KHNvY2subG93ZXN0X2xheWVyKCksIHJlc29sdmVyLnJlc29sdmUocXVlcnkpKTsKLSAqIHNvY2subG93ZXN0X2xheWVyKCkuc2V0X29wdGlvbih0Y3A6Om5vX2RlbGF5KHRydWUpKTsKLSAqCi0gKiAvLyBQZXJmb3JtIFNTTCBoYW5kc2hha2UgYW5kIHZlcmlmeSB0aGUgcmVtb3RlIGhvc3QncyBjZXJ0aWZpY2F0ZS4KLSAqIHNvY2suc2V0X3ZlcmlmeV9tb2RlKHNzbDo6dmVyaWZ5X3BlZXIpOwotICogc29jay5zZXRfdmVyaWZ5X2NhbGxiYWNrKHNzbDo6cmZjMjgxOF92ZXJpZmljYXRpb24oImhvc3QubmFtZSIpKTsKLSAqIHNvY2suaGFuZHNoYWtlKHNzbF9zb2NrZXQ6OmNsaWVudCk7Ci0gKgotICogLy8gLi4uIHJlYWQgYW5kIHdyaXRlIGFzIG5vcm1hbCAuLi4KLSAqIEBlbmRjb2RlCi0gKi8KLWNsYXNzIHJmYzI4MThfdmVyaWZpY2F0aW9uCi17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0J3MgcmVzdWx0LgotICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdG9yLgotICBleHBsaWNpdCByZmMyODE4X3ZlcmlmaWNhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCkKLSAgICA6IGhvc3RfKGhvc3QpCi0gIHsKLSAgfQotCi0gIC8vLyBQZXJmb3JtIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4KLSAgQVNJT19ERUNMIGJvb2wgb3BlcmF0b3IoKShib29sIHByZXZlcmlmaWVkLCB2ZXJpZnlfY29udGV4dCYgY3R4KSBjb25zdDsKLQotcHJpdmF0ZToKLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGEgaG9zdCBuYW1lIGFnYWluc3QgYSBwYXR0ZXJuLgotICBBU0lPX0RFQ0wgc3RhdGljIGJvb2wgbWF0Y2hfcGF0dGVybihjb25zdCBjaGFyKiBwYXR0ZXJuLAotICAgICAgc3RkOjpzaXplX3QgcGF0dGVybl9sZW5ndGgsIGNvbnN0IGNoYXIqIGhvc3QpOwotCi0gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBhIGhvc3QgbmFtZSBhZ2FpbnN0IGFuIElQdjQgYWRkcmVzcwotICAvLyBUaGUgaG9zdCBuYW1lIHRvIGJlIGNoZWNrZWQuCi0gIHN0ZDo6c3RyaW5nIGhvc3RfOwotfTsKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEVBREVSX09OTFkpCi0jIGluY2x1ZGUgImFzaW8vc3NsL2ltcGwvcmZjMjgxOF92ZXJpZmljYXRpb24uaXBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IRUFERVJfT05MWSkKLQotI2VuZGlmIC8vIEFTSU9fU1NMX1JGQzI4MThfVkVSSUZJQ0FUSU9OX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9zdHJlYW0uaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9zdHJlYW0uaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmJjMDI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvc3RyZWFtLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1NiArMCwwIEBACi0vLwotLy8gc3NsL3N0cmVhbS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1NMX1NUUkVBTV9IUFAKLSNkZWZpbmUgQVNJT19TU0xfU1RSRUFNX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotIyBpbmNsdWRlICJhc2lvL3NzbC9vbGQvc3RyZWFtLmhwcCIKLSNlbHNlIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLSMgaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9idWZmZXJfc2VxdWVuY2VfYWRhcHRlci5ocHAiCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL2hhbmRsZXJfdHlwZV9yZXF1aXJlbWVudHMuaHBwIgotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jIGluY2x1ZGUgImFzaW8vZGV0YWlsL3R5cGVfdHJhaXRzLmhwcCIKLSMgaW5jbHVkZSAiYXNpby9zc2wvY29udGV4dC5ocHAiCi0jIGluY2x1ZGUgImFzaW8vc3NsL2RldGFpbC9idWZmZXJlZF9oYW5kc2hha2Vfb3AuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvaGFuZHNoYWtlX29wLmhwcCIKLSMgaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL2lvLmhwcCIKLSMgaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL3JlYWRfb3AuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvc2h1dGRvd25fb3AuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvc3RyZWFtX2NvcmUuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvd3JpdGVfb3AuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9zdHJlYW1fYmFzZS5ocHAiCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLXVzaW5nIGFzaW86OnNzbDo6b2xkOjpzdHJlYW07Ci0KLSNlbHNlIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotLy8vIFByb3ZpZGVzIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbmFsaXR5IHVzaW5nIFNTTC4KLS8qKgotICogVGhlIHN0cmVhbSBjbGFzcyB0ZW1wbGF0ZSBwcm92aWRlcyBhc3luY2hyb25vdXMgYW5kIGJsb2NraW5nIHN0cmVhbS1vcmllbnRlZAotICogZnVuY3Rpb25hbGl0eSB1c2luZyBTU0wuCi0gKgotICogQHBhciBUaHJlYWQgU2FmZXR5Ci0gKiBAZSBEaXN0aW5jdCBAZSBvYmplY3RzOiBTYWZlLkBuCi0gKiBAZSBTaGFyZWQgQGUgb2JqZWN0czogVW5zYWZlLiBUaGUgYXBwbGljYXRpb24gbXVzdCBhbHNvIGVuc3VyZSB0aGF0IGFsbAotICogYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCB3aXRoaW4gdGhlIHNhbWUgaW1wbGljaXQgb3IgZXhwbGljaXQKLSAqIHN0cmFuZC4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHVzZSB0aGUgU1NMIHN0cmVhbSB0ZW1wbGF0ZSB3aXRoIGFuIGlwOjp0Y3A6OnNvY2tldCwgeW91IHdvdWxkIHdyaXRlOgotICogQGNvZGUKLSAqIGFzaW86OmlvX3NlcnZpY2UgaW9fc2VydmljZTsKLSAqIGFzaW86OnNzbDo6Y29udGV4dCBjdHgoYXNpbzo6c3NsOjpjb250ZXh0Ojpzc2x2MjMpOwotICogYXNpbzo6c3NsOjpzdHJlYW08YXNpbzppcDo6dGNwOjpzb2NrZXQ+IHNvY2soaW9fc2VydmljZSwgY3R4KTsKLSAqIEBlbmRjb2RlCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIEFzeW5jUmVhZFN0cmVhbSwgQXN5bmNXcml0ZVN0cmVhbSwgU3RyZWFtLCBTeW5jUmVhZFN0cmVhbSwgU3luY1dyaXRlU3RyZWFtLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtPgotY2xhc3Mgc3RyZWFtIDoKLSAgcHVibGljIHN0cmVhbV9iYXNlLAotICBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgbmF0aXZlIGhhbmRsZSB0eXBlIG9mIHRoZSBTU0wgc3RyZWFtLgotICB0eXBlZGVmIFNTTCogbmF0aXZlX2hhbmRsZV90eXBlOwotCi0gIC8vLyBTdHJ1Y3R1cmUgZm9yIHVzZSB3aXRoIGRlcHJlY2F0ZWQgaW1wbF90eXBlLgotICBzdHJ1Y3QgaW1wbF9zdHJ1Y3QKLSAgewotICAgIFNTTCogc3NsOwotICB9OwotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGVfdHlwZS4pIFRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIHR5cGUuCi0gIHR5cGVkZWYgaW1wbF9zdHJ1Y3QqIGltcGxfdHlwZTsKLQotICAvLy8gVGhlIHR5cGUgb2YgdGhlIG5leHQgbGF5ZXIuCi0gIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxTdHJlYW0+Ojp0eXBlIG5leHRfbGF5ZXJfdHlwZTsKLQotICAvLy8gVGhlIHR5cGUgb2YgdGhlIGxvd2VzdCBsYXllci4KLSAgdHlwZWRlZiB0eXBlbmFtZSBuZXh0X2xheWVyX3R5cGU6Omxvd2VzdF9sYXllcl90eXBlIGxvd2VzdF9sYXllcl90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3QgYSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBzdHJlYW0gYW5kIGluaXRpYWxpc2VzIHRoZSB1bmRlcmx5aW5nIHN0cmVhbQotICAgKiBvYmplY3QuCi0gICAqCi0gICAqIEBwYXJhbSBhcmcgVGhlIGFyZ3VtZW50IHRvIGJlIHBhc3NlZCB0byBpbml0aWFsaXNlIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIGN0eCBUaGUgU1NMIGNvbnRleHQgdG8gYmUgdXNlZCBmb3IgdGhlIHN0cmVhbS4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmc+Ci0gIHN0cmVhbShBcmcmIGFyZywgY29udGV4dCYgY3R4KQotICAgIDogbmV4dF9sYXllcl8oYXJnKSwKLSAgICAgIGNvcmVfKGN0eC5uYXRpdmVfaGFuZGxlKCksIG5leHRfbGF5ZXJfLmxvd2VzdF9sYXllcigpLmdldF9pb19zZXJ2aWNlKCkpCi0gIHsKLSAgICBiYWNrd2FyZHNfY29tcGF0aWJsZV9pbXBsXy5zc2wgPSBjb3JlXy5lbmdpbmVfLm5hdGl2ZV9oYW5kbGUoKTsKLSAgfQotCi0gIC8vLyBEZXN0cnVjdG9yLgotICB+c3RyZWFtKCkKLSAgewotICB9Ci0KLSAgLy8vIEdldCB0aGUgaW9fc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBzdHJlYW0KLSAgICogdXNlcyB0byBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgc3RyZWFtIHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzLiBPd25lcnNoaXAgaXMgbm90IHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIuCi0gICAqLwotICBhc2lvOjppb19zZXJ2aWNlJiBnZXRfaW9fc2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl8ubG93ZXN0X2xheWVyKCkuZ2V0X2lvX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaW4gdGhlIG5hdGl2ZSB0eXBlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gICAqIGNvbnRleHQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWxsb3cgYWNjZXNzIHRvIGNvbnRleHQgZnVuY3Rpb25hbGl0eSB0aGF0IGlzCi0gICAqIG5vdCBvdGhlcndpc2UgcHJvdmlkZWQuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUaGUgbmF0aXZlX2hhbmRsZSgpIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIG9mIHR5cGUgQGMgU1NMKiB0aGF0IGlzCi0gICAqIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGZ1bmN0aW9ucyBzdWNoIGFzIEBjIFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdCBhbmQKLSAgICogQGMgU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlOgotICAgKiBAY29kZQotICAgKiBhc2lvOjpzc2w6OnN0cmVhbTxhc2lvOmlwOjp0Y3A6OnNvY2tldD4gc29jayhpb19zZXJ2aWNlLCBjdHgpOwotICAgKgotICAgKiAvLyAuLi4gZXN0YWJsaXNoIGNvbm5lY3Rpb24gYW5kIHBlcmZvcm0gaGFuZHNoYWtlIC4uLgotICAgKgotICAgKiBpZiAoWDUwOSogY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzb2NrLm5hdGl2ZV9oYW5kbGUoKSkpCi0gICAqIHsKLSAgICogICBpZiAoU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNvY2submF0aXZlX2hhbmRsZSgpKSA9PSBYNTA5X1ZfT0spCi0gICAqICAgewotICAgKiAgICAgLy8gLi4uCi0gICAqICAgfQotICAgKiB9Ci0gICAqIEBlbmRjb2RlCi0gICAqLwotICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpCi0gIHsKLSAgICByZXR1cm4gY29yZV8uZW5naW5lXy5uYXRpdmVfaGFuZGxlKCk7Ci0gIH0KLQotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlKCkuKSBHZXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaW4KLSAgLy8vIHRoZSBuYXRpdmUgdHlwZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gb2J0YWluIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICAgKiBjb250ZXh0LiBUaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGFjY2VzcyB0byBzdHJlYW0gZnVuY3Rpb25hbGl0eSB0aGF0IGlzCi0gICAqIG5vdCBvdGhlcndpc2UgcHJvdmlkZWQuCi0gICAqLwotICBpbXBsX3R5cGUgaW1wbCgpCi0gIHsKLSAgICByZXR1cm4gJmJhY2t3YXJkc19jb21wYXRpYmxlX2ltcGxfOwotICB9Ci0KLSAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgbmV4dCBsYXllci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbmV4dCBsYXllciBpbiBhIHN0YWNrIG9mIHN0cmVhbQotICAgKiBsYXllcnMuCi0gICAqCi0gICAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIG5leHQgbGF5ZXIgaW4gdGhlIHN0YWNrIG9mIHN0cmVhbSBsYXllcnMuCi0gICAqIE93bmVyc2hpcCBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlci4KLSAgICovCi0gIGNvbnN0IG5leHRfbGF5ZXJfdHlwZSYgbmV4dF9sYXllcigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gbmV4dF9sYXllcl87Ci0gIH0KLQotICAvLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IGxheWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IGxheWVyIGluIGEgc3RhY2sgb2Ygc3RyZWFtCi0gICAqIGxheWVycy4KLSAgICoKLSAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGUgbmV4dCBsYXllciBpbiB0aGUgc3RhY2sgb2Ygc3RyZWFtIGxheWVycy4KLSAgICogT3duZXJzaGlwIGlzIG5vdCB0cmFuc2ZlcnJlZCB0byB0aGUgY2FsbGVyLgotICAgKi8KLSAgbmV4dF9sYXllcl90eXBlJiBuZXh0X2xheWVyKCkKLSAgewotICAgIHJldHVybiBuZXh0X2xheWVyXzsKLSAgfQotCi0gIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIGEgc3RhY2sgb2YKLSAgICogc3RyZWFtIGxheWVycy4KLSAgICoKLSAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIHRoZSBzdGFjayBvZiBzdHJlYW0gbGF5ZXJzLgotICAgKiBPd25lcnNoaXAgaXMgbm90IHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIuCi0gICAqLwotICBsb3dlc3RfbGF5ZXJfdHlwZSYgbG93ZXN0X2xheWVyKCkKLSAgewotICAgIHJldHVybiBuZXh0X2xheWVyXy5sb3dlc3RfbGF5ZXIoKTsKLSAgfQotCi0gIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIGEgc3RhY2sgb2YKLSAgICogc3RyZWFtIGxheWVycy4KLSAgICoKLSAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIHRoZSBzdGFjayBvZiBzdHJlYW0gbGF5ZXJzLgotICAgKiBPd25lcnNoaXAgaXMgbm90IHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIuCi0gICAqLwotICBjb25zdCBsb3dlc3RfbGF5ZXJfdHlwZSYgbG93ZXN0X2xheWVyKCkgY29uc3QKLSAgewotICAgIHJldHVybiBuZXh0X2xheWVyXy5sb3dlc3RfbGF5ZXIoKTsKLSAgfQotCi0gIC8vLyBTZXQgdGhlIHBlZXIgdmVyaWZpY2F0aW9uIG1vZGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgcGVlciB2ZXJpZmljYXRpb24gbW9kZSB1c2VkIGJ5Ci0gICAqIHRoZSBzdHJlYW0uIFRoZSBuZXcgbW9kZSB3aWxsIG92ZXJyaWRlIHRoZSBtb2RlIGluaGVyaXRlZCBmcm9tIHRoZSBjb250ZXh0LgotICAgKgotICAgKiBAcGFyYW0gdiBBIGJpdG1hc2sgb2YgcGVlciB2ZXJpZmljYXRpb24gbW9kZXMuIFNlZSBAcmVmIHZlcmlmeV9tb2RlIGZvcgotICAgKiBhdmFpbGFibGUgdmFsdWVzLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX3NldF92ZXJpZnkuCi0gICAqLwotICB2b2lkIHNldF92ZXJpZnlfbW9kZSh2ZXJpZnlfbW9kZSB2KQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzZXRfdmVyaWZ5X21vZGUodiwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJzZXRfdmVyaWZ5X21vZGUiKTsKLSAgfQotCi0gIC8vLyBTZXQgdGhlIHBlZXIgdmVyaWZpY2F0aW9uIG1vZGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgcGVlciB2ZXJpZmljYXRpb24gbW9kZSB1c2VkIGJ5Ci0gICAqIHRoZSBzdHJlYW0uIFRoZSBuZXcgbW9kZSB3aWxsIG92ZXJyaWRlIHRoZSBtb2RlIGluaGVyaXRlZCBmcm9tIHRoZSBjb250ZXh0LgotICAgKgotICAgKiBAcGFyYW0gdiBBIGJpdG1hc2sgb2YgcGVlciB2ZXJpZmljYXRpb24gbW9kZXMuIFNlZSBAcmVmIHZlcmlmeV9tb2RlIGZvcgotICAgKiBhdmFpbGFibGUgdmFsdWVzLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX3NldF92ZXJpZnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIHNldF92ZXJpZnlfbW9kZSgKLSAgICAgIHZlcmlmeV9tb2RlIHYsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIGNvcmVfLmVuZ2luZV8uc2V0X3ZlcmlmeV9tb2RlKHYsIGVjKTsKLSAgfQotCi0gIC8vLyBTZXQgdGhlIHBlZXIgdmVyaWZpY2F0aW9uIGRlcHRoLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIG1heGltdW0gdmVyaWZpY2F0aW9uIGRlcHRoCi0gICAqIGFsbG93ZWQgYnkgdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIGRlcHRoIE1heGltdW0gZGVwdGggZm9yIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZmljYXRpb24gdGhhdAotICAgKiBzaGFsbCBiZSBhbGxvd2VkLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX3NldF92ZXJpZnlfZGVwdGguCi0gICAqLwotICB2b2lkIHNldF92ZXJpZnlfZGVwdGgoaW50IGRlcHRoKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzZXRfdmVyaWZ5X2RlcHRoKGRlcHRoLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNldF92ZXJpZnlfZGVwdGgiKTsKLSAgfQotCi0gIC8vLyBTZXQgdGhlIHBlZXIgdmVyaWZpY2F0aW9uIGRlcHRoLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIG1heGltdW0gdmVyaWZpY2F0aW9uIGRlcHRoCi0gICAqIGFsbG93ZWQgYnkgdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIGRlcHRoIE1heGltdW0gZGVwdGggZm9yIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZmljYXRpb24gdGhhdAotICAgKiBzaGFsbCBiZSBhbGxvd2VkLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQG5vdGUgQ2FsbHMgQGMgU1NMX3NldF92ZXJpZnlfZGVwdGguCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIHNldF92ZXJpZnlfZGVwdGgoCi0gICAgICBpbnQgZGVwdGgsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIGNvcmVfLmVuZ2luZV8uc2V0X3ZlcmlmeV9kZXB0aChkZXB0aCwgZWMpOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgY2FsbGJhY2sgdXNlZCB0byB2ZXJpZnkgcGVlciBjZXJ0aWZpY2F0ZXMuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICogYnkgdGhlIGltcGxlbWVudGF0aW9uIHdoZW4gaXQgbmVlZHMgdG8gdmVyaWZ5IGEgcGVlciBjZXJ0aWZpY2F0ZS4KLSAgICoKLSAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgdXNlZCBmb3IgdmVyaWZ5aW5nIGEgY2VydGlmaWNhdGUuCi0gICAqIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgYm9vbCB2ZXJpZnlfY2FsbGJhY2soCi0gICAqICAgYm9vbCBwcmV2ZXJpZmllZCwgLy8gVHJ1ZSBpZiB0aGUgY2VydGlmaWNhdGUgcGFzc2VkIHByZS12ZXJpZmljYXRpb24uCi0gICAqICAgdmVyaWZ5X2NvbnRleHQmIGN0eCAvLyBUaGUgcGVlciBjZXJ0aWZpY2F0ZSBhbmQgb3RoZXIgY29udGV4dC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sgaXMgdHJ1ZSBpZiB0aGUgY2VydGlmaWNhdGUgaGFzIHBhc3NlZAotICAgKiB2ZXJpZmljYXRpb24sIGZhbHNlIG90aGVyd2lzZS4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9zZXRfdmVyaWZ5LgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFZlcmlmeUNhbGxiYWNrPgotICB2b2lkIHNldF92ZXJpZnlfY2FsbGJhY2soVmVyaWZ5Q2FsbGJhY2sgY2FsbGJhY2spCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPnNldF92ZXJpZnlfY2FsbGJhY2soY2FsbGJhY2ssIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAic2V0X3ZlcmlmeV9jYWxsYmFjayIpOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgY2FsbGJhY2sgdXNlZCB0byB2ZXJpZnkgcGVlciBjZXJ0aWZpY2F0ZXMuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICogYnkgdGhlIGltcGxlbWVudGF0aW9uIHdoZW4gaXQgbmVlZHMgdG8gdmVyaWZ5IGEgcGVlciBjZXJ0aWZpY2F0ZS4KLSAgICoKLSAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgdXNlZCBmb3IgdmVyaWZ5aW5nIGEgY2VydGlmaWNhdGUuCi0gICAqIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgYm9vbCB2ZXJpZnlfY2FsbGJhY2soCi0gICAqICAgYm9vbCBwcmV2ZXJpZmllZCwgLy8gVHJ1ZSBpZiB0aGUgY2VydGlmaWNhdGUgcGFzc2VkIHByZS12ZXJpZmljYXRpb24uCi0gICAqICAgdmVyaWZ5X2NvbnRleHQmIGN0eCAvLyBUaGUgcGVlciBjZXJ0aWZpY2F0ZSBhbmQgb3RoZXIgY29udGV4dC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGJhY2sgaXMgdHJ1ZSBpZiB0aGUgY2VydGlmaWNhdGUgaGFzIHBhc3NlZAotICAgKiB2ZXJpZmljYXRpb24sIGZhbHNlIG90aGVyd2lzZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEBub3RlIENhbGxzIEBjIFNTTF9zZXRfdmVyaWZ5LgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFZlcmlmeUNhbGxiYWNrPgotICBhc2lvOjplcnJvcl9jb2RlIHNldF92ZXJpZnlfY2FsbGJhY2soVmVyaWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBjb3JlXy5lbmdpbmVfLnNldF92ZXJpZnlfY2FsbGJhY2soCi0gICAgICAgIG5ldyBkZXRhaWw6OnZlcmlmeV9jYWxsYmFjazxWZXJpZnlDYWxsYmFjaz4oY2FsbGJhY2spLCBlYyk7Ci0gIH0KLQotICAvLy8gUGVyZm9ybSBTU0wgaGFuZHNoYWtpbmcuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGVyZm9ybSBTU0wgaGFuZHNoYWtpbmcgb24gdGhlIHN0cmVhbS4gVGhlCi0gICAqIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jayB1bnRpbCBoYW5kc2hha2luZyBpcyBjb21wbGV0ZSBvciBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIGhhbmRzaGFraW5nIHRvIGJlIHBlcmZvcm1lZCwgaS5lLiBhcyBhIGNsaWVudCBvciBhcwotICAgKiBhIHNlcnZlci4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICB2b2lkIGhhbmRzaGFrZShoYW5kc2hha2VfdHlwZSB0eXBlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBoYW5kc2hha2UodHlwZSwgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJoYW5kc2hha2UiKTsKLSAgfQotCi0gIC8vLyBQZXJmb3JtIFNTTCBoYW5kc2hha2luZy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwZXJmb3JtIFNTTCBoYW5kc2hha2luZyBvbiB0aGUgc3RyZWFtLiBUaGUKLSAgICogZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIGhhbmRzaGFraW5nIGlzIGNvbXBsZXRlIG9yIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgaGFuZHNoYWtpbmcgdG8gYmUgcGVyZm9ybWVkLCBpLmUuIGFzIGEgY2xpZW50IG9yIGFzCi0gICAqIGEgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgaGFuZHNoYWtlKGhhbmRzaGFrZV90eXBlIHR5cGUsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGRldGFpbDo6aW8obmV4dF9sYXllcl8sIGNvcmVfLCBkZXRhaWw6OmhhbmRzaGFrZV9vcCh0eXBlKSwgZWMpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vLyBQZXJmb3JtIFNTTCBoYW5kc2hha2luZy4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwZXJmb3JtIFNTTCBoYW5kc2hha2luZyBvbiB0aGUgc3RyZWFtLiBUaGUKLSAgICogZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIGhhbmRzaGFraW5nIGlzIGNvbXBsZXRlIG9yIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgaGFuZHNoYWtpbmcgdG8gYmUgcGVyZm9ybWVkLCBpLmUuIGFzIGEgY2xpZW50IG9yIGFzCi0gICAqIGEgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBUaGUgYnVmZmVyZWQgZGF0YSB0byBiZSByZXVzZWQgZm9yIHRoZSBoYW5kc2hha2UuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHZvaWQgaGFuZHNoYWtlKGhhbmRzaGFrZV90eXBlIHR5cGUsIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIGhhbmRzaGFrZSh0eXBlLCBidWZmZXJzLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImhhbmRzaGFrZSIpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gU1NMIGhhbmRzaGFraW5nLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBlcmZvcm0gU1NMIGhhbmRzaGFraW5nIG9uIHRoZSBzdHJlYW0uIFRoZQotICAgKiBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgaGFuZHNoYWtpbmcgaXMgY29tcGxldGUgb3IgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBoYW5kc2hha2luZyB0byBiZSBwZXJmb3JtZWQsIGkuZS4gYXMgYSBjbGllbnQgb3IgYXMKLSAgICogYSBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIFRoZSBidWZmZXJlZCBkYXRhIHRvIGJlIHJldXNlZCBmb3IgdGhlIGhhbmRzaGFrZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgYXNpbzo6ZXJyb3JfY29kZSBoYW5kc2hha2UoaGFuZHNoYWtlX3R5cGUgdHlwZSwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZGV0YWlsOjppbyhuZXh0X2xheWVyXywgY29yZV8sCi0gICAgICAgIGRldGFpbDo6YnVmZmVyZWRfaGFuZHNoYWtlX29wPENvbnN0QnVmZmVyU2VxdWVuY2U+KHR5cGUsIGJ1ZmZlcnMpLCBlYyk7Ci0gICAgcmV0dXJuIGVjOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBTU0wgaGFuZHNoYWtlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHBlcmZvcm0gYW4gU1NMIGhhbmRzaGFrZSBvbiB0aGUKLSAgICogc3RyZWFtLiBUaGlzIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIGhhbmRzaGFraW5nIHRvIGJlIHBlcmZvcm1lZCwgaS5lLiBhcyBhIGNsaWVudCBvciBhcwotICAgKiBhIHNlcnZlci4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGhhbmRzaGFrZSBvcGVyYXRpb24KLSAgICogY29tcGxldGVzLiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZXF1aXZhbGVudAotICAgKiBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICk7IEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZHNoYWtlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoSGFuZHNoYWtlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUpKQotICBhc3luY19oYW5kc2hha2UoaGFuZHNoYWtlX3R5cGUgdHlwZSwKLSAgICAgIEFTSU9fTU9WRV9BUkcoSGFuZHNoYWtlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBIYW5kc2hha2VIYW5kbGVyLgotICAgIEFTSU9fSEFORFNIQUtFX0hBTkRMRVJfQ0hFQ0soSGFuZHNoYWtlSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIGFzaW86OmRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBIYW5kc2hha2VIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlKT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoSGFuZHNoYWtlSGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgZGV0YWlsOjphc3luY19pbyhuZXh0X2xheWVyXywgY29yZV8sCi0gICAgICAgIGRldGFpbDo6aGFuZHNoYWtlX29wKHR5cGUpLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBTU0wgaGFuZHNoYWtlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHBlcmZvcm0gYW4gU1NMIGhhbmRzaGFrZSBvbiB0aGUKLSAgICogc3RyZWFtLiBUaGlzIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIGhhbmRzaGFraW5nIHRvIGJlIHBlcmZvcm1lZCwgaS5lLiBhcyBhIGNsaWVudCBvciBhcwotICAgKiBhIHNlcnZlci4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgVGhlIGJ1ZmZlcmVkIGRhdGEgdG8gYmUgcmV1c2VkIGZvciB0aGUgaGFuZHNoYWtlLiBBbHRob3VnaAotICAgKiB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUgdW5kZXJseWluZwotICAgKiBidWZmZXJzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlIHRoYXQgdGhleSByZW1haW4KLSAgICogdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgaGFuZHNoYWtlIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBlcXVpdmFsZW50Ci0gICAqIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgLy8gQW1vdW50IG9mIGJ1ZmZlcnMgdXNlZCBpbiBoYW5kc2hha2UuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgQnVmZmVyZWRIYW5kc2hha2VIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShCdWZmZXJlZEhhbmRzaGFrZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX2hhbmRzaGFrZShoYW5kc2hha2VfdHlwZSB0eXBlLCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQVNJT19NT1ZFX0FSRyhCdWZmZXJlZEhhbmRzaGFrZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgQnVmZmVyZWRIYW5kc2hha2VIYW5kbGVyLgotICAgIEFTSU9fQlVGRkVSRURfSEFORFNIQUtFX0hBTkRMRVJfQ0hFQ0soCi0gICAgICAgIEJ1ZmZlcmVkSGFuZHNoYWtlSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIGFzaW86OmRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8QnVmZmVyZWRIYW5kc2hha2VIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChCdWZmZXJlZEhhbmRzaGFrZUhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICAgIGRldGFpbDo6YXN5bmNfaW8obmV4dF9sYXllcl8sIGNvcmVfLAotICAgICAgICBkZXRhaWw6OmJ1ZmZlcmVkX2hhbmRzaGFrZV9vcDxDb25zdEJ1ZmZlclNlcXVlbmNlPih0eXBlLCBidWZmZXJzKSwKLSAgICAgICAgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBTaHV0IGRvd24gU1NMIG9uIHRoZSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2h1dCBkb3duIFNTTCBvbiB0aGUgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FsbAotICAgKiB3aWxsIGJsb2NrIHVudGlsIFNTTCBoYXMgYmVlbiBzaHV0IGRvd24gb3IgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIHZvaWQgc2h1dGRvd24oKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICBzaHV0ZG93bihlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgInNodXRkb3duIik7Ci0gIH0KLQotICAvLy8gU2h1dCBkb3duIFNTTCBvbiB0aGUgc3RyZWFtLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNodXQgZG93biBTU0wgb24gdGhlIHN0cmVhbS4gVGhlIGZ1bmN0aW9uIGNhbGwKLSAgICogd2lsbCBibG9jayB1bnRpbCBTU0wgaGFzIGJlZW4gc2h1dCBkb3duIG9yIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICBhc2lvOjplcnJvcl9jb2RlIHNodXRkb3duKGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgZGV0YWlsOjppbyhuZXh0X2xheWVyXywgY29yZV8sIGRldGFpbDo6c2h1dGRvd25fb3AoKSwgZWMpOwotICAgIHJldHVybiBlYzsKLSAgfQotCi0gIC8vLyBBc3luY2hyb25vdXNseSBzaHV0IGRvd24gU1NMIG9uIHRoZSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgc2h1dCBkb3duIFNTTCBvbiB0aGUgc3RyZWFtLiBUaGlzCi0gICAqIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBoYW5kc2hha2Ugb3BlcmF0aW9uCi0gICAqIGNvbXBsZXRlcy4gQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGVxdWl2YWxlbnQKLSAgICogZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiApOyBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNodXRkb3duSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoU2h1dGRvd25IYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSkpCi0gIGFzeW5jX3NodXRkb3duKEFTSU9fTU9WRV9BUkcoU2h1dGRvd25IYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFNodXRkb3duSGFuZGxlci4KLSAgICBBU0lPX1NIVVRET1dOX0hBTkRMRVJfQ0hFQ0soU2h1dGRvd25IYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgYXNpbzo6ZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFNodXRkb3duSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFNodXRkb3duSGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgZGV0YWlsOjphc3luY19pbyhuZXh0X2xheWVyXywgY29yZV8sIGRldGFpbDo6c2h1dGRvd25fb3AoKSwgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIHN0cmVhbS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3cml0ZSBkYXRhIG9uIHRoZSBzdHJlYW0uIFRoZSBmdW5jdGlvbiBjYWxsIHdpbGwKLSAgICogYmxvY2sgdW50aWwgb25lIG9yIG1vcmUgYnl0ZXMgb2YgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHN1Y2Nlc3NmdWxseSwgb3IKLSAgICogdW50aWwgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBUaGUgZGF0YSB0byBiZSB3cml0dGVuLgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKgotICAgKiBAbm90ZSBUaGUgd3JpdGVfc29tZSBvcGVyYXRpb24gbWF5IG5vdCB0cmFuc21pdCBhbGwgb2YgdGhlIGRhdGEgdG8gdGhlCi0gICAqIHBlZXIuIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIHdyaXRlIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFsbAotICAgKiBkYXRhIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHdyaXRlX3NvbWUoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgbiA9IHdyaXRlX3NvbWUoYnVmZmVycywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ3cml0ZV9zb21lIik7Ci0gICAgcmV0dXJuIG47Ci0gIH0KLQotICAvLy8gV3JpdGUgc29tZSBkYXRhIHRvIHRoZSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgZGF0YSBvbiB0aGUgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsCi0gICAqIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBzdWNjZXNzZnVsbHksIG9yCi0gICAqIHVudGlsIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgc3RyZWFtLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiBSZXR1cm5zIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqCi0gICAqIEBub3RlIFRoZSB3cml0ZV9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHRyYW5zbWl0IGFsbCBvZiB0aGUgZGF0YSB0byB0aGUKLSAgICogcGVlci4gQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgd3JpdGUgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgYWxsCi0gICAqIGRhdGEgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgd3JpdGVfc29tZShjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gZGV0YWlsOjppbyhuZXh0X2xheWVyXywgY29yZV8sCi0gICAgICAgIGRldGFpbDo6d3JpdGVfb3A8Q29uc3RCdWZmZXJTZXF1ZW5jZT4oYnVmZmVycyksIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd3JpdGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgd3JpdGUgb25lIG9yIG1vcmUgYnl0ZXMgb2YgZGF0YSB0bwotICAgKiB0aGUgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgc3RyZWFtLiBBbHRob3VnaCB0aGUgYnVmZmVycwotICAgKiBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUgdW5kZXJseWluZyBidWZmZXJzIGlzCi0gICAqIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlIHRoYXQgdGhleSByZW1haW4gdmFsaWQgdW50aWwKLSAgICogdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGVxdWl2YWxlbnQgZnVuY3Rpb24KLSAgICogc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0gICAqICk7IEBlbmRjb2RlCi0gICAqCi0gICAqIEBub3RlIFRoZSBhc3luY193cml0ZV9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHRyYW5zbWl0IGFsbCBvZiB0aGUgZGF0YSB0bwotICAgKiB0aGUgcGVlci4gQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgYXN5bmNfd3JpdGUgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8KLSAgICogZW5zdXJlIHRoYXQgYWxsIGRhdGEgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3dyaXRlX3NvbWUoY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIFdyaXRlSGFuZGxlci4KLSAgICBBU0lPX1dSSVRFX0hBTkRMRVJfQ0hFQ0soV3JpdGVIYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgYXNpbzo6ZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFdyaXRlSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLQotICAgIGRldGFpbDo6YXN5bmNfaW8obmV4dF9sYXllcl8sIGNvcmVfLAotICAgICAgICBkZXRhaWw6OndyaXRlX29wPENvbnN0QnVmZmVyU2VxdWVuY2U+KGJ1ZmZlcnMpLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLSAgLy8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHN0cmVhbS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FsbCB3aWxsCi0gICAqIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgaGFzIGJlZW4gcmVhZCBzdWNjZXNzZnVsbHksIG9yIHVudGlsCi0gICAqIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgVGhlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZWFkX3NvbWUgb3BlcmF0aW9uIG1heSBub3QgcmVhZCBhbGwgb2YgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YKLSAgICogYnl0ZXMuIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIHJlYWQgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICAqIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSBpcyByZWFkIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IG4gPSByZWFkX3NvbWUoYnVmZmVycywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWFkX3NvbWUiKTsKLSAgICByZXR1cm4gbjsKLSAgfQotCi0gIC8vLyBSZWFkIHNvbWUgZGF0YSBmcm9tIHRoZSBzdHJlYW0uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbS4gVGhlIGZ1bmN0aW9uIGNhbGwgd2lsbAotICAgKiBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiBkYXRhIGhhcyBiZWVuIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciB1bnRpbAotICAgKiBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIFRoZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZWFkX3NvbWUgb3BlcmF0aW9uIG1heSBub3QgcmVhZCBhbGwgb2YgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YKLSAgICogYnl0ZXMuIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIHJlYWQgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICAqIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSBpcyByZWFkIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBkZXRhaWw6OmlvKG5leHRfbGF5ZXJfLCBjb3JlXywKLSAgICAgICAgZGV0YWlsOjpyZWFkX29wPE11dGFibGVCdWZmZXJTZXF1ZW5jZT4oYnVmZmVycyksIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgcmVhZC4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSByZWFkIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgZnJvbQotICAgKiB0aGUgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgVGhlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuIEFsdGhvdWdoIHRoZQotICAgKiBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZSB1bmRlcmx5aW5nCi0gICAqIGJ1ZmZlcnMgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCB0aGV5IHJlbWFpbgotICAgKiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWFkIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uCi0gICAqIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyByZWFkLgotICAgKiApOyBAZW5kY29kZQotICAgKgotICAgKiBAbm90ZSBUaGUgYXN5bmNfcmVhZF9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQKLSAgICogbnVtYmVyIG9mIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiBhc3luY19yZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvCi0gICAqIGVuc3VyZSB0aGF0IHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGFzeW5jaHJvbm91cwotICAgKiBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgUmVhZEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFJlYWRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19yZWFkX3NvbWUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBSZWFkSGFuZGxlci4KLSAgICBBU0lPX1JFQURfSEFORExFUl9DSEVDSyhSZWFkSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIGFzaW86OmRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBSZWFkSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgZGV0YWlsOjphc3luY19pbyhuZXh0X2xheWVyXywgY29yZV8sCi0gICAgICAgIGRldGFpbDo6cmVhZF9vcDxNdXRhYmxlQnVmZmVyU2VxdWVuY2U+KGJ1ZmZlcnMpLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLXByaXZhdGU6Ci0gIFN0cmVhbSBuZXh0X2xheWVyXzsKLSAgZGV0YWlsOjpzdHJlYW1fY29yZSBjb3JlXzsKLSAgaW1wbF9zdHJ1Y3QgYmFja3dhcmRzX2NvbXBhdGlibGVfaW1wbF87Ci19OwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi19IC8vIG5hbWVzcGFjZSBzc2wKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1NMX1NUUkVBTV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvc3RyZWFtX2Jhc2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9zdHJlYW1fYmFzZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzQxMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC9zdHJlYW1fYmFzZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLwotLy8gc3NsL3N0cmVhbV9iYXNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9TVFJFQU1fQkFTRV9IUFAKLSNkZWZpbmUgQVNJT19TU0xfU1RSRUFNX0JBU0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2Ugc3NsIHsKLQotLy8vIFRoZSBzdHJlYW1fYmFzZSBjbGFzcyBpcyB1c2VkIGFzIGEgYmFzZSBmb3IgdGhlIGFzaW86OnNzbDo6c3RyZWFtCi0vLy8gY2xhc3MgdGVtcGxhdGUgc28gdGhhdCB3ZSBoYXZlIGEgY29tbW9uIHBsYWNlIHRvIGRlZmluZSB2YXJpb3VzIGVudW1zLgotY2xhc3Mgc3RyZWFtX2Jhc2UKLXsKLXB1YmxpYzoKLSAgLy8vIERpZmZlcmVudCBoYW5kc2hha2UgdHlwZXMuCi0gIGVudW0gaGFuZHNoYWtlX3R5cGUKLSAgewotICAgIC8vLyBQZXJmb3JtIGhhbmRzaGFraW5nIGFzIGEgY2xpZW50LgotICAgIGNsaWVudCwKLQotICAgIC8vLyBQZXJmb3JtIGhhbmRzaGFraW5nIGFzIGEgc2VydmVyLgotICAgIHNlcnZlcgotICB9OwotCi1wcm90ZWN0ZWQ6Ci0gIC8vLyBQcm90ZWN0ZWQgZGVzdHJ1Y3RvciB0byBwcmV2ZW50IGRlbGV0aW9uIHRocm91Z2ggdGhpcyB0eXBlLgotICB+c3RyZWFtX2Jhc2UoKQotICB7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHNzbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19TU0xfU1RSRUFNX0JBU0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL3N0cmVhbV9zZXJ2aWNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvc3RyZWFtX3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTlmZjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvc3RyZWFtX3NlcnZpY2UuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8KLS8vIHNzbC9zdHJlYW1fc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfU1RSRUFNX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fU1NMX1NUUkVBTV9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotIyBpbmNsdWRlICJhc2lvL3NzbC9vbGQvc3RyZWFtX3NlcnZpY2UuaHBwIgotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotCi0jaWYgZGVmaW5lZChBU0lPX0VOQUJMRV9PTERfU1NMKQotCi11c2luZyBhc2lvOjpzc2w6Om9sZDo6c3RyZWFtX3NlcnZpY2U7Ci0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fRU5BQkxFX09MRF9TU0wpCi0KLX0gLy8gbmFtZXNwYWNlIHNzbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19TU0xfU1RSRUFNX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3NsL3ZlcmlmeV9jb250ZXh0LmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvdmVyaWZ5X2NvbnRleHQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTI3YWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvdmVyaWZ5X2NvbnRleHQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8KLS8vIHNzbC92ZXJpZnlfY29udGV4dC5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TU0xfVkVSSUZZX0NPTlRFWFRfSFBQCi0jZGVmaW5lIEFTSU9fU1NMX1ZFUklGWV9DT05URVhUX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvbm9uY29weWFibGUuaHBwIgotIyBpbmNsdWRlICJhc2lvL3NzbC9kZXRhaWwvb3BlbnNzbF90eXBlcy5ocHAiCi0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSBzc2wgewotCi0jaWYgIWRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotLy8vIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBYNTA5X1NUT1JFX0NUWCB0eXBlLCB1c2VkIGR1cmluZyB2ZXJpZmljYXRpb24gb2YKLS8vLyBhIHBlZXIgY2VydGlmaWNhdGUuCi0vKioKLSAqIEBub3RlIFRoZSB2ZXJpZnlfY29udGV4dCBkb2VzIG5vdCBvd24gdGhlIHVuZGVybHlpbmcgWDUwOV9TVE9SRV9DVFggb2JqZWN0LgotICovCi1jbGFzcyB2ZXJpZnlfY29udGV4dAotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8vIFRoZSBuYXRpdmUgaGFuZGxlIHR5cGUgb2YgdGhlIHZlcmlmaWNhdGlvbiBjb250ZXh0LgotICB0eXBlZGVmIFg1MDlfU1RPUkVfQ1RYKiBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdG9yLgotICBleHBsaWNpdCB2ZXJpZnlfY29udGV4dChuYXRpdmVfaGFuZGxlX3R5cGUgaGFuZGxlKQotICAgIDogaGFuZGxlXyhoYW5kbGUpCi0gIHsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gaW4gdGhlIG5hdGl2ZSB0eXBlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gICAqIGNvbnRleHQuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWxsb3cgYWNjZXNzIHRvIGNvbnRleHQgZnVuY3Rpb25hbGl0eSB0aGF0IGlzCi0gICAqIG5vdCBvdGhlcndpc2UgcHJvdmlkZWQuCi0gICAqLwotICBuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZSgpCi0gIHsKLSAgICByZXR1cm4gaGFuZGxlXzsKLSAgfQotCi1wcml2YXRlOgotICAvLyBUaGUgdW5kZXJseWluZyBuYXRpdmUgaW1wbGVtZW50YXRpb24uCi0gIG5hdGl2ZV9oYW5kbGVfdHlwZSBoYW5kbGVfOwotfTsKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19FTkFCTEVfT0xEX1NTTCkKLQotfSAvLyBuYW1lc3BhY2Ugc3NsCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NTTF9WRVJJRllfQ09OVEVYVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zc2wvdmVyaWZ5X21vZGUuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC92ZXJpZnlfbW9kZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWEwZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3NzbC92ZXJpZnlfbW9kZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLwotLy8gc3NsL3ZlcmlmeV9tb2RlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NTTF9WRVJJRllfTU9ERV9IUFAKLSNkZWZpbmUgQVNJT19TU0xfVkVSSUZZX01PREVfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSAiYXNpby9zc2wvZGV0YWlsL29wZW5zc2xfdHlwZXMuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHNzbCB7Ci0KLS8vLyBCaXRtYXNrIHR5cGUgZm9yIHBlZXIgdmVyaWZpY2F0aW9uLgotLyoqCi0gKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgotICoKLSAqIEBsaSBAcmVmIHZlcmlmeV9ub25lCi0gKiBAbGkgQHJlZiB2ZXJpZnlfcGVlcgotICogQGxpIEByZWYgdmVyaWZ5X2ZhaWxfaWZfbm9fcGVlcl9jZXJ0Ci0gKiBAbGkgQHJlZiB2ZXJpZnlfY2xpZW50X29uY2UKLSAqLwotdHlwZWRlZiBpbnQgdmVyaWZ5X21vZGU7Ci0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLS8vLyBObyB2ZXJpZmljYXRpb24uCi1jb25zdCBpbnQgdmVyaWZ5X25vbmUgPSBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkOwotCi0vLy8gVmVyaWZ5IHRoZSBwZWVyLgotY29uc3QgaW50IHZlcmlmeV9wZWVyID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZDsKLQotLy8vIEZhaWwgdmVyaWZpY2F0aW9uIGlmIHRoZSBwZWVyIGhhcyBubyBjZXJ0aWZpY2F0ZS4gSWdub3JlZCB1bmxlc3MKLS8vLyBAcmVmIHZlcmlmeV9wZWVyIGlzIHNldC4KLWNvbnN0IGludCB2ZXJpZnlfZmFpbF9pZl9ub19wZWVyX2NlcnQgPSBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkOwotCi0vLy8gRG8gbm90IHJlcXVlc3QgY2xpZW50IGNlcnRpZmljYXRlIG9uIHJlbmVnb3RpYXRpb24uIElnbm9yZWQgdW5sZXNzCi0vLy8gQHJlZiB2ZXJpZnlfcGVlciBpcyBzZXQuCi1jb25zdCBpbnQgdmVyaWZ5X2NsaWVudF9vbmNlID0gaW1wbGVtZW50YXRpb25fZGVmaW5lZDsKLSNlbHNlCi1jb25zdCBpbnQgdmVyaWZ5X25vbmUgPSBTU0xfVkVSSUZZX05PTkU7Ci1jb25zdCBpbnQgdmVyaWZ5X3BlZXIgPSBTU0xfVkVSSUZZX1BFRVI7Ci1jb25zdCBpbnQgdmVyaWZ5X2ZhaWxfaWZfbm9fcGVlcl9jZXJ0ID0gU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVDsKLWNvbnN0IGludCB2ZXJpZnlfY2xpZW50X29uY2UgPSBTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOwotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIHNzbAotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19TU0xfVkVSSUZZX01PREVfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3RlYWR5X3RpbWVyLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zdGVhZHlfdGltZXIuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdjYTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zdGVhZHlfdGltZXIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8KLS8vIHN0ZWFkeV90aW1lci5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TVEVBRFlfVElNRVJfSFBQCi0jZGVmaW5lIEFTSU9fU1RFQURZX1RJTUVSX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TVERfQ0hST05PKSBcCi0gIHx8IGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ0hST05PKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19TVERfQ0hST05PKQotIyBpbmNsdWRlIDxjaHJvbm8+Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0NIUk9OTykKLSMgaW5jbHVkZSA8Ym9vc3QvY2hyb25vL3N5c3RlbV9jbG9ja3MuaHBwPgotI2VuZGlmCi0KLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3dhaXRhYmxlX3RpbWVyLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0vLy8gVHlwZWRlZiBmb3IgYSB0aW1lciBiYXNlZCBvbiB0aGUgc3RlYWR5IGNsb2NrLgotLyoqCi0gKiBUaGlzIHR5cGVkZWYgdXNlcyB0aGUgQysrMTEgQGMgJmx0O2Nocm9ubyZndDsgc3RhbmRhcmQgbGlicmFyeSBmYWNpbGl0eSwgaWYKLSAqIGF2YWlsYWJsZS4gT3RoZXJ3aXNlLCBpdCBtYXkgdXNlIHRoZSBCb29zdC5DaHJvbm8gbGlicmFyeS4gVG8gZXhwbGljaXRseQotICogdXRpbGlzZSBCb29zdC5DaHJvbm8sIHVzZSB0aGUgYmFzaWNfd2FpdGFibGVfdGltZXIgdGVtcGxhdGUgZGlyZWN0bHk6Ci0gKiBAY29kZQotICogdHlwZWRlZiBiYXNpY193YWl0YWJsZV90aW1lcjxib29zdDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s+IHRpbWVyOwotICogQGVuZGNvZGUKLSAqLwotdHlwZWRlZiBiYXNpY193YWl0YWJsZV90aW1lcjxjaHJvbm86OnN0ZWFkeV9jbG9jaz4gc3RlYWR5X3RpbWVyOwotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19TVERfQ0hST05PKQotIyBpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk9fTU9OT1RPTklDX0NMT0NLKQotdHlwZWRlZiBiYXNpY193YWl0YWJsZV90aW1lcjxzdGQ6OmNocm9ubzo6bW9ub3RvbmljX2Nsb2NrPiBzdGVhZHlfdGltZXI7Ci0jIGVsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfQ0hST05PX01PTk9UT05JQ19DTE9DSykKLXR5cGVkZWYgYmFzaWNfd2FpdGFibGVfdGltZXI8c3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jaz4gc3RlYWR5X3RpbWVyOwotIyBlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk9fTU9OT1RPTklDX0NMT0NLKQotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19CT09TVF9DSFJPTk8pCi10eXBlZGVmIGJhc2ljX3dhaXRhYmxlX3RpbWVyPGJvb3N0OjpjaHJvbm86OnN0ZWFkeV9jbG9jaz4gc3RlYWR5X3RpbWVyOwotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfU1REX0NIUk9OTykgCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKEFTSU9fSEFTX0JPT1NUX0NIUk9OTykKLSAgICAgICAvLyAgIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jZW5kaWYgLy8gQVNJT19TVEVBRFlfVElNRVJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3RyYW5kLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zdHJhbmQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOThjMzljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zdHJhbmQuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8vCi0vLyBzdHJhbmQuaHBwCi0vLyB+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1RSQU5EX0hQUAotI2RlZmluZSBBU0lPX1NUUkFORF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2FzeW5jX3Jlc3VsdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvc3RyYW5kX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3dyYXBwZWRfaGFuZGxlci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIFByb3ZpZGVzIHNlcmlhbGlzZWQgaGFuZGxlciBleGVjdXRpb24uCi0vKioKLSAqIFRoZSBpb19zZXJ2aWNlOjpzdHJhbmQgY2xhc3MgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gcG9zdCBhbmQgZGlzcGF0Y2gKLSAqIGhhbmRsZXJzIHdpdGggdGhlIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgdGhvc2UgaGFuZGxlcnMgd2lsbCBleGVjdXRlCi0gKiBjb25jdXJyZW50bHkuCi0gKgotICogQHBhciBPcmRlciBvZiBoYW5kbGVyIGludm9jYXRpb24KLSAqIEdpdmVuOgotICoKLSAqIEBsaSBhIHN0cmFuZCBvYmplY3QgQGMgcwotICoKLSAqIEBsaSBhbiBvYmplY3QgQGMgYSBtZWV0aW5nIGNvbXBsZXRpb24gaGFuZGxlciByZXF1aXJlbWVudHMKLSAqCi0gKiBAbGkgYW4gb2JqZWN0IEBjIGExIHdoaWNoIGlzIGFuIGFyYml0cmFyeSBjb3B5IG9mIEBjIGEgbWFkZSBieSB0aGUKLSAqIGltcGxlbWVudGF0aW9uCi0gKgotICogQGxpIGFuIG9iamVjdCBAYyBiIG1lZXRpbmcgY29tcGxldGlvbiBoYW5kbGVyIHJlcXVpcmVtZW50cwotICoKLSAqIEBsaSBhbiBvYmplY3QgQGMgYjEgd2hpY2ggaXMgYW4gYXJiaXRyYXJ5IGNvcHkgb2YgQGMgYiBtYWRlIGJ5IHRoZQotICogaW1wbGVtZW50YXRpb24KLSAqCi0gKiBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlOgotICoKLSAqIEBsaSBAYyBzLnBvc3QoYSkgaGFwcGVucy1iZWZvcmUgQGMgcy5wb3N0KGIpCi0gKiAKLSAqIEBsaSBAYyBzLnBvc3QoYSkgaGFwcGVucy1iZWZvcmUgQGMgcy5kaXNwYXRjaChiKSwgd2hlcmUgdGhlIGxhdHRlciBpcwotICogcGVyZm9ybWVkIG91dHNpZGUgdGhlIHN0cmFuZAotICogCi0gKiBAbGkgQGMgcy5kaXNwYXRjaChhKSBoYXBwZW5zLWJlZm9yZSBAYyBzLnBvc3QoYiksIHdoZXJlIHRoZSBmb3JtZXIgaXMKLSAqIHBlcmZvcm1lZCBvdXRzaWRlIHRoZSBzdHJhbmQKLSAqIAotICogQGxpIEBjIHMuZGlzcGF0Y2goYSkgaGFwcGVucy1iZWZvcmUgQGMgcy5kaXNwYXRjaChiKSwgd2hlcmUgYm90aCBhcmUKLSAqIHBlcmZvcm1lZCBvdXRzaWRlIHRoZSBzdHJhbmQKLSAqICAgCi0gKiB0aGVuIEBjIGFzaW9faGFuZGxlcl9pbnZva2UoYTEsICZhMSkgaGFwcGVucy1iZWZvcmUKLSAqIEBjIGFzaW9faGFuZGxlcl9pbnZva2UoYjEsICZiMSkuCi0gKiAKLSAqIE5vdGUgdGhhdCBpbiB0aGUgZm9sbG93aW5nIGNhc2U6Ci0gKiBAY29kZSBhc3luY19vcF8xKC4uLiwgcy53cmFwKGEpKTsKLSAqIGFzeW5jX29wXzIoLi4uLCBzLndyYXAoYikpOyBAZW5kY29kZQotICogdGhlIGNvbXBsZXRpb24gb2YgdGhlIGZpcnN0IGFzeW5jIG9wZXJhdGlvbiB3aWxsIHBlcmZvcm0gQGMgcy5kaXNwYXRjaChhKSwKLSAqIGFuZCB0aGUgc2Vjb25kIHdpbGwgcGVyZm9ybSBAYyBzLmRpc3BhdGNoKGIpLCBidXQgdGhlIG9yZGVyIGluIHdoaWNoIHRob3NlCi0gKiBhcmUgcGVyZm9ybWVkIGlzIHVuc3BlY2lmaWVkLiBUaGF0IGlzLCB5b3UgY2Fubm90IHN0YXRlIHdoZXRoZXIgb25lCi0gKiBoYXBwZW5zLWJlZm9yZSB0aGUgb3RoZXIuIFRoZXJlZm9yZSBub25lIG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBtZXQgYW5kCi0gKiBubyBvcmRlcmluZyBndWFyYW50ZWUgaXMgbWFkZS4KLSAqCi0gKiBAbm90ZSBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgbm8gZ3VhcmFudGVlIHRoYXQgaGFuZGxlcnMgcG9zdGVkIG9yCi0gKiBkaXNwYXRjaGVkIHRocm91Z2ggZGlmZmVyZW50IEBjIHN0cmFuZCBvYmplY3RzIHdpbGwgYmUgaW52b2tlZCBjb25jdXJyZW50bHkuCi0gKgotICogQHBhciBUaHJlYWQgU2FmZXR5Ci0gKiBAZSBEaXN0aW5jdCBAZSBvYmplY3RzOiBTYWZlLkBuCi0gKiBAZSBTaGFyZWQgQGUgb2JqZWN0czogU2FmZS4KLSAqCi0gKiBAcGFyIENvbmNlcHRzOgotICogRGlzcGF0Y2hlci4KLSAqLwotY2xhc3MgaW9fc2VydmljZTo6c3RyYW5kCi17Ci1wdWJsaWM6Ci0gIC8vLyBDb25zdHJ1Y3Rvci4KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgdGhlIHN0cmFuZC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHN0cmFuZCB3aWxsIHVzZSB0bwotICAgKiBkaXNwYXRjaCBoYW5kbGVycyB0aGF0IGFyZSByZWFkeSB0byBiZSBydW4uCi0gICAqLwotICBleHBsaWNpdCBzdHJhbmQoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IHNlcnZpY2VfKGFzaW86OnVzZV9zZXJ2aWNlPAotICAgICAgICBhc2lvOjpkZXRhaWw6OnN0cmFuZF9zZXJ2aWNlPihpb19zZXJ2aWNlKSkKLSAgewotICAgIHNlcnZpY2VfLmNvbnN0cnVjdChpbXBsXyk7Ci0gIH0KLQotICAvLy8gRGVzdHJ1Y3Rvci4KLSAgLyoqCi0gICAqIERlc3Ryb3lzIGEgc3RyYW5kLgotICAgKgotICAgKiBIYW5kbGVycyBwb3N0ZWQgdGhyb3VnaCB0aGUgc3RyYW5kIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gaW52b2tlZCB3aWxsCi0gICAqIHN0aWxsIGJlIGRpc3BhdGNoZWQgaW4gYSB3YXkgdGhhdCBtZWV0cyB0aGUgZ3VhcmFudGVlIG9mIG5vbi1jb25jdXJyZW5jeS4KLSAgICovCi0gIH5zdHJhbmQoKQotICB7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBpb19zZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyYW5kLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHN0cmFuZAotICAgKiB1c2VzIHRvIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KLSAgICoKLSAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgc3RyYW5kIHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzLiBPd25lcnNoaXAgaXMgbm90IHRyYW5zZmVycmVkIHRvIHRoZSBjYWxsZXIuCi0gICAqLwotICBhc2lvOjppb19zZXJ2aWNlJiBnZXRfaW9fc2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV8uZ2V0X2lvX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vLyBSZXF1ZXN0IHRoZSBzdHJhbmQgdG8gaW52b2tlIHRoZSBnaXZlbiBoYW5kbGVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzayB0aGUgc3RyYW5kIHRvIGV4ZWN1dGUgdGhlIGdpdmVuIGhhbmRsZXIuCi0gICAqCi0gICAqIFRoZSBzdHJhbmQgb2JqZWN0IGd1YXJhbnRlZXMgdGhhdCBoYW5kbGVycyBwb3N0ZWQgb3IgZGlzcGF0Y2hlZCB0aHJvdWdoCi0gICAqIHRoZSBzdHJhbmQgd2lsbCBub3QgYmUgZXhlY3V0ZWQgY29uY3VycmVudGx5LiBUaGUgaGFuZGxlciBtYXkgYmUgZXhlY3V0ZWQKLSAgICogaW5zaWRlIHRoaXMgZnVuY3Rpb24gaWYgdGhlIGd1YXJhbnRlZSBjYW4gYmUgbWV0LiBJZiB0aGlzIGZ1bmN0aW9uIGlzCi0gICAqIGNhbGxlZCBmcm9tIHdpdGhpbiBhIGhhbmRsZXIgdGhhdCB3YXMgcG9zdGVkIG9yIGRpc3BhdGNoZWQgdGhyb3VnaCB0aGUgc2FtZQotICAgKiBzdHJhbmQsIHRoZW4gdGhlIG5ldyBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIFRoZSBzdHJhbmQncyBndWFyYW50ZWUgaXMgaW4gYWRkaXRpb24gdG8gdGhlIGd1YXJhbnRlZSBwcm92aWRlZCBieSB0aGUKLSAgICogdW5kZXJseWluZyBpb19zZXJ2aWNlLiBUaGUgaW9fc2VydmljZSBndWFyYW50ZWVzIHRoYXQgdGhlIGhhbmRsZXIgd2lsbCBvbmx5Ci0gICAqIGJlIGNhbGxlZCBpbiBhIHRocmVhZCBpbiB3aGljaCB0aGUgaW9fc2VydmljZSdzIHJ1biBtZW1iZXIgZnVuY3Rpb24gaXMKLSAgICogY3VycmVudGx5IGJlaW5nIGludm9rZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZC4gVGhlIHN0cmFuZCB3aWxsIG1ha2UgYSBjb3B5IG9mIHRoZQotICAgKiBoYW5kbGVyIG9iamVjdCBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoKTsgQGVuZGNvZGUKLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb21wbGV0aW9uSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoQ29tcGxldGlvbkhhbmRsZXIsIHZvaWQgKCkpCi0gIGRpc3BhdGNoKEFTSU9fTU9WRV9BUkcoQ29tcGxldGlvbkhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgQ29tcGxldGlvbkhhbmRsZXIuCi0gICAgQVNJT19DT01QTEVUSU9OX0hBTkRMRVJfQ0hFQ0soQ29tcGxldGlvbkhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgICAgQ29tcGxldGlvbkhhbmRsZXIsIHZvaWQgKCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKENvbXBsZXRpb25IYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlXy5kaXNwYXRjaChpbXBsXywgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBSZXF1ZXN0IHRoZSBzdHJhbmQgdG8gaW52b2tlIHRoZSBnaXZlbiBoYW5kbGVyIGFuZCByZXR1cm4KLSAgLy8vIGltbWVkaWF0ZWx5LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzayB0aGUgc3RyYW5kIHRvIGV4ZWN1dGUgdGhlIGdpdmVuIGhhbmRsZXIsIGJ1dAotICAgKiB3aXRob3V0IGFsbG93aW5nIHRoZSBzdHJhbmQgdG8gY2FsbCB0aGUgaGFuZGxlciBmcm9tIGluc2lkZSB0aGlzIGZ1bmN0aW9uLgotICAgKgotICAgKiBUaGUgc3RyYW5kIG9iamVjdCBndWFyYW50ZWVzIHRoYXQgaGFuZGxlcnMgcG9zdGVkIG9yIGRpc3BhdGNoZWQgdGhyb3VnaAotICAgKiB0aGUgc3RyYW5kIHdpbGwgbm90IGJlIGV4ZWN1dGVkIGNvbmN1cnJlbnRseS4gVGhlIHN0cmFuZCdzIGd1YXJhbnRlZSBpcyBpbgotICAgKiBhZGRpdGlvbiB0byB0aGUgZ3VhcmFudGVlIHByb3ZpZGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGlvX3NlcnZpY2UuIFRoZQotICAgKiBpb19zZXJ2aWNlIGd1YXJhbnRlZXMgdGhhdCB0aGUgaGFuZGxlciB3aWxsIG9ubHkgYmUgY2FsbGVkIGluIGEgdGhyZWFkIGluCi0gICAqIHdoaWNoIHRoZSBpb19zZXJ2aWNlJ3MgcnVuIG1lbWJlciBmdW5jdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgaW52b2tlZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkLiBUaGUgc3RyYW5kIHdpbGwgbWFrZSBhIGNvcHkgb2YgdGhlCi0gICAqIGhhbmRsZXIgb2JqZWN0IGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigpOyBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbXBsZXRpb25IYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShDb21wbGV0aW9uSGFuZGxlciwgdm9pZCAoKSkKLSAgcG9zdChBU0lPX01PVkVfQVJHKENvbXBsZXRpb25IYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgLy8gSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXQgbWVhbnMgdGhhdCB5b3VyIGhhbmRsZXIgZG9lcwotICAgIC8vIG5vdCBtZWV0IHRoZSBkb2N1bWVudGVkIHR5cGUgcmVxdWlyZW1lbnRzIGZvciBhIENvbXBsZXRpb25IYW5kbGVyLgotICAgIEFTSU9fQ09NUExFVElPTl9IQU5ETEVSX0NIRUNLKENvbXBsZXRpb25IYW5kbGVyLCBoYW5kbGVyKSB0eXBlX2NoZWNrOwotCi0gICAgZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIENvbXBsZXRpb25IYW5kbGVyLCB2b2lkICgpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChDb21wbGV0aW9uSGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV8ucG9zdChpbXBsXywgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBDcmVhdGUgYSBuZXcgaGFuZGxlciB0aGF0IGF1dG9tYXRpY2FsbHkgZGlzcGF0Y2hlcyB0aGUgd3JhcHBlZCBoYW5kbGVyCi0gIC8vLyBvbiB0aGUgc3RyYW5kLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBoYW5kbGVyIGZ1bmN0aW9uIG9iamVjdCB0aGF0LCB3aGVuCi0gICAqIGludm9rZWQsIHdpbGwgYXV0b21hdGljYWxseSBwYXNzIHRoZSB3cmFwcGVkIGhhbmRsZXIgdG8gdGhlIHN0cmFuZCdzCi0gICAqIGRpc3BhdGNoIGZ1bmN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSB3cmFwcGVkLiBUaGUgc3RyYW5kIHdpbGwgbWFrZSBhIGNvcHkgb2YKLSAgICogdGhlIGhhbmRsZXIgb2JqZWN0IGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBoYW5kbGVyIG11c3QKLSAgICogYmU6IEBjb2RlIHZvaWQgaGFuZGxlcihBMSBhMSwgLi4uIEFuIGFuKTsgQGVuZGNvZGUKLSAgICoKLSAgICogQHJldHVybiBBIGZ1bmN0aW9uIG9iamVjdCB0aGF0LCB3aGVuIGludm9rZWQsIHBhc3NlcyB0aGUgd3JhcHBlZCBoYW5kbGVyIHRvCi0gICAqIHRoZSBzdHJhbmQncyBkaXNwYXRjaCBmdW5jdGlvbi4gR2l2ZW4gYSBmdW5jdGlvbiBvYmplY3Qgd2l0aCB0aGUgc2lnbmF0dXJlOgotICAgKiBAY29kZSBSIGYoQTEgYTEsIC4uLiBBbiBhbik7IEBlbmRjb2RlCi0gICAqIElmIHRoaXMgZnVuY3Rpb24gb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUgd3JhcCBmdW5jdGlvbiBsaWtlIHNvOgotICAgKiBAY29kZSBzdHJhbmQud3JhcChmKTsgQGVuZGNvZGUKLSAgICogdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgZnVuY3Rpb24gb2JqZWN0IHdpdGggdGhlIHNpZ25hdHVyZQotICAgKiBAY29kZSB2b2lkIGcoQTEgYTEsIC4uLiBBbiBhbik7IEBlbmRjb2RlCi0gICAqIHRoYXQsIHdoZW4gaW52b2tlZCwgZXhlY3V0ZXMgY29kZSBlcXVpdmFsZW50IHRvOgotICAgKiBAY29kZSBzdHJhbmQuZGlzcGF0Y2goYm9vc3Q6OmJpbmQoZiwgYTEsIC4uLiBhbikpOyBAZW5kY29kZQotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHVuc3BlY2lmaWVkCi0jZWxzZQotICBkZXRhaWw6OndyYXBwZWRfaGFuZGxlcjxzdHJhbmQsIEhhbmRsZXIsIGRldGFpbDo6aXNfY29udGludWF0aW9uX2lmX3J1bm5pbmc+Ci0jZW5kaWYKLSAgd3JhcChIYW5kbGVyIGhhbmRsZXIpCi0gIHsKLSAgICByZXR1cm4gZGV0YWlsOjp3cmFwcGVkX2hhbmRsZXI8aW9fc2VydmljZTo6c3RyYW5kLCBIYW5kbGVyLAotICAgICAgICBkZXRhaWw6OmlzX2NvbnRpbnVhdGlvbl9pZl9ydW5uaW5nPigqdGhpcywgaGFuZGxlcik7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0cmFuZCBpcyBydW5uaW5nIGluIHRoZSBjdXJyZW50IHRocmVhZC4KLSAgLyoqCi0gICAqIEByZXR1cm4gQGMgdHJ1ZSBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgZXhlY3V0aW5nIGEgaGFuZGxlciB0aGF0IHdhcwotICAgKiBzdWJtaXR0ZWQgdG8gdGhlIHN0cmFuZCB1c2luZyBwb3N0KCksIGRpc3BhdGNoKCkgb3Igd3JhcCgpLiBPdGhlcndpc2UKLSAgICogcmV0dXJucyBAYyBmYWxzZS4KLSAgICovCi0gIGJvb2wgcnVubmluZ19pbl90aGlzX3RocmVhZCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV8ucnVubmluZ19pbl90aGlzX3RocmVhZChpbXBsXyk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgYXNpbzo6ZGV0YWlsOjpzdHJhbmRfc2VydmljZSYgc2VydmljZV87Ci0gIGFzaW86OmRldGFpbDo6c3RyYW5kX3NlcnZpY2U6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbF87Ci19OwotCi0vLy8gKERlcHJlY2F0ZWQ6IFVzZSBhc2lvOjppb19zZXJ2aWNlOjpzdHJhbmQuKSBUeXBlZGVmIGZvciBiYWNrd2FyZHMKLS8vLyBjb21wYXRpYmlsaXR5LgotdHlwZWRlZiBhc2lvOjppb19zZXJ2aWNlOjpzdHJhbmQgc3RyYW5kOwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NUUkFORF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zdHJlYW1fc29ja2V0X3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3N0cmVhbV9zb2NrZXRfc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YTAzMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3N0cmVhbV9zb2NrZXRfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLy8KLS8vIHN0cmVhbV9zb2NrZXRfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19TVFJFQU1fU09DS0VUX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fU1RSRUFNX1NPQ0tFVF9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3R5cGVfdHJhaXRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX1dJTkRPV1NfUlVOVElNRSkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvd2lucnRfc3NvY2tldF9zZXJ2aWNlLmhwcCIKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfSU9DUCkKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX2lvY3Bfc29ja2V0X3NlcnZpY2UuaHBwIgotI2Vsc2UKLSMgaW5jbHVkZSAiYXNpby9kZXRhaWwvcmVhY3RpdmVfc29ja2V0X3NlcnZpY2UuaHBwIgotI2VuZGlmCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBEZWZhdWx0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gZm9yIGEgc3RyZWFtIHNvY2tldC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm90b2NvbD4KLWNsYXNzIHN0cmVhbV9zb2NrZXRfc2VydmljZQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICA6IHB1YmxpYyBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlCi0jZWxzZQotICA6IHB1YmxpYyBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxzdHJlYW1fc29ja2V0X3NlcnZpY2U8UHJvdG9jb2w+ID4KLSNlbmRpZgotewotcHVibGljOgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gVGhlIHVuaXF1ZSBzZXJ2aWNlIGlkZW50aWZpZXIuCi0gIHN0YXRpYyBhc2lvOjppb19zZXJ2aWNlOjppZCBpZDsKLSNlbmRpZgotCi0gIC8vLyBUaGUgcHJvdG9jb2wgdHlwZS4KLSAgdHlwZWRlZiBQcm90b2NvbCBwcm90b2NvbF90eXBlOwotCi0gIC8vLyBUaGUgZW5kcG9pbnQgdHlwZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBQcm90b2NvbDo6ZW5kcG9pbnQgZW5kcG9pbnRfdHlwZTsKLQotcHJpdmF0ZToKLSAgLy8gVGhlIHR5cGUgb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotI2lmIGRlZmluZWQoQVNJT19XSU5ET1dTX1JVTlRJTUUpCi0gIHR5cGVkZWYgZGV0YWlsOjp3aW5ydF9zc29ja2V0X3NlcnZpY2U8UHJvdG9jb2w+IHNlcnZpY2VfaW1wbF90eXBlOwotI2VsaWYgZGVmaW5lZChBU0lPX0hBU19JT0NQKQotICB0eXBlZGVmIGRldGFpbDo6d2luX2lvY3Bfc29ja2V0X3NlcnZpY2U8UHJvdG9jb2w+IHNlcnZpY2VfaW1wbF90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBkZXRhaWw6OnJlYWN0aXZlX3NvY2tldF9zZXJ2aWNlPFByb3RvY29sPiBzZXJ2aWNlX2ltcGxfdHlwZTsKLSNlbmRpZgotCi1wdWJsaWM6Ci0gIC8vLyBUaGUgdHlwZSBvZiBhIHN0cmVhbSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBpbXBsZW1lbnRhdGlvbl90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiB0eXBlbmFtZSBzZXJ2aWNlX2ltcGxfdHlwZTo6aW1wbGVtZW50YXRpb25fdHlwZSBpbXBsZW1lbnRhdGlvbl90eXBlOwotI2VuZGlmCi0KLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZV90eXBlLikgVGhlIG5hdGl2ZSBzb2NrZXQgdHlwZS4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIG5hdGl2ZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiB0eXBlbmFtZSBzZXJ2aWNlX2ltcGxfdHlwZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV90eXBlOwotI2VuZGlmCi0KLSAgLy8vIFRoZSBuYXRpdmUgc29ja2V0IHR5cGUuCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIHR5cGVkZWYgaW1wbGVtZW50YXRpb25fZGVmaW5lZCBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHR5cGVuYW1lIHNlcnZpY2VfaW1wbF90eXBlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZV90eXBlOwotI2VuZGlmCi0KLSAgLy8vIENvbnN0cnVjdCBhIG5ldyBzdHJlYW0gc29ja2V0IHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgaW9fc2VydmljZS4KLSAgZXhwbGljaXQgc3RyZWFtX3NvY2tldF9zZXJ2aWNlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTwKLSAgICAgICAgc3RyZWFtX3NvY2tldF9zZXJ2aWNlPFByb3RvY29sPiA+KGlvX3NlcnZpY2UpLAotICAgICAgc2VydmljZV9pbXBsXyhpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgbmV3IHN0cmVhbSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmNvbnN0cnVjdChpbXBsKTsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKSB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIE1vdmUtY29uc3RydWN0IGEgbmV3IHN0cmVhbSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLm1vdmVfY29uc3RydWN0KGltcGwsIG90aGVyX2ltcGwpOwotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGZyb20gYW5vdGhlciBzdHJlYW0gc29ja2V0IGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBzdHJlYW1fc29ja2V0X3NlcnZpY2UmIG90aGVyX3NlcnZpY2UsCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5tb3ZlX2Fzc2lnbihpbXBsLCBvdGhlcl9zZXJ2aWNlLnNlcnZpY2VfaW1wbF8sIG90aGVyX2ltcGwpOwotICB9Ci0KLSAgLy8vIE1vdmUtY29uc3RydWN0IGEgbmV3IHN0cmVhbSBzb2NrZXQgaW1wbGVtZW50YXRpb24gZnJvbSBhbm90aGVyIHByb3RvY29sCi0gIC8vLyB0eXBlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvdG9jb2wxPgotICB2b2lkIGNvbnZlcnRpbmdfbW92ZV9jb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHR5cGVuYW1lIHN0cmVhbV9zb2NrZXRfc2VydmljZTwKLSAgICAgICAgUHJvdG9jb2wxPjo6aW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCwKLSAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19jb252ZXJ0aWJsZTwKLSAgICAgICAgUHJvdG9jb2wxLCBQcm90b2NvbD46OnZhbHVlPjo6dHlwZSogPSAwKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy50ZW1wbGF0ZSBjb252ZXJ0aW5nX21vdmVfY29uc3RydWN0PFByb3RvY29sMT4oCi0gICAgICAgIGltcGwsIG90aGVyX2ltcGwpOwotICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKSB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotICAvLy8gRGVzdHJveSBhIHN0cmVhbSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgZGVzdHJveShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5kZXN0cm95KGltcGwpOwotICB9Ci0KLSAgLy8vIE9wZW4gYSBzdHJlYW0gc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIG9wZW4oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHByb3RvY29sX3R5cGUmIHByb3RvY29sLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIGlmIChwcm90b2NvbC50eXBlKCkgPT0gQVNJT19PU19ERUYoU09DS19TVFJFQU0pKQotICAgICAgc2VydmljZV9pbXBsXy5vcGVuKGltcGwsIHByb3RvY29sLCBlYyk7Ci0gICAgZWxzZQotICAgICAgZWMgPSBhc2lvOjplcnJvcjo6aW52YWxpZF9hcmd1bWVudDsKLSAgICByZXR1cm4gZWM7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBzb2NrZXQgdG8gYSBzdHJlYW0gc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgcHJvdG9jb2xfdHlwZSYgcHJvdG9jb2wsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgbmF0aXZlX3NvY2tldCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uYXNzaWduKGltcGwsIHByb3RvY29sLCBuYXRpdmVfc29ja2V0LCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBvcGVuLgotICBib29sIGlzX29wZW4oY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmlzX29wZW4oaW1wbCk7Ci0gIH0KLQotICAvLy8gQ2xvc2UgYSBzdHJlYW0gc29ja2V0IGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIGNsb3NlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNsb3NlKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGUoKS4pIEdldCB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgbmF0aXZlX3R5cGUgbmF0aXZlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfaGFuZGxlKGltcGwpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5hdGl2ZV9oYW5kbGUoaW1wbCk7Ci0gIH0KLQotICAvLy8gQ2FuY2VsIGFsbCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHNvY2tldC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uY2FuY2VsKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgc29ja2V0IGlzIGF0IHRoZSBvdXQtb2YtYmFuZCBkYXRhIG1hcmsuCi0gIGJvb2wgYXRfbWFyayhjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5hdF9tYXJrKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcuCi0gIHN0ZDo6c2l6ZV90IGF2YWlsYWJsZShjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5hdmFpbGFibGUoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIEJpbmQgdGhlIHN0cmVhbSBzb2NrZXQgdG8gdGhlIHNwZWNpZmllZCBsb2NhbCBlbmRwb2ludC4KLSAgYXNpbzo6ZXJyb3JfY29kZSBiaW5kKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBlbmRwb2ludF90eXBlJiBlbmRwb2ludCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5iaW5kKGltcGwsIGVuZHBvaW50LCBlYyk7Ci0gIH0KLQotICAvLy8gQ29ubmVjdCB0aGUgc3RyZWFtIHNvY2tldCB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LgotICBhc2lvOjplcnJvcl9jb2RlIGNvbm5lY3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IGVuZHBvaW50X3R5cGUmIHBlZXJfZW5kcG9pbnQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uY29ubmVjdChpbXBsLCBwZWVyX2VuZHBvaW50LCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIGNvbm5lY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25uZWN0SGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoQ29ubmVjdEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlKSkKLSAgYXN5bmNfY29ubmVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgZW5kcG9pbnRfdHlwZSYgcGVlcl9lbmRwb2ludCwKLSAgICAgIEFTSU9fTU9WRV9BUkcoQ29ubmVjdEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICBkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgICAgQ29ubmVjdEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChDb25uZWN0SGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV9pbXBsXy5hc3luY19jb25uZWN0KGltcGwsIHBlZXJfZW5kcG9pbnQsIGluaXQuaGFuZGxlcik7Ci0KLSAgICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci0gIH0KLQotICAvLy8gU2V0IGEgc29ja2V0IG9wdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFNldHRhYmxlU29ja2V0T3B0aW9uPgotICBhc2lvOjplcnJvcl9jb2RlIHNldF9vcHRpb24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IFNldHRhYmxlU29ja2V0T3B0aW9uJiBvcHRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uc2V0X29wdGlvbihpbXBsLCBvcHRpb24sIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgYSBzb2NrZXQgb3B0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgR2V0dGFibGVTb2NrZXRPcHRpb24+Ci0gIGFzaW86OmVycm9yX2NvZGUgZ2V0X29wdGlvbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgR2V0dGFibGVTb2NrZXRPcHRpb24mIG9wdGlvbiwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5nZXRfb3B0aW9uKGltcGwsIG9wdGlvbiwgZWMpOwotICB9Ci0KLSAgLy8vIFBlcmZvcm0gYW4gSU8gY29udHJvbCBjb21tYW5kIG9uIHRoZSBzb2NrZXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJb0NvbnRyb2xDb21tYW5kPgotICBhc2lvOjplcnJvcl9jb2RlIGlvX2NvbnRyb2woaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIElvQ29udHJvbENvbW1hbmQmIGNvbW1hbmQsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uaW9fY29udHJvbChpbXBsLCBjb21tYW5kLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIHNvY2tldC4KLSAgYm9vbCBub25fYmxvY2tpbmcoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5vbl9ibG9ja2luZyhpbXBsKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIG5vbl9ibG9ja2luZyhpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYm9vbCBtb2RlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5vbl9ibG9ja2luZyhpbXBsLCBtb2RlLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0cyB0aGUgbm9uLWJsb2NraW5nIG1vZGUgb2YgdGhlIG5hdGl2ZSBzb2NrZXQgaW1wbGVtZW50YXRpb24uCi0gIGJvb2wgbmF0aXZlX25vbl9ibG9ja2luZyhjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX25vbl9ibG9ja2luZyhpbXBsKTsKLSAgfQotCi0gIC8vLyBTZXRzIHRoZSBub24tYmxvY2tpbmcgbW9kZSBvZiB0aGUgbmF0aXZlIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBuYXRpdmVfbm9uX2Jsb2NraW5nKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBib29sIG1vZGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX25vbl9ibG9ja2luZyhpbXBsLCBtb2RlLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBsb2NhbCBlbmRwb2ludC4KLSAgZW5kcG9pbnRfdHlwZSBsb2NhbF9lbmRwb2ludChjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5sb2NhbF9lbmRwb2ludChpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSByZW1vdGUgZW5kcG9pbnQuCi0gIGVuZHBvaW50X3R5cGUgcmVtb3RlX2VuZHBvaW50KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnJlbW90ZV9lbmRwb2ludChpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gRGlzYWJsZSBzZW5kcyBvciByZWNlaXZlcyBvbiB0aGUgc29ja2V0LgotICBhc2lvOjplcnJvcl9jb2RlIHNodXRkb3duKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBzb2NrZXRfYmFzZTo6c2h1dGRvd25fdHlwZSB3aGF0LCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnNodXRkb3duKGltcGwsIHdoYXQsIGVjKTsKLSAgfQotCi0gIC8vLyBTZW5kIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBwZWVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3Qgc2VuZChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnNlbmQoaW1wbCwgYnVmZmVycywgZmxhZ3MsIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgc2VuZC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY19zZW5kKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3NlbmQoaW1wbCwgYnVmZmVycywgZmxhZ3MsIGluaXQuaGFuZGxlcik7Ci0KLSAgICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci0gIH0KLQotICAvLy8gUmVjZWl2ZSBzb21lIGRhdGEgZnJvbSB0aGUgcGVlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE11dGFibGVCdWZmZXJTZXF1ZW5jZT4KLSAgc3RkOjpzaXplX3QgcmVjZWl2ZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgc29ja2V0X2Jhc2U6Om1lc3NhZ2VfZmxhZ3MgZmxhZ3MsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ucmVjZWl2ZShpbXBsLCBidWZmZXJzLCBmbGFncywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWNlaXZlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlY2VpdmUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIHNvY2tldF9iYXNlOjptZXNzYWdlX2ZsYWdzIGZsYWdzLAotICAgICAgQVNJT19NT1ZFX0FSRyhSZWFkSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBSZWFkSGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChSZWFkSGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV9pbXBsXy5hc3luY19yZWNlaXZlKGltcGwsIGJ1ZmZlcnMsIGZsYWdzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIHZvaWQgc2h1dGRvd25fc2VydmljZSgpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLnNodXRkb3duX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSAgc2VydmljZV9pbXBsX3R5cGUgc2VydmljZV9pbXBsXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fU1RSRUFNX1NPQ0tFVF9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3N0cmVhbWJ1Zi5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3RyZWFtYnVmLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjZWUxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3RyZWFtYnVmLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vCi0vLyBzdHJlYW1idWYuaHBwCi0vLyB+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1RSRUFNQlVGX0hQUAotI2RlZmluZSBBU0lPX1NUUkVBTUJVRl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3N0cmVhbWJ1Zi5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIFR5cGVkZWYgZm9yIHRoZSB0eXBpY2FsIHVzYWdlIG9mIGJhc2ljX3N0cmVhbWJ1Zi4KLXR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPD4gc3RyZWFtYnVmOwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0jZW5kaWYgLy8gQVNJT19TVFJFQU1CVUZfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vc3lzdGVtX2Vycm9yLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zeXN0ZW1fZXJyb3IuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWMxMjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zeXN0ZW1fZXJyb3IuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vCi0vLyBzeXN0ZW1fZXJyb3IuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fU1lTVEVNX0VSUk9SX0hQUAotI2RlZmluZSBBU0lPX1NZU1RFTV9FUlJPUl9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfU1REX1NZU1RFTV9FUlJPUikKLSMgaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgotI2Vsc2UgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfU1lTVEVNX0VSUk9SKQotIyBpbmNsdWRlIDxjZXJybm8+Ci0jIGluY2x1ZGUgPGV4Y2VwdGlvbj4KLSMgaW5jbHVkZSA8c3RyaW5nPgotIyBpbmNsdWRlICJhc2lvL2Vycm9yX2NvZGUuaHBwIgotIyBpbmNsdWRlICJhc2lvL2RldGFpbC9zY29wZWRfcHRyLmhwcCIKLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0KLXR5cGVkZWYgc3RkOjpzeXN0ZW1fZXJyb3Igc3lzdGVtX2Vycm9yOwotCi0jZWxzZSAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9TWVNURU1fRVJST1IpCi0KLS8vLyBUaGUgc3lzdGVtX2Vycm9yIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IHN5c3RlbSBjb25kaXRpb25zIHRoYXQKLS8vLyBwcmV2ZW50IHRoZSBsaWJyYXJ5IGZyb20gb3BlcmF0aW5nIGNvcnJlY3RseS4KLWNsYXNzIHN5c3RlbV9lcnJvcgotICA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgotewotcHVibGljOgotICAvLy8gQ29uc3RydWN0IHdpdGggYW4gZXJyb3IgY29kZS4KLSAgc3lzdGVtX2Vycm9yKGNvbnN0IGVycm9yX2NvZGUmIGVjKQotICAgIDogY29kZV8oZWMpLAotICAgICAgY29udGV4dF8oKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IHdpdGggYW4gZXJyb3IgY29kZSBhbmQgY29udGV4dC4KLSAgc3lzdGVtX2Vycm9yKGNvbnN0IGVycm9yX2NvZGUmIGVjLCBjb25zdCBzdGQ6OnN0cmluZyYgY29udGV4dCkKLSAgICA6IGNvZGVfKGVjKSwKLSAgICAgIGNvbnRleHRfKGNvbnRleHQpCi0gIHsKLSAgfQotCi0gIC8vLyBDb3B5IGNvbnN0cnVjdG9yLgotICBzeXN0ZW1fZXJyb3IoY29uc3Qgc3lzdGVtX2Vycm9yJiBvdGhlcikKLSAgICA6IHN0ZDo6ZXhjZXB0aW9uKG90aGVyKSwKLSAgICAgIGNvZGVfKG90aGVyLmNvZGVfKSwKLSAgICAgIGNvbnRleHRfKG90aGVyLmNvbnRleHRfKSwKLSAgICAgIHdoYXRfKCkKLSAgewotICB9Ci0KLSAgLy8vIERlc3RydWN0b3IuCi0gIHZpcnR1YWwgfnN5c3RlbV9lcnJvcigpIHRocm93ICgpCi0gIHsKLSAgfQotCi0gIC8vLyBBc3NpZ25tZW50IG9wZXJhdG9yLgotICBzeXN0ZW1fZXJyb3ImIG9wZXJhdG9yPShjb25zdCBzeXN0ZW1fZXJyb3ImIGUpCi0gIHsKLSAgICBjb250ZXh0XyA9IGUuY29udGV4dF87Ci0gICAgY29kZV8gPSBlLmNvZGVfOwotICAgIHdoYXRfLnJlc2V0KCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8vIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhjZXB0aW9uLgotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdyAoKQotICB7Ci0jaWYgIWRlZmluZWQoQVNJT19OT19FWENFUFRJT05TKQotICAgIHRyeQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fRVhDRVBUSU9OUykKLSAgICB7Ci0gICAgICBpZiAoIXdoYXRfLmdldCgpKQotICAgICAgewotICAgICAgICBzdGQ6OnN0cmluZyB0bXAoY29udGV4dF8pOwotICAgICAgICBpZiAodG1wLmxlbmd0aCgpKQotICAgICAgICAgIHRtcCArPSAiOiAiOwotICAgICAgICB0bXAgKz0gY29kZV8ubWVzc2FnZSgpOwotICAgICAgICB3aGF0Xy5yZXNldChuZXcgc3RkOjpzdHJpbmcodG1wKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gd2hhdF8tPmNfc3RyKCk7Ci0gICAgfQotI2lmICFkZWZpbmVkKEFTSU9fTk9fRVhDRVBUSU9OUykKLSAgICBjYXRjaCAoc3RkOjpleGNlcHRpb24mKQotICAgIHsKLSAgICAgIHJldHVybiAic3lzdGVtX2Vycm9yIjsKLSAgICB9Ci0jZW5kaWYgLy8gIWRlZmluZWQoQVNJT19OT19FWENFUFRJT05TKQotICB9Ci0KLSAgLy8vIEdldCB0aGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLSAgZXJyb3JfY29kZSBjb2RlKCkgY29uc3QKLSAgewotICAgIHJldHVybiBjb2RlXzsKLSAgfQotCi1wcml2YXRlOgotICAvLyBUaGUgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgotICBlcnJvcl9jb2RlIGNvZGVfOwotCi0gIC8vIFRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCi0gIHN0ZDo6c3RyaW5nIGNvbnRleHRfOwotCi0gIC8vIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yLgotICBtdXRhYmxlIGFzaW86OmRldGFpbDo6c2NvcGVkX3B0cjxzdGQ6OnN0cmluZz4gd2hhdF87Ci19OwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19TVERfU1lTVEVNX0VSUk9SKQotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1NZU1RFTV9FUlJPUl9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby9zeXN0ZW1fdGltZXIuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3N5c3RlbV90aW1lci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MzA1NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3N5c3RlbV90aW1lci5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLwotLy8gc3lzdGVtX3RpbWVyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1NZU1RFTV9USU1FUl9IUFAKLSNkZWZpbmUgQVNJT19TWVNURU1fVElNRVJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk8pIFwKLSAgfHwgZGVmaW5lZChBU0lPX0hBU19CT09TVF9DSFJPTk8pIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk8pCi0jIGluY2x1ZGUgPGNocm9ubz4KLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ0hST05PKQotIyBpbmNsdWRlIDxib29zdC9jaHJvbm8vc3lzdGVtX2Nsb2Nrcy5ocHA+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFzaW8vYmFzaWNfd2FpdGFibGVfdGltZXIuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLS8vLyBUeXBlZGVmIGZvciBhIHRpbWVyIGJhc2VkIG9uIHRoZSBzeXN0ZW0gY2xvY2suCi0vKioKLSAqIFRoaXMgdHlwZWRlZiB1c2VzIHRoZSBDKysxMSBAYyAmbHQ7Y2hyb25vJmd0OyBzdGFuZGFyZCBsaWJyYXJ5IGZhY2lsaXR5LCBpZgotICogYXZhaWxhYmxlLiBPdGhlcndpc2UsIGl0IG1heSB1c2UgdGhlIEJvb3N0LkNocm9ubyBsaWJyYXJ5LiBUbyBleHBsaWNpdGx5Ci0gKiB1dGlsaXNlIEJvb3N0LkNocm9ubywgdXNlIHRoZSBiYXNpY193YWl0YWJsZV90aW1lciB0ZW1wbGF0ZSBkaXJlY3RseToKLSAqIEBjb2RlCi0gKiB0eXBlZGVmIGJhc2ljX3dhaXRhYmxlX3RpbWVyPGJvb3N0OjpjaHJvbm86OnN5c3RlbV9jbG9jaz4gdGltZXI7Ci0gKiBAZW5kY29kZQotICovCi10eXBlZGVmIGJhc2ljX3dhaXRhYmxlX3RpbWVyPGNocm9ubzo6c3lzdGVtX2Nsb2NrPiBzeXN0ZW1fdGltZXI7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk8pCi10eXBlZGVmIGJhc2ljX3dhaXRhYmxlX3RpbWVyPHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHN5c3RlbV90aW1lcjsKLSNlbGlmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfQ0hST05PKQotdHlwZWRlZiBiYXNpY193YWl0YWJsZV90aW1lcjxib29zdDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s+IHN5c3RlbV90aW1lcjsKLSNlbmRpZgotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1NURF9DSFJPTk8pIAotICAgICAgIC8vICAgfHwgZGVmaW5lZChBU0lPX0hBU19CT09TVF9DSFJPTk8pCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2VuZGlmIC8vIEFTSU9fU1lTVEVNX1RJTUVSX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3RocmVhZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vdGhyZWFkLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ2ODEzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vdGhyZWFkLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vCi0vLyB0aHJlYWQuaHBwCi0vLyB+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fVEhSRUFEX0hQUAotI2RlZmluZSBBU0lPX1RIUkVBRF9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyZWFkLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIEEgc2ltcGxlIGFic3RyYWN0aW9uIGZvciBzdGFydGluZyB0aHJlYWRzLgotLyoqCi0gKiBUaGUgYXNpbzo6dGhyZWFkIGNsYXNzIGltcGxlbWVudHMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHN1YnNldCBvZiB0aGUKLSAqIGZ1bmN0aW9uYWxpdHkgb2YgYm9vc3Q6OnRocmVhZC4gSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGZvciBzdGFydGluZwotICogYSB0aHJlYWQgYW5kIHdhaXRpbmcgZm9yIGl0IHRvIGV4aXQuIElmIG1vcmUgZXh0ZW5zaXZlIHRocmVhZGluZwotICogY2FwYWJpbGl0aWVzIGFyZSByZXF1aXJlZCwgeW91IGFyZSBzdHJvbmdseSBhZHZpc2VkIHRvIHVzZSBzb21ldGhpbmcgZWxzZS4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBBIHR5cGljYWwgdXNlIG9mIGFzaW86OnRocmVhZCB3b3VsZCBiZSB0byBsYXVuY2ggYSB0aHJlYWQgdG8gcnVuIGFuCi0gKiBpb19zZXJ2aWNlJ3MgZXZlbnQgcHJvY2Vzc2luZyBsb29wOgotICoKLSAqIEBwYXIKLSAqIEBjb2RlIGFzaW86OmlvX3NlcnZpY2UgaW9fc2VydmljZTsKLSAqIC8vIC4uLgotICogYXNpbzo6dGhyZWFkIHQoYm9vc3Q6OmJpbmQoJmFzaW86OmlvX3NlcnZpY2U6OnJ1biwgJmlvX3NlcnZpY2UpKTsKLSAqIC8vIC4uLgotICogdC5qb2luKCk7IEBlbmRjb2RlCi0gKi8KLWNsYXNzIHRocmVhZAotICA6IHByaXZhdGUgbm9uY29weWFibGUKLXsKLXB1YmxpYzoKLSAgLy8vIFN0YXJ0IGEgbmV3IHRocmVhZCB0aGF0IGV4ZWN1dGVzIHRoZSBzdXBwbGllZCBmdW5jdGlvbi4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyB0aHJlYWQgdGhhdCB3aWxsIGV4ZWN1dGUgdGhlIGdpdmVuIGZ1bmN0aW9uCi0gICAqIG9yIGZ1bmN0aW9uIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIG9yIGZ1bmN0aW9uIG9iamVjdCB0byBiZSBydW4gaW4gdGhlIHRocmVhZC4gVGhlCi0gICAqIGZ1bmN0aW9uIHNpZ25hdHVyZSBtdXN0IGJlOiBAY29kZSB2b2lkIGYoKTsgQGVuZGNvZGUKLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KLSAgZXhwbGljaXQgdGhyZWFkKEZ1bmN0aW9uIGYpCi0gICAgOiBpbXBsXyhmKQotICB7Ci0gIH0KLQotICAvLy8gRGVzdHJ1Y3Rvci4KLSAgfnRocmVhZCgpCi0gIHsKLSAgfQotCi0gIC8vLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIGV4aXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwgdGhlIHRocmVhZCBoYXMgZXhpdGVkLgotICAgKgotICAgKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQgYmVmb3JlIHRoZSB0aHJlYWQgb2JqZWN0IGlzIGRlc3Ryb3llZCwgdGhlCi0gICAqIHRocmVhZCBpdHNlbGYgd2lsbCBjb250aW51ZSB0byBydW4gdW50aWwgY29tcGxldGlvbi4gWW91IHdpbGwsIGhvd2V2ZXIsCi0gICAqIG5vIGxvbmdlciBoYXZlIHRoZSBhYmlsaXR5IHRvIHdhaXQgZm9yIGl0IHRvIGV4aXQuCi0gICAqLwotICB2b2lkIGpvaW4oKQotICB7Ci0gICAgaW1wbF8uam9pbigpOwotICB9Ci0KLXByaXZhdGU6Ci0gIGRldGFpbDo6dGhyZWFkIGltcGxfOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19USFJFQURfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vdGltZV90cmFpdHMuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3RpbWVfdHJhaXRzLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjNGUyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vdGltZV90cmFpdHMuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8KLS8vIHRpbWVfdHJhaXRzLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fVElNRV9UUkFJVFNfSFBQCi0jZGVmaW5lIEFTSU9fVElNRV9UUkFJVFNfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3NvY2tldF90eXBlcy5ocHAiIC8vIE11c3QgY29tZSBiZWZvcmUgcG9zaXhfdGltZS4KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfQk9PU1RfREFURV9USU1FKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZV90eXBlcy5ocHA+Ci0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBUaW1lIHRyYWl0cyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggdGhlIGRlYWRsaW5lIHRpbWVyLgotdGVtcGxhdGUgPHR5cGVuYW1lIFRpbWU+Ci1zdHJ1Y3QgdGltZV90cmFpdHM7Ci0KLS8vLyBUaW1lIHRyYWl0cyBzcGVjaWFsaXNlZCBmb3IgcG9zaXhfdGltZS4KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgdGltZV90cmFpdHM8Ym9vc3Q6OnBvc2l4X3RpbWU6OnB0aW1lPgotewotICAvLy8gVGhlIHRpbWUgdHlwZS4KLSAgdHlwZWRlZiBib29zdDo6cG9zaXhfdGltZTo6cHRpbWUgdGltZV90eXBlOwotCi0gIC8vLyBUaGUgZHVyYXRpb24gdHlwZS4KLSAgdHlwZWRlZiBib29zdDo6cG9zaXhfdGltZTo6dGltZV9kdXJhdGlvbiBkdXJhdGlvbl90eXBlOwotCi0gIC8vLyBHZXQgdGhlIGN1cnJlbnQgdGltZS4KLSAgc3RhdGljIHRpbWVfdHlwZSBub3coKQotICB7Ci0jaWYgZGVmaW5lZChCT09TVF9EQVRFX1RJTUVfSEFTX0hJR0hfUFJFQ0lTSU9OX0NMT0NLKQotICAgIHJldHVybiBib29zdDo6cG9zaXhfdGltZTo6bWljcm9zZWNfY2xvY2s6OnVuaXZlcnNhbF90aW1lKCk7Ci0jZWxzZSAvLyBkZWZpbmVkKEJPT1NUX0RBVEVfVElNRV9IQVNfSElHSF9QUkVDSVNJT05fQ0xPQ0spCi0gICAgcmV0dXJuIGJvb3N0Ojpwb3NpeF90aW1lOjpzZWNvbmRfY2xvY2s6OnVuaXZlcnNhbF90aW1lKCk7Ci0jZW5kaWYgLy8gZGVmaW5lZChCT09TVF9EQVRFX1RJTUVfSEFTX0hJR0hfUFJFQ0lTSU9OX0NMT0NLKQotICB9Ci0KLSAgLy8vIEFkZCBhIGR1cmF0aW9uIHRvIGEgdGltZS4KLSAgc3RhdGljIHRpbWVfdHlwZSBhZGQoY29uc3QgdGltZV90eXBlJiB0LCBjb25zdCBkdXJhdGlvbl90eXBlJiBkKQotICB7Ci0gICAgcmV0dXJuIHQgKyBkOwotICB9Ci0KLSAgLy8vIFN1YnRyYWN0IG9uZSB0aW1lIGZyb20gYW5vdGhlci4KLSAgc3RhdGljIGR1cmF0aW9uX3R5cGUgc3VidHJhY3QoY29uc3QgdGltZV90eXBlJiB0MSwgY29uc3QgdGltZV90eXBlJiB0MikKLSAgewotICAgIHJldHVybiB0MSAtIHQyOwotICB9Ci0KLSAgLy8vIFRlc3Qgd2hldGhlciBvbmUgdGltZSBpcyBsZXNzIHRoYW4gYW5vdGhlci4KLSAgc3RhdGljIGJvb2wgbGVzc190aGFuKGNvbnN0IHRpbWVfdHlwZSYgdDEsIGNvbnN0IHRpbWVfdHlwZSYgdDIpCi0gIHsKLSAgICByZXR1cm4gdDEgPCB0MjsKLSAgfQotCi0gIC8vLyBDb252ZXJ0IHRvIFBPU0lYIGR1cmF0aW9uIHR5cGUuCi0gIHN0YXRpYyBib29zdDo6cG9zaXhfdGltZTo6dGltZV9kdXJhdGlvbiB0b19wb3NpeF9kdXJhdGlvbigKLSAgICAgIGNvbnN0IGR1cmF0aW9uX3R5cGUmIGQpCi0gIHsKLSAgICByZXR1cm4gZDsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19CT09TVF9EQVRFX1RJTUUpCi0gICAgICAgLy8gfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1RJTUVfVFJBSVRTX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3VueWllbGQuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3VueWllbGQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZmOGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby91bnlpZWxkLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vCi0vLyB1bnlpZWxkLmhwcAotLy8gfn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZmRlZiByZWVudGVyCi0jIHVuZGVmIHJlZW50ZXIKLSNlbmRpZgotCi0jaWZkZWYgeWllbGQKLSMgdW5kZWYgeWllbGQKLSNlbmRpZgotCi0jaWZkZWYgZm9yawotIyB1bmRlZiBmb3JrCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby91c2VfZnV0dXJlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby91c2VfZnV0dXJlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyOGJjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vdXNlX2Z1dHVyZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLwotLy8gdXNlX2Z1dHVyZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fVVNFX0ZVVFVSRV9IUFAKLSNkZWZpbmUgQVNJT19VU0VfRlVUVVJFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIENsYXNzIHVzZWQgdG8gc3BlY2lmeSB0aGF0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gc2hvdWxkIHJldHVybiBhIGZ1dHVyZS4KLS8qKgotICogVGhlIHVzZV9mdXR1cmVfdCBjbGFzcyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbgotICogc2hvdWxkIHJldHVybiBhIHN0ZDo6ZnV0dXJlIG9iamVjdC4gQSB1c2VfZnV0dXJlX3Qgb2JqZWN0IG1heSBiZSBwYXNzZWQgYXMgYQotICogaGFuZGxlciB0byBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLCB0eXBpY2FsbHkgdXNpbmcgdGhlIHNwZWNpYWwgdmFsdWUgQGMKLSAqIGFzaW86OnVzZV9mdXR1cmUuIEZvciBleGFtcGxlOgotICoKLSAqIEBjb2RlIHN0ZDo6ZnV0dXJlPHN0ZDo6c2l6ZV90PiBteV9mdXR1cmUKLSAqICAgPSBteV9zb2NrZXQuYXN5bmNfcmVhZF9zb21lKG15X2J1ZmZlciwgYXNpbzo6dXNlX2Z1dHVyZSk7IEBlbmRjb2RlCi0gKgotICogVGhlIGluaXRpYXRpbmcgZnVuY3Rpb24gKGFzeW5jX3JlYWRfc29tZSBpbiB0aGUgYWJvdmUgZXhhbXBsZSkgcmV0dXJucyBhCi0gKiBmdXR1cmUgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLiBJZiB0aGUgb3BlcmF0aW9uCi0gKiBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvcl9jb2RlIGluZGljYXRpbmcgZmFpbHVyZSwgaXQgaXMgY29udmVydGVkIGludG8gYQotICogc3lzdGVtX2Vycm9yIGFuZCBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyIHZpYSB0aGUgZnV0dXJlLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8dm9pZD4gPgotY2xhc3MgdXNlX2Z1dHVyZV90Ci17Ci1wdWJsaWM6Ci0gIC8vLyBUaGUgYWxsb2NhdG9yIHR5cGUuIFRoZSBhbGxvY2F0b3IgaXMgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUKLSAgLy8vIEBjIHN0ZDo6cHJvbWlzZSBvYmplY3QgZm9yIGEgZ2l2ZW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KLSAgdHlwZWRlZiBBbGxvY2F0b3IgYWxsb2NhdG9yX3R5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdCB1c2luZyBkZWZhdWx0LWNvbnN0cnVjdGVkIGFsbG9jYXRvci4KLSAgQVNJT19DT05TVEVYUFIgdXNlX2Z1dHVyZV90KCkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCB1c2luZyBzcGVjaWZpZWQgYWxsb2NhdG9yLgotICBleHBsaWNpdCB1c2VfZnV0dXJlX3QoY29uc3QgQWxsb2NhdG9yJiBhbGxvY2F0b3IpCi0gICAgOiBhbGxvY2F0b3JfKGFsbG9jYXRvcikKLSAgewotICB9Ci0KLSAgLy8vIFNwZWNpZnkgYW4gYWx0ZXJuYXRlIGFsbG9jYXRvci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyQWxsb2NhdG9yPgotICB1c2VfZnV0dXJlX3Q8T3RoZXJBbGxvY2F0b3I+IG9wZXJhdG9yW10oY29uc3QgT3RoZXJBbGxvY2F0b3ImIGFsbG9jYXRvcikgY29uc3QKLSAgewotICAgIHJldHVybiB1c2VfZnV0dXJlX3Q8T3RoZXJBbGxvY2F0b3I+KGFsbG9jYXRvcik7Ci0gIH0KLQotICAvLy8gT2J0YWluIGFsbG9jYXRvci4KLSAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gYWxsb2NhdG9yXzsKLSAgfQotCi1wcml2YXRlOgotICBBbGxvY2F0b3IgYWxsb2NhdG9yXzsKLX07Ci0KLS8vLyBBIHNwZWNpYWwgdmFsdWUsIHNpbWlsYXIgdG8gc3RkOjpub3Rocm93LgotLyoqCi0gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGFzaW86OnVzZV9mdXR1cmVfdCBmb3IgYSB1c2FnZSBleGFtcGxlLgotICovCi0jaWYgZGVmaW5lZChBU0lPX0hBU19DT05TVEVYUFIpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotY29uc3RleHByIHVzZV9mdXR1cmVfdDw+IHVzZV9mdXR1cmU7Ci0jZWxpZiBkZWZpbmVkKEFTSU9fTVNWQykKLV9fZGVjbHNwZWMoc2VsZWN0YW55KSB1c2VfZnV0dXJlX3Q8PiB1c2VfZnV0dXJlOwotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vaW1wbC91c2VfZnV0dXJlLmhwcCIKLQotI2VuZGlmIC8vIEFTSU9fVVNFX0ZVVFVSRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby92ZXJzaW9uLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby92ZXJzaW9uLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzZGE2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vdmVyc2lvbi5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLwotLy8gdmVyc2lvbi5ocHAKLS8vIH5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fVkVSU0lPTl9IUFAKLSNkZWZpbmUgQVNJT19WRVJTSU9OX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLS8vIEFTSU9fVkVSU0lPTiAlIDEwMCBpcyB0aGUgc3ViLW1pbm9yIHZlcnNpb24KLS8vIEFTSU9fVkVSU0lPTiAvIDEwMCAlIDEwMDAgaXMgdGhlIG1pbm9yIHZlcnNpb24KLS8vIEFTSU9fVkVSU0lPTiAvIDEwMDAwMCBpcyB0aGUgbWFqb3IgdmVyc2lvbgotI2RlZmluZSBBU0lPX1ZFUlNJT04gMTAxMDA2IC8vIDEuMTAuNgotCi0jZW5kaWYgLy8gQVNJT19WRVJTSU9OX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dhaXRfdHJhaXRzLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93YWl0X3RyYWl0cy5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMmMxMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dhaXRfdHJhaXRzLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vCi0vLyB3YWl0X3RyYWl0cy5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1dBSVRfVFJBSVRTX0hQUAotI2RlZmluZSBBU0lPX1dBSVRfVFJBSVRTX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci0KLS8vLyBXYWl0IHRyYWl0cyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggdGhlIGJhc2ljX3dhaXRhYmxlX3RpbWVyIGNsYXNzIHRlbXBsYXRlLgotdGVtcGxhdGUgPHR5cGVuYW1lIENsb2NrPgotc3RydWN0IHdhaXRfdHJhaXRzCi17Ci0gIC8vLyBDb252ZXJ0IGEgY2xvY2sgZHVyYXRpb24gaW50byBhIGR1cmF0aW9uIHVzZWQgZm9yIHdhaXRpbmcuCi0gIC8qKiAKLSAgICogQHJldHVybnMgQGMgZC4KLSAgICovCi0gIHN0YXRpYyB0eXBlbmFtZSBDbG9jazo6ZHVyYXRpb24gdG9fd2FpdF9kdXJhdGlvbigKLSAgICAgIGNvbnN0IHR5cGVuYW1lIENsb2NrOjpkdXJhdGlvbiYgZCkKLSAgewotICAgIHJldHVybiBkOwotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1dBSVRfVFJBSVRTX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dhaXRhYmxlX3RpbWVyX3NlcnZpY2UuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dhaXRhYmxlX3RpbWVyX3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQ5NzFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93YWl0YWJsZV90aW1lcl9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLwotLy8gd2FpdGFibGVfdGltZXJfc2VydmljZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fV0FJVEFCTEVfVElNRVJfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19XQUlUQUJMRV9USU1FUl9TRVJWSUNFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9hc3luY19yZXN1bHQuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2Nocm9ub190aW1lX3RyYWl0cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvZGVhZGxpbmVfdGltZXJfc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3dhaXRfdHJhaXRzLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLy8vIERlZmF1bHQgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSB0aW1lci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbG9jaywKLSAgICB0eXBlbmFtZSBXYWl0VHJhaXRzID0gYXNpbzo6d2FpdF90cmFpdHM8Q2xvY2s+ID4KLWNsYXNzIHdhaXRhYmxlX3RpbWVyX3NlcnZpY2UKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgOiBwdWJsaWMgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZQotI2Vsc2UKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8Ci0gICAgICB3YWl0YWJsZV90aW1lcl9zZXJ2aWNlPENsb2NrLCBXYWl0VHJhaXRzPiA+Ci0jZW5kaWYKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB1bmlxdWUgc2VydmljZSBpZGVudGlmaWVyLgotICBzdGF0aWMgYXNpbzo6aW9fc2VydmljZTo6aWQgaWQ7Ci0jZW5kaWYKLQotICAvLy8gVGhlIGNsb2NrIHR5cGUuCi0gIHR5cGVkZWYgQ2xvY2sgY2xvY2tfdHlwZTsKLQotICAvLy8gVGhlIGR1cmF0aW9uIHR5cGUgb2YgdGhlIGNsb2NrLgotICB0eXBlZGVmIHR5cGVuYW1lIGNsb2NrX3R5cGU6OmR1cmF0aW9uIGR1cmF0aW9uOwotCi0gIC8vLyBUaGUgdGltZSBwb2ludCB0eXBlIG9mIHRoZSBjbG9jay4KLSAgdHlwZWRlZiB0eXBlbmFtZSBjbG9ja190eXBlOjp0aW1lX3BvaW50IHRpbWVfcG9pbnQ7Ci0KLSAgLy8vIFRoZSB3YWl0IHRyYWl0cyB0eXBlLgotICB0eXBlZGVmIFdhaXRUcmFpdHMgdHJhaXRzX3R5cGU7Ci0KLXByaXZhdGU6Ci0gIC8vIFRoZSB0eXBlIG9mIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSAgdHlwZWRlZiBkZXRhaWw6OmRlYWRsaW5lX3RpbWVyX3NlcnZpY2U8Ci0gICAgZGV0YWlsOjpjaHJvbm9fdGltZV90cmFpdHM8Q2xvY2ssIFdhaXRUcmFpdHM+ID4gc2VydmljZV9pbXBsX3R5cGU7Ci0KLXB1YmxpYzoKLSAgLy8vIFRoZSBpbXBsZW1lbnRhdGlvbiB0eXBlIG9mIHRoZSB3YWl0YWJsZSB0aW1lci4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIGltcGxlbWVudGF0aW9uX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHR5cGVuYW1lIHNlcnZpY2VfaW1wbF90eXBlOjppbXBsZW1lbnRhdGlvbl90eXBlIGltcGxlbWVudGF0aW9uX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gQ29uc3RydWN0IGEgbmV3IHRpbWVyIHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgaW9fc2VydmljZS4KLSAgZXhwbGljaXQgd2FpdGFibGVfdGltZXJfc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8Ci0gICAgICAgIHdhaXRhYmxlX3RpbWVyX3NlcnZpY2U8Q2xvY2ssIFdhaXRUcmFpdHM+ID4oaW9fc2VydmljZSksCi0gICAgICBzZXJ2aWNlX2ltcGxfKGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgdGltZXIgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmNvbnN0cnVjdChpbXBsKTsKLSAgfQotCi0gIC8vLyBEZXN0cm95IGEgdGltZXIgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgZGVzdHJveShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5kZXN0cm95KGltcGwpOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbnkgYXN5bmNocm9ub3VzIHdhaXQgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVyLgotICBzdGQ6OnNpemVfdCBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5jYW5jZWwoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIENhbmNlbHMgb25lIGFzeW5jaHJvbm91cyB3YWl0IG9wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVyLgotICBzdGQ6OnNpemVfdCBjYW5jZWxfb25lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNhbmNlbF9vbmUoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgZXhwaXJ5IHRpbWUgZm9yIHRoZSB0aW1lciBhcyBhbiBhYnNvbHV0ZSB0aW1lLgotICB0aW1lX3BvaW50IGV4cGlyZXNfYXQoY29uc3QgaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkgY29uc3QKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmV4cGlyZXNfYXQoaW1wbCk7Ci0gIH0KLQotICAvLy8gU2V0IHRoZSBleHBpcnkgdGltZSBmb3IgdGhlIHRpbWVyIGFzIGFuIGFic29sdXRlIHRpbWUuCi0gIHN0ZDo6c2l6ZV90IGV4cGlyZXNfYXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IHRpbWVfcG9pbnQmIGV4cGlyeV90aW1lLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmV4cGlyZXNfYXQoaW1wbCwgZXhwaXJ5X3RpbWUsIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIGV4cGlyeSB0aW1lIGZvciB0aGUgdGltZXIgcmVsYXRpdmUgdG8gbm93LgotICBkdXJhdGlvbiBleHBpcmVzX2Zyb21fbm93KGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5leHBpcmVzX2Zyb21fbm93KGltcGwpOwotICB9Ci0KLSAgLy8vIFNldCB0aGUgZXhwaXJ5IHRpbWUgZm9yIHRoZSB0aW1lciByZWxhdGl2ZSB0byBub3cuCi0gIHN0ZDo6c2l6ZV90IGV4cGlyZXNfZnJvbV9ub3coaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IGR1cmF0aW9uJiBleHBpcnlfdGltZSwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5leHBpcmVzX2Zyb21fbm93KGltcGwsIGV4cGlyeV90aW1lLCBlYyk7Ci0gIH0KLQotICAvLyBQZXJmb3JtIGEgYmxvY2tpbmcgd2FpdCBvbiB0aGUgdGltZXIuCi0gIHZvaWQgd2FpdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHNlcnZpY2VfaW1wbF8ud2FpdChpbXBsLCBlYyk7Ci0gIH0KLQotICAvLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd2FpdCBvbiB0aGUgdGltZXIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBXYWl0SGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV2FpdEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlKSkKLSAgYXN5bmNfd2FpdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgQVNJT19NT1ZFX0FSRyhXYWl0SGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBXYWl0SGFuZGxlciwgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFdhaXRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3dhaXQoaW1wbCwgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi1wcml2YXRlOgotICAvLyBEZXN0cm95IGFsbCB1c2VyLWRlZmluZWQgaGFuZGxlciBvYmplY3RzIG93bmVkIGJ5IHRoZSBzZXJ2aWNlLgotICB2b2lkIHNodXRkb3duX3NlcnZpY2UoKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5zaHV0ZG93bl9zZXJ2aWNlKCk7Ci0gIH0KLQotICAvLyBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCi0gIHNlcnZpY2VfaW1wbF90eXBlIHNlcnZpY2VfaW1wbF87Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBBU0lPX1dBSVRBQkxFX1RJTUVSX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9iYXNpY19oYW5kbGUuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3MvYmFzaWNfaGFuZGxlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3OGZjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9iYXNpY19oYW5kbGUuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8vCi0vLyB3aW5kb3dzL2Jhc2ljX2hhbmRsZS5ocHAKLS8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1dJTkRPV1NfQkFTSUNfSEFORExFX0hQUAotI2RlZmluZSBBU0lPX1dJTkRPV1NfQkFTSUNfSEFORExFX0hQUAotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0jIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDEyMDApCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jb25maWcuaHBwIgotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX1JBTkRPTV9BQ0NFU1NfSEFORExFKSBcCi0gIHx8IGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19TVFJFQU1fSEFORExFKSBcCi0gIHx8IGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19PQkpFQ1RfSEFORExFKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jaW5jbHVkZSAiYXNpby9iYXNpY19pb19vYmplY3QuaHBwIgotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSB3aW5kb3dzIHsKLQotLy8vIFByb3ZpZGVzIFdpbmRvd3MgaGFuZGxlIGZ1bmN0aW9uYWxpdHkuCi0vKioKLSAqIFRoZSB3aW5kb3dzOjpiYXNpY19oYW5kbGUgY2xhc3MgdGVtcGxhdGUgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gd3JhcCBhCi0gKiBXaW5kb3dzIGhhbmRsZS4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVTZXJ2aWNlPgotY2xhc3MgYmFzaWNfaGFuZGxlCi0gIDogcHVibGljIGJhc2ljX2lvX29iamVjdDxIYW5kbGVTZXJ2aWNlPgotewotcHVibGljOgotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlX3R5cGUuKSBUaGUgbmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mIGEKLSAgLy8vIGhhbmRsZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBIYW5kbGVTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX3R5cGU7Ci0KLSAgLy8vIFRoZSBuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgYSBoYW5kbGUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgSGFuZGxlU2VydmljZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLQotICAvLy8gQSBiYXNpY19oYW5kbGUgaXMgYWx3YXlzIHRoZSBsb3dlc3QgbGF5ZXIuCi0gIHR5cGVkZWYgYmFzaWNfaGFuZGxlPEhhbmRsZVNlcnZpY2U+IGxvd2VzdF9sYXllcl90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19oYW5kbGUgd2l0aG91dCBvcGVuaW5nIGl0LgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgaGFuZGxlIHdpdGhvdXQgb3BlbmluZyBpdC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIGhhbmRsZSB3aWxsIHVzZSB0bwotICAgKiBkaXNwYXRjaCBoYW5kbGVycyBmb3IgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgaGFuZGxlLgotICAgKi8KLSAgZXhwbGljaXQgYmFzaWNfaGFuZGxlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8SGFuZGxlU2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX2hhbmRsZSBvbiBhbiBleGlzdGluZyBuYXRpdmUgaGFuZGxlLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgaGFuZGxlIG9iamVjdCB0byBob2xkIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBoYW5kbGUgd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIGhhbmRsZS4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZSBBIG5hdGl2ZSBoYW5kbGUuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgYmFzaWNfaGFuZGxlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIGhhbmRsZSkKLSAgICA6IGJhc2ljX2lvX29iamVjdDxIYW5kbGVTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmFzc2lnbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgaGFuZGxlLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImFzc2lnbiIpOwotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBiYXNpY19oYW5kbGUgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhIGhhbmRsZSBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19oYW5kbGUgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUgd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX2hhbmRsZShpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICBiYXNpY19oYW5kbGUoYmFzaWNfaGFuZGxlJiYgb3RoZXIpCi0gICAgOiBiYXNpY19pb19vYmplY3Q8SGFuZGxlU2VydmljZT4oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX2hhbmRsZSkob3RoZXIpKQotICB7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gYSBiYXNpY19oYW5kbGUgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBhc3NpZ25tZW50IG9wZXJhdG9yIG1vdmVzIGEgaGFuZGxlIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX2hhbmRsZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZSB3aWxsIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfaGFuZGxlKGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIGJhc2ljX2hhbmRsZSYgb3BlcmF0b3I9KGJhc2ljX2hhbmRsZSYmIG90aGVyKQotICB7Ci0gICAgYmFzaWNfaW9fb2JqZWN0PEhhbmRsZVNlcnZpY2U+OjpvcGVyYXRvcj0oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX2hhbmRsZSkob3RoZXIpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0gIC8vLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGxvd2VzdCBsYXllci4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIGEgc3RhY2sgb2YKLSAgICogbGF5ZXJzLiBTaW5jZSBhIGJhc2ljX2hhbmRsZSBjYW5ub3QgY29udGFpbiBhbnkgZnVydGhlciBsYXllcnMsIGl0IHNpbXBseQotICAgKiByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KLSAgICoKLSAgICogQHJldHVybiBBIHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyIGluIHRoZSBzdGFjayBvZiBsYXllcnMuIE93bmVyc2hpcAotICAgKiBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlci4KLSAgICovCi0gIGxvd2VzdF9sYXllcl90eXBlJiBsb3dlc3RfbGF5ZXIoKQotICB7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLy8vIEdldCBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgbG93ZXN0IGxheWVyLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIgaW4gYSBzdGFjayBvZgotICAgKiBsYXllcnMuIFNpbmNlIGEgYmFzaWNfaGFuZGxlIGNhbm5vdCBjb250YWluIGFueSBmdXJ0aGVyIGxheWVycywgaXQgc2ltcGx5Ci0gICAqIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgotICAgKgotICAgKiBAcmV0dXJuIEEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBsb3dlc3QgbGF5ZXIgaW4gdGhlIHN0YWNrIG9mIGxheWVycy4KLSAgICogT3duZXJzaGlwIGlzIG5vdCB0cmFuc2ZlcnJlZCB0byB0aGUgY2FsbGVyLgotICAgKi8KLSAgY29uc3QgbG93ZXN0X2xheWVyX3R5cGUmIGxvd2VzdF9sYXllcigpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGhhbmRsZS4KLSAgLyoKLSAgICogVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgaGFuZGxlIHRvIGhvbGQgYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZS4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZSBBIG5hdGl2ZSBoYW5kbGUuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCBhc3NpZ24oY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBoYW5kbGUpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkuYXNzaWduKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBoYW5kbGUsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAiYXNzaWduIik7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGhhbmRsZS4KLSAgLyoKLSAgICogVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgaGFuZGxlIHRvIGhvbGQgYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZS4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZSBBIG5hdGl2ZSBoYW5kbGUuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBhc3NpZ24oY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBoYW5kbGUsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzc2lnbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgaGFuZGxlLCBlYyk7Ci0gIH0KLQotICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGhhbmRsZSBpcyBvcGVuLgotICBib29sIGlzX29wZW4oKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkuaXNfb3Blbih0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSk7Ci0gIH0KLQotICAvLy8gQ2xvc2UgdGhlIGhhbmRsZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbG9zZSB0aGUgaGFuZGxlLiBBbnkgYXN5bmNocm9ub3VzIHJlYWQgb3Igd3JpdGUKLSAgICogb3BlcmF0aW9ucyB3aWxsIGJlIGNhbmNlbGxlZCBpbW1lZGlhdGVseSwgYW5kIHdpbGwgY29tcGxldGUgd2l0aCB0aGUKLSAgICogYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIHZvaWQgY2xvc2UoKQotICB7Ci0gICAgYXNpbzo6ZXJyb3JfY29kZSBlYzsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLmNsb3NlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNsb3NlIik7Ci0gIH0KLQotICAvLy8gQ2xvc2UgdGhlIGhhbmRsZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbG9zZSB0aGUgaGFuZGxlLiBBbnkgYXN5bmNocm9ub3VzIHJlYWQgb3Igd3JpdGUKLSAgICogb3BlcmF0aW9ucyB3aWxsIGJlIGNhbmNlbGxlZCBpbW1lZGlhdGVseSwgYW5kIHdpbGwgY29tcGxldGUgd2l0aCB0aGUKLSAgICogYXNpbzo6ZXJyb3I6Om9wZXJhdGlvbl9hYm9ydGVkIGVycm9yLgotICAgKgotICAgKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAgICovCi0gIGFzaW86OmVycm9yX2NvZGUgY2xvc2UoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5jbG9zZSh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgZWMpOwotICB9Ci0KLSAgLy8vIChEZXByZWNhdGVkOiBVc2UgbmF0aXZlX2hhbmRsZSgpLikgR2V0IHRoZSBuYXRpdmUgaGFuZGxlIHJlcHJlc2VudGF0aW9uLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAqIGhhbmRsZS4gVGhpcyBpcyBpbnRlbmRlZCB0byBhbGxvdyBhY2Nlc3MgdG8gbmF0aXZlIGhhbmRsZSBmdW5jdGlvbmFsaXR5Ci0gICAqIHRoYXQgaXMgbm90IG90aGVyd2lzZSBwcm92aWRlZC4KLSAgICovCi0gIG5hdGl2ZV90eXBlIG5hdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5uYXRpdmVfaGFuZGxlKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIG5hdGl2ZSBoYW5kbGUgcmVwcmVzZW50YXRpb24uCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIG9idGFpbiB0aGUgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICogaGFuZGxlLiBUaGlzIGlzIGludGVuZGVkIHRvIGFsbG93IGFjY2VzcyB0byBuYXRpdmUgaGFuZGxlIGZ1bmN0aW9uYWxpdHkKLSAgICogdGhhdCBpcyBub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkLgotICAgKi8KLSAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMtPmdldF9zZXJ2aWNlKCkubmF0aXZlX2hhbmRsZSh0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSk7Ci0gIH0KLQotICAvLy8gQ2FuY2VsIGFsbCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gY2F1c2VzIGFsbCBvdXRzdGFuZGluZyBhc3luY2hyb25vdXMgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCi0gICAqIHRvIGZpbmlzaCBpbW1lZGlhdGVseSwgYW5kIHRoZSBoYW5kbGVycyBmb3IgY2FuY2VsbGVkIG9wZXJhdGlvbnMgd2lsbCBiZQotICAgKiBwYXNzZWQgdGhlIGFzaW86OmVycm9yOjpvcGVyYXRpb25fYWJvcnRlZCBlcnJvci4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICB2b2lkIGNhbmNlbCgpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHRoaXMtPmdldF9zZXJ2aWNlKCkuY2FuY2VsKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgImNhbmNlbCIpOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbGwgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGNhdXNlcyBhbGwgb3V0c3RhbmRpbmcgYXN5bmNocm9ub3VzIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucwotICAgKiB0byBmaW5pc2ggaW1tZWRpYXRlbHksIGFuZCB0aGUgaGFuZGxlcnMgZm9yIGNhbmNlbGxlZCBvcGVyYXRpb25zIHdpbGwgYmUKLSAgICogcGFzc2VkIHRoZSBhc2lvOjplcnJvcjo6b3BlcmF0aW9uX2Fib3J0ZWQgZXJyb3IuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKi8KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5jYW5jZWwodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgfQotCi1wcm90ZWN0ZWQ6Ci0gIC8vLyBQcm90ZWN0ZWQgZGVzdHJ1Y3RvciB0byBwcmV2ZW50IGRlbGV0aW9uIHRocm91Z2ggdGhpcyB0eXBlLgotICB+YmFzaWNfaGFuZGxlKCkKLSAgewotICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSB3aW5kb3dzCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX1dJTkRPV1NfUkFORE9NX0FDQ0VTU19IQU5ETEUpCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKEFTSU9fSEFTX1dJTkRPV1NfU1RSRUFNX0hBTkRMRSkKLSAgICAgICAvLyAgIHx8IGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19PQkpFQ1RfSEFORExFKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1dJTkRPV1NfQkFTSUNfSEFORExFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3MvYmFzaWNfb2JqZWN0X2hhbmRsZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9iYXNpY19vYmplY3RfaGFuZGxlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0YmFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9iYXNpY19vYmplY3RfaGFuZGxlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLwotLy8gd2luZG93cy9iYXNpY19vYmplY3RfaGFuZGxlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDExIEJvcmlzIFNjaGFlbGluZyAoYm9yaXNAaGlnaHNjb3JlLmRlKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1dJTkRPV1NfQkFTSUNfT0JKRUNUX0hBTkRMRV9IUFAKLSNkZWZpbmUgQVNJT19XSU5ET1dTX0JBU0lDX09CSkVDVF9IQU5ETEVfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1dJTkRPV1NfT0JKRUNUX0hBTkRMRSkgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3Rocm93X2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL3dpbmRvd3MvYmFzaWNfaGFuZGxlLmhwcCIKLSNpbmNsdWRlICJhc2lvL3dpbmRvd3Mvb2JqZWN0X2hhbmRsZV9zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSB3aW5kb3dzIHsKLQotLy8vIFByb3ZpZGVzIG9iamVjdC1vcmllbnRlZCBoYW5kbGUgZnVuY3Rpb25hbGl0eS4KLS8qKgotICogVGhlIHdpbmRvd3M6OmJhc2ljX29iamVjdF9oYW5kbGUgY2xhc3MgdGVtcGxhdGUgcHJvdmlkZXMgYXN5bmNocm9ub3VzIGFuZAotICogYmxvY2tpbmcgb2JqZWN0LW9yaWVudGVkIGhhbmRsZSBmdW5jdGlvbmFsaXR5LgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIE9iamVjdEhhbmRsZVNlcnZpY2UgPSBvYmplY3RfaGFuZGxlX3NlcnZpY2U+Ci1jbGFzcyBiYXNpY19vYmplY3RfaGFuZGxlCi0gIDogcHVibGljIGJhc2ljX2hhbmRsZTxPYmplY3RIYW5kbGVTZXJ2aWNlPgotewotcHVibGljOgotICAvLy8gVGhlIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZiBhIGhhbmRsZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBPYmplY3RIYW5kbGVTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZV90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19vYmplY3RfaGFuZGxlIHdpdGhvdXQgb3BlbmluZyBpdC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBvYmplY3QgaGFuZGxlIHdpdGhvdXQgb3BlbmluZyBpdC4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIG9iamVjdCBoYW5kbGUgd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIGhhbmRsZS4KLSAgICovCi0gIGV4cGxpY2l0IGJhc2ljX29iamVjdF9oYW5kbGUoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGJhc2ljX2hhbmRsZTxPYmplY3RIYW5kbGVTZXJ2aWNlPihpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgYmFzaWNfb2JqZWN0X2hhbmRsZSBvbiBhbiBleGlzdGluZyBuYXRpdmUgaGFuZGxlLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIG9iamVjdCBoYW5kbGUgb2JqZWN0IHRvIGhvbGQgYW4gZXhpc3RpbmcgbmF0aXZlCi0gICAqIGhhbmRsZS4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIG9iamVjdCBoYW5kbGUgd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIGhhbmRsZS4KLSAgICoKLSAgICogQHBhcmFtIG5hdGl2ZV9oYW5kbGUgVGhlIG5ldyB1bmRlcmx5aW5nIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gICAqLwotICBiYXNpY19vYmplY3RfaGFuZGxlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIG5hdGl2ZV9oYW5kbGUpCi0gICAgOiBiYXNpY19oYW5kbGU8T2JqZWN0SGFuZGxlU2VydmljZT4oaW9fc2VydmljZSwgbmF0aXZlX2hhbmRsZSkKLSAgewotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBiYXNpY19vYmplY3RfaGFuZGxlIGZyb20gYW5vdGhlci4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgbW92ZXMgYW4gb2JqZWN0IGhhbmRsZSBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19vYmplY3RfaGFuZGxlIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBtb3ZlIHdpbGwKLSAgICogb2NjdXIuCi0gICAqCi0gICAqIEBub3RlIEZvbGxvd2luZyB0aGUgbW92ZSwgdGhlIG1vdmVkLWZyb20gb2JqZWN0IGlzIGluIHRoZSBzYW1lIHN0YXRlIGFzIGlmCi0gICAqIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBAYyBiYXNpY19vYmplY3RfaGFuZGxlKGlvX3NlcnZpY2UmKSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIGJhc2ljX29iamVjdF9oYW5kbGUoYmFzaWNfb2JqZWN0X2hhbmRsZSYmIG90aGVyKQotICAgIDogYmFzaWNfaGFuZGxlPE9iamVjdEhhbmRsZVNlcnZpY2U+KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChiYXNpY19vYmplY3RfaGFuZGxlKShvdGhlcikpCi0gIHsKLSAgfQotCi0gIC8vLyBNb3ZlLWFzc2lnbiBhIGJhc2ljX29iamVjdF9oYW5kbGUgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBhc3NpZ25tZW50IG9wZXJhdG9yIG1vdmVzIGFuIG9iamVjdCBoYW5kbGUgZnJvbSBvbmUgb2JqZWN0IHRvIGFub3RoZXIuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgYmFzaWNfb2JqZWN0X2hhbmRsZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgbW92ZSB3aWxsCi0gICAqIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfb2JqZWN0X2hhbmRsZShpb19zZXJ2aWNlJikgY29uc3RydWN0b3IuCi0gICAqLwotICBiYXNpY19vYmplY3RfaGFuZGxlJiBvcGVyYXRvcj0oYmFzaWNfb2JqZWN0X2hhbmRsZSYmIG90aGVyKQotICB7Ci0gICAgYmFzaWNfaGFuZGxlPE9iamVjdEhhbmRsZVNlcnZpY2U+OjpvcGVyYXRvcj0oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX29iamVjdF9oYW5kbGUpKG90aGVyKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19NT1ZFKSB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotICAvLy8gUGVyZm9ybSBhIGJsb2NraW5nIHdhaXQgb24gdGhlIG9iamVjdCBoYW5kbGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd2FpdCBmb3IgdGhlIG9iamVjdCBoYW5kbGUgdG8gYmUgc2V0IHRvIHRoZQotICAgKiBzaWduYWxsZWQgc3RhdGUuIFRoaXMgZnVuY3Rpb24gYmxvY2tzIGFuZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgdGhlIG9iamVjdAotICAgKiBoYW5kbGUgaGFzIGJlZW4gc2V0IHRvIHRoZSBzaWduYWxsZWQgc3RhdGUuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICAgKi8KLSAgdm9pZCB3YWl0KCkKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgdGhpcy0+Z2V0X3NlcnZpY2UoKS53YWl0KHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIndhaXQiKTsKLSAgfQotCi0gIC8vLyBQZXJmb3JtIGEgYmxvY2tpbmcgd2FpdCBvbiB0aGUgb2JqZWN0IGhhbmRsZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3YWl0IGZvciB0aGUgb2JqZWN0IGhhbmRsZSB0byBiZSBzZXQgdG8gdGhlCi0gICAqIHNpZ25hbGxlZCBzdGF0ZS4gVGhpcyBmdW5jdGlvbiBibG9ja3MgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCB0aGUgb2JqZWN0Ci0gICAqIGhhbmRsZSBoYXMgYmVlbiBzZXQgdG8gdGhlIHNpZ25hbGxlZCBzdGF0ZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqLwotICB2b2lkIHdhaXQoYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICB0aGlzLT5nZXRfc2VydmljZSgpLndhaXQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGVjKTsKLSAgfQotCi0gIC8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgd2FpdCBvbiB0aGUgb2JqZWN0IGhhbmRsZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgYmUgdXNlZCB0byBpbml0aWF0ZSBhbiBhc3luY2hyb25vdXMgd2FpdCBhZ2FpbnN0IHRoZQotICAgKiBvYmplY3QgaGFuZGxlLiBJdCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBoYW5kbGUgaXMgc2V0IHRvCi0gICAqIHRoZSBzaWduYWxsZWQgc3RhdGUuIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZQotICAgKiBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgV2FpdEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdhaXRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSkpCi0gIGFzeW5jX3dhaXQoQVNJT19NT1ZFX0FSRyhXYWl0SGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3dhaXQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFdhaXRIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHdpbmRvd3MKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19PQkpFQ1RfSEFORExFKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1dJTkRPV1NfQkFTSUNfT0JKRUNUX0hBTkRMRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93aW5kb3dzL2Jhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93aW5kb3dzL2Jhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3ZjRmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9iYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLy8KLS8vIHdpbmRvd3MvYmFzaWNfcmFuZG9tX2FjY2Vzc19oYW5kbGUuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1dJTkRPV1NfQkFTSUNfUkFORE9NX0FDQ0VTU19IQU5ETEVfSFBQCi0jZGVmaW5lIEFTSU9fV0lORE9XU19CQVNJQ19SQU5ET01fQUNDRVNTX0hBTkRMRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19SQU5ET01fQUNDRVNTX0hBTkRMRSkgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSAiYXNpby9kZXRhaWwvaGFuZGxlcl90eXBlX3JlcXVpcmVtZW50cy5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvdGhyb3dfZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vd2luZG93cy9iYXNpY19oYW5kbGUuaHBwIgotI2luY2x1ZGUgImFzaW8vd2luZG93cy9yYW5kb21fYWNjZXNzX2hhbmRsZV9zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSB3aW5kb3dzIHsKLQotLy8vIFByb3ZpZGVzIHJhbmRvbS1hY2Nlc3MgaGFuZGxlIGZ1bmN0aW9uYWxpdHkuCi0vKioKLSAqIFRoZSB3aW5kb3dzOjpiYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZSBjbGFzcyB0ZW1wbGF0ZSBwcm92aWRlcyBhc3luY2hyb25vdXMKLSAqIGFuZCBibG9ja2luZyByYW5kb20tYWNjZXNzIGhhbmRsZSBmdW5jdGlvbmFsaXR5LgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFJhbmRvbUFjY2Vzc0hhbmRsZVNlcnZpY2UgPSByYW5kb21fYWNjZXNzX2hhbmRsZV9zZXJ2aWNlPgotY2xhc3MgYmFzaWNfcmFuZG9tX2FjY2Vzc19oYW5kbGUKLSAgOiBwdWJsaWMgYmFzaWNfaGFuZGxlPFJhbmRvbUFjY2Vzc0hhbmRsZVNlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGVfdHlwZS4pIFRoZSBuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgYQotICAvLy8gaGFuZGxlLgotICB0eXBlZGVmIHR5cGVuYW1lIFJhbmRvbUFjY2Vzc0hhbmRsZVNlcnZpY2U6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfdHlwZTsKLQotICAvLy8gVGhlIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZiBhIGhhbmRsZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBSYW5kb21BY2Nlc3NIYW5kbGVTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUKLSAgICBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlIHdpdGhvdXQgb3BlbmluZyBpdC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIHJhbmRvbS1hY2Nlc3MgaGFuZGxlIHdpdGhvdXQgb3BlbmluZyBpdC4gVGhlCi0gICAqIGhhbmRsZSBuZWVkcyB0byBiZSBvcGVuZWQgYmVmb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4gdG8gb3IgcmVhZCBmcm9tIGl0LgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgcmFuZG9tLWFjY2VzcyBoYW5kbGUgd2lsbAotICAgKiB1c2UgdG8gZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlCi0gICAqIGhhbmRsZS4KLSAgICovCi0gIGV4cGxpY2l0IGJhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBiYXNpY19oYW5kbGU8UmFuZG9tQWNjZXNzSGFuZGxlU2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlIG9uIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUuCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSByYW5kb20tYWNjZXNzIGhhbmRsZSBvYmplY3QgdG8gaG9sZCBhbiBleGlzdGluZwotICAgKiBuYXRpdmUgaGFuZGxlLgotICAgKgotICAgKiBAcGFyYW0gaW9fc2VydmljZSBUaGUgaW9fc2VydmljZSBvYmplY3QgdGhhdCB0aGUgcmFuZG9tLWFjY2VzcyBoYW5kbGUgd2lsbAotICAgKiB1c2UgdG8gZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlCi0gICAqIGhhbmRsZS4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZSBUaGUgbmV3IHVuZGVybHlpbmcgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIGJhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3R5cGUmIGhhbmRsZSkKLSAgICA6IGJhc2ljX2hhbmRsZTxSYW5kb21BY2Nlc3NIYW5kbGVTZXJ2aWNlPihpb19zZXJ2aWNlLCBoYW5kbGUpCi0gIHsKLSAgfQotCi0jaWYgZGVmaW5lZChBU0lPX0hBU19NT1ZFKSB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIE1vdmUtY29uc3RydWN0IGEgYmFzaWNfcmFuZG9tX2FjY2Vzc19oYW5kbGUgZnJvbSBhbm90aGVyLgotICAvKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBtb3ZlcyBhIHJhbmRvbS1hY2Nlc3MgaGFuZGxlIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlIG9iamVjdCBmcm9tIHdoaWNoIHRoZQotICAgKiBtb3ZlIHdpbGwgb2NjdXIuCi0gICAqCi0gICAqIEBub3RlIEZvbGxvd2luZyB0aGUgbW92ZSwgdGhlIG1vdmVkLWZyb20gb2JqZWN0IGlzIGluIHRoZSBzYW1lIHN0YXRlIGFzIGlmCi0gICAqIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBAYyBiYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZShpb19zZXJ2aWNlJikKLSAgICogY29uc3RydWN0b3IuCi0gICAqLwotICBiYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZShiYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZSYmIG90aGVyKQotICAgIDogYmFzaWNfaGFuZGxlPFJhbmRvbUFjY2Vzc0hhbmRsZVNlcnZpY2U+KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChiYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZSkob3RoZXIpKQotICB7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gYSBiYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZSBmcm9tIGFub3RoZXIuCi0gIC8qKgotICAgKiBUaGlzIGFzc2lnbm1lbnQgb3BlcmF0b3IgbW92ZXMgYSByYW5kb20tYWNjZXNzIGhhbmRsZSBmcm9tIG9uZSBvYmplY3QgdG8KLSAgICogYW5vdGhlci4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBiYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZSBvYmplY3QgZnJvbSB3aGljaCB0aGUKLSAgICogbW92ZSB3aWxsIG9jY3VyLgotICAgKgotICAgKiBAbm90ZSBGb2xsb3dpbmcgdGhlIG1vdmUsIHRoZSBtb3ZlZC1mcm9tIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpZgotICAgKiBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQGMgYmFzaWNfcmFuZG9tX2FjY2Vzc19oYW5kbGUoaW9fc2VydmljZSYpCi0gICAqIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgYmFzaWNfcmFuZG9tX2FjY2Vzc19oYW5kbGUmIG9wZXJhdG9yPShiYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZSYmIG90aGVyKQotICB7Ci0gICAgYmFzaWNfaGFuZGxlPFJhbmRvbUFjY2Vzc0hhbmRsZVNlcnZpY2U+OjpvcGVyYXRvcj0oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlKShvdGhlcikpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgaGFuZGxlIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGRhdGEgdG8gdGhlIHJhbmRvbS1hY2Nlc3MgaGFuZGxlLiBUaGUKLSAgICogZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBkYXRhIGhhcyBiZWVuCi0gICAqIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LCBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4uCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSB3cml0dGVuIHRvIHRoZSBoYW5kbGUuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIEFuIGVycm9yIGNvZGUgb2YKLSAgICogYXNpbzo6ZXJyb3I6OmVvZiBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZQotICAgKiBwZWVyLgotICAgKgotICAgKiBAbm90ZSBUaGUgd3JpdGVfc29tZV9hdCBvcGVyYXRpb24gbWF5IG5vdCB3cml0ZSBhbGwgb2YgdGhlIGRhdGEuIENvbnNpZGVyCi0gICAqIHVzaW5nIHRoZSBAcmVmIHdyaXRlX2F0IGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFsbCBkYXRhIGlzCi0gICAqIHdyaXR0ZW4gYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gd3JpdGUgYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBoYW5kbGUud3JpdGVfc29tZV9hdCg0MiwgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIG11bHRpcGxlCi0gICAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHdyaXRlX3NvbWVfYXQodWludDY0X3Qgb2Zmc2V0LAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycykKLSAgewotICAgIGFzaW86OmVycm9yX2NvZGUgZWM7Ci0gICAgc3RkOjpzaXplX3QgcyA9IHRoaXMtPmdldF9zZXJ2aWNlKCkud3JpdGVfc29tZV9hdCgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG9mZnNldCwgYnVmZmVycywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJ3cml0ZV9zb21lX2F0Iik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gV3JpdGUgc29tZSBkYXRhIHRvIHRoZSBoYW5kbGUgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgZGF0YSB0byB0aGUgcmFuZG9tLWFjY2VzcyBoYW5kbGUuIFRoZQotICAgKiBmdW5jdGlvbiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9yIG1vcmUgYnl0ZXMgb2YgdGhlIGRhdGEgaGFzIGJlZW4KLSAgICogd3JpdHRlbiBzdWNjZXNzZnVsbHksIG9yIHVudGlsIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbi4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGhhbmRsZS4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gUmV0dXJucyAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgKgotICAgKiBAbm90ZSBUaGUgd3JpdGVfc29tZSBvcGVyYXRpb24gbWF5IG5vdCB0cmFuc21pdCBhbGwgb2YgdGhlIGRhdGEgdG8gdGhlCi0gICAqIHBlZXIuIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIHdyaXRlX2F0IGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0Ci0gICAqIGFsbCBkYXRhIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHdyaXRlX3NvbWVfYXQodWludDY0X3Qgb2Zmc2V0LAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS53cml0ZV9zb21lX2F0KAotICAgICAgICB0aGlzLT5nZXRfaW1wbGVtZW50YXRpb24oKSwgb2Zmc2V0LCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdyaXRlIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHdyaXRlIGRhdGEgdG8gdGhlIHJhbmRvbS1hY2Nlc3MKLSAgICogaGFuZGxlLiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbi4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGhhbmRsZS4KLSAgICogQWx0aG91Z2ggdGhlIGJ1ZmZlcnMgb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlCi0gICAqIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICAgKiB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHdyaXRlIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YKLSAgICogdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICoKLSAgICogQG5vdGUgVGhlIHdyaXRlIG9wZXJhdGlvbiBtYXkgbm90IHRyYW5zbWl0IGFsbCBvZiB0aGUgZGF0YSB0byB0aGUgcGVlci4KLSAgICogQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgYXN5bmNfd3JpdGVfYXQgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQKLSAgICogYWxsIGRhdGEgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gd3JpdGUgYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBoYW5kbGUuYXN5bmNfd3JpdGVfc29tZV9hdCg0MiwgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLCBoYW5kbGVyKTsKLSAgICogQGVuZGNvZGUKLSAgICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIG11bHRpcGxlCi0gICAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gICAqIHN0ZDo6dmVjdG9yLgotICAgKi8KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY193cml0ZV9zb21lX2F0KHVpbnQ2NF90IG9mZnNldCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIC8vIElmIHlvdSBnZXQgYW4gZXJyb3Igb24gdGhlIGZvbGxvd2luZyBsaW5lIGl0IG1lYW5zIHRoYXQgeW91ciBoYW5kbGVyIGRvZXMKLSAgICAvLyBub3QgbWVldCB0aGUgZG9jdW1lbnRlZCB0eXBlIHJlcXVpcmVtZW50cyBmb3IgYSBXcml0ZUhhbmRsZXIuCi0gICAgQVNJT19XUklURV9IQU5ETEVSX0NIRUNLKFdyaXRlSGFuZGxlciwgaGFuZGxlcikgdHlwZV9jaGVjazsKLQotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLmFzeW5jX3dyaXRlX3NvbWVfYXQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIG9mZnNldCwgYnVmZmVycywgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLQotICAvLy8gUmVhZCBzb21lIGRhdGEgZnJvbSB0aGUgaGFuZGxlIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSByYW5kb20tYWNjZXNzIGhhbmRsZS4gVGhlCi0gICAqIGZ1bmN0aW9uIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBvZiBkYXRhIGhhcyBiZWVuIHJlYWQKLSAgICogc3VjY2Vzc2Z1bGx5LCBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgICoKLSAgICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuIEFuIGVycm9yIGNvZGUgb2YKLSAgICogYXNpbzo6ZXJyb3I6OmVvZiBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGJ5IHRoZQotICAgKiBwZWVyLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVhZF9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gICAqIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiByZWFkX2F0IGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0Ci0gICAqIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWFkIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBoYW5kbGUucmVhZF9zb21lX2F0KDQyLCBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSkpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlYWRpbmcgaW50byBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZV9hdCh1aW50NjRfdCBvZmZzZXQsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnJlYWRfc29tZV9hdCgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG9mZnNldCwgYnVmZmVycywgZWMpOwotICAgIGFzaW86OmRldGFpbDo6dGhyb3dfZXJyb3IoZWMsICJyZWFkX3NvbWVfYXQiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBSZWFkIHNvbWUgZGF0YSBmcm9tIHRoZSBoYW5kbGUgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHJhbmRvbS1hY2Nlc3MgaGFuZGxlLiBUaGUKLSAgICogZnVuY3Rpb24gY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgaGFzIGJlZW4gcmVhZAotICAgKiBzdWNjZXNzZnVsbHksIG9yIHVudGlsIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVhZF9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gICAqIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiByZWFkX2F0IGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0Ci0gICAqIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWFkX3NvbWVfYXQodWludDY0X3Qgb2Zmc2V0LAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLnJlYWRfc29tZV9hdCgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIG9mZnNldCwgYnVmZmVycywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWFkIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHJlYWQgZGF0YSBmcm9tIHRoZSByYW5kb20tYWNjZXNzCi0gICAqIGhhbmRsZS4gVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuCi0gICAqCi0gICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgaW50byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQuCi0gICAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICAgKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAgICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gICAqCi0gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSByZWFkIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YKLSAgICogdGhlIGhhbmRsZXIgbXVzdCBiZToKLSAgICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICAgKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICAgKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgICogKTsgQGVuZGNvZGUKLSAgICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICAgKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbgotICAgKiBvZiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gICAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJlYWQgb3BlcmF0aW9uIG1heSBub3QgcmVhZCBhbGwgb2YgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMuCi0gICAqIENvbnNpZGVyIHVzaW5nIHRoZSBAcmVmIGFzeW5jX3JlYWRfYXQgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQKLSAgICogdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YSBpcyByZWFkIGJlZm9yZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyByZWFkIGludG8gYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICAgKiBAY29kZQotICAgKiBoYW5kbGUuYXN5bmNfcmVhZF9zb21lX2F0KDQyLCBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIGhhbmRsZXIpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlYWRpbmcgaW50byBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVhZF9zb21lX2F0KHVpbnQ2NF90IG9mZnNldCwKLSAgICAgIGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gICAgQVNJT19SRUFEX0hBTkRMRVJfQ0hFQ0soUmVhZEhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19yZWFkX3NvbWVfYXQodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIG9mZnNldCwgYnVmZmVycywgQVNJT19NT1ZFX0NBU1QoUmVhZEhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2Ugd2luZG93cwotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX1JBTkRPTV9BQ0NFU1NfSEFORExFKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1dJTkRPV1NfQkFTSUNfUkFORE9NX0FDQ0VTU19IQU5ETEVfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9iYXNpY19zdHJlYW1faGFuZGxlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93aW5kb3dzL2Jhc2ljX3N0cmVhbV9oYW5kbGUuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODhiMWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93aW5kb3dzL2Jhc2ljX3N0cmVhbV9oYW5kbGUuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8vCi0vLyB3aW5kb3dzL2Jhc2ljX3N0cmVhbV9oYW5kbGUuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fV0lORE9XU19CQVNJQ19TVFJFQU1fSEFORExFX0hQUAotI2RlZmluZSBBU0lPX1dJTkRPV1NfQkFTSUNfU1RSRUFNX0hBTkRMRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19TVFJFQU1fSEFORExFKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9oYW5kbGVyX3R5cGVfcmVxdWlyZW1lbnRzLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC90aHJvd19lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby93aW5kb3dzL2Jhc2ljX2hhbmRsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby93aW5kb3dzL3N0cmVhbV9oYW5kbGVfc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2Ugd2luZG93cyB7Ci0KLS8vLyBQcm92aWRlcyBzdHJlYW0tb3JpZW50ZWQgaGFuZGxlIGZ1bmN0aW9uYWxpdHkuCi0vKioKLSAqIFRoZSB3aW5kb3dzOjpiYXNpY19zdHJlYW1faGFuZGxlIGNsYXNzIHRlbXBsYXRlIHByb3ZpZGVzIGFzeW5jaHJvbm91cyBhbmQKLSAqIGJsb2NraW5nIHN0cmVhbS1vcmllbnRlZCBoYW5kbGUgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBAcGFyIFRocmVhZCBTYWZldHkKLSAqIEBlIERpc3RpbmN0IEBlIG9iamVjdHM6IFNhZmUuQG4KLSAqIEBlIFNoYXJlZCBAZSBvYmplY3RzOiBVbnNhZmUuCi0gKgotICogQHBhciBDb25jZXB0czoKLSAqIEFzeW5jUmVhZFN0cmVhbSwgQXN5bmNXcml0ZVN0cmVhbSwgU3RyZWFtLCBTeW5jUmVhZFN0cmVhbSwgU3luY1dyaXRlU3RyZWFtLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtSGFuZGxlU2VydmljZSA9IHN0cmVhbV9oYW5kbGVfc2VydmljZT4KLWNsYXNzIGJhc2ljX3N0cmVhbV9oYW5kbGUKLSAgOiBwdWJsaWMgYmFzaWNfaGFuZGxlPFN0cmVhbUhhbmRsZVNlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGVfdHlwZS4pIFRoZSBuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgYQotICAvLy8gaGFuZGxlLgotICB0eXBlZGVmIHR5cGVuYW1lIFN0cmVhbUhhbmRsZVNlcnZpY2U6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfdHlwZTsKLQotICAvLy8gVGhlIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBvZiBhIGhhbmRsZS4KLSAgdHlwZWRlZiB0eXBlbmFtZSBTdHJlYW1IYW5kbGVTZXJ2aWNlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX2hhbmRsZV90eXBlOwotCi0gIC8vLyBDb25zdHJ1Y3QgYSBiYXNpY19zdHJlYW1faGFuZGxlIHdpdGhvdXQgb3BlbmluZyBpdC4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIHN0cmVhbSBoYW5kbGUgd2l0aG91dCBvcGVuaW5nIGl0LiBUaGUgaGFuZGxlCi0gICAqIG5lZWRzIHRvIGJlIG9wZW5lZCBhbmQgdGhlbiBjb25uZWN0ZWQgb3IgYWNjZXB0ZWQgYmVmb3JlIGRhdGEgY2FuIGJlIHNlbnQKLSAgICogb3IgcmVjZWl2ZWQgb24gaXQuCi0gICAqCi0gICAqIEBwYXJhbSBpb19zZXJ2aWNlIFRoZSBpb19zZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSBzdHJlYW0gaGFuZGxlIHdpbGwgdXNlIHRvCi0gICAqIGRpc3BhdGNoIGhhbmRsZXJzIGZvciBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBoYW5kbGUuCi0gICAqLwotICBleHBsaWNpdCBiYXNpY19zdHJlYW1faGFuZGxlKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UpCi0gICAgOiBiYXNpY19oYW5kbGU8U3RyZWFtSGFuZGxlU2VydmljZT4oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIGJhc2ljX3N0cmVhbV9oYW5kbGUgb24gYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZS4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIHN0cmVhbSBoYW5kbGUgb2JqZWN0IHRvIGhvbGQgYW4gZXhpc3RpbmcgbmF0aXZlCi0gICAqIGhhbmRsZS4KLSAgICoKLSAgICogQHBhcmFtIGlvX3NlcnZpY2UgVGhlIGlvX3NlcnZpY2Ugb2JqZWN0IHRoYXQgdGhlIHN0cmVhbSBoYW5kbGUgd2lsbCB1c2UgdG8KLSAgICogZGlzcGF0Y2ggaGFuZGxlcnMgZm9yIGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlIGhhbmRsZS4KLSAgICoKLSAgICogQHBhcmFtIGhhbmRsZSBUaGUgbmV3IHVuZGVybHlpbmcgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAgICovCi0gIGJhc2ljX3N0cmVhbV9oYW5kbGUoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSwKLSAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgaGFuZGxlKQotICAgIDogYmFzaWNfaGFuZGxlPFN0cmVhbUhhbmRsZVNlcnZpY2U+KGlvX3NlcnZpY2UsIGhhbmRsZSkKLSAgewotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBiYXNpY19zdHJlYW1faGFuZGxlIGZyb20gYW5vdGhlci4KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgbW92ZXMgYSBzdHJlYW0gaGFuZGxlIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3N0cmVhbV9oYW5kbGUgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUKLSAgICogd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3N0cmVhbV9oYW5kbGUoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgYmFzaWNfc3RyZWFtX2hhbmRsZShiYXNpY19zdHJlYW1faGFuZGxlJiYgb3RoZXIpCi0gICAgOiBiYXNpY19oYW5kbGU8U3RyZWFtSGFuZGxlU2VydmljZT4oCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKGJhc2ljX3N0cmVhbV9oYW5kbGUpKG90aGVyKSkKLSAgewotICB9Ci0KLSAgLy8vIE1vdmUtYXNzaWduIGEgYmFzaWNfc3RyZWFtX2hhbmRsZSBmcm9tIGFub3RoZXIuCi0gIC8qKgotICAgKiBUaGlzIGFzc2lnbm1lbnQgb3BlcmF0b3IgbW92ZXMgYSBzdHJlYW0gaGFuZGxlIGZyb20gb25lIG9iamVjdCB0bwotICAgKiBhbm90aGVyLgotICAgKgotICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGJhc2ljX3N0cmVhbV9oYW5kbGUgb2JqZWN0IGZyb20gd2hpY2ggdGhlIG1vdmUKLSAgICogd2lsbCBvY2N1ci4KLSAgICoKLSAgICogQG5vdGUgRm9sbG93aW5nIHRoZSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBvYmplY3QgaXMgaW4gdGhlIHNhbWUgc3RhdGUgYXMgaWYKLSAgICogY29uc3RydWN0ZWQgdXNpbmcgdGhlIEBjIGJhc2ljX3N0cmVhbV9oYW5kbGUoaW9fc2VydmljZSYpIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgYmFzaWNfc3RyZWFtX2hhbmRsZSYgb3BlcmF0b3I9KGJhc2ljX3N0cmVhbV9oYW5kbGUmJiBvdGhlcikKLSAgewotICAgIGJhc2ljX2hhbmRsZTxTdHJlYW1IYW5kbGVTZXJ2aWNlPjo6b3BlcmF0b3I9KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChiYXNpY19zdHJlYW1faGFuZGxlKShvdGhlcikpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgaGFuZGxlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGRhdGEgdG8gdGhlIHN0cmVhbSBoYW5kbGUuIFRoZSBmdW5jdGlvbiBjYWxsCi0gICAqIHdpbGwgYmxvY2sgdW50aWwgb25lIG9yIG1vcmUgYnl0ZXMgb2YgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgotICAgKiBzdWNjZXNzZnVsbHksIG9yIHVudGlsIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGhhbmRsZS4KLSAgICoKLSAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgotICAgKgotICAgKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4gQW4gZXJyb3IgY29kZSBvZgotICAgKiBhc2lvOjplcnJvcjo6ZW9mIGluZGljYXRlcyB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgYnkgdGhlCi0gICAqIHBlZXIuCi0gICAqCi0gICAqIEBub3RlIFRoZSB3cml0ZV9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHRyYW5zbWl0IGFsbCBvZiB0aGUgZGF0YSB0byB0aGUKLSAgICogcGVlci4gQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgd3JpdGUgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQKLSAgICogYWxsIGRhdGEgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyB3cml0ZSBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIGhhbmRsZS53cml0ZV9zb21lKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSk7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gd3JpdGluZyBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLndyaXRlX3NvbWUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBlYyk7Ci0gICAgYXNpbzo6ZGV0YWlsOjp0aHJvd19lcnJvcihlYywgIndyaXRlX3NvbWUiKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8vLyBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIGhhbmRsZS4KLSAgLyoqCi0gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3cml0ZSBkYXRhIHRvIHRoZSBzdHJlYW0gaGFuZGxlLiBUaGUgZnVuY3Rpb24gY2FsbAotICAgKiB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIHRoZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KLSAgICogc3VjY2Vzc2Z1bGx5LCBvciB1bnRpbCBhbiBlcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGRhdGEgYnVmZmVycyB0byBiZSB3cml0dGVuIHRvIHRoZSBoYW5kbGUuCi0gICAqCi0gICAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIFJldHVybnMgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgICoKLSAgICogQG5vdGUgVGhlIHdyaXRlX3NvbWUgb3BlcmF0aW9uIG1heSBub3QgdHJhbnNtaXQgYWxsIG9mIHRoZSBkYXRhIHRvIHRoZQotICAgKiBwZWVyLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiB3cml0ZSBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdAotICAgKiBhbGwgZGF0YSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYmxvY2tpbmcgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCB3cml0ZV9zb21lKGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiB0aGlzLT5nZXRfc2VydmljZSgpLndyaXRlX3NvbWUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdyaXRlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHdyaXRlIGRhdGEgdG8gdGhlIHN0cmVhbSBoYW5kbGUuCi0gICAqIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBkYXRhIGJ1ZmZlcnMgdG8gYmUgd3JpdHRlbiB0byB0aGUgaGFuZGxlLgotICAgKiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUKLSAgICogdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gICAqIHRoYXQgdGhleSByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAgICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZgotICAgKiB0aGUgaGFuZGxlciBtdXN0IGJlOgotICAgKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gICAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gICAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB3cml0dGVuLgotICAgKiApOyBAZW5kY29kZQotICAgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gICAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uCi0gICAqIG9mIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAgICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICAgKgotICAgKiBAbm90ZSBUaGUgd3JpdGUgb3BlcmF0aW9uIG1heSBub3QgdHJhbnNtaXQgYWxsIG9mIHRoZSBkYXRhIHRvIHRoZSBwZWVyLgotICAgKiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiBhc3luY193cml0ZSBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCBhbGwKLSAgICogZGF0YSBpcyB3cml0dGVuIGJlZm9yZSB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gICAqCi0gICAqIEBwYXIgRXhhbXBsZQotICAgKiBUbyB3cml0ZSBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gICAqIEBjb2RlCi0gICAqIGhhbmRsZS5hc3luY193cml0ZV9zb21lKGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgaGFuZGxlcik7Ci0gICAqIEBlbmRjb2RlCi0gICAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gd3JpdGluZyBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfd3JpdGVfc29tZShjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgV3JpdGVIYW5kbGVyLgotICAgIEFTSU9fV1JJVEVfSEFORExFUl9DSEVDSyhXcml0ZUhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY193cml0ZV9zb21lKHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLAotICAgICAgICBidWZmZXJzLCBBU0lPX01PVkVfQ0FTVChXcml0ZUhhbmRsZXIpKGhhbmRsZXIpKTsKLSAgfQotCi0gIC8vLyBSZWFkIHNvbWUgZGF0YSBmcm9tIHRoZSBoYW5kbGUuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbSBoYW5kbGUuIFRoZSBmdW5jdGlvbgotICAgKiBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9yIG1vcmUgYnl0ZXMgb2YgZGF0YSBoYXMgYmVlbiByZWFkIHN1Y2Nlc3NmdWxseSwKLSAgICogb3IgdW50aWwgYW4gZXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICAgKgotICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCi0gICAqCi0gICAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLiBBbiBlcnJvciBjb2RlIG9mCi0gICAqIGFzaW86OmVycm9yOjplb2YgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBieSB0aGUKLSAgICogcGVlci4KLSAgICoKLSAgICogQG5vdGUgVGhlIHJlYWRfc29tZSBvcGVyYXRpb24gbWF5IG5vdCByZWFkIGFsbCBvZiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgotICAgKiBieXRlcy4gQ29uc2lkZXIgdXNpbmcgdGhlIEByZWYgcmVhZCBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdAotICAgKiB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQgYmVmb3JlIHRoZSBibG9ja2luZyBvcGVyYXRpb24KLSAgICogY29tcGxldGVzLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gcmVhZCBpbnRvIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogaGFuZGxlLnJlYWRfc29tZShhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSkpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlYWRpbmcgaW50byBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZShjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMpCi0gIHsKLSAgICBhc2lvOjplcnJvcl9jb2RlIGVjOwotICAgIHN0ZDo6c2l6ZV90IHMgPSB0aGlzLT5nZXRfc2VydmljZSgpLnJlYWRfc29tZSgKLSAgICAgICAgdGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksIGJ1ZmZlcnMsIGVjKTsKLSAgICBhc2lvOjpkZXRhaWw6OnRocm93X2Vycm9yKGVjLCAicmVhZF9zb21lIik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICAvLy8gUmVhZCBzb21lIGRhdGEgZnJvbSB0aGUgaGFuZGxlLgotICAvKioKLSAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlLiBUaGUgZnVuY3Rpb24KLSAgICogY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvciBtb3JlIGJ5dGVzIG9mIGRhdGEgaGFzIGJlZW4gcmVhZCBzdWNjZXNzZnVsbHksCi0gICAqIG9yIHVudGlsIGFuIGVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBpbnRvIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgcmVhZC4KLSAgICoKLSAgICogQHBhcmFtIGVjIFNldCB0byBpbmRpY2F0ZSB3aGF0IGVycm9yIG9jY3VycmVkLCBpZiBhbnkuCi0gICAqCi0gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgKgotICAgKiBAbm90ZSBUaGUgcmVhZF9zb21lIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gICAqIGJ5dGVzLiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiByZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0Ci0gICAqIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGJsb2NraW5nIG9wZXJhdGlvbgotICAgKiBjb21wbGV0ZXMuCi0gICAqLwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlPgotICBzdGQ6OnNpemVfdCByZWFkX3NvbWUoY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5yZWFkX3NvbWUoCi0gICAgICAgIHRoaXMtPmdldF9pbXBsZW1lbnRhdGlvbigpLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlYWQuCi0gIC8qKgotICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbSBoYW5kbGUuCi0gICAqIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGludG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSByZWFkLgotICAgKiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUKLSAgICogdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gICAqIHRoYXQgdGhleSByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICAgKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcmVhZCBvcGVyYXRpb24gY29tcGxldGVzLgotICAgKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mCi0gICAqIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gICAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAgICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAgICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZCAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuCi0gICAqICk7IEBlbmRjb2RlCi0gICAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAgICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24KLSAgICogb2YgdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICAgKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gICAqCi0gICAqIEBub3RlIFRoZSByZWFkIG9wZXJhdGlvbiBtYXkgbm90IHJlYWQgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgotICAgKiBDb25zaWRlciB1c2luZyB0aGUgQHJlZiBhc3luY19yZWFkIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZQotICAgKiByZXF1ZXN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBiZWZvcmUgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24KLSAgICogY29tcGxldGVzLgotICAgKgotICAgKiBAcGFyIEV4YW1wbGUKLSAgICogVG8gcmVhZCBpbnRvIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAgICogQGNvZGUKLSAgICogaGFuZGxlLmFzeW5jX3JlYWRfc29tZShhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIGhhbmRsZXIpOwotICAgKiBAZW5kY29kZQotICAgKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHJlYWRpbmcgaW50byBtdWx0aXBsZQotICAgKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICAgKiBzdGQ6OnZlY3Rvci4KLSAgICovCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVhZF9zb21lKGNvbnN0IE11dGFibGVCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICAgIEFTSU9fTU9WRV9BUkcoUmVhZEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICAvLyBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBpdCBtZWFucyB0aGF0IHlvdXIgaGFuZGxlciBkb2VzCi0gICAgLy8gbm90IG1lZXQgdGhlIGRvY3VtZW50ZWQgdHlwZSByZXF1aXJlbWVudHMgZm9yIGEgUmVhZEhhbmRsZXIuCi0gICAgQVNJT19SRUFEX0hBTkRMRVJfQ0hFQ0soUmVhZEhhbmRsZXIsIGhhbmRsZXIpIHR5cGVfY2hlY2s7Ci0KLSAgICByZXR1cm4gdGhpcy0+Z2V0X3NlcnZpY2UoKS5hc3luY19yZWFkX3NvbWUodGhpcy0+Z2V0X2ltcGxlbWVudGF0aW9uKCksCi0gICAgICAgIGJ1ZmZlcnMsIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHdpbmRvd3MKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19TVFJFQU1fSEFORExFKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1dJTkRPV1NfQkFTSUNfU1RSRUFNX0hBTkRMRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93aW5kb3dzL29iamVjdF9oYW5kbGUuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3Mvb2JqZWN0X2hhbmRsZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MTYyZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3Mvb2JqZWN0X2hhbmRsZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLwotLy8gd2luZG93cy9vYmplY3RfaGFuZGxlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8gQ29weXJpZ2h0IChjKSAyMDExIEJvcmlzIFNjaGFlbGluZyAoYm9yaXNAaGlnaHNjb3JlLmRlKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1dJTkRPV1NfT0JKRUNUX0hBTkRMRV9IUFAKLSNkZWZpbmUgQVNJT19XSU5ET1dTX09CSkVDVF9IQU5ETEVfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1dJTkRPV1NfT0JKRUNUX0hBTkRMRSkgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgImFzaW8vd2luZG93cy9iYXNpY19vYmplY3RfaGFuZGxlLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHdpbmRvd3MgewotCi0vLy8gVHlwZWRlZiBmb3IgdGhlIHR5cGljYWwgdXNhZ2Ugb2YgYW4gb2JqZWN0IGhhbmRsZS4KLXR5cGVkZWYgYmFzaWNfb2JqZWN0X2hhbmRsZTw+IG9iamVjdF9oYW5kbGU7Ci0KLX0gLy8gbmFtZXNwYWNlIHdpbmRvd3MKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19PQkpFQ1RfSEFORExFKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1dJTkRPV1NfT0JKRUNUX0hBTkRMRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93aW5kb3dzL29iamVjdF9oYW5kbGVfc2VydmljZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9vYmplY3RfaGFuZGxlX3NlcnZpY2UuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY2YjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93aW5kb3dzL29iamVjdF9oYW5kbGVfc2VydmljZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8KLS8vIHdpbmRvd3Mvb2JqZWN0X2hhbmRsZV9zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgQm9yaXMgU2NoYWVsaW5nIChib3Jpc0BoaWdoc2NvcmUuZGUpCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fV0lORE9XU19PQkpFQ1RfSEFORExFX1NFUlZJQ0VfSFBQCi0jZGVmaW5lIEFTSU9fV0lORE9XU19PQkpFQ1RfSEFORExFX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1dJTkRPV1NfT0JKRUNUX0hBTkRMRSkgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlLmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLSNpbmNsdWRlICJhc2lvL2lvX3NlcnZpY2UuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHdpbmRvd3MgewotCi0vLy8gRGVmYXVsdCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZvciBhbiBvYmplY3QgaGFuZGxlLgotY2xhc3Mgb2JqZWN0X2hhbmRsZV9zZXJ2aWNlCi0jaWYgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIDogcHVibGljIGFzaW86OmlvX3NlcnZpY2U6OnNlcnZpY2UKLSNlbHNlCi0gIDogcHVibGljIGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPG9iamVjdF9oYW5kbGVfc2VydmljZT4KLSNlbmRpZgotewotcHVibGljOgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gVGhlIHVuaXF1ZSBzZXJ2aWNlIGlkZW50aWZpZXIuCi0gIHN0YXRpYyBhc2lvOjppb19zZXJ2aWNlOjppZCBpZDsKLSNlbmRpZgotCi1wcml2YXRlOgotICAvLyBUaGUgdHlwZSBvZiB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCi0gIHR5cGVkZWYgZGV0YWlsOjp3aW5fb2JqZWN0X2hhbmRsZV9zZXJ2aWNlIHNlcnZpY2VfaW1wbF90eXBlOwotCi1wdWJsaWM6Ci0gIC8vLyBUaGUgdHlwZSBvZiBhbiBvYmplY3QgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgc2VydmljZV9pbXBsX3R5cGU6OmltcGxlbWVudGF0aW9uX3R5cGUgaW1wbGVtZW50YXRpb25fdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBUaGUgbmF0aXZlIGhhbmRsZSB0eXBlLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgbmF0aXZlX2hhbmRsZV90eXBlOwotI2Vsc2UKLSAgdHlwZWRlZiBzZXJ2aWNlX2ltcGxfdHlwZTo6bmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLSNlbmRpZgotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgb2JqZWN0IGhhbmRsZSBzZXJ2aWNlIGZvciB0aGUgc3BlY2lmaWVkIGlvX3NlcnZpY2UuCi0gIGV4cGxpY2l0IG9iamVjdF9oYW5kbGVfc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8b2JqZWN0X2hhbmRsZV9zZXJ2aWNlPihpb19zZXJ2aWNlKSwKLSAgICAgIHNlcnZpY2VfaW1wbF8oaW9fc2VydmljZSkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhIG5ldyBvYmplY3QgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5jb25zdHJ1Y3QoaW1wbCk7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyBvYmplY3QgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfY29uc3RydWN0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBpbXBsZW1lbnRhdGlvbl90eXBlJiBvdGhlcl9pbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5tb3ZlX2NvbnN0cnVjdChpbXBsLCBvdGhlcl9pbXBsKTsKLSAgfQotCi0gIC8vLyBNb3ZlLWFzc2lnbiBmcm9tIGFub3RoZXIgb2JqZWN0IGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2Fzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgb2JqZWN0X2hhbmRsZV9zZXJ2aWNlJiBvdGhlcl9zZXJ2aWNlLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8ubW92ZV9hc3NpZ24oaW1wbCwgb3RoZXJfc2VydmljZS5zZXJ2aWNlX2ltcGxfLCBvdGhlcl9pbXBsKTsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIERlc3Ryb3kgYW4gb2JqZWN0IGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBkZXN0cm95KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmRlc3Ryb3koaW1wbCk7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUgdG8gYW4gb2JqZWN0IGhhbmRsZS4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhc3NpZ24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgaGFuZGxlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmFzc2lnbihpbXBsLCBoYW5kbGUsIGVjKTsKLSAgfQotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgaGFuZGxlIGlzIG9wZW4uCi0gIGJvb2wgaXNfb3Blbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uaXNfb3BlbihpbXBsKTsKLSAgfQotCi0gIC8vLyBDbG9zZSBhbiBvYmplY3QgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIGNsb3NlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNsb3NlKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIG5hdGl2ZSBoYW5kbGUgaW1wbGVtZW50YXRpb24uCi0gIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfaGFuZGxlKGltcGwpOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbGwgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCi0gIGFzaW86OmVycm9yX2NvZGUgY2FuY2VsKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNhbmNlbChpbXBsLCBlYyk7Ci0gIH0KLQotICAvLyBXYWl0IGZvciBhIHNpZ25hbGVkIHN0YXRlLgotICB2b2lkIHdhaXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLndhaXQoaW1wbCwgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3YWl0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgV2FpdEhhbmRsZXI+Ci0gIEFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdhaXRIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSkpCi0gIGFzeW5jX3dhaXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIEFTSU9fTU9WRV9BUkcoV2FpdEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICBhc2lvOjpkZXRhaWw6OmFzeW5jX3Jlc3VsdF9pbml0PAotICAgICAgV2FpdEhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUpPiBpbml0KAotICAgICAgICBBU0lPX01PVkVfQ0FTVChXYWl0SGFuZGxlcikoaGFuZGxlcikpOwotCi0gICAgc2VydmljZV9pbXBsXy5hc3luY193YWl0KGltcGwsIGluaXQuaGFuZGxlcik7Ci0KLSAgICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8uc2h1dGRvd25fc2VydmljZSgpOwotICB9Ci0KLSAgLy8gVGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotICBzZXJ2aWNlX2ltcGxfdHlwZSBzZXJ2aWNlX2ltcGxfOwotfTsKLQotfSAvLyBuYW1lc3BhY2Ugd2luZG93cwotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX09CSkVDVF9IQU5ETEUpCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2VuZGlmIC8vIEFTSU9fV0lORE9XU19PQkpFQ1RfSEFORExFX1NFUlZJQ0VfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9vdmVybGFwcGVkX3B0ci5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9vdmVybGFwcGVkX3B0ci5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NGI3NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3Mvb3ZlcmxhcHBlZF9wdHIuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8vCi0vLyB3aW5kb3dzL292ZXJsYXBwZWRfcHRyLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19XSU5ET1dTX09WRVJMQVBQRURfUFRSX0hQUAotI2RlZmluZSBBU0lPX1dJTkRPV1NfT1ZFUkxBUFBFRF9QVFJfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1dJTkRPV1NfT1ZFUkxBUFBFRF9QVFIpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9ub25jb3B5YWJsZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX2lvY3Bfb3ZlcmxhcHBlZF9wdHIuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2Ugd2luZG93cyB7Ci0KLS8vLyBXcmFwcyBhIGhhbmRsZXIgdG8gY3JlYXRlIGFuIE9WRVJMQVBQRUQgb2JqZWN0IGZvciB1c2Ugd2l0aCBvdmVybGFwcGVkIEkvTy4KLS8qKgotICogQSBzcGVjaWFsLXB1cnBvc2Ugc21hcnQgcG9pbnRlciB1c2VkIHRvIHdyYXAgYW4gYXBwbGljYXRpb24gaGFuZGxlciBzbyB0aGF0Ci0gKiBpdCBjYW4gYmUgcGFzc2VkIGFzIHRoZSBMUE9WRVJMQVBQRUQgYXJndW1lbnQgdG8gb3ZlcmxhcHBlZCBJL08gZnVuY3Rpb25zLgotICoKLSAqIEBwYXIgVGhyZWFkIFNhZmV0eQotICogQGUgRGlzdGluY3QgQGUgb2JqZWN0czogU2FmZS5AbgotICogQGUgU2hhcmVkIEBlIG9iamVjdHM6IFVuc2FmZS4KLSAqLwotY2xhc3Mgb3ZlcmxhcHBlZF9wdHIKLSAgOiBwcml2YXRlIG5vbmNvcHlhYmxlCi17Ci1wdWJsaWM6Ci0gIC8vLyBDb25zdHJ1Y3QgYW4gZW1wdHkgb3ZlcmxhcHBlZF9wdHIuCi0gIG92ZXJsYXBwZWRfcHRyKCkKLSAgICA6IGltcGxfKCkKLSAgewotICB9Ci0KLSAgLy8vIENvbnN0cnVjdCBhbiBvdmVybGFwcGVkX3B0ciB0byBjb250YWluIHRoZSBzcGVjaWZpZWQgaGFuZGxlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gIGV4cGxpY2l0IG92ZXJsYXBwZWRfcHRyKGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBBU0lPX01PVkVfQVJHKEhhbmRsZXIpIGhhbmRsZXIpCi0gICAgOiBpbXBsXyhpb19zZXJ2aWNlLCBBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSkKLSAgewotICB9Ci0KLSAgLy8vIERlc3RydWN0b3IgYXV0b21hdGljYWxseSBmcmVlcyB0aGUgT1ZFUkxBUFBFRCBvYmplY3QgdW5sZXNzIHJlbGVhc2VkLgotICB+b3ZlcmxhcHBlZF9wdHIoKQotICB7Ci0gIH0KLQotICAvLy8gUmVzZXQgdG8gZW1wdHkuCi0gIHZvaWQgcmVzZXQoKQotICB7Ci0gICAgaW1wbF8ucmVzZXQoKTsKLSAgfQotCi0gIC8vLyBSZXNldCB0byBjb250YWluIHRoZSBzcGVjaWZpZWQgaGFuZGxlciwgZnJlZWluZyBhbnkgY3VycmVudCBPVkVSTEFQUEVECi0gIC8vLyBvYmplY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICB2b2lkIHJlc2V0KGFzaW86OmlvX3NlcnZpY2UmIGlvX3NlcnZpY2UsCi0gICAgICBBU0lPX01PVkVfQVJHKEhhbmRsZXIpIGhhbmRsZXIpCi0gIHsKLSAgICBpbXBsXy5yZXNldChpb19zZXJ2aWNlLCBBU0lPX01PVkVfQ0FTVChIYW5kbGVyKShoYW5kbGVyKSk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBjb250YWluZWQgT1ZFUkxBUFBFRCBvYmplY3QuCi0gIE9WRVJMQVBQRUQqIGdldCgpCi0gIHsKLSAgICByZXR1cm4gaW1wbF8uZ2V0KCk7Ci0gIH0KLQotICAvLy8gR2V0IHRoZSBjb250YWluZWQgT1ZFUkxBUFBFRCBvYmplY3QuCi0gIGNvbnN0IE9WRVJMQVBQRUQqIGdldCgpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gaW1wbF8uZ2V0KCk7Ci0gIH0KLQotICAvLy8gUmVsZWFzZSBvd25lcnNoaXAgb2YgdGhlIE9WRVJMQVBQRUQgb2JqZWN0LgotICBPVkVSTEFQUEVEKiByZWxlYXNlKCkKLSAgewotICAgIHJldHVybiBpbXBsXy5yZWxlYXNlKCk7Ci0gIH0KLQotICAvLy8gUG9zdCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiBmb3Igb3ZlcmxhcHBlZCBvcGVyYXRpb24uIFJlbGVhc2VzIG93bmVyc2hpcC4KLSAgdm9pZCBjb21wbGV0ZShjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlYywKLSAgICAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkKQotICB7Ci0gICAgaW1wbF8uY29tcGxldGUoZWMsIGJ5dGVzX3RyYW5zZmVycmVkKTsKLSAgfQotCi1wcml2YXRlOgotICBkZXRhaWw6Ondpbl9pb2NwX292ZXJsYXBwZWRfcHRyIGltcGxfOwotfTsKLQotfSAvLyBuYW1lc3BhY2Ugd2luZG93cwotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX09WRVJMQVBQRURfUFRSKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1dJTkRPV1NfT1ZFUkxBUFBFRF9QVFJfSFBQCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9yYW5kb21fYWNjZXNzX2hhbmRsZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9yYW5kb21fYWNjZXNzX2hhbmRsZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Nzc3MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3MvcmFuZG9tX2FjY2Vzc19oYW5kbGUuaHBwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8KLS8vIHdpbmRvd3MvcmFuZG9tX2FjY2Vzc19oYW5kbGUuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1dJTkRPV1NfUkFORE9NX0FDQ0VTU19IQU5ETEVfSFBQCi0jZGVmaW5lIEFTSU9fV0lORE9XU19SQU5ET01fQUNDRVNTX0hBTkRMRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19SQU5ET01fQUNDRVNTX0hBTkRMRSkgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgImFzaW8vd2luZG93cy9iYXNpY19yYW5kb21fYWNjZXNzX2hhbmRsZS5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSB3aW5kb3dzIHsKLQotLy8vIFR5cGVkZWYgZm9yIHRoZSB0eXBpY2FsIHVzYWdlIG9mIGEgcmFuZG9tLWFjY2VzcyBoYW5kbGUuCi10eXBlZGVmIGJhc2ljX3JhbmRvbV9hY2Nlc3NfaGFuZGxlPD4gcmFuZG9tX2FjY2Vzc19oYW5kbGU7Ci0KLX0gLy8gbmFtZXNwYWNlIHdpbmRvd3MKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19SQU5ET01fQUNDRVNTX0hBTkRMRSkKLSAgICAgICAvLyAgIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jZW5kaWYgLy8gQVNJT19XSU5ET1dTX1JBTkRPTV9BQ0NFU1NfSEFORExFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3MvcmFuZG9tX2FjY2Vzc19oYW5kbGVfc2VydmljZS5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9yYW5kb21fYWNjZXNzX2hhbmRsZV9zZXJ2aWNlLmhwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlMzViZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd2luZG93cy9yYW5kb21fYWNjZXNzX2hhbmRsZV9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vLwotLy8gd2luZG93cy9yYW5kb21fYWNjZXNzX2hhbmRsZV9zZXJ2aWNlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1dJTkRPV1NfUkFORE9NX0FDQ0VTU19IQU5ETEVfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19XSU5ET1dTX1JBTkRPTV9BQ0NFU1NfSEFORExFX1NFUlZJQ0VfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1dJTkRPV1NfUkFORE9NX0FDQ0VTU19IQU5ETEUpIFwKLSAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jc3RkaW50LmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC93aW5faW9jcF9oYW5kbGVfc2VydmljZS5ocHAiCi0jaW5jbHVkZSAiYXNpby9lcnJvci5ocHAiCi0jaW5jbHVkZSAiYXNpby9pb19zZXJ2aWNlLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLW5hbWVzcGFjZSB3aW5kb3dzIHsKLQotLy8vIERlZmF1bHQgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSByYW5kb20tYWNjZXNzIGhhbmRsZS4KLWNsYXNzIHJhbmRvbV9hY2Nlc3NfaGFuZGxlX3NlcnZpY2UKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgOiBwdWJsaWMgYXNpbzo6aW9fc2VydmljZTo6c2VydmljZQotI2Vsc2UKLSAgOiBwdWJsaWMgYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8cmFuZG9tX2FjY2Vzc19oYW5kbGVfc2VydmljZT4KLSNlbmRpZgotewotcHVibGljOgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gVGhlIHVuaXF1ZSBzZXJ2aWNlIGlkZW50aWZpZXIuCi0gIHN0YXRpYyBhc2lvOjppb19zZXJ2aWNlOjppZCBpZDsKLSNlbmRpZgotCi1wcml2YXRlOgotICAvLyBUaGUgdHlwZSBvZiB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCi0gIHR5cGVkZWYgZGV0YWlsOjp3aW5faW9jcF9oYW5kbGVfc2VydmljZSBzZXJ2aWNlX2ltcGxfdHlwZTsKLQotcHVibGljOgotICAvLy8gVGhlIHR5cGUgb2YgYSByYW5kb20tYWNjZXNzIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIGltcGxlbWVudGF0aW9uX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHNlcnZpY2VfaW1wbF90eXBlOjppbXBsZW1lbnRhdGlvbl90eXBlIGltcGxlbWVudGF0aW9uX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlX3R5cGUuKSBUaGUgbmF0aXZlIGhhbmRsZSB0eXBlLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgbmF0aXZlX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHNlcnZpY2VfaW1wbF90eXBlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gVGhlIG5hdGl2ZSBoYW5kbGUgdHlwZS4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgc2VydmljZV9pbXBsX3R5cGU6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gQ29uc3RydWN0IGEgbmV3IHJhbmRvbS1hY2Nlc3MgaGFuZGxlIHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgaW9fc2VydmljZS4KLSAgZXhwbGljaXQgcmFuZG9tX2FjY2Vzc19oYW5kbGVfc2VydmljZShhc2lvOjppb19zZXJ2aWNlJiBpb19zZXJ2aWNlKQotICAgIDogYXNpbzo6ZGV0YWlsOjpzZXJ2aWNlX2Jhc2U8Ci0gICAgICAgIHJhbmRvbV9hY2Nlc3NfaGFuZGxlX3NlcnZpY2U+KGlvX3NlcnZpY2UpLAotICAgICAgc2VydmljZV9pbXBsXyhpb19zZXJ2aWNlKQotICB7Ci0gIH0KLQotICAvLy8gQ29uc3RydWN0IGEgbmV3IHJhbmRvbS1hY2Nlc3MgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICB2b2lkIGNvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgc2VydmljZV9pbXBsXy5jb25zdHJ1Y3QoaW1wbCk7Ci0gIH0KLQotI2lmIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0gIC8vLyBNb3ZlLWNvbnN0cnVjdCBhIG5ldyByYW5kb20tYWNjZXNzIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8ubW92ZV9jb25zdHJ1Y3QoaW1wbCwgb3RoZXJfaW1wbCk7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIHJhbmRvbS1hY2Nlc3MgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICB2b2lkIG1vdmVfYXNzaWduKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICByYW5kb21fYWNjZXNzX2hhbmRsZV9zZXJ2aWNlJiBvdGhlcl9zZXJ2aWNlLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8ubW92ZV9hc3NpZ24oaW1wbCwgb3RoZXJfc2VydmljZS5zZXJ2aWNlX2ltcGxfLCBvdGhlcl9pbXBsKTsKLSAgfQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfTU9WRSkgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSAgLy8vIERlc3Ryb3kgYSByYW5kb20tYWNjZXNzIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBkZXN0cm95KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmRlc3Ryb3koaW1wbCk7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUgdG8gYSByYW5kb20tYWNjZXNzIGhhbmRsZS4KLSAgYXNpbzo6ZXJyb3JfY29kZSBhc3NpZ24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdHlwZSYgaGFuZGxlLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmFzc2lnbihpbXBsLCBoYW5kbGUsIGVjKTsKLSAgfQotCi0gIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgaGFuZGxlIGlzIG9wZW4uCi0gIGJvb2wgaXNfb3Blbihjb25zdCBpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKSBjb25zdAotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uaXNfb3BlbihpbXBsKTsKLSAgfQotCi0gIC8vLyBDbG9zZSBhIHJhbmRvbS1hY2Nlc3MgaGFuZGxlIGltcGxlbWVudGF0aW9uLgotICBhc2lvOjplcnJvcl9jb2RlIGNsb3NlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNsb3NlKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyAoRGVwcmVjYXRlZDogVXNlIG5hdGl2ZV9oYW5kbGUoKS4pIEdldCB0aGUgbmF0aXZlIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgbmF0aXZlX3R5cGUgbmF0aXZlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfaGFuZGxlKGltcGwpOwotICB9Ci0KLSAgLy8vIEdldCB0aGUgbmF0aXZlIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgbmF0aXZlX2hhbmRsZV90eXBlIG5hdGl2ZV9oYW5kbGUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLm5hdGl2ZV9oYW5kbGUoaW1wbCk7Ci0gIH0KLQotICAvLy8gQ2FuY2VsIGFsbCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZS4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjYW5jZWwoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uY2FuY2VsKGltcGwsIGVjKTsKLSAgfQotCi0gIC8vLyBXcml0ZSB0aGUgZ2l2ZW4gZGF0YSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHdyaXRlX3NvbWVfYXQoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwgdWludDY0X3Qgb2Zmc2V0LAotICAgICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy53cml0ZV9zb21lX2F0KGltcGwsIG9mZnNldCwgYnVmZmVycywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyB3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoV3JpdGVIYW5kbGVyLAotICAgICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotICBhc3luY193cml0ZV9zb21lX2F0KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICB1aW50NjRfdCBvZmZzZXQsIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGFzaW86OmRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3dyaXRlX3NvbWVfYXQoaW1wbCwgb2Zmc2V0LCBidWZmZXJzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLSAgLy8vIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZV9hdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLCB1aW50NjRfdCBvZmZzZXQsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ucmVhZF9zb21lX2F0KGltcGwsIG9mZnNldCwgYnVmZmVycywgZWMpOwotICB9Ci0KLSAgLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyByZWFkIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlLCB0eXBlbmFtZSBSZWFkSGFuZGxlcj4KLSAgQVNJT19JTklURk5fUkVTVUxUX1RZUEUoUmVhZEhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3JlYWRfc29tZV9hdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3JlYWRfc29tZV9hdChpbXBsLCBvZmZzZXQsIGJ1ZmZlcnMsIGluaXQuaGFuZGxlcik7Ci0KLSAgICByZXR1cm4gaW5pdC5yZXN1bHQuZ2V0KCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLy8gRGVzdHJveSBhbGwgdXNlci1kZWZpbmVkIGhhbmRsZXIgb2JqZWN0cyBvd25lZCBieSB0aGUgc2VydmljZS4KLSAgdm9pZCBzaHV0ZG93bl9zZXJ2aWNlKCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8uc2h1dGRvd25fc2VydmljZSgpOwotICB9Ci0KLSAgLy8gVGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotICBzZXJ2aWNlX2ltcGxfdHlwZSBzZXJ2aWNlX2ltcGxfOwotfTsKLQotfSAvLyBuYW1lc3BhY2Ugd2luZG93cwotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcG9wX29wdGlvbnMuaHBwIgotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX1JBTkRPTV9BQ0NFU1NfSEFORExFKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1dJTkRPV1NfUkFORE9NX0FDQ0VTU19IQU5ETEVfU0VSVklDRV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93aW5kb3dzL3N0cmVhbV9oYW5kbGUuaHBwIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3Mvc3RyZWFtX2hhbmRsZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNWRkNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3Mvc3RyZWFtX2hhbmRsZS5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLwotLy8gd2luZG93cy9zdHJlYW1faGFuZGxlLmhwcAotLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENocmlzdG9waGVyIE0uIEtvaGxob2ZmIChjaHJpcyBhdCBrb2hsaG9mZiBkb3QgY29tKQotLy8KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKLS8vIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQotLy8KLQotI2lmbmRlZiBBU0lPX1dJTkRPV1NfU1RSRUFNX0hBTkRMRV9IUFAKLSNkZWZpbmUgQVNJT19XSU5ET1dTX1NUUkVBTV9IQU5ETEVfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX1dJTkRPV1NfU1RSRUFNX0hBTkRMRSkgXAotICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2luY2x1ZGUgImFzaW8vd2luZG93cy9iYXNpY19zdHJlYW1faGFuZGxlLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotbmFtZXNwYWNlIHdpbmRvd3MgewotCi0vLy8gVHlwZWRlZiBmb3IgdGhlIHR5cGljYWwgdXNhZ2Ugb2YgYSBzdHJlYW0tb3JpZW50ZWQgaGFuZGxlLgotdHlwZWRlZiBiYXNpY19zdHJlYW1faGFuZGxlPD4gc3RyZWFtX2hhbmRsZTsKLQotfSAvLyBuYW1lc3BhY2Ugd2luZG93cwotfSAvLyBuYW1lc3BhY2UgYXNpbwotCi0jZW5kaWYgLy8gZGVmaW5lZChBU0lPX0hBU19XSU5ET1dTX1NUUkVBTV9IQU5ETEUpCi0gICAgICAgLy8gICB8fCBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLQotI2VuZGlmIC8vIEFTSU9fV0lORE9XU19TVFJFQU1fSEFORExFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3Mvc3RyZWFtX2hhbmRsZV9zZXJ2aWNlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93aW5kb3dzL3N0cmVhbV9oYW5kbGVfc2VydmljZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZWM0OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dpbmRvd3Mvc3RyZWFtX2hhbmRsZV9zZXJ2aWNlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vLwotLy8gd2luZG93cy9zdHJlYW1faGFuZGxlX3NlcnZpY2UuaHBwCi0vLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19XSU5ET1dTX1NUUkVBTV9IQU5ETEVfU0VSVklDRV9IUFAKLSNkZWZpbmUgQVNJT19XSU5ET1dTX1NUUkVBTV9IQU5ETEVfU0VSVklDRV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLQotI2lmIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19TVFJFQU1fSEFORExFKSBcCi0gIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2FzeW5jX3Jlc3VsdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvd2luX2lvY3BfaGFuZGxlX3NlcnZpY2UuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotI2luY2x1ZGUgImFzaW8vaW9fc2VydmljZS5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wdXNoX29wdGlvbnMuaHBwIgotCi1uYW1lc3BhY2UgYXNpbyB7Ci1uYW1lc3BhY2Ugd2luZG93cyB7Ci0KLS8vLyBEZWZhdWx0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gZm9yIGEgc3RyZWFtIGhhbmRsZS4KLWNsYXNzIHN0cmVhbV9oYW5kbGVfc2VydmljZQotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICA6IHB1YmxpYyBhc2lvOjppb19zZXJ2aWNlOjpzZXJ2aWNlCi0jZWxzZQotICA6IHB1YmxpYyBhc2lvOjpkZXRhaWw6OnNlcnZpY2VfYmFzZTxzdHJlYW1faGFuZGxlX3NlcnZpY2U+Ci0jZW5kaWYKLXsKLXB1YmxpYzoKLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgLy8vIFRoZSB1bmlxdWUgc2VydmljZSBpZGVudGlmaWVyLgotICBzdGF0aWMgYXNpbzo6aW9fc2VydmljZTo6aWQgaWQ7Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAgLy8gVGhlIHR5cGUgb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uLgotICB0eXBlZGVmIGRldGFpbDo6d2luX2lvY3BfaGFuZGxlX3NlcnZpY2Ugc2VydmljZV9pbXBsX3R5cGU7Ci0KLXB1YmxpYzoKLSAgLy8vIFRoZSB0eXBlIG9mIGEgc3RyZWFtIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIGltcGxlbWVudGF0aW9uX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHNlcnZpY2VfaW1wbF90eXBlOjppbXBsZW1lbnRhdGlvbl90eXBlIGltcGxlbWVudGF0aW9uX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlX3R5cGUuKSBUaGUgbmF0aXZlIGhhbmRsZSB0eXBlLgotI2lmIGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICB0eXBlZGVmIGltcGxlbWVudGF0aW9uX2RlZmluZWQgbmF0aXZlX3R5cGU7Ci0jZWxzZQotICB0eXBlZGVmIHNlcnZpY2VfaW1wbF90eXBlOjpuYXRpdmVfaGFuZGxlX3R5cGUgbmF0aXZlX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gVGhlIG5hdGl2ZSBoYW5kbGUgdHlwZS4KLSNpZiBkZWZpbmVkKEdFTkVSQVRJTkdfRE9DVU1FTlRBVElPTikKLSAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbl9kZWZpbmVkIG5hdGl2ZV9oYW5kbGVfdHlwZTsKLSNlbHNlCi0gIHR5cGVkZWYgc2VydmljZV9pbXBsX3R5cGU6Om5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlX3R5cGU7Ci0jZW5kaWYKLQotICAvLy8gQ29uc3RydWN0IGEgbmV3IHN0cmVhbSBoYW5kbGUgc2VydmljZSBmb3IgdGhlIHNwZWNpZmllZCBpb19zZXJ2aWNlLgotICBleHBsaWNpdCBzdHJlYW1faGFuZGxlX3NlcnZpY2UoYXNpbzo6aW9fc2VydmljZSYgaW9fc2VydmljZSkKLSAgICA6IGFzaW86OmRldGFpbDo6c2VydmljZV9iYXNlPHN0cmVhbV9oYW5kbGVfc2VydmljZT4oaW9fc2VydmljZSksCi0gICAgICBzZXJ2aWNlX2ltcGxfKGlvX3NlcnZpY2UpCi0gIHsKLSAgfQotCi0gIC8vLyBDb25zdHJ1Y3QgYSBuZXcgc3RyZWFtIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBjb25zdHJ1Y3QoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8uY29uc3RydWN0KGltcGwpOwotICB9Ci0KLSNpZiBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotICAvLy8gTW92ZS1jb25zdHJ1Y3QgYSBuZXcgc3RyZWFtIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBtb3ZlX2NvbnN0cnVjdChpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgaW1wbGVtZW50YXRpb25fdHlwZSYgb3RoZXJfaW1wbCkKLSAgewotICAgIHNlcnZpY2VfaW1wbF8ubW92ZV9jb25zdHJ1Y3QoaW1wbCwgb3RoZXJfaW1wbCk7Ci0gIH0KLQotICAvLy8gTW92ZS1hc3NpZ24gZnJvbSBhbm90aGVyIHN0cmVhbSBoYW5kbGUgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgbW92ZV9hc3NpZ24oaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIHN0cmVhbV9oYW5kbGVfc2VydmljZSYgb3RoZXJfc2VydmljZSwKLSAgICAgIGltcGxlbWVudGF0aW9uX3R5cGUmIG90aGVyX2ltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLm1vdmVfYXNzaWduKGltcGwsIG90aGVyX3NlcnZpY2Uuc2VydmljZV9pbXBsXywgb3RoZXJfaW1wbCk7Ci0gIH0KLSNlbmRpZiAvLyBkZWZpbmVkKEFTSU9fSEFTX01PVkUpIHx8IGRlZmluZWQoR0VORVJBVElOR19ET0NVTUVOVEFUSU9OKQotCi0gIC8vLyBEZXN0cm95IGEgc3RyZWFtIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBkZXN0cm95KGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLmRlc3Ryb3koaW1wbCk7Ci0gIH0KLQotICAvLy8gQXNzaWduIGFuIGV4aXN0aW5nIG5hdGl2ZSBoYW5kbGUgdG8gYSBzdHJlYW0gaGFuZGxlLgotICBhc2lvOjplcnJvcl9jb2RlIGFzc2lnbihpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90eXBlJiBoYW5kbGUsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8uYXNzaWduKGltcGwsIGhhbmRsZSwgZWMpOwotICB9Ci0KLSAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBoYW5kbGUgaXMgb3Blbi4KLSAgYm9vbCBpc19vcGVuKGNvbnN0IGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpIGNvbnN0Ci0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5pc19vcGVuKGltcGwpOwotICB9Ci0KLSAgLy8vIENsb3NlIGEgc3RyZWFtIGhhbmRsZSBpbXBsZW1lbnRhdGlvbi4KLSAgYXNpbzo6ZXJyb3JfY29kZSBjbG9zZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5jbG9zZShpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gKERlcHJlY2F0ZWQ6IFVzZSBuYXRpdmVfaGFuZGxlKCkuKSBHZXQgdGhlIG5hdGl2ZSBoYW5kbGUgaW1wbGVtZW50YXRpb24uCi0gIG5hdGl2ZV90eXBlIG5hdGl2ZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ubmF0aXZlX2hhbmRsZShpbXBsKTsKLSAgfQotCi0gIC8vLyBHZXQgdGhlIG5hdGl2ZSBoYW5kbGUgaW1wbGVtZW50YXRpb24uCi0gIG5hdGl2ZV9oYW5kbGVfdHlwZSBuYXRpdmVfaGFuZGxlKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZV9pbXBsXy5uYXRpdmVfaGFuZGxlKGltcGwpOwotICB9Ci0KLSAgLy8vIENhbmNlbCBhbGwgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCi0gIGFzaW86OmVycm9yX2NvZGUgY2FuY2VsKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLmNhbmNlbChpbXBsLCBlYyk7Ci0gIH0KLQotICAvLy8gV3JpdGUgdGhlIGdpdmVuIGRhdGEgdG8gdGhlIHN0cmVhbS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHdyaXRlX3NvbWUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsIGFzaW86OmVycm9yX2NvZGUmIGVjKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VfaW1wbF8ud3JpdGVfc29tZShpbXBsLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHdyaXRlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwgdHlwZW5hbWUgV3JpdGVIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi0gIGFzeW5jX3dyaXRlX3NvbWUoaW1wbGVtZW50YXRpb25fdHlwZSYgaW1wbCwKLSAgICAgIGNvbnN0IENvbnN0QnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcikKLSAgewotICAgIGFzaW86OmRldGFpbDo6YXN5bmNfcmVzdWx0X2luaXQ8Ci0gICAgICBXcml0ZUhhbmRsZXIsIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KT4gaW5pdCgKLSAgICAgICAgQVNJT19NT1ZFX0NBU1QoV3JpdGVIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3dyaXRlX3NvbWUoaW1wbCwgYnVmZmVycywgaW5pdC5oYW5kbGVyKTsKLQotICAgIHJldHVybiBpbml0LnJlc3VsdC5nZXQoKTsKLSAgfQotCi0gIC8vLyBSZWFkIHNvbWUgZGF0YSBmcm9tIHRoZSBzdHJlYW0uCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2U+Ci0gIHN0ZDo6c2l6ZV90IHJlYWRfc29tZShpbXBsZW1lbnRhdGlvbl90eXBlJiBpbXBsLAotICAgICAgY29uc3QgTXV0YWJsZUJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLCBhc2lvOjplcnJvcl9jb2RlJiBlYykKLSAgewotICAgIHJldHVybiBzZXJ2aWNlX2ltcGxfLnJlYWRfc29tZShpbXBsLCBidWZmZXJzLCBlYyk7Ci0gIH0KLQotICAvLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIHJlYWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBNdXRhYmxlQnVmZmVyU2VxdWVuY2UsIHR5cGVuYW1lIFJlYWRIYW5kbGVyPgotICBBU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShSZWFkSGFuZGxlciwKLSAgICAgIHZvaWQgKGFzaW86OmVycm9yX2NvZGUsIHN0ZDo6c2l6ZV90KSkKLSAgYXN5bmNfcmVhZF9zb21lKGltcGxlbWVudGF0aW9uX3R5cGUmIGltcGwsCi0gICAgICBjb25zdCBNdXRhYmxlQnVmZmVyU2VxdWVuY2UmIGJ1ZmZlcnMsCi0gICAgICBBU0lPX01PVkVfQVJHKFJlYWRIYW5kbGVyKSBoYW5kbGVyKQotICB7Ci0gICAgYXNpbzo6ZGV0YWlsOjphc3luY19yZXN1bHRfaW5pdDwKLSAgICAgIFJlYWRIYW5kbGVyLCB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCk+IGluaXQoCi0gICAgICAgIEFTSU9fTU9WRV9DQVNUKFJlYWRIYW5kbGVyKShoYW5kbGVyKSk7Ci0KLSAgICBzZXJ2aWNlX2ltcGxfLmFzeW5jX3JlYWRfc29tZShpbXBsLCBidWZmZXJzLCBpbml0LmhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGluaXQucmVzdWx0LmdldCgpOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8vIERlc3Ryb3kgYWxsIHVzZXItZGVmaW5lZCBoYW5kbGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIHNlcnZpY2UuCi0gIHZvaWQgc2h1dGRvd25fc2VydmljZSgpCi0gIHsKLSAgICBzZXJ2aWNlX2ltcGxfLnNodXRkb3duX3NlcnZpY2UoKTsKLSAgfQotCi0gIC8vIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLSAgc2VydmljZV9pbXBsX3R5cGUgc2VydmljZV9pbXBsXzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIHdpbmRvd3MKLX0gLy8gbmFtZXNwYWNlIGFzaW8KLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3BvcF9vcHRpb25zLmhwcCIKLQotI2VuZGlmIC8vIGRlZmluZWQoQVNJT19IQVNfV0lORE9XU19TVFJFQU1fSEFORExFKQotICAgICAgIC8vICAgfHwgZGVmaW5lZChHRU5FUkFUSU5HX0RPQ1VNRU5UQVRJT04pCi0KLSNlbmRpZiAvLyBBU0lPX1dJTkRPV1NfU1RSRUFNX0hBTkRMRV9TRVJWSUNFX0hQUApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dyaXRlLmhwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93cml0ZS5ocHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDQ1ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2FzaW8vaW5jbHVkZS9hc2lvL3dyaXRlLmhwcAorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0vLwotLy8gd3JpdGUuaHBwCi0vLyB+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpZm5kZWYgQVNJT19XUklURV9IUFAKLSNkZWZpbmUgQVNJT19XUklURV9IUFAKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotIyBwcmFnbWEgb25jZQotI2VuZGlmIC8vIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxMjAwKQotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvY29uZmlnLmhwcCIKLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgImFzaW8vYXN5bmNfcmVzdWx0LmhwcCIKLSNpbmNsdWRlICJhc2lvL2Jhc2ljX3N0cmVhbWJ1Zl9md2QuaHBwIgotI2luY2x1ZGUgImFzaW8vZXJyb3IuaHBwIgotCi0jaW5jbHVkZSAiYXNpby9kZXRhaWwvcHVzaF9vcHRpb25zLmhwcCIKLQotbmFtZXNwYWNlIGFzaW8gewotCi0vKioKLSAqIEBkZWZncm91cCB3cml0ZSBhc2lvOjp3cml0ZQotICoKLSAqIEBicmllZiBXcml0ZSBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgdG8gYSBzdHJlYW0gYmVmb3JlIHJldHVybmluZy4KLSAqLwotLypAeyovCi0KLS8vLyBXcml0ZSBhbGwgb2YgdGhlIHN1cHBsaWVkIGRhdGEgdG8gYSBzdHJlYW0gYmVmb3JlIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBhIHN0cmVhbS4KLSAqIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBBbGwgb2YgdGhlIGRhdGEgaW4gdGhlIHN1cHBsaWVkIGJ1ZmZlcnMgaGFzIGJlZW4gd3JpdHRlbi4gVGhhdCBpcywgdGhlCi0gKiBieXRlcyB0cmFuc2ZlcnJlZCBpcyBlcXVhbCB0byB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgc3RyZWFtJ3MKLSAqIHdyaXRlX3NvbWUgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSB0byB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSB3cml0dGVuLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jV3JpdGVTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4gVGhlIHN1bQotICogb2YgdGhlIGJ1ZmZlciBzaXplcyBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoZQotICogc3RyZWFtLgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQuCi0gKgotICogQHRocm93cyBhc2lvOjpzeXN0ZW1fZXJyb3IgVGhyb3duIG9uIGZhaWx1cmUuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUbyB3cml0ZSBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSBhc2lvOjp3cml0ZShzLCBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSkpOyBAZW5kY29kZQotICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIG11bHRpcGxlCi0gKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICogc3RkOjp2ZWN0b3IuCi0gKgotICogQG5vdGUgVGhpcyBvdmVybG9hZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmc6Ci0gKiBAY29kZSBhc2lvOjp3cml0ZSgKLSAqICAgICBzLCBidWZmZXJzLAotICogICAgIGFzaW86OnRyYW5zZmVyX2FsbCgpKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZT4KLXN0ZDo6c2l6ZV90IHdyaXRlKFN5bmNXcml0ZVN0cmVhbSYgcywgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycyk7Ci0KLS8vLyBXcml0ZSBhbGwgb2YgdGhlIHN1cHBsaWVkIGRhdGEgdG8gYSBzdHJlYW0gYmVmb3JlIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBhIHN0cmVhbS4KLSAqIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBBbGwgb2YgdGhlIGRhdGEgaW4gdGhlIHN1cHBsaWVkIGJ1ZmZlcnMgaGFzIGJlZW4gd3JpdHRlbi4gVGhhdCBpcywgdGhlCi0gKiBieXRlcyB0cmFuc2ZlcnJlZCBpcyBlcXVhbCB0byB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgc3RyZWFtJ3MKLSAqIHdyaXRlX3NvbWUgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSB0byB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSB3cml0dGVuLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jV3JpdGVTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4gVGhlIHN1bQotICogb2YgdGhlIGJ1ZmZlciBzaXplcyBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoZQotICogc3RyZWFtLgotICoKLSAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUbyB3cml0ZSBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSBhc2lvOjp3cml0ZShzLCBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIGVjKTsgQGVuZGNvZGUKLSAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gd3JpdGluZyBtdWx0aXBsZQotICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAqIHN0ZDo6dmVjdG9yLgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nOgotICogQGNvZGUgYXNpbzo6d3JpdGUoCi0gKiAgICAgcywgYnVmZmVycywKLSAqICAgICBhc2lvOjp0cmFuc2Zlcl9hbGwoKSwgZWMpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1dyaXRlU3RyZWFtLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotc3RkOjpzaXplX3Qgd3JpdGUoU3luY1dyaXRlU3RyZWFtJiBzLCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotLy8vIFdyaXRlIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSB0byBhIHN0cmVhbSBiZWZvcmUgcmV0dXJuaW5nLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGEgc3RyZWFtLgotICogVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIEFsbCBvZiB0aGUgZGF0YSBpbiB0aGUgc3VwcGxpZWQgYnVmZmVycyBoYXMgYmVlbiB3cml0dGVuLiBUaGF0IGlzLCB0aGUKLSAqIGJ5dGVzIHRyYW5zZmVycmVkIGlzIGVxdWFsIHRvIHRoZSBzdW0gb2YgdGhlIGJ1ZmZlciBzaXplcy4KLSAqCi0gKiBAbGkgVGhlIGNvbXBsZXRpb25fY29uZGl0aW9uIGZ1bmN0aW9uIG9iamVjdCByZXR1cm5zIDAuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogd3JpdGVfc29tZSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4uIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNXcml0ZVN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB3cml0dGVuLiBUaGUgc3VtCi0gKiBvZiB0aGUgYnVmZmVyIHNpemVzIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgdG8gdGhlCi0gKiBzdHJlYW0uCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QKLSAqIG11c3QgYmU6Ci0gKiBAY29kZSBzdGQ6OnNpemVfdCBjb21wbGV0aW9uX2NvbmRpdGlvbigKLSAqICAgLy8gUmVzdWx0IG9mIGxhdGVzdCB3cml0ZV9zb21lIG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgc28gZmFyLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIEEgcmV0dXJuIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQQotICogbm9uLXplcm8gcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBvbgotICogdGhlIG5leHQgY2FsbCB0byB0aGUgc3RyZWFtJ3Mgd3JpdGVfc29tZSBmdW5jdGlvbi4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLgotICoKLSAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogVG8gd3JpdGUgYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICogQGNvZGUgYXNpbzo6d3JpdGUocywgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLAotICogICAgIGFzaW86OnRyYW5zZmVyX2F0X2xlYXN0KDMyKSk7IEBlbmRjb2RlCi0gKiBTZWUgdGhlIEByZWYgYnVmZmVyIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHdyaXRpbmcgbXVsdGlwbGUKLSAqIGJ1ZmZlcnMgaW4gb25lIGdvLCBhbmQgaG93IHRvIHVzZSBpdCB3aXRoIGFycmF5cywgYm9vc3Q6OmFycmF5IG9yCi0gKiBzdGQ6OnZlY3Rvci4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotc3RkOjpzaXplX3Qgd3JpdGUoU3luY1dyaXRlU3RyZWFtJiBzLCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24pOwotCi0vLy8gV3JpdGUgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIHRvIGEgc3RyZWFtIGJlZm9yZSByZXR1cm5pbmcuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3cml0ZSBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdG8gYSBzdHJlYW0uCi0gKiBUaGUgY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBidWZmZXJzIGhhcyBiZWVuIHdyaXR0ZW4uIFRoYXQgaXMsIHRoZQotICogYnl0ZXMgdHJhbnNmZXJyZWQgaXMgZXF1YWwgdG8gdGhlIHN1bSBvZiB0aGUgYnVmZmVyIHNpemVzLgotICoKLSAqIEBsaSBUaGUgY29tcGxldGlvbl9jb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IHJldHVybnMgMC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiB3cml0ZV9zb21lIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1dyaXRlU3RyZWFtIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uIFRoZSBzdW0KLSAqIG9mIHRoZSBidWZmZXIgc2l6ZXMgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byB0aGUKLSAqIHN0cmVhbS4KLSAqCi0gKiBAcGFyYW0gY29tcGxldGlvbl9jb25kaXRpb24gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lCi0gKiB3aGV0aGVyIHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdAotICogbXVzdCBiZToKLSAqIEBjb2RlIHN0ZDo6c2l6ZV90IGNvbXBsZXRpb25fY29uZGl0aW9uKAotICogICAvLyBSZXN1bHQgb2YgbGF0ZXN0IHdyaXRlX3NvbWUgb3BlcmF0aW9uLgotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqCi0gKiAgIC8vIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBzbyBmYXIuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogQSByZXR1cm4gdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBBCi0gKiBub24temVybyByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIG9uCi0gKiB0aGUgbmV4dCBjYWxsIHRvIHRoZSBzdHJlYW0ncyB3cml0ZV9zb21lIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm5zIHRoZSB0b3RhbAotICogbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCBwcmlvciB0byB0aGUgZXJyb3IuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jV3JpdGVTdHJlYW0sIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2UsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbj4KLXN0ZDo6c2l6ZV90IHdyaXRlKFN5bmNXcml0ZVN0cmVhbSYgcywgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSNpZiAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0vLy8gV3JpdGUgYWxsIG9mIHRoZSBzdXBwbGllZCBkYXRhIHRvIGEgc3RyZWFtIGJlZm9yZSByZXR1cm5pbmcuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3cml0ZSBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdG8gYSBzdHJlYW0uCi0gKiBUaGUgY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBiYXNpY19zdHJlYW1idWYgaGFzIGJlZW4gd3JpdHRlbi4KLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogd3JpdGVfc29tZSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4uIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNXcml0ZVN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIFRoZSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHdyaXR0ZW4uCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KLSAqCi0gKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAqCi0gKiBAbm90ZSBUaGlzIG92ZXJsb2FkIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZzoKLSAqIEBjb2RlIGFzaW86OndyaXRlKAotICogICAgIHMsIGIsCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYWxsKCkpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1dyaXRlU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1zdGQ6OnNpemVfdCB3cml0ZShTeW5jV3JpdGVTdHJlYW0mIHMsIGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiKTsKLQotLy8vIFdyaXRlIGFsbCBvZiB0aGUgc3VwcGxpZWQgZGF0YSB0byBhIHN0cmVhbSBiZWZvcmUgcmV0dXJuaW5nLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGEgc3RyZWFtLgotICogVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIEFsbCBvZiB0aGUgZGF0YSBpbiB0aGUgc3VwcGxpZWQgYmFzaWNfc3RyZWFtYnVmIGhhcyBiZWVuIHdyaXR0ZW4uCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgc3RyZWFtJ3MKLSAqIHdyaXRlX3NvbWUgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSB0byB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSB3cml0dGVuLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jV3JpdGVTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYiBUaGUgYmFzaWNfc3RyZWFtYnVmIG9iamVjdCBmcm9tIHdoaWNoIGRhdGEgd2lsbCBiZSB3cml0dGVuLgotICoKLSAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQuCi0gKgotICogQG5vdGUgVGhpcyBvdmVybG9hZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmc6Ci0gKiBAY29kZSBhc2lvOjp3cml0ZSgKLSAqICAgICBzLCBiLAotICogICAgIGFzaW86OnRyYW5zZmVyX2FsbCgpLCBlYyk7IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jV3JpdGVTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvcj4KLXN0ZDo6c2l6ZV90IHdyaXRlKFN5bmNXcml0ZVN0cmVhbSYgcywgYmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0vLy8gV3JpdGUgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIHRvIGEgc3RyZWFtIGJlZm9yZSByZXR1cm5pbmcuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3cml0ZSBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdG8gYSBzdHJlYW0uCi0gKiBUaGUgY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBiYXNpY19zdHJlYW1idWYgaGFzIGJlZW4gd3JpdHRlbi4KLSAqCi0gKiBAbGkgVGhlIGNvbXBsZXRpb25fY29uZGl0aW9uIGZ1bmN0aW9uIG9iamVjdCByZXR1cm5zIDAuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogd3JpdGVfc29tZSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4uIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNXcml0ZVN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIFRoZSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHdyaXR0ZW4uCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QKLSAqIG11c3QgYmU6Ci0gKiBAY29kZSBzdGQ6OnNpemVfdCBjb21wbGV0aW9uX2NvbmRpdGlvbigKLSAqICAgLy8gUmVzdWx0IG9mIGxhdGVzdCB3cml0ZV9zb21lIG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgc28gZmFyLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIEEgcmV0dXJuIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQQotICogbm9uLXplcm8gcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBvbgotICogdGhlIG5leHQgY2FsbCB0byB0aGUgc3RyZWFtJ3Mgd3JpdGVfc29tZSBmdW5jdGlvbi4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLgotICoKLSAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1dyaXRlU3RyZWFtLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbj4KLXN0ZDo6c2l6ZV90IHdyaXRlKFN5bmNXcml0ZVN0cmVhbSYgcywgYmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbik7Ci0KLS8vLyBXcml0ZSBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgdG8gYSBzdHJlYW0gYmVmb3JlIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBhIHN0cmVhbS4KLSAqIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBBbGwgb2YgdGhlIGRhdGEgaW4gdGhlIHN1cHBsaWVkIGJhc2ljX3N0cmVhbWJ1ZiBoYXMgYmVlbiB3cml0dGVuLgotICoKLSAqIEBsaSBUaGUgY29tcGxldGlvbl9jb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IHJldHVybnMgMC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiB3cml0ZV9zb21lIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1dyaXRlU3RyZWFtIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIGIgVGhlIGJhc2ljX3N0cmVhbWJ1ZiBvYmplY3QgZnJvbSB3aGljaCBkYXRhIHdpbGwgYmUgd3JpdHRlbi4KLSAqCi0gKiBAcGFyYW0gY29tcGxldGlvbl9jb25kaXRpb24gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lCi0gKiB3aGV0aGVyIHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdAotICogbXVzdCBiZToKLSAqIEBjb2RlIHN0ZDo6c2l6ZV90IGNvbXBsZXRpb25fY29uZGl0aW9uKAotICogICAvLyBSZXN1bHQgb2YgbGF0ZXN0IHdyaXRlX3NvbWUgb3BlcmF0aW9uLgotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqCi0gKiAgIC8vIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBzbyBmYXIuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogQSByZXR1cm4gdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBBCi0gKiBub24temVybyByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIG9uCi0gKiB0aGUgbmV4dCBjYWxsIHRvIHRoZSBzdHJlYW0ncyB3cml0ZV9zb21lIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm5zIHRoZSB0b3RhbAotICogbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSB0cmFuc2ZlcnJlZCBwcmlvciB0byB0aGUgZXJyb3IuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jV3JpdGVTdHJlYW0sIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uPgotc3RkOjpzaXplX3Qgd3JpdGUoU3luY1dyaXRlU3RyZWFtJiBzLCBiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLCBhc2lvOjplcnJvcl9jb2RlJiBlYyk7Ci0KLSNlbmRpZiAvLyAhZGVmaW5lZChBU0lPX05PX0lPU1RSRUFNKQotCi0vKkB9Ki8KLS8qKgotICogQGRlZmdyb3VwIGFzeW5jX3dyaXRlIGFzaW86OmFzeW5jX3dyaXRlCi0gKgotICogQGJyaWVmIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gd3JpdGUgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIHRvIGEKLSAqIHN0cmVhbS4KLSAqLwotLypAeyovCi0KLS8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHdyaXRlIGFsbCBvZiB0aGUgc3VwcGxpZWQgZGF0YSB0byBhCi0vLy8gc3RyZWFtLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgd3JpdGUgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZgotICogZGF0YSB0byBhIHN0cmVhbS4gVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuIFRoZQotICogYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aWxsIGNvbnRpbnVlIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGlzIHRydWU6Ci0gKgotICogQGxpIEFsbCBvZiB0aGUgZGF0YSBpbiB0aGUgc3VwcGxpZWQgYnVmZmVycyBoYXMgYmVlbiB3cml0dGVuLiBUaGF0IGlzLCB0aGUKLSAqIGJ5dGVzIHRyYW5zZmVycmVkIGlzIGVxdWFsIHRvIHRoZSBzdW0gb2YgdGhlIGJ1ZmZlciBzaXplcy4KLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBzdHJlYW0ncwotICogYXN5bmNfd3JpdGVfc29tZSBmdW5jdGlvbiwgYW5kIGlzIGtub3duIGFzIGEgPGVtPmNvbXBvc2VkIG9wZXJhdGlvbjwvZW0+LiBUaGUKLSAqIHByb2dyYW0gbXVzdCBlbnN1cmUgdGhhdCB0aGUgc3RyZWFtIHBlcmZvcm1zIG5vIG90aGVyIHdyaXRlIG9wZXJhdGlvbnMgKHN1Y2gKLSAqIGFzIGFzeW5jX3dyaXRlLCB0aGUgc3RyZWFtJ3MgYXN5bmNfd3JpdGVfc29tZSBmdW5jdGlvbiwgb3IgYW55IG90aGVyIGNvbXBvc2VkCi0gKiBvcGVyYXRpb25zIHRoYXQgcGVyZm9ybSB3cml0ZXMpIHVudGlsIHRoaXMgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqCi0gKiBAcGFyYW0gcyBUaGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4uIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIEFzeW5jV3JpdGVTdHJlYW0gY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KLSAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICogdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gKiB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YKLSAqIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICoKLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB3cml0dGVuIGZyb20gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJzLiBJZiBhbiBlcnJvciBvY2N1cnJlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSBsZXNzIHRoYW4gdGhlIHN1bQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGJ1ZmZlciBzaXplcy4KLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbiBvZgotICogdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICoKLSAqIEBwYXIgRXhhbXBsZQotICogVG8gd3JpdGUgYSBzaW5nbGUgZGF0YSBidWZmZXIgdXNlIHRoZSBAcmVmIGJ1ZmZlciBmdW5jdGlvbiBhcyBmb2xsb3dzOgotICogQGNvZGUKLSAqIGFzaW86OmFzeW5jX3dyaXRlKHMsIGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgaGFuZGxlcik7Ci0gKiBAZW5kY29kZQotICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIG11bHRpcGxlCi0gKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICogc3RkOjp2ZWN0b3IuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1dyaXRlU3RyZWFtLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZShBc3luY1dyaXRlU3RyZWFtJiBzLCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKTsKLQotLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gd3JpdGUgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIHRvIGEKLS8vLyBzdHJlYW0uCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSB3cml0ZSBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mCi0gKiBkYXRhIHRvIGEgc3RyZWFtLiBUaGUgZnVuY3Rpb24gY2FsbCBhbHdheXMgcmV0dXJucyBpbW1lZGlhdGVseS4gVGhlCi0gKiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdpbGwgY29udGludWUgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBidWZmZXJzIGhhcyBiZWVuIHdyaXR0ZW4uIFRoYXQgaXMsIHRoZQotICogYnl0ZXMgdHJhbnNmZXJyZWQgaXMgZXF1YWwgdG8gdGhlIHN1bSBvZiB0aGUgYnVmZmVyIHNpemVzLgotICoKLSAqIEBsaSBUaGUgY29tcGxldGlvbl9jb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IHJldHVybnMgMC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiBhc3luY193cml0ZV9zb21lIGZ1bmN0aW9uLCBhbmQgaXMga25vd24gYXMgYSA8ZW0+Y29tcG9zZWQgb3BlcmF0aW9uPC9lbT4uIFRoZQotICogcHJvZ3JhbSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBzdHJlYW0gcGVyZm9ybXMgbm8gb3RoZXIgd3JpdGUgb3BlcmF0aW9ucyAoc3VjaAotICogYXMgYXN5bmNfd3JpdGUsIHRoZSBzdHJlYW0ncyBhc3luY193cml0ZV9zb21lIGZ1bmN0aW9uLCBvciBhbnkgb3RoZXIgY29tcG9zZWQKLSAqIG9wZXJhdGlvbnMgdGhhdCBwZXJmb3JtIHdyaXRlcykgdW50aWwgdGhpcyBvcGVyYXRpb24gY29tcGxldGVzLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgQXN5bmNXcml0ZVN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB3cml0dGVuLgotICogQWx0aG91Z2ggdGhlIGJ1ZmZlcnMgb2JqZWN0IG1heSBiZSBjb3BpZWQgYXMgbmVjZXNzYXJ5LCBvd25lcnNoaXAgb2YgdGhlCi0gKiB1bmRlcmx5aW5nIG1lbW9yeSBibG9ja3MgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUKLSAqIHRoYXQgdGhleSByZW1haW4gdmFsaWQgdW50aWwgdGhlIGhhbmRsZXIgaXMgY2FsbGVkLgotICoKLSAqIEBwYXJhbSBjb21wbGV0aW9uX2NvbmRpdGlvbiBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUKLSAqIHdoZXRoZXIgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gVGhlIHNpZ25hdHVyZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0Ci0gKiBtdXN0IGJlOgotICogQGNvZGUgc3RkOjpzaXplX3QgY29tcGxldGlvbl9jb25kaXRpb24oCi0gKiAgIC8vIFJlc3VsdCBvZiBsYXRlc3QgYXN5bmNfd3JpdGVfc29tZSBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhci4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBBIHJldHVybiB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGUuIEEKLSAqIG5vbi16ZXJvIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gb24KLSAqIHRoZSBuZXh0IGNhbGwgdG8gdGhlIHN0cmVhbSdzIGFzeW5jX3dyaXRlX3NvbWUgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHdyaXRlIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZQotICogaGFuZGxlciBtdXN0IGJlOgotICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAqCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBmcm9tIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycy4gSWYgYW4gZXJyb3Igb2NjdXJyZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSBzdW0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKiApOyBAZW5kY29kZQotICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24gb2YKLSAqIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHdyaXRlIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAqIEBjb2RlIGFzaW86OmFzeW5jX3dyaXRlKHMsCi0gKiAgICAgYXNpbzo6YnVmZmVyKGRhdGEsIHNpemUpLAotICogICAgIGFzaW86OnRyYW5zZmVyX2F0X2xlYXN0KDMyKSwKLSAqICAgICBoYW5kbGVyKTsgQGVuZGNvZGUKLSAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gd3JpdGluZyBtdWx0aXBsZQotICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAqIHN0ZDo6dmVjdG9yLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQ29uc3RCdWZmZXJTZXF1ZW5jZSwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci1BU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYXN5bmNfd3JpdGUoQXN5bmNXcml0ZVN0cmVhbSYgcywgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKTsKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHdyaXRlIGFsbCBvZiB0aGUgc3VwcGxpZWQgZGF0YSB0byBhCi0vLy8gc3RyZWFtLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgd3JpdGUgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZgotICogZGF0YSB0byBhIHN0cmVhbS4gVGhlIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuIFRoZQotICogYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aWxsIGNvbnRpbnVlIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGlzIHRydWU6Ci0gKgotICogQGxpIEFsbCBvZiB0aGUgZGF0YSBpbiB0aGUgc3VwcGxpZWQgYmFzaWNfc3RyZWFtYnVmIGhhcyBiZWVuIHdyaXR0ZW4uCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgc3RyZWFtJ3MKLSAqIGFzeW5jX3dyaXRlX3NvbWUgZnVuY3Rpb24sIGFuZCBpcyBrbm93biBhcyBhIDxlbT5jb21wb3NlZCBvcGVyYXRpb248L2VtPi4gVGhlCi0gKiBwcm9ncmFtIG11c3QgZW5zdXJlIHRoYXQgdGhlIHN0cmVhbSBwZXJmb3JtcyBubyBvdGhlciB3cml0ZSBvcGVyYXRpb25zIChzdWNoCi0gKiBhcyBhc3luY193cml0ZSwgdGhlIHN0cmVhbSdzIGFzeW5jX3dyaXRlX3NvbWUgZnVuY3Rpb24sIG9yIGFueSBvdGhlciBjb21wb3NlZAotICogb3BlcmF0aW9ucyB0aGF0IHBlcmZvcm0gd3JpdGVzKSB1bnRpbCB0aGlzIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gKgotICogQHBhcmFtIHMgVGhlIHN0cmVhbSB0byB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSB3cml0dGVuLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBBc3luY1dyaXRlU3RyZWFtIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIGIgQSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHdyaXR0ZW4uIE93bmVyc2hpcAotICogb2YgdGhlIHN0cmVhbWJ1ZiBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZSB0aGF0IGl0Ci0gKiByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gKiBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICoKLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB3cml0dGVuIGZyb20gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJzLiBJZiBhbiBlcnJvciBvY2N1cnJlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSBsZXNzIHRoYW4gdGhlIHN1bQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGJ1ZmZlciBzaXplcy4KLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbiBvZgotICogdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci1BU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYXN5bmNfd3JpdGUoQXN5bmNXcml0ZVN0cmVhbSYgcywgYmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgQVNJT19NT1ZFX0FSRyhXcml0ZUhhbmRsZXIpIGhhbmRsZXIpOwotCi0vLy8gU3RhcnQgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB0byB3cml0ZSBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgdG8gYQotLy8vIHN0cmVhbS4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzeW5jaHJvbm91c2x5IHdyaXRlIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YKLSAqIGRhdGEgdG8gYSBzdHJlYW0uIFRoZSBmdW5jdGlvbiBjYWxsIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LiBUaGUKLSAqIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2lsbCBjb250aW51ZSB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBpcyB0cnVlOgotICoKLSAqIEBsaSBBbGwgb2YgdGhlIGRhdGEgaW4gdGhlIHN1cHBsaWVkIGJhc2ljX3N0cmVhbWJ1ZiBoYXMgYmVlbiB3cml0dGVuLgotICoKLSAqIEBsaSBUaGUgY29tcGxldGlvbl9jb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IHJldHVybnMgMC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIHN0cmVhbSdzCi0gKiBhc3luY193cml0ZV9zb21lIGZ1bmN0aW9uLCBhbmQgaXMga25vd24gYXMgYSA8ZW0+Y29tcG9zZWQgb3BlcmF0aW9uPC9lbT4uIFRoZQotICogcHJvZ3JhbSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBzdHJlYW0gcGVyZm9ybXMgbm8gb3RoZXIgd3JpdGUgb3BlcmF0aW9ucyAoc3VjaAotICogYXMgYXN5bmNfd3JpdGUsIHRoZSBzdHJlYW0ncyBhc3luY193cml0ZV9zb21lIGZ1bmN0aW9uLCBvciBhbnkgb3RoZXIgY29tcG9zZWQKLSAqIG9wZXJhdGlvbnMgdGhhdCBwZXJmb3JtIHdyaXRlcykgdW50aWwgdGhpcyBvcGVyYXRpb24gY29tcGxldGVzLgotICoKLSAqIEBwYXJhbSBzIFRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgQXN5bmNXcml0ZVN0cmVhbSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBiIEEgYmFzaWNfc3RyZWFtYnVmIG9iamVjdCBmcm9tIHdoaWNoIGRhdGEgd2lsbCBiZSB3cml0dGVuLiBPd25lcnNoaXAKLSAqIG9mIHRoZSBzdHJlYW1idWYgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCBpdAotICogcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QKLSAqIG11c3QgYmU6Ci0gKiBAY29kZSBzdGQ6OnNpemVfdCBjb21wbGV0aW9uX2NvbmRpdGlvbigKLSAqICAgLy8gUmVzdWx0IG9mIGxhdGVzdCBhc3luY193cml0ZV9zb21lIG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgc28gZmFyLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIEEgcmV0dXJuIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQQotICogbm9uLXplcm8gcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBvbgotICogdGhlIG5leHQgY2FsbCB0byB0aGUgc3RyZWFtJ3MgYXN5bmNfd3JpdGVfc29tZSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gKiBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLCAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICoKLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyB3cml0dGVuIGZyb20gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJzLiBJZiBhbiBlcnJvciBvY2N1cnJlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSBsZXNzIHRoYW4gdGhlIHN1bQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGJ1ZmZlciBzaXplcy4KLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbiBvZgotICogdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNXcml0ZVN0cmVhbSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZShBc3luY1dyaXRlU3RyZWFtJiBzLCBiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8qQH0qLwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2ltcGwvd3JpdGUuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19XUklURV9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93cml0ZV9hdC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8vd3JpdGVfYXQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWVkZDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby93cml0ZV9hdC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NzAgKzAsMCBAQAotLy8KLS8vIHdyaXRlX2F0LmhwcAotLy8gfn5+fn5+fn5+fn5+Ci0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2hyaXN0b3BoZXIgTS4gS29obGhvZmYgKGNocmlzIGF0IGtvaGxob2ZmIGRvdCBjb20pCi0vLwotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwotLy8gZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0vLwotCi0jaWZuZGVmIEFTSU9fV1JJVEVfQVRfSFBQCi0jZGVmaW5lIEFTSU9fV1JJVEVfQVRfSFBQCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLSMgcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTIwMCkKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL2NvbmZpZy5ocHAiCi0jaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlICJhc2lvL2FzeW5jX3Jlc3VsdC5ocHAiCi0jaW5jbHVkZSAiYXNpby9iYXNpY19zdHJlYW1idWZfZndkLmhwcCIKLSNpbmNsdWRlICJhc2lvL2RldGFpbC9jc3RkaW50LmhwcCIKLSNpbmNsdWRlICJhc2lvL2Vycm9yLmhwcCIKLQotI2luY2x1ZGUgImFzaW8vZGV0YWlsL3B1c2hfb3B0aW9ucy5ocHAiCi0KLW5hbWVzcGFjZSBhc2lvIHsKLQotLyoqCi0gKiBAZGVmZ3JvdXAgd3JpdGVfYXQgYXNpbzo6d3JpdGVfYXQKLSAqCi0gKiBAYnJpZWYgV3JpdGUgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGF0IGEgc3BlY2lmaWVkIG9mZnNldCBiZWZvcmUgcmV0dXJuaW5nLgotICovCi0vKkB7Ki8KLQotLy8vIFdyaXRlIGFsbCBvZiB0aGUgc3VwcGxpZWQgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBiZWZvcmUgcmV0dXJuaW5nLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGEgcmFuZG9tCi0gKiBhY2Nlc3MgZGV2aWNlIGF0IGEgc3BlY2lmaWVkIG9mZnNldC4gVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBBbGwgb2YgdGhlIGRhdGEgaW4gdGhlIHN1cHBsaWVkIGJ1ZmZlcnMgaGFzIGJlZW4gd3JpdHRlbi4gVGhhdCBpcywgdGhlCi0gKiBieXRlcyB0cmFuc2ZlcnJlZCBpcyBlcXVhbCB0byB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIHdyaXRlX3NvbWVfYXQgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGQgVGhlIGRldmljZSB0byB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSB3cml0dGVuLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UgY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuLgotICoKLSAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB3cml0dGVuLiBUaGUgc3VtCi0gKiBvZiB0aGUgYnVmZmVyIHNpemVzIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgdG8gdGhlCi0gKiBkZXZpY2UuCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KLSAqCi0gKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHdyaXRlIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAqIEBjb2RlIGFzaW86OndyaXRlX2F0KGQsIDQyLCBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSkpOyBAZW5kY29kZQotICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIG11bHRpcGxlCi0gKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICogc3RkOjp2ZWN0b3IuCi0gKgotICogQG5vdGUgVGhpcyBvdmVybG9hZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmc6Ci0gKiBAY29kZSBhc2lvOjp3cml0ZV9hdCgKLSAqICAgICBkLCBvZmZzZXQsIGJ1ZmZlcnMsCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYWxsKCkpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlPgotc3RkOjpzaXplX3Qgd3JpdGVfYXQoU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycyk7Ci0KLS8vLyBXcml0ZSBhbGwgb2YgdGhlIHN1cHBsaWVkIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYmVmb3JlIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBhIHJhbmRvbQotICogYWNjZXNzIGRldmljZSBhdCBhIHNwZWNpZmllZCBvZmZzZXQuIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9mIHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBidWZmZXJzIGhhcyBiZWVuIHdyaXR0ZW4uIFRoYXQgaXMsIHRoZQotICogYnl0ZXMgdHJhbnNmZXJyZWQgaXMgZXF1YWwgdG8gdGhlIHN1bSBvZiB0aGUgYnVmZmVyIHNpemVzLgotICoKLSAqIEBsaSBBbiBlcnJvciBvY2N1cnJlZC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIGRldmljZSdzCi0gKiB3cml0ZV9zb21lX2F0IGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBkIFRoZSBkZXZpY2UgdG8gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbi4KLSAqCi0gKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4gVGhlIHN1bQotICogb2YgdGhlIGJ1ZmZlciBzaXplcyBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoZQotICogZGV2aWNlLgotICoKLSAqIEBwYXJhbSBlYyBTZXQgdG8gaW5kaWNhdGUgd2hhdCBlcnJvciBvY2N1cnJlZCwgaWYgYW55LgotICoKLSAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUbyB3cml0ZSBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSBhc2lvOjp3cml0ZV9hdChkLCA0MiwKLSAqICAgICBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksIGVjKTsgQGVuZGNvZGUKLSAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gd3JpdGluZyBtdWx0aXBsZQotICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAqIHN0ZDo6dmVjdG9yLgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nOgotICogQGNvZGUgYXNpbzo6d3JpdGVfYXQoCi0gKiAgICAgZCwgb2Zmc2V0LCBidWZmZXJzLAotICogICAgIGFzaW86OnRyYW5zZmVyX2FsbCgpLCBlYyk7IEBlbmRjb2RlCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UsIHR5cGVuYW1lIENvbnN0QnVmZmVyU2VxdWVuY2U+Ci1zdGQ6OnNpemVfdCB3cml0ZV9hdChTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotLy8vIFdyaXRlIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBhdCBhIHNwZWNpZmllZCBvZmZzZXQgYmVmb3JlIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBhIHJhbmRvbQotICogYWNjZXNzIGRldmljZSBhdCBhIHNwZWNpZmllZCBvZmZzZXQuIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9mIHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBidWZmZXJzIGhhcyBiZWVuIHdyaXR0ZW4uIFRoYXQgaXMsIHRoZQotICogYnl0ZXMgdHJhbnNmZXJyZWQgaXMgZXF1YWwgdG8gdGhlIHN1bSBvZiB0aGUgYnVmZmVyIHNpemVzLgotICoKLSAqIEBsaSBUaGUgY29tcGxldGlvbl9jb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IHJldHVybnMgMC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIGRldmljZSdzCi0gKiB3cml0ZV9zb21lX2F0IGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBkIFRoZSBkZXZpY2UgdG8gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbi4KLSAqCi0gKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4gVGhlIHN1bQotICogb2YgdGhlIGJ1ZmZlciBzaXplcyBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoZQotICogZGV2aWNlLgotICoKLSAqIEBwYXJhbSBjb21wbGV0aW9uX2NvbmRpdGlvbiBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUKLSAqIHdoZXRoZXIgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gVGhlIHNpZ25hdHVyZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0Ci0gKiBtdXN0IGJlOgotICogQGNvZGUgc3RkOjpzaXplX3QgY29tcGxldGlvbl9jb25kaXRpb24oCi0gKiAgIC8vIFJlc3VsdCBvZiBsYXRlc3Qgd3JpdGVfc29tZV9hdCBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhci4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBBIHJldHVybiB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGUuIEEKLSAqIG5vbi16ZXJvIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gb24KLSAqIHRoZSBuZXh0IGNhbGwgdG8gdGhlIGRldmljZSdzIHdyaXRlX3NvbWVfYXQgZnVuY3Rpb24uCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KLSAqCi0gKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAqCi0gKiBAcGFyIEV4YW1wbGUKLSAqIFRvIHdyaXRlIGEgc2luZ2xlIGRhdGEgYnVmZmVyIHVzZSB0aGUgQHJlZiBidWZmZXIgZnVuY3Rpb24gYXMgZm9sbG93czoKLSAqIEBjb2RlIGFzaW86OndyaXRlX2F0KGQsIDQyLCBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYXRfbGVhc3QoMzIpKTsgQGVuZGNvZGUKLSAqIFNlZSB0aGUgQHJlZiBidWZmZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gd3JpdGluZyBtdWx0aXBsZQotICogYnVmZmVycyBpbiBvbmUgZ28sIGFuZCBob3cgdG8gdXNlIGl0IHdpdGggYXJyYXlzLCBib29zdDo6YXJyYXkgb3IKLSAqIHN0ZDo6dmVjdG9yLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24+Ci1zdGQ6OnNpemVfdCB3cml0ZV9hdChTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24pOwotCi0vLy8gV3JpdGUgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGF0IGEgc3BlY2lmaWVkIG9mZnNldCBiZWZvcmUgcmV0dXJuaW5nLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGEgcmFuZG9tCi0gKiBhY2Nlc3MgZGV2aWNlIGF0IGEgc3BlY2lmaWVkIG9mZnNldC4gVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBBbGwgb2YgdGhlIGRhdGEgaW4gdGhlIHN1cHBsaWVkIGJ1ZmZlcnMgaGFzIGJlZW4gd3JpdHRlbi4gVGhhdCBpcywgdGhlCi0gKiBieXRlcyB0cmFuc2ZlcnJlZCBpcyBlcXVhbCB0byB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKgotICogQGxpIFRoZSBjb21wbGV0aW9uX2NvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyAwLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIHdyaXRlX3NvbWVfYXQgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGQgVGhlIGRldmljZSB0byB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSB3cml0dGVuLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UgY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuLgotICoKLSAqIEBwYXJhbSBidWZmZXJzIE9uZSBvciBtb3JlIGJ1ZmZlcnMgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB3cml0dGVuLiBUaGUgc3VtCi0gKiBvZiB0aGUgYnVmZmVyIHNpemVzIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgdG8gdGhlCi0gKiBkZXZpY2UuCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QKLSAqIG11c3QgYmU6Ci0gKiBAY29kZSBzdGQ6OnNpemVfdCBjb21wbGV0aW9uX2NvbmRpdGlvbigKLSAqICAgLy8gUmVzdWx0IG9mIGxhdGVzdCB3cml0ZV9zb21lX2F0IG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgc28gZmFyLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIEEgcmV0dXJuIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQQotICogbm9uLXplcm8gcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBvbgotICogdGhlIG5leHQgY2FsbCB0byB0aGUgZGV2aWNlJ3Mgd3JpdGVfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJucyB0aGUgdG90YWwKLSAqIG51bWJlciBvZiBieXRlcyBzdWNjZXNzZnVsbHkgdHJhbnNmZXJyZWQgcHJpb3IgdG8gdGhlIGVycm9yLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24+Ci1zdGQ6OnNpemVfdCB3cml0ZV9hdChTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBDb25zdEJ1ZmZlclNlcXVlbmNlJiBidWZmZXJzLAotICAgIENvbXBsZXRpb25Db25kaXRpb24gY29tcGxldGlvbl9jb25kaXRpb24sIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8vLyBXcml0ZSBhbGwgb2YgdGhlIHN1cHBsaWVkIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYmVmb3JlIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBhIHJhbmRvbQotICogYWNjZXNzIGRldmljZSBhdCBhIHNwZWNpZmllZCBvZmZzZXQuIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9mIHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBiYXNpY19zdHJlYW1idWYgaGFzIGJlZW4gd3JpdHRlbi4KLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBkZXZpY2UncwotICogd3JpdGVfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZCBUaGUgZGV2aWNlIHRvIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4uIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4uCi0gKgotICogQHBhcmFtIGIgVGhlIGJhc2ljX3N0cmVhbWJ1ZiBvYmplY3QgZnJvbSB3aGljaCBkYXRhIHdpbGwgYmUgd3JpdHRlbi4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLgotICoKLSAqIEB0aHJvd3MgYXNpbzo6c3lzdGVtX2Vycm9yIFRocm93biBvbiBmYWlsdXJlLgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nOgotICogQGNvZGUgYXNpbzo6d3JpdGVfYXQoCi0gKiAgICAgZCwgNDIsIGIsCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYWxsKCkpOyBAZW5kY29kZQotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1zdGQ6OnNpemVfdCB3cml0ZV9hdChTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGQsCi0gICAgdWludDY0X3Qgb2Zmc2V0LCBiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYik7Ci0KLS8vLyBXcml0ZSBhbGwgb2YgdGhlIHN1cHBsaWVkIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgYmVmb3JlIHJldHVybmluZy4KLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdyaXRlIGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBhIHJhbmRvbQotICogYWNjZXNzIGRldmljZSBhdCBhIHNwZWNpZmllZCBvZmZzZXQuIFRoZSBjYWxsIHdpbGwgYmxvY2sgdW50aWwgb25lIG9mIHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBiYXNpY19zdHJlYW1idWYgaGFzIGJlZW4gd3JpdHRlbi4KLSAqCi0gKiBAbGkgQW4gZXJyb3Igb2NjdXJyZWQuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBkZXZpY2UncwotICogd3JpdGVfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZCBUaGUgZGV2aWNlIHRvIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4uIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIFN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4uCi0gKgotICogQHBhcmFtIGIgVGhlIGJhc2ljX3N0cmVhbWJ1ZiBvYmplY3QgZnJvbSB3aGljaCBkYXRhIHdpbGwgYmUgd3JpdHRlbi4KLSAqCi0gKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLgotICoKLSAqIEBub3RlIFRoaXMgb3ZlcmxvYWQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nOgotICogQGNvZGUgYXNpbzo6d3JpdGVfYXQoCi0gKiAgICAgZCwgNDIsIGIsCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYWxsKCksIGVjKTsgQGVuZGNvZGUKLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgdHlwZW5hbWUgQWxsb2NhdG9yPgotc3RkOjpzaXplX3Qgd3JpdGVfYXQoU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgYmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsCi0gICAgYXNpbzo6ZXJyb3JfY29kZSYgZWMpOwotCi0vLy8gV3JpdGUgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGF0IGEgc3BlY2lmaWVkIG9mZnNldCBiZWZvcmUgcmV0dXJuaW5nLgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGEgcmFuZG9tCi0gKiBhY2Nlc3MgZGV2aWNlIGF0IGEgc3BlY2lmaWVkIG9mZnNldC4gVGhlIGNhbGwgd2lsbCBibG9jayB1bnRpbCBvbmUgb2YgdGhlCi0gKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOgotICoKLSAqIEBsaSBBbGwgb2YgdGhlIGRhdGEgaW4gdGhlIHN1cHBsaWVkIGJhc2ljX3N0cmVhbWJ1ZiBoYXMgYmVlbiB3cml0dGVuLgotICoKLSAqIEBsaSBUaGUgY29tcGxldGlvbl9jb25kaXRpb24gZnVuY3Rpb24gb2JqZWN0IHJldHVybnMgMC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIGRldmljZSdzCi0gKiB3cml0ZV9zb21lX2F0IGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBkIFRoZSBkZXZpY2UgdG8gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbi4KLSAqCi0gKiBAcGFyYW0gYiBUaGUgYmFzaWNfc3RyZWFtYnVmIG9iamVjdCBmcm9tIHdoaWNoIGRhdGEgd2lsbCBiZSB3cml0dGVuLgotICoKLSAqIEBwYXJhbSBjb21wbGV0aW9uX2NvbmRpdGlvbiBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUKLSAqIHdoZXRoZXIgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gVGhlIHNpZ25hdHVyZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0Ci0gKiBtdXN0IGJlOgotICogQGNvZGUgc3RkOjpzaXplX3QgY29tcGxldGlvbl9jb25kaXRpb24oCi0gKiAgIC8vIFJlc3VsdCBvZiBsYXRlc3Qgd3JpdGVfc29tZV9hdCBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhci4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBBIHJldHVybiB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGUuIEEKLSAqIG5vbi16ZXJvIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gb24KLSAqIHRoZSBuZXh0IGNhbGwgdG8gdGhlIGRldmljZSdzIHdyaXRlX3NvbWVfYXQgZnVuY3Rpb24uCi0gKgotICogQHJldHVybnMgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZC4KLSAqCi0gKiBAdGhyb3dzIGFzaW86OnN5c3RlbV9lcnJvciBUaHJvd24gb24gZmFpbHVyZS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24+Ci1zdGQ6OnNpemVfdCB3cml0ZV9hdChTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UmIGQsIHVpbnQ2NF90IG9mZnNldCwKLSAgICBiYXNpY19zdHJlYW1idWY8QWxsb2NhdG9yPiYgYiwgQ29tcGxldGlvbkNvbmRpdGlvbiBjb21wbGV0aW9uX2NvbmRpdGlvbik7Ci0KLS8vLyBXcml0ZSBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0IGJlZm9yZSByZXR1cm5pbmcuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3cml0ZSBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdG8gYSByYW5kb20KLSAqIGFjY2VzcyBkZXZpY2UgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0LiBUaGUgY2FsbCB3aWxsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGUKLSAqIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIEFsbCBvZiB0aGUgZGF0YSBpbiB0aGUgc3VwcGxpZWQgYmFzaWNfc3RyZWFtYnVmIGhhcyBiZWVuIHdyaXR0ZW4uCi0gKgotICogQGxpIFRoZSBjb21wbGV0aW9uX2NvbmRpdGlvbiBmdW5jdGlvbiBvYmplY3QgcmV0dXJucyAwLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIHdyaXRlX3NvbWVfYXQgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIGQgVGhlIGRldmljZSB0byB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSB3cml0dGVuLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBTeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UgY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuLgotICoKLSAqIEBwYXJhbSBiIFRoZSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHdyaXR0ZW4uCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QKLSAqIG11c3QgYmU6Ci0gKiBAY29kZSBzdGQ6OnNpemVfdCBjb21wbGV0aW9uX2NvbmRpdGlvbigKLSAqICAgLy8gUmVzdWx0IG9mIGxhdGVzdCB3cml0ZV9zb21lX2F0IG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgc28gZmFyLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIEEgcmV0dXJuIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQQotICogbm9uLXplcm8gcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBvbgotICogdGhlIG5leHQgY2FsbCB0byB0aGUgZGV2aWNlJ3Mgd3JpdGVfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gZWMgU2V0IHRvIGluZGljYXRlIHdoYXQgZXJyb3Igb2NjdXJyZWQsIGlmIGFueS4KLSAqCi0gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJucyB0aGUgdG90YWwKLSAqIG51bWJlciBvZiBieXRlcyBzdWNjZXNzZnVsbHkgdHJhbnNmZXJyZWQgcHJpb3IgdG8gdGhlIGVycm9yLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBBbGxvY2F0b3IsCi0gICAgdHlwZW5hbWUgQ29tcGxldGlvbkNvbmRpdGlvbj4KLXN0ZDo6c2l6ZV90IHdyaXRlX2F0KFN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSYgZCwgdWludDY0X3Qgb2Zmc2V0LAotICAgIGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgIGFzaW86OmVycm9yX2NvZGUmIGVjKTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8qQH0qLwotLyoqCi0gKiBAZGVmZ3JvdXAgYXN5bmNfd3JpdGVfYXQgYXNpbzo6YXN5bmNfd3JpdGVfYXQKLSAqCi0gKiBAYnJpZWYgU3RhcnQgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB0byB3cml0ZSBhIGNlcnRhaW4gYW1vdW50IG9mIGRhdGEgYXQKLSAqIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICovCi0vKkB7Ki8KLQotLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gd3JpdGUgYWxsIG9mIHRoZSBzdXBwbGllZCBkYXRhIGF0IHRoZQotLy8vIHNwZWNpZmllZCBvZmZzZXQuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSB3cml0ZSBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mCi0gKiBkYXRhIHRvIGEgcmFuZG9tIGFjY2VzcyBkZXZpY2UgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0LiBUaGUgZnVuY3Rpb24gY2FsbAotICogYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuIFRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdpbGwgY29udGludWUgdW50aWwKLSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBidWZmZXJzIGhhcyBiZWVuIHdyaXR0ZW4uIFRoYXQgaXMsIHRoZQotICogYnl0ZXMgdHJhbnNmZXJyZWQgaXMgZXF1YWwgdG8gdGhlIHN1bSBvZiB0aGUgYnVmZmVyIHNpemVzLgotICoKLSAqIEBsaSBBbiBlcnJvciBvY2N1cnJlZC4KLSAqCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8gdGhlIGRldmljZSdzCi0gKiBhc3luY193cml0ZV9zb21lX2F0IGZ1bmN0aW9uLCBhbmQgaXMga25vd24gYXMgYSA8ZW0+Y29tcG9zZWQgb3BlcmF0aW9uPC9lbT4uCi0gKiBUaGUgcHJvZ3JhbSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBkZXZpY2UgcGVyZm9ybXMgbm8gPGVtPm92ZXJsYXBwaW5nPC9lbT4KLSAqIHdyaXRlIG9wZXJhdGlvbnMgKHN1Y2ggYXMgYXN5bmNfd3JpdGVfYXQsIHRoZSBkZXZpY2UncyBhc3luY193cml0ZV9zb21lX2F0Ci0gKiBmdW5jdGlvbiwgb3IgYW55IG90aGVyIGNvbXBvc2VkIG9wZXJhdGlvbnMgdGhhdCBwZXJmb3JtIHdyaXRlcykgdW50aWwgdGhpcwotICogb3BlcmF0aW9uIGNvbXBsZXRlcy4gT3BlcmF0aW9ucyBhcmUgb3ZlcmxhcHBpbmcgaWYgdGhlIHJlZ2lvbnMgZGVmaW5lZCBieQotICogdGhlaXIgb2Zmc2V0cywgYW5kIHRoZSBudW1iZXJzIG9mIGJ5dGVzIHRvIHdyaXRlLCBpbnRlcnNlY3QuCi0gKgotICogQHBhcmFtIGQgVGhlIGRldmljZSB0byB3aGljaCB0aGUgZGF0YSBpcyB0byBiZSB3cml0dGVuLiBUaGUgdHlwZSBtdXN0IHN1cHBvcnQKLSAqIHRoZSBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlIGNvbmNlcHQuCi0gKgotICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbi4KLSAqCi0gKiBAcGFyYW0gYnVmZmVycyBPbmUgb3IgbW9yZSBidWZmZXJzIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KLSAqIEFsdGhvdWdoIHRoZSBidWZmZXJzIG9iamVjdCBtYXkgYmUgY29waWVkIGFzIG5lY2Vzc2FyeSwgb3duZXJzaGlwIG9mIHRoZQotICogdW5kZXJseWluZyBtZW1vcnkgYmxvY2tzIGlzIHJldGFpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIG11c3QgZ3VhcmFudGVlCi0gKiB0aGF0IHRoZXkgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YKLSAqIHRoZSBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gZnJvbSB0aGUgYnVmZmVycy4gSWYgYW4gZXJyb3IKLSAqICAgLy8gb2NjdXJyZWQsIHRoaXMgd2lsbCBiZSBsZXNzIHRoYW4gdGhlIHN1bSBvZiB0aGUgYnVmZmVyIHNpemVzLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uIG9mCi0gKiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUbyB3cml0ZSBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZQotICogYXNpbzo6YXN5bmNfd3JpdGVfYXQoZCwgNDIsIGFzaW86OmJ1ZmZlcihkYXRhLCBzaXplKSwgaGFuZGxlcik7Ci0gKiBAZW5kY29kZQotICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIG11bHRpcGxlCi0gKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICogc3RkOjp2ZWN0b3IuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZV9hdChBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLCB1aW50NjRfdCBvZmZzZXQsCi0gICAgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBBU0lPX01PVkVfQVJHKFdyaXRlSGFuZGxlcikgaGFuZGxlcik7Ci0KLS8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHdyaXRlIGEgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBhdCB0aGUKLS8vLyBzcGVjaWZpZWQgb2Zmc2V0LgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgd3JpdGUgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZgotICogZGF0YSB0byBhIHJhbmRvbSBhY2Nlc3MgZGV2aWNlIGF0IGEgc3BlY2lmaWVkIG9mZnNldC4gVGhlIGZ1bmN0aW9uIGNhbGwKLSAqIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LiBUaGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aWxsIGNvbnRpbnVlIHVudGlsCi0gKiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIEFsbCBvZiB0aGUgZGF0YSBpbiB0aGUgc3VwcGxpZWQgYnVmZmVycyBoYXMgYmVlbiB3cml0dGVuLiBUaGF0IGlzLCB0aGUKLSAqIGJ5dGVzIHRyYW5zZmVycmVkIGlzIGVxdWFsIHRvIHRoZSBzdW0gb2YgdGhlIGJ1ZmZlciBzaXplcy4KLSAqCi0gKiBAbGkgVGhlIGNvbXBsZXRpb25fY29uZGl0aW9uIGZ1bmN0aW9uIG9iamVjdCByZXR1cm5zIDAuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBkZXZpY2UncwotICogYXN5bmNfd3JpdGVfc29tZV9hdCBmdW5jdGlvbiwgYW5kIGlzIGtub3duIGFzIGEgPGVtPmNvbXBvc2VkIG9wZXJhdGlvbjwvZW0+LgotICogVGhlIHByb2dyYW0gbXVzdCBlbnN1cmUgdGhhdCB0aGUgZGV2aWNlIHBlcmZvcm1zIG5vIDxlbT5vdmVybGFwcGluZzwvZW0+Ci0gKiB3cml0ZSBvcGVyYXRpb25zIChzdWNoIGFzIGFzeW5jX3dyaXRlX2F0LCB0aGUgZGV2aWNlJ3MgYXN5bmNfd3JpdGVfc29tZV9hdAotICogZnVuY3Rpb24sIG9yIGFueSBvdGhlciBjb21wb3NlZCBvcGVyYXRpb25zIHRoYXQgcGVyZm9ybSB3cml0ZXMpIHVudGlsIHRoaXMKLSAqIG9wZXJhdGlvbiBjb21wbGV0ZXMuIE9wZXJhdGlvbnMgYXJlIG92ZXJsYXBwaW5nIGlmIHRoZSByZWdpb25zIGRlZmluZWQgYnkKLSAqIHRoZWlyIG9mZnNldHMsIGFuZCB0aGUgbnVtYmVycyBvZiBieXRlcyB0byB3cml0ZSwgaW50ZXJzZWN0LgotICoKLSAqIEBwYXJhbSBkIFRoZSBkZXZpY2UgdG8gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgQXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4uCi0gKgotICogQHBhcmFtIGJ1ZmZlcnMgT25lIG9yIG1vcmUgYnVmZmVycyBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uCi0gKiBBbHRob3VnaCB0aGUgYnVmZmVycyBvYmplY3QgbWF5IGJlIGNvcGllZCBhcyBuZWNlc3NhcnksIG93bmVyc2hpcCBvZiB0aGUKLSAqIHVuZGVybHlpbmcgbWVtb3J5IGJsb2NrcyBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZQotICogdGhhdCB0aGV5IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gKgotICogQHBhcmFtIGNvbXBsZXRpb25fY29uZGl0aW9uIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gYmUgY2FsbGVkIHRvIGRldGVybWluZQotICogd2hldGhlciB0aGUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QKLSAqIG11c3QgYmU6Ci0gKiBAY29kZSBzdGQ6OnNpemVfdCBjb21wbGV0aW9uX2NvbmRpdGlvbigKLSAqICAgLy8gUmVzdWx0IG9mIGxhdGVzdCBhc3luY193cml0ZV9zb21lX2F0IG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgc28gZmFyLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIEEgcmV0dXJuIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4gQQotICogbm9uLXplcm8gcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBvbgotICogdGhlIG5leHQgY2FsbCB0byB0aGUgZGV2aWNlJ3MgYXN5bmNfd3JpdGVfc29tZV9hdCBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4KLSAqIENvcGllcyB3aWxsIGJlIG1hZGUgb2YgdGhlIGhhbmRsZXIgYXMgcmVxdWlyZWQuIFRoZSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlCi0gKiBoYW5kbGVyIG11c3QgYmU6Ci0gKiBAY29kZSB2b2lkIGhhbmRsZXIoCi0gKiAgIC8vIFJlc3VsdCBvZiBvcGVyYXRpb24uCi0gKiAgIGNvbnN0IGFzaW86OmVycm9yX2NvZGUmIGVycm9yLAotICoKLSAqICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gZnJvbSB0aGUgYnVmZmVycy4gSWYgYW4gZXJyb3IKLSAqICAgLy8gb2NjdXJyZWQsIHRoaXMgd2lsbCBiZSBsZXNzIHRoYW4gdGhlIHN1bSBvZiB0aGUgYnVmZmVyIHNpemVzLgotICogICBzdGQ6OnNpemVfdCBieXRlc190cmFuc2ZlcnJlZAotICogKTsgQGVuZGNvZGUKLSAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgb3IKLSAqIG5vdCwgdGhlIGhhbmRsZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uLiBJbnZvY2F0aW9uIG9mCi0gKiB0aGUgaGFuZGxlciB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIG1hbm5lciBlcXVpdmFsZW50IHRvIHVzaW5nCi0gKiBhc2lvOjppb19zZXJ2aWNlOjpwb3N0KCkuCi0gKgotICogQHBhciBFeGFtcGxlCi0gKiBUbyB3cml0ZSBhIHNpbmdsZSBkYXRhIGJ1ZmZlciB1c2UgdGhlIEByZWYgYnVmZmVyIGZ1bmN0aW9uIGFzIGZvbGxvd3M6Ci0gKiBAY29kZSBhc2lvOjphc3luY193cml0ZV9hdChkLCA0MiwKLSAqICAgICBhc2lvOjpidWZmZXIoZGF0YSwgc2l6ZSksCi0gKiAgICAgYXNpbzo6dHJhbnNmZXJfYXRfbGVhc3QoMzIpLAotICogICAgIGhhbmRsZXIpOyBAZW5kY29kZQotICogU2VlIHRoZSBAcmVmIGJ1ZmZlciBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIG11bHRpcGxlCi0gKiBidWZmZXJzIGluIG9uZSBnbywgYW5kIGhvdyB0byB1c2UgaXQgd2l0aCBhcnJheXMsIGJvb3N0OjphcnJheSBvcgotICogc3RkOjp2ZWN0b3IuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlLCB0eXBlbmFtZSBDb25zdEJ1ZmZlclNlcXVlbmNlLAotICAgIHR5cGVuYW1lIENvbXBsZXRpb25Db25kaXRpb24sIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZV9hdChBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLAotICAgIHVpbnQ2NF90IG9mZnNldCwgY29uc3QgQ29uc3RCdWZmZXJTZXF1ZW5jZSYgYnVmZmVycywKLSAgICBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKTsKLQotI2lmICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8vLyBTdGFydCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHRvIHdyaXRlIGFsbCBvZiB0aGUgc3VwcGxpZWQgZGF0YSBhdCB0aGUKLS8vLyBzcGVjaWZpZWQgb2Zmc2V0LgotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXN5bmNocm9ub3VzbHkgd3JpdGUgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZgotICogZGF0YSB0byBhIHJhbmRvbSBhY2Nlc3MgZGV2aWNlIGF0IGEgc3BlY2lmaWVkIG9mZnNldC4gVGhlIGZ1bmN0aW9uIGNhbGwKLSAqIGFsd2F5cyByZXR1cm5zIGltbWVkaWF0ZWx5LiBUaGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aWxsIGNvbnRpbnVlIHVudGlsCi0gKiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6Ci0gKgotICogQGxpIEFsbCBvZiB0aGUgZGF0YSBpbiB0aGUgc3VwcGxpZWQgYmFzaWNfc3RyZWFtYnVmIGhhcyBiZWVuIHdyaXR0ZW4uCi0gKgotICogQGxpIEFuIGVycm9yIG9jY3VycmVkLgotICoKLSAqIFRoaXMgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHplcm8gb3IgbW9yZSBjYWxscyB0byB0aGUgZGV2aWNlJ3MKLSAqIGFzeW5jX3dyaXRlX3NvbWVfYXQgZnVuY3Rpb24sIGFuZCBpcyBrbm93biBhcyBhIDxlbT5jb21wb3NlZCBvcGVyYXRpb248L2VtPi4KLSAqIFRoZSBwcm9ncmFtIG11c3QgZW5zdXJlIHRoYXQgdGhlIGRldmljZSBwZXJmb3JtcyBubyA8ZW0+b3ZlcmxhcHBpbmc8L2VtPgotICogd3JpdGUgb3BlcmF0aW9ucyAoc3VjaCBhcyBhc3luY193cml0ZV9hdCwgdGhlIGRldmljZSdzIGFzeW5jX3dyaXRlX3NvbWVfYXQKLSAqIGZ1bmN0aW9uLCBvciBhbnkgb3RoZXIgY29tcG9zZWQgb3BlcmF0aW9ucyB0aGF0IHBlcmZvcm0gd3JpdGVzKSB1bnRpbCB0aGlzCi0gKiBvcGVyYXRpb24gY29tcGxldGVzLiBPcGVyYXRpb25zIGFyZSBvdmVybGFwcGluZyBpZiB0aGUgcmVnaW9ucyBkZWZpbmVkIGJ5Ci0gKiB0aGVpciBvZmZzZXRzLCBhbmQgdGhlIG51bWJlcnMgb2YgYnl0ZXMgdG8gd3JpdGUsIGludGVyc2VjdC4KLSAqCi0gKiBAcGFyYW0gZCBUaGUgZGV2aWNlIHRvIHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHdyaXR0ZW4uIFRoZSB0eXBlIG11c3Qgc3VwcG9ydAotICogdGhlIEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UgY29uY2VwdC4KLSAqCi0gKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuLgotICoKLSAqIEBwYXJhbSBiIEEgYmFzaWNfc3RyZWFtYnVmIG9iamVjdCBmcm9tIHdoaWNoIGRhdGEgd2lsbCBiZSB3cml0dGVuLiBPd25lcnNoaXAKLSAqIG9mIHRoZSBzdHJlYW1idWYgaXMgcmV0YWluZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggbXVzdCBndWFyYW50ZWUgdGhhdCBpdAotICogcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgaGFuZGxlciBpcyBjYWxsZWQuCi0gKgotICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHdyaXRlIG9wZXJhdGlvbiBjb21wbGV0ZXMuCi0gKiBDb3BpZXMgd2lsbCBiZSBtYWRlIG9mIHRoZSBoYW5kbGVyIGFzIHJlcXVpcmVkLiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZQotICogaGFuZGxlciBtdXN0IGJlOgotICogQGNvZGUgdm9pZCBoYW5kbGVyKAotICogICAvLyBSZXN1bHQgb2Ygb3BlcmF0aW9uLgotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqCi0gKiAgIC8vIE51bWJlciBvZiBieXRlcyB3cml0dGVuIGZyb20gdGhlIGJ1ZmZlcnMuIElmIGFuIGVycm9yCi0gKiAgIC8vIG9jY3VycmVkLCB0aGlzIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSBzdW0gb2YgdGhlIGJ1ZmZlciBzaXplcy4KLSAqICAgc3RkOjpzaXplX3QgYnl0ZXNfdHJhbnNmZXJyZWQKLSAqICk7IEBlbmRjb2RlCi0gKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IG9yCi0gKiBub3QsIHRoZSBoYW5kbGVyIHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gSW52b2NhdGlvbiBvZgotICogdGhlIGhhbmRsZXIgd2lsbCBiZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgZXF1aXZhbGVudCB0byB1c2luZwotICogYXNpbzo6aW9fc2VydmljZTo6cG9zdCgpLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSwgdHlwZW5hbWUgQWxsb2NhdG9yLAotICAgIHR5cGVuYW1lIFdyaXRlSGFuZGxlcj4KLUFTSU9fSU5JVEZOX1JFU1VMVF9UWVBFKFdyaXRlSGFuZGxlciwKLSAgICB2b2lkIChhc2lvOjplcnJvcl9jb2RlLCBzdGQ6OnNpemVfdCkpCi1hc3luY193cml0ZV9hdChBc3luY1JhbmRvbUFjY2Vzc1dyaXRlRGV2aWNlJiBkLCB1aW50NjRfdCBvZmZzZXQsCi0gICAgYmFzaWNfc3RyZWFtYnVmPEFsbG9jYXRvcj4mIGIsIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKTsKLQotLy8vIFN0YXJ0IGFuIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gdG8gd3JpdGUgYSBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGF0IHRoZQotLy8vIHNwZWNpZmllZCBvZmZzZXQuCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhc3luY2hyb25vdXNseSB3cml0ZSBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIG9mCi0gKiBkYXRhIHRvIGEgcmFuZG9tIGFjY2VzcyBkZXZpY2UgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0LiBUaGUgZnVuY3Rpb24gY2FsbAotICogYWx3YXlzIHJldHVybnMgaW1tZWRpYXRlbHkuIFRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdpbGwgY29udGludWUgdW50aWwKLSAqIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKLSAqCi0gKiBAbGkgQWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzdXBwbGllZCBiYXNpY19zdHJlYW1idWYgaGFzIGJlZW4gd3JpdHRlbi4KLSAqCi0gKiBAbGkgVGhlIGNvbXBsZXRpb25fY29uZGl0aW9uIGZ1bmN0aW9uIG9iamVjdCByZXR1cm5zIDAuCi0gKgotICogVGhpcyBvcGVyYXRpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgemVybyBvciBtb3JlIGNhbGxzIHRvIHRoZSBkZXZpY2UncwotICogYXN5bmNfd3JpdGVfc29tZV9hdCBmdW5jdGlvbiwgYW5kIGlzIGtub3duIGFzIGEgPGVtPmNvbXBvc2VkIG9wZXJhdGlvbjwvZW0+LgotICogVGhlIHByb2dyYW0gbXVzdCBlbnN1cmUgdGhhdCB0aGUgZGV2aWNlIHBlcmZvcm1zIG5vIDxlbT5vdmVybGFwcGluZzwvZW0+Ci0gKiB3cml0ZSBvcGVyYXRpb25zIChzdWNoIGFzIGFzeW5jX3dyaXRlX2F0LCB0aGUgZGV2aWNlJ3MgYXN5bmNfd3JpdGVfc29tZV9hdAotICogZnVuY3Rpb24sIG9yIGFueSBvdGhlciBjb21wb3NlZCBvcGVyYXRpb25zIHRoYXQgcGVyZm9ybSB3cml0ZXMpIHVudGlsIHRoaXMKLSAqIG9wZXJhdGlvbiBjb21wbGV0ZXMuIE9wZXJhdGlvbnMgYXJlIG92ZXJsYXBwaW5nIGlmIHRoZSByZWdpb25zIGRlZmluZWQgYnkKLSAqIHRoZWlyIG9mZnNldHMsIGFuZCB0aGUgbnVtYmVycyBvZiBieXRlcyB0byB3cml0ZSwgaW50ZXJzZWN0LgotICoKLSAqIEBwYXJhbSBkIFRoZSBkZXZpY2UgdG8gd2hpY2ggdGhlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4gVGhlIHR5cGUgbXVzdCBzdXBwb3J0Ci0gKiB0aGUgQXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSBjb25jZXB0LgotICoKLSAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4uCi0gKgotICogQHBhcmFtIGIgQSBiYXNpY19zdHJlYW1idWYgb2JqZWN0IGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHdyaXR0ZW4uIE93bmVyc2hpcAotICogb2YgdGhlIHN0cmVhbWJ1ZiBpcyByZXRhaW5lZCBieSB0aGUgY2FsbGVyLCB3aGljaCBtdXN0IGd1YXJhbnRlZSB0aGF0IGl0Ci0gKiByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBoYW5kbGVyIGlzIGNhbGxlZC4KLSAqCi0gKiBAcGFyYW0gY29tcGxldGlvbl9jb25kaXRpb24gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lCi0gKiB3aGV0aGVyIHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdAotICogbXVzdCBiZToKLSAqIEBjb2RlIHN0ZDo6c2l6ZV90IGNvbXBsZXRpb25fY29uZGl0aW9uKAotICogICAvLyBSZXN1bHQgb2YgbGF0ZXN0IGFzeW5jX3dyaXRlX3NvbWVfYXQgb3BlcmF0aW9uLgotICogICBjb25zdCBhc2lvOjplcnJvcl9jb2RlJiBlcnJvciwKLSAqCi0gKiAgIC8vIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBzbyBmYXIuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogQSByZXR1cm4gdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBBCi0gKiBub24temVybyByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIG9uCi0gKiB0aGUgbmV4dCBjYWxsIHRvIHRoZSBkZXZpY2UncyBhc3luY193cml0ZV9zb21lX2F0IGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB3cml0ZSBvcGVyYXRpb24gY29tcGxldGVzLgotICogQ29waWVzIHdpbGwgYmUgbWFkZSBvZiB0aGUgaGFuZGxlciBhcyByZXF1aXJlZC4gVGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUKLSAqIGhhbmRsZXIgbXVzdCBiZToKLSAqIEBjb2RlIHZvaWQgaGFuZGxlcigKLSAqICAgLy8gUmVzdWx0IG9mIG9wZXJhdGlvbi4KLSAqICAgY29uc3QgYXNpbzo6ZXJyb3JfY29kZSYgZXJyb3IsCi0gKgotICogICAvLyBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBmcm9tIHRoZSBidWZmZXJzLiBJZiBhbiBlcnJvcgotICogICAvLyBvY2N1cnJlZCwgdGhpcyB3aWxsIGJlIGxlc3MgdGhhbiB0aGUgc3VtIG9mIHRoZSBidWZmZXIgc2l6ZXMuCi0gKiAgIHN0ZDo6c2l6ZV90IGJ5dGVzX3RyYW5zZmVycmVkCi0gKiApOyBAZW5kY29kZQotICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhc3luY2hyb25vdXMgb3BlcmF0aW9uIGNvbXBsZXRlcyBpbW1lZGlhdGVseSBvcgotICogbm90LCB0aGUgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24uIEludm9jYXRpb24gb2YKLSAqIHRoZSBoYW5kbGVyIHdpbGwgYmUgcGVyZm9ybWVkIGluIGEgbWFubmVyIGVxdWl2YWxlbnQgdG8gdXNpbmcKLSAqIGFzaW86OmlvX3NlcnZpY2U6OnBvc3QoKS4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIEFzeW5jUmFuZG9tQWNjZXNzV3JpdGVEZXZpY2UsIHR5cGVuYW1lIEFsbG9jYXRvciwKLSAgICB0eXBlbmFtZSBDb21wbGV0aW9uQ29uZGl0aW9uLCB0eXBlbmFtZSBXcml0ZUhhbmRsZXI+Ci1BU0lPX0lOSVRGTl9SRVNVTFRfVFlQRShXcml0ZUhhbmRsZXIsCi0gICAgdm9pZCAoYXNpbzo6ZXJyb3JfY29kZSwgc3RkOjpzaXplX3QpKQotYXN5bmNfd3JpdGVfYXQoQXN5bmNSYW5kb21BY2Nlc3NXcml0ZURldmljZSYgZCwgdWludDY0X3Qgb2Zmc2V0LAotICAgIGJhc2ljX3N0cmVhbWJ1ZjxBbGxvY2F0b3I+JiBiLCBDb21wbGV0aW9uQ29uZGl0aW9uIGNvbXBsZXRpb25fY29uZGl0aW9uLAotICAgIEFTSU9fTU9WRV9BUkcoV3JpdGVIYW5kbGVyKSBoYW5kbGVyKTsKLQotI2VuZGlmIC8vICFkZWZpbmVkKEFTSU9fTk9fSU9TVFJFQU0pCi0KLS8qQH0qLwotCi19IC8vIG5hbWVzcGFjZSBhc2lvCi0KLSNpbmNsdWRlICJhc2lvL2RldGFpbC9wb3Bfb3B0aW9ucy5ocHAiCi0KLSNpbmNsdWRlICJhc2lvL2ltcGwvd3JpdGVfYXQuaHBwIgotCi0jZW5kaWYgLy8gQVNJT19XUklURV9BVF9IUFAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby95aWVsZC5ocHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYXNpby9pbmNsdWRlL2FzaW8veWllbGQuaHBwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2Y1ZDZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9hc2lvL2luY2x1ZGUvYXNpby95aWVsZC5ocHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLwotLy8geWllbGQuaHBwCi0vLyB+fn5+fn5+fn4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDaHJpc3RvcGhlciBNLiBLb2hsaG9mZiAoY2hyaXMgYXQga29obGhvZmYgZG90IGNvbSkKLS8vCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi0vLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLS8vCi0KLSNpbmNsdWRlICJjb3JvdXRpbmUuaHBwIgotCi0jaWZuZGVmIHJlZW50ZXIKLSMgZGVmaW5lIHJlZW50ZXIoYykgQVNJT19DT1JPX1JFRU5URVIoYykKLSNlbmRpZgotCi0jaWZuZGVmIHlpZWxkCi0jIGRlZmluZSB5aWVsZCBBU0lPX0NPUk9fWUlFTEQKLSNlbmRpZgotCi0jaWZuZGVmIGZvcmsKLSMgZGVmaW5lIGZvcmsgQVNJT19DT1JPX0ZPUksKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2J1aWxkL0J1aWxkIEFMTC5sYXVuY2ggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYnVpbGQvQnVpbGQgQUxMLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwNWViZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvYnVpbGQvQnVpbGQgQUxMLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLlByb2dyYW1MYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3dvcmtpbmdfc2V0OiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsmIzEwOyZsdDtyZXNvdXJjZXMmZ3Q7JiMxMDsmbHQ7aXRlbSBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyJnF1b3Q7IHR5cGU9JnF1b3Q7NCZxdW90Oy8mZ3Q7JiMxMDsmbHQ7L3Jlc291cmNlcyZndDt9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xBVU5DSF9DT05GSUdVUkFUSU9OX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHtub25lfSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2J1aWxkL2J1aWxkX2FsbC5zaH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfVE9PTF9BUkdVTUVOVFMiIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlcn0gJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyfSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2J1aWxkfSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2J1aWxkL2J1aWxkX2FsbC5zaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9idWlsZC9idWlsZF9hbGwuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1NjVlN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2J1aWxkL2J1aWxkX2FsbC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0jIS9iaW4vYmFzaAotCi0jIGV4IDogYnVpbGRfYWxsLnNoIC4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyIC4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS5leHBvcnRlciAKLSNQYXRoIGNhbiBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZQotCi0KLVdSQVBQRVJfUFJPSj0kMQotRVhQT1JURVJfUFJPSj0kMgotCi1pZiBbWyAhKCIkV1JBUFBFUl9QUk9KIiA9IC8qKSBdXTsgdGhlbgotV1JBUFBFUl9QUk9KPSRQV0QvJFdSQVBQRVJfUFJPSgotZmkKLQotaWYgW1sgISgiJEVYUE9SVEVSX1BST0oiID0gLyopIF1dOyB0aGVuCi1FWFBPUlRFUl9QUk9KPSRQV0QvJEVYUE9SVEVSX1BST0oKLWZpCi0KLQotVE1QRElSPWBta3RlbXAgLWRgCi1lY2hvICJjb21waWxpbmcgaW4gdGVtcCBkaXJlY3RvcnkgPSAkVE1QRElSIgotTElOMzJfVE1QRElSPSIkVE1QRElSL0xJTjMyIgotTElONjRfVE1QRElSPSIkVE1QRElSL0xJTjY0IgotV0lONjRfVE1QRElSPSIkVE1QRElSL1dJTjY0IgotCi1ta2RpciAkTElOMzJfVE1QRElSICRMSU42NF9UTVBESVIgICRXSU42NF9UTVBESVIKLQotCi1MSUJfTkFNRT0ibGliZm11d3JhcHBlciIKLUNPTU1PTl9DT01QX09QVFM9Ii1EQVNJT19TVEFOREFMT05FIC1wdGhyZWFkIC1zdGQ9YysrMTEgLU8zIC1XYWxsIC1jIC1mbWVzc2FnZS1sZW5ndGg9MCIKLUNPTU1PTl9MSU5LX09QVFM9Ii1zaGFyZWQgLXB0aHJlYWQgLXN0ZD1jKysxMSIKLQotSU5DTFVERT0iLUkkV1JBUFBFUl9QUk9KL2FzaW8vaW5jbHVkZSAtSSRXUkFQUEVSX1BST0ovZm1pIC1JJFdSQVBQRVJfUFJPSi9yYXBpZGpzb24vaW5jbHVkZSAtSSRXUkFQUEVSX1BST0ovZm11d3JhcHBlci9pbmNsdWRlIgotCi1DUFBfSU5QVVRTPSIkV1JBUFBFUl9QUk9KL2ZtdXdyYXBwZXIvc3JjLyouY3BwIgotCi1MSU42NF9DT01QX09QVFM9Ii1mcGljIgotTElOMzJfQ09NUF9PUFRTPSItZnBpYyAtbTMyIgotV0lONjRfQ09NUF9PUFRTPSIgLURBU0lPX1NUQU5EQUxPTkUgLURfX05PX0lOTElORV9fIC1EX1dJTjMyX1dJTk5UPTB4MDUwMSIKLQotTElOMzJfTElOS19PUFRTPSItbTMyIgotTElONjRfTElOS19PUFRTPSIiCi1XSU42NF9MSU5LX09QVFM9Ii1zdGF0aWMtbGliZ2NjIC1zdGF0aWMtbGlic3RkYysrIgotV0lONjRfTElOS19MSUJTPSItbHdzMl8zMiAtc3RhdGljIC1scHRocmVhZCIKLQotI0xJTlVYIDMyIGJpdHMgY29tcGlsYXRpb24KLXByaW50ZiAiXG5cbj09PT09PT09PT09PUxpbnV4IDMyIGNvbXBpbGF0aW9uPT09PT09PT09PT09PSIKLWNkICRMSU4zMl9UTVBESVIKLQotQ09NUF9DT01NQU5EX0xJTjMyPSJnKysgJENPTU1PTl9DT01QX09QVFMgJExJTjMyX0NPTVBfT1BUUyAkSU5DTFVERSAgJENQUF9JTlBVVFMiCi1wcmludGYgIlxuXG4kQ09NUF9DT01NQU5EX0xJTjMyIFxuIgotJENPTVBfQ09NTUFORF9MSU4zMgotCi1MSU5LX0NPTU1BTkRfTElOMzI9ImcrKyAkQ09NTU9OX0xJTktfT1BUUyAkTElOMzJfTElOS19PUFRTIC1vICRMSUJfTkFNRS5zbyAqLm8iCi1wcmludGYgIlxuXG4kTElOS19DT01NQU5EX0xJTjMyIFxuIgotJExJTktfQ09NTUFORF9MSU4zMgotCi1pZiBbICEgLWYgJExJQl9OQU1FLnNvIF0gCi10aGVuCi1wcmludGYgIkVSUk9SIDogZmFpbGVkIHRvIGNvbXBpbGUgTGludXgzMiBiaXRzIEZNVSBXcmFwcGVyIGxpYnJhcnkgXG4iIAotZXhpdCAxCi1maQotCi1jcCAtZiAkTElCX05BTUUuc28gJEVYUE9SVEVSX1BST0ovcmVzb3VyY2VzL2xpbnV4MzIvCi0KLQotI0xJTlVYIDY0IGJpdHMgY29tcGlsYXRpb24KLXByaW50ZiAiXG5cbj09PT09PT09PT09PUxpbnV4IDY0IGNvbXBpbGF0aW9uPT09PT09PT09PT09PSIKLQotY2QgJExJTjY0X1RNUERJUgotQ09NUF9DT01NQU5EX0xJTjY0PSJnKysgJENPTU1PTl9DT01QX09QVFMgJExJTjY0X0NPTVBfT1BUUyAkSU5DTFVERSAgJENQUF9JTlBVVFMiCi1wcmludGYgIlxuXG4kQ09NUF9DT01NQU5EX0xJTjY0IFxuIgotJENPTVBfQ09NTUFORF9MSU42NAotCi1MSU5LX0NPTU1BTkRfTElONjQ9ImcrKyAkQ09NTU9OX0xJTktfT1BUUyAkTElONjRfTElOS19PUFRTIC1vICRMSUJfTkFNRS5zbyAqLm8iCi1wcmludGYgIlxuXG4kTElOS19DT01NQU5EX0xJTjY0IFxuIgotJExJTktfQ09NTUFORF9MSU42NAotCi1pZiBbICEgLWYgJExJQl9OQU1FLnNvIF0gCi10aGVuCi1wcmludGYgIkVSUk9SIDogZmFpbGVkIHRvIGNvbXBpbGUgTGludXg2NCBiaXRzIEZNVSBXcmFwcGVyIGxpYnJhcnlcbiIgCi1leGl0IDEKLWZpCi0KLWNwIC1mICRMSUJfTkFNRS5zbyAkRVhQT1JURVJfUFJPSi9yZXNvdXJjZXMvbGludXg2NC8KLQotI1dJTkRPV1MgNjQgYml0cyBjb21waWxhdGlvbgotcHJpbnRmICJcblxuPT09PT09PT09PT09V2luZG93cyA2NCBjb21waWxhdGlvbj09PT09PT09PT09PT0iCi0KLWNkICRXSU42NF9UTVBESVIKLUNPTVBfQ09NTUFORF9XSU42ND0ieDg2XzY0LXc2NC1taW5ndzMyLWcrKyAkQ09NTU9OX0NPTVBfT1BUUyAkV0lONjRfQ09NUF9PUFRTICRJTkNMVURFICAkQ1BQX0lOUFVUUyIKLXByaW50ZiAiXG5cbiRDT01QX0NPTU1BTkRfV0lONjQiCi0kQ09NUF9DT01NQU5EX1dJTjY0Ci0KLUxJTktfQ09NTUFORF9XSU42ND0ieDg2XzY0LXc2NC1taW5ndzMyLWcrKyAkQ09NTU9OX0xJTktfT1BUUyAkV0lONjRfTElOS19PUFRTIC1vICRMSUJfTkFNRS5kbGwgKi5vICRXSU42NF9MSU5LX0xJQlMiCi1wcmludGYgIlxuXG4kTElOS19DT01NQU5EX1dJTjY0IFxuIgotJExJTktfQ09NTUFORF9XSU42NAotCi1pZiBbICEgLWYgJExJQl9OQU1FLmRsbCBdIAotdGhlbgotcHJpbnRmICJFUlJPUiA6IGZhaWxlZCB0byBjb21waWxlIFdpbmRvd3MgNjQgYml0cyBGTVUgV3JhcHBlciBsaWJyYXJ5IFxuIiAKLWV4aXQgMQotZmkKLQotY3AgLWYgJExJQl9OQU1FLmRsbCAkRVhQT1JURVJfUFJPSi9yZXNvdXJjZXMvd2luNjQvCi0KLQotcHJpbnRmICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gQ29tcGlsYXRpb24gc3VjY2VzcyEgOikgXG5cblxuIgotcm0gLXJmICRUTVBESVIKLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbWkvZm1pMkZ1bmN0aW9uVHlwZXMuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbWkvZm1pMkZ1bmN0aW9uVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlMzkzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvZm1pL2ZtaTJGdW5jdGlvblR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotI2lmbmRlZiBmbWkyRnVuY3Rpb25UeXBlc19oCi0jZGVmaW5lIGZtaTJGdW5jdGlvblR5cGVzX2gKLQotI2luY2x1ZGUgImZtaTJUeXBlc1BsYXRmb3JtLmgiCi0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgbXVzdCBiZSB1dGlsaXplZCB3aGVuIGNvbXBpbGluZyBhbiBGTVUgb3IgYW4gRk1JIG1hc3Rlci4KLSAgIEl0IGRlY2xhcmVzIGRhdGEgYW5kIGZ1bmN0aW9uIHR5cGVzIGZvciBGTUkgMi4wCi0KLSAgIFJldmlzaW9uczoKLSAgIC0gQXByLiAgOSwgMjAxNDogYWxsIHByZWZpeGVzICJmbWkiIHJlbmFtZWQgdG8gImZtaTIiIChkZWNpc2lvbiBmcm9tIEFwcmlsIDgpCi0gICAtIEFwci4gIDMsIDIwMTQ6IEFkZGVkICNpbmNsdWRlIDxzdGRkZWYuaD4gZm9yIHNpemVfdCBkZWZpbml0aW9uCi0gICAtIE1hci4gMjcsIDIwMTQ6IEFkZGVkICNpbmNsdWRlICJmbWlUeXBlc1BsYXRmb3JtLmgiICgjMTc5KQotICAgLSBNYXIuIDI2LCAyMDE0OiBJbnRyb2R1Y2VkIGZ1bmN0aW9uIGFyZ3VtZW50ICJ2b2lkIiBmb3IgdGhlIGZ1bmN0aW9ucyAoIzE3MSkKLSAgICAgICAgICAgICAgICAgICAgICBmbWlHZXRUeXBlc1BsYXRmb3JtVFlQRSBhbmQgZm1pR2V0VmVyc2lvblRZUEUKLSAgIC0gT2N0LiAxMSwgMjAxMzogRnVuY3Rpb25zIG9mIE1vZGVsRXhjaGFuZ2UgYW5kIENvU2ltdWxhdGlvbiBtZXJnZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgZm1pSW5zdGFudGlhdGVNb2RlbFRZUEUgLCBmbWlJbnN0YW50aWF0ZVNsYXZlVFlQRSAgLT4gZm1pSW5zdGFudGlhdGVUWVBFCi0gICAgICAgICAgICAgICAgICAgICAgZm1pRnJlZU1vZGVsSW5zdGFuY2VUWVBFLCBmbWlGcmVlU2xhdmVJbnN0YW5jZVRZUEUgLT4gZm1pRnJlZUluc3RhbmNlVFlQRQotICAgICAgICAgICAgICAgICAgICAgIGZtaUVudGVyTW9kZWxJbml0aWFsaXphdGlvbk1vZGVUWVBFLCBmbWlFbnRlclNsYXZlSW5pdGlhbGl6YXRpb25Nb2RlVFlQRSAtPiBmbWlFbnRlckluaXRpYWxpemF0aW9uTW9kZVRZUEUKLSAgICAgICAgICAgICAgICAgICAgICBmbWlFeGl0TW9kZWxJbml0aWFsaXphdGlvbk1vZGVUWVBFICwgZm1pRXhpdFNsYXZlSW5pdGlhbGl6YXRpb25Nb2RlVFlQRSAgLT4gZm1pRXhpdEluaXRpYWxpemF0aW9uTW9kZVRZUEUKLSAgICAgICAgICAgICAgICAgICAgICBmbWlUZXJtaW5hdGVNb2RlbFRZUEUgLCBmbWlUZXJtaW5hdGVTbGF2ZVRZUEUgIC0+IGZtaVRlcm1pbmF0ZQotICAgICAgICAgICAgICAgICAgICAgIGZtaVJlc2V0U2xhdmUgLT4gZm1pUmVzZXQgKG5vdyBhbHNvIGZvciBNb2RlbEV4Y2hhbmdlIGFuZCBub3Qgb25seSBmb3IgQ29TaW11bGF0aW9uKQotICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMgcmVuYW1lZAotICAgICAgICAgICAgICAgICAgICAgIGZtaVVwZGF0ZURpc2NyZXRlU3RhdGVzVFlQRSAtPiBmbWlOZXdEaXNjcmV0ZVN0YXRlc1RZUEUKLSAgICAgICAgICAgICAgICAgICAgUmVuYW1lZCBlbGVtZW50cyBvZiB0aGUgZW51bWVyYXRpb24gZm1pRXZlbnRJbmZvCi0gICAgICAgICAgICAgICAgICAgICAgdXBjb21pbmdUaW1lRXZlbnQgICAgICAgICAgICAgLT4gbmV4dEV2ZW50VGltZURlZmluZWQgLy8gZHVlIHRvIGdlbmVyaWMgbmFtaW5nIHNjaGVtZTogdmFyRGVmaW5lZCArIHZhcgotICAgICAgICAgICAgICAgICAgICAgIG5ld1VwZGF0ZURpc2NyZXRlU3RhdGVzTmVlZGVkIC0+IG5ld0Rpc2NyZXRlU3RhdGVzTmVlZGVkOwotICAgLSBKdW5lIDEzLCAyMDEzOiBDaGFuZ2VkIHR5cGUgZm1pRXZlbnRJbmZvCi0gICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyByZW1vdmVkOgotICAgICAgICAgICAgICAgICAgICAgICBmbWlJbml0aWFsaXplTW9kZWxUWVBFCi0gICAgICAgICAgICAgICAgICAgICAgIGZtaUV2ZW50VXBkYXRlVFlQRQotICAgICAgICAgICAgICAgICAgICAgICBmbWlDb21wbGV0ZWRFdmVudEl0ZXJhdGlvblRZUEUKLSAgICAgICAgICAgICAgICAgICAgICAgZm1pSW5pdGlhbGl6ZVNsYXZlVFlQRQotICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMgYWRkZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIGZtaUVudGVyTW9kZWxJbml0aWFsaXphdGlvbk1vZGVUWVBFCi0gICAgICAgICAgICAgICAgICAgICAgIGZtaUV4aXRNb2RlbEluaXRpYWxpemF0aW9uTW9kZVRZUEUKLSAgICAgICAgICAgICAgICAgICAgICAgZm1pRW50ZXJFdmVudE1vZGVUWVBFCi0gICAgICAgICAgICAgICAgICAgICAgIGZtaVVwZGF0ZURpc2NyZXRlU3RhdGVzVFlQRQotICAgICAgICAgICAgICAgICAgICAgICBmbWlFbnRlckNvbnRpbnVvdXNUaW1lTW9kZVRZUEUKLSAgICAgICAgICAgICAgICAgICAgICAgZm1pRW50ZXJTbGF2ZUluaXRpYWxpemF0aW9uTW9kZVRZUEU7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZtaUV4aXRTbGF2ZUluaXRpYWxpemF0aW9uTW9kZVRZUEU7Ci0gICAtIEZlYi4gMTcsIDIwMTM6IEFkZGVkIHRoaXJkIGFyZ3VtZW50IHRvIGZtaUNvbXBsZXRlZEludGVncmF0b3JTdGVwVFlQRQotICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkIGZ1bmN0aW9uIG5hbWUgImZtaVRlcm1pbmF0ZVR5cGUiIHRvICJmbWlUZXJtaW5hdGVNb2RlbFR5cGUiIChkdWUgdG8gIzExMykKLSAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZCBmdW5jdGlvbiBuYW1lICJmbWlHZXROb21pbmFsQ29udGludW91c1N0YXRlVFlQRSIgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbWlHZXROb21pbmFsc09mQ29udGludW91c1N0YXRlc1RZUEUiCi0gICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgZm1pR2V0U3RhdGVWYWx1ZVJlZmVyZW5jZXNUWVBFLgotICAgLSBOb3YuIDE0LCAyMDExOiBGaXJzdCBwdWJsaWMgVmVyc2lvbgotCi0KLSAgIENvcHlyaWdodCDvv70gMjAxMSBNT0RFTElTQVIgY29uc29ydGl1bSwKLSAgICAgICAgICAgICAgIDIwMTItMjAxMyBNb2RlbGljYSBBc3NvY2lhdGlvbiBQcm9qZWN0ICJGTUkiCi0gICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyB1bmRlciB0aGUgQlNEIDItQ2xhdXNlIExpY2Vuc2UKLSAgIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwpOgotCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICAgLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cwotICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0gICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECi0gICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICAgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IKLSAgIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICAgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci0gICBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi0gICBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gICBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgd2l0aCB0aGUgZXh0ZW5zaW9uOgotCi0gICBZb3UgbWF5IGRpc3RyaWJ1dGUgb3IgcHVibGljbHkgcGVyZm9ybSBhbnkgbW9kaWZpY2F0aW9uIG9ubHkgdW5kZXIgdGhlCi0gICB0ZXJtcyBvZiB0aGlzIGxpY2Vuc2UuCi0gICAoTm90ZSwgdGhpcyBtZWFucyB0aGF0IGlmIHlvdSBkaXN0cmlidXRlIGEgbW9kaWZpZWQgZmlsZSwKLSAgICB0aGUgbW9kaWZpZWQgZmlsZSBtdXN0IGFsc28gYmUgcHJvdmlkZWQgdW5kZXIgdGhpcyBsaWNlbnNlKS4KLSovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogbWFrZSBzdXJlIGFsbCBjb21waWxlciB1c2UgdGhlIHNhbWUgYWxpZ25tZW50IHBvbGljaWVzIGZvciBzdHJ1Y3R1cmVzICovCi0jaWYgZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fR05VQ19fCi0jcHJhZ21hIHBhY2socHVzaCw4KQotI2VuZGlmCi0KLS8qIEluY2x1ZGUgc3RkZGVmLmgsIGluIG9yZGVyIHRoYXQgc2l6ZV90IGV0Yy4gaXMgZGVmaW5lZCAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0KLS8qIFR5cGUgZGVmaW5pdGlvbnMgKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgZm1pMk9LLAotICAgIGZtaTJXYXJuaW5nLAotICAgIGZtaTJEaXNjYXJkLAotICAgIGZtaTJFcnJvciwKLSAgICBmbWkyRmF0YWwsCi0gICAgZm1pMlBlbmRpbmcKLX0gZm1pMlN0YXR1czsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBmbWkyTW9kZWxFeGNoYW5nZSwKLSAgICBmbWkyQ29TaW11bGF0aW9uCi19IGZtaTJUeXBlOwotCi10eXBlZGVmIGVudW0gewotICAgIGZtaTJEb1N0ZXBTdGF0dXMsCi0gICAgZm1pMlBlbmRpbmdTdGF0dXMsCi0gICAgZm1pMkxhc3RTdWNjZXNzZnVsVGltZSwKLSAgICBmbWkyVGVybWluYXRlZAotfSBmbWkyU3RhdHVzS2luZDsKLQotdHlwZWRlZiB2b2lkICAgICAgKCpmbWkyQ2FsbGJhY2tMb2dnZXIpICAgICAgICAoZm1pMkNvbXBvbmVudEVudmlyb25tZW50LCBmbWkyU3RyaW5nLCBmbWkyU3RhdHVzLCBmbWkyU3RyaW5nLCBmbWkyU3RyaW5nLCAuLi4pOwotdHlwZWRlZiB2b2lkKiAgICAgKCpmbWkyQ2FsbGJhY2tBbGxvY2F0ZU1lbW9yeSkoc2l6ZV90LCBzaXplX3QpOwotdHlwZWRlZiB2b2lkICAgICAgKCpmbWkyQ2FsbGJhY2tGcmVlTWVtb3J5KSAgICAodm9pZCopOwotdHlwZWRlZiB2b2lkICAgICAgKCpmbWkyU3RlcEZpbmlzaGVkKSAgICAgICAgICAoZm1pMkNvbXBvbmVudEVudmlyb25tZW50LCBmbWkyU3RhdHVzKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgY29uc3QgZm1pMkNhbGxiYWNrTG9nZ2VyICAgICAgICAgbG9nZ2VyOwotICAgY29uc3QgZm1pMkNhbGxiYWNrQWxsb2NhdGVNZW1vcnkgYWxsb2NhdGVNZW1vcnk7Ci0gICBjb25zdCBmbWkyQ2FsbGJhY2tGcmVlTWVtb3J5ICAgICBmcmVlTWVtb3J5OwotICAgY29uc3QgZm1pMlN0ZXBGaW5pc2hlZCAgICAgICAgICAgc3RlcEZpbmlzaGVkOwotICAgY29uc3QgZm1pMkNvbXBvbmVudEVudmlyb25tZW50ICAgY29tcG9uZW50RW52aXJvbm1lbnQ7Ci19IGZtaTJDYWxsYmFja0Z1bmN0aW9uczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCSBmbWkyQm9vbGVhbiBuZXdEaXNjcmV0ZVN0YXRlc05lZWRlZDsKLSAgIGZtaTJCb29sZWFuIHRlcm1pbmF0ZVNpbXVsYXRpb247Ci0gICBmbWkyQm9vbGVhbiBub21pbmFsc09mQ29udGludW91c1N0YXRlc0NoYW5nZWQ7Ci0gICBmbWkyQm9vbGVhbiB2YWx1ZXNPZkNvbnRpbnVvdXNTdGF0ZXNDaGFuZ2VkOwotICAgZm1pMkJvb2xlYW4gbmV4dEV2ZW50VGltZURlZmluZWQ7Ci0gICBmbWkyUmVhbCAgICBuZXh0RXZlbnRUaW1lOwotfSBmbWkyRXZlbnRJbmZvOwotCi0KLS8qIHJlc2V0IGFsaWdubWVudCBwb2xpY3kgdG8gdGhlIG9uZSBzZXQgYmVmb3JlIHJlYWRpbmcgdGhpcyBmaWxlICovCi0jaWYgZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fR05VQ19fCi0jcHJhZ21hIHBhY2socG9wKQotI2VuZGlmCi0KLQotLyogRGVmaW5lIGZtaTIgZnVuY3Rpb24gcG9pbnRlciB0eXBlcyB0byBzaW1wbGlmeSBkeW5hbWljIGxvYWRpbmcgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotVHlwZXMgZm9yIENvbW1vbiBGdW5jdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIElucXVpcmUgdmVyc2lvbiBudW1iZXJzIG9mIGhlYWRlciBmaWxlcyBhbmQgc2V0dGluZyBsb2dnaW5nIHN0YXR1cyAqLwotICAgdHlwZWRlZiBjb25zdCBjaGFyKiBmbWkyR2V0VHlwZXNQbGF0Zm9ybVRZUEUodm9pZCk7Ci0gICB0eXBlZGVmIGNvbnN0IGNoYXIqIGZtaTJHZXRWZXJzaW9uVFlQRSh2b2lkKTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyAgZm1pMlNldERlYnVnTG9nZ2luZ1RZUEUoZm1pMkNvbXBvbmVudCwgZm1pMkJvb2xlYW4sIHNpemVfdCwgY29uc3QgZm1pMlN0cmluZ1tdKTsKLQotLyogQ3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIG9mIEZNVSBpbnN0YW5jZXMgYW5kIHNldHRpbmcgZGVidWcgc3RhdHVzICovCi0gICB0eXBlZGVmIGZtaTJDb21wb25lbnQgZm1pMkluc3RhbnRpYXRlVFlQRSAoZm1pMlN0cmluZywgZm1pMlR5cGUsIGZtaTJTdHJpbmcsIGZtaTJTdHJpbmcsIGNvbnN0IGZtaTJDYWxsYmFja0Z1bmN0aW9ucyosIGZtaTJCb29sZWFuLCBmbWkyQm9vbGVhbik7Ci0gICB0eXBlZGVmIHZvaWQgICAgICAgICAgZm1pMkZyZWVJbnN0YW5jZVRZUEUoZm1pMkNvbXBvbmVudCk7Ci0KLS8qIEVudGVyIGFuZCBleGl0IGluaXRpYWxpemF0aW9uIG1vZGUsIHRlcm1pbmF0ZSBhbmQgcmVzZXQgKi8KLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyU2V0dXBFeHBlcmltZW50VFlQRSAgICAgICAgKGZtaTJDb21wb25lbnQsIGZtaTJCb29sZWFuLCBmbWkyUmVhbCwgZm1pMlJlYWwsIGZtaTJCb29sZWFuLCBmbWkyUmVhbCk7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMkVudGVySW5pdGlhbGl6YXRpb25Nb2RlVFlQRShmbWkyQ29tcG9uZW50KTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyRXhpdEluaXRpYWxpemF0aW9uTW9kZVRZUEUgKGZtaTJDb21wb25lbnQpOwotICAgdHlwZWRlZiBmbWkyU3RhdHVzIGZtaTJUZXJtaW5hdGVUWVBFICAgICAgICAgICAgICAoZm1pMkNvbXBvbmVudCk7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMlJlc2V0VFlQRSAgICAgICAgICAgICAgICAgIChmbWkyQ29tcG9uZW50KTsKLQotLyogR2V0dGluZyBhbmQgc2V0dGluZyB2YXJpYWJsZSB2YWx1ZXMgKi8KLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyR2V0UmVhbFRZUEUgICAoZm1pMkNvbXBvbmVudCwgY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCwgZm1pMlJlYWwgICBbXSk7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMkdldEludGVnZXJUWVBFKGZtaTJDb21wb25lbnQsIGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QsIGZtaTJJbnRlZ2VyW10pOwotICAgdHlwZWRlZiBmbWkyU3RhdHVzIGZtaTJHZXRCb29sZWFuVFlQRShmbWkyQ29tcG9uZW50LCBjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2VbXSwgc2l6ZV90LCBmbWkyQm9vbGVhbltdKTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyR2V0U3RyaW5nVFlQRSAoZm1pMkNvbXBvbmVudCwgY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCwgZm1pMlN0cmluZyBbXSk7Ci0KLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyU2V0UmVhbFRZUEUgICAoZm1pMkNvbXBvbmVudCwgY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCwgY29uc3QgZm1pMlJlYWwgICBbXSk7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMlNldEludGVnZXJUWVBFKGZtaTJDb21wb25lbnQsIGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QsIGNvbnN0IGZtaTJJbnRlZ2VyW10pOwotICAgdHlwZWRlZiBmbWkyU3RhdHVzIGZtaTJTZXRCb29sZWFuVFlQRShmbWkyQ29tcG9uZW50LCBjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2VbXSwgc2l6ZV90LCBjb25zdCBmbWkyQm9vbGVhbltdKTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyU2V0U3RyaW5nVFlQRSAoZm1pMkNvbXBvbmVudCwgY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCwgY29uc3QgZm1pMlN0cmluZyBbXSk7Ci0KLS8qIEdldHRpbmcgYW5kIHNldHRpbmcgdGhlIGludGVybmFsIEZNVSBzdGF0ZSAqLwotICAgdHlwZWRlZiBmbWkyU3RhdHVzIGZtaTJHZXRGTVVzdGF0ZVRZUEUgICAgICAgICAgIChmbWkyQ29tcG9uZW50LCBmbWkyRk1Vc3RhdGUqKTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyU2V0Rk1Vc3RhdGVUWVBFICAgICAgICAgICAoZm1pMkNvbXBvbmVudCwgZm1pMkZNVXN0YXRlKTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyRnJlZUZNVXN0YXRlVFlQRSAgICAgICAgICAoZm1pMkNvbXBvbmVudCwgZm1pMkZNVXN0YXRlKik7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMlNlcmlhbGl6ZWRGTVVzdGF0ZVNpemVUWVBFKGZtaTJDb21wb25lbnQsIGZtaTJGTVVzdGF0ZSwgc2l6ZV90Kik7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMlNlcmlhbGl6ZUZNVXN0YXRlVFlQRSAgICAgKGZtaTJDb21wb25lbnQsIGZtaTJGTVVzdGF0ZSwgZm1pMkJ5dGVbXSwgc2l6ZV90KTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyRGVTZXJpYWxpemVGTVVzdGF0ZVRZUEUgICAoZm1pMkNvbXBvbmVudCwgY29uc3QgZm1pMkJ5dGVbXSwgc2l6ZV90LCBmbWkyRk1Vc3RhdGUqKTsKLQotLyogR2V0dGluZyBwYXJ0aWFsIGRlcml2YXRpdmVzICovCi0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMkdldERpcmVjdGlvbmFsRGVyaXZhdGl2ZVRZUEUoZm1pMkNvbXBvbmVudCwgY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2VbXSwgc2l6ZV90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZtaTJSZWFsW10sIGZtaTJSZWFsW10pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1UeXBlcyBmb3IgRnVuY3Rpb25zIGZvciBGTUkyIGZvciBNb2RlbCBFeGNoYW5nZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRW50ZXIgYW5kIGV4aXQgdGhlIGRpZmZlcmVudCBtb2RlcyAqLwotICAgdHlwZWRlZiBmbWkyU3RhdHVzIGZtaTJFbnRlckV2ZW50TW9kZVRZUEUgICAgICAgICAoZm1pMkNvbXBvbmVudCk7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMk5ld0Rpc2NyZXRlU3RhdGVzVFlQRSAgICAgIChmbWkyQ29tcG9uZW50LCBmbWkyRXZlbnRJbmZvKik7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMkVudGVyQ29udGludW91c1RpbWVNb2RlVFlQRShmbWkyQ29tcG9uZW50KTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyQ29tcGxldGVkSW50ZWdyYXRvclN0ZXBUWVBFKGZtaTJDb21wb25lbnQsIGZtaTJCb29sZWFuLCBmbWkyQm9vbGVhbiosIGZtaTJCb29sZWFuKik7Ci0KLS8qIFByb3ZpZGluZyBpbmRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIHJlLWluaXRpYWxpemF0aW9uIG9mIGNhY2hpbmcgKi8KLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyU2V0VGltZVRZUEUgICAgICAgICAgICAoZm1pMkNvbXBvbmVudCwgZm1pMlJlYWwpOwotICAgdHlwZWRlZiBmbWkyU3RhdHVzIGZtaTJTZXRDb250aW51b3VzU3RhdGVzVFlQRShmbWkyQ29tcG9uZW50LCBjb25zdCBmbWkyUmVhbFtdLCBzaXplX3QpOwotCi0vKiBFdmFsdWF0aW9uIG9mIHRoZSBtb2RlbCBlcXVhdGlvbnMgKi8KLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyR2V0RGVyaXZhdGl2ZXNUWVBFICAgICAgICAgICAgICAgKGZtaTJDb21wb25lbnQsIGZtaTJSZWFsW10sIHNpemVfdCk7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMkdldEV2ZW50SW5kaWNhdG9yc1RZUEUgICAgICAgICAgIChmbWkyQ29tcG9uZW50LCBmbWkyUmVhbFtdLCBzaXplX3QpOwotICAgdHlwZWRlZiBmbWkyU3RhdHVzIGZtaTJHZXRDb250aW51b3VzU3RhdGVzVFlQRSAgICAgICAgICAoZm1pMkNvbXBvbmVudCwgZm1pMlJlYWxbXSwgc2l6ZV90KTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyR2V0Tm9taW5hbHNPZkNvbnRpbnVvdXNTdGF0ZXNUWVBFKGZtaTJDb21wb25lbnQsIGZtaTJSZWFsW10sIHNpemVfdCk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotVHlwZXMgZm9yIEZ1bmN0aW9ucyBmb3IgRk1JMiBmb3IgQ28tU2ltdWxhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogU2ltdWxhdGluZyB0aGUgc2xhdmUgKi8KLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyU2V0UmVhbElucHV0RGVyaXZhdGl2ZXNUWVBFIChmbWkyQ29tcG9uZW50LCBjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2UgW10sIHNpemVfdCwgY29uc3QgZm1pMkludGVnZXIgW10sIGNvbnN0IGZtaTJSZWFsIFtdKTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyR2V0UmVhbE91dHB1dERlcml2YXRpdmVzVFlQRShmbWkyQ29tcG9uZW50LCBjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2UgW10sIHNpemVfdCwgY29uc3QgZm1pMkludGVnZXIgW10sIGZtaTJSZWFsIFtdKTsKLQotICAgdHlwZWRlZiBmbWkyU3RhdHVzIGZtaTJEb1N0ZXBUWVBFICAgICAoZm1pMkNvbXBvbmVudCwgZm1pMlJlYWwsIGZtaTJSZWFsLCBmbWkyQm9vbGVhbik7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMkNhbmNlbFN0ZXBUWVBFIChmbWkyQ29tcG9uZW50KTsKLQotLyogSW5xdWlyZSBzbGF2ZSBzdGF0dXMgKi8KLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyR2V0U3RhdHVzVFlQRSAgICAgICAoZm1pMkNvbXBvbmVudCwgY29uc3QgZm1pMlN0YXR1c0tpbmQsIGZtaTJTdGF0dXMqICk7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMkdldFJlYWxTdGF0dXNUWVBFICAgKGZtaTJDb21wb25lbnQsIGNvbnN0IGZtaTJTdGF0dXNLaW5kLCBmbWkyUmVhbCogICApOwotICAgdHlwZWRlZiBmbWkyU3RhdHVzIGZtaTJHZXRJbnRlZ2VyU3RhdHVzVFlQRShmbWkyQ29tcG9uZW50LCBjb25zdCBmbWkyU3RhdHVzS2luZCwgZm1pMkludGVnZXIqKTsKLSAgIHR5cGVkZWYgZm1pMlN0YXR1cyBmbWkyR2V0Qm9vbGVhblN0YXR1c1RZUEUoZm1pMkNvbXBvbmVudCwgY29uc3QgZm1pMlN0YXR1c0tpbmQsIGZtaTJCb29sZWFuKik7Ci0gICB0eXBlZGVmIGZtaTJTdGF0dXMgZm1pMkdldFN0cmluZ1N0YXR1c1RZUEUgKGZtaTJDb21wb25lbnQsIGNvbnN0IGZtaTJTdGF0dXNLaW5kLCBmbWkyU3RyaW5nKiApOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLyogZW5kIG9mIGV4dGVybiAiQyIgeyAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBmbWkyRnVuY3Rpb25UeXBlc19oICovCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvZm1pL2ZtaTJGdW5jdGlvbnMuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbWkvZm1pMkZ1bmN0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTE5N2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbWkvZm1pMkZ1bmN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLSNpZm5kZWYgZm1pMkZ1bmN0aW9uc19oCi0jZGVmaW5lIGZtaTJGdW5jdGlvbnNfaAotCi0vKiBUaGlzIGhlYWRlciBmaWxlIG11c3QgYmUgdXRpbGl6ZWQgd2hlbiBjb21waWxpbmcgYSBGTVUuCi0gICBJdCBkZWZpbmVzIGFsbCBmdW5jdGlvbnMgb2YgdGhlCi0gICAgICAgICBGTUkgMi4wIE1vZGVsIEV4Y2hhbmdlIGFuZCBDby1TaW11bGF0aW9uIEludGVyZmFjZS4KLQotICAgSW4gb3JkZXIgdG8gaGF2ZSB1bmlxdWUgZnVuY3Rpb24gbmFtZXMgZXZlbiBpZiBzZXZlcmFsIEZNVXMKLSAgIGFyZSBjb21waWxlZCB0b2dldGhlciAoZS5nLiBmb3IgZW1iZWRkZWQgc3lzdGVtcyksIGV2ZXJ5ICJyZWFsIiBmdW5jdGlvbiBuYW1lCi0gICBpcyBjb25zdHJ1Y3RlZCBieSBwcmVwZW5kaW5nIHRoZSBmdW5jdGlvbiBuYW1lIGJ5ICJGTUkyX0ZVTkNUSU9OX1BSRUZJWCIuCi0gICBUaGVyZWZvcmUsIHRoZSB0eXBpY2FsIHVzYWdlIGlzOgotCi0gICAgICAjZGVmaW5lIEZNSTJfRlVOQ1RJT05fUFJFRklYIE15TW9kZWxfCi0gICAgICAjaW5jbHVkZSAiZm1pMkZ1bmN0aW9ucy5oIgotCi0gICBBcyBhIHJlc3VsdCwgYSBmdW5jdGlvbiB0aGF0IGlzIGRlZmluZWQgYXMgImZtaTJHZXREZXJpdmF0aXZlcyIgaW4gdGhpcyBoZWFkZXIgZmlsZSwKLSAgIGlzIGFjdHVhbGx5IGdldHRpbmcgdGhlIG5hbWUgIk15TW9kZWxfZm1pMkdldERlcml2YXRpdmVzIi4KLQotICAgVGhpcyBvbmx5IGhvbGRzIGlmIHRoZSBGTVUgaXMgc2hpcHBlZCBpbiBDIHNvdXJjZSBjb2RlLCBvciBpcyBjb21waWxlZCBpbiBhCi0gICBzdGF0aWMgbGluayBsaWJyYXJ5LiBGb3IgRk1VcyBjb21waWxlZCBpbiBhIERMTC9zaGFyZWRPYmplY3QsIHRoZSAiYWN0dWFsIiBmdW5jdGlvbgotICAgbmFtZXMgYXJlIHVzZWQgYW5kICJGTUkyX0ZVTkNUSU9OX1BSRUZJWCIgbXVzdCBub3QgYmUgZGVmaW5lZC4KLQotICAgUmV2aXNpb25zOgotICAgLSBBcHIuICA5LCAyMDE0OiBhbGwgcHJlZml4ZXMgImZtaSIgcmVuYW1lZCB0byAiZm1pMiIgKGRlY2lzaW9uIGZyb20gQXByaWwgOCkKLSAgIC0gTWFyLiAyNiwgMjAxNDogRk1JX0V4cG9ydCBzZXQgdG8gZW1wdHkgdmFsdWUgaWYgRk1JX0V4cG9ydCBhbmQgRk1JX0ZVTkNUSU9OX1BSRUZJWAotICAgICAgICAgICAgICAgICAgICBhcmUgbm90IGRlZmluZWQgKCMxNzMpCi0gICAtIE9jdC4gMTEsIDIwMTM6IEZ1bmN0aW9ucyBvZiBNb2RlbEV4Y2hhbmdlIGFuZCBDb1NpbXVsYXRpb24gbWVyZ2VkOgotICAgICAgICAgICAgICAgICAgICAgIGZtaUluc3RhbnRpYXRlTW9kZWwgLCBmbWlJbnN0YW50aWF0ZVNsYXZlICAtPiBmbWlJbnN0YW50aWF0ZQotICAgICAgICAgICAgICAgICAgICAgIGZtaUZyZWVNb2RlbEluc3RhbmNlLCBmbWlGcmVlU2xhdmVJbnN0YW5jZSAtPiBmbWlGcmVlSW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICBmbWlFbnRlck1vZGVsSW5pdGlhbGl6YXRpb25Nb2RlLCBmbWlFbnRlclNsYXZlSW5pdGlhbGl6YXRpb25Nb2RlIC0+IGZtaUVudGVySW5pdGlhbGl6YXRpb25Nb2RlCi0gICAgICAgICAgICAgICAgICAgICAgZm1pRXhpdE1vZGVsSW5pdGlhbGl6YXRpb25Nb2RlICwgZm1pRXhpdFNsYXZlSW5pdGlhbGl6YXRpb25Nb2RlICAtPiBmbWlFeGl0SW5pdGlhbGl6YXRpb25Nb2RlCi0gICAgICAgICAgICAgICAgICAgICAgZm1pVGVybWluYXRlTW9kZWwsIGZtaVRlcm1pbmF0ZVNsYXZlICAtPiBmbWlUZXJtaW5hdGUKLSAgICAgICAgICAgICAgICAgICAgICBmbWlSZXNldFNsYXZlIC0+IGZtaVJlc2V0IChub3cgYWxzbyBmb3IgTW9kZWxFeGNoYW5nZSBhbmQgbm90IG9ubHkgZm9yIENvU2ltdWxhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25zIHJlbmFtZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgZm1pVXBkYXRlRGlzY3JldGVTdGF0ZXMgLT4gZm1pTmV3RGlzY3JldGVTdGF0ZXMKLSAgIC0gSnVuZSAxMywgMjAxMzogRnVuY3Rpb25zIHJlbW92ZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIGZtaUluaXRpYWxpemVNb2RlbAotICAgICAgICAgICAgICAgICAgICAgICBmbWlFdmVudFVwZGF0ZQotICAgICAgICAgICAgICAgICAgICAgICBmbWlDb21wbGV0ZWRFdmVudEl0ZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICBmbWlJbml0aWFsaXplU2xhdmUKLSAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25zIGFkZGVkOgotICAgICAgICAgICAgICAgICAgICAgICBmbWlFbnRlck1vZGVsSW5pdGlhbGl6YXRpb25Nb2RlCi0gICAgICAgICAgICAgICAgICAgICAgIGZtaUV4aXRNb2RlbEluaXRpYWxpemF0aW9uTW9kZQotICAgICAgICAgICAgICAgICAgICAgICBmbWlFbnRlckV2ZW50TW9kZQotICAgICAgICAgICAgICAgICAgICAgICBmbWlVcGRhdGVEaXNjcmV0ZVN0YXRlcwotICAgICAgICAgICAgICAgICAgICAgICBmbWlFbnRlckNvbnRpbnVvdXNUaW1lTW9kZQotICAgICAgICAgICAgICAgICAgICAgICBmbWlFbnRlclNsYXZlSW5pdGlhbGl6YXRpb25Nb2RlOwotICAgICAgICAgICAgICAgICAgICAgICBmbWlFeGl0U2xhdmVJbml0aWFsaXphdGlvbk1vZGU7Ci0gICAtIEZlYi4gMTcsIDIwMTM6IFBvcnRhYmlsaXR5IGltcHJvdmVtZW50czoKLSAgICAgICAgICAgICAgICAgICAgICAgbyBEbGxFeHBvcnQgY2hhbmdlZCB0byBGTUlfRXhwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgIG8gRlVOQ1RJT05fUFJFRklYIGNoYW5nZWQgdG8gRk1JX0ZVTkNUSU9OX1BSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICBvIEFsbG93IHVuZGVmaW5lZCBGTUlfRlVOQ1RJT05fUFJFRklYIChtZWFuaW5nIG5vIHByZWZpeCBpcyB1c2VkKQotICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkIGZ1bmN0aW9uIG5hbWUgImZtaVRlcm1pbmF0ZSIgdG8gImZtaVRlcm1pbmF0ZU1vZGVsIiAoZHVlIHRvICMxMTMpCi0gICAgICAgICAgICAgICAgICAgIENoYW5nZWQgZnVuY3Rpb24gbmFtZSAiZm1pR2V0Tm9taW5hbENvbnRpbnVvdXNTdGF0ZSIgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbWlHZXROb21pbmFsc09mQ29udGludW91c1N0YXRlcyIKLSAgICAgICAgICAgICAgICAgICAgUmVtb3ZlZCBmbWlHZXRTdGF0ZVZhbHVlUmVmZXJlbmNlcy4KLSAgIC0gTm92LiAxNCwgMjAxMTogQWRhcHRlZCB0byBGTUkgMi4wOgotICAgICAgICAgICAgICAgICAgICAgICBvIFNwbGl0IGludG8gdHdvIGZpbGVzIChmbWlGdW5jdGlvbnMuaCwgZm1pVHlwZXMuaCkgaW4gb3JkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNvZGUgdGhhdCBkeW5hbWljYWxseSBsb2FkcyBhbiBGTVUgY2FuIGRpcmVjdGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdXRpbGl6ZSB0aGUgaGVhZGVyIGZpbGVzKS4KLSAgICAgICAgICAgICAgICAgICAgICAgbyBBZGRlZCBDKysgZW5jYXBzdWxhdGlvbiBvZiBDLXBhcnQsIGluIG9yZGVyIHRoYXQgdGhlIGhlYWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgY2FuIGJlIGRpcmVjdGx5IHV0aWxpemVkIGluIEMrKyBjb2RlLgotICAgICAgICAgICAgICAgICAgICAgICBvIGZtaUNhbGxiYWNrRnVuY3Rpb25zIGlzIHBhc3NlZCBhcyBwb2ludGVyIHRvIGZtaUluc3RhbnRpYXRlWFhYCi0gICAgICAgICAgICAgICAgICAgICAgIG8gc3RlcEZpbmlzaGVkIHdpdGhpbiBmbWlDYWxsYmFja0Z1bmN0aW9ucyBoYXMgYXMgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCAiZm1pQ29tcG9uZW50RW52aXJvbm1lbnQiIGFuZCBub3QgImZtaUNvbXBvbmVudCIuCi0gICAgICAgICAgICAgICAgICAgICAgIG8gTmV3IGZ1bmN0aW9ucyB0byBnZXQgYW5kIHNldCB0aGUgY29tcGxldGUgRk1VIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRvIGNvbXB1dGUgcGFydGlhbCBkZXJpdmF0aXZlcy4KLSAgIC0gTm92LiAgNCwgMjAxMDogQWRhcHRlZCB0byBzcGVjaWZpY2F0aW9uIHRleHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIG8gZm1pR2V0TW9kZWxUeXBlc1BsYXRmb3JtIHJlbmFtZWQgdG8gZm1pR2V0VHlwZXNQbGF0Zm9ybQotICAgICAgICAgICAgICAgICAgICAgICBvIGZtaUluc3RhbnRpYXRlU2xhdmU6IEFyZ3VtZW50IEdVSUQgICAgIHJlcGxhY2VkIGJ5IGZtdUdVSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudCBtaW1ldHlwZSByZXBsYWNlZCBieSBtaW1lVHlwZQotICAgICAgICAgICAgICAgICAgICAgICBvIHRhYnMgcmVwbGFjZWQgYnkgc3BhY2VzCi0gICAtIE9jdC4gMTYsIDIwMTA6IEZ1bmN0aW9ucyBmb3IgRk1JIGZvciBDby1zaW11bGF0aW9uIGFkZGVkCi0gICAtIEphbi4gMjAsIDIwMTA6IHN0YXRlVmFsdWVSZWZlcmVuY2VzQ2hhbmdlZCBhZGRlZCB0byBzdHJ1Y3QgZm1pRXZlbnRJbmZvICh0aWNrZXQgIzI3KQotICAgICAgICAgICAgICAgICAgICAoYnkgTS4gT3R0ZXIsIERMUikKLSAgICAgICAgICAgICAgICAgICAgQWRkZWQgV0lOMzIgcHJhZ21hIHRvIGRlZmluZSB0aGUgc3RydWN0IGxheW91dCAodGlja2V0ICMzNCkKLSAgICAgICAgICAgICAgICAgICAgKGJ5IEouIE1hdXNzLCBRVHJvbmljKQotICAgLSBKYW4uICA0LCAyMDEwOiBSZW1vdmVkIGFyZ3VtZW50IGludGVybWVkaWF0ZVJlc3VsdHMgZnJvbSBmbWlJbml0aWFsaXplCi0gICAgICAgICAgICAgICAgICAgIFJlbmFtZWQgbWFjcm8gZm1pR2V0TW9kZWxGdW5jdGlvbnNWZXJzaW9uIHRvIGZtaUdldFZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgUmVuYW1lZCBtYWNybyBmbWlNb2RlbEZ1bmN0aW9uc1ZlcnNpb24gdG8gZm1pVmVyc2lvbgotICAgICAgICAgICAgICAgICAgICBSZXBsYWNlZCBmbWlNb2RlbCBieSBmbWlDb21wb25lbnQgaW4gZGVjbCBvZiBmbWlJbnN0YW50aWF0ZU1vZGVsCi0gICAgICAgICAgICAgICAgICAgIChieSBKLiBNYXVzcywgUVRyb25pYykKLSAgIC0gRGVjLiAxNywgMjAwOTogQ2hhbmdlZCBleHRlbnNpb24gIm1lIiB0byAiZm1pIiAoYnkgTWFydGluIE90dGVyLCBETFIpLgotICAgLSBEZXouIDE0LCAyMDA5OiBBZGRlZCBldmVudEluZm8gdG8gbWVJbml0aWFsaXplIGFuZCBhZGRlZAotICAgICAgICAgICAgICAgICAgICBtZUdldE5vbWluYWxDb250aW51b3VzU3RhdGVzIChieSBNYXJ0aW4gT3R0ZXIsIERMUikKLSAgIC0gU2VwdC4gOSwgMjAwOTogQWRkZWQgRGxsRXhwb3J0IChhY2NvcmRpbmcgdG8gUGV0ZXIgTmlsc3NvbidzIHN1Z2dlc3Rpb24pCi0gICAgICAgICAgICAgICAgICAgIChieSBBLiBKdW5naGFubnMsIFFUcm9uaWMpCi0gICAtIFNlcHQuIDksIDIwMDk6IENoYW5nZXMgYWNjb3JkaW5nIHRvIEZNSS1tZWV0aW5nIG9uIEp1bHkgMjE6Ci0gICAgICAgICAgICAgICAgICAgIG1lSW5xdWlyZU1vZGVsVHlwZXNWZXJzaW9uICAgICAtPiBtZUdldE1vZGVsVHlwZXNQbGF0Zm9ybQotICAgICAgICAgICAgICAgICAgICBtZUlucXVpcmVNb2RlbEZ1bmN0aW9uc1ZlcnNpb24gLT4gbWVHZXRNb2RlbEZ1bmN0aW9uc1ZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgbWVTZXRTdGF0ZXMgICAgICAgICAgICAgICAgICAgIC0+IG1lU2V0Q29udGludW91c1N0YXRlcwotICAgICAgICAgICAgICAgICAgICBtZUdldFN0YXRlcyAgICAgICAgICAgICAgICAgICAgLT4gbWVHZXRDb250aW51b3VzU3RhdGVzCi0gICAgICAgICAgICAgICAgICAgIHJlbW92YWwgb2YgbWVJbml0aWFsaXplTW9kZWxDbGFzcwotICAgICAgICAgICAgICAgICAgICByZW1vdmFsIG9mIG1lR2V0VGltZQotICAgICAgICAgICAgICAgICAgICBjaGFuZ2Ugb2YgYXJndW1lbnRzIG9mIG1lSW5zdGFudGlhdGVNb2RlbAotICAgICAgICAgICAgICAgICAgICBjaGFuZ2Ugb2YgYXJndW1lbnRzIG9mIG1lQ29tcGxldGVkSW50ZWdyYXRvclN0ZXAKLSAgICAgICAgICAgICAgICAgICAgKGJ5IE1hcnRpbiBPdHRlciwgRExSKToKLSAgIC0gSnVseSAxOSwgMjAwOTogQWRkZWQgIm1lIiBhcyBwcmVmaXggdG8gZmlsZSBuYW1lcyAoYnkgTWFydGluIE90dGVyLCBETFIpLgotICAgLSBNYXJjaCAyLCAyMDA5OiBDaGFuZ2VkIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFjY29yZGluZyB0byB0aGUgbGFzdCBkZXNpZ24KLSAgICAgICAgICAgICAgICAgICAgbWVldGluZyB3aXRoIGFkZGl0aW9uYWwgaW1wcm92ZW1lbnRzIChieSBNYXJ0aW4gT3R0ZXIsIERMUikuCi0gICAtIERlYy4gMyAsIDIwMDg6IEZpcnN0IHZlcnNpb24gYnkgTWFydGluIE90dGVyIChETFIpIGFuZCBIYW5zIE9sc3NvbiAoRHluYXNpbSkuCi0KLSAgIENvcHlyaWdodCDvv70gMjAwOC0yMDExIE1PREVMSVNBUiBjb25zb3J0aXVtLAotICAgICAgICAgICAgICAgMjAxMi0yMDEzIE1vZGVsaWNhIEFzc29jaWF0aW9uIFByb2plY3QgIkZNSSIKLSAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZQotICAgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbCk6Ci0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gICAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLSAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLSAgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgotICAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gICBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLSAgIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSAgIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAgIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICB3aXRoIHRoZSBleHRlbnNpb246Ci0KLSAgIFlvdSBtYXkgZGlzdHJpYnV0ZSBvciBwdWJsaWNseSBwZXJmb3JtIGFueSBtb2RpZmljYXRpb24gb25seSB1bmRlciB0aGUKLSAgIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KLSAgIChOb3RlLCB0aGlzIG1lYW5zIHRoYXQgaWYgeW91IGRpc3RyaWJ1dGUgYSBtb2RpZmllZCBmaWxlLAotICAgIHRoZSBtb2RpZmllZCBmaWxlIG11c3QgYWxzbyBiZSBwcm92aWRlZCB1bmRlciB0aGlzIGxpY2Vuc2UpLgotKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiZm1pMlR5cGVzUGxhdGZvcm0uaCIKLSNpbmNsdWRlICJmbWkyRnVuY3Rpb25UeXBlcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0KLS8qCi0gIEV4cG9ydCBGTUkyIEFQSSBmdW5jdGlvbnMgb24gV2luZG93cyBhbmQgdW5kZXIgR0NDLgotICBJZiBjdXN0b20gbGlua2luZyBpcyBkZXNpcmVkIHRoZW4gdGhlIEZNSTJfRXhwb3J0IG11c3QgYmUKLSAgZGVmaW5lZCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4gRm9yIGluc3RhbmNlLAotICBpdCBtYXkgYmUgc2V0IHRvIF9fZGVjbHNwZWMoZGxsaW1wb3J0KS4KLSovCi0jaWYgIWRlZmluZWQoRk1JMl9FeHBvcnQpCi0gICNpZiAhZGVmaW5lZChGTUkyX0ZVTkNUSU9OX1BSRUZJWCkKLSAgICAjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX0NZR1dJTl9fCi0gICAgIC8qIE5vdGU6IGJvdGggZ2NjICYgTVNWQyBvbiBXaW5kb3dzIHN1cHBvcnQgdGhpcyBzeW50YXguICovCi0gICAgICAgICNkZWZpbmUgRk1JMl9FeHBvcnQgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0gICAgI2Vsc2UKLSAgICAgICNpZiBfX0dOVUNfXyA+PSA0Ci0gICAgICAgICNkZWZpbmUgRk1JMl9FeHBvcnQgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotICAgICAgI2Vsc2UKLSAgICAgICAgI2RlZmluZSBGTUkyX0V4cG9ydAotICAgICAgI2VuZGlmCi0gICAgI2VuZGlmCi0gICNlbHNlCi0gICAgI2RlZmluZSBGTUkyX0V4cG9ydAotICAjZW5kaWYKLSNlbmRpZgotCi0vKiBNYWNyb3MgdG8gY29uc3RydWN0IHRoZSByZWFsIGZ1bmN0aW9uIG5hbWUKLSAgIChwcmVwZW5kIGZ1bmN0aW9uIG5hbWUgYnkgRk1JMl9GVU5DVElPTl9QUkVGSVgpICovCi0jaWYgZGVmaW5lZChGTUkyX0ZVTkNUSU9OX1BSRUZJWCkKLSAgI2RlZmluZSBmbWkyUGFzdGUoYSxiKSAgICAgYSAjIyBiCi0gICNkZWZpbmUgZm1pMlBhc3RlQihhLGIpICAgIGZtaTJQYXN0ZShhLGIpCi0gICNkZWZpbmUgZm1pMkZ1bGxOYW1lKG5hbWUpIGZtaTJQYXN0ZUIoRk1JMl9GVU5DVElPTl9QUkVGSVgsIG5hbWUpCi0jZWxzZQotICAjZGVmaW5lIGZtaTJGdWxsTmFtZShuYW1lKSBuYW1lCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQ29tbW9uIEZ1bmN0aW9ucwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgZm1pMkdldFR5cGVzUGxhdGZvcm0gICAgICAgICBmbWkyRnVsbE5hbWUoZm1pMkdldFR5cGVzUGxhdGZvcm0pCi0jZGVmaW5lIGZtaTJHZXRWZXJzaW9uICAgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJHZXRWZXJzaW9uKQotI2RlZmluZSBmbWkyU2V0RGVidWdMb2dnaW5nICAgICAgICAgIGZtaTJGdWxsTmFtZShmbWkyU2V0RGVidWdMb2dnaW5nKQotI2RlZmluZSBmbWkySW5zdGFudGlhdGUgICAgICAgICAgICAgIGZtaTJGdWxsTmFtZShmbWkySW5zdGFudGlhdGUpCi0jZGVmaW5lIGZtaTJGcmVlSW5zdGFuY2UgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJGcmVlSW5zdGFuY2UpCi0jZGVmaW5lIGZtaTJTZXR1cEV4cGVyaW1lbnQgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJTZXR1cEV4cGVyaW1lbnQpCi0jZGVmaW5lIGZtaTJFbnRlckluaXRpYWxpemF0aW9uTW9kZSAgZm1pMkZ1bGxOYW1lKGZtaTJFbnRlckluaXRpYWxpemF0aW9uTW9kZSkKLSNkZWZpbmUgZm1pMkV4aXRJbml0aWFsaXphdGlvbk1vZGUgICBmbWkyRnVsbE5hbWUoZm1pMkV4aXRJbml0aWFsaXphdGlvbk1vZGUpCi0jZGVmaW5lIGZtaTJUZXJtaW5hdGUgICAgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJUZXJtaW5hdGUpCi0jZGVmaW5lIGZtaTJSZXNldCAgICAgICAgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJSZXNldCkKLSNkZWZpbmUgZm1pMkdldFJlYWwgICAgICAgICAgICAgICAgICBmbWkyRnVsbE5hbWUoZm1pMkdldFJlYWwpCi0jZGVmaW5lIGZtaTJHZXRJbnRlZ2VyICAgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJHZXRJbnRlZ2VyKQotI2RlZmluZSBmbWkyR2V0Qm9vbGVhbiAgICAgICAgICAgICAgIGZtaTJGdWxsTmFtZShmbWkyR2V0Qm9vbGVhbikKLSNkZWZpbmUgZm1pMkdldFN0cmluZyAgICAgICAgICAgICAgICBmbWkyRnVsbE5hbWUoZm1pMkdldFN0cmluZykKLSNkZWZpbmUgZm1pMlNldFJlYWwgICAgICAgICAgICAgICAgICBmbWkyRnVsbE5hbWUoZm1pMlNldFJlYWwpCi0jZGVmaW5lIGZtaTJTZXRJbnRlZ2VyICAgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJTZXRJbnRlZ2VyKQotI2RlZmluZSBmbWkyU2V0Qm9vbGVhbiAgICAgICAgICAgICAgIGZtaTJGdWxsTmFtZShmbWkyU2V0Qm9vbGVhbikKLSNkZWZpbmUgZm1pMlNldFN0cmluZyAgICAgICAgICAgICAgICBmbWkyRnVsbE5hbWUoZm1pMlNldFN0cmluZykKLSNkZWZpbmUgZm1pMkdldEZNVXN0YXRlICAgICAgICAgICAgICBmbWkyRnVsbE5hbWUoZm1pMkdldEZNVXN0YXRlKQotI2RlZmluZSBmbWkyU2V0Rk1Vc3RhdGUgICAgICAgICAgICAgIGZtaTJGdWxsTmFtZShmbWkyU2V0Rk1Vc3RhdGUpCi0jZGVmaW5lIGZtaTJGcmVlRk1Vc3RhdGUgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJGcmVlRk1Vc3RhdGUpCi0jZGVmaW5lIGZtaTJTZXJpYWxpemVkRk1Vc3RhdGVTaXplICAgZm1pMkZ1bGxOYW1lKGZtaTJTZXJpYWxpemVkRk1Vc3RhdGVTaXplKQotI2RlZmluZSBmbWkyU2VyaWFsaXplRk1Vc3RhdGUgICAgICAgIGZtaTJGdWxsTmFtZShmbWkyU2VyaWFsaXplRk1Vc3RhdGUpCi0jZGVmaW5lIGZtaTJEZVNlcmlhbGl6ZUZNVXN0YXRlICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJEZVNlcmlhbGl6ZUZNVXN0YXRlKQotI2RlZmluZSBmbWkyR2V0RGlyZWN0aW9uYWxEZXJpdmF0aXZlIGZtaTJGdWxsTmFtZShmbWkyR2V0RGlyZWN0aW9uYWxEZXJpdmF0aXZlKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUZ1bmN0aW9ucyBmb3IgRk1JMiBmb3IgTW9kZWwgRXhjaGFuZ2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIGZtaTJFbnRlckV2ZW50TW9kZSAgICAgICAgICAgICAgICBmbWkyRnVsbE5hbWUoZm1pMkVudGVyRXZlbnRNb2RlKQotI2RlZmluZSBmbWkyTmV3RGlzY3JldGVTdGF0ZXMgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJOZXdEaXNjcmV0ZVN0YXRlcykKLSNkZWZpbmUgZm1pMkVudGVyQ29udGludW91c1RpbWVNb2RlICAgICAgIGZtaTJGdWxsTmFtZShmbWkyRW50ZXJDb250aW51b3VzVGltZU1vZGUpCi0jZGVmaW5lIGZtaTJDb21wbGV0ZWRJbnRlZ3JhdG9yU3RlcCAgICAgICBmbWkyRnVsbE5hbWUoZm1pMkNvbXBsZXRlZEludGVncmF0b3JTdGVwKQotI2RlZmluZSBmbWkyU2V0VGltZSAgICAgICAgICAgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJTZXRUaW1lKQotI2RlZmluZSBmbWkyU2V0Q29udGludW91c1N0YXRlcyAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJTZXRDb250aW51b3VzU3RhdGVzKQotI2RlZmluZSBmbWkyR2V0RGVyaXZhdGl2ZXMgICAgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJHZXREZXJpdmF0aXZlcykKLSNkZWZpbmUgZm1pMkdldEV2ZW50SW5kaWNhdG9ycyAgICAgICAgICAgIGZtaTJGdWxsTmFtZShmbWkyR2V0RXZlbnRJbmRpY2F0b3JzKQotI2RlZmluZSBmbWkyR2V0Q29udGludW91c1N0YXRlcyAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJHZXRDb250aW51b3VzU3RhdGVzKQotI2RlZmluZSBmbWkyR2V0Tm9taW5hbHNPZkNvbnRpbnVvdXNTdGF0ZXMgZm1pMkZ1bGxOYW1lKGZtaTJHZXROb21pbmFsc09mQ29udGludW91c1N0YXRlcykKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1GdW5jdGlvbnMgZm9yIEZNSTIgZm9yIENvLVNpbXVsYXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIGZtaTJTZXRSZWFsSW5wdXREZXJpdmF0aXZlcyAgICAgIGZtaTJGdWxsTmFtZShmbWkyU2V0UmVhbElucHV0RGVyaXZhdGl2ZXMpCi0jZGVmaW5lIGZtaTJHZXRSZWFsT3V0cHV0RGVyaXZhdGl2ZXMgICAgIGZtaTJGdWxsTmFtZShmbWkyR2V0UmVhbE91dHB1dERlcml2YXRpdmVzKQotI2RlZmluZSBmbWkyRG9TdGVwICAgICAgICAgICAgICAgICAgICAgICBmbWkyRnVsbE5hbWUoZm1pMkRvU3RlcCkKLSNkZWZpbmUgZm1pMkNhbmNlbFN0ZXAgICAgICAgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJDYW5jZWxTdGVwKQotI2RlZmluZSBmbWkyR2V0U3RhdHVzICAgICAgICAgICAgICAgICAgICBmbWkyRnVsbE5hbWUoZm1pMkdldFN0YXR1cykKLSNkZWZpbmUgZm1pMkdldFJlYWxTdGF0dXMgICAgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJHZXRSZWFsU3RhdHVzKQotI2RlZmluZSBmbWkyR2V0SW50ZWdlclN0YXR1cyAgICAgICAgICAgICBmbWkyRnVsbE5hbWUoZm1pMkdldEludGVnZXJTdGF0dXMpCi0jZGVmaW5lIGZtaTJHZXRCb29sZWFuU3RhdHVzICAgICAgICAgICAgIGZtaTJGdWxsTmFtZShmbWkyR2V0Qm9vbGVhblN0YXR1cykKLSNkZWZpbmUgZm1pMkdldFN0cmluZ1N0YXR1cyAgICAgICAgICAgICAgZm1pMkZ1bGxOYW1lKGZtaTJHZXRTdHJpbmdTdGF0dXMpCi0KLS8qIFZlcnNpb24gbnVtYmVyICovCi0jZGVmaW5lIGZtaTJWZXJzaW9uICIyLjAiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQ29tbW9uIEZ1bmN0aW9ucwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSW5xdWlyZSB2ZXJzaW9uIG51bWJlcnMgb2YgaGVhZGVyIGZpbGVzICovCi0gICBGTUkyX0V4cG9ydCBmbWkyR2V0VHlwZXNQbGF0Zm9ybVRZUEUgZm1pMkdldFR5cGVzUGxhdGZvcm07Ci0gICBGTUkyX0V4cG9ydCBmbWkyR2V0VmVyc2lvblRZUEUgICAgICAgZm1pMkdldFZlcnNpb247Ci0gICBGTUkyX0V4cG9ydCBmbWkyU2V0RGVidWdMb2dnaW5nVFlQRSAgZm1pMlNldERlYnVnTG9nZ2luZzsKLQotLyogQ3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIG9mIEZNVSBpbnN0YW5jZXMgKi8KLSAgIEZNSTJfRXhwb3J0IGZtaTJJbnN0YW50aWF0ZVRZUEUgIGZtaTJJbnN0YW50aWF0ZTsKLSAgIEZNSTJfRXhwb3J0IGZtaTJGcmVlSW5zdGFuY2VUWVBFIGZtaTJGcmVlSW5zdGFuY2U7Ci0KLS8qIEVudGVyIGFuZCBleGl0IGluaXRpYWxpemF0aW9uIG1vZGUsIHRlcm1pbmF0ZSBhbmQgcmVzZXQgKi8KLSAgIEZNSTJfRXhwb3J0IGZtaTJTZXR1cEV4cGVyaW1lbnRUWVBFICAgICAgICAgZm1pMlNldHVwRXhwZXJpbWVudDsKLSAgIEZNSTJfRXhwb3J0IGZtaTJFbnRlckluaXRpYWxpemF0aW9uTW9kZVRZUEUgZm1pMkVudGVySW5pdGlhbGl6YXRpb25Nb2RlOwotICAgRk1JMl9FeHBvcnQgZm1pMkV4aXRJbml0aWFsaXphdGlvbk1vZGVUWVBFICBmbWkyRXhpdEluaXRpYWxpemF0aW9uTW9kZTsKLSAgIEZNSTJfRXhwb3J0IGZtaTJUZXJtaW5hdGVUWVBFICAgICAgICAgICAgICAgZm1pMlRlcm1pbmF0ZTsKLSAgIEZNSTJfRXhwb3J0IGZtaTJSZXNldFRZUEUgICAgICAgICAgICAgICAgICAgZm1pMlJlc2V0OwotCi0vKiBHZXR0aW5nIGFuZCBzZXR0aW5nIHZhcmlhYmxlcyB2YWx1ZXMgKi8KLSAgIEZNSTJfRXhwb3J0IGZtaTJHZXRSZWFsVFlQRSAgICBmbWkyR2V0UmVhbDsKLSAgIEZNSTJfRXhwb3J0IGZtaTJHZXRJbnRlZ2VyVFlQRSBmbWkyR2V0SW50ZWdlcjsKLSAgIEZNSTJfRXhwb3J0IGZtaTJHZXRCb29sZWFuVFlQRSBmbWkyR2V0Qm9vbGVhbjsKLSAgIEZNSTJfRXhwb3J0IGZtaTJHZXRTdHJpbmdUWVBFICBmbWkyR2V0U3RyaW5nOwotCi0gICBGTUkyX0V4cG9ydCBmbWkyU2V0UmVhbFRZUEUgICAgZm1pMlNldFJlYWw7Ci0gICBGTUkyX0V4cG9ydCBmbWkyU2V0SW50ZWdlclRZUEUgZm1pMlNldEludGVnZXI7Ci0gICBGTUkyX0V4cG9ydCBmbWkyU2V0Qm9vbGVhblRZUEUgZm1pMlNldEJvb2xlYW47Ci0gICBGTUkyX0V4cG9ydCBmbWkyU2V0U3RyaW5nVFlQRSAgZm1pMlNldFN0cmluZzsKLQotLyogR2V0dGluZyBhbmQgc2V0dGluZyB0aGUgaW50ZXJuYWwgRk1VIHN0YXRlICovCi0gICBGTUkyX0V4cG9ydCBmbWkyR2V0Rk1Vc3RhdGVUWVBFICAgICAgICAgICAgZm1pMkdldEZNVXN0YXRlOwotICAgRk1JMl9FeHBvcnQgZm1pMlNldEZNVXN0YXRlVFlQRSAgICAgICAgICAgIGZtaTJTZXRGTVVzdGF0ZTsKLSAgIEZNSTJfRXhwb3J0IGZtaTJGcmVlRk1Vc3RhdGVUWVBFICAgICAgICAgICBmbWkyRnJlZUZNVXN0YXRlOwotICAgRk1JMl9FeHBvcnQgZm1pMlNlcmlhbGl6ZWRGTVVzdGF0ZVNpemVUWVBFIGZtaTJTZXJpYWxpemVkRk1Vc3RhdGVTaXplOwotICAgRk1JMl9FeHBvcnQgZm1pMlNlcmlhbGl6ZUZNVXN0YXRlVFlQRSAgICAgIGZtaTJTZXJpYWxpemVGTVVzdGF0ZTsKLSAgIEZNSTJfRXhwb3J0IGZtaTJEZVNlcmlhbGl6ZUZNVXN0YXRlVFlQRSAgICBmbWkyRGVTZXJpYWxpemVGTVVzdGF0ZTsKLQotLyogR2V0dGluZyBwYXJ0aWFsIGRlcml2YXRpdmVzICovCi0gICBGTUkyX0V4cG9ydCBmbWkyR2V0RGlyZWN0aW9uYWxEZXJpdmF0aXZlVFlQRSBmbWkyR2V0RGlyZWN0aW9uYWxEZXJpdmF0aXZlOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUZ1bmN0aW9ucyBmb3IgRk1JMiBmb3IgTW9kZWwgRXhjaGFuZ2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEVudGVyIGFuZCBleGl0IHRoZSBkaWZmZXJlbnQgbW9kZXMgKi8KLSAgIEZNSTJfRXhwb3J0IGZtaTJFbnRlckV2ZW50TW9kZVRZUEUgICAgICAgICAgICAgICBmbWkyRW50ZXJFdmVudE1vZGU7Ci0gICBGTUkyX0V4cG9ydCBmbWkyTmV3RGlzY3JldGVTdGF0ZXNUWVBFICAgICAgICAgICAgZm1pMk5ld0Rpc2NyZXRlU3RhdGVzOwotICAgRk1JMl9FeHBvcnQgZm1pMkVudGVyQ29udGludW91c1RpbWVNb2RlVFlQRSAgICAgIGZtaTJFbnRlckNvbnRpbnVvdXNUaW1lTW9kZTsKLSAgIEZNSTJfRXhwb3J0IGZtaTJDb21wbGV0ZWRJbnRlZ3JhdG9yU3RlcFRZUEUgICAgICBmbWkyQ29tcGxldGVkSW50ZWdyYXRvclN0ZXA7Ci0KLS8qIFByb3ZpZGluZyBpbmRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIHJlLWluaXRpYWxpemF0aW9uIG9mIGNhY2hpbmcgKi8KLSAgIEZNSTJfRXhwb3J0IGZtaTJTZXRUaW1lVFlQRSAgICAgICAgICAgICBmbWkyU2V0VGltZTsKLSAgIEZNSTJfRXhwb3J0IGZtaTJTZXRDb250aW51b3VzU3RhdGVzVFlQRSBmbWkyU2V0Q29udGludW91c1N0YXRlczsKLQotLyogRXZhbHVhdGlvbiBvZiB0aGUgbW9kZWwgZXF1YXRpb25zICovCi0gICBGTUkyX0V4cG9ydCBmbWkyR2V0RGVyaXZhdGl2ZXNUWVBFICAgICAgICAgICAgICAgIGZtaTJHZXREZXJpdmF0aXZlczsKLSAgIEZNSTJfRXhwb3J0IGZtaTJHZXRFdmVudEluZGljYXRvcnNUWVBFICAgICAgICAgICAgZm1pMkdldEV2ZW50SW5kaWNhdG9yczsKLSAgIEZNSTJfRXhwb3J0IGZtaTJHZXRDb250aW51b3VzU3RhdGVzVFlQRSAgICAgICAgICAgZm1pMkdldENvbnRpbnVvdXNTdGF0ZXM7Ci0gICBGTUkyX0V4cG9ydCBmbWkyR2V0Tm9taW5hbHNPZkNvbnRpbnVvdXNTdGF0ZXNUWVBFIGZtaTJHZXROb21pbmFsc09mQ29udGludW91c1N0YXRlczsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1GdW5jdGlvbnMgZm9yIEZNSTIgZm9yIENvLVNpbXVsYXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFNpbXVsYXRpbmcgdGhlIHNsYXZlICovCi0gICBGTUkyX0V4cG9ydCBmbWkyU2V0UmVhbElucHV0RGVyaXZhdGl2ZXNUWVBFICBmbWkyU2V0UmVhbElucHV0RGVyaXZhdGl2ZXM7Ci0gICBGTUkyX0V4cG9ydCBmbWkyR2V0UmVhbE91dHB1dERlcml2YXRpdmVzVFlQRSBmbWkyR2V0UmVhbE91dHB1dERlcml2YXRpdmVzOwotCi0gICBGTUkyX0V4cG9ydCBmbWkyRG9TdGVwVFlQRSAgICAgZm1pMkRvU3RlcDsKLSAgIEZNSTJfRXhwb3J0IGZtaTJDYW5jZWxTdGVwVFlQRSBmbWkyQ2FuY2VsU3RlcDsKLQotLyogSW5xdWlyZSBzbGF2ZSBzdGF0dXMgKi8KLSAgIEZNSTJfRXhwb3J0IGZtaTJHZXRTdGF0dXNUWVBFICAgICAgICBmbWkyR2V0U3RhdHVzOwotICAgRk1JMl9FeHBvcnQgZm1pMkdldFJlYWxTdGF0dXNUWVBFICAgIGZtaTJHZXRSZWFsU3RhdHVzOwotICAgRk1JMl9FeHBvcnQgZm1pMkdldEludGVnZXJTdGF0dXNUWVBFIGZtaTJHZXRJbnRlZ2VyU3RhdHVzOwotICAgRk1JMl9FeHBvcnQgZm1pMkdldEJvb2xlYW5TdGF0dXNUWVBFIGZtaTJHZXRCb29sZWFuU3RhdHVzOwotICAgRk1JMl9FeHBvcnQgZm1pMkdldFN0cmluZ1N0YXR1c1RZUEUgIGZtaTJHZXRTdHJpbmdTdGF0dXM7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLyogZW5kIG9mIGV4dGVybiAiQyIgeyAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBmbWkyRnVuY3Rpb25zX2ggKi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbWkvZm1pMlR5cGVzUGxhdGZvcm0uaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbWkvZm1pMlR5cGVzUGxhdGZvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3NzFkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvZm1pL2ZtaTJUeXBlc1BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotI2lmbmRlZiBmbWkyVHlwZXNQbGF0Zm9ybV9oCi0jZGVmaW5lIGZtaTJUeXBlc1BsYXRmb3JtX2gKLQotLyogU3RhbmRhcmQgaGVhZGVyIGZpbGUgdG8gZGVmaW5lIHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUKLSAgIGZ1bmN0aW9ucyBvZiB0aGUgRnVuY3Rpb25hbCBNb2NrLXVwIEludGVyZmFjZSAyLjAuCi0gICBUaGlzIGhlYWRlciBmaWxlIG11c3QgYmUgdXRpbGl6ZWQgYm90aCBieSB0aGUgbW9kZWwgYW5kCi0gICBieSB0aGUgc2ltdWxhdGlvbiBlbmdpbmUuCi0KLSAgIFJldmlzaW9uczoKLSAgIC0gQXByLiAgOSwgMjAxNDogYWxsIHByZWZpeGVzICJmbWkiIHJlbmFtZWQgdG8gImZtaTIiIChkZWNpc2lvbiBmcm9tIEFwcmlsIDgpCi0gICAtIE1hciAgIDMxLCAyMDE0OiBOZXcgZGF0YXR5cGUgZm1pQ2hhciBpbnRyb2R1Y2VkLgotICAgLSBGZWIuICAxNywgMjAxMzogQ2hhbmdlZCBmbWlUeXBlc1BsYXRmb3JtIGZyb20gInN0YW5kYXJkMzIiIHRvICJkZWZhdWx0Ii4KLSAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgZm1pVW5kZWZpbmVkVmFsdWVSZWZlcmVuY2Ugc2luY2Ugbm8gbG9uZ2VyIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICAgKGJlY2F1c2UgZXZlcnkgc3RhdGUgaXMgZGVmaW5lZCBpbiBTY2FsYXJWYXJpYWJsZXMpLgotICAgLSBNYXJjaCAyMCwgMjAxMjogUmVuYW1lZCBmcm9tIGZtaVBsYXRmb3JtVHlwZXMuaCB0byBmbWlUeXBlc1BsYXRmb3JtLmgKLSAgIC0gTm92LiAgMTQsIDIwMTE6IFVzZSB0aGUgaGVhZGVyIGZpbGUgImZtaVBsYXRmb3JtVHlwZXMuaCIgZm9yIEZNSSAyLjAKLSAgICAgICAgICAgICAgICAgICAgIGJvdGggZm9yICJGTUkgZm9yIG1vZGVsIGV4Y2hhbmdlIiBhbmQgZm9yICJGTUkgZm9yIGNvLXNpbXVsYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICBOZXcgdHlwZXMgImZtaUNvbXBvbmVudEVudmlyb25tZW50IiwgImZtaVN0YXRlIiwgYW5kICJmbWlCeXRlIi4KLSAgICAgICAgICAgICAgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiAiZm1pQm9vbGVhbiIgaXMgY2hhbmdlIGZyb20gImNoYXIiIHRvICJpbnQiLgotICAgICAgICAgICAgICAgICAgICAgVGhlICNkZWZpbmUgImZtaVBsYXRmb3JtIiBjaGFuZ2VkIHRvICJmbWlUeXBlc1BsYXRmb3JtIgotICAgICAgICAgICAgICAgICAgICAgKGluIG9yZGVyIHRoYXQgI2RlZmluZSBhbmQgZnVuY3Rpb24gY2FsbCBhcmUgY29uc2lzdGVudCkKLSAgIC0gT2N0LiAgIDQsIDIwMTA6IFJlbmFtZWQgaGVhZGVyIGZpbGUgZnJvbSAiZm1pTW9kZWxUeXBlcy5oIiB0byBmbWlQbGF0Zm9ybVR5cGVzLmgiCi0gICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGNvLXNpbXVsYXRpb24gaW50ZXJmYWNlCi0gICAtIEphbi4gICA0LCAyMDEwOiBSZW5hbWVkIG1lTW9kZWxUeXBlc19oIHRvIGZtaU1vZGVsVHlwZXNfaCAoYnkgTWF1c3MsIFFUcm9uaWMpCi0gICAtIERlYy4gIDIxLCAyMDA5OiBDaGFuZ2VkICJtZSIgdG8gImZtaSIgYW5kICJtZU1vZGVsIiB0byAiZm1pQ29tcG9uZW50IgotICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIG1lZXRpbmcgb24gRGVjLiAxOCAoYnkgTWFydGluIE90dGVyLCBETFIpCi0gICAtIERlYy4gICA2LCAyMDA5OiBBZGRlZCBtZVVuZGVmaW5lZFZhbHVlUmVmZXJlbmNlIChieSBNYXJ0aW4gT3R0ZXIsIERMUikKLSAgIC0gU2VwdC4gIDksIDIwMDk6IENoYW5nZXMgYWNjb3JkaW5nIHRvIEZNSS1tZWV0aW5nIG9uIEp1bHkgMjE6Ci0gICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkICJ2ZXJzaW9uIiB0byAicGxhdGZvcm0iLCAic3RhbmRhcmQiIHRvICJzdGFuZGFyZDMyIiwKLSAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGEgcHJlY2lzZSBkZWZpbml0aW9uIG9mICJzdGFuZGFyZDMyIiBhcyBjb21tZW50Ci0gICAgICAgICAgICAgICAgICAgICAoYnkgTWFydGluIE90dGVyLCBETFIpCi0gICAtIEp1bHkgIDE5LCAyMDA5OiBBZGRlZCAibWUiIGFzIHByZWZpeCB0byBmaWxlIG5hbWVzLCBhZGRlZCBtZVRydWUvbWVGYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIGFuZCBjaGFuZ2VkIG1lVmFsdWVSZWZlcmVuY2VkIGZyb20gaW50IHRvIHVuc2lnbmVkIGludAotICAgICAgICAgICAgICAgICAgICAgKGJ5IE1hcnRpbiBPdHRlciwgRExSKS4KLSAgIC0gTWFyY2ggIDIsIDIwMDk6IE1vdmVkIGVudW1zIGFuZCBmdW5jdGlvbiBwb2ludGVyIGRlZmluaXRpb25zIHRvCi0gICAgICAgICAgICAgICAgICAgICBNb2RlbEZ1bmN0aW9ucy5oIChieSBNYXJ0aW4gT3R0ZXIsIERMUikuCi0gICAtIERlYy4gIDMsIDIwMDggOiBGaXJzdCB2ZXJzaW9uIGJ5IE1hcnRpbiBPdHRlciAoRExSKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgIEhhbnMgT2xzc29uIChEeW5hc2ltKS4KLQotCi0gICBDb3B5cmlnaHQgqSAyMDA4LTIwMTEgTU9ERUxJU0FSIGNvbnNvcnRpdW0sCi0gICAgICAgICAgICAgICAyMDEyLTIwMTMgTW9kZWxpY2EgQXNzb2NpYXRpb24gUHJvamVjdCAiRk1JIgotICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlCi0gICAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sKToKLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAgIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAotICAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAgIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCi0gICBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAgIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotICAgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotICAgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotICAgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIHdpdGggdGhlIGV4dGVuc2lvbjoKLQotICAgWW91IG1heSBkaXN0cmlidXRlIG9yIHB1YmxpY2x5IHBlcmZvcm0gYW55IG1vZGlmaWNhdGlvbiBvbmx5IHVuZGVyIHRoZQotICAgdGVybXMgb2YgdGhpcyBsaWNlbnNlLgotICAgKE5vdGUsIHRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgZGlzdHJpYnV0ZSBhIG1vZGlmaWVkIGZpbGUsCi0gICAgdGhlIG1vZGlmaWVkIGZpbGUgbXVzdCBhbHNvIGJlIHByb3ZpZGVkIHVuZGVyIHRoaXMgbGljZW5zZSkuCi0qLwotCi0vKiBQbGF0Zm9ybSAodW5pcXVlIGlkZW50aWZpY2F0aW9uIG9mIHRoaXMgaGVhZGVyIGZpbGUpICovCi0jZGVmaW5lIGZtaTJUeXBlc1BsYXRmb3JtICJkZWZhdWx0IgotCi0vKiBUeXBlIGRlZmluaXRpb25zIG9mIHZhcmlhYmxlcyBwYXNzZWQgYXMgYXJndW1lbnRzCi0gICBWZXJzaW9uICJkZWZhdWx0IiBtZWFuczoKLQotICAgZm1pMkNvbXBvbmVudCAgICAgICAgICAgOiBhbiBvcGFxdWUgb2JqZWN0IHBvaW50ZXIKLSAgIGZtaTJDb21wb25lbnRFbnZpcm9ubWVudDogYW4gb3BhcXVlIG9iamVjdCBwb2ludGVyCi0gICBmbWkyRk1Vc3RhdGUgICAgICAgICAgICA6IGFuIG9wYXF1ZSBvYmplY3QgcG9pbnRlcgotICAgZm1pMlZhbHVlUmVmZXJlbmNlICAgICAgOiBoYW5kbGUgdG8gdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUKLSAgIGZtaTJSZWFsICAgICAgICAgICAgICAgIDogZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBkYXRhIHR5cGUKLSAgIGZtaTJJbnRlZ2VyICAgICAgICAgICAgIDogYmFzaWMgc2lnbmVkIGludGVnZXIgZGF0YSB0eXBlCi0gICBmbWkyQm9vbGVhbiAgICAgICAgICAgICA6IGJhc2ljIHNpZ25lZCBpbnRlZ2VyIGRhdGEgdHlwZQotICAgZm1pMkNoYXIgICAgICAgICAgICAgICAgOiBjaGFyYWN0ZXIgZGF0YSB0eXBlCi0gICBmbWkyU3RyaW5nICAgICAgICAgICAgICA6IGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiBmbWkyQ2hhciBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnXDAnIHRlcm1pbmF0ZWQsIFVURjggZW5jb2RlZCkKLSAgIGZtaTJCeXRlICAgICAgICAgICAgICAgIDogc21hbGxlc3QgYWRkcmVzc2FibGUgdW5pdCBvZiB0aGUgbWFjaGluZSwgdHlwaWNhbGx5IG9uZSBieXRlLgotKi8KLSAgIHR5cGVkZWYgdm9pZCogICAgICAgICAgIGZtaTJDb21wb25lbnQ7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBGTVUgaW5zdGFuY2UgICAgICAgKi8KLSAgIHR5cGVkZWYgdm9pZCogICAgICAgICAgIGZtaTJDb21wb25lbnRFbnZpcm9ubWVudDsgICAgLyogUG9pbnRlciB0byBGTVUgZW52aXJvbm1lbnQgICAgKi8KLSAgIHR5cGVkZWYgdm9pZCogICAgICAgICAgIGZtaTJGTVVzdGF0ZTsgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBpbnRlcm5hbCBGTVUgc3RhdGUgKi8KLSAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgIGZtaTJWYWx1ZVJlZmVyZW5jZTsKLSAgIHR5cGVkZWYgZG91YmxlICAgICAgICAgIGZtaTJSZWFsICAgOwotICAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgZm1pMkludGVnZXI7Ci0gICB0eXBlZGVmIGludCAgICAgICAgICAgICBmbWkyQm9vbGVhbjsKLSAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgIGZtaTJDaGFyOwotICAgdHlwZWRlZiBjb25zdCBmbWkyQ2hhciogZm1pMlN0cmluZzsKLSAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgIGZtaTJCeXRlOwotCi0vKiBWYWx1ZXMgZm9yIGZtaTJCb29sZWFuICAqLwotI2RlZmluZSBmbWkyVHJ1ZSAgMQotI2RlZmluZSBmbWkyRmFsc2UgMAotCi0KLSNlbmRpZiAvKiBmbWkyVHlwZXNQbGF0Zm9ybV9oICovCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvZm11d3JhcHBlci9pbmNsdWRlL0Fic3RyYWN0Rk1JQ29tcG9uZW50LmggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvZm11d3JhcHBlci9pbmNsdWRlL0Fic3RyYWN0Rk1JQ29tcG9uZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NGI4Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2ZtdXdyYXBwZXIvaW5jbHVkZS9BYnN0cmFjdEZNSUNvbXBvbmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIEZNSUNvbXBvbmVudC5oCi0gKgotICogIENyZWF0ZWQgb246IEZlYiAyMywgMjAxNgotICogICAgICBBdXRob3I6IHNlYgotICovCi0KLSNpZm5kZWYgSU5GUkFfSU5DTFVERV9BQlNUUkFDVEZNSUNPTVBPTkVOVF9IXwotI2RlZmluZSBJTkZSQV9JTkNMVURFX0FCU1RSQUNURk1JQ09NUE9ORU5UX0hfCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSAiZm1pMkZ1bmN0aW9uVHlwZXMuaCIKLSNpbmNsdWRlICJmbWkyVHlwZXNQbGF0Zm9ybS5oIgotI2luY2x1ZGUgPG1hcD4KLQotCi1jbGFzcyBBYnN0cmFjdEZNSUNvbXBvbmVudCB7Ci0KLXByb3RlY3RlZCA6Ci0Jc3RkOjptYXA8aW50MzJfdCwgZG91YmxlPiAgc2V0UmVhbFJlcXVlc3RzOwotCXN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+ICBzZXRJbnRlZ2VyUmVxdWVzdHM7Ci0Jc3RkOjptYXA8aW50MzJfdCwgYm9vbD4gIHNldEJvb2xlYW5SZXF1ZXN0czsKLQlzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6OnN0cmluZz4gIHNldFN0cmluZ1JlcXVlc3RzOwotCi0Jc3RkOjptYXA8aW50MzJfdCwgZG91YmxlPiAgcmVzcG9uc2VSZWFsczsKLQlzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiAgcmVzcG9uc2VJbnRlZ2VyczsKLQlzdGQ6Om1hcDxpbnQzMl90LCBib29sPiAgcmVzcG9uc2VCb29sZWFuczsKLQlzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6OnN0cmluZz4gIHJlc3BvbnNlU3RyaW5nczsKLQotCWRvdWJsZSBuZXh0RGF0ZSA9LTE7Ci0JYm9vbCBpbnB1dENoYW5nZWQgPWZhbHNlOwotCi0KLXB1YmxpYzoKLQotCQl2aXJ0dWFsIGZtaTJTdGF0dXMgZG9TdGVwKGZtaTJSZWFsIGN1cnJlbnRDb21tdW5pY2F0aW9uVGltZSwgZm1pMlJlYWwgc3RlcFNpemUpPTA7Ci0JCXZpcnR1YWwgdm9pZCB0ZXJtaW5hdGUoKT0wOwotCi0JCXZpcnR1YWwgdm9pZCBnZXRSZWFsKGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZSB2YWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QgbnVtYmVyT2ZWYWx1ZXMsZm1pMlJlYWwgdmFsdWVzW10pOwotCQl2aXJ0dWFsIHZvaWQgZ2V0SW50ZWdlcihjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2UgdmFsdWVSZWZlcmVuY2VbXSwgc2l6ZV90IG51bWJlck9mVmFsdWVzLGZtaTJJbnRlZ2VyIHZhbHVlc1tdKTsKLQkJdmlydHVhbCB2b2lkIGdldEJvb2xlYW4oY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCBudW1iZXJPZlZhbHVlcyxmbWkyQm9vbGVhbiB2YWx1ZXNbXSk7Ci0JCXZpcnR1YWwgdm9pZCBnZXRTdHJpbmcoY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCBudW1iZXJPZlZhbHVlcyxmbWkyU3RyaW5nIHZhbHVlc1tdKTsKLQotCQl2aXJ0dWFsIHZvaWQgc2V0UmVhbChjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2UgdmFsdWVSZWZlcmVuY2VbXSwgc2l6ZV90IG51bWJlck9mVmFsdWVzLGNvbnN0IGZtaTJSZWFsIHZhbHVlc1tdKTsKLQkJdmlydHVhbCB2b2lkIHNldEludGVnZXIoY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCBudW1iZXJPZlZhbHVlcyxjb25zdCBmbWkySW50ZWdlciB2YWx1ZXNbXSk7Ci0JCXZpcnR1YWwgdm9pZCBzZXRCb29sZWFuKGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZSB2YWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QgbnVtYmVyT2ZWYWx1ZXMsY29uc3QgZm1pMkJvb2xlYW4gdmFsdWVzW10pOwotCQl2aXJ0dWFsIHZvaWQgc2V0U3RyaW5nKGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZSB2YWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QgbnVtYmVyT2ZWYWx1ZXMsIGNvbnN0IGZtaTJTdHJpbmcgdmFsdWVzW10pOwotCi0JCXZpcnR1YWwgfkFic3RyYWN0Rk1JQ29tcG9uZW50KCk7Ci0KLQotfTsKLQotCi0KLQotI2VuZGlmIC8qIElORlJBX0lOQ0xVREVfQUJTVFJBQ1RGTUlDT01QT05FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbXV3cmFwcGVyL2luY2x1ZGUvSlNPTkNsaWVudC5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2ZtdXdyYXBwZXIvaW5jbHVkZS9KU09OQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OWY0ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2ZtdXdyYXBwZXIvaW5jbHVkZS9KU09OQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogSlNPTkNsaWVudC5oCi0gKgotICogIENyZWF0ZWQgb246IE1hciAyNCwgMjAxNgotICogICAgICBBdXRob3I6IHNlYgotICovCi0KLSNpZm5kZWYgSlNPTl9JTkNMVURFX0pTT05DTElFTlRfSF8KLSNkZWZpbmUgSlNPTl9JTkNMVURFX0pTT05DTElFTlRfSF8KLQotI2luY2x1ZGUgImFzaW8uaHBwIgotI2luY2x1ZGUgInJhcGlkanNvbi9yYXBpZGpzb24uaCIKLSNpbmNsdWRlICJyYXBpZGpzb24vZG9jdW1lbnQuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0KLWNsYXNzIEpTT05DbGllbnQgewotCi1wcml2YXRlICA6Ci0KLQotCi0Jc3RkOjp0aHJlYWQgKiByY3BUaHJlYWQ7Ci0JYXNpbzo6aW9fc2VydmljZSBpb19zZXJ2aWNlOwotCWFzaW86OmlwOjp0Y3A6OnNvY2tldCBzb2NrZXQ7Ci0KLQljaGFyICBodWdlU3RhdGljQnVmZlsxMDQ4NTc2XTsKLQlzdGQ6OnN0cmluZyByZXBsYWNlQWxsKHN0ZDo6c3RyaW5nIHN0ciwgY29uc3Qgc3RkOjpzdHJpbmcmIGZyb20sIGNvbnN0IHN0ZDo6c3RyaW5nJiB0byk7Ci0KLQotCi1wdWJsaWM6Ci0KLQotCi0KLQlKU09OQ2xpZW50KCk7Ci0JdmlydHVhbCB+SlNPTkNsaWVudCgpOwotCi0JaW50IGluaXQoY29uc3QgY2hhciAqIGZtdVJlc291cmNlTG9jYXRpb24pOwotCXZvaWQgc2VuZFJlcXVlc3QocmFwaWRqc29uOjpEb2N1bWVudCYgcmVxdWVzdCwgCXJhcGlkanNvbjo6RG9jdW1lbnQmIHJlc3BvbnNlKTsKLQl2b2lkIG5vbkJsb2NraW5nU2VuZFJlcXVlc3QocmFwaWRqc29uOjpEb2N1bWVudCYgcmVxdWVzdCxyYXBpZGpzb246OkRvY3VtZW50JiByZXNwb25zZSk7Ci0Jc3RkOjp0aHJlYWQmIGdldFJjcFRocmVhZCgpOwotCi0KLQotfTsKLQotI2VuZGlmIC8qIEpTT05fSU5DTFVERV9KU09OQ0xJRU5UX0hfICovCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvZm11d3JhcHBlci9pbmNsdWRlL0pTT05GTUlDb21wb25lbnQuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbXV3cmFwcGVyL2luY2x1ZGUvSlNPTkZNSUNvbXBvbmVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODJkOWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbXV3cmFwcGVyL2luY2x1ZGUvSlNPTkZNSUNvbXBvbmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIEpTT05GTUlDb21wb25lbnQuaAotICoKLSAqICBDcmVhdGVkIG9uOiBGZWIgMjQsIDIwMTYKLSAqICAgICAgQXV0aG9yOiBzZWIKLSAqLwotCi0jaWZuZGVmIEpTT05fSU5DTFVERV9KU09ORk1JQ09NUE9ORU5UX0hfCi0jZGVmaW5lIEpTT05fSU5DTFVERV9KU09ORk1JQ09NUE9ORU5UX0hfCi0KLQotI2luY2x1ZGUgPEFic3RyYWN0Rk1JQ29tcG9uZW50Lmg+Ci0jaW5jbHVkZSAiSlNPTkNsaWVudC5oIgotI2luY2x1ZGUgInJhcGlkanNvbi9yYXBpZGpzb24uaCIKLSNpbmNsdWRlICJyYXBpZGpzb24vZG9jdW1lbnQuaCIKLQotCi0KLWNsYXNzIEpTT05GTUlDb21wb25lbnQgOiBBYnN0cmFjdEZNSUNvbXBvbmVudCB7Ci0KLQotcHJpdmF0ZSA6Ci0JSlNPTkNsaWVudCBjbGllbnQ7Ci0KLQlzdGF0aWMgY29uc3QgY2hhciogUkVRX1NURVBfX0NVUlJFTlRfVElNRTsKLQlzdGF0aWMgY29uc3QgY2hhciogUkVRX1NURVBfX1NURVBfU0laRTsKLQlzdGF0aWMgY29uc3QgY2hhciogUkVRX1NURVA7Ci0Jc3RhdGljIGNvbnN0IGNoYXIqIFJFUV9JTklUOwotCXN0YXRpYyBjb25zdCBjaGFyKiBSRVFfVEVSTUlOQVRFOwotCi0Jc3RhdGljIGNvbnN0IGNoYXIqIFJFUV9TVEVQX19JTlRWUlM7Ci0Jc3RhdGljIGNvbnN0IGNoYXIqIFJFUV9TVEVQX19CT09MVlJTOwotCXN0YXRpYyBjb25zdCBjaGFyKiBSRVFfU1RFUF9fRE9VQkxFVlJTOwotCXN0YXRpYyBjb25zdCBjaGFyKiBSRVFfU1RFUF9fU1RSSU5HVlJTOwotCi0Jc3RhdGljIGNvbnN0IGNoYXIqIFJFUV9TVEVQX19JTlQ7Ci0Jc3RhdGljIGNvbnN0IGNoYXIqIFJFUV9TVEVQX19CT09MOwotCXN0YXRpYyBjb25zdCBjaGFyKiBSRVFfU1RFUF9fRE9VQkxFOwotCXN0YXRpYyBjb25zdCBjaGFyKiBSRVFfU1RFUF9fU1RSSU5HOwotCi0Jc3RhdGljIGNvbnN0IGNoYXIqIFJFU1BfU1RBVFVTOwotCXN0YXRpYyBjb25zdCBjaGFyKiBSRVNQX05FWFRfREFURTsKLQotCXJhcGlkanNvbjo6RG9jdW1lbnQgcmVzcG9uc2U7Ci0KLXB1YmxpYzoKLQlKU09ORk1JQ29tcG9uZW50KCk7Ci0JdmlydHVhbCB+SlNPTkZNSUNvbXBvbmVudCgpOwotCi0JaW50IGluaXQoY29uc3QgY2hhciAqIGZtdVJlc291cmNlTG9jYXRpb24pOwotCWZtaTJTdGF0dXMgZG9TdGVwKGZtaTJSZWFsIGN1cnJlbnRDb211bmljYXRpb25UaW1lLCBmbWkyUmVhbCBzdGVwU2l6ZSk7Ci0Jdm9pZCB0ZXJtaW5hdGUoKTsKLQotcHJpdmF0ZToKLQlmbWkyU3RhdHVzICBoYW5kbGVSZXNwb25zZSgpOwotCi0KLQotfTsKLQotI2VuZGlmIC8qSlNPTl9JTkNMVURFX0pTT05GTUlDT01QT05FTlRfSF8qLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2ZtdXdyYXBwZXIvc3JjL0Fic3RyYWN0Rk1JQ29tcG9uZW50LmNwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbXV3cmFwcGVyL3NyYy9BYnN0cmFjdEZNSUNvbXBvbmVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNWUxMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2ZtdXdyYXBwZXIvc3JjL0Fic3RyYWN0Rk1JQ29tcG9uZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBGTUlDb21wb25lbnQuY3BwCi0gKgotICogIENyZWF0ZWQgb246IEZlYiAyMywgMjAxNgotICogICAgICBBdXRob3I6IHNlYgotICovCi0KLSNpbmNsdWRlIDxBYnN0cmFjdEZNSUNvbXBvbmVudC5oPgotCi0KLUFic3RyYWN0Rk1JQ29tcG9uZW50Ojp+QWJzdHJhY3RGTUlDb21wb25lbnQoKXt9Ci0KLS8vZm1pMlN0YXR1cyBBYnN0cmFjdEZNSUNvbXBvbmVudDo6ZG9TdGVwKGZtaTJSZWFsIGN1cnJlbnRDb21tdW5pY2F0aW9uVGltZSwgZm1pMlJlYWwgc3RlcFNpemUpewotLy8JcmV0dXJuIGZtaTJFcnJvcjsKLS8vfTsKLS8vCi0vL3ZvaWQgQWJzdHJhY3RGTUlDb21wb25lbnQ6OnRlcm1pbmF0ZSgpewotLy99Ci0KLXZvaWQgQWJzdHJhY3RGTUlDb21wb25lbnQ6OmdldFJlYWwoY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCBudW1iZXJPZlZhbHVlcyxmbWkyUmVhbCB2YWx1ZXNbXSl7Ci0KLQlmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgbnVtYmVyT2ZWYWx1ZXM7IGluZGV4KyspIHsKLQkJaWYgKHJlc3BvbnNlUmVhbHMuZmluZCh2YWx1ZVJlZmVyZW5jZVtpbmRleF0pICE9IHJlc3BvbnNlUmVhbHMuZW5kKCkpewotCQkJdmFsdWVzW2luZGV4XSA9IHJlc3BvbnNlUmVhbHNbdmFsdWVSZWZlcmVuY2VbaW5kZXhdXTsKLQkJfQotCX0KLX0KLXZvaWQgQWJzdHJhY3RGTUlDb21wb25lbnQ6OmdldEludGVnZXIoY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCBudW1iZXJPZlZhbHVlcyxmbWkySW50ZWdlciB2YWx1ZXNbXSl7Ci0JZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG51bWJlck9mVmFsdWVzOyBpbmRleCsrKSB7Ci0JCWlmIChyZXNwb25zZUludGVnZXJzLmZpbmQodmFsdWVSZWZlcmVuY2VbaW5kZXhdKSAhPSByZXNwb25zZUludGVnZXJzLmVuZCgpKXsKLQkJCXZhbHVlc1tpbmRleF0gPSByZXNwb25zZUludGVnZXJzW3ZhbHVlUmVmZXJlbmNlW2luZGV4XV07Ci0JCX0KLQl9Ci19Ci12b2lkIEFic3RyYWN0Rk1JQ29tcG9uZW50OjpnZXRCb29sZWFuKGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZSB2YWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QgbnVtYmVyT2ZWYWx1ZXMsZm1pMkJvb2xlYW4gdmFsdWVzW10pewotCWZvciAoIHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgbnVtYmVyT2ZWYWx1ZXM7IGluZGV4KyspIHsKLQkJaWYgKHJlc3BvbnNlQm9vbGVhbnMuZmluZCh2YWx1ZVJlZmVyZW5jZVtpbmRleF0pICE9IHJlc3BvbnNlQm9vbGVhbnMuZW5kKCkpewotCQkJdmFsdWVzW2luZGV4XSA9IHJlc3BvbnNlQm9vbGVhbnNbdmFsdWVSZWZlcmVuY2VbaW5kZXhdXTsKLQkJfQotCX0KLX0KLXZvaWQgQWJzdHJhY3RGTUlDb21wb25lbnQ6OmdldFN0cmluZyhjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2UgdmFsdWVSZWZlcmVuY2VbXSwgc2l6ZV90IG51bWJlck9mVmFsdWVzLGZtaTJTdHJpbmcgdmFsdWVzW10pewotCWZvciAoIHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgbnVtYmVyT2ZWYWx1ZXM7IGluZGV4KyspIHsKLQkJaWYgKHJlc3BvbnNlU3RyaW5ncy5maW5kKHZhbHVlUmVmZXJlbmNlW2luZGV4XSkgIT0gcmVzcG9uc2VTdHJpbmdzLmVuZCgpKXsKLQkJCXZhbHVlc1tpbmRleF0gPSByZXNwb25zZVN0cmluZ3NbdmFsdWVSZWZlcmVuY2VbaW5kZXhdXS5jX3N0cigpOwotCQl9Ci0JfQotfQotCi12b2lkIEFic3RyYWN0Rk1JQ29tcG9uZW50OjpzZXRSZWFsKGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZSB2YWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QgbnVtYmVyT2ZWYWx1ZXMsY29uc3QgZm1pMlJlYWwgdmFsdWVzW10pewotCWZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJPZlZhbHVlczsgaW5kZXgrKykgewotCQlzZXRSZWFsUmVxdWVzdHNbdmFsdWVSZWZlcmVuY2VbaW5kZXhdXSA9IHZhbHVlc1tpbmRleF07Ci0JfQotCWlucHV0Q2hhbmdlZCA9IHRydWU7Ci19Ci12b2lkIEFic3RyYWN0Rk1JQ29tcG9uZW50OjpzZXRJbnRlZ2VyKGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZSB2YWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QgbnVtYmVyT2ZWYWx1ZXMsY29uc3QgZm1pMkludGVnZXIgdmFsdWVzW10pewotCWZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJPZlZhbHVlczsgaW5kZXgrKykgewotCQlzZXRJbnRlZ2VyUmVxdWVzdHNbdmFsdWVSZWZlcmVuY2VbaW5kZXhdXSA9IHZhbHVlc1tpbmRleF07Ci0JfQotCWlucHV0Q2hhbmdlZCA9IHRydWU7Ci19Ci12b2lkIEFic3RyYWN0Rk1JQ29tcG9uZW50OjpzZXRCb29sZWFuKGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZSB2YWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QgbnVtYmVyT2ZWYWx1ZXMsY29uc3QgZm1pMkJvb2xlYW4gdmFsdWVzW10pewotCWZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJPZlZhbHVlczsgaW5kZXgrKykgewotCQlzZXRCb29sZWFuUmVxdWVzdHNbdmFsdWVSZWZlcmVuY2VbaW5kZXhdXSA9IHZhbHVlc1tpbmRleF07Ci0JfQotCWlucHV0Q2hhbmdlZCA9IHRydWU7Ci19Ci12b2lkIEFic3RyYWN0Rk1JQ29tcG9uZW50OjpzZXRTdHJpbmcoY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCBudW1iZXJPZlZhbHVlcywgY29uc3QgZm1pMlN0cmluZyB2YWx1ZXNbXSl7Ci0JZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG51bWJlck9mVmFsdWVzOyBpbmRleCsrKSB7Ci0JCXNldFN0cmluZ1JlcXVlc3RzW3ZhbHVlUmVmZXJlbmNlW2luZGV4XV0gPSB2YWx1ZXNbaW5kZXhdOwotCX0KLQlpbnB1dENoYW5nZWQgPSB0cnVlOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvZm11d3JhcHBlci9zcmMvSlNPTkNsaWVudC5jcHAgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvZm11d3JhcHBlci9zcmMvSlNPTkNsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWFjNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2ZtdXdyYXBwZXIvc3JjL0pTT05DbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBKU09OQ2xpZW50LmNwcAotICoKLSAqICBDcmVhdGVkIG9uOiBNYXIgMjQsIDIwMTYKLSAqICAgICAgQXV0aG9yOiBzZWIKLSAqLwotCi0jaW5jbHVkZSAiSlNPTkNsaWVudC5oIgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSAicmFwaWRqc29uL3dyaXRlci5oIgotI2luY2x1ZGUgInJhcGlkanNvbi9zdHJpbmdidWZmZXIuaCIKLQotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBGSUxFX1NFUEFSQVRPUiAgICJcXCIKLSNkZWZpbmUgRVhFX0VYVEVOU0lPTiAiLmV4ZSIKLSNlbHNlCi0jZGVmaW5lIEZJTEVfU0VQQVJBVE9SICAgIi8iCi0jZGVmaW5lIEVYRV9FWFRFTlNJT04gIiAiCi0jZW5kaWYKLQotSlNPTkNsaWVudDo6SlNPTkNsaWVudCgpIDoKLQotCQlpb19zZXJ2aWNlKCksIHNvY2tldChpb19zZXJ2aWNlKSB7Ci0KLX0KLQotc3RkOjp0aHJlYWQmIEpTT05DbGllbnQ6OmdldFJjcFRocmVhZCgpewotCXJldHVybiAqcmNwVGhyZWFkOwotfQotCi12b2lkIHN0YXJ0UkNQKHN0ZDo6c3RyaW5nIGNtZCl7Ci0Jc3RkOjpjb3V0IDw8IGNtZCA8PCBzdGQ6OmVuZGw7Ci0JaW50IHJlc3VsdCA9IHN0ZDo6c3lzdGVtKGNtZC5jX3N0cigpKTsKLQlpZiggcmVzdWx0ICE9IDApewotCi0JfQotfQotCi0KLWludCBKU09OQ2xpZW50Ojppbml0KGNvbnN0IGNoYXIgKiBmbXVSZXNvdXJjZUxvY2F0aW9uKSB7Ci0JYXNpbzo6aXA6OnRjcDo6YWNjZXB0b3IgYWNjZXB0b3IoaW9fc2VydmljZSk7Ci0JY2hhciogcG9ydF9zdHIgPSBzdGQ6OmdldGVudigiTU9LQV9QT1JUX05VTUJFUiIpOwotCWlmIChwb3J0X3N0ciAhPSBOVUxMKSB7Ci0JCWludCBwb3J0X251bSA9IHN0ZDo6c3RydG9sKHBvcnRfc3RyLCBOVUxMLCAxMCk7Ci0JCXN0ZDo6Y291dCA8PCAiV2FpdGluZyBmb3IgTW9rYSBjb25uZXhpb24gb24gcG9ydCAiIDw8IHBvcnRfbnVtCi0JCQkJPDwgc3RkOjplbmRsOwotCQlhc2lvOjppcDo6dGNwOjplbmRwb2ludCBlbmRwb2ludCgKLQkJCQlhc2lvOjppcDo6YWRkcmVzczo6ZnJvbV9zdHJpbmcoIjEyNy4wLjAuMSIpLCBwb3J0X251bSk7Ci0JCWFjY2VwdG9yLm9wZW4oZW5kcG9pbnQucHJvdG9jb2woKSk7Ci0JCWFjY2VwdG9yLmJpbmQoZW5kcG9pbnQpOwotCQlhY2NlcHRvci5saXN0ZW4oKTsKLQkJYWNjZXB0b3IuYWNjZXB0KHNvY2tldCk7Ci0JCXJldHVybiAwOwotCi0KLQl9IGVsc2UgewotCQlhc2lvOjppcDo6dGNwOjplbmRwb2ludCBlbmRwb2ludChhc2lvOjppcDo6dGNwOjp2NCgpLCAwKTsKLQkJYWNjZXB0b3Iub3BlbihlbmRwb2ludC5wcm90b2NvbCgpKTsKLQkJYWNjZXB0b3IuYmluZChlbmRwb2ludCk7Ci0JCWFjY2VwdG9yLmxpc3RlbigpOwotCQlhc2lvOjppcDo6dGNwOjplbmRwb2ludCBsZSA9IGFjY2VwdG9yLmxvY2FsX2VuZHBvaW50KCk7Ci0KLQkJdW5zaWduZWQgc2hvcnQgcG9ydCA9IGxlLnBvcnQoKTsKLQotCQkvL2FzaW86OmlwOjp0Y3A6OmVuZHBvaW50IGVuZHBvaW50KGFzaW86OmlwOjphZGRyZXNzOjpmcm9tX3N0cmluZygiMTI3LjAuMC4xIiksIHBvcnROdW1iZXIpOwotCi0JCXN0ZDo6c3RyaW5nIGxvY2F0aW9uU3RyaW5nKGZtdVJlc291cmNlTG9jYXRpb24pOwotCi0JCXN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotCi0jaWZkZWYgX1dJTjMyCi0JCWxvY2F0aW9uU3RyaW5nID0gcmVwbGFjZUFsbChsb2NhdGlvblN0cmluZywgImZpbGU6Ly8vIiwiIik7Ci0JCWxvY2F0aW9uU3RyaW5nID0gcmVwbGFjZUFsbChsb2NhdGlvblN0cmluZywgImZpbGU6Ly8iLCIiKTsKLQkJbG9jYXRpb25TdHJpbmcgPSByZXBsYWNlQWxsKGxvY2F0aW9uU3RyaW5nLCAiLyIsIlxcIik7Ci0JCXNzIDw8bG9jYXRpb25TdHJpbmcgPDxGSUxFX1NFUEFSQVRPUiA8PCJyY3AiIDw8IEZJTEVfU0VQQVJBVE9SPDwiZWNsaXBzZWMuZXhlIjsKLQkJc3M8PCIgLWNvbmZpZ3VyYXRpb24gQG5vbmUiOwotCQlzcyA8PCIgLS1sYXVuY2hlci5pbmkgIjw8IGxvY2F0aW9uU3RyaW5nIDw8IEZJTEVfU0VQQVJBVE9SPDwicmNwIiA8PCBGSUxFX1NFUEFSQVRPUjw8ICJmbXVfcmNwLmluaSI7Ci0JCXNzIDw8IiAtZm11ICI8PCBsb2NhdGlvblN0cmluZyA8PCBGSUxFX1NFUEFSQVRPUiA8PCAiLi4gLXBvcnQgIiA8PCBwb3J0OwotCi0jZWxzZQotCi0JCWxvY2F0aW9uU3RyaW5nID0gcmVwbGFjZUFsbChsb2NhdGlvblN0cmluZywgImZpbGU6Ly8iLCAiIik7Ci0JCXNzIDw8ICJjaG1vZCAtUiBhK3ggIiA8PCBsb2NhdGlvblN0cmluZyA8PCAiOyAiOwotCQlzcyA8PCBsb2NhdGlvblN0cmluZyA8PCBGSUxFX1NFUEFSQVRPUiA8PCAicmNwIiA8PCBGSUxFX1NFUEFSQVRPUjw8ICJmbXVfcmNwIjsKLQkJc3MgPDwgIiAtZm11ICIgPDwgbG9jYXRpb25TdHJpbmcgPDwgRklMRV9TRVBBUkFUT1IgPDwgIi4uIC1wb3J0ICI8PCBwb3J0OwotI2VuZGlmCi0KLQkJc3RkOjpzdHJpbmcgY21kICA9IHNzLnN0cigpOwotCi0JCXJjcFRocmVhZCA9IG5ldyBzdGQ6OnRocmVhZChzdGFydFJDUCxjbWQpOwotCi0JCWFjY2VwdG9yLmFjY2VwdChzb2NrZXQpOwotCi0JCXJldHVybiAwOwotCX0KLQotfQotCi0KLXN0ZDo6c3RyaW5nIEpTT05DbGllbnQ6OnJlcGxhY2VBbGwoc3RkOjpzdHJpbmcgc3RyLCBjb25zdCBzdGQ6OnN0cmluZyYgZnJvbSwKLQkJY29uc3Qgc3RkOjpzdHJpbmcmIHRvKSB7Ci0Jc2l6ZV90IHN0YXJ0X3BvcyA9IDA7Ci0Jd2hpbGUgKChzdGFydF9wb3MgPSBzdHIuZmluZChmcm9tLCBzdGFydF9wb3MpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotCQlzdHIucmVwbGFjZShzdGFydF9wb3MsIGZyb20ubGVuZ3RoKCksIHRvKTsKLQkJc3RhcnRfcG9zICs9IHRvLmxlbmd0aCgpOyAvLyBIYW5kbGVzIGNhc2Ugd2hlcmUgJ3RvJyBpcyBhIHN1YnN0cmluZyBvZiAnZnJvbScKLQl9Ci0JcmV0dXJuIHN0cjsKLX0KLQotSlNPTkNsaWVudDo6fkpTT05DbGllbnQoKSB7Ci0Jc29ja2V0LmNsb3NlKCk7Ci0KLX0KLQotdm9pZCBKU09OQ2xpZW50Ojpub25CbG9ja2luZ1NlbmRSZXF1ZXN0KHJhcGlkanNvbjo6RG9jdW1lbnQmIHJlcXVlc3QsCi0JCXJhcGlkanNvbjo6RG9jdW1lbnQmIHJlc3BvbnNlKSB7Ci0KLQkvLyBDb252ZXJ0IEpTT04gZG9jdW1lbnQgdG8gc3RyaW5nCi0JcmFwaWRqc29uOjpTdHJpbmdCdWZmZXIgcmVxYnVmOwotCXJhcGlkanNvbjo6V3JpdGVyPHJhcGlkanNvbjo6U3RyaW5nQnVmZmVyPiB3cml0ZXIocmVxYnVmKTsKLQlyZXF1ZXN0LkFjY2VwdCh3cml0ZXIpOwotCi0Jc29ja2V0LndyaXRlX3NvbWUoYXNpbzo6YnVmZmVyKHJlcWJ1Zi5HZXRTdHJpbmcoKSwgcmVxYnVmLkdldFNpemUoKSkpOwotfQotCi12b2lkIEpTT05DbGllbnQ6OnNlbmRSZXF1ZXN0KHJhcGlkanNvbjo6RG9jdW1lbnQmIHJlcXVlc3QsCi0JCXJhcGlkanNvbjo6RG9jdW1lbnQmIHJlc3BvbnNlKSB7Ci0KLQlub25CbG9ja2luZ1NlbmRSZXF1ZXN0KHJlcXVlc3QsIHJlc3BvbnNlKTsKLQotCi0JLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB3b3JraW5nLCBidXQgaXMgdmVyeSBzbG93IQotCSAqIFdlIHNob3VsZCBpbnZlc3RpZ2F0ZSB3aHkuLi4gRmluYWxseSByYXRoZXIgdXNlIGEgc3RhdGljIGJ1ZmZlcgotCSAqLwotLy8JYm9vc3Q6OmFycmF5PGNoYXIsMTA+IHNpemVCdWZmOwotLy8Jc29ja2V0LnJlYWRfc29tZShhc2lvOjpidWZmZXIoc2l6ZUJ1ZmYsMTApKTsKLQotLy8gICAgYXNpbzo6cmVhZChzb2NrZXQsIGFzaW86OmJ1ZmZlcihzaXplQnVmZiwxMCksCi0vLwkgICAgICAgICAgICAgICAgICBhc2lvOjp0cmFuc2Zlcl9hdF9sZWFzdCgxKSk7Ci0vLyAgc29ja2V0LnJlYWRfc29tZShhc2lvOjpidWZmZXIoc2l6ZUJ1ZmYpKTsKLS8vICAgICBpbnQgbWVzc2FnZVNpemUgPSBhdG9pKCBzaXplQnVmZi5kYXRhKCkgKTsKLQotLy8Jc3RkOjp2ZWN0b3I8Y2hhcj4gbWVzc2FnZUJ1ZmYobWVzc2FnZVNpemUpOwotLy8JYm9vc3Q6OmFycmF5PGNoYXIsMjU2PiBtZXNzYWdlQnVmZjsKLS8vCXNvY2tldC5yZWFkX3NvbWUoYXNpbzo6YnVmZmVyKG1lc3NhZ2VCdWZmKSk7Ci0vLwlzb2NrZXQucmVhZF9zb21lKGFzaW86OmJ1ZmZlcihtZXNzYWdlQnVmZixtZXNzYWdlU2l6ZSkpOwotLy8JYXNpbzo6cmVhZChzb2NrZXQsIGFzaW86OmJ1ZmZlcihtZXNzYWdlQnVmZiwgbWVzc2FnZVNpemUpLAotLy8JICAgICAgICAgICAgICAgICAgYXNpbzo6dHJhbnNmZXJfYXRfbGVhc3QoMSkpOwotCi0KLQlzaXplX3QgbmJCeXRlcyA9IHNvY2tldC5yZWFkX3NvbWUoYXNpbzo6YnVmZmVyKGh1Z2VTdGF0aWNCdWZmKSk7Ci0KLQlyZXNwb25zZS5QYXJzZSgmaHVnZVN0YXRpY0J1ZmZbMF0sIG5iQnl0ZXMpOwotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbXV3cmFwcGVyL3NyYy9KU09ORk1JQ29tcG9uZW50LmNwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbXV3cmFwcGVyL3NyYy9KU09ORk1JQ29tcG9uZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhODQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvZm11d3JhcHBlci9zcmMvSlNPTkZNSUNvbXBvbmVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIFRocmlmdEZNSUNvbXBvbmVudC5jcHAKLSAqCi0gKiAgQ3JlYXRlZCBvbjogRmViIDI0LCAyMDE2Ci0gKiAgICAgIEF1dGhvcjogc2ViCi0gKi8KLQotI2luY2x1ZGUgIkpTT05GTUlDb21wb25lbnQuaCIKLQotI2luY2x1ZGUgIkpTT05DbGllbnQuaCIKLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotY29uc3QgY2hhciogSlNPTkZNSUNvbXBvbmVudDo6UkVRX1NURVBfX0NVUlJFTlRfVElNRT0gInQiOwotY29uc3QgY2hhciogSlNPTkZNSUNvbXBvbmVudDo6UkVRX1NURVBfX1NURVBfU0laRSA9ICJoIjsKLWNvbnN0IGNoYXIqIEpTT05GTUlDb21wb25lbnQ6OlJFUV9TVEVQPSAic3RlcCI7Ci1jb25zdCBjaGFyKiBKU09ORk1JQ29tcG9uZW50OjpSRVFfSU5JVD0iaW5pIjsKLWNvbnN0IGNoYXIqIEpTT05GTUlDb21wb25lbnQ6OlJFUV9URVJNSU5BVEU9ICJ0ZXIiOwotCi1jb25zdCBjaGFyKiBKU09ORk1JQ29tcG9uZW50OjpSRVFfU1RFUF9fSU5UVlJTPSAiaXYiOwotY29uc3QgY2hhciogSlNPTkZNSUNvbXBvbmVudDo6UkVRX1NURVBfX0JPT0xWUlM9ICJidiI7Ci1jb25zdCBjaGFyKiBKU09ORk1JQ29tcG9uZW50OjpSRVFfU1RFUF9fRE9VQkxFVlJTPSAiZHYiOwotY29uc3QgY2hhciogSlNPTkZNSUNvbXBvbmVudDo6UkVRX1NURVBfX1NUUklOR1ZSUz0gInN2IjsKLQotY29uc3QgY2hhciogSlNPTkZNSUNvbXBvbmVudDo6UkVRX1NURVBfX0lOVD0gImkiOwotY29uc3QgY2hhciogSlNPTkZNSUNvbXBvbmVudDo6UkVRX1NURVBfX0JPT0w9ICJiIjsKLWNvbnN0IGNoYXIqIEpTT05GTUlDb21wb25lbnQ6OlJFUV9TVEVQX19ET1VCTEU9ICJkIjsKLWNvbnN0IGNoYXIqIEpTT05GTUlDb21wb25lbnQ6OlJFUV9TVEVQX19TVFJJTkc9ICJzIjsKLQotCi0KLWNvbnN0IGNoYXIqIEpTT05GTUlDb21wb25lbnQ6OlJFU1BfU1RBVFVTPSAiciI7Ci1jb25zdCBjaGFyKiBKU09ORk1JQ29tcG9uZW50OjpSRVNQX05FWFRfREFURT0gIm5kIjsKLQotCi1KU09ORk1JQ29tcG9uZW50OjpKU09ORk1JQ29tcG9uZW50KCk6Y2xpZW50KCksIHJlc3BvbnNlKCkKLQotewotCi19Ci0KLQotaW50IEpTT05GTUlDb21wb25lbnQ6OmluaXQoY29uc3QgY2hhciAqIGZtdVJlc291cmNlTG9jYXRpb24pewotCWludCBzdGF0dXMgPSAgY2xpZW50LmluaXQoZm11UmVzb3VyY2VMb2NhdGlvbik7Ci0JaWYgKHN0YXR1cyA9PSAwKXsKLQkJCXJhcGlkanNvbjo6RG9jdW1lbnQgcmVxdWVzdDsKLQkJCXJlcXVlc3QuU2V0T2JqZWN0KCk7Ci0JCQlyYXBpZGpzb246OkRvY3VtZW50OjpBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3I9cmVxdWVzdC5HZXRBbGxvY2F0b3IoKSA7Ci0KLQkJCXJhcGlkanNvbjo6VmFsdWUgaW5pdCh0cnVlKTsKLQkJCXJlcXVlc3QuQWRkTWVtYmVyKHJhcGlkanNvbjo6U3RyaW5nUmVmKFJFUV9JTklUKSwgaW5pdCwgYWxsb2NhdG9yKTsKLQkJCWNsaWVudC5zZW5kUmVxdWVzdChyZXF1ZXN0LCByZXNwb25zZSk7Ci0JCQloYW5kbGVSZXNwb25zZSgpOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0KLUpTT05GTUlDb21wb25lbnQ6On5KU09ORk1JQ29tcG9uZW50KCkgewotCi19Ci0KLWZtaTJTdGF0dXMgIEpTT05GTUlDb21wb25lbnQ6OmRvU3RlcChmbWkyUmVhbCBjdXJyZW50Q29tbXVuaWNhdGlvblRpbWUsIGZtaTJSZWFsIHN0ZXBTaXplKXsKLQlmbWkyU3RhdHVzIHN0YXR1cyA9IGZtaTJPSzsKLQlpZiAoIGlucHV0Q2hhbmdlZHx8ICgoY3VycmVudENvbW11bmljYXRpb25UaW1lKyBzdGVwU2l6ZSk+IG5leHREYXRlKSl7Ci0JCWlucHV0Q2hhbmdlZCA9IGZhbHNlOwotCQlyYXBpZGpzb246OkRvY3VtZW50IHJlcXVlc3Q7Ci0JCXJlcXVlc3QuU2V0T2JqZWN0KCk7Ci0JCXJhcGlkanNvbjo6RG9jdW1lbnQ6OkFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcj1yZXF1ZXN0LkdldEFsbG9jYXRvcigpIDsKLQotCi0KLQkJcmFwaWRqc29uOjpWYWx1ZSBjb21tdW5pY2F0aW9uVGltZVZhbHVlKGN1cnJlbnRDb21tdW5pY2F0aW9uVGltZSk7Ci0JCXJhcGlkanNvbjo6VmFsdWUgc3RlcFNpemVWYWx1ZShzdGVwU2l6ZSk7Ci0KLQotCQlyZXF1ZXN0LkFkZE1lbWJlcihyYXBpZGpzb246OlN0cmluZ1JlZihSRVFfU1RFUF9fQ1VSUkVOVF9USU1FKSwgY29tbXVuaWNhdGlvblRpbWVWYWx1ZSwgYWxsb2NhdG9yKTsKLQkJcmVxdWVzdC5BZGRNZW1iZXIocmFwaWRqc29uOjpTdHJpbmdSZWYoUkVRX1NURVBfX1NURVBfU0laRSksIHN0ZXBTaXplVmFsdWUsIGFsbG9jYXRvcik7Ci0KLQotCQlpZiAoIXNldEJvb2xlYW5SZXF1ZXN0cy5lbXB0eSgpKXsKLQkJCXJhcGlkanNvbjo6VmFsdWUgYm9vbFZSKHJhcGlkanNvbjo6a0FycmF5VHlwZSk7Ci0JCQlyYXBpZGpzb246OlZhbHVlIGJvb2xzKHJhcGlkanNvbjo6a0FycmF5VHlwZSk7Ci0JCQlmb3IoIHN0ZDo6bWFwPGludCxib29sPjo6aXRlcmF0b3IgaXRlcmF0b3IgPSBzZXRCb29sZWFuUmVxdWVzdHMuYmVnaW4oKTsgaXRlcmF0b3IgIT0gc2V0Qm9vbGVhblJlcXVlc3RzLmVuZCgpOyBpdGVyYXRvcisrKSB7Ci0JCQkJYm9vbFZSLlB1c2hCYWNrKGl0ZXJhdG9yLT5maXJzdCwgYWxsb2NhdG9yKTsKLQkJCQlib29scy5QdXNoQmFjayhpdGVyYXRvci0+c2Vjb25kLCBhbGxvY2F0b3IpOwotCQkJfQotCQkJc2V0Qm9vbGVhblJlcXVlc3RzLmNsZWFyKCk7Ci0JCQlyZXF1ZXN0LkFkZE1lbWJlcihyYXBpZGpzb246OlN0cmluZ1JlZihSRVFfU1RFUF9fQk9PTFZSUyksIGJvb2xWUiwgYWxsb2NhdG9yKTsKLQkJCXJlcXVlc3QuQWRkTWVtYmVyKHJhcGlkanNvbjo6U3RyaW5nUmVmKFJFUV9TVEVQX19CT09MKSwgYm9vbHMsIGFsbG9jYXRvcik7Ci0JCX0KLQotCQlpZiAoIXNldFJlYWxSZXF1ZXN0cy5lbXB0eSgpKXsKLQkJCXJhcGlkanNvbjo6VmFsdWUgcmVhbFZSKHJhcGlkanNvbjo6a0FycmF5VHlwZSk7Ci0JCQlyYXBpZGpzb246OlZhbHVlIHJlYWxzKHJhcGlkanNvbjo6a0FycmF5VHlwZSk7Ci0JCQlmb3IoIHN0ZDo6bWFwPGludCxkb3VibGU+OjppdGVyYXRvciBpdGVyYXRvciA9IHNldFJlYWxSZXF1ZXN0cy5iZWdpbigpOyBpdGVyYXRvciAhPSBzZXRSZWFsUmVxdWVzdHMuZW5kKCk7IGl0ZXJhdG9yKyspIHsKLQkJCQlyZWFsVlIuUHVzaEJhY2soaXRlcmF0b3ItPmZpcnN0LCBhbGxvY2F0b3IpOwotCQkJCXJlYWxzLlB1c2hCYWNrKGl0ZXJhdG9yLT5zZWNvbmQsIGFsbG9jYXRvcik7Ci0JCQl9Ci0JCQlzZXRSZWFsUmVxdWVzdHMuY2xlYXIoKTsKLQkJCXJlcXVlc3QuQWRkTWVtYmVyKHJhcGlkanNvbjo6U3RyaW5nUmVmKFJFUV9TVEVQX19ET1VCTEVWUlMpLCByZWFsVlIsIGFsbG9jYXRvcik7Ci0JCQlyZXF1ZXN0LkFkZE1lbWJlcihyYXBpZGpzb246OlN0cmluZ1JlZihSRVFfU1RFUF9fRE9VQkxFKSwgcmVhbHMsIGFsbG9jYXRvcik7Ci0KLQkJfQotCQlpZiAoIXNldEludGVnZXJSZXF1ZXN0cy5lbXB0eSgpKXsKLQkJCXJhcGlkanNvbjo6VmFsdWUgaW50VlIocmFwaWRqc29uOjprQXJyYXlUeXBlKTsKLQkJCXJhcGlkanNvbjo6VmFsdWUgaW50cyhyYXBpZGpzb246OmtBcnJheVR5cGUpOwotCQkJZm9yKCBzdGQ6Om1hcDxpbnQsaW50Pjo6aXRlcmF0b3IgaXRlcmF0b3IgPSBzZXRJbnRlZ2VyUmVxdWVzdHMuYmVnaW4oKTsgaXRlcmF0b3IgIT0gc2V0SW50ZWdlclJlcXVlc3RzLmVuZCgpOyBpdGVyYXRvcisrKSB7Ci0JCQkJaW50VlIuUHVzaEJhY2soaXRlcmF0b3ItPmZpcnN0LCBhbGxvY2F0b3IpOwotCQkJCWludHMuUHVzaEJhY2soaXRlcmF0b3ItPnNlY29uZCwgYWxsb2NhdG9yKTsKLQkJCX0KLQkJCXNldEludGVnZXJSZXF1ZXN0cy5jbGVhcigpOwotCQkJcmVxdWVzdC5BZGRNZW1iZXIocmFwaWRqc29uOjpTdHJpbmdSZWYoUkVRX1NURVBfX0lOVFZSUyksaW50VlIsIGFsbG9jYXRvcik7Ci0JCQlyZXF1ZXN0LkFkZE1lbWJlcihyYXBpZGpzb246OlN0cmluZ1JlZihSRVFfU1RFUF9fSU5UKSwgaW50cywgYWxsb2NhdG9yKTsKLQkJfQotCQlpZiAoIXNldFN0cmluZ1JlcXVlc3RzLmVtcHR5KCkpewotCQkJcmFwaWRqc29uOjpWYWx1ZSBzdHJpbmdWUihyYXBpZGpzb246OmtBcnJheVR5cGUpOwotCQkJcmFwaWRqc29uOjpWYWx1ZSBzdHJpbmdzKHJhcGlkanNvbjo6a0FycmF5VHlwZSk7Ci0JCQlmb3IoIHN0ZDo6bWFwPGludCxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ZXJhdG9yID0gc2V0U3RyaW5nUmVxdWVzdHMuYmVnaW4oKTsgaXRlcmF0b3IgIT0gc2V0U3RyaW5nUmVxdWVzdHMuZW5kKCk7IGl0ZXJhdG9yKyspIHsKLQkJCQlzdHJpbmdWUi5QdXNoQmFjayhpdGVyYXRvci0+Zmlyc3QsIGFsbG9jYXRvcik7Ci0JCQkJcmFwaWRqc29uOjpWYWx1ZSB2YWx1ZTsKLQkJCQl2YWx1ZS5TZXRTdHJpbmcoaXRlcmF0b3ItPnNlY29uZC5jX3N0cigpLGFsbG9jYXRvcik7Ci0JCQkJc3RyaW5ncy5QdXNoQmFjayh2YWx1ZSwgYWxsb2NhdG9yKTsKLQkJCX0KLQkJCXNldFN0cmluZ1JlcXVlc3RzLmNsZWFyKCk7Ci0JCQlyZXF1ZXN0LkFkZE1lbWJlcihyYXBpZGpzb246OlN0cmluZ1JlZihSRVFfU1RFUF9fU1RSSU5HVlJTKSxzdHJpbmdWUiwgYWxsb2NhdG9yKTsKLQkJCXJlcXVlc3QuQWRkTWVtYmVyKHJhcGlkanNvbjo6U3RyaW5nUmVmKFJFUV9TVEVQX19TVFJJTkcpLCBzdHJpbmdzLCBhbGxvY2F0b3IpOwotCQl9Ci0KLQotCi0KLQkJIGNsaWVudC5zZW5kUmVxdWVzdChyZXF1ZXN0LCByZXNwb25zZSk7Ci0KLQotCQlzdGF0dXMgPSBoYW5kbGVSZXNwb25zZSgpOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotCi19Ci0KLQotCi12b2lkICBKU09ORk1JQ29tcG9uZW50Ojp0ZXJtaW5hdGUoKXsKLQlyYXBpZGpzb246OkRvY3VtZW50IHJlcXVlc3Q7Ci0JcmVxdWVzdC5TZXRPYmplY3QoKTsKLQlyYXBpZGpzb246OkRvY3VtZW50OjpBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3I9cmVxdWVzdC5HZXRBbGxvY2F0b3IoKSA7Ci0KLQlyYXBpZGpzb246OlZhbHVlIHRlcm1pbmF0ZSh0cnVlKTsKLQlyZXF1ZXN0LkFkZE1lbWJlcihyYXBpZGpzb246OlN0cmluZ1JlZihSRVFfVEVSTUlOQVRFKSwgdGVybWluYXRlLCBhbGxvY2F0b3IpOwotCWNsaWVudC5ub25CbG9ja2luZ1NlbmRSZXF1ZXN0KHJlcXVlc3QscmVzcG9uc2UgKTsKLQlpZiAoY2xpZW50LmdldFJjcFRocmVhZCgpLmpvaW5hYmxlKCkpewotCQljbGllbnQuZ2V0UmNwVGhyZWFkKCkuam9pbigpOwotCX0KLQotfQotCi1mbWkyU3RhdHVzICBKU09ORk1JQ29tcG9uZW50OjpoYW5kbGVSZXNwb25zZSgpewotCi0JaWYgKHJlc3BvbnNlLkhhc01lbWJlcihyYXBpZGpzb246OlN0cmluZ1JlZihSRVFfU1RFUF9fQk9PTCkpKXsKLQkJY29uc3QgcmFwaWRqc29uOjpWYWx1ZSYgYm9vbFZScyA9IHJlc3BvbnNlW1JFUV9TVEVQX19CT09MVlJTXTsKLQkJY29uc3QgcmFwaWRqc29uOjpWYWx1ZSYgYm9vbHMgPSByZXNwb25zZVtSRVFfU1RFUF9fQk9PTF07Ci0KLQkJZm9yIChyYXBpZGpzb246OlNpemVUeXBlIGkgPSAwOyBpIDwgYm9vbFZScy5TaXplKCk7IGkrKykgewotCQkJcmVzcG9uc2VCb29sZWFuc1tib29sVlJzW2ldLkdldEludCgpXT0gYm9vbHNbaV0uR2V0Qm9vbCgpOwotCQl9Ci0JfQotCi0JaWYgKHJlc3BvbnNlLkhhc01lbWJlcihyYXBpZGpzb246OlN0cmluZ1JlZihSRVFfU1RFUF9fRE9VQkxFKSkpewotCQljb25zdCByYXBpZGpzb246OlZhbHVlJiBkb3VibGVWUnMgPSByZXNwb25zZVtSRVFfU1RFUF9fRE9VQkxFVlJTXTsKLQkJY29uc3QgcmFwaWRqc29uOjpWYWx1ZSYgZG91YmxlcyA9IHJlc3BvbnNlW1JFUV9TVEVQX19ET1VCTEVdOwotCi0JCWZvciAocmFwaWRqc29uOjpTaXplVHlwZSBpID0gMDsgaSA8IGRvdWJsZVZScy5TaXplKCk7IGkrKykgewotCQkJcmVzcG9uc2VSZWFsc1tkb3VibGVWUnNbaV0uR2V0SW50KCldPSBkb3VibGVzW2ldLkdldERvdWJsZSgpOwotCQl9Ci0JfQotCi0JaWYgKHJlc3BvbnNlLkhhc01lbWJlcihyYXBpZGpzb246OlN0cmluZ1JlZihSRVFfU1RFUF9fSU5UKSkpewotCQljb25zdCByYXBpZGpzb246OlZhbHVlJiBpbnRWUnMgPSByZXNwb25zZVtSRVFfU1RFUF9fSU5UVlJTXTsKLQkJY29uc3QgcmFwaWRqc29uOjpWYWx1ZSYgaW50cyA9IHJlc3BvbnNlW1JFUV9TVEVQX19JTlRdOwotCi0JCWZvciAocmFwaWRqc29uOjpTaXplVHlwZSBpID0gMDsgaSA8IGludFZScy5TaXplKCk7IGkrKykgewotCQkJcmVzcG9uc2VJbnRlZ2Vyc1tpbnRWUnNbaV0uR2V0SW50KCldPSBpbnRzW2ldLkdldEludCgpOwotCQl9Ci0JfQotCi0KLQlpZiAocmVzcG9uc2UuSGFzTWVtYmVyKHJhcGlkanNvbjo6U3RyaW5nUmVmKFJFUV9TVEVQX19TVFJJTkcpKSAgJiYgcmVzcG9uc2UuSGFzTWVtYmVyKHJhcGlkanNvbjo6U3RyaW5nUmVmKFJFUV9TVEVQX19TVFJJTkdWUlMpKSApewotCQljb25zdCByYXBpZGpzb246OlZhbHVlJiBzdHJpbmdWUnMgPSByZXNwb25zZVtSRVFfU1RFUF9fU1RSSU5HVlJTXTsKLQkJY29uc3QgcmFwaWRqc29uOjpWYWx1ZSYgc3RyaW5ncyA9IHJlc3BvbnNlW1JFUV9TVEVQX19TVFJJTkddOwotCi0JCS8vCi0JCWlmIChzdHJpbmdzLklzQXJyYXkoKSl7Ci0JCQlmb3IgKHJhcGlkanNvbjo6U2l6ZVR5cGUgaSA9IDA7IGkgPCBzdHJpbmdWUnMuU2l6ZSgpOyBpKyspIHsKLQkJCQkJCXJlc3BvbnNlU3RyaW5nc1tzdHJpbmdWUnNbaV0uR2V0SW50KCldPSBzdHJpbmdzW2ldLkdldFN0cmluZygpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlpZiAocmVzcG9uc2UuSGFzTWVtYmVyKHJhcGlkanNvbjo6U3RyaW5nUmVmKFJFU1BfTkVYVF9EQVRFKSkpIHsKLQkJY29uc3QgcmFwaWRqc29uOjpWYWx1ZSYgbmV4dERhdGVWYWx1ZSA9IHJlc3BvbnNlW1JFU1BfTkVYVF9EQVRFXTsKLQkJaWYgKG5leHREYXRlVmFsdWUuSXNEb3VibGUoKSl7Ci0JCQluZXh0RGF0ZSA9IG5leHREYXRlVmFsdWUuR2V0RG91YmxlKCk7Ci0JCX0KLQl9ZWxzZSB7Ci0JCS8vaWYgd2UgZGlkbid0IHJlY2VpdmUgYSBuZXh0IGRhdGUgbmV3IHZhbHVlLCBpZiBtZWFucyB0aGF0IGVpdGhlciAgTW9rYSBzaW11bGF0aW9uIGlzIGZpbmlzaGVkCi0JCS8vZWl0aGVyIHRoZXJlIGFyZSBvbmx5IGNoYW5nZSBldmVudC4gV2Ugd29uJ3QgbmVlZCB0byBtYWtlIGZ1cnRoZXIgZG8gc3RlcCBpZiBpbnB1dHMgZG9uJ3QgY2hhbmdlCi0JCSBuZXh0RGF0ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4KCk7Ci0JfQotCi0JaWYgKHJlc3BvbnNlLkhhc01lbWJlcihyYXBpZGpzb246OlN0cmluZ1JlZihSRVNQX1NUQVRVUykpKSB7Ci0JCS8vVE9ETyBjb21wbGV0ZSBzdGF0dXMgcGFyc2luZwotCX0KLQlyZXR1cm4gZm1pMlN0YXR1czo6Zm1pMk9LOwotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2ZtdXdyYXBwZXIvc3JjL0pTT05GTVVXcmFwcGVyLmNwcCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9mbXV3cmFwcGVyL3NyYy9KU09ORk1VV3JhcHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNzM4N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL2ZtdXdyYXBwZXIvc3JjL0pTT05GTVVXcmFwcGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICogZm11V3JhcHBlci5jcHAKLSAqCi0gKiAgQ3JlYXRlZCBvbjogRmViIDIzLCAyMDE2Ci0gKiAgICAgIEF1dGhvcjogc2ViCi0gKi8KLQotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJmbWkyRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiSlNPTkZNSUNvbXBvbmVudC5oIgotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotCi0KLWZtaTJDb21wb25lbnQgZm1pMkluc3RhbnRpYXRlKGZtaTJTdHJpbmcgaW5zdGFuY2VOYW1lLCBmbWkyVHlwZSBmbXVUeXBlLCBmbWkyU3RyaW5nIGZtdUdVSUQsCi0JCWZtaTJTdHJpbmcgZm11UmVzb3VyY2VMb2NhdGlvbiwgY29uc3QgZm1pMkNhbGxiYWNrRnVuY3Rpb25zKiBjYWxsYmFja3MsCi0JCWZtaTJCb29sZWFuIHZpc2libGUsIGZtaTJCb29sZWFuIGxvZ2dpbmdPbikgewotCi0JSlNPTkZNSUNvbXBvbmVudCogcmV0ID0gbmV3IEpTT05GTUlDb21wb25lbnQoKTsKLQlpbnQgcmVzdWx0ID0gcmV0LT5pbml0KGZtdVJlc291cmNlTG9jYXRpb24pOwotCWlmIChyZXN1bHQgIT0gMCl7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0KLQotCi1jb25zdCBjaGFyKiBmbWkyR2V0VHlwZXNQbGF0Zm9ybSgpIHsKLQlyZXR1cm4gImRlZmF1bHQiOwotfQotCi1jb25zdCBjaGFyKiBmbWkyR2V0VmVyc2lvbigpIHsKLQlyZXR1cm4gIjIuMCI7Ci19Ci0KLWZtaTJTdGF0dXMgZm1pMlNldERlYnVnTG9nZ2luZyhmbWkyQ29tcG9uZW50IGNvbXBvbmVudCwgZm1pMkJvb2xlYW4gbG9nZ2luZ09uLCBzaXplX3QgbnVtYmVyT2ZDYXRlZ29yaWVzLAotCQljb25zdCBmbWkyU3RyaW5nIGNhdGVnb3JpZXNbXSkgewotCXJldHVybiBmbWkyT0s7Ci19Ci0KLQotCi12b2lkIGZtaTJGcmVlSW5zdGFuY2UoZm1pMkNvbXBvbmVudCBjb21wb25lbnQpIHsKLQlBYnN0cmFjdEZNSUNvbXBvbmVudCogZm1pQ21wID0gcmVpbnRlcnByZXRfY2FzdDxBYnN0cmFjdEZNSUNvbXBvbmVudCo+KGNvbXBvbmVudCk7Ci0JZGVsZXRlKGZtaUNtcCk7Ci19Ci0KLQotZm1pMlN0YXR1cyBmbWkyU2V0dXBFeHBlcmltZW50KGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBmbWkyQm9vbGVhbiB0b2xlcmFuY2VEZWZpbmVkLCBmbWkyUmVhbCB0b2xlcmFuY2UsCi0JCWZtaTJSZWFsIHN0YXJ0VGltZSwgZm1pMkJvb2xlYW4gc3RvcFRpbWVEZWZpbmVkLCBmbWkyUmVhbCBzdG9wVGltZSkgewotCXJldHVybiBmbWkyT0s7Ci19Ci0KLWZtaTJTdGF0dXMgZm1pMkVudGVySW5pdGlhbGl6YXRpb25Nb2RlKGZtaTJDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JcmV0dXJuIGZtaTJPSzsKLX0KLQotZm1pMlN0YXR1cyBmbWkyRXhpdEluaXRpYWxpemF0aW9uTW9kZShmbWkyQ29tcG9uZW50IGNvbXBvbmVudCkgewotCXJldHVybiBmbWkyT0s7Ci19Ci0KLWZtaTJTdGF0dXMgZm1pMlRlcm1pbmF0ZShmbWkyQ29tcG9uZW50IGNvbXBvbmVudCkgewotCUFic3RyYWN0Rk1JQ29tcG9uZW50KiBmbWlDbXAgPSByZWludGVycHJldF9jYXN0PEFic3RyYWN0Rk1JQ29tcG9uZW50Kj4oY29tcG9uZW50KTsKLQkJZm1pQ21wLT50ZXJtaW5hdGUoKTsKLQkJcmV0dXJuIGZtaTJPSzsKLX0KLQotZm1pMlN0YXR1cyBmbWkyUmVzZXQoZm1pMkNvbXBvbmVudCBjb21wb25lbnQpIHsKLQlyZXR1cm4gZm1pMk9LOwotfQotCi1mbWkyU3RhdHVzIGZtaTJHZXRSZWFsKGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2UgdmFsdWVSZWZlcmVuY2VbXSwgc2l6ZV90IG51bWJlck9mVmFsdWVzLAotCQlmbWkyUmVhbCB2YWx1ZXNbXSkgewotCUFic3RyYWN0Rk1JQ29tcG9uZW50KiBmbWlDbXAgPSByZWludGVycHJldF9jYXN0PEFic3RyYWN0Rk1JQ29tcG9uZW50Kj4oY29tcG9uZW50KTsKLQlmbWlDbXAtPmdldFJlYWwodmFsdWVSZWZlcmVuY2UsbnVtYmVyT2ZWYWx1ZXMsIHZhbHVlcyk7Ci0JcmV0dXJuIGZtaTJPSzsKLX0KLQotZm1pMlN0YXR1cyBmbWkyR2V0SW50ZWdlcihmbWkyQ29tcG9uZW50IGNvbXBvbmVudCwgY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCBudW1iZXJPZlZhbHVlcywKLQkJZm1pMkludGVnZXIgdmFsdWVzW10pIHsKLQlBYnN0cmFjdEZNSUNvbXBvbmVudCogZm1pQ21wID0gcmVpbnRlcnByZXRfY2FzdDxBYnN0cmFjdEZNSUNvbXBvbmVudCo+KGNvbXBvbmVudCk7Ci0JZm1pQ21wLT5nZXRJbnRlZ2VyKHZhbHVlUmVmZXJlbmNlLG51bWJlck9mVmFsdWVzLCB2YWx1ZXMpOwotCXJldHVybiBmbWkyT0s7Ci19Ci0KLWZtaTJTdGF0dXMgZm1pMkdldEJvb2xlYW4oZm1pMkNvbXBvbmVudCBjb21wb25lbnQsIGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZSB2YWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QgbnVtYmVyT2ZWYWx1ZXMsCi0JCWZtaTJCb29sZWFuIHZhbHVlc1tdKSB7Ci0JQWJzdHJhY3RGTUlDb21wb25lbnQqIGZtaUNtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QWJzdHJhY3RGTUlDb21wb25lbnQqPihjb21wb25lbnQpOwotCWZtaUNtcC0+Z2V0Qm9vbGVhbih2YWx1ZVJlZmVyZW5jZSxudW1iZXJPZlZhbHVlcywgdmFsdWVzKTsKLQlyZXR1cm4gZm1pMk9LOwotfQotCi1mbWkyU3RhdHVzIGZtaTJHZXRTdHJpbmcoZm1pMkNvbXBvbmVudCBjb21wb25lbnQsIGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZSB2YWx1ZVJlZmVyZW5jZVtdLCBzaXplX3QgbnVtYmVyT2ZWYWx1ZXMsCi0JCWZtaTJTdHJpbmcgdmFsdWVzW10pIHsKLQlBYnN0cmFjdEZNSUNvbXBvbmVudCogZm1pQ21wID0gcmVpbnRlcnByZXRfY2FzdDxBYnN0cmFjdEZNSUNvbXBvbmVudCo+KGNvbXBvbmVudCk7Ci0JZm1pQ21wLT5nZXRTdHJpbmcodmFsdWVSZWZlcmVuY2UsbnVtYmVyT2ZWYWx1ZXMsIHZhbHVlcyk7Ci0JcmV0dXJuIGZtaTJPSzsKLX0KLQotZm1pMlN0YXR1cyBmbWkyU2V0UmVhbChmbWkyQ29tcG9uZW50IGNvbXBvbmVudCwgY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCBudW1iZXJPZlZhbHVlcywKLQkJY29uc3QgZm1pMlJlYWwgdmFsdWVzW10pIHsKLQlBYnN0cmFjdEZNSUNvbXBvbmVudCogZm1pQ21wID0gcmVpbnRlcnByZXRfY2FzdDxBYnN0cmFjdEZNSUNvbXBvbmVudCo+KGNvbXBvbmVudCk7Ci0JZm1pQ21wLT5zZXRSZWFsKHZhbHVlUmVmZXJlbmNlLG51bWJlck9mVmFsdWVzLCB2YWx1ZXMpOwotCXJldHVybiBmbWkyT0s7Ci0KLX0KLQotZm1pMlN0YXR1cyBmbWkyU2V0SW50ZWdlcihmbWkyQ29tcG9uZW50IGNvbXBvbmVudCwgY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCBudW1iZXJPZlZhbHVlcywKLQkJY29uc3QgZm1pMkludGVnZXIgdmFsdWVzW10pIHsKLQlBYnN0cmFjdEZNSUNvbXBvbmVudCogZm1pQ21wID0gcmVpbnRlcnByZXRfY2FzdDxBYnN0cmFjdEZNSUNvbXBvbmVudCo+KGNvbXBvbmVudCk7Ci0JZm1pQ21wLT5zZXRJbnRlZ2VyKHZhbHVlUmVmZXJlbmNlLG51bWJlck9mVmFsdWVzLCB2YWx1ZXMpOwotCXJldHVybiBmbWkyT0s7Ci0KLX0KLQotZm1pMlN0YXR1cyBmbWkyU2V0Qm9vbGVhbihmbWkyQ29tcG9uZW50IGNvbXBvbmVudCwgY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHZhbHVlUmVmZXJlbmNlW10sIHNpemVfdCBudW1iZXJPZlZhbHVlcywKLQkJY29uc3QgZm1pMkJvb2xlYW4gdmFsdWVzW10pIHsKLQlBYnN0cmFjdEZNSUNvbXBvbmVudCogZm1pQ21wID0gcmVpbnRlcnByZXRfY2FzdDxBYnN0cmFjdEZNSUNvbXBvbmVudCo+KGNvbXBvbmVudCk7Ci0JZm1pQ21wLT5zZXRCb29sZWFuKHZhbHVlUmVmZXJlbmNlLG51bWJlck9mVmFsdWVzLCB2YWx1ZXMpOwotCXJldHVybiBmbWkyT0s7Ci0KLX0KLQotZm1pMlN0YXR1cyBmbWkyU2V0U3RyaW5nKGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2UgdmFsdWVSZWZlcmVuY2VbXSwgc2l6ZV90IG51bWJlck9mVmFsdWVzLAotCQljb25zdCBmbWkyU3RyaW5nIHZhbHVlc1tdKSB7Ci0JQWJzdHJhY3RGTUlDb21wb25lbnQqIGZtaUNtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QWJzdHJhY3RGTUlDb21wb25lbnQqPihjb21wb25lbnQpOwotCWZtaUNtcC0+c2V0U3RyaW5nKHZhbHVlUmVmZXJlbmNlLG51bWJlck9mVmFsdWVzLCB2YWx1ZXMpOwotCXJldHVybiBmbWkyT0s7Ci0KLX0KLQotZm1pMlN0YXR1cyBmbWkyR2V0Rk1Vc3RhdGUoZm1pMkNvbXBvbmVudCBjb21wb25lbnQsIGZtaTJGTVVzdGF0ZSogc3RhdGUpIHsKLQlyZXR1cm4gZm1pMkVycm9yOwotfQotCi1mbWkyU3RhdHVzIGZtaTJTZXRGTVVzdGF0ZShmbWkyQ29tcG9uZW50IGNvbXBvbmVudCwgZm1pMkZNVXN0YXRlIHN0YXRlKSB7Ci0JcmV0dXJuIGZtaTJFcnJvcjsKLX0KLQotZm1pMlN0YXR1cyBmbWkyRnJlZUZNVXN0YXRlKGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBmbWkyRk1Vc3RhdGUqIHN0YXRlKSB7Ci0JcmV0dXJuIGZtaTJFcnJvcjsKLX0KLQotZm1pMlN0YXR1cyBmbWkyU2VyaWFsaXplZEZNVXN0YXRlU2l6ZShmbWkyQ29tcG9uZW50IGNvbXBvbmVudCwgZm1pMkZNVXN0YXRlLCBzaXplX3QqIHN0YXRlU2l6ZSkgewotCXJldHVybiBmbWkyRXJyb3I7Ci19Ci0KLWZtaTJTdGF0dXMgZm1pMlNlcmlhbGl6ZUZNVXN0YXRlKGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBmbWkyRk1Vc3RhdGUgc3RhdGUsIGZtaTJCeXRlIHNlcmlhbGl6ZWRTdGF0ZVtdLAotCQlzaXplX3Qgc2VyaWFsaXplZFN0YXRlU2l6ZSkgewotCXJldHVybiBmbWkyRXJyb3I7Ci19Ci0KLWZtaTJTdGF0dXMgZm1pMkRlU2VyaWFsaXplRk1Vc3RhdGUoZm1pMkNvbXBvbmVudCBjb21wb25lbnQsIGNvbnN0IGZtaTJCeXRlIHNlcmlhbGl6ZWRTdGF0ZVtdLCBzaXplX3Qgc2l6ZSwKLQkJZm1pMkZNVXN0YXRlKiBzdGF0ZSkgewotCXJldHVybiBmbWkyRXJyb3I7Ci19Ci0KLWZtaTJTdGF0dXMgZm1pMkdldERpcmVjdGlvbmFsRGVyaXZhdGl2ZShmbWkyQ29tcG9uZW50IGNvbXBvbmVudCwgY29uc3QgZm1pMlZhbHVlUmVmZXJlbmNlIHVua25vd25WYWx1ZVJlZmVyZW5jZXNbXSwKLQkJc2l6ZV90IG51bWJlck9mVW5rbm93bnMsIGNvbnN0IGZtaTJWYWx1ZVJlZmVyZW5jZSBrbm93blZhbHVlUmVmZXJlbmNlc1tdLAotCQlzaXplX3QgbnVtYmVyT2ZLbm93bnMsIGNvbnN0IGZtaTJSZWFsIGtub3duRGlmZmVyZW50aWFsW10sCi0JCWZtaTJSZWFsIHVua25vd25EaWZmZXJlbnRpYWxbXSkgewotCXJldHVybiBmbWkyRXJyb3I7Ci19Ci0KLWZtaTJTdGF0dXMgZm1pMlNldFJlYWxJbnB1dERlcml2YXRpdmVzKGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2UgdmFsdWVSZWZlcmVuY2VzW10sCi0JCXNpemVfdCBudW1iZXJPZlZhbHVlUmVmZXJlbmNlcywgY29uc3QgZm1pMkludGVnZXIgb3JkZXJzW10sIGNvbnN0IGZtaTJSZWFsIHZhbHVlc1tdKSB7Ci0JcmV0dXJuIGZtaTJFcnJvcjsKLX0KLQotZm1pMlN0YXR1cyBmbWkyR2V0UmVhbE91dHB1dERlcml2YXRpdmVzKGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBjb25zdCBmbWkyVmFsdWVSZWZlcmVuY2UgdmFsdWVSZWZlcmVuY2VbXSwKLQkJc2l6ZV90IG51bWJlck9mVmFsdWVzLCBjb25zdCBmbWkySW50ZWdlciBvcmRlcltdLCBmbWkyUmVhbCB2YWx1ZXNbXSkgewotCXJldHVybiBmbWkyRXJyb3I7Ci19Ci0KLWZtaTJTdGF0dXMgZm1pMkRvU3RlcChmbWkyQ29tcG9uZW50IGNvbXBvbmVudCwgZm1pMlJlYWwgY3VycmVudENvbXVuaWNhdGlvblRpbWUsIGZtaTJSZWFsIHN0ZXBTaXplLAotCQlmbWkyQm9vbGVhbiBub1NldEZtdUZtdVN0YXRlUHJpb3JUb0N1cnJlbnRQb2ludCkgewotCi0JQWJzdHJhY3RGTUlDb21wb25lbnQqIGZtaUNtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QWJzdHJhY3RGTUlDb21wb25lbnQqPihjb21wb25lbnQpOwotCWZtaUNtcC0+ZG9TdGVwKGN1cnJlbnRDb211bmljYXRpb25UaW1lLCBzdGVwU2l6ZSk7Ci0JcmV0dXJuIGZtaTJPSzsKLX0KLQotZm1pMlN0YXR1cyBmbWkyQ2FuY2VsU3RlcChmbWkyQ29tcG9uZW50IGNvbXBvbmVudCkgewotCi0JcmV0dXJuIGZtaTJPSzsKLX0KLQotZm1pMlN0YXR1cyBmbWkyR2V0U3RhdHVzKGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBjb25zdCBmbWkyU3RhdHVzS2luZCBraW5kLCBmbWkyU3RhdHVzKiBzdGF0dXMpIHsKLQlyZXR1cm4gZm1pMkVycm9yOwotfQotCi1mbWkyU3RhdHVzIGZtaTJHZXRSZWFsU3RhdHVzKGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBjb25zdCBmbWkyU3RhdHVzS2luZCBraW5kLCBmbWkyUmVhbCogdmFsdWUpIHsKLQlyZXR1cm4gZm1pMkVycm9yOwotfQotCi1mbWkyU3RhdHVzIGZtaTJHZXRJbnRlZ2VyU3RhdHVzKGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBjb25zdCBmbWkyU3RhdHVzS2luZCBraW5kLCBmbWkySW50ZWdlciogdmFsdWUpIHsKLQlyZXR1cm4gZm1pMkVycm9yOwotfQotCi1mbWkyU3RhdHVzIGZtaTJHZXRCb29sZWFuU3RhdHVzKGZtaTJDb21wb25lbnQgY29tcG9uZW50LCBjb25zdCBmbWkyU3RhdHVzS2luZCBraW5kLCBmbWkyQm9vbGVhbiogdmFsdWUpIHsKLQlyZXR1cm4gZm1pMkVycm9yOwotfQotCi1mbWkyU3RhdHVzIGZtaTJHZXRTdHJpbmdTdGF0dXMoZm1pMkNvbXBvbmVudCBjb21wb25lbnQsIGNvbnN0IGZtaTJTdGF0dXNLaW5kIGtpbmQsIGZtaTJTdHJpbmcqIHZhbHVlKSB7Ci0JcmV0dXJuIGZtaTJFcnJvcjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vYWxsb2NhdG9ycy5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9hbGxvY2F0b3JzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDU5NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9hbGxvY2F0b3JzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fQUxMT0NBVE9SU19IXwotI2RlZmluZSBSQVBJREpTT05fQUxMT0NBVE9SU19IXwotCi0jaW5jbHVkZSAicmFwaWRqc29uLmgiCi0KLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQWxsb2NhdG9yCi0KLS8qISBcY2xhc3MgcmFwaWRqc29uOjpBbGxvY2F0b3IKLSAgICBcYnJpZWYgQ29uY2VwdCBmb3IgYWxsb2NhdGluZywgcmVzaXppbmcgYW5kIGZyZWVpbmcgbWVtb3J5IGJsb2NrLgotICAgIAotICAgIE5vdGUgdGhhdCBNYWxsb2MoKSBhbmQgUmVhbGxvYygpIGFyZSBub24tc3RhdGljIGJ1dCBGcmVlKCkgaXMgc3RhdGljLgotICAgIAotICAgIFNvIGlmIGFuIGFsbG9jYXRvciBuZWVkIHRvIHN1cHBvcnQgRnJlZSgpLCBpdCBuZWVkcyB0byBwdXQgaXRzIHBvaW50ZXIgaW4gCi0gICAgdGhlIGhlYWRlciBvZiBtZW1vcnkgYmxvY2suCi0KLVxjb2RlCi1jb25jZXB0IEFsbG9jYXRvciB7Ci0gICAgc3RhdGljIGNvbnN0IGJvb2wga05lZWRGcmVlOyAgICAvLyE8IFdoZXRoZXIgdGhpcyBhbGxvY2F0b3IgbmVlZHMgdG8gY2FsbCBGcmVlKCkuCi0KLSAgICAvLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jay4KLSAgICAvLyBccGFyYW0gc2l6ZSBvZiB0aGUgbWVtb3J5IGJsb2NrIGluIGJ5dGVzLgotICAgIC8vIFxyZXR1cm5zIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBibG9jay4KLSAgICB2b2lkKiBNYWxsb2Moc2l6ZV90IHNpemUpOwotCi0gICAgLy8gUmVzaXplIGEgbWVtb3J5IGJsb2NrLgotICAgIC8vIFxwYXJhbSBvcmlnaW5hbFB0ciBUaGUgcG9pbnRlciB0byBjdXJyZW50IG1lbW9yeSBibG9jay4gTnVsbCBwb2ludGVyIGlzIHBlcm1pdHRlZC4KLSAgICAvLyBccGFyYW0gb3JpZ2luYWxTaXplIFRoZSBjdXJyZW50IHNpemUgaW4gYnl0ZXMuIChEZXNpZ24gaXNzdWU6IHNpbmNlIHNvbWUgYWxsb2NhdG9yIG1heSBub3QgYm9vay1rZWVwIHRoaXMsIGV4cGxpY2l0bHkgcGFzcyB0byBpdCBjYW4gc2F2ZSBtZW1vcnkuKQotICAgIC8vIFxwYXJhbSBuZXdTaXplIHRoZSBuZXcgc2l6ZSBpbiBieXRlcy4KLSAgICB2b2lkKiBSZWFsbG9jKHZvaWQqIG9yaWdpbmFsUHRyLCBzaXplX3Qgb3JpZ2luYWxTaXplLCBzaXplX3QgbmV3U2l6ZSk7Ci0KLSAgICAvLyBGcmVlIGEgbWVtb3J5IGJsb2NrLgotICAgIC8vIFxwYXJhbSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgYmxvY2suIE51bGwgcG9pbnRlciBpcyBwZXJtaXR0ZWQuCi0gICAgc3RhdGljIHZvaWQgRnJlZSh2b2lkICpwdHIpOwotfTsKLVxlbmRjb2RlCi0qLwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDcnRBbGxvY2F0b3IKLQotLy8hIEMtcnVudGltZSBsaWJyYXJ5IGFsbG9jYXRvci4KLS8qISBUaGlzIGNsYXNzIGlzIGp1c3Qgd3JhcHBlciBmb3Igc3RhbmRhcmQgQyBsaWJyYXJ5IG1lbW9yeSByb3V0aW5lcy4KLSAgICBcbm90ZSBpbXBsZW1lbnRzIEFsbG9jYXRvciBjb25jZXB0Ci0qLwotY2xhc3MgQ3J0QWxsb2NhdG9yIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgYm9vbCBrTmVlZEZyZWUgPSB0cnVlOwotICAgIHZvaWQqIE1hbGxvYyhzaXplX3Qgc2l6ZSkgeyAKLSAgICAgICAgaWYgKHNpemUpIC8vICBiZWhhdmlvciBvZiBtYWxsb2MoMCkgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZC4KLSAgICAgICAgICAgIHJldHVybiBzdGQ6Om1hbGxvYyhzaXplKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8vIHN0YW5kYXJkaXplIHRvIHJldHVybmluZyBOVUxMLgotICAgIH0KLSAgICB2b2lkKiBSZWFsbG9jKHZvaWQqIG9yaWdpbmFsUHRyLCBzaXplX3Qgb3JpZ2luYWxTaXplLCBzaXplX3QgbmV3U2l6ZSkgewotICAgICAgICAodm9pZClvcmlnaW5hbFNpemU7Ci0gICAgICAgIGlmIChuZXdTaXplID09IDApIHsKLSAgICAgICAgICAgIHN0ZDo6ZnJlZShvcmlnaW5hbFB0cik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RkOjpyZWFsbG9jKG9yaWdpbmFsUHRyLCBuZXdTaXplKTsKLSAgICB9Ci0gICAgc3RhdGljIHZvaWQgRnJlZSh2b2lkICpwdHIpIHsgc3RkOjpmcmVlKHB0cik7IH0KLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE1lbW9yeVBvb2xBbGxvY2F0b3IKLQotLy8hIERlZmF1bHQgbWVtb3J5IGFsbG9jYXRvciB1c2VkIGJ5IHRoZSBwYXJzZXIgYW5kIERPTS4KLS8qISBUaGlzIGFsbG9jYXRvciBhbGxvY2F0ZSBtZW1vcnkgYmxvY2tzIGZyb20gcHJlLWFsbG9jYXRlZCBtZW1vcnkgY2h1bmtzLiAKLQotICAgIEl0IGRvZXMgbm90IGZyZWUgbWVtb3J5IGJsb2Nrcy4gQW5kIFJlYWxsb2MoKSBvbmx5IGFsbG9jYXRlIG5ldyBtZW1vcnkuCi0KLSAgICBUaGUgbWVtb3J5IGNodW5rcyBhcmUgYWxsb2NhdGVkIGJ5IEJhc2VBbGxvY2F0b3IsIHdoaWNoIGlzIENydEFsbG9jYXRvciBieSBkZWZhdWx0LgotCi0gICAgVXNlciBtYXkgYWxzbyBzdXBwbHkgYSBidWZmZXIgYXMgdGhlIGZpcnN0IGNodW5rLgotCi0gICAgSWYgdGhlIHVzZXItYnVmZmVyIGlzIGZ1bGwgdGhlbiBhZGRpdGlvbmFsIGNodW5rcyBhcmUgYWxsb2NhdGVkIGJ5IEJhc2VBbGxvY2F0b3IuCi0KLSAgICBUaGUgdXNlci1idWZmZXIgaXMgbm90IGRlYWxsb2NhdGVkIGJ5IHRoaXMgYWxsb2NhdG9yLgotCi0gICAgXHRwYXJhbSBCYXNlQWxsb2NhdG9yIHRoZSBhbGxvY2F0b3IgdHlwZSBmb3IgYWxsb2NhdGluZyBtZW1vcnkgY2h1bmtzLiBEZWZhdWx0IGlzIENydEFsbG9jYXRvci4KLSAgICBcbm90ZSBpbXBsZW1lbnRzIEFsbG9jYXRvciBjb25jZXB0Ci0qLwotdGVtcGxhdGUgPHR5cGVuYW1lIEJhc2VBbGxvY2F0b3IgPSBDcnRBbGxvY2F0b3I+Ci1jbGFzcyBNZW1vcnlQb29sQWxsb2NhdG9yIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgYm9vbCBrTmVlZEZyZWUgPSBmYWxzZTsgICAgLy8hPCBUZWxsIHVzZXJzIHRoYXQgbm8gbmVlZCB0byBjYWxsIEZyZWUoKSB3aXRoIHRoaXMgYWxsb2NhdG9yLiAoY29uY2VwdCBBbGxvY2F0b3IpCi0KLSAgICAvLyEgQ29uc3RydWN0b3Igd2l0aCBjaHVua1NpemUuCi0gICAgLyohIFxwYXJhbSBjaHVua1NpemUgVGhlIHNpemUgb2YgbWVtb3J5IGNodW5rLiBUaGUgZGVmYXVsdCBpcyBrRGVmYXVsdENodW5rU2l6ZS4KLSAgICAgICAgXHBhcmFtIGJhc2VBbGxvY2F0b3IgVGhlIGFsbG9jYXRvciBmb3IgYWxsb2NhdGluZyBtZW1vcnkgY2h1bmtzLgotICAgICovCi0gICAgTWVtb3J5UG9vbEFsbG9jYXRvcihzaXplX3QgY2h1bmtTaXplID0ga0RlZmF1bHRDaHVua0NhcGFjaXR5LCBCYXNlQWxsb2NhdG9yKiBiYXNlQWxsb2NhdG9yID0gMCkgOiAKLSAgICAgICAgY2h1bmtIZWFkXygwKSwgY2h1bmtfY2FwYWNpdHlfKGNodW5rU2l6ZSksIHVzZXJCdWZmZXJfKDApLCBiYXNlQWxsb2NhdG9yXyhiYXNlQWxsb2NhdG9yKSwgb3duQmFzZUFsbG9jYXRvcl8oMCkKLSAgICB7Ci0gICAgfQotCi0gICAgLy8hIENvbnN0cnVjdG9yIHdpdGggdXNlci1zdXBwbGllZCBidWZmZXIuCi0gICAgLyohIFRoZSB1c2VyIGJ1ZmZlciB3aWxsIGJlIHVzZWQgZmlyc3RseS4gV2hlbiBpdCBpcyBmdWxsLCBtZW1vcnkgcG9vbCBhbGxvY2F0ZXMgbmV3IGNodW5rIHdpdGggY2h1bmsgc2l6ZS4KLQotICAgICAgICBUaGUgdXNlciBidWZmZXIgd2lsbCBub3QgYmUgZGVhbGxvY2F0ZWQgd2hlbiB0aGlzIGFsbG9jYXRvciBpcyBkZXN0cnVjdGVkLgotCi0gICAgICAgIFxwYXJhbSBidWZmZXIgVXNlciBzdXBwbGllZCBidWZmZXIuCi0gICAgICAgIFxwYXJhbSBzaXplIFNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcy4gSXQgbXVzdCBhdCBsZWFzdCBsYXJnZXIgdGhhbiBzaXplb2YoQ2h1bmtIZWFkZXIpLgotICAgICAgICBccGFyYW0gY2h1bmtTaXplIFRoZSBzaXplIG9mIG1lbW9yeSBjaHVuay4gVGhlIGRlZmF1bHQgaXMga0RlZmF1bHRDaHVua1NpemUuCi0gICAgICAgIFxwYXJhbSBiYXNlQWxsb2NhdG9yIFRoZSBhbGxvY2F0b3IgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IGNodW5rcy4KLSAgICAqLwotICAgIE1lbW9yeVBvb2xBbGxvY2F0b3Iodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGNodW5rU2l6ZSA9IGtEZWZhdWx0Q2h1bmtDYXBhY2l0eSwgQmFzZUFsbG9jYXRvciogYmFzZUFsbG9jYXRvciA9IDApIDoKLSAgICAgICAgY2h1bmtIZWFkXygwKSwgY2h1bmtfY2FwYWNpdHlfKGNodW5rU2l6ZSksIHVzZXJCdWZmZXJfKGJ1ZmZlciksIGJhc2VBbGxvY2F0b3JfKGJhc2VBbGxvY2F0b3IpLCBvd25CYXNlQWxsb2NhdG9yXygwKQotICAgIHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChidWZmZXIgIT0gMCk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoc2l6ZSA+IHNpemVvZihDaHVua0hlYWRlcikpOwotICAgICAgICBjaHVua0hlYWRfID0gcmVpbnRlcnByZXRfY2FzdDxDaHVua0hlYWRlcio+KGJ1ZmZlcik7Ci0gICAgICAgIGNodW5rSGVhZF8tPmNhcGFjaXR5ID0gc2l6ZSAtIHNpemVvZihDaHVua0hlYWRlcik7Ci0gICAgICAgIGNodW5rSGVhZF8tPnNpemUgPSAwOwotICAgICAgICBjaHVua0hlYWRfLT5uZXh0ID0gMDsKLSAgICB9Ci0KLSAgICAvLyEgRGVzdHJ1Y3Rvci4KLSAgICAvKiEgVGhpcyBkZWFsbG9jYXRlcyBhbGwgbWVtb3J5IGNodW5rcywgZXhjbHVkaW5nIHRoZSB1c2VyLXN1cHBsaWVkIGJ1ZmZlci4KLSAgICAqLwotICAgIH5NZW1vcnlQb29sQWxsb2NhdG9yKCkgewotICAgICAgICBDbGVhcigpOwotICAgICAgICBSQVBJREpTT05fREVMRVRFKG93bkJhc2VBbGxvY2F0b3JfKTsKLSAgICB9Ci0KLSAgICAvLyEgRGVhbGxvY2F0ZXMgYWxsIG1lbW9yeSBjaHVua3MsIGV4Y2x1ZGluZyB0aGUgdXNlci1zdXBwbGllZCBidWZmZXIuCi0gICAgdm9pZCBDbGVhcigpIHsKLSAgICAgICAgd2hpbGUgKGNodW5rSGVhZF8gJiYgY2h1bmtIZWFkXyAhPSB1c2VyQnVmZmVyXykgewotICAgICAgICAgICAgQ2h1bmtIZWFkZXIqIG5leHQgPSBjaHVua0hlYWRfLT5uZXh0OwotICAgICAgICAgICAgYmFzZUFsbG9jYXRvcl8tPkZyZWUoY2h1bmtIZWFkXyk7Ci0gICAgICAgICAgICBjaHVua0hlYWRfID0gbmV4dDsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2h1bmtIZWFkXyAmJiBjaHVua0hlYWRfID09IHVzZXJCdWZmZXJfKQotICAgICAgICAgICAgY2h1bmtIZWFkXy0+c2l6ZSA9IDA7IC8vIENsZWFyIHVzZXIgYnVmZmVyCi0gICAgfQotCi0gICAgLy8hIENvbXB1dGVzIHRoZSB0b3RhbCBjYXBhY2l0eSBvZiBhbGxvY2F0ZWQgbWVtb3J5IGNodW5rcy4KLSAgICAvKiEgXHJldHVybiB0b3RhbCBjYXBhY2l0eSBpbiBieXRlcy4KLSAgICAqLwotICAgIHNpemVfdCBDYXBhY2l0eSgpIGNvbnN0IHsKLSAgICAgICAgc2l6ZV90IGNhcGFjaXR5ID0gMDsKLSAgICAgICAgZm9yIChDaHVua0hlYWRlciogYyA9IGNodW5rSGVhZF87IGMgIT0gMDsgYyA9IGMtPm5leHQpCi0gICAgICAgICAgICBjYXBhY2l0eSArPSBjLT5jYXBhY2l0eTsKLSAgICAgICAgcmV0dXJuIGNhcGFjaXR5OwotICAgIH0KLQotICAgIC8vISBDb21wdXRlcyB0aGUgbWVtb3J5IGJsb2NrcyBhbGxvY2F0ZWQuCi0gICAgLyohIFxyZXR1cm4gdG90YWwgdXNlZCBieXRlcy4KLSAgICAqLwotICAgIHNpemVfdCBTaXplKCkgY29uc3QgewotICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgICAgIGZvciAoQ2h1bmtIZWFkZXIqIGMgPSBjaHVua0hlYWRfOyBjICE9IDA7IGMgPSBjLT5uZXh0KQotICAgICAgICAgICAgc2l6ZSArPSBjLT5zaXplOwotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICAvLyEgQWxsb2NhdGVzIGEgbWVtb3J5IGJsb2NrLiAoY29uY2VwdCBBbGxvY2F0b3IpCi0gICAgdm9pZCogTWFsbG9jKHNpemVfdCBzaXplKSB7Ci0gICAgICAgIGlmICghc2l6ZSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICAgIHNpemUgPSBSQVBJREpTT05fQUxJR04oc2l6ZSk7Ci0gICAgICAgIGlmIChjaHVua0hlYWRfID09IDAgfHwgY2h1bmtIZWFkXy0+c2l6ZSArIHNpemUgPiBjaHVua0hlYWRfLT5jYXBhY2l0eSkKLSAgICAgICAgICAgIEFkZENodW5rKGNodW5rX2NhcGFjaXR5XyA+IHNpemUgPyBjaHVua19jYXBhY2l0eV8gOiBzaXplKTsKLQotICAgICAgICB2b2lkICpidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNoYXIgKj4oY2h1bmtIZWFkXykgKyBSQVBJREpTT05fQUxJR04oc2l6ZW9mKENodW5rSGVhZGVyKSkgKyBjaHVua0hlYWRfLT5zaXplOwotICAgICAgICBjaHVua0hlYWRfLT5zaXplICs9IHNpemU7Ci0gICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgfQotCi0gICAgLy8hIFJlc2l6ZXMgYSBtZW1vcnkgYmxvY2sgKGNvbmNlcHQgQWxsb2NhdG9yKQotICAgIHZvaWQqIFJlYWxsb2Modm9pZCogb3JpZ2luYWxQdHIsIHNpemVfdCBvcmlnaW5hbFNpemUsIHNpemVfdCBuZXdTaXplKSB7Ci0gICAgICAgIGlmIChvcmlnaW5hbFB0ciA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIE1hbGxvYyhuZXdTaXplKTsKLQotICAgICAgICBpZiAobmV3U2l6ZSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgb3JpZ2luYWxTaXplID0gUkFQSURKU09OX0FMSUdOKG9yaWdpbmFsU2l6ZSk7Ci0gICAgICAgIG5ld1NpemUgPSBSQVBJREpTT05fQUxJR04obmV3U2l6ZSk7Ci0KLSAgICAgICAgLy8gRG8gbm90IHNocmluayBpZiBuZXcgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gb3JpZ2luYWwKLSAgICAgICAgaWYgKG9yaWdpbmFsU2l6ZSA+PSBuZXdTaXplKQotICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUHRyOwotCi0gICAgICAgIC8vIFNpbXBseSBleHBhbmQgaXQgaWYgaXQgaXMgdGhlIGxhc3QgYWxsb2NhdGlvbiBhbmQgdGhlcmUgaXMgc3VmZmljaWVudCBzcGFjZQotICAgICAgICBpZiAob3JpZ2luYWxQdHIgPT0gcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KGNodW5rSGVhZF8pICsgUkFQSURKU09OX0FMSUdOKHNpemVvZihDaHVua0hlYWRlcikpICsgY2h1bmtIZWFkXy0+c2l6ZSAtIG9yaWdpbmFsU2l6ZSkgewotICAgICAgICAgICAgc2l6ZV90IGluY3JlbWVudCA9IHN0YXRpY19jYXN0PHNpemVfdD4obmV3U2l6ZSAtIG9yaWdpbmFsU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoY2h1bmtIZWFkXy0+c2l6ZSArIGluY3JlbWVudCA8PSBjaHVua0hlYWRfLT5jYXBhY2l0eSkgewotICAgICAgICAgICAgICAgIGNodW5rSGVhZF8tPnNpemUgKz0gaW5jcmVtZW50OwotICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFB0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlYWxsb2MgcHJvY2VzczogYWxsb2NhdGUgYW5kIGNvcHkgbWVtb3J5LCBkbyBub3QgZnJlZSBvcmlnaW5hbCBidWZmZXIuCi0gICAgICAgIHZvaWQqIG5ld0J1ZmZlciA9IE1hbGxvYyhuZXdTaXplKTsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChuZXdCdWZmZXIgIT0gMCk7ICAgLy8gRG8gbm90IGhhbmRsZSBvdXQtb2YtbWVtb3J5IGV4cGxpY2l0bHkuCi0gICAgICAgIGlmIChvcmlnaW5hbFNpemUpCi0gICAgICAgICAgICBzdGQ6Om1lbWNweShuZXdCdWZmZXIsIG9yaWdpbmFsUHRyLCBvcmlnaW5hbFNpemUpOwotICAgICAgICByZXR1cm4gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8vISBGcmVlcyBhIG1lbW9yeSBibG9jayAoY29uY2VwdCBBbGxvY2F0b3IpCi0gICAgc3RhdGljIHZvaWQgRnJlZSh2b2lkICpwdHIpIHsgKHZvaWQpcHRyOyB9IC8vIERvIG5vdGhpbmcKLQotcHJpdmF0ZToKLSAgICAvLyEgQ29weSBjb25zdHJ1Y3RvciBpcyBub3QgcGVybWl0dGVkLgotICAgIE1lbW9yeVBvb2xBbGxvY2F0b3IoY29uc3QgTWVtb3J5UG9vbEFsbG9jYXRvciYgcmhzKSAvKiA9IGRlbGV0ZSAqLzsKLSAgICAvLyEgQ29weSBhc3NpZ25tZW50IG9wZXJhdG9yIGlzIG5vdCBwZXJtaXR0ZWQuCi0gICAgTWVtb3J5UG9vbEFsbG9jYXRvciYgb3BlcmF0b3I9KGNvbnN0IE1lbW9yeVBvb2xBbGxvY2F0b3ImIHJocykgLyogPSBkZWxldGUgKi87Ci0KLSAgICAvLyEgQ3JlYXRlcyBhIG5ldyBjaHVuay4KLSAgICAvKiEgXHBhcmFtIGNhcGFjaXR5IENhcGFjaXR5IG9mIHRoZSBjaHVuayBpbiBieXRlcy4KLSAgICAqLwotICAgIHZvaWQgQWRkQ2h1bmsoc2l6ZV90IGNhcGFjaXR5KSB7Ci0gICAgICAgIGlmICghYmFzZUFsbG9jYXRvcl8pCi0gICAgICAgICAgICBvd25CYXNlQWxsb2NhdG9yXyA9IGJhc2VBbGxvY2F0b3JfID0gUkFQSURKU09OX05FVyhCYXNlQWxsb2NhdG9yKCkpOwotICAgICAgICBDaHVua0hlYWRlciogY2h1bmsgPSByZWludGVycHJldF9jYXN0PENodW5rSGVhZGVyKj4oYmFzZUFsbG9jYXRvcl8tPk1hbGxvYyhSQVBJREpTT05fQUxJR04oc2l6ZW9mKENodW5rSGVhZGVyKSkgKyBjYXBhY2l0eSkpOwotICAgICAgICBjaHVuay0+Y2FwYWNpdHkgPSBjYXBhY2l0eTsKLSAgICAgICAgY2h1bmstPnNpemUgPSAwOwotICAgICAgICBjaHVuay0+bmV4dCA9IGNodW5rSGVhZF87Ci0gICAgICAgIGNodW5rSGVhZF8gPSAgY2h1bms7Ci0gICAgfQotCi0gICAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdENodW5rQ2FwYWNpdHkgPSA2NCAqIDEwMjQ7IC8vITwgRGVmYXVsdCBjaHVuayBjYXBhY2l0eS4KLQotICAgIC8vISBDaHVuayBoZWFkZXIgZm9yIHBlcnBlbmRpbmcgdG8gZWFjaCBjaHVuay4KLSAgICAvKiEgQ2h1bmtzIGFyZSBzdG9yZWQgYXMgYSBzaW5nbHkgbGlua2VkIGxpc3QuCi0gICAgKi8KLSAgICBzdHJ1Y3QgQ2h1bmtIZWFkZXIgewotICAgICAgICBzaXplX3QgY2FwYWNpdHk7ICAgIC8vITwgQ2FwYWNpdHkgb2YgdGhlIGNodW5rIGluIGJ5dGVzIChleGNsdWRpbmcgdGhlIGhlYWRlciBpdHNlbGYpLgotICAgICAgICBzaXplX3Qgc2l6ZTsgICAgICAgIC8vITwgQ3VycmVudCBzaXplIG9mIGFsbG9jYXRlZCBtZW1vcnkgaW4gYnl0ZXMuCi0gICAgICAgIENodW5rSGVhZGVyICpuZXh0OyAgLy8hPCBOZXh0IGNodW5rIGluIHRoZSBsaW5rZWQgbGlzdC4KLSAgICB9OwotCi0gICAgQ2h1bmtIZWFkZXIgKmNodW5rSGVhZF87ICAgIC8vITwgSGVhZCBvZiB0aGUgY2h1bmsgbGlua2VkLWxpc3QuIE9ubHkgdGhlIGhlYWQgY2h1bmsgc2VydmVzIGFsbG9jYXRpb24uCi0gICAgc2l6ZV90IGNodW5rX2NhcGFjaXR5XzsgICAgIC8vITwgVGhlIG1pbmltdW0gY2FwYWNpdHkgb2YgY2h1bmsgd2hlbiB0aGV5IGFyZSBhbGxvY2F0ZWQuCi0gICAgdm9pZCAqdXNlckJ1ZmZlcl87ICAgICAgICAgIC8vITwgVXNlciBzdXBwbGllZCBidWZmZXIuCi0gICAgQmFzZUFsbG9jYXRvciogYmFzZUFsbG9jYXRvcl87ICAvLyE8IGJhc2UgYWxsb2NhdG9yIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBjaHVua3MuCi0gICAgQmFzZUFsbG9jYXRvciogb3duQmFzZUFsbG9jYXRvcl87ICAgLy8hPCBiYXNlIGFsbG9jYXRvciBjcmVhdGVkIGJ5IHRoaXMgb2JqZWN0LgotfTsKLQotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLQotI2VuZGlmIC8vIFJBUElESlNPTl9FTkNPRElOR1NfSF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vZG9jdW1lbnQuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vZG9jdW1lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1NTQzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2RvY3VtZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcyICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUuCi0vLyAKLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0vLyB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgCi0vLyBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgUkFQSURKU09OX0RPQ1VNRU5UX0hfCi0jZGVmaW5lIFJBUElESlNPTl9ET0NVTUVOVF9IXwotCi0vKiEgXGZpbGUgZG9jdW1lbnQuaCAqLwotCi0jaW5jbHVkZSAicmVhZGVyLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwvbWV0YS5oIgotI2luY2x1ZGUgImludGVybmFsL3N0cmZ1bmMuaCIKLSNpbmNsdWRlICJtZW1vcnlzdHJlYW0uaCIKLSNpbmNsdWRlICJlbmNvZGVkc3RyZWFtLmgiCi0jaW5jbHVkZSA8bmV3PiAgICAgIC8vIHBsYWNlbWVudCBuZXcKLQotI2lmZGVmIF9NU0NfVkVSCi1SQVBJREpTT05fRElBR19QVVNICi1SQVBJREpTT05fRElBR19PRkYoNDEyNykgLy8gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAotI2VuZGlmCi0KLSNpZmRlZiBfX2NsYW5nX18KLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRihwYWRkZWQpCi1SQVBJREpTT05fRElBR19PRkYoc3dpdGNoLWVudW0pCi1SQVBJREpTT05fRElBR19PRkYoYysrOTgtY29tcGF0KQotI2VuZGlmCi0KLSNpZmRlZiBfX0dOVUNfXwotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKGVmZmMrKykKLSNlbmRpZgotCi0jaWZuZGVmIFJBUElESlNPTl9OT01FTUJFUklURVJBVE9SQ0xBU1MKLSNpbmNsdWRlIDxpdGVyYXRvcj4gLy8gc3RkOjppdGVyYXRvciwgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZwotI2VuZGlmCi0KLSNpZiBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0jaW5jbHVkZSA8dXRpbGl0eT4gLy8gc3RkOjptb3ZlCi0jZW5kaWYKLQotUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTgotCi0vLyBGb3J3YXJkIGRlY2xhcmF0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIEVuY29kaW5nLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1jbGFzcyBHZW5lcmljVmFsdWU7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbmNvZGluZywgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBTdGFja0FsbG9jYXRvcj4KLWNsYXNzIEdlbmVyaWNEb2N1bWVudDsKLQotLy8hIE5hbWUtdmFsdWUgcGFpciBpbiBhIEpTT04gb2JqZWN0IHZhbHVlLgotLyohCi0gICAgVGhpcyBjbGFzcyB3YXMgaW50ZXJuYWwgdG8gR2VuZXJpY1ZhbHVlLiBJdCB1c2VkIHRvIGJlIGEgaW5uZXIgc3RydWN0LgotICAgIEJ1dCBhIGNvbXBpbGVyIChJQk0gWEwgQy9DKysgZm9yIEFJWCkgaGF2ZSByZXBvcnRlZCB0byBoYXZlIHByb2JsZW0gd2l0aCB0aGF0IHNvIGl0IG1vdmVkIGFzIGEgbmFtZXNwYWNlIHNjb3BlIHN0cnVjdC4KLSAgICBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3JhcGlkanNvbi9pc3N1ZXMvZGV0YWlsP2lkPTY0Ci0qLwotdGVtcGxhdGUgPHR5cGVuYW1lIEVuY29kaW5nLCB0eXBlbmFtZSBBbGxvY2F0b3I+IAotc3RydWN0IEdlbmVyaWNNZW1iZXIgeyAKLSAgICBHZW5lcmljVmFsdWU8RW5jb2RpbmcsIEFsbG9jYXRvcj4gbmFtZTsgICAgIC8vITwgbmFtZSBvZiBtZW1iZXIgKG11c3QgYmUgYSBzdHJpbmcpCi0gICAgR2VuZXJpY1ZhbHVlPEVuY29kaW5nLCBBbGxvY2F0b3I+IHZhbHVlOyAgICAvLyE8IHZhbHVlIG9mIG1lbWJlci4KLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEdlbmVyaWNNZW1iZXJJdGVyYXRvcgotCi0jaWZuZGVmIFJBUElESlNPTl9OT01FTUJFUklURVJBVE9SQ0xBU1MKLQotLy8hIChDb25zdGFudCkgbWVtYmVyIGl0ZXJhdG9yIGZvciBhIEpTT04gb2JqZWN0IHZhbHVlCi0vKiEKLSAgICBcdHBhcmFtIENvbnN0IElzIHRoaXMgYSBjb25zdGFudCBpdGVyYXRvcj8KLSAgICBcdHBhcmFtIEVuY29kaW5nICAgIEVuY29kaW5nIG9mIHRoZSB2YWx1ZS4gKEV2ZW4gbm9uLXN0cmluZyB2YWx1ZXMgbmVlZCB0byBoYXZlIHRoZSBzYW1lIGVuY29kaW5nIGluIGEgZG9jdW1lbnQpCi0gICAgXHRwYXJhbSBBbGxvY2F0b3IgICBBbGxvY2F0b3IgdHlwZSBmb3IgYWxsb2NhdGluZyBtZW1vcnkgb2Ygb2JqZWN0LCBhcnJheSBhbmQgc3RyaW5nLgotCi0gICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgUmFuZG9tIEFjY2VzcyBJdGVyYXRvciBmb3IgR2VuZXJpY01lbWJlciBlbGVtZW50cwotICAgIG9mIGEgR2VuZXJpY1ZhbHVlLCBzZWUgSVNPL0lFQyAxNDg4MjoyMDAzKEUpIEMrKyBzdGFuZGFyZCwgMjQuMSBbbGliLml0ZXJhdG9yLnJlcXVpcmVtZW50c10uCi0KLSAgICBcbm90ZSBUaGlzIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIGlzIG1haW5seSBpbnRlbmRlZCB0byBhdm9pZCBpbXBsaWNpdAotICAgICAgICBjb252ZXJzaW9ucyBmcm9tIGl0ZXJhdG9yIHZhbHVlcyB0byBcYyBOVUxMLAotICAgICAgICBlLmcuIGZyb20gR2VuZXJpY1ZhbHVlOjpGaW5kTWVtYmVyLgotCi0gICAgXG5vdGUgRGVmaW5lIFxjIFJBUElESlNPTl9OT01FTUJFUklURVJBVE9SQ0xBU1MgdG8gZmFsbCBiYWNrIHRvIGEKLSAgICAgICAgcG9pbnRlci1iYXNlZCBpbXBsZW1lbnRhdGlvbiwgaWYgeW91ciBwbGF0Zm9ybSBkb2Vzbid0IHByb3ZpZGUKLSAgICAgICAgdGhlIEMrKyA8aXRlcmF0b3I+IGhlYWRlci4KLQotICAgIFxzZWUgR2VuZXJpY01lbWJlciwgR2VuZXJpY1ZhbHVlOjpNZW1iZXJJdGVyYXRvciwgR2VuZXJpY1ZhbHVlOjpDb25zdE1lbWJlckl0ZXJhdG9yCi0gKi8KLXRlbXBsYXRlIDxib29sIENvbnN0LCB0eXBlbmFtZSBFbmNvZGluZywgdHlwZW5hbWUgQWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY01lbWJlckl0ZXJhdG9yCi0gICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnCi0gICAgICAgICwgdHlwZW5hbWUgaW50ZXJuYWw6Ok1heWJlQWRkQ29uc3Q8Q29uc3QsR2VuZXJpY01lbWJlcjxFbmNvZGluZyxBbGxvY2F0b3I+ID46OlR5cGU+IHsKLQotICAgIGZyaWVuZCBjbGFzcyBHZW5lcmljVmFsdWU8RW5jb2RpbmcsQWxsb2NhdG9yPjsKLSAgICB0ZW1wbGF0ZSA8Ym9vbCwgdHlwZW5hbWUsIHR5cGVuYW1lPiBmcmllbmQgY2xhc3MgR2VuZXJpY01lbWJlckl0ZXJhdG9yOwotCi0gICAgdHlwZWRlZiBHZW5lcmljTWVtYmVyPEVuY29kaW5nLEFsbG9jYXRvcj4gUGxhaW5UeXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Ok1heWJlQWRkQ29uc3Q8Q29uc3QsUGxhaW5UeXBlPjo6VHlwZSBWYWx1ZVR5cGU7Ci0gICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yPHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsVmFsdWVUeXBlPiBCYXNlVHlwZTsKLQotcHVibGljOgotICAgIC8vISBJdGVyYXRvciB0eXBlIGl0c2VsZgotICAgIHR5cGVkZWYgR2VuZXJpY01lbWJlckl0ZXJhdG9yIEl0ZXJhdG9yOwotICAgIC8vISBDb25zdGFudCBpdGVyYXRvciB0eXBlCi0gICAgdHlwZWRlZiBHZW5lcmljTWVtYmVySXRlcmF0b3I8dHJ1ZSxFbmNvZGluZyxBbGxvY2F0b3I+ICBDb25zdEl0ZXJhdG9yOwotICAgIC8vISBOb24tY29uc3RhbnQgaXRlcmF0b3IgdHlwZQotICAgIHR5cGVkZWYgR2VuZXJpY01lbWJlckl0ZXJhdG9yPGZhbHNlLEVuY29kaW5nLEFsbG9jYXRvcj4gTm9uQ29uc3RJdGVyYXRvcjsKLQotICAgIC8vISBQb2ludGVyIHRvIChjb25zdCkgR2VuZXJpY01lbWJlcgotICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZVR5cGU6OnBvaW50ZXIgICAgICAgICBQb2ludGVyOwotICAgIC8vISBSZWZlcmVuY2UgdG8gKGNvbnN0KSBHZW5lcmljTWVtYmVyCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlVHlwZTo6cmVmZXJlbmNlICAgICAgIFJlZmVyZW5jZTsKLSAgICAvLyEgU2lnbmVkIGludGVnZXIgdHlwZSAoZS5nLiBcYyBwdHJkaWZmX3QpCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBCYXNlVHlwZTo6ZGlmZmVyZW5jZV90eXBlIERpZmZlcmVuY2VUeXBlOwotCi0gICAgLy8hIERlZmF1bHQgY29uc3RydWN0b3IgKHNpbmd1bGFyIHZhbHVlKQotICAgIC8qISBDcmVhdGVzIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIG5vIGVsZW1lbnQuCi0gICAgICAgIFxub3RlIEFsbCBvcGVyYXRpb25zLCBleGNlcHQgZm9yIGNvbXBhcmlzb25zLCBhcmUgdW5kZWZpbmVkIG9uIHN1Y2ggdmFsdWVzLgotICAgICAqLwotICAgIEdlbmVyaWNNZW1iZXJJdGVyYXRvcigpIDogcHRyXygpIHt9Ci0KLSAgICAvLyEgSXRlcmF0b3IgY29udmVyc2lvbnMgdG8gbW9yZSBjb25zdAotICAgIC8qIQotICAgICAgICBccGFyYW0gaXQgKE5vbi1jb25zdCkgaXRlcmF0b3IgdG8gY29weSBmcm9tCi0KLSAgICAgICAgQWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBhbiBpdGVyYXRvciBmcm9tIGFub3RoZXIgR2VuZXJpY01lbWJlckl0ZXJhdG9yCi0gICAgICAgIHRoYXQgaXMgImxlc3MgY29uc3QiLiAgRXNwZWNpYWxseSwgY3JlYXRpbmcgYSBub24tY29uc3RhbnQgaXRlcmF0b3IKLSAgICAgICAgZnJvbSBhIGNvbnN0YW50IGl0ZXJhdG9yIGFyZSBkaXNhYmxlZDoKLSAgICAgICAgXGxpIGNvbnN0IC0+IG5vbi1jb25zdCAobm90IG9rKQotICAgICAgICBcbGkgY29uc3QgLT4gY29uc3QgKG9rKQotICAgICAgICBcbGkgbm9uLWNvbnN0IC0+IGNvbnN0IChvaykKLSAgICAgICAgXGxpIG5vbi1jb25zdCAtPiBub24tY29uc3QgKG9rKQotCi0gICAgICAgIFxub3RlIElmIHRoZSBcYyBDb25zdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaXMgYWxyZWFkeSBcYyBmYWxzZSwgdGhpcwotICAgICAgICAgICAgY29uc3RydWN0b3IgZWZmZWN0aXZlbHkgZGVmaW5lcyBhIHJlZ3VsYXIgY29weS1jb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIGNvcHkgY29uc3RydWN0b3IgaXMgaW1wbGljaXRseSBkZWZpbmVkLgotICAgICovCi0gICAgR2VuZXJpY01lbWJlckl0ZXJhdG9yKGNvbnN0IE5vbkNvbnN0SXRlcmF0b3IgJiBpdCkgOiBwdHJfKGl0LnB0cl8pIHt9Ci0gICAgSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBOb25Db25zdEl0ZXJhdG9yICYgaXQpIHsgcHRyXyA9IGl0LnB0cl87IHJldHVybiAqdGhpczsgfQotCi0gICAgLy8hIEBuYW1lIHN0ZXBwaW5nCi0gICAgLy9AewotICAgIEl0ZXJhdG9yJiBvcGVyYXRvcisrKCl7ICsrcHRyXzsgcmV0dXJuICp0aGlzOyB9Ci0gICAgSXRlcmF0b3ImIG9wZXJhdG9yLS0oKXsgLS1wdHJfOyByZXR1cm4gKnRoaXM7IH0KLSAgICBJdGVyYXRvciAgb3BlcmF0b3IrKyhpbnQpeyBJdGVyYXRvciBvbGQoKnRoaXMpOyArK3B0cl87IHJldHVybiBvbGQ7IH0KLSAgICBJdGVyYXRvciAgb3BlcmF0b3ItLShpbnQpeyBJdGVyYXRvciBvbGQoKnRoaXMpOyAtLXB0cl87IHJldHVybiBvbGQ7IH0KLSAgICAvL0B9Ci0KLSAgICAvLyEgQG5hbWUgaW5jcmVtZW50L2RlY3JlbWVudAotICAgIC8vQHsKLSAgICBJdGVyYXRvciBvcGVyYXRvcisoRGlmZmVyZW5jZVR5cGUgbikgY29uc3QgeyByZXR1cm4gSXRlcmF0b3IocHRyXytuKTsgfQotICAgIEl0ZXJhdG9yIG9wZXJhdG9yLShEaWZmZXJlbmNlVHlwZSBuKSBjb25zdCB7IHJldHVybiBJdGVyYXRvcihwdHJfLW4pOyB9Ci0KLSAgICBJdGVyYXRvciYgb3BlcmF0b3IrPShEaWZmZXJlbmNlVHlwZSBuKSB7IHB0cl8rPW47IHJldHVybiAqdGhpczsgfQotICAgIEl0ZXJhdG9yJiBvcGVyYXRvci09KERpZmZlcmVuY2VUeXBlIG4pIHsgcHRyXy09bjsgcmV0dXJuICp0aGlzOyB9Ci0gICAgLy9AfQotCi0gICAgLy8hIEBuYW1lIHJlbGF0aW9ucwotICAgIC8vQHsKLSAgICBib29sIG9wZXJhdG9yPT0oQ29uc3RJdGVyYXRvciB0aGF0KSBjb25zdCB7IHJldHVybiBwdHJfID09IHRoYXQucHRyXzsgfQotICAgIGJvb2wgb3BlcmF0b3IhPShDb25zdEl0ZXJhdG9yIHRoYXQpIGNvbnN0IHsgcmV0dXJuIHB0cl8gIT0gdGhhdC5wdHJfOyB9Ci0gICAgYm9vbCBvcGVyYXRvcjw9KENvbnN0SXRlcmF0b3IgdGhhdCkgY29uc3QgeyByZXR1cm4gcHRyXyA8PSB0aGF0LnB0cl87IH0KLSAgICBib29sIG9wZXJhdG9yPj0oQ29uc3RJdGVyYXRvciB0aGF0KSBjb25zdCB7IHJldHVybiBwdHJfID49IHRoYXQucHRyXzsgfQotICAgIGJvb2wgb3BlcmF0b3I8IChDb25zdEl0ZXJhdG9yIHRoYXQpIGNvbnN0IHsgcmV0dXJuIHB0cl8gPCB0aGF0LnB0cl87IH0KLSAgICBib29sIG9wZXJhdG9yPiAoQ29uc3RJdGVyYXRvciB0aGF0KSBjb25zdCB7IHJldHVybiBwdHJfID4gdGhhdC5wdHJfOyB9Ci0gICAgLy9AfQotCi0gICAgLy8hIEBuYW1lIGRlcmVmZXJlbmNlCi0gICAgLy9AewotICAgIFJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqcHRyXzsgfQotICAgIFBvaW50ZXIgICBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQotICAgIFJlZmVyZW5jZSBvcGVyYXRvcltdKERpZmZlcmVuY2VUeXBlIG4pIGNvbnN0IHsgcmV0dXJuIHB0cl9bbl07IH0KLSAgICAvL0B9Ci0KLSAgICAvLyEgRGlzdGFuY2UKLSAgICBEaWZmZXJlbmNlVHlwZSBvcGVyYXRvci0oQ29uc3RJdGVyYXRvciB0aGF0KSBjb25zdCB7IHJldHVybiBwdHJfLXRoYXQucHRyXzsgfQotCi1wcml2YXRlOgotICAgIC8vISBJbnRlcm5hbCBjb25zdHJ1Y3RvciBmcm9tIHBsYWluIHBvaW50ZXIKLSAgICBleHBsaWNpdCBHZW5lcmljTWVtYmVySXRlcmF0b3IoUG9pbnRlciBwKSA6IHB0cl8ocCkge30KLQotICAgIFBvaW50ZXIgcHRyXzsgLy8hPCByYXcgcG9pbnRlcgotfTsKLQotI2Vsc2UgLy8gUkFQSURKU09OX05PTUVNQkVSSVRFUkFUT1JDTEFTUwotCi0vLyBjbGFzcy1iYXNlZCBtZW1iZXIgaXRlcmF0b3IgaW1wbGVtZW50YXRpb24gZGlzYWJsZWQsIHVzZSBwbGFpbiBwb2ludGVycwotCi10ZW1wbGF0ZSA8Ym9vbCBDb25zdCwgdHlwZW5hbWUgRW5jb2RpbmcsIHR5cGVuYW1lIEFsbG9jYXRvcj4KLXN0cnVjdCBHZW5lcmljTWVtYmVySXRlcmF0b3I7Ci0KLS8vISBub24tY29uc3QgR2VuZXJpY01lbWJlckl0ZXJhdG9yCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRW5jb2RpbmcsIHR5cGVuYW1lIEFsbG9jYXRvcj4KLXN0cnVjdCBHZW5lcmljTWVtYmVySXRlcmF0b3I8ZmFsc2UsRW5jb2RpbmcsQWxsb2NhdG9yPiB7Ci0gICAgLy8hIHVzZSBwbGFpbiBwb2ludGVyIGFzIGl0ZXJhdG9yIHR5cGUKLSAgICB0eXBlZGVmIEdlbmVyaWNNZW1iZXI8RW5jb2RpbmcsQWxsb2NhdG9yPiogSXRlcmF0b3I7Ci19OwotLy8hIGNvbnN0IEdlbmVyaWNNZW1iZXJJdGVyYXRvcgotdGVtcGxhdGUgPHR5cGVuYW1lIEVuY29kaW5nLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1zdHJ1Y3QgR2VuZXJpY01lbWJlckl0ZXJhdG9yPHRydWUsRW5jb2RpbmcsQWxsb2NhdG9yPiB7Ci0gICAgLy8hIHVzZSBwbGFpbiBjb25zdCBwb2ludGVyIGFzIGl0ZXJhdG9yIHR5cGUKLSAgICB0eXBlZGVmIGNvbnN0IEdlbmVyaWNNZW1iZXI8RW5jb2RpbmcsQWxsb2NhdG9yPiogSXRlcmF0b3I7Ci19OwotCi0jZW5kaWYgLy8gUkFQSURKU09OX05PTUVNQkVSSVRFUkFUT1JDTEFTUwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBHZW5lcmljU3RyaW5nUmVmCi0KLS8vISBSZWZlcmVuY2UgdG8gYSBjb25zdGFudCBzdHJpbmcgKG5vdCB0YWtpbmcgYSBjb3B5KQotLyohCi0gICAgXHRwYXJhbSBDaGFyVHlwZSBjaGFyYWN0ZXIgdHlwZSBvZiB0aGUgc3RyaW5nCi0KLSAgICBUaGlzIGhlbHBlciBjbGFzcyBpcyB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgaW5mZXIgY29uc3RhbnQgc3RyaW5nCi0gICAgcmVmZXJlbmNlcyBmb3Igc3RyaW5nIGxpdGVyYWxzLCBlc3BlY2lhbGx5IGZyb20gXGMgY29uc3QgXGIgKCEpCi0gICAgY2hhcmFjdGVyIGFycmF5cy4KLQotICAgIFRoZSBtYWluIHVzZSBpcyBmb3IgY3JlYXRpbmcgSlNPTiBzdHJpbmcgdmFsdWVzIHdpdGhvdXQgY29weWluZyB0aGUKLSAgICBzb3VyY2Ugc3RyaW5nIHZpYSBhbiBccmVmIEFsbG9jYXRvci4gIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgcmVmZXJlbmNlZAotICAgIHN0cmluZyBwb2ludGVycyBoYXZlIGEgc3VmZmljaWVudCBsaWZldGltZSwgd2hpY2ggZXhjZWVkcyB0aGUgbGlmZXRpbWUKLSAgICBvZiB0aGUgYXNzb2NpYXRlZCBHZW5lcmljVmFsdWUuCi0KLSAgICBcYiBFeGFtcGxlCi0gICAgXGNvZGUKLSAgICBWYWx1ZSB2KCJmb28iKTsgICAvLyBvaywgbm8gbmVlZCB0byBjb3B5ICYgY2FsY3VsYXRlIGxlbmd0aAotICAgIGNvbnN0IGNoYXIgZm9vW10gPSAiZm9vIjsKLSAgICB2LlNldFN0cmluZyhmb28pOyAvLyBvawotCi0gICAgY29uc3QgY2hhciogYmFyID0gZm9vOwotICAgIC8vIFZhbHVlIHgoYmFyKTsgLy8gbm90IG9rLCBjYW4ndCByZWx5IG9uIGJhcidzIGxpZmV0aW1lCi0gICAgVmFsdWUgeChTdHJpbmdSZWYoYmFyKSk7IC8vIGxpZmV0aW1lIGV4cGxpY2l0bHkgZ3VhcmFudGVlZCBieSB1c2VyCi0gICAgVmFsdWUgeShTdHJpbmdSZWYoYmFyLCAzKSk7ICAvLyBvaywgZXhwbGljaXRseSBwYXNzIGxlbmd0aAotICAgIFxlbmRjb2RlCi0KLSAgICBcc2VlIFN0cmluZ1JlZiwgR2VuZXJpY1ZhbHVlOjpTZXRTdHJpbmcKLSovCi10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4KLXN0cnVjdCBHZW5lcmljU3RyaW5nUmVmIHsKLSAgICB0eXBlZGVmIENoYXJUeXBlIENoOyAvLyE8IGNoYXJhY3RlciB0eXBlIG9mIHRoZSBzdHJpbmcKLQotICAgIC8vISBDcmVhdGUgc3RyaW5nIHJlZmVyZW5jZSBmcm9tIFxjIGNvbnN0IGNoYXJhY3RlciBhcnJheQotI2lmbmRlZiBfX2NsYW5nX18gLy8gLVdkb2N1bWVudGF0aW9uCi0gICAgLyohCi0gICAgICAgIFRoaXMgY29uc3RydWN0b3IgaW1wbGljaXRseSBjcmVhdGVzIGEgY29uc3RhbnQgc3RyaW5nIHJlZmVyZW5jZSBmcm9tCi0gICAgICAgIGEgXGMgY29uc3QgY2hhcmFjdGVyIGFycmF5LiAgSXQgaGFzIGJldHRlciBwZXJmb3JtYW5jZSB0aGFuCi0gICAgICAgIFxyZWYgU3RyaW5nUmVmKGNvbnN0IENoYXJUeXBlKikgYnkgaW5mZXJyaW5nIHRoZSBzdHJpbmcgXHJlZiBsZW5ndGgKLSAgICAgICAgZnJvbSB0aGUgYXJyYXkgbGVuZ3RoLCBhbmQgYWxzbyBzdXBwb3J0cyBzdHJpbmdzIGNvbnRhaW5pbmcgbnVsbAotICAgICAgICBjaGFyYWN0ZXJzLgotCi0gICAgICAgIFx0cGFyYW0gTiBsZW5ndGggb2YgdGhlIHN0cmluZywgYXV0b21hdGljYWxseSBpbmZlcnJlZAotCi0gICAgICAgIFxwYXJhbSBzdHIgQ29uc3RhbnQgY2hhcmFjdGVyIGFycmF5LCBsaWZldGltZSBhc3N1bWVkIHRvIGJlIGxvbmdlcgotICAgICAgICAgICAgdGhhbiB0aGUgdXNlIG9mIHRoZSBzdHJpbmcgaW4gZS5nLiBhIEdlbmVyaWNWYWx1ZQotCi0gICAgICAgIFxwb3N0IFxyZWYgcyA9PSBzdHIKLQotICAgICAgICBcbm90ZSBDb25zdGFudCBjb21wbGV4aXR5LgotICAgICAgICBcbm90ZSBUaGVyZSBpcyBhIGhpZGRlbiwgcHJpdmF0ZSBvdmVybG9hZCB0byBkaXNhbGxvdyByZWZlcmVuY2VzIHRvCi0gICAgICAgICAgICBub24tY29uc3QgY2hhcmFjdGVyIGFycmF5cyB0byBiZSBjcmVhdGVkIHZpYSB0aGlzIGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgQnkgdGhpcywgZS5nLiBmdW5jdGlvbi1zY29wZSBhcnJheXMgdXNlZCB0byBiZSBmaWxsZWQgdmlhCi0gICAgICAgICAgICBcYyBzbnByaW50ZiBhcmUgZXhjbHVkZWQgZnJvbSBjb25zaWRlcmF0aW9uLgotICAgICAgICAgICAgSW4gc3VjaCBjYXNlcywgdGhlIHJlZmVyZW5jZWQgc3RyaW5nIHNob3VsZCBiZSBcYiBjb3BpZWQgdG8gdGhlCi0gICAgICAgICAgICBHZW5lcmljVmFsdWUgaW5zdGVhZC4KLSAgICAgKi8KLSNlbmRpZgotICAgIHRlbXBsYXRlPFNpemVUeXBlIE4+Ci0gICAgR2VuZXJpY1N0cmluZ1JlZihjb25zdCBDaGFyVHlwZSAoJnN0cilbTl0pIFJBUElESlNPTl9OT0VYQ0VQVAotICAgICAgICA6IHMoc3RyKSwgbGVuZ3RoKE4tMSkge30KLQotICAgIC8vISBFeHBsaWNpdGx5IGNyZWF0ZSBzdHJpbmcgcmVmZXJlbmNlIGZyb20gXGMgY29uc3QgY2hhcmFjdGVyIHBvaW50ZXIKLSNpZm5kZWYgX19jbGFuZ19fIC8vIC1XZG9jdW1lbnRhdGlvbgotICAgIC8qIQotICAgICAgICBUaGlzIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIFxiIGV4cGxpY2l0bHkgIGNyZWF0ZSBhIHJlZmVyZW5jZSB0bwotICAgICAgICBhIGNvbnN0YW50IHN0cmluZyBwb2ludGVyLgotCi0gICAgICAgIFxzZWUgU3RyaW5nUmVmKGNvbnN0IENoYXJUeXBlKikKLQotICAgICAgICBccGFyYW0gc3RyIENvbnN0YW50IGNoYXJhY3RlciBwb2ludGVyLCBsaWZldGltZSBhc3N1bWVkIHRvIGJlIGxvbmdlcgotICAgICAgICAgICAgdGhhbiB0aGUgdXNlIG9mIHRoZSBzdHJpbmcgaW4gZS5nLiBhIEdlbmVyaWNWYWx1ZQotCi0gICAgICAgIFxwb3N0IFxyZWYgcyA9PSBzdHIKLQotICAgICAgICBcbm90ZSBUaGVyZSBpcyBhIGhpZGRlbiwgcHJpdmF0ZSBvdmVybG9hZCB0byBkaXNhbGxvdyByZWZlcmVuY2VzIHRvCi0gICAgICAgICAgICBub24tY29uc3QgY2hhcmFjdGVyIGFycmF5cyB0byBiZSBjcmVhdGVkIHZpYSB0aGlzIGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgQnkgdGhpcywgZS5nLiBmdW5jdGlvbi1zY29wZSBhcnJheXMgdXNlZCB0byBiZSBmaWxsZWQgdmlhCi0gICAgICAgICAgICBcYyBzbnByaW50ZiBhcmUgZXhjbHVkZWQgZnJvbSBjb25zaWRlcmF0aW9uLgotICAgICAgICAgICAgSW4gc3VjaCBjYXNlcywgdGhlIHJlZmVyZW5jZWQgc3RyaW5nIHNob3VsZCBiZSBcYiBjb3BpZWQgdG8gdGhlCi0gICAgICAgICAgICBHZW5lcmljVmFsdWUgaW5zdGVhZC4KLSAgICAgKi8KLSNlbmRpZgotICAgIGV4cGxpY2l0IEdlbmVyaWNTdHJpbmdSZWYoY29uc3QgQ2hhclR5cGUqIHN0cikKLSAgICAgICAgOiBzKHN0ciksIGxlbmd0aChpbnRlcm5hbDo6U3RyTGVuKHN0cikpeyBSQVBJREpTT05fQVNTRVJUKHMgIT0gMCk7IH0KLQotICAgIC8vISBDcmVhdGUgY29uc3RhbnQgc3RyaW5nIHJlZmVyZW5jZSBmcm9tIHBvaW50ZXIgYW5kIGxlbmd0aAotI2lmbmRlZiBfX2NsYW5nX18gLy8gLVdkb2N1bWVudGF0aW9uCi0gICAgLyohIFxwYXJhbSBzdHIgY29uc3RhbnQgc3RyaW5nLCBsaWZldGltZSBhc3N1bWVkIHRvIGJlIGxvbmdlciB0aGFuIHRoZSB1c2Ugb2YgdGhlIHN0cmluZyBpbiBlLmcuIGEgR2VuZXJpY1ZhbHVlCi0gICAgICAgIFxwYXJhbSBsZW4gbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMTCB0ZXJtaW5hdG9yCi0KLSAgICAgICAgXHBvc3QgXHJlZiBzID09IHN0ciAmJiBccmVmIGxlbmd0aCA9PSBsZW4KLSAgICAgICAgXG5vdGUgQ29uc3RhbnQgY29tcGxleGl0eS4KLSAgICAgKi8KLSNlbmRpZgotICAgIEdlbmVyaWNTdHJpbmdSZWYoY29uc3QgQ2hhclR5cGUqIHN0ciwgU2l6ZVR5cGUgbGVuKQotICAgICAgICA6IHMoc3RyKSwgbGVuZ3RoKGxlbikgeyBSQVBJREpTT05fQVNTRVJUKHMgIT0gMCk7IH0KLQotICAgIC8vISBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIHBsYWluIENoYXJUeXBlIHBvaW50ZXIKLSAgICBvcGVyYXRvciBjb25zdCBDaCAqKCkgY29uc3QgeyByZXR1cm4gczsgfQotCi0gICAgY29uc3QgQ2gqIGNvbnN0IHM7IC8vITwgcGxhaW4gQ2hhclR5cGUgcG9pbnRlcgotICAgIGNvbnN0IFNpemVUeXBlIGxlbmd0aDsgLy8hPCBsZW5ndGggb2YgdGhlIHN0cmluZyAoZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBOVUxMIHRlcm1pbmF0b3IpCi0KLXByaXZhdGU6Ci0gICAgLy8hIERpc2FsbG93IGNvbnN0cnVjdGlvbiBmcm9tIG5vbi1jb25zdCBhcnJheQotICAgIHRlbXBsYXRlPFNpemVUeXBlIE4+Ci0gICAgR2VuZXJpY1N0cmluZ1JlZihDaGFyVHlwZSAoJnN0cilbTl0pIC8qID0gZGVsZXRlICovOwotfTsKLQotLy8hIE1hcmsgYSBjaGFyYWN0ZXIgcG9pbnRlciBhcyBjb25zdGFudCBzdHJpbmcKLS8qISBNYXJrIGEgcGxhaW4gY2hhcmFjdGVyIHBvaW50ZXIgYXMgYSAic3RyaW5nIGxpdGVyYWwiLiAgVGhpcyBmdW5jdGlvbgotICAgIGNhbiBiZSB1c2VkIHRvIGF2b2lkIGNvcHlpbmcgYSBjaGFyYWN0ZXIgc3RyaW5nIHRvIGJlIHJlZmVyZW5jZWQgYXMgYQotICAgIHZhbHVlIGluIGEgSlNPTiBHZW5lcmljVmFsdWUgb2JqZWN0LCBpZiB0aGUgc3RyaW5nJ3MgbGlmZXRpbWUgaXMga25vd24KLSAgICB0byBiZSB2YWxpZCBsb25nIGVub3VnaC4KLSAgICBcdHBhcmFtIENoYXJUeXBlIENoYXJhY3RlciB0eXBlIG9mIHRoZSBzdHJpbmcKLSAgICBccGFyYW0gc3RyIENvbnN0YW50IHN0cmluZywgbGlmZXRpbWUgYXNzdW1lZCB0byBiZSBsb25nZXIgdGhhbiB0aGUgdXNlIG9mIHRoZSBzdHJpbmcgaW4gZS5nLiBhIEdlbmVyaWNWYWx1ZQotICAgIFxyZXR1cm4gR2VuZXJpY1N0cmluZ1JlZiBzdHJpbmcgcmVmZXJlbmNlIG9iamVjdAotICAgIFxyZWxhdGVzYWxzbyBHZW5lcmljU3RyaW5nUmVmCi0KLSAgICBcc2VlIEdlbmVyaWNWYWx1ZTo6R2VuZXJpY1ZhbHVlKFN0cmluZ1JlZlR5cGUpLCBHZW5lcmljVmFsdWU6Om9wZXJhdG9yPShTdHJpbmdSZWZUeXBlKSwgR2VuZXJpY1ZhbHVlOjpTZXRTdHJpbmcoU3RyaW5nUmVmVHlwZSksIEdlbmVyaWNWYWx1ZTo6UHVzaEJhY2soU3RyaW5nUmVmVHlwZSwgQWxsb2NhdG9yJiksIEdlbmVyaWNWYWx1ZTo6QWRkTWVtYmVyCi0qLwotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGU+Ci1pbmxpbmUgR2VuZXJpY1N0cmluZ1JlZjxDaGFyVHlwZT4gU3RyaW5nUmVmKGNvbnN0IENoYXJUeXBlKiBzdHIpIHsKLSAgICByZXR1cm4gR2VuZXJpY1N0cmluZ1JlZjxDaGFyVHlwZT4oc3RyLCBpbnRlcm5hbDo6U3RyTGVuKHN0cikpOwotfQotCi0vLyEgTWFyayBhIGNoYXJhY3RlciBwb2ludGVyIGFzIGNvbnN0YW50IHN0cmluZwotLyohIE1hcmsgYSBwbGFpbiBjaGFyYWN0ZXIgcG9pbnRlciBhcyBhICJzdHJpbmcgbGl0ZXJhbCIuICBUaGlzIGZ1bmN0aW9uCi0gICAgY2FuIGJlIHVzZWQgdG8gYXZvaWQgY29weWluZyBhIGNoYXJhY3RlciBzdHJpbmcgdG8gYmUgcmVmZXJlbmNlZCBhcyBhCi0gICAgdmFsdWUgaW4gYSBKU09OIEdlbmVyaWNWYWx1ZSBvYmplY3QsIGlmIHRoZSBzdHJpbmcncyBsaWZldGltZSBpcyBrbm93bgotICAgIHRvIGJlIHZhbGlkIGxvbmcgZW5vdWdoLgotCi0gICAgVGhpcyB2ZXJzaW9uIGhhcyBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBzdXBwbGllZCBsZW5ndGgsIGFuZCBhbHNvCi0gICAgc3VwcG9ydHMgc3RyaW5nIGNvbnRhaW5pbmcgbnVsbCBjaGFyYWN0ZXJzLgotCi0gICAgXHRwYXJhbSBDaGFyVHlwZSBjaGFyYWN0ZXIgdHlwZSBvZiB0aGUgc3RyaW5nCi0gICAgXHBhcmFtIHN0ciBDb25zdGFudCBzdHJpbmcsIGxpZmV0aW1lIGFzc3VtZWQgdG8gYmUgbG9uZ2VyIHRoYW4gdGhlIHVzZSBvZiB0aGUgc3RyaW5nIGluIGUuZy4gYSBHZW5lcmljVmFsdWUKLSAgICBccGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlIHN0cmluZy4KLSAgICBccmV0dXJuIEdlbmVyaWNTdHJpbmdSZWYgc3RyaW5nIHJlZmVyZW5jZSBvYmplY3QKLSAgICBccmVsYXRlc2Fsc28gR2VuZXJpY1N0cmluZ1JlZgotKi8KLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlPgotaW5saW5lIEdlbmVyaWNTdHJpbmdSZWY8Q2hhclR5cGU+IFN0cmluZ1JlZihjb25zdCBDaGFyVHlwZSogc3RyLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIEdlbmVyaWNTdHJpbmdSZWY8Q2hhclR5cGU+KHN0ciwgU2l6ZVR5cGUobGVuZ3RoKSk7Ci19Ci0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotLy8hIE1hcmsgYSBzdHJpbmcgb2JqZWN0IGFzIGNvbnN0YW50IHN0cmluZwotLyohIE1hcmsgYSBzdHJpbmcgb2JqZWN0IChlLmcuIFxjIHN0ZDo6c3RyaW5nKSBhcyBhICJzdHJpbmcgbGl0ZXJhbCIuCi0gICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhdm9pZCBjb3B5aW5nIGEgc3RyaW5nIHRvIGJlIHJlZmVyZW5jZWQgYXMgYQotICAgIHZhbHVlIGluIGEgSlNPTiBHZW5lcmljVmFsdWUgb2JqZWN0LCBpZiB0aGUgc3RyaW5nJ3MgbGlmZXRpbWUgaXMga25vd24KLSAgICB0byBiZSB2YWxpZCBsb25nIGVub3VnaC4KLQotICAgIFx0cGFyYW0gQ2hhclR5cGUgY2hhcmFjdGVyIHR5cGUgb2YgdGhlIHN0cmluZwotICAgIFxwYXJhbSBzdHIgQ29uc3RhbnQgc3RyaW5nLCBsaWZldGltZSBhc3N1bWVkIHRvIGJlIGxvbmdlciB0aGFuIHRoZSB1c2Ugb2YgdGhlIHN0cmluZyBpbiBlLmcuIGEgR2VuZXJpY1ZhbHVlCi0gICAgXHJldHVybiBHZW5lcmljU3RyaW5nUmVmIHN0cmluZyByZWZlcmVuY2Ugb2JqZWN0Ci0gICAgXHJlbGF0ZXNhbHNvIEdlbmVyaWNTdHJpbmdSZWYKLSAgICBcbm90ZSBSZXF1aXJlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBccmVmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HLgotKi8KLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlPgotaW5saW5lIEdlbmVyaWNTdHJpbmdSZWY8Q2hhclR5cGU+IFN0cmluZ1JlZihjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxDaGFyVHlwZT4mIHN0cikgewotICAgIHJldHVybiBHZW5lcmljU3RyaW5nUmVmPENoYXJUeXBlPihzdHIuZGF0YSgpLCBTaXplVHlwZShzdHIuc2l6ZSgpKSk7Ci19Ci0jZW5kaWYKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR2VuZXJpY1ZhbHVlIHR5cGUgdHJhaXRzCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRW5jb2RpbmcgPSB2b2lkLCB0eXBlbmFtZSBBbGxvY2F0b3IgPSB2b2lkPgotc3RydWN0IElzR2VuZXJpY1ZhbHVlSW1wbCA6IEZhbHNlVHlwZSB7fTsKLQotLy8gc2VsZWN0IGNhbmRpZGF0ZXMgYWNjb3JkaW5nIHRvIG5lc3RlZCBlbmNvZGluZyBhbmQgYWxsb2NhdG9yIHR5cGVzCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IElzR2VuZXJpY1ZhbHVlSW1wbDxULCB0eXBlbmFtZSBWb2lkPHR5cGVuYW1lIFQ6OkVuY29kaW5nVHlwZT46OlR5cGUsIHR5cGVuYW1lIFZvaWQ8dHlwZW5hbWUgVDo6QWxsb2NhdG9yVHlwZT46OlR5cGU+Ci0gICAgOiBJc0Jhc2VPZjxHZW5lcmljVmFsdWU8dHlwZW5hbWUgVDo6RW5jb2RpbmdUeXBlLCB0eXBlbmFtZSBUOjpBbGxvY2F0b3JUeXBlPiwgVD46OlR5cGUge307Ci0KLS8vIGhlbHBlciB0byBtYXRjaCBhcmJpdHJhcnkgR2VuZXJpY1ZhbHVlIGluc3RhbnRpYXRpb25zLCBpbmNsdWRpbmcgZGVyaXZlZCBjbGFzc2VzCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IElzR2VuZXJpY1ZhbHVlIDogSXNHZW5lcmljVmFsdWVJbXBsPFQ+OjpUeXBlIHt9OwotCi19IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBUeXBlSGVscGVyCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgVHlwZUhlbHBlciB7fTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlPiAKLXN0cnVjdCBUeXBlSGVscGVyPFZhbHVlVHlwZSwgYm9vbD4gewotICAgIHN0YXRpYyBib29sIElzKGNvbnN0IFZhbHVlVHlwZSYgdikgeyByZXR1cm4gdi5Jc0Jvb2woKTsgfQotICAgIHN0YXRpYyBib29sIEdldChjb25zdCBWYWx1ZVR5cGUmIHYpIHsgcmV0dXJuIHYuR2V0Qm9vbCgpOyB9Ci0gICAgc3RhdGljIFZhbHVlVHlwZSYgU2V0KFZhbHVlVHlwZSYgdiwgYm9vbCBkYXRhKSB7IHJldHVybiB2LlNldEJvb2woZGF0YSk7IH0KLSAgICBzdGF0aWMgVmFsdWVUeXBlJiBTZXQoVmFsdWVUeXBlJiB2LCBib29sIGRhdGEsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSYpIHsgcmV0dXJuIHYuU2V0Qm9vbChkYXRhKTsgfQotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlPiAKLXN0cnVjdCBUeXBlSGVscGVyPFZhbHVlVHlwZSwgaW50PiB7Ci0gICAgc3RhdGljIGJvb2wgSXMoY29uc3QgVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LklzSW50KCk7IH0KLSAgICBzdGF0aWMgaW50IEdldChjb25zdCBWYWx1ZVR5cGUmIHYpIHsgcmV0dXJuIHYuR2V0SW50KCk7IH0KLSAgICBzdGF0aWMgVmFsdWVUeXBlJiBTZXQoVmFsdWVUeXBlJiB2LCBpbnQgZGF0YSkgeyByZXR1cm4gdi5TZXRJbnQoZGF0YSk7IH0KLSAgICBzdGF0aWMgVmFsdWVUeXBlJiBTZXQoVmFsdWVUeXBlJiB2LCBpbnQgZGF0YSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpBbGxvY2F0b3JUeXBlJikgeyByZXR1cm4gdi5TZXRJbnQoZGF0YSk7IH0KLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZT4gCi1zdHJ1Y3QgVHlwZUhlbHBlcjxWYWx1ZVR5cGUsIHVuc2lnbmVkPiB7Ci0gICAgc3RhdGljIGJvb2wgSXMoY29uc3QgVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LklzVWludCgpOyB9Ci0gICAgc3RhdGljIHVuc2lnbmVkIEdldChjb25zdCBWYWx1ZVR5cGUmIHYpIHsgcmV0dXJuIHYuR2V0VWludCgpOyB9Ci0gICAgc3RhdGljIFZhbHVlVHlwZSYgU2V0KFZhbHVlVHlwZSYgdiwgdW5zaWduZWQgZGF0YSkgeyByZXR1cm4gdi5TZXRVaW50KGRhdGEpOyB9Ci0gICAgc3RhdGljIFZhbHVlVHlwZSYgU2V0KFZhbHVlVHlwZSYgdiwgdW5zaWduZWQgZGF0YSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpBbGxvY2F0b3JUeXBlJikgeyByZXR1cm4gdi5TZXRVaW50KGRhdGEpOyB9Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5cGU+IAotc3RydWN0IFR5cGVIZWxwZXI8VmFsdWVUeXBlLCBpbnQ2NF90PiB7Ci0gICAgc3RhdGljIGJvb2wgSXMoY29uc3QgVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LklzSW50NjQoKTsgfQotICAgIHN0YXRpYyBpbnQ2NF90IEdldChjb25zdCBWYWx1ZVR5cGUmIHYpIHsgcmV0dXJuIHYuR2V0SW50NjQoKTsgfQotICAgIHN0YXRpYyBWYWx1ZVR5cGUmIFNldChWYWx1ZVR5cGUmIHYsIGludDY0X3QgZGF0YSkgeyByZXR1cm4gdi5TZXRJbnQ2NChkYXRhKTsgfQotICAgIHN0YXRpYyBWYWx1ZVR5cGUmIFNldChWYWx1ZVR5cGUmIHYsIGludDY0X3QgZGF0YSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpBbGxvY2F0b3JUeXBlJikgeyByZXR1cm4gdi5TZXRJbnQ2NChkYXRhKTsgfQotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlPiAKLXN0cnVjdCBUeXBlSGVscGVyPFZhbHVlVHlwZSwgdWludDY0X3Q+IHsKLSAgICBzdGF0aWMgYm9vbCBJcyhjb25zdCBWYWx1ZVR5cGUmIHYpIHsgcmV0dXJuIHYuSXNVaW50NjQoKTsgfQotICAgIHN0YXRpYyB1aW50NjRfdCBHZXQoY29uc3QgVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LkdldFVpbnQ2NCgpOyB9Ci0gICAgc3RhdGljIFZhbHVlVHlwZSYgU2V0KFZhbHVlVHlwZSYgdiwgdWludDY0X3QgZGF0YSkgeyByZXR1cm4gdi5TZXRVaW50NjQoZGF0YSk7IH0KLSAgICBzdGF0aWMgVmFsdWVUeXBlJiBTZXQoVmFsdWVUeXBlJiB2LCB1aW50NjRfdCBkYXRhLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmKSB7IHJldHVybiB2LlNldFVpbnQ2NChkYXRhKTsgfQotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlPiAKLXN0cnVjdCBUeXBlSGVscGVyPFZhbHVlVHlwZSwgZG91YmxlPiB7Ci0gICAgc3RhdGljIGJvb2wgSXMoY29uc3QgVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LklzRG91YmxlKCk7IH0KLSAgICBzdGF0aWMgZG91YmxlIEdldChjb25zdCBWYWx1ZVR5cGUmIHYpIHsgcmV0dXJuIHYuR2V0RG91YmxlKCk7IH0KLSAgICBzdGF0aWMgVmFsdWVUeXBlJiBTZXQoVmFsdWVUeXBlJiB2LCBkb3VibGUgZGF0YSkgeyByZXR1cm4gdi5TZXREb3VibGUoZGF0YSk7IH0KLSAgICBzdGF0aWMgVmFsdWVUeXBlJiBTZXQoVmFsdWVUeXBlJiB2LCBkb3VibGUgZGF0YSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpBbGxvY2F0b3JUeXBlJikgeyByZXR1cm4gdi5TZXREb3VibGUoZGF0YSk7IH0KLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZT4gCi1zdHJ1Y3QgVHlwZUhlbHBlcjxWYWx1ZVR5cGUsIGZsb2F0PiB7Ci0gICAgc3RhdGljIGJvb2wgSXMoY29uc3QgVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LklzRmxvYXQoKTsgfQotICAgIHN0YXRpYyBmbG9hdCBHZXQoY29uc3QgVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LkdldEZsb2F0KCk7IH0KLSAgICBzdGF0aWMgVmFsdWVUeXBlJiBTZXQoVmFsdWVUeXBlJiB2LCBmbG9hdCBkYXRhKSB7IHJldHVybiB2LlNldEZsb2F0KGRhdGEpOyB9Ci0gICAgc3RhdGljIFZhbHVlVHlwZSYgU2V0KFZhbHVlVHlwZSYgdiwgZmxvYXQgZGF0YSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpBbGxvY2F0b3JUeXBlJikgeyByZXR1cm4gdi5TZXRGbG9hdChkYXRhKTsgfQotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlPiAKLXN0cnVjdCBUeXBlSGVscGVyPFZhbHVlVHlwZSwgY29uc3QgdHlwZW5hbWUgVmFsdWVUeXBlOjpDaCo+IHsKLSAgICB0eXBlZGVmIGNvbnN0IHR5cGVuYW1lIFZhbHVlVHlwZTo6Q2gqIFN0cmluZ1R5cGU7Ci0gICAgc3RhdGljIGJvb2wgSXMoY29uc3QgVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LklzU3RyaW5nKCk7IH0KLSAgICBzdGF0aWMgU3RyaW5nVHlwZSBHZXQoY29uc3QgVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LkdldFN0cmluZygpOyB9Ci0gICAgc3RhdGljIFZhbHVlVHlwZSYgU2V0KFZhbHVlVHlwZSYgdiwgY29uc3QgU3RyaW5nVHlwZSBkYXRhKSB7IHJldHVybiB2LlNldFN0cmluZyh0eXBlbmFtZSBWYWx1ZVR5cGU6OlN0cmluZ1JlZlR5cGUoZGF0YSkpOyB9Ci0gICAgc3RhdGljIFZhbHVlVHlwZSYgU2V0KFZhbHVlVHlwZSYgdiwgY29uc3QgU3RyaW5nVHlwZSBkYXRhLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmIGEpIHsgcmV0dXJuIHYuU2V0U3RyaW5nKGRhdGEsIGEpOyB9Ci19OwotCi0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLXRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZT4gCi1zdHJ1Y3QgVHlwZUhlbHBlcjxWYWx1ZVR5cGUsIHN0ZDo6YmFzaWNfc3RyaW5nPHR5cGVuYW1lIFZhbHVlVHlwZTo6Q2g+ID4gewotICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8dHlwZW5hbWUgVmFsdWVUeXBlOjpDaD4gU3RyaW5nVHlwZTsKLSAgICBzdGF0aWMgYm9vbCBJcyhjb25zdCBWYWx1ZVR5cGUmIHYpIHsgcmV0dXJuIHYuSXNTdHJpbmcoKTsgfQotICAgIHN0YXRpYyBTdHJpbmdUeXBlIEdldChjb25zdCBWYWx1ZVR5cGUmIHYpIHsgcmV0dXJuIHYuR2V0U3RyaW5nKCk7IH0KLSAgICBzdGF0aWMgVmFsdWVUeXBlJiBTZXQoVmFsdWVUeXBlJiB2LCBjb25zdCBTdHJpbmdUeXBlJiBkYXRhLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmIGEpIHsgcmV0dXJuIHYuU2V0U3RyaW5nKGRhdGEsIGEpOyB9Ci19OwotI2VuZGlmCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHlwZT4gCi1zdHJ1Y3QgVHlwZUhlbHBlcjxWYWx1ZVR5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QXJyYXk+IHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZhbHVlVHlwZTo6QXJyYXkgQXJyYXlUeXBlOwotICAgIHN0YXRpYyBib29sIElzKGNvbnN0IFZhbHVlVHlwZSYgdikgeyByZXR1cm4gdi5Jc0FycmF5KCk7IH0KLSAgICBzdGF0aWMgQXJyYXlUeXBlIEdldChWYWx1ZVR5cGUmIHYpIHsgcmV0dXJuIHYuR2V0QXJyYXkoKTsgfQotICAgIHN0YXRpYyBWYWx1ZVR5cGUmIFNldChWYWx1ZVR5cGUmIHYsIEFycmF5VHlwZSBkYXRhKSB7IHJldHVybiB2ID0gZGF0YTsgfQotICAgIHN0YXRpYyBWYWx1ZVR5cGUmIFNldChWYWx1ZVR5cGUmIHYsIEFycmF5VHlwZSBkYXRhLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmKSB7IHJldHVybiB2ID0gZGF0YTsgfQotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlPiAKLXN0cnVjdCBUeXBlSGVscGVyPFZhbHVlVHlwZSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpDb25zdEFycmF5PiB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGU6OkNvbnN0QXJyYXkgQXJyYXlUeXBlOwotICAgIHN0YXRpYyBib29sIElzKGNvbnN0IFZhbHVlVHlwZSYgdikgeyByZXR1cm4gdi5Jc0FycmF5KCk7IH0KLSAgICBzdGF0aWMgQXJyYXlUeXBlIEdldChjb25zdCBWYWx1ZVR5cGUmIHYpIHsgcmV0dXJuIHYuR2V0QXJyYXkoKTsgfQotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlPiAKLXN0cnVjdCBUeXBlSGVscGVyPFZhbHVlVHlwZSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpPYmplY3Q+IHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZhbHVlVHlwZTo6T2JqZWN0IE9iamVjdFR5cGU7Ci0gICAgc3RhdGljIGJvb2wgSXMoY29uc3QgVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LklzT2JqZWN0KCk7IH0KLSAgICBzdGF0aWMgT2JqZWN0VHlwZSBHZXQoVmFsdWVUeXBlJiB2KSB7IHJldHVybiB2LkdldE9iamVjdCgpOyB9Ci0gICAgc3RhdGljIFZhbHVlVHlwZSYgU2V0KFZhbHVlVHlwZSYgdiwgT2JqZWN0VHlwZSBkYXRhKSB7IHJldHVybiB2ID0gZGF0YTsgfQotICAgIHN0YXRpYyBWYWx1ZVR5cGUmIFNldChWYWx1ZVR5cGUmIHYsIE9iamVjdFR5cGUgZGF0YSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpBbGxvY2F0b3JUeXBlJikgeyB2ID0gZGF0YTsgfQotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeXBlPiAKLXN0cnVjdCBUeXBlSGVscGVyPFZhbHVlVHlwZSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpDb25zdE9iamVjdD4gewotICAgIHR5cGVkZWYgdHlwZW5hbWUgVmFsdWVUeXBlOjpDb25zdE9iamVjdCBPYmplY3RUeXBlOwotICAgIHN0YXRpYyBib29sIElzKGNvbnN0IFZhbHVlVHlwZSYgdikgeyByZXR1cm4gdi5Jc09iamVjdCgpOyB9Ci0gICAgc3RhdGljIE9iamVjdFR5cGUgR2V0KGNvbnN0IFZhbHVlVHlwZSYgdikgeyByZXR1cm4gdi5HZXRPYmplY3QoKTsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMKLXRlbXBsYXRlIDxib29sLCB0eXBlbmFtZT4gY2xhc3MgR2VuZXJpY0FycmF5OwotdGVtcGxhdGUgPGJvb2wsIHR5cGVuYW1lPiBjbGFzcyBHZW5lcmljT2JqZWN0OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBHZW5lcmljVmFsdWUKLQotLy8hIFJlcHJlc2VudHMgYSBKU09OIHZhbHVlLiBVc2UgVmFsdWUgZm9yIFVURjggZW5jb2RpbmcgYW5kIGRlZmF1bHQgYWxsb2NhdG9yLgotLyohCi0gICAgQSBKU09OIHZhbHVlIGNhbiBiZSBvbmUgb2YgNyB0eXBlcy4gVGhpcyBjbGFzcyBpcyBhIHZhcmlhbnQgdHlwZSBzdXBwb3J0aW5nCi0gICAgdGhlc2UgdHlwZXMuCi0KLSAgICBVc2UgdGhlIFZhbHVlIGlmIFVURjggYW5kIGRlZmF1bHQgYWxsb2NhdG9yCi0KLSAgICBcdHBhcmFtIEVuY29kaW5nICAgIEVuY29kaW5nIG9mIHRoZSB2YWx1ZS4gKEV2ZW4gbm9uLXN0cmluZyB2YWx1ZXMgbmVlZCB0byBoYXZlIHRoZSBzYW1lIGVuY29kaW5nIGluIGEgZG9jdW1lbnQpCi0gICAgXHRwYXJhbSBBbGxvY2F0b3IgICBBbGxvY2F0b3IgdHlwZSBmb3IgYWxsb2NhdGluZyBtZW1vcnkgb2Ygb2JqZWN0LCBhcnJheSBhbmQgc3RyaW5nLgotKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbmNvZGluZywgdHlwZW5hbWUgQWxsb2NhdG9yID0gTWVtb3J5UG9vbEFsbG9jYXRvcjw+ID4gCi1jbGFzcyBHZW5lcmljVmFsdWUgewotcHVibGljOgotICAgIC8vISBOYW1lLXZhbHVlIHBhaXIgaW4gYW4gb2JqZWN0LgotICAgIHR5cGVkZWYgR2VuZXJpY01lbWJlcjxFbmNvZGluZywgQWxsb2NhdG9yPiBNZW1iZXI7Ci0gICAgdHlwZWRlZiBFbmNvZGluZyBFbmNvZGluZ1R5cGU7ICAgICAgICAgICAgICAgICAgLy8hPCBFbmNvZGluZyB0eXBlIGZyb20gdGVtcGxhdGUgcGFyYW1ldGVyLgotICAgIHR5cGVkZWYgQWxsb2NhdG9yIEFsbG9jYXRvclR5cGU7ICAgICAgICAgICAgICAgIC8vITwgQWxsb2NhdG9yIHR5cGUgZnJvbSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBFbmNvZGluZzo6Q2ggQ2g7ICAgICAgICAgICAgICAgLy8hPCBDaGFyYWN0ZXIgdHlwZSBkZXJpdmVkIGZyb20gRW5jb2RpbmcuCi0gICAgdHlwZWRlZiBHZW5lcmljU3RyaW5nUmVmPENoPiBTdHJpbmdSZWZUeXBlOyAgICAgLy8hPCBSZWZlcmVuY2UgdG8gYSBjb25zdGFudCBzdHJpbmcKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEdlbmVyaWNNZW1iZXJJdGVyYXRvcjxmYWxzZSxFbmNvZGluZyxBbGxvY2F0b3I+OjpJdGVyYXRvciBNZW1iZXJJdGVyYXRvcjsgIC8vITwgTWVtYmVyIGl0ZXJhdG9yIGZvciBpdGVyYXRpbmcgaW4gb2JqZWN0LgotICAgIHR5cGVkZWYgdHlwZW5hbWUgR2VuZXJpY01lbWJlckl0ZXJhdG9yPHRydWUsRW5jb2RpbmcsQWxsb2NhdG9yPjo6SXRlcmF0b3IgQ29uc3RNZW1iZXJJdGVyYXRvcjsgIC8vITwgQ29uc3RhbnQgbWVtYmVyIGl0ZXJhdG9yIGZvciBpdGVyYXRpbmcgaW4gb2JqZWN0LgotICAgIHR5cGVkZWYgR2VuZXJpY1ZhbHVlKiBWYWx1ZUl0ZXJhdG9yOyAgICAgICAgICAgIC8vITwgVmFsdWUgaXRlcmF0b3IgZm9yIGl0ZXJhdGluZyBpbiBhcnJheS4KLSAgICB0eXBlZGVmIGNvbnN0IEdlbmVyaWNWYWx1ZSogQ29uc3RWYWx1ZUl0ZXJhdG9yOyAvLyE8IENvbnN0YW50IHZhbHVlIGl0ZXJhdG9yIGZvciBpdGVyYXRpbmcgaW4gYXJyYXkuCi0gICAgdHlwZWRlZiBHZW5lcmljVmFsdWU8RW5jb2RpbmcsIEFsbG9jYXRvcj4gVmFsdWVUeXBlOyAgICAvLyE8IFZhbHVlIHR5cGUgb2YgaXRzZWxmLgotICAgIHR5cGVkZWYgR2VuZXJpY0FycmF5PGZhbHNlLCBWYWx1ZVR5cGU+IEFycmF5OwotICAgIHR5cGVkZWYgR2VuZXJpY0FycmF5PHRydWUsIFZhbHVlVHlwZT4gQ29uc3RBcnJheTsKLSAgICB0eXBlZGVmIEdlbmVyaWNPYmplY3Q8ZmFsc2UsIFZhbHVlVHlwZT4gT2JqZWN0OwotICAgIHR5cGVkZWYgR2VuZXJpY09iamVjdDx0cnVlLCBWYWx1ZVR5cGU+IENvbnN0T2JqZWN0OwotCi0gICAgLy8hQG5hbWUgQ29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yLgotICAgIC8vQHsKLQotICAgIC8vISBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBudWxsIHZhbHVlLgotICAgIEdlbmVyaWNWYWx1ZSgpIFJBUElESlNPTl9OT0VYQ0VQVCA6IGRhdGFfKCkgeyBkYXRhXy5mLmZsYWdzID0ga051bGxGbGFnOyB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0gICAgLy8hIE1vdmUgY29uc3RydWN0b3IgaW4gQysrMTEKLSAgICBHZW5lcmljVmFsdWUoR2VuZXJpY1ZhbHVlJiYgcmhzKSBSQVBJREpTT05fTk9FWENFUFQgOiBkYXRhXyhyaHMuZGF0YV8pIHsKLSAgICAgICAgcmhzLmRhdGFfLmYuZmxhZ3MgPSBrTnVsbEZsYWc7IC8vIGdpdmUgdXAgY29udGVudHMKLSAgICB9Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAgICAvLyEgQ29weSBjb25zdHJ1Y3RvciBpcyBub3QgcGVybWl0dGVkLgotICAgIEdlbmVyaWNWYWx1ZShjb25zdCBHZW5lcmljVmFsdWUmIHJocyk7Ci0KLSNpZiBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0gICAgLy8hIE1vdmluZyBmcm9tIGEgR2VuZXJpY0RvY3VtZW50IGlzIG5vdCBwZXJtaXR0ZWQuCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFN0YWNrQWxsb2NhdG9yPgotICAgIEdlbmVyaWNWYWx1ZShHZW5lcmljRG9jdW1lbnQ8RW5jb2RpbmcsQWxsb2NhdG9yLFN0YWNrQWxsb2NhdG9yPiYmIHJocyk7Ci0KLSAgICAvLyEgTW92ZSBhc3NpZ25tZW50IGZyb20gYSBHZW5lcmljRG9jdW1lbnQgaXMgbm90IHBlcm1pdHRlZC4KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhY2tBbGxvY2F0b3I+Ci0gICAgR2VuZXJpY1ZhbHVlJiBvcGVyYXRvcj0oR2VuZXJpY0RvY3VtZW50PEVuY29kaW5nLEFsbG9jYXRvcixTdGFja0FsbG9jYXRvcj4mJiByaHMpOwotI2VuZGlmCi0KLXB1YmxpYzoKLQotICAgIC8vISBDb25zdHJ1Y3RvciB3aXRoIEpTT04gdmFsdWUgdHlwZS4KLSAgICAvKiEgVGhpcyBjcmVhdGVzIGEgVmFsdWUgb2Ygc3BlY2lmaWVkIHR5cGUgd2l0aCBkZWZhdWx0IGNvbnRlbnQuCi0gICAgICAgIFxwYXJhbSB0eXBlIFR5cGUgb2YgdGhlIHZhbHVlLgotICAgICAgICBcbm90ZSBEZWZhdWx0IGNvbnRlbnQgZm9yIG51bWJlciBpcyB6ZXJvLgotICAgICovCi0gICAgZXhwbGljaXQgR2VuZXJpY1ZhbHVlKFR5cGUgdHlwZSkgUkFQSURKU09OX05PRVhDRVBUIDogZGF0YV8oKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBkZWZhdWx0RmxhZ3NbN10gPSB7Ci0gICAgICAgICAgICBrTnVsbEZsYWcsIGtGYWxzZUZsYWcsIGtUcnVlRmxhZywga09iamVjdEZsYWcsIGtBcnJheUZsYWcsIGtTaG9ydFN0cmluZ0ZsYWcsCi0gICAgICAgICAgICBrTnVtYmVyQW55RmxhZwotICAgICAgICB9OwotICAgICAgICBSQVBJREpTT05fQVNTRVJUKHR5cGUgPD0ga051bWJlclR5cGUpOwotICAgICAgICBkYXRhXy5mLmZsYWdzID0gZGVmYXVsdEZsYWdzW3R5cGVdOwotCi0gICAgICAgIC8vIFVzZSBTaG9ydFN0cmluZyB0byBzdG9yZSBlbXB0eSBzdHJpbmcuCi0gICAgICAgIGlmICh0eXBlID09IGtTdHJpbmdUeXBlKQotICAgICAgICAgICAgZGF0YV8uc3MuU2V0TGVuZ3RoKDApOwotICAgIH0KLQotICAgIC8vISBFeHBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yICh3aXRoIGFsbG9jYXRvcikKLSAgICAvKiEgQ3JlYXRlcyBhIGNvcHkgb2YgYSBWYWx1ZSBieSB1c2luZyB0aGUgZ2l2ZW4gQWxsb2NhdG9yCi0gICAgICAgIFx0cGFyYW0gU291cmNlQWxsb2NhdG9yIGFsbG9jYXRvciBvZiBcYyByaHMKLSAgICAgICAgXHBhcmFtIHJocyBWYWx1ZSB0byBjb3B5IGZyb20gKHJlYWQtb25seSkKLSAgICAgICAgXHBhcmFtIGFsbG9jYXRvciBBbGxvY2F0b3IgZm9yIGFsbG9jYXRpbmcgY29waWVkIGVsZW1lbnRzIGFuZCBidWZmZXJzLiBDb21tb25seSB1c2UgR2VuZXJpY0RvY3VtZW50OjpHZXRBbGxvY2F0b3IoKS4KLSAgICAgICAgXHNlZSBDb3B5RnJvbSgpCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgU291cmNlQWxsb2NhdG9yID4KLSAgICBHZW5lcmljVmFsdWUoY29uc3QgR2VuZXJpY1ZhbHVlPEVuY29kaW5nLCBTb3VyY2VBbGxvY2F0b3I+JiByaHMsIEFsbG9jYXRvciAmIGFsbG9jYXRvcik7Ci0KLSAgICAvLyEgQ29uc3RydWN0b3IgZm9yIGJvb2xlYW4gdmFsdWUuCi0gICAgLyohIFxwYXJhbSBiIEJvb2xlYW4gdmFsdWUKLSAgICAgICAgXG5vdGUgVGhpcyBjb25zdHJ1Y3RvciBpcyBsaW1pdGVkIHRvIFxlbSByZWFsIGJvb2xlYW4gdmFsdWVzIGFuZCByZWplY3RzCi0gICAgICAgICAgICBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0eXBlcyBsaWtlIGFyYml0cmFyeSBwb2ludGVycy4gIFVzZSBhbiBleHBsaWNpdCBjYXN0Ci0gICAgICAgICAgICB0byBcYyBib29sLCBpZiB5b3Ugd2FudCB0byBjb25zdHJ1Y3QgYSBib29sZWFuIEpTT04gdmFsdWUgaW4gc3VjaCBjYXNlcy4KLSAgICAgKi8KLSNpZm5kZWYgUkFQSURKU09OX0RPWFlHRU5fUlVOTklORyAvLyBoaWRlIFNGSU5BRSBmcm9tIERveHlnZW4KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBleHBsaWNpdCBHZW5lcmljVmFsdWUoVCBiLCBSQVBJREpTT05fRU5BQkxFSUYoKGludGVybmFsOjpJc1NhbWU8Ym9vbCwgVD4pKSkgUkFQSURKU09OX05PRVhDRVBUICAvLyBTZWUgIzQ3MgotI2Vsc2UKLSAgICBleHBsaWNpdCBHZW5lcmljVmFsdWUoYm9vbCBiKSBSQVBJREpTT05fTk9FWENFUFQKLSNlbmRpZgotICAgICAgICA6IGRhdGFfKCkgewotICAgICAgICAgICAgLy8gc2FmZS1ndWFyZCBhZ2FpbnN0IGZhaWxpbmcgU0ZJTkFFCi0gICAgICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVCgoaW50ZXJuYWw6OklzU2FtZTxib29sLFQ+OjpWYWx1ZSkpOwotICAgICAgICAgICAgZGF0YV8uZi5mbGFncyA9IGIgPyBrVHJ1ZUZsYWcgOiBrRmFsc2VGbGFnOwotICAgIH0KLQotICAgIC8vISBDb25zdHJ1Y3RvciBmb3IgaW50IHZhbHVlLgotICAgIGV4cGxpY2l0IEdlbmVyaWNWYWx1ZShpbnQgaSkgUkFQSURKU09OX05PRVhDRVBUIDogZGF0YV8oKSB7Ci0gICAgICAgIGRhdGFfLm4uaTY0ID0gaTsKLSAgICAgICAgZGF0YV8uZi5mbGFncyA9IChpID49IDApID8gKGtOdW1iZXJJbnRGbGFnIHwga1VpbnRGbGFnIHwga1VpbnQ2NEZsYWcpIDoga051bWJlckludEZsYWc7Ci0gICAgfQotCi0gICAgLy8hIENvbnN0cnVjdG9yIGZvciB1bnNpZ25lZCB2YWx1ZS4KLSAgICBleHBsaWNpdCBHZW5lcmljVmFsdWUodW5zaWduZWQgdSkgUkFQSURKU09OX05PRVhDRVBUIDogZGF0YV8oKSB7Ci0gICAgICAgIGRhdGFfLm4udTY0ID0gdTsgCi0gICAgICAgIGRhdGFfLmYuZmxhZ3MgPSAodSAmIDB4ODAwMDAwMDApID8ga051bWJlclVpbnRGbGFnIDogKGtOdW1iZXJVaW50RmxhZyB8IGtJbnRGbGFnIHwga0ludDY0RmxhZyk7Ci0gICAgfQotCi0gICAgLy8hIENvbnN0cnVjdG9yIGZvciBpbnQ2NF90IHZhbHVlLgotICAgIGV4cGxpY2l0IEdlbmVyaWNWYWx1ZShpbnQ2NF90IGk2NCkgUkFQSURKU09OX05PRVhDRVBUIDogZGF0YV8oKSB7Ci0gICAgICAgIGRhdGFfLm4uaTY0ID0gaTY0OwotICAgICAgICBkYXRhXy5mLmZsYWdzID0ga051bWJlckludDY0RmxhZzsKLSAgICAgICAgaWYgKGk2NCA+PSAwKSB7Ci0gICAgICAgICAgICBkYXRhXy5mLmZsYWdzIHw9IGtOdW1iZXJVaW50NjRGbGFnOwotICAgICAgICAgICAgaWYgKCEoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGk2NCkgJiBSQVBJREpTT05fVUlOVDY0X0MyKDB4RkZGRkZGRkYsIDB4MDAwMDAwMDApKSkKLSAgICAgICAgICAgICAgICBkYXRhXy5mLmZsYWdzIHw9IGtVaW50RmxhZzsKLSAgICAgICAgICAgIGlmICghKHN0YXRpY19jYXN0PHVpbnQ2NF90PihpNjQpICYgUkFQSURKU09OX1VJTlQ2NF9DMigweEZGRkZGRkZGLCAweDgwMDAwMDAwKSkpCi0gICAgICAgICAgICAgICAgZGF0YV8uZi5mbGFncyB8PSBrSW50RmxhZzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpNjQgPj0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oUkFQSURKU09OX1VJTlQ2NF9DMigweEZGRkZGRkZGLCAweDgwMDAwMDAwKSkpCi0gICAgICAgICAgICBkYXRhXy5mLmZsYWdzIHw9IGtJbnRGbGFnOwotICAgIH0KLQotICAgIC8vISBDb25zdHJ1Y3RvciBmb3IgdWludDY0X3QgdmFsdWUuCi0gICAgZXhwbGljaXQgR2VuZXJpY1ZhbHVlKHVpbnQ2NF90IHU2NCkgUkFQSURKU09OX05PRVhDRVBUIDogZGF0YV8oKSB7Ci0gICAgICAgIGRhdGFfLm4udTY0ID0gdTY0OwotICAgICAgICBkYXRhXy5mLmZsYWdzID0ga051bWJlclVpbnQ2NEZsYWc7Ci0gICAgICAgIGlmICghKHU2NCAmIFJBUElESlNPTl9VSU5UNjRfQzIoMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCkpKQotICAgICAgICAgICAgZGF0YV8uZi5mbGFncyB8PSBrSW50NjRGbGFnOwotICAgICAgICBpZiAoISh1NjQgJiBSQVBJREpTT05fVUlOVDY0X0MyKDB4RkZGRkZGRkYsIDB4MDAwMDAwMDApKSkKLSAgICAgICAgICAgIGRhdGFfLmYuZmxhZ3MgfD0ga1VpbnRGbGFnOwotICAgICAgICBpZiAoISh1NjQgJiBSQVBJREpTT05fVUlOVDY0X0MyKDB4RkZGRkZGRkYsIDB4ODAwMDAwMDApKSkKLSAgICAgICAgICAgIGRhdGFfLmYuZmxhZ3MgfD0ga0ludEZsYWc7Ci0gICAgfQotCi0gICAgLy8hIENvbnN0cnVjdG9yIGZvciBkb3VibGUgdmFsdWUuCi0gICAgZXhwbGljaXQgR2VuZXJpY1ZhbHVlKGRvdWJsZSBkKSBSQVBJREpTT05fTk9FWENFUFQgOiBkYXRhXygpIHsgZGF0YV8ubi5kID0gZDsgZGF0YV8uZi5mbGFncyA9IGtOdW1iZXJEb3VibGVGbGFnOyB9Ci0KLSAgICAvLyEgQ29uc3RydWN0b3IgZm9yIGNvbnN0YW50IHN0cmluZyAoaS5lLiBkbyBub3QgbWFrZSBhIGNvcHkgb2Ygc3RyaW5nKQotICAgIEdlbmVyaWNWYWx1ZShjb25zdCBDaCogcywgU2l6ZVR5cGUgbGVuZ3RoKSBSQVBJREpTT05fTk9FWENFUFQgOiBkYXRhXygpIHsgU2V0U3RyaW5nUmF3KFN0cmluZ1JlZihzLCBsZW5ndGgpKTsgfQotCi0gICAgLy8hIENvbnN0cnVjdG9yIGZvciBjb25zdGFudCBzdHJpbmcgKGkuZS4gZG8gbm90IG1ha2UgYSBjb3B5IG9mIHN0cmluZykKLSAgICBleHBsaWNpdCBHZW5lcmljVmFsdWUoU3RyaW5nUmVmVHlwZSBzKSBSQVBJREpTT05fTk9FWENFUFQgOiBkYXRhXygpIHsgU2V0U3RyaW5nUmF3KHMpOyB9Ci0KLSAgICAvLyEgQ29uc3RydWN0b3IgZm9yIGNvcHktc3RyaW5nIChpLmUuIGRvIG1ha2UgYSBjb3B5IG9mIHN0cmluZykKLSAgICBHZW5lcmljVmFsdWUoY29uc3QgQ2gqIHMsIFNpemVUeXBlIGxlbmd0aCwgQWxsb2NhdG9yJiBhbGxvY2F0b3IpIDogZGF0YV8oKSB7IFNldFN0cmluZ1JhdyhTdHJpbmdSZWYocywgbGVuZ3RoKSwgYWxsb2NhdG9yKTsgfQotCi0gICAgLy8hIENvbnN0cnVjdG9yIGZvciBjb3B5LXN0cmluZyAoaS5lLiBkbyBtYWtlIGEgY29weSBvZiBzdHJpbmcpCi0gICAgR2VuZXJpY1ZhbHVlKGNvbnN0IENoKnMsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSA6IGRhdGFfKCkgeyBTZXRTdHJpbmdSYXcoU3RyaW5nUmVmKHMpLCBhbGxvY2F0b3IpOyB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIC8vISBDb25zdHJ1Y3RvciBmb3IgY29weS1zdHJpbmcgZnJvbSBhIHN0cmluZyBvYmplY3QgKGkuZS4gZG8gbWFrZSBhIGNvcHkgb2Ygc3RyaW5nKQotICAgIC8qISBcbm90ZSBSZXF1aXJlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBccmVmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HLgotICAgICAqLwotICAgIEdlbmVyaWNWYWx1ZShjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxDaD4mIHMsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSA6IGRhdGFfKCkgeyBTZXRTdHJpbmdSYXcoU3RyaW5nUmVmKHMpLCBhbGxvY2F0b3IpOyB9Ci0jZW5kaWYKLQotICAgIC8vISBDb25zdHJ1Y3RvciBmb3IgQXJyYXkuCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBhIEFuIGFycmF5IG9idGFpbmVkIGJ5IFxjIEdldEFycmF5KCkuCi0gICAgICAgIFxub3RlIFxjIEFycmF5IGlzIGFsd2F5cyBwYXNzLWJ5LXZhbHVlLgotICAgICAgICBcbm90ZSB0aGUgc291cmNlIGFycmF5IGlzIG1vdmVkIGludG8gdGhpcyB2YWx1ZSBhbmQgdGhlIHNvdXJlYyBhcnJheSBiZWNvbWVzIGVtcHR5LgotICAgICovCi0gICAgR2VuZXJpY1ZhbHVlKEFycmF5IGEpIFJBUElESlNPTl9OT0VYQ0VQVCA6IGRhdGFfKGEudmFsdWVfLmRhdGFfKSB7Ci0gICAgICAgIGEudmFsdWVfLmRhdGFfID0gRGF0YSgpOwotICAgICAgICBhLnZhbHVlXy5kYXRhXy5mLmZsYWdzID0ga0FycmF5RmxhZzsKLSAgICB9Ci0KLSAgICAvLyEgQ29uc3RydWN0b3IgZm9yIE9iamVjdC4KLSAgICAvKiEKLSAgICAgICAgXHBhcmFtIG8gQW4gb2JqZWN0IG9idGFpbmVkIGJ5IFxjIEdldE9iamVjdCgpLgotICAgICAgICBcbm90ZSBcYyBPYmplY3QgaXMgYWx3YXlzIHBhc3MtYnktdmFsdWUuCi0gICAgICAgIFxub3RlIHRoZSBzb3VyY2Ugb2JqZWN0IGlzIG1vdmVkIGludG8gdGhpcyB2YWx1ZSBhbmQgdGhlIHNvdXJlYyBvYmplY3QgYmVjb21lcyBlbXB0eS4KLSAgICAqLwotICAgIEdlbmVyaWNWYWx1ZShPYmplY3QgbykgUkFQSURKU09OX05PRVhDRVBUIDogZGF0YV8oby52YWx1ZV8uZGF0YV8pIHsKLSAgICAgICAgby52YWx1ZV8uZGF0YV8gPSBEYXRhKCk7Ci0gICAgICAgIG8udmFsdWVfLmRhdGFfLmYuZmxhZ3MgPSBrT2JqZWN0RmxhZzsKLSAgICB9Ci0KLSAgICAvLyEgRGVzdHJ1Y3Rvci4KLSAgICAvKiEgTmVlZCB0byBkZXN0cnVjdCBlbGVtZW50cyBvZiBhcnJheSwgbWVtYmVycyBvZiBvYmplY3QsIG9yIGNvcHktc3RyaW5nLgotICAgICovCi0gICAgfkdlbmVyaWNWYWx1ZSgpIHsKLSAgICAgICAgaWYgKEFsbG9jYXRvcjo6a05lZWRGcmVlKSB7IC8vIFNob3J0Y3V0IGJ5IEFsbG9jYXRvcidzIHRyYWl0Ci0gICAgICAgICAgICBzd2l0Y2goZGF0YV8uZi5mbGFncykgewotICAgICAgICAgICAgY2FzZSBrQXJyYXlGbGFnOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR2VuZXJpY1ZhbHVlKiBlID0gR2V0RWxlbWVudHNQb2ludGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoR2VuZXJpY1ZhbHVlKiB2ID0gZTsgdiAhPSBlICsgZGF0YV8uYS5zaXplOyArK3YpCi0gICAgICAgICAgICAgICAgICAgICAgICB2LT5+R2VuZXJpY1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFsbG9jYXRvcjo6RnJlZShlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2Uga09iamVjdEZsYWc6Ci0gICAgICAgICAgICAgICAgZm9yIChNZW1iZXJJdGVyYXRvciBtID0gTWVtYmVyQmVnaW4oKTsgbSAhPSBNZW1iZXJFbmQoKTsgKyttKQotICAgICAgICAgICAgICAgICAgICBtLT5+TWVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgQWxsb2NhdG9yOjpGcmVlKEdldE1lbWJlcnNQb2ludGVyKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIGtDb3B5U3RyaW5nRmxhZzoKLSAgICAgICAgICAgICAgICBBbGxvY2F0b3I6OkZyZWUoY29uc3RfY2FzdDxDaCo+KEdldFN0cmluZ1BvaW50ZXIoKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gRG8gbm90aGluZyBmb3Igb3RoZXIgdHlwZXMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL0B9Ci0KLSAgICAvLyFAbmFtZSBBc3NpZ25tZW50IG9wZXJhdG9ycwotICAgIC8vQHsKLQotICAgIC8vISBBc3NpZ25tZW50IHdpdGggbW92ZSBzZW1hbnRpY3MuCi0gICAgLyohIFxwYXJhbSByaHMgU291cmNlIG9mIHRoZSBhc3NpZ25tZW50LiBJdCB3aWxsIGJlY29tZSBhIG51bGwgdmFsdWUgYWZ0ZXIgYXNzaWdubWVudC4KLSAgICAqLwotICAgIEdlbmVyaWNWYWx1ZSYgb3BlcmF0b3I9KEdlbmVyaWNWYWx1ZSYgcmhzKSBSQVBJREpTT05fTk9FWENFUFQgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKHRoaXMgIT0gJnJocyk7Ci0gICAgICAgIHRoaXMtPn5HZW5lcmljVmFsdWUoKTsKLSAgICAgICAgUmF3QXNzaWduKHJocyk7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0gICAgLy8hIE1vdmUgYXNzaWdubWVudCBpbiBDKysxMQotICAgIEdlbmVyaWNWYWx1ZSYgb3BlcmF0b3I9KEdlbmVyaWNWYWx1ZSYmIHJocykgUkFQSURKU09OX05PRVhDRVBUIHsKLSAgICAgICAgcmV0dXJuICp0aGlzID0gcmhzLk1vdmUoKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vISBBc3NpZ25tZW50IG9mIGNvbnN0YW50IHN0cmluZyByZWZlcmVuY2UgKG5vIGNvcHkpCi0gICAgLyohIFxwYXJhbSBzdHIgQ29uc3RhbnQgc3RyaW5nIHJlZmVyZW5jZSB0byBiZSBhc3NpZ25lZAotICAgICAgICBcbm90ZSBUaGlzIG92ZXJsb2FkIGlzIG5lZWRlZCB0byBhdm9pZCBjbGFzaGVzIHdpdGggdGhlIGdlbmVyaWMgcHJpbWl0aXZlIHR5cGUgYXNzaWdubWVudCBvdmVybG9hZCBiZWxvdy4KLSAgICAgICAgXHNlZSBHZW5lcmljU3RyaW5nUmVmLCBvcGVyYXRvcj0oVCkKLSAgICAqLwotICAgIEdlbmVyaWNWYWx1ZSYgb3BlcmF0b3I9KFN0cmluZ1JlZlR5cGUgc3RyKSBSQVBJREpTT05fTk9FWENFUFQgewotICAgICAgICBHZW5lcmljVmFsdWUgcyhzdHIpOwotICAgICAgICByZXR1cm4gKnRoaXMgPSBzOwotICAgIH0KLQotICAgIC8vISBBc3NpZ25tZW50IHdpdGggcHJpbWl0aXZlIHR5cGVzLgotICAgIC8qISBcdHBhcmFtIFQgRWl0aGVyIFxyZWYgVHlwZSwgXGMgaW50LCBcYyB1bnNpZ25lZCwgXGMgaW50NjRfdCwgXGMgdWludDY0X3QKLSAgICAgICAgXHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBhc3NpZ25lZC4KLQotICAgICAgICBcbm90ZSBUaGUgc291cmNlIHR5cGUgXGMgVCBleHBsaWNpdGx5IGRpc2FsbG93cyBhbGwgcG9pbnRlciB0eXBlcywKLSAgICAgICAgICAgIGVzcGVjaWFsbHkgKFxjIGNvbnN0KSBccmVmIENoKi4gIFRoaXMgaGVscHMgYXZvaWRpbmcgaW1wbGljaXRseQotICAgICAgICAgICAgcmVmZXJlbmNpbmcgY2hhcmFjdGVyIHN0cmluZ3Mgd2l0aCBpbnN1ZmZpY2llbnQgbGlmZXRpbWUsIHVzZQotICAgICAgICAgICAgXHJlZiBTZXRTdHJpbmcoY29uc3QgQ2gqLCBBbGxvY2F0b3ImKSAoZm9yIGNvcHlpbmcpIG9yCi0gICAgICAgICAgICBccmVmIFN0cmluZ1JlZigpICh0byBleHBsaWNpdGx5IG1hcmsgdGhlIHBvaW50ZXIgYXMgY29uc3RhbnQpIGluc3RlYWQuCi0gICAgICAgICAgICBBbGwgb3RoZXIgcG9pbnRlciB0eXBlcyB3b3VsZCBpbXBsaWNpdGx5IGNvbnZlcnQgdG8gXGMgYm9vbCwKLSAgICAgICAgICAgIHVzZSBccmVmIFNldEJvb2woKSBpbnN0ZWFkLgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpJc1BvaW50ZXI8VD4pLCAoR2VuZXJpY1ZhbHVlJikpCi0gICAgb3BlcmF0b3I9KFQgdmFsdWUpIHsKLSAgICAgICAgR2VuZXJpY1ZhbHVlIHYodmFsdWUpOwotICAgICAgICByZXR1cm4gKnRoaXMgPSB2OwotICAgIH0KLQotICAgIC8vISBEZWVwLWNvcHkgYXNzaWdubWVudCBmcm9tIFZhbHVlCi0gICAgLyohIEFzc2lnbnMgYSBcYiBjb3B5IG9mIHRoZSBWYWx1ZSB0byB0aGUgY3VycmVudCBWYWx1ZSBvYmplY3QKLSAgICAgICAgXHRwYXJhbSBTb3VyY2VBbGxvY2F0b3IgQWxsb2NhdG9yIHR5cGUgb2YgXGMgcmhzCi0gICAgICAgIFxwYXJhbSByaHMgVmFsdWUgdG8gY29weSBmcm9tIChyZWFkLW9ubHkpCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIHRvIHVzZSBmb3IgY29weWluZwotICAgICAqLwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VBbGxvY2F0b3I+Ci0gICAgR2VuZXJpY1ZhbHVlJiBDb3B5RnJvbShjb25zdCBHZW5lcmljVmFsdWU8RW5jb2RpbmcsIFNvdXJjZUFsbG9jYXRvcj4mIHJocywgQWxsb2NhdG9yJiBhbGxvY2F0b3IpIHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChzdGF0aWNfY2FzdDx2b2lkKj4odGhpcykgIT0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KCZyaHMpKTsKLSAgICAgICAgdGhpcy0+fkdlbmVyaWNWYWx1ZSgpOwotICAgICAgICBuZXcgKHRoaXMpIEdlbmVyaWNWYWx1ZShyaHMsIGFsbG9jYXRvcik7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvLyEgRXhjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdmFsdWUgd2l0aCB0aG9zZSBvZiBvdGhlci4KLSAgICAvKiEKLSAgICAgICAgXHBhcmFtIG90aGVyIEFub3RoZXIgdmFsdWUuCi0gICAgICAgIFxub3RlIENvbnN0YW50IGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICBHZW5lcmljVmFsdWUmIFN3YXAoR2VuZXJpY1ZhbHVlJiBvdGhlcikgUkFQSURKU09OX05PRVhDRVBUIHsKLSAgICAgICAgR2VuZXJpY1ZhbHVlIHRlbXA7Ci0gICAgICAgIHRlbXAuUmF3QXNzaWduKCp0aGlzKTsKLSAgICAgICAgUmF3QXNzaWduKG90aGVyKTsKLSAgICAgICAgb3RoZXIuUmF3QXNzaWduKHRlbXApOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgLy8hIGZyZWUtc3RhbmRpbmcgc3dhcCBmdW5jdGlvbiBoZWxwZXIKLSAgICAvKiEKLSAgICAgICAgSGVscGVyIGZ1bmN0aW9uIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBjb21tb24gc3dhcCBpbXBsZW1lbnRhdGlvbiBwYXR0ZXJuIGJhc2VkIG9uIFxjIHN0ZDo6c3dhcDoKLSAgICAgICAgXGNvZGUKLSAgICAgICAgdm9pZCBzd2FwKE15Q2xhc3MmIGEsIE15Q2xhc3MmIGIpIHsKLSAgICAgICAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKLSAgICAgICAgICAgIHN3YXAoYS52YWx1ZSwgYi52YWx1ZSk7Ci0gICAgICAgICAgICAvLyAuLi4KLSAgICAgICAgfQotICAgICAgICBcZW5kY29kZQotICAgICAgICBcc2VlIFN3YXAoKQotICAgICAqLwotICAgIGZyaWVuZCBpbmxpbmUgdm9pZCBzd2FwKEdlbmVyaWNWYWx1ZSYgYSwgR2VuZXJpY1ZhbHVlJiBiKSBSQVBJREpTT05fTk9FWENFUFQgeyBhLlN3YXAoYik7IH0KLQotICAgIC8vISBQcmVwYXJlIFZhbHVlIGZvciBtb3ZlIHNlbWFudGljcwotICAgIC8qISBccmV0dXJuICp0aGlzICovCi0gICAgR2VuZXJpY1ZhbHVlJiBNb3ZlKCkgUkFQSURKU09OX05PRVhDRVBUIHsgcmV0dXJuICp0aGlzOyB9Ci0gICAgLy9AfQotCi0gICAgLy8hQG5hbWUgRXF1YWwtdG8gYW5kIG5vdC1lcXVhbC10byBvcGVyYXRvcnMKLSAgICAvL0B7Ci0gICAgLy8hIEVxdWFsLXRvIG9wZXJhdG9yCi0gICAgLyohCi0gICAgICAgIFxub3RlIElmIGFuIG9iamVjdCBjb250YWlucyBkdXBsaWNhdGVkIG5hbWVkIG1lbWJlciwgY29tcGFyaW5nIGVxdWFsaXR5IHdpdGggYW55IG9iamVjdCBpcyBhbHdheXMgXGMgZmFsc2UuCi0gICAgICAgIFxub3RlIExpbmVhciB0aW1lIGNvbXBsZXhpdHkgKG51bWJlciBvZiBhbGwgdmFsdWVzIGluIHRoZSBzdWJ0cmVlIGFuZCB0b3RhbCBsZW5ndGhzIG9mIGFsbCBzdHJpbmdzKS4KLSAgICAqLwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VBbGxvY2F0b3I+Ci0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdlbmVyaWNWYWx1ZTxFbmNvZGluZywgU291cmNlQWxsb2NhdG9yPiYgcmhzKSBjb25zdCB7Ci0gICAgICAgIHR5cGVkZWYgR2VuZXJpY1ZhbHVlPEVuY29kaW5nLCBTb3VyY2VBbGxvY2F0b3I+IFJoc1R5cGU7Ci0gICAgICAgIGlmIChHZXRUeXBlKCkgIT0gcmhzLkdldFR5cGUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBzd2l0Y2ggKEdldFR5cGUoKSkgewotICAgICAgICBjYXNlIGtPYmplY3RUeXBlOiAvLyBXYXJuaW5nOiBPKG5eMikgaW5uZXItbG9vcAotICAgICAgICAgICAgaWYgKGRhdGFfLm8uc2l6ZSAhPSByaHMuZGF0YV8uby5zaXplKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChDb25zdE1lbWJlckl0ZXJhdG9yIGxoc01lbWJlckl0ciA9IE1lbWJlckJlZ2luKCk7IGxoc01lbWJlckl0ciAhPSBNZW1iZXJFbmQoKTsgKytsaHNNZW1iZXJJdHIpIHsKLSAgICAgICAgICAgICAgICB0eXBlbmFtZSBSaHNUeXBlOjpDb25zdE1lbWJlckl0ZXJhdG9yIHJoc01lbWJlckl0ciA9IHJocy5GaW5kTWVtYmVyKGxoc01lbWJlckl0ci0+bmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJoc01lbWJlckl0ciA9PSByaHMuTWVtYmVyRW5kKCkgfHwgbGhzTWVtYmVySXRyLT52YWx1ZSAhPSByaHNNZW1iZXJJdHItPnZhbHVlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICBjYXNlIGtBcnJheVR5cGU6Ci0gICAgICAgICAgICBpZiAoZGF0YV8uYS5zaXplICE9IHJocy5kYXRhXy5hLnNpemUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZm9yIChTaXplVHlwZSBpID0gMDsgaSA8IGRhdGFfLmEuc2l6ZTsgaSsrKQotICAgICAgICAgICAgICAgIGlmICgoKnRoaXMpW2ldICE9IHJoc1tpXSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgY2FzZSBrU3RyaW5nVHlwZToKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmdFcXVhbChyaHMpOwotCi0gICAgICAgIGNhc2Uga051bWJlclR5cGU6Ci0gICAgICAgICAgICBpZiAoSXNEb3VibGUoKSB8fCByaHMuSXNEb3VibGUoKSkgewotICAgICAgICAgICAgICAgIGRvdWJsZSBhID0gR2V0RG91YmxlKCk7ICAgICAvLyBNYXkgY29udmVydCBmcm9tIGludGVnZXIgdG8gZG91YmxlLgotICAgICAgICAgICAgICAgIGRvdWJsZSBiID0gcmhzLkdldERvdWJsZSgpOyAvLyBEaXR0bwotICAgICAgICAgICAgICAgIHJldHVybiBhID49IGIgJiYgYSA8PSBiOyAgICAvLyBQcmV2ZW50IC1XZmxvYXQtZXF1YWwKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZGF0YV8ubi51NjQgPT0gcmhzLmRhdGFfLm4udTY0OwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vISBFcXVhbC10byBvcGVyYXRvciB3aXRoIGNvbnN0IEMtc3RyaW5nIHBvaW50ZXIKLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2gqIHJocykgY29uc3QgeyByZXR1cm4gKnRoaXMgPT0gR2VuZXJpY1ZhbHVlKFN0cmluZ1JlZihyaHMpKTsgfQotCi0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLSAgICAvLyEgRXF1YWwtdG8gb3BlcmF0b3Igd2l0aCBzdHJpbmcgb2JqZWN0Ci0gICAgLyohIFxub3RlIFJlcXVpcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9sIFxyZWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcuCi0gICAgICovCi0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgcmhzKSBjb25zdCB7IHJldHVybiAqdGhpcyA9PSBHZW5lcmljVmFsdWUoU3RyaW5nUmVmKHJocykpOyB9Ci0jZW5kaWYKLQotICAgIC8vISBFcXVhbC10byBvcGVyYXRvciB3aXRoIHByaW1pdGl2ZSB0eXBlcwotICAgIC8qISBcdHBhcmFtIFQgRWl0aGVyIFxyZWYgVHlwZSwgXGMgaW50LCBcYyB1bnNpZ25lZCwgXGMgaW50NjRfdCwgXGMgdWludDY0X3QsIFxjIGRvdWJsZSwgXGMgdHJ1ZSwgXGMgZmFsc2UKLSAgICAqLwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBSQVBJREpTT05fRElTQUJMRUlGX1JFVFVSTigoaW50ZXJuYWw6Ok9yRXhwcjxpbnRlcm5hbDo6SXNQb2ludGVyPFQ+LGludGVybmFsOjpJc0dlbmVyaWNWYWx1ZTxUPiA+KSwgKGJvb2wpKSBvcGVyYXRvcj09KGNvbnN0IFQmIHJocykgY29uc3QgeyByZXR1cm4gKnRoaXMgPT0gR2VuZXJpY1ZhbHVlKHJocyk7IH0KLQotICAgIC8vISBOb3QtZXF1YWwtdG8gb3BlcmF0b3IKLSAgICAvKiEgXHJldHVybiAhKCp0aGlzID09IHJocykKLSAgICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlQWxsb2NhdG9yPgotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHZW5lcmljVmFsdWU8RW5jb2RpbmcsIFNvdXJjZUFsbG9jYXRvcj4mIHJocykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSByaHMpOyB9Ci0KLSAgICAvLyEgTm90LWVxdWFsLXRvIG9wZXJhdG9yIHdpdGggY29uc3QgQy1zdHJpbmcgcG9pbnRlcgotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDaCogcmhzKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHJocyk7IH0KLQotICAgIC8vISBOb3QtZXF1YWwtdG8gb3BlcmF0b3Igd2l0aCBhcmJpdHJhcnkgdHlwZXMKLSAgICAvKiEgXHJldHVybiAhKCp0aGlzID09IHJocykKLSAgICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpJc0dlbmVyaWNWYWx1ZTxUPiksIChib29sKSkgb3BlcmF0b3IhPShjb25zdCBUJiByaHMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsgfQotCi0gICAgLy8hIEVxdWFsLXRvIG9wZXJhdG9yIHdpdGggYXJiaXRyYXJ5IHR5cGVzIChzeW1tZXRyaWMgdmVyc2lvbikKLSAgICAvKiEgXHJldHVybiAocmhzID09IGxocykKLSAgICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIFJBUElESlNPTl9ESVNBQkxFSUZfUkVUVVJOKChpbnRlcm5hbDo6SXNHZW5lcmljVmFsdWU8VD4pLCAoYm9vbCkpIG9wZXJhdG9yPT0oY29uc3QgVCYgbGhzLCBjb25zdCBHZW5lcmljVmFsdWUmIHJocykgeyByZXR1cm4gcmhzID09IGxoczsgfQotCi0gICAgLy8hIE5vdC1FcXVhbC10byBvcGVyYXRvciB3aXRoIGFyYml0cmFyeSB0eXBlcyAoc3ltbWV0cmljIHZlcnNpb24pCi0gICAgLyohIFxyZXR1cm4gIShyaHMgPT0gbGhzKQotICAgICAqLwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpJc0dlbmVyaWNWYWx1ZTxUPiksIChib29sKSkgb3BlcmF0b3IhPShjb25zdCBUJiBsaHMsIGNvbnN0IEdlbmVyaWNWYWx1ZSYgcmhzKSB7IHJldHVybiAhKHJocyA9PSBsaHMpOyB9Ci0gICAgLy9AfQotCi0gICAgLy8hQG5hbWUgVHlwZQotICAgIC8vQHsKLQotICAgIFR5cGUgR2V0VHlwZSgpICBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxUeXBlPihkYXRhXy5mLmZsYWdzICYga1R5cGVNYXNrKTsgfQotICAgIGJvb2wgSXNOdWxsKCkgICBjb25zdCB7IHJldHVybiBkYXRhXy5mLmZsYWdzID09IGtOdWxsRmxhZzsgfQotICAgIGJvb2wgSXNGYWxzZSgpICBjb25zdCB7IHJldHVybiBkYXRhXy5mLmZsYWdzID09IGtGYWxzZUZsYWc7IH0KLSAgICBib29sIElzVHJ1ZSgpICAgY29uc3QgeyByZXR1cm4gZGF0YV8uZi5mbGFncyA9PSBrVHJ1ZUZsYWc7IH0KLSAgICBib29sIElzQm9vbCgpICAgY29uc3QgeyByZXR1cm4gKGRhdGFfLmYuZmxhZ3MgJiBrQm9vbEZsYWcpICE9IDA7IH0KLSAgICBib29sIElzT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gZGF0YV8uZi5mbGFncyA9PSBrT2JqZWN0RmxhZzsgfQotICAgIGJvb2wgSXNBcnJheSgpICBjb25zdCB7IHJldHVybiBkYXRhXy5mLmZsYWdzID09IGtBcnJheUZsYWc7IH0KLSAgICBib29sIElzTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gKGRhdGFfLmYuZmxhZ3MgJiBrTnVtYmVyRmxhZykgIT0gMDsgfQotICAgIGJvb2wgSXNJbnQoKSAgICBjb25zdCB7IHJldHVybiAoZGF0YV8uZi5mbGFncyAmIGtJbnRGbGFnKSAhPSAwOyB9Ci0gICAgYm9vbCBJc1VpbnQoKSAgIGNvbnN0IHsgcmV0dXJuIChkYXRhXy5mLmZsYWdzICYga1VpbnRGbGFnKSAhPSAwOyB9Ci0gICAgYm9vbCBJc0ludDY0KCkgIGNvbnN0IHsgcmV0dXJuIChkYXRhXy5mLmZsYWdzICYga0ludDY0RmxhZykgIT0gMDsgfQotICAgIGJvb2wgSXNVaW50NjQoKSBjb25zdCB7IHJldHVybiAoZGF0YV8uZi5mbGFncyAmIGtVaW50NjRGbGFnKSAhPSAwOyB9Ci0gICAgYm9vbCBJc0RvdWJsZSgpIGNvbnN0IHsgcmV0dXJuIChkYXRhXy5mLmZsYWdzICYga0RvdWJsZUZsYWcpICE9IDA7IH0KLSAgICBib29sIElzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gKGRhdGFfLmYuZmxhZ3MgJiBrU3RyaW5nRmxhZykgIT0gMDsgfQotCi0gICAgLy8gQ2hlY2tzIHdoZXRoZXIgYSBudW1iZXIgY2FuIGJlIGxvc3NsZXNzbHkgY29udmVydGVkIHRvIGEgZG91YmxlLgotICAgIGJvb2wgSXNMb3NzbGVzc0RvdWJsZSgpIGNvbnN0IHsKLSAgICAgICAgaWYgKCFJc051bWJlcigpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChJc1VpbnQ2NCgpKSB7Ci0gICAgICAgICAgICB1aW50NjRfdCB1ID0gR2V0VWludDY0KCk7Ci0gICAgICAgICAgICB2b2xhdGlsZSBkb3VibGUgZCA9IHN0YXRpY19jYXN0PGRvdWJsZT4odSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGQpID09IHU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKElzSW50NjQoKSkgewotICAgICAgICAgICAgaW50NjRfdCBpID0gR2V0SW50NjQoKTsKLSAgICAgICAgICAgIHZvbGF0aWxlIGRvdWJsZSBkID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDwgaW50NjRfdD4oZCkgPT0gaTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZG91YmxlLCBpbnQsIHVpbnQgYXJlIGFsd2F5cyBsb3NzbGVzcwotICAgIH0KLQotICAgIC8vIENoZWNrcyB3aGV0aGVyIGEgbnVtYmVyIGlzIGEgZmxvYXQgKHBvc3NpYmxlIGxvc3N5KS4KLSAgICBib29sIElzRmxvYXQoKSBjb25zdCAgewotICAgICAgICBpZiAoKGRhdGFfLmYuZmxhZ3MgJiBrRG91YmxlRmxhZykgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZG91YmxlIGQgPSBHZXREb3VibGUoKTsKLSAgICAgICAgcmV0dXJuIGQgPj0gLTMuNDAyODIzNGUzOCAmJiBkIDw9IDMuNDAyODIzNGUzODsKLSAgICB9Ci0gICAgLy8gQ2hlY2tzIHdoZXRoZXIgYSBudW1iZXIgY2FuIGJlIGxvc3NsZXNzbHkgY29udmVydGVkIHRvIGEgZmxvYXQuCi0gICAgYm9vbCBJc0xvc3NsZXNzRmxvYXQoKSBjb25zdCB7Ci0gICAgICAgIGlmICghSXNOdW1iZXIoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBkb3VibGUgYSA9IEdldERvdWJsZSgpOwotICAgICAgICBkb3VibGUgYiA9IHN0YXRpY19jYXN0PGRvdWJsZT4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpKTsKLSAgICAgICAgcmV0dXJuIGEgPj0gYiAmJiBhIDw9IGI7ICAgIC8vIFByZXZlbnQgLVdmbG9hdC1lcXVhbAotICAgIH0KLQotICAgIC8vQH0KLQotICAgIC8vIUBuYW1lIE51bGwKLSAgICAvL0B7Ci0KLSAgICBHZW5lcmljVmFsdWUmIFNldE51bGwoKSB7IHRoaXMtPn5HZW5lcmljVmFsdWUoKTsgbmV3ICh0aGlzKSBHZW5lcmljVmFsdWUoKTsgcmV0dXJuICp0aGlzOyB9Ci0KLSAgICAvL0B9Ci0KLSAgICAvLyFAbmFtZSBCb29sCi0gICAgLy9AewotCi0gICAgYm9vbCBHZXRCb29sKCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKElzQm9vbCgpKTsgcmV0dXJuIGRhdGFfLmYuZmxhZ3MgPT0ga1RydWVGbGFnOyB9Ci0gICAgLy8hPCBTZXQgYm9vbGVhbiB2YWx1ZQotICAgIC8qISBccG9zdCBJc0Jvb2woKSA9PSB0cnVlICovCi0gICAgR2VuZXJpY1ZhbHVlJiBTZXRCb29sKGJvb2wgYikgeyB0aGlzLT5+R2VuZXJpY1ZhbHVlKCk7IG5ldyAodGhpcykgR2VuZXJpY1ZhbHVlKGIpOyByZXR1cm4gKnRoaXM7IH0KLQotICAgIC8vQH0KLQotICAgIC8vIUBuYW1lIE9iamVjdAotICAgIC8vQHsKLQotICAgIC8vISBTZXQgdGhpcyB2YWx1ZSBhcyBhbiBlbXB0eSBvYmplY3QuCi0gICAgLyohIFxwb3N0IElzT2JqZWN0KCkgPT0gdHJ1ZSAqLwotICAgIEdlbmVyaWNWYWx1ZSYgU2V0T2JqZWN0KCkgeyB0aGlzLT5+R2VuZXJpY1ZhbHVlKCk7IG5ldyAodGhpcykgR2VuZXJpY1ZhbHVlKGtPYmplY3RUeXBlKTsgcmV0dXJuICp0aGlzOyB9Ci0KLSAgICAvLyEgR2V0IHRoZSBudW1iZXIgb2YgbWVtYmVycyBpbiB0aGUgb2JqZWN0LgotICAgIFNpemVUeXBlIE1lbWJlckNvdW50KCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKElzT2JqZWN0KCkpOyByZXR1cm4gZGF0YV8uby5zaXplOyB9Ci0KLSAgICAvLyEgQ2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGlzIGVtcHR5LgotICAgIGJvb2wgT2JqZWN0RW1wdHkoKSBjb25zdCB7IFJBUElESlNPTl9BU1NFUlQoSXNPYmplY3QoKSk7IHJldHVybiBkYXRhXy5vLnNpemUgPT0gMDsgfQotCi0gICAgLy8hIEdldCBhIHZhbHVlIGZyb20gYW4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZS4KLSAgICAvKiEgXHByZSBJc09iamVjdCgpID09IHRydWUKLSAgICAgICAgXHRwYXJhbSBUIEVpdGhlciBcYyBDaCBvciBcYyBjb25zdCBcYyBDaCAodGVtcGxhdGUgdXNlZCBmb3IgZGlzYW1iaWd1YXRpb24gd2l0aCBccmVmIG9wZXJhdG9yW10oU2l6ZVR5cGUpKQotICAgICAgICBcbm90ZSBJbiB2ZXJzaW9uIDAuMXgsIGlmIHRoZSBtZW1iZXIgaXMgbm90IGZvdW5kLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBudWxsIHZhbHVlLiBUaGlzIG1ha2VzIGlzc3VlIDcuCi0gICAgICAgIFNpbmNlIDAuMiwgaWYgdGhlIG5hbWUgaXMgbm90IGNvcnJlY3QsIGl0IHdpbGwgYXNzZXJ0LgotICAgICAgICBJZiB1c2VyIGlzIHVuc3VyZSB3aGV0aGVyIGEgbWVtYmVyIGV4aXN0cywgdXNlciBzaG91bGQgdXNlIEhhc01lbWJlcigpIGZpcnN0LgotICAgICAgICBBIGJldHRlciBhcHByb2FjaCBpcyB0byB1c2UgRmluZE1lbWJlcigpLgotICAgICAgICBcbm90ZSBMaW5lYXIgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpOb3RFeHByPGludGVybmFsOjpJc1NhbWU8dHlwZW5hbWUgaW50ZXJuYWw6OlJlbW92ZUNvbnN0PFQ+OjpUeXBlLCBDaD4gPiksKEdlbmVyaWNWYWx1ZSYpKSBvcGVyYXRvcltdKFQqIG5hbWUpIHsKLSAgICAgICAgR2VuZXJpY1ZhbHVlIG4oU3RyaW5nUmVmKG5hbWUpKTsKLSAgICAgICAgcmV0dXJuICgqdGhpcylbbl07Ci0gICAgfQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIFJBUElESlNPTl9ESVNBQkxFSUZfUkVUVVJOKChpbnRlcm5hbDo6Tm90RXhwcjxpbnRlcm5hbDo6SXNTYW1lPHR5cGVuYW1lIGludGVybmFsOjpSZW1vdmVDb25zdDxUPjo6VHlwZSwgQ2g+ID4pLChjb25zdCBHZW5lcmljVmFsdWUmKSkgb3BlcmF0b3JbXShUKiBuYW1lKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PEdlbmVyaWNWYWx1ZSY+KCp0aGlzKVtuYW1lXTsgfQotCi0gICAgLy8hIEdldCBhIHZhbHVlIGZyb20gYW4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZS4KLSAgICAvKiEgXHByZSBJc09iamVjdCgpID09IHRydWUKLSAgICAgICAgXHRwYXJhbSBTb3VyY2VBbGxvY2F0b3IgQWxsb2NhdG9yIG9mIHRoZSBcYyBuYW1lIHZhbHVlCi0KLSAgICAgICAgXG5vdGUgQ29tcGFyZWQgdG8gXHJlZiBvcGVyYXRvcltdKFQqKSwgdGhpcyB2ZXJzaW9uIGlzIGZhc3RlciBiZWNhdXNlIGl0IGRvZXMgbm90IG5lZWQgYSBTdHJMZW4oKS4KLSAgICAgICAgQW5kIGl0IGNhbiBhbHNvIGhhbmRsZSBzdHJpbmdzIHdpdGggZW1iZWRkZWQgbnVsbCBjaGFyYWN0ZXJzLgotCi0gICAgICAgIFxub3RlIExpbmVhciB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlQWxsb2NhdG9yPgotICAgIEdlbmVyaWNWYWx1ZSYgb3BlcmF0b3JbXShjb25zdCBHZW5lcmljVmFsdWU8RW5jb2RpbmcsIFNvdXJjZUFsbG9jYXRvcj4mIG5hbWUpIHsKLSAgICAgICAgTWVtYmVySXRlcmF0b3IgbWVtYmVyID0gRmluZE1lbWJlcihuYW1lKTsKLSAgICAgICAgaWYgKG1lbWJlciAhPSBNZW1iZXJFbmQoKSkKLSAgICAgICAgICAgIHJldHVybiBtZW1iZXItPnZhbHVlOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyAgICAvLyBzZWUgYWJvdmUgbm90ZQotCi0gICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ2VuZXJhdGUgLVdleGl0LXRpbWUtZGVzdHJ1Y3RvcnMgaW4gY2xhbmcKLSAgICAgICAgICAgIC8vIHN0YXRpYyBHZW5lcmljVmFsdWUgTnVsbFZhbHVlOwotICAgICAgICAgICAgLy8gcmV0dXJuIE51bGxWYWx1ZTsKLQotICAgICAgICAgICAgLy8gVXNlIHN0YXRpYyBidWZmZXIgYW5kIHBsYWNlbWVudC1uZXcgdG8gcHJldmVudCBkZXN0cnVjdGlvbgotICAgICAgICAgICAgc3RhdGljIGNoYXIgYnVmZmVyW3NpemVvZihHZW5lcmljVmFsdWUpXTsKLSAgICAgICAgICAgIHJldHVybiAqbmV3IChidWZmZXIpIEdlbmVyaWNWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VBbGxvY2F0b3I+Ci0gICAgY29uc3QgR2VuZXJpY1ZhbHVlJiBvcGVyYXRvcltdKGNvbnN0IEdlbmVyaWNWYWx1ZTxFbmNvZGluZywgU291cmNlQWxsb2NhdG9yPiYgbmFtZSkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxHZW5lcmljVmFsdWUmPigqdGhpcylbbmFtZV07IH0KLQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi0gICAgLy8hIEdldCBhIHZhbHVlIGZyb20gYW4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBuYW1lIChzdHJpbmcgb2JqZWN0KS4KLSAgICBHZW5lcmljVmFsdWUmIG9wZXJhdG9yW10oY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Q2g+JiBuYW1lKSB7IHJldHVybiAoKnRoaXMpW0dlbmVyaWNWYWx1ZShTdHJpbmdSZWYobmFtZSkpXTsgfQotICAgIGNvbnN0IEdlbmVyaWNWYWx1ZSYgb3BlcmF0b3JbXShjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxDaD4mIG5hbWUpIGNvbnN0IHsgcmV0dXJuICgqdGhpcylbR2VuZXJpY1ZhbHVlKFN0cmluZ1JlZihuYW1lKSldOyB9Ci0jZW5kaWYKLQotICAgIC8vISBDb25zdCBtZW1iZXIgaXRlcmF0b3IKLSAgICAvKiEgXHByZSBJc09iamVjdCgpID09IHRydWUgKi8KLSAgICBDb25zdE1lbWJlckl0ZXJhdG9yIE1lbWJlckJlZ2luKCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKElzT2JqZWN0KCkpOyByZXR1cm4gQ29uc3RNZW1iZXJJdGVyYXRvcihHZXRNZW1iZXJzUG9pbnRlcigpKTsgfQotICAgIC8vISBDb25zdCBcZW0gcGFzdC10aGUtZW5kIG1lbWJlciBpdGVyYXRvcgotICAgIC8qISBccHJlIElzT2JqZWN0KCkgPT0gdHJ1ZSAqLwotICAgIENvbnN0TWVtYmVySXRlcmF0b3IgTWVtYmVyRW5kKCkgY29uc3QgICB7IFJBUElESlNPTl9BU1NFUlQoSXNPYmplY3QoKSk7IHJldHVybiBDb25zdE1lbWJlckl0ZXJhdG9yKEdldE1lbWJlcnNQb2ludGVyKCkgKyBkYXRhXy5vLnNpemUpOyB9Ci0gICAgLy8hIE1lbWJlciBpdGVyYXRvcgotICAgIC8qISBccHJlIElzT2JqZWN0KCkgPT0gdHJ1ZSAqLwotICAgIE1lbWJlckl0ZXJhdG9yIE1lbWJlckJlZ2luKCkgICAgICAgICAgICB7IFJBUElESlNPTl9BU1NFUlQoSXNPYmplY3QoKSk7IHJldHVybiBNZW1iZXJJdGVyYXRvcihHZXRNZW1iZXJzUG9pbnRlcigpKTsgfQotICAgIC8vISBcZW0gUGFzdC10aGUtZW5kIG1lbWJlciBpdGVyYXRvcgotICAgIC8qISBccHJlIElzT2JqZWN0KCkgPT0gdHJ1ZSAqLwotICAgIE1lbWJlckl0ZXJhdG9yIE1lbWJlckVuZCgpICAgICAgICAgICAgICB7IFJBUElESlNPTl9BU1NFUlQoSXNPYmplY3QoKSk7IHJldHVybiBNZW1iZXJJdGVyYXRvcihHZXRNZW1iZXJzUG9pbnRlcigpICsgZGF0YV8uby5zaXplKTsgfQotCi0gICAgLy8hIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgZXhpc3RzIGluIHRoZSBvYmplY3QuCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBuYW1lIE1lbWJlciBuYW1lIHRvIGJlIHNlYXJjaGVkLgotICAgICAgICBccHJlIElzT2JqZWN0KCkgPT0gdHJ1ZQotICAgICAgICBccmV0dXJuIFdoZXRoZXIgYSBtZW1iZXIgd2l0aCB0aGF0IG5hbWUgZXhpc3RzLgotICAgICAgICBcbm90ZSBJdCBpcyBiZXR0ZXIgdG8gdXNlIEZpbmRNZW1iZXIoKSBkaXJlY3RseSBpZiB5b3UgbmVlZCB0aGUgb2J0YWluIHRoZSB2YWx1ZSBhcyB3ZWxsLgotICAgICAgICBcbm90ZSBMaW5lYXIgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgYm9vbCBIYXNNZW1iZXIoY29uc3QgQ2gqIG5hbWUpIGNvbnN0IHsgcmV0dXJuIEZpbmRNZW1iZXIobmFtZSkgIT0gTWVtYmVyRW5kKCk7IH0KLQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi0gICAgLy8hIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgZXhpc3RzIGluIHRoZSBvYmplY3Qgd2l0aCBzdHJpbmcgb2JqZWN0LgotICAgIC8qIQotICAgICAgICBccGFyYW0gbmFtZSBNZW1iZXIgbmFtZSB0byBiZSBzZWFyY2hlZC4KLSAgICAgICAgXHByZSBJc09iamVjdCgpID09IHRydWUKLSAgICAgICAgXHJldHVybiBXaGV0aGVyIGEgbWVtYmVyIHdpdGggdGhhdCBuYW1lIGV4aXN0cy4KLSAgICAgICAgXG5vdGUgSXQgaXMgYmV0dGVyIHRvIHVzZSBGaW5kTWVtYmVyKCkgZGlyZWN0bHkgaWYgeW91IG5lZWQgdGhlIG9idGFpbiB0aGUgdmFsdWUgYXMgd2VsbC4KLSAgICAgICAgXG5vdGUgTGluZWFyIHRpbWUgY29tcGxleGl0eS4KLSAgICAqLwotICAgIGJvb2wgSGFzTWVtYmVyKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgbmFtZSkgY29uc3QgeyByZXR1cm4gRmluZE1lbWJlcihuYW1lKSAhPSBNZW1iZXJFbmQoKTsgfQotI2VuZGlmCi0KLSAgICAvLyEgQ2hlY2sgd2hldGhlciBhIG1lbWJlciBleGlzdHMgaW4gdGhlIG9iamVjdCB3aXRoIEdlbmVyaWNWYWx1ZSBuYW1lLgotICAgIC8qIQotICAgICAgICBUaGlzIHZlcnNpb24gaXMgZmFzdGVyIGJlY2F1c2UgaXQgZG9lcyBub3QgbmVlZCBhIFN0ckxlbigpLiBJdCBjYW4gYWxzbyBoYW5kbGUgc3RyaW5nIHdpdGggbnVsbCBjaGFyYWN0ZXIuCi0gICAgICAgIFxwYXJhbSBuYW1lIE1lbWJlciBuYW1lIHRvIGJlIHNlYXJjaGVkLgotICAgICAgICBccHJlIElzT2JqZWN0KCkgPT0gdHJ1ZQotICAgICAgICBccmV0dXJuIFdoZXRoZXIgYSBtZW1iZXIgd2l0aCB0aGF0IG5hbWUgZXhpc3RzLgotICAgICAgICBcbm90ZSBJdCBpcyBiZXR0ZXIgdG8gdXNlIEZpbmRNZW1iZXIoKSBkaXJlY3RseSBpZiB5b3UgbmVlZCB0aGUgb2J0YWluIHRoZSB2YWx1ZSBhcyB3ZWxsLgotICAgICAgICBcbm90ZSBMaW5lYXIgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZUFsbG9jYXRvcj4KLSAgICBib29sIEhhc01lbWJlcihjb25zdCBHZW5lcmljVmFsdWU8RW5jb2RpbmcsIFNvdXJjZUFsbG9jYXRvcj4mIG5hbWUpIGNvbnN0IHsgcmV0dXJuIEZpbmRNZW1iZXIobmFtZSkgIT0gTWVtYmVyRW5kKCk7IH0KLQotICAgIC8vISBGaW5kIG1lbWJlciBieSBuYW1lLgotICAgIC8qIQotICAgICAgICBccGFyYW0gbmFtZSBNZW1iZXIgbmFtZSB0byBiZSBzZWFyY2hlZC4KLSAgICAgICAgXHByZSBJc09iamVjdCgpID09IHRydWUKLSAgICAgICAgXHJldHVybiBJdGVyYXRvciB0byBtZW1iZXIsIGlmIGl0IGV4aXN0cy4KLSAgICAgICAgICAgIE90aGVyd2lzZSByZXR1cm5zIFxyZWYgTWVtYmVyRW5kKCkuCi0KLSAgICAgICAgXG5vdGUgRWFybGllciB2ZXJzaW9ucyBvZiBSYXBpZGpzb24gcmV0dXJuZWQgYSBcYyBOVUxMIHBvaW50ZXIsIGluIGNhc2UKLSAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgbWVtYmVyIGRvZXNuJ3QgZXhpc3QuIEZvciBjb25zaXN0ZW5jeSB3aXRoIGUuZy4KLSAgICAgICAgICAgIFxjIHN0ZDo6bWFwLCB0aGlzIGhhcyBiZWVuIGNoYW5nZWQgdG8gTWVtYmVyRW5kKCkgbm93LgotICAgICAgICBcbm90ZSBMaW5lYXIgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgTWVtYmVySXRlcmF0b3IgRmluZE1lbWJlcihjb25zdCBDaCogbmFtZSkgewotICAgICAgICBHZW5lcmljVmFsdWUgbihTdHJpbmdSZWYobmFtZSkpOwotICAgICAgICByZXR1cm4gRmluZE1lbWJlcihuKTsKLSAgICB9Ci0KLSAgICBDb25zdE1lbWJlckl0ZXJhdG9yIEZpbmRNZW1iZXIoY29uc3QgQ2gqIG5hbWUpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8R2VuZXJpY1ZhbHVlJj4oKnRoaXMpLkZpbmRNZW1iZXIobmFtZSk7IH0KLQotICAgIC8vISBGaW5kIG1lbWJlciBieSBuYW1lLgotICAgIC8qIQotICAgICAgICBUaGlzIHZlcnNpb24gaXMgZmFzdGVyIGJlY2F1c2UgaXQgZG9lcyBub3QgbmVlZCBhIFN0ckxlbigpLiBJdCBjYW4gYWxzbyBoYW5kbGUgc3RyaW5nIHdpdGggbnVsbCBjaGFyYWN0ZXIuCi0gICAgICAgIFxwYXJhbSBuYW1lIE1lbWJlciBuYW1lIHRvIGJlIHNlYXJjaGVkLgotICAgICAgICBccHJlIElzT2JqZWN0KCkgPT0gdHJ1ZQotICAgICAgICBccmV0dXJuIEl0ZXJhdG9yIHRvIG1lbWJlciwgaWYgaXQgZXhpc3RzLgotICAgICAgICAgICAgT3RoZXJ3aXNlIHJldHVybnMgXHJlZiBNZW1iZXJFbmQoKS4KLQotICAgICAgICBcbm90ZSBFYXJsaWVyIHZlcnNpb25zIG9mIFJhcGlkanNvbiByZXR1cm5lZCBhIFxjIE5VTEwgcG9pbnRlciwgaW4gY2FzZQotICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCBtZW1iZXIgZG9lc24ndCBleGlzdC4gRm9yIGNvbnNpc3RlbmN5IHdpdGggZS5nLgotICAgICAgICAgICAgXGMgc3RkOjptYXAsIHRoaXMgaGFzIGJlZW4gY2hhbmdlZCB0byBNZW1iZXJFbmQoKSBub3cuCi0gICAgICAgIFxub3RlIExpbmVhciB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlQWxsb2NhdG9yPgotICAgIE1lbWJlckl0ZXJhdG9yIEZpbmRNZW1iZXIoY29uc3QgR2VuZXJpY1ZhbHVlPEVuY29kaW5nLCBTb3VyY2VBbGxvY2F0b3I+JiBuYW1lKSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoSXNPYmplY3QoKSk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQobmFtZS5Jc1N0cmluZygpKTsKLSAgICAgICAgTWVtYmVySXRlcmF0b3IgbWVtYmVyID0gTWVtYmVyQmVnaW4oKTsKLSAgICAgICAgZm9yICggOyBtZW1iZXIgIT0gTWVtYmVyRW5kKCk7ICsrbWVtYmVyKQotICAgICAgICAgICAgaWYgKG5hbWUuU3RyaW5nRXF1YWwobWVtYmVyLT5uYW1lKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgcmV0dXJuIG1lbWJlcjsKLSAgICB9Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZUFsbG9jYXRvcj4gQ29uc3RNZW1iZXJJdGVyYXRvciBGaW5kTWVtYmVyKGNvbnN0IEdlbmVyaWNWYWx1ZTxFbmNvZGluZywgU291cmNlQWxsb2NhdG9yPiYgbmFtZSkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxHZW5lcmljVmFsdWUmPigqdGhpcykuRmluZE1lbWJlcihuYW1lKTsgfQotCi0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLSAgICAvLyEgRmluZCBtZW1iZXIgYnkgc3RyaW5nIG9iamVjdCBuYW1lLgotICAgIC8qIQotICAgICAgICBccGFyYW0gbmFtZSBNZW1iZXIgbmFtZSB0byBiZSBzZWFyY2hlZC4KLSAgICAgICAgXHByZSBJc09iamVjdCgpID09IHRydWUKLSAgICAgICAgXHJldHVybiBJdGVyYXRvciB0byBtZW1iZXIsIGlmIGl0IGV4aXN0cy4KLSAgICAgICAgICAgIE90aGVyd2lzZSByZXR1cm5zIFxyZWYgTWVtYmVyRW5kKCkuCi0gICAgKi8KLSAgICBNZW1iZXJJdGVyYXRvciBGaW5kTWVtYmVyKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgbmFtZSkgeyByZXR1cm4gRmluZE1lbWJlcihTdHJpbmdSZWYobmFtZSkpOyB9Ci0gICAgQ29uc3RNZW1iZXJJdGVyYXRvciBGaW5kTWVtYmVyKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgbmFtZSkgY29uc3QgeyByZXR1cm4gRmluZE1lbWJlcihTdHJpbmdSZWYobmFtZSkpOyB9Ci0jZW5kaWYKLQotICAgIC8vISBBZGQgYSBtZW1iZXIgKG5hbWUtdmFsdWUgcGFpcikgdG8gdGhlIG9iamVjdC4KLSAgICAvKiEgXHBhcmFtIG5hbWUgQSBzdHJpbmcgdmFsdWUgYXMgbmFtZSBvZiBtZW1iZXIuCi0gICAgICAgIFxwYXJhbSB2YWx1ZSBWYWx1ZSBvZiBhbnkgdHlwZS4KLSAgICAgICAgXHBhcmFtIGFsbG9jYXRvciAgICBBbGxvY2F0b3IgZm9yIHJlYWxsb2NhdGluZyBtZW1vcnkuIEl0IG11c3QgYmUgdGhlIHNhbWUgb25lIGFzIHVzZWQgYmVmb3JlLiBDb21tb25seSB1c2UgR2VuZXJpY0RvY3VtZW50OjpHZXRBbGxvY2F0b3IoKS4KLSAgICAgICAgXHJldHVybiBUaGUgdmFsdWUgaXRzZWxmIGZvciBmbHVlbnQgQVBJLgotICAgICAgICBcbm90ZSBUaGUgb3duZXJzaGlwIG9mIFxjIG5hbWUgYW5kIFxjIHZhbHVlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gdGhpcyBvYmplY3Qgb24gc3VjY2Vzcy4KLSAgICAgICAgXHByZSAgSXNPYmplY3QoKSAmJiBuYW1lLklzU3RyaW5nKCkKLSAgICAgICAgXHBvc3QgbmFtZS5Jc051bGwoKSAmJiB2YWx1ZS5Jc051bGwoKQotICAgICAgICBcbm90ZSBBbW9ydGl6ZWQgQ29uc3RhbnQgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgR2VuZXJpY1ZhbHVlJiBBZGRNZW1iZXIoR2VuZXJpY1ZhbHVlJiBuYW1lLCBHZW5lcmljVmFsdWUmIHZhbHVlLCBBbGxvY2F0b3ImIGFsbG9jYXRvcikgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKElzT2JqZWN0KCkpOwotICAgICAgICBSQVBJREpTT05fQVNTRVJUKG5hbWUuSXNTdHJpbmcoKSk7Ci0KLSAgICAgICAgT2JqZWN0RGF0YSYgbyA9IGRhdGFfLm87Ci0gICAgICAgIGlmIChvLnNpemUgPj0gby5jYXBhY2l0eSkgewotICAgICAgICAgICAgaWYgKG8uY2FwYWNpdHkgPT0gMCkgewotICAgICAgICAgICAgICAgIG8uY2FwYWNpdHkgPSBrRGVmYXVsdE9iamVjdENhcGFjaXR5OwotICAgICAgICAgICAgICAgIFNldE1lbWJlcnNQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8TWVtYmVyKj4oYWxsb2NhdG9yLk1hbGxvYyhvLmNhcGFjaXR5ICogc2l6ZW9mKE1lbWJlcikpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTaXplVHlwZSBvbGRDYXBhY2l0eSA9IG8uY2FwYWNpdHk7Ci0gICAgICAgICAgICAgICAgby5jYXBhY2l0eSArPSAob2xkQ2FwYWNpdHkgKyAxKSAvIDI7IC8vIGdyb3cgYnkgZmFjdG9yIDEuNQotICAgICAgICAgICAgICAgIFNldE1lbWJlcnNQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8TWVtYmVyKj4oYWxsb2NhdG9yLlJlYWxsb2MoR2V0TWVtYmVyc1BvaW50ZXIoKSwgb2xkQ2FwYWNpdHkgKiBzaXplb2YoTWVtYmVyKSwgby5jYXBhY2l0eSAqIHNpemVvZihNZW1iZXIpKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1lbWJlciogbWVtYmVycyA9IEdldE1lbWJlcnNQb2ludGVyKCk7Ci0gICAgICAgIG1lbWJlcnNbby5zaXplXS5uYW1lLlJhd0Fzc2lnbihuYW1lKTsKLSAgICAgICAgbWVtYmVyc1tvLnNpemVdLnZhbHVlLlJhd0Fzc2lnbih2YWx1ZSk7Ci0gICAgICAgIG8uc2l6ZSsrOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgLy8hIEFkZCBhIGNvbnN0YW50IHN0cmluZyB2YWx1ZSBhcyBtZW1iZXIgKG5hbWUtdmFsdWUgcGFpcikgdG8gdGhlIG9iamVjdC4KLSAgICAvKiEgXHBhcmFtIG5hbWUgQSBzdHJpbmcgdmFsdWUgYXMgbmFtZSBvZiBtZW1iZXIuCi0gICAgICAgIFxwYXJhbSB2YWx1ZSBjb25zdGFudCBzdHJpbmcgcmVmZXJlbmNlIGFzIHZhbHVlIG9mIG1lbWJlci4KLSAgICAgICAgXHBhcmFtIGFsbG9jYXRvciAgICBBbGxvY2F0b3IgZm9yIHJlYWxsb2NhdGluZyBtZW1vcnkuIEl0IG11c3QgYmUgdGhlIHNhbWUgb25lIGFzIHVzZWQgYmVmb3JlLiBDb21tb25seSB1c2UgR2VuZXJpY0RvY3VtZW50OjpHZXRBbGxvY2F0b3IoKS4KLSAgICAgICAgXHJldHVybiBUaGUgdmFsdWUgaXRzZWxmIGZvciBmbHVlbnQgQVBJLgotICAgICAgICBccHJlICBJc09iamVjdCgpCi0gICAgICAgIFxub3RlIFRoaXMgb3ZlcmxvYWQgaXMgbmVlZGVkIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCB0aGUgZ2VuZXJpYyBwcmltaXRpdmUgdHlwZSBBZGRNZW1iZXIoR2VuZXJpY1ZhbHVlJixULEFsbG9jYXRvciYpIG92ZXJsb2FkIGJlbG93LgotICAgICAgICBcbm90ZSBBbW9ydGl6ZWQgQ29uc3RhbnQgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgR2VuZXJpY1ZhbHVlJiBBZGRNZW1iZXIoR2VuZXJpY1ZhbHVlJiBuYW1lLCBTdHJpbmdSZWZUeXBlIHZhbHVlLCBBbGxvY2F0b3ImIGFsbG9jYXRvcikgewotICAgICAgICBHZW5lcmljVmFsdWUgdih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBBZGRNZW1iZXIobmFtZSwgdiwgYWxsb2NhdG9yKTsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIC8vISBBZGQgYSBzdHJpbmcgb2JqZWN0IGFzIG1lbWJlciAobmFtZS12YWx1ZSBwYWlyKSB0byB0aGUgb2JqZWN0LgotICAgIC8qISBccGFyYW0gbmFtZSBBIHN0cmluZyB2YWx1ZSBhcyBuYW1lIG9mIG1lbWJlci4KLSAgICAgICAgXHBhcmFtIHZhbHVlIGNvbnN0YW50IHN0cmluZyByZWZlcmVuY2UgYXMgdmFsdWUgb2YgbWVtYmVyLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yICAgIEFsbG9jYXRvciBmb3IgcmVhbGxvY2F0aW5nIG1lbW9yeS4gSXQgbXVzdCBiZSB0aGUgc2FtZSBvbmUgYXMgdXNlZCBiZWZvcmUuIENvbW1vbmx5IHVzZSBHZW5lcmljRG9jdW1lbnQ6OkdldEFsbG9jYXRvcigpLgotICAgICAgICBccmV0dXJuIFRoZSB2YWx1ZSBpdHNlbGYgZm9yIGZsdWVudCBBUEkuCi0gICAgICAgIFxwcmUgIElzT2JqZWN0KCkKLSAgICAgICAgXG5vdGUgVGhpcyBvdmVybG9hZCBpcyBuZWVkZWQgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIHRoZSBnZW5lcmljIHByaW1pdGl2ZSB0eXBlIEFkZE1lbWJlcihHZW5lcmljVmFsdWUmLFQsQWxsb2NhdG9yJikgb3ZlcmxvYWQgYmVsb3cuCi0gICAgICAgIFxub3RlIEFtb3J0aXplZCBDb25zdGFudCB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICBHZW5lcmljVmFsdWUmIEFkZE1lbWJlcihHZW5lcmljVmFsdWUmIG5hbWUsIHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgdmFsdWUsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSB7Ci0gICAgICAgIEdlbmVyaWNWYWx1ZSB2KHZhbHVlLCBhbGxvY2F0b3IpOwotICAgICAgICByZXR1cm4gQWRkTWVtYmVyKG5hbWUsIHYsIGFsbG9jYXRvcik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyEgQWRkIGFueSBwcmltaXRpdmUgdmFsdWUgYXMgbWVtYmVyIChuYW1lLXZhbHVlIHBhaXIpIHRvIHRoZSBvYmplY3QuCi0gICAgLyohIFx0cGFyYW0gVCBFaXRoZXIgXHJlZiBUeXBlLCBcYyBpbnQsIFxjIHVuc2lnbmVkLCBcYyBpbnQ2NF90LCBcYyB1aW50NjRfdAotICAgICAgICBccGFyYW0gbmFtZSBBIHN0cmluZyB2YWx1ZSBhcyBuYW1lIG9mIG1lbWJlci4KLSAgICAgICAgXHBhcmFtIHZhbHVlIFZhbHVlIG9mIHByaW1pdGl2ZSB0eXBlIFxjIFQgYXMgdmFsdWUgb2YgbWVtYmVyCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIGZvciByZWFsbG9jYXRpbmcgbWVtb3J5LiBDb21tb25seSB1c2UgR2VuZXJpY0RvY3VtZW50OjpHZXRBbGxvY2F0b3IoKS4KLSAgICAgICAgXHJldHVybiBUaGUgdmFsdWUgaXRzZWxmIGZvciBmbHVlbnQgQVBJLgotICAgICAgICBccHJlICBJc09iamVjdCgpCi0KLSAgICAgICAgXG5vdGUgVGhlIHNvdXJjZSB0eXBlIFxjIFQgZXhwbGljaXRseSBkaXNhbGxvd3MgYWxsIHBvaW50ZXIgdHlwZXMsCi0gICAgICAgICAgICBlc3BlY2lhbGx5IChcYyBjb25zdCkgXHJlZiBDaCouICBUaGlzIGhlbHBzIGF2b2lkaW5nIGltcGxpY2l0bHkKLSAgICAgICAgICAgIHJlZmVyZW5jaW5nIGNoYXJhY3RlciBzdHJpbmdzIHdpdGggaW5zdWZmaWNpZW50IGxpZmV0aW1lLCB1c2UKLSAgICAgICAgICAgIFxyZWYgQWRkTWVtYmVyKFN0cmluZ1JlZlR5cGUsIEdlbmVyaWNWYWx1ZSYsIEFsbG9jYXRvciYpIG9yIFxyZWYKLSAgICAgICAgICAgIEFkZE1lbWJlcihTdHJpbmdSZWZUeXBlLCBTdHJpbmdSZWZUeXBlLCBBbGxvY2F0b3ImKS4KLSAgICAgICAgICAgIEFsbCBvdGhlciBwb2ludGVyIHR5cGVzIHdvdWxkIGltcGxpY2l0bHkgY29udmVydCB0byBcYyBib29sLAotICAgICAgICAgICAgdXNlIGFuIGV4cGxpY2l0IGNhc3QgaW5zdGVhZCwgaWYgbmVlZGVkLgotICAgICAgICBcbm90ZSBBbW9ydGl6ZWQgQ29uc3RhbnQgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpPckV4cHI8aW50ZXJuYWw6OklzUG9pbnRlcjxUPiwgaW50ZXJuYWw6OklzR2VuZXJpY1ZhbHVlPFQ+ID4pLCAoR2VuZXJpY1ZhbHVlJikpCi0gICAgQWRkTWVtYmVyKEdlbmVyaWNWYWx1ZSYgbmFtZSwgVCB2YWx1ZSwgQWxsb2NhdG9yJiBhbGxvY2F0b3IpIHsKLSAgICAgICAgR2VuZXJpY1ZhbHVlIHYodmFsdWUpOwotICAgICAgICByZXR1cm4gQWRkTWVtYmVyKG5hbWUsIHYsIGFsbG9jYXRvcik7Ci0gICAgfQotCi0jaWYgUkFQSURKU09OX0hBU19DWFgxMV9SVkFMVUVfUkVGUwotICAgIEdlbmVyaWNWYWx1ZSYgQWRkTWVtYmVyKEdlbmVyaWNWYWx1ZSYmIG5hbWUsIEdlbmVyaWNWYWx1ZSYmIHZhbHVlLCBBbGxvY2F0b3ImIGFsbG9jYXRvcikgewotICAgICAgICByZXR1cm4gQWRkTWVtYmVyKG5hbWUsIHZhbHVlLCBhbGxvY2F0b3IpOwotICAgIH0KLSAgICBHZW5lcmljVmFsdWUmIEFkZE1lbWJlcihHZW5lcmljVmFsdWUmJiBuYW1lLCBHZW5lcmljVmFsdWUmIHZhbHVlLCBBbGxvY2F0b3ImIGFsbG9jYXRvcikgewotICAgICAgICByZXR1cm4gQWRkTWVtYmVyKG5hbWUsIHZhbHVlLCBhbGxvY2F0b3IpOwotICAgIH0KLSAgICBHZW5lcmljVmFsdWUmIEFkZE1lbWJlcihHZW5lcmljVmFsdWUmIG5hbWUsIEdlbmVyaWNWYWx1ZSYmIHZhbHVlLCBBbGxvY2F0b3ImIGFsbG9jYXRvcikgewotICAgICAgICByZXR1cm4gQWRkTWVtYmVyKG5hbWUsIHZhbHVlLCBhbGxvY2F0b3IpOwotICAgIH0KLSAgICBHZW5lcmljVmFsdWUmIEFkZE1lbWJlcihTdHJpbmdSZWZUeXBlIG5hbWUsIEdlbmVyaWNWYWx1ZSYmIHZhbHVlLCBBbGxvY2F0b3ImIGFsbG9jYXRvcikgewotICAgICAgICBHZW5lcmljVmFsdWUgbihuYW1lKTsKLSAgICAgICAgcmV0dXJuIEFkZE1lbWJlcihuLCB2YWx1ZSwgYWxsb2NhdG9yKTsKLSAgICB9Ci0jZW5kaWYgLy8gUkFQSURKU09OX0hBU19DWFgxMV9SVkFMVUVfUkVGUwotCi0KLSAgICAvLyEgQWRkIGEgbWVtYmVyIChuYW1lLXZhbHVlIHBhaXIpIHRvIHRoZSBvYmplY3QuCi0gICAgLyohIFxwYXJhbSBuYW1lIEEgY29uc3RhbnQgc3RyaW5nIHJlZmVyZW5jZSBhcyBuYW1lIG9mIG1lbWJlci4KLSAgICAgICAgXHBhcmFtIHZhbHVlIFZhbHVlIG9mIGFueSB0eXBlLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yICAgIEFsbG9jYXRvciBmb3IgcmVhbGxvY2F0aW5nIG1lbW9yeS4gSXQgbXVzdCBiZSB0aGUgc2FtZSBvbmUgYXMgdXNlZCBiZWZvcmUuIENvbW1vbmx5IHVzZSBHZW5lcmljRG9jdW1lbnQ6OkdldEFsbG9jYXRvcigpLgotICAgICAgICBccmV0dXJuIFRoZSB2YWx1ZSBpdHNlbGYgZm9yIGZsdWVudCBBUEkuCi0gICAgICAgIFxub3RlIFRoZSBvd25lcnNoaXAgb2YgXGMgdmFsdWUgd2lsbCBiZSB0cmFuc2ZlcnJlZCB0byB0aGlzIG9iamVjdCBvbiBzdWNjZXNzLgotICAgICAgICBccHJlICBJc09iamVjdCgpCi0gICAgICAgIFxwb3N0IHZhbHVlLklzTnVsbCgpCi0gICAgICAgIFxub3RlIEFtb3J0aXplZCBDb25zdGFudCB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICBHZW5lcmljVmFsdWUmIEFkZE1lbWJlcihTdHJpbmdSZWZUeXBlIG5hbWUsIEdlbmVyaWNWYWx1ZSYgdmFsdWUsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSB7Ci0gICAgICAgIEdlbmVyaWNWYWx1ZSBuKG5hbWUpOwotICAgICAgICByZXR1cm4gQWRkTWVtYmVyKG4sIHZhbHVlLCBhbGxvY2F0b3IpOwotICAgIH0KLQotICAgIC8vISBBZGQgYSBjb25zdGFudCBzdHJpbmcgdmFsdWUgYXMgbWVtYmVyIChuYW1lLXZhbHVlIHBhaXIpIHRvIHRoZSBvYmplY3QuCi0gICAgLyohIFxwYXJhbSBuYW1lIEEgY29uc3RhbnQgc3RyaW5nIHJlZmVyZW5jZSBhcyBuYW1lIG9mIG1lbWJlci4KLSAgICAgICAgXHBhcmFtIHZhbHVlIGNvbnN0YW50IHN0cmluZyByZWZlcmVuY2UgYXMgdmFsdWUgb2YgbWVtYmVyLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yICAgIEFsbG9jYXRvciBmb3IgcmVhbGxvY2F0aW5nIG1lbW9yeS4gSXQgbXVzdCBiZSB0aGUgc2FtZSBvbmUgYXMgdXNlZCBiZWZvcmUuIENvbW1vbmx5IHVzZSBHZW5lcmljRG9jdW1lbnQ6OkdldEFsbG9jYXRvcigpLgotICAgICAgICBccmV0dXJuIFRoZSB2YWx1ZSBpdHNlbGYgZm9yIGZsdWVudCBBUEkuCi0gICAgICAgIFxwcmUgIElzT2JqZWN0KCkKLSAgICAgICAgXG5vdGUgVGhpcyBvdmVybG9hZCBpcyBuZWVkZWQgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIHRoZSBnZW5lcmljIHByaW1pdGl2ZSB0eXBlIEFkZE1lbWJlcihTdHJpbmdSZWZUeXBlLFQsQWxsb2NhdG9yJikgb3ZlcmxvYWQgYmVsb3cuCi0gICAgICAgIFxub3RlIEFtb3J0aXplZCBDb25zdGFudCB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICBHZW5lcmljVmFsdWUmIEFkZE1lbWJlcihTdHJpbmdSZWZUeXBlIG5hbWUsIFN0cmluZ1JlZlR5cGUgdmFsdWUsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSB7Ci0gICAgICAgIEdlbmVyaWNWYWx1ZSB2KHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIEFkZE1lbWJlcihuYW1lLCB2LCBhbGxvY2F0b3IpOwotICAgIH0KLQotICAgIC8vISBBZGQgYW55IHByaW1pdGl2ZSB2YWx1ZSBhcyBtZW1iZXIgKG5hbWUtdmFsdWUgcGFpcikgdG8gdGhlIG9iamVjdC4KLSAgICAvKiEgXHRwYXJhbSBUIEVpdGhlciBccmVmIFR5cGUsIFxjIGludCwgXGMgdW5zaWduZWQsIFxjIGludDY0X3QsIFxjIHVpbnQ2NF90Ci0gICAgICAgIFxwYXJhbSBuYW1lIEEgY29uc3RhbnQgc3RyaW5nIHJlZmVyZW5jZSBhcyBuYW1lIG9mIG1lbWJlci4KLSAgICAgICAgXHBhcmFtIHZhbHVlIFZhbHVlIG9mIHByaW1pdGl2ZSB0eXBlIFxjIFQgYXMgdmFsdWUgb2YgbWVtYmVyCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIGZvciByZWFsbG9jYXRpbmcgbWVtb3J5LiBDb21tb25seSB1c2UgR2VuZXJpY0RvY3VtZW50OjpHZXRBbGxvY2F0b3IoKS4KLSAgICAgICAgXHJldHVybiBUaGUgdmFsdWUgaXRzZWxmIGZvciBmbHVlbnQgQVBJLgotICAgICAgICBccHJlICBJc09iamVjdCgpCi0KLSAgICAgICAgXG5vdGUgVGhlIHNvdXJjZSB0eXBlIFxjIFQgZXhwbGljaXRseSBkaXNhbGxvd3MgYWxsIHBvaW50ZXIgdHlwZXMsCi0gICAgICAgICAgICBlc3BlY2lhbGx5IChcYyBjb25zdCkgXHJlZiBDaCouICBUaGlzIGhlbHBzIGF2b2lkaW5nIGltcGxpY2l0bHkKLSAgICAgICAgICAgIHJlZmVyZW5jaW5nIGNoYXJhY3RlciBzdHJpbmdzIHdpdGggaW5zdWZmaWNpZW50IGxpZmV0aW1lLCB1c2UKLSAgICAgICAgICAgIFxyZWYgQWRkTWVtYmVyKFN0cmluZ1JlZlR5cGUsIEdlbmVyaWNWYWx1ZSYsIEFsbG9jYXRvciYpIG9yIFxyZWYKLSAgICAgICAgICAgIEFkZE1lbWJlcihTdHJpbmdSZWZUeXBlLCBTdHJpbmdSZWZUeXBlLCBBbGxvY2F0b3ImKS4KLSAgICAgICAgICAgIEFsbCBvdGhlciBwb2ludGVyIHR5cGVzIHdvdWxkIGltcGxpY2l0bHkgY29udmVydCB0byBcYyBib29sLAotICAgICAgICAgICAgdXNlIGFuIGV4cGxpY2l0IGNhc3QgaW5zdGVhZCwgaWYgbmVlZGVkLgotICAgICAgICBcbm90ZSBBbW9ydGl6ZWQgQ29uc3RhbnQgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpPckV4cHI8aW50ZXJuYWw6OklzUG9pbnRlcjxUPiwgaW50ZXJuYWw6OklzR2VuZXJpY1ZhbHVlPFQ+ID4pLCAoR2VuZXJpY1ZhbHVlJikpCi0gICAgQWRkTWVtYmVyKFN0cmluZ1JlZlR5cGUgbmFtZSwgVCB2YWx1ZSwgQWxsb2NhdG9yJiBhbGxvY2F0b3IpIHsKLSAgICAgICAgR2VuZXJpY1ZhbHVlIG4obmFtZSk7Ci0gICAgICAgIHJldHVybiBBZGRNZW1iZXIobiwgdmFsdWUsIGFsbG9jYXRvcik7Ci0gICAgfQotCi0gICAgLy8hIFJlbW92ZSBhbGwgbWVtYmVycyBpbiB0aGUgb2JqZWN0LgotICAgIC8qISBUaGlzIGZ1bmN0aW9uIGRvIG5vdCBkZWFsbG9jYXRlIG1lbW9yeSBpbiB0aGUgb2JqZWN0LCBpLmUuIHRoZSBjYXBhY2l0eSBpcyB1bmNoYW5nZWQuCi0gICAgICAgIFxub3RlIExpbmVhciB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICB2b2lkIFJlbW92ZUFsbE1lbWJlcnMoKSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoSXNPYmplY3QoKSk7IAotICAgICAgICBmb3IgKE1lbWJlckl0ZXJhdG9yIG0gPSBNZW1iZXJCZWdpbigpOyBtICE9IE1lbWJlckVuZCgpOyArK20pCi0gICAgICAgICAgICBtLT5+TWVtYmVyKCk7Ci0gICAgICAgIGRhdGFfLm8uc2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgLy8hIFJlbW92ZSBhIG1lbWJlciBpbiBvYmplY3QgYnkgaXRzIG5hbWUuCi0gICAgLyohIFxwYXJhbSBuYW1lIE5hbWUgb2YgbWVtYmVyIHRvIGJlIHJlbW92ZWQuCi0gICAgICAgIFxyZXR1cm4gV2hldGhlciB0aGUgbWVtYmVyIGV4aXN0ZWQuCi0gICAgICAgIFxub3RlIFRoaXMgZnVuY3Rpb24gbWF5IHJlb3JkZXIgdGhlIG9iamVjdCBtZW1iZXJzLiBVc2UgXHJlZgotICAgICAgICAgICAgRXJhc2VNZW1iZXIoQ29uc3RNZW1iZXJJdGVyYXRvcikgaWYgeW91IG5lZWQgdG8gcHJlc2VydmUgdGhlCi0gICAgICAgICAgICByZWxhdGl2ZSBvcmRlciBvZiB0aGUgcmVtYWluaW5nIG1lbWJlcnMuCi0gICAgICAgIFxub3RlIExpbmVhciB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICBib29sIFJlbW92ZU1lbWJlcihjb25zdCBDaCogbmFtZSkgewotICAgICAgICBHZW5lcmljVmFsdWUgbihTdHJpbmdSZWYobmFtZSkpOwotICAgICAgICByZXR1cm4gUmVtb3ZlTWVtYmVyKG4pOwotICAgIH0KLQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi0gICAgYm9vbCBSZW1vdmVNZW1iZXIoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Q2g+JiBuYW1lKSB7IHJldHVybiBSZW1vdmVNZW1iZXIoR2VuZXJpY1ZhbHVlKFN0cmluZ1JlZihuYW1lKSkpOyB9Ci0jZW5kaWYKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VBbGxvY2F0b3I+Ci0gICAgYm9vbCBSZW1vdmVNZW1iZXIoY29uc3QgR2VuZXJpY1ZhbHVlPEVuY29kaW5nLCBTb3VyY2VBbGxvY2F0b3I+JiBuYW1lKSB7Ci0gICAgICAgIE1lbWJlckl0ZXJhdG9yIG0gPSBGaW5kTWVtYmVyKG5hbWUpOwotICAgICAgICBpZiAobSAhPSBNZW1iZXJFbmQoKSkgewotICAgICAgICAgICAgUmVtb3ZlTWVtYmVyKG0pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vISBSZW1vdmUgYSBtZW1iZXIgaW4gb2JqZWN0IGJ5IGl0ZXJhdG9yLgotICAgIC8qISBccGFyYW0gbSBtZW1iZXIgaXRlcmF0b3IgKG9idGFpbmVkIGJ5IEZpbmRNZW1iZXIoKSBvciBNZW1iZXJCZWdpbigpKS4KLSAgICAgICAgXHJldHVybiB0aGUgbmV3IGl0ZXJhdG9yIGFmdGVyIHJlbW92YWwuCi0gICAgICAgIFxub3RlIFRoaXMgZnVuY3Rpb24gbWF5IHJlb3JkZXIgdGhlIG9iamVjdCBtZW1iZXJzLiBVc2UgXHJlZgotICAgICAgICAgICAgRXJhc2VNZW1iZXIoQ29uc3RNZW1iZXJJdGVyYXRvcikgaWYgeW91IG5lZWQgdG8gcHJlc2VydmUgdGhlCi0gICAgICAgICAgICByZWxhdGl2ZSBvcmRlciBvZiB0aGUgcmVtYWluaW5nIG1lbWJlcnMuCi0gICAgICAgIFxub3RlIENvbnN0YW50IHRpbWUgY29tcGxleGl0eS4KLSAgICAqLwotICAgIE1lbWJlckl0ZXJhdG9yIFJlbW92ZU1lbWJlcihNZW1iZXJJdGVyYXRvciBtKSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoSXNPYmplY3QoKSk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoZGF0YV8uby5zaXplID4gMCk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoR2V0TWVtYmVyc1BvaW50ZXIoKSAhPSAwKTsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChtID49IE1lbWJlckJlZ2luKCkgJiYgbSA8IE1lbWJlckVuZCgpKTsKLQotICAgICAgICBNZW1iZXJJdGVyYXRvciBsYXN0KEdldE1lbWJlcnNQb2ludGVyKCkgKyAoZGF0YV8uby5zaXplIC0gMSkpOwotICAgICAgICBpZiAoZGF0YV8uby5zaXplID4gMSAmJiBtICE9IGxhc3QpCi0gICAgICAgICAgICAqbSA9ICpsYXN0OyAvLyBNb3ZlIHRoZSBsYXN0IG9uZSB0byB0aGlzIHBsYWNlCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG0tPn5NZW1iZXIoKTsgLy8gT25seSBvbmUgbGVmdCwganVzdCBkZXN0cm95Ci0gICAgICAgIC0tZGF0YV8uby5zaXplOwotICAgICAgICByZXR1cm4gbTsKLSAgICB9Ci0KLSAgICAvLyEgUmVtb3ZlIGEgbWVtYmVyIGZyb20gYW4gb2JqZWN0IGJ5IGl0ZXJhdG9yLgotICAgIC8qISBccGFyYW0gcG9zIGl0ZXJhdG9yIHRvIHRoZSBtZW1iZXIgdG8gcmVtb3ZlCi0gICAgICAgIFxwcmUgSXNPYmplY3QoKSA9PSB0cnVlICYmIFxyZWYgTWVtYmVyQmVnaW4oKSA8PSBcYyBwb3MgPCBccmVmIE1lbWJlckVuZCgpCi0gICAgICAgIFxyZXR1cm4gSXRlcmF0b3IgZm9sbG93aW5nIHRoZSByZW1vdmVkIGVsZW1lbnQuCi0gICAgICAgICAgICBJZiB0aGUgaXRlcmF0b3IgXGMgcG9zIHJlZmVycyB0byB0aGUgbGFzdCBlbGVtZW50LCB0aGUgXHJlZiBNZW1iZXJFbmQoKSBpdGVyYXRvciBpcyByZXR1cm5lZC4KLSAgICAgICAgXG5vdGUgVGhpcyBmdW5jdGlvbiBwcmVzZXJ2ZXMgdGhlIHJlbGF0aXZlIG9yZGVyIG9mIHRoZSByZW1haW5pbmcgb2JqZWN0Ci0gICAgICAgICAgICBtZW1iZXJzLiBJZiB5b3UgZG8gbm90IG5lZWQgdGhpcywgdXNlIHRoZSBtb3JlIGVmZmljaWVudCBccmVmIFJlbW92ZU1lbWJlcihNZW1iZXJJdGVyYXRvcikuCi0gICAgICAgIFxub3RlIExpbmVhciB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICBNZW1iZXJJdGVyYXRvciBFcmFzZU1lbWJlcihDb25zdE1lbWJlckl0ZXJhdG9yIHBvcykgewotICAgICAgICByZXR1cm4gRXJhc2VNZW1iZXIocG9zLCBwb3MgKzEpOwotICAgIH0KLQotICAgIC8vISBSZW1vdmUgbWVtYmVycyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LCBsYXN0KSBmcm9tIGFuIG9iamVjdC4KLSAgICAvKiEgXHBhcmFtIGZpcnN0IGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBtZW1iZXIgdG8gcmVtb3ZlCi0gICAgICAgIFxwYXJhbSBsYXN0ICBpdGVyYXRvciBmb2xsb3dpbmcgdGhlIGxhc3QgbWVtYmVyIHRvIHJlbW92ZQotICAgICAgICBccHJlIElzT2JqZWN0KCkgPT0gdHJ1ZSAmJiBccmVmIE1lbWJlckJlZ2luKCkgPD0gXGMgZmlyc3QgPD0gXGMgbGFzdCA8PSBccmVmIE1lbWJlckVuZCgpCi0gICAgICAgIFxyZXR1cm4gSXRlcmF0b3IgZm9sbG93aW5nIHRoZSBsYXN0IHJlbW92ZWQgZWxlbWVudC4KLSAgICAgICAgXG5vdGUgVGhpcyBmdW5jdGlvbiBwcmVzZXJ2ZXMgdGhlIHJlbGF0aXZlIG9yZGVyIG9mIHRoZSByZW1haW5pbmcgb2JqZWN0Ci0gICAgICAgICAgICBtZW1iZXJzLgotICAgICAgICBcbm90ZSBMaW5lYXIgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgTWVtYmVySXRlcmF0b3IgRXJhc2VNZW1iZXIoQ29uc3RNZW1iZXJJdGVyYXRvciBmaXJzdCwgQ29uc3RNZW1iZXJJdGVyYXRvciBsYXN0KSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoSXNPYmplY3QoKSk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoZGF0YV8uby5zaXplID4gMCk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoR2V0TWVtYmVyc1BvaW50ZXIoKSAhPSAwKTsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChmaXJzdCA+PSBNZW1iZXJCZWdpbigpKTsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChmaXJzdCA8PSBsYXN0KTsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChsYXN0IDw9IE1lbWJlckVuZCgpKTsKLQotICAgICAgICBNZW1iZXJJdGVyYXRvciBwb3MgPSBNZW1iZXJCZWdpbigpICsgKGZpcnN0IC0gTWVtYmVyQmVnaW4oKSk7Ci0gICAgICAgIGZvciAoTWVtYmVySXRlcmF0b3IgaXRyID0gcG9zOyBpdHIgIT0gbGFzdDsgKytpdHIpCi0gICAgICAgICAgICBpdHItPn5NZW1iZXIoKTsKLSAgICAgICAgc3RkOjptZW1tb3ZlKCYqcG9zLCAmKmxhc3QsIHN0YXRpY19jYXN0PHNpemVfdD4oTWVtYmVyRW5kKCkgLSBsYXN0KSAqIHNpemVvZihNZW1iZXIpKTsKLSAgICAgICAgZGF0YV8uby5zaXplIC09IHN0YXRpY19jYXN0PFNpemVUeXBlPihsYXN0IC0gZmlyc3QpOwotICAgICAgICByZXR1cm4gcG9zOwotICAgIH0KLQotICAgIC8vISBFcmFzZSBhIG1lbWJlciBpbiBvYmplY3QgYnkgaXRzIG5hbWUuCi0gICAgLyohIFxwYXJhbSBuYW1lIE5hbWUgb2YgbWVtYmVyIHRvIGJlIHJlbW92ZWQuCi0gICAgICAgIFxyZXR1cm4gV2hldGhlciB0aGUgbWVtYmVyIGV4aXN0ZWQuCi0gICAgICAgIFxub3RlIExpbmVhciB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICBib29sIEVyYXNlTWVtYmVyKGNvbnN0IENoKiBuYW1lKSB7Ci0gICAgICAgIEdlbmVyaWNWYWx1ZSBuKFN0cmluZ1JlZihuYW1lKSk7Ci0gICAgICAgIHJldHVybiBFcmFzZU1lbWJlcihuKTsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIGJvb2wgRXJhc2VNZW1iZXIoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Q2g+JiBuYW1lKSB7IHJldHVybiBFcmFzZU1lbWJlcihHZW5lcmljVmFsdWUoU3RyaW5nUmVmKG5hbWUpKSk7IH0KLSNlbmRpZgotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZUFsbG9jYXRvcj4KLSAgICBib29sIEVyYXNlTWVtYmVyKGNvbnN0IEdlbmVyaWNWYWx1ZTxFbmNvZGluZywgU291cmNlQWxsb2NhdG9yPiYgbmFtZSkgewotICAgICAgICBNZW1iZXJJdGVyYXRvciBtID0gRmluZE1lbWJlcihuYW1lKTsKLSAgICAgICAgaWYgKG0gIT0gTWVtYmVyRW5kKCkpIHsKLSAgICAgICAgICAgIEVyYXNlTWVtYmVyKG0pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIE9iamVjdCBHZXRPYmplY3QoKSB7IFJBUElESlNPTl9BU1NFUlQoSXNPYmplY3QoKSk7IHJldHVybiBPYmplY3QoKnRoaXMpOyB9Ci0gICAgQ29uc3RPYmplY3QgR2V0T2JqZWN0KCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKElzT2JqZWN0KCkpOyByZXR1cm4gQ29uc3RPYmplY3QoKnRoaXMpOyB9Ci0KLSAgICAvL0B9Ci0KLSAgICAvLyFAbmFtZSBBcnJheQotICAgIC8vQHsKLQotICAgIC8vISBTZXQgdGhpcyB2YWx1ZSBhcyBhbiBlbXB0eSBhcnJheS4KLSAgICAvKiEgXHBvc3QgSXNBcnJheSA9PSB0cnVlICovCi0gICAgR2VuZXJpY1ZhbHVlJiBTZXRBcnJheSgpIHsgdGhpcy0+fkdlbmVyaWNWYWx1ZSgpOyBuZXcgKHRoaXMpIEdlbmVyaWNWYWx1ZShrQXJyYXlUeXBlKTsgcmV0dXJuICp0aGlzOyB9Ci0KLSAgICAvLyEgR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYXJyYXkuCi0gICAgU2l6ZVR5cGUgU2l6ZSgpIGNvbnN0IHsgUkFQSURKU09OX0FTU0VSVChJc0FycmF5KCkpOyByZXR1cm4gZGF0YV8uYS5zaXplOyB9Ci0KLSAgICAvLyEgR2V0IHRoZSBjYXBhY2l0eSBvZiBhcnJheS4KLSAgICBTaXplVHlwZSBDYXBhY2l0eSgpIGNvbnN0IHsgUkFQSURKU09OX0FTU0VSVChJc0FycmF5KCkpOyByZXR1cm4gZGF0YV8uYS5jYXBhY2l0eTsgfQotCi0gICAgLy8hIENoZWNrIHdoZXRoZXIgdGhlIGFycmF5IGlzIGVtcHR5LgotICAgIGJvb2wgRW1wdHkoKSBjb25zdCB7IFJBUElESlNPTl9BU1NFUlQoSXNBcnJheSgpKTsgcmV0dXJuIGRhdGFfLmEuc2l6ZSA9PSAwOyB9Ci0KLSAgICAvLyEgUmVtb3ZlIGFsbCBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCi0gICAgLyohIFRoaXMgZnVuY3Rpb24gZG8gbm90IGRlYWxsb2NhdGUgbWVtb3J5IGluIHRoZSBhcnJheSwgaS5lLiB0aGUgY2FwYWNpdHkgaXMgdW5jaGFuZ2VkLgotICAgICAgICBcbm90ZSBMaW5lYXIgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgdm9pZCBDbGVhcigpIHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChJc0FycmF5KCkpOyAKLSAgICAgICAgR2VuZXJpY1ZhbHVlKiBlID0gR2V0RWxlbWVudHNQb2ludGVyKCk7Ci0gICAgICAgIGZvciAoR2VuZXJpY1ZhbHVlKiB2ID0gZTsgdiAhPSBlICsgZGF0YV8uYS5zaXplOyArK3YpCi0gICAgICAgICAgICB2LT5+R2VuZXJpY1ZhbHVlKCk7Ci0gICAgICAgIGRhdGFfLmEuc2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgLy8hIEdldCBhbiBlbGVtZW50IGZyb20gYXJyYXkgYnkgaW5kZXguCi0gICAgLyohIFxwcmUgSXNBcnJheSgpID09IHRydWUKLSAgICAgICAgXHBhcmFtIGluZGV4IFplcm8tYmFzZWQgaW5kZXggb2YgZWxlbWVudC4KLSAgICAgICAgXHNlZSBvcGVyYXRvcltdKFQqKQotICAgICovCi0gICAgR2VuZXJpY1ZhbHVlJiBvcGVyYXRvcltdKFNpemVUeXBlIGluZGV4KSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoSXNBcnJheSgpKTsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChpbmRleCA8IGRhdGFfLmEuc2l6ZSk7Ci0gICAgICAgIHJldHVybiBHZXRFbGVtZW50c1BvaW50ZXIoKVtpbmRleF07Ci0gICAgfQotICAgIGNvbnN0IEdlbmVyaWNWYWx1ZSYgb3BlcmF0b3JbXShTaXplVHlwZSBpbmRleCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxHZW5lcmljVmFsdWUmPigqdGhpcylbaW5kZXhdOyB9Ci0KLSAgICAvLyEgRWxlbWVudCBpdGVyYXRvcgotICAgIC8qISBccHJlIElzQXJyYXkoKSA9PSB0cnVlICovCi0gICAgVmFsdWVJdGVyYXRvciBCZWdpbigpIHsgUkFQSURKU09OX0FTU0VSVChJc0FycmF5KCkpOyByZXR1cm4gR2V0RWxlbWVudHNQb2ludGVyKCk7IH0KLSAgICAvLyEgXGVtIFBhc3QtdGhlLWVuZCBlbGVtZW50IGl0ZXJhdG9yCi0gICAgLyohIFxwcmUgSXNBcnJheSgpID09IHRydWUgKi8KLSAgICBWYWx1ZUl0ZXJhdG9yIEVuZCgpIHsgUkFQSURKU09OX0FTU0VSVChJc0FycmF5KCkpOyByZXR1cm4gR2V0RWxlbWVudHNQb2ludGVyKCkgKyBkYXRhXy5hLnNpemU7IH0KLSAgICAvLyEgQ29uc3RhbnQgZWxlbWVudCBpdGVyYXRvcgotICAgIC8qISBccHJlIElzQXJyYXkoKSA9PSB0cnVlICovCi0gICAgQ29uc3RWYWx1ZUl0ZXJhdG9yIEJlZ2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxHZW5lcmljVmFsdWUmPigqdGhpcykuQmVnaW4oKTsgfQotICAgIC8vISBDb25zdGFudCBcZW0gcGFzdC10aGUtZW5kIGVsZW1lbnQgaXRlcmF0b3IKLSAgICAvKiEgXHByZSBJc0FycmF5KCkgPT0gdHJ1ZSAqLwotICAgIENvbnN0VmFsdWVJdGVyYXRvciBFbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PEdlbmVyaWNWYWx1ZSY+KCp0aGlzKS5FbmQoKTsgfQotCi0gICAgLy8hIFJlcXVlc3QgdGhlIGFycmF5IHRvIGhhdmUgZW5vdWdoIGNhcGFjaXR5IHRvIHN0b3JlIGVsZW1lbnRzLgotICAgIC8qISBccGFyYW0gbmV3Q2FwYWNpdHkgIFRoZSBjYXBhY2l0eSB0aGF0IHRoZSBhcnJheSBhdCBsZWFzdCBuZWVkIHRvIGhhdmUuCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgICAgQWxsb2NhdG9yIGZvciByZWFsbG9jYXRpbmcgbWVtb3J5LiBJdCBtdXN0IGJlIHRoZSBzYW1lIG9uZSBhcyB1c2VkIGJlZm9yZS4gQ29tbW9ubHkgdXNlIEdlbmVyaWNEb2N1bWVudDo6R2V0QWxsb2NhdG9yKCkuCi0gICAgICAgIFxyZXR1cm4gVGhlIHZhbHVlIGl0c2VsZiBmb3IgZmx1ZW50IEFQSS4KLSAgICAgICAgXG5vdGUgTGluZWFyIHRpbWUgY29tcGxleGl0eS4KLSAgICAqLwotICAgIEdlbmVyaWNWYWx1ZSYgUmVzZXJ2ZShTaXplVHlwZSBuZXdDYXBhY2l0eSwgQWxsb2NhdG9yICZhbGxvY2F0b3IpIHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChJc0FycmF5KCkpOwotICAgICAgICBpZiAobmV3Q2FwYWNpdHkgPiBkYXRhXy5hLmNhcGFjaXR5KSB7Ci0gICAgICAgICAgICBTZXRFbGVtZW50c1BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDxHZW5lcmljVmFsdWUqPihhbGxvY2F0b3IuUmVhbGxvYyhHZXRFbGVtZW50c1BvaW50ZXIoKSwgZGF0YV8uYS5jYXBhY2l0eSAqIHNpemVvZihHZW5lcmljVmFsdWUpLCBuZXdDYXBhY2l0eSAqIHNpemVvZihHZW5lcmljVmFsdWUpKSkpOwotICAgICAgICAgICAgZGF0YV8uYS5jYXBhY2l0eSA9IG5ld0NhcGFjaXR5OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvLyEgQXBwZW5kIGEgR2VuZXJpY1ZhbHVlIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgotICAgIC8qISBccGFyYW0gdmFsdWUgICAgICAgIFZhbHVlIHRvIGJlIGFwcGVuZGVkLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yICAgIEFsbG9jYXRvciBmb3IgcmVhbGxvY2F0aW5nIG1lbW9yeS4gSXQgbXVzdCBiZSB0aGUgc2FtZSBvbmUgYXMgdXNlZCBiZWZvcmUuIENvbW1vbmx5IHVzZSBHZW5lcmljRG9jdW1lbnQ6OkdldEFsbG9jYXRvcigpLgotICAgICAgICBccHJlIElzQXJyYXkoKSA9PSB0cnVlCi0gICAgICAgIFxwb3N0IHZhbHVlLklzTnVsbCgpID09IHRydWUKLSAgICAgICAgXHJldHVybiBUaGUgdmFsdWUgaXRzZWxmIGZvciBmbHVlbnQgQVBJLgotICAgICAgICBcbm90ZSBUaGUgb3duZXJzaGlwIG9mIFxjIHZhbHVlIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gdGhpcyBhcnJheSBvbiBzdWNjZXNzLgotICAgICAgICBcbm90ZSBJZiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGFwcGVuZGVkIGlzIGtub3duLCBjYWxscyBSZXNlcnZlKCkgb25jZSBmaXJzdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQuCi0gICAgICAgIFxub3RlIEFtb3J0aXplZCBjb25zdGFudCB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICBHZW5lcmljVmFsdWUmIFB1c2hCYWNrKEdlbmVyaWNWYWx1ZSYgdmFsdWUsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoSXNBcnJheSgpKTsKLSAgICAgICAgaWYgKGRhdGFfLmEuc2l6ZSA+PSBkYXRhXy5hLmNhcGFjaXR5KQotICAgICAgICAgICAgUmVzZXJ2ZShkYXRhXy5hLmNhcGFjaXR5ID09IDAgPyBrRGVmYXVsdEFycmF5Q2FwYWNpdHkgOiAoZGF0YV8uYS5jYXBhY2l0eSArIChkYXRhXy5hLmNhcGFjaXR5ICsgMSkgLyAyKSwgYWxsb2NhdG9yKTsKLSAgICAgICAgR2V0RWxlbWVudHNQb2ludGVyKClbZGF0YV8uYS5zaXplKytdLlJhd0Fzc2lnbih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0gICAgR2VuZXJpY1ZhbHVlJiBQdXNoQmFjayhHZW5lcmljVmFsdWUmJiB2YWx1ZSwgQWxsb2NhdG9yJiBhbGxvY2F0b3IpIHsKLSAgICAgICAgcmV0dXJuIFB1c2hCYWNrKHZhbHVlLCBhbGxvY2F0b3IpOwotICAgIH0KLSNlbmRpZiAvLyBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0KLSAgICAvLyEgQXBwZW5kIGEgY29uc3RhbnQgc3RyaW5nIHJlZmVyZW5jZSBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4KLSAgICAvKiEgXHBhcmFtIHZhbHVlICAgICAgICBDb25zdGFudCBzdHJpbmcgcmVmZXJlbmNlIHRvIGJlIGFwcGVuZGVkLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yICAgIEFsbG9jYXRvciBmb3IgcmVhbGxvY2F0aW5nIG1lbW9yeS4gSXQgbXVzdCBiZSB0aGUgc2FtZSBvbmUgdXNlZCBwcmV2aW91c2x5LiBDb21tb25seSB1c2UgR2VuZXJpY0RvY3VtZW50OjpHZXRBbGxvY2F0b3IoKS4KLSAgICAgICAgXHByZSBJc0FycmF5KCkgPT0gdHJ1ZQotICAgICAgICBccmV0dXJuIFRoZSB2YWx1ZSBpdHNlbGYgZm9yIGZsdWVudCBBUEkuCi0gICAgICAgIFxub3RlIElmIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgYXBwZW5kZWQgaXMga25vd24sIGNhbGxzIFJlc2VydmUoKSBvbmNlIGZpcnN0IG1heSBiZSBtb3JlIGVmZmljaWVudC4KLSAgICAgICAgXG5vdGUgQW1vcnRpemVkIGNvbnN0YW50IHRpbWUgY29tcGxleGl0eS4KLSAgICAgICAgXHNlZSBHZW5lcmljU3RyaW5nUmVmCi0gICAgKi8KLSAgICBHZW5lcmljVmFsdWUmIFB1c2hCYWNrKFN0cmluZ1JlZlR5cGUgdmFsdWUsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSB7Ci0gICAgICAgIHJldHVybiAoKnRoaXMpLnRlbXBsYXRlIFB1c2hCYWNrPFN0cmluZ1JlZlR5cGU+KHZhbHVlLCBhbGxvY2F0b3IpOwotICAgIH0KLQotICAgIC8vISBBcHBlbmQgYSBwcmltaXRpdmUgdmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCi0gICAgLyohIFx0cGFyYW0gVCBFaXRoZXIgXHJlZiBUeXBlLCBcYyBpbnQsIFxjIHVuc2lnbmVkLCBcYyBpbnQ2NF90LCBcYyB1aW50NjRfdAotICAgICAgICBccGFyYW0gdmFsdWUgVmFsdWUgb2YgcHJpbWl0aXZlIHR5cGUgVCB0byBiZSBhcHBlbmRlZC4KLSAgICAgICAgXHBhcmFtIGFsbG9jYXRvciAgICBBbGxvY2F0b3IgZm9yIHJlYWxsb2NhdGluZyBtZW1vcnkuIEl0IG11c3QgYmUgdGhlIHNhbWUgb25lIGFzIHVzZWQgYmVmb3JlLiBDb21tb25seSB1c2UgR2VuZXJpY0RvY3VtZW50OjpHZXRBbGxvY2F0b3IoKS4KLSAgICAgICAgXHByZSBJc0FycmF5KCkgPT0gdHJ1ZQotICAgICAgICBccmV0dXJuIFRoZSB2YWx1ZSBpdHNlbGYgZm9yIGZsdWVudCBBUEkuCi0gICAgICAgIFxub3RlIElmIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgYXBwZW5kZWQgaXMga25vd24sIGNhbGxzIFJlc2VydmUoKSBvbmNlIGZpcnN0IG1heSBiZSBtb3JlIGVmZmljaWVudC4KLQotICAgICAgICBcbm90ZSBUaGUgc291cmNlIHR5cGUgXGMgVCBleHBsaWNpdGx5IGRpc2FsbG93cyBhbGwgcG9pbnRlciB0eXBlcywKLSAgICAgICAgICAgIGVzcGVjaWFsbHkgKFxjIGNvbnN0KSBccmVmIENoKi4gIFRoaXMgaGVscHMgYXZvaWRpbmcgaW1wbGljaXRseQotICAgICAgICAgICAgcmVmZXJlbmNpbmcgY2hhcmFjdGVyIHN0cmluZ3Mgd2l0aCBpbnN1ZmZpY2llbnQgbGlmZXRpbWUsIHVzZQotICAgICAgICAgICAgXHJlZiBQdXNoQmFjayhHZW5lcmljVmFsdWUmLCBBbGxvY2F0b3ImKSBvciBccmVmCi0gICAgICAgICAgICBQdXNoQmFjayhTdHJpbmdSZWZUeXBlLCBBbGxvY2F0b3ImKS4KLSAgICAgICAgICAgIEFsbCBvdGhlciBwb2ludGVyIHR5cGVzIHdvdWxkIGltcGxpY2l0bHkgY29udmVydCB0byBcYyBib29sLAotICAgICAgICAgICAgdXNlIGFuIGV4cGxpY2l0IGNhc3QgaW5zdGVhZCwgaWYgbmVlZGVkLgotICAgICAgICBcbm90ZSBBbW9ydGl6ZWQgY29uc3RhbnQgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpPckV4cHI8aW50ZXJuYWw6OklzUG9pbnRlcjxUPiwgaW50ZXJuYWw6OklzR2VuZXJpY1ZhbHVlPFQ+ID4pLCAoR2VuZXJpY1ZhbHVlJikpCi0gICAgUHVzaEJhY2soVCB2YWx1ZSwgQWxsb2NhdG9yJiBhbGxvY2F0b3IpIHsKLSAgICAgICAgR2VuZXJpY1ZhbHVlIHYodmFsdWUpOwotICAgICAgICByZXR1cm4gUHVzaEJhY2sodiwgYWxsb2NhdG9yKTsKLSAgICB9Ci0KLSAgICAvLyEgUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgotICAgIC8qIQotICAgICAgICBcbm90ZSBDb25zdGFudCB0aW1lIGNvbXBsZXhpdHkuCi0gICAgKi8KLSAgICBHZW5lcmljVmFsdWUmIFBvcEJhY2soKSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoSXNBcnJheSgpKTsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVCghRW1wdHkoKSk7Ci0gICAgICAgIEdldEVsZW1lbnRzUG9pbnRlcigpWy0tZGF0YV8uYS5zaXplXS5+R2VuZXJpY1ZhbHVlKCk7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvLyEgUmVtb3ZlIGFuIGVsZW1lbnQgb2YgYXJyYXkgYnkgaXRlcmF0b3IuCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBwb3MgaXRlcmF0b3IgdG8gdGhlIGVsZW1lbnQgdG8gcmVtb3ZlCi0gICAgICAgIFxwcmUgSXNBcnJheSgpID09IHRydWUgJiYgXHJlZiBCZWdpbigpIDw9IFxjIHBvcyA8IFxyZWYgRW5kKCkKLSAgICAgICAgXHJldHVybiBJdGVyYXRvciBmb2xsb3dpbmcgdGhlIHJlbW92ZWQgZWxlbWVudC4gSWYgdGhlIGl0ZXJhdG9yIHBvcyByZWZlcnMgdG8gdGhlIGxhc3QgZWxlbWVudCwgdGhlIEVuZCgpIGl0ZXJhdG9yIGlzIHJldHVybmVkLgotICAgICAgICBcbm90ZSBMaW5lYXIgdGltZSBjb21wbGV4aXR5LgotICAgICovCi0gICAgVmFsdWVJdGVyYXRvciBFcmFzZShDb25zdFZhbHVlSXRlcmF0b3IgcG9zKSB7Ci0gICAgICAgIHJldHVybiBFcmFzZShwb3MsIHBvcyArIDEpOwotICAgIH0KLQotICAgIC8vISBSZW1vdmUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIFtmaXJzdCwgbGFzdCkgb2YgdGhlIGFycmF5LgotICAgIC8qIQotICAgICAgICBccGFyYW0gZmlyc3QgaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQgdG8gcmVtb3ZlCi0gICAgICAgIFxwYXJhbSBsYXN0ICBpdGVyYXRvciBmb2xsb3dpbmcgdGhlIGxhc3QgZWxlbWVudCB0byByZW1vdmUKLSAgICAgICAgXHByZSBJc0FycmF5KCkgPT0gdHJ1ZSAmJiBccmVmIEJlZ2luKCkgPD0gXGMgZmlyc3QgPD0gXGMgbGFzdCA8PSBccmVmIEVuZCgpCi0gICAgICAgIFxyZXR1cm4gSXRlcmF0b3IgZm9sbG93aW5nIHRoZSBsYXN0IHJlbW92ZWQgZWxlbWVudC4KLSAgICAgICAgXG5vdGUgTGluZWFyIHRpbWUgY29tcGxleGl0eS4KLSAgICAqLwotICAgIFZhbHVlSXRlcmF0b3IgRXJhc2UoQ29uc3RWYWx1ZUl0ZXJhdG9yIGZpcnN0LCBDb25zdFZhbHVlSXRlcmF0b3IgbGFzdCkgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKElzQXJyYXkoKSk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoZGF0YV8uYS5zaXplID4gMCk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoR2V0RWxlbWVudHNQb2ludGVyKCkgIT0gMCk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoZmlyc3QgPj0gQmVnaW4oKSk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoZmlyc3QgPD0gbGFzdCk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQobGFzdCA8PSBFbmQoKSk7Ci0gICAgICAgIFZhbHVlSXRlcmF0b3IgcG9zID0gQmVnaW4oKSArIChmaXJzdCAtIEJlZ2luKCkpOwotICAgICAgICBmb3IgKFZhbHVlSXRlcmF0b3IgaXRyID0gcG9zOyBpdHIgIT0gbGFzdDsgKytpdHIpCi0gICAgICAgICAgICBpdHItPn5HZW5lcmljVmFsdWUoKTsgICAgICAgCi0gICAgICAgIHN0ZDo6bWVtbW92ZShwb3MsIGxhc3QsIHN0YXRpY19jYXN0PHNpemVfdD4oRW5kKCkgLSBsYXN0KSAqIHNpemVvZihHZW5lcmljVmFsdWUpKTsKLSAgICAgICAgZGF0YV8uYS5zaXplIC09IHN0YXRpY19jYXN0PFNpemVUeXBlPihsYXN0IC0gZmlyc3QpOwotICAgICAgICByZXR1cm4gcG9zOwotICAgIH0KLQotICAgIEFycmF5IEdldEFycmF5KCkgeyBSQVBJREpTT05fQVNTRVJUKElzQXJyYXkoKSk7IHJldHVybiBBcnJheSgqdGhpcyk7IH0KLSAgICBDb25zdEFycmF5IEdldEFycmF5KCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKElzQXJyYXkoKSk7IHJldHVybiBDb25zdEFycmF5KCp0aGlzKTsgfQotCi0gICAgLy9AfQotCi0gICAgLy8hQG5hbWUgTnVtYmVyCi0gICAgLy9AewotCi0gICAgaW50IEdldEludCgpIGNvbnN0ICAgICAgICAgIHsgUkFQSURKU09OX0FTU0VSVChkYXRhXy5mLmZsYWdzICYga0ludEZsYWcpOyAgIHJldHVybiBkYXRhXy5uLmkuaTsgICB9Ci0gICAgdW5zaWduZWQgR2V0VWludCgpIGNvbnN0ICAgIHsgUkFQSURKU09OX0FTU0VSVChkYXRhXy5mLmZsYWdzICYga1VpbnRGbGFnKTsgIHJldHVybiBkYXRhXy5uLnUudTsgICB9Ci0gICAgaW50NjRfdCBHZXRJbnQ2NCgpIGNvbnN0ICAgIHsgUkFQSURKU09OX0FTU0VSVChkYXRhXy5mLmZsYWdzICYga0ludDY0RmxhZyk7IHJldHVybiBkYXRhXy5uLmk2NDsgfQotICAgIHVpbnQ2NF90IEdldFVpbnQ2NCgpIGNvbnN0ICB7IFJBUElESlNPTl9BU1NFUlQoZGF0YV8uZi5mbGFncyAmIGtVaW50NjRGbGFnKTsgcmV0dXJuIGRhdGFfLm4udTY0OyB9Ci0KLSAgICAvLyEgR2V0IHRoZSB2YWx1ZSBhcyBkb3VibGUgdHlwZS4KLSAgICAvKiEgXG5vdGUgSWYgdGhlIHZhbHVlIGlzIDY0LWJpdCBpbnRlZ2VyIHR5cGUsIGl0IG1heSBsb3NlIHByZWNpc2lvbi4gVXNlIFxjIElzTG9zc2xlc3NEb3VibGUoKSB0byBjaGVjayB3aGV0aGVyIHRoZSBjb252ZXJpc29uIGlzIGxvc3NsZXNzLgotICAgICovCi0gICAgZG91YmxlIEdldERvdWJsZSgpIGNvbnN0IHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChJc051bWJlcigpKTsKLSAgICAgICAgaWYgKChkYXRhXy5mLmZsYWdzICYga0RvdWJsZUZsYWcpICE9IDApICAgICAgICAgICAgICAgIHJldHVybiBkYXRhXy5uLmQ7ICAgLy8gZXhhY3QgdHlwZSwgbm8gY29udmVyc2lvbi4KLSAgICAgICAgaWYgKChkYXRhXy5mLmZsYWdzICYga0ludEZsYWcpICE9IDApICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhXy5uLmkuaTsgLy8gaW50IC0+IGRvdWJsZQotICAgICAgICBpZiAoKGRhdGFfLmYuZmxhZ3MgJiBrVWludEZsYWcpICE9IDApICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFfLm4udS51OyAvLyB1bnNpZ25lZCAtPiBkb3VibGUKLSAgICAgICAgaWYgKChkYXRhXy5mLmZsYWdzICYga0ludDY0RmxhZykgIT0gMCkgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGRhdGFfLm4uaTY0KTsgLy8gaW50NjRfdCAtPiBkb3VibGUgKG1heSBsb3NlIHByZWNpc2lvbikKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVCgoZGF0YV8uZi5mbGFncyAmIGtVaW50NjRGbGFnKSAhPSAwKTsgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KGRhdGFfLm4udTY0KTsgLy8gdWludDY0X3QgLT4gZG91YmxlIChtYXkgbG9zZSBwcmVjaXNpb24pCi0gICAgfQotCi0gICAgLy8hIEdldCB0aGUgdmFsdWUgYXMgZmxvYXQgdHlwZS4KLSAgICAvKiEgXG5vdGUgSWYgdGhlIHZhbHVlIGlzIDY0LWJpdCBpbnRlZ2VyIHR5cGUsIGl0IG1heSBsb3NlIHByZWNpc2lvbi4gVXNlIFxjIElzTG9zc2xlc3NGbG9hdCgpIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNvbnZlcmlzb24gaXMgbG9zc2xlc3MuCi0gICAgKi8KLSAgICBmbG9hdCBHZXRGbG9hdCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihHZXREb3VibGUoKSk7Ci0gICAgfQotCi0gICAgR2VuZXJpY1ZhbHVlJiBTZXRJbnQoaW50IGkpICAgICAgICAgICAgIHsgdGhpcy0+fkdlbmVyaWNWYWx1ZSgpOyBuZXcgKHRoaXMpIEdlbmVyaWNWYWx1ZShpKTsgICAgcmV0dXJuICp0aGlzOyB9Ci0gICAgR2VuZXJpY1ZhbHVlJiBTZXRVaW50KHVuc2lnbmVkIHUpICAgICAgIHsgdGhpcy0+fkdlbmVyaWNWYWx1ZSgpOyBuZXcgKHRoaXMpIEdlbmVyaWNWYWx1ZSh1KTsgICAgcmV0dXJuICp0aGlzOyB9Ci0gICAgR2VuZXJpY1ZhbHVlJiBTZXRJbnQ2NChpbnQ2NF90IGk2NCkgICAgIHsgdGhpcy0+fkdlbmVyaWNWYWx1ZSgpOyBuZXcgKHRoaXMpIEdlbmVyaWNWYWx1ZShpNjQpOyAgcmV0dXJuICp0aGlzOyB9Ci0gICAgR2VuZXJpY1ZhbHVlJiBTZXRVaW50NjQodWludDY0X3QgdTY0KSAgIHsgdGhpcy0+fkdlbmVyaWNWYWx1ZSgpOyBuZXcgKHRoaXMpIEdlbmVyaWNWYWx1ZSh1NjQpOyAgcmV0dXJuICp0aGlzOyB9Ci0gICAgR2VuZXJpY1ZhbHVlJiBTZXREb3VibGUoZG91YmxlIGQpICAgICAgIHsgdGhpcy0+fkdlbmVyaWNWYWx1ZSgpOyBuZXcgKHRoaXMpIEdlbmVyaWNWYWx1ZShkKTsgICAgcmV0dXJuICp0aGlzOyB9Ci0gICAgR2VuZXJpY1ZhbHVlJiBTZXRGbG9hdChmbG9hdCBmKSAgICAgICAgIHsgdGhpcy0+fkdlbmVyaWNWYWx1ZSgpOyBuZXcgKHRoaXMpIEdlbmVyaWNWYWx1ZShmKTsgICAgcmV0dXJuICp0aGlzOyB9Ci0KLSAgICAvL0B9Ci0KLSAgICAvLyFAbmFtZSBTdHJpbmcKLSAgICAvL0B7Ci0KLSAgICBjb25zdCBDaCogR2V0U3RyaW5nKCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKElzU3RyaW5nKCkpOyByZXR1cm4gKGRhdGFfLmYuZmxhZ3MgJiBrSW5saW5lU3RyRmxhZykgPyBkYXRhXy5zcy5zdHIgOiBHZXRTdHJpbmdQb2ludGVyKCk7IH0KLQotICAgIC8vISBHZXQgdGhlIGxlbmd0aCBvZiBzdHJpbmcuCi0gICAgLyohIFNpbmNlIHJhcGlkanNvbiBwZXJtaXRzICJcXHUwMDAwIiBpbiB0aGUganNvbiBzdHJpbmcsIHN0cmxlbih2LkdldFN0cmluZygpKSBtYXkgbm90IGVxdWFsIHRvIHYuR2V0U3RyaW5nTGVuZ3RoKCkuCi0gICAgKi8KLSAgICBTaXplVHlwZSBHZXRTdHJpbmdMZW5ndGgoKSBjb25zdCB7IFJBUElESlNPTl9BU1NFUlQoSXNTdHJpbmcoKSk7IHJldHVybiAoKGRhdGFfLmYuZmxhZ3MgJiBrSW5saW5lU3RyRmxhZykgPyAoZGF0YV8uc3MuR2V0TGVuZ3RoKCkpIDogZGF0YV8ucy5sZW5ndGgpOyB9Ci0KLSAgICAvLyEgU2V0IHRoaXMgdmFsdWUgYXMgYSBzdHJpbmcgd2l0aG91dCBjb3B5aW5nIHNvdXJjZSBzdHJpbmcuCi0gICAgLyohIFRoaXMgdmVyc2lvbiBoYXMgYmV0dGVyIHBlcmZvcm1hbmNlIHdpdGggc3VwcGxpZWQgbGVuZ3RoLCBhbmQgYWxzbyBzdXBwb3J0IHN0cmluZyBjb250YWluaW5nIG51bGwgY2hhcmFjdGVyLgotICAgICAgICBccGFyYW0gcyBzb3VyY2Ugc3RyaW5nIHBvaW50ZXIuIAotICAgICAgICBccGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlIHN0cmluZywgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBudWxsIHRlcm1pbmF0b3IuCi0gICAgICAgIFxyZXR1cm4gVGhlIHZhbHVlIGl0c2VsZiBmb3IgZmx1ZW50IEFQSS4KLSAgICAgICAgXHBvc3QgSXNTdHJpbmcoKSA9PSB0cnVlICYmIEdldFN0cmluZygpID09IHMgJiYgR2V0U3RyaW5nTGVuZ3RoKCkgPT0gbGVuZ3RoCi0gICAgICAgIFxzZWUgU2V0U3RyaW5nKFN0cmluZ1JlZlR5cGUpCi0gICAgKi8KLSAgICBHZW5lcmljVmFsdWUmIFNldFN0cmluZyhjb25zdCBDaCogcywgU2l6ZVR5cGUgbGVuZ3RoKSB7IHJldHVybiBTZXRTdHJpbmcoU3RyaW5nUmVmKHMsIGxlbmd0aCkpOyB9Ci0KLSAgICAvLyEgU2V0IHRoaXMgdmFsdWUgYXMgYSBzdHJpbmcgd2l0aG91dCBjb3B5aW5nIHNvdXJjZSBzdHJpbmcuCi0gICAgLyohIFxwYXJhbSBzIHNvdXJjZSBzdHJpbmcgcmVmZXJlbmNlCi0gICAgICAgIFxyZXR1cm4gVGhlIHZhbHVlIGl0c2VsZiBmb3IgZmx1ZW50IEFQSS4KLSAgICAgICAgXHBvc3QgSXNTdHJpbmcoKSA9PSB0cnVlICYmIEdldFN0cmluZygpID09IHMgJiYgR2V0U3RyaW5nTGVuZ3RoKCkgPT0gcy5sZW5ndGgKLSAgICAqLwotICAgIEdlbmVyaWNWYWx1ZSYgU2V0U3RyaW5nKFN0cmluZ1JlZlR5cGUgcykgeyB0aGlzLT5+R2VuZXJpY1ZhbHVlKCk7IFNldFN0cmluZ1JhdyhzKTsgcmV0dXJuICp0aGlzOyB9Ci0KLSAgICAvLyEgU2V0IHRoaXMgdmFsdWUgYXMgYSBzdHJpbmcgYnkgY29weWluZyBmcm9tIHNvdXJjZSBzdHJpbmcuCi0gICAgLyohIFRoaXMgdmVyc2lvbiBoYXMgYmV0dGVyIHBlcmZvcm1hbmNlIHdpdGggc3VwcGxpZWQgbGVuZ3RoLCBhbmQgYWxzbyBzdXBwb3J0IHN0cmluZyBjb250YWluaW5nIG51bGwgY2hhcmFjdGVyLgotICAgICAgICBccGFyYW0gcyBzb3VyY2Ugc3RyaW5nLiAKLSAgICAgICAgXHBhcmFtIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHNvdXJjZSBzdHJpbmcsIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbCB0ZXJtaW5hdG9yLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yIEFsbG9jYXRvciBmb3IgYWxsb2NhdGluZyBjb3BpZWQgYnVmZmVyLiBDb21tb25seSB1c2UgR2VuZXJpY0RvY3VtZW50OjpHZXRBbGxvY2F0b3IoKS4KLSAgICAgICAgXHJldHVybiBUaGUgdmFsdWUgaXRzZWxmIGZvciBmbHVlbnQgQVBJLgotICAgICAgICBccG9zdCBJc1N0cmluZygpID09IHRydWUgJiYgR2V0U3RyaW5nKCkgIT0gcyAmJiBzdHJjbXAoR2V0U3RyaW5nKCkscykgPT0gMCAmJiBHZXRTdHJpbmdMZW5ndGgoKSA9PSBsZW5ndGgKLSAgICAqLwotICAgIEdlbmVyaWNWYWx1ZSYgU2V0U3RyaW5nKGNvbnN0IENoKiBzLCBTaXplVHlwZSBsZW5ndGgsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSB7IHRoaXMtPn5HZW5lcmljVmFsdWUoKTsgU2V0U3RyaW5nUmF3KFN0cmluZ1JlZihzLCBsZW5ndGgpLCBhbGxvY2F0b3IpOyByZXR1cm4gKnRoaXM7IH0KLQotICAgIC8vISBTZXQgdGhpcyB2YWx1ZSBhcyBhIHN0cmluZyBieSBjb3B5aW5nIGZyb20gc291cmNlIHN0cmluZy4KLSAgICAvKiEgXHBhcmFtIHMgc291cmNlIHN0cmluZy4gCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIGZvciBhbGxvY2F0aW5nIGNvcGllZCBidWZmZXIuIENvbW1vbmx5IHVzZSBHZW5lcmljRG9jdW1lbnQ6OkdldEFsbG9jYXRvcigpLgotICAgICAgICBccmV0dXJuIFRoZSB2YWx1ZSBpdHNlbGYgZm9yIGZsdWVudCBBUEkuCi0gICAgICAgIFxwb3N0IElzU3RyaW5nKCkgPT0gdHJ1ZSAmJiBHZXRTdHJpbmcoKSAhPSBzICYmIHN0cmNtcChHZXRTdHJpbmcoKSxzKSA9PSAwICYmIEdldFN0cmluZ0xlbmd0aCgpID09IGxlbmd0aAotICAgICovCi0gICAgR2VuZXJpY1ZhbHVlJiBTZXRTdHJpbmcoY29uc3QgQ2gqIHMsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSB7IHJldHVybiBTZXRTdHJpbmcocywgaW50ZXJuYWw6OlN0ckxlbihzKSwgYWxsb2NhdG9yKTsgfQotCi0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLSAgICAvLyEgU2V0IHRoaXMgdmFsdWUgYXMgYSBzdHJpbmcgYnkgY29weWluZyBmcm9tIHNvdXJjZSBzdHJpbmcuCi0gICAgLyohIFxwYXJhbSBzIHNvdXJjZSBzdHJpbmcuCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIGZvciBhbGxvY2F0aW5nIGNvcGllZCBidWZmZXIuIENvbW1vbmx5IHVzZSBHZW5lcmljRG9jdW1lbnQ6OkdldEFsbG9jYXRvcigpLgotICAgICAgICBccmV0dXJuIFRoZSB2YWx1ZSBpdHNlbGYgZm9yIGZsdWVudCBBUEkuCi0gICAgICAgIFxwb3N0IElzU3RyaW5nKCkgPT0gdHJ1ZSAmJiBHZXRTdHJpbmcoKSAhPSBzLmRhdGEoKSAmJiBzdHJjbXAoR2V0U3RyaW5nKCkscy5kYXRhKCkgPT0gMCAmJiBHZXRTdHJpbmdMZW5ndGgoKSA9PSBzLnNpemUoKQotICAgICAgICBcbm90ZSBSZXF1aXJlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbCBccmVmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HLgotICAgICovCi0gICAgR2VuZXJpY1ZhbHVlJiBTZXRTdHJpbmcoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Q2g+JiBzLCBBbGxvY2F0b3ImIGFsbG9jYXRvcikgeyByZXR1cm4gU2V0U3RyaW5nKHMuZGF0YSgpLCBTaXplVHlwZShzLnNpemUoKSksIGFsbG9jYXRvcik7IH0KLSNlbmRpZgotCi0gICAgLy9AfQotCi0gICAgLy8hQG5hbWUgQXJyYXkKLSAgICAvL0B7Ci0KLSAgICAvLyEgVGVtcGxhdGVkIHZlcnNpb24gZm9yIGNoZWNraW5nIHdoZXRoZXIgdGhpcyB2YWx1ZSBpcyB0eXBlIFQuCi0gICAgLyohCi0gICAgICAgIFx0cGFyYW0gVCBFaXRoZXIgXGMgYm9vbCwgXGMgaW50LCBcYyB1bnNpZ25lZCwgXGMgaW50NjRfdCwgXGMgdWludDY0X3QsIFxjIGRvdWJsZSwgXGMgZmxvYXQsIFxjIGNvbnN0IFxjIGNoYXIqLCBcYyBzdGQ6OmJhc2ljX3N0cmluZzxDaD4KLSAgICAqLwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIGJvb2wgSXMoKSBjb25zdCB7IHJldHVybiBpbnRlcm5hbDo6VHlwZUhlbHBlcjxWYWx1ZVR5cGUsIFQ+OjpJcygqdGhpcyk7IH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIFQgR2V0KCkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWw6OlR5cGVIZWxwZXI8VmFsdWVUeXBlLCBUPjo6R2V0KCp0aGlzKTsgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgVCBHZXQoKSB7IHJldHVybiBpbnRlcm5hbDo6VHlwZUhlbHBlcjxWYWx1ZVR5cGUsIFQ+OjpHZXQoKnRoaXMpOyB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIFZhbHVlVHlwZSYgU2V0KGNvbnN0IFQmIGRhdGEpIHsgcmV0dXJuIGludGVybmFsOjpUeXBlSGVscGVyPFZhbHVlVHlwZSwgVD46OlNldCgqdGhpcywgZGF0YSk7IH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgVmFsdWVUeXBlJiBTZXQoY29uc3QgVCYgZGF0YSwgQWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKSB7IHJldHVybiBpbnRlcm5hbDo6VHlwZUhlbHBlcjxWYWx1ZVR5cGUsIFQ+OjpTZXQoKnRoaXMsIGRhdGEsIGFsbG9jYXRvcik7IH0KLQotICAgIC8vQH0KLQotICAgIC8vISBHZW5lcmF0ZSBldmVudHMgb2YgdGhpcyB2YWx1ZSB0byBhIEhhbmRsZXIuCi0gICAgLyohIFRoaXMgZnVuY3Rpb24gYWRvcHRzIHRoZSBHb0YgdmlzaXRvciBwYXR0ZXJuLgotICAgICAgICBUeXBpY2FsIHVzYWdlIGlzIHRvIG91dHB1dCB0aGlzIEpTT04gdmFsdWUgYXMgSlNPTiB0ZXh0IHZpYSBXcml0ZXIsIHdoaWNoIGlzIGEgSGFuZGxlci4KLSAgICAgICAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBkZWVwIGNsb25lIHRoaXMgdmFsdWUgdmlhIEdlbmVyaWNEb2N1bWVudCwgd2hpY2ggaXMgYWxzbyBhIEhhbmRsZXIuCi0gICAgICAgIFx0cGFyYW0gSGFuZGxlciB0eXBlIG9mIGhhbmRsZXIuCi0gICAgICAgIFxwYXJhbSBoYW5kbGVyIEFuIG9iamVjdCBpbXBsZW1lbnRpbmcgY29uY2VwdCBIYW5kbGVyLgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXI+Ci0gICAgYm9vbCBBY2NlcHQoSGFuZGxlciYgaGFuZGxlcikgY29uc3QgewotICAgICAgICBzd2l0Y2goR2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2Uga051bGxUeXBlOiAgICAgcmV0dXJuIGhhbmRsZXIuTnVsbCgpOwotICAgICAgICBjYXNlIGtGYWxzZVR5cGU6ICAgIHJldHVybiBoYW5kbGVyLkJvb2woZmFsc2UpOwotICAgICAgICBjYXNlIGtUcnVlVHlwZTogICAgIHJldHVybiBoYW5kbGVyLkJvb2wodHJ1ZSk7Ci0KLSAgICAgICAgY2FzZSBrT2JqZWN0VHlwZToKLSAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoIWhhbmRsZXIuU3RhcnRPYmplY3QoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZm9yIChDb25zdE1lbWJlckl0ZXJhdG9yIG0gPSBNZW1iZXJCZWdpbigpOyBtICE9IE1lbWJlckVuZCgpOyArK20pIHsKLSAgICAgICAgICAgICAgICBSQVBJREpTT05fQVNTRVJUKG0tPm5hbWUuSXNTdHJpbmcoKSk7IC8vIFVzZXIgbWF5IGNoYW5nZSB0aGUgdHlwZSBvZiBuYW1lIGJ5IE1lbWJlckl0ZXJhdG9yLgotICAgICAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoIWhhbmRsZXIuS2V5KG0tPm5hbWUuR2V0U3RyaW5nKCksIG0tPm5hbWUuR2V0U3RyaW5nTGVuZ3RoKCksIChtLT5uYW1lLmRhdGFfLmYuZmxhZ3MgJiBrQ29weUZsYWcpICE9IDApKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoIW0tPnZhbHVlLkFjY2VwdChoYW5kbGVyKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLkVuZE9iamVjdChkYXRhXy5vLnNpemUpOwotCi0gICAgICAgIGNhc2Uga0FycmF5VHlwZToKLSAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoIWhhbmRsZXIuU3RhcnRBcnJheSgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IEdlbmVyaWNWYWx1ZSogdiA9IEJlZ2luKCk7IHYgIT0gRW5kKCk7ICsrdikKLSAgICAgICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKCF2LT5BY2NlcHQoaGFuZGxlcikpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlci5FbmRBcnJheShkYXRhXy5hLnNpemUpOwotICAgIAotICAgICAgICBjYXNlIGtTdHJpbmdUeXBlOgotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuU3RyaW5nKEdldFN0cmluZygpLCBHZXRTdHJpbmdMZW5ndGgoKSwgKGRhdGFfLmYuZmxhZ3MgJiBrQ29weUZsYWcpICE9IDApOwotICAgIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUkFQSURKU09OX0FTU0VSVChHZXRUeXBlKCkgPT0ga051bWJlclR5cGUpOwotICAgICAgICAgICAgaWYgKElzRG91YmxlKCkpICAgICAgICAgcmV0dXJuIGhhbmRsZXIuRG91YmxlKGRhdGFfLm4uZCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChJc0ludCgpKSAgICAgICByZXR1cm4gaGFuZGxlci5JbnQoZGF0YV8ubi5pLmkpOwotICAgICAgICAgICAgZWxzZSBpZiAoSXNVaW50KCkpICAgICAgcmV0dXJuIGhhbmRsZXIuVWludChkYXRhXy5uLnUudSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChJc0ludDY0KCkpICAgICByZXR1cm4gaGFuZGxlci5JbnQ2NChkYXRhXy5uLmk2NCk7Ci0gICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlci5VaW50NjQoZGF0YV8ubi51NjQpOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBHZW5lcmljVmFsdWU7Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBHZW5lcmljRG9jdW1lbnQ7Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga0Jvb2xGbGFnICAgICAgID0gMHgwMDA4LAotICAgICAgICBrTnVtYmVyRmxhZyAgICAgPSAweDAwMTAsCi0gICAgICAgIGtJbnRGbGFnICAgICAgICA9IDB4MDAyMCwKLSAgICAgICAga1VpbnRGbGFnICAgICAgID0gMHgwMDQwLAotICAgICAgICBrSW50NjRGbGFnICAgICAgPSAweDAwODAsCi0gICAgICAgIGtVaW50NjRGbGFnICAgICA9IDB4MDEwMCwKLSAgICAgICAga0RvdWJsZUZsYWcgICAgID0gMHgwMjAwLAotICAgICAgICBrU3RyaW5nRmxhZyAgICAgPSAweDA0MDAsCi0gICAgICAgIGtDb3B5RmxhZyAgICAgICA9IDB4MDgwMCwKLSAgICAgICAga0lubGluZVN0ckZsYWcgID0gMHgxMDAwLAotCi0gICAgICAgIC8vIEluaXRpYWwgZmxhZ3Mgb2YgZGlmZmVyZW50IHR5cGVzLgotICAgICAgICBrTnVsbEZsYWcgPSBrTnVsbFR5cGUsCi0gICAgICAgIGtUcnVlRmxhZyA9IGtUcnVlVHlwZSB8IGtCb29sRmxhZywKLSAgICAgICAga0ZhbHNlRmxhZyA9IGtGYWxzZVR5cGUgfCBrQm9vbEZsYWcsCi0gICAgICAgIGtOdW1iZXJJbnRGbGFnID0ga051bWJlclR5cGUgfCBrTnVtYmVyRmxhZyB8IGtJbnRGbGFnIHwga0ludDY0RmxhZywKLSAgICAgICAga051bWJlclVpbnRGbGFnID0ga051bWJlclR5cGUgfCBrTnVtYmVyRmxhZyB8IGtVaW50RmxhZyB8IGtVaW50NjRGbGFnIHwga0ludDY0RmxhZywKLSAgICAgICAga051bWJlckludDY0RmxhZyA9IGtOdW1iZXJUeXBlIHwga051bWJlckZsYWcgfCBrSW50NjRGbGFnLAotICAgICAgICBrTnVtYmVyVWludDY0RmxhZyA9IGtOdW1iZXJUeXBlIHwga051bWJlckZsYWcgfCBrVWludDY0RmxhZywKLSAgICAgICAga051bWJlckRvdWJsZUZsYWcgPSBrTnVtYmVyVHlwZSB8IGtOdW1iZXJGbGFnIHwga0RvdWJsZUZsYWcsCi0gICAgICAgIGtOdW1iZXJBbnlGbGFnID0ga051bWJlclR5cGUgfCBrTnVtYmVyRmxhZyB8IGtJbnRGbGFnIHwga0ludDY0RmxhZyB8IGtVaW50RmxhZyB8IGtVaW50NjRGbGFnIHwga0RvdWJsZUZsYWcsCi0gICAgICAgIGtDb25zdFN0cmluZ0ZsYWcgPSBrU3RyaW5nVHlwZSB8IGtTdHJpbmdGbGFnLAotICAgICAgICBrQ29weVN0cmluZ0ZsYWcgPSBrU3RyaW5nVHlwZSB8IGtTdHJpbmdGbGFnIHwga0NvcHlGbGFnLAotICAgICAgICBrU2hvcnRTdHJpbmdGbGFnID0ga1N0cmluZ1R5cGUgfCBrU3RyaW5nRmxhZyB8IGtDb3B5RmxhZyB8IGtJbmxpbmVTdHJGbGFnLAotICAgICAgICBrT2JqZWN0RmxhZyA9IGtPYmplY3RUeXBlLAotICAgICAgICBrQXJyYXlGbGFnID0ga0FycmF5VHlwZSwKLQotICAgICAgICBrVHlwZU1hc2sgPSAweDA3Ci0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBTaXplVHlwZSBrRGVmYXVsdEFycmF5Q2FwYWNpdHkgPSAxNjsKLSAgICBzdGF0aWMgY29uc3QgU2l6ZVR5cGUga0RlZmF1bHRPYmplY3RDYXBhY2l0eSA9IDE2OwotCi0gICAgc3RydWN0IEZsYWcgewotI2lmIFJBUElESlNPTl80OEJJVFBPSU5URVJfT1BUSU1JWkFUSU9OCi0gICAgICAgIGNoYXIgcGF5bG9hZFtzaXplb2YoU2l6ZVR5cGUpICogMiArIDZdOyAgICAgLy8gMiB4IFNpemVUeXBlICsgbG93ZXIgNDgtYml0IHBvaW50ZXIKLSNlbGlmIFJBUElESlNPTl82NEJJVAotICAgICAgICBjaGFyIHBheWxvYWRbc2l6ZW9mKFNpemVUeXBlKSAqIDIgKyBzaXplb2Yodm9pZCopICsgNl07IC8vIDYgcGFkZGluZyBieXRlcwotI2Vsc2UKLSAgICAgICAgY2hhciBwYXlsb2FkW3NpemVvZihTaXplVHlwZSkgKiAyICsgc2l6ZW9mKHZvaWQqKSArIDJdOyAvLyAyIHBhZGRpbmcgYnl0ZXMKLSNlbmRpZgotICAgICAgICB1aW50MTZfdCBmbGFnczsKLSAgICB9OwotCi0gICAgc3RydWN0IFN0cmluZyB7Ci0gICAgICAgIFNpemVUeXBlIGxlbmd0aDsKLSAgICAgICAgU2l6ZVR5cGUgaGFzaGNvZGU7ICAvLyE8IHJlc2VydmVkCi0gICAgICAgIGNvbnN0IENoKiBzdHI7Ci0gICAgfTsgIC8vIDEyIGJ5dGVzIGluIDMyLWJpdCBtb2RlLCAxNiBieXRlcyBpbiA2NC1iaXQgbW9kZQotCi0gICAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsOiBTaG9ydFN0cmluZyBjYW4gcmVwcmVzZW50IHplcm8tdGVybWluYXRlZCBzdHJpbmdzIHVwIHRvIE1heFNpemUgY2hhcnMKLSAgICAvLyAoZXhjbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyB6ZXJvKSBhbmQgc3RvcmUgYSB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgY29udGFpbmVkCi0gICAgLy8gc3RyaW5nIGluIHRoZSBsYXN0IGNoYXJhY3RlciBzdHJbTGVuUG9zXSBieSBzdG9yaW5nICJNYXhTaXplIC0gbGVuZ3RoIiB0aGVyZS4gSWYgdGhlIHN0cmluZwotICAgIC8vIHRvIHN0b3JlIGhhcyB0aGUgbWF4aW1hbCBsZW5ndGggb2YgTWF4U2l6ZSB0aGVuIHN0cltMZW5Qb3NdIHdpbGwgYmUgMCBhbmQgdGhlcmVmb3JlIGFjdCBhcwotICAgIC8vIHRoZSBzdHJpbmcgdGVybWluYXRvciBhcyB3ZWxsLiBGb3IgZ2V0dGluZyB0aGUgc3RyaW5nIGxlbmd0aCBiYWNrIGZyb20gdGhhdCB2YWx1ZSBqdXN0IHVzZQotICAgIC8vICJNYXhTaXplIC0gc3RyW0xlblBvc10iLgotICAgIC8vIFRoaXMgYWxsb3dzIHRvIHN0b3JlIDEzLWNoYXJzIHN0cmluZ3MgaW4gMzItYml0IG1vZGUsIDIxLWNoYXJzIHN0cmluZ3MgaW4gNjQtYml0IG1vZGUsCi0gICAgLy8gMTMtY2hhcnMgc3RyaW5ncyBmb3IgUkFQSURKU09OXzQ4QklUUE9JTlRFUl9PUFRJTUlaQVRJT049MSBpbmxpbmUgKGZvciBgVVRGOGAtZW5jb2RlZCBzdHJpbmdzKS4KLSAgICBzdHJ1Y3QgU2hvcnRTdHJpbmcgewotICAgICAgICBlbnVtIHsgTWF4Q2hhcnMgPSBzaXplb2Yoc3RhdGljX2Nhc3Q8RmxhZyo+KDApLT5wYXlsb2FkKSAvIHNpemVvZihDaCksIE1heFNpemUgPSBNYXhDaGFycyAtIDEsIExlblBvcyA9IE1heFNpemUgfTsKLSAgICAgICAgQ2ggc3RyW01heENoYXJzXTsKLQotICAgICAgICBpbmxpbmUgc3RhdGljIGJvb2wgVXNhYmxlKFNpemVUeXBlIGxlbikgeyByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgIChNYXhTaXplID49IGxlbik7IH0KLSAgICAgICAgaW5saW5lIHZvaWQgICAgIFNldExlbmd0aChTaXplVHlwZSBsZW4pIHsgc3RyW0xlblBvc10gPSBzdGF0aWNfY2FzdDxDaD4oTWF4U2l6ZSAtICBsZW4pOyB9Ci0gICAgICAgIGlubGluZSBTaXplVHlwZSBHZXRMZW5ndGgoKSBjb25zdCAgICAgICB7IHJldHVybiAgc3RhdGljX2Nhc3Q8U2l6ZVR5cGU+KE1heFNpemUgLSAgc3RyW0xlblBvc10pOyB9Ci0gICAgfTsgIC8vIGF0IG1vc3QgYXMgbWFueSBieXRlcyBhcyAiU3RyaW5nIiBhYm92ZSA9PiAxMiBieXRlcyBpbiAzMi1iaXQgbW9kZSwgMTYgYnl0ZXMgaW4gNjQtYml0IG1vZGUKLQotICAgIC8vIEJ5IHVzaW5nIHByb3BlciBiaW5hcnkgbGF5b3V0LCByZXRyaWV2YWwgb2YgZGlmZmVyZW50IGludGVnZXIgdHlwZXMgZG8gbm90IG5lZWQgY29udmVyc2lvbnMuCi0gICAgdW5pb24gTnVtYmVyIHsKLSNpZiBSQVBJREpTT05fRU5ESUFOID09IFJBUElESlNPTl9MSVRUTEVFTkRJQU4KLSAgICAgICAgc3RydWN0IEkgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBjaGFyIHBhZGRpbmdbNF07Ci0gICAgICAgIH1pOwotICAgICAgICBzdHJ1Y3QgVSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCB1OwotICAgICAgICAgICAgY2hhciBwYWRkaW5nMls0XTsKLSAgICAgICAgfXU7Ci0jZWxzZQotICAgICAgICBzdHJ1Y3QgSSB7Ci0gICAgICAgICAgICBjaGFyIHBhZGRpbmdbNF07Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgfWk7Ci0gICAgICAgIHN0cnVjdCBVIHsKLSAgICAgICAgICAgIGNoYXIgcGFkZGluZzJbNF07Ci0gICAgICAgICAgICB1bnNpZ25lZCB1OwotICAgICAgICB9dTsKLSNlbmRpZgotICAgICAgICBpbnQ2NF90IGk2NDsKLSAgICAgICAgdWludDY0X3QgdTY0OwotICAgICAgICBkb3VibGUgZDsKLSAgICB9OyAgLy8gOCBieXRlcwotCi0gICAgc3RydWN0IE9iamVjdERhdGEgewotICAgICAgICBTaXplVHlwZSBzaXplOwotICAgICAgICBTaXplVHlwZSBjYXBhY2l0eTsKLSAgICAgICAgTWVtYmVyKiBtZW1iZXJzOwotICAgIH07ICAvLyAxMiBieXRlcyBpbiAzMi1iaXQgbW9kZSwgMTYgYnl0ZXMgaW4gNjQtYml0IG1vZGUKLQotICAgIHN0cnVjdCBBcnJheURhdGEgewotICAgICAgICBTaXplVHlwZSBzaXplOwotICAgICAgICBTaXplVHlwZSBjYXBhY2l0eTsKLSAgICAgICAgR2VuZXJpY1ZhbHVlKiBlbGVtZW50czsKLSAgICB9OyAgLy8gMTIgYnl0ZXMgaW4gMzItYml0IG1vZGUsIDE2IGJ5dGVzIGluIDY0LWJpdCBtb2RlCi0KLSAgICB1bmlvbiBEYXRhIHsKLSAgICAgICAgU3RyaW5nIHM7Ci0gICAgICAgIFNob3J0U3RyaW5nIHNzOwotICAgICAgICBOdW1iZXIgbjsKLSAgICAgICAgT2JqZWN0RGF0YSBvOwotICAgICAgICBBcnJheURhdGEgYTsKLSAgICAgICAgRmxhZyBmOwotICAgIH07ICAvLyAxNiBieXRlcyBpbiAzMi1iaXQgbW9kZSwgMjQgYnl0ZXMgaW4gNjQtYml0IG1vZGUsIDE2IGJ5dGVzIGluIDY0LWJpdCB3aXRoIFJBUElESlNPTl80OEJJVFBPSU5URVJfT1BUSU1JWkFUSU9OCi0KLSAgICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgY29uc3QgQ2gqIEdldFN0cmluZ1BvaW50ZXIoKSBjb25zdCB7IHJldHVybiBSQVBJREpTT05fR0VUUE9JTlRFUihDaCwgZGF0YV8ucy5zdHIpOyB9Ci0gICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIGNvbnN0IENoKiBTZXRTdHJpbmdQb2ludGVyKGNvbnN0IENoKiBzdHIpIHsgcmV0dXJuIFJBUElESlNPTl9TRVRQT0lOVEVSKENoLCBkYXRhXy5zLnN0ciwgc3RyKTsgfQotICAgIFJBUElESlNPTl9GT1JDRUlOTElORSBHZW5lcmljVmFsdWUqIEdldEVsZW1lbnRzUG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIFJBUElESlNPTl9HRVRQT0lOVEVSKEdlbmVyaWNWYWx1ZSwgZGF0YV8uYS5lbGVtZW50cyk7IH0KLSAgICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgR2VuZXJpY1ZhbHVlKiBTZXRFbGVtZW50c1BvaW50ZXIoR2VuZXJpY1ZhbHVlKiBlbGVtZW50cykgeyByZXR1cm4gUkFQSURKU09OX1NFVFBPSU5URVIoR2VuZXJpY1ZhbHVlLCBkYXRhXy5hLmVsZW1lbnRzLCBlbGVtZW50cyk7IH0KLSAgICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgTWVtYmVyKiBHZXRNZW1iZXJzUG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIFJBUElESlNPTl9HRVRQT0lOVEVSKE1lbWJlciwgZGF0YV8uby5tZW1iZXJzKTsgfQotICAgIFJBUElESlNPTl9GT1JDRUlOTElORSBNZW1iZXIqIFNldE1lbWJlcnNQb2ludGVyKE1lbWJlciogbWVtYmVycykgeyByZXR1cm4gUkFQSURKU09OX1NFVFBPSU5URVIoTWVtYmVyLCBkYXRhXy5vLm1lbWJlcnMsIG1lbWJlcnMpOyB9Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoaXMgdmFsdWUgYXMgYXJyYXkgd2l0aCBpbml0aWFsIGRhdGEsIHdpdGhvdXQgY2FsbGluZyBkZXN0cnVjdG9yLgotICAgIHZvaWQgU2V0QXJyYXlSYXcoR2VuZXJpY1ZhbHVlKiB2YWx1ZXMsIFNpemVUeXBlIGNvdW50LCBBbGxvY2F0b3ImIGFsbG9jYXRvcikgewotICAgICAgICBkYXRhXy5mLmZsYWdzID0ga0FycmF5RmxhZzsKLSAgICAgICAgaWYgKGNvdW50KSB7Ci0gICAgICAgICAgICBHZW5lcmljVmFsdWUqIGUgPSBzdGF0aWNfY2FzdDxHZW5lcmljVmFsdWUqPihhbGxvY2F0b3IuTWFsbG9jKGNvdW50ICogc2l6ZW9mKEdlbmVyaWNWYWx1ZSkpKTsKLSAgICAgICAgICAgIFNldEVsZW1lbnRzUG9pbnRlcihlKTsKLSAgICAgICAgICAgIHN0ZDo6bWVtY3B5KGUsIHZhbHVlcywgY291bnQgKiBzaXplb2YoR2VuZXJpY1ZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU2V0RWxlbWVudHNQb2ludGVyKDApOwotICAgICAgICBkYXRhXy5hLnNpemUgPSBkYXRhXy5hLmNhcGFjaXR5ID0gY291bnQ7Ci0gICAgfQotCi0gICAgLy8hIEluaXRpYWxpemUgdGhpcyB2YWx1ZSBhcyBvYmplY3Qgd2l0aCBpbml0aWFsIGRhdGEsIHdpdGhvdXQgY2FsbGluZyBkZXN0cnVjdG9yLgotICAgIHZvaWQgU2V0T2JqZWN0UmF3KE1lbWJlciogbWVtYmVycywgU2l6ZVR5cGUgY291bnQsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSB7Ci0gICAgICAgIGRhdGFfLmYuZmxhZ3MgPSBrT2JqZWN0RmxhZzsKLSAgICAgICAgaWYgKGNvdW50KSB7Ci0gICAgICAgICAgICBNZW1iZXIqIG0gPSBzdGF0aWNfY2FzdDxNZW1iZXIqPihhbGxvY2F0b3IuTWFsbG9jKGNvdW50ICogc2l6ZW9mKE1lbWJlcikpKTsKLSAgICAgICAgICAgIFNldE1lbWJlcnNQb2ludGVyKG0pOwotICAgICAgICAgICAgc3RkOjptZW1jcHkobSwgbWVtYmVycywgY291bnQgKiBzaXplb2YoTWVtYmVyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU2V0TWVtYmVyc1BvaW50ZXIoMCk7Ci0gICAgICAgIGRhdGFfLm8uc2l6ZSA9IGRhdGFfLm8uY2FwYWNpdHkgPSBjb3VudDsKLSAgICB9Ci0KLSAgICAvLyEgSW5pdGlhbGl6ZSB0aGlzIHZhbHVlIGFzIGNvbnN0YW50IHN0cmluZywgd2l0aG91dCBjYWxsaW5nIGRlc3RydWN0b3IuCi0gICAgdm9pZCBTZXRTdHJpbmdSYXcoU3RyaW5nUmVmVHlwZSBzKSBSQVBJREpTT05fTk9FWENFUFQgewotICAgICAgICBkYXRhXy5mLmZsYWdzID0ga0NvbnN0U3RyaW5nRmxhZzsKLSAgICAgICAgU2V0U3RyaW5nUG9pbnRlcihzKTsKLSAgICAgICAgZGF0YV8ucy5sZW5ndGggPSBzLmxlbmd0aDsKLSAgICB9Ci0KLSAgICAvLyEgSW5pdGlhbGl6ZSB0aGlzIHZhbHVlIGFzIGNvcHkgc3RyaW5nIHdpdGggaW5pdGlhbCBkYXRhLCB3aXRob3V0IGNhbGxpbmcgZGVzdHJ1Y3Rvci4KLSAgICB2b2lkIFNldFN0cmluZ1JhdyhTdHJpbmdSZWZUeXBlIHMsIEFsbG9jYXRvciYgYWxsb2NhdG9yKSB7Ci0gICAgICAgIENoKiBzdHIgPSAwOwotICAgICAgICBpZiAoU2hvcnRTdHJpbmc6OlVzYWJsZShzLmxlbmd0aCkpIHsKLSAgICAgICAgICAgIGRhdGFfLmYuZmxhZ3MgPSBrU2hvcnRTdHJpbmdGbGFnOwotICAgICAgICAgICAgZGF0YV8uc3MuU2V0TGVuZ3RoKHMubGVuZ3RoKTsKLSAgICAgICAgICAgIHN0ciA9IGRhdGFfLnNzLnN0cjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGFfLmYuZmxhZ3MgPSBrQ29weVN0cmluZ0ZsYWc7Ci0gICAgICAgICAgICBkYXRhXy5zLmxlbmd0aCA9IHMubGVuZ3RoOwotICAgICAgICAgICAgc3RyID0gc3RhdGljX2Nhc3Q8Q2ggKj4oYWxsb2NhdG9yLk1hbGxvYygocy5sZW5ndGggKyAxKSAqIHNpemVvZihDaCkpKTsKLSAgICAgICAgICAgIFNldFN0cmluZ1BvaW50ZXIoc3RyKTsKLSAgICAgICAgfQotICAgICAgICBzdGQ6Om1lbWNweShzdHIsIHMsIHMubGVuZ3RoICogc2l6ZW9mKENoKSk7Ci0gICAgICAgIHN0cltzLmxlbmd0aF0gPSAnXDAnOwotICAgIH0KLQotICAgIC8vISBBc3NpZ25tZW50IHdpdGhvdXQgY2FsbGluZyBkZXN0cnVjdG9yCi0gICAgdm9pZCBSYXdBc3NpZ24oR2VuZXJpY1ZhbHVlJiByaHMpIFJBUElESlNPTl9OT0VYQ0VQVCB7Ci0gICAgICAgIGRhdGFfID0gcmhzLmRhdGFfOwotICAgICAgICAvLyBkYXRhXy5mLmZsYWdzID0gcmhzLmRhdGFfLmYuZmxhZ3M7Ci0gICAgICAgIHJocy5kYXRhXy5mLmZsYWdzID0ga051bGxGbGFnOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VBbGxvY2F0b3I+Ci0gICAgYm9vbCBTdHJpbmdFcXVhbChjb25zdCBHZW5lcmljVmFsdWU8RW5jb2RpbmcsIFNvdXJjZUFsbG9jYXRvcj4mIHJocykgY29uc3QgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKElzU3RyaW5nKCkpOwotICAgICAgICBSQVBJREpTT05fQVNTRVJUKHJocy5Jc1N0cmluZygpKTsKLQotICAgICAgICBjb25zdCBTaXplVHlwZSBsZW4xID0gR2V0U3RyaW5nTGVuZ3RoKCk7Ci0gICAgICAgIGNvbnN0IFNpemVUeXBlIGxlbjIgPSByaHMuR2V0U3RyaW5nTGVuZ3RoKCk7Ci0gICAgICAgIGlmKGxlbjEgIT0gbGVuMikgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgICAgICBjb25zdCBDaCogY29uc3Qgc3RyMSA9IEdldFN0cmluZygpOwotICAgICAgICBjb25zdCBDaCogY29uc3Qgc3RyMiA9IHJocy5HZXRTdHJpbmcoKTsKLSAgICAgICAgaWYoc3RyMSA9PSBzdHIyKSB7IHJldHVybiB0cnVlOyB9IC8vIGZhc3QgcGF0aCBmb3IgY29uc3RhbnQgc3RyaW5nCi0KLSAgICAgICAgcmV0dXJuIChzdGQ6Om1lbWNtcChzdHIxLCBzdHIyLCBzaXplb2YoQ2gpICogbGVuMSkgPT0gMCk7Ci0gICAgfQotCi0gICAgRGF0YSBkYXRhXzsKLX07Ci0KLS8vISBHZW5lcmljVmFsdWUgd2l0aCBVVEY4IGVuY29kaW5nCi10eXBlZGVmIEdlbmVyaWNWYWx1ZTxVVEY4PD4gPiBWYWx1ZTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR2VuZXJpY0RvY3VtZW50IAotCi0vLyEgQSBkb2N1bWVudCBmb3IgcGFyc2luZyBKU09OIHRleHQgYXMgRE9NLgotLyohCi0gICAgXG5vdGUgaW1wbGVtZW50cyBIYW5kbGVyIGNvbmNlcHQKLSAgICBcdHBhcmFtIEVuY29kaW5nIEVuY29kaW5nIGZvciBib3RoIHBhcnNpbmcgYW5kIHN0cmluZyBzdG9yYWdlLgotICAgIFx0cGFyYW0gQWxsb2NhdG9yIEFsbG9jYXRvciBmb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIHRoZSBET00KLSAgICBcdHBhcmFtIFN0YWNrQWxsb2NhdG9yIEFsbG9jYXRvciBmb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIHN0YWNrIGR1cmluZyBwYXJzaW5nLgotICAgIFx3YXJuaW5nIEFsdGhvdWdoIEdlbmVyaWNEb2N1bWVudCBpbmhlcml0cyBmcm9tIEdlbmVyaWNWYWx1ZSwgdGhlIEFQSSBkb2VzIFxiIG5vdCBwcm92aWRlIGFueSB2aXJ0dWFsIGZ1bmN0aW9ucywgZXNwZWNpYWxseSBubyB2aXJ0dWFsIGRlc3RydWN0b3IuICBUbyBhdm9pZCBtZW1vcnkgbGVha3MsIGRvIG5vdCBcYyBkZWxldGUgYSBHZW5lcmljRG9jdW1lbnQgb2JqZWN0IHZpYSBhIHBvaW50ZXIgdG8gYSBHZW5lcmljVmFsdWUuCi0qLwotdGVtcGxhdGUgPHR5cGVuYW1lIEVuY29kaW5nLCB0eXBlbmFtZSBBbGxvY2F0b3IgPSBNZW1vcnlQb29sQWxsb2NhdG9yPD4sIHR5cGVuYW1lIFN0YWNrQWxsb2NhdG9yID0gQ3J0QWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY0RvY3VtZW50IDogcHVibGljIEdlbmVyaWNWYWx1ZTxFbmNvZGluZywgQWxsb2NhdG9yPiB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBFbmNvZGluZzo6Q2ggQ2g7ICAgICAgICAgICAgICAgICAgICAgICAvLyE8IENoYXJhY3RlciB0eXBlIGRlcml2ZWQgZnJvbSBFbmNvZGluZy4KLSAgICB0eXBlZGVmIEdlbmVyaWNWYWx1ZTxFbmNvZGluZywgQWxsb2NhdG9yPiBWYWx1ZVR5cGU7ICAgIC8vITwgVmFsdWUgdHlwZSBvZiB0aGUgZG9jdW1lbnQuCi0gICAgdHlwZWRlZiBBbGxvY2F0b3IgQWxsb2NhdG9yVHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyE8IEFsbG9jYXRvciB0eXBlIGZyb20gdGVtcGxhdGUgcGFyYW1ldGVyLgotCi0gICAgLy8hIENvbnN0cnVjdG9yCi0gICAgLyohIENyZWF0ZXMgYW4gZW1wdHkgZG9jdW1lbnQgb2Ygc3BlY2lmaWVkIHR5cGUuCi0gICAgICAgIFxwYXJhbSB0eXBlICAgICAgICAgICAgIE1hbmRhdG9yeSB0eXBlIG9mIG9iamVjdCB0byBjcmVhdGUuCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgICAgICAgIE9wdGlvbmFsIGFsbG9jYXRvciBmb3IgYWxsb2NhdGluZyBtZW1vcnkuCi0gICAgICAgIFxwYXJhbSBzdGFja0NhcGFjaXR5ICAgIE9wdGlvbmFsIGluaXRpYWwgY2FwYWNpdHkgb2Ygc3RhY2sgaW4gYnl0ZXMuCi0gICAgICAgIFxwYXJhbSBzdGFja0FsbG9jYXRvciAgIE9wdGlvbmFsIGFsbG9jYXRvciBmb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIHN0YWNrLgotICAgICovCi0gICAgZXhwbGljaXQgR2VuZXJpY0RvY3VtZW50KFR5cGUgdHlwZSwgQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwLCBzaXplX3Qgc3RhY2tDYXBhY2l0eSA9IGtEZWZhdWx0U3RhY2tDYXBhY2l0eSwgU3RhY2tBbGxvY2F0b3IqIHN0YWNrQWxsb2NhdG9yID0gMCkgOgotICAgICAgICBHZW5lcmljVmFsdWU8RW5jb2RpbmcsIEFsbG9jYXRvcj4odHlwZSksICBhbGxvY2F0b3JfKGFsbG9jYXRvciksIG93bkFsbG9jYXRvcl8oMCksIHN0YWNrXyhzdGFja0FsbG9jYXRvciwgc3RhY2tDYXBhY2l0eSksIHBhcnNlUmVzdWx0XygpCi0gICAgewotICAgICAgICBpZiAoIWFsbG9jYXRvcl8pCi0gICAgICAgICAgICBvd25BbGxvY2F0b3JfID0gYWxsb2NhdG9yXyA9IFJBUElESlNPTl9ORVcoQWxsb2NhdG9yKCkpOwotICAgIH0KLQotICAgIC8vISBDb25zdHJ1Y3RvcgotICAgIC8qISBDcmVhdGVzIGFuIGVtcHR5IGRvY3VtZW50IHdoaWNoIHR5cGUgaXMgTnVsbC4gCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgICAgICAgIE9wdGlvbmFsIGFsbG9jYXRvciBmb3IgYWxsb2NhdGluZyBtZW1vcnkuCi0gICAgICAgIFxwYXJhbSBzdGFja0NhcGFjaXR5ICAgIE9wdGlvbmFsIGluaXRpYWwgY2FwYWNpdHkgb2Ygc3RhY2sgaW4gYnl0ZXMuCi0gICAgICAgIFxwYXJhbSBzdGFja0FsbG9jYXRvciAgIE9wdGlvbmFsIGFsbG9jYXRvciBmb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIHN0YWNrLgotICAgICovCi0gICAgR2VuZXJpY0RvY3VtZW50KEFsbG9jYXRvciogYWxsb2NhdG9yID0gMCwgc2l6ZV90IHN0YWNrQ2FwYWNpdHkgPSBrRGVmYXVsdFN0YWNrQ2FwYWNpdHksIFN0YWNrQWxsb2NhdG9yKiBzdGFja0FsbG9jYXRvciA9IDApIDogCi0gICAgICAgIGFsbG9jYXRvcl8oYWxsb2NhdG9yKSwgb3duQWxsb2NhdG9yXygwKSwgc3RhY2tfKHN0YWNrQWxsb2NhdG9yLCBzdGFja0NhcGFjaXR5KSwgcGFyc2VSZXN1bHRfKCkKLSAgICB7Ci0gICAgICAgIGlmICghYWxsb2NhdG9yXykKLSAgICAgICAgICAgIG93bkFsbG9jYXRvcl8gPSBhbGxvY2F0b3JfID0gUkFQSURKU09OX05FVyhBbGxvY2F0b3IoKSk7Ci0gICAgfQotCi0jaWYgUkFQSURKU09OX0hBU19DWFgxMV9SVkFMVUVfUkVGUwotICAgIC8vISBNb3ZlIGNvbnN0cnVjdG9yIGluIEMrKzExCi0gICAgR2VuZXJpY0RvY3VtZW50KEdlbmVyaWNEb2N1bWVudCYmIHJocykgUkFQSURKU09OX05PRVhDRVBUCi0gICAgICAgIDogVmFsdWVUeXBlKHN0ZDo6Zm9yd2FyZDxWYWx1ZVR5cGU+KHJocykpLCAvLyBleHBsaWNpdCBjYXN0IHRvIGF2b2lkIHByb2hpYml0ZWQgbW92ZSBmcm9tIERvY3VtZW50Ci0gICAgICAgICAgYWxsb2NhdG9yXyhyaHMuYWxsb2NhdG9yXyksCi0gICAgICAgICAgb3duQWxsb2NhdG9yXyhyaHMub3duQWxsb2NhdG9yXyksCi0gICAgICAgICAgc3RhY2tfKHN0ZDo6bW92ZShyaHMuc3RhY2tfKSksCi0gICAgICAgICAgcGFyc2VSZXN1bHRfKHJocy5wYXJzZVJlc3VsdF8pCi0gICAgewotICAgICAgICByaHMuYWxsb2NhdG9yXyA9IDA7Ci0gICAgICAgIHJocy5vd25BbGxvY2F0b3JfID0gMDsKLSAgICAgICAgcmhzLnBhcnNlUmVzdWx0XyA9IFBhcnNlUmVzdWx0KCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICB+R2VuZXJpY0RvY3VtZW50KCkgewotICAgICAgICBEZXN0cm95KCk7Ci0gICAgfQotCi0jaWYgUkFQSURKU09OX0hBU19DWFgxMV9SVkFMVUVfUkVGUwotICAgIC8vISBNb3ZlIGFzc2lnbm1lbnQgaW4gQysrMTEKLSAgICBHZW5lcmljRG9jdW1lbnQmIG9wZXJhdG9yPShHZW5lcmljRG9jdW1lbnQmJiByaHMpIFJBUElESlNPTl9OT0VYQ0VQVAotICAgIHsKLSAgICAgICAgLy8gVGhlIGNhc3QgdG8gVmFsdWVUeXBlIGlzIG5lY2Vzc2FyeSBoZXJlLCBiZWNhdXNlIG90aGVyd2lzZSBpdCB3b3VsZAotICAgICAgICAvLyBhdHRlbXB0IHRvIGNhbGwgR2VuZXJpY1ZhbHVlJ3MgdGVtcGxhdGVkIGFzc2lnbm1lbnQgb3BlcmF0b3IuCi0gICAgICAgIFZhbHVlVHlwZTo6b3BlcmF0b3I9KHN0ZDo6Zm9yd2FyZDxWYWx1ZVR5cGU+KHJocykpOwotCi0gICAgICAgIC8vIENhbGxpbmcgdGhlIGRlc3RydWN0b3IgaGVyZSB3b3VsZCBwcmVtYXR1cmVseSBjYWxsIHN0YWNrXydzIGRlc3RydWN0b3IKLSAgICAgICAgRGVzdHJveSgpOwotCi0gICAgICAgIGFsbG9jYXRvcl8gPSByaHMuYWxsb2NhdG9yXzsKLSAgICAgICAgb3duQWxsb2NhdG9yXyA9IHJocy5vd25BbGxvY2F0b3JfOwotICAgICAgICBzdGFja18gPSBzdGQ6Om1vdmUocmhzLnN0YWNrXyk7Ci0gICAgICAgIHBhcnNlUmVzdWx0XyA9IHJocy5wYXJzZVJlc3VsdF87Ci0KLSAgICAgICAgcmhzLmFsbG9jYXRvcl8gPSAwOwotICAgICAgICByaHMub3duQWxsb2NhdG9yXyA9IDA7Ci0gICAgICAgIHJocy5wYXJzZVJlc3VsdF8gPSBQYXJzZVJlc3VsdCgpOwotCi0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vISBFeGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhpcyBkb2N1bWVudCB3aXRoIHRob3NlIG9mIGFub3RoZXIuCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSByaHMgQW5vdGhlciBkb2N1bWVudC4KLSAgICAgICAgXG5vdGUgQ29uc3RhbnQgY29tcGxleGl0eS4KLSAgICAgICAgXHNlZSBHZW5lcmljVmFsdWU6OlN3YXAKLSAgICAqLwotICAgIEdlbmVyaWNEb2N1bWVudCYgU3dhcChHZW5lcmljRG9jdW1lbnQmIHJocykgUkFQSURKU09OX05PRVhDRVBUIHsKLSAgICAgICAgVmFsdWVUeXBlOjpTd2FwKHJocyk7Ci0gICAgICAgIHN0YWNrXy5Td2FwKHJocy5zdGFja18pOwotICAgICAgICBpbnRlcm5hbDo6U3dhcChhbGxvY2F0b3JfLCByaHMuYWxsb2NhdG9yXyk7Ci0gICAgICAgIGludGVybmFsOjpTd2FwKG93bkFsbG9jYXRvcl8sIHJocy5vd25BbGxvY2F0b3JfKTsKLSAgICAgICAgaW50ZXJuYWw6OlN3YXAocGFyc2VSZXN1bHRfLCByaHMucGFyc2VSZXN1bHRfKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIC8vISBmcmVlLXN0YW5kaW5nIHN3YXAgZnVuY3Rpb24gaGVscGVyCi0gICAgLyohCi0gICAgICAgIEhlbHBlciBmdW5jdGlvbiB0byBlbmFibGUgc3VwcG9ydCBmb3IgY29tbW9uIHN3YXAgaW1wbGVtZW50YXRpb24gcGF0dGVybiBiYXNlZCBvbiBcYyBzdGQ6OnN3YXA6Ci0gICAgICAgIFxjb2RlCi0gICAgICAgIHZvaWQgc3dhcChNeUNsYXNzJiBhLCBNeUNsYXNzJiBiKSB7Ci0gICAgICAgICAgICB1c2luZyBzdGQ6OnN3YXA7Ci0gICAgICAgICAgICBzd2FwKGEuZG9jLCBiLmRvYyk7Ci0gICAgICAgICAgICAvLyAuLi4KLSAgICAgICAgfQotICAgICAgICBcZW5kY29kZQotICAgICAgICBcc2VlIFN3YXAoKQotICAgICAqLwotICAgIGZyaWVuZCBpbmxpbmUgdm9pZCBzd2FwKEdlbmVyaWNEb2N1bWVudCYgYSwgR2VuZXJpY0RvY3VtZW50JiBiKSBSQVBJREpTT05fTk9FWENFUFQgeyBhLlN3YXAoYik7IH0KLQotICAgIC8vISBQb3B1bGF0ZSB0aGlzIGRvY3VtZW50IGJ5IGEgZ2VuZXJhdG9yIHdoaWNoIHByb2R1Y2VzIFNBWCBldmVudHMuCi0gICAgLyohIFx0cGFyYW0gR2VuZXJhdG9yIEEgZnVuY3RvciB3aXRoIDx0dD5ib29sIGYoSGFuZGxlcik8L3R0PiBwcm90b3R5cGUuCi0gICAgICAgIFxwYXJhbSBnIEdlbmVyYXRvciBmdW5jdG9yIHdoaWNoIHNlbmRzIFNBWCBldmVudHMgdG8gdGhlIHBhcmFtZXRlci4KLSAgICAgICAgXHJldHVybiBUaGUgZG9jdW1lbnQgaXRzZWxmIGZvciBmbHVlbnQgQVBJLgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEdlbmVyYXRvcj4KLSAgICBHZW5lcmljRG9jdW1lbnQmIFBvcHVsYXRlKEdlbmVyYXRvciYgZykgewotICAgICAgICBDbGVhclN0YWNrT25FeGl0IHNjb3BlKCp0aGlzKTsKLSAgICAgICAgaWYgKGcoKnRoaXMpKSB7Ci0gICAgICAgICAgICBSQVBJREpTT05fQVNTRVJUKHN0YWNrXy5HZXRTaXplKCkgPT0gc2l6ZW9mKFZhbHVlVHlwZSkpOyAvLyBHb3Qgb25lIGFuZCBvbmx5IG9uZSByb290IG9iamVjdAotICAgICAgICAgICAgVmFsdWVUeXBlOjpvcGVyYXRvcj0oKnN0YWNrXy50ZW1wbGF0ZSBQb3A8VmFsdWVUeXBlPigxKSk7Ly8gTW92ZSB2YWx1ZSBmcm9tIHN0YWNrIHRvIGRvY3VtZW50Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIC8vIUBuYW1lIFBhcnNlIGZyb20gc3RyZWFtCi0gICAgLy8hQHsKLQotICAgIC8vISBQYXJzZSBKU09OIHRleHQgZnJvbSBhbiBpbnB1dCBzdHJlYW0gKHdpdGggRW5jb2RpbmcgY29udmVyc2lvbikKLSAgICAvKiEgXHRwYXJhbSBwYXJzZUZsYWdzIENvbWJpbmF0aW9uIG9mIFxyZWYgUGFyc2VGbGFnLgotICAgICAgICBcdHBhcmFtIFNvdXJjZUVuY29kaW5nIEVuY29kaW5nIG9mIGlucHV0IHN0cmVhbQotICAgICAgICBcdHBhcmFtIElucHV0U3RyZWFtIFR5cGUgb2YgaW5wdXQgc3RyZWFtLCBpbXBsZW1lbnRpbmcgU3RyZWFtIGNvbmNlcHQKLSAgICAgICAgXHBhcmFtIGlzIElucHV0IHN0cmVhbSB0byBiZSBwYXJzZWQuCi0gICAgICAgIFxyZXR1cm4gVGhlIGRvY3VtZW50IGl0c2VsZiBmb3IgZmx1ZW50IEFQSS4KLSAgICAqLwotICAgIHRlbXBsYXRlIDx1bnNpZ25lZCBwYXJzZUZsYWdzLCB0eXBlbmFtZSBTb3VyY2VFbmNvZGluZywgdHlwZW5hbWUgSW5wdXRTdHJlYW0+Ci0gICAgR2VuZXJpY0RvY3VtZW50JiBQYXJzZVN0cmVhbShJbnB1dFN0cmVhbSYgaXMpIHsKLSAgICAgICAgR2VuZXJpY1JlYWRlcjxTb3VyY2VFbmNvZGluZywgRW5jb2RpbmcsIFN0YWNrQWxsb2NhdG9yPiByZWFkZXIoCi0gICAgICAgICAgICBzdGFja18uSGFzQWxsb2NhdG9yKCkgPyAmc3RhY2tfLkdldEFsbG9jYXRvcigpIDogMCk7Ci0gICAgICAgIENsZWFyU3RhY2tPbkV4aXQgc2NvcGUoKnRoaXMpOwotICAgICAgICBwYXJzZVJlc3VsdF8gPSByZWFkZXIudGVtcGxhdGUgUGFyc2U8cGFyc2VGbGFncz4oaXMsICp0aGlzKTsKLSAgICAgICAgaWYgKHBhcnNlUmVzdWx0XykgewotICAgICAgICAgICAgUkFQSURKU09OX0FTU0VSVChzdGFja18uR2V0U2l6ZSgpID09IHNpemVvZihWYWx1ZVR5cGUpKTsgLy8gR290IG9uZSBhbmQgb25seSBvbmUgcm9vdCBvYmplY3QKLSAgICAgICAgICAgIFZhbHVlVHlwZTo6b3BlcmF0b3I9KCpzdGFja18udGVtcGxhdGUgUG9wPFZhbHVlVHlwZT4oMSkpOy8vIE1vdmUgdmFsdWUgZnJvbSBzdGFjayB0byBkb2N1bWVudAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvLyEgUGFyc2UgSlNPTiB0ZXh0IGZyb20gYW4gaW5wdXQgc3RyZWFtCi0gICAgLyohIFx0cGFyYW0gcGFyc2VGbGFncyBDb21iaW5hdGlvbiBvZiBccmVmIFBhcnNlRmxhZy4KLSAgICAgICAgXHRwYXJhbSBJbnB1dFN0cmVhbSBUeXBlIG9mIGlucHV0IHN0cmVhbSwgaW1wbGVtZW50aW5nIFN0cmVhbSBjb25jZXB0Ci0gICAgICAgIFxwYXJhbSBpcyBJbnB1dCBzdHJlYW0gdG8gYmUgcGFyc2VkLgotICAgICAgICBccmV0dXJuIFRoZSBkb2N1bWVudCBpdHNlbGYgZm9yIGZsdWVudCBBUEkuCi0gICAgKi8KLSAgICB0ZW1wbGF0ZSA8dW5zaWduZWQgcGFyc2VGbGFncywgdHlwZW5hbWUgSW5wdXRTdHJlYW0+Ci0gICAgR2VuZXJpY0RvY3VtZW50JiBQYXJzZVN0cmVhbShJbnB1dFN0cmVhbSYgaXMpIHsKLSAgICAgICAgcmV0dXJuIFBhcnNlU3RyZWFtPHBhcnNlRmxhZ3MsIEVuY29kaW5nLCBJbnB1dFN0cmVhbT4oaXMpOwotICAgIH0KLQotICAgIC8vISBQYXJzZSBKU09OIHRleHQgZnJvbSBhbiBpbnB1dCBzdHJlYW0gKHdpdGggXHJlZiBrUGFyc2VEZWZhdWx0RmxhZ3MpCi0gICAgLyohIFx0cGFyYW0gSW5wdXRTdHJlYW0gVHlwZSBvZiBpbnB1dCBzdHJlYW0sIGltcGxlbWVudGluZyBTdHJlYW0gY29uY2VwdAotICAgICAgICBccGFyYW0gaXMgSW5wdXQgc3RyZWFtIHRvIGJlIHBhcnNlZC4KLSAgICAgICAgXHJldHVybiBUaGUgZG9jdW1lbnQgaXRzZWxmIGZvciBmbHVlbnQgQVBJLgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtPgotICAgIEdlbmVyaWNEb2N1bWVudCYgUGFyc2VTdHJlYW0oSW5wdXRTdHJlYW0mIGlzKSB7Ci0gICAgICAgIHJldHVybiBQYXJzZVN0cmVhbTxrUGFyc2VEZWZhdWx0RmxhZ3MsIEVuY29kaW5nLCBJbnB1dFN0cmVhbT4oaXMpOwotICAgIH0KLSAgICAvLyFAfQotCi0gICAgLy8hQG5hbWUgUGFyc2UgaW4tcGxhY2UgZnJvbSBtdXRhYmxlIHN0cmluZwotICAgIC8vIUB7Ci0KLSAgICAvLyEgUGFyc2UgSlNPTiB0ZXh0IGZyb20gYSBtdXRhYmxlIHN0cmluZwotICAgIC8qISBcdHBhcmFtIHBhcnNlRmxhZ3MgQ29tYmluYXRpb24gb2YgXHJlZiBQYXJzZUZsYWcuCi0gICAgICAgIFxwYXJhbSBzdHIgTXV0YWJsZSB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIGJlIHBhcnNlZC4KLSAgICAgICAgXHJldHVybiBUaGUgZG9jdW1lbnQgaXRzZWxmIGZvciBmbHVlbnQgQVBJLgotICAgICovCi0gICAgdGVtcGxhdGUgPHVuc2lnbmVkIHBhcnNlRmxhZ3M+Ci0gICAgR2VuZXJpY0RvY3VtZW50JiBQYXJzZUluc2l0dShDaCogc3RyKSB7Ci0gICAgICAgIEdlbmVyaWNJbnNpdHVTdHJpbmdTdHJlYW08RW5jb2Rpbmc+IHMoc3RyKTsKLSAgICAgICAgcmV0dXJuIFBhcnNlU3RyZWFtPHBhcnNlRmxhZ3MgfCBrUGFyc2VJbnNpdHVGbGFnPihzKTsKLSAgICB9Ci0KLSAgICAvLyEgUGFyc2UgSlNPTiB0ZXh0IGZyb20gYSBtdXRhYmxlIHN0cmluZyAod2l0aCBccmVmIGtQYXJzZURlZmF1bHRGbGFncykKLSAgICAvKiEgXHBhcmFtIHN0ciBNdXRhYmxlIHplcm8tdGVybWluYXRlZCBzdHJpbmcgdG8gYmUgcGFyc2VkLgotICAgICAgICBccmV0dXJuIFRoZSBkb2N1bWVudCBpdHNlbGYgZm9yIGZsdWVudCBBUEkuCi0gICAgKi8KLSAgICBHZW5lcmljRG9jdW1lbnQmIFBhcnNlSW5zaXR1KENoKiBzdHIpIHsKLSAgICAgICAgcmV0dXJuIFBhcnNlSW5zaXR1PGtQYXJzZURlZmF1bHRGbGFncz4oc3RyKTsKLSAgICB9Ci0gICAgLy8hQH0KLQotICAgIC8vIUBuYW1lIFBhcnNlIGZyb20gcmVhZC1vbmx5IHN0cmluZwotICAgIC8vIUB7Ci0KLSAgICAvLyEgUGFyc2UgSlNPTiB0ZXh0IGZyb20gYSByZWFkLW9ubHkgc3RyaW5nICh3aXRoIEVuY29kaW5nIGNvbnZlcnNpb24pCi0gICAgLyohIFx0cGFyYW0gcGFyc2VGbGFncyBDb21iaW5hdGlvbiBvZiBccmVmIFBhcnNlRmxhZyAobXVzdCBub3QgY29udGFpbiBccmVmIGtQYXJzZUluc2l0dUZsYWcpLgotICAgICAgICBcdHBhcmFtIFNvdXJjZUVuY29kaW5nIFRyYW5zY29kaW5nIGZyb20gaW5wdXQgRW5jb2RpbmcKLSAgICAgICAgXHBhcmFtIHN0ciBSZWFkLW9ubHkgemVyby10ZXJtaW5hdGVkIHN0cmluZyB0byBiZSBwYXJzZWQuCi0gICAgKi8KLSAgICB0ZW1wbGF0ZSA8dW5zaWduZWQgcGFyc2VGbGFncywgdHlwZW5hbWUgU291cmNlRW5jb2Rpbmc+Ci0gICAgR2VuZXJpY0RvY3VtZW50JiBQYXJzZShjb25zdCB0eXBlbmFtZSBTb3VyY2VFbmNvZGluZzo6Q2gqIHN0cikgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKCEocGFyc2VGbGFncyAmIGtQYXJzZUluc2l0dUZsYWcpKTsKLSAgICAgICAgR2VuZXJpY1N0cmluZ1N0cmVhbTxTb3VyY2VFbmNvZGluZz4gcyhzdHIpOwotICAgICAgICByZXR1cm4gUGFyc2VTdHJlYW08cGFyc2VGbGFncywgU291cmNlRW5jb2Rpbmc+KHMpOwotICAgIH0KLQotICAgIC8vISBQYXJzZSBKU09OIHRleHQgZnJvbSBhIHJlYWQtb25seSBzdHJpbmcKLSAgICAvKiEgXHRwYXJhbSBwYXJzZUZsYWdzIENvbWJpbmF0aW9uIG9mIFxyZWYgUGFyc2VGbGFnIChtdXN0IG5vdCBjb250YWluIFxyZWYga1BhcnNlSW5zaXR1RmxhZykuCi0gICAgICAgIFxwYXJhbSBzdHIgUmVhZC1vbmx5IHplcm8tdGVybWluYXRlZCBzdHJpbmcgdG8gYmUgcGFyc2VkLgotICAgICovCi0gICAgdGVtcGxhdGUgPHVuc2lnbmVkIHBhcnNlRmxhZ3M+Ci0gICAgR2VuZXJpY0RvY3VtZW50JiBQYXJzZShjb25zdCBDaCogc3RyKSB7Ci0gICAgICAgIHJldHVybiBQYXJzZTxwYXJzZUZsYWdzLCBFbmNvZGluZz4oc3RyKTsKLSAgICB9Ci0KLSAgICAvLyEgUGFyc2UgSlNPTiB0ZXh0IGZyb20gYSByZWFkLW9ubHkgc3RyaW5nICh3aXRoIFxyZWYga1BhcnNlRGVmYXVsdEZsYWdzKQotICAgIC8qISBccGFyYW0gc3RyIFJlYWQtb25seSB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIGJlIHBhcnNlZC4KLSAgICAqLwotICAgIEdlbmVyaWNEb2N1bWVudCYgUGFyc2UoY29uc3QgQ2gqIHN0cikgewotICAgICAgICByZXR1cm4gUGFyc2U8a1BhcnNlRGVmYXVsdEZsYWdzPihzdHIpOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx1bnNpZ25lZCBwYXJzZUZsYWdzLCB0eXBlbmFtZSBTb3VyY2VFbmNvZGluZz4KLSAgICBHZW5lcmljRG9jdW1lbnQmIFBhcnNlKGNvbnN0IHR5cGVuYW1lIFNvdXJjZUVuY29kaW5nOjpDaCogc3RyLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoIShwYXJzZUZsYWdzICYga1BhcnNlSW5zaXR1RmxhZykpOwotICAgICAgICBNZW1vcnlTdHJlYW0gbXMoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHN0ciksIGxlbmd0aCAqIHNpemVvZih0eXBlbmFtZSBTb3VyY2VFbmNvZGluZzo6Q2gpKTsKLSAgICAgICAgRW5jb2RlZElucHV0U3RyZWFtPFNvdXJjZUVuY29kaW5nLCBNZW1vcnlTdHJlYW0+IGlzKG1zKTsKLSAgICAgICAgUGFyc2VTdHJlYW08cGFyc2VGbGFncywgU291cmNlRW5jb2Rpbmc+KGlzKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx1bnNpZ25lZCBwYXJzZUZsYWdzPgotICAgIEdlbmVyaWNEb2N1bWVudCYgUGFyc2UoY29uc3QgQ2gqIHN0ciwgc2l6ZV90IGxlbmd0aCkgewotICAgICAgICByZXR1cm4gUGFyc2U8cGFyc2VGbGFncywgRW5jb2Rpbmc+KHN0ciwgbGVuZ3RoKTsKLSAgICB9Ci0gICAgCi0gICAgR2VuZXJpY0RvY3VtZW50JiBQYXJzZShjb25zdCBDaCogc3RyLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiBQYXJzZTxrUGFyc2VEZWZhdWx0RmxhZ3M+KHN0ciwgbGVuZ3RoKTsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIHRlbXBsYXRlIDx1bnNpZ25lZCBwYXJzZUZsYWdzLCB0eXBlbmFtZSBTb3VyY2VFbmNvZGluZz4KLSAgICBHZW5lcmljRG9jdW1lbnQmIFBhcnNlKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPHR5cGVuYW1lIFNvdXJjZUVuY29kaW5nOjpDaD4mIHN0cikgewotICAgICAgICAvLyBjX3N0cigpIGlzIGNvbnN0YW50IGNvbXBsZXhpdHkgYWNjb3JkaW5nIHRvIHN0YW5kYXJkLiBTaG91bGQgYmUgZmFzdGVyIHRoYW4gUGFyc2UoY29uc3QgY2hhciosIHNpemVfdCkKLSAgICAgICAgcmV0dXJuIFBhcnNlPHBhcnNlRmxhZ3MsIFNvdXJjZUVuY29kaW5nPihzdHIuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHVuc2lnbmVkIHBhcnNlRmxhZ3M+Ci0gICAgR2VuZXJpY0RvY3VtZW50JiBQYXJzZShjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxDaD4mIHN0cikgewotICAgICAgICByZXR1cm4gUGFyc2U8cGFyc2VGbGFncywgRW5jb2Rpbmc+KHN0ci5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBHZW5lcmljRG9jdW1lbnQmIFBhcnNlKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgc3RyKSB7Ci0gICAgICAgIHJldHVybiBQYXJzZTxrUGFyc2VEZWZhdWx0RmxhZ3M+KHN0cik7Ci0gICAgfQotI2VuZGlmIC8vIFJBUElESlNPTl9IQVNfU1REU1RSSU5HICAgIAotCi0gICAgLy8hQH0KLQotICAgIC8vIUBuYW1lIEhhbmRsaW5nIHBhcnNlIGVycm9ycwotICAgIC8vIUB7Ci0KLSAgICAvLyEgV2hldGhlciBhIHBhcnNlIGVycm9yIGhhcyBvY2N1cmVkIGluIHRoZSBsYXN0IHBhcnNpbmcuCi0gICAgYm9vbCBIYXNQYXJzZUVycm9yKCkgY29uc3QgeyByZXR1cm4gcGFyc2VSZXN1bHRfLklzRXJyb3IoKTsgfQotCi0gICAgLy8hIEdldCB0aGUgXHJlZiBQYXJzZUVycm9yQ29kZSBvZiBsYXN0IHBhcnNpbmcuCi0gICAgUGFyc2VFcnJvckNvZGUgR2V0UGFyc2VFcnJvcigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlUmVzdWx0Xy5Db2RlKCk7IH0KLQotICAgIC8vISBHZXQgdGhlIHBvc2l0aW9uIG9mIGxhc3QgcGFyc2luZyBlcnJvciBpbiBpbnB1dCwgMCBvdGhlcndpc2UuCi0gICAgc2l6ZV90IEdldEVycm9yT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gcGFyc2VSZXN1bHRfLk9mZnNldCgpOyB9Ci0KLSAgICAvLyEgSW1wbGljaXQgY29udmVyc2lvbiB0byBnZXQgdGhlIGxhc3QgcGFyc2UgcmVzdWx0Ci0jaWZuZGVmIF9fY2xhbmcgLy8gLVdkb2N1bWVudGF0aW9uCi0gICAgLyohIFxyZXR1cm4gXHJlZiBQYXJzZVJlc3VsdCBvZiB0aGUgbGFzdCBwYXJzZSBvcGVyYXRpb24KLQotICAgICAgICBcY29kZQotICAgICAgICAgIERvY3VtZW50IGRvYzsKLSAgICAgICAgICBQYXJzZVJlc3VsdCBvayA9IGRvYy5QYXJzZShqc29uKTsKLSAgICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgcHJpbnRmKCAiSlNPTiBwYXJzZSBlcnJvcjogJXMgKCV1KVxuIiwgR2V0UGFyc2VFcnJvcl9Fbihvay5Db2RlKCkpLCBvay5PZmZzZXQoKSk7Ci0gICAgICAgIFxlbmRjb2RlCi0gICAgICovCi0jZW5kaWYKLSAgICBvcGVyYXRvciBQYXJzZVJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlUmVzdWx0XzsgfQotICAgIC8vIUB9Ci0KLSAgICAvLyEgR2V0IHRoZSBhbGxvY2F0b3Igb2YgdGhpcyBkb2N1bWVudC4KLSAgICBBbGxvY2F0b3ImIEdldEFsbG9jYXRvcigpIHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChhbGxvY2F0b3JfKTsKLSAgICAgICAgcmV0dXJuICphbGxvY2F0b3JfOwotICAgIH0KLQotICAgIC8vISBHZXQgdGhlIGNhcGFjaXR5IG9mIHN0YWNrIGluIGJ5dGVzLgotICAgIHNpemVfdCBHZXRTdGFja0NhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gc3RhY2tfLkdldENhcGFjaXR5KCk7IH0KLQotcHJpdmF0ZToKLSAgICAvLyBjbGVhciBzdGFjayBvbiBhbnkgZXhpdCBmcm9tIFBhcnNlU3RyZWFtLCBlLmcuIGR1ZSB0byBleGNlcHRpb24KLSAgICBzdHJ1Y3QgQ2xlYXJTdGFja09uRXhpdCB7Ci0gICAgICAgIGV4cGxpY2l0IENsZWFyU3RhY2tPbkV4aXQoR2VuZXJpY0RvY3VtZW50JiBkKSA6IGRfKGQpIHt9Ci0gICAgICAgIH5DbGVhclN0YWNrT25FeGl0KCkgeyBkXy5DbGVhclN0YWNrKCk7IH0KLSAgICBwcml2YXRlOgotICAgICAgICBDbGVhclN0YWNrT25FeGl0KGNvbnN0IENsZWFyU3RhY2tPbkV4aXQmKTsKLSAgICAgICAgQ2xlYXJTdGFja09uRXhpdCYgb3BlcmF0b3I9KGNvbnN0IENsZWFyU3RhY2tPbkV4aXQmKTsKLSAgICAgICAgR2VuZXJpY0RvY3VtZW50JiBkXzsKLSAgICB9OwotCi0gICAgLy8gY2FsbGVycyBvZiB0aGUgZm9sbG93aW5nIHByaXZhdGUgSGFuZGxlciBmdW5jdGlvbnMKLSAgICAvLyB0ZW1wbGF0ZSA8dHlwZW5hbWUsdHlwZW5hbWUsdHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBHZW5lcmljUmVhZGVyOyAvLyBmb3IgcGFyc2luZwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBHZW5lcmljVmFsdWU7IC8vIGZvciBkZWVwIGNvcHlpbmcKLQotcHVibGljOgotICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIEhhbmRsZXIKLSAgICBib29sIE51bGwoKSB7IG5ldyAoc3RhY2tfLnRlbXBsYXRlIFB1c2g8VmFsdWVUeXBlPigpKSBWYWx1ZVR5cGUoKTsgcmV0dXJuIHRydWU7IH0KLSAgICBib29sIEJvb2woYm9vbCBiKSB7IG5ldyAoc3RhY2tfLnRlbXBsYXRlIFB1c2g8VmFsdWVUeXBlPigpKSBWYWx1ZVR5cGUoYik7IHJldHVybiB0cnVlOyB9Ci0gICAgYm9vbCBJbnQoaW50IGkpIHsgbmV3IChzdGFja18udGVtcGxhdGUgUHVzaDxWYWx1ZVR5cGU+KCkpIFZhbHVlVHlwZShpKTsgcmV0dXJuIHRydWU7IH0KLSAgICBib29sIFVpbnQodW5zaWduZWQgaSkgeyBuZXcgKHN0YWNrXy50ZW1wbGF0ZSBQdXNoPFZhbHVlVHlwZT4oKSkgVmFsdWVUeXBlKGkpOyByZXR1cm4gdHJ1ZTsgfQotICAgIGJvb2wgSW50NjQoaW50NjRfdCBpKSB7IG5ldyAoc3RhY2tfLnRlbXBsYXRlIFB1c2g8VmFsdWVUeXBlPigpKSBWYWx1ZVR5cGUoaSk7IHJldHVybiB0cnVlOyB9Ci0gICAgYm9vbCBVaW50NjQodWludDY0X3QgaSkgeyBuZXcgKHN0YWNrXy50ZW1wbGF0ZSBQdXNoPFZhbHVlVHlwZT4oKSkgVmFsdWVUeXBlKGkpOyByZXR1cm4gdHJ1ZTsgfQotICAgIGJvb2wgRG91YmxlKGRvdWJsZSBkKSB7IG5ldyAoc3RhY2tfLnRlbXBsYXRlIFB1c2g8VmFsdWVUeXBlPigpKSBWYWx1ZVR5cGUoZCk7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBib29sIFJhd051bWJlcihjb25zdCBDaCogc3RyLCBTaXplVHlwZSBsZW5ndGgsIGJvb2wgY29weSkgeyAKLSAgICAgICAgaWYgKGNvcHkpIAotICAgICAgICAgICAgbmV3IChzdGFja18udGVtcGxhdGUgUHVzaDxWYWx1ZVR5cGU+KCkpIFZhbHVlVHlwZShzdHIsIGxlbmd0aCwgR2V0QWxsb2NhdG9yKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuZXcgKHN0YWNrXy50ZW1wbGF0ZSBQdXNoPFZhbHVlVHlwZT4oKSkgVmFsdWVUeXBlKHN0ciwgbGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBTdHJpbmcoY29uc3QgQ2gqIHN0ciwgU2l6ZVR5cGUgbGVuZ3RoLCBib29sIGNvcHkpIHsgCi0gICAgICAgIGlmIChjb3B5KSAKLSAgICAgICAgICAgIG5ldyAoc3RhY2tfLnRlbXBsYXRlIFB1c2g8VmFsdWVUeXBlPigpKSBWYWx1ZVR5cGUoc3RyLCBsZW5ndGgsIEdldEFsbG9jYXRvcigpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbmV3IChzdGFja18udGVtcGxhdGUgUHVzaDxWYWx1ZVR5cGU+KCkpIFZhbHVlVHlwZShzdHIsIGxlbmd0aCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgU3RhcnRPYmplY3QoKSB7IG5ldyAoc3RhY2tfLnRlbXBsYXRlIFB1c2g8VmFsdWVUeXBlPigpKSBWYWx1ZVR5cGUoa09iamVjdFR5cGUpOyByZXR1cm4gdHJ1ZTsgfQotICAgIAotICAgIGJvb2wgS2V5KGNvbnN0IENoKiBzdHIsIFNpemVUeXBlIGxlbmd0aCwgYm9vbCBjb3B5KSB7IHJldHVybiBTdHJpbmcoc3RyLCBsZW5ndGgsIGNvcHkpOyB9Ci0KLSAgICBib29sIEVuZE9iamVjdChTaXplVHlwZSBtZW1iZXJDb3VudCkgewotICAgICAgICB0eXBlbmFtZSBWYWx1ZVR5cGU6Ok1lbWJlciogbWVtYmVycyA9IHN0YWNrXy50ZW1wbGF0ZSBQb3A8dHlwZW5hbWUgVmFsdWVUeXBlOjpNZW1iZXI+KG1lbWJlckNvdW50KTsKLSAgICAgICAgc3RhY2tfLnRlbXBsYXRlIFRvcDxWYWx1ZVR5cGU+KCktPlNldE9iamVjdFJhdyhtZW1iZXJzLCBtZW1iZXJDb3VudCwgR2V0QWxsb2NhdG9yKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIFN0YXJ0QXJyYXkoKSB7IG5ldyAoc3RhY2tfLnRlbXBsYXRlIFB1c2g8VmFsdWVUeXBlPigpKSBWYWx1ZVR5cGUoa0FycmF5VHlwZSk7IHJldHVybiB0cnVlOyB9Ci0gICAgCi0gICAgYm9vbCBFbmRBcnJheShTaXplVHlwZSBlbGVtZW50Q291bnQpIHsKLSAgICAgICAgVmFsdWVUeXBlKiBlbGVtZW50cyA9IHN0YWNrXy50ZW1wbGF0ZSBQb3A8VmFsdWVUeXBlPihlbGVtZW50Q291bnQpOwotICAgICAgICBzdGFja18udGVtcGxhdGUgVG9wPFZhbHVlVHlwZT4oKS0+U2V0QXJyYXlSYXcoZWxlbWVudHMsIGVsZW1lbnRDb3VudCwgR2V0QWxsb2NhdG9yKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgLy8hIFByb2hpYml0IGNvcHlpbmcKLSAgICBHZW5lcmljRG9jdW1lbnQoY29uc3QgR2VuZXJpY0RvY3VtZW50Jik7Ci0gICAgLy8hIFByb2hpYml0IGFzc2lnbm1lbnQKLSAgICBHZW5lcmljRG9jdW1lbnQmIG9wZXJhdG9yPShjb25zdCBHZW5lcmljRG9jdW1lbnQmKTsKLQotICAgIHZvaWQgQ2xlYXJTdGFjaygpIHsKLSAgICAgICAgaWYgKEFsbG9jYXRvcjo6a05lZWRGcmVlKQotICAgICAgICAgICAgd2hpbGUgKHN0YWNrXy5HZXRTaXplKCkgPiAwKSAgICAvLyBIZXJlIGFzc3VtZXMgYWxsIGVsZW1lbnRzIGluIHN0YWNrIGFycmF5IGFyZSBHZW5lcmljVmFsdWUgKE1lbWJlciBpcyBhY3R1YWxseSAyIEdlbmVyaWNWYWx1ZSBvYmplY3RzKQotICAgICAgICAgICAgICAgIChzdGFja18udGVtcGxhdGUgUG9wPFZhbHVlVHlwZT4oMSkpLT5+VmFsdWVUeXBlKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YWNrXy5DbGVhcigpOwotICAgICAgICBzdGFja18uU2hyaW5rVG9GaXQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIERlc3Ryb3koKSB7Ci0gICAgICAgIFJBUElESlNPTl9ERUxFVEUob3duQWxsb2NhdG9yXyk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRGVmYXVsdFN0YWNrQ2FwYWNpdHkgPSAxMDI0OwotICAgIEFsbG9jYXRvciogYWxsb2NhdG9yXzsKLSAgICBBbGxvY2F0b3IqIG93bkFsbG9jYXRvcl87Ci0gICAgaW50ZXJuYWw6OlN0YWNrPFN0YWNrQWxsb2NhdG9yPiBzdGFja187Ci0gICAgUGFyc2VSZXN1bHQgcGFyc2VSZXN1bHRfOwotfTsKLQotLy8hIEdlbmVyaWNEb2N1bWVudCB3aXRoIFVURjggZW5jb2RpbmcKLXR5cGVkZWYgR2VuZXJpY0RvY3VtZW50PFVURjg8PiA+IERvY3VtZW50OwotCi0vLyBkZWZpbmVkIGhlcmUgZHVlIHRvIHRoZSBkZXBlbmRlbmN5IG9uIEdlbmVyaWNEb2N1bWVudAotdGVtcGxhdGUgPHR5cGVuYW1lIEVuY29kaW5nLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlQWxsb2NhdG9yPgotaW5saW5lCi1HZW5lcmljVmFsdWU8RW5jb2RpbmcsQWxsb2NhdG9yPjo6R2VuZXJpY1ZhbHVlKGNvbnN0IEdlbmVyaWNWYWx1ZTxFbmNvZGluZyxTb3VyY2VBbGxvY2F0b3I+JiByaHMsIEFsbG9jYXRvciYgYWxsb2NhdG9yKQotewotICAgIHN3aXRjaCAocmhzLkdldFR5cGUoKSkgewotICAgIGNhc2Uga09iamVjdFR5cGU6Ci0gICAgY2FzZSBrQXJyYXlUeXBlOiB7IC8vIHBlcmZvcm0gZGVlcCBjb3B5IHZpYSBTQVggSGFuZGxlcgotICAgICAgICAgICAgR2VuZXJpY0RvY3VtZW50PEVuY29kaW5nLEFsbG9jYXRvcj4gZCgmYWxsb2NhdG9yKTsKLSAgICAgICAgICAgIHJocy5BY2NlcHQoZCk7Ci0gICAgICAgICAgICBSYXdBc3NpZ24oKmQuc3RhY2tfLnRlbXBsYXRlIFBvcDxHZW5lcmljVmFsdWU+KDEpKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtTdHJpbmdUeXBlOgotICAgICAgICBpZiAocmhzLmRhdGFfLmYuZmxhZ3MgPT0ga0NvbnN0U3RyaW5nRmxhZykgewotICAgICAgICAgICAgZGF0YV8uZi5mbGFncyA9IHJocy5kYXRhXy5mLmZsYWdzOwotICAgICAgICAgICAgZGF0YV8gID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRGF0YSo+KCZyaHMuZGF0YV8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU2V0U3RyaW5nUmF3KFN0cmluZ1JlZihyaHMuR2V0U3RyaW5nKCksIHJocy5HZXRTdHJpbmdMZW5ndGgoKSksIGFsbG9jYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgZGF0YV8uZi5mbGFncyA9IHJocy5kYXRhXy5mLmZsYWdzOwotICAgICAgICBkYXRhXyAgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBEYXRhKj4oJnJocy5kYXRhXyk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLy8hIEhlbHBlciBjbGFzcyBmb3IgYWNjZXNzaW5nIFZhbHVlIG9mIGFycmF5IHR5cGUuCi0vKiEKLSAgICBJbnN0YW5jZSBvZiB0aGlzIGhlbHBlciBjbGFzcyBpcyBvYnRhaW5lZCBieSBcYyBHZW5lcmljVmFsdWU6OkdldEFycmF5KCkuCi0gICAgSW4gYWRkaXRpb24gdG8gYWxsIEFQSXMgZm9yIGFycmF5IHR5cGUsIGl0IHByb3ZpZGVzIHJhbmdlLWJhc2VkIGZvciBsb29wIGlmIFxjIFJBUElESlNPTl9IQVNfQ1hYMTFfUkFOR0VfRk9SPTEuCi0qLwotdGVtcGxhdGUgPGJvb2wgQ29uc3QsIHR5cGVuYW1lIFZhbHVlVD4KLWNsYXNzIEdlbmVyaWNBcnJheSB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBHZW5lcmljQXJyYXk8dHJ1ZSwgVmFsdWVUPiBDb25zdEFycmF5OwotICAgIHR5cGVkZWYgR2VuZXJpY0FycmF5PGZhbHNlLCBWYWx1ZVQ+IEFycmF5OwotICAgIHR5cGVkZWYgVmFsdWVUIFBsYWluVHlwZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpNYXliZUFkZENvbnN0PENvbnN0LFBsYWluVHlwZT46OlR5cGUgVmFsdWVUeXBlOwotICAgIHR5cGVkZWYgVmFsdWVUeXBlKiBWYWx1ZUl0ZXJhdG9yOyAgLy8gVGhpcyBtYXkgYmUgY29uc3Qgb3Igbm9uLWNvbnN0IGl0ZXJhdG9yCi0gICAgdHlwZWRlZiBjb25zdCBWYWx1ZVQqIENvbnN0VmFsdWVJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSBBbGxvY2F0b3JUeXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgVmFsdWVUeXBlOjpTdHJpbmdSZWZUeXBlIFN0cmluZ1JlZlR5cGU7Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lPgotICAgIGZyaWVuZCBjbGFzcyBHZW5lcmljVmFsdWU7Ci0KLSAgICBHZW5lcmljQXJyYXkoY29uc3QgR2VuZXJpY0FycmF5JiByaHMpIDogdmFsdWVfKHJocy52YWx1ZV8pIHt9Ci0gICAgR2VuZXJpY0FycmF5JiBvcGVyYXRvcj0oY29uc3QgR2VuZXJpY0FycmF5JiByaHMpIHsgdmFsdWVfID0gcmhzLnZhbHVlXzsgcmV0dXJuICp0aGlzOyB9Ci0gICAgfkdlbmVyaWNBcnJheSgpIHt9Ci0KLSAgICBTaXplVHlwZSBTaXplKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfLlNpemUoKTsgfQotICAgIFNpemVUeXBlIENhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfLkNhcGFjaXR5KCk7IH0KLSAgICBib29sIEVtcHR5KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfLkVtcHR5KCk7IH0KLSAgICB2b2lkIENsZWFyKCkgY29uc3QgeyB2YWx1ZV8uQ2xlYXIoKTsgfQotICAgIFZhbHVlVHlwZSYgb3BlcmF0b3JbXShTaXplVHlwZSBpbmRleCkgY29uc3QgeyAgcmV0dXJuIHZhbHVlX1tpbmRleF07IH0KLSAgICBWYWx1ZUl0ZXJhdG9yIEJlZ2luKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfLkJlZ2luKCk7IH0KLSAgICBWYWx1ZUl0ZXJhdG9yIEVuZCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXy5FbmQoKTsgfQotICAgIEdlbmVyaWNBcnJheSBSZXNlcnZlKFNpemVUeXBlIG5ld0NhcGFjaXR5LCBBbGxvY2F0b3JUeXBlICZhbGxvY2F0b3IpIGNvbnN0IHsgdmFsdWVfLlJlc2VydmUobmV3Q2FwYWNpdHksIGFsbG9jYXRvcik7IHJldHVybiAqdGhpczsgfQotICAgIEdlbmVyaWNBcnJheSBQdXNoQmFjayhWYWx1ZVR5cGUmIHZhbHVlLCBBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3IpIGNvbnN0IHsgdmFsdWVfLlB1c2hCYWNrKHZhbHVlLCBhbGxvY2F0b3IpOyByZXR1cm4gKnRoaXM7IH0KLSNpZiBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0gICAgR2VuZXJpY0FycmF5IFB1c2hCYWNrKFZhbHVlVHlwZSYmIHZhbHVlLCBBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3IpIGNvbnN0IHsgdmFsdWVfLlB1c2hCYWNrKHZhbHVlLCBhbGxvY2F0b3IpOyByZXR1cm4gKnRoaXM7IH0KLSNlbmRpZiAvLyBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0gICAgR2VuZXJpY0FycmF5IFB1c2hCYWNrKFN0cmluZ1JlZlR5cGUgdmFsdWUsIEFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgeyB2YWx1ZV8uUHVzaEJhY2sodmFsdWUsIGFsbG9jYXRvcik7IHJldHVybiAqdGhpczsgfQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBSQVBJREpTT05fRElTQUJMRUlGX1JFVFVSTigoaW50ZXJuYWw6Ok9yRXhwcjxpbnRlcm5hbDo6SXNQb2ludGVyPFQ+LCBpbnRlcm5hbDo6SXNHZW5lcmljVmFsdWU8VD4gPiksIChjb25zdCBHZW5lcmljQXJyYXkmKSkgUHVzaEJhY2soVCB2YWx1ZSwgQWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKSBjb25zdCB7IHZhbHVlXy5QdXNoQmFjayh2YWx1ZSwgYWxsb2NhdG9yKTsgcmV0dXJuICp0aGlzOyB9Ci0gICAgR2VuZXJpY0FycmF5IFBvcEJhY2soKSBjb25zdCB7IHZhbHVlXy5Qb3BCYWNrKCk7IHJldHVybiAqdGhpczsgfQotICAgIFZhbHVlSXRlcmF0b3IgRXJhc2UoQ29uc3RWYWx1ZUl0ZXJhdG9yIHBvcykgY29uc3QgeyByZXR1cm4gdmFsdWVfLkVyYXNlKHBvcyk7IH0KLSAgICBWYWx1ZUl0ZXJhdG9yIEVyYXNlKENvbnN0VmFsdWVJdGVyYXRvciBmaXJzdCwgQ29uc3RWYWx1ZUl0ZXJhdG9yIGxhc3QpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXy5FcmFzZShmaXJzdCwgbGFzdCk7IH0KLQotI2lmIFJBUElESlNPTl9IQVNfQ1hYMTFfUkFOR0VfRk9SCi0gICAgVmFsdWVJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXy5CZWdpbigpOyB9Ci0gICAgVmFsdWVJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uRW5kKCk7IH0KLSNlbmRpZgotCi1wcml2YXRlOgotICAgIEdlbmVyaWNBcnJheSgpOwotICAgIEdlbmVyaWNBcnJheShWYWx1ZVR5cGUmIHZhbHVlKSA6IHZhbHVlXyh2YWx1ZSkge30KLSAgICBWYWx1ZVR5cGUmIHZhbHVlXzsKLX07Ci0KLS8vISBIZWxwZXIgY2xhc3MgZm9yIGFjY2Vzc2luZyBWYWx1ZSBvZiBvYmplY3QgdHlwZS4KLS8qIQotICAgIEluc3RhbmNlIG9mIHRoaXMgaGVscGVyIGNsYXNzIGlzIG9idGFpbmVkIGJ5IFxjIEdlbmVyaWNWYWx1ZTo6R2V0T2JqZWN0KCkuCi0gICAgSW4gYWRkaXRpb24gdG8gYWxsIEFQSXMgZm9yIGFycmF5IHR5cGUsIGl0IHByb3ZpZGVzIHJhbmdlLWJhc2VkIGZvciBsb29wIGlmIFxjIFJBUElESlNPTl9IQVNfQ1hYMTFfUkFOR0VfRk9SPTEuCi0qLwotdGVtcGxhdGUgPGJvb2wgQ29uc3QsIHR5cGVuYW1lIFZhbHVlVD4KLWNsYXNzIEdlbmVyaWNPYmplY3QgewotcHVibGljOgotICAgIHR5cGVkZWYgR2VuZXJpY09iamVjdDx0cnVlLCBWYWx1ZVQ+IENvbnN0T2JqZWN0OwotICAgIHR5cGVkZWYgR2VuZXJpY09iamVjdDxmYWxzZSwgVmFsdWVUPiBPYmplY3Q7Ci0gICAgdHlwZWRlZiBWYWx1ZVQgUGxhaW5UeXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWw6Ok1heWJlQWRkQ29uc3Q8Q29uc3QsUGxhaW5UeXBlPjo6VHlwZSBWYWx1ZVR5cGU7Ci0gICAgdHlwZWRlZiBHZW5lcmljTWVtYmVySXRlcmF0b3I8Q29uc3QsIHR5cGVuYW1lIFZhbHVlVDo6RW5jb2RpbmdUeXBlLCB0eXBlbmFtZSBWYWx1ZVQ6OkFsbG9jYXRvclR5cGU+IE1lbWJlckl0ZXJhdG9yOyAgLy8gVGhpcyBtYXkgYmUgY29uc3Qgb3Igbm9uLWNvbnN0IGl0ZXJhdG9yCi0gICAgdHlwZWRlZiBHZW5lcmljTWVtYmVySXRlcmF0b3I8dHJ1ZSwgdHlwZW5hbWUgVmFsdWVUOjpFbmNvZGluZ1R5cGUsIHR5cGVuYW1lIFZhbHVlVDo6QWxsb2NhdG9yVHlwZT4gQ29uc3RNZW1iZXJJdGVyYXRvcjsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSBBbGxvY2F0b3JUeXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgVmFsdWVUeXBlOjpTdHJpbmdSZWZUeXBlIFN0cmluZ1JlZlR5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGU6OkVuY29kaW5nVHlwZSBFbmNvZGluZ1R5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGU6OkNoIENoOwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZT4KLSAgICBmcmllbmQgY2xhc3MgR2VuZXJpY1ZhbHVlOwotCi0gICAgR2VuZXJpY09iamVjdChjb25zdCBHZW5lcmljT2JqZWN0JiByaHMpIDogdmFsdWVfKHJocy52YWx1ZV8pIHt9Ci0gICAgR2VuZXJpY09iamVjdCYgb3BlcmF0b3I9KGNvbnN0IEdlbmVyaWNPYmplY3QmIHJocykgeyB2YWx1ZV8gPSByaHMudmFsdWVfOyByZXR1cm4gKnRoaXM7IH0KLSAgICB+R2VuZXJpY09iamVjdCgpIHt9Ci0KLSAgICBTaXplVHlwZSBNZW1iZXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXy5NZW1iZXJDb3VudCgpOyB9Ci0gICAgYm9vbCBPYmplY3RFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXy5PYmplY3RFbXB0eSgpOyB9Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFZhbHVlVHlwZSYgb3BlcmF0b3JbXShUKiBuYW1lKSBjb25zdCB7IHJldHVybiB2YWx1ZV9bbmFtZV07IH0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlQWxsb2NhdG9yPiBWYWx1ZVR5cGUmIG9wZXJhdG9yW10oY29uc3QgR2VuZXJpY1ZhbHVlPEVuY29kaW5nVHlwZSwgU291cmNlQWxsb2NhdG9yPiYgbmFtZSkgY29uc3QgeyByZXR1cm4gdmFsdWVfW25hbWVdOyB9Ci0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLSAgICBWYWx1ZVR5cGUmIG9wZXJhdG9yW10oY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Q2g+JiBuYW1lKSBjb25zdCB7IHJldHVybiB2YWx1ZV9bbmFtZV07IH0KLSNlbmRpZgotICAgIE1lbWJlckl0ZXJhdG9yIE1lbWJlckJlZ2luKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfLk1lbWJlckJlZ2luKCk7IH0KLSAgICBNZW1iZXJJdGVyYXRvciBNZW1iZXJFbmQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uTWVtYmVyRW5kKCk7IH0KLSAgICBib29sIEhhc01lbWJlcihjb25zdCBDaCogbmFtZSkgY29uc3QgeyByZXR1cm4gdmFsdWVfLkhhc01lbWJlcihuYW1lKTsgfQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi0gICAgYm9vbCBIYXNNZW1iZXIoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Q2g+JiBuYW1lKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uSGFzTWVtYmVyKG5hbWUpOyB9Ci0jZW5kaWYKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlQWxsb2NhdG9yPiBib29sIEhhc01lbWJlcihjb25zdCBHZW5lcmljVmFsdWU8RW5jb2RpbmdUeXBlLCBTb3VyY2VBbGxvY2F0b3I+JiBuYW1lKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uSGFzTWVtYmVyKG5hbWUpOyB9Ci0gICAgTWVtYmVySXRlcmF0b3IgRmluZE1lbWJlcihjb25zdCBDaCogbmFtZSkgY29uc3QgeyB2YWx1ZV8uRmluZE1lbWJlcihuYW1lKTsgfQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VBbGxvY2F0b3I+IE1lbWJlckl0ZXJhdG9yIEZpbmRNZW1iZXIoY29uc3QgR2VuZXJpY1ZhbHVlPEVuY29kaW5nVHlwZSwgU291cmNlQWxsb2NhdG9yPiYgbmFtZSkgY29uc3QgeyB2YWx1ZV8uRmluZE1lbWJlcihuYW1lKTsgfQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi0gICAgTWVtYmVySXRlcmF0b3IgRmluZE1lbWJlcihjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxDaD4mIG5hbWUpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXy5GaW5kTWVtYmVyKG5hbWUpOyB9Ci0jZW5kaWYKLSAgICBHZW5lcmljT2JqZWN0IEFkZE1lbWJlcihWYWx1ZVR5cGUmIG5hbWUsIFZhbHVlVHlwZSYgdmFsdWUsIEFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgeyB2YWx1ZV8uQWRkTWVtYmVyKG5hbWUsIHZhbHVlLCBhbGxvY2F0b3IpOyByZXR1cm4gKnRoaXM7IH0KLSAgICBHZW5lcmljT2JqZWN0IEFkZE1lbWJlcihWYWx1ZVR5cGUmIG5hbWUsIFN0cmluZ1JlZlR5cGUgdmFsdWUsIEFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgeyB2YWx1ZV8uQWRkTWVtYmVyKG5hbWUsIHZhbHVlLCBhbGxvY2F0b3IpOyByZXR1cm4gKnRoaXM7IH0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIEdlbmVyaWNPYmplY3QgQWRkTWVtYmVyKFZhbHVlVHlwZSYgbmFtZSwgc3RkOjpiYXNpY19zdHJpbmc8Q2g+JiB2YWx1ZSwgQWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKSBjb25zdCB7IHZhbHVlXy5BZGRNZW1iZXIobmFtZSwgdmFsdWUsIGFsbG9jYXRvcik7IHJldHVybiAqdGhpczsgfQotI2VuZGlmCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFJBUElESlNPTl9ESVNBQkxFSUZfUkVUVVJOKChpbnRlcm5hbDo6T3JFeHByPGludGVybmFsOjpJc1BvaW50ZXI8VD4sIGludGVybmFsOjpJc0dlbmVyaWNWYWx1ZTxUPiA+KSwgKFZhbHVlVHlwZSYpKSBBZGRNZW1iZXIoVmFsdWVUeXBlJiBuYW1lLCBUIHZhbHVlLCBBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3IpIGNvbnN0IHsgdmFsdWVfLkFkZE1lbWJlcihuYW1lLCB2YWx1ZSwgYWxsb2NhdG9yKTsgcmV0dXJuICp0aGlzOyB9Ci0jaWYgUkFQSURKU09OX0hBU19DWFgxMV9SVkFMVUVfUkVGUwotICAgIEdlbmVyaWNPYmplY3QgQWRkTWVtYmVyKFZhbHVlVHlwZSYmIG5hbWUsIFZhbHVlVHlwZSYmIHZhbHVlLCBBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3IpIGNvbnN0IHsgdmFsdWVfLkFkZE1lbWJlcihuYW1lLCB2YWx1ZSwgYWxsb2NhdG9yKTsgcmV0dXJuICp0aGlzOyB9Ci0gICAgR2VuZXJpY09iamVjdCBBZGRNZW1iZXIoVmFsdWVUeXBlJiYgbmFtZSwgVmFsdWVUeXBlJiB2YWx1ZSwgQWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKSBjb25zdCB7IHZhbHVlXy5BZGRNZW1iZXIobmFtZSwgdmFsdWUsIGFsbG9jYXRvcik7IHJldHVybiAqdGhpczsgfQotICAgIEdlbmVyaWNPYmplY3QgQWRkTWVtYmVyKFZhbHVlVHlwZSYgbmFtZSwgVmFsdWVUeXBlJiYgdmFsdWUsIEFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgeyB2YWx1ZV8uQWRkTWVtYmVyKG5hbWUsIHZhbHVlLCBhbGxvY2F0b3IpOyByZXR1cm4gKnRoaXM7IH0KLSAgICBHZW5lcmljT2JqZWN0IEFkZE1lbWJlcihTdHJpbmdSZWZUeXBlIG5hbWUsIFZhbHVlVHlwZSYmIHZhbHVlLCBBbGxvY2F0b3JUeXBlJiBhbGxvY2F0b3IpIGNvbnN0IHsgdmFsdWVfLkFkZE1lbWJlcihuYW1lLCB2YWx1ZSwgYWxsb2NhdG9yKTsgcmV0dXJuICp0aGlzOyB9Ci0jZW5kaWYgLy8gUkFQSURKU09OX0hBU19DWFgxMV9SVkFMVUVfUkVGUwotICAgIEdlbmVyaWNPYmplY3QgQWRkTWVtYmVyKFN0cmluZ1JlZlR5cGUgbmFtZSwgVmFsdWVUeXBlJiB2YWx1ZSwgQWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKSBjb25zdCB7IHZhbHVlXy5BZGRNZW1iZXIobmFtZSwgdmFsdWUsIGFsbG9jYXRvcik7IHJldHVybiAqdGhpczsgfQotICAgIEdlbmVyaWNPYmplY3QgQWRkTWVtYmVyKFN0cmluZ1JlZlR5cGUgbmFtZSwgU3RyaW5nUmVmVHlwZSB2YWx1ZSwgQWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKSBjb25zdCB7IHZhbHVlXy5BZGRNZW1iZXIobmFtZSwgdmFsdWUsIGFsbG9jYXRvcik7IHJldHVybiAqdGhpczsgfQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBSQVBJREpTT05fRElTQUJMRUlGX1JFVFVSTigoaW50ZXJuYWw6Ok9yRXhwcjxpbnRlcm5hbDo6SXNQb2ludGVyPFQ+LCBpbnRlcm5hbDo6SXNHZW5lcmljVmFsdWU8VD4gPiksIChHZW5lcmljT2JqZWN0KSkgQWRkTWVtYmVyKFN0cmluZ1JlZlR5cGUgbmFtZSwgVCB2YWx1ZSwgQWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKSBjb25zdCB7IHZhbHVlXy5BZGRNZW1iZXIobmFtZSwgdmFsdWUsIGFsbG9jYXRvcik7IHJldHVybiAqdGhpczsgfQotICAgIHZvaWQgUmVtb3ZlQWxsTWVtYmVycygpIHsgcmV0dXJuIHZhbHVlXy5SZW1vdmVBbGxNZW1iZXJzKCk7IH0KLSAgICBib29sIFJlbW92ZU1lbWJlcihjb25zdCBDaCogbmFtZSkgY29uc3QgeyByZXR1cm4gdmFsdWVfLlJlbW92ZU1lbWJlcihuYW1lKTsgfQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi0gICAgYm9vbCBSZW1vdmVNZW1iZXIoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Q2g+JiBuYW1lKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uUmVtb3ZlTWVtYmVyKG5hbWUpOyB9Ci0jZW5kaWYKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlQWxsb2NhdG9yPiBib29sIFJlbW92ZU1lbWJlcihjb25zdCBHZW5lcmljVmFsdWU8RW5jb2RpbmdUeXBlLCBTb3VyY2VBbGxvY2F0b3I+JiBuYW1lKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uUmVtb3ZlTWVtYmVyKG5hbWUpOyB9Ci0gICAgTWVtYmVySXRlcmF0b3IgUmVtb3ZlTWVtYmVyKE1lbWJlckl0ZXJhdG9yIG0pIGNvbnN0IHsgcmV0dXJuIHZhbHVlXy5SZW1vdmVNZW1iZXIobSk7IH0KLSAgICBNZW1iZXJJdGVyYXRvciBFcmFzZU1lbWJlcihDb25zdE1lbWJlckl0ZXJhdG9yIHBvcykgY29uc3QgeyByZXR1cm4gdmFsdWVfLkVyYXNlTWVtYmVyKHBvcyk7IH0KLSAgICBNZW1iZXJJdGVyYXRvciBFcmFzZU1lbWJlcihDb25zdE1lbWJlckl0ZXJhdG9yIGZpcnN0LCBDb25zdE1lbWJlckl0ZXJhdG9yIGxhc3QpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXy5FcmFzZU1lbWJlcihmaXJzdCwgbGFzdCk7IH0KLSAgICBib29sIEVyYXNlTWVtYmVyKGNvbnN0IENoKiBuYW1lKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uRXJhc2VNZW1iZXIobmFtZSk7IH0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIGJvb2wgRXJhc2VNZW1iZXIoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Q2g+JiBuYW1lKSBjb25zdCB7IHJldHVybiBFcmFzZU1lbWJlcihWYWx1ZVR5cGUoU3RyaW5nUmVmKG5hbWUpKSk7IH0KLSNlbmRpZgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VBbGxvY2F0b3I+IGJvb2wgRXJhc2VNZW1iZXIoY29uc3QgR2VuZXJpY1ZhbHVlPEVuY29kaW5nVHlwZSwgU291cmNlQWxsb2NhdG9yPiYgbmFtZSkgY29uc3QgeyByZXR1cm4gdmFsdWVfLkVyYXNlTWVtYmVyKG5hbWUpOyB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX0NYWDExX1JBTkdFX0ZPUgotICAgIE1lbWJlckl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfLk1lbWJlckJlZ2luKCk7IH0KLSAgICBNZW1iZXJJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uTWVtYmVyRW5kKCk7IH0KLSNlbmRpZgotCi1wcml2YXRlOgotICAgIEdlbmVyaWNPYmplY3QoKTsKLSAgICBHZW5lcmljT2JqZWN0KFZhbHVlVHlwZSYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQotICAgIFZhbHVlVHlwZSYgdmFsdWVfOwotfTsKLQotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLQotI2lmZGVmIF9NU0NfVkVSCi1SQVBJREpTT05fRElBR19QT1AKLSNlbmRpZgotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QT1AKLSNlbmRpZgotCi0jaWZkZWYgX19HTlVDX18KLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLSNlbmRpZiAvLyBSQVBJREpTT05fRE9DVU1FTlRfSF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vZW5jb2RlZHN0cmVhbS5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9lbmNvZGVkc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDJlNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9lbmNvZGVkc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fRU5DT0RFRFNUUkVBTV9IXwotI2RlZmluZSBSQVBJREpTT05fRU5DT0RFRFNUUkVBTV9IXwotCi0jaW5jbHVkZSAic3RyZWFtLmgiCi0jaW5jbHVkZSAibWVtb3J5c3RyZWFtLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKGVmZmMrKykKLSNlbmRpZgotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QVVNICi1SQVBJREpTT05fRElBR19PRkYocGFkZGVkKQotI2VuZGlmCi0KLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLQotLy8hIElucHV0IGJ5dGUgc3RyZWFtIHdyYXBwZXIgd2l0aCBhIHN0YXRpY2FsbHkgYm91bmQgZW5jb2RpbmcuCi0vKiEKLSAgICBcdHBhcmFtIEVuY29kaW5nIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBlbmNvZGluZyBvZiB0aGUgc3RyZWFtLiBFaXRoZXIgVVRGOCwgVVRGMTZMRSwgVVRGMTZCRSwgVVRGMzJMRSwgVVRGMzJCRS4KLSAgICBcdHBhcmFtIElucHV0Qnl0ZVN0cmVhbSBUeXBlIG9mIGlucHV0IGJ5dGUgc3RyZWFtLiBGb3IgZXhhbXBsZSwgRmlsZVJlYWRTdHJlYW0uCi0qLwotdGVtcGxhdGUgPHR5cGVuYW1lIEVuY29kaW5nLCB0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW0+Ci1jbGFzcyBFbmNvZGVkSW5wdXRTdHJlYW0gewotICAgIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUKHNpemVvZih0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW06OkNoKSA9PSAxKTsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEVuY29kaW5nOjpDaCBDaDsKLQotICAgIEVuY29kZWRJbnB1dFN0cmVhbShJbnB1dEJ5dGVTdHJlYW0mIGlzKSA6IGlzXyhpcykgeyAKLSAgICAgICAgY3VycmVudF8gPSBFbmNvZGluZzo6VGFrZUJPTShpc18pOwotICAgIH0KLQotICAgIENoIFBlZWsoKSBjb25zdCB7IHJldHVybiBjdXJyZW50XzsgfQotICAgIENoIFRha2UoKSB7IENoIGMgPSBjdXJyZW50XzsgY3VycmVudF8gPSBFbmNvZGluZzo6VGFrZShpc18pOyByZXR1cm4gYzsgfQotICAgIHNpemVfdCBUZWxsKCkgY29uc3QgeyByZXR1cm4gaXNfLlRlbGwoKTsgfQotCi0gICAgLy8gTm90IGltcGxlbWVudGVkCi0gICAgdm9pZCBQdXQoQ2gpIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IH0KLSAgICB2b2lkIEZsdXNoKCkgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgfSAKLSAgICBDaCogUHV0QmVnaW4oKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDsgfQotICAgIHNpemVfdCBQdXRFbmQoQ2gqKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDsgfQotCi1wcml2YXRlOgotICAgIEVuY29kZWRJbnB1dFN0cmVhbShjb25zdCBFbmNvZGVkSW5wdXRTdHJlYW0mKTsKLSAgICBFbmNvZGVkSW5wdXRTdHJlYW0mIG9wZXJhdG9yPShjb25zdCBFbmNvZGVkSW5wdXRTdHJlYW0mKTsKLQotICAgIElucHV0Qnl0ZVN0cmVhbSYgaXNfOwotICAgIENoIGN1cnJlbnRfOwotfTsKLQotLy8hIFNwZWNpYWxpemVkIGZvciBVVEY4IE1lbW9yeVN0cmVhbS4KLXRlbXBsYXRlIDw+Ci1jbGFzcyBFbmNvZGVkSW5wdXRTdHJlYW08VVRGODw+LCBNZW1vcnlTdHJlYW0+IHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFVURjg8Pjo6Q2ggQ2g7Ci0KLSAgICBFbmNvZGVkSW5wdXRTdHJlYW0oTWVtb3J5U3RyZWFtJiBpcykgOiBpc18oaXMpIHsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGlzXy5QZWVrKCkpID09IDB4RUZ1KSBpc18uVGFrZSgpOwotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oaXNfLlBlZWsoKSkgPT0gMHhCQnUpIGlzXy5UYWtlKCk7Ci0gICAgICAgIGlmIChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihpc18uUGVlaygpKSA9PSAweEJGdSkgaXNfLlRha2UoKTsKLSAgICB9Ci0gICAgQ2ggUGVlaygpIGNvbnN0IHsgcmV0dXJuIGlzXy5QZWVrKCk7IH0KLSAgICBDaCBUYWtlKCkgeyByZXR1cm4gaXNfLlRha2UoKTsgfQotICAgIHNpemVfdCBUZWxsKCkgY29uc3QgeyByZXR1cm4gaXNfLlRlbGwoKTsgfQotCi0gICAgLy8gTm90IGltcGxlbWVudGVkCi0gICAgdm9pZCBQdXQoQ2gpIHt9Ci0gICAgdm9pZCBGbHVzaCgpIHt9IAotICAgIENoKiBQdXRCZWdpbigpIHsgcmV0dXJuIDA7IH0KLSAgICBzaXplX3QgUHV0RW5kKENoKikgeyByZXR1cm4gMDsgfQotCi0gICAgTWVtb3J5U3RyZWFtJiBpc187Ci19OwotCi0vLyEgT3V0cHV0IGJ5dGUgc3RyZWFtIHdyYXBwZXIgd2l0aCBzdGF0aWNhbGx5IGJvdW5kIGVuY29kaW5nLgotLyohCi0gICAgXHRwYXJhbSBFbmNvZGluZyBUaGUgaW50ZXJwcmV0YXRpb24gb2YgZW5jb2Rpbmcgb2YgdGhlIHN0cmVhbS4gRWl0aGVyIFVURjgsIFVURjE2TEUsIFVURjE2QkUsIFVURjMyTEUsIFVURjMyQkUuCi0gICAgXHRwYXJhbSBPdXRwdXRCeXRlU3RyZWFtIFR5cGUgb2YgaW5wdXQgYnl0ZSBzdHJlYW0uIEZvciBleGFtcGxlLCBGaWxlV3JpdGVTdHJlYW0uCi0qLwotdGVtcGxhdGUgPHR5cGVuYW1lIEVuY29kaW5nLCB0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtPgotY2xhc3MgRW5jb2RlZE91dHB1dFN0cmVhbSB7Ci0gICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoKSA9PSAxKTsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEVuY29kaW5nOjpDaCBDaDsKLQotICAgIEVuY29kZWRPdXRwdXRTdHJlYW0oT3V0cHV0Qnl0ZVN0cmVhbSYgb3MsIGJvb2wgcHV0Qk9NID0gdHJ1ZSkgOiBvc18ob3MpIHsgCi0gICAgICAgIGlmIChwdXRCT00pCi0gICAgICAgICAgICBFbmNvZGluZzo6UHV0Qk9NKG9zXyk7Ci0gICAgfQotCi0gICAgdm9pZCBQdXQoQ2ggYykgeyBFbmNvZGluZzo6UHV0KG9zXywgYyk7ICB9Ci0gICAgdm9pZCBGbHVzaCgpIHsgb3NfLkZsdXNoKCk7IH0KLQotICAgIC8vIE5vdCBpbXBsZW1lbnRlZAotICAgIENoIFBlZWsoKSBjb25zdCB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDt9Ci0gICAgQ2ggVGFrZSgpIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IHJldHVybiAwO30KLSAgICBzaXplX3QgVGVsbCgpIGNvbnN0IHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7ICByZXR1cm4gMDsgfQotICAgIENoKiBQdXRCZWdpbigpIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IHJldHVybiAwOyB9Ci0gICAgc2l6ZV90IFB1dEVuZChDaCopIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IHJldHVybiAwOyB9Ci0KLXByaXZhdGU6Ci0gICAgRW5jb2RlZE91dHB1dFN0cmVhbShjb25zdCBFbmNvZGVkT3V0cHV0U3RyZWFtJik7Ci0gICAgRW5jb2RlZE91dHB1dFN0cmVhbSYgb3BlcmF0b3I9KGNvbnN0IEVuY29kZWRPdXRwdXRTdHJlYW0mKTsKLQotICAgIE91dHB1dEJ5dGVTdHJlYW0mIG9zXzsKLX07Ci0KLSNkZWZpbmUgUkFQSURKU09OX0VOQ09ESU5HU19GVU5DKHgpIFVURjg8Q2g+Ojp4LCBVVEYxNkxFPENoPjo6eCwgVVRGMTZCRTxDaD46OngsIFVURjMyTEU8Q2g+Ojp4LCBVVEYzMkJFPENoPjo6eAotCi0vLyEgSW5wdXQgc3RyZWFtIHdyYXBwZXIgd2l0aCBkeW5hbWljYWxseSBib3VuZCBlbmNvZGluZyBhbmQgYXV0b21hdGljIGVuY29kaW5nIGRldGVjdGlvbi4KLS8qIQotICAgIFx0cGFyYW0gQ2hhclR5cGUgVHlwZSBvZiBjaGFyYWN0ZXIgZm9yIHJlYWRpbmcuCi0gICAgXHRwYXJhbSBJbnB1dEJ5dGVTdHJlYW0gdHlwZSBvZiBpbnB1dCBieXRlIHN0cmVhbSB0byBiZSB3cmFwcGVkLgotKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZSwgdHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtPgotY2xhc3MgQXV0b1VURklucHV0U3RyZWFtIHsKLSAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtOjpDaCkgPT0gMSk7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBDaGFyVHlwZSBDaDsKLQotICAgIC8vISBDb25zdHJ1Y3Rvci4KLSAgICAvKiEKLSAgICAgICAgXHBhcmFtIGlzIGlucHV0IHN0cmVhbSB0byBiZSB3cmFwcGVkLgotICAgICAgICBccGFyYW0gdHlwZSBVVEYgZW5jb2RpbmcgdHlwZSBpZiBpdCBpcyBub3QgZGV0ZWN0ZWQgZnJvbSB0aGUgc3RyZWFtLgotICAgICovCi0gICAgQXV0b1VURklucHV0U3RyZWFtKElucHV0Qnl0ZVN0cmVhbSYgaXMsIFVURlR5cGUgdHlwZSA9IGtVVEY4KSA6IGlzXygmaXMpLCB0eXBlXyh0eXBlKSwgaGFzQk9NXyhmYWxzZSkgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKHR5cGUgPj0ga1VURjggJiYgdHlwZSA8PSBrVVRGMzJCRSk7ICAgICAgICAKLSAgICAgICAgRGV0ZWN0VHlwZSgpOwotICAgICAgICBzdGF0aWMgY29uc3QgVGFrZUZ1bmMgZltdID0geyBSQVBJREpTT05fRU5DT0RJTkdTX0ZVTkMoVGFrZSkgfTsKLSAgICAgICAgdGFrZUZ1bmNfID0gZlt0eXBlX107Ci0gICAgICAgIGN1cnJlbnRfID0gdGFrZUZ1bmNfKCppc18pOwotICAgIH0KLQotICAgIFVURlR5cGUgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9Ci0gICAgYm9vbCBIYXNCT00oKSBjb25zdCB7IHJldHVybiBoYXNCT01fOyB9Ci0KLSAgICBDaCBQZWVrKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF87IH0KLSAgICBDaCBUYWtlKCkgeyBDaCBjID0gY3VycmVudF87IGN1cnJlbnRfID0gdGFrZUZ1bmNfKCppc18pOyByZXR1cm4gYzsgfQotICAgIHNpemVfdCBUZWxsKCkgY29uc3QgeyByZXR1cm4gaXNfLT5UZWxsKCk7IH0KLQotICAgIC8vIE5vdCBpbXBsZW1lbnRlZAotICAgIHZvaWQgUHV0KENoKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyB9Ci0gICAgdm9pZCBGbHVzaCgpIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IH0gCi0gICAgQ2gqIFB1dEJlZ2luKCkgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLSAgICBzaXplX3QgUHV0RW5kKENoKikgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLQotcHJpdmF0ZToKLSAgICBBdXRvVVRGSW5wdXRTdHJlYW0oY29uc3QgQXV0b1VURklucHV0U3RyZWFtJik7Ci0gICAgQXV0b1VURklucHV0U3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgQXV0b1VURklucHV0U3RyZWFtJik7Ci0KLSAgICAvLyBEZXRlY3QgZW5jb2RpbmcgdHlwZSB3aXRoIEJPTSBvciBSRkMgNDYyNwotICAgIHZvaWQgRGV0ZWN0VHlwZSgpIHsKLSAgICAgICAgLy8gQk9NIChCeXRlIE9yZGVyIE1hcmspOgotICAgICAgICAvLyAwMCAwMCBGRSBGRiAgVVRGLTMyQkUKLSAgICAgICAgLy8gRkYgRkUgMDAgMDAgIFVURi0zMkxFCi0gICAgICAgIC8vIEZFIEZGICAgICAgICBVVEYtMTZCRQotICAgICAgICAvLyBGRiBGRSAgICAgICAgVVRGLTE2TEUKLSAgICAgICAgLy8gRUYgQkIgQkYgICAgIFVURi04Ci0KLSAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPihpc18tPlBlZWs0KCkpOwotICAgICAgICBpZiAoIWMpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgdW5zaWduZWQgYm9tID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGNbMF0gfCAoY1sxXSA8PCA4KSB8IChjWzJdIDw8IDE2KSB8IChjWzNdIDw8IDI0KSk7Ci0gICAgICAgIGhhc0JPTV8gPSBmYWxzZTsKLSAgICAgICAgaWYgKGJvbSA9PSAweEZGRkUwMDAwKSAgICAgICAgICAgICAgICAgIHsgdHlwZV8gPSBrVVRGMzJCRTsgaGFzQk9NXyA9IHRydWU7IGlzXy0+VGFrZSgpOyBpc18tPlRha2UoKTsgaXNfLT5UYWtlKCk7IGlzXy0+VGFrZSgpOyB9Ci0gICAgICAgIGVsc2UgaWYgKGJvbSA9PSAweDAwMDBGRUZGKSAgICAgICAgICAgICB7IHR5cGVfID0ga1VURjMyTEU7IGhhc0JPTV8gPSB0cnVlOyBpc18tPlRha2UoKTsgaXNfLT5UYWtlKCk7IGlzXy0+VGFrZSgpOyBpc18tPlRha2UoKTsgfQotICAgICAgICBlbHNlIGlmICgoYm9tICYgMHhGRkZGKSA9PSAweEZGRkUpICAgICAgeyB0eXBlXyA9IGtVVEYxNkJFOyBoYXNCT01fID0gdHJ1ZTsgaXNfLT5UYWtlKCk7IGlzXy0+VGFrZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKGJvbSAmIDB4RkZGRikgPT0gMHhGRUZGKSAgICAgIHsgdHlwZV8gPSBrVVRGMTZMRTsgaGFzQk9NXyA9IHRydWU7IGlzXy0+VGFrZSgpOyBpc18tPlRha2UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChib20gJiAweEZGRkZGRikgPT0gMHhCRkJCRUYpICB7IHR5cGVfID0ga1VURjg7ICAgIGhhc0JPTV8gPSB0cnVlOyBpc18tPlRha2UoKTsgaXNfLT5UYWtlKCk7IGlzXy0+VGFrZSgpOyAgICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIFJGQyA0NjI3OiBTZWN0aW9uIDMKLSAgICAgICAgLy8gIlNpbmNlIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBvZiBhIEpTT04gdGV4dCB3aWxsIGFsd2F5cyBiZSBBU0NJSQotICAgICAgICAvLyBjaGFyYWN0ZXJzIFtSRkMwMDIwXSwgaXQgaXMgcG9zc2libGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gb2N0ZXQKLSAgICAgICAgLy8gc3RyZWFtIGlzIFVURi04LCBVVEYtMTYgKEJFIG9yIExFKSwgb3IgVVRGLTMyIChCRSBvciBMRSkgYnkgbG9va2luZwotICAgICAgICAvLyBhdCB0aGUgcGF0dGVybiBvZiBudWxscyBpbiB0aGUgZmlyc3QgZm91ciBvY3RldHMuIgotICAgICAgICAvLyAwMCAwMCAwMCB4eCAgVVRGLTMyQkUKLSAgICAgICAgLy8gMDAgeHggMDAgeHggIFVURi0xNkJFCi0gICAgICAgIC8vIHh4IDAwIDAwIDAwICBVVEYtMzJMRQotICAgICAgICAvLyB4eCAwMCB4eCAwMCAgVVRGLTE2TEUKLSAgICAgICAgLy8geHggeHggeHggeHggIFVURi04Ci0KLSAgICAgICAgaWYgKCFoYXNCT01fKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBwYXR0ZXJuID0gKGNbMF0gPyAxIDogMCkgfCAoY1sxXSA/IDIgOiAwKSB8IChjWzJdID8gNCA6IDApIHwgKGNbM10gPyA4IDogMCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKHBhdHRlcm4pIHsKLSAgICAgICAgICAgIGNhc2UgMHgwODogdHlwZV8gPSBrVVRGMzJCRTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4MEE6IHR5cGVfID0ga1VURjE2QkU7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweDAxOiB0eXBlXyA9IGtVVEYzMkxFOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMHgwNTogdHlwZV8gPSBrVVRGMTZMRTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4MEY6IHR5cGVfID0ga1VURjg7ICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7IC8vIFVzZSB0eXBlIGRlZmluZWQgYnkgdXNlci4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1bnRpbWUgY2hlY2sgd2hldGhlciB0aGUgc2l6ZSBvZiBjaGFyYWN0ZXIgdHlwZSBpcyBzdWZmaWNpZW50LiBJdCBvbmx5IHBlcmZvcm0gY2hlY2tzIHdpdGggYXNzZXJ0aW9uLgotICAgICAgICBpZiAodHlwZV8gPT0ga1VURjE2TEUgfHwgdHlwZV8gPT0ga1VURjE2QkUpIFJBUElESlNPTl9BU1NFUlQoc2l6ZW9mKENoKSA+PSAyKTsKLSAgICAgICAgaWYgKHR5cGVfID09IGtVVEYzMkxFIHx8IHR5cGVfID09IGtVVEYzMkJFKSBSQVBJREpTT05fQVNTRVJUKHNpemVvZihDaCkgPj0gNCk7Ci0gICAgfQotCi0gICAgdHlwZWRlZiBDaCAoKlRha2VGdW5jKShJbnB1dEJ5dGVTdHJlYW0mIGlzKTsKLSAgICBJbnB1dEJ5dGVTdHJlYW0qIGlzXzsKLSAgICBVVEZUeXBlIHR5cGVfOwotICAgIENoIGN1cnJlbnRfOwotICAgIFRha2VGdW5jIHRha2VGdW5jXzsKLSAgICBib29sIGhhc0JPTV87Ci19OwotCi0vLyEgT3V0cHV0IHN0cmVhbSB3cmFwcGVyIHdpdGggZHluYW1pY2FsbHkgYm91bmQgZW5jb2RpbmcgYW5kIGF1dG9tYXRpYyBlbmNvZGluZyBkZXRlY3Rpb24uCi0vKiEKLSAgICBcdHBhcmFtIENoYXJUeXBlIFR5cGUgb2YgY2hhcmFjdGVyIGZvciB3cml0aW5nLgotICAgIFx0cGFyYW0gT3V0cHV0Qnl0ZVN0cmVhbSB0eXBlIG9mIG91dHB1dCBieXRlIHN0cmVhbSB0byBiZSB3cmFwcGVkLgotKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZSwgdHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbT4KLWNsYXNzIEF1dG9VVEZPdXRwdXRTdHJlYW0gewotICAgIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUKHNpemVvZih0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaCkgPT0gMSk7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBDaGFyVHlwZSBDaDsKLQotICAgIC8vISBDb25zdHJ1Y3Rvci4KLSAgICAvKiEKLSAgICAgICAgXHBhcmFtIG9zIG91dHB1dCBzdHJlYW0gdG8gYmUgd3JhcHBlZC4KLSAgICAgICAgXHBhcmFtIHR5cGUgVVRGIGVuY29kaW5nIHR5cGUuCi0gICAgICAgIFxwYXJhbSBwdXRCT00gV2hldGhlciB0byB3cml0ZSBCT00gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLgotICAgICovCi0gICAgQXV0b1VURk91dHB1dFN0cmVhbShPdXRwdXRCeXRlU3RyZWFtJiBvcywgVVRGVHlwZSB0eXBlLCBib29sIHB1dEJPTSkgOiBvc18oJm9zKSwgdHlwZV8odHlwZSkgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKHR5cGUgPj0ga1VURjggJiYgdHlwZSA8PSBrVVRGMzJCRSk7Ci0KLSAgICAgICAgLy8gUnVudGltZSBjaGVjayB3aGV0aGVyIHRoZSBzaXplIG9mIGNoYXJhY3RlciB0eXBlIGlzIHN1ZmZpY2llbnQuIEl0IG9ubHkgcGVyZm9ybSBjaGVja3Mgd2l0aCBhc3NlcnRpb24uCi0gICAgICAgIGlmICh0eXBlXyA9PSBrVVRGMTZMRSB8fCB0eXBlXyA9PSBrVVRGMTZCRSkgUkFQSURKU09OX0FTU0VSVChzaXplb2YoQ2gpID49IDIpOwotICAgICAgICBpZiAodHlwZV8gPT0ga1VURjMyTEUgfHwgdHlwZV8gPT0ga1VURjMyQkUpIFJBUElESlNPTl9BU1NFUlQoc2l6ZW9mKENoKSA+PSA0KTsKLQotICAgICAgICBzdGF0aWMgY29uc3QgUHV0RnVuYyBmW10gPSB7IFJBUElESlNPTl9FTkNPRElOR1NfRlVOQyhQdXQpIH07Ci0gICAgICAgIHB1dEZ1bmNfID0gZlt0eXBlX107Ci0KLSAgICAgICAgaWYgKHB1dEJPTSkKLSAgICAgICAgICAgIFB1dEJPTSgpOwotICAgIH0KLQotICAgIFVURlR5cGUgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9Ci0KLSAgICB2b2lkIFB1dChDaCBjKSB7IHB1dEZ1bmNfKCpvc18sIGMpOyB9Ci0gICAgdm9pZCBGbHVzaCgpIHsgb3NfLT5GbHVzaCgpOyB9IAotCi0gICAgLy8gTm90IGltcGxlbWVudGVkCi0gICAgQ2ggUGVlaygpIGNvbnN0IHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IHJldHVybiAwO30KLSAgICBDaCBUYWtlKCkgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7fQotICAgIHNpemVfdCBUZWxsKCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLSAgICBDaCogUHV0QmVnaW4oKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDsgfQotICAgIHNpemVfdCBQdXRFbmQoQ2gqKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDsgfQotCi1wcml2YXRlOgotICAgIEF1dG9VVEZPdXRwdXRTdHJlYW0oY29uc3QgQXV0b1VURk91dHB1dFN0cmVhbSYpOwotICAgIEF1dG9VVEZPdXRwdXRTdHJlYW0mIG9wZXJhdG9yPShjb25zdCBBdXRvVVRGT3V0cHV0U3RyZWFtJik7Ci0KLSAgICB2b2lkIFB1dEJPTSgpIHsgCi0gICAgICAgIHR5cGVkZWYgdm9pZCAoKlB1dEJPTUZ1bmMpKE91dHB1dEJ5dGVTdHJlYW0mKTsKLSAgICAgICAgc3RhdGljIGNvbnN0IFB1dEJPTUZ1bmMgZltdID0geyBSQVBJREpTT05fRU5DT0RJTkdTX0ZVTkMoUHV0Qk9NKSB9OwotICAgICAgICBmW3R5cGVfXSgqb3NfKTsKLSAgICB9Ci0KLSAgICB0eXBlZGVmIHZvaWQgKCpQdXRGdW5jKShPdXRwdXRCeXRlU3RyZWFtJiwgQ2gpOwotCi0gICAgT3V0cHV0Qnl0ZVN0cmVhbSogb3NfOwotICAgIFVURlR5cGUgdHlwZV87Ci0gICAgUHV0RnVuYyBwdXRGdW5jXzsKLX07Ci0KLSN1bmRlZiBSQVBJREpTT05fRU5DT0RJTkdTX0ZVTkMKLQotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUE9QCi0jZW5kaWYKLQotI2lmZGVmIF9fR05VQ19fCi1SQVBJREpTT05fRElBR19QT1AKLSNlbmRpZgotCi0jZW5kaWYgLy8gUkFQSURKU09OX0ZJTEVTVFJFQU1fSF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vZW5jb2RpbmdzLmggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2VuY29kaW5ncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZjOTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vZW5jb2RpbmdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MTIgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fRU5DT0RJTkdTX0hfCi0jZGVmaW5lIFJBUElESlNPTl9FTkNPRElOR1NfSF8KLQotI2luY2x1ZGUgInJhcGlkanNvbi5oIgotCi0jaWZkZWYgX01TQ19WRVIKLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRig0MjQ0KSAvLyBjb252ZXJzaW9uIGZyb20gJ3R5cGUxJyB0byAndHlwZTInLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEKLVJBUElESlNPTl9ESUFHX09GRig0NzAyKSAgLy8gdW5yZWFjaGFibGUgY29kZQotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRihlZmZjKyspCi1SQVBJREpTT05fRElBR19PRkYob3ZlcmZsb3cpCi0jZW5kaWYKLQotUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBFbmNvZGluZwotCi0vKiEgXGNsYXNzIHJhcGlkanNvbjo6RW5jb2RpbmcKLSAgICBcYnJpZWYgQ29uY2VwdCBmb3IgZW5jb2Rpbmcgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLgotCi1cY29kZQotY29uY2VwdCBFbmNvZGluZyB7Ci0gICAgdHlwZW5hbWUgQ2g7ICAgIC8vISBUeXBlIG9mIGNoYXJhY3Rlci4gQSAiY2hhcmFjdGVyIiBpcyBhY3R1YWxseSBhIGNvZGUgdW5pdCBpbiB1bmljb2RlJ3MgZGVmaW5pdGlvbi4KLQotICAgIGVudW0geyBzdXBwb3J0VW5pY29kZSA9IDEgfTsgLy8gb3IgMCBpZiBub3Qgc3VwcG9ydGluZyB1bmljb2RlCi0KLSAgICAvLyEgXGJyaWVmIEVuY29kZSBhIFVuaWNvZGUgY29kZXBvaW50IHRvIGFuIG91dHB1dCBzdHJlYW0uCi0gICAgLy8hIFxwYXJhbSBvcyBPdXRwdXQgc3RyZWFtLgotICAgIC8vISBccGFyYW0gY29kZXBvaW50IEFuIHVuaWNvZGUgY29kZXBvaW50LCByYW5naW5nIGZyb20gMHgwIHRvIDB4MTBGRkZGIGluY2x1c2l2ZWx5LgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIE91dHB1dFN0cmVhbT4KLSAgICBzdGF0aWMgdm9pZCBFbmNvZGUoT3V0cHV0U3RyZWFtJiBvcywgdW5zaWduZWQgY29kZXBvaW50KTsKLQotICAgIC8vISBcYnJpZWYgRGVjb2RlIGEgVW5pY29kZSBjb2RlcG9pbnQgZnJvbSBhbiBpbnB1dCBzdHJlYW0uCi0gICAgLy8hIFxwYXJhbSBpcyBJbnB1dCBzdHJlYW0uCi0gICAgLy8hIFxwYXJhbSBjb2RlcG9pbnQgT3V0cHV0IG9mIHRoZSB1bmljb2RlIGNvZGVwb2ludC4KLSAgICAvLyEgXHJldHVybiB0cnVlIGlmIGEgdmFsaWQgY29kZXBvaW50IGNhbiBiZSBkZWNvZGVkIGZyb20gdGhlIHN0cmVhbS4KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRTdHJlYW0+Ci0gICAgc3RhdGljIGJvb2wgRGVjb2RlKElucHV0U3RyZWFtJiBpcywgdW5zaWduZWQqIGNvZGVwb2ludCk7Ci0KLSAgICAvLyEgXGJyaWVmIFZhbGlkYXRlIG9uZSBVbmljb2RlIGNvZGVwb2ludCBmcm9tIGFuIGVuY29kZWQgc3RyZWFtLgotICAgIC8vISBccGFyYW0gaXMgSW5wdXQgc3RyZWFtIHRvIG9idGFpbiBjb2RlcG9pbnQuCi0gICAgLy8hIFxwYXJhbSBvcyBPdXRwdXQgZm9yIGNvcHlpbmcgb25lIGNvZGVwb2ludC4KLSAgICAvLyEgXHJldHVybiB0cnVlIGlmIGl0IGlzIHZhbGlkLgotICAgIC8vISBcbm90ZSBUaGlzIGZ1bmN0aW9uIGp1c3QgdmFsaWRhdGluZyBhbmQgY29weWluZyB0aGUgY29kZXBvaW50IHdpdGhvdXQgYWN0dWFsbHkgZGVjb2RlIGl0LgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgT3V0cHV0U3RyZWFtPgotICAgIHN0YXRpYyBib29sIFZhbGlkYXRlKElucHV0U3RyZWFtJiBpcywgT3V0cHV0U3RyZWFtJiBvcyk7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZGVhbCB3aXRoIGJ5dGUgc3RyZWFtcy4KLQotICAgIC8vISBUYWtlIGEgY2hhcmFjdGVyIGZyb20gaW5wdXQgYnl0ZSBzdHJlYW0sIHNraXAgQk9NIGlmIGV4aXN0LgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW0+Ci0gICAgc3RhdGljIENoYXJUeXBlIFRha2VCT00oSW5wdXRCeXRlU3RyZWFtJiBpcyk7Ci0KLSAgICAvLyEgVGFrZSBhIGNoYXJhY3RlciBmcm9tIGlucHV0IGJ5dGUgc3RyZWFtLgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW0+Ci0gICAgc3RhdGljIENoIFRha2UoSW5wdXRCeXRlU3RyZWFtJiBpcyk7Ci0KLSAgICAvLyEgUHV0IEJPTSB0byBvdXRwdXQgYnl0ZSBzdHJlYW0uCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW0+Ci0gICAgc3RhdGljIHZvaWQgUHV0Qk9NKE91dHB1dEJ5dGVTdHJlYW0mIG9zKTsKLQotICAgIC8vISBQdXQgYSBjaGFyYWN0ZXIgdG8gb3V0cHV0IGJ5dGUgc3RyZWFtLgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyB2b2lkIFB1dChPdXRwdXRCeXRlU3RyZWFtJiBvcywgQ2ggYyk7Ci19OwotXGVuZGNvZGUKLSovCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFVURjgKLQotLy8hIFVURi04IGVuY29kaW5nLgotLyohIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTgKLSAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNjI5Ci0gICAgXHRwYXJhbSBDaGFyVHlwZSBDb2RlIHVuaXQgZm9yIHN0b3JpbmcgOC1iaXQgVVRGLTggZGF0YS4gRGVmYXVsdCBpcyBjaGFyLgotICAgIFxub3RlIGltcGxlbWVudHMgRW5jb2RpbmcgY29uY2VwdAotKi8KLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlID0gY2hhcj4KLXN0cnVjdCBVVEY4IHsKLSAgICB0eXBlZGVmIENoYXJUeXBlIENoOwotCi0gICAgZW51bSB7IHN1cHBvcnRVbmljb2RlID0gMSB9OwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgT3V0cHV0U3RyZWFtPgotICAgIHN0YXRpYyB2b2lkIEVuY29kZShPdXRwdXRTdHJlYW0mIG9zLCB1bnNpZ25lZCBjb2RlcG9pbnQpIHsKLSAgICAgICAgaWYgKGNvZGVwb2ludCA8PSAweDdGKSAKLSAgICAgICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDxDaD4oY29kZXBvaW50ICYgMHhGRikpOwotICAgICAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHg3RkYpIHsKLSAgICAgICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDxDaD4oMHhDMCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHhGRikpKTsKLSAgICAgICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDxDaD4oMHg4MCB8ICgoY29kZXBvaW50ICYgMHgzRikpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4RkZGRikgewotICAgICAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PENoPigweEUwIHwgKChjb2RlcG9pbnQgPj4gMTIpICYgMHhGRikpKTsKLSAgICAgICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDxDaD4oMHg4MCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgzRikpKTsKLSAgICAgICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDxDaD4oMHg4MCB8IChjb2RlcG9pbnQgJiAweDNGKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgUkFQSURKU09OX0FTU0VSVChjb2RlcG9pbnQgPD0gMHgxMEZGRkYpOwotICAgICAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PENoPigweEYwIHwgKChjb2RlcG9pbnQgPj4gMTgpICYgMHhGRikpKTsKLSAgICAgICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDxDaD4oMHg4MCB8ICgoY29kZXBvaW50ID4+IDEyKSAmIDB4M0YpKSk7Ci0gICAgICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8Q2g+KDB4ODAgfCAoKGNvZGVwb2ludCA+PiA2KSAmIDB4M0YpKSk7Ci0gICAgICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8Q2g+KDB4ODAgfCAoY29kZXBvaW50ICYgMHgzRikpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIE91dHB1dFN0cmVhbT4KLSAgICBzdGF0aWMgdm9pZCBFbmNvZGVVbnNhZmUoT3V0cHV0U3RyZWFtJiBvcywgdW5zaWduZWQgY29kZXBvaW50KSB7Ci0gICAgICAgIGlmIChjb2RlcG9pbnQgPD0gMHg3RikgCi0gICAgICAgICAgICBQdXRVbnNhZmUob3MsIHN0YXRpY19jYXN0PENoPihjb2RlcG9pbnQgJiAweEZGKSk7Ci0gICAgICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweDdGRikgewotICAgICAgICAgICAgUHV0VW5zYWZlKG9zLCBzdGF0aWNfY2FzdDxDaD4oMHhDMCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHhGRikpKTsKLSAgICAgICAgICAgIFB1dFVuc2FmZShvcywgc3RhdGljX2Nhc3Q8Q2g+KDB4ODAgfCAoKGNvZGVwb2ludCAmIDB4M0YpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweEZGRkYpIHsKLSAgICAgICAgICAgIFB1dFVuc2FmZShvcywgc3RhdGljX2Nhc3Q8Q2g+KDB4RTAgfCAoKGNvZGVwb2ludCA+PiAxMikgJiAweEZGKSkpOwotICAgICAgICAgICAgUHV0VW5zYWZlKG9zLCBzdGF0aWNfY2FzdDxDaD4oMHg4MCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgzRikpKTsKLSAgICAgICAgICAgIFB1dFVuc2FmZShvcywgc3RhdGljX2Nhc3Q8Q2g+KDB4ODAgfCAoY29kZXBvaW50ICYgMHgzRikpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFJBUElESlNPTl9BU1NFUlQoY29kZXBvaW50IDw9IDB4MTBGRkZGKTsKLSAgICAgICAgICAgIFB1dFVuc2FmZShvcywgc3RhdGljX2Nhc3Q8Q2g+KDB4RjAgfCAoKGNvZGVwb2ludCA+PiAxOCkgJiAweEZGKSkpOwotICAgICAgICAgICAgUHV0VW5zYWZlKG9zLCBzdGF0aWNfY2FzdDxDaD4oMHg4MCB8ICgoY29kZXBvaW50ID4+IDEyKSAmIDB4M0YpKSk7Ci0gICAgICAgICAgICBQdXRVbnNhZmUob3MsIHN0YXRpY19jYXN0PENoPigweDgwIHwgKChjb2RlcG9pbnQgPj4gNikgJiAweDNGKSkpOwotICAgICAgICAgICAgUHV0VW5zYWZlKG9zLCBzdGF0aWNfY2FzdDxDaD4oMHg4MCB8IChjb2RlcG9pbnQgJiAweDNGKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtPgotICAgIHN0YXRpYyBib29sIERlY29kZShJbnB1dFN0cmVhbSYgaXMsIHVuc2lnbmVkKiBjb2RlcG9pbnQpIHsKLSNkZWZpbmUgQ09QWSgpIGMgPSBpcy5UYWtlKCk7ICpjb2RlcG9pbnQgPSAoKmNvZGVwb2ludCA8PCA2KSB8IChzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSAmIDB4M0Z1KQotI2RlZmluZSBUUkFOUyhtYXNrKSByZXN1bHQgJj0gKChHZXRSYW5nZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSkgJiBtYXNrKSAhPSAwKQotI2RlZmluZSBUQUlMKCkgQ09QWSgpOyBUUkFOUygweDcwKQotICAgICAgICB0eXBlbmFtZSBJbnB1dFN0cmVhbTo6Q2ggYyA9IGlzLlRha2UoKTsKLSAgICAgICAgaWYgKCEoYyAmIDB4ODApKSB7Ci0gICAgICAgICAgICAqY29kZXBvaW50ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZSA9IEdldFJhbmdlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpKTsKLSAgICAgICAgKmNvZGVwb2ludCA9ICgweEZGID4+IHR5cGUpICYgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYyk7Ci0gICAgICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgMjogVEFJTCgpOyByZXR1cm4gcmVzdWx0OwotICAgICAgICBjYXNlIDM6IFRBSUwoKTsgVEFJTCgpOyByZXR1cm4gcmVzdWx0OwotICAgICAgICBjYXNlIDQ6IENPUFkoKTsgVFJBTlMoMHg1MCk7IFRBSUwoKTsgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgY2FzZSA1OiBDT1BZKCk7IFRSQU5TKDB4MTApOyBUQUlMKCk7IFRBSUwoKTsgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgY2FzZSA2OiBUQUlMKCk7IFRBSUwoKTsgVEFJTCgpOyByZXR1cm4gcmVzdWx0OwotICAgICAgICBjYXNlIDEwOiBDT1BZKCk7IFRSQU5TKDB4MjApOyBUQUlMKCk7IHJldHVybiByZXN1bHQ7Ci0gICAgICAgIGNhc2UgMTE6IENPUFkoKTsgVFJBTlMoMHg2MCk7IFRBSUwoKTsgVEFJTCgpOyByZXR1cm4gcmVzdWx0OwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSN1bmRlZiBDT1BZCi0jdW5kZWYgVFJBTlMKLSN1bmRlZiBUQUlMCi0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgc3RhdGljIGJvb2wgVmFsaWRhdGUoSW5wdXRTdHJlYW0mIGlzLCBPdXRwdXRTdHJlYW0mIG9zKSB7Ci0jZGVmaW5lIENPUFkoKSBvcy5QdXQoYyA9IGlzLlRha2UoKSkKLSNkZWZpbmUgVFJBTlMobWFzaykgcmVzdWx0ICY9ICgoR2V0UmFuZ2Uoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYykpICYgbWFzaykgIT0gMCkKLSNkZWZpbmUgVEFJTCgpIENPUFkoKTsgVFJBTlMoMHg3MCkKLSAgICAgICAgQ2ggYzsKLSAgICAgICAgQ09QWSgpOwotICAgICAgICBpZiAoIShjICYgMHg4MCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBib29sIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIHN3aXRjaCAoR2V0UmFuZ2Uoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYykpKSB7Ci0gICAgICAgIGNhc2UgMjogVEFJTCgpOyByZXR1cm4gcmVzdWx0OwotICAgICAgICBjYXNlIDM6IFRBSUwoKTsgVEFJTCgpOyByZXR1cm4gcmVzdWx0OwotICAgICAgICBjYXNlIDQ6IENPUFkoKTsgVFJBTlMoMHg1MCk7IFRBSUwoKTsgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgY2FzZSA1OiBDT1BZKCk7IFRSQU5TKDB4MTApOyBUQUlMKCk7IFRBSUwoKTsgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgY2FzZSA2OiBUQUlMKCk7IFRBSUwoKTsgVEFJTCgpOyByZXR1cm4gcmVzdWx0OwotICAgICAgICBjYXNlIDEwOiBDT1BZKCk7IFRSQU5TKDB4MjApOyBUQUlMKCk7IHJldHVybiByZXN1bHQ7Ci0gICAgICAgIGNhc2UgMTE6IENPUFkoKTsgVFJBTlMoMHg2MCk7IFRBSUwoKTsgVEFJTCgpOyByZXR1cm4gcmVzdWx0OwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSN1bmRlZiBDT1BZCi0jdW5kZWYgVFJBTlMKLSN1bmRlZiBUQUlMCi0gICAgfQotCi0gICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgR2V0UmFuZ2UodW5zaWduZWQgY2hhciBjKSB7Ci0gICAgICAgIC8vIFJlZmVycmluZyB0byBERkEgb2YgaHR0cDovL2Jqb2Vybi5ob2Vocm1hbm4uZGUvdXRmLTgvZGVjb2Rlci9kZmEvCi0gICAgICAgIC8vIFdpdGggbmV3IG1hcHBpbmcgMSAtPiAweDEwLCA3IC0+IDB4MjAsIDkgLT4gMHg0MCwgc3VjaCB0aGF0IEFORCBvcGVyYXRpb24gY2FuIHRlc3QgbXVsdGlwbGUgdHlwZXMuCi0gICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHR5cGVbXSA9IHsKLSAgICAgICAgICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgICAgICAgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgICAgICAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAgICAgICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgICAgICAgICAgMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwweDEwLDB4MTAsMHgxMCwKLSAgICAgICAgICAgIDB4NDAsMHg0MCwweDQwLDB4NDAsMHg0MCwweDQwLDB4NDAsMHg0MCwweDQwLDB4NDAsMHg0MCwweDQwLDB4NDAsMHg0MCwweDQwLDB4NDAsCi0gICAgICAgICAgICAweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLAotICAgICAgICAgICAgMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjAsMHgyMCwKLSAgICAgICAgICAgIDgsOCwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsICAyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAotICAgICAgICAgICAgMTAsMywzLDMsMywzLDMsMywzLDMsMywzLDMsNCwzLDMsIDExLDYsNiw2LDUsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LAotICAgICAgICB9OwotICAgICAgICByZXR1cm4gdHlwZVtjXTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyBDaGFyVHlwZSBUYWtlQk9NKElucHV0Qnl0ZVN0cmVhbSYgaXMpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIElucHV0Qnl0ZVN0cmVhbTo6Q2gpID09IDEpOwotICAgICAgICB0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW06OkNoIGMgPSBUYWtlKGlzKTsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpICE9IDB4RUZ1KSByZXR1cm4gYzsKLSAgICAgICAgYyA9IGlzLlRha2UoKTsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpICE9IDB4QkJ1KSByZXR1cm4gYzsKLSAgICAgICAgYyA9IGlzLlRha2UoKTsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpICE9IDB4QkZ1KSByZXR1cm4gYzsKLSAgICAgICAgYyA9IGlzLlRha2UoKTsKLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0Qnl0ZVN0cmVhbT4KLSAgICBzdGF0aWMgQ2ggVGFrZShJbnB1dEJ5dGVTdHJlYW0mIGlzKSB7Ci0gICAgICAgIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUKHNpemVvZih0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW06OkNoKSA9PSAxKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENoPihpcy5UYWtlKCkpOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyB2b2lkIFB1dEJPTShPdXRwdXRCeXRlU3RyZWFtJiBvcykgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2gpID09IDEpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KDB4RUZ1KSk7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaD4oMHhCQnUpKTsKLSAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoPigweEJGdSkpOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyB2b2lkIFB1dChPdXRwdXRCeXRlU3RyZWFtJiBvcywgQ2ggYykgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2gpID09IDEpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KGMpKTsKLSAgICB9Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBVVEYxNgotCi0vLyEgVVRGLTE2IGVuY29kaW5nLgotLyohIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2Ci0gICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjc4MQotICAgIFx0cGFyYW0gQ2hhclR5cGUgVHlwZSBmb3Igc3RvcmluZyAxNi1iaXQgVVRGLTE2IGRhdGEuIERlZmF1bHQgaXMgd2NoYXJfdC4gQysrMTEgbWF5IHVzZSBjaGFyMTZfdCBpbnN0ZWFkLgotICAgIFxub3RlIGltcGxlbWVudHMgRW5jb2RpbmcgY29uY2VwdAotCi0gICAgXG5vdGUgRm9yIGluLW1lbW9yeSBhY2Nlc3MsIG5vIG5lZWQgdG8gY29uY2VybiBlbmRpYW5uZXNzLiBUaGUgY29kZSB1bml0cyBhbmQgY29kZSBwb2ludHMgYXJlIHJlcHJlc2VudGVkIGJ5IENQVSdzIGVuZGlhbm5lc3MuCi0gICAgRm9yIHN0cmVhbWluZywgdXNlIFVURjE2TEUgYW5kIFVURjE2QkUsIHdoaWNoIGhhbmRsZSBlbmRpYW5uZXNzLgotKi8KLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlID0gd2NoYXJfdD4KLXN0cnVjdCBVVEYxNiB7Ci0gICAgdHlwZWRlZiBDaGFyVHlwZSBDaDsKLSAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YoQ2gpID49IDIpOwotCi0gICAgZW51bSB7IHN1cHBvcnRVbmljb2RlID0gMSB9OwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgT3V0cHV0U3RyZWFtPgotICAgIHN0YXRpYyB2b2lkIEVuY29kZShPdXRwdXRTdHJlYW0mIG9zLCB1bnNpZ25lZCBjb2RlcG9pbnQpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIE91dHB1dFN0cmVhbTo6Q2gpID49IDIpOwotICAgICAgICBpZiAoY29kZXBvaW50IDw9IDB4RkZGRikgewotICAgICAgICAgICAgUkFQSURKU09OX0FTU0VSVChjb2RlcG9pbnQgPCAweEQ4MDAgfHwgY29kZXBvaW50ID4gMHhERkZGKTsgLy8gQ29kZSBwb2ludCBpdHNlbGYgY2Fubm90IGJlIHN1cnJvZ2F0ZSBwYWlyIAotICAgICAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dFN0cmVhbTo6Q2g+KGNvZGVwb2ludCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgUkFQSURKU09OX0FTU0VSVChjb2RlcG9pbnQgPD0gMHgxMEZGRkYpOwotICAgICAgICAgICAgdW5zaWduZWQgdiA9IGNvZGVwb2ludCAtIDB4MTAwMDA7Ci0gICAgICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0U3RyZWFtOjpDaD4oKHYgPj4gMTApIHwgMHhEODAwKSk7Ci0gICAgICAgICAgICBvcy5QdXQoKHYgJiAweDNGRikgfCAweERDMDApOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgc3RhdGljIHZvaWQgRW5jb2RlVW5zYWZlKE91dHB1dFN0cmVhbSYgb3MsIHVuc2lnbmVkIGNvZGVwb2ludCkgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgT3V0cHV0U3RyZWFtOjpDaCkgPj0gMik7Ci0gICAgICAgIGlmIChjb2RlcG9pbnQgPD0gMHhGRkZGKSB7Ci0gICAgICAgICAgICBSQVBJREpTT05fQVNTRVJUKGNvZGVwb2ludCA8IDB4RDgwMCB8fCBjb2RlcG9pbnQgPiAweERGRkYpOyAvLyBDb2RlIHBvaW50IGl0c2VsZiBjYW5ub3QgYmUgc3Vycm9nYXRlIHBhaXIgCi0gICAgICAgICAgICBQdXRVbnNhZmUob3MsIHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dFN0cmVhbTo6Q2g+KGNvZGVwb2ludCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgUkFQSURKU09OX0FTU0VSVChjb2RlcG9pbnQgPD0gMHgxMEZGRkYpOwotICAgICAgICAgICAgdW5zaWduZWQgdiA9IGNvZGVwb2ludCAtIDB4MTAwMDA7Ci0gICAgICAgICAgICBQdXRVbnNhZmUob3MsIHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dFN0cmVhbTo6Q2g+KCh2ID4+IDEwKSB8IDB4RDgwMCkpOwotICAgICAgICAgICAgUHV0VW5zYWZlKG9zLCAodiAmIDB4M0ZGKSB8IDB4REMwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRTdHJlYW0+Ci0gICAgc3RhdGljIGJvb2wgRGVjb2RlKElucHV0U3RyZWFtJiBpcywgdW5zaWduZWQqIGNvZGVwb2ludCkgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgSW5wdXRTdHJlYW06OkNoKSA+PSAyKTsKLSAgICAgICAgdHlwZW5hbWUgSW5wdXRTdHJlYW06OkNoIGMgPSBpcy5UYWtlKCk7Ci0gICAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPiAweERGRkYpIHsKLSAgICAgICAgICAgICpjb2RlcG9pbnQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjIDw9IDB4REJGRikgewotICAgICAgICAgICAgKmNvZGVwb2ludCA9IChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYykgJiAweDNGRikgPDwgMTA7Ci0gICAgICAgICAgICBjID0gaXMuVGFrZSgpOwotICAgICAgICAgICAgKmNvZGVwb2ludCB8PSAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGMpICYgMHgzRkYpOwotICAgICAgICAgICAgKmNvZGVwb2ludCArPSAweDEwMDAwOwotICAgICAgICAgICAgcmV0dXJuIGMgPj0gMHhEQzAwICYmIGMgPD0gMHhERkZGOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRTdHJlYW0sIHR5cGVuYW1lIE91dHB1dFN0cmVhbT4KLSAgICBzdGF0aWMgYm9vbCBWYWxpZGF0ZShJbnB1dFN0cmVhbSYgaXMsIE91dHB1dFN0cmVhbSYgb3MpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIElucHV0U3RyZWFtOjpDaCkgPj0gMik7Ci0gICAgICAgIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUKHNpemVvZih0eXBlbmFtZSBPdXRwdXRTdHJlYW06OkNoKSA+PSAyKTsKLSAgICAgICAgdHlwZW5hbWUgSW5wdXRTdHJlYW06OkNoIGM7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRTdHJlYW06OkNoPihjID0gaXMuVGFrZSgpKSk7Ci0gICAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPiAweERGRkYpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZWxzZSBpZiAoYyA8PSAweERCRkYpIHsKLSAgICAgICAgICAgIG9zLlB1dChjID0gaXMuVGFrZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBjID49IDB4REMwMCAmJiBjIDw9IDB4REZGRjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfTsKLQotLy8hIFVURi0xNiBsaXR0bGUgZW5kaWFuIGVuY29kaW5nLgotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGUgPSB3Y2hhcl90Pgotc3RydWN0IFVURjE2TEUgOiBVVEYxNjxDaGFyVHlwZT4gewotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW0+Ci0gICAgc3RhdGljIENoYXJUeXBlIFRha2VCT00oSW5wdXRCeXRlU3RyZWFtJiBpcykgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtOjpDaCkgPT0gMSk7Ci0gICAgICAgIENoYXJUeXBlIGMgPSBUYWtlKGlzKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihjKSA9PSAweEZFRkZ1ID8gVGFrZShpcykgOiBjOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW0+Ci0gICAgc3RhdGljIENoYXJUeXBlIFRha2UoSW5wdXRCeXRlU3RyZWFtJiBpcykgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtOjpDaCkgPT0gMSk7Ci0gICAgICAgIHVuc2lnbmVkIGMgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihpcy5UYWtlKCkpOwotICAgICAgICBjIHw9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzdGF0aWNfY2FzdDx1aW50OF90Pihpcy5UYWtlKCkpKSA8PCA4OwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KGMpOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyB2b2lkIFB1dEJPTShPdXRwdXRCeXRlU3RyZWFtJiBvcykgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2gpID09IDEpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KDB4RkZ1KSk7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaD4oMHhGRXUpKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbT4KLSAgICBzdGF0aWMgdm9pZCBQdXQoT3V0cHV0Qnl0ZVN0cmVhbSYgb3MsIENoYXJUeXBlIGMpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoKSA9PSAxKTsKLSAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoPihzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYykgJiAweEZGdSkpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYykgPj4gOCkgJiAweEZGdSkpOwotICAgIH0KLX07Ci0KLS8vISBVVEYtMTYgYmlnIGVuZGlhbiBlbmNvZGluZy4KLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlID0gd2NoYXJfdD4KLXN0cnVjdCBVVEYxNkJFIDogVVRGMTY8Q2hhclR5cGU+IHsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyBDaGFyVHlwZSBUYWtlQk9NKElucHV0Qnl0ZVN0cmVhbSYgaXMpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIElucHV0Qnl0ZVN0cmVhbTo6Q2gpID09IDEpOwotICAgICAgICBDaGFyVHlwZSBjID0gVGFrZShpcyk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oYykgPT0gMHhGRUZGdSA/IFRha2UoaXMpIDogYzsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyBDaGFyVHlwZSBUYWtlKElucHV0Qnl0ZVN0cmVhbSYgaXMpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIElucHV0Qnl0ZVN0cmVhbTo6Q2gpID09IDEpOwotICAgICAgICB1bnNpZ25lZCBjID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGlzLlRha2UoKSkpIDw8IDg7Ci0gICAgICAgIGMgfD0gc3RhdGljX2Nhc3Q8dWludDhfdD4oaXMuVGFrZSgpKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENoYXJUeXBlPihjKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbT4KLSAgICBzdGF0aWMgdm9pZCBQdXRCT00oT3V0cHV0Qnl0ZVN0cmVhbSYgb3MpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoKSA9PSAxKTsKLSAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoPigweEZFdSkpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KDB4RkZ1KSk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW0+Ci0gICAgc3RhdGljIHZvaWQgUHV0KE91dHB1dEJ5dGVTdHJlYW0mIG9zLCBDaGFyVHlwZSBjKSB7Ci0gICAgICAgIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUKHNpemVvZih0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaCkgPT0gMSk7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaD4oKHN0YXRpY19jYXN0PHVuc2lnbmVkPihjKSA+PiA4KSAmIDB4RkZ1KSk7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaD4oc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGMpICYgMHhGRnUpKTsKLSAgICB9Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBVVEYzMgotCi0vLyEgVVRGLTMyIGVuY29kaW5nLiAKLS8qISBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0zMgotICAgIFx0cGFyYW0gQ2hhclR5cGUgVHlwZSBmb3Igc3RvcmluZyAzMi1iaXQgVVRGLTMyIGRhdGEuIERlZmF1bHQgaXMgdW5zaWduZWQuIEMrKzExIG1heSB1c2UgY2hhcjMyX3QgaW5zdGVhZC4KLSAgICBcbm90ZSBpbXBsZW1lbnRzIEVuY29kaW5nIGNvbmNlcHQKLQotICAgIFxub3RlIEZvciBpbi1tZW1vcnkgYWNjZXNzLCBubyBuZWVkIHRvIGNvbmNlcm4gZW5kaWFubmVzcy4gVGhlIGNvZGUgdW5pdHMgYW5kIGNvZGUgcG9pbnRzIGFyZSByZXByZXNlbnRlZCBieSBDUFUncyBlbmRpYW5uZXNzLgotICAgIEZvciBzdHJlYW1pbmcsIHVzZSBVVEYzMkxFIGFuZCBVVEYzMkJFLCB3aGljaCBoYW5kbGUgZW5kaWFubmVzcy4KLSovCi10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZSA9IHVuc2lnbmVkPgotc3RydWN0IFVURjMyIHsKLSAgICB0eXBlZGVmIENoYXJUeXBlIENoOwotICAgIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUKHNpemVvZihDaCkgPj0gNCk7Ci0KLSAgICBlbnVtIHsgc3VwcG9ydFVuaWNvZGUgPSAxIH07Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgc3RhdGljIHZvaWQgRW5jb2RlKE91dHB1dFN0cmVhbSYgb3MsIHVuc2lnbmVkIGNvZGVwb2ludCkgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgT3V0cHV0U3RyZWFtOjpDaCkgPj0gNCk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoY29kZXBvaW50IDw9IDB4MTBGRkZGKTsKLSAgICAgICAgb3MuUHV0KGNvZGVwb2ludCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgT3V0cHV0U3RyZWFtPgotICAgIHN0YXRpYyB2b2lkIEVuY29kZVVuc2FmZShPdXRwdXRTdHJlYW0mIG9zLCB1bnNpZ25lZCBjb2RlcG9pbnQpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIE91dHB1dFN0cmVhbTo6Q2gpID49IDQpOwotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGNvZGVwb2ludCA8PSAweDEwRkZGRik7Ci0gICAgICAgIFB1dFVuc2FmZShvcywgY29kZXBvaW50KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRTdHJlYW0+Ci0gICAgc3RhdGljIGJvb2wgRGVjb2RlKElucHV0U3RyZWFtJiBpcywgdW5zaWduZWQqIGNvZGVwb2ludCkgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgSW5wdXRTdHJlYW06OkNoKSA+PSA0KTsKLSAgICAgICAgQ2ggYyA9IGlzLlRha2UoKTsKLSAgICAgICAgKmNvZGVwb2ludCA9IGM7Ci0gICAgICAgIHJldHVybiBjIDw9IDB4MTBGRkZGOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgT3V0cHV0U3RyZWFtPgotICAgIHN0YXRpYyBib29sIFZhbGlkYXRlKElucHV0U3RyZWFtJiBpcywgT3V0cHV0U3RyZWFtJiBvcykgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgSW5wdXRTdHJlYW06OkNoKSA+PSA0KTsKLSAgICAgICAgQ2ggYzsKLSAgICAgICAgb3MuUHV0KGMgPSBpcy5UYWtlKCkpOwotICAgICAgICByZXR1cm4gYyA8PSAweDEwRkZGRjsKLSAgICB9Ci19OwotCi0vLyEgVVRGLTMyIGxpdHRsZSBlbmRpYW4gZW5vY29kaW5nLgotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGUgPSB1bnNpZ25lZD4KLXN0cnVjdCBVVEYzMkxFIDogVVRGMzI8Q2hhclR5cGU+IHsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyBDaGFyVHlwZSBUYWtlQk9NKElucHV0Qnl0ZVN0cmVhbSYgaXMpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIElucHV0Qnl0ZVN0cmVhbTo6Q2gpID09IDEpOwotICAgICAgICBDaGFyVHlwZSBjID0gVGFrZShpcyk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYykgPT0gMHgwMDAwRkVGRnUgPyBUYWtlKGlzKSA6IGM7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0Qnl0ZVN0cmVhbT4KLSAgICBzdGF0aWMgQ2hhclR5cGUgVGFrZShJbnB1dEJ5dGVTdHJlYW0mIGlzKSB7Ci0gICAgICAgIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUKHNpemVvZih0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW06OkNoKSA9PSAxKTsKLSAgICAgICAgdW5zaWduZWQgYyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGlzLlRha2UoKSk7Ci0gICAgICAgIGMgfD0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGlzLlRha2UoKSkpIDw8IDg7Ci0gICAgICAgIGMgfD0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGlzLlRha2UoKSkpIDw8IDE2OwotICAgICAgICBjIHw9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzdGF0aWNfY2FzdDx1aW50OF90Pihpcy5UYWtlKCkpKSA8PCAyNDsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENoYXJUeXBlPihjKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbT4KLSAgICBzdGF0aWMgdm9pZCBQdXRCT00oT3V0cHV0Qnl0ZVN0cmVhbSYgb3MpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoKSA9PSAxKTsKLSAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoPigweEZGdSkpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KDB4RkV1KSk7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaD4oMHgwMHUpKTsKLSAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoPigweDAwdSkpOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyB2b2lkIFB1dChPdXRwdXRCeXRlU3RyZWFtJiBvcywgQ2hhclR5cGUgYykgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2gpID09IDEpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KGMgJiAweEZGdSkpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KChjID4+IDgpICYgMHhGRnUpKTsKLSAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoPigoYyA+PiAxNikgJiAweEZGdSkpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KChjID4+IDI0KSAmIDB4RkZ1KSk7Ci0gICAgfQotfTsKLQotLy8hIFVURi0zMiBiaWcgZW5kaWFuIGVuY29kaW5nLgotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGUgPSB1bnNpZ25lZD4KLXN0cnVjdCBVVEYzMkJFIDogVVRGMzI8Q2hhclR5cGU+IHsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyBDaGFyVHlwZSBUYWtlQk9NKElucHV0Qnl0ZVN0cmVhbSYgaXMpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIElucHV0Qnl0ZVN0cmVhbTo6Q2gpID09IDEpOwotICAgICAgICBDaGFyVHlwZSBjID0gVGFrZShpcyk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYykgPT0gMHgwMDAwRkVGRnUgPyBUYWtlKGlzKSA6IGM7IAotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW0+Ci0gICAgc3RhdGljIENoYXJUeXBlIFRha2UoSW5wdXRCeXRlU3RyZWFtJiBpcykgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtOjpDaCkgPT0gMSk7Ci0gICAgICAgIHVuc2lnbmVkIGMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc3RhdGljX2Nhc3Q8dWludDhfdD4oaXMuVGFrZSgpKSkgPDwgMjQ7Ci0gICAgICAgIGMgfD0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGlzLlRha2UoKSkpIDw8IDE2OwotICAgICAgICBjIHw9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzdGF0aWNfY2FzdDx1aW50OF90Pihpcy5UYWtlKCkpKSA8PCA4OwotICAgICAgICBjIHw9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzdGF0aWNfY2FzdDx1aW50OF90Pihpcy5UYWtlKCkpKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENoYXJUeXBlPihjKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbT4KLSAgICBzdGF0aWMgdm9pZCBQdXRCT00oT3V0cHV0Qnl0ZVN0cmVhbSYgb3MpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoKSA9PSAxKTsKLSAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoPigweDAwdSkpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KDB4MDB1KSk7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaD4oMHhGRXUpKTsKLSAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoPigweEZGdSkpOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtPgotICAgIHN0YXRpYyB2b2lkIFB1dChPdXRwdXRCeXRlU3RyZWFtJiBvcywgQ2hhclR5cGUgYykgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2gpID09IDEpOwotICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbTo6Q2g+KChjID4+IDI0KSAmIDB4RkZ1KSk7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaD4oKGMgPj4gMTYpICYgMHhGRnUpKTsKLSAgICAgICAgb3MuUHV0KHN0YXRpY19jYXN0PHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoPigoYyA+PiA4KSAmIDB4RkZ1KSk7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaD4oYyAmIDB4RkZ1KSk7Ci0gICAgfQotfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQVNDSUkKLQotLy8hIEFTQ0lJIGVuY29kaW5nLgotLyohIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQVNDSUkKLSAgICBcdHBhcmFtIENoYXJUeXBlIENvZGUgdW5pdCBmb3Igc3RvcmluZyA3LWJpdCBBU0NJSSBkYXRhLiBEZWZhdWx0IGlzIGNoYXIuCi0gICAgXG5vdGUgaW1wbGVtZW50cyBFbmNvZGluZyBjb25jZXB0Ci0qLwotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGUgPSBjaGFyPgotc3RydWN0IEFTQ0lJIHsKLSAgICB0eXBlZGVmIENoYXJUeXBlIENoOwotCi0gICAgZW51bSB7IHN1cHBvcnRVbmljb2RlID0gMCB9OwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgT3V0cHV0U3RyZWFtPgotICAgIHN0YXRpYyB2b2lkIEVuY29kZShPdXRwdXRTdHJlYW0mIG9zLCB1bnNpZ25lZCBjb2RlcG9pbnQpIHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChjb2RlcG9pbnQgPD0gMHg3Rik7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDxDaD4oY29kZXBvaW50ICYgMHhGRikpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIE91dHB1dFN0cmVhbT4KLSAgICBzdGF0aWMgdm9pZCBFbmNvZGVVbnNhZmUoT3V0cHV0U3RyZWFtJiBvcywgdW5zaWduZWQgY29kZXBvaW50KSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoY29kZXBvaW50IDw9IDB4N0YpOwotICAgICAgICBQdXRVbnNhZmUob3MsIHN0YXRpY19jYXN0PENoPihjb2RlcG9pbnQgJiAweEZGKSk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtPgotICAgIHN0YXRpYyBib29sIERlY29kZShJbnB1dFN0cmVhbSYgaXMsIHVuc2lnbmVkKiBjb2RlcG9pbnQpIHsKLSAgICAgICAgdWludDhfdCBjID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oaXMuVGFrZSgpKTsKLSAgICAgICAgKmNvZGVwb2ludCA9IGM7Ci0gICAgICAgIHJldHVybiBjIDw9IDBYN0Y7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgc3RhdGljIGJvb2wgVmFsaWRhdGUoSW5wdXRTdHJlYW0mIGlzLCBPdXRwdXRTdHJlYW0mIG9zKSB7Ci0gICAgICAgIHVpbnQ4X3QgYyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGlzLlRha2UoKSk7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRTdHJlYW06OkNoPihjKSk7Ci0gICAgICAgIHJldHVybiBjIDw9IDB4N0Y7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0Qnl0ZVN0cmVhbT4KLSAgICBzdGF0aWMgQ2hhclR5cGUgVGFrZUJPTShJbnB1dEJ5dGVTdHJlYW0mIGlzKSB7Ci0gICAgICAgIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUKHNpemVvZih0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW06OkNoKSA9PSAxKTsKLSAgICAgICAgdWludDhfdCBjID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oVGFrZShpcykpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2g+KGMpOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEJ5dGVTdHJlYW0+Ci0gICAgc3RhdGljIENoIFRha2UoSW5wdXRCeXRlU3RyZWFtJiBpcykgewotICAgICAgICBSQVBJREpTT05fU1RBVElDX0FTU0VSVChzaXplb2YodHlwZW5hbWUgSW5wdXRCeXRlU3RyZWFtOjpDaCkgPT0gMSk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxDaD4oaXMuVGFrZSgpKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0cHV0Qnl0ZVN0cmVhbT4KLSAgICBzdGF0aWMgdm9pZCBQdXRCT00oT3V0cHV0Qnl0ZVN0cmVhbSYgb3MpIHsKLSAgICAgICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW06OkNoKSA9PSAxKTsKLSAgICAgICAgKHZvaWQpb3M7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIE91dHB1dEJ5dGVTdHJlYW0+Ci0gICAgc3RhdGljIHZvaWQgUHV0KE91dHB1dEJ5dGVTdHJlYW0mIG9zLCBDaCBjKSB7Ci0gICAgICAgIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUKHNpemVvZih0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaCkgPT0gMSk7Ci0gICAgICAgIG9zLlB1dChzdGF0aWNfY2FzdDx0eXBlbmFtZSBPdXRwdXRCeXRlU3RyZWFtOjpDaD4oYykpOwotICAgIH0KLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEF1dG9VVEYKLQotLy8hIFJ1bnRpbWUtc3BlY2lmaWVkIFVURiBlbmNvZGluZyB0eXBlIG9mIGEgc3RyZWFtLgotZW51bSBVVEZUeXBlIHsKLSAgICBrVVRGOCA9IDAsICAgICAgLy8hPCBVVEYtOC4KLSAgICBrVVRGMTZMRSA9IDEsICAgLy8hPCBVVEYtMTYgbGl0dGxlIGVuZGlhbi4KLSAgICBrVVRGMTZCRSA9IDIsICAgLy8hPCBVVEYtMTYgYmlnIGVuZGlhbi4KLSAgICBrVVRGMzJMRSA9IDMsICAgLy8hPCBVVEYtMzIgbGl0dGxlIGVuZGlhbi4KLSAgICBrVVRGMzJCRSA9IDQgICAgLy8hPCBVVEYtMzIgYmlnIGVuZGlhbi4KLX07Ci0KLS8vISBEeW5hbWljYWxseSBzZWxlY3QgZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHN0cmVhbSdzIHJ1bnRpbWUtc3BlY2lmaWVkIFVURiBlbmNvZGluZyB0eXBlLgotLyohIFxub3RlIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgd2l0aCBBdXRvVVRGSW5wdXR0U3RyZWFtIGFuZCBBdXRvVVRGT3V0cHV0U3RyZWFtLCB3aGljaCBwcm92aWRlcyBHZXRUeXBlKCkuCi0qLwotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGU+Ci1zdHJ1Y3QgQXV0b1VURiB7Ci0gICAgdHlwZWRlZiBDaGFyVHlwZSBDaDsKLQotICAgIGVudW0geyBzdXBwb3J0VW5pY29kZSA9IDEgfTsKLQotI2RlZmluZSBSQVBJREpTT05fRU5DT0RJTkdTX0ZVTkMoeCkgVVRGODxDaD46OngsIFVURjE2TEU8Q2g+Ojp4LCBVVEYxNkJFPENoPjo6eCwgVVRGMzJMRTxDaD46OngsIFVURjMyQkU8Q2g+Ojp4Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIHN0YXRpYyB2b2lkIEVuY29kZShPdXRwdXRTdHJlYW0mIG9zLCB1bnNpZ25lZCBjb2RlcG9pbnQpIHsKLSAgICAgICAgdHlwZWRlZiB2b2lkICgqRW5jb2RlRnVuYykoT3V0cHV0U3RyZWFtJiwgdW5zaWduZWQpOwotICAgICAgICBzdGF0aWMgY29uc3QgRW5jb2RlRnVuYyBmW10gPSB7IFJBUElESlNPTl9FTkNPRElOR1NfRlVOQyhFbmNvZGUpIH07Ci0gICAgICAgICgqZltvcy5HZXRUeXBlKCldKShvcywgY29kZXBvaW50KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIHN0YXRpYyB2b2lkIEVuY29kZVVuc2FmZShPdXRwdXRTdHJlYW0mIG9zLCB1bnNpZ25lZCBjb2RlcG9pbnQpIHsKLSAgICAgICAgdHlwZWRlZiB2b2lkICgqRW5jb2RlRnVuYykoT3V0cHV0U3RyZWFtJiwgdW5zaWduZWQpOwotICAgICAgICBzdGF0aWMgY29uc3QgRW5jb2RlRnVuYyBmW10gPSB7IFJBUElESlNPTl9FTkNPRElOR1NfRlVOQyhFbmNvZGVVbnNhZmUpIH07Ci0gICAgICAgICgqZltvcy5HZXRUeXBlKCldKShvcywgY29kZXBvaW50KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRTdHJlYW0+Ci0gICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIHN0YXRpYyBib29sIERlY29kZShJbnB1dFN0cmVhbSYgaXMsIHVuc2lnbmVkKiBjb2RlcG9pbnQpIHsKLSAgICAgICAgdHlwZWRlZiBib29sICgqRGVjb2RlRnVuYykoSW5wdXRTdHJlYW0mLCB1bnNpZ25lZCopOwotICAgICAgICBzdGF0aWMgY29uc3QgRGVjb2RlRnVuYyBmW10gPSB7IFJBUElESlNPTl9FTkNPRElOR1NfRlVOQyhEZWNvZGUpIH07Ci0gICAgICAgIHJldHVybiAoKmZbaXMuR2V0VHlwZSgpXSkoaXMsIGNvZGVwb2ludCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIHN0YXRpYyBib29sIFZhbGlkYXRlKElucHV0U3RyZWFtJiBpcywgT3V0cHV0U3RyZWFtJiBvcykgewotICAgICAgICB0eXBlZGVmIGJvb2wgKCpWYWxpZGF0ZUZ1bmMpKElucHV0U3RyZWFtJiwgT3V0cHV0U3RyZWFtJik7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWYWxpZGF0ZUZ1bmMgZltdID0geyBSQVBJREpTT05fRU5DT0RJTkdTX0ZVTkMoVmFsaWRhdGUpIH07Ci0gICAgICAgIHJldHVybiAoKmZbaXMuR2V0VHlwZSgpXSkoaXMsIG9zKTsKLSAgICB9Ci0KLSN1bmRlZiBSQVBJREpTT05fRU5DT0RJTkdTX0ZVTkMKLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFRyYW5zY29kZXIKLQotLy8hIEVuY29kaW5nIGNvbnZlcnNpb24uCi10ZW1wbGF0ZTx0eXBlbmFtZSBTb3VyY2VFbmNvZGluZywgdHlwZW5hbWUgVGFyZ2V0RW5jb2Rpbmc+Ci1zdHJ1Y3QgVHJhbnNjb2RlciB7Ci0gICAgLy8hIFRha2Ugb25lIFVuaWNvZGUgY29kZXBvaW50IGZyb20gc291cmNlIGVuY29kaW5nLCBjb252ZXJ0IGl0IHRvIHRhcmdldCBlbmNvZGluZyBhbmQgcHV0IGl0IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIHN0YXRpYyBib29sIFRyYW5zY29kZShJbnB1dFN0cmVhbSYgaXMsIE91dHB1dFN0cmVhbSYgb3MpIHsKLSAgICAgICAgdW5zaWduZWQgY29kZXBvaW50OwotICAgICAgICBpZiAoIVNvdXJjZUVuY29kaW5nOjpEZWNvZGUoaXMsICZjb2RlcG9pbnQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBUYXJnZXRFbmNvZGluZzo6RW5jb2RlKG9zLCBjb2RlcG9pbnQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgT3V0cHV0U3RyZWFtPgotICAgIFJBUElESlNPTl9GT1JDRUlOTElORSBzdGF0aWMgYm9vbCBUcmFuc2NvZGVVbnNhZmUoSW5wdXRTdHJlYW0mIGlzLCBPdXRwdXRTdHJlYW0mIG9zKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNvZGVwb2ludDsKLSAgICAgICAgaWYgKCFTb3VyY2VFbmNvZGluZzo6RGVjb2RlKGlzLCAmY29kZXBvaW50KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgVGFyZ2V0RW5jb2Rpbmc6OkVuY29kZVVuc2FmZShvcywgY29kZXBvaW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8hIFZhbGlkYXRlIG9uZSBVbmljb2RlIGNvZGVwb2ludCBmcm9tIGFuIGVuY29kZWQgc3RyZWFtLgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIHN0YXRpYyBib29sIFZhbGlkYXRlKElucHV0U3RyZWFtJiBpcywgT3V0cHV0U3RyZWFtJiBvcykgewotICAgICAgICByZXR1cm4gVHJhbnNjb2RlKGlzLCBvcyk7ICAgLy8gU2luY2Ugc291cmNlL3RhcmdldCBlbmNvZGluZyBpcyBkaWZmZXJlbnQsIG11c3QgdHJhbnNjb2RlLgotICAgIH0KLX07Ci0KLS8vIEZvcndhcmQgZGVjbGFyYXRpb24uCi10ZW1wbGF0ZTx0eXBlbmFtZSBTdHJlYW0+Ci1pbmxpbmUgdm9pZCBQdXRVbnNhZmUoU3RyZWFtJiBzdHJlYW0sIHR5cGVuYW1lIFN0cmVhbTo6Q2ggYyk7Ci0KLS8vISBTcGVjaWFsaXphdGlvbiBvZiBUcmFuc2NvZGVyIHdpdGggc2FtZSBzb3VyY2UgYW5kIHRhcmdldCBlbmNvZGluZy4KLXRlbXBsYXRlPHR5cGVuYW1lIEVuY29kaW5nPgotc3RydWN0IFRyYW5zY29kZXI8RW5jb2RpbmcsIEVuY29kaW5nPiB7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRTdHJlYW0sIHR5cGVuYW1lIE91dHB1dFN0cmVhbT4KLSAgICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgc3RhdGljIGJvb2wgVHJhbnNjb2RlKElucHV0U3RyZWFtJiBpcywgT3V0cHV0U3RyZWFtJiBvcykgewotICAgICAgICBvcy5QdXQoaXMuVGFrZSgpKTsgIC8vIEp1c3QgY29weSBvbmUgY29kZSB1bml0LiBUaGlzIHNlbWFudGljIGlzIGRpZmZlcmVudCBmcm9tIHByaW1hcnkgdGVtcGxhdGUgY2xhc3MuCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgT3V0cHV0U3RyZWFtPgotICAgIFJBUElESlNPTl9GT1JDRUlOTElORSBzdGF0aWMgYm9vbCBUcmFuc2NvZGVVbnNhZmUoSW5wdXRTdHJlYW0mIGlzLCBPdXRwdXRTdHJlYW0mIG9zKSB7Ci0gICAgICAgIFB1dFVuc2FmZShvcywgaXMuVGFrZSgpKTsgIC8vIEp1c3QgY29weSBvbmUgY29kZSB1bml0LiBUaGlzIHNlbWFudGljIGlzIGRpZmZlcmVudCBmcm9tIHByaW1hcnkgdGVtcGxhdGUgY2xhc3MuCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgT3V0cHV0U3RyZWFtPgotICAgIFJBUElESlNPTl9GT1JDRUlOTElORSBzdGF0aWMgYm9vbCBWYWxpZGF0ZShJbnB1dFN0cmVhbSYgaXMsIE91dHB1dFN0cmVhbSYgb3MpIHsKLSAgICAgICAgcmV0dXJuIEVuY29kaW5nOjpWYWxpZGF0ZShpcywgb3MpOyAgLy8gc291cmNlL3RhcmdldCBlbmNvZGluZyBhcmUgdGhlIHNhbWUKLSAgICB9Ci19OwotCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikKLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLSNlbmRpZiAvLyBSQVBJREpTT05fRU5DT0RJTkdTX0hfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2Vycm9yL2VuLmggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2Vycm9yL2VuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzE1ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9lcnJvci9lbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fRVJST1JfRU5fSF8KLSNkZWZpbmUgUkFQSURKU09OX0VSUk9SX0VOX0hfCi0KLSNpbmNsdWRlICJlcnJvci5oIgotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QVVNICi1SQVBJREpTT05fRElBR19PRkYoc3dpdGNoLWVudW0pCi1SQVBJREpTT05fRElBR19PRkYoY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCkKLSNlbmRpZgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi0KLS8vISBNYXBzIGVycm9yIGNvZGUgb2YgcGFyc2luZyBpbnRvIGVycm9yIG1lc3NhZ2UuCi0vKiEKLSAgICBcaW5ncm91cCBSQVBJREpTT05fRVJST1JTCi0gICAgXHBhcmFtIHBhcnNlRXJyb3JDb2RlIEVycm9yIGNvZGUgb2J0YWluZWQgaW4gcGFyc2luZy4KLSAgICBccmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlLgotICAgIFxub3RlIFVzZXIgY2FuIG1ha2UgYSBjb3B5IG9mIHRoaXMgZnVuY3Rpb24gZm9yIGxvY2FsaXphdGlvbi4KLSAgICAgICAgVXNpbmcgc3dpdGNoLWNhc2UgaXMgc2FmZXIgZm9yIGZ1dHVyZSBtb2RpZmljYXRpb24gb2YgZXJyb3IgY29kZXMuCi0qLwotaW5saW5lIGNvbnN0IFJBUElESlNPTl9FUlJPUl9DSEFSVFlQRSogR2V0UGFyc2VFcnJvcl9FbihQYXJzZUVycm9yQ29kZSBwYXJzZUVycm9yQ29kZSkgewotICAgIHN3aXRjaCAocGFyc2VFcnJvckNvZGUpIHsKLSAgICAgICAgY2FzZSBrUGFyc2VFcnJvck5vbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJBUElESlNPTl9FUlJPUl9TVFJJTkcoIk5vIGVycm9yLiIpOwotCi0gICAgICAgIGNhc2Uga1BhcnNlRXJyb3JEb2N1bWVudEVtcHR5OiAgICAgICAgICAgICAgICAgIHJldHVybiBSQVBJREpTT05fRVJST1JfU1RSSU5HKCJUaGUgZG9jdW1lbnQgaXMgZW1wdHkuIik7Ci0gICAgICAgIGNhc2Uga1BhcnNlRXJyb3JEb2N1bWVudFJvb3ROb3RTaW5ndWxhcjogICAgICAgIHJldHVybiBSQVBJREpTT05fRVJST1JfU1RSSU5HKCJUaGUgZG9jdW1lbnQgcm9vdCBtdXN0IG5vdCBmb2xsb3cgYnkgb3RoZXIgdmFsdWVzLiIpOwotICAgIAotICAgICAgICBjYXNlIGtQYXJzZUVycm9yVmFsdWVJbnZhbGlkOiAgICAgICAgICAgICAgICAgICByZXR1cm4gUkFQSURKU09OX0VSUk9SX1NUUklORygiSW52YWxpZCB2YWx1ZS4iKTsKLSAgICAKLSAgICAgICAgY2FzZSBrUGFyc2VFcnJvck9iamVjdE1pc3NOYW1lOiAgICAgICAgICAgICAgICAgcmV0dXJuIFJBUElESlNPTl9FUlJPUl9TVFJJTkcoIk1pc3NpbmcgYSBuYW1lIGZvciBvYmplY3QgbWVtYmVyLiIpOwotICAgICAgICBjYXNlIGtQYXJzZUVycm9yT2JqZWN0TWlzc0NvbG9uOiAgICAgICAgICAgICAgICByZXR1cm4gUkFQSURKU09OX0VSUk9SX1NUUklORygiTWlzc2luZyBhIGNvbG9uIGFmdGVyIGEgbmFtZSBvZiBvYmplY3QgbWVtYmVyLiIpOwotICAgICAgICBjYXNlIGtQYXJzZUVycm9yT2JqZWN0TWlzc0NvbW1hT3JDdXJseUJyYWNrZXQ6ICByZXR1cm4gUkFQSURKU09OX0VSUk9SX1NUUklORygiTWlzc2luZyBhIGNvbW1hIG9yICd9JyBhZnRlciBhbiBvYmplY3QgbWVtYmVyLiIpOwotICAgIAotICAgICAgICBjYXNlIGtQYXJzZUVycm9yQXJyYXlNaXNzQ29tbWFPclNxdWFyZUJyYWNrZXQ6ICByZXR1cm4gUkFQSURKU09OX0VSUk9SX1NUUklORygiTWlzc2luZyBhIGNvbW1hIG9yICddJyBhZnRlciBhbiBhcnJheSBlbGVtZW50LiIpOwotCi0gICAgICAgIGNhc2Uga1BhcnNlRXJyb3JTdHJpbmdVbmljb2RlRXNjYXBlSW52YWxpZEhleDogIHJldHVybiBSQVBJREpTT05fRVJST1JfU1RSSU5HKCJJbmNvcnJlY3QgaGV4IGRpZ2l0IGFmdGVyIFxcdSBlc2NhcGUgaW4gc3RyaW5nLiIpOwotICAgICAgICBjYXNlIGtQYXJzZUVycm9yU3RyaW5nVW5pY29kZVN1cnJvZ2F0ZUludmFsaWQ6ICByZXR1cm4gUkFQSURKU09OX0VSUk9SX1NUUklORygiVGhlIHN1cnJvZ2F0ZSBwYWlyIGluIHN0cmluZyBpcyBpbnZhbGlkLiIpOwotICAgICAgICBjYXNlIGtQYXJzZUVycm9yU3RyaW5nRXNjYXBlSW52YWxpZDogICAgICAgICAgICByZXR1cm4gUkFQSURKU09OX0VSUk9SX1NUUklORygiSW52YWxpZCBlc2NhcGUgY2hhcmFjdGVyIGluIHN0cmluZy4iKTsKLSAgICAgICAgY2FzZSBrUGFyc2VFcnJvclN0cmluZ01pc3NRdW90YXRpb25NYXJrOiAgICAgICAgcmV0dXJuIFJBUElESlNPTl9FUlJPUl9TVFJJTkcoIk1pc3NpbmcgYSBjbG9zaW5nIHF1b3RhdGlvbiBtYXJrIGluIHN0cmluZy4iKTsKLSAgICAgICAgY2FzZSBrUGFyc2VFcnJvclN0cmluZ0ludmFsaWRFbmNvZGluZzogICAgICAgICAgcmV0dXJuIFJBUElESlNPTl9FUlJPUl9TVFJJTkcoIkludmFsaWQgZW5jb2RpbmcgaW4gc3RyaW5nLiIpOwotCi0gICAgICAgIGNhc2Uga1BhcnNlRXJyb3JOdW1iZXJUb29CaWc6ICAgICAgICAgICAgICAgICAgIHJldHVybiBSQVBJREpTT05fRVJST1JfU1RSSU5HKCJOdW1iZXIgdG9vIGJpZyB0byBiZSBzdG9yZWQgaW4gZG91YmxlLiIpOwotICAgICAgICBjYXNlIGtQYXJzZUVycm9yTnVtYmVyTWlzc0ZyYWN0aW9uOiAgICAgICAgICAgICByZXR1cm4gUkFQSURKU09OX0VSUk9SX1NUUklORygiTWlzcyBmcmFjdGlvbiBwYXJ0IGluIG51bWJlci4iKTsKLSAgICAgICAgY2FzZSBrUGFyc2VFcnJvck51bWJlck1pc3NFeHBvbmVudDogICAgICAgICAgICAgcmV0dXJuIFJBUElESlNPTl9FUlJPUl9TVFJJTkcoIk1pc3MgZXhwb25lbnQgaW4gbnVtYmVyLiIpOwotCi0gICAgICAgIGNhc2Uga1BhcnNlRXJyb3JUZXJtaW5hdGlvbjogICAgICAgICAgICAgICAgICAgIHJldHVybiBSQVBJREpTT05fRVJST1JfU1RSSU5HKCJUZXJtaW5hdGUgcGFyc2luZyBkdWUgdG8gSGFuZGxlciBlcnJvci4iKTsKLSAgICAgICAgY2FzZSBrUGFyc2VFcnJvclVuc3BlY2lmaWNTeW50YXhFcnJvcjogICAgICAgICAgcmV0dXJuIFJBUElESlNPTl9FUlJPUl9TVFJJTkcoIlVuc3BlY2lmaWMgc3ludGF4IGVycm9yLiIpOwotCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSQVBJREpTT05fRVJST1JfU1RSSU5HKCJVbmtub3duIGVycm9yLiIpOwotICAgIH0KLX0KLQotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUE9QCi0jZW5kaWYKLQotI2VuZGlmIC8vIFJBUElESlNPTl9FUlJPUl9FTl9IXwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9lcnJvci9lcnJvci5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9lcnJvci9lcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWNiMzFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vZXJyb3IvZXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLyBUZW5jZW50IGlzIHBsZWFzZWQgdG8gc3VwcG9ydCB0aGUgb3BlbiBzb3VyY2UgY29tbXVuaXR5IGJ5IG1ha2luZyBSYXBpZEpTT04gYXZhaWxhYmxlLgotLy8gCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTUgVEhMIEEyOSBMaW1pdGVkLCBhIFRlbmNlbnQgY29tcGFueSwgYW5kIE1pbG8gWWlwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0Ci0vLyBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIAotLy8gdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIAotLy8gQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgCi0vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFJBUElESlNPTl9FUlJPUl9FUlJPUl9IXwotI2RlZmluZSBSQVBJREpTT05fRVJST1JfRVJST1JfSF8KLQotI2luY2x1ZGUgIi4uL3JhcGlkanNvbi5oIgotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QVVNICi1SQVBJREpTT05fRElBR19PRkYocGFkZGVkKQotI2VuZGlmCi0KLS8qISBcZmlsZSBlcnJvci5oICovCi0KLS8qISBcZGVmZ3JvdXAgUkFQSURKU09OX0VSUk9SUyBSYXBpZEpTT04gZXJyb3IgaGFuZGxpbmcgKi8KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUkFQSURKU09OX0VSUk9SX0NIQVJUWVBFCi0KLS8vISBDaGFyYWN0ZXIgdHlwZSBvZiBlcnJvciBtZXNzYWdlcy4KLS8qISBcaW5ncm91cCBSQVBJREpTT05fRVJST1JTCi0gICAgVGhlIGRlZmF1bHQgY2hhcmFjdGVyIHR5cGUgaXMgXGMgY2hhci4KLSAgICBPbiBXaW5kb3dzLCB1c2VyIGNhbiBkZWZpbmUgdGhpcyBtYWNybyBhcyBcYyBUQ0hBUiBmb3Igc3VwcG9ydGluZyBib3RoCi0gICAgdW5pY29kZS9ub24tdW5pY29kZSBzZXR0aW5ncy4KLSovCi0jaWZuZGVmIFJBUElESlNPTl9FUlJPUl9DSEFSVFlQRQotI2RlZmluZSBSQVBJREpTT05fRVJST1JfQ0hBUlRZUEUgY2hhcgotI2VuZGlmCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJBUElESlNPTl9FUlJPUl9TVFJJTkcKLQotLy8hIE1hY3JvIGZvciBjb252ZXJ0aW5nIHN0cmluZyBsaXRlcmlhbCB0byBccmVmIFJBUElESlNPTl9FUlJPUl9DSEFSVFlQRVtdLgotLyohIFxpbmdyb3VwIFJBUElESlNPTl9FUlJPUlMKLSAgICBCeSBkZWZhdWx0IHRoaXMgY29udmVyc2lvbiBtYWNybyBkb2VzIG5vdGhpbmcuCi0gICAgT24gV2luZG93cywgdXNlciBjYW4gZGVmaW5lIHRoaXMgbWFjcm8gYXMgXGMgX1QoeCkgZm9yIHN1cHBvcnRpbmcgYm90aAotICAgIHVuaWNvZGUvbm9uLXVuaWNvZGUgc2V0dGluZ3MuCi0qLwotI2lmbmRlZiBSQVBJREpTT05fRVJST1JfU1RSSU5HCi0jZGVmaW5lIFJBUElESlNPTl9FUlJPUl9TVFJJTkcoeCkgeAotI2VuZGlmCi0KLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUGFyc2VFcnJvckNvZGUKLQotLy8hIEVycm9yIGNvZGUgb2YgcGFyc2luZy4KLS8qISBcaW5ncm91cCBSQVBJREpTT05fRVJST1JTCi0gICAgXHNlZSBHZW5lcmljUmVhZGVyOjpQYXJzZSwgR2VuZXJpY1JlYWRlcjo6R2V0UGFyc2VFcnJvckNvZGUKLSovCi1lbnVtIFBhcnNlRXJyb3JDb2RlIHsKLSAgICBrUGFyc2VFcnJvck5vbmUgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vITwgTm8gZXJyb3IuCi0KLSAgICBrUGFyc2VFcnJvckRvY3VtZW50RW1wdHksICAgICAgICAgICAgICAgICAgIC8vITwgVGhlIGRvY3VtZW50IGlzIGVtcHR5LgotICAgIGtQYXJzZUVycm9yRG9jdW1lbnRSb290Tm90U2luZ3VsYXIsICAgICAgICAgLy8hPCBUaGUgZG9jdW1lbnQgcm9vdCBtdXN0IG5vdCBmb2xsb3cgYnkgb3RoZXIgdmFsdWVzLgotCi0gICAga1BhcnNlRXJyb3JWYWx1ZUludmFsaWQsICAgICAgICAgICAgICAgICAgICAvLyE8IEludmFsaWQgdmFsdWUuCi0KLSAgICBrUGFyc2VFcnJvck9iamVjdE1pc3NOYW1lLCAgICAgICAgICAgICAgICAgIC8vITwgTWlzc2luZyBhIG5hbWUgZm9yIG9iamVjdCBtZW1iZXIuCi0gICAga1BhcnNlRXJyb3JPYmplY3RNaXNzQ29sb24sICAgICAgICAgICAgICAgICAvLyE8IE1pc3NpbmcgYSBjb2xvbiBhZnRlciBhIG5hbWUgb2Ygb2JqZWN0IG1lbWJlci4KLSAgICBrUGFyc2VFcnJvck9iamVjdE1pc3NDb21tYU9yQ3VybHlCcmFja2V0LCAgIC8vITwgTWlzc2luZyBhIGNvbW1hIG9yICd9JyBhZnRlciBhbiBvYmplY3QgbWVtYmVyLgotCi0gICAga1BhcnNlRXJyb3JBcnJheU1pc3NDb21tYU9yU3F1YXJlQnJhY2tldCwgICAvLyE8IE1pc3NpbmcgYSBjb21tYSBvciAnXScgYWZ0ZXIgYW4gYXJyYXkgZWxlbWVudC4KLQotICAgIGtQYXJzZUVycm9yU3RyaW5nVW5pY29kZUVzY2FwZUludmFsaWRIZXgsICAgLy8hPCBJbmNvcnJlY3QgaGV4IGRpZ2l0IGFmdGVyIFxcdSBlc2NhcGUgaW4gc3RyaW5nLgotICAgIGtQYXJzZUVycm9yU3RyaW5nVW5pY29kZVN1cnJvZ2F0ZUludmFsaWQsICAgLy8hPCBUaGUgc3Vycm9nYXRlIHBhaXIgaW4gc3RyaW5nIGlzIGludmFsaWQuCi0gICAga1BhcnNlRXJyb3JTdHJpbmdFc2NhcGVJbnZhbGlkLCAgICAgICAgICAgICAvLyE8IEludmFsaWQgZXNjYXBlIGNoYXJhY3RlciBpbiBzdHJpbmcuCi0gICAga1BhcnNlRXJyb3JTdHJpbmdNaXNzUXVvdGF0aW9uTWFyaywgICAgICAgICAvLyE8IE1pc3NpbmcgYSBjbG9zaW5nIHF1b3RhdGlvbiBtYXJrIGluIHN0cmluZy4KLSAgICBrUGFyc2VFcnJvclN0cmluZ0ludmFsaWRFbmNvZGluZywgICAgICAgICAgIC8vITwgSW52YWxpZCBlbmNvZGluZyBpbiBzdHJpbmcuCi0KLSAgICBrUGFyc2VFcnJvck51bWJlclRvb0JpZywgICAgICAgICAgICAgICAgICAgIC8vITwgTnVtYmVyIHRvbyBiaWcgdG8gYmUgc3RvcmVkIGluIGRvdWJsZS4KLSAgICBrUGFyc2VFcnJvck51bWJlck1pc3NGcmFjdGlvbiwgICAgICAgICAgICAgIC8vITwgTWlzcyBmcmFjdGlvbiBwYXJ0IGluIG51bWJlci4KLSAgICBrUGFyc2VFcnJvck51bWJlck1pc3NFeHBvbmVudCwgICAgICAgICAgICAgIC8vITwgTWlzcyBleHBvbmVudCBpbiBudW1iZXIuCi0KLSAgICBrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCAgICAgICAgICAgICAgICAgICAgIC8vITwgUGFyc2luZyB3YXMgdGVybWluYXRlZC4KLSAgICBrUGFyc2VFcnJvclVuc3BlY2lmaWNTeW50YXhFcnJvciAgICAgICAgICAgIC8vITwgVW5zcGVjaWZpYyBzeW50YXggZXJyb3IuCi19OwotCi0vLyEgUmVzdWx0IG9mIHBhcnNpbmcgKHdyYXBzIFBhcnNlRXJyb3JDb2RlKQotLyohCi0gICAgXGluZ3JvdXAgUkFQSURKU09OX0VSUk9SUwotICAgIFxjb2RlCi0gICAgICAgIERvY3VtZW50IGRvYzsKLSAgICAgICAgUGFyc2VSZXN1bHQgb2sgPSBkb2MuUGFyc2UoIls0Ml0iKTsKLSAgICAgICAgaWYgKCFvaykgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJKU09OIHBhcnNlIGVycm9yOiAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICAgR2V0UGFyc2VFcnJvcl9Fbihvay5Db2RlKCkpLCBvay5PZmZzZXQoKSk7Ci0gICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgICAgIH0KLSAgICBcZW5kY29kZQotICAgIFxzZWUgR2VuZXJpY1JlYWRlcjo6UGFyc2UsIEdlbmVyaWNEb2N1bWVudDo6UGFyc2UKLSovCi1zdHJ1Y3QgUGFyc2VSZXN1bHQgewotcHVibGljOgotICAgIC8vISBEZWZhdWx0IGNvbnN0cnVjdG9yLCBubyBlcnJvci4KLSAgICBQYXJzZVJlc3VsdCgpIDogY29kZV8oa1BhcnNlRXJyb3JOb25lKSwgb2Zmc2V0XygwKSB7fQotICAgIC8vISBDb25zdHJ1Y3RvciB0byBzZXQgYW4gZXJyb3IuCi0gICAgUGFyc2VSZXN1bHQoUGFyc2VFcnJvckNvZGUgY29kZSwgc2l6ZV90IG9mZnNldCkgOiBjb2RlXyhjb2RlKSwgb2Zmc2V0XyhvZmZzZXQpIHt9Ci0KLSAgICAvLyEgR2V0IHRoZSBlcnJvciBjb2RlLgotICAgIFBhcnNlRXJyb3JDb2RlIENvZGUoKSBjb25zdCB7IHJldHVybiBjb2RlXzsgfQotICAgIC8vISBHZXQgdGhlIGVycm9yIG9mZnNldCwgaWYgXHJlZiBJc0Vycm9yKCksIDAgb3RoZXJ3aXNlLgotICAgIHNpemVfdCBPZmZzZXQoKSBjb25zdCB7IHJldHVybiBvZmZzZXRfOyB9Ci0KLSAgICAvLyEgQ29udmVyc2lvbiB0byBcYyBib29sLCByZXR1cm5zIFxjIHRydWUsIGlmZiAhXHJlZiBJc0Vycm9yKCkuCi0gICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICFJc0Vycm9yKCk7IH0KLSAgICAvLyEgV2hldGhlciB0aGUgcmVzdWx0IGlzIGFuIGVycm9yLgotICAgIGJvb2wgSXNFcnJvcigpIGNvbnN0IHsgcmV0dXJuIGNvZGVfICE9IGtQYXJzZUVycm9yTm9uZTsgfQotCi0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBhcnNlUmVzdWx0JiB0aGF0KSBjb25zdCB7IHJldHVybiBjb2RlXyA9PSB0aGF0LmNvZGVfOyB9Ci0gICAgYm9vbCBvcGVyYXRvcj09KFBhcnNlRXJyb3JDb2RlIGNvZGUpIGNvbnN0IHsgcmV0dXJuIGNvZGVfID09IGNvZGU7IH0KLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KFBhcnNlRXJyb3JDb2RlIGNvZGUsIGNvbnN0IFBhcnNlUmVzdWx0ICYgZXJyKSB7IHJldHVybiBjb2RlID09IGVyci5jb2RlXzsgfQotCi0gICAgLy8hIFJlc2V0IGVycm9yIGNvZGUuCi0gICAgdm9pZCBDbGVhcigpIHsgU2V0KGtQYXJzZUVycm9yTm9uZSk7IH0KLSAgICAvLyEgVXBkYXRlIGVycm9yIGNvZGUgYW5kIG9mZnNldC4KLSAgICB2b2lkIFNldChQYXJzZUVycm9yQ29kZSBjb2RlLCBzaXplX3Qgb2Zmc2V0ID0gMCkgeyBjb2RlXyA9IGNvZGU7IG9mZnNldF8gPSBvZmZzZXQ7IH0KLQotcHJpdmF0ZToKLSAgICBQYXJzZUVycm9yQ29kZSBjb2RlXzsKLSAgICBzaXplX3Qgb2Zmc2V0XzsKLX07Ci0KLS8vISBGdW5jdGlvbiBwb2ludGVyIHR5cGUgb2YgR2V0UGFyc2VFcnJvcigpLgotLyohIFxpbmdyb3VwIFJBUElESlNPTl9FUlJPUlMKLQotICAgIFRoaXMgaXMgdGhlIHByb3RvdHlwZSBmb3IgXGMgR2V0UGFyc2VFcnJvcl9YKCksIHdoZXJlIFxjIFggaXMgYSBsb2NhbGUuCi0gICAgVXNlciBjYW4gZHluYW1pY2FsbHkgY2hhbmdlIGxvY2FsZSBpbiBydW50aW1lLCBlLmcuOgotXGNvZGUKLSAgICBHZXRQYXJzZUVycm9yRnVuYyBHZXRQYXJzZUVycm9yID0gR2V0UGFyc2VFcnJvcl9FbjsgLy8gb3Igd2hhdGV2ZXIKLSAgICBjb25zdCBSQVBJREpTT05fRVJST1JfQ0hBUlRZUEUqIHMgPSBHZXRQYXJzZUVycm9yKGRvY3VtZW50LkdldFBhcnNlRXJyb3JDb2RlKCkpOwotXGVuZGNvZGUKLSovCi10eXBlZGVmIGNvbnN0IFJBUElESlNPTl9FUlJPUl9DSEFSVFlQRSogKCpHZXRQYXJzZUVycm9yRnVuYykoUGFyc2VFcnJvckNvZGUpOwotCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QT1AKLSNlbmRpZgotCi0jZW5kaWYgLy8gUkFQSURKU09OX0VSUk9SX0VSUk9SX0hfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ZpbGVyZWFkc3RyZWFtLmggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ZpbGVyZWFkc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NmVhMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9maWxlcmVhZHN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fRklMRVJFQURTVFJFQU1fSF8KLSNkZWZpbmUgUkFQSURKU09OX0ZJTEVSRUFEU1RSRUFNX0hfCi0KLSNpbmNsdWRlICJzdHJlYW0uaCIKLSNpbmNsdWRlIDxjc3RkaW8+Ci0KLSNpZmRlZiBfX2NsYW5nX18KLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRihwYWRkZWQpCi1SQVBJREpTT05fRElBR19PRkYodW5yZWFjaGFibGUtY29kZSkKLVJBUElESlNPTl9ESUFHX09GRihtaXNzaW5nLW5vcmV0dXJuKQotI2VuZGlmCi0KLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLQotLy8hIEZpbGUgYnl0ZSBzdHJlYW0gZm9yIGlucHV0IHVzaW5nIGZyZWFkKCkuCi0vKiEKLSAgICBcbm90ZSBpbXBsZW1lbnRzIFN0cmVhbSBjb25jZXB0Ci0qLwotY2xhc3MgRmlsZVJlYWRTdHJlYW0gewotcHVibGljOgotICAgIHR5cGVkZWYgY2hhciBDaDsgICAgLy8hPCBDaGFyYWN0ZXIgdHlwZSAoYnl0ZSkuCi0KLSAgICAvLyEgQ29uc3RydWN0b3IuCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBmcCBGaWxlIHBvaW50ZXIgb3BlbmVkIGZvciByZWFkLgotICAgICAgICBccGFyYW0gYnVmZmVyIHVzZXItc3VwcGxpZWQgYnVmZmVyLgotICAgICAgICBccGFyYW0gYnVmZmVyU2l6ZSBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcy4gTXVzdCA+PTQgYnl0ZXMuCi0gICAgKi8KLSAgICBGaWxlUmVhZFN0cmVhbShzdGQ6OkZJTEUqIGZwLCBjaGFyKiBidWZmZXIsIHNpemVfdCBidWZmZXJTaXplKSA6IGZwXyhmcCksIGJ1ZmZlcl8oYnVmZmVyKSwgYnVmZmVyU2l6ZV8oYnVmZmVyU2l6ZSksIGJ1ZmZlckxhc3RfKDApLCBjdXJyZW50XyhidWZmZXJfKSwgcmVhZENvdW50XygwKSwgY291bnRfKDApLCBlb2ZfKGZhbHNlKSB7IAotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGZwXyAhPSAwKTsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChidWZmZXJTaXplID49IDQpOwotICAgICAgICBSZWFkKCk7Ci0gICAgfQotCi0gICAgQ2ggUGVlaygpIGNvbnN0IHsgcmV0dXJuICpjdXJyZW50XzsgfQotICAgIENoIFRha2UoKSB7IENoIGMgPSAqY3VycmVudF87IFJlYWQoKTsgcmV0dXJuIGM7IH0KLSAgICBzaXplX3QgVGVsbCgpIGNvbnN0IHsgcmV0dXJuIGNvdW50XyArIHN0YXRpY19jYXN0PHNpemVfdD4oY3VycmVudF8gLSBidWZmZXJfKTsgfQotCi0gICAgLy8gTm90IGltcGxlbWVudGVkCi0gICAgdm9pZCBQdXQoQ2gpIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IH0KLSAgICB2b2lkIEZsdXNoKCkgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgfSAKLSAgICBDaCogUHV0QmVnaW4oKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDsgfQotICAgIHNpemVfdCBQdXRFbmQoQ2gqKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDsgfQotCi0gICAgLy8gRm9yIGVuY29kaW5nIGRldGVjdGlvbiBvbmx5LgotICAgIGNvbnN0IENoKiBQZWVrNCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChjdXJyZW50XyArIDQgPD0gYnVmZmVyTGFzdF8pID8gY3VycmVudF8gOiAwOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIFJlYWQoKSB7Ci0gICAgICAgIGlmIChjdXJyZW50XyA8IGJ1ZmZlckxhc3RfKQotICAgICAgICAgICAgKytjdXJyZW50XzsKLSAgICAgICAgZWxzZSBpZiAoIWVvZl8pIHsKLSAgICAgICAgICAgIGNvdW50XyArPSByZWFkQ291bnRfOwotICAgICAgICAgICAgcmVhZENvdW50XyA9IGZyZWFkKGJ1ZmZlcl8sIDEsIGJ1ZmZlclNpemVfLCBmcF8pOwotICAgICAgICAgICAgYnVmZmVyTGFzdF8gPSBidWZmZXJfICsgcmVhZENvdW50XyAtIDE7Ci0gICAgICAgICAgICBjdXJyZW50XyA9IGJ1ZmZlcl87Ci0KLSAgICAgICAgICAgIGlmIChyZWFkQ291bnRfIDwgYnVmZmVyU2l6ZV8pIHsKLSAgICAgICAgICAgICAgICBidWZmZXJfW3JlYWRDb3VudF9dID0gJ1wwJzsKLSAgICAgICAgICAgICAgICArK2J1ZmZlckxhc3RfOwotICAgICAgICAgICAgICAgIGVvZl8gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RkOjpGSUxFKiBmcF87Ci0gICAgQ2ggKmJ1ZmZlcl87Ci0gICAgc2l6ZV90IGJ1ZmZlclNpemVfOwotICAgIENoICpidWZmZXJMYXN0XzsKLSAgICBDaCAqY3VycmVudF87Ci0gICAgc2l6ZV90IHJlYWRDb3VudF87Ci0gICAgc2l6ZV90IGNvdW50XzsgIC8vITwgTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZAotICAgIGJvb2wgZW9mXzsKLX07Ci0KLVJBUElESlNPTl9OQU1FU1BBQ0VfRU5ECi0KLSNpZmRlZiBfX2NsYW5nX18KLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLSNlbmRpZiAvLyBSQVBJREpTT05fRklMRVNUUkVBTV9IXwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9maWxld3JpdGVzdHJlYW0uaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vZmlsZXdyaXRlc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNzhkZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9maWxld3JpdGVzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLyBUZW5jZW50IGlzIHBsZWFzZWQgdG8gc3VwcG9ydCB0aGUgb3BlbiBzb3VyY2UgY29tbXVuaXR5IGJ5IG1ha2luZyBSYXBpZEpTT04gYXZhaWxhYmxlLgotLy8gCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTUgVEhMIEEyOSBMaW1pdGVkLCBhIFRlbmNlbnQgY29tcGFueSwgYW5kIE1pbG8gWWlwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0Ci0vLyBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIAotLy8gdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIAotLy8gQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgCi0vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFJBUElESlNPTl9GSUxFV1JJVEVTVFJFQU1fSF8KLSNkZWZpbmUgUkFQSURKU09OX0ZJTEVXUklURVNUUkVBTV9IXwotCi0jaW5jbHVkZSAic3RyZWFtLmgiCi0jaW5jbHVkZSA8Y3N0ZGlvPgotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QVVNICi1SQVBJREpTT05fRElBR19PRkYodW5yZWFjaGFibGUtY29kZSkKLSNlbmRpZgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi0KLS8vISBXcmFwcGVyIG9mIEMgZmlsZSBzdHJlYW0gZm9yIGlucHV0IHVzaW5nIGZyZWFkKCkuCi0vKiEKLSAgICBcbm90ZSBpbXBsZW1lbnRzIFN0cmVhbSBjb25jZXB0Ci0qLwotY2xhc3MgRmlsZVdyaXRlU3RyZWFtIHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIGNoYXIgQ2g7ICAgIC8vITwgQ2hhcmFjdGVyIHR5cGUuIE9ubHkgc3VwcG9ydCBjaGFyLgotCi0gICAgRmlsZVdyaXRlU3RyZWFtKHN0ZDo6RklMRSogZnAsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlclNpemUpIDogZnBfKGZwKSwgYnVmZmVyXyhidWZmZXIpLCBidWZmZXJFbmRfKGJ1ZmZlciArIGJ1ZmZlclNpemUpLCBjdXJyZW50XyhidWZmZXJfKSB7IAotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGZwXyAhPSAwKTsKLSAgICB9Ci0KLSAgICB2b2lkIFB1dChjaGFyIGMpIHsgCi0gICAgICAgIGlmIChjdXJyZW50XyA+PSBidWZmZXJFbmRfKQotICAgICAgICAgICAgRmx1c2goKTsKLQotICAgICAgICAqY3VycmVudF8rKyA9IGM7Ci0gICAgfQotCi0gICAgdm9pZCBQdXROKGNoYXIgYywgc2l6ZV90IG4pIHsKLSAgICAgICAgc2l6ZV90IGF2YWlsID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXJFbmRfIC0gY3VycmVudF8pOwotICAgICAgICB3aGlsZSAobiA+IGF2YWlsKSB7Ci0gICAgICAgICAgICBzdGQ6Om1lbXNldChjdXJyZW50XywgYywgYXZhaWwpOwotICAgICAgICAgICAgY3VycmVudF8gKz0gYXZhaWw7Ci0gICAgICAgICAgICBGbHVzaCgpOwotICAgICAgICAgICAgbiAtPSBhdmFpbDsKLSAgICAgICAgICAgIGF2YWlsID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXJFbmRfIC0gY3VycmVudF8pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgICAgICBzdGQ6Om1lbXNldChjdXJyZW50XywgYywgbik7Ci0gICAgICAgICAgICBjdXJyZW50XyArPSBuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBGbHVzaCgpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRfICE9IGJ1ZmZlcl8pIHsKLSAgICAgICAgICAgIHNpemVfdCByZXN1bHQgPSBmd3JpdGUoYnVmZmVyXywgMSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihjdXJyZW50XyAtIGJ1ZmZlcl8pLCBmcF8pOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA8IHN0YXRpY19jYXN0PHNpemVfdD4oY3VycmVudF8gLSBidWZmZXJfKSkgewotICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgZGVsaWJlcmF0ZWx5IGlnbm9yZWQgYXQgdGhpcyB0aW1lCi0gICAgICAgICAgICAgICAgLy8gYWRkZWQgdG8gYXZvaWQgd2Fybl91bnVzZWRfcmVzdWx0IGJ1aWxkIGVycm9ycwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudF8gPSBidWZmZXJfOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm90IGltcGxlbWVudGVkCi0gICAgY2hhciBQZWVrKCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLSAgICBjaGFyIFRha2UoKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDsgfQotICAgIHNpemVfdCBUZWxsKCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLSAgICBjaGFyKiBQdXRCZWdpbigpIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IHJldHVybiAwOyB9Ci0gICAgc2l6ZV90IFB1dEVuZChjaGFyKikgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLQotcHJpdmF0ZToKLSAgICAvLyBQcm9oaWJpdCBjb3B5IGNvbnN0cnVjdG9yICYgYXNzaWdubWVudCBvcGVyYXRvci4KLSAgICBGaWxlV3JpdGVTdHJlYW0oY29uc3QgRmlsZVdyaXRlU3RyZWFtJik7Ci0gICAgRmlsZVdyaXRlU3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgRmlsZVdyaXRlU3RyZWFtJik7Ci0KLSAgICBzdGQ6OkZJTEUqIGZwXzsKLSAgICBjaGFyICpidWZmZXJfOwotICAgIGNoYXIgKmJ1ZmZlckVuZF87Ci0gICAgY2hhciAqY3VycmVudF87Ci19OwotCi0vLyEgSW1wbGVtZW50IHNwZWNpYWxpemVkIHZlcnNpb24gb2YgUHV0TigpIHdpdGggbWVtc2V0KCkgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4KLXRlbXBsYXRlPD4KLWlubGluZSB2b2lkIFB1dE4oRmlsZVdyaXRlU3RyZWFtJiBzdHJlYW0sIGNoYXIgYywgc2l6ZV90IG4pIHsKLSAgICBzdHJlYW0uUHV0TihjLCBuKTsKLX0KLQotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUE9QCi0jZW5kaWYKLQotI2VuZGlmIC8vIFJBUElESlNPTl9GSUxFU1RSRUFNX0hfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2Z3ZC5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9md2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxMDRlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2Z3ZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUuCi0vLyAKLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0vLyB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgCi0vLyBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgUkFQSURKU09OX0ZXRF9IXwotI2RlZmluZSBSQVBJREpTT05fRldEX0hfCi0KLSNpbmNsdWRlICJyYXBpZGpzb24uaCIKLQotUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTgotCi0vLyBlbmNvZGluZ3MuaAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4gc3RydWN0IFVURjg7Ci10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4gc3RydWN0IFVURjE2OwotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGU+IHN0cnVjdCBVVEYxNkJFOwotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGU+IHN0cnVjdCBVVEYxNkxFOwotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhclR5cGU+IHN0cnVjdCBVVEYzMjsKLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlPiBzdHJ1Y3QgVVRGMzJCRTsKLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlPiBzdHJ1Y3QgVVRGMzJMRTsKLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlPiBzdHJ1Y3QgQVNDSUk7Ci10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyVHlwZT4gc3RydWN0IEF1dG9VVEY7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFNvdXJjZUVuY29kaW5nLCB0eXBlbmFtZSBUYXJnZXRFbmNvZGluZz4KLXN0cnVjdCBUcmFuc2NvZGVyOwotCi0vLyBhbGxvY2F0b3JzLmgKLQotY2xhc3MgQ3J0QWxsb2NhdG9yOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZUFsbG9jYXRvcj4KLWNsYXNzIE1lbW9yeVBvb2xBbGxvY2F0b3I7Ci0KLS8vIHN0cmVhbS5oCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbmNvZGluZz4KLXN0cnVjdCBHZW5lcmljU3RyaW5nU3RyZWFtOwotCi10eXBlZGVmIEdlbmVyaWNTdHJpbmdTdHJlYW08VVRGODxjaGFyPiA+IFN0cmluZ1N0cmVhbTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVuY29kaW5nPgotc3RydWN0IEdlbmVyaWNJbnNpdHVTdHJpbmdTdHJlYW07Ci0KLXR5cGVkZWYgR2VuZXJpY0luc2l0dVN0cmluZ1N0cmVhbTxVVEY4PGNoYXI+ID4gSW5zaXR1U3RyaW5nU3RyZWFtOwotCi0vLyBzdHJpbmdidWZmZXIuaAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRW5jb2RpbmcsIHR5cGVuYW1lIEFsbG9jYXRvcj4KLWNsYXNzIEdlbmVyaWNTdHJpbmdCdWZmZXI7Ci0KLXR5cGVkZWYgR2VuZXJpY1N0cmluZ0J1ZmZlcjxVVEY4PGNoYXI+LCBDcnRBbGxvY2F0b3I+IFN0cmluZ0J1ZmZlcjsKLQotLy8gZmlsZXJlYWRzdHJlYW0uaAotCi1jbGFzcyBGaWxlUmVhZFN0cmVhbTsKLQotLy8gZmlsZXdyaXRlc3RyZWFtLmgKLQotY2xhc3MgRmlsZVdyaXRlU3RyZWFtOwotCi0vLyBtZW1vcnlidWZmZXIuaAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yPgotc3RydWN0IEdlbmVyaWNNZW1vcnlCdWZmZXI7Ci0KLXR5cGVkZWYgR2VuZXJpY01lbW9yeUJ1ZmZlcjxDcnRBbGxvY2F0b3I+IE1lbW9yeUJ1ZmZlcjsKLQotLy8gbWVtb3J5c3RyZWFtLmgKLQotc3RydWN0IE1lbW9yeVN0cmVhbTsKLQotLy8gcmVhZGVyLmgKLQotdGVtcGxhdGU8dHlwZW5hbWUgRW5jb2RpbmcsIHR5cGVuYW1lIERlcml2ZWQ+Ci1zdHJ1Y3QgQmFzZVJlYWRlckhhbmRsZXI7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VFbmNvZGluZywgdHlwZW5hbWUgVGFyZ2V0RW5jb2RpbmcsIHR5cGVuYW1lIFN0YWNrQWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY1JlYWRlcjsKLQotdHlwZWRlZiBHZW5lcmljUmVhZGVyPFVURjg8Y2hhcj4sIFVURjg8Y2hhcj4sIENydEFsbG9jYXRvcj4gUmVhZGVyOwotCi0vLyB3cml0ZXIuaAotCi10ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRTdHJlYW0sIHR5cGVuYW1lIFNvdXJjZUVuY29kaW5nLCB0eXBlbmFtZSBUYXJnZXRFbmNvZGluZywgdHlwZW5hbWUgU3RhY2tBbGxvY2F0b3IsIHVuc2lnbmVkIHdyaXRlRmxhZ3M+Ci1jbGFzcyBXcml0ZXI7Ci0KLS8vIHByZXR0eXdyaXRlci5oCi0KLXRlbXBsYXRlPHR5cGVuYW1lIE91dHB1dFN0cmVhbSwgdHlwZW5hbWUgU291cmNlRW5jb2RpbmcsIHR5cGVuYW1lIFRhcmdldEVuY29kaW5nLCB0eXBlbmFtZSBTdGFja0FsbG9jYXRvciwgdW5zaWduZWQgd3JpdGVGbGFncz4KLWNsYXNzIFByZXR0eVdyaXRlcjsKLQotLy8gZG9jdW1lbnQuaAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRW5jb2RpbmcsIHR5cGVuYW1lIEFsbG9jYXRvcj4gCi1zdHJ1Y3QgR2VuZXJpY01lbWJlcjsKLQotdGVtcGxhdGUgPGJvb2wgQ29uc3QsIHR5cGVuYW1lIEVuY29kaW5nLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1jbGFzcyBHZW5lcmljTWVtYmVySXRlcmF0b3I7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJUeXBlPgotc3RydWN0IEdlbmVyaWNTdHJpbmdSZWY7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbmNvZGluZywgdHlwZW5hbWUgQWxsb2NhdG9yPiAKLWNsYXNzIEdlbmVyaWNWYWx1ZTsKLQotdHlwZWRlZiBHZW5lcmljVmFsdWU8VVRGODxjaGFyPiwgTWVtb3J5UG9vbEFsbG9jYXRvcjxDcnRBbGxvY2F0b3I+ID4gVmFsdWU7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbmNvZGluZywgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBTdGFja0FsbG9jYXRvcj4KLWNsYXNzIEdlbmVyaWNEb2N1bWVudDsKLQotdHlwZWRlZiBHZW5lcmljRG9jdW1lbnQ8VVRGODxjaGFyPiwgTWVtb3J5UG9vbEFsbG9jYXRvcjxDcnRBbGxvY2F0b3I+LCBDcnRBbGxvY2F0b3I+IERvY3VtZW50OwotCi0vLyBwb2ludGVyLmgKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY1BvaW50ZXI7Ci0KLXR5cGVkZWYgR2VuZXJpY1BvaW50ZXI8VmFsdWUsIENydEFsbG9jYXRvcj4gUG9pbnRlcjsKLQotLy8gc2NoZW1hLmgKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFNjaGVtYURvY3VtZW50VHlwZT4KLWNsYXNzIElHZW5lcmljUmVtb3RlU2NoZW1hRG9jdW1lbnRQcm92aWRlcjsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgQWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY1NjaGVtYURvY3VtZW50OwotCi10eXBlZGVmIEdlbmVyaWNTY2hlbWFEb2N1bWVudDxWYWx1ZSwgQ3J0QWxsb2NhdG9yPiBTY2hlbWFEb2N1bWVudDsKLXR5cGVkZWYgSUdlbmVyaWNSZW1vdGVTY2hlbWFEb2N1bWVudFByb3ZpZGVyPFNjaGVtYURvY3VtZW50PiBJUmVtb3RlU2NoZW1hRG9jdW1lbnRQcm92aWRlcjsKLQotdGVtcGxhdGUgPAotICAgIHR5cGVuYW1lIFNjaGVtYURvY3VtZW50VHlwZSwKLSAgICB0eXBlbmFtZSBPdXRwdXRIYW5kbGVyLAotICAgIHR5cGVuYW1lIFN0YXRlQWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY1NjaGVtYVZhbGlkYXRvcjsKLQotdHlwZWRlZiBHZW5lcmljU2NoZW1hVmFsaWRhdG9yPFNjaGVtYURvY3VtZW50LCBCYXNlUmVhZGVySGFuZGxlcjxVVEY4PGNoYXI+LCB2b2lkPiwgQ3J0QWxsb2NhdG9yPiBTY2hlbWFWYWxpZGF0b3I7Ci0KLVJBUElESlNPTl9OQU1FU1BBQ0VfRU5ECi0KLSNlbmRpZiAvLyBSQVBJREpTT05fUkFQSURKU09ORldEX0hfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ludGVybmFsL2JpZ2ludGVnZXIuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvYmlnaW50ZWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDNlODhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvYmlnaW50ZWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUuCi0vLyAKLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0vLyB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgCi0vLyBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgUkFQSURKU09OX0JJR0lOVEVHRVJfSF8KLSNkZWZpbmUgUkFQSURKU09OX0JJR0lOVEVHRVJfSF8KLQotI2luY2x1ZGUgIi4uL3JhcGlkanNvbi5oIgotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9BTUQ2NCkKLSNpbmNsdWRlIDxpbnRyaW4uaD4gLy8gZm9yIF91bXVsMTI4Ci0jcHJhZ21hIGludHJpbnNpYyhfdW11bDEyOCkKLSNlbmRpZgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBCaWdJbnRlZ2VyIHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIHVpbnQ2NF90IFR5cGU7Ci0KLSAgICBCaWdJbnRlZ2VyKGNvbnN0IEJpZ0ludGVnZXImIHJocykgOiBjb3VudF8ocmhzLmNvdW50XykgewotICAgICAgICBzdGQ6Om1lbWNweShkaWdpdHNfLCByaHMuZGlnaXRzXywgY291bnRfICogc2l6ZW9mKFR5cGUpKTsKLSAgICB9Ci0KLSAgICBleHBsaWNpdCBCaWdJbnRlZ2VyKHVpbnQ2NF90IHUpIDogY291bnRfKDEpIHsKLSAgICAgICAgZGlnaXRzX1swXSA9IHU7Ci0gICAgfQotCi0gICAgQmlnSW50ZWdlcihjb25zdCBjaGFyKiBkZWNpbWFscywgc2l6ZV90IGxlbmd0aCkgOiBjb3VudF8oMSkgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGxlbmd0aCA+IDApOwotICAgICAgICBkaWdpdHNfWzBdID0gMDsKLSAgICAgICAgc2l6ZV90IGkgPSAwOwotICAgICAgICBjb25zdCBzaXplX3Qga01heERpZ2l0UGVySXRlcmF0aW9uID0gMTk7ICAvLyAyXjY0ID0gMTg0NDY3NDQwNzM3MDk1NTE2MTYgPiAxMF4xOQotICAgICAgICB3aGlsZSAobGVuZ3RoID49IGtNYXhEaWdpdFBlckl0ZXJhdGlvbikgewotICAgICAgICAgICAgQXBwZW5kRGVjaW1hbDY0KGRlY2ltYWxzICsgaSwgZGVjaW1hbHMgKyBpICsga01heERpZ2l0UGVySXRlcmF0aW9uKTsKLSAgICAgICAgICAgIGxlbmd0aCAtPSBrTWF4RGlnaXRQZXJJdGVyYXRpb247Ci0gICAgICAgICAgICBpICs9IGtNYXhEaWdpdFBlckl0ZXJhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsZW5ndGggPiAwKQotICAgICAgICAgICAgQXBwZW5kRGVjaW1hbDY0KGRlY2ltYWxzICsgaSwgZGVjaW1hbHMgKyBpICsgbGVuZ3RoKTsKLSAgICB9Ci0gICAgCi0gICAgQmlnSW50ZWdlciYgb3BlcmF0b3I9KGNvbnN0IEJpZ0ludGVnZXIgJnJocykKLSAgICB7Ci0gICAgICAgIGlmICh0aGlzICE9ICZyaHMpIHsKLSAgICAgICAgICAgIGNvdW50XyA9IHJocy5jb3VudF87Ci0gICAgICAgICAgICBzdGQ6Om1lbWNweShkaWdpdHNfLCByaHMuZGlnaXRzXywgY291bnRfICogc2l6ZW9mKFR5cGUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIAotICAgIEJpZ0ludGVnZXImIG9wZXJhdG9yPSh1aW50NjRfdCB1KSB7Ci0gICAgICAgIGRpZ2l0c19bMF0gPSB1OyAgICAgICAgICAgIAotICAgICAgICBjb3VudF8gPSAxOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgQmlnSW50ZWdlciYgb3BlcmF0b3IrPSh1aW50NjRfdCB1KSB7Ci0gICAgICAgIFR5cGUgYmFja3VwID0gZGlnaXRzX1swXTsKLSAgICAgICAgZGlnaXRzX1swXSArPSB1OwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50XyAtIDE7IGkrKykgewotICAgICAgICAgICAgaWYgKGRpZ2l0c19baV0gPj0gYmFja3VwKQotICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsgLy8gbm8gY2FycnkKLSAgICAgICAgICAgIGJhY2t1cCA9IGRpZ2l0c19baSArIDFdOwotICAgICAgICAgICAgZGlnaXRzX1tpICsgMV0gKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExhc3QgY2FycnkKLSAgICAgICAgaWYgKGRpZ2l0c19bY291bnRfIC0gMV0gPCBiYWNrdXApCi0gICAgICAgICAgICBQdXNoQmFjaygxKTsKLQotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgQmlnSW50ZWdlciYgb3BlcmF0b3IqPSh1aW50NjRfdCB1KSB7Ci0gICAgICAgIGlmICh1ID09IDApIHJldHVybiAqdGhpcyA9IDA7Ci0gICAgICAgIGlmICh1ID09IDEpIHJldHVybiAqdGhpczsKLSAgICAgICAgaWYgKCp0aGlzID09IDEpIHJldHVybiAqdGhpcyA9IHU7Ci0KLSAgICAgICAgdWludDY0X3QgayA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnRfOyBpKyspIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IGhpOwotICAgICAgICAgICAgZGlnaXRzX1tpXSA9IE11bEFkZDY0KGRpZ2l0c19baV0sIHUsIGssICZoaSk7Ci0gICAgICAgICAgICBrID0gaGk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChrID4gMCkKLSAgICAgICAgICAgIFB1c2hCYWNrKGspOwotCi0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBCaWdJbnRlZ2VyJiBvcGVyYXRvcio9KHVpbnQzMl90IHUpIHsKLSAgICAgICAgaWYgKHUgPT0gMCkgcmV0dXJuICp0aGlzID0gMDsKLSAgICAgICAgaWYgKHUgPT0gMSkgcmV0dXJuICp0aGlzOwotICAgICAgICBpZiAoKnRoaXMgPT0gMSkgcmV0dXJuICp0aGlzID0gdTsKLQotICAgICAgICB1aW50NjRfdCBrID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudF87IGkrKykgewotICAgICAgICAgICAgY29uc3QgdWludDY0X3QgYyA9IGRpZ2l0c19baV0gPj4gMzI7Ci0gICAgICAgICAgICBjb25zdCB1aW50NjRfdCBkID0gZGlnaXRzX1tpXSAmIDB4RkZGRkZGRkY7Ci0gICAgICAgICAgICBjb25zdCB1aW50NjRfdCB1YyA9IHUgKiBjOwotICAgICAgICAgICAgY29uc3QgdWludDY0X3QgdWQgPSB1ICogZDsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IHAwID0gdWQgKyBrOwotICAgICAgICAgICAgY29uc3QgdWludDY0X3QgcDEgPSB1YyArIChwMCA+PiAzMik7Ci0gICAgICAgICAgICBkaWdpdHNfW2ldID0gKHAwICYgMHhGRkZGRkZGRikgfCAocDEgPDwgMzIpOwotICAgICAgICAgICAgayA9IHAxID4+IDMyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoayA+IDApCi0gICAgICAgICAgICBQdXNoQmFjayhrKTsKLQotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgQmlnSW50ZWdlciYgb3BlcmF0b3I8PD0oc2l6ZV90IHNoaWZ0KSB7Ci0gICAgICAgIGlmIChJc1plcm8oKSB8fCBzaGlmdCA9PSAwKSByZXR1cm4gKnRoaXM7Ci0KLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IHNoaWZ0IC8ga1R5cGVCaXQ7Ci0gICAgICAgIHNpemVfdCBpbnRlclNoaWZ0ID0gc2hpZnQgJSBrVHlwZUJpdDsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChjb3VudF8gKyBvZmZzZXQgPD0ga0NhcGFjaXR5KTsKLQotICAgICAgICBpZiAoaW50ZXJTaGlmdCA9PSAwKSB7Ci0gICAgICAgICAgICBzdGQ6Om1lbW1vdmUoJmRpZ2l0c19bY291bnRfIC0gMSArIG9mZnNldF0sICZkaWdpdHNfW2NvdW50XyAtIDFdLCBjb3VudF8gKiBzaXplb2YoVHlwZSkpOwotICAgICAgICAgICAgY291bnRfICs9IG9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGRpZ2l0c19bY291bnRfXSA9IDA7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gY291bnRfOyBpID4gMDsgaS0tKQotICAgICAgICAgICAgICAgIGRpZ2l0c19baSArIG9mZnNldF0gPSAoZGlnaXRzX1tpXSA8PCBpbnRlclNoaWZ0KSB8IChkaWdpdHNfW2kgLSAxXSA+PiAoa1R5cGVCaXQgLSBpbnRlclNoaWZ0KSk7Ci0gICAgICAgICAgICBkaWdpdHNfW29mZnNldF0gPSBkaWdpdHNfWzBdIDw8IGludGVyU2hpZnQ7Ci0gICAgICAgICAgICBjb3VudF8gKz0gb2Zmc2V0OwotICAgICAgICAgICAgaWYgKGRpZ2l0c19bY291bnRfXSkKLSAgICAgICAgICAgICAgICBjb3VudF8rKzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0ZDo6bWVtc2V0KGRpZ2l0c18sIDAsIG9mZnNldCAqIHNpemVvZihUeXBlKSk7Ci0KLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCaWdJbnRlZ2VyJiByaHMpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGNvdW50XyA9PSByaHMuY291bnRfICYmIHN0ZDo6bWVtY21wKGRpZ2l0c18sIHJocy5kaWdpdHNfLCBjb3VudF8gKiBzaXplb2YoVHlwZSkpID09IDA7Ci0gICAgfQotCi0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGUgcmhzKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBjb3VudF8gPT0gMSAmJiBkaWdpdHNfWzBdID09IHJoczsKLSAgICB9Ci0KLSAgICBCaWdJbnRlZ2VyJiBNdWx0aXBseVBvdzUodW5zaWduZWQgZXhwKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUG93NVsxMl0gPSB7Ci0gICAgICAgICAgICA1LAotICAgICAgICAgICAgNSAqIDUsCi0gICAgICAgICAgICA1ICogNSAqIDUsCi0gICAgICAgICAgICA1ICogNSAqIDUgKiA1LAotICAgICAgICAgICAgNSAqIDUgKiA1ICogNSAqIDUsCi0gICAgICAgICAgICA1ICogNSAqIDUgKiA1ICogNSAqIDUsCi0gICAgICAgICAgICA1ICogNSAqIDUgKiA1ICogNSAqIDUgKiA1LAotICAgICAgICAgICAgNSAqIDUgKiA1ICogNSAqIDUgKiA1ICogNSAqIDUsCi0gICAgICAgICAgICA1ICogNSAqIDUgKiA1ICogNSAqIDUgKiA1ICogNSAqIDUsCi0gICAgICAgICAgICA1ICogNSAqIDUgKiA1ICogNSAqIDUgKiA1ICogNSAqIDUgKiA1LAotICAgICAgICAgICAgNSAqIDUgKiA1ICogNSAqIDUgKiA1ICogNSAqIDUgKiA1ICogNSAqIDUsCi0gICAgICAgICAgICA1ICogNSAqIDUgKiA1ICogNSAqIDUgKiA1ICogNSAqIDUgKiA1ICogNSAqIDUKLSAgICAgICAgfTsKLSAgICAgICAgaWYgKGV4cCA9PSAwKSByZXR1cm4gKnRoaXM7Ci0gICAgICAgIGZvciAoOyBleHAgPj0gMjc7IGV4cCAtPSAyNykgKnRoaXMgKj0gUkFQSURKU09OX1VJTlQ2NF9DMigwWDY3NjVDNzkzLCAwWEZBMTAwNzlEKTsgLy8gNV4yNwotICAgICAgICBmb3IgKDsgZXhwID49IDEzOyBleHAgLT0gMTMpICp0aGlzICo9IHN0YXRpY19jYXN0PHVpbnQzMl90PigxMjIwNzAzMTI1dSk7IC8vIDVeMTMKLSAgICAgICAgaWYgKGV4cCA+IDApICAgICAgICAgICAgICAgICAqdGhpcyAqPSBrUG93NVtleHAgLSAxXTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICAgIC8vIENvbXB1dGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCByaHMuCi0gICAgLy8gQXNzdW1lIHRoaXMgIT0gcmhzCi0gICAgYm9vbCBEaWZmZXJlbmNlKGNvbnN0IEJpZ0ludGVnZXImIHJocywgQmlnSW50ZWdlciogb3V0KSBjb25zdCB7Ci0gICAgICAgIGludCBjbXAgPSBDb21wYXJlKHJocyk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoY21wICE9IDApOwotICAgICAgICBjb25zdCBCaWdJbnRlZ2VyICphLCAqYjsgIC8vIE1ha2VzIGEgPiBiCi0gICAgICAgIGJvb2wgcmV0OwotICAgICAgICBpZiAoY21wIDwgMCkgeyBhID0gJnJoczsgYiA9IHRoaXM7IHJldCA9IHRydWU7IH0KLSAgICAgICAgZWxzZSAgICAgICAgIHsgYSA9IHRoaXM7IGIgPSAmcmhzOyByZXQgPSBmYWxzZTsgfQotCi0gICAgICAgIFR5cGUgYm9ycm93ID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhLT5jb3VudF87IGkrKykgewotICAgICAgICAgICAgVHlwZSBkID0gYS0+ZGlnaXRzX1tpXSAtIGJvcnJvdzsKLSAgICAgICAgICAgIGlmIChpIDwgYi0+Y291bnRfKQotICAgICAgICAgICAgICAgIGQgLT0gYi0+ZGlnaXRzX1tpXTsKLSAgICAgICAgICAgIGJvcnJvdyA9IChkID4gYS0+ZGlnaXRzX1tpXSkgPyAxIDogMDsKLSAgICAgICAgICAgIG91dC0+ZGlnaXRzX1tpXSA9IGQ7Ci0gICAgICAgICAgICBpZiAoZCAhPSAwKQotICAgICAgICAgICAgICAgIG91dC0+Y291bnRfID0gaSArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGludCBDb21wYXJlKGNvbnN0IEJpZ0ludGVnZXImIHJocykgY29uc3QgewotICAgICAgICBpZiAoY291bnRfICE9IHJocy5jb3VudF8pCi0gICAgICAgICAgICByZXR1cm4gY291bnRfIDwgcmhzLmNvdW50XyA/IC0xIDogMTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gY291bnRfOyBpLS0gPiAwOykKLSAgICAgICAgICAgIGlmIChkaWdpdHNfW2ldICE9IHJocy5kaWdpdHNfW2ldKQotICAgICAgICAgICAgICAgIHJldHVybiBkaWdpdHNfW2ldIDwgcmhzLmRpZ2l0c19baV0gPyAtMSA6IDE7Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IEdldENvdW50KCkgY29uc3QgeyByZXR1cm4gY291bnRfOyB9Ci0gICAgVHlwZSBHZXREaWdpdChzaXplX3QgaW5kZXgpIGNvbnN0IHsgUkFQSURKU09OX0FTU0VSVChpbmRleCA8IGNvdW50Xyk7IHJldHVybiBkaWdpdHNfW2luZGV4XTsgfQotICAgIGJvb2wgSXNaZXJvKCkgY29uc3QgeyByZXR1cm4gY291bnRfID09IDEgJiYgZGlnaXRzX1swXSA9PSAwOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBBcHBlbmREZWNpbWFsNjQoY29uc3QgY2hhciogYmVnaW4sIGNvbnN0IGNoYXIqIGVuZCkgewotICAgICAgICB1aW50NjRfdCB1ID0gUGFyc2VVaW50NjQoYmVnaW4sIGVuZCk7Ci0gICAgICAgIGlmIChJc1plcm8oKSkKLSAgICAgICAgICAgICp0aGlzID0gdTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBleHAgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZW5kIC0gYmVnaW4pOwotICAgICAgICAgICAgKE11bHRpcGx5UG93NShleHApIDw8PSBleHApICs9IHU7ICAgLy8gKnRoaXMgPSAqdGhpcyAqIDEwXmV4cCArIHUKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgUHVzaEJhY2soVHlwZSBkaWdpdCkgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGNvdW50XyA8IGtDYXBhY2l0eSk7Ci0gICAgICAgIGRpZ2l0c19bY291bnRfKytdID0gZGlnaXQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHVpbnQ2NF90IFBhcnNlVWludDY0KGNvbnN0IGNoYXIqIGJlZ2luLCBjb25zdCBjaGFyKiBlbmQpIHsKLSAgICAgICAgdWludDY0X3QgciA9IDA7Ci0gICAgICAgIGZvciAoY29uc3QgY2hhciogcCA9IGJlZ2luOyBwICE9IGVuZDsgKytwKSB7Ci0gICAgICAgICAgICBSQVBJREpTT05fQVNTRVJUKCpwID49ICcwJyAmJiAqcCA8PSAnOScpOwotICAgICAgICAgICAgciA9IHIgKiAxMHUgKyBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oKnAgLSAnMCcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLQotICAgIC8vIEFzc3VtZSBhICogYiArIGsgPCAyXjEyOAotICAgIHN0YXRpYyB1aW50NjRfdCBNdWxBZGQ2NCh1aW50NjRfdCBhLCB1aW50NjRfdCBiLCB1aW50NjRfdCBrLCB1aW50NjRfdCogb3V0SGlnaCkgewotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fQU1ENjQpCi0gICAgICAgIHVpbnQ2NF90IGxvdyA9IF91bXVsMTI4KGEsIGIsIG91dEhpZ2gpICsgazsKLSAgICAgICAgaWYgKGxvdyA8IGspCi0gICAgICAgICAgICAoKm91dEhpZ2gpKys7Ci0gICAgICAgIHJldHVybiBsb3c7Ci0jZWxpZiAoX19HTlVDX18gPiA0IHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYpKSAmJiBkZWZpbmVkKF9feDg2XzY0X18pCi0gICAgICAgIF9fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBfX2ludDEyOCB1aW50MTI4OwotICAgICAgICB1aW50MTI4IHAgPSBzdGF0aWNfY2FzdDx1aW50MTI4PihhKSAqIHN0YXRpY19jYXN0PHVpbnQxMjg+KGIpOwotICAgICAgICBwICs9IGs7Ci0gICAgICAgICpvdXRIaWdoID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHAgPj4gNjQpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHApOwotI2Vsc2UKLSAgICAgICAgY29uc3QgdWludDY0X3QgYTAgPSBhICYgMHhGRkZGRkZGRiwgYTEgPSBhID4+IDMyLCBiMCA9IGIgJiAweEZGRkZGRkZGLCBiMSA9IGIgPj4gMzI7Ci0gICAgICAgIHVpbnQ2NF90IHgwID0gYTAgKiBiMCwgeDEgPSBhMCAqIGIxLCB4MiA9IGExICogYjAsIHgzID0gYTEgKiBiMTsKLSAgICAgICAgeDEgKz0gKHgwID4+IDMyKTsgLy8gY2FuJ3QgZ2l2ZSBjYXJyeQotICAgICAgICB4MSArPSB4MjsKLSAgICAgICAgaWYgKHgxIDwgeDIpCi0gICAgICAgICAgICB4MyArPSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDEpIDw8IDMyKTsKLSAgICAgICAgdWludDY0X3QgbG8gPSAoeDEgPDwgMzIpICsgKHgwICYgMHhGRkZGRkZGRik7Ci0gICAgICAgIHVpbnQ2NF90IGhpID0geDMgKyAoeDEgPj4gMzIpOwotCi0gICAgICAgIGxvICs9IGs7Ci0gICAgICAgIGlmIChsbyA8IGspCi0gICAgICAgICAgICBoaSsrOwotICAgICAgICAqb3V0SGlnaCA9IGhpOwotICAgICAgICByZXR1cm4gbG87Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCaXRDb3VudCA9IDMzMjg7ICAvLyA2NGJpdCAqIDU0ID4gMTBeMTAwMAotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0NhcGFjaXR5ID0ga0JpdENvdW50IC8gc2l6ZW9mKFR5cGUpOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1R5cGVCaXQgPSBzaXplb2YoVHlwZSkgKiA4OwotCi0gICAgVHlwZSBkaWdpdHNfW2tDYXBhY2l0eV07Ci0gICAgc2l6ZV90IGNvdW50XzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGludGVybmFsCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jZW5kaWYgLy8gUkFQSURKU09OX0JJR0lOVEVHRVJfSF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvZGl5ZnAuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvZGl5ZnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmZWZkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ludGVybmFsL2RpeWZwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLy8gVGhpcyBpcyBhIEMrKyBoZWFkZXItb25seSBpbXBsZW1lbnRhdGlvbiBvZiBHcmlzdTIgYWxnb3JpdGhtIGZyb20gdGhlIHB1YmxpY2F0aW9uOgotLy8gTG9pdHNjaCwgRmxvcmlhbi4gIlByaW50aW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgcXVpY2tseSBhbmQgYWNjdXJhdGVseSB3aXRoCi0vLyBpbnRlZ2Vycy4iIEFDTSBTaWdwbGFuIE5vdGljZXMgNDUuNiAoMjAxMCk6IDIzMy0yNDMuCi0KLSNpZm5kZWYgUkFQSURKU09OX0RJWUZQX0hfCi0jZGVmaW5lIFJBUElESlNPTl9ESVlGUF9IXwotCi0jaW5jbHVkZSAiLi4vcmFwaWRqc29uLmgiCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0FNRDY0KQotI2luY2x1ZGUgPGludHJpbi5oPgotI3ByYWdtYSBpbnRyaW5zaWMoX0JpdFNjYW5SZXZlcnNlNjQpCi0jcHJhZ21hIGludHJpbnNpYyhfdW11bDEyOCkKLSNlbmRpZgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jaWZkZWYgX19HTlVDX18KLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRihlZmZjKyspCi0jZW5kaWYKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKHBhZGRlZCkKLSNlbmRpZgotCi1zdHJ1Y3QgRGl5RnAgewotICAgIERpeUZwKCkgOiBmKCksIGUoKSB7fQotCi0gICAgRGl5RnAodWludDY0X3QgZnAsIGludCBleHApIDogZihmcCksIGUoZXhwKSB7fQotCi0gICAgZXhwbGljaXQgRGl5RnAoZG91YmxlIGQpIHsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgZG91YmxlIGQ7Ci0gICAgICAgICAgICB1aW50NjRfdCB1NjQ7Ci0gICAgICAgIH0gdSA9IHsgZCB9OwotCi0gICAgICAgIGludCBiaWFzZWRfZSA9IHN0YXRpY19jYXN0PGludD4oKHUudTY0ICYga0RwRXhwb25lbnRNYXNrKSA+PiBrRHBTaWduaWZpY2FuZFNpemUpOwotICAgICAgICB1aW50NjRfdCBzaWduaWZpY2FuZCA9ICh1LnU2NCAmIGtEcFNpZ25pZmljYW5kTWFzayk7Ci0gICAgICAgIGlmIChiaWFzZWRfZSAhPSAwKSB7Ci0gICAgICAgICAgICBmID0gc2lnbmlmaWNhbmQgKyBrRHBIaWRkZW5CaXQ7Ci0gICAgICAgICAgICBlID0gYmlhc2VkX2UgLSBrRHBFeHBvbmVudEJpYXM7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZiA9IHNpZ25pZmljYW5kOwotICAgICAgICAgICAgZSA9IGtEcE1pbkV4cG9uZW50ICsgMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIERpeUZwIG9wZXJhdG9yLShjb25zdCBEaXlGcCYgcmhzKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBEaXlGcChmIC0gcmhzLmYsIGUpOwotICAgIH0KLQotICAgIERpeUZwIG9wZXJhdG9yKihjb25zdCBEaXlGcCYgcmhzKSBjb25zdCB7Ci0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9BTUQ2NCkKLSAgICAgICAgdWludDY0X3QgaDsKLSAgICAgICAgdWludDY0X3QgbCA9IF91bXVsMTI4KGYsIHJocy5mLCAmaCk7Ci0gICAgICAgIGlmIChsICYgKHVpbnQ2NF90KDEpIDw8IDYzKSkgLy8gcm91bmRpbmcKLSAgICAgICAgICAgIGgrKzsKLSAgICAgICAgcmV0dXJuIERpeUZwKGgsIGUgKyByaHMuZSArIDY0KTsKLSNlbGlmIChfX0dOVUNfXyA+IDQgfHwgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNikpICYmIGRlZmluZWQoX194ODZfNjRfXykKLSAgICAgICAgX19leHRlbnNpb25fXyB0eXBlZGVmIHVuc2lnbmVkIF9faW50MTI4IHVpbnQxMjg7Ci0gICAgICAgIHVpbnQxMjggcCA9IHN0YXRpY19jYXN0PHVpbnQxMjg+KGYpICogc3RhdGljX2Nhc3Q8dWludDEyOD4ocmhzLmYpOwotICAgICAgICB1aW50NjRfdCBoID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHAgPj4gNjQpOwotICAgICAgICB1aW50NjRfdCBsID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHApOwotICAgICAgICBpZiAobCAmICh1aW50NjRfdCgxKSA8PCA2MykpIC8vIHJvdW5kaW5nCi0gICAgICAgICAgICBoKys7Ci0gICAgICAgIHJldHVybiBEaXlGcChoLCBlICsgcmhzLmUgKyA2NCk7Ci0jZWxzZQotICAgICAgICBjb25zdCB1aW50NjRfdCBNMzIgPSAweEZGRkZGRkZGOwotICAgICAgICBjb25zdCB1aW50NjRfdCBhID0gZiA+PiAzMjsKLSAgICAgICAgY29uc3QgdWludDY0X3QgYiA9IGYgJiBNMzI7Ci0gICAgICAgIGNvbnN0IHVpbnQ2NF90IGMgPSByaHMuZiA+PiAzMjsKLSAgICAgICAgY29uc3QgdWludDY0X3QgZCA9IHJocy5mICYgTTMyOwotICAgICAgICBjb25zdCB1aW50NjRfdCBhYyA9IGEgKiBjOwotICAgICAgICBjb25zdCB1aW50NjRfdCBiYyA9IGIgKiBjOwotICAgICAgICBjb25zdCB1aW50NjRfdCBhZCA9IGEgKiBkOwotICAgICAgICBjb25zdCB1aW50NjRfdCBiZCA9IGIgKiBkOwotICAgICAgICB1aW50NjRfdCB0bXAgPSAoYmQgPj4gMzIpICsgKGFkICYgTTMyKSArIChiYyAmIE0zMik7Ci0gICAgICAgIHRtcCArPSAxVSA8PCAzMTsgIC8vLyBtdWx0X3JvdW5kCi0gICAgICAgIHJldHVybiBEaXlGcChhYyArIChhZCA+PiAzMikgKyAoYmMgPj4gMzIpICsgKHRtcCA+PiAzMiksIGUgKyByaHMuZSArIDY0KTsKLSNlbmRpZgotICAgIH0KLQotICAgIERpeUZwIE5vcm1hbGl6ZSgpIGNvbnN0IHsKLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0FNRDY0KQotICAgICAgICB1bnNpZ25lZCBsb25nIGluZGV4OwotICAgICAgICBfQml0U2NhblJldmVyc2U2NCgmaW5kZXgsIGYpOwotICAgICAgICByZXR1cm4gRGl5RnAoZiA8PCAoNjMgLSBpbmRleCksIGUgLSAoNjMgLSBpbmRleCkpOwotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNAotICAgICAgICBpbnQgcyA9IF9fYnVpbHRpbl9jbHpsbChmKTsKLSAgICAgICAgcmV0dXJuIERpeUZwKGYgPDwgcywgZSAtIHMpOwotI2Vsc2UKLSAgICAgICAgRGl5RnAgcmVzID0gKnRoaXM7Ci0gICAgICAgIHdoaWxlICghKHJlcy5mICYgKHN0YXRpY19jYXN0PHVpbnQ2NF90PigxKSA8PCA2MykpKSB7Ci0gICAgICAgICAgICByZXMuZiA8PD0gMTsKLSAgICAgICAgICAgIHJlcy5lLS07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSNlbmRpZgotICAgIH0KLQotICAgIERpeUZwIE5vcm1hbGl6ZUJvdW5kYXJ5KCkgY29uc3QgewotICAgICAgICBEaXlGcCByZXMgPSAqdGhpczsKLSAgICAgICAgd2hpbGUgKCEocmVzLmYgJiAoa0RwSGlkZGVuQml0IDw8IDEpKSkgewotICAgICAgICAgICAgcmVzLmYgPDw9IDE7Ci0gICAgICAgICAgICByZXMuZS0tOwotICAgICAgICB9Ci0gICAgICAgIHJlcy5mIDw8PSAoa0RpeVNpZ25pZmljYW5kU2l6ZSAtIGtEcFNpZ25pZmljYW5kU2l6ZSAtIDIpOwotICAgICAgICByZXMuZSA9IHJlcy5lIC0gKGtEaXlTaWduaWZpY2FuZFNpemUgLSBrRHBTaWduaWZpY2FuZFNpemUgLSAyKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICB2b2lkIE5vcm1hbGl6ZWRCb3VuZGFyaWVzKERpeUZwKiBtaW51cywgRGl5RnAqIHBsdXMpIGNvbnN0IHsKLSAgICAgICAgRGl5RnAgcGwgPSBEaXlGcCgoZiA8PCAxKSArIDEsIGUgLSAxKS5Ob3JtYWxpemVCb3VuZGFyeSgpOwotICAgICAgICBEaXlGcCBtaSA9IChmID09IGtEcEhpZGRlbkJpdCkgPyBEaXlGcCgoZiA8PCAyKSAtIDEsIGUgLSAyKSA6IERpeUZwKChmIDw8IDEpIC0gMSwgZSAtIDEpOwotICAgICAgICBtaS5mIDw8PSBtaS5lIC0gcGwuZTsKLSAgICAgICAgbWkuZSA9IHBsLmU7Ci0gICAgICAgICpwbHVzID0gcGw7Ci0gICAgICAgICptaW51cyA9IG1pOwotICAgIH0KLQotICAgIGRvdWJsZSBUb0RvdWJsZSgpIGNvbnN0IHsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgZG91YmxlIGQ7Ci0gICAgICAgICAgICB1aW50NjRfdCB1NjQ7Ci0gICAgICAgIH11OwotICAgICAgICBjb25zdCB1aW50NjRfdCBiZSA9IChlID09IGtEcERlbm9ybWFsRXhwb25lbnQgJiYgKGYgJiBrRHBIaWRkZW5CaXQpID09IDApID8gMCA6IAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGUgKyBrRHBFeHBvbmVudEJpYXMpOwotICAgICAgICB1LnU2NCA9IChmICYga0RwU2lnbmlmaWNhbmRNYXNrKSB8IChiZSA8PCBrRHBTaWduaWZpY2FuZFNpemUpOwotICAgICAgICByZXR1cm4gdS5kOwotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBpbnQga0RpeVNpZ25pZmljYW5kU2l6ZSA9IDY0OwotICAgIHN0YXRpYyBjb25zdCBpbnQga0RwU2lnbmlmaWNhbmRTaXplID0gNTI7Ci0gICAgc3RhdGljIGNvbnN0IGludCBrRHBFeHBvbmVudEJpYXMgPSAweDNGRiArIGtEcFNpZ25pZmljYW5kU2l6ZTsKLSAgICBzdGF0aWMgY29uc3QgaW50IGtEcE1heEV4cG9uZW50ID0gMHg3RkYgLSBrRHBFeHBvbmVudEJpYXM7Ci0gICAgc3RhdGljIGNvbnN0IGludCBrRHBNaW5FeHBvbmVudCA9IC1rRHBFeHBvbmVudEJpYXM7Ci0gICAgc3RhdGljIGNvbnN0IGludCBrRHBEZW5vcm1hbEV4cG9uZW50ID0gLWtEcEV4cG9uZW50QmlhcyArIDE7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtEcEV4cG9uZW50TWFzayA9IFJBUElESlNPTl9VSU5UNjRfQzIoMHg3RkYwMDAwMCwgMHgwMDAwMDAwMCk7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtEcFNpZ25pZmljYW5kTWFzayA9IFJBUElESlNPTl9VSU5UNjRfQzIoMHgwMDBGRkZGRiwgMHhGRkZGRkZGRik7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtEcEhpZGRlbkJpdCA9IFJBUElESlNPTl9VSU5UNjRfQzIoMHgwMDEwMDAwMCwgMHgwMDAwMDAwMCk7Ci0KLSAgICB1aW50NjRfdCBmOwotICAgIGludCBlOwotfTsKLQotaW5saW5lIERpeUZwIEdldENhY2hlZFBvd2VyQnlJbmRleChzaXplX3QgaW5kZXgpIHsKLSAgICAvLyAxMF4tMzQ4LCAxMF4tMzQwLCAuLi4sIDEwXjM0MAotICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrQ2FjaGVkUG93ZXJzX0ZbXSA9IHsKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGZhOGZkNWEwLCAweDA4MWMwMjg4KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGJhYWVlMTdmLCAweGEyM2ViZjc2KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDhiMTZmYjIwLCAweDMwNTVhYzc2KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGNmNDI4OTRhLCAweDVkY2UzNWVhKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDlhNmJiMGFhLCAweDU1NjUzYjJkKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGU2MWFjZjAzLCAweDNkMWE0NWRmKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGFiNzBmZTE3LCAweGM3OWFjNmNhKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGZmNzdiMWZjLCAweGJlYmNkYzRmKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGJlNTY5MWVmLCAweDQxNmJkNjBjKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDhkZDAxZmFkLCAweDkwN2ZmYzNjKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGQzNTE1YzI4LCAweDMxNTU5YTgzKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDlkNzFhYzhmLCAweGFkYTZjOWI1KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGVhOWMyMjc3LCAweDIzZWU4YmNiKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGFlY2M0OTkxLCAweDQwNzg1MzZkKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDgyM2MxMjc5LCAweDVkYjZjZTU3KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGMyMTA5NDM2LCAweDRkZmI1NjM3KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDkwOTZlYTZmLCAweDM4NDg5ODRmKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGQ3NzQ4NWNiLCAweDI1ODIzYWM3KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGEwODZjZmNkLCAweDk3YmY5N2Y0KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGVmMzQwYTk4LCAweDE3MmFhY2U1KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGIyMzg2N2ZiLCAweDJhMzViMjhlKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDg0YzhkNGRmLCAweGQyYzYzZjNiKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGM1ZGQ0NDI3LCAweDFhZDNjZGJhKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDkzNmI5ZmNlLCAweGJiMjVjOTk2KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGRiYWM2YzI0LCAweDdkNjJhNTg0KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGEzYWI2NjU4LCAweDBkNWZkYWY2KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGYzZTJmODkzLCAweGRlYzNmMTI2KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGI1YjVhZGE4LCAweGFhZmY4MGI4KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDg3NjI1ZjA1LCAweDZjN2M0YThiKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGM5YmNmZjYwLCAweDM0YzEzMDUzKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDk2NGU4NThjLCAweDkxYmEyNjU1KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGRmZjk3NzI0LCAweDcwMjk3ZWJkKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGE2ZGZiZDlmLCAweGI4ZTViODhmKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGY4YTk1ZmNmLCAweDg4NzQ3ZDk0KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGI5NDQ3MDkzLCAweDhmYTg5YmNmKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDhhMDhmMGY4LCAweGJmMGYxNTZiKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGNkYjAyNTU1LCAweDY1MzEzMWI2KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDk5M2ZlMmM2LCAweGQwN2I3ZmFjKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGU0NWMxMGM0LCAweDJhMmIzYjA2KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGFhMjQyNDk5LCAweDY5NzM5MmQzKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGZkODdiNWYyLCAweDgzMDBjYTBlKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGJjZTUwODY0LCAweDkyMTExYWViKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDhjYmNjYzA5LCAweDZmNTA4OGNjKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGQxYjcxNzU4LCAweGUyMTk2NTJjKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDljNDAwMDAwLCAweDAwMDAwMDAwKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGU4ZDRhNTEwLCAweDAwMDAwMDAwKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGFkNzhlYmM1LCAweGFjNjIwMDAwKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDgxM2YzOTc4LCAweGY4OTQwOTg0KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGMwOTdjZTdiLCAweGM5MDcxNWIzKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDhmN2UzMmNlLCAweDdiZWE1YzcwKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGQ1ZDIzOGE0LCAweGFiZTk4MDY4KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDlmNGYyNzI2LCAweDE3OWEyMjQ1KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGVkNjNhMjMxLCAweGQ0YzRmYjI3KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGIwZGU2NTM4LCAweDhjYzhhZGE4KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDgzYzcwODhlLCAweDFhYWI2NWRiKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGM0NWQxZGY5LCAweDQyNzExZDlhKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDkyNGQ2OTJjLCAweGE2MWJlNzU4KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGRhMDFlZTY0LCAweDFhNzA4ZGVhKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGEyNmRhMzk5LCAweDlhZWY3NzRhKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGYyMDk3ODdiLCAweGI0N2Q2Yjg1KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGI0NTRlNGExLCAweDc5ZGQxODc3KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDg2NWI4NjkyLCAweDViOWJjNWMyKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGM4MzU1M2M1LCAweGM4OTY1ZDNkKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDk1MmFiNDVjLCAweGZhOTdhMGIzKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGRlNDY5ZmJkLCAweDk5YTA1ZmUzKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGE1OWJjMjM0LCAweGRiMzk4YzI1KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGY2YzY5YTcyLCAweGEzOTg5ZjVjKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGI3ZGNiZjUzLCAweDU0ZTliZWNlKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDg4ZmNmMzE3LCAweGYyMjI0MWUyKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGNjMjBjZTliLCAweGQzNWM3OGE1KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDk4MTY1YWYzLCAweDdiMjE1M2RmKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGUyYTBiNWRjLCAweDk3MWYzMDNhKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGE4ZDlkMTUzLCAweDVjZTNiMzk2KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGZiOWI3Y2Q5LCAweGE0YTc0NDNjKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGJiNzY0YzRjLCAweGE3YTQ0NDEwKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDhiYWI4ZWVmLCAweGI2NDA5YzFhKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGQwMWZlZjEwLCAweGE2NTc4NDJjKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweDliMTBhNGU1LCAweGU5OTEzMTI5KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGU3MTA5YmZiLCAweGExOWMwYzlkKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGFjMjgyMGQ5LCAweDYyM2JmNDI5KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDgwNDQ0YjVlLCAweDdhYTdjZjg1KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGJmMjFlNDQwLCAweDAzYWNkZDJkKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDhlNjc5YzJmLCAweDVlNDRmZjhmKSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGQ0MzMxNzlkLCAweDljOGNiODQxKSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweDllMTlkYjkyLCAweGI0ZTMxYmE5KSwgUkFQSURKU09OX1VJTlQ2NF9DMigweGViOTZiZjZlLCAweGJhZGY3N2Q5KSwKLSAgICAgICAgUkFQSURKU09OX1VJTlQ2NF9DMigweGFmODcwMjNiLCAweDliZjBlZTZiKQotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IGludDE2X3Qga0NhY2hlZFBvd2Vyc19FW10gPSB7Ci0gICAgICAgIC0xMjIwLCAtMTE5MywgLTExNjYsIC0xMTQwLCAtMTExMywgLTEwODcsIC0xMDYwLCAtMTAzNCwgLTEwMDcsICAtOTgwLAotICAgICAgICAtOTU0LCAgLTkyNywgIC05MDEsICAtODc0LCAgLTg0NywgIC04MjEsICAtNzk0LCAgLTc2OCwgIC03NDEsICAtNzE1LAotICAgICAgICAtNjg4LCAgLTY2MSwgIC02MzUsICAtNjA4LCAgLTU4MiwgIC01NTUsICAtNTI5LCAgLTUwMiwgIC00NzUsICAtNDQ5LAotICAgICAgICAtNDIyLCAgLTM5NiwgIC0zNjksICAtMzQzLCAgLTMxNiwgIC0yODksICAtMjYzLCAgLTIzNiwgIC0yMTAsICAtMTgzLAotICAgICAgICAtMTU3LCAgLTEzMCwgIC0xMDMsICAgLTc3LCAgIC01MCwgICAtMjQsICAgICAzLCAgICAzMCwgICAgNTYsICAgIDgzLAotICAgICAgICAxMDksICAgMTM2LCAgIDE2MiwgICAxODksICAgMjE2LCAgIDI0MiwgICAyNjksICAgMjk1LCAgIDMyMiwgICAzNDgsCi0gICAgICAgIDM3NSwgICA0MDIsICAgNDI4LCAgIDQ1NSwgICA0ODEsICAgNTA4LCAgIDUzNCwgICA1NjEsICAgNTg4LCAgIDYxNCwKLSAgICAgICAgNjQxLCAgIDY2NywgICA2OTQsICAgNzIwLCAgIDc0NywgICA3NzQsICAgODAwLCAgIDgyNywgICA4NTMsICAgODgwLAotICAgICAgICA5MDcsICAgOTMzLCAgIDk2MCwgICA5ODYsICAxMDEzLCAgMTAzOSwgIDEwNjYKLSAgICB9OwotICAgIHJldHVybiBEaXlGcChrQ2FjaGVkUG93ZXJzX0ZbaW5kZXhdLCBrQ2FjaGVkUG93ZXJzX0VbaW5kZXhdKTsKLX0KLSAgICAKLWlubGluZSBEaXlGcCBHZXRDYWNoZWRQb3dlcihpbnQgZSwgaW50KiBLKSB7Ci0KLSAgICAvL2ludCBrID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsKCgtNjEgLSBlKSAqIDAuMzAxMDI5OTk1NjYzOTgxMTQpKSArIDM3NDsKLSAgICBkb3VibGUgZGsgPSAoLTYxIC0gZSkgKiAwLjMwMTAyOTk5NTY2Mzk4MTE0ICsgMzQ3OyAgLy8gZGsgbXVzdCBiZSBwb3NpdGl2ZSwgc28gY2FuIGRvIGNlaWxpbmcgaW4gcG9zaXRpdmUKLSAgICBpbnQgayA9IHN0YXRpY19jYXN0PGludD4oZGspOwotICAgIGlmIChkayAtIGsgPiAwLjApCi0gICAgICAgIGsrKzsKLQotICAgIHVuc2lnbmVkIGluZGV4ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KChrID4+IDMpICsgMSk7Ci0gICAgKksgPSAtKC0zNDggKyBzdGF0aWNfY2FzdDxpbnQ+KGluZGV4IDw8IDMpKTsgICAgLy8gZGVjaW1hbCBleHBvbmVudCBubyBuZWVkIGxvb2t1cCB0YWJsZQotCi0gICAgcmV0dXJuIEdldENhY2hlZFBvd2VyQnlJbmRleChpbmRleCk7Ci19Ci0KLWlubGluZSBEaXlGcCBHZXRDYWNoZWRQb3dlcjEwKGludCBleHAsIGludCAqb3V0RXhwKSB7Ci0gICAgIHVuc2lnbmVkIGluZGV4ID0gKHN0YXRpY19jYXN0PHVuc2lnbmVkPihleHApICsgMzQ4dSkgLyA4dTsKLSAgICAgKm91dEV4cCA9IC0zNDggKyBzdGF0aWNfY2FzdDxpbnQ+KGluZGV4KSAqIDg7Ci0gICAgIHJldHVybiBHZXRDYWNoZWRQb3dlckJ5SW5kZXgoaW5kZXgpOwotIH0KLQotI2lmZGVmIF9fR05VQ19fCi1SQVBJREpTT05fRElBR19QT1AKLSNlbmRpZgotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QT1AKLVJBUElESlNPTl9ESUFHX09GRihwYWRkZWQpCi0jZW5kaWYKLQotfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLVJBUElESlNPTl9OQU1FU1BBQ0VfRU5ECi0KLSNlbmRpZiAvLyBSQVBJREpTT05fRElZRlBfSF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvZHRvYS5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9pbnRlcm5hbC9kdG9hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNDU0OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9pbnRlcm5hbC9kdG9hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLy8gVGhpcyBpcyBhIEMrKyBoZWFkZXItb25seSBpbXBsZW1lbnRhdGlvbiBvZiBHcmlzdTIgYWxnb3JpdGhtIGZyb20gdGhlIHB1YmxpY2F0aW9uOgotLy8gTG9pdHNjaCwgRmxvcmlhbi4gIlByaW50aW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgcXVpY2tseSBhbmQgYWNjdXJhdGVseSB3aXRoCi0vLyBpbnRlZ2Vycy4iIEFDTSBTaWdwbGFuIE5vdGljZXMgNDUuNiAoMjAxMCk6IDIzMy0yNDMuCi0KLSNpZm5kZWYgUkFQSURKU09OX0RUT0FfCi0jZGVmaW5lIFJBUElESlNPTl9EVE9BXwotCi0jaW5jbHVkZSAiaXRvYS5oIiAvLyBHZXREaWdpdHNMdXQoKQotI2luY2x1ZGUgImRpeWZwLmgiCi0jaW5jbHVkZSAiaWVlZTc1NC5oIgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0jaWZkZWYgX19HTlVDX18KLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRihlZmZjKyspCi1SQVBJREpTT05fRElBR19PRkYoYXJyYXktYm91bmRzKSAvLyBzb21lIGdjYyB2ZXJzaW9ucyBnZW5lcmF0ZSB3cm9uZyB3YXJuaW5ncyBodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01OTEyNAotI2VuZGlmCi0KLWlubGluZSB2b2lkIEdyaXN1Um91bmQoY2hhciogYnVmZmVyLCBpbnQgbGVuLCB1aW50NjRfdCBkZWx0YSwgdWludDY0X3QgcmVzdCwgdWludDY0X3QgdGVuX2thcHBhLCB1aW50NjRfdCB3cF93KSB7Ci0gICAgd2hpbGUgKHJlc3QgPCB3cF93ICYmIGRlbHRhIC0gcmVzdCA+PSB0ZW5fa2FwcGEgJiYKLSAgICAgICAgICAgKHJlc3QgKyB0ZW5fa2FwcGEgPCB3cF93IHx8ICAvLy8gY2xvc2VyCi0gICAgICAgICAgICB3cF93IC0gcmVzdCA+IHJlc3QgKyB0ZW5fa2FwcGEgLSB3cF93KSkgewotICAgICAgICBidWZmZXJbbGVuIC0gMV0tLTsKLSAgICAgICAgcmVzdCArPSB0ZW5fa2FwcGE7Ci0gICAgfQotfQotCi1pbmxpbmUgdW5zaWduZWQgQ291bnREZWNpbWFsRGlnaXQzMih1aW50MzJfdCBuKSB7Ci0gICAgLy8gU2ltcGxlIHB1cmUgQysrIGltcGxlbWVudGF0aW9uIHdhcyBmYXN0ZXIgdGhhbiBfX2J1aWx0aW5fY2x6IHZlcnNpb24gaW4gdGhpcyBzaXR1YXRpb24uCi0gICAgaWYgKG4gPCAxMCkgcmV0dXJuIDE7Ci0gICAgaWYgKG4gPCAxMDApIHJldHVybiAyOwotICAgIGlmIChuIDwgMTAwMCkgcmV0dXJuIDM7Ci0gICAgaWYgKG4gPCAxMDAwMCkgcmV0dXJuIDQ7Ci0gICAgaWYgKG4gPCAxMDAwMDApIHJldHVybiA1OwotICAgIGlmIChuIDwgMTAwMDAwMCkgcmV0dXJuIDY7Ci0gICAgaWYgKG4gPCAxMDAwMDAwMCkgcmV0dXJuIDc7Ci0gICAgaWYgKG4gPCAxMDAwMDAwMDApIHJldHVybiA4OwotICAgIC8vIFdpbGwgbm90IHJlYWNoIDEwIGRpZ2l0cyBpbiBEaWdpdEdlbigpCi0gICAgLy9pZiAobiA8IDEwMDAwMDAwMDApIHJldHVybiA5OwotICAgIC8vcmV0dXJuIDEwOwotICAgIHJldHVybiA5OwotfQotCi1pbmxpbmUgdm9pZCBEaWdpdEdlbihjb25zdCBEaXlGcCYgVywgY29uc3QgRGl5RnAmIE1wLCB1aW50NjRfdCBkZWx0YSwgY2hhciogYnVmZmVyLCBpbnQqIGxlbiwgaW50KiBLKSB7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtQb3cxMFtdID0geyAxLCAxMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAxMDAwMDAwLCAxMDAwMDAwMCwgMTAwMDAwMDAwLCAxMDAwMDAwMDAwIH07Ci0gICAgY29uc3QgRGl5RnAgb25lKHVpbnQ2NF90KDEpIDw8IC1NcC5lLCBNcC5lKTsKLSAgICBjb25zdCBEaXlGcCB3cF93ID0gTXAgLSBXOwotICAgIHVpbnQzMl90IHAxID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1wLmYgPj4gLW9uZS5lKTsKLSAgICB1aW50NjRfdCBwMiA9IE1wLmYgJiAob25lLmYgLSAxKTsKLSAgICB1bnNpZ25lZCBrYXBwYSA9IENvdW50RGVjaW1hbERpZ2l0MzIocDEpOyAvLyBrYXBwYSBpbiBbMCwgOV0KLSAgICAqbGVuID0gMDsKLQotICAgIHdoaWxlIChrYXBwYSA+IDApIHsKLSAgICAgICAgdWludDMyX3QgZCA9IDA7Ci0gICAgICAgIHN3aXRjaCAoa2FwcGEpIHsKLSAgICAgICAgICAgIGNhc2UgIDk6IGQgPSBwMSAvICAxMDAwMDAwMDA7IHAxICU9ICAxMDAwMDAwMDA7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgODogZCA9IHAxIC8gICAxMDAwMDAwMDsgcDEgJT0gICAxMDAwMDAwMDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA3OiBkID0gcDEgLyAgICAxMDAwMDAwOyBwMSAlPSAgICAxMDAwMDAwOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDY6IGQgPSBwMSAvICAgICAxMDAwMDA7IHAxICU9ICAgICAxMDAwMDA7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgNTogZCA9IHAxIC8gICAgICAxMDAwMDsgcDEgJT0gICAgICAxMDAwMDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICA0OiBkID0gcDEgLyAgICAgICAxMDAwOyBwMSAlPSAgICAgICAxMDAwOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgIDM6IGQgPSBwMSAvICAgICAgICAxMDA7IHAxICU9ICAgICAgICAxMDA7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAgMjogZCA9IHAxIC8gICAgICAgICAxMDsgcDEgJT0gICAgICAgICAxMDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICAxOiBkID0gcDE7ICAgICAgICAgICAgICBwMSA9ICAgICAgICAgICAwOyBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6OwotICAgICAgICB9Ci0gICAgICAgIGlmIChkIHx8ICpsZW4pCi0gICAgICAgICAgICBidWZmZXJbKCpsZW4pKytdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJzAnICsgc3RhdGljX2Nhc3Q8Y2hhcj4oZCkpOwotICAgICAgICBrYXBwYS0tOwotICAgICAgICB1aW50NjRfdCB0bXAgPSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHAxKSA8PCAtb25lLmUpICsgcDI7Ci0gICAgICAgIGlmICh0bXAgPD0gZGVsdGEpIHsKLSAgICAgICAgICAgICpLICs9IGthcHBhOwotICAgICAgICAgICAgR3Jpc3VSb3VuZChidWZmZXIsICpsZW4sIGRlbHRhLCB0bXAsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihrUG93MTBba2FwcGFdKSA8PCAtb25lLmUsIHdwX3cuZik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBrYXBwYSA9IDAKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHAyICo9IDEwOwotICAgICAgICBkZWx0YSAqPSAxMDsKLSAgICAgICAgY2hhciBkID0gc3RhdGljX2Nhc3Q8Y2hhcj4ocDIgPj4gLW9uZS5lKTsKLSAgICAgICAgaWYgKGQgfHwgKmxlbikKLSAgICAgICAgICAgIGJ1ZmZlclsoKmxlbikrK10gPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBkKTsKLSAgICAgICAgcDIgJj0gb25lLmYgLSAxOwotICAgICAgICBrYXBwYS0tOwotICAgICAgICBpZiAocDIgPCBkZWx0YSkgewotICAgICAgICAgICAgKksgKz0ga2FwcGE7Ci0gICAgICAgICAgICBHcmlzdVJvdW5kKGJ1ZmZlciwgKmxlbiwgZGVsdGEsIHAyLCBvbmUuZiwgd3Bfdy5mICoga1BvdzEwWy1zdGF0aWNfY2FzdDxpbnQ+KGthcHBhKV0pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotCi1pbmxpbmUgdm9pZCBHcmlzdTIoZG91YmxlIHZhbHVlLCBjaGFyKiBidWZmZXIsIGludCogbGVuZ3RoLCBpbnQqIEspIHsKLSAgICBjb25zdCBEaXlGcCB2KHZhbHVlKTsKLSAgICBEaXlGcCB3X20sIHdfcDsKLSAgICB2Lk5vcm1hbGl6ZWRCb3VuZGFyaWVzKCZ3X20sICZ3X3ApOwotCi0gICAgY29uc3QgRGl5RnAgY19tayA9IEdldENhY2hlZFBvd2VyKHdfcC5lLCBLKTsKLSAgICBjb25zdCBEaXlGcCBXID0gdi5Ob3JtYWxpemUoKSAqIGNfbWs7Ci0gICAgRGl5RnAgV3AgPSB3X3AgKiBjX21rOwotICAgIERpeUZwIFdtID0gd19tICogY19tazsKLSAgICBXbS5mKys7Ci0gICAgV3AuZi0tOwotICAgIERpZ2l0R2VuKFcsIFdwLCBXcC5mIC0gV20uZiwgYnVmZmVyLCBsZW5ndGgsIEspOwotfQotCi1pbmxpbmUgY2hhciogV3JpdGVFeHBvbmVudChpbnQgSywgY2hhciogYnVmZmVyKSB7Ci0gICAgaWYgKEsgPCAwKSB7Ci0gICAgICAgICpidWZmZXIrKyA9ICctJzsKLSAgICAgICAgSyA9IC1LOwotICAgIH0KLQotICAgIGlmIChLID49IDEwMCkgewotICAgICAgICAqYnVmZmVyKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBzdGF0aWNfY2FzdDxjaGFyPihLIC8gMTAwKSk7Ci0gICAgICAgIEsgJT0gMTAwOwotICAgICAgICBjb25zdCBjaGFyKiBkID0gR2V0RGlnaXRzTHV0KCkgKyBLICogMjsKLSAgICAgICAgKmJ1ZmZlcisrID0gZFswXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gZFsxXTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoSyA+PSAxMCkgewotICAgICAgICBjb25zdCBjaGFyKiBkID0gR2V0RGlnaXRzTHV0KCkgKyBLICogMjsKLSAgICAgICAgKmJ1ZmZlcisrID0gZFswXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gZFsxXTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICAqYnVmZmVyKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBzdGF0aWNfY2FzdDxjaGFyPihLKSk7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwotfQotCi1pbmxpbmUgY2hhciogUHJldHRpZnkoY2hhciogYnVmZmVyLCBpbnQgbGVuZ3RoLCBpbnQgaywgaW50IG1heERlY2ltYWxQbGFjZXMpIHsKLSAgICBjb25zdCBpbnQga2sgPSBsZW5ndGggKyBrOyAgLy8gMTBeKGtrLTEpIDw9IHYgPCAxMF5rawotCi0gICAgaWYgKDAgPD0gayAmJiBrayA8PSAyMSkgewotICAgICAgICAvLyAxMjM0ZTcgLT4gMTIzNDAwMDAwMDAKLSAgICAgICAgZm9yIChpbnQgaSA9IGxlbmd0aDsgaSA8IGtrOyBpKyspCi0gICAgICAgICAgICBidWZmZXJbaV0gPSAnMCc7Ci0gICAgICAgIGJ1ZmZlcltra10gPSAnLic7Ci0gICAgICAgIGJ1ZmZlcltrayArIDFdID0gJzAnOwotICAgICAgICByZXR1cm4gJmJ1ZmZlcltrayArIDJdOwotICAgIH0KLSAgICBlbHNlIGlmICgwIDwga2sgJiYga2sgPD0gMjEpIHsKLSAgICAgICAgLy8gMTIzNGUtMiAtPiAxMi4zNAotICAgICAgICBzdGQ6Om1lbW1vdmUoJmJ1ZmZlcltrayArIDFdLCAmYnVmZmVyW2trXSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihsZW5ndGggLSBraykpOwotICAgICAgICBidWZmZXJba2tdID0gJy4nOwotICAgICAgICBpZiAoMCA+IGsgKyBtYXhEZWNpbWFsUGxhY2VzKSB7Ci0gICAgICAgICAgICAvLyBXaGVuIG1heERlY2ltYWxQbGFjZXMgPSAyLCAxLjIzNDUgLT4gMS4yMywgMS4xMDIgLT4gMS4xCi0gICAgICAgICAgICAvLyBSZW1vdmUgZXh0cmEgdHJhaWxpbmcgemVyb3MgKGF0IGxlYXN0IG9uZSkgYWZ0ZXIgdHJ1bmNhdGlvbi4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBrayArIG1heERlY2ltYWxQbGFjZXM7IGkgPiBrayArIDE7IGktLSkKLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW2ldICE9ICcwJykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZidWZmZXJbaSArIDFdOwotICAgICAgICAgICAgcmV0dXJuICZidWZmZXJba2sgKyAyXTsgLy8gUmVzZXJ2ZSBvbmUgemVybwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAmYnVmZmVyW2xlbmd0aCArIDFdOwotICAgIH0KLSAgICBlbHNlIGlmICgtNiA8IGtrICYmIGtrIDw9IDApIHsKLSAgICAgICAgLy8gMTIzNGUtNiAtPiAwLjAwMTIzNAotICAgICAgICBjb25zdCBpbnQgb2Zmc2V0ID0gMiAtIGtrOwotICAgICAgICBzdGQ6Om1lbW1vdmUoJmJ1ZmZlcltvZmZzZXRdLCAmYnVmZmVyWzBdLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGxlbmd0aCkpOwotICAgICAgICBidWZmZXJbMF0gPSAnMCc7Ci0gICAgICAgIGJ1ZmZlclsxXSA9ICcuJzsKLSAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBvZmZzZXQ7IGkrKykKLSAgICAgICAgICAgIGJ1ZmZlcltpXSA9ICcwJzsKLSAgICAgICAgaWYgKGxlbmd0aCAtIGtrID4gbWF4RGVjaW1hbFBsYWNlcykgewotICAgICAgICAgICAgLy8gV2hlbiBtYXhEZWNpbWFsUGxhY2VzID0gMiwgMC4xMjMgLT4gMC4xMiwgMC4xMDIgLT4gMC4xCi0gICAgICAgICAgICAvLyBSZW1vdmUgZXh0cmEgdHJhaWxpbmcgemVyb3MgKGF0IGxlYXN0IG9uZSkgYWZ0ZXIgdHJ1bmNhdGlvbi4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtYXhEZWNpbWFsUGxhY2VzICsgMTsgaSA+IDI7IGktLSkKLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW2ldICE9ICcwJykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZidWZmZXJbaSArIDFdOwotICAgICAgICAgICAgcmV0dXJuICZidWZmZXJbM107IC8vIFJlc2VydmUgb25lIHplcm8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gJmJ1ZmZlcltsZW5ndGggKyBvZmZzZXRdOwotICAgIH0KLSAgICBlbHNlIGlmIChrayA8IC1tYXhEZWNpbWFsUGxhY2VzKSB7Ci0gICAgICAgIC8vIFRydW5jYXRlIHRvIHplcm8KLSAgICAgICAgYnVmZmVyWzBdID0gJzAnOwotICAgICAgICBidWZmZXJbMV0gPSAnLic7Ci0gICAgICAgIGJ1ZmZlclsyXSA9ICcwJzsKLSAgICAgICAgcmV0dXJuICZidWZmZXJbM107Ci0gICAgfQotICAgIGVsc2UgaWYgKGxlbmd0aCA9PSAxKSB7Ci0gICAgICAgIC8vIDFlMzAKLSAgICAgICAgYnVmZmVyWzFdID0gJ2UnOwotICAgICAgICByZXR1cm4gV3JpdGVFeHBvbmVudChrayAtIDEsICZidWZmZXJbMl0pOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gMTIzNGUzMCAtPiAxLjIzNGUzMwotICAgICAgICBzdGQ6Om1lbW1vdmUoJmJ1ZmZlclsyXSwgJmJ1ZmZlclsxXSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihsZW5ndGggLSAxKSk7Ci0gICAgICAgIGJ1ZmZlclsxXSA9ICcuJzsKLSAgICAgICAgYnVmZmVyW2xlbmd0aCArIDFdID0gJ2UnOwotICAgICAgICByZXR1cm4gV3JpdGVFeHBvbmVudChrayAtIDEsICZidWZmZXJbMCArIGxlbmd0aCArIDJdKTsKLSAgICB9Ci19Ci0KLWlubGluZSBjaGFyKiBkdG9hKGRvdWJsZSB2YWx1ZSwgY2hhciogYnVmZmVyLCBpbnQgbWF4RGVjaW1hbFBsYWNlcyA9IDMyNCkgewotICAgIFJBUElESlNPTl9BU1NFUlQobWF4RGVjaW1hbFBsYWNlcyA+PSAxKTsKLSAgICBEb3VibGUgZCh2YWx1ZSk7Ci0gICAgaWYgKGQuSXNaZXJvKCkpIHsKLSAgICAgICAgaWYgKGQuU2lnbigpKQotICAgICAgICAgICAgKmJ1ZmZlcisrID0gJy0nOyAgICAgLy8gLTAuMCwgSXNzdWUgIzI4OQotICAgICAgICBidWZmZXJbMF0gPSAnMCc7Ci0gICAgICAgIGJ1ZmZlclsxXSA9ICcuJzsKLSAgICAgICAgYnVmZmVyWzJdID0gJzAnOwotICAgICAgICByZXR1cm4gJmJ1ZmZlclszXTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgICAgICAgICpidWZmZXIrKyA9ICctJzsKLSAgICAgICAgICAgIHZhbHVlID0gLXZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBsZW5ndGgsIEs7Ci0gICAgICAgIEdyaXN1Mih2YWx1ZSwgYnVmZmVyLCAmbGVuZ3RoLCAmSyk7Ci0gICAgICAgIHJldHVybiBQcmV0dGlmeShidWZmZXIsIGxlbmd0aCwgSywgbWF4RGVjaW1hbFBsYWNlcyk7Ci0gICAgfQotfQotCi0jaWZkZWYgX19HTlVDX18KLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIGludGVybmFsCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jZW5kaWYgLy8gUkFQSURKU09OX0RUT0FfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ludGVybmFsL2llZWU3NTQuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvaWVlZTc1NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmJiMGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvaWVlZTc1NC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fSUVFRTc1NF8KLSNkZWZpbmUgUkFQSURKU09OX0lFRUU3NTRfCi0KLSNpbmNsdWRlICIuLi9yYXBpZGpzb24uaCIKLQotUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTgotbmFtZXNwYWNlIGludGVybmFsIHsKLQotY2xhc3MgRG91YmxlIHsKLXB1YmxpYzoKLSAgICBEb3VibGUoKSB7fQotICAgIERvdWJsZShkb3VibGUgZCkgOiBkXyhkKSB7fQotICAgIERvdWJsZSh1aW50NjRfdCB1KSA6IHVfKHUpIHt9Ci0KLSAgICBkb3VibGUgVmFsdWUoKSBjb25zdCB7IHJldHVybiBkXzsgfQotICAgIHVpbnQ2NF90IFVpbnQ2NFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdV87IH0KLQotICAgIGRvdWJsZSBOZXh0UG9zaXRpdmVEb3VibGUoKSBjb25zdCB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoIVNpZ24oKSk7Ci0gICAgICAgIHJldHVybiBEb3VibGUodV8gKyAxKS5WYWx1ZSgpOwotICAgIH0KLQotICAgIGJvb2wgU2lnbigpIGNvbnN0IHsgcmV0dXJuICh1XyAmIGtTaWduTWFzaykgIT0gMDsgfQotICAgIHVpbnQ2NF90IFNpZ25pZmljYW5kKCkgY29uc3QgeyByZXR1cm4gdV8gJiBrU2lnbmlmaWNhbmRNYXNrOyB9Ci0gICAgaW50IEV4cG9uZW50KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigoKHVfICYga0V4cG9uZW50TWFzaykgPj4ga1NpZ25pZmljYW5kU2l6ZSkgLSBrRXhwb25lbnRCaWFzKTsgfQotCi0gICAgYm9vbCBJc05hbigpIGNvbnN0IHsgcmV0dXJuICh1XyAmIGtFeHBvbmVudE1hc2spID09IGtFeHBvbmVudE1hc2sgJiYgU2lnbmlmaWNhbmQoKSAhPSAwOyB9Ci0gICAgYm9vbCBJc0luZigpIGNvbnN0IHsgcmV0dXJuICh1XyAmIGtFeHBvbmVudE1hc2spID09IGtFeHBvbmVudE1hc2sgJiYgU2lnbmlmaWNhbmQoKSA9PSAwOyB9Ci0gICAgYm9vbCBJc05hbk9ySW5mKCkgY29uc3QgeyByZXR1cm4gKHVfICYga0V4cG9uZW50TWFzaykgPT0ga0V4cG9uZW50TWFzazsgfQotICAgIGJvb2wgSXNOb3JtYWwoKSBjb25zdCB7IHJldHVybiAodV8gJiBrRXhwb25lbnRNYXNrKSAhPSAwIHx8IFNpZ25pZmljYW5kKCkgPT0gMDsgfQotICAgIGJvb2wgSXNaZXJvKCkgY29uc3QgeyByZXR1cm4gKHVfICYgKGtFeHBvbmVudE1hc2sgfCBrU2lnbmlmaWNhbmRNYXNrKSkgPT0gMDsgfQotCi0gICAgdWludDY0X3QgSW50ZWdlclNpZ25pZmljYW5kKCkgY29uc3QgeyByZXR1cm4gSXNOb3JtYWwoKSA/IFNpZ25pZmljYW5kKCkgfCBrSGlkZGVuQml0IDogU2lnbmlmaWNhbmQoKTsgfQotICAgIGludCBJbnRlZ2VyRXhwb25lbnQoKSBjb25zdCB7IHJldHVybiAoSXNOb3JtYWwoKSA/IEV4cG9uZW50KCkgOiBrRGVub3JtYWxFeHBvbmVudCkgLSBrU2lnbmlmaWNhbmRTaXplOyB9Ci0gICAgdWludDY0X3QgVG9CaWFzKCkgY29uc3QgeyByZXR1cm4gKHVfICYga1NpZ25NYXNrKSA/IH51XyArIDEgOiB1XyB8IGtTaWduTWFzazsgfQotCi0gICAgc3RhdGljIHVuc2lnbmVkIEVmZmVjdGl2ZVNpZ25pZmljYW5kU2l6ZShpbnQgb3JkZXIpIHsKLSAgICAgICAgaWYgKG9yZGVyID49IC0xMDIxKQotICAgICAgICAgICAgcmV0dXJuIDUzOwotICAgICAgICBlbHNlIGlmIChvcmRlciA8PSAtMTA3NCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG9yZGVyKSArIDEwNzQ7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBpbnQga1NpZ25pZmljYW5kU2l6ZSA9IDUyOwotICAgIHN0YXRpYyBjb25zdCBpbnQga0V4cG9uZW50QmlhcyA9IDB4M0ZGOwotICAgIHN0YXRpYyBjb25zdCBpbnQga0Rlbm9ybWFsRXhwb25lbnQgPSAxIC0ga0V4cG9uZW50QmlhczsKLSAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1NpZ25NYXNrID0gUkFQSURKU09OX1VJTlQ2NF9DMigweDgwMDAwMDAwLCAweDAwMDAwMDAwKTsKLSAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga0V4cG9uZW50TWFzayA9IFJBUElESlNPTl9VSU5UNjRfQzIoMHg3RkYwMDAwMCwgMHgwMDAwMDAwMCk7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtTaWduaWZpY2FuZE1hc2sgPSBSQVBJREpTT05fVUlOVDY0X0MyKDB4MDAwRkZGRkYsIDB4RkZGRkZGRkYpOwotICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrSGlkZGVuQml0ID0gUkFQSURKU09OX1VJTlQ2NF9DMigweDAwMTAwMDAwLCAweDAwMDAwMDAwKTsKLQotICAgIHVuaW9uIHsKLSAgICAgICAgZG91YmxlIGRfOwotICAgICAgICB1aW50NjRfdCB1XzsKLSAgICB9OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLVJBUElESlNPTl9OQU1FU1BBQ0VfRU5ECi0KLSNlbmRpZiAvLyBSQVBJREpTT05fSUVFRTc1NF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvaXRvYS5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9pbnRlcm5hbC9pdG9hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTRlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9pbnRlcm5hbC9pdG9hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fSVRPQV8KLSNkZWZpbmUgUkFQSURKU09OX0lUT0FfCi0KLSNpbmNsdWRlICIuLi9yYXBpZGpzb24uaCIKLQotUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTgotbmFtZXNwYWNlIGludGVybmFsIHsKLQotaW5saW5lIGNvbnN0IGNoYXIqIEdldERpZ2l0c0x1dCgpIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBjRGlnaXRzTHV0WzIwMF0gPSB7Ci0gICAgICAgICcwJywnMCcsJzAnLCcxJywnMCcsJzInLCcwJywnMycsJzAnLCc0JywnMCcsJzUnLCcwJywnNicsJzAnLCc3JywnMCcsJzgnLCcwJywnOScsCi0gICAgICAgICcxJywnMCcsJzEnLCcxJywnMScsJzInLCcxJywnMycsJzEnLCc0JywnMScsJzUnLCcxJywnNicsJzEnLCc3JywnMScsJzgnLCcxJywnOScsCi0gICAgICAgICcyJywnMCcsJzInLCcxJywnMicsJzInLCcyJywnMycsJzInLCc0JywnMicsJzUnLCcyJywnNicsJzInLCc3JywnMicsJzgnLCcyJywnOScsCi0gICAgICAgICczJywnMCcsJzMnLCcxJywnMycsJzInLCczJywnMycsJzMnLCc0JywnMycsJzUnLCczJywnNicsJzMnLCc3JywnMycsJzgnLCczJywnOScsCi0gICAgICAgICc0JywnMCcsJzQnLCcxJywnNCcsJzInLCc0JywnMycsJzQnLCc0JywnNCcsJzUnLCc0JywnNicsJzQnLCc3JywnNCcsJzgnLCc0JywnOScsCi0gICAgICAgICc1JywnMCcsJzUnLCcxJywnNScsJzInLCc1JywnMycsJzUnLCc0JywnNScsJzUnLCc1JywnNicsJzUnLCc3JywnNScsJzgnLCc1JywnOScsCi0gICAgICAgICc2JywnMCcsJzYnLCcxJywnNicsJzInLCc2JywnMycsJzYnLCc0JywnNicsJzUnLCc2JywnNicsJzYnLCc3JywnNicsJzgnLCc2JywnOScsCi0gICAgICAgICc3JywnMCcsJzcnLCcxJywnNycsJzInLCc3JywnMycsJzcnLCc0JywnNycsJzUnLCc3JywnNicsJzcnLCc3JywnNycsJzgnLCc3JywnOScsCi0gICAgICAgICc4JywnMCcsJzgnLCcxJywnOCcsJzInLCc4JywnMycsJzgnLCc0JywnOCcsJzUnLCc4JywnNicsJzgnLCc3JywnOCcsJzgnLCc4JywnOScsCi0gICAgICAgICc5JywnMCcsJzknLCcxJywnOScsJzInLCc5JywnMycsJzknLCc0JywnOScsJzUnLCc5JywnNicsJzknLCc3JywnOScsJzgnLCc5JywnOScKLSAgICB9OwotICAgIHJldHVybiBjRGlnaXRzTHV0OwotfQotCi1pbmxpbmUgY2hhciogdTMydG9hKHVpbnQzMl90IHZhbHVlLCBjaGFyKiBidWZmZXIpIHsKLSAgICBjb25zdCBjaGFyKiBjRGlnaXRzTHV0ID0gR2V0RGlnaXRzTHV0KCk7Ci0KLSAgICBpZiAodmFsdWUgPCAxMDAwMCkgewotICAgICAgICBjb25zdCB1aW50MzJfdCBkMSA9ICh2YWx1ZSAvIDEwMCkgPDwgMTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgZDIgPSAodmFsdWUgJSAxMDApIDw8IDE7Ci0gICAgICAgIAotICAgICAgICBpZiAodmFsdWUgPj0gMTAwMCkKLSAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDFdOwotICAgICAgICBpZiAodmFsdWUgPj0gMTAwKQotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMSArIDFdOwotICAgICAgICBpZiAodmFsdWUgPj0gMTApCi0gICAgICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2QyXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMiArIDFdOwotICAgIH0KLSAgICBlbHNlIGlmICh2YWx1ZSA8IDEwMDAwMDAwMCkgewotICAgICAgICAvLyB2YWx1ZSA9IGJiYmJjY2NjCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGIgPSB2YWx1ZSAvIDEwMDAwOwotICAgICAgICBjb25zdCB1aW50MzJfdCBjID0gdmFsdWUgJSAxMDAwMDsKLSAgICAgICAgCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGQxID0gKGIgLyAxMDApIDw8IDE7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGQyID0gKGIgJSAxMDApIDw8IDE7Ci0gICAgICAgIAotICAgICAgICBjb25zdCB1aW50MzJfdCBkMyA9IChjIC8gMTAwKSA8PCAxOwotICAgICAgICBjb25zdCB1aW50MzJfdCBkNCA9IChjICUgMTAwKSA8PCAxOwotICAgICAgICAKLSAgICAgICAgaWYgKHZhbHVlID49IDEwMDAwMDAwKQotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMV07Ci0gICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwMDAwKQotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMSArIDFdOwotICAgICAgICBpZiAodmFsdWUgPj0gMTAwMDAwKQotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMl07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDIgKyAxXTsKLSAgICAgICAgCi0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDNdOwotICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2QzICsgMV07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDRdOwotICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2Q0ICsgMV07Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvLyB2YWx1ZSA9IGFhYmJiYmNjY2MgaW4gZGVjaW1hbAotICAgICAgICAKLSAgICAgICAgY29uc3QgdWludDMyX3QgYSA9IHZhbHVlIC8gMTAwMDAwMDAwOyAvLyAxIHRvIDQyCi0gICAgICAgIHZhbHVlICU9IDEwMDAwMDAwMDsKLSAgICAgICAgCi0gICAgICAgIGlmIChhID49IDEwKSB7Ci0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpID0gYSA8PCAxOwotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtpXTsKLSAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbaSArIDFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICpidWZmZXIrKyA9IHN0YXRpY19jYXN0PGNoYXI+KCcwJyArIHN0YXRpY19jYXN0PGNoYXI+KGEpKTsKLQotICAgICAgICBjb25zdCB1aW50MzJfdCBiID0gdmFsdWUgLyAxMDAwMDsgLy8gMCB0byA5OTk5Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGMgPSB2YWx1ZSAlIDEwMDAwOyAvLyAwIHRvIDk5OTkKLSAgICAgICAgCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGQxID0gKGIgLyAxMDApIDw8IDE7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGQyID0gKGIgJSAxMDApIDw8IDE7Ci0gICAgICAgIAotICAgICAgICBjb25zdCB1aW50MzJfdCBkMyA9IChjIC8gMTAwKSA8PCAxOwotICAgICAgICBjb25zdCB1aW50MzJfdCBkNCA9IChjICUgMTAwKSA8PCAxOwotICAgICAgICAKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMV07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDEgKyAxXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMl07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDIgKyAxXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkM107Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDMgKyAxXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkNF07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDQgKyAxXTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotaW5saW5lIGNoYXIqIGkzMnRvYShpbnQzMl90IHZhbHVlLCBjaGFyKiBidWZmZXIpIHsKLSAgICB1aW50MzJfdCB1ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlKTsKLSAgICBpZiAodmFsdWUgPCAwKSB7Ci0gICAgICAgICpidWZmZXIrKyA9ICctJzsKLSAgICAgICAgdSA9IH51ICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdTMydG9hKHUsIGJ1ZmZlcik7Ci19Ci0KLWlubGluZSBjaGFyKiB1NjR0b2EodWludDY0X3QgdmFsdWUsIGNoYXIqIGJ1ZmZlcikgewotICAgIGNvbnN0IGNoYXIqIGNEaWdpdHNMdXQgPSBHZXREaWdpdHNMdXQoKTsKLSAgICBjb25zdCB1aW50NjRfdCAga1RlbjggPSAxMDAwMDAwMDA7Ci0gICAgY29uc3QgdWludDY0X3QgIGtUZW45ID0ga1RlbjggKiAxMDsKLSAgICBjb25zdCB1aW50NjRfdCBrVGVuMTAgPSBrVGVuOCAqIDEwMDsKLSAgICBjb25zdCB1aW50NjRfdCBrVGVuMTEgPSBrVGVuOCAqIDEwMDA7Ci0gICAgY29uc3QgdWludDY0X3Qga1RlbjEyID0ga1RlbjggKiAxMDAwMDsKLSAgICBjb25zdCB1aW50NjRfdCBrVGVuMTMgPSBrVGVuOCAqIDEwMDAwMDsKLSAgICBjb25zdCB1aW50NjRfdCBrVGVuMTQgPSBrVGVuOCAqIDEwMDAwMDA7Ci0gICAgY29uc3QgdWludDY0X3Qga1RlbjE1ID0ga1RlbjggKiAxMDAwMDAwMDsKLSAgICBjb25zdCB1aW50NjRfdCBrVGVuMTYgPSBrVGVuOCAqIGtUZW44OwotICAgIAotICAgIGlmICh2YWx1ZSA8IGtUZW44KSB7Ci0gICAgICAgIHVpbnQzMl90IHYgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUpOwotICAgICAgICBpZiAodiA8IDEwMDAwKSB7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkMSA9ICh2IC8gMTAwKSA8PCAxOwotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZDIgPSAodiAlIDEwMCkgPDwgMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHYgPj0gMTAwMCkKLSAgICAgICAgICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2QxXTsKLSAgICAgICAgICAgIGlmICh2ID49IDEwMCkKLSAgICAgICAgICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2QxICsgMV07Ci0gICAgICAgICAgICBpZiAodiA+PSAxMCkKLSAgICAgICAgICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2QyXTsKLSAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDIgKyAxXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHZhbHVlID0gYmJiYmNjY2MKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGIgPSB2IC8gMTAwMDA7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjID0gdiAlIDEwMDAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkMSA9IChiIC8gMTAwKSA8PCAxOwotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZDIgPSAoYiAlIDEwMCkgPDwgMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZDMgPSAoYyAvIDEwMCkgPDwgMTsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGQ0ID0gKGMgJSAxMDApIDw8IDE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwMDAwMCkKLSAgICAgICAgICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2QxXTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwMDAwKQotICAgICAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDEgKyAxXTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxMDAwMDApCi0gICAgICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMl07Ci0gICAgICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2QyICsgMV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDNdOwotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMyArIDFdOwotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkNF07Ci0gICAgICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2Q0ICsgMV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodmFsdWUgPCBrVGVuMTYpIHsKLSAgICAgICAgY29uc3QgdWludDMyX3QgdjAgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUgLyBrVGVuOCk7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IHYxID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlICUga1RlbjgpOwotICAgICAgICAKLSAgICAgICAgY29uc3QgdWludDMyX3QgYjAgPSB2MCAvIDEwMDAwOwotICAgICAgICBjb25zdCB1aW50MzJfdCBjMCA9IHYwICUgMTAwMDA7Ci0gICAgICAgIAotICAgICAgICBjb25zdCB1aW50MzJfdCBkMSA9IChiMCAvIDEwMCkgPDwgMTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgZDIgPSAoYjAgJSAxMDApIDw8IDE7Ci0gICAgICAgIAotICAgICAgICBjb25zdCB1aW50MzJfdCBkMyA9IChjMCAvIDEwMCkgPDwgMTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgZDQgPSAoYzAgJSAxMDApIDw8IDE7Ci0KLSAgICAgICAgY29uc3QgdWludDMyX3QgYjEgPSB2MSAvIDEwMDAwOwotICAgICAgICBjb25zdCB1aW50MzJfdCBjMSA9IHYxICUgMTAwMDA7Ci0gICAgICAgIAotICAgICAgICBjb25zdCB1aW50MzJfdCBkNSA9IChiMSAvIDEwMCkgPDwgMTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgZDYgPSAoYjEgJSAxMDApIDw8IDE7Ci0gICAgICAgIAotICAgICAgICBjb25zdCB1aW50MzJfdCBkNyA9IChjMSAvIDEwMCkgPDwgMTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgZDggPSAoYzEgJSAxMDApIDw8IDE7Ci0KLSAgICAgICAgaWYgKHZhbHVlID49IGtUZW4xNSkKLSAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDFdOwotICAgICAgICBpZiAodmFsdWUgPj0ga1RlbjE0KQotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMSArIDFdOwotICAgICAgICBpZiAodmFsdWUgPj0ga1RlbjEzKQotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMl07Ci0gICAgICAgIGlmICh2YWx1ZSA+PSBrVGVuMTIpCi0gICAgICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2QyICsgMV07Ci0gICAgICAgIGlmICh2YWx1ZSA+PSBrVGVuMTEpCi0gICAgICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2QzXTsKLSAgICAgICAgaWYgKHZhbHVlID49IGtUZW4xMCkKLSAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDMgKyAxXTsKLSAgICAgICAgaWYgKHZhbHVlID49IGtUZW45KQotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkNF07Ci0gICAgICAgIGlmICh2YWx1ZSA+PSBrVGVuOCkKLSAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDQgKyAxXTsKLSAgICAgICAgCi0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDVdOwotICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2Q1ICsgMV07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDZdOwotICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2Q2ICsgMV07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDddOwotICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2Q3ICsgMV07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDhdOwotICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2Q4ICsgMV07Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBjb25zdCB1aW50MzJfdCBhID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbHVlIC8ga1RlbjE2KTsgLy8gMSB0byAxODQ0Ci0gICAgICAgIHZhbHVlICU9IGtUZW4xNjsKLSAgICAgICAgCi0gICAgICAgIGlmIChhIDwgMTApCi0gICAgICAgICAgICAqYnVmZmVyKysgPSBzdGF0aWNfY2FzdDxjaGFyPignMCcgKyBzdGF0aWNfY2FzdDxjaGFyPihhKSk7Ci0gICAgICAgIGVsc2UgaWYgKGEgPCAxMDApIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGkgPSBhIDw8IDE7Ci0gICAgICAgICAgICAqYnVmZmVyKysgPSBjRGlnaXRzTHV0W2ldOwotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtpICsgMV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYSA8IDEwMDApIHsKLSAgICAgICAgICAgICpidWZmZXIrKyA9IHN0YXRpY19jYXN0PGNoYXI+KCcwJyArIHN0YXRpY19jYXN0PGNoYXI+KGEgLyAxMDApKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaSA9IChhICUgMTAwKSA8PCAxOwotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtpXTsKLSAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbaSArIDFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaSA9IChhIC8gMTAwKSA8PCAxOwotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaiA9IChhICUgMTAwKSA8PCAxOwotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtpXTsKLSAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbaSArIDFdOwotICAgICAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtqXTsKLSAgICAgICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbaiArIDFdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjb25zdCB1aW50MzJfdCB2MCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWx1ZSAvIGtUZW44KTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgdjEgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUgJSBrVGVuOCk7Ci0gICAgICAgIAotICAgICAgICBjb25zdCB1aW50MzJfdCBiMCA9IHYwIC8gMTAwMDA7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGMwID0gdjAgJSAxMDAwMDsKLSAgICAgICAgCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGQxID0gKGIwIC8gMTAwKSA8PCAxOwotICAgICAgICBjb25zdCB1aW50MzJfdCBkMiA9IChiMCAlIDEwMCkgPDwgMTsKLSAgICAgICAgCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGQzID0gKGMwIC8gMTAwKSA8PCAxOwotICAgICAgICBjb25zdCB1aW50MzJfdCBkNCA9IChjMCAlIDEwMCkgPDwgMTsKLSAgICAgICAgCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGIxID0gdjEgLyAxMDAwMDsKLSAgICAgICAgY29uc3QgdWludDMyX3QgYzEgPSB2MSAlIDEwMDAwOwotICAgICAgICAKLSAgICAgICAgY29uc3QgdWludDMyX3QgZDUgPSAoYjEgLyAxMDApIDw8IDE7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGQ2ID0gKGIxICUgMTAwKSA8PCAxOwotICAgICAgICAKLSAgICAgICAgY29uc3QgdWludDMyX3QgZDcgPSAoYzEgLyAxMDApIDw8IDE7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGQ4ID0gKGMxICUgMTAwKSA8PCAxOwotICAgICAgICAKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMV07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDEgKyAxXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkMl07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDIgKyAxXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkM107Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDMgKyAxXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkNF07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDQgKyAxXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkNV07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDUgKyAxXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkNl07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDYgKyAxXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkN107Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDcgKyAxXTsKLSAgICAgICAgKmJ1ZmZlcisrID0gY0RpZ2l0c0x1dFtkOF07Ci0gICAgICAgICpidWZmZXIrKyA9IGNEaWdpdHNMdXRbZDggKyAxXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotaW5saW5lIGNoYXIqIGk2NHRvYShpbnQ2NF90IHZhbHVlLCBjaGFyKiBidWZmZXIpIHsKLSAgICB1aW50NjRfdCB1ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHZhbHVlKTsKLSAgICBpZiAodmFsdWUgPCAwKSB7Ci0gICAgICAgICpidWZmZXIrKyA9ICctJzsKLSAgICAgICAgdSA9IH51ICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdTY0dG9hKHUsIGJ1ZmZlcik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGludGVybmFsCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jZW5kaWYgLy8gUkFQSURKU09OX0lUT0FfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ludGVybmFsL21ldGEuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvbWV0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTlhYWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvbWV0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUuCi0vLyAKLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0vLyB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgCi0vLyBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgUkFQSURKU09OX0lOVEVSTkFMX01FVEFfSF8KLSNkZWZpbmUgUkFQSURKU09OX0lOVEVSTkFMX01FVEFfSF8KLQotI2luY2x1ZGUgIi4uL3JhcGlkanNvbi5oIgotCi0jaWZkZWYgX19HTlVDX18KLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRihlZmZjKyspCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKDYzMzQpCi0jZW5kaWYKLQotI2lmIFJBUElESlNPTl9IQVNfQ1hYMTFfVFlQRVRSQUlUUwotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotI2VuZGlmCi0KLS8vQGNvbmQgUkFQSURKU09OX0lOVEVSTkFMCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBIZWxwZXIgdG8gd3JhcC9jb252ZXJ0IGFyYml0cmFyeSB0eXBlcyB0byB2b2lkLCB1c2VmdWwgZm9yIGFyYml0cmFyeSB0eXBlIG1hdGNoaW5nCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFZvaWQgeyB0eXBlZGVmIHZvaWQgVHlwZTsgfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQm9vbFR5cGUsIFRydWVUeXBlLCBGYWxzZVR5cGUKLS8vCi10ZW1wbGF0ZSA8Ym9vbCBDb25kPiBzdHJ1Y3QgQm9vbFR5cGUgewotICAgIHN0YXRpYyBjb25zdCBib29sIFZhbHVlID0gQ29uZDsKLSAgICB0eXBlZGVmIEJvb2xUeXBlIFR5cGU7Ci19OwotdHlwZWRlZiBCb29sVHlwZTx0cnVlPiBUcnVlVHlwZTsKLXR5cGVkZWYgQm9vbFR5cGU8ZmFsc2U+IEZhbHNlVHlwZTsKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTZWxlY3RJZiwgQm9vbEV4cHIsIE5vdEV4cHIsIEFuZEV4cHIsIE9yRXhwcgotLy8KLQotdGVtcGxhdGUgPGJvb2wgQz4gc3RydWN0IFNlbGVjdElmSW1wbCB7IHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+IHN0cnVjdCBBcHBseSB7IHR5cGVkZWYgVDEgVHlwZTsgfTsgfTsKLXRlbXBsYXRlIDw+IHN0cnVjdCBTZWxlY3RJZkltcGw8ZmFsc2U+IHsgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gc3RydWN0IEFwcGx5IHsgdHlwZWRlZiBUMiBUeXBlOyB9OyB9OwotdGVtcGxhdGUgPGJvb2wgQywgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgU2VsZWN0SWZDb25kIDogU2VsZWN0SWZJbXBsPEM+Ojp0ZW1wbGF0ZSBBcHBseTxUMSxUMj4ge307Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgQywgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgU2VsZWN0SWYgOiBTZWxlY3RJZkNvbmQ8Qzo6VmFsdWUsIFQxLCBUMj4ge307Ci0KLXRlbXBsYXRlIDxib29sIENvbmQxLCBib29sIENvbmQyPiBzdHJ1Y3QgQW5kRXhwckNvbmQgOiBGYWxzZVR5cGUge307Ci10ZW1wbGF0ZSA8PiBzdHJ1Y3QgQW5kRXhwckNvbmQ8dHJ1ZSwgdHJ1ZT4gOiBUcnVlVHlwZSB7fTsKLXRlbXBsYXRlIDxib29sIENvbmQxLCBib29sIENvbmQyPiBzdHJ1Y3QgT3JFeHByQ29uZCA6IFRydWVUeXBlIHt9OwotdGVtcGxhdGUgPD4gc3RydWN0IE9yRXhwckNvbmQ8ZmFsc2UsIGZhbHNlPiA6IEZhbHNlVHlwZSB7fTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEM+IHN0cnVjdCBCb29sRXhwciA6IFNlbGVjdElmPEMsVHJ1ZVR5cGUsRmFsc2VUeXBlPjo6VHlwZSB7fTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBDPiBzdHJ1Y3QgTm90RXhwciAgOiBTZWxlY3RJZjxDLEZhbHNlVHlwZSxUcnVlVHlwZT46OlR5cGUge307Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgQzEsIHR5cGVuYW1lIEMyPiBzdHJ1Y3QgQW5kRXhwciA6IEFuZEV4cHJDb25kPEMxOjpWYWx1ZSwgQzI6OlZhbHVlPjo6VHlwZSB7fTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBDMSwgdHlwZW5hbWUgQzI+IHN0cnVjdCBPckV4cHIgIDogT3JFeHByQ29uZDxDMTo6VmFsdWUsIEMyOjpWYWx1ZT46OlR5cGUge307Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQWRkQ29uc3QsIE1heWJlQWRkQ29uc3QsIFJlbW92ZUNvbnN0Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEFkZENvbnN0IHsgdHlwZWRlZiBjb25zdCBUIFR5cGU7IH07Ci10ZW1wbGF0ZSA8Ym9vbCBDb25zdGlmeSwgdHlwZW5hbWUgVD4gc3RydWN0IE1heWJlQWRkQ29uc3QgOiBTZWxlY3RJZkNvbmQ8Q29uc3RpZnksIGNvbnN0IFQsIFQ+IHt9OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdCB7IHR5cGVkZWYgVCBUeXBlOyB9OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdDxjb25zdCBUPiB7IHR5cGVkZWYgVCBUeXBlOyB9OwotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIElzU2FtZSwgSXNDb25zdCwgSXNNb3JlQ29uc3QsIElzUG9pbnRlcgotLy8KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiBzdHJ1Y3QgSXNTYW1lIDogRmFsc2VUeXBlIHt9OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBJc1NhbWU8VCwgVD4gOiBUcnVlVHlwZSB7fTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBJc0NvbnN0IDogRmFsc2VUeXBlIHt9OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBJc0NvbnN0PGNvbnN0IFQ+IDogVHJ1ZVR5cGUge307Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDVCwgdHlwZW5hbWUgVD4KLXN0cnVjdCBJc01vcmVDb25zdAotICAgIDogQW5kRXhwcjxJc1NhbWU8dHlwZW5hbWUgUmVtb3ZlQ29uc3Q8Q1Q+OjpUeXBlLCB0eXBlbmFtZSBSZW1vdmVDb25zdDxUPjo6VHlwZT4sCi0gICAgICAgICAgICAgIEJvb2xUeXBlPElzQ29uc3Q8Q1Q+OjpWYWx1ZSA+PSBJc0NvbnN0PFQ+OjpWYWx1ZT4gPjo6VHlwZSB7fTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBJc1BvaW50ZXIgOiBGYWxzZVR5cGUge307Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IElzUG9pbnRlcjxUKj4gOiBUcnVlVHlwZSB7fTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSXNCYXNlT2YKLS8vCi0jaWYgUkFQSURKU09OX0hBU19DWFgxMV9UWVBFVFJBSVRTCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBCLCB0eXBlbmFtZSBEPiBzdHJ1Y3QgSXNCYXNlT2YKLSAgICA6IEJvb2xUeXBlPCA6OnN0ZDo6aXNfYmFzZV9vZjxCLEQ+Ojp2YWx1ZT4ge307Ci0KLSNlbHNlIC8vIHNpbXBsaWZpZWQgdmVyc2lvbiBhZG9wdGVkIGZyb20gQm9vc3QKLQotdGVtcGxhdGU8dHlwZW5hbWUgQiwgdHlwZW5hbWUgRD4gc3RydWN0IElzQmFzZU9mSW1wbCB7Ci0gICAgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKEIpICE9IDApOwotICAgIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUKHNpemVvZihEKSAhPSAwKTsKLQotICAgIHR5cGVkZWYgY2hhciAoJlllcylbMV07Ci0gICAgdHlwZWRlZiBjaGFyICgmTm8pIFsyXTsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIHN0YXRpYyBZZXMgQ2hlY2soY29uc3QgRCosIFQpOwotICAgIHN0YXRpYyBObyAgQ2hlY2soY29uc3QgQiosIGludCk7Ci0KLSAgICBzdHJ1Y3QgSG9zdCB7Ci0gICAgICAgIG9wZXJhdG9yIGNvbnN0IEIqKCkgY29uc3Q7Ci0gICAgICAgIG9wZXJhdG9yIGNvbnN0IEQqKCk7Ci0gICAgfTsKLQotICAgIGVudW0geyBWYWx1ZSA9IChzaXplb2YoQ2hlY2soSG9zdCgpLCAwKSkgPT0gc2l6ZW9mKFllcykpIH07Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQiwgdHlwZW5hbWUgRD4gc3RydWN0IElzQmFzZU9mCi0gICAgOiBPckV4cHI8SXNTYW1lPEIsIEQ+LCBCb29sRXhwcjxJc0Jhc2VPZkltcGw8QiwgRD4gPiA+OjpUeXBlIHt9OwotCi0jZW5kaWYgLy8gUkFQSURKU09OX0hBU19DWFgxMV9UWVBFVFJBSVRTCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEVuYWJsZUlmIC8gRGlzYWJsZUlmCi0vLwotdGVtcGxhdGUgPGJvb2wgQ29uZGl0aW9uLCB0eXBlbmFtZSBUID0gdm9pZD4gc3RydWN0IEVuYWJsZUlmQ29uZCAgeyB0eXBlZGVmIFQgVHlwZTsgfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRW5hYmxlSWZDb25kPGZhbHNlLCBUPiB7IC8qIGVtcHR5ICovIH07Ci0KLXRlbXBsYXRlIDxib29sIENvbmRpdGlvbiwgdHlwZW5hbWUgVCA9IHZvaWQ+IHN0cnVjdCBEaXNhYmxlSWZDb25kIHsgdHlwZWRlZiBUIFR5cGU7IH07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERpc2FibGVJZkNvbmQ8dHJ1ZSwgVD4geyAvKiBlbXB0eSAqLyB9OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uZGl0aW9uLCB0eXBlbmFtZSBUID0gdm9pZD4KLXN0cnVjdCBFbmFibGVJZiA6IEVuYWJsZUlmQ29uZDxDb25kaXRpb246OlZhbHVlLCBUPiB7fTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIENvbmRpdGlvbiwgdHlwZW5hbWUgVCA9IHZvaWQ+Ci1zdHJ1Y3QgRGlzYWJsZUlmIDogRGlzYWJsZUlmQ29uZDxDb25kaXRpb246OlZhbHVlLCBUPiB7fTsKLQotLy8gU0ZJTkFFIGhlbHBlcnMKLXN0cnVjdCBTZmluYWVUYWcge307Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZVNmaW5hZVRhZzsKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlU2ZpbmFlVGFnPFNmaW5hZVRhZyYoKikoVCk+IHsgdHlwZWRlZiBUIFR5cGU7IH07Ci0KLSNkZWZpbmUgUkFQSURKU09OX1JFTU9WRUZQVFJfKHR5cGUpIFwKLSAgICB0eXBlbmFtZSA6OlJBUElESlNPTl9OQU1FU1BBQ0U6OmludGVybmFsOjpSZW1vdmVTZmluYWVUYWcgXAotICAgICAgICA8IDo6UkFQSURKU09OX05BTUVTUEFDRTo6aW50ZXJuYWw6OlNmaW5hZVRhZyYoKikgdHlwZT46OlR5cGUKLQotI2RlZmluZSBSQVBJREpTT05fRU5BQkxFSUYoY29uZCkgXAotICAgIHR5cGVuYW1lIDo6UkFQSURKU09OX05BTUVTUEFDRTo6aW50ZXJuYWw6OkVuYWJsZUlmIFwKLSAgICAgICAgPFJBUElESlNPTl9SRU1PVkVGUFRSXyhjb25kKT46OlR5cGUgKiA9IE5VTEwKLQotI2RlZmluZSBSQVBJREpTT05fRElTQUJMRUlGKGNvbmQpIFwKLSAgICB0eXBlbmFtZSA6OlJBUElESlNPTl9OQU1FU1BBQ0U6OmludGVybmFsOjpEaXNhYmxlSWYgXAotICAgICAgICA8UkFQSURKU09OX1JFTU9WRUZQVFJfKGNvbmQpPjo6VHlwZSAqID0gTlVMTAotCi0jZGVmaW5lIFJBUElESlNPTl9FTkFCTEVJRl9SRVRVUk4oY29uZCxyZXR1cm50eXBlKSBcCi0gICAgdHlwZW5hbWUgOjpSQVBJREpTT05fTkFNRVNQQUNFOjppbnRlcm5hbDo6RW5hYmxlSWYgXAotICAgICAgICA8UkFQSURKU09OX1JFTU9WRUZQVFJfKGNvbmQpLCBcCi0gICAgICAgICBSQVBJREpTT05fUkVNT1ZFRlBUUl8ocmV0dXJudHlwZSk+OjpUeXBlCi0KLSNkZWZpbmUgUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oY29uZCxyZXR1cm50eXBlKSBcCi0gICAgdHlwZW5hbWUgOjpSQVBJREpTT05fTkFNRVNQQUNFOjppbnRlcm5hbDo6RGlzYWJsZUlmIFwKLSAgICAgICAgPFJBUElESlNPTl9SRU1PVkVGUFRSXyhjb25kKSwgXAotICAgICAgICAgUkFQSURKU09OX1JFTU9WRUZQVFJfKHJldHVybnR5cGUpPjo6VHlwZQotCi19IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLS8vQGVuZGNvbmQKLQotI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX01TQ19WRVIpCi1SQVBJREpTT05fRElBR19QT1AKLSNlbmRpZgotCi0jZW5kaWYgLy8gUkFQSURKU09OX0lOVEVSTkFMX01FVEFfSF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvcG93MTAuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvcG93MTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmNDc1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ludGVybmFsL3BvdzEwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLyBUZW5jZW50IGlzIHBsZWFzZWQgdG8gc3VwcG9ydCB0aGUgb3BlbiBzb3VyY2UgY29tbXVuaXR5IGJ5IG1ha2luZyBSYXBpZEpTT04gYXZhaWxhYmxlLgotLy8gCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTUgVEhMIEEyOSBMaW1pdGVkLCBhIFRlbmNlbnQgY29tcGFueSwgYW5kIE1pbG8gWWlwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0Ci0vLyBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIAotLy8gdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIAotLy8gQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgCi0vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFJBUElESlNPTl9QT1cxMF8KLSNkZWZpbmUgUkFQSURKU09OX1BPVzEwXwotCi0jaW5jbHVkZSAiLi4vcmFwaWRqc29uLmgiCi0KLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vISBDb21wdXRlcyBpbnRlZ2VyIHBvd2VycyBvZiAxMCBpbiBkb3VibGUgKDEwLjBebikuCi0vKiEgVGhpcyBmdW5jdGlvbiB1c2VzIGxvb2t1cCB0YWJsZSBmb3IgZmFzdCBhbmQgYWNjdXJhdGUgcmVzdWx0cy4KLSAgICBccGFyYW0gbiBub24tbmVnYXRpdmUgZXhwb25lbnQuIE11c3QgPD0gMzA4LgotICAgIFxyZXR1cm4gMTAuMF5uCi0qLwotaW5saW5lIGRvdWJsZSBQb3cxMChpbnQgbikgewotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgZVtdID0geyAvLyAxZS0wLi4uMWUzMDg6IDMwOSAqIDggYnl0ZXMgPSAyNDcyIGJ5dGVzCi0gICAgICAgIDFlKzAsICAKLSAgICAgICAgMWUrMSwgIDFlKzIsICAxZSszLCAgMWUrNCwgIDFlKzUsICAxZSs2LCAgMWUrNywgIDFlKzgsICAxZSs5LCAgMWUrMTAsIDFlKzExLCAxZSsxMiwgMWUrMTMsIDFlKzE0LCAxZSsxNSwgMWUrMTYsIDFlKzE3LCAxZSsxOCwgMWUrMTksIDFlKzIwLCAKLSAgICAgICAgMWUrMjEsIDFlKzIyLCAxZSsyMywgMWUrMjQsIDFlKzI1LCAxZSsyNiwgMWUrMjcsIDFlKzI4LCAxZSsyOSwgMWUrMzAsIDFlKzMxLCAxZSszMiwgMWUrMzMsIDFlKzM0LCAxZSszNSwgMWUrMzYsIDFlKzM3LCAxZSszOCwgMWUrMzksIDFlKzQwLAotICAgICAgICAxZSs0MSwgMWUrNDIsIDFlKzQzLCAxZSs0NCwgMWUrNDUsIDFlKzQ2LCAxZSs0NywgMWUrNDgsIDFlKzQ5LCAxZSs1MCwgMWUrNTEsIDFlKzUyLCAxZSs1MywgMWUrNTQsIDFlKzU1LCAxZSs1NiwgMWUrNTcsIDFlKzU4LCAxZSs1OSwgMWUrNjAsCi0gICAgICAgIDFlKzYxLCAxZSs2MiwgMWUrNjMsIDFlKzY0LCAxZSs2NSwgMWUrNjYsIDFlKzY3LCAxZSs2OCwgMWUrNjksIDFlKzcwLCAxZSs3MSwgMWUrNzIsIDFlKzczLCAxZSs3NCwgMWUrNzUsIDFlKzc2LCAxZSs3NywgMWUrNzgsIDFlKzc5LCAxZSs4MCwKLSAgICAgICAgMWUrODEsIDFlKzgyLCAxZSs4MywgMWUrODQsIDFlKzg1LCAxZSs4NiwgMWUrODcsIDFlKzg4LCAxZSs4OSwgMWUrOTAsIDFlKzkxLCAxZSs5MiwgMWUrOTMsIDFlKzk0LCAxZSs5NSwgMWUrOTYsIDFlKzk3LCAxZSs5OCwgMWUrOTksIDFlKzEwMCwKLSAgICAgICAgMWUrMTAxLDFlKzEwMiwxZSsxMDMsMWUrMTA0LDFlKzEwNSwxZSsxMDYsMWUrMTA3LDFlKzEwOCwxZSsxMDksMWUrMTEwLDFlKzExMSwxZSsxMTIsMWUrMTEzLDFlKzExNCwxZSsxMTUsMWUrMTE2LDFlKzExNywxZSsxMTgsMWUrMTE5LDFlKzEyMCwKLSAgICAgICAgMWUrMTIxLDFlKzEyMiwxZSsxMjMsMWUrMTI0LDFlKzEyNSwxZSsxMjYsMWUrMTI3LDFlKzEyOCwxZSsxMjksMWUrMTMwLDFlKzEzMSwxZSsxMzIsMWUrMTMzLDFlKzEzNCwxZSsxMzUsMWUrMTM2LDFlKzEzNywxZSsxMzgsMWUrMTM5LDFlKzE0MCwKLSAgICAgICAgMWUrMTQxLDFlKzE0MiwxZSsxNDMsMWUrMTQ0LDFlKzE0NSwxZSsxNDYsMWUrMTQ3LDFlKzE0OCwxZSsxNDksMWUrMTUwLDFlKzE1MSwxZSsxNTIsMWUrMTUzLDFlKzE1NCwxZSsxNTUsMWUrMTU2LDFlKzE1NywxZSsxNTgsMWUrMTU5LDFlKzE2MCwKLSAgICAgICAgMWUrMTYxLDFlKzE2MiwxZSsxNjMsMWUrMTY0LDFlKzE2NSwxZSsxNjYsMWUrMTY3LDFlKzE2OCwxZSsxNjksMWUrMTcwLDFlKzE3MSwxZSsxNzIsMWUrMTczLDFlKzE3NCwxZSsxNzUsMWUrMTc2LDFlKzE3NywxZSsxNzgsMWUrMTc5LDFlKzE4MCwKLSAgICAgICAgMWUrMTgxLDFlKzE4MiwxZSsxODMsMWUrMTg0LDFlKzE4NSwxZSsxODYsMWUrMTg3LDFlKzE4OCwxZSsxODksMWUrMTkwLDFlKzE5MSwxZSsxOTIsMWUrMTkzLDFlKzE5NCwxZSsxOTUsMWUrMTk2LDFlKzE5NywxZSsxOTgsMWUrMTk5LDFlKzIwMCwKLSAgICAgICAgMWUrMjAxLDFlKzIwMiwxZSsyMDMsMWUrMjA0LDFlKzIwNSwxZSsyMDYsMWUrMjA3LDFlKzIwOCwxZSsyMDksMWUrMjEwLDFlKzIxMSwxZSsyMTIsMWUrMjEzLDFlKzIxNCwxZSsyMTUsMWUrMjE2LDFlKzIxNywxZSsyMTgsMWUrMjE5LDFlKzIyMCwKLSAgICAgICAgMWUrMjIxLDFlKzIyMiwxZSsyMjMsMWUrMjI0LDFlKzIyNSwxZSsyMjYsMWUrMjI3LDFlKzIyOCwxZSsyMjksMWUrMjMwLDFlKzIzMSwxZSsyMzIsMWUrMjMzLDFlKzIzNCwxZSsyMzUsMWUrMjM2LDFlKzIzNywxZSsyMzgsMWUrMjM5LDFlKzI0MCwKLSAgICAgICAgMWUrMjQxLDFlKzI0MiwxZSsyNDMsMWUrMjQ0LDFlKzI0NSwxZSsyNDYsMWUrMjQ3LDFlKzI0OCwxZSsyNDksMWUrMjUwLDFlKzI1MSwxZSsyNTIsMWUrMjUzLDFlKzI1NCwxZSsyNTUsMWUrMjU2LDFlKzI1NywxZSsyNTgsMWUrMjU5LDFlKzI2MCwKLSAgICAgICAgMWUrMjYxLDFlKzI2MiwxZSsyNjMsMWUrMjY0LDFlKzI2NSwxZSsyNjYsMWUrMjY3LDFlKzI2OCwxZSsyNjksMWUrMjcwLDFlKzI3MSwxZSsyNzIsMWUrMjczLDFlKzI3NCwxZSsyNzUsMWUrMjc2LDFlKzI3NywxZSsyNzgsMWUrMjc5LDFlKzI4MCwKLSAgICAgICAgMWUrMjgxLDFlKzI4MiwxZSsyODMsMWUrMjg0LDFlKzI4NSwxZSsyODYsMWUrMjg3LDFlKzI4OCwxZSsyODksMWUrMjkwLDFlKzI5MSwxZSsyOTIsMWUrMjkzLDFlKzI5NCwxZSsyOTUsMWUrMjk2LDFlKzI5NywxZSsyOTgsMWUrMjk5LDFlKzMwMCwKLSAgICAgICAgMWUrMzAxLDFlKzMwMiwxZSszMDMsMWUrMzA0LDFlKzMwNSwxZSszMDYsMWUrMzA3LDFlKzMwOAotICAgIH07Ci0gICAgUkFQSURKU09OX0FTU0VSVChuID49IDAgJiYgbiA8PSAzMDgpOwotICAgIHJldHVybiBlW25dOwotfQotCi19IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLQotI2VuZGlmIC8vIFJBUElESlNPTl9QT1cxMF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvcmVnZXguaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvcmVnZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViMGUzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ludGVybmFsL3JlZ2V4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fSU5URVJOQUxfUkVHRVhfSF8KLSNkZWZpbmUgUkFQSURKU09OX0lOVEVSTkFMX1JFR0VYX0hfCi0KLSNpbmNsdWRlICIuLi9hbGxvY2F0b3JzLmgiCi0jaW5jbHVkZSAiLi4vc3RyZWFtLmgiCi0jaW5jbHVkZSAic3RhY2suaCIKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKHBhZGRlZCkKLVJBUElESlNPTl9ESUFHX09GRihzd2l0Y2gtZW51bSkKLVJBUElESlNPTl9ESUFHX09GRihpbXBsaWNpdC1mYWxsdGhyb3VnaCkKLSNlbmRpZgotCi0jaWZkZWYgX19HTlVDX18KLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRihlZmZjKyspCi0jZW5kaWYKLQotI2lmbmRlZiBSQVBJREpTT05fUkVHRVhfVkVSQk9TRQotI2RlZmluZSBSQVBJREpTT05fUkVHRVhfVkVSQk9TRSAwCi0jZW5kaWYKLQotUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTgotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR2VuZXJpY1JlZ2V4Ci0KLXN0YXRpYyBjb25zdCBTaXplVHlwZSBrUmVnZXhJbnZhbGlkU3RhdGUgPSB+U2l6ZVR5cGUoMCk7ICAvLyE8IFJlcHJlc2VudHMgYW4gaW52YWxpZCBpbmRleCBpbiBHZW5lcmljUmVnZXg6OlN0YXRlOjpvdXQsIG91dDEKLXN0YXRpYyBjb25zdCBTaXplVHlwZSBrUmVnZXhJbnZhbGlkUmFuZ2UgPSB+U2l6ZVR5cGUoMCk7Ci0KLS8vISBSZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIHdpdGggc3Vic2V0IG9mIEVDTUFzY3JpcHQgZ3JhbW1hci4KLS8qIQotICAgIFN1cHBvcnRlZCByZWd1bGFyIGV4cHJlc3Npb24gc3ludGF4OgotICAgIC0gXGMgYWIgICAgIENvbmNhdGVuYXRpb24KLSAgICAtIFxjIGF8YiAgICBBbHRlcm5hdGlvbgotICAgIC0gXGMgYT8gICAgIFplcm8gb3Igb25lCi0gICAgLSBcYyBhKiAgICAgWmVybyBvciBtb3JlCi0gICAgLSBcYyBhKyAgICAgT25lIG9yIG1vcmUKLSAgICAtIFxjIGF7M30gICBFeGFjdGx5IDMgdGltZXMKLSAgICAtIFxjIGF7Myx9ICBBdCBsZWFzdCAzIHRpbWVzCi0gICAgLSBcYyBhezMsNX0gMyB0byA1IHRpbWVzCi0gICAgLSBcYyAoYWIpICAgR3JvdXBpbmcKLSAgICAtIFxjIF5hICAgICBBdCB0aGUgYmVnaW5uaW5nCi0gICAgLSBcYyBhJCAgICAgQXQgdGhlIGVuZAotICAgIC0gXGMgLiAgICAgIEFueSBjaGFyYWN0ZXIKLSAgICAtIFxjIFthYmNdICBDaGFyYWN0ZXIgY2xhc3NlcwotICAgIC0gXGMgW2EtY10gIENoYXJhY3RlciBjbGFzcyByYW5nZQotICAgIC0gXGMgW2EtejAtOV9dIENoYXJhY3RlciBjbGFzcyBjb21iaW5hdGlvbgotICAgIC0gXGMgW15hYmNdIE5lZ2F0ZWQgY2hhcmFjdGVyIGNsYXNzZXMKLSAgICAtIFxjIFteYS1jXSBOZWdhdGVkIGNoYXJhY3RlciBjbGFzcyByYW5nZQotICAgIC0gXGMgW1xiXSAgIEJhY2tzcGFjZSAoVSswMDA4KQotICAgIC0gXGMgXFx8IFxcXFwgLi4uICBFc2NhcGUgY2hhcmFjdGVycwotICAgIC0gXGMgXFxmIEZvcm0gZmVlZCAoVSswMDBDKQotICAgIC0gXGMgXFxuIExpbmUgZmVlZCAoVSswMDBBKQotICAgIC0gXGMgXFxyIENhcnJpYWdlIHJldHVybiAoVSswMDBEKQotICAgIC0gXGMgXFx0IFRhYiAoVSswMDA5KQotICAgIC0gXGMgXFx2IFZlcnRpY2FsIHRhYiAoVSswMDBCKQotCi0gICAgXG5vdGUgVGhpcyBpcyBhIFRob21wc29uIE5GQSBlbmdpbmUsIGltcGxlbWVudGVkIHdpdGggcmVmZXJlbmNlIHRvIAotICAgICAgICBDb3gsIFJ1c3MuICJSZWd1bGFyIEV4cHJlc3Npb24gTWF0Y2hpbmcgQ2FuIEJlIFNpbXBsZSBBbmQgRmFzdCAoYnV0IGlzIHNsb3cgaW4gSmF2YSwgUGVybCwgUEhQLCBQeXRob24sIFJ1YnksLi4uKS4iLCAKLSAgICAgICAgaHR0cHM6Ly9zd3RjaC5jb20vfnJzYy9yZWdleHAvcmVnZXhwMS5odG1sIAotKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbmNvZGluZywgdHlwZW5hbWUgQWxsb2NhdG9yID0gQ3J0QWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY1JlZ2V4IHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEVuY29kaW5nOjpDaCBDaDsKLQotICAgIEdlbmVyaWNSZWdleChjb25zdCBDaCogc291cmNlLCBBbGxvY2F0b3IqIGFsbG9jYXRvciA9IDApIDogCi0gICAgICAgIHN0YXRlc18oYWxsb2NhdG9yLCAyNTYpLCByYW5nZXNfKGFsbG9jYXRvciwgMjU2KSwgcm9vdF8oa1JlZ2V4SW52YWxpZFN0YXRlKSwgc3RhdGVDb3VudF8oKSwgcmFuZ2VDb3VudF8oKSwgCi0gICAgICAgIHN0YXRlU2V0XygpLCBzdGF0ZTBfKGFsbG9jYXRvciwgMCksIHN0YXRlMV8oYWxsb2NhdG9yLCAwKSwgYW5jaG9yQmVnaW5fKCksIGFuY2hvckVuZF8oKQotICAgIHsKLSAgICAgICAgR2VuZXJpY1N0cmluZ1N0cmVhbTxFbmNvZGluZz4gc3Moc291cmNlKTsKLSAgICAgICAgRGVjb2RlZFN0cmVhbTxHZW5lcmljU3RyaW5nU3RyZWFtPEVuY29kaW5nPiA+IGRzKHNzKTsKLSAgICAgICAgUGFyc2UoZHMpOwotICAgIH0KLQotICAgIH5HZW5lcmljUmVnZXgoKSB7Ci0gICAgICAgIEFsbG9jYXRvcjo6RnJlZShzdGF0ZVNldF8pOwotICAgIH0KLQotICAgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHJvb3RfICE9IGtSZWdleEludmFsaWRTdGF0ZTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRTdHJlYW0+Ci0gICAgYm9vbCBNYXRjaChJbnB1dFN0cmVhbSYgaXMpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIFNlYXJjaFdpdGhBbmNob3JpbmcoaXMsIHRydWUsIHRydWUpOwotICAgIH0KLQotICAgIGJvb2wgTWF0Y2goY29uc3QgQ2gqIHMpIGNvbnN0IHsKLSAgICAgICAgR2VuZXJpY1N0cmluZ1N0cmVhbTxFbmNvZGluZz4gaXMocyk7Ci0gICAgICAgIHJldHVybiBNYXRjaChpcyk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtPgotICAgIGJvb2wgU2VhcmNoKElucHV0U3RyZWFtJiBpcykgY29uc3QgewotICAgICAgICByZXR1cm4gU2VhcmNoV2l0aEFuY2hvcmluZyhpcywgYW5jaG9yQmVnaW5fLCBhbmNob3JFbmRfKTsKLSAgICB9Ci0KLSAgICBib29sIFNlYXJjaChjb25zdCBDaCogcykgY29uc3QgewotICAgICAgICBHZW5lcmljU3RyaW5nU3RyZWFtPEVuY29kaW5nPiBpcyhzKTsKLSAgICAgICAgcmV0dXJuIFNlYXJjaChpcyk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGVudW0gT3BlcmF0b3IgewotICAgICAgICBrWmVyb09yT25lLAotICAgICAgICBrWmVyb09yTW9yZSwKLSAgICAgICAga09uZU9yTW9yZSwKLSAgICAgICAga0NvbmNhdGVuYXRpb24sCi0gICAgICAgIGtBbHRlcm5hdGlvbiwKLSAgICAgICAga0xlZnRQYXJlbnRoZXNpcwotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQga0FueUNoYXJhY3RlckNsYXNzID0gMHhGRkZGRkZGRjsgICAvLyE8IEZvciAnLicKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQga1JhbmdlQ2hhcmFjdGVyQ2xhc3MgPSAweEZGRkZGRkZFOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrUmFuZ2VOZWdhdGlvbkZsYWcgPSAweDgwMDAwMDAwOwotCi0gICAgc3RydWN0IFJhbmdlIHsKLSAgICAgICAgdW5zaWduZWQgc3RhcnQ7IC8vIAotICAgICAgICB1bnNpZ25lZCBlbmQ7Ci0gICAgICAgIFNpemVUeXBlIG5leHQ7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBTdGF0ZSB7Ci0gICAgICAgIFNpemVUeXBlIG91dDsgICAgIC8vITwgRXF1YWxzIHRvIGtJbnZhbGlkIGZvciBtYXRjaGluZyBzdGF0ZQotICAgICAgICBTaXplVHlwZSBvdXQxOyAgICAvLyE8IEVxdWFscyB0byBub24ta0ludmFsaWQgZm9yIHNwbGl0Ci0gICAgICAgIFNpemVUeXBlIHJhbmdlU3RhcnQ7Ci0gICAgICAgIHVuc2lnbmVkIGNvZGVwb2ludDsKLSAgICB9OwotCi0gICAgc3RydWN0IEZyYWcgewotICAgICAgICBGcmFnKFNpemVUeXBlIHMsIFNpemVUeXBlIG8sIFNpemVUeXBlIG0pIDogc3RhcnQocyksIG91dChvKSwgbWluSW5kZXgobSkge30KLSAgICAgICAgU2l6ZVR5cGUgc3RhcnQ7Ci0gICAgICAgIFNpemVUeXBlIG91dDsgLy8hPCBsaW5rLWxpc3Qgb2YgYWxsIG91dHB1dCBzdGF0ZXMKLSAgICAgICAgU2l6ZVR5cGUgbWluSW5kZXg7Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VTdHJlYW0+Ci0gICAgY2xhc3MgRGVjb2RlZFN0cmVhbSB7Ci0gICAgcHVibGljOgotICAgICAgICBEZWNvZGVkU3RyZWFtKFNvdXJjZVN0cmVhbSYgc3MpIDogc3NfKHNzKSwgY29kZXBvaW50XygpIHsgRGVjb2RlKCk7IH0KLSAgICAgICAgdW5zaWduZWQgUGVlaygpIHsgcmV0dXJuIGNvZGVwb2ludF87IH0KLSAgICAgICAgdW5zaWduZWQgVGFrZSgpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGMgPSBjb2RlcG9pbnRfOwotICAgICAgICAgICAgaWYgKGMpIC8vIE5vIGZ1cnRoZXIgZGVjb2Rpbmcgd2hlbiAnXDAnCi0gICAgICAgICAgICAgICAgRGVjb2RlKCk7Ci0gICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdm9pZCBEZWNvZGUoKSB7Ci0gICAgICAgICAgICBpZiAoIUVuY29kaW5nOjpEZWNvZGUoc3NfLCAmY29kZXBvaW50XykpCi0gICAgICAgICAgICAgICAgY29kZXBvaW50XyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBTb3VyY2VTdHJlYW0mIHNzXzsKLSAgICAgICAgdW5zaWduZWQgY29kZXBvaW50XzsKLSAgICB9OwotCi0gICAgU3RhdGUmIEdldFN0YXRlKFNpemVUeXBlIGluZGV4KSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoaW5kZXggPCBzdGF0ZUNvdW50Xyk7Ci0gICAgICAgIHJldHVybiBzdGF0ZXNfLnRlbXBsYXRlIEJvdHRvbTxTdGF0ZT4oKVtpbmRleF07Ci0gICAgfQotCi0gICAgY29uc3QgU3RhdGUmIEdldFN0YXRlKFNpemVUeXBlIGluZGV4KSBjb25zdCB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoaW5kZXggPCBzdGF0ZUNvdW50Xyk7Ci0gICAgICAgIHJldHVybiBzdGF0ZXNfLnRlbXBsYXRlIEJvdHRvbTxTdGF0ZT4oKVtpbmRleF07Ci0gICAgfQotCi0gICAgUmFuZ2UmIEdldFJhbmdlKFNpemVUeXBlIGluZGV4KSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoaW5kZXggPCByYW5nZUNvdW50Xyk7Ci0gICAgICAgIHJldHVybiByYW5nZXNfLnRlbXBsYXRlIEJvdHRvbTxSYW5nZT4oKVtpbmRleF07Ci0gICAgfQotCi0gICAgY29uc3QgUmFuZ2UmIEdldFJhbmdlKFNpemVUeXBlIGluZGV4KSBjb25zdCB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoaW5kZXggPCByYW5nZUNvdW50Xyk7Ci0gICAgICAgIHJldHVybiByYW5nZXNfLnRlbXBsYXRlIEJvdHRvbTxSYW5nZT4oKVtpbmRleF07Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtPgotICAgIHZvaWQgUGFyc2UoRGVjb2RlZFN0cmVhbTxJbnB1dFN0cmVhbT4mIGRzKSB7Ci0gICAgICAgIEFsbG9jYXRvciBhbGxvY2F0b3I7Ci0gICAgICAgIFN0YWNrPEFsbG9jYXRvcj4gb3BlcmFuZFN0YWNrKCZhbGxvY2F0b3IsIDI1Nik7ICAgICAvLyBGcmFnCi0gICAgICAgIFN0YWNrPEFsbG9jYXRvcj4gb3BlcmF0b3JTdGFjaygmYWxsb2NhdG9yLCAyNTYpOyAgICAvLyBPcGVyYXRvcgotICAgICAgICBTdGFjazxBbGxvY2F0b3I+IGF0b21Db3VudFN0YWNrKCZhbGxvY2F0b3IsIDI1Nik7ICAgLy8gdW5zaWduZWQgKEF0b20gcGVyIHBhcmVudGhlc2lzKQotCi0gICAgICAgICphdG9tQ291bnRTdGFjay50ZW1wbGF0ZSBQdXNoPHVuc2lnbmVkPigpID0gMDsKLQotICAgICAgICB1bnNpZ25lZCBjb2RlcG9pbnQ7Ci0gICAgICAgIHdoaWxlIChkcy5QZWVrKCkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoIChjb2RlcG9pbnQgPSBkcy5UYWtlKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlICdeJzoKLSAgICAgICAgICAgICAgICAgICAgYW5jaG9yQmVnaW5fID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICckJzoKLSAgICAgICAgICAgICAgICAgICAgYW5jaG9yRW5kXyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnfCc6Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICghb3BlcmF0b3JTdGFjay5FbXB0eSgpICYmICpvcGVyYXRvclN0YWNrLnRlbXBsYXRlIFRvcDxPcGVyYXRvcj4oKSA8IGtBbHRlcm5hdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRXZhbChvcGVyYW5kU3RhY2ssICpvcGVyYXRvclN0YWNrLnRlbXBsYXRlIFBvcDxPcGVyYXRvcj4oMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgKm9wZXJhdG9yU3RhY2sudGVtcGxhdGUgUHVzaDxPcGVyYXRvcj4oKSA9IGtBbHRlcm5hdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgKmF0b21Db3VudFN0YWNrLnRlbXBsYXRlIFRvcDx1bnNpZ25lZD4oKSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnKCc6Ci0gICAgICAgICAgICAgICAgICAgICpvcGVyYXRvclN0YWNrLnRlbXBsYXRlIFB1c2g8T3BlcmF0b3I+KCkgPSBrTGVmdFBhcmVudGhlc2lzOwotICAgICAgICAgICAgICAgICAgICAqYXRvbUNvdW50U3RhY2sudGVtcGxhdGUgUHVzaDx1bnNpZ25lZD4oKSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnKSc6Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICghb3BlcmF0b3JTdGFjay5FbXB0eSgpICYmICpvcGVyYXRvclN0YWNrLnRlbXBsYXRlIFRvcDxPcGVyYXRvcj4oKSAhPSBrTGVmdFBhcmVudGhlc2lzKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFFdmFsKG9wZXJhbmRTdGFjaywgKm9wZXJhdG9yU3RhY2sudGVtcGxhdGUgUG9wPE9wZXJhdG9yPigxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBpZiAob3BlcmF0b3JTdGFjay5FbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBvcGVyYXRvclN0YWNrLnRlbXBsYXRlIFBvcDxPcGVyYXRvcj4oMSk7Ci0gICAgICAgICAgICAgICAgICAgIGF0b21Db3VudFN0YWNrLnRlbXBsYXRlIFBvcDx1bnNpZ25lZD4oMSk7Ci0gICAgICAgICAgICAgICAgICAgIEltcGxpY2l0Q29uY2F0ZW5hdGlvbihhdG9tQ291bnRTdGFjaywgb3BlcmF0b3JTdGFjayk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghRXZhbChvcGVyYW5kU3RhY2ssIGtaZXJvT3JPbmUpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJyonOgotICAgICAgICAgICAgICAgICAgICBpZiAoIUV2YWwob3BlcmFuZFN0YWNrLCBrWmVyb09yTW9yZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghRXZhbChvcGVyYW5kU3RhY2ssIGtPbmVPck1vcmUpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ3snOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBuLCBtOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFQYXJzZVVuc2lnbmVkKGRzLCAmbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHMuUGVlaygpID09ICcsJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzLlRha2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHMuUGVlaygpID09ICd9JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGtJbmZpbml0eVF1YW50aWZpZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIVBhcnNlVW5zaWduZWQoZHMsICZtKSB8fCBtIDwgbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUV2YWxRdWFudGlmaWVyKG9wZXJhbmRTdGFjaywgbiwgbSkgfHwgZHMuUGVlaygpICE9ICd9JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcy5UYWtlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICcuJzoKLSAgICAgICAgICAgICAgICAgICAgUHVzaE9wZXJhbmQob3BlcmFuZFN0YWNrLCBrQW55Q2hhcmFjdGVyQ2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBJbXBsaWNpdENvbmNhdGVuYXRpb24oYXRvbUNvdW50U3RhY2ssIG9wZXJhdG9yU3RhY2spOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ1snOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaXplVHlwZSByYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUGFyc2VSYW5nZShkcywgJnJhbmdlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaXplVHlwZSBzID0gTmV3U3RhdGUoa1JlZ2V4SW52YWxpZFN0YXRlLCBrUmVnZXhJbnZhbGlkU3RhdGUsIGtSYW5nZUNoYXJhY3RlckNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldFN0YXRlKHMpLnJhbmdlU3RhcnQgPSByYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpvcGVyYW5kU3RhY2sudGVtcGxhdGUgUHVzaDxGcmFnPigpID0gRnJhZyhzLCBzLCBzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBJbXBsaWNpdENvbmNhdGVuYXRpb24oYXRvbUNvdW50U3RhY2ssIG9wZXJhdG9yU3RhY2spOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzogLy8gRXNjYXBlIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICBpZiAoIUNoYXJhY3RlckVzY2FwZShkcywgJmNvZGVwb2ludCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIFVuc3VwcG9ydGVkIGVzY2FwZSBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIFBhdHRlcm4gY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgIFB1c2hPcGVyYW5kKG9wZXJhbmRTdGFjaywgY29kZXBvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgSW1wbGljaXRDb25jYXRlbmF0aW9uKGF0b21Db3VudFN0YWNrLCBvcGVyYXRvclN0YWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghb3BlcmF0b3JTdGFjay5FbXB0eSgpKQotICAgICAgICAgICAgaWYgKCFFdmFsKG9wZXJhbmRTdGFjaywgKm9wZXJhdG9yU3RhY2sudGVtcGxhdGUgUG9wPE9wZXJhdG9yPigxKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIExpbmsgdGhlIG9wZXJhbmQgdG8gbWF0Y2hpbmcgc3RhdGUuCi0gICAgICAgIGlmIChvcGVyYW5kU3RhY2suR2V0U2l6ZSgpID09IHNpemVvZihGcmFnKSkgewotICAgICAgICAgICAgRnJhZyogZSA9IG9wZXJhbmRTdGFjay50ZW1wbGF0ZSBQb3A8RnJhZz4oMSk7Ci0gICAgICAgICAgICBQYXRjaChlLT5vdXQsIE5ld1N0YXRlKGtSZWdleEludmFsaWRTdGF0ZSwga1JlZ2V4SW52YWxpZFN0YXRlLCAwKSk7Ci0gICAgICAgICAgICByb290XyA9IGUtPnN0YXJ0OwotCi0jaWYgUkFQSURKU09OX1JFR0VYX1ZFUkJPU0UKLSAgICAgICAgICAgIHByaW50Zigicm9vdDogJWRcbiIsIHJvb3RfKTsKLSAgICAgICAgICAgIGZvciAoU2l6ZVR5cGUgaSA9IDA7IGkgPCBzdGF0ZUNvdW50XyA7IGkrKykgewotICAgICAgICAgICAgICAgIFN0YXRlJiBzID0gR2V0U3RhdGUoaSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJbJTJkXSBvdXQ6ICUyZCBvdXQxOiAlMmQgYzogJyVjJ1xuIiwgaSwgcy5vdXQsIHMub3V0MSwgKGNoYXIpcy5jb2RlcG9pbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICAvLyBQcmVhbGxvY2F0ZSBidWZmZXIgZm9yIFNlYXJjaFdpdGhBbmNob3JpbmcoKQotICAgICAgICBSQVBJREpTT05fQVNTRVJUKHN0YXRlU2V0XyA9PSAwKTsKLSAgICAgICAgaWYgKHN0YXRlQ291bnRfID4gMCkgewotICAgICAgICAgICAgc3RhdGVTZXRfID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQqPihzdGF0ZXNfLkdldEFsbG9jYXRvcigpLk1hbGxvYyhHZXRTdGF0ZVNldFNpemUoKSkpOwotICAgICAgICAgICAgc3RhdGUwXy50ZW1wbGF0ZSBSZXNlcnZlPFNpemVUeXBlPihzdGF0ZUNvdW50Xyk7Ci0gICAgICAgICAgICBzdGF0ZTFfLnRlbXBsYXRlIFJlc2VydmU8U2l6ZVR5cGU+KHN0YXRlQ291bnRfKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFNpemVUeXBlIE5ld1N0YXRlKFNpemVUeXBlIG91dCwgU2l6ZVR5cGUgb3V0MSwgdW5zaWduZWQgY29kZXBvaW50KSB7Ci0gICAgICAgIFN0YXRlKiBzID0gc3RhdGVzXy50ZW1wbGF0ZSBQdXNoPFN0YXRlPigpOwotICAgICAgICBzLT5vdXQgPSBvdXQ7Ci0gICAgICAgIHMtPm91dDEgPSBvdXQxOwotICAgICAgICBzLT5jb2RlcG9pbnQgPSBjb2RlcG9pbnQ7Ci0gICAgICAgIHMtPnJhbmdlU3RhcnQgPSBrUmVnZXhJbnZhbGlkUmFuZ2U7Ci0gICAgICAgIHJldHVybiBzdGF0ZUNvdW50XysrOwotICAgIH0KLQotICAgIHZvaWQgUHVzaE9wZXJhbmQoU3RhY2s8QWxsb2NhdG9yPiYgb3BlcmFuZFN0YWNrLCB1bnNpZ25lZCBjb2RlcG9pbnQpIHsKLSAgICAgICAgU2l6ZVR5cGUgcyA9IE5ld1N0YXRlKGtSZWdleEludmFsaWRTdGF0ZSwga1JlZ2V4SW52YWxpZFN0YXRlLCBjb2RlcG9pbnQpOwotICAgICAgICAqb3BlcmFuZFN0YWNrLnRlbXBsYXRlIFB1c2g8RnJhZz4oKSA9IEZyYWcocywgcywgcyk7Ci0gICAgfQotCi0gICAgdm9pZCBJbXBsaWNpdENvbmNhdGVuYXRpb24oU3RhY2s8QWxsb2NhdG9yPiYgYXRvbUNvdW50U3RhY2ssIFN0YWNrPEFsbG9jYXRvcj4mIG9wZXJhdG9yU3RhY2spIHsKLSAgICAgICAgaWYgKCphdG9tQ291bnRTdGFjay50ZW1wbGF0ZSBUb3A8dW5zaWduZWQ+KCkpCi0gICAgICAgICAgICAqb3BlcmF0b3JTdGFjay50ZW1wbGF0ZSBQdXNoPE9wZXJhdG9yPigpID0ga0NvbmNhdGVuYXRpb247Ci0gICAgICAgICgqYXRvbUNvdW50U3RhY2sudGVtcGxhdGUgVG9wPHVuc2lnbmVkPigpKSsrOwotICAgIH0KLQotICAgIFNpemVUeXBlIEFwcGVuZChTaXplVHlwZSBsMSwgU2l6ZVR5cGUgbDIpIHsKLSAgICAgICAgU2l6ZVR5cGUgb2xkID0gbDE7Ci0gICAgICAgIHdoaWxlIChHZXRTdGF0ZShsMSkub3V0ICE9IGtSZWdleEludmFsaWRTdGF0ZSkKLSAgICAgICAgICAgIGwxID0gR2V0U3RhdGUobDEpLm91dDsKLSAgICAgICAgR2V0U3RhdGUobDEpLm91dCA9IGwyOwotICAgICAgICByZXR1cm4gb2xkOwotICAgIH0KLQotICAgIHZvaWQgUGF0Y2goU2l6ZVR5cGUgbCwgU2l6ZVR5cGUgcykgewotICAgICAgICBmb3IgKFNpemVUeXBlIG5leHQ7IGwgIT0ga1JlZ2V4SW52YWxpZFN0YXRlOyBsID0gbmV4dCkgewotICAgICAgICAgICAgbmV4dCA9IEdldFN0YXRlKGwpLm91dDsKLSAgICAgICAgICAgIEdldFN0YXRlKGwpLm91dCA9IHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sIEV2YWwoU3RhY2s8QWxsb2NhdG9yPiYgb3BlcmFuZFN0YWNrLCBPcGVyYXRvciBvcCkgewotICAgICAgICBzd2l0Y2ggKG9wKSB7Ci0gICAgICAgICAgICBjYXNlIGtDb25jYXRlbmF0aW9uOgotICAgICAgICAgICAgICAgIGlmIChvcGVyYW5kU3RhY2suR2V0U2l6ZSgpID49IHNpemVvZihGcmFnKSAqIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhZyBlMiA9ICpvcGVyYW5kU3RhY2sudGVtcGxhdGUgUG9wPEZyYWc+KDEpOwotICAgICAgICAgICAgICAgICAgICBGcmFnIGUxID0gKm9wZXJhbmRTdGFjay50ZW1wbGF0ZSBQb3A8RnJhZz4oMSk7Ci0gICAgICAgICAgICAgICAgICAgIFBhdGNoKGUxLm91dCwgZTIuc3RhcnQpOwotICAgICAgICAgICAgICAgICAgICAqb3BlcmFuZFN0YWNrLnRlbXBsYXRlIFB1c2g8RnJhZz4oKSA9IEZyYWcoZTEuc3RhcnQsIGUyLm91dCwgTWluKGUxLm1pbkluZGV4LCBlMi5taW5JbmRleCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBjYXNlIGtBbHRlcm5hdGlvbjoKLSAgICAgICAgICAgICAgICBpZiAob3BlcmFuZFN0YWNrLkdldFNpemUoKSA+PSBzaXplb2YoRnJhZykgKiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZyYWcgZTIgPSAqb3BlcmFuZFN0YWNrLnRlbXBsYXRlIFBvcDxGcmFnPigxKTsKLSAgICAgICAgICAgICAgICAgICAgRnJhZyBlMSA9ICpvcGVyYW5kU3RhY2sudGVtcGxhdGUgUG9wPEZyYWc+KDEpOwotICAgICAgICAgICAgICAgICAgICBTaXplVHlwZSBzID0gTmV3U3RhdGUoZTEuc3RhcnQsIGUyLnN0YXJ0LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgKm9wZXJhbmRTdGFjay50ZW1wbGF0ZSBQdXNoPEZyYWc+KCkgPSBGcmFnKHMsIEFwcGVuZChlMS5vdXQsIGUyLm91dCksIE1pbihlMS5taW5JbmRleCwgZTIubWluSW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgY2FzZSBrWmVyb09yT25lOgotICAgICAgICAgICAgICAgIGlmIChvcGVyYW5kU3RhY2suR2V0U2l6ZSgpID49IHNpemVvZihGcmFnKSkgewotICAgICAgICAgICAgICAgICAgICBGcmFnIGUgPSAqb3BlcmFuZFN0YWNrLnRlbXBsYXRlIFBvcDxGcmFnPigxKTsKLSAgICAgICAgICAgICAgICAgICAgU2l6ZVR5cGUgcyA9IE5ld1N0YXRlKGtSZWdleEludmFsaWRTdGF0ZSwgZS5zdGFydCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICpvcGVyYW5kU3RhY2sudGVtcGxhdGUgUHVzaDxGcmFnPigpID0gRnJhZyhzLCBBcHBlbmQoZS5vdXQsIHMpLCBlLm1pbkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgY2FzZSBrWmVyb09yTW9yZToKLSAgICAgICAgICAgICAgICBpZiAob3BlcmFuZFN0YWNrLkdldFNpemUoKSA+PSBzaXplb2YoRnJhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhZyBlID0gKm9wZXJhbmRTdGFjay50ZW1wbGF0ZSBQb3A8RnJhZz4oMSk7Ci0gICAgICAgICAgICAgICAgICAgIFNpemVUeXBlIHMgPSBOZXdTdGF0ZShrUmVnZXhJbnZhbGlkU3RhdGUsIGUuc3RhcnQsIDApOwotICAgICAgICAgICAgICAgICAgICBQYXRjaChlLm91dCwgcyk7Ci0gICAgICAgICAgICAgICAgICAgICpvcGVyYW5kU3RhY2sudGVtcGxhdGUgUHVzaDxGcmFnPigpID0gRnJhZyhzLCBzLCBlLm1pbkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgY2FzZSBrT25lT3JNb3JlOgotICAgICAgICAgICAgICAgIGlmIChvcGVyYW5kU3RhY2suR2V0U2l6ZSgpID49IHNpemVvZihGcmFnKSkgewotICAgICAgICAgICAgICAgICAgICBGcmFnIGUgPSAqb3BlcmFuZFN0YWNrLnRlbXBsYXRlIFBvcDxGcmFnPigxKTsKLSAgICAgICAgICAgICAgICAgICAgU2l6ZVR5cGUgcyA9IE5ld1N0YXRlKGtSZWdleEludmFsaWRTdGF0ZSwgZS5zdGFydCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIFBhdGNoKGUub3V0LCBzKTsKLSAgICAgICAgICAgICAgICAgICAgKm9wZXJhbmRTdGFjay50ZW1wbGF0ZSBQdXNoPEZyYWc+KCkgPSBGcmFnKGUuc3RhcnQsIHMsIGUubWluSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgRXZhbFF1YW50aWZpZXIoU3RhY2s8QWxsb2NhdG9yPiYgb3BlcmFuZFN0YWNrLCB1bnNpZ25lZCBuLCB1bnNpZ25lZCBtKSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQobiA8PSBtKTsKLSAgICAgICAgaWYgKG9wZXJhbmRTdGFjay5HZXRTaXplKCkgPCBzaXplb2YoRnJhZykpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgaWYgKG0gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF7MH0gbm90IHN1cHBvcnQKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIGlmIChtID09IGtJbmZpbml0eVF1YW50aWZpZXIpCi0gICAgICAgICAgICAgICAgRXZhbChvcGVyYW5kU3RhY2ssIGtaZXJvT3JNb3JlKTsgICAgLy8gYXswLH0gLT4gYSoKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEV2YWwob3BlcmFuZFN0YWNrLCBrWmVyb09yT25lKTsgICAgICAgICAvLyBhezAsNX0gLT4gYT8KLSAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbSAtIDE7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgQ2xvbmVUb3BPcGVyYW5kKG9wZXJhbmRTdGFjayk7ICAgICAgLy8gYXswLDV9IC0+IGE/IGE/IGE/IGE/IGE/Ci0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG0gLSAxOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIEV2YWwob3BlcmFuZFN0YWNrLCBrQ29uY2F0ZW5hdGlvbik7IC8vIGF7MCw1fSAtPiBhP2E/YT9hP2E/Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSAgICAgICAgLy8gYXszfSAtPiBhIGEgYQotICAgICAgICAgICAgQ2xvbmVUb3BPcGVyYW5kKG9wZXJhbmRTdGFjayk7Ci0KLSAgICAgICAgaWYgKG0gPT0ga0luZmluaXR5UXVhbnRpZmllcikKLSAgICAgICAgICAgIEV2YWwob3BlcmFuZFN0YWNrLCBrT25lT3JNb3JlKTsgICAgICAgICAvLyBhezMsfSAtPiBhIGEgYSsKLSAgICAgICAgZWxzZSBpZiAobSA+IG4pIHsKLSAgICAgICAgICAgIENsb25lVG9wT3BlcmFuZChvcGVyYW5kU3RhY2spOyAgICAgICAgICAvLyBhezMsNX0gLT4gYSBhIGEgYQotICAgICAgICAgICAgRXZhbChvcGVyYW5kU3RhY2ssIGtaZXJvT3JPbmUpOyAgICAgICAgIC8vIGF7Myw1fSAtPiBhIGEgYSBhPwotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gbjsgaSA8IG0gLSAxOyBpKyspCi0gICAgICAgICAgICAgICAgQ2xvbmVUb3BPcGVyYW5kKG9wZXJhbmRTdGFjayk7ICAgICAgLy8gYXszLDV9IC0+IGEgYSBhIGE/IGE/Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBuOyBpIDwgbTsgaSsrKQotICAgICAgICAgICAgICAgIEV2YWwob3BlcmFuZFN0YWNrLCBrQ29uY2F0ZW5hdGlvbik7IC8vIGF7Myw1fSAtPiBhIGEgYWE/YT8KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKQotICAgICAgICAgICAgRXZhbChvcGVyYW5kU3RhY2ssIGtDb25jYXRlbmF0aW9uKTsgICAgIC8vIGF7M30gLT4gYWFhLCBhezMsfSAtPiBhYWErLCBhezMuNX0gLT4gYWFhYT9hPwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN0YXRpYyBTaXplVHlwZSBNaW4oU2l6ZVR5cGUgYSwgU2l6ZVR5cGUgYikgeyByZXR1cm4gYSA8IGIgPyBhIDogYjsgfQotCi0gICAgdm9pZCBDbG9uZVRvcE9wZXJhbmQoU3RhY2s8QWxsb2NhdG9yPiYgb3BlcmFuZFN0YWNrKSB7Ci0gICAgICAgIGNvbnN0IEZyYWcgKnNyYyA9IG9wZXJhbmRTdGFjay50ZW1wbGF0ZSBUb3A8RnJhZz4oKTsKLSAgICAgICAgU2l6ZVR5cGUgY291bnQgPSBzdGF0ZUNvdW50XyAtIHNyYy0+bWluSW5kZXg7IC8vIEFzc3VtZXMgdG9wIG9wZXJhbmQgY29udGFpbnMgc3RhdGVzIGluIFtzcmMtPm1pbkluZGV4LCBzdGF0ZUNvdW50XykKLSAgICAgICAgU3RhdGUqIHMgPSBzdGF0ZXNfLnRlbXBsYXRlIFB1c2g8U3RhdGU+KGNvdW50KTsKLSAgICAgICAgbWVtY3B5KHMsICZHZXRTdGF0ZShzcmMtPm1pbkluZGV4KSwgY291bnQgKiBzaXplb2YoU3RhdGUpKTsKLSAgICAgICAgZm9yIChTaXplVHlwZSBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKLSAgICAgICAgICAgIGlmIChzW2pdLm91dCAhPSBrUmVnZXhJbnZhbGlkU3RhdGUpCi0gICAgICAgICAgICAgICAgc1tqXS5vdXQgKz0gY291bnQ7Ci0gICAgICAgICAgICBpZiAoc1tqXS5vdXQxICE9IGtSZWdleEludmFsaWRTdGF0ZSkKLSAgICAgICAgICAgICAgICBzW2pdLm91dDEgKz0gY291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgKm9wZXJhbmRTdGFjay50ZW1wbGF0ZSBQdXNoPEZyYWc+KCkgPSBGcmFnKHNyYy0+c3RhcnQgKyBjb3VudCwgc3JjLT5vdXQgKyBjb3VudCwgc3JjLT5taW5JbmRleCArIGNvdW50KTsKLSAgICAgICAgc3RhdGVDb3VudF8gKz0gY291bnQ7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtPgotICAgIGJvb2wgUGFyc2VVbnNpZ25lZChEZWNvZGVkU3RyZWFtPElucHV0U3RyZWFtPiYgZHMsIHVuc2lnbmVkKiB1KSB7Ci0gICAgICAgIHVuc2lnbmVkIHIgPSAwOwotICAgICAgICBpZiAoZHMuUGVlaygpIDwgJzAnIHx8IGRzLlBlZWsoKSA+ICc5JykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGRzLlBlZWsoKSA+PSAnMCcgJiYgZHMuUGVlaygpIDw9ICc5JykgewotICAgICAgICAgICAgaWYgKHIgPj0gNDI5NDk2NzI5ICYmIGRzLlBlZWsoKSA+ICc1JykgLy8gMl4zMiAtIDEgPSA0Mjk0OTY3Mjk1Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBvdmVyZmxvdwotICAgICAgICAgICAgciA9IHIgKiAxMCArIChkcy5UYWtlKCkgLSAnMCcpOwotICAgICAgICB9Ci0gICAgICAgICp1ID0gcjsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtPgotICAgIGJvb2wgUGFyc2VSYW5nZShEZWNvZGVkU3RyZWFtPElucHV0U3RyZWFtPiYgZHMsIFNpemVUeXBlKiByYW5nZSkgewotICAgICAgICBib29sIGlzQmVnaW4gPSB0cnVlOwotICAgICAgICBib29sIG5lZ2F0ZSA9IGZhbHNlOwotICAgICAgICBpbnQgc3RlcCA9IDA7Ci0gICAgICAgIFNpemVUeXBlIHN0YXJ0ID0ga1JlZ2V4SW52YWxpZFJhbmdlOwotICAgICAgICBTaXplVHlwZSBjdXJyZW50ID0ga1JlZ2V4SW52YWxpZFJhbmdlOwotICAgICAgICB1bnNpZ25lZCBjb2RlcG9pbnQ7Ci0gICAgICAgIHdoaWxlICgoY29kZXBvaW50ID0gZHMuVGFrZSgpKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoaXNCZWdpbikgewotICAgICAgICAgICAgICAgIGlzQmVnaW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZXBvaW50ID09ICdeJykgewotICAgICAgICAgICAgICAgICAgICBuZWdhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoY29kZXBvaW50KSB7Ci0gICAgICAgICAgICBjYXNlICddJzoKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0ga1JlZ2V4SW52YWxpZFJhbmdlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgLy8gRXJyb3I6IG5vdGhpbmcgaW5zaWRlIFtdCi0gICAgICAgICAgICAgICAgaWYgKHN0ZXAgPT0gMikgeyAvLyBBZGQgdHJhaWxpbmcgJy0nCi0gICAgICAgICAgICAgICAgICAgIFNpemVUeXBlIHIgPSBOZXdSYW5nZSgnLScpOwotICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fQVNTRVJUKGN1cnJlbnQgIT0ga1JlZ2V4SW52YWxpZFJhbmdlKTsKLSAgICAgICAgICAgICAgICAgICAgR2V0UmFuZ2UoY3VycmVudCkubmV4dCA9IHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZWdhdGUpCi0gICAgICAgICAgICAgICAgICAgIEdldFJhbmdlKHN0YXJ0KS5zdGFydCB8PSBrUmFuZ2VOZWdhdGlvbkZsYWc7Ci0gICAgICAgICAgICAgICAgKnJhbmdlID0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICBpZiAoZHMuUGVlaygpID09ICdiJykgewotICAgICAgICAgICAgICAgICAgICBkcy5UYWtlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVwb2ludCA9IDB4MDAwODsgLy8gRXNjYXBlIGJhY2tzcGFjZSBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIUNoYXJhY3RlckVzY2FwZShkcywgJmNvZGVwb2ludCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdAotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RlcCkgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwb2ludCA9PSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBzdGVwIDAgZm9yIG90aGVyIGNoYXJhY3RlcnMKLQotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZVR5cGUgciA9IE5ld1JhbmdlKGNvZGVwb2ludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBrUmVnZXhJbnZhbGlkUmFuZ2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UmFuZ2UoY3VycmVudCkubmV4dCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0ga1JlZ2V4SW52YWxpZFJhbmdlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSByOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0ZXAgPSAxOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9BU1NFUlQoc3RlcCA9PSAyKTsKLSAgICAgICAgICAgICAgICAgICAgR2V0UmFuZ2UoY3VycmVudCkuZW5kID0gY29kZXBvaW50OwotICAgICAgICAgICAgICAgICAgICBzdGVwID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTaXplVHlwZSBOZXdSYW5nZSh1bnNpZ25lZCBjb2RlcG9pbnQpIHsKLSAgICAgICAgUmFuZ2UqIHIgPSByYW5nZXNfLnRlbXBsYXRlIFB1c2g8UmFuZ2U+KCk7Ci0gICAgICAgIHItPnN0YXJ0ID0gci0+ZW5kID0gY29kZXBvaW50OwotICAgICAgICByLT5uZXh0ID0ga1JlZ2V4SW52YWxpZFJhbmdlOwotICAgICAgICByZXR1cm4gcmFuZ2VDb3VudF8rKzsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRTdHJlYW0+Ci0gICAgYm9vbCBDaGFyYWN0ZXJFc2NhcGUoRGVjb2RlZFN0cmVhbTxJbnB1dFN0cmVhbT4mIGRzLCB1bnNpZ25lZCogZXNjYXBlZENvZGVwb2ludCkgewotICAgICAgICB1bnNpZ25lZCBjb2RlcG9pbnQ7Ci0gICAgICAgIHN3aXRjaCAoY29kZXBvaW50ID0gZHMuVGFrZSgpKSB7Ci0gICAgICAgICAgICBjYXNlICdeJzoKLSAgICAgICAgICAgIGNhc2UgJyQnOgotICAgICAgICAgICAgY2FzZSAnfCc6Ci0gICAgICAgICAgICBjYXNlICcoJzoKLSAgICAgICAgICAgIGNhc2UgJyknOgotICAgICAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgICBjYXNlICcqJzoKLSAgICAgICAgICAgIGNhc2UgJysnOgotICAgICAgICAgICAgY2FzZSAnLic6Ci0gICAgICAgICAgICBjYXNlICdbJzoKLSAgICAgICAgICAgIGNhc2UgJ10nOgotICAgICAgICAgICAgY2FzZSAneyc6Ci0gICAgICAgICAgICBjYXNlICd9JzoKLSAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICAqZXNjYXBlZENvZGVwb2ludCA9IGNvZGVwb2ludDsgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlICdmJzogKmVzY2FwZWRDb2RlcG9pbnQgPSAweDAwMEM7IHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSAnbic6ICplc2NhcGVkQ29kZXBvaW50ID0gMHgwMDBBOyByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgJ3InOiAqZXNjYXBlZENvZGVwb2ludCA9IDB4MDAwRDsgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlICd0JzogKmVzY2FwZWRDb2RlcG9pbnQgPSAweDAwMDk7IHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSAndic6ICplc2NhcGVkQ29kZXBvaW50ID0gMHgwMDBCOyByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBVbnN1cHBvcnRlZCBlc2NhcGUgY2hhcmFjdGVyCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRTdHJlYW0+Ci0gICAgYm9vbCBTZWFyY2hXaXRoQW5jaG9yaW5nKElucHV0U3RyZWFtJiBpcywgYm9vbCBhbmNob3JCZWdpbiwgYm9vbCBhbmNob3JFbmQpIGNvbnN0IHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChJc1ZhbGlkKCkpOwotICAgICAgICBEZWNvZGVkU3RyZWFtPElucHV0U3RyZWFtPiBkcyhpcyk7Ci0KLSAgICAgICAgc3RhdGUwXy5DbGVhcigpOwotICAgICAgICBTdGFjazxBbGxvY2F0b3I+ICpjdXJyZW50ID0gJnN0YXRlMF8sICpuZXh0ID0gJnN0YXRlMV87Ci0gICAgICAgIGNvbnN0IHNpemVfdCBzdGF0ZVNldFNpemUgPSBHZXRTdGF0ZVNldFNpemUoKTsKLSAgICAgICAgc3RkOjptZW1zZXQoc3RhdGVTZXRfLCAwLCBzdGF0ZVNldFNpemUpOwotCi0gICAgICAgIGJvb2wgbWF0Y2hlZCA9IEFkZFN0YXRlKCpjdXJyZW50LCByb290Xyk7Ci0gICAgICAgIHVuc2lnbmVkIGNvZGVwb2ludDsKLSAgICAgICAgd2hpbGUgKCFjdXJyZW50LT5FbXB0eSgpICYmIChjb2RlcG9pbnQgPSBkcy5UYWtlKCkpICE9IDApIHsKLSAgICAgICAgICAgIHN0ZDo6bWVtc2V0KHN0YXRlU2V0XywgMCwgc3RhdGVTZXRTaXplKTsKLSAgICAgICAgICAgIG5leHQtPkNsZWFyKCk7Ci0gICAgICAgICAgICBtYXRjaGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IFNpemVUeXBlKiBzID0gY3VycmVudC0+dGVtcGxhdGUgQm90dG9tPFNpemVUeXBlPigpOyBzICE9IGN1cnJlbnQtPnRlbXBsYXRlIEVuZDxTaXplVHlwZT4oKTsgKytzKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgU3RhdGUmIHNyID0gR2V0U3RhdGUoKnMpOwotICAgICAgICAgICAgICAgIGlmIChzci5jb2RlcG9pbnQgPT0gY29kZXBvaW50IHx8Ci0gICAgICAgICAgICAgICAgICAgIHNyLmNvZGVwb2ludCA9PSBrQW55Q2hhcmFjdGVyQ2xhc3MgfHwgCi0gICAgICAgICAgICAgICAgICAgIChzci5jb2RlcG9pbnQgPT0ga1JhbmdlQ2hhcmFjdGVyQ2xhc3MgJiYgTWF0Y2hSYW5nZShzci5yYW5nZVN0YXJ0LCBjb2RlcG9pbnQpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBBZGRTdGF0ZSgqbmV4dCwgc3Iub3V0KSB8fCBtYXRjaGVkOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWFuY2hvckVuZCAmJiBtYXRjaGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghYW5jaG9yQmVnaW4pCi0gICAgICAgICAgICAgICAgICAgIEFkZFN0YXRlKCpuZXh0LCByb290Xyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbDo6U3dhcChjdXJyZW50LCBuZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXRjaGVkOwotICAgIH0KLQotICAgIHNpemVfdCBHZXRTdGF0ZVNldFNpemUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAoc3RhdGVDb3VudF8gKyAzMSkgLyAzMiAqIDQ7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIHdoZXRoZXIgdGhlIGFkZGVkIHN0YXRlcyBpcyBhIG1hdGNoIHN0YXRlCi0gICAgYm9vbCBBZGRTdGF0ZShTdGFjazxBbGxvY2F0b3I+JiBsLCBTaXplVHlwZSBpbmRleCkgY29uc3QgewotICAgICAgICBpZiAoaW5kZXggPT0ga1JlZ2V4SW52YWxpZFN0YXRlKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgY29uc3QgU3RhdGUmIHMgPSBHZXRTdGF0ZShpbmRleCk7Ci0gICAgICAgIGlmIChzLm91dDEgIT0ga1JlZ2V4SW52YWxpZFN0YXRlKSB7IC8vIFNwbGl0Ci0gICAgICAgICAgICBib29sIG1hdGNoZWQgPSBBZGRTdGF0ZShsLCBzLm91dCk7Ci0gICAgICAgICAgICByZXR1cm4gQWRkU3RhdGUobCwgcy5vdXQxKSB8fCBtYXRjaGVkOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCEoc3RhdGVTZXRfW2luZGV4ID4+IDVdICYgKDEgPDwgKGluZGV4ICYgMzEpKSkpIHsKLSAgICAgICAgICAgIHN0YXRlU2V0X1tpbmRleCA+PiA1XSB8PSAoMSA8PCAoaW5kZXggJiAzMSkpOwotICAgICAgICAgICAgKmwudGVtcGxhdGUgUHVzaFVuc2FmZTxTaXplVHlwZT4oKSA9IGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzLm91dCA9PSBrUmVnZXhJbnZhbGlkU3RhdGU7IC8vIGJ5IHVzaW5nIFB1c2hVbnNhZmUoKSBhYm92ZSwgd2UgY2FuIGVuc3VyZSBzIGlzIG5vdCB2YWxpZGF0ZWQgZHVlIHRvIHJlYWxsb2NhdGlvbi4KLSAgICB9Ci0KLSAgICBib29sIE1hdGNoUmFuZ2UoU2l6ZVR5cGUgcmFuZ2VJbmRleCwgdW5zaWduZWQgY29kZXBvaW50KSBjb25zdCB7Ci0gICAgICAgIGJvb2wgeWVzID0gKEdldFJhbmdlKHJhbmdlSW5kZXgpLnN0YXJ0ICYga1JhbmdlTmVnYXRpb25GbGFnKSA9PSAwOwotICAgICAgICB3aGlsZSAocmFuZ2VJbmRleCAhPSBrUmVnZXhJbnZhbGlkUmFuZ2UpIHsKLSAgICAgICAgICAgIGNvbnN0IFJhbmdlJiByID0gR2V0UmFuZ2UocmFuZ2VJbmRleCk7Ci0gICAgICAgICAgICBpZiAoY29kZXBvaW50ID49IChyLnN0YXJ0ICYgfmtSYW5nZU5lZ2F0aW9uRmxhZykgJiYgY29kZXBvaW50IDw9IHIuZW5kKQotICAgICAgICAgICAgICAgIHJldHVybiB5ZXM7Ci0gICAgICAgICAgICByYW5nZUluZGV4ID0gci5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAheWVzOwotICAgIH0KLQotICAgIFN0YWNrPEFsbG9jYXRvcj4gc3RhdGVzXzsKLSAgICBTdGFjazxBbGxvY2F0b3I+IHJhbmdlc187Ci0gICAgU2l6ZVR5cGUgcm9vdF87Ci0gICAgU2l6ZVR5cGUgc3RhdGVDb3VudF87Ci0gICAgU2l6ZVR5cGUgcmFuZ2VDb3VudF87Ci0KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQga0luZmluaXR5UXVhbnRpZmllciA9IH4wdTsKLQotICAgIC8vIEZvciBTZWFyY2hXaXRoQW5jaG9yaW5nKCkKLSAgICB1aW50MzJfdCogc3RhdGVTZXRfOyAgICAgICAgLy8gYWxsb2NhdGVkIGJ5IHN0YXRlc18uR2V0QWxsb2NhdG9yKCkKLSAgICBtdXRhYmxlIFN0YWNrPEFsbG9jYXRvcj4gc3RhdGUwXzsKLSAgICBtdXRhYmxlIFN0YWNrPEFsbG9jYXRvcj4gc3RhdGUxXzsKLSAgICBib29sIGFuY2hvckJlZ2luXzsKLSAgICBib29sIGFuY2hvckVuZF87Ci19OwotCi10eXBlZGVmIEdlbmVyaWNSZWdleDxVVEY4PD4gPiBSZWdleDsKLQotfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLVJBUElESlNPTl9OQU1FU1BBQ0VfRU5ECi0KLSNpZmRlZiBfX2NsYW5nX18KLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLSNlbmRpZiAvLyBSQVBJREpTT05fSU5URVJOQUxfUkVHRVhfSF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvc3RhY2suaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvc3RhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYzlhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ludGVybmFsL3N0YWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fSU5URVJOQUxfU1RBQ0tfSF8KLSNkZWZpbmUgUkFQSURKU09OX0lOVEVSTkFMX1NUQUNLX0hfCi0KLSNpbmNsdWRlICIuLi9hbGxvY2F0b3JzLmgiCi0jaW5jbHVkZSAic3dhcC5oIgotCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi1SQVBJREpTT05fRElBR19QVVNICi1SQVBJREpTT05fRElBR19PRkYoYysrOTgtY29tcGF0KQotI2VuZGlmCi0KLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFN0YWNrCi0KLS8vISBBIHR5cGUtdW5zYWZlIHN0YWNrIGZvciBzdG9yaW5nIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhLgotLyohIFx0cGFyYW0gQWxsb2NhdG9yIEFsbG9jYXRvciBmb3IgYWxsb2NhdGluZyBzdGFjayBtZW1vcnkuCi0qLwotdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvcj4KLWNsYXNzIFN0YWNrIHsKLXB1YmxpYzoKLSAgICAvLyBPcHRpbWl6YXRpb24gbm90ZTogRG8gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RhY2tfIGluIGNvbnN0cnVjdG9yLgotICAgIC8vIERvIGl0IGxhemlseSB3aGVuIGZpcnN0IFB1c2goKSAtPiBFeHBhbmQoKSAtPiBSZXNpemUoKS4KLSAgICBTdGFjayhBbGxvY2F0b3IqIGFsbG9jYXRvciwgc2l6ZV90IHN0YWNrQ2FwYWNpdHkpIDogYWxsb2NhdG9yXyhhbGxvY2F0b3IpLCBvd25BbGxvY2F0b3JfKDApLCBzdGFja18oMCksIHN0YWNrVG9wXygwKSwgc3RhY2tFbmRfKDApLCBpbml0aWFsQ2FwYWNpdHlfKHN0YWNrQ2FwYWNpdHkpIHsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0gICAgU3RhY2soU3RhY2smJiByaHMpCi0gICAgICAgIDogYWxsb2NhdG9yXyhyaHMuYWxsb2NhdG9yXyksCi0gICAgICAgICAgb3duQWxsb2NhdG9yXyhyaHMub3duQWxsb2NhdG9yXyksCi0gICAgICAgICAgc3RhY2tfKHJocy5zdGFja18pLAotICAgICAgICAgIHN0YWNrVG9wXyhyaHMuc3RhY2tUb3BfKSwKLSAgICAgICAgICBzdGFja0VuZF8ocmhzLnN0YWNrRW5kXyksCi0gICAgICAgICAgaW5pdGlhbENhcGFjaXR5XyhyaHMuaW5pdGlhbENhcGFjaXR5XykKLSAgICB7Ci0gICAgICAgIHJocy5hbGxvY2F0b3JfID0gMDsKLSAgICAgICAgcmhzLm93bkFsbG9jYXRvcl8gPSAwOwotICAgICAgICByaHMuc3RhY2tfID0gMDsKLSAgICAgICAgcmhzLnN0YWNrVG9wXyA9IDA7Ci0gICAgICAgIHJocy5zdGFja0VuZF8gPSAwOwotICAgICAgICByaHMuaW5pdGlhbENhcGFjaXR5XyA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICB+U3RhY2soKSB7Ci0gICAgICAgIERlc3Ryb3koKTsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0gICAgU3RhY2smIG9wZXJhdG9yPShTdGFjayYmIHJocykgewotICAgICAgICBpZiAoJnJocyAhPSB0aGlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZXN0cm95KCk7Ci0KLSAgICAgICAgICAgIGFsbG9jYXRvcl8gPSByaHMuYWxsb2NhdG9yXzsKLSAgICAgICAgICAgIG93bkFsbG9jYXRvcl8gPSByaHMub3duQWxsb2NhdG9yXzsKLSAgICAgICAgICAgIHN0YWNrXyA9IHJocy5zdGFja187Ci0gICAgICAgICAgICBzdGFja1RvcF8gPSByaHMuc3RhY2tUb3BfOwotICAgICAgICAgICAgc3RhY2tFbmRfID0gcmhzLnN0YWNrRW5kXzsKLSAgICAgICAgICAgIGluaXRpYWxDYXBhY2l0eV8gPSByaHMuaW5pdGlhbENhcGFjaXR5XzsKLQotICAgICAgICAgICAgcmhzLmFsbG9jYXRvcl8gPSAwOwotICAgICAgICAgICAgcmhzLm93bkFsbG9jYXRvcl8gPSAwOwotICAgICAgICAgICAgcmhzLnN0YWNrXyA9IDA7Ci0gICAgICAgICAgICByaHMuc3RhY2tUb3BfID0gMDsKLSAgICAgICAgICAgIHJocy5zdGFja0VuZF8gPSAwOwotICAgICAgICAgICAgcmhzLmluaXRpYWxDYXBhY2l0eV8gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHZvaWQgU3dhcChTdGFjayYgcmhzKSBSQVBJREpTT05fTk9FWENFUFQgewotICAgICAgICBpbnRlcm5hbDo6U3dhcChhbGxvY2F0b3JfLCByaHMuYWxsb2NhdG9yXyk7Ci0gICAgICAgIGludGVybmFsOjpTd2FwKG93bkFsbG9jYXRvcl8sIHJocy5vd25BbGxvY2F0b3JfKTsKLSAgICAgICAgaW50ZXJuYWw6OlN3YXAoc3RhY2tfLCByaHMuc3RhY2tfKTsKLSAgICAgICAgaW50ZXJuYWw6OlN3YXAoc3RhY2tUb3BfLCByaHMuc3RhY2tUb3BfKTsKLSAgICAgICAgaW50ZXJuYWw6OlN3YXAoc3RhY2tFbmRfLCByaHMuc3RhY2tFbmRfKTsKLSAgICAgICAgaW50ZXJuYWw6OlN3YXAoaW5pdGlhbENhcGFjaXR5XywgcmhzLmluaXRpYWxDYXBhY2l0eV8pOwotICAgIH0KLQotICAgIHZvaWQgQ2xlYXIoKSB7IHN0YWNrVG9wXyA9IHN0YWNrXzsgfQotCi0gICAgdm9pZCBTaHJpbmtUb0ZpdCgpIHsgCi0gICAgICAgIGlmIChFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgc3RhY2sgaXMgZW1wdHksIGNvbXBsZXRlbHkgZGVhbGxvY2F0ZSB0aGUgbWVtb3J5LgotICAgICAgICAgICAgQWxsb2NhdG9yOjpGcmVlKHN0YWNrXyk7Ci0gICAgICAgICAgICBzdGFja18gPSAwOwotICAgICAgICAgICAgc3RhY2tUb3BfID0gMDsKLSAgICAgICAgICAgIHN0YWNrRW5kXyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgUmVzaXplKEdldFNpemUoKSk7Ci0gICAgfQotCi0gICAgLy8gT3B0aW1pemF0aW9uIG5vdGU6IHRyeSB0byBtaW5pbWl6ZSB0aGUgc2l6ZSBvZiB0aGlzIGZ1bmN0aW9uIGZvciBmb3JjZSBpbmxpbmUuCi0gICAgLy8gRXhwYW5zaW9uIGlzIHJ1biB2ZXJ5IGluZnJlcXVlbnRseSwgc28gaXQgaXMgbW92ZWQgdG8gYW5vdGhlciAocHJvYmFibHkgbm9uLWlubGluZSkgZnVuY3Rpb24uCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgdm9pZCBSZXNlcnZlKHNpemVfdCBjb3VudCA9IDEpIHsKLSAgICAgICAgIC8vIEV4cGFuZCB0aGUgc3RhY2sgaWYgbmVlZGVkCi0gICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoc3RhY2tUb3BfICsgc2l6ZW9mKFQpICogY291bnQgPiBzdGFja0VuZF8pKQotICAgICAgICAgICAgRXhwYW5kPFQ+KGNvdW50KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIFJBUElESlNPTl9GT1JDRUlOTElORSBUKiBQdXNoKHNpemVfdCBjb3VudCA9IDEpIHsKLSAgICAgICAgUmVzZXJ2ZTxUPihjb3VudCk7Ci0gICAgICAgIHJldHVybiBQdXNoVW5zYWZlPFQ+KGNvdW50KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIFJBUElESlNPTl9GT1JDRUlOTElORSBUKiBQdXNoVW5zYWZlKHNpemVfdCBjb3VudCA9IDEpIHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChzdGFja1RvcF8gKyBzaXplb2YoVCkgKiBjb3VudCA8PSBzdGFja0VuZF8pOwotICAgICAgICBUKiByZXQgPSByZWludGVycHJldF9jYXN0PFQqPihzdGFja1RvcF8pOwotICAgICAgICBzdGFja1RvcF8gKz0gc2l6ZW9mKFQpICogY291bnQ7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBUKiBQb3Aoc2l6ZV90IGNvdW50KSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoR2V0U2l6ZSgpID49IGNvdW50ICogc2l6ZW9mKFQpKTsKLSAgICAgICAgc3RhY2tUb3BfIC09IGNvdW50ICogc2l6ZW9mKFQpOwotICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oc3RhY2tUb3BfKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIFQqIFRvcCgpIHsgCi0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoR2V0U2l6ZSgpID49IHNpemVvZihUKSk7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihzdGFja1RvcF8gLSBzaXplb2YoVCkpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgY29uc3QgVCogVG9wKCkgY29uc3QgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKEdldFNpemUoKSA+PSBzaXplb2YoVCkpOwotICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oc3RhY2tUb3BfIC0gc2l6ZW9mKFQpKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIFQqIEVuZCgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KHN0YWNrVG9wXyk7IH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgY29uc3QgVCogRW5kKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oc3RhY2tUb3BfKTsgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBUKiBCb3R0b20oKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihzdGFja18pOyB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIGNvbnN0IFQqIEJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KHN0YWNrXyk7IH0KLQotICAgIGJvb2wgSGFzQWxsb2NhdG9yKCkgY29uc3QgewotICAgICAgICByZXR1cm4gYWxsb2NhdG9yXyAhPSAwOwotICAgIH0KLQotICAgIEFsbG9jYXRvciYgR2V0QWxsb2NhdG9yKCkgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGFsbG9jYXRvcl8pOwotICAgICAgICByZXR1cm4gKmFsbG9jYXRvcl87Ci0gICAgfQotCi0gICAgYm9vbCBFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHN0YWNrVG9wXyA9PSBzdGFja187IH0KLSAgICBzaXplX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oc3RhY2tUb3BfIC0gc3RhY2tfKTsgfQotICAgIHNpemVfdCBHZXRDYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oc3RhY2tFbmRfIC0gc3RhY2tfKTsgfQotCi1wcml2YXRlOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgdm9pZCBFeHBhbmQoc2l6ZV90IGNvdW50KSB7Ci0gICAgICAgIC8vIE9ubHkgZXhwYW5kIHRoZSBjYXBhY2l0eSBpZiB0aGUgY3VycmVudCBzdGFjayBleGlzdHMuIE90aGVyd2lzZSBqdXN0IGNyZWF0ZSBhIHN0YWNrIHdpdGggaW5pdGlhbCBjYXBhY2l0eS4KLSAgICAgICAgc2l6ZV90IG5ld0NhcGFjaXR5OwotICAgICAgICBpZiAoc3RhY2tfID09IDApIHsKLSAgICAgICAgICAgIGlmICghYWxsb2NhdG9yXykKLSAgICAgICAgICAgICAgICBvd25BbGxvY2F0b3JfID0gYWxsb2NhdG9yXyA9IFJBUElESlNPTl9ORVcoQWxsb2NhdG9yKCkpOwotICAgICAgICAgICAgbmV3Q2FwYWNpdHkgPSBpbml0aWFsQ2FwYWNpdHlfOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3Q2FwYWNpdHkgPSBHZXRDYXBhY2l0eSgpOwotICAgICAgICAgICAgbmV3Q2FwYWNpdHkgKz0gKG5ld0NhcGFjaXR5ICsgMSkgLyAyOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBuZXdTaXplID0gR2V0U2l6ZSgpICsgc2l6ZW9mKFQpICogY291bnQ7Ci0gICAgICAgIGlmIChuZXdDYXBhY2l0eSA8IG5ld1NpemUpCi0gICAgICAgICAgICBuZXdDYXBhY2l0eSA9IG5ld1NpemU7Ci0KLSAgICAgICAgUmVzaXplKG5ld0NhcGFjaXR5KTsKLSAgICB9Ci0KLSAgICB2b2lkIFJlc2l6ZShzaXplX3QgbmV3Q2FwYWNpdHkpIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBHZXRTaXplKCk7ICAvLyBCYWNrdXAgdGhlIGN1cnJlbnQgc2l6ZQotICAgICAgICBzdGFja18gPSBzdGF0aWNfY2FzdDxjaGFyKj4oYWxsb2NhdG9yXy0+UmVhbGxvYyhzdGFja18sIEdldENhcGFjaXR5KCksIG5ld0NhcGFjaXR5KSk7Ci0gICAgICAgIHN0YWNrVG9wXyA9IHN0YWNrXyArIHNpemU7Ci0gICAgICAgIHN0YWNrRW5kXyA9IHN0YWNrXyArIG5ld0NhcGFjaXR5OwotICAgIH0KLQotICAgIHZvaWQgRGVzdHJveSgpIHsKLSAgICAgICAgQWxsb2NhdG9yOjpGcmVlKHN0YWNrXyk7Ci0gICAgICAgIFJBUElESlNPTl9ERUxFVEUob3duQWxsb2NhdG9yXyk7IC8vIE9ubHkgZGVsZXRlIGlmIGl0IGlzIG93bmVkIGJ5IHRoZSBzdGFjawotICAgIH0KLQotICAgIC8vIFByb2hpYml0IGNvcHkgY29uc3RydWN0b3IgJiBhc3NpZ25tZW50IG9wZXJhdG9yLgotICAgIFN0YWNrKGNvbnN0IFN0YWNrJik7Ci0gICAgU3RhY2smIG9wZXJhdG9yPShjb25zdCBTdGFjayYpOwotCi0gICAgQWxsb2NhdG9yKiBhbGxvY2F0b3JfOwotICAgIEFsbG9jYXRvciogb3duQWxsb2NhdG9yXzsKLSAgICBjaGFyICpzdGFja187Ci0gICAgY2hhciAqc3RhY2tUb3BfOwotICAgIGNoYXIgKnN0YWNrRW5kXzsKLSAgICBzaXplX3QgaW5pdGlhbENhcGFjaXR5XzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGludGVybmFsCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi1SQVBJREpTT05fRElBR19QT1AKLSNlbmRpZgotCi0jZW5kaWYgLy8gUkFQSURKU09OX1NUQUNLX0hfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ludGVybmFsL3N0cmZ1bmMuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvc3RyZnVuYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRmYWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvc3RyZnVuYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fSU5URVJOQUxfU1RSRlVOQ19IXwotI2RlZmluZSBSQVBJREpTT05fSU5URVJOQUxfU1RSRlVOQ19IXwotCi0jaW5jbHVkZSAiLi4vc3RyZWFtLmgiCi0KLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vISBDdXN0b20gc3RybGVuKCkgd2hpY2ggd29ya3Mgb24gZGlmZmVyZW50IGNoYXJhY3RlciB0eXBlcy4KLS8qISBcdHBhcmFtIENoIENoYXJhY3RlciB0eXBlIChlLmcuIGNoYXIsIHdjaGFyX3QsIHNob3J0KQotICAgIFxwYXJhbSBzIE51bGwtdGVybWluYXRlZCBpbnB1dCBzdHJpbmcuCi0gICAgXHJldHVybiBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLiAKLSAgICBcbm90ZSBUaGlzIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgc3RybGVuKCksIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IG51bWJlciBvZiBVbmljb2RlIGNvZGVwb2ludHMuCi0qLwotdGVtcGxhdGUgPHR5cGVuYW1lIENoPgotaW5saW5lIFNpemVUeXBlIFN0ckxlbihjb25zdCBDaCogcykgewotICAgIGNvbnN0IENoKiBwID0gczsKLSAgICB3aGlsZSAoKnApICsrcDsKLSAgICByZXR1cm4gU2l6ZVR5cGUocCAtIHMpOwotfQotCi0vLyEgUmV0dXJucyBudW1iZXIgb2YgY29kZSBwb2ludHMgaW4gYSBlbmNvZGVkIHN0cmluZy4KLXRlbXBsYXRlPHR5cGVuYW1lIEVuY29kaW5nPgotYm9vbCBDb3VudFN0cmluZ0NvZGVQb2ludChjb25zdCB0eXBlbmFtZSBFbmNvZGluZzo6Q2gqIHMsIFNpemVUeXBlIGxlbmd0aCwgU2l6ZVR5cGUqIG91dENvdW50KSB7Ci0gICAgR2VuZXJpY1N0cmluZ1N0cmVhbTxFbmNvZGluZz4gaXMocyk7Ci0gICAgY29uc3QgdHlwZW5hbWUgRW5jb2Rpbmc6OkNoKiBlbmQgPSBzICsgbGVuZ3RoOwotICAgIFNpemVUeXBlIGNvdW50ID0gMDsKLSAgICB3aGlsZSAoaXMuc3JjXyA8IGVuZCkgewotICAgICAgICB1bnNpZ25lZCBjb2RlcG9pbnQ7Ci0gICAgICAgIGlmICghRW5jb2Rpbmc6OkRlY29kZShpcywgJmNvZGVwb2ludCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgfQotICAgICpvdXRDb3VudCA9IGNvdW50OwotICAgIHJldHVybiB0cnVlOwotfQotCi19IC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLQotI2VuZGlmIC8vIFJBUElESlNPTl9JTlRFUk5BTF9TVFJGVU5DX0hfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ludGVybmFsL3N0cnRvZC5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9pbnRlcm5hbC9zdHJ0b2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0YjAxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL2ludGVybmFsL3N0cnRvZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUuCi0vLyAKLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0vLyB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgCi0vLyBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgUkFQSURKU09OX1NUUlRPRF8KLSNkZWZpbmUgUkFQSURKU09OX1NUUlRPRF8KLQotI2luY2x1ZGUgImllZWU3NTQuaCIKLSNpbmNsdWRlICJiaWdpbnRlZ2VyLmgiCi0jaW5jbHVkZSAiZGl5ZnAuaCIKLSNpbmNsdWRlICJwb3cxMC5oIgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1pbmxpbmUgZG91YmxlIEZhc3RQYXRoKGRvdWJsZSBzaWduaWZpY2FuZCwgaW50IGV4cCkgewotICAgIGlmIChleHAgPCAtMzA4KQotICAgICAgICByZXR1cm4gMC4wOwotICAgIGVsc2UgaWYgKGV4cCA+PSAwKQotICAgICAgICByZXR1cm4gc2lnbmlmaWNhbmQgKiBpbnRlcm5hbDo6UG93MTAoZXhwKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBzaWduaWZpY2FuZCAvIGludGVybmFsOjpQb3cxMCgtZXhwKTsKLX0KLQotaW5saW5lIGRvdWJsZSBTdHJ0b2ROb3JtYWxQcmVjaXNpb24oZG91YmxlIGQsIGludCBwKSB7Ci0gICAgaWYgKHAgPCAtMzA4KSB7Ci0gICAgICAgIC8vIFByZXZlbnQgZXhwU3VtIDwgLTMwOCwgbWFraW5nIFBvdzEwKHApID0gMAotICAgICAgICBkID0gRmFzdFBhdGgoZCwgLTMwOCk7Ci0gICAgICAgIGQgPSBGYXN0UGF0aChkLCBwICsgMzA4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBkID0gRmFzdFBhdGgoZCwgcCk7Ci0gICAgcmV0dXJuIGQ7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIFQgTWluMyhUIGEsIFQgYiwgVCBjKSB7Ci0gICAgVCBtID0gYTsKLSAgICBpZiAobSA+IGIpIG0gPSBiOwotICAgIGlmIChtID4gYykgbSA9IGM7Ci0gICAgcmV0dXJuIG07Ci19Ci0KLWlubGluZSBpbnQgQ2hlY2tXaXRoaW5IYWxmVUxQKGRvdWJsZSBiLCBjb25zdCBCaWdJbnRlZ2VyJiBkLCBpbnQgZEV4cCkgewotICAgIGNvbnN0IERvdWJsZSBkYihiKTsKLSAgICBjb25zdCB1aW50NjRfdCBiSW50ID0gZGIuSW50ZWdlclNpZ25pZmljYW5kKCk7Ci0gICAgY29uc3QgaW50IGJFeHAgPSBkYi5JbnRlZ2VyRXhwb25lbnQoKTsKLSAgICBjb25zdCBpbnQgaEV4cCA9IGJFeHAgLSAxOwotCi0gICAgaW50IGRTX0V4cDIgPSAwLCBkU19FeHA1ID0gMCwgYlNfRXhwMiA9IDAsIGJTX0V4cDUgPSAwLCBoU19FeHAyID0gMCwgaFNfRXhwNSA9IDA7Ci0KLSAgICAvLyBBZGp1c3QgZm9yIGRlY2ltYWwgZXhwb25lbnQKLSAgICBpZiAoZEV4cCA+PSAwKSB7Ci0gICAgICAgIGRTX0V4cDIgKz0gZEV4cDsKLSAgICAgICAgZFNfRXhwNSArPSBkRXhwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYlNfRXhwMiAtPSBkRXhwOwotICAgICAgICBiU19FeHA1IC09IGRFeHA7Ci0gICAgICAgIGhTX0V4cDIgLT0gZEV4cDsKLSAgICAgICAgaFNfRXhwNSAtPSBkRXhwOwotICAgIH0KLQotICAgIC8vIEFkanVzdCBmb3IgYmluYXJ5IGV4cG9uZW50Ci0gICAgaWYgKGJFeHAgPj0gMCkKLSAgICAgICAgYlNfRXhwMiArPSBiRXhwOwotICAgIGVsc2UgewotICAgICAgICBkU19FeHAyIC09IGJFeHA7Ci0gICAgICAgIGhTX0V4cDIgLT0gYkV4cDsKLSAgICB9Ci0KLSAgICAvLyBBZGp1c3QgZm9yIGhhbGYgdWxwIGV4cG9uZW50Ci0gICAgaWYgKGhFeHAgPj0gMCkKLSAgICAgICAgaFNfRXhwMiArPSBoRXhwOwotICAgIGVsc2UgewotICAgICAgICBkU19FeHAyIC09IGhFeHA7Ci0gICAgICAgIGJTX0V4cDIgLT0gaEV4cDsKLSAgICB9Ci0KLSAgICAvLyBSZW1vdmUgY29tbW9uIHBvd2VyIG9mIHR3byBmYWN0b3IgZnJvbSBhbGwgdGhyZWUgc2NhbGVkIHZhbHVlcwotICAgIGludCBjb21tb25fRXhwMiA9IE1pbjMoZFNfRXhwMiwgYlNfRXhwMiwgaFNfRXhwMik7Ci0gICAgZFNfRXhwMiAtPSBjb21tb25fRXhwMjsKLSAgICBiU19FeHAyIC09IGNvbW1vbl9FeHAyOwotICAgIGhTX0V4cDIgLT0gY29tbW9uX0V4cDI7Ci0KLSAgICBCaWdJbnRlZ2VyIGRTID0gZDsKLSAgICBkUy5NdWx0aXBseVBvdzUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGRTX0V4cDUpKSA8PD0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGRTX0V4cDIpOwotCi0gICAgQmlnSW50ZWdlciBiUyhiSW50KTsKLSAgICBiUy5NdWx0aXBseVBvdzUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJTX0V4cDUpKSA8PD0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJTX0V4cDIpOwotCi0gICAgQmlnSW50ZWdlciBoUygxKTsKLSAgICBoUy5NdWx0aXBseVBvdzUoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGhTX0V4cDUpKSA8PD0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGhTX0V4cDIpOwotCi0gICAgQmlnSW50ZWdlciBkZWx0YSgwKTsKLSAgICBkUy5EaWZmZXJlbmNlKGJTLCAmZGVsdGEpOwotCi0gICAgcmV0dXJuIGRlbHRhLkNvbXBhcmUoaFMpOwotfQotCi1pbmxpbmUgYm9vbCBTdHJ0b2RGYXN0KGRvdWJsZSBkLCBpbnQgcCwgZG91YmxlKiByZXN1bHQpIHsKLSAgICAvLyBVc2UgZmFzdCBwYXRoIGZvciBzdHJpbmctdG8tZG91YmxlIGNvbnZlcnNpb24gaWYgcG9zc2libGUKLSAgICAvLyBzZWUgaHR0cDovL3d3dy5leHBsb3JpbmdiaW5hcnkuY29tL2Zhc3QtcGF0aC1kZWNpbWFsLXRvLWZsb2F0aW5nLXBvaW50LWNvbnZlcnNpb24vCi0gICAgaWYgKHAgPiAyMiAgJiYgcCA8IDIyICsgMTYpIHsKLSAgICAgICAgLy8gRmFzdCBQYXRoIENhc2VzIEluIERpc2d1aXNlCi0gICAgICAgIGQgKj0gaW50ZXJuYWw6OlBvdzEwKHAgLSAyMik7Ci0gICAgICAgIHAgPSAyMjsKLSAgICB9Ci0KLSAgICBpZiAocCA+PSAtMjIgJiYgcCA8PSAyMiAmJiBkIDw9IDkwMDcxOTkyNTQ3NDA5OTEuMCkgeyAvLyAyXjUzIC0gMQotICAgICAgICAqcmVzdWx0ID0gRmFzdFBhdGgoZCwgcCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gQ29tcHV0ZSBhbiBhcHByb3hpbWF0aW9uIGFuZCBzZWUgaWYgaXQgaXMgd2l0aGluIDEvMiBVTFAKLWlubGluZSBib29sIFN0cnRvZERpeUZwKGNvbnN0IGNoYXIqIGRlY2ltYWxzLCBzaXplX3QgbGVuZ3RoLCBzaXplX3QgZGVjaW1hbFBvc2l0aW9uLCBpbnQgZXhwLCBkb3VibGUqIHJlc3VsdCkgewotICAgIHVpbnQ2NF90IHNpZ25pZmljYW5kID0gMDsKLSAgICBzaXplX3QgaSA9IDA7ICAgLy8gMl42NCAtIDEgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNSwgMTg0NDY3NDQwNzM3MDk1NTE2MSA9IDB4MTk5OTk5OTk5OTk5OTk5OSAgICAKLSAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmIChzaWduaWZpY2FuZCAgPiAgUkFQSURKU09OX1VJTlQ2NF9DMigweDE5OTk5OTk5LCAweDk5OTk5OTk5KSB8fAotICAgICAgICAgICAgKHNpZ25pZmljYW5kID09IFJBUElESlNPTl9VSU5UNjRfQzIoMHgxOTk5OTk5OSwgMHg5OTk5OTk5OSkgJiYgZGVjaW1hbHNbaV0gPiAnNScpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHNpZ25pZmljYW5kID0gc2lnbmlmaWNhbmQgKiAxMHUgKyBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZGVjaW1hbHNbaV0gLSAnMCcpOwotICAgIH0KLSAgICAKLSAgICBpZiAoaSA8IGxlbmd0aCAmJiBkZWNpbWFsc1tpXSA+PSAnNScpIC8vIFJvdW5kaW5nCi0gICAgICAgIHNpZ25pZmljYW5kKys7Ci0KLSAgICBzaXplX3QgcmVtYWluaW5nID0gbGVuZ3RoIC0gaTsKLSAgICBjb25zdCB1bnNpZ25lZCBrVWxwU2hpZnQgPSAzOwotICAgIGNvbnN0IHVuc2lnbmVkIGtVbHAgPSAxIDw8IGtVbHBTaGlmdDsKLSAgICBpbnQgZXJyb3IgPSAocmVtYWluaW5nID09IDApID8gMCA6IGtVbHAgLyAyOwotCi0gICAgRGl5RnAgdihzaWduaWZpY2FuZCwgMCk7Ci0gICAgdiA9IHYuTm9ybWFsaXplKCk7Ci0gICAgZXJyb3IgPDw9IC12LmU7Ci0KLSAgICBjb25zdCBpbnQgZEV4cCA9IHN0YXRpY19jYXN0PGludD4oZGVjaW1hbFBvc2l0aW9uKSAtIHN0YXRpY19jYXN0PGludD4oaSkgKyBleHA7Ci0KLSAgICBpbnQgYWN0dWFsRXhwOwotICAgIERpeUZwIGNhY2hlZFBvd2VyID0gR2V0Q2FjaGVkUG93ZXIxMChkRXhwLCAmYWN0dWFsRXhwKTsKLSAgICBpZiAoYWN0dWFsRXhwICE9IGRFeHApIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IERpeUZwIGtQb3cxMFtdID0gewotICAgICAgICAgICAgRGl5RnAoUkFQSURKU09OX1VJTlQ2NF9DMigweGEwMDAwMDAwLCAwMDAwMDAwMCksIC02MCksICAvLyAxMF4xCi0gICAgICAgICAgICBEaXlGcChSQVBJREpTT05fVUlOVDY0X0MyKDB4YzgwMDAwMDAsIDAwMDAwMDAwKSwgLTU3KSwgIC8vIDEwXjIKLSAgICAgICAgICAgIERpeUZwKFJBUElESlNPTl9VSU5UNjRfQzIoMHhmYTAwMDAwMCwgMDAwMDAwMDApLCAtNTQpLCAgLy8gMTBeMwotICAgICAgICAgICAgRGl5RnAoUkFQSURKU09OX1VJTlQ2NF9DMigweDljNDAwMDAwLCAwMDAwMDAwMCksIC01MCksICAvLyAxMF40Ci0gICAgICAgICAgICBEaXlGcChSQVBJREpTT05fVUlOVDY0X0MyKDB4YzM1MDAwMDAsIDAwMDAwMDAwKSwgLTQ3KSwgIC8vIDEwXjUKLSAgICAgICAgICAgIERpeUZwKFJBUElESlNPTl9VSU5UNjRfQzIoMHhmNDI0MDAwMCwgMDAwMDAwMDApLCAtNDQpLCAgLy8gMTBeNgotICAgICAgICAgICAgRGl5RnAoUkFQSURKU09OX1VJTlQ2NF9DMigweDk4OTY4MDAwLCAwMDAwMDAwMCksIC00MCkgICAvLyAxMF43Ci0gICAgICAgIH07Ci0gICAgICAgIGludCAgYWRqdXN0bWVudCA9IGRFeHAgLSBhY3R1YWxFeHAgLSAxOwotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGFkanVzdG1lbnQgPj0gMCAmJiBhZGp1c3RtZW50IDwgNyk7Ci0gICAgICAgIHYgPSB2ICoga1BvdzEwW2FkanVzdG1lbnRdOwotICAgICAgICBpZiAobGVuZ3RoICsgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGFkanVzdG1lbnQpPiAxOXUpIC8vIGhhcyBtb3JlIGRpZ2l0cyB0aGFuIGRlY2ltYWwgZGlnaXRzIGluIDY0LWJpdAotICAgICAgICAgICAgZXJyb3IgKz0ga1VscCAvIDI7Ci0gICAgfQotCi0gICAgdiA9IHYgKiBjYWNoZWRQb3dlcjsKLQotICAgIGVycm9yICs9IGtVbHAgKyAoZXJyb3IgPT0gMCA/IDAgOiAxKTsKLQotICAgIGNvbnN0IGludCBvbGRFeHAgPSB2LmU7Ci0gICAgdiA9IHYuTm9ybWFsaXplKCk7Ci0gICAgZXJyb3IgPDw9IG9sZEV4cCAtIHYuZTsKLQotICAgIGNvbnN0IHVuc2lnbmVkIGVmZmVjdGl2ZVNpZ25pZmljYW5kU2l6ZSA9IERvdWJsZTo6RWZmZWN0aXZlU2lnbmlmaWNhbmRTaXplKDY0ICsgdi5lKTsKLSAgICB1bnNpZ25lZCBwcmVjaXNpb25TaXplID0gNjQgLSBlZmZlY3RpdmVTaWduaWZpY2FuZFNpemU7Ci0gICAgaWYgKHByZWNpc2lvblNpemUgKyBrVWxwU2hpZnQgPj0gNjQpIHsKLSAgICAgICAgdW5zaWduZWQgc2NhbGVFeHAgPSAocHJlY2lzaW9uU2l6ZSArIGtVbHBTaGlmdCkgLSA2MzsKLSAgICAgICAgdi5mID4+PSBzY2FsZUV4cDsKLSAgICAgICAgdi5lICs9IHNjYWxlRXhwOyAKLSAgICAgICAgZXJyb3IgPSAoZXJyb3IgPj4gc2NhbGVFeHApICsgMSArIHN0YXRpY19jYXN0PGludD4oa1VscCk7Ci0gICAgICAgIHByZWNpc2lvblNpemUgLT0gc2NhbGVFeHA7Ci0gICAgfQotCi0gICAgRGl5RnAgcm91bmRlZCh2LmYgPj4gcHJlY2lzaW9uU2l6ZSwgdi5lICsgc3RhdGljX2Nhc3Q8aW50PihwcmVjaXNpb25TaXplKSk7Ci0gICAgY29uc3QgdWludDY0X3QgcHJlY2lzaW9uQml0cyA9ICh2LmYgJiAoKHVpbnQ2NF90KDEpIDw8IHByZWNpc2lvblNpemUpIC0gMSkpICoga1VscDsKLSAgICBjb25zdCB1aW50NjRfdCBoYWxmV2F5ID0gKHVpbnQ2NF90KDEpIDw8IChwcmVjaXNpb25TaXplIC0gMSkpICoga1VscDsKLSAgICBpZiAocHJlY2lzaW9uQml0cyA+PSBoYWxmV2F5ICsgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGVycm9yKSkgewotICAgICAgICByb3VuZGVkLmYrKzsKLSAgICAgICAgaWYgKHJvdW5kZWQuZiAmIChEaXlGcDo6a0RwSGlkZGVuQml0IDw8IDEpKSB7IC8vIHJvdW5kaW5nIG92ZXJmbG93cyBtYW50aXNzYSAoaXNzdWUgIzM0MCkKLSAgICAgICAgICAgIHJvdW5kZWQuZiA+Pj0gMTsKLSAgICAgICAgICAgIHJvdW5kZWQuZSsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKnJlc3VsdCA9IHJvdW5kZWQuVG9Eb3VibGUoKTsKLQotICAgIHJldHVybiBoYWxmV2F5IC0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGVycm9yKSA+PSBwcmVjaXNpb25CaXRzIHx8IHByZWNpc2lvbkJpdHMgPj0gaGFsZldheSArIHN0YXRpY19jYXN0PHVuc2lnbmVkPihlcnJvcik7Ci19Ci0KLWlubGluZSBkb3VibGUgU3RydG9kQmlnSW50ZWdlcihkb3VibGUgYXBwcm94LCBjb25zdCBjaGFyKiBkZWNpbWFscywgc2l6ZV90IGxlbmd0aCwgc2l6ZV90IGRlY2ltYWxQb3NpdGlvbiwgaW50IGV4cCkgewotICAgIGNvbnN0IEJpZ0ludGVnZXIgZEludChkZWNpbWFscywgbGVuZ3RoKTsKLSAgICBjb25zdCBpbnQgZEV4cCA9IHN0YXRpY19jYXN0PGludD4oZGVjaW1hbFBvc2l0aW9uKSAtIHN0YXRpY19jYXN0PGludD4obGVuZ3RoKSArIGV4cDsKLSAgICBEb3VibGUgYShhcHByb3gpOwotICAgIGludCBjbXAgPSBDaGVja1dpdGhpbkhhbGZVTFAoYS5WYWx1ZSgpLCBkSW50LCBkRXhwKTsKLSAgICBpZiAoY21wIDwgMCkKLSAgICAgICAgcmV0dXJuIGEuVmFsdWUoKTsgIC8vIHdpdGhpbiBoYWxmIFVMUAotICAgIGVsc2UgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgIC8vIFJvdW5kIHRvd2FyZHMgZXZlbgotICAgICAgICBpZiAoYS5TaWduaWZpY2FuZCgpICYgMSkKLSAgICAgICAgICAgIHJldHVybiBhLk5leHRQb3NpdGl2ZURvdWJsZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gYS5WYWx1ZSgpOwotICAgIH0KLSAgICBlbHNlIC8vIGFkanVzdG1lbnQKLSAgICAgICAgcmV0dXJuIGEuTmV4dFBvc2l0aXZlRG91YmxlKCk7Ci19Ci0KLWlubGluZSBkb3VibGUgU3RydG9kRnVsbFByZWNpc2lvbihkb3VibGUgZCwgaW50IHAsIGNvbnN0IGNoYXIqIGRlY2ltYWxzLCBzaXplX3QgbGVuZ3RoLCBzaXplX3QgZGVjaW1hbFBvc2l0aW9uLCBpbnQgZXhwKSB7Ci0gICAgUkFQSURKU09OX0FTU0VSVChkID49IDAuMCk7Ci0gICAgUkFQSURKU09OX0FTU0VSVChsZW5ndGggPj0gMSk7Ci0KLSAgICBkb3VibGUgcmVzdWx0OwotICAgIGlmIChTdHJ0b2RGYXN0KGQsIHAsICZyZXN1bHQpKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgLy8gVHJpbSBsZWFkaW5nIHplcm9zCi0gICAgd2hpbGUgKCpkZWNpbWFscyA9PSAnMCcgJiYgbGVuZ3RoID4gMSkgewotICAgICAgICBsZW5ndGgtLTsKLSAgICAgICAgZGVjaW1hbHMrKzsKLSAgICAgICAgZGVjaW1hbFBvc2l0aW9uLS07Ci0gICAgfQotCi0gICAgLy8gVHJpbSB0cmFpbGluZyB6ZXJvcwotICAgIHdoaWxlIChkZWNpbWFsc1tsZW5ndGggLSAxXSA9PSAnMCcgJiYgbGVuZ3RoID4gMSkgewotICAgICAgICBsZW5ndGgtLTsKLSAgICAgICAgZGVjaW1hbFBvc2l0aW9uLS07Ci0gICAgICAgIGV4cCsrOwotICAgIH0KLQotICAgIC8vIFRyaW0gcmlnaHQtbW9zdCBkaWdpdHMKLSAgICBjb25zdCBpbnQga01heERlY2ltYWxEaWdpdCA9IDc4MDsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgpID4ga01heERlY2ltYWxEaWdpdCkgewotICAgICAgICBpbnQgZGVsdGEgPSAoc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgpIC0ga01heERlY2ltYWxEaWdpdCk7Ci0gICAgICAgIGV4cCArPSBkZWx0YTsKLSAgICAgICAgZGVjaW1hbFBvc2l0aW9uIC09IHN0YXRpY19jYXN0PHVuc2lnbmVkPihkZWx0YSk7Ci0gICAgICAgIGxlbmd0aCA9IGtNYXhEZWNpbWFsRGlnaXQ7Ci0gICAgfQotCi0gICAgLy8gSWYgdG9vIHNtYWxsLCB1bmRlcmZsb3cgdG8gemVybwotICAgIGlmIChpbnQobGVuZ3RoKSArIGV4cCA8IC0zMjQpCi0gICAgICAgIHJldHVybiAwLjA7Ci0KLSAgICBpZiAoU3RydG9kRGl5RnAoZGVjaW1hbHMsIGxlbmd0aCwgZGVjaW1hbFBvc2l0aW9uLCBleHAsICZyZXN1bHQpKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgLy8gVXNlIGFwcHJveGltYXRpb24gZnJvbSBTdHJ0b2REaXlGcCBhbmQgbWFrZSBhZGp1c3RtZW50IHdpdGggQmlnSW50ZWdlciBjb21wYXJpc29uCi0gICAgcmV0dXJuIFN0cnRvZEJpZ0ludGVnZXIocmVzdWx0LCBkZWNpbWFscywgbGVuZ3RoLCBkZWNpbWFsUG9zaXRpb24sIGV4cCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGludGVybmFsCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jZW5kaWYgLy8gUkFQSURKU09OX1NUUlRPRF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaW50ZXJuYWwvc3dhcC5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9pbnRlcm5hbC9zd2FwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NmU0OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9pbnRlcm5hbC9zd2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyBUZW5jZW50IGlzIHBsZWFzZWQgdG8gc3VwcG9ydCB0aGUgb3BlbiBzb3VyY2UgY29tbXVuaXR5IGJ5IG1ha2luZyBSYXBpZEpTT04gYXZhaWxhYmxlLgotLy8KLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgotLy8gQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgUkFQSURKU09OX0lOVEVSTkFMX1NXQVBfSF8KLSNkZWZpbmUgUkFQSURKU09OX0lOVEVSTkFMX1NXQVBfSF8KLQotI2luY2x1ZGUgIi4uL3JhcGlkanNvbi5oIgotCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi1SQVBJREpTT05fRElBR19QVVNICi1SQVBJREpTT05fRElBR19PRkYoYysrOTgtY29tcGF0KQotI2VuZGlmCi0KLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vISBDdXN0b20gc3dhcCgpIHRvIGF2b2lkIGRlcGVuZGVuY3kgb24gQysrIDxhbGdvcml0aG0+IGhlYWRlcgotLyohIFx0cGFyYW0gVCBUeXBlIG9mIHRoZSBhcmd1bWVudHMgdG8gc3dhcCwgc2hvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIHByaW1pdGl2ZSBDKysgdHlwZXMgb25seS4KLSAgICBcbm90ZSBUaGlzIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgc3RkOjpzd2FwKCkuCi0qLwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgdm9pZCBTd2FwKFQmIGEsIFQmIGIpIFJBUElESlNPTl9OT0VYQ0VQVCB7Ci0gICAgVCB0bXAgPSBhOwotICAgICAgICBhID0gYjsKLSAgICAgICAgYiA9IHRtcDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLVJBUElESlNPTl9OQU1FU1BBQ0VfRU5ECi0KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLSNlbmRpZiAvLyBSQVBJREpTT05fSU5URVJOQUxfU1dBUF9IXwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9pc3RyZWFtd3JhcHBlci5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9pc3RyZWFtd3JhcHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzM1ODZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vaXN0cmVhbXdyYXBwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLyBUZW5jZW50IGlzIHBsZWFzZWQgdG8gc3VwcG9ydCB0aGUgb3BlbiBzb3VyY2UgY29tbXVuaXR5IGJ5IG1ha2luZyBSYXBpZEpTT04gYXZhaWxhYmxlLgotLy8gCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTUgVEhMIEEyOSBMaW1pdGVkLCBhIFRlbmNlbnQgY29tcGFueSwgYW5kIE1pbG8gWWlwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0Ci0vLyBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIAotLy8gdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIAotLy8gQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgCi0vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RyZWFtLmgiCi0jaW5jbHVkZSA8aW9zZndkPgotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QVVNICi1SQVBJREpTT05fRElBR19PRkYocGFkZGVkKQotI2VuZGlmCi0KLSNpZmRlZiBfTVNDX1ZFUgotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKDQzNTEpIC8vIG5ldyBiZWhhdmlvcjogZWxlbWVudHMgb2YgYXJyYXkgJ2FycmF5JyB3aWxsIGJlIGRlZmF1bHQgaW5pdGlhbGl6ZWQKLSNlbmRpZgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi0KLS8vISBXcmFwcGVyIG9mIFxjIHN0ZDo6YmFzaWNfaXN0cmVhbSBpbnRvIFJhcGlkSlNPTidzIFN0cmVhbSBjb25jZXB0LgotLyohCi0gICAgVGhlIGNsYXNzZXMgY2FuIGJlIHdyYXBwZWQgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bzoKLQotICAgIC0gXGMgc3RkOjppc3RyaW5nc3RyZWFtCi0gICAgLSBcYyBzdGQ6OnN0cmluZ3N0cmVhbQotICAgIC0gXGMgc3RkOjp3aXN0cmluZ3N0cmVhbQotICAgIC0gXGMgc3RkOjp3c3RyaW5nc3RyZWFtCi0gICAgLSBcYyBzdGQ6Omlmc3RyZWFtCi0gICAgLSBcYyBzdGQ6OmZzdHJlYW0KLSAgICAtIFxjIHN0ZDo6d2lmc3RyZWFtCi0gICAgLSBcYyBzdGQ6Ondmc3RyZWFtCi0KLSAgICBcdHBhcmFtIFN0cmVhbVR5cGUgQ2xhc3MgZGVyaXZlZCBmcm9tIFxjIHN0ZDo6YmFzaWNfaXN0cmVhbS4KLSovCi0gICAKLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJlYW1UeXBlPgotY2xhc3MgQmFzaWNJU3RyZWFtV3JhcHBlciB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBTdHJlYW1UeXBlOjpjaGFyX3R5cGUgQ2g7Ci0gICAgQmFzaWNJU3RyZWFtV3JhcHBlcihTdHJlYW1UeXBlJiBzdHJlYW0pIDogc3RyZWFtXyhzdHJlYW0pLCBjb3VudF8oKSwgcGVla0J1ZmZlcl8oKSB7fQotCi0gICAgQ2ggUGVlaygpIGNvbnN0IHsgCi0gICAgICAgIHR5cGVuYW1lIFN0cmVhbVR5cGU6OmludF90eXBlIGMgPSBzdHJlYW1fLnBlZWsoKTsKLSAgICAgICAgcmV0dXJuIFJBUElESlNPTl9MSUtFTFkoYyAhPSBTdHJlYW1UeXBlOjp0cmFpdHNfdHlwZTo6ZW9mKCkpID8gc3RhdGljX2Nhc3Q8Q2g+KGMpIDogJ1wwJzsKLSAgICB9Ci0KLSAgICBDaCBUYWtlKCkgeyAKLSAgICAgICAgdHlwZW5hbWUgU3RyZWFtVHlwZTo6aW50X3R5cGUgYyA9IHN0cmVhbV8uZ2V0KCk7Ci0gICAgICAgIGlmIChSQVBJREpTT05fTElLRUxZKGMgIT0gU3RyZWFtVHlwZTo6dHJhaXRzX3R5cGU6OmVvZigpKSkgewotICAgICAgICAgICAgY291bnRfKys7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2g+KGMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAnXDAnOwotICAgIH0KLQotICAgIC8vIHRlbGxnKCkgbWF5IHJldHVybiAtMSB3aGVuIGZhaWxlZC4gU28gd2UgY291bnQgYnkgb3Vyc2VsZi4KLSAgICBzaXplX3QgVGVsbCgpIGNvbnN0IHsgcmV0dXJuIGNvdW50XzsgfQotCi0gICAgQ2gqIFB1dEJlZ2luKCkgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLSAgICB2b2lkIFB1dChDaCkgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgfQotICAgIHZvaWQgRmx1c2goKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyB9Ci0gICAgc2l6ZV90IFB1dEVuZChDaCopIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IHJldHVybiAwOyB9Ci0KLSAgICAvLyBGb3IgZW5jb2RpbmcgZGV0ZWN0aW9uIG9ubHkuCi0gICAgY29uc3QgQ2gqIFBlZWs0KCkgY29uc3QgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKHNpemVvZihDaCkgPT0gMSk7IC8vIE9ubHkgdXNhYmxlIGZvciBieXRlIHN0cmVhbS4KLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGJvb2wgaGFzRXJyb3IgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgICAgICAgICAgdHlwZW5hbWUgU3RyZWFtVHlwZTo6aW50X3R5cGUgYyA9IHN0cmVhbV8uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoYyA9PSBTdHJlYW1UeXBlOjp0cmFpdHNfdHlwZTo6ZW9mKCkpIHsKLSAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc3RyZWFtXy5jbGVhcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGVla0J1ZmZlcl9baV0gPSBzdGF0aWNfY2FzdDxDaD4oYyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICgtLWk7IGkgPj0gMDsgLS1pKQotICAgICAgICAgICAgc3RyZWFtXy5wdXRiYWNrKHBlZWtCdWZmZXJfW2ldKTsKLSAgICAgICAgcmV0dXJuICFoYXNFcnJvciA/IHBlZWtCdWZmZXJfIDogMDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgQmFzaWNJU3RyZWFtV3JhcHBlcihjb25zdCBCYXNpY0lTdHJlYW1XcmFwcGVyJik7Ci0gICAgQmFzaWNJU3RyZWFtV3JhcHBlciYgb3BlcmF0b3I9KGNvbnN0IEJhc2ljSVN0cmVhbVdyYXBwZXImKTsKLQotICAgIFN0cmVhbVR5cGUmIHN0cmVhbV87Ci0gICAgc2l6ZV90IGNvdW50XzsgIC8vITwgTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZC4gTm90ZToKLSAgICBtdXRhYmxlIENoIHBlZWtCdWZmZXJfWzRdOwotfTsKLQotdHlwZWRlZiBCYXNpY0lTdHJlYW1XcmFwcGVyPHN0ZDo6aXN0cmVhbT4gSVN0cmVhbVdyYXBwZXI7Ci10eXBlZGVmIEJhc2ljSVN0cmVhbVdyYXBwZXI8c3RkOjp3aXN0cmVhbT4gV0lTdHJlYW1XcmFwcGVyOwotCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pIHx8IGRlZmluZWQoX01TQ19WRVIpCi1SQVBJREpTT05fRElBR19QT1AKLSNlbmRpZgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9tZW1vcnlidWZmZXIuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vbWVtb3J5YnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YmVlMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9tZW1vcnlidWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUuCi0vLyAKLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0vLyB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgCi0vLyBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgUkFQSURKU09OX01FTU9SWUJVRkZFUl9IXwotI2RlZmluZSBSQVBJREpTT05fTUVNT1JZQlVGRkVSX0hfCi0KLSNpbmNsdWRlICJzdHJlYW0uaCIKLSNpbmNsdWRlICJpbnRlcm5hbC9zdGFjay5oIgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi0KLS8vISBSZXByZXNlbnRzIGFuIGluLW1lbW9yeSBvdXRwdXQgYnl0ZSBzdHJlYW0uCi0vKiEKLSAgICBUaGlzIGNsYXNzIGlzIG1haW5seSBmb3IgYmVpbmcgd3JhcHBlZCBieSBFbmNvZGVkT3V0cHV0U3RyZWFtIG9yIEF1dG9VVEZPdXRwdXRTdHJlYW0uCi0KLSAgICBJdCBpcyBzaW1pbGFyIHRvIEZpbGVXcml0ZUJ1ZmZlciBidXQgdGhlIGRlc3RpbmF0aW9uIGlzIGFuIGluLW1lbW9yeSBidWZmZXIgaW5zdGVhZCBvZiBhIGZpbGUuCi0KLSAgICBEaWZmZXJlbmNlcyBiZXR3ZWVuIE1lbW9yeUJ1ZmZlciBhbmQgU3RyaW5nQnVmZmVyOgotICAgIDEuIFN0cmluZ0J1ZmZlciBoYXMgRW5jb2RpbmcgYnV0IE1lbW9yeUJ1ZmZlciBpcyBvbmx5IGEgYnl0ZSBidWZmZXIuIAotICAgIDIuIFN0cmluZ0J1ZmZlcjo6R2V0U3RyaW5nKCkgcmV0dXJucyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIE1lbW9yeUJ1ZmZlcjo6R2V0QnVmZmVyKCkgcmV0dXJucyBhIGJ1ZmZlciB3aXRob3V0IHRlcm1pbmF0b3IuCi0KLSAgICBcdHBhcmFtIEFsbG9jYXRvciB0eXBlIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBidWZmZXIuCi0gICAgXG5vdGUgaW1wbGVtZW50cyBTdHJlYW0gY29uY2VwdAotKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3IgPSBDcnRBbGxvY2F0b3I+Ci1zdHJ1Y3QgR2VuZXJpY01lbW9yeUJ1ZmZlciB7Ci0gICAgdHlwZWRlZiBjaGFyIENoOyAvLyBieXRlCi0KLSAgICBHZW5lcmljTWVtb3J5QnVmZmVyKEFsbG9jYXRvciogYWxsb2NhdG9yID0gMCwgc2l6ZV90IGNhcGFjaXR5ID0ga0RlZmF1bHRDYXBhY2l0eSkgOiBzdGFja18oYWxsb2NhdG9yLCBjYXBhY2l0eSkge30KLQotICAgIHZvaWQgUHV0KENoIGMpIHsgKnN0YWNrXy50ZW1wbGF0ZSBQdXNoPENoPigpID0gYzsgfQotICAgIHZvaWQgRmx1c2goKSB7fQotCi0gICAgdm9pZCBDbGVhcigpIHsgc3RhY2tfLkNsZWFyKCk7IH0KLSAgICB2b2lkIFNocmlua1RvRml0KCkgeyBzdGFja18uU2hyaW5rVG9GaXQoKTsgfQotICAgIENoKiBQdXNoKHNpemVfdCBjb3VudCkgeyByZXR1cm4gc3RhY2tfLnRlbXBsYXRlIFB1c2g8Q2g+KGNvdW50KTsgfQotICAgIHZvaWQgUG9wKHNpemVfdCBjb3VudCkgeyBzdGFja18udGVtcGxhdGUgUG9wPENoPihjb3VudCk7IH0KLQotICAgIGNvbnN0IENoKiBHZXRCdWZmZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBzdGFja18udGVtcGxhdGUgQm90dG9tPENoPigpOwotICAgIH0KLQotICAgIHNpemVfdCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gc3RhY2tfLkdldFNpemUoKTsgfQotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRGVmYXVsdENhcGFjaXR5ID0gMjU2OwotICAgIG11dGFibGUgaW50ZXJuYWw6OlN0YWNrPEFsbG9jYXRvcj4gc3RhY2tfOwotfTsKLQotdHlwZWRlZiBHZW5lcmljTWVtb3J5QnVmZmVyPD4gTWVtb3J5QnVmZmVyOwotCi0vLyEgSW1wbGVtZW50IHNwZWNpYWxpemVkIHZlcnNpb24gb2YgUHV0TigpIHdpdGggbWVtc2V0KCkgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4KLXRlbXBsYXRlPD4KLWlubGluZSB2b2lkIFB1dE4oTWVtb3J5QnVmZmVyJiBtZW1vcnlCdWZmZXIsIGNoYXIgYywgc2l6ZV90IG4pIHsKLSAgICBzdGQ6Om1lbXNldChtZW1vcnlCdWZmZXIuc3RhY2tfLlB1c2g8Y2hhcj4obiksIGMsIG4gKiBzaXplb2YoYykpOwotfQotCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jZW5kaWYgLy8gUkFQSURKU09OX01FTU9SWUJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9tZW1vcnlzdHJlYW0uaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vbWVtb3J5c3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzFkOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9tZW1vcnlzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUuCi0vLyAKLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0vLyB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgCi0vLyBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgUkFQSURKU09OX01FTU9SWVNUUkVBTV9IXwotI2RlZmluZSBSQVBJREpTT05fTUVNT1JZU1RSRUFNX0hfCi0KLSNpbmNsdWRlICJzdHJlYW0uaCIKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKHVucmVhY2hhYmxlLWNvZGUpCi1SQVBJREpTT05fRElBR19PRkYobWlzc2luZy1ub3JldHVybikKLSNlbmRpZgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi0KLS8vISBSZXByZXNlbnRzIGFuIGluLW1lbW9yeSBpbnB1dCBieXRlIHN0cmVhbS4KLS8qIQotICAgIFRoaXMgY2xhc3MgaXMgbWFpbmx5IGZvciBiZWluZyB3cmFwcGVkIGJ5IEVuY29kZWRJbnB1dFN0cmVhbSBvciBBdXRvVVRGSW5wdXRTdHJlYW0uCi0KLSAgICBJdCBpcyBzaW1pbGFyIHRvIEZpbGVSZWFkQnVmZmVyIGJ1dCB0aGUgc291cmNlIGlzIGFuIGluLW1lbW9yeSBidWZmZXIgaW5zdGVhZCBvZiBhIGZpbGUuCi0KLSAgICBEaWZmZXJlbmNlcyBiZXR3ZWVuIE1lbW9yeVN0cmVhbSBhbmQgU3RyaW5nU3RyZWFtOgotICAgIDEuIFN0cmluZ1N0cmVhbSBoYXMgZW5jb2RpbmcgYnV0IE1lbW9yeVN0cmVhbSBpcyBhIGJ5dGUgc3RyZWFtLgotICAgIDIuIE1lbW9yeVN0cmVhbSBuZWVkcyBzaXplIG9mIHRoZSBzb3VyY2UgYnVmZmVyIGFuZCB0aGUgYnVmZmVyIGRvbid0IG5lZWQgdG8gYmUgbnVsbCB0ZXJtaW5hdGVkLiBTdHJpbmdTdHJlYW0gYXNzdW1lIG51bGwtdGVybWluYXRlZCBzdHJpbmcgYXMgc291cmNlLgotICAgIDMuIE1lbW9yeVN0cmVhbSBzdXBwb3J0cyBQZWVrNCgpIGZvciBlbmNvZGluZyBkZXRlY3Rpb24uIFN0cmluZ1N0cmVhbSBpcyBzcGVjaWZpZWQgd2l0aCBhbiBlbmNvZGluZyBzbyBpdCBzaG91bGQgbm90IGhhdmUgUGVlazQoKS4KLSAgICBcbm90ZSBpbXBsZW1lbnRzIFN0cmVhbSBjb25jZXB0Ci0qLwotc3RydWN0IE1lbW9yeVN0cmVhbSB7Ci0gICAgdHlwZWRlZiBjaGFyIENoOyAvLyBieXRlCi0KLSAgICBNZW1vcnlTdHJlYW0oY29uc3QgQ2ggKnNyYywgc2l6ZV90IHNpemUpIDogc3JjXyhzcmMpLCBiZWdpbl8oc3JjKSwgZW5kXyhzcmMgKyBzaXplKSwgc2l6ZV8oc2l6ZSkge30KLQotICAgIENoIFBlZWsoKSBjb25zdCB7IHJldHVybiBSQVBJREpTT05fVU5MSUtFTFkoc3JjXyA9PSBlbmRfKSA/ICdcMCcgOiAqc3JjXzsgfQotICAgIENoIFRha2UoKSB7IHJldHVybiBSQVBJREpTT05fVU5MSUtFTFkoc3JjXyA9PSBlbmRfKSA/ICdcMCcgOiAqc3JjXysrOyB9Ci0gICAgc2l6ZV90IFRlbGwoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHNyY18gLSBiZWdpbl8pOyB9Ci0KLSAgICBDaCogUHV0QmVnaW4oKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDsgfQotICAgIHZvaWQgUHV0KENoKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyB9Ci0gICAgdm9pZCBGbHVzaCgpIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IH0KLSAgICBzaXplX3QgUHV0RW5kKENoKikgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLQotICAgIC8vIEZvciBlbmNvZGluZyBkZXRlY3Rpb24gb25seS4KLSAgICBjb25zdCBDaCogUGVlazQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBUZWxsKCkgKyA0IDw9IHNpemVfID8gc3JjXyA6IDA7Ci0gICAgfQotCi0gICAgY29uc3QgQ2gqIHNyY187ICAgICAvLyE8IEN1cnJlbnQgcmVhZCBwb3NpdGlvbi4KLSAgICBjb25zdCBDaCogYmVnaW5fOyAgIC8vITwgT3JpZ2luYWwgaGVhZCBvZiB0aGUgc3RyaW5nLgotICAgIGNvbnN0IENoKiBlbmRfOyAgICAgLy8hPCBFbmQgb2Ygc3RyZWFtLgotICAgIHNpemVfdCBzaXplXzsgICAgICAgLy8hPCBTaXplIG9mIHRoZSBzdHJlYW0uCi19OwotCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QT1AKLSNlbmRpZgotCi0jZW5kaWYgLy8gUkFQSURKU09OX01FTU9SWUJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9tc2ludHR5cGVzL2ludHR5cGVzLmggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL21zaW50dHlwZXMvaW50dHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxMTEyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL21zaW50dHlwZXMvaW50dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vLyBJU08gQzl4ICBjb21wbGlhbnQgaW50dHlwZXMuaCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8KLS8vIEJhc2VkIG9uIElTTy9JRUMgOTg5OTpUQzIgQ29tbWl0dGVlIGRyYWZ0IChNYXkgNiwgMjAwNSkgV0cxNC9OMTEyNCAKLS8vIAotLy8gIENvcHlyaWdodCAoYykgMjAwNi0yMDEzIEFsZXhhbmRlciBDaGVtZXJpcwotLy8gCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotLy8gCi0vLyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLS8vICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vIAotLy8gICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0vLyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0vLyAKLS8vICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5Ci0vLyAgICAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0vLyAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8gCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0vLyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotLy8gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KLS8vIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLS8vIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotLy8gT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIAotLy8gV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLS8vIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLS8vIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIFRoZSBhYm92ZSBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IAotLy8gVEhMIEEyOSBMaW1pdGVkICgiVGVuY2VudCBNb2RpZmljYXRpb25zIikuIAotLy8gQWxsIFRlbmNlbnQgTW9kaWZpY2F0aW9ucyBhcmUgQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZC4KLQotI2lmbmRlZiBfTVNDX1ZFUiAvLyBbCi0jZXJyb3IgIlVzZSB0aGlzIGhlYWRlciBvbmx5IHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgY29tcGlsZXJzISIKLSNlbmRpZiAvLyBfTVNDX1ZFUiBdCi0KLSNpZm5kZWYgX01TQ19JTlRUWVBFU19IXyAvLyBbCi0jZGVmaW5lIF9NU0NfSU5UVFlQRVNfSF8KLQotI2lmIF9NU0NfVkVSID4gMTAwMAotI3ByYWdtYSBvbmNlCi0jZW5kaWYKLQotI2luY2x1ZGUgInN0ZGludC5oIgotCi0vLyBtaWxveWlwOiBWQyBzdXBwb3J0cyBpbnR0eXBlcy5oIHNpbmNlIFZDMjAxMwotI2lmIF9NU0NfVkVSID49IDE4MDAKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2Vsc2UKLQotLy8gNy44IEZvcm1hdCBjb252ZXJzaW9uIG9mIGludGVnZXIgdHlwZXMKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgaW50bWF4X3QgcXVvdDsKLSAgIGludG1heF90IHJlbTsKLX0gaW1heGRpdl90OwotCi0vLyA3LjguMSBNYWNyb3MgZm9yIGZvcm1hdCBzcGVjaWZpZXJzCi0KLSNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX1NURENfRk9STUFUX01BQ1JPUykgLy8gWyAgIFNlZSBmb290bm90ZSAxODUgYXQgcGFnZSAxOTgKLQotLy8gVGhlIGZwcmludGYgbWFjcm9zIGZvciBzaWduZWQgaW50ZWdlcnMgYXJlOgotI2RlZmluZSBQUklkOCAgICAgICAiZCIKLSNkZWZpbmUgUFJJaTggICAgICAgImkiCi0jZGVmaW5lIFBSSWRMRUFTVDggICJkIgotI2RlZmluZSBQUklpTEVBU1Q4ICAiaSIKLSNkZWZpbmUgUFJJZEZBU1Q4ICAgImQiCi0jZGVmaW5lIFBSSWlGQVNUOCAgICJpIgotCi0jZGVmaW5lIFBSSWQxNiAgICAgICAiaGQiCi0jZGVmaW5lIFBSSWkxNiAgICAgICAiaGkiCi0jZGVmaW5lIFBSSWRMRUFTVDE2ICAiaGQiCi0jZGVmaW5lIFBSSWlMRUFTVDE2ICAiaGkiCi0jZGVmaW5lIFBSSWRGQVNUMTYgICAiaGQiCi0jZGVmaW5lIFBSSWlGQVNUMTYgICAiaGkiCi0KLSNkZWZpbmUgUFJJZDMyICAgICAgICJJMzJkIgotI2RlZmluZSBQUklpMzIgICAgICAgIkkzMmkiCi0jZGVmaW5lIFBSSWRMRUFTVDMyICAiSTMyZCIKLSNkZWZpbmUgUFJJaUxFQVNUMzIgICJJMzJpIgotI2RlZmluZSBQUklkRkFTVDMyICAgIkkzMmQiCi0jZGVmaW5lIFBSSWlGQVNUMzIgICAiSTMyaSIKLQotI2RlZmluZSBQUklkNjQgICAgICAgIkk2NGQiCi0jZGVmaW5lIFBSSWk2NCAgICAgICAiSTY0aSIKLSNkZWZpbmUgUFJJZExFQVNUNjQgICJJNjRkIgotI2RlZmluZSBQUklpTEVBU1Q2NCAgIkk2NGkiCi0jZGVmaW5lIFBSSWRGQVNUNjQgICAiSTY0ZCIKLSNkZWZpbmUgUFJJaUZBU1Q2NCAgICJJNjRpIgotCi0jZGVmaW5lIFBSSWRNQVggICAgICJJNjRkIgotI2RlZmluZSBQUklpTUFYICAgICAiSTY0aSIKLQotI2RlZmluZSBQUklkUFRSICAgICAiSWQiCi0jZGVmaW5lIFBSSWlQVFIgICAgICJJaSIKLQotLy8gVGhlIGZwcmludGYgbWFjcm9zIGZvciB1bnNpZ25lZCBpbnRlZ2VycyBhcmU6Ci0jZGVmaW5lIFBSSW84ICAgICAgICJvIgotI2RlZmluZSBQUkl1OCAgICAgICAidSIKLSNkZWZpbmUgUFJJeDggICAgICAgIngiCi0jZGVmaW5lIFBSSVg4ICAgICAgICJYIgotI2RlZmluZSBQUklvTEVBU1Q4ICAibyIKLSNkZWZpbmUgUFJJdUxFQVNUOCAgInUiCi0jZGVmaW5lIFBSSXhMRUFTVDggICJ4IgotI2RlZmluZSBQUklYTEVBU1Q4ICAiWCIKLSNkZWZpbmUgUFJJb0ZBU1Q4ICAgIm8iCi0jZGVmaW5lIFBSSXVGQVNUOCAgICJ1IgotI2RlZmluZSBQUkl4RkFTVDggICAieCIKLSNkZWZpbmUgUFJJWEZBU1Q4ICAgIlgiCi0KLSNkZWZpbmUgUFJJbzE2ICAgICAgICJobyIKLSNkZWZpbmUgUFJJdTE2ICAgICAgICJodSIKLSNkZWZpbmUgUFJJeDE2ICAgICAgICJoeCIKLSNkZWZpbmUgUFJJWDE2ICAgICAgICJoWCIKLSNkZWZpbmUgUFJJb0xFQVNUMTYgICJobyIKLSNkZWZpbmUgUFJJdUxFQVNUMTYgICJodSIKLSNkZWZpbmUgUFJJeExFQVNUMTYgICJoeCIKLSNkZWZpbmUgUFJJWExFQVNUMTYgICJoWCIKLSNkZWZpbmUgUFJJb0ZBU1QxNiAgICJobyIKLSNkZWZpbmUgUFJJdUZBU1QxNiAgICJodSIKLSNkZWZpbmUgUFJJeEZBU1QxNiAgICJoeCIKLSNkZWZpbmUgUFJJWEZBU1QxNiAgICJoWCIKLQotI2RlZmluZSBQUklvMzIgICAgICAgIkkzMm8iCi0jZGVmaW5lIFBSSXUzMiAgICAgICAiSTMydSIKLSNkZWZpbmUgUFJJeDMyICAgICAgICJJMzJ4IgotI2RlZmluZSBQUklYMzIgICAgICAgIkkzMlgiCi0jZGVmaW5lIFBSSW9MRUFTVDMyICAiSTMybyIKLSNkZWZpbmUgUFJJdUxFQVNUMzIgICJJMzJ1IgotI2RlZmluZSBQUkl4TEVBU1QzMiAgIkkzMngiCi0jZGVmaW5lIFBSSVhMRUFTVDMyICAiSTMyWCIKLSNkZWZpbmUgUFJJb0ZBU1QzMiAgICJJMzJvIgotI2RlZmluZSBQUkl1RkFTVDMyICAgIkkzMnUiCi0jZGVmaW5lIFBSSXhGQVNUMzIgICAiSTMyeCIKLSNkZWZpbmUgUFJJWEZBU1QzMiAgICJJMzJYIgotCi0jZGVmaW5lIFBSSW82NCAgICAgICAiSTY0byIKLSNkZWZpbmUgUFJJdTY0ICAgICAgICJJNjR1IgotI2RlZmluZSBQUkl4NjQgICAgICAgIkk2NHgiCi0jZGVmaW5lIFBSSVg2NCAgICAgICAiSTY0WCIKLSNkZWZpbmUgUFJJb0xFQVNUNjQgICJJNjRvIgotI2RlZmluZSBQUkl1TEVBU1Q2NCAgIkk2NHUiCi0jZGVmaW5lIFBSSXhMRUFTVDY0ICAiSTY0eCIKLSNkZWZpbmUgUFJJWExFQVNUNjQgICJJNjRYIgotI2RlZmluZSBQUklvRkFTVDY0ICAgIkk2NG8iCi0jZGVmaW5lIFBSSXVGQVNUNjQgICAiSTY0dSIKLSNkZWZpbmUgUFJJeEZBU1Q2NCAgICJJNjR4IgotI2RlZmluZSBQUklYRkFTVDY0ICAgIkk2NFgiCi0KLSNkZWZpbmUgUFJJb01BWCAgICAgIkk2NG8iCi0jZGVmaW5lIFBSSXVNQVggICAgICJJNjR1IgotI2RlZmluZSBQUkl4TUFYICAgICAiSTY0eCIKLSNkZWZpbmUgUFJJWE1BWCAgICAgIkk2NFgiCi0KLSNkZWZpbmUgUFJJb1BUUiAgICAgIklvIgotI2RlZmluZSBQUkl1UFRSICAgICAiSXUiCi0jZGVmaW5lIFBSSXhQVFIgICAgICJJeCIKLSNkZWZpbmUgUFJJWFBUUiAgICAgIklYIgotCi0vLyBUaGUgZnNjYW5mIG1hY3JvcyBmb3Igc2lnbmVkIGludGVnZXJzIGFyZToKLSNkZWZpbmUgU0NOZDggICAgICAgImQiCi0jZGVmaW5lIFNDTmk4ICAgICAgICJpIgotI2RlZmluZSBTQ05kTEVBU1Q4ICAiZCIKLSNkZWZpbmUgU0NOaUxFQVNUOCAgImkiCi0jZGVmaW5lIFNDTmRGQVNUOCAgICJkIgotI2RlZmluZSBTQ05pRkFTVDggICAiaSIKLQotI2RlZmluZSBTQ05kMTYgICAgICAgImhkIgotI2RlZmluZSBTQ05pMTYgICAgICAgImhpIgotI2RlZmluZSBTQ05kTEVBU1QxNiAgImhkIgotI2RlZmluZSBTQ05pTEVBU1QxNiAgImhpIgotI2RlZmluZSBTQ05kRkFTVDE2ICAgImhkIgotI2RlZmluZSBTQ05pRkFTVDE2ICAgImhpIgotCi0jZGVmaW5lIFNDTmQzMiAgICAgICAibGQiCi0jZGVmaW5lIFNDTmkzMiAgICAgICAibGkiCi0jZGVmaW5lIFNDTmRMRUFTVDMyICAibGQiCi0jZGVmaW5lIFNDTmlMRUFTVDMyICAibGkiCi0jZGVmaW5lIFNDTmRGQVNUMzIgICAibGQiCi0jZGVmaW5lIFNDTmlGQVNUMzIgICAibGkiCi0KLSNkZWZpbmUgU0NOZDY0ICAgICAgICJJNjRkIgotI2RlZmluZSBTQ05pNjQgICAgICAgIkk2NGkiCi0jZGVmaW5lIFNDTmRMRUFTVDY0ICAiSTY0ZCIKLSNkZWZpbmUgU0NOaUxFQVNUNjQgICJJNjRpIgotI2RlZmluZSBTQ05kRkFTVDY0ICAgIkk2NGQiCi0jZGVmaW5lIFNDTmlGQVNUNjQgICAiSTY0aSIKLQotI2RlZmluZSBTQ05kTUFYICAgICAiSTY0ZCIKLSNkZWZpbmUgU0NOaU1BWCAgICAgIkk2NGkiCi0KLSNpZmRlZiBfV0lONjQgLy8gWwotIyAgZGVmaW5lIFNDTmRQVFIgICAgICJJNjRkIgotIyAgZGVmaW5lIFNDTmlQVFIgICAgICJJNjRpIgotI2Vsc2UgIC8vIF9XSU42NCBdWwotIyAgZGVmaW5lIFNDTmRQVFIgICAgICJsZCIKLSMgIGRlZmluZSBTQ05pUFRSICAgICAibGkiCi0jZW5kaWYgIC8vIF9XSU42NCBdCi0KLS8vIFRoZSBmc2NhbmYgbWFjcm9zIGZvciB1bnNpZ25lZCBpbnRlZ2VycyBhcmU6Ci0jZGVmaW5lIFNDTm84ICAgICAgICJvIgotI2RlZmluZSBTQ051OCAgICAgICAidSIKLSNkZWZpbmUgU0NOeDggICAgICAgIngiCi0jZGVmaW5lIFNDTlg4ICAgICAgICJYIgotI2RlZmluZSBTQ05vTEVBU1Q4ICAibyIKLSNkZWZpbmUgU0NOdUxFQVNUOCAgInUiCi0jZGVmaW5lIFNDTnhMRUFTVDggICJ4IgotI2RlZmluZSBTQ05YTEVBU1Q4ICAiWCIKLSNkZWZpbmUgU0NOb0ZBU1Q4ICAgIm8iCi0jZGVmaW5lIFNDTnVGQVNUOCAgICJ1IgotI2RlZmluZSBTQ054RkFTVDggICAieCIKLSNkZWZpbmUgU0NOWEZBU1Q4ICAgIlgiCi0KLSNkZWZpbmUgU0NObzE2ICAgICAgICJobyIKLSNkZWZpbmUgU0NOdTE2ICAgICAgICJodSIKLSNkZWZpbmUgU0NOeDE2ICAgICAgICJoeCIKLSNkZWZpbmUgU0NOWDE2ICAgICAgICJoWCIKLSNkZWZpbmUgU0NOb0xFQVNUMTYgICJobyIKLSNkZWZpbmUgU0NOdUxFQVNUMTYgICJodSIKLSNkZWZpbmUgU0NOeExFQVNUMTYgICJoeCIKLSNkZWZpbmUgU0NOWExFQVNUMTYgICJoWCIKLSNkZWZpbmUgU0NOb0ZBU1QxNiAgICJobyIKLSNkZWZpbmUgU0NOdUZBU1QxNiAgICJodSIKLSNkZWZpbmUgU0NOeEZBU1QxNiAgICJoeCIKLSNkZWZpbmUgU0NOWEZBU1QxNiAgICJoWCIKLQotI2RlZmluZSBTQ05vMzIgICAgICAgImxvIgotI2RlZmluZSBTQ051MzIgICAgICAgImx1IgotI2RlZmluZSBTQ054MzIgICAgICAgImx4IgotI2RlZmluZSBTQ05YMzIgICAgICAgImxYIgotI2RlZmluZSBTQ05vTEVBU1QzMiAgImxvIgotI2RlZmluZSBTQ051TEVBU1QzMiAgImx1IgotI2RlZmluZSBTQ054TEVBU1QzMiAgImx4IgotI2RlZmluZSBTQ05YTEVBU1QzMiAgImxYIgotI2RlZmluZSBTQ05vRkFTVDMyICAgImxvIgotI2RlZmluZSBTQ051RkFTVDMyICAgImx1IgotI2RlZmluZSBTQ054RkFTVDMyICAgImx4IgotI2RlZmluZSBTQ05YRkFTVDMyICAgImxYIgotCi0jZGVmaW5lIFNDTm82NCAgICAgICAiSTY0byIKLSNkZWZpbmUgU0NOdTY0ICAgICAgICJJNjR1IgotI2RlZmluZSBTQ054NjQgICAgICAgIkk2NHgiCi0jZGVmaW5lIFNDTlg2NCAgICAgICAiSTY0WCIKLSNkZWZpbmUgU0NOb0xFQVNUNjQgICJJNjRvIgotI2RlZmluZSBTQ051TEVBU1Q2NCAgIkk2NHUiCi0jZGVmaW5lIFNDTnhMRUFTVDY0ICAiSTY0eCIKLSNkZWZpbmUgU0NOWExFQVNUNjQgICJJNjRYIgotI2RlZmluZSBTQ05vRkFTVDY0ICAgIkk2NG8iCi0jZGVmaW5lIFNDTnVGQVNUNjQgICAiSTY0dSIKLSNkZWZpbmUgU0NOeEZBU1Q2NCAgICJJNjR4IgotI2RlZmluZSBTQ05YRkFTVDY0ICAgIkk2NFgiCi0KLSNkZWZpbmUgU0NOb01BWCAgICAgIkk2NG8iCi0jZGVmaW5lIFNDTnVNQVggICAgICJJNjR1IgotI2RlZmluZSBTQ054TUFYICAgICAiSTY0eCIKLSNkZWZpbmUgU0NOWE1BWCAgICAgIkk2NFgiCi0KLSNpZmRlZiBfV0lONjQgLy8gWwotIyAgZGVmaW5lIFNDTm9QVFIgICAgICJJNjRvIgotIyAgZGVmaW5lIFNDTnVQVFIgICAgICJJNjR1IgotIyAgZGVmaW5lIFNDTnhQVFIgICAgICJJNjR4IgotIyAgZGVmaW5lIFNDTlhQVFIgICAgICJJNjRYIgotI2Vsc2UgIC8vIF9XSU42NCBdWwotIyAgZGVmaW5lIFNDTm9QVFIgICAgICJsbyIKLSMgIGRlZmluZSBTQ051UFRSICAgICAibHUiCi0jICBkZWZpbmUgU0NOeFBUUiAgICAgImx4IgotIyAgZGVmaW5lIFNDTlhQVFIgICAgICJsWCIKLSNlbmRpZiAgLy8gX1dJTjY0IF0KLQotI2VuZGlmIC8vIF9fU1REQ19GT1JNQVRfTUFDUk9TIF0KLQotLy8gNy44LjIgRnVuY3Rpb25zIGZvciBncmVhdGVzdC13aWR0aCBpbnRlZ2VyIHR5cGVzCi0KLS8vIDcuOC4yLjEgVGhlIGltYXhhYnMgZnVuY3Rpb24KLSNkZWZpbmUgaW1heGFicyBfYWJzNjQKLQotLy8gNy44LjIuMiBUaGUgaW1heGRpdiBmdW5jdGlvbgotCi0vLyBUaGlzIGlzIG1vZGlmaWVkIHZlcnNpb24gb2YgZGl2KCkgZnVuY3Rpb24gZnJvbSBNaWNyb3NvZnQncyBkaXYuYyBmb3VuZAotLy8gaW4gJU1TVkMuTkVUJVxjcnRcc3JjXGRpdi5jCi0jaWZkZWYgU1RBVElDX0lNQVhESVYgLy8gWwotc3RhdGljCi0jZWxzZSAvLyBTVEFUSUNfSU1BWERJViBdWwotX2lubGluZQotI2VuZGlmIC8vIFNUQVRJQ19JTUFYRElWIF0KLWltYXhkaXZfdCBfX2NkZWNsIGltYXhkaXYoaW50bWF4X3QgbnVtZXIsIGludG1heF90IGRlbm9tKQotewotICAgaW1heGRpdl90IHJlc3VsdDsKLQotICAgcmVzdWx0LnF1b3QgPSBudW1lciAvIGRlbm9tOwotICAgcmVzdWx0LnJlbSA9IG51bWVyICUgZGVub207Ci0KLSAgIGlmIChudW1lciA8IDAgJiYgcmVzdWx0LnJlbSA+IDApIHsKLSAgICAgIC8vIGRpZCBkaXZpc2lvbiB3cm9uZzsgbXVzdCBmaXggdXAKLSAgICAgICsrcmVzdWx0LnF1b3Q7Ci0gICAgICByZXN1bHQucmVtIC09IGRlbm9tOwotICAgfQotCi0gICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyA3LjguMi4zIFRoZSBzdHJ0b2ltYXggYW5kIHN0cnRvdW1heCBmdW5jdGlvbnMKLSNkZWZpbmUgc3RydG9pbWF4IF9zdHJ0b2k2NAotI2RlZmluZSBzdHJ0b3VtYXggX3N0cnRvdWk2NAotCi0vLyA3LjguMi40IFRoZSB3Y3N0b2ltYXggYW5kIHdjc3RvdW1heCBmdW5jdGlvbnMKLSNkZWZpbmUgd2NzdG9pbWF4IF93Y3N0b2k2NAotI2RlZmluZSB3Y3N0b3VtYXggX3djc3RvdWk2NAotCi0jZW5kaWYgLy8gX01TQ19WRVIgPj0gMTgwMAotCi0jZW5kaWYgLy8gX01TQ19JTlRUWVBFU19IXyBdCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL21zaW50dHlwZXMvc3RkaW50LmggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL21zaW50dHlwZXMvc3RkaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNDQ3N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9tc2ludHR5cGVzL3N0ZGludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8vIElTTyBDOXggIGNvbXBsaWFudCBzdGRpbnQuaCBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8KLS8vIEJhc2VkIG9uIElTTy9JRUMgOTg5OTpUQzIgQ29tbWl0dGVlIGRyYWZ0IChNYXkgNiwgMjAwNSkgV0cxNC9OMTEyNCAKLS8vIAotLy8gIENvcHlyaWdodCAoYykgMjAwNi0yMDEzIEFsZXhhbmRlciBDaGVtZXJpcwotLy8gCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotLy8gCi0vLyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLS8vICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vIAotLy8gICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0vLyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0vLyAKLS8vICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5Ci0vLyAgICAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0vLyAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8gCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0vLyBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotLy8gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KLS8vIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLS8vIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotLy8gT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIAotLy8gV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLS8vIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLS8vIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLy8gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIFRoZSBhYm92ZSBzb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IAotLy8gVEhMIEEyOSBMaW1pdGVkICgiVGVuY2VudCBNb2RpZmljYXRpb25zIikuIAotLy8gQWxsIFRlbmNlbnQgTW9kaWZpY2F0aW9ucyBhcmUgQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZC4KLQotI2lmbmRlZiBfTVNDX1ZFUiAvLyBbCi0jZXJyb3IgIlVzZSB0aGlzIGhlYWRlciBvbmx5IHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgY29tcGlsZXJzISIKLSNlbmRpZiAvLyBfTVNDX1ZFUiBdCi0KLSNpZm5kZWYgX01TQ19TVERJTlRfSF8gLy8gWwotI2RlZmluZSBfTVNDX1NURElOVF9IXwotCi0jaWYgX01TQ19WRVIgPiAxMDAwCi0jcHJhZ21hIG9uY2UKLSNlbmRpZgotCi0vLyBtaWxveWlwOiBPcmlnaW5hbGx5IFZpc3VhbCBTdHVkaW8gMjAxMCB1c2VzIGl0cyBvd24gc3RkaW50LmguIEhvd2V2ZXIgaXQgZ2VuZXJhdGVzIHdhcm5pbmcgd2l0aCBJTlQ2NF9DKCksIHNvIGNoYW5nZSB0byB1c2UgdGhpcyBmaWxlIGZvciB2czIwMTAuCi0jaWYgX01TQ19WRVIgPj0gMTYwMCAvLyBbCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX1NURENfQ09OU1RBTlRfTUFDUk9TKSAvLyBbICAgU2VlIGZvb3Rub3RlIDIyNCBhdCBwYWdlIDI2MAotCi0jdW5kZWYgSU5UOF9DCi0jdW5kZWYgSU5UMTZfQwotI3VuZGVmIElOVDMyX0MKLSN1bmRlZiBJTlQ2NF9DCi0jdW5kZWYgVUlOVDhfQwotI3VuZGVmIFVJTlQxNl9DCi0jdW5kZWYgVUlOVDMyX0MKLSN1bmRlZiBVSU5UNjRfQwotCi0vLyA3LjE4LjQuMSBNYWNyb3MgZm9yIG1pbmltdW0td2lkdGggaW50ZWdlciBjb25zdGFudHMKLQotI2RlZmluZSBJTlQ4X0ModmFsKSAgdmFsIyNpOAotI2RlZmluZSBJTlQxNl9DKHZhbCkgdmFsIyNpMTYKLSNkZWZpbmUgSU5UMzJfQyh2YWwpIHZhbCMjaTMyCi0jZGVmaW5lIElOVDY0X0ModmFsKSB2YWwjI2k2NAotCi0jZGVmaW5lIFVJTlQ4X0ModmFsKSAgdmFsIyN1aTgKLSNkZWZpbmUgVUlOVDE2X0ModmFsKSB2YWwjI3VpMTYKLSNkZWZpbmUgVUlOVDMyX0ModmFsKSB2YWwjI3VpMzIKLSNkZWZpbmUgVUlOVDY0X0ModmFsKSB2YWwjI3VpNjQKLQotLy8gNy4xOC40LjIgTWFjcm9zIGZvciBncmVhdGVzdC13aWR0aCBpbnRlZ2VyIGNvbnN0YW50cwotLy8gVGhlc2UgI2lmbmRlZidzIGFyZSBuZWVkZWQgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGggPGJvb3N0L2NzdGRpbnQuaHBwPi4KLS8vIENoZWNrIG91dCBJc3N1ZSA5IGZvciB0aGUgZGV0YWlscy4KLSNpZm5kZWYgSU5UTUFYX0MgLy8gICBbCi0jICBkZWZpbmUgSU5UTUFYX0MgICBJTlQ2NF9DCi0jZW5kaWYgLy8gSU5UTUFYX0MgICAgXQotI2lmbmRlZiBVSU5UTUFYX0MgLy8gIFsKLSMgIGRlZmluZSBVSU5UTUFYX0MgIFVJTlQ2NF9DCi0jZW5kaWYgLy8gVUlOVE1BWF9DICAgXQotCi0jZW5kaWYgLy8gX19TVERDX0NPTlNUQU5UX01BQ1JPUyBdCi0KLSNlbHNlIC8vIF0gX01TQ19WRVIgPj0gMTcwMCBbCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotLy8gRm9yIFZpc3VhbCBTdHVkaW8gNiBpbiBDKysgbW9kZSBhbmQgZm9yIG1hbnkgVmlzdWFsIFN0dWRpbyB2ZXJzaW9ucyB3aGVuCi0vLyBjb21waWxpbmcgZm9yIEFSTSB3ZSBoYXZlIHRvIHdyYXAgPHdjaGFyLmg+IGluY2x1ZGUgd2l0aCAnZXh0ZXJuICJDKysiIHt9JwotLy8gb3IgY29tcGlsZXIgd291bGQgZ2l2ZSBtYW55IGVycm9ycyBsaWtlIHRoaXM6Ci0vLyAgIGVycm9yIEMyNzMzOiBzZWNvbmQgQyBsaW5rYWdlIG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ3dtZW1jaHInIG5vdCBhbGxvd2VkCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoX01fQVJNKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLSMgIGluY2x1ZGUgPHdjaGFyLmg+Ci0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoX01fQVJNKQotfQotI2VuZGlmCi0KLS8vIERlZmluZSBfVzY0IG1hY3JvcyB0byBtYXJrIHR5cGVzIGNoYW5naW5nIHRoZWlyIHNpemUsIGxpa2UgaW50cHRyX3QuCi0jaWZuZGVmIF9XNjQKLSMgIGlmICFkZWZpbmVkKF9fbWlkbCkgJiYgKGRlZmluZWQoX1g4Nl8pIHx8IGRlZmluZWQoX01fSVg4NikpICYmIF9NU0NfVkVSID49IDEzMDAKLSMgICAgIGRlZmluZSBfVzY0IF9fdzY0Ci0jICBlbHNlCi0jICAgICBkZWZpbmUgX1c2NAotIyAgZW5kaWYKLSNlbmRpZgotCi0KLS8vIDcuMTguMSBJbnRlZ2VyIHR5cGVzCi0KLS8vIDcuMTguMS4xIEV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMKLQotLy8gVmlzdWFsIFN0dWRpbyA2IGFuZCBFbWJlZGRlZCBWaXN1YWwgQysrIDQgZG9lc24ndAotLy8gcmVhbGl6ZSB0aGF0LCBlLmcuIGNoYXIgaGFzIHRoZSBzYW1lIHNpemUgYXMgX19pbnQ4Ci0vLyBzbyB3ZSBnaXZlIHVwIG9uIF9faW50WCBmb3IgdGhlbS4KLSNpZiAoX01TQ19WRVIgPCAxMzAwKQotICAgdHlwZWRlZiBzaWduZWQgY2hhciAgICAgICBpbnQ4X3Q7Ci0gICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgICAgIGludDE2X3Q7Ci0gICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICAgIGludDMyX3Q7Ci0gICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgIHVpbnQ4X3Q7Ci0gICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgIHVpbnQxNl90OwotICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICB1aW50MzJfdDsKLSNlbHNlCi0gICB0eXBlZGVmIHNpZ25lZCBfX2ludDggICAgIGludDhfdDsKLSAgIHR5cGVkZWYgc2lnbmVkIF9faW50MTYgICAgaW50MTZfdDsKLSAgIHR5cGVkZWYgc2lnbmVkIF9faW50MzIgICAgaW50MzJfdDsKLSAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ4ICAgdWludDhfdDsKLSAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQxNiAgdWludDE2X3Q7Ci0gICB0eXBlZGVmIHVuc2lnbmVkIF9faW50MzIgIHVpbnQzMl90OwotI2VuZGlmCi10eXBlZGVmIHNpZ25lZCBfX2ludDY0ICAgICAgIGludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgIHVpbnQ2NF90OwotCi0KLS8vIDcuMTguMS4yIE1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcwotdHlwZWRlZiBpbnQ4X3QgICAgaW50X2xlYXN0OF90OwotdHlwZWRlZiBpbnQxNl90ICAgaW50X2xlYXN0MTZfdDsKLXR5cGVkZWYgaW50MzJfdCAgIGludF9sZWFzdDMyX3Q7Ci10eXBlZGVmIGludDY0X3QgICBpbnRfbGVhc3Q2NF90OwotdHlwZWRlZiB1aW50OF90ICAgdWludF9sZWFzdDhfdDsKLXR5cGVkZWYgdWludDE2X3QgIHVpbnRfbGVhc3QxNl90OwotdHlwZWRlZiB1aW50MzJfdCAgdWludF9sZWFzdDMyX3Q7Ci10eXBlZGVmIHVpbnQ2NF90ICB1aW50X2xlYXN0NjRfdDsKLQotLy8gNy4xOC4xLjMgRmFzdGVzdCBtaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMKLXR5cGVkZWYgaW50OF90ICAgIGludF9mYXN0OF90OwotdHlwZWRlZiBpbnQxNl90ICAgaW50X2Zhc3QxNl90OwotdHlwZWRlZiBpbnQzMl90ICAgaW50X2Zhc3QzMl90OwotdHlwZWRlZiBpbnQ2NF90ICAgaW50X2Zhc3Q2NF90OwotdHlwZWRlZiB1aW50OF90ICAgdWludF9mYXN0OF90OwotdHlwZWRlZiB1aW50MTZfdCAgdWludF9mYXN0MTZfdDsKLXR5cGVkZWYgdWludDMyX3QgIHVpbnRfZmFzdDMyX3Q7Ci10eXBlZGVmIHVpbnQ2NF90ICB1aW50X2Zhc3Q2NF90OwotCi0vLyA3LjE4LjEuNCBJbnRlZ2VyIHR5cGVzIGNhcGFibGUgb2YgaG9sZGluZyBvYmplY3QgcG9pbnRlcnMKLSNpZmRlZiBfV0lONjQgLy8gWwotICAgdHlwZWRlZiBzaWduZWQgX19pbnQ2NCAgICBpbnRwdHJfdDsKLSAgIHR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgdWludHB0cl90OwotI2Vsc2UgLy8gX1dJTjY0IF1bCi0gICB0eXBlZGVmIF9XNjQgc2lnbmVkIGludCAgIGludHB0cl90OwotICAgdHlwZWRlZiBfVzY0IHVuc2lnbmVkIGludCB1aW50cHRyX3Q7Ci0jZW5kaWYgLy8gX1dJTjY0IF0KLQotLy8gNy4xOC4xLjUgR3JlYXRlc3Qtd2lkdGggaW50ZWdlciB0eXBlcwotdHlwZWRlZiBpbnQ2NF90ICAgaW50bWF4X3Q7Ci10eXBlZGVmIHVpbnQ2NF90ICB1aW50bWF4X3Q7Ci0KLQotLy8gNy4xOC4yIExpbWl0cyBvZiBzcGVjaWZpZWQtd2lkdGggaW50ZWdlciB0eXBlcwotCi0jaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19TVERDX0xJTUlUX01BQ1JPUykgLy8gWyAgIFNlZSBmb290bm90ZSAyMjAgYXQgcGFnZSAyNTcgYW5kIGZvb3Rub3RlIDIyMSBhdCBwYWdlIDI1OQotCi0vLyA3LjE4LjIuMSBMaW1pdHMgb2YgZXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcwotI2RlZmluZSBJTlQ4X01JTiAgICAgKChpbnQ4X3QpX0k4X01JTikKLSNkZWZpbmUgSU5UOF9NQVggICAgIF9JOF9NQVgKLSNkZWZpbmUgSU5UMTZfTUlOICAgICgoaW50MTZfdClfSTE2X01JTikKLSNkZWZpbmUgSU5UMTZfTUFYICAgIF9JMTZfTUFYCi0jZGVmaW5lIElOVDMyX01JTiAgICAoKGludDMyX3QpX0kzMl9NSU4pCi0jZGVmaW5lIElOVDMyX01BWCAgICBfSTMyX01BWAotI2RlZmluZSBJTlQ2NF9NSU4gICAgKChpbnQ2NF90KV9JNjRfTUlOKQotI2RlZmluZSBJTlQ2NF9NQVggICAgX0k2NF9NQVgKLSNkZWZpbmUgVUlOVDhfTUFYICAgIF9VSThfTUFYCi0jZGVmaW5lIFVJTlQxNl9NQVggICBfVUkxNl9NQVgKLSNkZWZpbmUgVUlOVDMyX01BWCAgIF9VSTMyX01BWAotI2RlZmluZSBVSU5UNjRfTUFYICAgX1VJNjRfTUFYCi0KLS8vIDcuMTguMi4yIExpbWl0cyBvZiBtaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMKLSNkZWZpbmUgSU5UX0xFQVNUOF9NSU4gICAgSU5UOF9NSU4KLSNkZWZpbmUgSU5UX0xFQVNUOF9NQVggICAgSU5UOF9NQVgKLSNkZWZpbmUgSU5UX0xFQVNUMTZfTUlOICAgSU5UMTZfTUlOCi0jZGVmaW5lIElOVF9MRUFTVDE2X01BWCAgIElOVDE2X01BWAotI2RlZmluZSBJTlRfTEVBU1QzMl9NSU4gICBJTlQzMl9NSU4KLSNkZWZpbmUgSU5UX0xFQVNUMzJfTUFYICAgSU5UMzJfTUFYCi0jZGVmaW5lIElOVF9MRUFTVDY0X01JTiAgIElOVDY0X01JTgotI2RlZmluZSBJTlRfTEVBU1Q2NF9NQVggICBJTlQ2NF9NQVgKLSNkZWZpbmUgVUlOVF9MRUFTVDhfTUFYICAgVUlOVDhfTUFYCi0jZGVmaW5lIFVJTlRfTEVBU1QxNl9NQVggIFVJTlQxNl9NQVgKLSNkZWZpbmUgVUlOVF9MRUFTVDMyX01BWCAgVUlOVDMyX01BWAotI2RlZmluZSBVSU5UX0xFQVNUNjRfTUFYICBVSU5UNjRfTUFYCi0KLS8vIDcuMTguMi4zIExpbWl0cyBvZiBmYXN0ZXN0IG1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcwotI2RlZmluZSBJTlRfRkFTVDhfTUlOICAgIElOVDhfTUlOCi0jZGVmaW5lIElOVF9GQVNUOF9NQVggICAgSU5UOF9NQVgKLSNkZWZpbmUgSU5UX0ZBU1QxNl9NSU4gICBJTlQxNl9NSU4KLSNkZWZpbmUgSU5UX0ZBU1QxNl9NQVggICBJTlQxNl9NQVgKLSNkZWZpbmUgSU5UX0ZBU1QzMl9NSU4gICBJTlQzMl9NSU4KLSNkZWZpbmUgSU5UX0ZBU1QzMl9NQVggICBJTlQzMl9NQVgKLSNkZWZpbmUgSU5UX0ZBU1Q2NF9NSU4gICBJTlQ2NF9NSU4KLSNkZWZpbmUgSU5UX0ZBU1Q2NF9NQVggICBJTlQ2NF9NQVgKLSNkZWZpbmUgVUlOVF9GQVNUOF9NQVggICBVSU5UOF9NQVgKLSNkZWZpbmUgVUlOVF9GQVNUMTZfTUFYICBVSU5UMTZfTUFYCi0jZGVmaW5lIFVJTlRfRkFTVDMyX01BWCAgVUlOVDMyX01BWAotI2RlZmluZSBVSU5UX0ZBU1Q2NF9NQVggIFVJTlQ2NF9NQVgKLQotLy8gNy4xOC4yLjQgTGltaXRzIG9mIGludGVnZXIgdHlwZXMgY2FwYWJsZSBvZiBob2xkaW5nIG9iamVjdCBwb2ludGVycwotI2lmZGVmIF9XSU42NCAvLyBbCi0jICBkZWZpbmUgSU5UUFRSX01JTiAgIElOVDY0X01JTgotIyAgZGVmaW5lIElOVFBUUl9NQVggICBJTlQ2NF9NQVgKLSMgIGRlZmluZSBVSU5UUFRSX01BWCAgVUlOVDY0X01BWAotI2Vsc2UgLy8gX1dJTjY0IF1bCi0jICBkZWZpbmUgSU5UUFRSX01JTiAgIElOVDMyX01JTgotIyAgZGVmaW5lIElOVFBUUl9NQVggICBJTlQzMl9NQVgKLSMgIGRlZmluZSBVSU5UUFRSX01BWCAgVUlOVDMyX01BWAotI2VuZGlmIC8vIF9XSU42NCBdCi0KLS8vIDcuMTguMi41IExpbWl0cyBvZiBncmVhdGVzdC13aWR0aCBpbnRlZ2VyIHR5cGVzCi0jZGVmaW5lIElOVE1BWF9NSU4gICBJTlQ2NF9NSU4KLSNkZWZpbmUgSU5UTUFYX01BWCAgIElOVDY0X01BWAotI2RlZmluZSBVSU5UTUFYX01BWCAgVUlOVDY0X01BWAotCi0vLyA3LjE4LjMgTGltaXRzIG9mIG90aGVyIGludGVnZXIgdHlwZXMKLQotI2lmZGVmIF9XSU42NCAvLyBbCi0jICBkZWZpbmUgUFRSRElGRl9NSU4gIF9JNjRfTUlOCi0jICBkZWZpbmUgUFRSRElGRl9NQVggIF9JNjRfTUFYCi0jZWxzZSAgLy8gX1dJTjY0IF1bCi0jICBkZWZpbmUgUFRSRElGRl9NSU4gIF9JMzJfTUlOCi0jICBkZWZpbmUgUFRSRElGRl9NQVggIF9JMzJfTUFYCi0jZW5kaWYgIC8vIF9XSU42NCBdCi0KLSNkZWZpbmUgU0lHX0FUT01JQ19NSU4gIElOVF9NSU4KLSNkZWZpbmUgU0lHX0FUT01JQ19NQVggIElOVF9NQVgKLQotI2lmbmRlZiBTSVpFX01BWCAvLyBbCi0jICBpZmRlZiBfV0lONjQgLy8gWwotIyAgICAgZGVmaW5lIFNJWkVfTUFYICBfVUk2NF9NQVgKLSMgIGVsc2UgLy8gX1dJTjY0IF1bCi0jICAgICBkZWZpbmUgU0laRV9NQVggIF9VSTMyX01BWAotIyAgZW5kaWYgLy8gX1dJTjY0IF0KLSNlbmRpZiAvLyBTSVpFX01BWCBdCi0KLS8vIFdDSEFSX01JTiBhbmQgV0NIQVJfTUFYIGFyZSBhbHNvIGRlZmluZWQgaW4gPHdjaGFyLmg+Ci0jaWZuZGVmIFdDSEFSX01JTiAvLyBbCi0jICBkZWZpbmUgV0NIQVJfTUlOICAwCi0jZW5kaWYgIC8vIFdDSEFSX01JTiBdCi0jaWZuZGVmIFdDSEFSX01BWCAvLyBbCi0jICBkZWZpbmUgV0NIQVJfTUFYICBfVUkxNl9NQVgKLSNlbmRpZiAgLy8gV0NIQVJfTUFYIF0KLQotI2RlZmluZSBXSU5UX01JTiAgMAotI2RlZmluZSBXSU5UX01BWCAgX1VJMTZfTUFYCi0KLSNlbmRpZiAvLyBfX1NURENfTElNSVRfTUFDUk9TIF0KLQotCi0vLyA3LjE4LjQgTGltaXRzIG9mIG90aGVyIGludGVnZXIgdHlwZXMKLQotI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fU1REQ19DT05TVEFOVF9NQUNST1MpIC8vIFsgICBTZWUgZm9vdG5vdGUgMjI0IGF0IHBhZ2UgMjYwCi0KLS8vIDcuMTguNC4xIE1hY3JvcyBmb3IgbWluaW11bS13aWR0aCBpbnRlZ2VyIGNvbnN0YW50cwotCi0jZGVmaW5lIElOVDhfQyh2YWwpICB2YWwjI2k4Ci0jZGVmaW5lIElOVDE2X0ModmFsKSB2YWwjI2kxNgotI2RlZmluZSBJTlQzMl9DKHZhbCkgdmFsIyNpMzIKLSNkZWZpbmUgSU5UNjRfQyh2YWwpIHZhbCMjaTY0Ci0KLSNkZWZpbmUgVUlOVDhfQyh2YWwpICB2YWwjI3VpOAotI2RlZmluZSBVSU5UMTZfQyh2YWwpIHZhbCMjdWkxNgotI2RlZmluZSBVSU5UMzJfQyh2YWwpIHZhbCMjdWkzMgotI2RlZmluZSBVSU5UNjRfQyh2YWwpIHZhbCMjdWk2NAotCi0vLyA3LjE4LjQuMiBNYWNyb3MgZm9yIGdyZWF0ZXN0LXdpZHRoIGludGVnZXIgY29uc3RhbnRzCi0vLyBUaGVzZSAjaWZuZGVmJ3MgYXJlIG5lZWRlZCB0byBwcmV2ZW50IGNvbGxpc2lvbnMgd2l0aCA8Ym9vc3QvY3N0ZGludC5ocHA+LgotLy8gQ2hlY2sgb3V0IElzc3VlIDkgZm9yIHRoZSBkZXRhaWxzLgotI2lmbmRlZiBJTlRNQVhfQyAvLyAgIFsKLSMgIGRlZmluZSBJTlRNQVhfQyAgIElOVDY0X0MKLSNlbmRpZiAvLyBJTlRNQVhfQyAgICBdCi0jaWZuZGVmIFVJTlRNQVhfQyAvLyAgWwotIyAgZGVmaW5lIFVJTlRNQVhfQyAgVUlOVDY0X0MKLSNlbmRpZiAvLyBVSU5UTUFYX0MgICBdCi0KLSNlbmRpZiAvLyBfX1NURENfQ09OU1RBTlRfTUFDUk9TIF0KLQotI2VuZGlmIC8vIF9NU0NfVkVSID49IDE2MDAgXQotCi0jZW5kaWYgLy8gX01TQ19TVERJTlRfSF8gXQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9vc3RyZWFtd3JhcHBlci5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9vc3RyZWFtd3JhcHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYzNmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vb3N0cmVhbXdyYXBwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUuCi0vLyAKLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0vLyB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgCi0vLyBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdHJlYW0uaCIKLSNpbmNsdWRlIDxpb3Nmd2Q+Ci0KLSNpZmRlZiBfX2NsYW5nX18KLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRihwYWRkZWQpCi0jZW5kaWYKLQotUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTgotCi0vLyEgV3JhcHBlciBvZiBcYyBzdGQ6OmJhc2ljX29zdHJlYW0gaW50byBSYXBpZEpTT04ncyBTdHJlYW0gY29uY2VwdC4KLS8qIQotICAgIFRoZSBjbGFzc2VzIGNhbiBiZSB3cmFwcGVkIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG86Ci0KLSAgICAtIFxjIHN0ZDo6b3N0cmluZ3N0cmVhbQotICAgIC0gXGMgc3RkOjpzdHJpbmdzdHJlYW0KLSAgICAtIFxjIHN0ZDo6d3BzdHJpbmdzdHJlYW0KLSAgICAtIFxjIHN0ZDo6d3N0cmluZ3N0cmVhbQotICAgIC0gXGMgc3RkOjppZnN0cmVhbQotICAgIC0gXGMgc3RkOjpmc3RyZWFtCi0gICAgLSBcYyBzdGQ6OndvZnN0cmVhbQotICAgIC0gXGMgc3RkOjp3ZnN0cmVhbQotCi0gICAgXHRwYXJhbSBTdHJlYW1UeXBlIENsYXNzIGRlcml2ZWQgZnJvbSBcYyBzdGQ6OmJhc2ljX29zdHJlYW0uCi0qLwotICAgCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyZWFtVHlwZT4KLWNsYXNzIEJhc2ljT1N0cmVhbVdyYXBwZXIgewotcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgU3RyZWFtVHlwZTo6Y2hhcl90eXBlIENoOwotICAgIEJhc2ljT1N0cmVhbVdyYXBwZXIoU3RyZWFtVHlwZSYgc3RyZWFtKSA6IHN0cmVhbV8oc3RyZWFtKSB7fQotCi0gICAgdm9pZCBQdXQoQ2ggYykgewotICAgICAgICBzdHJlYW1fLnB1dChjKTsKLSAgICB9Ci0KLSAgICB2b2lkIEZsdXNoKCkgewotICAgICAgICBzdHJlYW1fLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgLy8gTm90IGltcGxlbWVudGVkCi0gICAgY2hhciBQZWVrKCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLSAgICBjaGFyIFRha2UoKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyByZXR1cm4gMDsgfQotICAgIHNpemVfdCBUZWxsKCkgY29uc3QgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLSAgICBjaGFyKiBQdXRCZWdpbigpIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IHJldHVybiAwOyB9Ci0gICAgc2l6ZV90IFB1dEVuZChjaGFyKikgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLQotcHJpdmF0ZToKLSAgICBCYXNpY09TdHJlYW1XcmFwcGVyKGNvbnN0IEJhc2ljT1N0cmVhbVdyYXBwZXImKTsKLSAgICBCYXNpY09TdHJlYW1XcmFwcGVyJiBvcGVyYXRvcj0oY29uc3QgQmFzaWNPU3RyZWFtV3JhcHBlciYpOwotCi0gICAgU3RyZWFtVHlwZSYgc3RyZWFtXzsKLX07Ci0KLXR5cGVkZWYgQmFzaWNPU3RyZWFtV3JhcHBlcjxzdGQ6Om9zdHJlYW0+IE9TdHJlYW1XcmFwcGVyOwotdHlwZWRlZiBCYXNpY09TdHJlYW1XcmFwcGVyPHN0ZDo6d29zdHJlYW0+IFdPU3RyZWFtV3JhcHBlcjsKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUE9QCi0jZW5kaWYKLQotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vcG9pbnRlci5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9wb2ludGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDQ5MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9wb2ludGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQ1ICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUuCi0vLyAKLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0vLyB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgCi0vLyBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgUkFQSURKU09OX1BPSU5URVJfSF8KLSNkZWZpbmUgUkFQSURKU09OX1BPSU5URVJfSF8KLQotI2luY2x1ZGUgImRvY3VtZW50LmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwvaXRvYS5oIgotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QVVNICi1SQVBJREpTT05fRElBR19PRkYoc3dpdGNoLWVudW0pCi0jZW5kaWYKLQotUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTgotCi1zdGF0aWMgY29uc3QgU2l6ZVR5cGUga1BvaW50ZXJJbnZhbGlkSW5kZXggPSB+U2l6ZVR5cGUoMCk7ICAvLyE8IFJlcHJlc2VudHMgYW4gaW52YWxpZCBpbmRleCBpbiBHZW5lcmljUG9pbnRlcjo6VG9rZW4KLQotLy8hIEVycm9yIGNvZGUgb2YgcGFyc2luZy4KLS8qISBcaW5ncm91cCBSQVBJREpTT05fRVJST1JTCi0gICAgXHNlZSBHZW5lcmljUG9pbnRlcjo6R2VuZXJpY1BvaW50ZXIsIEdlbmVyaWNQb2ludGVyOjpHZXRQYXJzZUVycm9yQ29kZQotKi8KLWVudW0gUG9pbnRlclBhcnNlRXJyb3JDb2RlIHsKLSAgICBrUG9pbnRlclBhcnNlRXJyb3JOb25lID0gMCwgICAgICAgICAgICAgICAgICAgICAvLyE8IFRoZSBwYXJzZSBpcyBzdWNjZXNzZnVsCi0KLSAgICBrUG9pbnRlclBhcnNlRXJyb3JUb2tlbk11c3RCZWdpbldpdGhTb2xpZHVzLCAgICAvLyE8IEEgdG9rZW4gbXVzdCBiZWdpbiB3aXRoIGEgJy8nCi0gICAga1BvaW50ZXJQYXJzZUVycm9ySW52YWxpZEVzY2FwZSwgICAgICAgICAgICAgICAgLy8hPCBJbnZhbGlkIGVzY2FwZQotICAgIGtQb2ludGVyUGFyc2VFcnJvckludmFsaWRQZXJjZW50RW5jb2RpbmcsICAgICAgIC8vITwgSW52YWxpZCBwZXJjZW50IGVuY29kaW5nIGluIFVSSSBmcmFnbWVudAotICAgIGtQb2ludGVyUGFyc2VFcnJvckNoYXJhY3Rlck11c3RQZXJjZW50RW5jb2RlICAgIC8vITwgQSBjaGFyYWN0ZXIgbXVzdCBwZXJjZW50IGVuY29kZWQgaW4gVVJJIGZyYWdtZW50Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBHZW5lcmljUG9pbnRlcgotCi0vLyEgUmVwcmVzZW50cyBhIEpTT04gUG9pbnRlci4gVXNlIFBvaW50ZXIgZm9yIFVURjggZW5jb2RpbmcgYW5kIGRlZmF1bHQgYWxsb2NhdG9yLgotLyohCi0gICAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIFJGQyA2OTAxICJKYXZhU2NyaXB0IE9iamVjdCBOb3RhdGlvbiAoSlNPTikgUG9pbnRlciIgCi0gICAgKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2OTAxKS4KLQotICAgIEEgSlNPTiBwb2ludGVyIGlzIGZvciBpZGVudGlmeWluZyBhIHNwZWNpZmljIHZhbHVlIGluIGEgSlNPTiBkb2N1bWVudAotICAgIChHZW5lcmljRG9jdW1lbnQpLiBJdCBjYW4gc2ltcGxpZnkgY29kaW5nIG9mIERPTSB0cmVlIG1hbmlwdWxhdGlvbiwgYmVjYXVzZSBpdAotICAgIGNhbiBhY2Nlc3MgbXVsdGlwbGUtbGV2ZWwgZGVwdGggb2YgRE9NIHRyZWUgd2l0aCBzaW5nbGUgQVBJIGNhbGwuCi0KLSAgICBBZnRlciBpdCBwYXJzZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gKGUuZy4gIi9mb28vMCIgb3IgVVJJIGZyYWdtZW50IAotICAgIHJlcHJlc2VudGF0aW9uIChlLmcuICIjL2Zvby8wIikgaW50byBpdHMgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHRva2VucyksCi0gICAgaXQgY2FuIGJlIHVzZWQgdG8gcmVzb2x2ZSBhIHNwZWNpZmljIHZhbHVlIGluIG11bHRpcGxlIGRvY3VtZW50cywgb3Igc3ViLXRyZWUgCi0gICAgb2YgZG9jdW1lbnRzLgotCi0gICAgQ29udHJhcnkgdG8gR2VuZXJpY1ZhbHVlLCBQb2ludGVyIGNhbiBiZSBjb3B5IGNvbnN0cnVjdGVkIGFuZCBjb3B5IGFzc2lnbmVkLgotICAgIEFwYXJ0IGZyb20gYXNzaWdubWVudCwgYSBQb2ludGVyIGNhbm5vdCBiZSBtb2RpZmllZCBhZnRlciBjb25zdHJ1Y3Rpb24uCi0KLSAgICBBbHRob3VnaCBQb2ludGVyIGlzIHZlcnkgY29udmVuaWVudCwgcGxlYXNlIGF3YXJlIHRoYXQgY29uc3RydWN0aW5nIFBvaW50ZXIKLSAgICBpbnZvbHZlcyBwYXJzaW5nIGFuZCBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uLiBBIHNwZWNpYWwgY29uc3RydWN0b3Igd2l0aCB1c2VyLQotICAgIHN1cHBsaWVkIHRva2VucyBlbGltaW5hdGVzIHRoZXNlLgotCi0gICAgR2VuZXJpY1BvaW50ZXIgZGVwZW5kcyBvbiBHZW5lcmljRG9jdW1lbnQgYW5kIEdlbmVyaWNWYWx1ZS4KLSAgICAKLSAgICBcdHBhcmFtIFZhbHVlVHlwZSBUaGUgdmFsdWUgdHlwZSBvZiB0aGUgRE9NIHRyZWUuIEUuZy4gR2VuZXJpY1ZhbHVlPFVURjg8PiA+Ci0gICAgXHRwYXJhbSBBbGxvY2F0b3IgVGhlIGFsbG9jYXRvciB0eXBlIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCi0gICAgCi0gICAgXG5vdGUgR2VuZXJpY1BvaW50ZXIgdXNlcyBzYW1lIGVuY29kaW5nIG9mIFZhbHVlVHlwZS4KLSAgICBIb3dldmVyLCBBbGxvY2F0b3Igb2YgR2VuZXJpY1BvaW50ZXIgaXMgaW5kZXBlbmRlbnQgb2YgQWxsb2NhdG9yIG9mIFZhbHVlLgotKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5cGUsIHR5cGVuYW1lIEFsbG9jYXRvciA9IENydEFsbG9jYXRvcj4KLWNsYXNzIEdlbmVyaWNQb2ludGVyIHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZhbHVlVHlwZTo6RW5jb2RpbmdUeXBlIEVuY29kaW5nVHlwZTsgIC8vITwgRW5jb2RpbmcgdHlwZSBmcm9tIFZhbHVlCi0gICAgdHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGU6OkNoIENoOyAgICAgICAgICAgICAgICAgICAgICAvLyE8IENoYXJhY3RlciB0eXBlIGZyb20gVmFsdWUKLQotICAgIC8vISBBIHRva2VuIGlzIHRoZSBiYXNpYyB1bml0cyBvZiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KLSAgICAvKiEKLSAgICAgICAgQSBKU09OIHBvaW50ZXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uICIvZm9vLzEyMyIgaXMgcGFyc2VkIHRvIHR3byB0b2tlbnM6IAotICAgICAgICAiZm9vIiBhbmQgMTIzLiAxMjMgd2lsbCBiZSByZXByZXNlbnRlZCBpbiBib3RoIG51bWVyaWMgZm9ybSBhbmQgc3RyaW5nIGZvcm0uCi0gICAgICAgIFRoZXkgYXJlIHJlc29sdmVkIGFjY29yZGluZyB0byB0aGUgYWN0dWFsIHZhbHVlIHR5cGUgKG9iamVjdCBvciBhcnJheSkuCi0KLSAgICAgICAgRm9yIHRva2VuIHRoYXQgYXJlIG5vdCBudW1iZXJzLCBvciB0aGUgbnVtZXJpYyB2YWx1ZSBpcyBvdXQgb2YgYm91bmQKLSAgICAgICAgKGdyZWF0ZXIgdGhhbiBsaW1pdHMgb2YgU2l6ZVR5cGUpLCB0aGV5IGFyZSBvbmx5IHRyZWF0ZWQgYXMgc3RyaW5nIGZvcm0KLSAgICAgICAgKGkuZS4gdGhlIHRva2VuJ3MgaW5kZXggd2lsbCBiZSBlcXVhbCB0byBrUG9pbnRlckludmFsaWRJbmRleCkuCi0KLSAgICAgICAgVGhpcyBzdHJ1Y3QgaXMgcHVibGljIHNvIHRoYXQgdXNlciBjYW4gY3JlYXRlIGEgUG9pbnRlciB3aXRob3V0IHBhcnNpbmcgYW5kIAotICAgICAgICBhbGxvY2F0aW9uLCB1c2luZyBhIHNwZWNpYWwgY29uc3RydWN0b3IuCi0gICAgKi8KLSAgICBzdHJ1Y3QgVG9rZW4gewotICAgICAgICBjb25zdCBDaCogbmFtZTsgICAgICAgICAgICAgLy8hPCBOYW1lIG9mIHRoZSB0b2tlbi4gSXQgaGFzIG51bGwgY2hhcmFjdGVyIGF0IHRoZSBlbmQgYnV0IGl0IGNhbiBjb250YWluIG51bGwgY2hhcmFjdGVyLgotICAgICAgICBTaXplVHlwZSBsZW5ndGg7ICAgICAgICAgICAgLy8hPCBMZW5ndGggb2YgdGhlIG5hbWUuCi0gICAgICAgIFNpemVUeXBlIGluZGV4OyAgICAgICAgICAgICAvLyE8IEEgdmFsaWQgYXJyYXkgaW5kZXgsIGlmIGl0IGlzIG5vdCBlcXVhbCB0byBrUG9pbnRlckludmFsaWRJbmRleC4KLSAgICB9OwotCi0gICAgLy8hQG5hbWUgQ29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yLgotICAgIC8vQHsKLQotICAgIC8vISBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgIEdlbmVyaWNQb2ludGVyKEFsbG9jYXRvciogYWxsb2NhdG9yID0gMCkgOiBhbGxvY2F0b3JfKGFsbG9jYXRvciksIG93bkFsbG9jYXRvcl8oKSwgbmFtZUJ1ZmZlcl8oKSwgdG9rZW5zXygpLCB0b2tlbkNvdW50XygpLCBwYXJzZUVycm9yT2Zmc2V0XygpLCBwYXJzZUVycm9yQ29kZV8oa1BvaW50ZXJQYXJzZUVycm9yTm9uZSkge30KLQotICAgIC8vISBDb25zdHJ1Y3RvciB0aGF0IHBhcnNlcyBhIHN0cmluZyBvciBVUkkgZnJhZ21lbnQgcmVwcmVzZW50YXRpb24uCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBzb3VyY2UgQSBudWxsLXRlcm1pbmF0ZWQsIHN0cmluZyBvciBVUkkgZnJhZ21lbnQgcmVwcmVzZW50YXRpb24gb2YgSlNPTiBwb2ludGVyLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yIFVzZXIgc3VwcGxpZWQgYWxsb2NhdG9yIGZvciB0aGlzIHBvaW50ZXIuIElmIG5vIGFsbG9jYXRvciBpcyBwcm92aWRlZCwgaXQgY3JlYXRlcyBhIHNlbGYtb3duZWQgb25lLgotICAgICovCi0gICAgZXhwbGljaXQgR2VuZXJpY1BvaW50ZXIoY29uc3QgQ2gqIHNvdXJjZSwgQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwKSA6IGFsbG9jYXRvcl8oYWxsb2NhdG9yKSwgb3duQWxsb2NhdG9yXygpLCBuYW1lQnVmZmVyXygpLCB0b2tlbnNfKCksIHRva2VuQ291bnRfKCksIHBhcnNlRXJyb3JPZmZzZXRfKCksIHBhcnNlRXJyb3JDb2RlXyhrUG9pbnRlclBhcnNlRXJyb3JOb25lKSB7Ci0gICAgICAgIFBhcnNlKHNvdXJjZSwgaW50ZXJuYWw6OlN0ckxlbihzb3VyY2UpKTsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIC8vISBDb25zdHJ1Y3RvciB0aGF0IHBhcnNlcyBhIHN0cmluZyBvciBVUkkgZnJhZ21lbnQgcmVwcmVzZW50YXRpb24uCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBzb3VyY2UgQSBzdHJpbmcgb3IgVVJJIGZyYWdtZW50IHJlcHJlc2VudGF0aW9uIG9mIEpTT04gcG9pbnRlci4KLSAgICAgICAgXHBhcmFtIGFsbG9jYXRvciBVc2VyIHN1cHBsaWVkIGFsbG9jYXRvciBmb3IgdGhpcyBwb2ludGVyLiBJZiBubyBhbGxvY2F0b3IgaXMgcHJvdmlkZWQsIGl0IGNyZWF0ZXMgYSBzZWxmLW93bmVkIG9uZS4KLSAgICAgICAgXG5vdGUgUmVxdWlyZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByZXByb2Nlc3NvciBzeW1ib2wgXHJlZiBSQVBJREpTT05fSEFTX1NURFNUUklORy4KLSAgICAqLwotICAgIGV4cGxpY2l0IEdlbmVyaWNQb2ludGVyKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgc291cmNlLCBBbGxvY2F0b3IqIGFsbG9jYXRvciA9IDApIDogYWxsb2NhdG9yXyhhbGxvY2F0b3IpLCBvd25BbGxvY2F0b3JfKCksIG5hbWVCdWZmZXJfKCksIHRva2Vuc18oKSwgdG9rZW5Db3VudF8oKSwgcGFyc2VFcnJvck9mZnNldF8oKSwgcGFyc2VFcnJvckNvZGVfKGtQb2ludGVyUGFyc2VFcnJvck5vbmUpIHsKLSAgICAgICAgUGFyc2Uoc291cmNlLmNfc3RyKCksIHNvdXJjZS5zaXplKCkpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8hIENvbnN0cnVjdG9yIHRoYXQgcGFyc2VzIGEgc3RyaW5nIG9yIFVSSSBmcmFnbWVudCByZXByZXNlbnRhdGlvbiwgd2l0aCBsZW5ndGggb2YgdGhlIHNvdXJjZSBzdHJpbmcuCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBzb3VyY2UgQSBzdHJpbmcgb3IgVVJJIGZyYWdtZW50IHJlcHJlc2VudGF0aW9uIG9mIEpTT04gcG9pbnRlci4KLSAgICAgICAgXHBhcmFtIGxlbmd0aCBMZW5ndGggb2Ygc291cmNlLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yIFVzZXIgc3VwcGxpZWQgYWxsb2NhdG9yIGZvciB0aGlzIHBvaW50ZXIuIElmIG5vIGFsbG9jYXRvciBpcyBwcm92aWRlZCwgaXQgY3JlYXRlcyBhIHNlbGYtb3duZWQgb25lLgotICAgICAgICBcbm90ZSBTbGlnaHRseSBmYXN0ZXIgdGhhbiB0aGUgb3ZlcmxvYWQgd2l0aG91dCBsZW5ndGguCi0gICAgKi8KLSAgICBHZW5lcmljUG9pbnRlcihjb25zdCBDaCogc291cmNlLCBzaXplX3QgbGVuZ3RoLCBBbGxvY2F0b3IqIGFsbG9jYXRvciA9IDApIDogYWxsb2NhdG9yXyhhbGxvY2F0b3IpLCBvd25BbGxvY2F0b3JfKCksIG5hbWVCdWZmZXJfKCksIHRva2Vuc18oKSwgdG9rZW5Db3VudF8oKSwgcGFyc2VFcnJvck9mZnNldF8oKSwgcGFyc2VFcnJvckNvZGVfKGtQb2ludGVyUGFyc2VFcnJvck5vbmUpIHsKLSAgICAgICAgUGFyc2Uoc291cmNlLCBsZW5ndGgpOwotICAgIH0KLQotICAgIC8vISBDb25zdHJ1Y3RvciB3aXRoIHVzZXItc3VwcGxpZWQgdG9rZW5zLgotICAgIC8qIQotICAgICAgICBUaGlzIGNvbnN0cnVjdG9yIGxldCB1c2VyIHN1cHBsaWVzIGNvbnN0IGFycmF5IG9mIHRva2Vucy4KLSAgICAgICAgVGhpcyBwcmV2ZW50cyB0aGUgcGFyc2luZyBwcm9jZXNzIGFuZCBlbGltaW5hdGVzIGFsbG9jYXRpb24uCi0gICAgICAgIFRoaXMgaXMgcHJlZmVycmVkIGZvciBtZW1vcnkgY29uc3RyYWluZWQgZW52aXJvbm1lbnRzLgotCi0gICAgICAgIFxwYXJhbSB0b2tlbnMgQW4gY29uc3RhbnQgYXJyYXkgb2YgdG9rZW5zIHJlcHJlc2VudGluZyB0aGUgSlNPTiBwb2ludGVyLgotICAgICAgICBccGFyYW0gdG9rZW5Db3VudCBOdW1iZXIgb2YgdG9rZW5zLgotCi0gICAgICAgIFxiIEV4YW1wbGUKLSAgICAgICAgXGNvZGUKLSAgICAgICAgI2RlZmluZSBOQU1FKHMpIHsgcywgc2l6ZW9mKHMpIC8gc2l6ZW9mKHNbMF0pIC0gMSwga1BvaW50ZXJJbnZhbGlkSW5kZXggfQotICAgICAgICAjZGVmaW5lIElOREVYKGkpIHsgI2ksIHNpemVvZigjaSkgLSAxLCBpIH0KLQotICAgICAgICBzdGF0aWMgY29uc3QgUG9pbnRlcjo6VG9rZW4ga1Rva2Vuc1tdID0geyBOQU1FKCJmb28iKSwgSU5ERVgoMTIzKSB9OwotICAgICAgICBzdGF0aWMgY29uc3QgUG9pbnRlciBwKGtUb2tlbnMsIHNpemVvZihrVG9rZW5zKSAvIHNpemVvZihrVG9rZW5zWzBdKSk7Ci0gICAgICAgIC8vIEVxdWl2YWxlbnQgdG8gc3RhdGljIGNvbnN0IFBvaW50ZXIgcCgiL2Zvby8xMjMiKTsKLQotICAgICAgICAjdW5kZWYgTkFNRQotICAgICAgICAjdW5kZWYgSU5ERVgKLSAgICAgICAgXGVuZGNvZGUKLSAgICAqLwotICAgIEdlbmVyaWNQb2ludGVyKGNvbnN0IFRva2VuKiB0b2tlbnMsIHNpemVfdCB0b2tlbkNvdW50KSA6IGFsbG9jYXRvcl8oKSwgb3duQWxsb2NhdG9yXygpLCBuYW1lQnVmZmVyXygpLCB0b2tlbnNfKGNvbnN0X2Nhc3Q8VG9rZW4qPih0b2tlbnMpKSwgdG9rZW5Db3VudF8odG9rZW5Db3VudCksIHBhcnNlRXJyb3JPZmZzZXRfKCksIHBhcnNlRXJyb3JDb2RlXyhrUG9pbnRlclBhcnNlRXJyb3JOb25lKSB7fQotCi0gICAgLy8hIENvcHkgY29uc3RydWN0b3IuCi0gICAgR2VuZXJpY1BvaW50ZXIoY29uc3QgR2VuZXJpY1BvaW50ZXImIHJocywgQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwKSA6IGFsbG9jYXRvcl8oYWxsb2NhdG9yKSwgb3duQWxsb2NhdG9yXygpLCBuYW1lQnVmZmVyXygpLCB0b2tlbnNfKCksIHRva2VuQ291bnRfKCksIHBhcnNlRXJyb3JPZmZzZXRfKCksIHBhcnNlRXJyb3JDb2RlXyhrUG9pbnRlclBhcnNlRXJyb3JOb25lKSB7Ci0gICAgICAgICp0aGlzID0gcmhzOwotICAgIH0KLQotICAgIC8vISBEZXN0cnVjdG9yLgotICAgIH5HZW5lcmljUG9pbnRlcigpIHsKLSAgICAgICAgaWYgKG5hbWVCdWZmZXJfKSAgICAvLyBJZiB1c2VyLXN1cHBsaWVkIHRva2VucyBjb25zdHJ1Y3RvciBpcyB1c2VkLCBuYW1lQnVmZmVyXyBpcyBudWxscHRyIGFuZCB0b2tlbnNfIGFyZSBub3QgZGVhbGxvY2F0ZWQuCi0gICAgICAgICAgICBBbGxvY2F0b3I6OkZyZWUodG9rZW5zXyk7Ci0gICAgICAgIFJBUElESlNPTl9ERUxFVEUob3duQWxsb2NhdG9yXyk7Ci0gICAgfQotCi0gICAgLy8hIEFzc2lnbm1lbnQgb3BlcmF0b3IuCi0gICAgR2VuZXJpY1BvaW50ZXImIG9wZXJhdG9yPShjb25zdCBHZW5lcmljUG9pbnRlciYgcmhzKSB7Ci0gICAgICAgIGlmICh0aGlzICE9ICZyaHMpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdCBkZWxldGUgb3duQWxsY2F0b3IKLSAgICAgICAgICAgIGlmIChuYW1lQnVmZmVyXykKLSAgICAgICAgICAgICAgICBBbGxvY2F0b3I6OkZyZWUodG9rZW5zXyk7Ci0KLSAgICAgICAgICAgIHRva2VuQ291bnRfID0gcmhzLnRva2VuQ291bnRfOwotICAgICAgICAgICAgcGFyc2VFcnJvck9mZnNldF8gPSByaHMucGFyc2VFcnJvck9mZnNldF87Ci0gICAgICAgICAgICBwYXJzZUVycm9yQ29kZV8gPSByaHMucGFyc2VFcnJvckNvZGVfOwotCi0gICAgICAgICAgICBpZiAocmhzLm5hbWVCdWZmZXJfKQotICAgICAgICAgICAgICAgIENvcHlGcm9tUmF3KHJocyk7IC8vIE5vcm1hbGx5IHBhcnNlZCB0b2tlbnMuCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0b2tlbnNfID0gcmhzLnRva2Vuc187IC8vIFVzZXIgc3VwcGxpZWQgY29uc3QgdG9rZW5zLgotICAgICAgICAgICAgICAgIG5hbWVCdWZmZXJfID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgLy9AfQotCi0gICAgLy8hQG5hbWUgQXBwZW5kIHRva2VuCi0gICAgLy9AewotCi0gICAgLy8hIEFwcGVuZCBhIHRva2VuIGFuZCByZXR1cm4gYSBuZXcgUG9pbnRlcgotICAgIC8qIQotICAgICAgICBccGFyYW0gdG9rZW4gVG9rZW4gdG8gYmUgYXBwZW5kZWQuCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIGZvciB0aGUgbmV3bHkgcmV0dXJuIFBvaW50ZXIuCi0gICAgICAgIFxyZXR1cm4gQSBuZXcgUG9pbnRlciB3aXRoIGFwcGVuZGVkIHRva2VuLgotICAgICovCi0gICAgR2VuZXJpY1BvaW50ZXIgQXBwZW5kKGNvbnN0IFRva2VuJiB0b2tlbiwgQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwKSBjb25zdCB7Ci0gICAgICAgIEdlbmVyaWNQb2ludGVyIHI7Ci0gICAgICAgIHIuYWxsb2NhdG9yXyA9IGFsbG9jYXRvcjsKLSAgICAgICAgQ2ggKnAgPSByLkNvcHlGcm9tUmF3KCp0aGlzLCAxLCB0b2tlbi5sZW5ndGggKyAxKTsKLSAgICAgICAgc3RkOjptZW1jcHkocCwgdG9rZW4ubmFtZSwgKHRva2VuLmxlbmd0aCArIDEpICogc2l6ZW9mKENoKSk7Ci0gICAgICAgIHIudG9rZW5zX1t0b2tlbkNvdW50X10ubmFtZSA9IHA7Ci0gICAgICAgIHIudG9rZW5zX1t0b2tlbkNvdW50X10ubGVuZ3RoID0gdG9rZW4ubGVuZ3RoOwotICAgICAgICByLnRva2Vuc19bdG9rZW5Db3VudF9dLmluZGV4ID0gdG9rZW4uaW5kZXg7Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLQotICAgIC8vISBBcHBlbmQgYSBuYW1lIHRva2VuIHdpdGggbGVuZ3RoLCBhbmQgcmV0dXJuIGEgbmV3IFBvaW50ZXIKLSAgICAvKiEKLSAgICAgICAgXHBhcmFtIG5hbWUgTmFtZSB0byBiZSBhcHBlbmRlZC4KLSAgICAgICAgXHBhcmFtIGxlbmd0aCBMZW5ndGggb2YgbmFtZS4KLSAgICAgICAgXHBhcmFtIGFsbG9jYXRvciBBbGxvY2F0b3IgZm9yIHRoZSBuZXdseSByZXR1cm4gUG9pbnRlci4KLSAgICAgICAgXHJldHVybiBBIG5ldyBQb2ludGVyIHdpdGggYXBwZW5kZWQgdG9rZW4uCi0gICAgKi8KLSAgICBHZW5lcmljUG9pbnRlciBBcHBlbmQoY29uc3QgQ2gqIG5hbWUsIFNpemVUeXBlIGxlbmd0aCwgQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwKSBjb25zdCB7Ci0gICAgICAgIFRva2VuIHRva2VuID0geyBuYW1lLCBsZW5ndGgsIGtQb2ludGVySW52YWxpZEluZGV4IH07Ci0gICAgICAgIHJldHVybiBBcHBlbmQodG9rZW4sIGFsbG9jYXRvcik7Ci0gICAgfQotCi0gICAgLy8hIEFwcGVuZCBhIG5hbWUgdG9rZW4gd2l0aG91dCBsZW5ndGgsIGFuZCByZXR1cm4gYSBuZXcgUG9pbnRlcgotICAgIC8qIQotICAgICAgICBccGFyYW0gbmFtZSBOYW1lIChjb25zdCBDaCopIHRvIGJlIGFwcGVuZGVkLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yIEFsbG9jYXRvciBmb3IgdGhlIG5ld2x5IHJldHVybiBQb2ludGVyLgotICAgICAgICBccmV0dXJuIEEgbmV3IFBvaW50ZXIgd2l0aCBhcHBlbmRlZCB0b2tlbi4KLSAgICAqLwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIFJBUElESlNPTl9ESVNBQkxFSUZfUkVUVVJOKChpbnRlcm5hbDo6Tm90RXhwcjxpbnRlcm5hbDo6SXNTYW1lPHR5cGVuYW1lIGludGVybmFsOjpSZW1vdmVDb25zdDxUPjo6VHlwZSwgQ2g+ID4pLCAoR2VuZXJpY1BvaW50ZXIpKQotICAgIEFwcGVuZChUKiBuYW1lLCBBbGxvY2F0b3IqIGFsbG9jYXRvciA9IDApIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEFwcGVuZChuYW1lLCBTdHJMZW4obmFtZSksIGFsbG9jYXRvcik7Ci0gICAgfQotCi0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLSAgICAvLyEgQXBwZW5kIGEgbmFtZSB0b2tlbiwgYW5kIHJldHVybiBhIG5ldyBQb2ludGVyCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBuYW1lIE5hbWUgdG8gYmUgYXBwZW5kZWQuCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIGZvciB0aGUgbmV3bHkgcmV0dXJuIFBvaW50ZXIuCi0gICAgICAgIFxyZXR1cm4gQSBuZXcgUG9pbnRlciB3aXRoIGFwcGVuZGVkIHRva2VuLgotICAgICovCi0gICAgR2VuZXJpY1BvaW50ZXIgQXBwZW5kKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgbmFtZSwgQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBBcHBlbmQobmFtZS5jX3N0cigpLCBzdGF0aWNfY2FzdDxTaXplVHlwZT4obmFtZS5zaXplKCkpLCBhbGxvY2F0b3IpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8hIEFwcGVuZCBhIGluZGV4IHRva2VuLCBhbmQgcmV0dXJuIGEgbmV3IFBvaW50ZXIKLSAgICAvKiEKLSAgICAgICAgXHBhcmFtIGluZGV4IEluZGV4IHRvIGJlIGFwcGVuZGVkLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yIEFsbG9jYXRvciBmb3IgdGhlIG5ld2x5IHJldHVybiBQb2ludGVyLgotICAgICAgICBccmV0dXJuIEEgbmV3IFBvaW50ZXIgd2l0aCBhcHBlbmRlZCB0b2tlbi4KLSAgICAqLwotICAgIEdlbmVyaWNQb2ludGVyIEFwcGVuZChTaXplVHlwZSBpbmRleCwgQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwKSBjb25zdCB7Ci0gICAgICAgIGNoYXIgYnVmZmVyWzIxXTsKLSAgICAgICAgY2hhciogZW5kID0gc2l6ZW9mKFNpemVUeXBlKSA9PSA0ID8gaW50ZXJuYWw6OnUzMnRvYShpbmRleCwgYnVmZmVyKSA6IGludGVybmFsOjp1NjR0b2EoaW5kZXgsIGJ1ZmZlcik7Ci0gICAgICAgIFNpemVUeXBlIGxlbmd0aCA9IHN0YXRpY19jYXN0PFNpemVUeXBlPihlbmQgLSBidWZmZXIpOwotICAgICAgICBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7Ci0KLSAgICAgICAgaWYgKHNpemVvZihDaCkgPT0gMSkgewotICAgICAgICAgICAgVG9rZW4gdG9rZW4gPSB7IHJlaW50ZXJwcmV0X2Nhc3Q8Q2gqPihidWZmZXIpLCBsZW5ndGgsIGluZGV4IH07Ci0gICAgICAgICAgICByZXR1cm4gQXBwZW5kKHRva2VuLCBhbGxvY2F0b3IpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgQ2ggbmFtZVsyMV07Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICBuYW1lW2ldID0gYnVmZmVyW2ldOwotICAgICAgICAgICAgVG9rZW4gdG9rZW4gPSB7IG5hbWUsIGxlbmd0aCwgaW5kZXggfTsKLSAgICAgICAgICAgIHJldHVybiBBcHBlbmQodG9rZW4sIGFsbG9jYXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyEgQXBwZW5kIGEgdG9rZW4gYnkgdmFsdWUsIGFuZCByZXR1cm4gYSBuZXcgUG9pbnRlcgotICAgIC8qIQotICAgICAgICBccGFyYW0gdG9rZW4gdG9rZW4gdG8gYmUgYXBwZW5kZWQuCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIGZvciB0aGUgbmV3bHkgcmV0dXJuIFBvaW50ZXIuCi0gICAgICAgIFxyZXR1cm4gQSBuZXcgUG9pbnRlciB3aXRoIGFwcGVuZGVkIHRva2VuLgotICAgICovCi0gICAgR2VuZXJpY1BvaW50ZXIgQXBwZW5kKGNvbnN0IFZhbHVlVHlwZSYgdG9rZW4sIEFsbG9jYXRvciogYWxsb2NhdG9yID0gMCkgY29uc3QgewotICAgICAgICBpZiAodG9rZW4uSXNTdHJpbmcoKSkKLSAgICAgICAgICAgIHJldHVybiBBcHBlbmQodG9rZW4uR2V0U3RyaW5nKCksIHRva2VuLkdldFN0cmluZ0xlbmd0aCgpLCBhbGxvY2F0b3IpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFJBUElESlNPTl9BU1NFUlQodG9rZW4uSXNVaW50NjQoKSk7Ci0gICAgICAgICAgICBSQVBJREpTT05fQVNTRVJUKHRva2VuLkdldFVpbnQ2NCgpIDw9IFNpemVUeXBlKH4wKSk7Ci0gICAgICAgICAgICByZXR1cm4gQXBwZW5kKHN0YXRpY19jYXN0PFNpemVUeXBlPih0b2tlbi5HZXRVaW50NjQoKSksIGFsbG9jYXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyFAbmFtZSBIYW5kbGluZyBQYXJzZSBFcnJvcgotICAgIC8vQHsKLQotICAgIC8vISBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSB2YWxpZCBwb2ludGVyLgotICAgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlRXJyb3JDb2RlXyA9PSBrUG9pbnRlclBhcnNlRXJyb3JOb25lOyB9Ci0KLSAgICAvLyEgR2V0IHRoZSBwYXJzaW5nIGVycm9yIG9mZnNldCBpbiBjb2RlIHVuaXQuCi0gICAgc2l6ZV90IEdldFBhcnNlRXJyb3JPZmZzZXQoKSBjb25zdCB7IHJldHVybiBwYXJzZUVycm9yT2Zmc2V0XzsgfQotCi0gICAgLy8hIEdldCB0aGUgcGFyc2luZyBlcnJvciBjb2RlLgotICAgIFBvaW50ZXJQYXJzZUVycm9yQ29kZSBHZXRQYXJzZUVycm9yQ29kZSgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlRXJyb3JDb2RlXzsgfQotCi0gICAgLy9AfQotCi0gICAgLy8hIEdldCB0aGUgYWxsb2NhdG9yIG9mIHRoaXMgcG9pbnRlci4KLSAgICBBbGxvY2F0b3ImIEdldEFsbG9jYXRvcigpIHsgcmV0dXJuICphbGxvY2F0b3JfOyB9Ci0KLSAgICAvLyFAbmFtZSBUb2tlbnMKLSAgICAvL0B7Ci0KLSAgICAvLyEgR2V0IHRoZSB0b2tlbiBhcnJheSAoY29uc3QgdmVyc2lvbiBvbmx5KS4KLSAgICBjb25zdCBUb2tlbiogR2V0VG9rZW5zKCkgY29uc3QgeyByZXR1cm4gdG9rZW5zXzsgfQotCi0gICAgLy8hIEdldCB0aGUgbnVtYmVyIG9mIHRva2Vucy4KLSAgICBzaXplX3QgR2V0VG9rZW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIHRva2VuQ291bnRfOyB9Ci0KLSAgICAvL0B9Ci0KLSAgICAvLyFAbmFtZSBFcXVhbGl0eS9pbmVxdWFsaXR5IG9wZXJhdG9ycwotICAgIC8vQHsKLQotICAgIC8vISBFcXVhbGl0eSBvcGVyYXRvci4KLSAgICAvKiEKLSAgICAgICAgXG5vdGUgV2hlbiBhbnkgcG9pbnRlcnMgYXJlIGludmFsaWQsIGFsd2F5cyByZXR1cm5zIGZhbHNlLgotICAgICovCi0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdlbmVyaWNQb2ludGVyJiByaHMpIGNvbnN0IHsKLSAgICAgICAgaWYgKCFJc1ZhbGlkKCkgfHwgIXJocy5Jc1ZhbGlkKCkgfHwgdG9rZW5Db3VudF8gIT0gcmhzLnRva2VuQ291bnRfKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5Db3VudF87IGkrKykgewotICAgICAgICAgICAgaWYgKHRva2Vuc19baV0uaW5kZXggIT0gcmhzLnRva2Vuc19baV0uaW5kZXggfHwKLSAgICAgICAgICAgICAgICB0b2tlbnNfW2ldLmxlbmd0aCAhPSByaHMudG9rZW5zX1tpXS5sZW5ndGggfHwgCi0gICAgICAgICAgICAgICAgKHRva2Vuc19baV0ubGVuZ3RoICE9IDAgJiYgc3RkOjptZW1jbXAodG9rZW5zX1tpXS5uYW1lLCByaHMudG9rZW5zX1tpXS5uYW1lLCBzaXplb2YoQ2gpKiB0b2tlbnNfW2ldLmxlbmd0aCkgIT0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8hIEluZXF1YWxpdHkgb3BlcmF0b3IuCi0gICAgLyohCi0gICAgICAgIFxub3RlIFdoZW4gYW55IHBvaW50ZXJzIGFyZSBpbnZhbGlkLCBhbHdheXMgcmV0dXJucyB0cnVlLgotICAgICovCi0gICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEdlbmVyaWNQb2ludGVyJiByaHMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsgfQotCi0gICAgLy9AfQotCi0gICAgLy8hQG5hbWUgU3RyaW5naWZ5Ci0gICAgLy9AewotCi0gICAgLy8hIFN0cmluZ2lmeSB0aGUgcG9pbnRlciBpbnRvIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAvKiEKLSAgICAgICAgXHRwYXJhbSBPdXRwdXRTdHJlYW0gVHlwZSBvZiBvdXRwdXQgc3RyZWFtLgotICAgICAgICBccGFyYW0gb3MgVGhlIG91dHB1dCBzdHJlYW0uCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgYm9vbCBTdHJpbmdpZnkoT3V0cHV0U3RyZWFtJiBvcykgY29uc3QgewotICAgICAgICByZXR1cm4gU3RyaW5naWZ5PGZhbHNlLCBPdXRwdXRTdHJlYW0+KG9zKTsKLSAgICB9Ci0KLSAgICAvLyEgU3RyaW5naWZ5IHRoZSBwb2ludGVyIGludG8gVVJJIGZyYWdtZW50IHJlcHJlc2VudGF0aW9uLgotICAgIC8qIQotICAgICAgICBcdHBhcmFtIE91dHB1dFN0cmVhbSBUeXBlIG9mIG91dHB1dCBzdHJlYW0uCi0gICAgICAgIFxwYXJhbSBvcyBUaGUgb3V0cHV0IHN0cmVhbS4KLSAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIE91dHB1dFN0cmVhbT4KLSAgICBib29sIFN0cmluZ2lmeVVyaUZyYWdtZW50KE91dHB1dFN0cmVhbSYgb3MpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIFN0cmluZ2lmeTx0cnVlLCBPdXRwdXRTdHJlYW0+KG9zKTsKLSAgICB9Ci0KLSAgICAvL0B9Ci0KLSAgICAvLyFAbmFtZSBDcmVhdGUgdmFsdWUKLSAgICAvL0B7Ci0KLSAgICAvLyEgQ3JlYXRlIGEgdmFsdWUgaW4gYSBzdWJ0cmVlLgotICAgIC8qIQotICAgICAgICBJZiB0aGUgdmFsdWUgaXMgbm90IGV4aXN0LCBpdCBjcmVhdGVzIGFsbCBwYXJlbnQgdmFsdWVzIGFuZCBhIEpTT04gTnVsbCB2YWx1ZS4KLSAgICAgICAgU28gaXQgYWx3YXlzIHN1Y2NlZWQgYW5kIHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBvciBleGlzdGluZyB2YWx1ZS4KLQotICAgICAgICBSZW1pbmQgdGhhdCBpdCBtYXkgY2hhbmdlIHR5cGVzIG9mIHBhcmVudHMgYWNjb3JkaW5nIHRvIHRva2Vucywgc28gaXQgCi0gICAgICAgIHBvdGVudGlhbGx5IHJlbW92ZXMgcHJldmlvdXNseSBzdG9yZWQgdmFsdWVzLiBGb3IgZXhhbXBsZSwgaWYgYSBkb2N1bWVudCAKLSAgICAgICAgd2FzIGFuIGFycmF5LCBhbmQgIi9mb28iIGlzIHVzZWQgdG8gY3JlYXRlIGEgdmFsdWUsIHRoZW4gdGhlIGRvY3VtZW50IAotICAgICAgICB3aWxsIGJlIGNoYW5nZWQgdG8gYW4gb2JqZWN0LCBhbmQgYWxsIGV4aXN0aW5nIGFycmF5IGVsZW1lbnRzIGFyZSBsb3N0LgotCi0gICAgICAgIFxwYXJhbSByb290IFJvb3QgdmFsdWUgb2YgYSBET00gc3VidHJlZSB0byBiZSByZXNvbHZlZC4gSXQgY2FuIGJlIGFueSB2YWx1ZSBvdGhlciB0aGFuIGRvY3VtZW50IHJvb3QuCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIGZvciBjcmVhdGluZyB0aGUgdmFsdWVzIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgaXRzIHBhcmVudHMgYXJlIG5vdCBleGlzdC4KLSAgICAgICAgXHBhcmFtIGFscmVhZHlFeGlzdCBJZiBub24tbnVsbCwgaXQgc3RvcmVzIHdoZXRoZXIgdGhlIHJlc29sdmVkIHZhbHVlIGlzIGFscmVhZHkgZXhpc3QuCi0gICAgICAgIFxyZXR1cm4gVGhlIHJlc29sdmVkIG5ld2x5IGNyZWF0ZWQgKGEgSlNPTiBOdWxsIHZhbHVlKSwgb3IgYWxyZWFkeSBleGlzdHMgdmFsdWUuCi0gICAgKi8KLSAgICBWYWx1ZVR5cGUmIENyZWF0ZShWYWx1ZVR5cGUmIHJvb3QsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yLCBib29sKiBhbHJlYWR5RXhpc3QgPSAwKSBjb25zdCB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoSXNWYWxpZCgpKTsKLSAgICAgICAgVmFsdWVUeXBlKiB2ID0gJnJvb3Q7Ci0gICAgICAgIGJvb2wgZXhpc3QgPSB0cnVlOwotICAgICAgICBmb3IgKGNvbnN0IFRva2VuICp0ID0gdG9rZW5zXzsgdCAhPSB0b2tlbnNfICsgdG9rZW5Db3VudF87ICsrdCkgewotICAgICAgICAgICAgaWYgKHYtPklzQXJyYXkoKSAmJiB0LT5uYW1lWzBdID09ICctJyAmJiB0LT5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIHYtPlB1c2hCYWNrKFZhbHVlVHlwZSgpLk1vdmUoKSwgYWxsb2NhdG9yKTsKLSAgICAgICAgICAgICAgICB2ID0gJigoKnYpW3YtPlNpemUoKSAtIDFdKTsKLSAgICAgICAgICAgICAgICBleGlzdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHQtPmluZGV4ID09IGtQb2ludGVySW52YWxpZEluZGV4KSB7IC8vIG11c3QgYmUgb2JqZWN0IG5hbWUKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF2LT5Jc09iamVjdCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgdi0+U2V0T2JqZWN0KCk7IC8vIENoYW5nZSB0byBPYmplY3QKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7IC8vIG9iamVjdCBuYW1lIG9yIGFycmF5IGluZGV4Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdi0+SXNBcnJheSgpICYmICF2LT5Jc09iamVjdCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgdi0+U2V0QXJyYXkoKTsgLy8gQ2hhbmdlIHRvIEFycmF5Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHYtPklzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodC0+aW5kZXggPj0gdi0+U2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2LT5SZXNlcnZlKHQtPmluZGV4ICsgMSwgYWxsb2NhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0LT5pbmRleCA+PSB2LT5TaXplKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+UHVzaEJhY2soVmFsdWVUeXBlKCkuTW92ZSgpLCBhbGxvY2F0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2ID0gJigoKnYpW3QtPmluZGV4XSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBWYWx1ZVR5cGU6Ok1lbWJlckl0ZXJhdG9yIG0gPSB2LT5GaW5kTWVtYmVyKEdlbmVyaWNTdHJpbmdSZWY8Q2g+KHQtPm5hbWUsIHQtPmxlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobSA9PSB2LT5NZW1iZXJFbmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdi0+QWRkTWVtYmVyKFZhbHVlVHlwZSh0LT5uYW1lLCB0LT5sZW5ndGgsIGFsbG9jYXRvcikuTW92ZSgpLCBWYWx1ZVR5cGUoKS5Nb3ZlKCksIGFsbG9jYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gJigtLXYtPk1lbWJlckVuZCgpKS0+dmFsdWU7IC8vIEFzc3VtZXMgQWRkTWVtYmVyKCkgYXBwZW5kcyBhdCB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBleGlzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAmbS0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFscmVhZHlFeGlzdCkKLSAgICAgICAgICAgICphbHJlYWR5RXhpc3QgPSBleGlzdDsKLQotICAgICAgICByZXR1cm4gKnY7Ci0gICAgfQotCi0gICAgLy8hIENyZWF0ZXMgYSB2YWx1ZSBpbiBhIGRvY3VtZW50LgotICAgIC8qIQotICAgICAgICBccGFyYW0gZG9jdW1lbnQgQSBkb2N1bWVudCB0byBiZSByZXNvbHZlZC4KLSAgICAgICAgXHBhcmFtIGFscmVhZHlFeGlzdCBJZiBub24tbnVsbCwgaXQgc3RvcmVzIHdoZXRoZXIgdGhlIHJlc29sdmVkIHZhbHVlIGlzIGFscmVhZHkgZXhpc3QuCi0gICAgICAgIFxyZXR1cm4gVGhlIHJlc29sdmVkIG5ld2x5IGNyZWF0ZWQsIG9yIGFscmVhZHkgZXhpc3RzIHZhbHVlLgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIHN0YWNrQWxsb2NhdG9yPgotICAgIFZhbHVlVHlwZSYgQ3JlYXRlKEdlbmVyaWNEb2N1bWVudDxFbmNvZGluZ1R5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSwgc3RhY2tBbGxvY2F0b3I+JiBkb2N1bWVudCwgYm9vbCogYWxyZWFkeUV4aXN0ID0gMCkgY29uc3QgewotICAgICAgICByZXR1cm4gQ3JlYXRlKGRvY3VtZW50LCBkb2N1bWVudC5HZXRBbGxvY2F0b3IoKSwgYWxyZWFkeUV4aXN0KTsKLSAgICB9Ci0KLSAgICAvL0B9Ci0KLSAgICAvLyFAbmFtZSBRdWVyeSB2YWx1ZQotICAgIC8vQHsKLQotICAgIC8vISBRdWVyeSBhIHZhbHVlIGluIGEgc3VidHJlZS4KLSAgICAvKiEKLSAgICAgICAgXHBhcmFtIHJvb3QgUm9vdCB2YWx1ZSBvZiBhIERPTSBzdWItdHJlZSB0byBiZSByZXNvbHZlZC4gSXQgY2FuIGJlIGFueSB2YWx1ZSBvdGhlciB0aGFuIGRvY3VtZW50IHJvb3QuCi0gICAgICAgIFxwYXJhbSB1bnJlc29sdmVkVG9rZW5JbmRleCBJZiB0aGUgcG9pbnRlciBjYW5ub3QgcmVzb2x2ZSBhIHRva2VuIGluIHRoZSBwb2ludGVyLCB0aGlzIHBhcmFtZXRlciBjYW4gb2J0YWluIHRoZSBpbmRleCBvZiB1bnJlc29sdmVkIHRva2VuLgotICAgICAgICBccmV0dXJuIFBvaW50ZXIgdG8gdGhlIHZhbHVlIGlmIGl0IGNhbiBiZSByZXNvbHZlZC4gT3RoZXJ3aXNlIG51bGwuCi0KLSAgICAgICAgXG5vdGUKLSAgICAgICAgVGhlcmUgYXJlIG9ubHkgMyBzaXR1YXRpb25zIHdoZW4gYSB2YWx1ZSBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci0gICAgICAgIDEuIEEgdmFsdWUgaW4gdGhlIHBhdGggaXMgbm90IGFuIGFycmF5IG5vciBvYmplY3QuCi0gICAgICAgIDIuIEFuIG9iamVjdCB2YWx1ZSBkb2VzIG5vdCBjb250YWluIHRoZSB0b2tlbi4KLSAgICAgICAgMy4gQSB0b2tlbiBpcyBvdXQgb2YgcmFuZ2Ugb2YgYW4gYXJyYXkgdmFsdWUuCi0KLSAgICAgICAgVXNlIHVucmVzb2x2ZWRUb2tlbkluZGV4IHRvIHJldHJpZXZlIHRoZSB0b2tlbiBpbmRleC4KLSAgICAqLwotICAgIFZhbHVlVHlwZSogR2V0KFZhbHVlVHlwZSYgcm9vdCwgc2l6ZV90KiB1bnJlc29sdmVkVG9rZW5JbmRleCA9IDApIGNvbnN0IHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChJc1ZhbGlkKCkpOwotICAgICAgICBWYWx1ZVR5cGUqIHYgPSAmcm9vdDsKLSAgICAgICAgZm9yIChjb25zdCBUb2tlbiAqdCA9IHRva2Vuc187IHQgIT0gdG9rZW5zXyArIHRva2VuQ291bnRfOyArK3QpIHsKLSAgICAgICAgICAgIHN3aXRjaCAodi0+R2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIGtPYmplY3RUeXBlOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVmFsdWVUeXBlOjpNZW1iZXJJdGVyYXRvciBtID0gdi0+RmluZE1lbWJlcihHZW5lcmljU3RyaW5nUmVmPENoPih0LT5uYW1lLCB0LT5sZW5ndGgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG0gPT0gdi0+TWVtYmVyRW5kKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgdiA9ICZtLT52YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjYXNlIGtBcnJheVR5cGU6Ci0gICAgICAgICAgICAgICAgaWYgKHQtPmluZGV4ID09IGtQb2ludGVySW52YWxpZEluZGV4IHx8IHQtPmluZGV4ID49IHYtPlNpemUoKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgdiA9ICYoKCp2KVt0LT5pbmRleF0pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRXJyb3I6IHVucmVzb2x2ZWQgdG9rZW4KLSAgICAgICAgICAgIGlmICh1bnJlc29sdmVkVG9rZW5JbmRleCkKLSAgICAgICAgICAgICAgICAqdW5yZXNvbHZlZFRva2VuSW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHQgLSB0b2tlbnNfKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KLQotICAgIC8vISBRdWVyeSBhIGNvbnN0IHZhbHVlIGluIGEgY29uc3Qgc3VidHJlZS4KLSAgICAvKiEKLSAgICAgICAgXHBhcmFtIHJvb3QgUm9vdCB2YWx1ZSBvZiBhIERPTSBzdWItdHJlZSB0byBiZSByZXNvbHZlZC4gSXQgY2FuIGJlIGFueSB2YWx1ZSBvdGhlciB0aGFuIGRvY3VtZW50IHJvb3QuCi0gICAgICAgIFxyZXR1cm4gUG9pbnRlciB0byB0aGUgdmFsdWUgaWYgaXQgY2FuIGJlIHJlc29sdmVkLiBPdGhlcndpc2UgbnVsbC4KLSAgICAqLwotICAgIGNvbnN0IFZhbHVlVHlwZSogR2V0KGNvbnN0IFZhbHVlVHlwZSYgcm9vdCwgc2l6ZV90KiB1bnJlc29sdmVkVG9rZW5JbmRleCA9IDApIGNvbnN0IHsgCi0gICAgICAgIHJldHVybiBHZXQoY29uc3RfY2FzdDxWYWx1ZVR5cGUmPihyb290KSwgdW5yZXNvbHZlZFRva2VuSW5kZXgpOwotICAgIH0KLQotICAgIC8vQH0KLQotICAgIC8vIUBuYW1lIFF1ZXJ5IGEgdmFsdWUgd2l0aCBkZWZhdWx0Ci0gICAgLy9AewotCi0gICAgLy8hIFF1ZXJ5IGEgdmFsdWUgaW4gYSBzdWJ0cmVlIHdpdGggZGVmYXVsdCB2YWx1ZS4KLSAgICAvKiEKLSAgICAgICAgU2ltaWxhciB0byBHZXQoKSwgYnV0IGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgZG8gbm90IGV4aXN0cywgaXQgY3JlYXRlcyBhbGwgcGFyZW50cyBhbmQgY2xvbmUgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgIFNvIHRoYXQgdGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZC4KLQotICAgICAgICBccGFyYW0gcm9vdCBSb290IHZhbHVlIG9mIGEgRE9NIHN1Yi10cmVlIHRvIGJlIHJlc29sdmVkLiBJdCBjYW4gYmUgYW55IHZhbHVlIG90aGVyIHRoYW4gZG9jdW1lbnQgcm9vdC4KLSAgICAgICAgXHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlIHRvIGJlIGNsb25lZCBpZiB0aGUgdmFsdWUgd2FzIG5vdCBleGlzdHMuCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgQWxsb2NhdG9yIGZvciBjcmVhdGluZyB0aGUgdmFsdWVzIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgaXRzIHBhcmVudHMgYXJlIG5vdCBleGlzdC4KLSAgICAgICAgXHNlZSBDcmVhdGUoKQotICAgICovCi0gICAgVmFsdWVUeXBlJiBHZXRXaXRoRGVmYXVsdChWYWx1ZVR5cGUmIHJvb3QsIGNvbnN0IFZhbHVlVHlwZSYgZGVmYXVsdFZhbHVlLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgewotICAgICAgICBib29sIGFscmVhZHlFeGlzdDsKLSAgICAgICAgVmFsdWUmIHYgPSBDcmVhdGUocm9vdCwgYWxsb2NhdG9yLCAmYWxyZWFkeUV4aXN0KTsKLSAgICAgICAgcmV0dXJuIGFscmVhZHlFeGlzdCA/IHYgOiB2LkNvcHlGcm9tKGRlZmF1bHRWYWx1ZSwgYWxsb2NhdG9yKTsKLSAgICB9Ci0KLSAgICAvLyEgUXVlcnkgYSB2YWx1ZSBpbiBhIHN1YnRyZWUgd2l0aCBkZWZhdWx0IG51bGwtdGVybWluYXRlZCBzdHJpbmcuCi0gICAgVmFsdWVUeXBlJiBHZXRXaXRoRGVmYXVsdChWYWx1ZVR5cGUmIHJvb3QsIGNvbnN0IENoKiBkZWZhdWx0VmFsdWUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKSBjb25zdCB7Ci0gICAgICAgIGJvb2wgYWxyZWFkeUV4aXN0OwotICAgICAgICBWYWx1ZSYgdiA9IENyZWF0ZShyb290LCBhbGxvY2F0b3IsICZhbHJlYWR5RXhpc3QpOwotICAgICAgICByZXR1cm4gYWxyZWFkeUV4aXN0ID8gdiA6IHYuU2V0U3RyaW5nKGRlZmF1bHRWYWx1ZSwgYWxsb2NhdG9yKTsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIC8vISBRdWVyeSBhIHZhbHVlIGluIGEgc3VidHJlZSB3aXRoIGRlZmF1bHQgc3RkOjpiYXNpY19zdHJpbmcuCi0gICAgVmFsdWVUeXBlJiBHZXRXaXRoRGVmYXVsdChWYWx1ZVR5cGUmIHJvb3QsIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgZGVmYXVsdFZhbHVlLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgewotICAgICAgICBib29sIGFscmVhZHlFeGlzdDsKLSAgICAgICAgVmFsdWUmIHYgPSBDcmVhdGUocm9vdCwgYWxsb2NhdG9yLCAmYWxyZWFkeUV4aXN0KTsKLSAgICAgICAgcmV0dXJuIGFscmVhZHlFeGlzdCA/IHYgOiB2LlNldFN0cmluZyhkZWZhdWx0VmFsdWUsIGFsbG9jYXRvcik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyEgUXVlcnkgYSB2YWx1ZSBpbiBhIHN1YnRyZWUgd2l0aCBkZWZhdWx0IHByaW1pdGl2ZSB2YWx1ZS4KLSAgICAvKiEKLSAgICAgICAgXHRwYXJhbSBUIEVpdGhlciBccmVmIFR5cGUsIFxjIGludCwgXGMgdW5zaWduZWQsIFxjIGludDY0X3QsIFxjIHVpbnQ2NF90LCBcYyBib29sCi0gICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBSQVBJREpTT05fRElTQUJMRUlGX1JFVFVSTigoaW50ZXJuYWw6Ok9yRXhwcjxpbnRlcm5hbDo6SXNQb2ludGVyPFQ+LCBpbnRlcm5hbDo6SXNHZW5lcmljVmFsdWU8VD4gPiksIChWYWx1ZVR5cGUmKSkKLSAgICBHZXRXaXRoRGVmYXVsdChWYWx1ZVR5cGUmIHJvb3QsIFQgZGVmYXVsdFZhbHVlLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgewotICAgICAgICByZXR1cm4gR2V0V2l0aERlZmF1bHQocm9vdCwgVmFsdWVUeXBlKGRlZmF1bHRWYWx1ZSkuTW92ZSgpLCBhbGxvY2F0b3IpOwotICAgIH0KLQotICAgIC8vISBRdWVyeSBhIHZhbHVlIGluIGEgZG9jdW1lbnQgd2l0aCBkZWZhdWx0IHZhbHVlLgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBzdGFja0FsbG9jYXRvcj4KLSAgICBWYWx1ZVR5cGUmIEdldFdpdGhEZWZhdWx0KEdlbmVyaWNEb2N1bWVudDxFbmNvZGluZ1R5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSwgc3RhY2tBbGxvY2F0b3I+JiBkb2N1bWVudCwgY29uc3QgVmFsdWVUeXBlJiBkZWZhdWx0VmFsdWUpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEdldFdpdGhEZWZhdWx0KGRvY3VtZW50LCBkZWZhdWx0VmFsdWUsIGRvY3VtZW50LkdldEFsbG9jYXRvcigpKTsKLSAgICB9Ci0KLSAgICAvLyEgUXVlcnkgYSB2YWx1ZSBpbiBhIGRvY3VtZW50IHdpdGggZGVmYXVsdCBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBzdGFja0FsbG9jYXRvcj4KLSAgICBWYWx1ZVR5cGUmIEdldFdpdGhEZWZhdWx0KEdlbmVyaWNEb2N1bWVudDxFbmNvZGluZ1R5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSwgc3RhY2tBbGxvY2F0b3I+JiBkb2N1bWVudCwgY29uc3QgQ2gqIGRlZmF1bHRWYWx1ZSkgY29uc3QgewotICAgICAgICByZXR1cm4gR2V0V2l0aERlZmF1bHQoZG9jdW1lbnQsIGRlZmF1bHRWYWx1ZSwgZG9jdW1lbnQuR2V0QWxsb2NhdG9yKCkpOwotICAgIH0KLSAgICAKLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIC8vISBRdWVyeSBhIHZhbHVlIGluIGEgZG9jdW1lbnQgd2l0aCBkZWZhdWx0IHN0ZDo6YmFzaWNfc3RyaW5nLgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBzdGFja0FsbG9jYXRvcj4KLSAgICBWYWx1ZVR5cGUmIEdldFdpdGhEZWZhdWx0KEdlbmVyaWNEb2N1bWVudDxFbmNvZGluZ1R5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSwgc3RhY2tBbGxvY2F0b3I+JiBkb2N1bWVudCwgY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Q2g+JiBkZWZhdWx0VmFsdWUpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEdldFdpdGhEZWZhdWx0KGRvY3VtZW50LCBkZWZhdWx0VmFsdWUsIGRvY3VtZW50LkdldEFsbG9jYXRvcigpKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vISBRdWVyeSBhIHZhbHVlIGluIGEgZG9jdW1lbnQgd2l0aCBkZWZhdWx0IHByaW1pdGl2ZSB2YWx1ZS4KLSAgICAvKiEKLSAgICAgICAgXHRwYXJhbSBUIEVpdGhlciBccmVmIFR5cGUsIFxjIGludCwgXGMgdW5zaWduZWQsIFxjIGludDY0X3QsIFxjIHVpbnQ2NF90LCBcYyBib29sCi0gICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgc3RhY2tBbGxvY2F0b3I+Ci0gICAgUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpPckV4cHI8aW50ZXJuYWw6OklzUG9pbnRlcjxUPiwgaW50ZXJuYWw6OklzR2VuZXJpY1ZhbHVlPFQ+ID4pLCAoVmFsdWVUeXBlJikpCi0gICAgR2V0V2l0aERlZmF1bHQoR2VuZXJpY0RvY3VtZW50PEVuY29kaW5nVHlwZSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpBbGxvY2F0b3JUeXBlLCBzdGFja0FsbG9jYXRvcj4mIGRvY3VtZW50LCBUIGRlZmF1bHRWYWx1ZSkgY29uc3QgewotICAgICAgICByZXR1cm4gR2V0V2l0aERlZmF1bHQoZG9jdW1lbnQsIGRlZmF1bHRWYWx1ZSwgZG9jdW1lbnQuR2V0QWxsb2NhdG9yKCkpOwotICAgIH0KLQotICAgIC8vQH0KLQotICAgIC8vIUBuYW1lIFNldCBhIHZhbHVlCi0gICAgLy9AewotCi0gICAgLy8hIFNldCBhIHZhbHVlIGluIGEgc3VidHJlZSwgd2l0aCBtb3ZlIHNlbWFudGljcy4KLSAgICAvKiEKLSAgICAgICAgSXQgY3JlYXRlcyBhbGwgcGFyZW50cyBpZiB0aGV5IGFyZSBub3QgZXhpc3Qgb3IgdHlwZXMgYXJlIGRpZmZlcmVudCB0byB0aGUgdG9rZW5zLgotICAgICAgICBTbyB0aGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcyBidXQgcG90ZW50aWFsbHkgcmVtb3ZlIGV4aXN0aW5nIHZhbHVlcy4KLQotICAgICAgICBccGFyYW0gcm9vdCBSb290IHZhbHVlIG9mIGEgRE9NIHN1Yi10cmVlIHRvIGJlIHJlc29sdmVkLiBJdCBjYW4gYmUgYW55IHZhbHVlIG90aGVyIHRoYW4gZG9jdW1lbnQgcm9vdC4KLSAgICAgICAgXHBhcmFtIHZhbHVlIFZhbHVlIHRvIGJlIHNldC4KLSAgICAgICAgXHBhcmFtIGFsbG9jYXRvciBBbGxvY2F0b3IgZm9yIGNyZWF0aW5nIHRoZSB2YWx1ZXMgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBvciBpdHMgcGFyZW50cyBhcmUgbm90IGV4aXN0LgotICAgICAgICBcc2VlIENyZWF0ZSgpCi0gICAgKi8KLSAgICBWYWx1ZVR5cGUmIFNldChWYWx1ZVR5cGUmIHJvb3QsIFZhbHVlVHlwZSYgdmFsdWUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBDcmVhdGUocm9vdCwgYWxsb2NhdG9yKSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8vISBTZXQgYSB2YWx1ZSBpbiBhIHN1YnRyZWUsIHdpdGggY29weSBzZW1hbnRpY3MuCi0gICAgVmFsdWVUeXBlJiBTZXQoVmFsdWVUeXBlJiByb290LCBjb25zdCBWYWx1ZVR5cGUmIHZhbHVlLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgewotICAgICAgICByZXR1cm4gQ3JlYXRlKHJvb3QsIGFsbG9jYXRvcikuQ29weUZyb20odmFsdWUsIGFsbG9jYXRvcik7Ci0gICAgfQotCi0gICAgLy8hIFNldCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgaW4gYSBzdWJ0cmVlLgotICAgIFZhbHVlVHlwZSYgU2V0KFZhbHVlVHlwZSYgcm9vdCwgY29uc3QgQ2gqIHZhbHVlLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgewotICAgICAgICByZXR1cm4gQ3JlYXRlKHJvb3QsIGFsbG9jYXRvcikgPSBWYWx1ZVR5cGUodmFsdWUsIGFsbG9jYXRvcikuTW92ZSgpOwotICAgIH0KLQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi0gICAgLy8hIFNldCBhIHN0ZDo6YmFzaWNfc3RyaW5nIGluIGEgc3VidHJlZS4KLSAgICBWYWx1ZVR5cGUmIFNldChWYWx1ZVR5cGUmIHJvb3QsIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgdmFsdWUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSYgYWxsb2NhdG9yKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBDcmVhdGUocm9vdCwgYWxsb2NhdG9yKSA9IFZhbHVlVHlwZSh2YWx1ZSwgYWxsb2NhdG9yKS5Nb3ZlKCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyEgU2V0IGEgcHJpbWl0aXZlIHZhbHVlIGluIGEgc3VidHJlZS4KLSAgICAvKiEKLSAgICAgICAgXHRwYXJhbSBUIEVpdGhlciBccmVmIFR5cGUsIFxjIGludCwgXGMgdW5zaWduZWQsIFxjIGludDY0X3QsIFxjIHVpbnQ2NF90LCBcYyBib29sCi0gICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBSQVBJREpTT05fRElTQUJMRUlGX1JFVFVSTigoaW50ZXJuYWw6Ok9yRXhwcjxpbnRlcm5hbDo6SXNQb2ludGVyPFQ+LCBpbnRlcm5hbDo6SXNHZW5lcmljVmFsdWU8VD4gPiksIChWYWx1ZVR5cGUmKSkKLSAgICBTZXQoVmFsdWVUeXBlJiByb290LCBUIHZhbHVlLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgewotICAgICAgICByZXR1cm4gQ3JlYXRlKHJvb3QsIGFsbG9jYXRvcikgPSBWYWx1ZVR5cGUodmFsdWUpLk1vdmUoKTsKLSAgICB9Ci0KLSAgICAvLyEgU2V0IGEgdmFsdWUgaW4gYSBkb2N1bWVudCwgd2l0aCBtb3ZlIHNlbWFudGljcy4KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgc3RhY2tBbGxvY2F0b3I+Ci0gICAgVmFsdWVUeXBlJiBTZXQoR2VuZXJpY0RvY3VtZW50PEVuY29kaW5nVHlwZSwgdHlwZW5hbWUgVmFsdWVUeXBlOjpBbGxvY2F0b3JUeXBlLCBzdGFja0FsbG9jYXRvcj4mIGRvY3VtZW50LCBWYWx1ZVR5cGUmIHZhbHVlKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBDcmVhdGUoZG9jdW1lbnQpID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLy8hIFNldCBhIHZhbHVlIGluIGEgZG9jdW1lbnQsIHdpdGggY29weSBzZW1hbnRpY3MuCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIHN0YWNrQWxsb2NhdG9yPgotICAgIFZhbHVlVHlwZSYgU2V0KEdlbmVyaWNEb2N1bWVudDxFbmNvZGluZ1R5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSwgc3RhY2tBbGxvY2F0b3I+JiBkb2N1bWVudCwgY29uc3QgVmFsdWVUeXBlJiB2YWx1ZSkgY29uc3QgewotICAgICAgICByZXR1cm4gQ3JlYXRlKGRvY3VtZW50KS5Db3B5RnJvbSh2YWx1ZSwgZG9jdW1lbnQuR2V0QWxsb2NhdG9yKCkpOwotICAgIH0KLQotICAgIC8vISBTZXQgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGluIGEgZG9jdW1lbnQuCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIHN0YWNrQWxsb2NhdG9yPgotICAgIFZhbHVlVHlwZSYgU2V0KEdlbmVyaWNEb2N1bWVudDxFbmNvZGluZ1R5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSwgc3RhY2tBbGxvY2F0b3I+JiBkb2N1bWVudCwgY29uc3QgQ2gqIHZhbHVlKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBDcmVhdGUoZG9jdW1lbnQpID0gVmFsdWVUeXBlKHZhbHVlLCBkb2N1bWVudC5HZXRBbGxvY2F0b3IoKSkuTW92ZSgpOwotICAgIH0KLQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi0gICAgLy8hIFNldHMgYSBzdGQ6OmJhc2ljX3N0cmluZyBpbiBhIGRvY3VtZW50LgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBzdGFja0FsbG9jYXRvcj4KLSAgICBWYWx1ZVR5cGUmIFNldChHZW5lcmljRG9jdW1lbnQ8RW5jb2RpbmdUeXBlLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUsIHN0YWNrQWxsb2NhdG9yPiYgZG9jdW1lbnQsIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgdmFsdWUpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIENyZWF0ZShkb2N1bWVudCkgPSBWYWx1ZVR5cGUodmFsdWUsIGRvY3VtZW50LkdldEFsbG9jYXRvcigpKS5Nb3ZlKCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyEgU2V0IGEgcHJpbWl0aXZlIHZhbHVlIGluIGEgZG9jdW1lbnQuCi0gICAgLyohCi0gICAgXHRwYXJhbSBUIEVpdGhlciBccmVmIFR5cGUsIFxjIGludCwgXGMgdW5zaWduZWQsIFxjIGludDY0X3QsIFxjIHVpbnQ2NF90LCBcYyBib29sCi0gICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgc3RhY2tBbGxvY2F0b3I+Ci0gICAgUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpPckV4cHI8aW50ZXJuYWw6OklzUG9pbnRlcjxUPiwgaW50ZXJuYWw6OklzR2VuZXJpY1ZhbHVlPFQ+ID4pLCAoVmFsdWVUeXBlJikpCi0gICAgICAgIFNldChHZW5lcmljRG9jdW1lbnQ8RW5jb2RpbmdUeXBlLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUsIHN0YWNrQWxsb2NhdG9yPiYgZG9jdW1lbnQsIFQgdmFsdWUpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGUoZG9jdW1lbnQpID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLy9AfQotCi0gICAgLy8hQG5hbWUgU3dhcCBhIHZhbHVlCi0gICAgLy9AewotCi0gICAgLy8hIFN3YXAgYSB2YWx1ZSB3aXRoIGEgdmFsdWUgaW4gYSBzdWJ0cmVlLgotICAgIC8qIQotICAgICAgICBJdCBjcmVhdGVzIGFsbCBwYXJlbnRzIGlmIHRoZXkgYXJlIG5vdCBleGlzdCBvciB0eXBlcyBhcmUgZGlmZmVyZW50IHRvIHRoZSB0b2tlbnMuCi0gICAgICAgIFNvIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzIGJ1dCBwb3RlbnRpYWxseSByZW1vdmUgZXhpc3RpbmcgdmFsdWVzLgotCi0gICAgICAgIFxwYXJhbSByb290IFJvb3QgdmFsdWUgb2YgYSBET00gc3ViLXRyZWUgdG8gYmUgcmVzb2x2ZWQuIEl0IGNhbiBiZSBhbnkgdmFsdWUgb3RoZXIgdGhhbiBkb2N1bWVudCByb290LgotICAgICAgICBccGFyYW0gdmFsdWUgVmFsdWUgdG8gYmUgc3dhcHBlZC4KLSAgICAgICAgXHBhcmFtIGFsbG9jYXRvciBBbGxvY2F0b3IgZm9yIGNyZWF0aW5nIHRoZSB2YWx1ZXMgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBvciBpdHMgcGFyZW50cyBhcmUgbm90IGV4aXN0LgotICAgICAgICBcc2VlIENyZWF0ZSgpCi0gICAgKi8KLSAgICBWYWx1ZVR5cGUmIFN3YXAoVmFsdWVUeXBlJiByb290LCBWYWx1ZVR5cGUmIHZhbHVlLCB0eXBlbmFtZSBWYWx1ZVR5cGU6OkFsbG9jYXRvclR5cGUmIGFsbG9jYXRvcikgY29uc3QgewotICAgICAgICByZXR1cm4gQ3JlYXRlKHJvb3QsIGFsbG9jYXRvcikuU3dhcCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLy8hIFN3YXAgYSB2YWx1ZSB3aXRoIGEgdmFsdWUgaW4gYSBkb2N1bWVudC4KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgc3RhY2tBbGxvY2F0b3I+Ci0gICAgVmFsdWVUeXBlJiBTd2FwKEdlbmVyaWNEb2N1bWVudDxFbmNvZGluZ1R5cGUsIHR5cGVuYW1lIFZhbHVlVHlwZTo6QWxsb2NhdG9yVHlwZSwgc3RhY2tBbGxvY2F0b3I+JiBkb2N1bWVudCwgVmFsdWVUeXBlJiB2YWx1ZSkgY29uc3QgewotICAgICAgICByZXR1cm4gQ3JlYXRlKGRvY3VtZW50KS5Td2FwKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvL0B9Ci0KLSAgICAvLyEgRXJhc2UgYSB2YWx1ZSBpbiBhIHN1YnRyZWUuCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSByb290IFJvb3QgdmFsdWUgb2YgYSBET00gc3ViLXRyZWUgdG8gYmUgcmVzb2x2ZWQuIEl0IGNhbiBiZSBhbnkgdmFsdWUgb3RoZXIgdGhhbiBkb2N1bWVudCByb290LgotICAgICAgICBccmV0dXJuIFdoZXRoZXIgdGhlIHJlc29sdmVkIHZhbHVlIGlzIGZvdW5kIGFuZCBlcmFzZWQuCi0KLSAgICAgICAgXG5vdGUgRXJhc2luZyB3aXRoIGFuIGVtcHR5IHBvaW50ZXIgXGMgUG9pbnRlcigiIiksIGkuZS4gdGhlIHJvb3QsIGFsd2F5cyBmYWlsIGFuZCByZXR1cm4gZmFsc2UuCi0gICAgKi8KLSAgICBib29sIEVyYXNlKFZhbHVlVHlwZSYgcm9vdCkgY29uc3QgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKElzVmFsaWQoKSk7Ci0gICAgICAgIGlmICh0b2tlbkNvdW50XyA9PSAwKSAvLyBDYW5ub3QgZXJhc2UgdGhlIHJvb3QKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBWYWx1ZVR5cGUqIHYgPSAmcm9vdDsKLSAgICAgICAgY29uc3QgVG9rZW4qIGxhc3QgPSB0b2tlbnNfICsgKHRva2VuQ291bnRfIC0gMSk7Ci0gICAgICAgIGZvciAoY29uc3QgVG9rZW4gKnQgPSB0b2tlbnNfOyB0ICE9IGxhc3Q7ICsrdCkgewotICAgICAgICAgICAgc3dpdGNoICh2LT5HZXRUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2Uga09iamVjdFR5cGU6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBWYWx1ZVR5cGU6Ok1lbWJlckl0ZXJhdG9yIG0gPSB2LT5GaW5kTWVtYmVyKEdlbmVyaWNTdHJpbmdSZWY8Q2g+KHQtPm5hbWUsIHQtPmxlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobSA9PSB2LT5NZW1iZXJFbmQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgdiA9ICZtLT52YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGtBcnJheVR5cGU6Ci0gICAgICAgICAgICAgICAgaWYgKHQtPmluZGV4ID09IGtQb2ludGVySW52YWxpZEluZGV4IHx8IHQtPmluZGV4ID49IHYtPlNpemUoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIHYgPSAmKCgqdilbdC0+aW5kZXhdKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoICh2LT5HZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBrT2JqZWN0VHlwZToKLSAgICAgICAgICAgIHJldHVybiB2LT5FcmFzZU1lbWJlcihHZW5lcmljU3RyaW5nUmVmPENoPihsYXN0LT5uYW1lLCBsYXN0LT5sZW5ndGgpKTsKLSAgICAgICAgY2FzZSBrQXJyYXlUeXBlOgotICAgICAgICAgICAgaWYgKGxhc3QtPmluZGV4ID09IGtQb2ludGVySW52YWxpZEluZGV4IHx8IGxhc3QtPmluZGV4ID49IHYtPlNpemUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB2LT5FcmFzZSh2LT5CZWdpbigpICsgbGFzdC0+aW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgLy8hIENsb25lIHRoZSBjb250ZW50IGZyb20gcmhzIHRvIHRoaXMuCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSByaHMgU291cmNlIHBvaW50ZXIuCi0gICAgICAgIFxwYXJhbSBleHRyYVRva2VuIEV4dHJhIHRva2VucyB0byBiZSBhbGxvY2F0ZWQuCi0gICAgICAgIFxwYXJhbSBleHRyYU5hbWVCdWZmZXJTaXplIEV4dHJhIG5hbWUgYnVmZmVyIHNpemUgKGluIG51bWJlciBvZiBDaCkgdG8gYmUgYWxsb2NhdGVkLgotICAgICAgICBccmV0dXJuIFN0YXJ0IG9mIG5vbi1vY2N1cGllZCBuYW1lIGJ1ZmZlciwgZm9yIHN0b3JpbmcgZXh0cmEgbmFtZXMuCi0gICAgKi8KLSAgICBDaCogQ29weUZyb21SYXcoY29uc3QgR2VuZXJpY1BvaW50ZXImIHJocywgc2l6ZV90IGV4dHJhVG9rZW4gPSAwLCBzaXplX3QgZXh0cmFOYW1lQnVmZmVyU2l6ZSA9IDApIHsKLSAgICAgICAgaWYgKCFhbGxvY2F0b3JfKSAvLyBhbGxvY2F0b3IgaXMgaW5kZXBlbmRlbnRseSBvd25lZC4KLSAgICAgICAgICAgIG93bkFsbG9jYXRvcl8gPSBhbGxvY2F0b3JfID0gUkFQSURKU09OX05FVyhBbGxvY2F0b3IoKSk7Ci0KLSAgICAgICAgc2l6ZV90IG5hbWVCdWZmZXJTaXplID0gcmhzLnRva2VuQ291bnRfOyAvLyBudWxsIHRlcm1pbmF0b3JzIGZvciB0b2tlbnMKLSAgICAgICAgZm9yIChUb2tlbiAqdCA9IHJocy50b2tlbnNfOyB0ICE9IHJocy50b2tlbnNfICsgcmhzLnRva2VuQ291bnRfOyArK3QpCi0gICAgICAgICAgICBuYW1lQnVmZmVyU2l6ZSArPSB0LT5sZW5ndGg7Ci0KLSAgICAgICAgdG9rZW5Db3VudF8gPSByaHMudG9rZW5Db3VudF8gKyBleHRyYVRva2VuOwotICAgICAgICB0b2tlbnNfID0gc3RhdGljX2Nhc3Q8VG9rZW4gKj4oYWxsb2NhdG9yXy0+TWFsbG9jKHRva2VuQ291bnRfICogc2l6ZW9mKFRva2VuKSArIChuYW1lQnVmZmVyU2l6ZSArIGV4dHJhTmFtZUJ1ZmZlclNpemUpICogc2l6ZW9mKENoKSkpOwotICAgICAgICBuYW1lQnVmZmVyXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2ggKj4odG9rZW5zXyArIHRva2VuQ291bnRfKTsKLSAgICAgICAgc3RkOjptZW1jcHkodG9rZW5zXywgcmhzLnRva2Vuc18sIHJocy50b2tlbkNvdW50XyAqIHNpemVvZihUb2tlbikpOwotICAgICAgICBzdGQ6Om1lbWNweShuYW1lQnVmZmVyXywgcmhzLm5hbWVCdWZmZXJfLCBuYW1lQnVmZmVyU2l6ZSAqIHNpemVvZihDaCkpOwotCi0gICAgICAgIC8vIEFkanVzdCBwb2ludGVycyB0byBuYW1lIGJ1ZmZlcgotICAgICAgICBzdGQ6OnB0cmRpZmZfdCBkaWZmID0gbmFtZUJ1ZmZlcl8gLSByaHMubmFtZUJ1ZmZlcl87Ci0gICAgICAgIGZvciAoVG9rZW4gKnQgPSB0b2tlbnNfOyB0ICE9IHRva2Vuc18gKyByaHMudG9rZW5Db3VudF87ICsrdCkKLSAgICAgICAgICAgIHQtPm5hbWUgKz0gZGlmZjsKLQotICAgICAgICByZXR1cm4gbmFtZUJ1ZmZlcl8gKyBuYW1lQnVmZmVyU2l6ZTsKLSAgICB9Ci0KLSAgICAvLyEgQ2hlY2sgd2hldGhlciBhIGNoYXJhY3RlciBzaG91bGQgYmUgcGVyY2VudC1lbmNvZGVkLgotICAgIC8qIQotICAgICAgICBBY2NvcmRpbmcgdG8gUkZDIDM5ODYgMi4zIFVucmVzZXJ2ZWQgQ2hhcmFjdGVycy4KLSAgICAgICAgXHBhcmFtIGMgVGhlIGNoYXJhY3RlciAoY29kZSB1bml0KSB0byBiZSB0ZXN0ZWQuCi0gICAgKi8KLSAgICBib29sIE5lZWRQZXJjZW50RW5jb2RlKENoIGMpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICEoKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCAoYyA+PSAnQScgJiYgYyA8PSdaJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCBjID09ICctJyB8fCBjID09ICcuJyB8fCBjID09ICdfJyB8fCBjID09J34nKTsKLSAgICB9Ci0KLSAgICAvLyEgUGFyc2UgYSBKU09OIFN0cmluZyBvciBpdHMgVVJJIGZyYWdtZW50IHJlcHJlc2VudGF0aW9uIGludG8gdG9rZW5zLgotI2lmbmRlZiBfX2NsYW5nX18gLy8gLVdkb2N1bWVudGF0aW9uCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBzb3VyY2UgRWl0aGVyIGEgSlNPTiBQb2ludGVyIHN0cmluZywgb3IgaXRzIFVSSSBmcmFnbWVudCByZXByZXNlbnRhdGlvbi4gTm90IG5lZWQgdG8gYmUgbnVsbCB0ZXJtaW5hdGVkLgotICAgICAgICBccGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgc291cmNlIHN0cmluZy4KLSAgICAgICAgXG5vdGUgU291cmNlIGNhbm5vdCBiZSBKU09OIFN0cmluZyBSZXByZXNlbnRhdGlvbiBvZiBKU09OIFBvaW50ZXIsIGUuZy4gSW4gIi9cdTAwMDAiLCBcdTAwMDAgd2lsbCBub3QgYmUgdW5lc2NhcGVkLgotICAgICovCi0jZW5kaWYKLSAgICB2b2lkIFBhcnNlKGNvbnN0IENoKiBzb3VyY2UsIHNpemVfdCBsZW5ndGgpIHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChzb3VyY2UgIT0gTlVMTCk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQobmFtZUJ1ZmZlcl8gPT0gMCk7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQodG9rZW5zXyA9PSAwKTsKLQotICAgICAgICAvLyBDcmVhdGUgb3duIGFsbG9jYXRvciBpZiB1c2VyIGRpZCBub3Qgc3VwcGx5LgotICAgICAgICBpZiAoIWFsbG9jYXRvcl8pCi0gICAgICAgICAgICBvd25BbGxvY2F0b3JfID0gYWxsb2NhdG9yXyA9IFJBUElESlNPTl9ORVcoQWxsb2NhdG9yKCkpOwotCi0gICAgICAgIC8vIENvdW50IG51bWJlciBvZiAnLycgYXMgdG9rZW5Db3VudAotICAgICAgICB0b2tlbkNvdW50XyA9IDA7Ci0gICAgICAgIGZvciAoY29uc3QgQ2gqIHMgPSBzb3VyY2U7IHMgIT0gc291cmNlICsgbGVuZ3RoOyBzKyspIAotICAgICAgICAgICAgaWYgKCpzID09ICcvJykKLSAgICAgICAgICAgICAgICB0b2tlbkNvdW50XysrOwotCi0gICAgICAgIFRva2VuKiB0b2tlbiA9IHRva2Vuc18gPSBzdGF0aWNfY2FzdDxUb2tlbiAqPihhbGxvY2F0b3JfLT5NYWxsb2ModG9rZW5Db3VudF8gKiBzaXplb2YoVG9rZW4pICsgbGVuZ3RoICogc2l6ZW9mKENoKSkpOwotICAgICAgICBDaCogbmFtZSA9IG5hbWVCdWZmZXJfID0gcmVpbnRlcnByZXRfY2FzdDxDaCAqPih0b2tlbnNfICsgdG9rZW5Db3VudF8pOwotICAgICAgICBzaXplX3QgaSA9IDA7Ci0KLSAgICAgICAgLy8gRGV0ZWN0IGlmIGl0IGlzIGEgVVJJIGZyYWdtZW50Ci0gICAgICAgIGJvb2wgdXJpRnJhZ21lbnQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHNvdXJjZVtpXSA9PSAnIycpIHsKLSAgICAgICAgICAgIHVyaUZyYWdtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpICE9IGxlbmd0aCAmJiBzb3VyY2VbaV0gIT0gJy8nKSB7Ci0gICAgICAgICAgICBwYXJzZUVycm9yQ29kZV8gPSBrUG9pbnRlclBhcnNlRXJyb3JUb2tlbk11c3RCZWdpbldpdGhTb2xpZHVzOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICBSQVBJREpTT05fQVNTRVJUKHNvdXJjZVtpXSA9PSAnLycpOwotICAgICAgICAgICAgaSsrOyAvLyBjb25zdW1lcyAnLycKLQotICAgICAgICAgICAgdG9rZW4tPm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgYm9vbCBpc051bWJlciA9IHRydWU7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIHNvdXJjZVtpXSAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICBDaCBjID0gc291cmNlW2ldOwotICAgICAgICAgICAgICAgIGlmICh1cmlGcmFnbWVudCkgewotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvZGluZyBwZXJjZW50LWVuY29kaW5nIGZvciBVUkkgZnJhZ21lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyUnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQZXJjZW50RGVjb2RlU3RyZWFtIGlzKCZzb3VyY2VbaV0sIHNvdXJjZSArIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljSW5zaXR1U3RyaW5nU3RyZWFtPEVuY29kaW5nVHlwZT4gb3MobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDaCogYmVnaW4gPSBvcy5QdXRCZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUcmFuc2NvZGVyPFVURjg8PiwgRW5jb2RpbmdUeXBlPigpLlZhbGlkYXRlKGlzLCBvcykgfHwgIWlzLklzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRXJyb3JDb2RlXyA9IGtQb2ludGVyUGFyc2VFcnJvckludmFsaWRQZXJjZW50RW5jb2Rpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBvcy5QdXRFbmQoYmVnaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBpcy5UZWxsKCkgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAqbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5lZWRQZXJjZW50RW5jb2RlKGMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUVycm9yQ29kZV8gPSBrUG9pbnRlclBhcnNlRXJyb3JDaGFyYWN0ZXJNdXN0UGVyY2VudEVuY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRXNjYXBpbmcgIn4wIiAtPiAnficsICJ+MSIgLT4gJy8nCi0gICAgICAgICAgICAgICAgaWYgKGMgPT0gJ34nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gc291cmNlW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJzAnKSAgICAgICBjID0gJ34nOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnMScpICBjID0gJy8nOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJvckNvZGVfID0ga1BvaW50ZXJQYXJzZUVycm9ySW52YWxpZEVzY2FwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFcnJvckNvZGVfID0ga1BvaW50ZXJQYXJzZUVycm9ySW52YWxpZEVzY2FwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBmb3IgaW5kZXg6IGFsbCBvZiBjaGFyYWN0ZXJzIGFyZSBkaWdpdAotICAgICAgICAgICAgICAgIGlmIChjIDwgJzAnIHx8IGMgPiAnOScpCi0gICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAqbmFtZSsrID0gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRva2VuLT5sZW5ndGggPSBzdGF0aWNfY2FzdDxTaXplVHlwZT4obmFtZSAtIHRva2VuLT5uYW1lKTsKLSAgICAgICAgICAgIGlmICh0b2tlbi0+bGVuZ3RoID09IDApCi0gICAgICAgICAgICAgICAgaXNOdW1iZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICpuYW1lKysgPSAnXDAnOyAvLyBOdWxsIHRlcm1pbmF0b3IKLQotICAgICAgICAgICAgLy8gU2Vjb25kIGNoZWNrIGZvciBpbmRleDogbW9yZSB0aGFuIG9uZSBkaWdpdCBjYW5ub3QgaGF2ZSBsZWFkaW5nIHplcm8KLSAgICAgICAgICAgIGlmIChpc051bWJlciAmJiB0b2tlbi0+bGVuZ3RoID4gMSAmJiB0b2tlbi0+bmFtZVswXSA9PSAnMCcpCi0gICAgICAgICAgICAgICAgaXNOdW1iZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgLy8gU3RyaW5nIHRvIFNpemVUeXBlIGNvbnZlcnNpb24KLSAgICAgICAgICAgIFNpemVUeXBlIG4gPSAwOwotICAgICAgICAgICAgaWYgKGlzTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0b2tlbi0+bGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU2l6ZVR5cGUgbSA9IG4gKiAxMCArIHN0YXRpY19jYXN0PFNpemVUeXBlPih0b2tlbi0+bmFtZVtqXSAtICcwJyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtIDwgbikgeyAgIC8vIG92ZXJmbG93IGRldGVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgaXNOdW1iZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG4gPSBtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG9rZW4tPmluZGV4ID0gaXNOdW1iZXIgPyBuIDoga1BvaW50ZXJJbnZhbGlkSW5kZXg7Ci0gICAgICAgICAgICB0b2tlbisrOwotICAgICAgICB9Ci0KLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChuYW1lIDw9IG5hbWVCdWZmZXJfICsgbGVuZ3RoKTsgLy8gU2hvdWxkIG5vdCBvdmVyZmxvdyBidWZmZXIKLSAgICAgICAgcGFyc2VFcnJvckNvZGVfID0ga1BvaW50ZXJQYXJzZUVycm9yTm9uZTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZXJyb3I6Ci0gICAgICAgIEFsbG9jYXRvcjo6RnJlZSh0b2tlbnNfKTsKLSAgICAgICAgbmFtZUJ1ZmZlcl8gPSAwOwotICAgICAgICB0b2tlbnNfID0gMDsKLSAgICAgICAgdG9rZW5Db3VudF8gPSAwOwotICAgICAgICBwYXJzZUVycm9yT2Zmc2V0XyA9IGk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyEgU3RyaW5naWZ5IHRvIHN0cmluZyBvciBVUkkgZnJhZ21lbnQgcmVwcmVzZW50YXRpb24uCi0gICAgLyohCi0gICAgICAgIFx0cGFyYW0gdXJpRnJhZ21lbnQgVHJ1ZSBmb3Igc3RyaW5naWZ5aW5nIHRvIFVSSSBmcmFnbWVudCByZXByZXNlbnRhdGlvbi4gRmFsc2UgZm9yIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgICAgXHRwYXJhbSBPdXRwdXRTdHJlYW0gdHlwZSBvZiBvdXRwdXQgc3RyZWFtLgotICAgICAgICBccGFyYW0gb3MgVGhlIG91dHB1dCBzdHJlYW0uCi0gICAgKi8KLSAgICB0ZW1wbGF0ZTxib29sIHVyaUZyYWdtZW50LCB0eXBlbmFtZSBPdXRwdXRTdHJlYW0+Ci0gICAgYm9vbCBTdHJpbmdpZnkoT3V0cHV0U3RyZWFtJiBvcykgY29uc3QgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKElzVmFsaWQoKSk7Ci0KLSAgICAgICAgaWYgKHVyaUZyYWdtZW50KQotICAgICAgICAgICAgb3MuUHV0KCcjJyk7Ci0KLSAgICAgICAgZm9yIChUb2tlbiAqdCA9IHRva2Vuc187IHQgIT0gdG9rZW5zXyArIHRva2VuQ291bnRfOyArK3QpIHsKLSAgICAgICAgICAgIG9zLlB1dCgnLycpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0LT5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIENoIGMgPSB0LT5uYW1lW2pdOwotICAgICAgICAgICAgICAgIGlmIChjID09ICd+JykgewotICAgICAgICAgICAgICAgICAgICBvcy5QdXQoJ34nKTsKLSAgICAgICAgICAgICAgICAgICAgb3MuUHV0KCcwJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9zLlB1dCgnficpOwotICAgICAgICAgICAgICAgICAgICBvcy5QdXQoJzEnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodXJpRnJhZ21lbnQgJiYgTmVlZFBlcmNlbnRFbmNvZGUoYykpIHsgCi0gICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zY29kZSB0byBVVEY4IHNlcXVlbmNlCi0gICAgICAgICAgICAgICAgICAgIEdlbmVyaWNTdHJpbmdTdHJlYW08dHlwZW5hbWUgVmFsdWVUeXBlOjpFbmNvZGluZ1R5cGU+IHNvdXJjZSgmdC0+bmFtZVtqXSk7Ci0gICAgICAgICAgICAgICAgICAgIFBlcmNlbnRFbmNvZGVTdHJlYW08T3V0cHV0U3RyZWFtPiB0YXJnZXQob3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRyYW5zY29kZXI8RW5jb2RpbmdUeXBlLCBVVEY4PD4gPigpLlZhbGlkYXRlKHNvdXJjZSwgdGFyZ2V0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaiArPSBzb3VyY2UuVGVsbCgpIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBvcy5QdXQoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8hIEEgaGVscGVyIHN0cmVhbSBmb3IgZGVjb2RpbmcgYSBwZXJjZW50LWVuY29kZWQgc2VxdWVuY2UgaW50byBjb2RlIHVuaXQuCi0gICAgLyohCi0gICAgICAgIFRoaXMgc3RyZWFtIGRlY29kZXMgJVhZIHRyaXBsZXQgaW50byBjb2RlIHVuaXQgKDAtMjU1KS4KLSAgICAgICAgSWYgaXQgZW5jb3VudGVycyBpbnZhbGlkIGNoYXJhY3RlcnMsIGl0IHNldHMgb3V0cHV0IGNvZGUgdW5pdCBhcyAwIGFuZCAKLSAgICAgICAgbWFyayBpbnZhbGlkLCBhbmQgdG8gYmUgY2hlY2tlZCBieSBJc1ZhbGlkKCkuCi0gICAgKi8KLSAgICBjbGFzcyBQZXJjZW50RGVjb2RlU3RyZWFtIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVmFsdWVUeXBlOjpDaCBDaDsKLQotICAgICAgICAvLyEgQ29uc3RydWN0b3IKLSAgICAgICAgLyohCi0gICAgICAgICAgICBccGFyYW0gc291cmNlIFN0YXJ0IG9mIHRoZSBzdHJlYW0KLSAgICAgICAgICAgIFxwYXJhbSBlbmQgUGFzdC10aGUtZW5kIG9mIHRoZSBzdHJlYW0uCi0gICAgICAgICovCi0gICAgICAgIFBlcmNlbnREZWNvZGVTdHJlYW0oY29uc3QgQ2gqIHNvdXJjZSwgY29uc3QgQ2gqIGVuZCkgOiBzcmNfKHNvdXJjZSksIGhlYWRfKHNvdXJjZSksIGVuZF8oZW5kKSwgdmFsaWRfKHRydWUpIHt9Ci0KLSAgICAgICAgQ2ggVGFrZSgpIHsKLSAgICAgICAgICAgIGlmICgqc3JjXyAhPSAnJScgfHwgc3JjXyArIDMgPiBlbmRfKSB7IC8vICVYWSB0cmlwbGV0Ci0gICAgICAgICAgICAgICAgdmFsaWRfID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfKys7Ci0gICAgICAgICAgICBDaCBjID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgYyA9IHN0YXRpY19jYXN0PENoPihjIDw8IDQpOwotICAgICAgICAgICAgICAgIENoIGggPSAqc3JjXzsKLSAgICAgICAgICAgICAgICBpZiAgICAgIChoID49ICcwJyAmJiBoIDw9ICc5JykgYyA9IHN0YXRpY19jYXN0PENoPihjICsgaCAtICcwJyk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoaCA+PSAnQScgJiYgaCA8PSAnRicpIGMgPSBzdGF0aWNfY2FzdDxDaD4oYyArIGggLSAnQScgKyAxMCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoaCA+PSAnYScgJiYgaCA8PSAnZicpIGMgPSBzdGF0aWNfY2FzdDxDaD4oYyArIGggLSAnYScgKyAxMCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkXyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3JjXysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgVGVsbCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oc3JjXyAtIGhlYWRfKTsgfQotICAgICAgICBib29sIElzVmFsaWQoKSBjb25zdCB7IHJldHVybiB2YWxpZF87IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IENoKiBzcmNfOyAgICAgLy8hPCBDdXJyZW50IHJlYWQgcG9zaXRpb24uCi0gICAgICAgIGNvbnN0IENoKiBoZWFkXzsgICAgLy8hPCBPcmlnaW5hbCBoZWFkIG9mIHRoZSBzdHJpbmcuCi0gICAgICAgIGNvbnN0IENoKiBlbmRfOyAgICAgLy8hPCBQYXN0LXRoZS1lbmQgcG9zaXRpb24uCi0gICAgICAgIGJvb2wgdmFsaWRfOyAgICAgICAgLy8hPCBXaGV0aGVyIHRoZSBwYXJzaW5nIGlzIHZhbGlkLgotICAgIH07Ci0KLSAgICAvLyEgQSBoZWxwZXIgc3RyZWFtIHRvIGVuY29kZSBjaGFyYWN0ZXIgKFVURi04IGNvZGUgdW5pdCkgaW50byBwZXJjZW50LWVuY29kZWQgc2VxdWVuY2UuCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIE91dHB1dFN0cmVhbT4KLSAgICBjbGFzcyBQZXJjZW50RW5jb2RlU3RyZWFtIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFBlcmNlbnRFbmNvZGVTdHJlYW0oT3V0cHV0U3RyZWFtJiBvcykgOiBvc18ob3MpIHt9Ci0gICAgICAgIHZvaWQgUHV0KGNoYXIgYykgeyAvLyBVVEYtOCBtdXN0IGJlIGJ5dGUKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpOwotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgaGV4RGlnaXRzWzE2XSA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnIH07Ci0gICAgICAgICAgICBvc18uUHV0KCclJyk7Ci0gICAgICAgICAgICBvc18uUHV0KGhleERpZ2l0c1t1ID4+IDRdKTsKLSAgICAgICAgICAgIG9zXy5QdXQoaGV4RGlnaXRzW3UgJiAxNV0pOwotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgT3V0cHV0U3RyZWFtJiBvc187Ci0gICAgfTsKLQotICAgIEFsbG9jYXRvciogYWxsb2NhdG9yXzsgICAgICAgICAgICAgICAgICAvLyE8IFRoZSBjdXJyZW50IGFsbG9jYXRvci4gSXQgaXMgZWl0aGVyIHVzZXItc3VwcGxpZWQgb3IgZXF1YWwgdG8gb3duQWxsb2NhdG9yXy4KLSAgICBBbGxvY2F0b3IqIG93bkFsbG9jYXRvcl87ICAgICAgICAgICAgICAgLy8hPCBBbGxvY2F0b3Igb3duZWQgYnkgdGhpcyBQb2ludGVyLgotICAgIENoKiBuYW1lQnVmZmVyXzsgICAgICAgICAgICAgICAgICAgICAgICAvLyE8IEEgYnVmZmVyIGNvbnRhaW5pbmcgYWxsIG5hbWVzIGluIHRva2Vucy4KLSAgICBUb2tlbiogdG9rZW5zXzsgICAgICAgICAgICAgICAgICAgICAgICAgLy8hPCBBIGxpc3Qgb2YgdG9rZW5zLgotICAgIHNpemVfdCB0b2tlbkNvdW50XzsgICAgICAgICAgICAgICAgICAgICAvLyE8IE51bWJlciBvZiB0b2tlbnMgaW4gdG9rZW5zXy4KLSAgICBzaXplX3QgcGFyc2VFcnJvck9mZnNldF87ICAgICAgICAgICAgICAgLy8hPCBPZmZzZXQgaW4gY29kZSB1bml0IHdoZW4gcGFyc2luZyBmYWlsLgotICAgIFBvaW50ZXJQYXJzZUVycm9yQ29kZSBwYXJzZUVycm9yQ29kZV87ICAvLyE8IFBhcnNpbmcgZXJyb3IgY29kZS4KLX07Ci0KLS8vISBHZW5lcmljUG9pbnRlciBmb3IgVmFsdWUgKFVURi04LCBkZWZhdWx0IGFsbG9jYXRvcikuCi10eXBlZGVmIEdlbmVyaWNQb2ludGVyPFZhbHVlPiBQb2ludGVyOwotCi0vLyFAbmFtZSBIZWxwZXIgZnVuY3Rpb25zIGZvciBHZW5lcmljUG9pbnRlcgotLy9AewotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIENyZWF0ZVZhbHVlQnlQb2ludGVyKFQmIHJvb3QsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIHR5cGVuYW1lIFQ6OkFsbG9jYXRvclR5cGUmIGEpIHsKLSAgICByZXR1cm4gcG9pbnRlci5DcmVhdGUocm9vdCwgYSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4+Ci10eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIENyZWF0ZVZhbHVlQnlQb2ludGVyKFQmIHJvb3QsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCB0eXBlbmFtZSBUOjpBbGxvY2F0b3JUeXBlJiBhKSB7Ci0gICAgcmV0dXJuIEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4oc291cmNlLCBOIC0gMSkuQ3JlYXRlKHJvb3QsIGEpOwotfQotCi0vLyBObyBhbGxvY2F0b3IgcGFyYW1ldGVyCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEb2N1bWVudFR5cGU+Ci10eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgQ3JlYXRlVmFsdWVCeVBvaW50ZXIoRG9jdW1lbnRUeXBlJiBkb2N1bWVudCwgY29uc3QgR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGU+JiBwb2ludGVyKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuQ3JlYXRlKGRvY3VtZW50KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERvY3VtZW50VHlwZSwgdHlwZW5hbWUgQ2hhclR5cGUsIHNpemVfdCBOPgotdHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGUmIENyZWF0ZVZhbHVlQnlQb2ludGVyKERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dKSB7Ci0gICAgcmV0dXJuIEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlPihzb3VyY2UsIE4gLSAxKS5DcmVhdGUoZG9jdW1lbnQpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBUOjpWYWx1ZVR5cGUqIEdldFZhbHVlQnlQb2ludGVyKFQmIHJvb3QsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIHNpemVfdCogdW5yZXNvbHZlZFRva2VuSW5kZXggPSAwKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuR2V0KHJvb3QsIHVucmVzb2x2ZWRUb2tlbkluZGV4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jb25zdCB0eXBlbmFtZSBUOjpWYWx1ZVR5cGUqIEdldFZhbHVlQnlQb2ludGVyKGNvbnN0IFQmIHJvb3QsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIHNpemVfdCogdW5yZXNvbHZlZFRva2VuSW5kZXggPSAwKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuR2V0KHJvb3QsIHVucmVzb2x2ZWRUb2tlbkluZGV4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENoYXJUeXBlLCBzaXplX3QgTj4KLXR5cGVuYW1lIFQ6OlZhbHVlVHlwZSogR2V0VmFsdWVCeVBvaW50ZXIoVCYgcm9vdCwgY29uc3QgQ2hhclR5cGUgKCZzb3VyY2UpW05dLCBzaXplX3QqIHVucmVzb2x2ZWRUb2tlbkluZGV4ID0gMCkgewotICAgIHJldHVybiBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBUOjpWYWx1ZVR5cGU+KHNvdXJjZSwgTiAtIDEpLkdldChyb290LCB1bnJlc29sdmVkVG9rZW5JbmRleCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4+Ci1jb25zdCB0eXBlbmFtZSBUOjpWYWx1ZVR5cGUqIEdldFZhbHVlQnlQb2ludGVyKGNvbnN0IFQmIHJvb3QsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCBzaXplX3QqIHVucmVzb2x2ZWRUb2tlbkluZGV4ID0gMCkgewotICAgIHJldHVybiBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBUOjpWYWx1ZVR5cGU+KHNvdXJjZSwgTiAtIDEpLkdldChyb290LCB1bnJlc29sdmVkVG9rZW5JbmRleCk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIFQ6OlZhbHVlVHlwZSYgR2V0VmFsdWVCeVBvaW50ZXJXaXRoRGVmYXVsdChUJiByb290LCBjb25zdCBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBUOjpWYWx1ZVR5cGU+JiBwb2ludGVyLCBjb25zdCB0eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIGRlZmF1bHRWYWx1ZSwgdHlwZW5hbWUgVDo6QWxsb2NhdG9yVHlwZSYgYSkgewotICAgIHJldHVybiBwb2ludGVyLkdldFdpdGhEZWZhdWx0KHJvb3QsIGRlZmF1bHRWYWx1ZSwgYSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdHlwZW5hbWUgVDo6VmFsdWVUeXBlJiBHZXRWYWx1ZUJ5UG9pbnRlcldpdGhEZWZhdWx0KFQmIHJvb3QsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIGNvbnN0IHR5cGVuYW1lIFQ6OkNoKiBkZWZhdWx0VmFsdWUsIHR5cGVuYW1lIFQ6OkFsbG9jYXRvclR5cGUmIGEpIHsKLSAgICByZXR1cm4gcG9pbnRlci5HZXRXaXRoRGVmYXVsdChyb290LCBkZWZhdWx0VmFsdWUsIGEpOwotfQotCi0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdHlwZW5hbWUgVDo6VmFsdWVUeXBlJiBHZXRWYWx1ZUJ5UG9pbnRlcldpdGhEZWZhdWx0KFQmIHJvb3QsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPHR5cGVuYW1lIFQ6OkNoPiYgZGVmYXVsdFZhbHVlLCB0eXBlbmFtZSBUOjpBbGxvY2F0b3JUeXBlJiBhKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuR2V0V2l0aERlZmF1bHQocm9vdCwgZGVmYXVsdFZhbHVlLCBhKTsKLX0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVDI+Ci1SQVBJREpTT05fRElTQUJMRUlGX1JFVFVSTigoaW50ZXJuYWw6Ok9yRXhwcjxpbnRlcm5hbDo6SXNQb2ludGVyPFQyPiwgaW50ZXJuYWw6OklzR2VuZXJpY1ZhbHVlPFQyPiA+KSwgKHR5cGVuYW1lIFQ6OlZhbHVlVHlwZSYpKQotR2V0VmFsdWVCeVBvaW50ZXJXaXRoRGVmYXVsdChUJiByb290LCBjb25zdCBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBUOjpWYWx1ZVR5cGU+JiBwb2ludGVyLCBUMiBkZWZhdWx0VmFsdWUsIHR5cGVuYW1lIFQ6OkFsbG9jYXRvclR5cGUmIGEpIHsKLSAgICByZXR1cm4gcG9pbnRlci5HZXRXaXRoRGVmYXVsdChyb290LCBkZWZhdWx0VmFsdWUsIGEpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ2hhclR5cGUsIHNpemVfdCBOPgotdHlwZW5hbWUgVDo6VmFsdWVUeXBlJiBHZXRWYWx1ZUJ5UG9pbnRlcldpdGhEZWZhdWx0KFQmIHJvb3QsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCBjb25zdCB0eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIGRlZmF1bHRWYWx1ZSwgdHlwZW5hbWUgVDo6QWxsb2NhdG9yVHlwZSYgYSkgewotICAgIHJldHVybiBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBUOjpWYWx1ZVR5cGU+KHNvdXJjZSwgTiAtIDEpLkdldFdpdGhEZWZhdWx0KHJvb3QsIGRlZmF1bHRWYWx1ZSwgYSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4+Ci10eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIEdldFZhbHVlQnlQb2ludGVyV2l0aERlZmF1bHQoVCYgcm9vdCwgY29uc3QgQ2hhclR5cGUoJnNvdXJjZSlbTl0sIGNvbnN0IHR5cGVuYW1lIFQ6OkNoKiBkZWZhdWx0VmFsdWUsIHR5cGVuYW1lIFQ6OkFsbG9jYXRvclR5cGUmIGEpIHsKLSAgICByZXR1cm4gR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgVDo6VmFsdWVUeXBlPihzb3VyY2UsIE4gLSAxKS5HZXRXaXRoRGVmYXVsdChyb290LCBkZWZhdWx0VmFsdWUsIGEpOwotfQotCi0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4+Ci10eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIEdldFZhbHVlQnlQb2ludGVyV2l0aERlZmF1bHQoVCYgcm9vdCwgY29uc3QgQ2hhclR5cGUoJnNvdXJjZSlbTl0sIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPHR5cGVuYW1lIFQ6OkNoPiYgZGVmYXVsdFZhbHVlLCB0eXBlbmFtZSBUOjpBbGxvY2F0b3JUeXBlJiBhKSB7Ci0gICAgcmV0dXJuIEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4oc291cmNlLCBOIC0gMSkuR2V0V2l0aERlZmF1bHQocm9vdCwgZGVmYXVsdFZhbHVlLCBhKTsKLX0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ2hhclR5cGUsIHNpemVfdCBOLCB0eXBlbmFtZSBUMj4KLVJBUElESlNPTl9ESVNBQkxFSUZfUkVUVVJOKChpbnRlcm5hbDo6T3JFeHByPGludGVybmFsOjpJc1BvaW50ZXI8VDI+LCBpbnRlcm5hbDo6SXNHZW5lcmljVmFsdWU8VDI+ID4pLCAodHlwZW5hbWUgVDo6VmFsdWVUeXBlJikpCi1HZXRWYWx1ZUJ5UG9pbnRlcldpdGhEZWZhdWx0KFQmIHJvb3QsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCBUMiBkZWZhdWx0VmFsdWUsIHR5cGVuYW1lIFQ6OkFsbG9jYXRvclR5cGUmIGEpIHsKLSAgICByZXR1cm4gR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgVDo6VmFsdWVUeXBlPihzb3VyY2UsIE4gLSAxKS5HZXRXaXRoRGVmYXVsdChyb290LCBkZWZhdWx0VmFsdWUsIGEpOwotfQotCi0vLyBObyBhbGxvY2F0b3IgcGFyYW1ldGVyCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEb2N1bWVudFR5cGU+Ci10eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgR2V0VmFsdWVCeVBvaW50ZXJXaXRoRGVmYXVsdChEb2N1bWVudFR5cGUmIGRvY3VtZW50LCBjb25zdCBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIGNvbnN0IHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlJiBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gcG9pbnRlci5HZXRXaXRoRGVmYXVsdChkb2N1bWVudCwgZGVmYXVsdFZhbHVlKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERvY3VtZW50VHlwZT4KLXR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlJiBHZXRWYWx1ZUJ5UG9pbnRlcldpdGhEZWZhdWx0KERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlPiYgcG9pbnRlciwgY29uc3QgdHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpDaCogZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuR2V0V2l0aERlZmF1bHQoZG9jdW1lbnQsIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotdGVtcGxhdGUgPHR5cGVuYW1lIERvY3VtZW50VHlwZT4KLXR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlJiBHZXRWYWx1ZUJ5UG9pbnRlcldpdGhEZWZhdWx0KERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlPiYgcG9pbnRlciwgY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8dHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpDaD4mIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBwb2ludGVyLkdldFdpdGhEZWZhdWx0KGRvY3VtZW50LCBkZWZhdWx0VmFsdWUpOwotfQotI2VuZGlmCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEb2N1bWVudFR5cGUsIHR5cGVuYW1lIFQyPgotUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpPckV4cHI8aW50ZXJuYWw6OklzUG9pbnRlcjxUMj4sIGludGVybmFsOjpJc0dlbmVyaWNWYWx1ZTxUMj4gPiksICh0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYpKQotR2V0VmFsdWVCeVBvaW50ZXJXaXRoRGVmYXVsdChEb2N1bWVudFR5cGUmIGRvY3VtZW50LCBjb25zdCBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIFQyIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBwb2ludGVyLkdldFdpdGhEZWZhdWx0KGRvY3VtZW50LCBkZWZhdWx0VmFsdWUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRG9jdW1lbnRUeXBlLCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4+Ci10eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgR2V0VmFsdWVCeVBvaW50ZXJXaXRoRGVmYXVsdChEb2N1bWVudFR5cGUmIGRvY3VtZW50LCBjb25zdCBDaGFyVHlwZSgmc291cmNlKVtOXSwgY29uc3QgdHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGUmIGRlZmF1bHRWYWx1ZSkgewotICAgIHJldHVybiBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZT4oc291cmNlLCBOIC0gMSkuR2V0V2l0aERlZmF1bHQoZG9jdW1lbnQsIGRlZmF1bHRWYWx1ZSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEb2N1bWVudFR5cGUsIHR5cGVuYW1lIENoYXJUeXBlLCBzaXplX3QgTj4KLXR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlJiBHZXRWYWx1ZUJ5UG9pbnRlcldpdGhEZWZhdWx0KERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCBjb25zdCB0eXBlbmFtZSBEb2N1bWVudFR5cGU6OkNoKiBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGU+KHNvdXJjZSwgTiAtIDEpLkdldFdpdGhEZWZhdWx0KGRvY3VtZW50LCBkZWZhdWx0VmFsdWUpOwotfQotCi0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLXRlbXBsYXRlIDx0eXBlbmFtZSBEb2N1bWVudFR5cGUsIHR5cGVuYW1lIENoYXJUeXBlLCBzaXplX3QgTj4KLXR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlJiBHZXRWYWx1ZUJ5UG9pbnRlcldpdGhEZWZhdWx0KERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCBjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzx0eXBlbmFtZSBEb2N1bWVudFR5cGU6OkNoPiYgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlPihzb3VyY2UsIE4gLSAxKS5HZXRXaXRoRGVmYXVsdChkb2N1bWVudCwgZGVmYXVsdFZhbHVlKTsKLX0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRG9jdW1lbnRUeXBlLCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4sIHR5cGVuYW1lIFQyPgotUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpPckV4cHI8aW50ZXJuYWw6OklzUG9pbnRlcjxUMj4sIGludGVybmFsOjpJc0dlbmVyaWNWYWx1ZTxUMj4gPiksICh0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYpKQotR2V0VmFsdWVCeVBvaW50ZXJXaXRoRGVmYXVsdChEb2N1bWVudFR5cGUmIGRvY3VtZW50LCBjb25zdCBDaGFyVHlwZSgmc291cmNlKVtOXSwgVDIgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlPihzb3VyY2UsIE4gLSAxKS5HZXRXaXRoRGVmYXVsdChkb2N1bWVudCwgZGVmYXVsdFZhbHVlKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdHlwZW5hbWUgVDo6VmFsdWVUeXBlJiBTZXRWYWx1ZUJ5UG9pbnRlcihUJiByb290LCBjb25zdCBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBUOjpWYWx1ZVR5cGU+JiBwb2ludGVyLCB0eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIHZhbHVlLCB0eXBlbmFtZSBUOjpBbGxvY2F0b3JUeXBlJiBhKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuU2V0KHJvb3QsIHZhbHVlLCBhKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIFNldFZhbHVlQnlQb2ludGVyKFQmIHJvb3QsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIGNvbnN0IHR5cGVuYW1lIFQ6OlZhbHVlVHlwZSYgdmFsdWUsIHR5cGVuYW1lIFQ6OkFsbG9jYXRvclR5cGUmIGEpIHsKLSAgICByZXR1cm4gcG9pbnRlci5TZXQocm9vdCwgdmFsdWUsIGEpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIFQ6OlZhbHVlVHlwZSYgU2V0VmFsdWVCeVBvaW50ZXIoVCYgcm9vdCwgY29uc3QgR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgVDo6VmFsdWVUeXBlPiYgcG9pbnRlciwgY29uc3QgdHlwZW5hbWUgVDo6Q2gqIHZhbHVlLCB0eXBlbmFtZSBUOjpBbGxvY2F0b3JUeXBlJiBhKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuU2V0KHJvb3QsIHZhbHVlLCBhKTsKLX0KLQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIFQ6OlZhbHVlVHlwZSYgU2V0VmFsdWVCeVBvaW50ZXIoVCYgcm9vdCwgY29uc3QgR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgVDo6VmFsdWVUeXBlPiYgcG9pbnRlciwgY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8dHlwZW5hbWUgVDo6Q2g+JiB2YWx1ZSwgdHlwZW5hbWUgVDo6QWxsb2NhdG9yVHlwZSYgYSkgewotICAgIHJldHVybiBwb2ludGVyLlNldChyb290LCB2YWx1ZSwgYSk7Ci19Ci0jZW5kaWYKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQyPgotUkFQSURKU09OX0RJU0FCTEVJRl9SRVRVUk4oKGludGVybmFsOjpPckV4cHI8aW50ZXJuYWw6OklzUG9pbnRlcjxUMj4sIGludGVybmFsOjpJc0dlbmVyaWNWYWx1ZTxUMj4gPiksICh0eXBlbmFtZSBUOjpWYWx1ZVR5cGUmKSkKLVNldFZhbHVlQnlQb2ludGVyKFQmIHJvb3QsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIFQyIHZhbHVlLCB0eXBlbmFtZSBUOjpBbGxvY2F0b3JUeXBlJiBhKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuU2V0KHJvb3QsIHZhbHVlLCBhKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENoYXJUeXBlLCBzaXplX3QgTj4KLXR5cGVuYW1lIFQ6OlZhbHVlVHlwZSYgU2V0VmFsdWVCeVBvaW50ZXIoVCYgcm9vdCwgY29uc3QgQ2hhclR5cGUoJnNvdXJjZSlbTl0sIHR5cGVuYW1lIFQ6OlZhbHVlVHlwZSYgdmFsdWUsIHR5cGVuYW1lIFQ6OkFsbG9jYXRvclR5cGUmIGEpIHsKLSAgICByZXR1cm4gR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgVDo6VmFsdWVUeXBlPihzb3VyY2UsIE4gLSAxKS5TZXQocm9vdCwgdmFsdWUsIGEpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ2hhclR5cGUsIHNpemVfdCBOPgotdHlwZW5hbWUgVDo6VmFsdWVUeXBlJiBTZXRWYWx1ZUJ5UG9pbnRlcihUJiByb290LCBjb25zdCBDaGFyVHlwZSgmc291cmNlKVtOXSwgY29uc3QgdHlwZW5hbWUgVDo6VmFsdWVUeXBlJiB2YWx1ZSwgdHlwZW5hbWUgVDo6QWxsb2NhdG9yVHlwZSYgYSkgewotICAgIHJldHVybiBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBUOjpWYWx1ZVR5cGU+KHNvdXJjZSwgTiAtIDEpLlNldChyb290LCB2YWx1ZSwgYSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4+Ci10eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIFNldFZhbHVlQnlQb2ludGVyKFQmIHJvb3QsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCBjb25zdCB0eXBlbmFtZSBUOjpDaCogdmFsdWUsIHR5cGVuYW1lIFQ6OkFsbG9jYXRvclR5cGUmIGEpIHsKLSAgICByZXR1cm4gR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgVDo6VmFsdWVUeXBlPihzb3VyY2UsIE4gLSAxKS5TZXQocm9vdCwgdmFsdWUsIGEpOwotfQotCi0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4+Ci10eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIFNldFZhbHVlQnlQb2ludGVyKFQmIHJvb3QsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCBjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzx0eXBlbmFtZSBUOjpDaD4mIHZhbHVlLCB0eXBlbmFtZSBUOjpBbGxvY2F0b3JUeXBlJiBhKSB7Ci0gICAgcmV0dXJuIEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4oc291cmNlLCBOIC0gMSkuU2V0KHJvb3QsIHZhbHVlLCBhKTsKLX0KLSNlbmRpZgotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ2hhclR5cGUsIHNpemVfdCBOLCB0eXBlbmFtZSBUMj4KLVJBUElESlNPTl9ESVNBQkxFSUZfUkVUVVJOKChpbnRlcm5hbDo6T3JFeHByPGludGVybmFsOjpJc1BvaW50ZXI8VDI+LCBpbnRlcm5hbDo6SXNHZW5lcmljVmFsdWU8VDI+ID4pLCAodHlwZW5hbWUgVDo6VmFsdWVUeXBlJikpCi1TZXRWYWx1ZUJ5UG9pbnRlcihUJiByb290LCBjb25zdCBDaGFyVHlwZSgmc291cmNlKVtOXSwgVDIgdmFsdWUsIHR5cGVuYW1lIFQ6OkFsbG9jYXRvclR5cGUmIGEpIHsKLSAgICByZXR1cm4gR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgVDo6VmFsdWVUeXBlPihzb3VyY2UsIE4gLSAxKS5TZXQocm9vdCwgdmFsdWUsIGEpOwotfQotCi0vLyBObyBhbGxvY2F0b3IgcGFyYW1ldGVyCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEb2N1bWVudFR5cGU+Ci10eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgU2V0VmFsdWVCeVBvaW50ZXIoRG9jdW1lbnRUeXBlJiBkb2N1bWVudCwgY29uc3QgR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGU+JiBwb2ludGVyLCB0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgdmFsdWUpIHsKLSAgICByZXR1cm4gcG9pbnRlci5TZXQoZG9jdW1lbnQsIHZhbHVlKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERvY3VtZW50VHlwZT4KLXR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlJiBTZXRWYWx1ZUJ5UG9pbnRlcihEb2N1bWVudFR5cGUmIGRvY3VtZW50LCBjb25zdCBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIGNvbnN0IHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlJiB2YWx1ZSkgewotICAgIHJldHVybiBwb2ludGVyLlNldChkb2N1bWVudCwgdmFsdWUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRG9jdW1lbnRUeXBlPgotdHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGUmIFNldFZhbHVlQnlQb2ludGVyKERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlPiYgcG9pbnRlciwgY29uc3QgdHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpDaCogdmFsdWUpIHsKLSAgICByZXR1cm4gcG9pbnRlci5TZXQoZG9jdW1lbnQsIHZhbHVlKTsKLX0KLQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRG9jdW1lbnRUeXBlPgotdHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGUmIFNldFZhbHVlQnlQb2ludGVyKERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlPiYgcG9pbnRlciwgY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8dHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpDaD4mIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuU2V0KGRvY3VtZW50LCB2YWx1ZSk7Ci19Ci0jZW5kaWYKLQotdGVtcGxhdGUgPHR5cGVuYW1lIERvY3VtZW50VHlwZSwgdHlwZW5hbWUgVDI+Ci1SQVBJREpTT05fRElTQUJMRUlGX1JFVFVSTigoaW50ZXJuYWw6Ok9yRXhwcjxpbnRlcm5hbDo6SXNQb2ludGVyPFQyPiwgaW50ZXJuYWw6OklzR2VuZXJpY1ZhbHVlPFQyPiA+KSwgKHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlJikpCi1TZXRWYWx1ZUJ5UG9pbnRlcihEb2N1bWVudFR5cGUmIGRvY3VtZW50LCBjb25zdCBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIFQyIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuU2V0KGRvY3VtZW50LCB2YWx1ZSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEb2N1bWVudFR5cGUsIHR5cGVuYW1lIENoYXJUeXBlLCBzaXplX3QgTj4KLXR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlJiBTZXRWYWx1ZUJ5UG9pbnRlcihEb2N1bWVudFR5cGUmIGRvY3VtZW50LCBjb25zdCBDaGFyVHlwZSgmc291cmNlKVtOXSwgdHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGUmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlPihzb3VyY2UsIE4gLSAxKS5TZXQoZG9jdW1lbnQsIHZhbHVlKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERvY3VtZW50VHlwZSwgdHlwZW5hbWUgQ2hhclR5cGUsIHNpemVfdCBOPgotdHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGUmIFNldFZhbHVlQnlQb2ludGVyKERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCBjb25zdCB0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgdmFsdWUpIHsKLSAgICByZXR1cm4gR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGU+KHNvdXJjZSwgTiAtIDEpLlNldChkb2N1bWVudCwgdmFsdWUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRG9jdW1lbnRUeXBlLCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4+Ci10eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgU2V0VmFsdWVCeVBvaW50ZXIoRG9jdW1lbnRUeXBlJiBkb2N1bWVudCwgY29uc3QgQ2hhclR5cGUoJnNvdXJjZSlbTl0sIGNvbnN0IHR5cGVuYW1lIERvY3VtZW50VHlwZTo6Q2gqIHZhbHVlKSB7Ci0gICAgcmV0dXJuIEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlPihzb3VyY2UsIE4gLSAxKS5TZXQoZG9jdW1lbnQsIHZhbHVlKTsKLX0KLQotI2lmIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRG9jdW1lbnRUeXBlLCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4+Ci10eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgU2V0VmFsdWVCeVBvaW50ZXIoRG9jdW1lbnRUeXBlJiBkb2N1bWVudCwgY29uc3QgQ2hhclR5cGUoJnNvdXJjZSlbTl0sIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6Q2g+JiB2YWx1ZSkgewotICAgIHJldHVybiBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZT4oc291cmNlLCBOIC0gMSkuU2V0KGRvY3VtZW50LCB2YWx1ZSk7Ci19Ci0jZW5kaWYKLQotdGVtcGxhdGUgPHR5cGVuYW1lIERvY3VtZW50VHlwZSwgdHlwZW5hbWUgQ2hhclR5cGUsIHNpemVfdCBOLCB0eXBlbmFtZSBUMj4KLVJBUElESlNPTl9ESVNBQkxFSUZfUkVUVVJOKChpbnRlcm5hbDo6T3JFeHByPGludGVybmFsOjpJc1BvaW50ZXI8VDI+LCBpbnRlcm5hbDo6SXNHZW5lcmljVmFsdWU8VDI+ID4pLCAodHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGUmKSkKLVNldFZhbHVlQnlQb2ludGVyKERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCBUMiB2YWx1ZSkgewotICAgIHJldHVybiBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZT4oc291cmNlLCBOIC0gMSkuU2V0KGRvY3VtZW50LCB2YWx1ZSk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIFQ6OlZhbHVlVHlwZSYgU3dhcFZhbHVlQnlQb2ludGVyKFQmIHJvb3QsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4mIHBvaW50ZXIsIHR5cGVuYW1lIFQ6OlZhbHVlVHlwZSYgdmFsdWUsIHR5cGVuYW1lIFQ6OkFsbG9jYXRvclR5cGUmIGEpIHsKLSAgICByZXR1cm4gcG9pbnRlci5Td2FwKHJvb3QsIHZhbHVlLCBhKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENoYXJUeXBlLCBzaXplX3QgTj4KLXR5cGVuYW1lIFQ6OlZhbHVlVHlwZSYgU3dhcFZhbHVlQnlQb2ludGVyKFQmIHJvb3QsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCB0eXBlbmFtZSBUOjpWYWx1ZVR5cGUmIHZhbHVlLCB0eXBlbmFtZSBUOjpBbGxvY2F0b3JUeXBlJiBhKSB7Ci0gICAgcmV0dXJuIEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4oc291cmNlLCBOIC0gMSkuU3dhcChyb290LCB2YWx1ZSwgYSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEb2N1bWVudFR5cGU+Ci10eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgU3dhcFZhbHVlQnlQb2ludGVyKERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIERvY3VtZW50VHlwZTo6VmFsdWVUeXBlPiYgcG9pbnRlciwgdHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGUmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHBvaW50ZXIuU3dhcChkb2N1bWVudCwgdmFsdWUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRG9jdW1lbnRUeXBlLCB0eXBlbmFtZSBDaGFyVHlwZSwgc2l6ZV90IE4+Ci10eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgU3dhcFZhbHVlQnlQb2ludGVyKERvY3VtZW50VHlwZSYgZG9jdW1lbnQsIGNvbnN0IENoYXJUeXBlKCZzb3VyY2UpW05dLCB0eXBlbmFtZSBEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSYgdmFsdWUpIHsKLSAgICByZXR1cm4gR2VuZXJpY1BvaW50ZXI8dHlwZW5hbWUgRG9jdW1lbnRUeXBlOjpWYWx1ZVR5cGU+KHNvdXJjZSwgTiAtIDEpLlN3YXAoZG9jdW1lbnQsIHZhbHVlKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBFcmFzZVZhbHVlQnlQb2ludGVyKFQmIHJvb3QsIGNvbnN0IEdlbmVyaWNQb2ludGVyPHR5cGVuYW1lIFQ6OlZhbHVlVHlwZT4mIHBvaW50ZXIpIHsKLSAgICByZXR1cm4gcG9pbnRlci5FcmFzZShyb290KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENoYXJUeXBlLCBzaXplX3QgTj4KLWJvb2wgRXJhc2VWYWx1ZUJ5UG9pbnRlcihUJiByb290LCBjb25zdCBDaGFyVHlwZSgmc291cmNlKVtOXSkgewotICAgIHJldHVybiBHZW5lcmljUG9pbnRlcjx0eXBlbmFtZSBUOjpWYWx1ZVR5cGU+KHNvdXJjZSwgTiAtIDEpLkVyYXNlKHJvb3QpOwotfQotCi0vL0B9Ci0KLVJBUElESlNPTl9OQU1FU1BBQ0VfRU5ECi0KLSNpZmRlZiBfX2NsYW5nX18KLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLSNlbmRpZiAvLyBSQVBJREpTT05fUE9JTlRFUl9IXwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9wcmV0dHl3cml0ZXIuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vcHJldHR5d3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZGM0NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9wcmV0dHl3cml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vLyBUZW5jZW50IGlzIHBsZWFzZWQgdG8gc3VwcG9ydCB0aGUgb3BlbiBzb3VyY2UgY29tbXVuaXR5IGJ5IG1ha2luZyBSYXBpZEpTT04gYXZhaWxhYmxlLgotLy8gCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTUgVEhMIEEyOSBMaW1pdGVkLCBhIFRlbmNlbnQgY29tcGFueSwgYW5kIE1pbG8gWWlwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0Ci0vLyBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIAotLy8gdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIAotLy8gQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgCi0vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFJBUElESlNPTl9QUkVUVFlXUklURVJfSF8KLSNkZWZpbmUgUkFQSURKU09OX1BSRVRUWVdSSVRFUl9IXwotCi0jaW5jbHVkZSAid3JpdGVyLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKGVmZmMrKykKLSNlbmRpZgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi0KLS8vISBDb21iaW5hdGlvbiBvZiBQcmV0dHlXcml0ZXIgZm9ybWF0IGZsYWdzLgotLyohIFxzZWUgUHJldHR5V3JpdGVyOjpTZXRGb3JtYXRPcHRpb25zCi0gKi8KLWVudW0gUHJldHR5Rm9ybWF0T3B0aW9ucyB7Ci0gICAga0Zvcm1hdERlZmF1bHQgPSAwLCAgICAgICAgIC8vITwgRGVmYXVsdCBwcmV0dHkgZm9ybWF0dGluZy4KLSAgICBrRm9ybWF0U2luZ2xlTGluZUFycmF5ID0gMSAgLy8hPCBGb3JtYXQgYXJyYXlzIG9uIGEgc2luZ2xlIGxpbmUuCi19OwotCi0vLyEgV3JpdGVyIHdpdGggaW5kZW50YXRpb24gYW5kIHNwYWNpbmcuCi0vKiEKLSAgICBcdHBhcmFtIE91dHB1dFN0cmVhbSBUeXBlIG9mIG91cHR1dCBvcy4KLSAgICBcdHBhcmFtIFNvdXJjZUVuY29kaW5nIEVuY29kaW5nIG9mIHNvdXJjZSBzdHJpbmcuCi0gICAgXHRwYXJhbSBUYXJnZXRFbmNvZGluZyBFbmNvZGluZyBvZiBvdXRwdXQgc3RyZWFtLgotICAgIFx0cGFyYW0gU3RhY2tBbGxvY2F0b3IgVHlwZSBvZiBhbGxvY2F0b3IgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IG9mIHN0YWNrLgotKi8KLXRlbXBsYXRlPHR5cGVuYW1lIE91dHB1dFN0cmVhbSwgdHlwZW5hbWUgU291cmNlRW5jb2RpbmcgPSBVVEY4PD4sIHR5cGVuYW1lIFRhcmdldEVuY29kaW5nID0gVVRGODw+LCB0eXBlbmFtZSBTdGFja0FsbG9jYXRvciA9IENydEFsbG9jYXRvciwgdW5zaWduZWQgd3JpdGVGbGFncyA9IGtXcml0ZURlZmF1bHRGbGFncz4KLWNsYXNzIFByZXR0eVdyaXRlciA6IHB1YmxpYyBXcml0ZXI8T3V0cHV0U3RyZWFtLCBTb3VyY2VFbmNvZGluZywgVGFyZ2V0RW5jb2RpbmcsIFN0YWNrQWxsb2NhdG9yLCB3cml0ZUZsYWdzPiB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBXcml0ZXI8T3V0cHV0U3RyZWFtLCBTb3VyY2VFbmNvZGluZywgVGFyZ2V0RW5jb2RpbmcsIFN0YWNrQWxsb2NhdG9yPiBCYXNlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgQmFzZTo6Q2ggQ2g7Ci0KLSAgICAvLyEgQ29uc3RydWN0b3IKLSAgICAvKiEgXHBhcmFtIG9zIE91dHB1dCBzdHJlYW0uCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgVXNlciBzdXBwbGllZCBhbGxvY2F0b3IuIElmIGl0IGlzIG51bGwsIGl0IHdpbGwgY3JlYXRlIGEgcHJpdmF0ZSBvbmUuCi0gICAgICAgIFxwYXJhbSBsZXZlbERlcHRoIEluaXRpYWwgY2FwYWNpdHkgb2Ygc3RhY2suCi0gICAgKi8KLSAgICBleHBsaWNpdCBQcmV0dHlXcml0ZXIoT3V0cHV0U3RyZWFtJiBvcywgU3RhY2tBbGxvY2F0b3IqIGFsbG9jYXRvciA9IDAsIHNpemVfdCBsZXZlbERlcHRoID0gQmFzZTo6a0RlZmF1bHRMZXZlbERlcHRoKSA6IAotICAgICAgICBCYXNlKG9zLCBhbGxvY2F0b3IsIGxldmVsRGVwdGgpLCBpbmRlbnRDaGFyXygnICcpLCBpbmRlbnRDaGFyQ291bnRfKDQpLCBmb3JtYXRPcHRpb25zXyhrRm9ybWF0RGVmYXVsdCkge30KLQotCi0gICAgZXhwbGljaXQgUHJldHR5V3JpdGVyKFN0YWNrQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwLCBzaXplX3QgbGV2ZWxEZXB0aCA9IEJhc2U6OmtEZWZhdWx0TGV2ZWxEZXB0aCkgOiAKLSAgICAgICAgQmFzZShhbGxvY2F0b3IsIGxldmVsRGVwdGgpLCBpbmRlbnRDaGFyXygnICcpLCBpbmRlbnRDaGFyQ291bnRfKDQpIHt9Ci0KLSAgICAvLyEgU2V0IGN1c3RvbSBpbmRlbnRhdGlvbi4KLSAgICAvKiEgXHBhcmFtIGluZGVudENoYXIgICAgICAgQ2hhcmFjdGVyIGZvciBpbmRlbnRhdGlvbi4gTXVzdCBiZSB3aGl0ZXNwYWNlIGNoYXJhY3RlciAoJyAnLCAnXFx0JywgJ1xcbicsICdcXHInKS4KLSAgICAgICAgXHBhcmFtIGluZGVudENoYXJDb3VudCAgTnVtYmVyIG9mIGluZGVudCBjaGFyYWN0ZXJzIGZvciBlYWNoIGluZGVudGF0aW9uIGxldmVsLgotICAgICAgICBcbm90ZSBUaGUgZGVmYXVsdCBpbmRlbnRhdGlvbiBpcyA0IHNwYWNlcy4KLSAgICAqLwotICAgIFByZXR0eVdyaXRlciYgU2V0SW5kZW50KENoIGluZGVudENoYXIsIHVuc2lnbmVkIGluZGVudENoYXJDb3VudCkgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGluZGVudENoYXIgPT0gJyAnIHx8IGluZGVudENoYXIgPT0gJ1x0JyB8fCBpbmRlbnRDaGFyID09ICdcbicgfHwgaW5kZW50Q2hhciA9PSAnXHInKTsKLSAgICAgICAgaW5kZW50Q2hhcl8gPSBpbmRlbnRDaGFyOwotICAgICAgICBpbmRlbnRDaGFyQ291bnRfID0gaW5kZW50Q2hhckNvdW50OwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgLy8hIFNldCBwcmV0dHkgd3JpdGVyIGZvcm1hdHRpbmcgb3B0aW9ucy4KLSAgICAvKiEgXHBhcmFtIG9wdGlvbnMgRm9ybWF0dGluZyBvcHRpb25zLgotICAgICovCi0gICAgUHJldHR5V3JpdGVyJiBTZXRGb3JtYXRPcHRpb25zKFByZXR0eUZvcm1hdE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICBmb3JtYXRPcHRpb25zXyA9IG9wdGlvbnM7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvKiEgQG5hbWUgSW1wbGVtZW50YXRpb24gb2YgSGFuZGxlcgotICAgICAgICBcc2VlIEhhbmRsZXIKLSAgICAqLwotICAgIC8vQHsKLQotICAgIGJvb2wgTnVsbCgpICAgICAgICAgICAgICAgICB7IFByZXR0eVByZWZpeChrTnVsbFR5cGUpOyAgIHJldHVybiBCYXNlOjpXcml0ZU51bGwoKTsgfQotICAgIGJvb2wgQm9vbChib29sIGIpICAgICAgICAgICB7IFByZXR0eVByZWZpeChiID8ga1RydWVUeXBlIDoga0ZhbHNlVHlwZSk7IHJldHVybiBCYXNlOjpXcml0ZUJvb2woYik7IH0KLSAgICBib29sIEludChpbnQgaSkgICAgICAgICAgICAgeyBQcmV0dHlQcmVmaXgoa051bWJlclR5cGUpOyByZXR1cm4gQmFzZTo6V3JpdGVJbnQoaSk7IH0KLSAgICBib29sIFVpbnQodW5zaWduZWQgdSkgICAgICAgeyBQcmV0dHlQcmVmaXgoa051bWJlclR5cGUpOyByZXR1cm4gQmFzZTo6V3JpdGVVaW50KHUpOyB9Ci0gICAgYm9vbCBJbnQ2NChpbnQ2NF90IGk2NCkgICAgIHsgUHJldHR5UHJlZml4KGtOdW1iZXJUeXBlKTsgcmV0dXJuIEJhc2U6OldyaXRlSW50NjQoaTY0KTsgfQotICAgIGJvb2wgVWludDY0KHVpbnQ2NF90IHU2NCkgICB7IFByZXR0eVByZWZpeChrTnVtYmVyVHlwZSk7IHJldHVybiBCYXNlOjpXcml0ZVVpbnQ2NCh1NjQpOyAgfQotICAgIGJvb2wgRG91YmxlKGRvdWJsZSBkKSAgICAgICB7IFByZXR0eVByZWZpeChrTnVtYmVyVHlwZSk7IHJldHVybiBCYXNlOjpXcml0ZURvdWJsZShkKTsgfQotCi0gICAgYm9vbCBSYXdOdW1iZXIoY29uc3QgQ2gqIHN0ciwgU2l6ZVR5cGUgbGVuZ3RoLCBib29sIGNvcHkgPSBmYWxzZSkgewotICAgICAgICAodm9pZCljb3B5OwotICAgICAgICBQcmV0dHlQcmVmaXgoa051bWJlclR5cGUpOwotICAgICAgICByZXR1cm4gQmFzZTo6V3JpdGVTdHJpbmcoc3RyLCBsZW5ndGgpOwotICAgIH0KLQotICAgIGJvb2wgU3RyaW5nKGNvbnN0IENoKiBzdHIsIFNpemVUeXBlIGxlbmd0aCwgYm9vbCBjb3B5ID0gZmFsc2UpIHsKLSAgICAgICAgKHZvaWQpY29weTsKLSAgICAgICAgUHJldHR5UHJlZml4KGtTdHJpbmdUeXBlKTsKLSAgICAgICAgcmV0dXJuIEJhc2U6OldyaXRlU3RyaW5nKHN0ciwgbGVuZ3RoKTsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIGJvb2wgU3RyaW5nKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgc3RyKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcoc3RyLmRhdGEoKSwgU2l6ZVR5cGUoc3RyLnNpemUoKSkpOwotICAgIH0KLSNlbmRpZgotCi0gICAgYm9vbCBTdGFydE9iamVjdCgpIHsKLSAgICAgICAgUHJldHR5UHJlZml4KGtPYmplY3RUeXBlKTsKLSAgICAgICAgbmV3IChCYXNlOjpsZXZlbF9zdGFja18udGVtcGxhdGUgUHVzaDx0eXBlbmFtZSBCYXNlOjpMZXZlbD4oKSkgdHlwZW5hbWUgQmFzZTo6TGV2ZWwoZmFsc2UpOwotICAgICAgICByZXR1cm4gQmFzZTo6V3JpdGVTdGFydE9iamVjdCgpOwotICAgIH0KLQotICAgIGJvb2wgS2V5KGNvbnN0IENoKiBzdHIsIFNpemVUeXBlIGxlbmd0aCwgYm9vbCBjb3B5ID0gZmFsc2UpIHsgcmV0dXJuIFN0cmluZyhzdHIsIGxlbmd0aCwgY29weSk7IH0KLQkKLSAgICBib29sIEVuZE9iamVjdChTaXplVHlwZSBtZW1iZXJDb3VudCA9IDApIHsKLSAgICAgICAgKHZvaWQpbWVtYmVyQ291bnQ7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoQmFzZTo6bGV2ZWxfc3RhY2tfLkdldFNpemUoKSA+PSBzaXplb2YodHlwZW5hbWUgQmFzZTo6TGV2ZWwpKTsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVCghQmFzZTo6bGV2ZWxfc3RhY2tfLnRlbXBsYXRlIFRvcDx0eXBlbmFtZSBCYXNlOjpMZXZlbD4oKS0+aW5BcnJheSk7Ci0gICAgICAgIGJvb2wgZW1wdHkgPSBCYXNlOjpsZXZlbF9zdGFja18udGVtcGxhdGUgUG9wPHR5cGVuYW1lIEJhc2U6OkxldmVsPigxKS0+dmFsdWVDb3VudCA9PSAwOwotCi0gICAgICAgIGlmICghZW1wdHkpIHsKLSAgICAgICAgICAgIEJhc2U6Om9zXy0+UHV0KCdcbicpOwotICAgICAgICAgICAgV3JpdGVJbmRlbnQoKTsKLSAgICAgICAgfQotICAgICAgICBib29sIHJldCA9IEJhc2U6OldyaXRlRW5kT2JqZWN0KCk7Ci0gICAgICAgICh2b2lkKXJldDsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChyZXQgPT0gdHJ1ZSk7Ci0gICAgICAgIGlmIChCYXNlOjpsZXZlbF9zdGFja18uRW1wdHkoKSkgLy8gZW5kIG9mIGpzb24gdGV4dAotICAgICAgICAgICAgQmFzZTo6b3NfLT5GbHVzaCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIFN0YXJ0QXJyYXkoKSB7Ci0gICAgICAgIFByZXR0eVByZWZpeChrQXJyYXlUeXBlKTsKLSAgICAgICAgbmV3IChCYXNlOjpsZXZlbF9zdGFja18udGVtcGxhdGUgUHVzaDx0eXBlbmFtZSBCYXNlOjpMZXZlbD4oKSkgdHlwZW5hbWUgQmFzZTo6TGV2ZWwodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBCYXNlOjpXcml0ZVN0YXJ0QXJyYXkoKTsKLSAgICB9Ci0KLSAgICBib29sIEVuZEFycmF5KFNpemVUeXBlIG1lbWJlckNvdW50ID0gMCkgewotICAgICAgICAodm9pZCltZW1iZXJDb3VudDsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChCYXNlOjpsZXZlbF9zdGFja18uR2V0U2l6ZSgpID49IHNpemVvZih0eXBlbmFtZSBCYXNlOjpMZXZlbCkpOwotICAgICAgICBSQVBJREpTT05fQVNTRVJUKEJhc2U6OmxldmVsX3N0YWNrXy50ZW1wbGF0ZSBUb3A8dHlwZW5hbWUgQmFzZTo6TGV2ZWw+KCktPmluQXJyYXkpOwotICAgICAgICBib29sIGVtcHR5ID0gQmFzZTo6bGV2ZWxfc3RhY2tfLnRlbXBsYXRlIFBvcDx0eXBlbmFtZSBCYXNlOjpMZXZlbD4oMSktPnZhbHVlQ291bnQgPT0gMDsKLQotICAgICAgICBpZiAoIWVtcHR5ICYmICEoZm9ybWF0T3B0aW9uc18gJiBrRm9ybWF0U2luZ2xlTGluZUFycmF5KSkgewotICAgICAgICAgICAgQmFzZTo6b3NfLT5QdXQoJ1xuJyk7Ci0gICAgICAgICAgICBXcml0ZUluZGVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgcmV0ID0gQmFzZTo6V3JpdGVFbmRBcnJheSgpOwotICAgICAgICAodm9pZClyZXQ7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQocmV0ID09IHRydWUpOwotICAgICAgICBpZiAoQmFzZTo6bGV2ZWxfc3RhY2tfLkVtcHR5KCkpIC8vIGVuZCBvZiBqc29uIHRleHQKLSAgICAgICAgICAgIEJhc2U6Om9zXy0+Rmx1c2goKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy9AfQotCi0gICAgLyohIEBuYW1lIENvbnZlbmllbmNlIGV4dGVuc2lvbnMgKi8KLSAgICAvL0B7Ci0KLSAgICAvLyEgU2ltcGxlciBidXQgc2xvd2VyIG92ZXJsb2FkLgotICAgIGJvb2wgU3RyaW5nKGNvbnN0IENoKiBzdHIpIHsgcmV0dXJuIFN0cmluZyhzdHIsIGludGVybmFsOjpTdHJMZW4oc3RyKSk7IH0KLSAgICBib29sIEtleShjb25zdCBDaCogc3RyKSB7IHJldHVybiBLZXkoc3RyLCBpbnRlcm5hbDo6U3RyTGVuKHN0cikpOyB9Ci0KLSAgICAvL0B9Ci0KLSAgICAvLyEgV3JpdGUgYSByYXcgSlNPTiB2YWx1ZS4KLSAgICAvKiEKLSAgICAgICAgRm9yIHVzZXIgdG8gd3JpdGUgYSBzdHJpbmdpZmllZCBKU09OIGFzIGEgdmFsdWUuCi0KLSAgICAgICAgXHBhcmFtIGpzb24gQSB3ZWxsLWZvcm1lZCBKU09OIHZhbHVlLiBJdCBzaG91bGQgbm90IGNvbnRhaW4gbnVsbCBjaGFyYWN0ZXIgd2l0aGluIFswLCBsZW5ndGggLSAxXSByYW5nZS4KLSAgICAgICAgXHBhcmFtIGxlbmd0aCBMZW5ndGggb2YgdGhlIGpzb24uCi0gICAgICAgIFxwYXJhbSB0eXBlIFR5cGUgb2YgdGhlIHJvb3Qgb2YganNvbi4KLSAgICAgICAgXG5vdGUgV2hlbiB1c2luZyBQcmV0dHlXcml0ZXI6OlJhd1ZhbHVlKCksIHRoZSByZXN1bHQganNvbiBtYXkgbm90IGJlIGluZGVudGVkIGNvcnJlY3RseS4KLSAgICAqLwotICAgIGJvb2wgUmF3VmFsdWUoY29uc3QgQ2gqIGpzb24sIHNpemVfdCBsZW5ndGgsIFR5cGUgdHlwZSkgeyBQcmV0dHlQcmVmaXgodHlwZSk7IHJldHVybiBCYXNlOjpXcml0ZVJhd1ZhbHVlKGpzb24sIGxlbmd0aCk7IH0KLQotcHJvdGVjdGVkOgotICAgIHZvaWQgUHJldHR5UHJlZml4KFR5cGUgdHlwZSkgewotICAgICAgICAodm9pZCl0eXBlOwotICAgICAgICBpZiAoQmFzZTo6bGV2ZWxfc3RhY2tfLkdldFNpemUoKSAhPSAwKSB7IC8vIHRoaXMgdmFsdWUgaXMgbm90IGF0IHJvb3QKLSAgICAgICAgICAgIHR5cGVuYW1lIEJhc2U6OkxldmVsKiBsZXZlbCA9IEJhc2U6OmxldmVsX3N0YWNrXy50ZW1wbGF0ZSBUb3A8dHlwZW5hbWUgQmFzZTo6TGV2ZWw+KCk7Ci0KLSAgICAgICAgICAgIGlmIChsZXZlbC0+aW5BcnJheSkgewotICAgICAgICAgICAgICAgIGlmIChsZXZlbC0+dmFsdWVDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQmFzZTo6b3NfLT5QdXQoJywnKTsgLy8gYWRkIGNvbW1hIGlmIGl0IGlzIG5vdCB0aGUgZmlyc3QgZWxlbWVudCBpbiBhcnJheQotICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0T3B0aW9uc18gJiBrRm9ybWF0U2luZ2xlTGluZUFycmF5KQotICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTo6b3NfLT5QdXQoJyAnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIShmb3JtYXRPcHRpb25zXyAmIGtGb3JtYXRTaW5nbGVMaW5lQXJyYXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJhc2U6Om9zXy0+UHV0KCdcbicpOwotICAgICAgICAgICAgICAgICAgICBXcml0ZUluZGVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgeyAgLy8gaW4gb2JqZWN0Ci0gICAgICAgICAgICAgICAgaWYgKGxldmVsLT52YWx1ZUNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwtPnZhbHVlQ291bnQgJSAyID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJhc2U6Om9zXy0+UHV0KCcsJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCYXNlOjpvc18tPlB1dCgnXG4nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJhc2U6Om9zXy0+UHV0KCc6Jyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCYXNlOjpvc18tPlB1dCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgQmFzZTo6b3NfLT5QdXQoJ1xuJyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGV2ZWwtPnZhbHVlQ291bnQgJSAyID09IDApCi0gICAgICAgICAgICAgICAgICAgIFdyaXRlSW5kZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWxldmVsLT5pbkFycmF5ICYmIGxldmVsLT52YWx1ZUNvdW50ICUgMiA9PSAwKQotICAgICAgICAgICAgICAgIFJBUElESlNPTl9BU1NFUlQodHlwZSA9PSBrU3RyaW5nVHlwZSk7ICAvLyBpZiBpdCdzIGluIG9iamVjdCwgdGhlbiBldmVuIG51bWJlciBzaG91bGQgYmUgYSBuYW1lCi0gICAgICAgICAgICBsZXZlbC0+dmFsdWVDb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgUkFQSURKU09OX0FTU0VSVCghQmFzZTo6aGFzUm9vdF8pOyAgLy8gU2hvdWxkIG9ubHkgaGFzIG9uZSBhbmQgb25seSBvbmUgcm9vdC4KLSAgICAgICAgICAgIEJhc2U6Omhhc1Jvb3RfID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgV3JpdGVJbmRlbnQoKSAgewotICAgICAgICBzaXplX3QgY291bnQgPSAoQmFzZTo6bGV2ZWxfc3RhY2tfLkdldFNpemUoKSAvIHNpemVvZih0eXBlbmFtZSBCYXNlOjpMZXZlbCkpICogaW5kZW50Q2hhckNvdW50XzsKLSAgICAgICAgUHV0TigqQmFzZTo6b3NfLCBzdGF0aWNfY2FzdDx0eXBlbmFtZSBUYXJnZXRFbmNvZGluZzo6Q2g+KGluZGVudENoYXJfKSwgY291bnQpOwotICAgIH0KLQotICAgIENoIGluZGVudENoYXJfOwotICAgIHVuc2lnbmVkIGluZGVudENoYXJDb3VudF87Ci0gICAgUHJldHR5Rm9ybWF0T3B0aW9ucyBmb3JtYXRPcHRpb25zXzsKLQotcHJpdmF0ZToKLSAgICAvLyBQcm9oaWJpdCBjb3B5IGNvbnN0cnVjdG9yICYgYXNzaWdubWVudCBvcGVyYXRvci4KLSAgICBQcmV0dHlXcml0ZXIoY29uc3QgUHJldHR5V3JpdGVyJik7Ci0gICAgUHJldHR5V3JpdGVyJiBvcGVyYXRvcj0oY29uc3QgUHJldHR5V3JpdGVyJik7Ci19OwotCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jaWZkZWYgX19HTlVDX18KLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLSNlbmRpZiAvLyBSQVBJREpTT05fUkFQSURKU09OX0hfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL3JhcGlkanNvbi5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9yYXBpZGpzb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0MTA2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL3JhcGlkanNvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjExICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUuCi0vLyAKLS8vIENvcHlyaWdodCAoQykgMjAxNSBUSEwgQTI5IExpbWl0ZWQsIGEgVGVuY2VudCBjb21wYW55LCBhbmQgTWlsbyBZaXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0vLyB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgCi0vLyBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgUkFQSURKU09OX1JBUElESlNPTl9IXwotI2RlZmluZSBSQVBJREpTT05fUkFQSURKU09OX0hfCi0KLS8qIVxmaWxlIHJhcGlkanNvbi5oCi0gICAgXGJyaWVmIGNvbW1vbiBkZWZpbml0aW9ucyBhbmQgY29uZmlndXJhdGlvbgotICAgIAotICAgIFxzZWUgUkFQSURKU09OX0NPTkZJRwotICovCi0KLS8qISBcZGVmZ3JvdXAgUkFQSURKU09OX0NPTkZJRyBSYXBpZEpTT04gY29uZmlndXJhdGlvbgotICAgIFxicmllZiBDb25maWd1cmF0aW9uIG1hY3JvcyBmb3IgbGlicmFyeSBmZWF0dXJlcwotCi0gICAgU29tZSBSYXBpZEpTT04gZmVhdHVyZXMgYXJlIGNvbmZpZ3VyYWJsZSB0byBhZGFwdCB0aGUgbGlicmFyeSB0byBhIHdpZGUKLSAgICB2YXJpZXR5IG9mIHBsYXRmb3JtcywgZW52aXJvbm1lbnRzIGFuZCB1c2FnZSBzY2VuYXJpb3MuICBNb3N0IG9mIHRoZQotICAgIGZlYXR1cmVzIGNhbiBiZSBjb25maWd1cmVkIGluIHRlcm1zIG9mIG92ZXJyaWRlbiBvciBwcmVkZWZpbmVkCi0gICAgcHJlcHJvY2Vzc29yIG1hY3JvcyBhdCBjb21waWxlLXRpbWUuCi0KLSAgICBTb21lIGFkZGl0aW9uYWwgY3VzdG9taXphdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIFxyZWYgUkFQSURKU09OX0VSUk9SUyBBUElzLgotCi0gICAgXG5vdGUgVGhlc2UgbWFjcm9zIHNob3VsZCBiZSBnaXZlbiBvbiB0aGUgY29tcGlsZXIgY29tbWFuZC1saW5lCi0gICAgICAgICAgKHdoZXJlIGFwcGxpY2FibGUpICB0byBhdm9pZCBpbmNvbnNpc3RlbnQgdmFsdWVzIHdoZW4gY29tcGlsaW5nCi0gICAgICAgICAgZGlmZmVyZW50IHRyYW5zbGF0aW9uIHVuaXRzIG9mIGEgc2luZ2xlIGFwcGxpY2F0aW9uLgotICovCi0KLSNpbmNsdWRlIDxjc3RkbGliPiAgLy8gbWFsbG9jKCksIHJlYWxsb2MoKSwgZnJlZSgpLCBzaXplX3QKLSNpbmNsdWRlIDxjc3RyaW5nPiAgLy8gbWVtc2V0KCksIG1lbWNweSgpLCBtZW1tb3ZlKCksIG1lbWNtcCgpCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJBUElESlNPTl9WRVJTSU9OX1NUUklORwotLy8KLS8vIEFMV0FZUyBzeW5jaHJvbml6ZSB0aGUgZm9sbG93aW5nIDMgbWFjcm9zIHdpdGggY29ycmVzcG9uZGluZyB2YXJpYWJsZXMgaW4gL0NNYWtlTGlzdHMudHh0LgotLy8KLQotLy8hQGNvbmQgUkFQSURKU09OX0hJRERFTl9GUk9NX0RPWFlHRU4KLS8vIHRva2VuIHN0cmluZ2lmaWNhdGlvbgotI2RlZmluZSBSQVBJREpTT05fU1RSSU5HSUZZKHgpIFJBUElESlNPTl9ET19TVFJJTkdJRlkoeCkKLSNkZWZpbmUgUkFQSURKU09OX0RPX1NUUklOR0lGWSh4KSAjeAotLy8hQGVuZGNvbmQKLQotLyohIFxkZWYgUkFQSURKU09OX01BSk9SX1ZFUlNJT04KLSAgICBcaW5ncm91cCBSQVBJREpTT05fQ09ORklHCi0gICAgXGJyaWVmIE1ham9yIHZlcnNpb24gb2YgUmFwaWRKU09OIGluIGludGVnZXIuCi0qLwotLyohIFxkZWYgUkFQSURKU09OX01JTk9SX1ZFUlNJT04KLSAgICBcaW5ncm91cCBSQVBJREpTT05fQ09ORklHCi0gICAgXGJyaWVmIE1pbm9yIHZlcnNpb24gb2YgUmFwaWRKU09OIGluIGludGVnZXIuCi0qLwotLyohIFxkZWYgUkFQSURKU09OX1BBVENIX1ZFUlNJT04KLSAgICBcaW5ncm91cCBSQVBJREpTT05fQ09ORklHCi0gICAgXGJyaWVmIFBhdGNoIHZlcnNpb24gb2YgUmFwaWRKU09OIGluIGludGVnZXIuCi0qLwotLyohIFxkZWYgUkFQSURKU09OX1ZFUlNJT05fU1RSSU5HCi0gICAgXGluZ3JvdXAgUkFQSURKU09OX0NPTkZJRwotICAgIFxicmllZiBWZXJzaW9uIG9mIFJhcGlkSlNPTiBpbiAiPG1ham9yPi48bWlub3I+LjxwYXRjaD4iIHN0cmluZyBmb3JtYXQuCi0qLwotI2RlZmluZSBSQVBJREpTT05fTUFKT1JfVkVSU0lPTiAxCi0jZGVmaW5lIFJBUElESlNPTl9NSU5PUl9WRVJTSU9OIDAKLSNkZWZpbmUgUkFQSURKU09OX1BBVENIX1ZFUlNJT04gMgotI2RlZmluZSBSQVBJREpTT05fVkVSU0lPTl9TVFJJTkcgXAotICAgIFJBUElESlNPTl9TVFJJTkdJRlkoUkFQSURKU09OX01BSk9SX1ZFUlNJT04uUkFQSURKU09OX01JTk9SX1ZFUlNJT04uUkFQSURKU09OX1BBVENIX1ZFUlNJT04pCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJBUElESlNPTl9OQU1FU1BBQ0VfKEJFR0lOfEVORCkKLS8qISBcZGVmIFJBUElESlNPTl9OQU1FU1BBQ0UKLSAgICBcaW5ncm91cCBSQVBJREpTT05fQ09ORklHCi0gICAgXGJyaWVmICAgcHJvdmlkZSBjdXN0b20gcmFwaWRqc29uIG5hbWVzcGFjZQotCi0gICAgSW4gb3JkZXIgdG8gYXZvaWQgc3ltYm9sIGNsYXNoZXMgYW5kL29yICJPbmUgRGVmaW5pdGlvbiBSdWxlIiBlcnJvcnMKLSAgICBiZXR3ZWVuIG11bHRpcGxlIGluY2x1c2lvbnMgb2YgKGRpZmZlcmVudCB2ZXJzaW9ucyBvZikgUmFwaWRKU09OIGluCi0gICAgYSBzaW5nbGUgYmluYXJ5LCB1c2VycyBjYW4gY3VzdG9taXplIHRoZSBuYW1lIG9mIHRoZSBtYWluIFJhcGlkSlNPTgotICAgIG5hbWVzcGFjZS4KLQotICAgIEluIGNhc2Ugb2YgYSBzaW5nbGUgbmVzdGluZyBsZXZlbCwgZGVmaW5pbmcgXGMgUkFQSURKU09OX05BTUVTUEFDRQotICAgIHRvIGEgY3VzdG9tIG5hbWUgKGUuZy4gXGMgTXlSYXBpZEpTT04pIGlzIHN1ZmZpY2llbnQuICBJZiBtdWx0aXBsZQotICAgIGxldmVscyBhcmUgbmVlZGVkLCBib3RoIFxyZWYgUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTiBhbmQgXHJlZgotICAgIFJBUElESlNPTl9OQU1FU1BBQ0VfRU5EIG5lZWQgdG8gYmUgZGVmaW5lZCBhcyB3ZWxsOgotCi0gICAgXGNvZGUKLSAgICAvLyBpbiBzb21lIC5jcHAgZmlsZQotICAgICNkZWZpbmUgUkFQSURKU09OX05BTUVTUEFDRSBteTo6cmFwaWRqc29uCi0gICAgI2RlZmluZSBSQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOIG5hbWVzcGFjZSBteSB7IG5hbWVzcGFjZSByYXBpZGpzb24gewotICAgICNkZWZpbmUgUkFQSURKU09OX05BTUVTUEFDRV9FTkQgICB9IH0KLSAgICAjaW5jbHVkZSAicmFwaWRqc29uLy4uLiIKLSAgICBcZW5kY29kZQotCi0gICAgXHNlZSByYXBpZGpzb24KLSAqLwotLyohIFxkZWYgUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTgotICAgIFxpbmdyb3VwIFJBUElESlNPTl9DT05GSUcKLSAgICBcYnJpZWYgICBwcm92aWRlIGN1c3RvbSByYXBpZGpzb24gbmFtZXNwYWNlIChvcGVuaW5nIGV4cHJlc3Npb24pCi0gICAgXHNlZSBSQVBJREpTT05fTkFNRVNQQUNFCi0qLwotLyohIFxkZWYgUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLSAgICBcaW5ncm91cCBSQVBJREpTT05fQ09ORklHCi0gICAgXGJyaWVmICAgcHJvdmlkZSBjdXN0b20gcmFwaWRqc29uIG5hbWVzcGFjZSAoY2xvc2luZyBleHByZXNzaW9uKQotICAgIFxzZWUgUkFQSURKU09OX05BTUVTUEFDRQotKi8KLSNpZm5kZWYgUkFQSURKU09OX05BTUVTUEFDRQotI2RlZmluZSBSQVBJREpTT05fTkFNRVNQQUNFIHJhcGlkanNvbgotI2VuZGlmCi0jaWZuZGVmIFJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLSNkZWZpbmUgUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTiBuYW1lc3BhY2UgUkFQSURKU09OX05BTUVTUEFDRSB7Ci0jZW5kaWYKLSNpZm5kZWYgUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLSNkZWZpbmUgUkFQSURKU09OX05BTUVTUEFDRV9FTkQgfQotI2VuZGlmCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJBUElESlNPTl9IQVNfU1REU1RSSU5HCi0KLSNpZm5kZWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLSNpZmRlZiBSQVBJREpTT05fRE9YWUdFTl9SVU5OSU5HCi0jZGVmaW5lIFJBUElESlNPTl9IQVNfU1REU1RSSU5HIDEgLy8gZm9yY2UgZ2VuZXJhdGlvbiBvZiBkb2N1bWVudGF0aW9uCi0jZWxzZQotI2RlZmluZSBSQVBJREpTT05fSEFTX1NURFNUUklORyAwIC8vIG5vIHN0ZDo6c3RyaW5nIHN1cHBvcnQgYnkgZGVmYXVsdAotI2VuZGlmCi0vKiEgXGRlZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIFxpbmdyb3VwIFJBUElESlNPTl9DT05GSUcKLSAgICBcYnJpZWYgRW5hYmxlIFJhcGlkSlNPTiBzdXBwb3J0IGZvciBcYyBzdGQ6OnN0cmluZwotCi0gICAgQnkgZGVmaW5pbmcgdGhpcyBwcmVwcm9jZXNzb3Igc3ltYm9sIHRvIFxjIDEsIHNldmVyYWwgY29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciB1c2luZwotICAgIFxyZWYgcmFwaWRqc29uOjpHZW5lcmljVmFsdWUgd2l0aCBcYyBzdGQ6OnN0cmluZyBhcmUgZW5hYmxlZCwgZXNwZWNpYWxseQotICAgIGZvciBjb25zdHJ1Y3Rpb24gYW5kIGNvbXBhcmlzb24uCi0KLSAgICBcaGlkZWluaXRpYWxpemVyCi0qLwotI2VuZGlmIC8vICFkZWZpbmVkKFJBUElESlNPTl9IQVNfU1REU1RSSU5HKQotCi0jaWYgUkFQSURKU09OX0hBU19TVERTVFJJTkcKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jZW5kaWYgLy8gUkFQSURKU09OX0hBU19TVERTVFJJTkcKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUkFQSURKU09OX05PX0lOVDY0REVGSU5FCi0KLS8qISBcZGVmIFJBUElESlNPTl9OT19JTlQ2NERFRklORQotICAgIFxpbmdyb3VwIFJBUElESlNPTl9DT05GSUcKLSAgICBcYnJpZWYgVXNlIGV4dGVybmFsIDY0LWJpdCBpbnRlZ2VyIHR5cGVzLgotCi0gICAgUmFwaWRKU09OIHJlcXVpcmVzIHRoZSA2NC1iaXQgaW50ZWdlciB0eXBlcyBcYyBpbnQ2NF90IGFuZCAgXGMgdWludDY0X3QgdHlwZXMKLSAgICB0byBiZSBhdmFpbGFibGUgYXQgZ2xvYmFsIHNjb3BlLgotCi0gICAgSWYgdXNlcnMgaGF2ZSB0aGVpciBvd24gZGVmaW5pdGlvbiwgZGVmaW5lIFJBUElESlNPTl9OT19JTlQ2NERFRklORSB0bwotICAgIHByZXZlbnQgUmFwaWRKU09OIGZyb20gZGVmaW5pbmcgaXRzIG93biB0eXBlcy4KLSovCi0jaWZuZGVmIFJBUElESlNPTl9OT19JTlQ2NERFRklORQotLy8hQGNvbmQgUkFQSURKU09OX0hJRERFTl9GUk9NX0RPWFlHRU4KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPCAxODAwKQkvLyBWaXN1YWwgU3R1ZGlvIDIwMTMKLSNpbmNsdWRlICJtc2ludHR5cGVzL3N0ZGludC5oIgotI2luY2x1ZGUgIm1zaW50dHlwZXMvaW50dHlwZXMuaCIKLSNlbHNlCi0vLyBPdGhlciBjb21waWxlcnMgc2hvdWxkIGhhdmUgdGhpcy4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2VuZGlmCi0vLyFAZW5kY29uZAotI2lmZGVmIFJBUElESlNPTl9ET1hZR0VOX1JVTk5JTkcKLSNkZWZpbmUgUkFQSURKU09OX05PX0lOVDY0REVGSU5FCi0jZW5kaWYKLSNlbmRpZiAvLyBSQVBJREpTT05fTk9fSU5UNjRUWVBFREVGCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJBUElESlNPTl9GT1JDRUlOTElORQotCi0jaWZuZGVmIFJBUElESlNPTl9GT1JDRUlOTElORQotLy8hQGNvbmQgUkFQSURKU09OX0hJRERFTl9GUk9NX0RPWFlHRU4KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKE5ERUJVRykKLSNkZWZpbmUgUkFQSURKU09OX0ZPUkNFSU5MSU5FIF9fZm9yY2VpbmxpbmUKLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQgJiYgZGVmaW5lZChOREVCVUcpCi0jZGVmaW5lIFJBUElESlNPTl9GT1JDRUlOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKLSNlbHNlCi0jZGVmaW5lIFJBUElESlNPTl9GT1JDRUlOTElORQotI2VuZGlmCi0vLyFAZW5kY29uZAotI2VuZGlmIC8vIFJBUElESlNPTl9GT1JDRUlOTElORQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBSQVBJREpTT05fRU5ESUFOCi0jZGVmaW5lIFJBUElESlNPTl9MSVRUTEVFTkRJQU4gIDAgICAvLyE8IExpdHRsZSBlbmRpYW4gbWFjaGluZQotI2RlZmluZSBSQVBJREpTT05fQklHRU5ESUFOICAgICAxICAgLy8hPCBCaWcgZW5kaWFuIG1hY2hpbmUKLQotLy8hIEVuZGlhbm5lc3Mgb2YgdGhlIG1hY2hpbmUuCi0vKiEKLSAgICBcZGVmIFJBUElESlNPTl9FTkRJQU4KLSAgICBcaW5ncm91cCBSQVBJREpTT05fQ09ORklHCi0KLSAgICBHQ0MgNC42IHByb3ZpZGVkIG1hY3JvIGZvciBkZXRlY3RpbmcgZW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuIEJ1dCBvdGhlcgotICAgIGNvbXBpbGVycyBtYXkgbm90IGhhdmUgdGhpcy4gVXNlciBjYW4gZGVmaW5lIFJBUElESlNPTl9FTkRJQU4gdG8gZWl0aGVyCi0gICAgXHJlZiBSQVBJREpTT05fTElUVExFRU5ESUFOIG9yIFxyZWYgUkFQSURKU09OX0JJR0VORElBTi4KLQotICAgIERlZmF1bHQgZGV0ZWN0aW9uIGltcGxlbWVudGVkIHdpdGggcmVmZXJlbmNlIHRvCi0gICAgXGxpIGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtNC42LjAvY3BwL0NvbW1vbi1QcmVkZWZpbmVkLU1hY3Jvcy5odG1sCi0gICAgXGxpIGh0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9saWJzLzFfNDJfMC9ib29zdC9kZXRhaWwvZW5kaWFuLmhwcAotKi8KLSNpZm5kZWYgUkFQSURKU09OX0VORElBTgotLy8gRGV0ZWN0IHdpdGggR0NDIDQuNidzIG1hY3JvCi0jICBpZmRlZiBfX0JZVEVfT1JERVJfXwotIyAgICBpZiBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXwotIyAgICAgIGRlZmluZSBSQVBJREpTT05fRU5ESUFOIFJBUElESlNPTl9MSVRUTEVFTkRJQU4KLSMgICAgZWxpZiBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0JJR19FTkRJQU5fXwotIyAgICAgIGRlZmluZSBSQVBJREpTT05fRU5ESUFOIFJBUElESlNPTl9CSUdFTkRJQU4KLSMgICAgZWxzZQotIyAgICAgIGVycm9yIFVua25vd24gbWFjaGluZSBlbmRpYW5lc3MgZGV0ZWN0ZWQuIFVzZXIgbmVlZHMgdG8gZGVmaW5lIFJBUElESlNPTl9FTkRJQU4uCi0jICAgIGVuZGlmIC8vIF9fQllURV9PUkRFUl9fCi0vLyBEZXRlY3Qgd2l0aCBHTElCQydzIGVuZGlhbi5oCi0jICBlbGlmIGRlZmluZWQoX19HTElCQ19fKQotIyAgICBpbmNsdWRlIDxlbmRpYW4uaD4KLSMgICAgaWYgKF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4pCi0jICAgICAgZGVmaW5lIFJBUElESlNPTl9FTkRJQU4gUkFQSURKU09OX0xJVFRMRUVORElBTgotIyAgICBlbGlmIChfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOKQotIyAgICAgIGRlZmluZSBSQVBJREpTT05fRU5ESUFOIFJBUElESlNPTl9CSUdFTkRJQU4KLSMgICAgZWxzZQotIyAgICAgIGVycm9yIFVua25vd24gbWFjaGluZSBlbmRpYW5lc3MgZGV0ZWN0ZWQuIFVzZXIgbmVlZHMgdG8gZGVmaW5lIFJBUElESlNPTl9FTkRJQU4uCi0jICAgZW5kaWYgLy8gX19HTElCQ19fCi0vLyBEZXRlY3Qgd2l0aCBfTElUVExFX0VORElBTiBhbmQgX0JJR19FTkRJQU4gbWFjcm8KLSMgIGVsaWYgZGVmaW5lZChfTElUVExFX0VORElBTikgJiYgIWRlZmluZWQoX0JJR19FTkRJQU4pCi0jICAgIGRlZmluZSBSQVBJREpTT05fRU5ESUFOIFJBUElESlNPTl9MSVRUTEVFTkRJQU4KLSMgIGVsaWYgZGVmaW5lZChfQklHX0VORElBTikgJiYgIWRlZmluZWQoX0xJVFRMRV9FTkRJQU4pCi0jICAgIGRlZmluZSBSQVBJREpTT05fRU5ESUFOIFJBUElESlNPTl9CSUdFTkRJQU4KLS8vIERldGVjdCB3aXRoIGFyY2hpdGVjdHVyZSBtYWNyb3MKLSMgIGVsaWYgZGVmaW5lZChfX3NwYXJjKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfUE9XRVIpIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChfX2hwdXgpIHx8IGRlZmluZWQoX19ocHBhKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoX1BPV0VSKSB8fCBkZWZpbmVkKF9fczM5MF9fKQotIyAgICBkZWZpbmUgUkFQSURKU09OX0VORElBTiBSQVBJREpTT05fQklHRU5ESUFOCi0jICBlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9faWE2NCkgfHwgZGVmaW5lZChfX2lhNjRfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9NX0lBNjQpIHx8IGRlZmluZWQoX01fQUxQSEEpIHx8IGRlZmluZWQoX19hbWQ2NCkgfHwgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQoX194ODZfNjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX19iZmluX18pCi0jICAgIGRlZmluZSBSQVBJREpTT05fRU5ESUFOIFJBUElESlNPTl9MSVRUTEVFTkRJQU4KLSMgIGVsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9BUk0pCi0jICAgIGRlZmluZSBSQVBJREpTT05fRU5ESUFOIFJBUElESlNPTl9MSVRUTEVFTkRJQU4KLSMgIGVsaWYgZGVmaW5lZChSQVBJREpTT05fRE9YWUdFTl9SVU5OSU5HKQotIyAgICBkZWZpbmUgUkFQSURKU09OX0VORElBTgotIyAgZWxzZQotIyAgICBlcnJvciBVbmtub3duIG1hY2hpbmUgZW5kaWFuZXNzIGRldGVjdGVkLiBVc2VyIG5lZWRzIHRvIGRlZmluZSBSQVBJREpTT05fRU5ESUFOLiAgIAotIyAgZW5kaWYKLSNlbmRpZiAvLyBSQVBJREpTT05fRU5ESUFOCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJBUElESlNPTl82NEJJVAotCi0vLyEgV2hldGhlciB1c2luZyA2NC1iaXQgYXJjaGl0ZWN0dXJlCi0jaWZuZGVmIFJBUElESlNPTl82NEJJVAotI2lmIGRlZmluZWQoX19MUDY0X18pIHx8IGRlZmluZWQoX1dJTjY0KSB8fCBkZWZpbmVkKF9fRU1TQ1JJUFRFTl9fKQotI2RlZmluZSBSQVBJREpTT05fNjRCSVQgMQotI2Vsc2UKLSNkZWZpbmUgUkFQSURKU09OXzY0QklUIDAKLSNlbmRpZgotI2VuZGlmIC8vIFJBUElESlNPTl82NEJJVAotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBSQVBJREpTT05fQUxJR04KLQotLy8hIERhdGEgYWxpZ25tZW50IG9mIHRoZSBtYWNoaW5lLgotLyohIFxpbmdyb3VwIFJBUElESlNPTl9DT05GSUcKLSAgICBccGFyYW0geCBwb2ludGVyIHRvIGFsaWduCi0KLSAgICBTb21lIG1hY2hpbmVzIHJlcXVpcmUgc3RyaWN0IGRhdGEgYWxpZ25tZW50LiBDdXJyZW50bHkgdGhlIGRlZmF1bHQgdXNlcyA0IGJ5dGVzCi0gICAgYWxpZ25tZW50IG9uIDMyLWJpdCBwbGF0Zm9ybXMgYW5kIDggYnl0ZXMgYWxpZ25tZW50IGZvciA2NC1iaXQgcGxhdGZvcm1zLgotICAgIFVzZXIgY2FuIGN1c3RvbWl6ZSBieSBkZWZpbmluZyB0aGUgUkFQSURKU09OX0FMSUdOIGZ1bmN0aW9uIG1hY3JvLgotKi8KLSNpZm5kZWYgUkFQSURKU09OX0FMSUdOCi0jaWYgUkFQSURKU09OXzY0QklUID09IDEKLSNkZWZpbmUgUkFQSURKU09OX0FMSUdOKHgpICgoKHgpICsgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KDd1KSkgJiB+c3RhdGljX2Nhc3Q8dWludDY0X3Q+KDd1KSkKLSNlbHNlCi0jZGVmaW5lIFJBUElESlNPTl9BTElHTih4KSAoKCh4KSArIDN1KSAmIH4zdSkKLSNlbmRpZgotI2VuZGlmCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJBUElESlNPTl9VSU5UNjRfQzIKLQotLy8hIENvbnN0cnVjdCBhIDY0LWJpdCBsaXRlcmFsIGJ5IGEgcGFpciBvZiAzMi1iaXQgaW50ZWdlci4KLS8qIQotICAgIDY0LWJpdCBsaXRlcmFsIHdpdGggb3Igd2l0aG91dCBVTEwgc3VmZml4IGlzIHByb25lIHRvIGNvbXBpbGVyIHdhcm5pbmdzLgotICAgIFVJTlQ2NF9DKCkgaXMgQyBtYWNybyB3aGljaCBjYXVzZSBjb21waWxhdGlvbiBwcm9ibGVtcy4KLSAgICBVc2UgdGhpcyBtYWNybyB0byBkZWZpbmUgNjQtYml0IGNvbnN0YW50cyBieSBhIHBhaXIgb2YgMzItYml0IGludGVnZXIuCi0qLwotI2lmbmRlZiBSQVBJREpTT05fVUlOVDY0X0MyCi0jZGVmaW5lIFJBUElESlNPTl9VSU5UNjRfQzIoaGlnaDMyLCBsb3czMikgKChzdGF0aWNfY2FzdDx1aW50NjRfdD4oaGlnaDMyKSA8PCAzMikgfCBzdGF0aWNfY2FzdDx1aW50NjRfdD4obG93MzIpKQotI2VuZGlmCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJBUElESlNPTl80OEJJVFBPSU5URVJfT1BUSU1JWkFUSU9OCi0KLS8vISBVc2Ugb25seSBsb3dlciA0OC1iaXQgYWRkcmVzcyBmb3Igc29tZSBwb2ludGVycy4KLS8qIQotICAgIFxpbmdyb3VwIFJBUElESlNPTl9DT05GSUcKLQotICAgIFRoaXMgb3B0aW1pemF0aW9uIHVzZXMgdGhlIGZhY3QgdGhhdCBjdXJyZW50IFg4Ni02NCBhcmNoaXRlY3R1cmUgb25seSBpbXBsZW1lbnQgbG93ZXIgNDgtYml0IHZpcnR1YWwgYWRkcmVzcy4KLSAgICBUaGUgaGlnaGVyIDE2LWJpdCBjYW4gYmUgdXNlZCBmb3Igc3RvcmluZyBvdGhlciBkYXRhLgotICAgIFxjIEdlbmVyaWNWYWx1ZSB1c2VzIHRoaXMgb3B0aW1pemF0aW9uIHRvIHJlZHVjZSBpdHMgc2l6ZSBmb3JtIDI0IGJ5dGVzIHRvIDE2IGJ5dGVzIGluIDY0LWJpdCBhcmNoaXRlY3R1cmUuCi0qLwotI2lmbmRlZiBSQVBJREpTT05fNDhCSVRQT0lOVEVSX09QVElNSVpBVElPTgotI2lmIGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKF9fYW1kNjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NCkgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fQU1ENjQpCi0jZGVmaW5lIFJBUElESlNPTl80OEJJVFBPSU5URVJfT1BUSU1JWkFUSU9OIDEKLSNlbHNlCi0jZGVmaW5lIFJBUElESlNPTl80OEJJVFBPSU5URVJfT1BUSU1JWkFUSU9OIDAKLSNlbmRpZgotI2VuZGlmIC8vIFJBUElESlNPTl80OEJJVFBPSU5URVJfT1BUSU1JWkFUSU9OCi0KLSNpZiBSQVBJREpTT05fNDhCSVRQT0lOVEVSX09QVElNSVpBVElPTiA9PSAxCi0jaWYgUkFQSURKU09OXzY0QklUICE9IDEKLSNlcnJvciBSQVBJREpTT05fNDhCSVRQT0lOVEVSX09QVElNSVpBVElPTiBjYW4gb25seSBiZSBzZXQgdG8gMSB3aGVuIFJBUElESlNPTl82NEJJVD0xCi0jZW5kaWYKLSNkZWZpbmUgUkFQSURKU09OX1NFVFBPSU5URVIodHlwZSwgcCwgeCkgKHAgPSByZWludGVycHJldF9jYXN0PHR5cGUgKj4oKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwKSAmIHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oUkFQSURKU09OX1VJTlQ2NF9DMigweEZGRkYwMDAwLCAweDAwMDAwMDAwKSkpIHwgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHgpKSkpCi0jZGVmaW5lIFJBUElESlNPTl9HRVRQT0lOVEVSKHR5cGUsIHApIChyZWludGVycHJldF9jYXN0PHR5cGUgKj4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHApICYgc3RhdGljX2Nhc3Q8dWludHB0cl90PihSQVBJREpTT05fVUlOVDY0X0MyKDB4MDAwMEZGRkYsIDB4RkZGRkZGRkYpKSkpCi0jZWxzZQotI2RlZmluZSBSQVBJREpTT05fU0VUUE9JTlRFUih0eXBlLCBwLCB4KSAocCA9ICh4KSkKLSNkZWZpbmUgUkFQSURKU09OX0dFVFBPSU5URVIodHlwZSwgcCkgKHApCi0jZW5kaWYKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUkFQSURKU09OX1NTRTIvUkFQSURKU09OX1NTRTQyL1JBUElESlNPTl9TSU1ECi0KLS8qISBcZGVmIFJBUElESlNPTl9TSU1ECi0gICAgXGluZ3JvdXAgUkFQSURKU09OX0NPTkZJRwotICAgIFxicmllZiBFbmFibGUgU1NFMi9TU0U0LjIgb3B0aW1pemF0aW9uLgotCi0gICAgUmFwaWRKU09OIHN1cHBvcnRzIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbnMgZm9yIHNvbWUgcGFyc2luZyBvcGVyYXRpb25zCi0gICAgYmFzZWQgb24gdGhlIFNTRTIgb3IgU1NFNC4yIFNJTUQgZXh0ZW5zaW9ucyBvbiBtb2Rlcm4gSW50ZWwtY29tcGF0aWJsZQotICAgIHByb2Nlc3NvcnMuCi0KLSAgICBUbyBlbmFibGUgdGhlc2Ugb3B0aW1pemF0aW9ucywgdHdvIGRpZmZlcmVudCBzeW1ib2xzIGNhbiBiZSBkZWZpbmVkOwotICAgIFxjb2RlCi0gICAgLy8gRW5hYmxlIFNTRTIgb3B0aW1pemF0aW9uLgotICAgICNkZWZpbmUgUkFQSURKU09OX1NTRTIKLQotICAgIC8vIEVuYWJsZSBTU0U0LjIgb3B0aW1pemF0aW9uLgotICAgICNkZWZpbmUgUkFQSURKU09OX1NTRTQyCi0gICAgXGVuZGNvZGUKLQotICAgIFxjIFJBUElESlNPTl9TU0U0MiB0YWtlcyBwcmVjZWRlbmNlLCBpZiBib3RoIGFyZSBkZWZpbmVkLgotCi0gICAgSWYgYW55IG9mIHRoZXNlIHN5bWJvbHMgaXMgZGVmaW5lZCwgUmFwaWRKU09OIGRlZmluZXMgdGhlIG1hY3JvCi0gICAgXGMgUkFQSURKU09OX1NJTUQgdG8gaW5kaWNhdGUgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgb3B0aW1pemVkIGNvZGUuCi0qLwotI2lmIGRlZmluZWQoUkFQSURKU09OX1NTRTIpIHx8IGRlZmluZWQoUkFQSURKU09OX1NTRTQyKSBcCi0gICAgfHwgZGVmaW5lZChSQVBJREpTT05fRE9YWUdFTl9SVU5OSU5HKQotI2RlZmluZSBSQVBJREpTT05fU0lNRAotI2VuZGlmCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJBUElESlNPTl9OT19TSVpFVFlQRURFRklORQotCi0jaWZuZGVmIFJBUElESlNPTl9OT19TSVpFVFlQRURFRklORQotLyohIFxkZWYgUkFQSURKU09OX05PX1NJWkVUWVBFREVGSU5FCi0gICAgXGluZ3JvdXAgUkFQSURKU09OX0NPTkZJRwotICAgIFxicmllZiBVc2VyLXByb3ZpZGVkIFxjIFNpemVUeXBlIGRlZmluaXRpb24uCi0KLSAgICBJbiBvcmRlciB0byBhdm9pZCB1c2luZyAzMi1iaXQgc2l6ZSB0eXBlcyBmb3IgaW5kZXhpbmcgc3RyaW5ncyBhbmQgYXJyYXlzLAotICAgIGRlZmluZSB0aGlzIHByZXByb2Nlc3NvciBzeW1ib2wgYW5kIHByb3ZpZGUgdGhlIHR5cGUgcmFwaWRqc29uOjpTaXplVHlwZQotICAgIGJlZm9yZSBpbmNsdWRpbmcgUmFwaWRKU09OOgotICAgIFxjb2RlCi0gICAgI2RlZmluZSBSQVBJREpTT05fTk9fU0laRVRZUEVERUZJTkUKLSAgICBuYW1lc3BhY2UgcmFwaWRqc29uIHsgdHlwZWRlZiA6OnN0ZDo6c2l6ZV90IFNpemVUeXBlOyB9Ci0gICAgI2luY2x1ZGUgInJhcGlkanNvbi8uLi4iCi0gICAgXGVuZGNvZGUKLQotICAgIFxzZWUgcmFwaWRqc29uOjpTaXplVHlwZQotKi8KLSNpZmRlZiBSQVBJREpTT05fRE9YWUdFTl9SVU5OSU5HCi0jZGVmaW5lIFJBUElESlNPTl9OT19TSVpFVFlQRURFRklORQotI2VuZGlmCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi0vLyEgU2l6ZSB0eXBlIChmb3Igc3RyaW5nIGxlbmd0aHMsIGFycmF5IHNpemVzLCBldGMuKQotLyohIFJhcGlkSlNPTiB1c2VzIDMyLWJpdCBhcnJheS9zdHJpbmcgaW5kaWNlcyBldmVuIG9uIDY0LWJpdCBwbGF0Zm9ybXMsCi0gICAgaW5zdGVhZCBvZiB1c2luZyBcYyBzaXplX3QuIFVzZXJzIG1heSBvdmVycmlkZSB0aGUgU2l6ZVR5cGUgYnkgZGVmaW5pbmcKLSAgICBccmVmIFJBUElESlNPTl9OT19TSVpFVFlQRURFRklORS4KLSovCi10eXBlZGVmIHVuc2lnbmVkIFNpemVUeXBlOwotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLSNlbmRpZgotCi0vLyBhbHdheXMgaW1wb3J0IHN0ZDo6c2l6ZV90IHRvIHJhcGlkanNvbiBuYW1lc3BhY2UKLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLXVzaW5nIHN0ZDo6c2l6ZV90OwotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUkFQSURKU09OX0FTU0VSVAotCi0vLyEgQXNzZXJ0aW9uLgotLyohIFxpbmdyb3VwIFJBUElESlNPTl9DT05GSUcKLSAgICBCeSBkZWZhdWx0LCByYXBpZGpzb24gdXNlcyBDIFxjIGFzc2VydCgpIGZvciBpbnRlcm5hbCBhc3NlcnRpb25zLgotICAgIFVzZXIgY2FuIG92ZXJyaWRlIGl0IGJ5IGRlZmluaW5nIFJBUElESlNPTl9BU1NFUlQoeCkgbWFjcm8uCi0KLSAgICBcbm90ZSBQYXJzaW5nIGVycm9ycyBhcmUgaGFuZGxlZCBhbmQgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgdGhlCi0gICAgICAgICAgXHJlZiBSQVBJREpTT05fRVJST1JTIEFQSXMuCi0qLwotI2lmbmRlZiBSQVBJREpTT05fQVNTRVJUCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNkZWZpbmUgUkFQSURKU09OX0FTU0VSVCh4KSBhc3NlcnQoeCkKLSNlbmRpZiAvLyBSQVBJREpTT05fQVNTRVJUCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJBUElESlNPTl9TVEFUSUNfQVNTRVJUCi0KLS8vIEFkb3B0IGZyb20gYm9vc3QKLSNpZm5kZWYgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQKLSNpZm5kZWYgX19jbGFuZ19fCi0vLyFAY29uZCBSQVBJREpTT05fSElEREVOX0ZST01fRE9YWUdFTgotI2VuZGlmCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi10ZW1wbGF0ZSA8Ym9vbCB4PiBzdHJ1Y3QgU1RBVElDX0FTU0VSVElPTl9GQUlMVVJFOwotdGVtcGxhdGUgPD4gc3RydWN0IFNUQVRJQ19BU1NFUlRJT05fRkFJTFVSRTx0cnVlPiB7IGVudW0geyB2YWx1ZSA9IDEgfTsgfTsKLXRlbXBsYXRlPGludCB4PiBzdHJ1Y3QgU3RhdGljQXNzZXJ0VGVzdCB7fTsKLVJBUElESlNPTl9OQU1FU1BBQ0VfRU5ECi0KLSNkZWZpbmUgUkFQSURKU09OX0pPSU4oWCwgWSkgUkFQSURKU09OX0RPX0pPSU4oWCwgWSkKLSNkZWZpbmUgUkFQSURKU09OX0RPX0pPSU4oWCwgWSkgUkFQSURKU09OX0RPX0pPSU4yKFgsIFkpCi0jZGVmaW5lIFJBUElESlNPTl9ET19KT0lOMihYLCBZKSBYIyNZCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQotI2RlZmluZSBSQVBJREpTT05fU1RBVElDX0FTU0VSVF9VTlVTRURfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCi0jZWxzZQotI2RlZmluZSBSQVBJREpTT05fU1RBVElDX0FTU0VSVF9VTlVTRURfQVRUUklCVVRFIAotI2VuZGlmCi0jaWZuZGVmIF9fY2xhbmdfXwotLy8hQGVuZGNvbmQKLSNlbmRpZgotCi0vKiEgXGRlZiBSQVBJREpTT05fU1RBVElDX0FTU0VSVAotICAgIFxicmllZiAoSW50ZXJuYWwpIG1hY3JvIHRvIGNoZWNrIGZvciBjb25kaXRpb25zIGF0IGNvbXBpbGUtdGltZQotICAgIFxwYXJhbSB4IGNvbXBpbGUtdGltZSBjb25kaXRpb24KLSAgICBcaGlkZWluaXRpYWxpemVyCi0gKi8KLSNkZWZpbmUgUkFQSURKU09OX1NUQVRJQ19BU1NFUlQoeCkgXAotICAgIHR5cGVkZWYgOjpSQVBJREpTT05fTkFNRVNQQUNFOjpTdGF0aWNBc3NlcnRUZXN0PCBcCi0gICAgICBzaXplb2YoOjpSQVBJREpTT05fTkFNRVNQQUNFOjpTVEFUSUNfQVNTRVJUSU9OX0ZBSUxVUkU8Ym9vbCh4KSA+KT4gXAotICAgIFJBUElESlNPTl9KT0lOKFN0YXRpY0Fzc2VydFR5cGVkZWYsIF9fTElORV9fKSBSQVBJREpTT05fU1RBVElDX0FTU0VSVF9VTlVTRURfQVRUUklCVVRFCi0jZW5kaWYKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUkFQSURKU09OX0xJS0VMWSwgUkFQSURKU09OX1VOTElLRUxZCi0KLS8vISBDb21waWxlciBicmFuY2hpbmcgaGludCBmb3IgZXhwcmVzc2lvbiB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkgdG8gYmUgdHJ1ZS4KLS8qIQotICAgIFxpbmdyb3VwIFJBUElESlNPTl9DT05GSUcKLSAgICBccGFyYW0geCBCb29sZWFuIGV4cHJlc3Npb24gbGlrZWx5IHRvIGJlIHRydWUuCi0qLwotI2lmbmRlZiBSQVBJREpTT05fTElLRUxZCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX2NsYW5nX18pCi0jZGVmaW5lIFJBUElESlNPTl9MSUtFTFkoeCkgX19idWlsdGluX2V4cGVjdCghISh4KSwgMSkKLSNlbHNlCi0jZGVmaW5lIFJBUElESlNPTl9MSUtFTFkoeCkgKHgpCi0jZW5kaWYKLSNlbmRpZgotCi0vLyEgQ29tcGlsZXIgYnJhbmNoaW5nIGhpbnQgZm9yIGV4cHJlc3Npb24gd2l0aCBsb3cgcHJvYmFiaWxpdHkgdG8gYmUgdHJ1ZS4KLS8qIQotICAgIFxpbmdyb3VwIFJBUElESlNPTl9DT05GSUcKLSAgICBccGFyYW0geCBCb29sZWFuIGV4cHJlc3Npb24gdW5saWtlbHkgdG8gYmUgdHJ1ZS4KLSovCi0jaWZuZGVmIFJBUElESlNPTl9VTkxJS0VMWQotI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19jbGFuZ19fKQotI2RlZmluZSBSQVBJREpTT05fVU5MSUtFTFkoeCkgX19idWlsdGluX2V4cGVjdCghISh4KSwgMCkKLSNlbHNlCi0jZGVmaW5lIFJBUElESlNPTl9VTkxJS0VMWSh4KSAoeCkKLSNlbmRpZgotI2VuZGlmCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEhlbHBlcnMKLQotLy8hQGNvbmQgUkFQSURKU09OX0hJRERFTl9GUk9NX0RPWFlHRU4KLQotI2RlZmluZSBSQVBJREpTT05fTVVMVElMSU5FTUFDUk9fQkVHSU4gZG8geyAgCi0jZGVmaW5lIFJBUElESlNPTl9NVUxUSUxJTkVNQUNST19FTkQgXAotfSB3aGlsZSgodm9pZCkwLCAwKQotCi0vLyBhZG9wdGVkIGZyb20gQm9vc3QKLSNkZWZpbmUgUkFQSURKU09OX1ZFUlNJT05fQ09ERSh4LHkseikgXAotICAoKCh4KSoxMDAwMDApICsgKCh5KSoxMDApICsgKHopKQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBSQVBJREpTT05fRElBR19QVVNIL1BPUCwgUkFQSURKU09OX0RJQUdfT0ZGCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQotI2RlZmluZSBSQVBJREpTT05fR05VQyBcCi0gICAgUkFQSURKU09OX1ZFUlNJT05fQ09ERShfX0dOVUNfXyxfX0dOVUNfTUlOT1JfXyxfX0dOVUNfUEFUQ0hMRVZFTF9fKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykgfHwgKGRlZmluZWQoUkFQSURKU09OX0dOVUMpICYmIFJBUElESlNPTl9HTlVDID49IFJBUElESlNPTl9WRVJTSU9OX0NPREUoNCwyLDApKQotCi0jZGVmaW5lIFJBUElESlNPTl9QUkFHTUEoeCkgX1ByYWdtYShSQVBJREpTT05fU1RSSU5HSUZZKHgpKQotI2RlZmluZSBSQVBJREpTT05fRElBR19QUkFHTUEoeCkgUkFQSURKU09OX1BSQUdNQShHQ0MgZGlhZ25vc3RpYyB4KQotI2RlZmluZSBSQVBJREpTT05fRElBR19PRkYoeCkgXAotICAgIFJBUElESlNPTl9ESUFHX1BSQUdNQShpZ25vcmVkIFJBUElESlNPTl9TVFJJTkdJRlkoUkFQSURKU09OX0pPSU4oLVcseCkpKQotCi0vLyBwdXNoL3BvcCBzdXBwb3J0IGluIENsYW5nIGFuZCBHQ0M+PTQuNgotI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCAoZGVmaW5lZChSQVBJREpTT05fR05VQykgJiYgUkFQSURKU09OX0dOVUMgPj0gUkFQSURKU09OX1ZFUlNJT05fQ09ERSg0LDYsMCkpCi0jZGVmaW5lIFJBUElESlNPTl9ESUFHX1BVU0ggUkFQSURKU09OX0RJQUdfUFJBR01BKHB1c2gpCi0jZGVmaW5lIFJBUElESlNPTl9ESUFHX1BPUCAgUkFQSURKU09OX0RJQUdfUFJBR01BKHBvcCkKLSNlbHNlIC8vIEdDQyA+PSA0LjIsIDwgNC42Ci0jZGVmaW5lIFJBUElESlNPTl9ESUFHX1BVU0ggLyogaWdub3JlZCAqLwotI2RlZmluZSBSQVBJREpTT05fRElBR19QT1AgLyogaWdub3JlZCAqLwotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpCi0KLS8vIHByYWdtYSAoTVNWQyBzcGVjaWZpYykKLSNkZWZpbmUgUkFQSURKU09OX1BSQUdNQSh4KSBfX3ByYWdtYSh4KQotI2RlZmluZSBSQVBJREpTT05fRElBR19QUkFHTUEoeCkgUkFQSURKU09OX1BSQUdNQSh3YXJuaW5nKHgpKQotCi0jZGVmaW5lIFJBUElESlNPTl9ESUFHX09GRih4KSBSQVBJREpTT05fRElBR19QUkFHTUEoZGlzYWJsZTogeCkKLSNkZWZpbmUgUkFQSURKU09OX0RJQUdfUFVTSCBSQVBJREpTT05fRElBR19QUkFHTUEocHVzaCkKLSNkZWZpbmUgUkFQSURKU09OX0RJQUdfUE9QICBSQVBJREpTT05fRElBR19QUkFHTUEocG9wKQotCi0jZWxzZQotCi0jZGVmaW5lIFJBUElESlNPTl9ESUFHX09GRih4KSAvKiBpZ25vcmVkICovCi0jZGVmaW5lIFJBUElESlNPTl9ESUFHX1BVU0ggICAvKiBpZ25vcmVkICovCi0jZGVmaW5lIFJBUElESlNPTl9ESUFHX1BPUCAgICAvKiBpZ25vcmVkICovCi0KLSNlbmRpZiAvLyBSQVBJREpTT05fRElBR18qCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEMrKzExIGZlYXR1cmVzCi0KLSNpZm5kZWYgUkFQSURKU09OX0hBU19DWFgxMV9SVkFMVUVfUkVGUwotI2lmIGRlZmluZWQoX19jbGFuZ19fKQotI2RlZmluZSBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTIF9faGFzX2ZlYXR1cmUoY3h4X3J2YWx1ZV9yZWZlcmVuY2VzKSAmJiBcCi0gICAgKGRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKSB8fCBkZWZpbmVkKF9fR0xJQkNYWF9fKSAmJiBfX0dMSUJDWFhfXyA+PSAyMDA4MDMwNikKLSNlbGlmIChkZWZpbmVkKFJBUElESlNPTl9HTlVDKSAmJiAoUkFQSURKU09OX0dOVUMgPj0gUkFQSURKU09OX1ZFUlNJT05fQ09ERSg0LDMsMCkpICYmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pKSB8fCBcCi0gICAgICAoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTYwMCkKLQotI2RlZmluZSBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTIDEKLSNlbHNlCi0jZGVmaW5lIFJBUElESlNPTl9IQVNfQ1hYMTFfUlZBTFVFX1JFRlMgMAotI2VuZGlmCi0jZW5kaWYgLy8gUkFQSURKU09OX0hBU19DWFgxMV9SVkFMVUVfUkVGUwotCi0jaWZuZGVmIFJBUElESlNPTl9IQVNfQ1hYMTFfTk9FWENFUFQKLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSNkZWZpbmUgUkFQSURKU09OX0hBU19DWFgxMV9OT0VYQ0VQVCBfX2hhc19mZWF0dXJlKGN4eF9ub2V4Y2VwdCkKLSNlbGlmIChkZWZpbmVkKFJBUElESlNPTl9HTlVDKSAmJiAoUkFQSURKU09OX0dOVUMgPj0gUkFQSURKU09OX1ZFUlNJT05fQ09ERSg0LDYsMCkpICYmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pKQotLy8gICAgKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49ID8/Pz8pIC8vIG5vdCB5ZXQgc3VwcG9ydGVkCi0jZGVmaW5lIFJBUElESlNPTl9IQVNfQ1hYMTFfTk9FWENFUFQgMQotI2Vsc2UKLSNkZWZpbmUgUkFQSURKU09OX0hBU19DWFgxMV9OT0VYQ0VQVCAwCi0jZW5kaWYKLSNlbmRpZgotI2lmIFJBUElESlNPTl9IQVNfQ1hYMTFfTk9FWENFUFQKLSNkZWZpbmUgUkFQSURKU09OX05PRVhDRVBUIG5vZXhjZXB0Ci0jZWxzZQotI2RlZmluZSBSQVBJREpTT05fTk9FWENFUFQgLyogbm9leGNlcHQgKi8KLSNlbmRpZiAvLyBSQVBJREpTT05fSEFTX0NYWDExX05PRVhDRVBUCi0KLS8vIG5vIGF1dG9tYXRpYyBkZXRlY3Rpb24sIHlldAotI2lmbmRlZiBSQVBJREpTT05fSEFTX0NYWDExX1RZUEVUUkFJVFMKLSNkZWZpbmUgUkFQSURKU09OX0hBU19DWFgxMV9UWVBFVFJBSVRTIDAKLSNlbmRpZgotCi0jaWZuZGVmIFJBUElESlNPTl9IQVNfQ1hYMTFfUkFOR0VfRk9SCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jZGVmaW5lIFJBUElESlNPTl9IQVNfQ1hYMTFfUkFOR0VfRk9SIF9faGFzX2ZlYXR1cmUoY3h4X3JhbmdlX2ZvcikKLSNlbGlmIChkZWZpbmVkKFJBUElESlNPTl9HTlVDKSAmJiAoUkFQSURKU09OX0dOVUMgPj0gUkFQSURKU09OX1ZFUlNJT05fQ09ERSg0LDMsMCkpICYmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pKSB8fCBcCi0gICAgICAoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTcwMCkKLSNkZWZpbmUgUkFQSURKU09OX0hBU19DWFgxMV9SQU5HRV9GT1IgMQotI2Vsc2UKLSNkZWZpbmUgUkFQSURKU09OX0hBU19DWFgxMV9SQU5HRV9GT1IgMAotI2VuZGlmCi0jZW5kaWYgLy8gUkFQSURKU09OX0hBU19DWFgxMV9SQU5HRV9GT1IKLQotLy8hQGVuZGNvbmQKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gbmV3L2RlbGV0ZQotCi0jaWZuZGVmIFJBUElESlNPTl9ORVcKLS8vLyEgY3VzdG9taXphdGlvbiBwb2ludCBmb3IgZ2xvYmFsIFxjIG5ldwotI2RlZmluZSBSQVBJREpTT05fTkVXKHgpIG5ldyB4Ci0jZW5kaWYKLSNpZm5kZWYgUkFQSURKU09OX0RFTEVURQotLy8vISBjdXN0b21pemF0aW9uIHBvaW50IGZvciBnbG9iYWwgXGMgZGVsZXRlCi0jZGVmaW5lIFJBUElESlNPTl9ERUxFVEUoeCkgZGVsZXRlIHgKLSNlbmRpZgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBUeXBlCi0KLS8qISBcbmFtZXNwYWNlIHJhcGlkanNvbgotICAgIFxicmllZiBtYWluIFJhcGlkSlNPTiBuYW1lc3BhY2UKLSAgICBcc2VlIFJBUElESlNPTl9OQU1FU1BBQ0UKLSovCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi0KLS8vISBUeXBlIG9mIEpTT04gdmFsdWUKLWVudW0gVHlwZSB7Ci0gICAga051bGxUeXBlID0gMCwgICAgICAvLyE8IG51bGwKLSAgICBrRmFsc2VUeXBlID0gMSwgICAgIC8vITwgZmFsc2UKLSAgICBrVHJ1ZVR5cGUgPSAyLCAgICAgIC8vITwgdHJ1ZQotICAgIGtPYmplY3RUeXBlID0gMywgICAgLy8hPCBvYmplY3QKLSAgICBrQXJyYXlUeXBlID0gNCwgICAgIC8vITwgYXJyYXkgCi0gICAga1N0cmluZ1R5cGUgPSA1LCAgICAvLyE8IHN0cmluZwotICAgIGtOdW1iZXJUeXBlID0gNiAgICAgLy8hPCBudW1iZXIKLX07Ci0KLVJBUElESlNPTl9OQU1FU1BBQ0VfRU5ECi0KLSNlbmRpZiAvLyBSQVBJREpTT05fUkFQSURKU09OX0hfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL3JlYWRlci5oIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi9yZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyNTFmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL3JlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg1MiArMCwwIEBACi0vLyBUZW5jZW50IGlzIHBsZWFzZWQgdG8gc3VwcG9ydCB0aGUgb3BlbiBzb3VyY2UgY29tbXVuaXR5IGJ5IG1ha2luZyBSYXBpZEpTT04gYXZhaWxhYmxlLgotLy8gCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTUgVEhMIEEyOSBMaW1pdGVkLCBhIFRlbmNlbnQgY29tcGFueSwgYW5kIE1pbG8gWWlwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0Ci0vLyBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIAotLy8gdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIAotLy8gQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgCi0vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFJBUElESlNPTl9SRUFERVJfSF8KLSNkZWZpbmUgUkFQSURKU09OX1JFQURFUl9IXwotCi0vKiEgXGZpbGUgcmVhZGVyLmggKi8KLQotI2luY2x1ZGUgImFsbG9jYXRvcnMuaCIKLSNpbmNsdWRlICJzdHJlYW0uaCIKLSNpbmNsdWRlICJlbmNvZGVkc3RyZWFtLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwvbWV0YS5oIgotI2luY2x1ZGUgImludGVybmFsL3N0YWNrLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwvc3RydG9kLmgiCi0KLSNpZiBkZWZpbmVkKFJBUElESlNPTl9TSU1EKSAmJiBkZWZpbmVkKF9NU0NfVkVSKQotI2luY2x1ZGUgPGludHJpbi5oPgotI3ByYWdtYSBpbnRyaW5zaWMoX0JpdFNjYW5Gb3J3YXJkKQotI2VuZGlmCi0jaWZkZWYgUkFQSURKU09OX1NTRTQyCi0jaW5jbHVkZSA8bm1taW50cmluLmg+Ci0jZWxpZiBkZWZpbmVkKFJBUElESlNPTl9TU0UyKQotI2luY2x1ZGUgPGVtbWludHJpbi5oPgotI2VuZGlmCi0KLSNpZmRlZiBfTVNDX1ZFUgotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKDQxMjcpICAvLyBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50Ci1SQVBJREpTT05fRElBR19PRkYoNDcwMikgIC8vIHVucmVhY2hhYmxlIGNvZGUKLSNlbmRpZgotCi0jaWZkZWYgX19jbGFuZ19fCi1SQVBJREpTT05fRElBR19QVVNICi1SQVBJREpTT05fRElBR19PRkYocGFkZGVkKQotUkFQSURKU09OX0RJQUdfT0ZGKHN3aXRjaC1lbnVtKQotI2VuZGlmCi0KLSNpZmRlZiBfX0dOVUNfXwotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKGVmZmMrKykKLSNlbmRpZgotCi0vLyFAY29uZCBSQVBJREpTT05fSElEREVOX0ZST01fRE9YWUdFTgotI2RlZmluZSBSQVBJREpTT05fTk9USElORyAvKiBkZWxpYmVyYXRlbHkgZW1wdHkgKi8KLSNpZm5kZWYgUkFQSURKU09OX1BBUlNFX0VSUk9SX0VBUkxZX1JFVFVSTgotI2RlZmluZSBSQVBJREpTT05fUEFSU0VfRVJST1JfRUFSTFlfUkVUVVJOKHZhbHVlKSBcCi0gICAgUkFQSURKU09OX01VTFRJTElORU1BQ1JPX0JFR0lOIFwKLSAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKEhhc1BhcnNlRXJyb3IoKSkpIHsgcmV0dXJuIHZhbHVlOyB9IFwKLSAgICBSQVBJREpTT05fTVVMVElMSU5FTUFDUk9fRU5ECi0jZW5kaWYKLSNkZWZpbmUgUkFQSURKU09OX1BBUlNFX0VSUk9SX0VBUkxZX1JFVFVSTl9WT0lEIFwKLSAgICBSQVBJREpTT05fUEFSU0VfRVJST1JfRUFSTFlfUkVUVVJOKFJBUElESlNPTl9OT1RISU5HKQotLy8hQGVuZGNvbmQKLQotLyohIFxkZWYgUkFQSURKU09OX1BBUlNFX0VSUk9SX05PUkVUVVJOCi0gICAgXGluZ3JvdXAgUkFQSURKU09OX0VSUk9SUwotICAgIFxicmllZiBNYWNybyB0byBpbmRpY2F0ZSBhIHBhcnNlIGVycm9yLgotICAgIFxwYXJhbSBwYXJzZUVycm9yQ29kZSBccmVmIHJhcGlkanNvbjo6UGFyc2VFcnJvckNvZGUgb2YgdGhlIGVycm9yCi0gICAgXHBhcmFtIG9mZnNldCAgcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIEpTT04gaW5wdXQgKFxjIHNpemVfdCkKLQotICAgIFRoaXMgbWFjcm9zIGNhbiBiZSB1c2VkIGFzIGEgY3VzdG9taXphdGlvbiBwb2ludCBmb3IgdGhlIGludGVybmFsCi0gICAgZXJyb3IgaGFuZGxpbmcgbWVjaGFuaXNtIG9mIFJhcGlkSlNPTi4KLQotICAgIEEgY29tbW9uIHVzYWdlIG1vZGVsIGlzIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIHJlcXVpcmluZyB0aGUKLSAgICBjYWxsZXIgdG8gZXhwbGljaXRseSBjaGVjayB0aGUgXHJlZiByYXBpZGpzb246OkdlbmVyaWNSZWFkZXI6OlBhcnNlJ3MKLSAgICByZXR1cm4gdmFsdWU6Ci0KLSAgICBcY29kZQotICAgICNkZWZpbmUgUkFQSURKU09OX1BBUlNFX0VSUk9SX05PUkVUVVJOKHBhcnNlRXJyb3JDb2RlLG9mZnNldCkgXAotICAgICAgIHRocm93IFBhcnNlRXhjZXB0aW9uKHBhcnNlRXJyb3JDb2RlLCAjcGFyc2VFcnJvckNvZGUsIG9mZnNldCkKLQotICAgICNpbmNsdWRlIDxzdGRleGNlcHQ+ICAgICAgICAgICAgICAgLy8gc3RkOjpydW50aW1lX2Vycm9yCi0gICAgI2luY2x1ZGUgInJhcGlkanNvbi9lcnJvci9lcnJvci5oIiAvLyByYXBpZGpzb246OlBhcnNlUmVzdWx0Ci0KLSAgICBzdHJ1Y3QgUGFyc2VFeGNlcHRpb24gOiBzdGQ6OnJ1bnRpbWVfZXJyb3IsIHJhcGlkanNvbjo6UGFyc2VSZXN1bHQgewotICAgICAgUGFyc2VFeGNlcHRpb24ocmFwaWRqc29uOjpQYXJzZUVycm9yQ29kZSBjb2RlLCBjb25zdCBjaGFyKiBtc2csIHNpemVfdCBvZmZzZXQpCi0gICAgICAgIDogc3RkOjpydW50aW1lX2Vycm9yKG1zZyksIFBhcnNlUmVzdWx0KGNvZGUsIG9mZnNldCkge30KLSAgICB9OwotCi0gICAgI2luY2x1ZGUgInJhcGlkanNvbi9yZWFkZXIuaCIKLSAgICBcZW5kY29kZQotCi0gICAgXHNlZSBSQVBJREpTT05fUEFSU0VfRVJST1IsIHJhcGlkanNvbjo6R2VuZXJpY1JlYWRlcjo6UGFyc2UKLSAqLwotI2lmbmRlZiBSQVBJREpTT05fUEFSU0VfRVJST1JfTk9SRVRVUk4KLSNkZWZpbmUgUkFQSURKU09OX1BBUlNFX0VSUk9SX05PUkVUVVJOKHBhcnNlRXJyb3JDb2RlLCBvZmZzZXQpIFwKLSAgICBSQVBJREpTT05fTVVMVElMSU5FTUFDUk9fQkVHSU4gXAotICAgIFJBUElESlNPTl9BU1NFUlQoIUhhc1BhcnNlRXJyb3IoKSk7IC8qIEVycm9yIGNhbiBvbmx5IGJlIGFzc2lnbmVkIG9uY2UgKi8gXAotICAgIFNldFBhcnNlRXJyb3IocGFyc2VFcnJvckNvZGUsIG9mZnNldCk7IFwKLSAgICBSQVBJREpTT05fTVVMVElMSU5FTUFDUk9fRU5ECi0jZW5kaWYKLQotLyohIFxkZWYgUkFQSURKU09OX1BBUlNFX0VSUk9SCi0gICAgXGluZ3JvdXAgUkFQSURKU09OX0VSUk9SUwotICAgIFxicmllZiAoSW50ZXJuYWwpIG1hY3JvIHRvIGluZGljYXRlIGFuZCBoYW5kbGUgYSBwYXJzZSBlcnJvci4KLSAgICBccGFyYW0gcGFyc2VFcnJvckNvZGUgXHJlZiByYXBpZGpzb246OlBhcnNlRXJyb3JDb2RlIG9mIHRoZSBlcnJvcgotICAgIFxwYXJhbSBvZmZzZXQgIHBvc2l0aW9uIG9mIHRoZSBlcnJvciBpbiBKU09OIGlucHV0IChcYyBzaXplX3QpCi0KLSAgICBJbnZva2VzIFJBUElESlNPTl9QQVJTRV9FUlJPUl9OT1JFVFVSTiBhbmQgc3RvcHMgdGhlIHBhcnNpbmcuCi0KLSAgICBcc2VlIFJBUElESlNPTl9QQVJTRV9FUlJPUl9OT1JFVFVSTgotICAgIFxoaWRlaW5pdGlhbGl6ZXIKLSAqLwotI2lmbmRlZiBSQVBJREpTT05fUEFSU0VfRVJST1IKLSNkZWZpbmUgUkFQSURKU09OX1BBUlNFX0VSUk9SKHBhcnNlRXJyb3JDb2RlLCBvZmZzZXQpIFwKLSAgICBSQVBJREpTT05fTVVMVElMSU5FTUFDUk9fQkVHSU4gXAotICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9OT1JFVFVSTihwYXJzZUVycm9yQ29kZSwgb2Zmc2V0KTsgXAotICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9FQVJMWV9SRVRVUk5fVk9JRDsgXAotICAgIFJBUElESlNPTl9NVUxUSUxJTkVNQUNST19FTkQKLSNlbmRpZgotCi0jaW5jbHVkZSAiZXJyb3IvZXJyb3IuaCIgLy8gUGFyc2VFcnJvckNvZGUsIFBhcnNlUmVzdWx0Ci0KLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUGFyc2VGbGFnCi0KLS8qISBcZGVmIFJBUElESlNPTl9QQVJTRV9ERUZBVUxUX0ZMQUdTIAotICAgIFxpbmdyb3VwIFJBUElESlNPTl9DT05GSUcKLSAgICBcYnJpZWYgVXNlci1kZWZpbmVkIGtQYXJzZURlZmF1bHRGbGFncyBkZWZpbml0aW9uLgotCi0gICAgVXNlciBjYW4gZGVmaW5lIHRoaXMgYXMgYW55IFxjIFBhcnNlRmxhZyBjb21iaW5hdGlvbnMuCi0qLwotI2lmbmRlZiBSQVBJREpTT05fUEFSU0VfREVGQVVMVF9GTEFHUwotI2RlZmluZSBSQVBJREpTT05fUEFSU0VfREVGQVVMVF9GTEFHUyBrUGFyc2VOb0ZsYWdzCi0jZW5kaWYKLQotLy8hIENvbWJpbmF0aW9uIG9mIHBhcnNlRmxhZ3MKLS8qISBcc2VlIFJlYWRlcjo6UGFyc2UsIERvY3VtZW50OjpQYXJzZSwgRG9jdW1lbnQ6OlBhcnNlSW5zaXR1LCBEb2N1bWVudDo6UGFyc2VTdHJlYW0KLSAqLwotZW51bSBQYXJzZUZsYWcgewotICAgIGtQYXJzZU5vRmxhZ3MgPSAwLCAgICAgICAgICAgICAgLy8hPCBObyBmbGFncyBhcmUgc2V0LgotICAgIGtQYXJzZUluc2l0dUZsYWcgPSAxLCAgICAgICAgICAgLy8hPCBJbi1zaXR1KGRlc3RydWN0aXZlKSBwYXJzaW5nLgotICAgIGtQYXJzZVZhbGlkYXRlRW5jb2RpbmdGbGFnID0gMiwgLy8hPCBWYWxpZGF0ZSBlbmNvZGluZyBvZiBKU09OIHN0cmluZ3MuCi0gICAga1BhcnNlSXRlcmF0aXZlRmxhZyA9IDQsICAgICAgICAvLyE8IEl0ZXJhdGl2ZShjb25zdGFudCBjb21wbGV4aXR5IGluIHRlcm1zIG9mIGZ1bmN0aW9uIGNhbGwgc3RhY2sgc2l6ZSkgcGFyc2luZy4KLSAgICBrUGFyc2VTdG9wV2hlbkRvbmVGbGFnID0gOCwgICAgIC8vITwgQWZ0ZXIgcGFyc2luZyBhIGNvbXBsZXRlIEpTT04gcm9vdCBmcm9tIHN0cmVhbSwgc3RvcCBmdXJ0aGVyIHByb2Nlc3NpbmcgdGhlIHJlc3Qgb2Ygc3RyZWFtLiBXaGVuIHRoaXMgZmxhZyBpcyB1c2VkLCBwYXJzZXIgd2lsbCBub3QgZ2VuZXJhdGUga1BhcnNlRXJyb3JEb2N1bWVudFJvb3ROb3RTaW5ndWxhciBlcnJvci4KLSAgICBrUGFyc2VGdWxsUHJlY2lzaW9uRmxhZyA9IDE2LCAgIC8vITwgUGFyc2UgbnVtYmVyIGluIGZ1bGwgcHJlY2lzaW9uIChidXQgc2xvd2VyKS4KLSAgICBrUGFyc2VDb21tZW50c0ZsYWcgPSAzMiwgICAgICAgIC8vITwgQWxsb3cgb25lLWxpbmUgKC8vKSBhbmQgbXVsdGktbGluZSAoLyoqLykgY29tbWVudHMuCi0gICAga1BhcnNlTnVtYmVyc0FzU3RyaW5nc0ZsYWcgPSA2NCwgICAgLy8hPCBQYXJzZSBhbGwgbnVtYmVycyAoaW50cy9kb3VibGVzKSBhcyBzdHJpbmdzLgotICAgIGtQYXJzZVRyYWlsaW5nQ29tbWFzRmxhZyA9IDEyOCwgLy8hPCBBbGxvdyB0cmFpbGluZyBjb21tYXMgYXQgdGhlIGVuZCBvZiBvYmplY3RzIGFuZCBhcnJheXMuCi0gICAga1BhcnNlRGVmYXVsdEZsYWdzID0gUkFQSURKU09OX1BBUlNFX0RFRkFVTFRfRkxBR1MgIC8vITwgRGVmYXVsdCBwYXJzZSBmbGFncy4gQ2FuIGJlIGN1c3RvbWl6ZWQgYnkgZGVmaW5pbmcgUkFQSURKU09OX1BBUlNFX0RFRkFVTFRfRkxBR1MKLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEhhbmRsZXIKLQotLyohIFxjbGFzcyByYXBpZGpzb246OkhhbmRsZXIKLSAgICBcYnJpZWYgQ29uY2VwdCBmb3IgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIEdlbmVyaWNSZWFkZXIgdXBvbiBwYXJzaW5nLgotICAgIFRoZSBmdW5jdGlvbnMgcmV0dXJuIHRydWUgaWYgbm8gZXJyb3Igb2NjdXJzLiBJZiB0aGV5IHJldHVybiBmYWxzZSwgCi0gICAgdGhlIGV2ZW50IHB1Ymxpc2hlciBzaG91bGQgdGVybWluYXRlIHRoZSBwcm9jZXNzLgotXGNvZGUKLWNvbmNlcHQgSGFuZGxlciB7Ci0gICAgdHlwZW5hbWUgQ2g7Ci0KLSAgICBib29sIE51bGwoKTsKLSAgICBib29sIEJvb2woYm9vbCBiKTsKLSAgICBib29sIEludChpbnQgaSk7Ci0gICAgYm9vbCBVaW50KHVuc2lnbmVkIGkpOwotICAgIGJvb2wgSW50NjQoaW50NjRfdCBpKTsKLSAgICBib29sIFVpbnQ2NCh1aW50NjRfdCBpKTsKLSAgICBib29sIERvdWJsZShkb3VibGUgZCk7Ci0gICAgLy8vIGVuYWJsZWQgdmlhIGtQYXJzZU51bWJlcnNBc1N0cmluZ3NGbGFnLCBzdHJpbmcgaXMgbm90IG51bGwtdGVybWluYXRlZCAodXNlIGxlbmd0aCkKLSAgICBib29sIFJhd051bWJlcihjb25zdCBDaCogc3RyLCBTaXplVHlwZSBsZW5ndGgsIGJvb2wgY29weSk7Ci0gICAgYm9vbCBTdHJpbmcoY29uc3QgQ2gqIHN0ciwgU2l6ZVR5cGUgbGVuZ3RoLCBib29sIGNvcHkpOwotICAgIGJvb2wgU3RhcnRPYmplY3QoKTsKLSAgICBib29sIEtleShjb25zdCBDaCogc3RyLCBTaXplVHlwZSBsZW5ndGgsIGJvb2wgY29weSk7Ci0gICAgYm9vbCBFbmRPYmplY3QoU2l6ZVR5cGUgbWVtYmVyQ291bnQpOwotICAgIGJvb2wgU3RhcnRBcnJheSgpOwotICAgIGJvb2wgRW5kQXJyYXkoU2l6ZVR5cGUgZWxlbWVudENvdW50KTsKLX07Ci1cZW5kY29kZQotKi8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJhc2VSZWFkZXJIYW5kbGVyCi0KLS8vISBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEhhbmRsZXIuCi0vKiEgVGhpcyBjYW4gYmUgdXNlZCBhcyBiYXNlIGNsYXNzIG9mIGFueSByZWFkZXIgaGFuZGxlci4KLSAgICBcbm90ZSBpbXBsZW1lbnRzIEhhbmRsZXIgY29uY2VwdAotKi8KLXRlbXBsYXRlPHR5cGVuYW1lIEVuY29kaW5nID0gVVRGODw+LCB0eXBlbmFtZSBEZXJpdmVkID0gdm9pZD4KLXN0cnVjdCBCYXNlUmVhZGVySGFuZGxlciB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBFbmNvZGluZzo6Q2ggQ2g7Ci0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsOjpTZWxlY3RJZjxpbnRlcm5hbDo6SXNTYW1lPERlcml2ZWQsIHZvaWQ+LCBCYXNlUmVhZGVySGFuZGxlciwgRGVyaXZlZD46OlR5cGUgT3ZlcnJpZGU7Ci0KLSAgICBib29sIERlZmF1bHQoKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgYm9vbCBOdWxsKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8T3ZlcnJpZGUmPigqdGhpcykuRGVmYXVsdCgpOyB9Ci0gICAgYm9vbCBCb29sKGJvb2wpIHsgcmV0dXJuIHN0YXRpY19jYXN0PE92ZXJyaWRlJj4oKnRoaXMpLkRlZmF1bHQoKTsgfQotICAgIGJvb2wgSW50KGludCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8T3ZlcnJpZGUmPigqdGhpcykuRGVmYXVsdCgpOyB9Ci0gICAgYm9vbCBVaW50KHVuc2lnbmVkKSB7IHJldHVybiBzdGF0aWNfY2FzdDxPdmVycmlkZSY+KCp0aGlzKS5EZWZhdWx0KCk7IH0KLSAgICBib29sIEludDY0KGludDY0X3QpIHsgcmV0dXJuIHN0YXRpY19jYXN0PE92ZXJyaWRlJj4oKnRoaXMpLkRlZmF1bHQoKTsgfQotICAgIGJvb2wgVWludDY0KHVpbnQ2NF90KSB7IHJldHVybiBzdGF0aWNfY2FzdDxPdmVycmlkZSY+KCp0aGlzKS5EZWZhdWx0KCk7IH0KLSAgICBib29sIERvdWJsZShkb3VibGUpIHsgcmV0dXJuIHN0YXRpY19jYXN0PE92ZXJyaWRlJj4oKnRoaXMpLkRlZmF1bHQoKTsgfQotICAgIC8vLyBlbmFibGVkIHZpYSBrUGFyc2VOdW1iZXJzQXNTdHJpbmdzRmxhZywgc3RyaW5nIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQgKHVzZSBsZW5ndGgpCi0gICAgYm9vbCBSYXdOdW1iZXIoY29uc3QgQ2gqIHN0ciwgU2l6ZVR5cGUgbGVuLCBib29sIGNvcHkpIHsgcmV0dXJuIHN0YXRpY19jYXN0PE92ZXJyaWRlJj4oKnRoaXMpLlN0cmluZyhzdHIsIGxlbiwgY29weSk7IH0KLSAgICBib29sIFN0cmluZyhjb25zdCBDaCosIFNpemVUeXBlLCBib29sKSB7IHJldHVybiBzdGF0aWNfY2FzdDxPdmVycmlkZSY+KCp0aGlzKS5EZWZhdWx0KCk7IH0KLSAgICBib29sIFN0YXJ0T2JqZWN0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8T3ZlcnJpZGUmPigqdGhpcykuRGVmYXVsdCgpOyB9Ci0gICAgYm9vbCBLZXkoY29uc3QgQ2gqIHN0ciwgU2l6ZVR5cGUgbGVuLCBib29sIGNvcHkpIHsgcmV0dXJuIHN0YXRpY19jYXN0PE92ZXJyaWRlJj4oKnRoaXMpLlN0cmluZyhzdHIsIGxlbiwgY29weSk7IH0KLSAgICBib29sIEVuZE9iamVjdChTaXplVHlwZSkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8T3ZlcnJpZGUmPigqdGhpcykuRGVmYXVsdCgpOyB9Ci0gICAgYm9vbCBTdGFydEFycmF5KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8T3ZlcnJpZGUmPigqdGhpcykuRGVmYXVsdCgpOyB9Ci0gICAgYm9vbCBFbmRBcnJheShTaXplVHlwZSkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8T3ZlcnJpZGUmPigqdGhpcykuRGVmYXVsdCgpOyB9Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdHJlYW1Mb2NhbENvcHkKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotdGVtcGxhdGU8dHlwZW5hbWUgU3RyZWFtLCBpbnQgPSBTdHJlYW1UcmFpdHM8U3RyZWFtPjo6Y29weU9wdGltaXphdGlvbj4KLWNsYXNzIFN0cmVhbUxvY2FsQ29weTsKLQotLy8hIERvIGNvcHkgb3B0aW1pemF0aW9uLgotdGVtcGxhdGU8dHlwZW5hbWUgU3RyZWFtPgotY2xhc3MgU3RyZWFtTG9jYWxDb3B5PFN0cmVhbSwgMT4gewotcHVibGljOgotICAgIFN0cmVhbUxvY2FsQ29weShTdHJlYW0mIG9yaWdpbmFsKSA6IHMob3JpZ2luYWwpLCBvcmlnaW5hbF8ob3JpZ2luYWwpIHt9Ci0gICAgflN0cmVhbUxvY2FsQ29weSgpIHsgb3JpZ2luYWxfID0gczsgfQotCi0gICAgU3RyZWFtIHM7Ci0KLXByaXZhdGU6Ci0gICAgU3RyZWFtTG9jYWxDb3B5JiBvcGVyYXRvcj0oY29uc3QgU3RyZWFtTG9jYWxDb3B5JikgLyogPSBkZWxldGUgKi87Ci0KLSAgICBTdHJlYW0mIG9yaWdpbmFsXzsKLX07Ci0KLS8vISBLZWVwIHJlZmVyZW5jZS4KLXRlbXBsYXRlPHR5cGVuYW1lIFN0cmVhbT4KLWNsYXNzIFN0cmVhbUxvY2FsQ29weTxTdHJlYW0sIDA+IHsKLXB1YmxpYzoKLSAgICBTdHJlYW1Mb2NhbENvcHkoU3RyZWFtJiBvcmlnaW5hbCkgOiBzKG9yaWdpbmFsKSB7fQotCi0gICAgU3RyZWFtJiBzOwotCi1wcml2YXRlOgotICAgIFN0cmVhbUxvY2FsQ29weSYgb3BlcmF0b3I9KGNvbnN0IFN0cmVhbUxvY2FsQ29weSYpIC8qID0gZGVsZXRlICovOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU2tpcFdoaXRlc3BhY2UKLQotLy8hIFNraXAgdGhlIEpTT04gd2hpdGUgc3BhY2VzIGluIGEgc3RyZWFtLgotLyohIFxwYXJhbSBpcyBBIGlucHV0IHN0cmVhbSBmb3Igc2tpcHBpbmcgd2hpdGUgc3BhY2VzLgotICAgIFxub3RlIFRoaXMgZnVuY3Rpb24gaGFzIFNTRTIvU1NFNC4yIHNwZWNpYWxpemF0aW9uLgotKi8KLXRlbXBsYXRlPHR5cGVuYW1lIElucHV0U3RyZWFtPgotdm9pZCBTa2lwV2hpdGVzcGFjZShJbnB1dFN0cmVhbSYgaXMpIHsKLSAgICBpbnRlcm5hbDo6U3RyZWFtTG9jYWxDb3B5PElucHV0U3RyZWFtPiBjb3B5KGlzKTsKLSAgICBJbnB1dFN0cmVhbSYgcyhjb3B5LnMpOwotCi0gICAgd2hpbGUgKHMuUGVlaygpID09ICcgJyB8fCBzLlBlZWsoKSA9PSAnXG4nIHx8IHMuUGVlaygpID09ICdccicgfHwgcy5QZWVrKCkgPT0gJ1x0JykKLSAgICAgICAgcy5UYWtlKCk7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyKiBTa2lwV2hpdGVzcGFjZShjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBlbmQpIHsKLSAgICB3aGlsZSAocCAhPSBlbmQgJiYgKCpwID09ICcgJyB8fCAqcCA9PSAnXG4nIHx8ICpwID09ICdccicgfHwgKnAgPT0gJ1x0JykpCi0gICAgICAgICsrcDsKLSAgICByZXR1cm4gcDsKLX0KLQotI2lmZGVmIFJBUElESlNPTl9TU0U0MgotLy8hIFNraXAgd2hpdGVzcGFjZSB3aXRoIFNTRSA0LjIgcGNtcGlzdHJtIGluc3RydWN0aW9uLCB0ZXN0aW5nIDE2IDgtYnl0ZSBjaGFyYWN0ZXJzIGF0IG9uY2UuCi1pbmxpbmUgY29uc3QgY2hhciAqU2tpcFdoaXRlc3BhY2VfU0lNRChjb25zdCBjaGFyKiBwKSB7Ci0gICAgLy8gRmFzdCByZXR1cm4gZm9yIHNpbmdsZSBub24td2hpdGVzcGFjZQotICAgIGlmICgqcCA9PSAnICcgfHwgKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInIHx8ICpwID09ICdcdCcpCi0gICAgICAgICsrcDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBwOwotCi0gICAgLy8gMTYtYnl0ZSBhbGlnbiB0byB0aGUgbmV4dCBib3VuZGFyeQotICAgIGNvbnN0IGNoYXIqIG5leHRBbGlnbmVkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihwKSArIDE1KSAmIHN0YXRpY19jYXN0PHNpemVfdD4ofjE1KSk7Ci0gICAgd2hpbGUgKHAgIT0gbmV4dEFsaWduZWQpCi0gICAgICAgIGlmICgqcCA9PSAnICcgfHwgKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInIHx8ICpwID09ICdcdCcpCi0gICAgICAgICAgICArK3A7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBwOwotCi0gICAgLy8gVGhlIHJlc3Qgb2Ygc3RyaW5nIHVzaW5nIFNJTUQKLSAgICBzdGF0aWMgY29uc3QgY2hhciB3aGl0ZXNwYWNlWzE2XSA9ICIgXG5cclx0IjsKLSAgICBjb25zdCBfX20xMjhpIHcgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZ3aGl0ZXNwYWNlWzBdKSk7Ci0KLSAgICBmb3IgKDs7IHAgKz0gMTYpIHsKLSAgICAgICAgY29uc3QgX19tMTI4aSBzID0gX21tX2xvYWRfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KHApKTsKLSAgICAgICAgY29uc3QgaW50IHIgPSBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fY21waXN0cm0odywgcywgX1NJRERfVUJZVEVfT1BTIHwgX1NJRERfQ01QX0VRVUFMX0FOWSB8IF9TSUREX0JJVF9NQVNLIHwgX1NJRERfTkVHQVRJVkVfUE9MQVJJVFkpKTsKLSAgICAgICAgaWYgKHIgIT0gMCkgeyAgIC8vIHNvbWUgb2YgY2hhcmFjdGVycyBpcyBub24td2hpdGVzcGFjZQotI2lmZGVmIF9NU0NfVkVSICAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgZmlyc3Qgbm9uLXdoaXRlc3BhY2UKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICAgICAgICAgX0JpdFNjYW5Gb3J3YXJkKCZvZmZzZXQsIHIpOwotICAgICAgICAgICAgcmV0dXJuIHAgKyBvZmZzZXQ7Ci0jZWxzZQotICAgICAgICAgICAgcmV0dXJuIHAgKyBfX2J1aWx0aW5fZmZzKHIpIC0gMTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotfQotCi1pbmxpbmUgY29uc3QgY2hhciAqU2tpcFdoaXRlc3BhY2VfU0lNRChjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBlbmQpIHsKLSAgICAvLyBGYXN0IHJldHVybiBmb3Igc2luZ2xlIG5vbi13aGl0ZXNwYWNlCi0gICAgaWYgKHAgIT0gZW5kICYmICgqcCA9PSAnICcgfHwgKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInIHx8ICpwID09ICdcdCcpKQotICAgICAgICArK3A7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gcDsKLQotICAgIC8vIFRoZSBtaWRkbGUgb2Ygc3RyaW5nIHVzaW5nIFNJTUQKLSAgICBzdGF0aWMgY29uc3QgY2hhciB3aGl0ZXNwYWNlWzE2XSA9ICIgXG5cclx0IjsKLSAgICBjb25zdCBfX20xMjhpIHcgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZ3aGl0ZXNwYWNlWzBdKSk7Ci0KLSAgICBmb3IgKDsgcCA8PSBlbmQgLSAxNjsgcCArPSAxNikgewotICAgICAgICBjb25zdCBfX20xMjhpIHMgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KHApKTsKLSAgICAgICAgY29uc3QgaW50IHIgPSBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fY21waXN0cm0odywgcywgX1NJRERfVUJZVEVfT1BTIHwgX1NJRERfQ01QX0VRVUFMX0FOWSB8IF9TSUREX0JJVF9NQVNLIHwgX1NJRERfTkVHQVRJVkVfUE9MQVJJVFkpKTsKLSAgICAgICAgaWYgKHIgIT0gMCkgeyAgIC8vIHNvbWUgb2YgY2hhcmFjdGVycyBpcyBub24td2hpdGVzcGFjZQotI2lmZGVmIF9NU0NfVkVSICAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgZmlyc3Qgbm9uLXdoaXRlc3BhY2UKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICAgICAgICAgX0JpdFNjYW5Gb3J3YXJkKCZvZmZzZXQsIHIpOwotICAgICAgICAgICAgcmV0dXJuIHAgKyBvZmZzZXQ7Ci0jZWxzZQotICAgICAgICAgICAgcmV0dXJuIHAgKyBfX2J1aWx0aW5fZmZzKHIpIC0gMTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFNraXBXaGl0ZXNwYWNlKHAsIGVuZCk7Ci19Ci0KLSNlbGlmIGRlZmluZWQoUkFQSURKU09OX1NTRTIpCi0KLS8vISBTa2lwIHdoaXRlc3BhY2Ugd2l0aCBTU0UyIGluc3RydWN0aW9ucywgdGVzdGluZyAxNiA4LWJ5dGUgY2hhcmFjdGVycyBhdCBvbmNlLgotaW5saW5lIGNvbnN0IGNoYXIgKlNraXBXaGl0ZXNwYWNlX1NJTUQoY29uc3QgY2hhciogcCkgewotICAgIC8vIEZhc3QgcmV0dXJuIGZvciBzaW5nbGUgbm9uLXdoaXRlc3BhY2UKLSAgICBpZiAoKnAgPT0gJyAnIHx8ICpwID09ICdcbicgfHwgKnAgPT0gJ1xyJyB8fCAqcCA9PSAnXHQnKQotICAgICAgICArK3A7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gcDsKLQotICAgIC8vIDE2LWJ5dGUgYWxpZ24gdG8gdGhlIG5leHQgYm91bmRhcnkKLSAgICBjb25zdCBjaGFyKiBuZXh0QWxpZ25lZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KChyZWludGVycHJldF9jYXN0PHNpemVfdD4ocCkgKyAxNSkgJiBzdGF0aWNfY2FzdDxzaXplX3Q+KH4xNSkpOwotICAgIHdoaWxlIChwICE9IG5leHRBbGlnbmVkKQotICAgICAgICBpZiAoKnAgPT0gJyAnIHx8ICpwID09ICdcbicgfHwgKnAgPT0gJ1xyJyB8fCAqcCA9PSAnXHQnKQotICAgICAgICAgICAgKytwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcDsKLQotICAgIC8vIFRoZSByZXN0IG9mIHN0cmluZwotICAgICNkZWZpbmUgQzE2KGMpIHsgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYyB9Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgd2hpdGVzcGFjZXNbNF1bMTZdID0geyBDMTYoJyAnKSwgQzE2KCdcbicpLCBDMTYoJ1xyJyksIEMxNignXHQnKSB9OwotICAgICN1bmRlZiBDMTYKLQotICAgIGNvbnN0IF9fbTEyOGkgdzAgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZ3aGl0ZXNwYWNlc1swXVswXSkpOwotICAgIGNvbnN0IF9fbTEyOGkgdzEgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZ3aGl0ZXNwYWNlc1sxXVswXSkpOwotICAgIGNvbnN0IF9fbTEyOGkgdzIgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZ3aGl0ZXNwYWNlc1syXVswXSkpOwotICAgIGNvbnN0IF9fbTEyOGkgdzMgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZ3aGl0ZXNwYWNlc1szXVswXSkpOwotCi0gICAgZm9yICg7OyBwICs9IDE2KSB7Ci0gICAgICAgIGNvbnN0IF9fbTEyOGkgcyA9IF9tbV9sb2FkX3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSAqPihwKSk7Ci0gICAgICAgIF9fbTEyOGkgeCA9IF9tbV9jbXBlcV9lcGk4KHMsIHcwKTsKLSAgICAgICAgeCA9IF9tbV9vcl9zaTEyOCh4LCBfbW1fY21wZXFfZXBpOChzLCB3MSkpOwotICAgICAgICB4ID0gX21tX29yX3NpMTI4KHgsIF9tbV9jbXBlcV9lcGk4KHMsIHcyKSk7Ci0gICAgICAgIHggPSBfbW1fb3Jfc2kxMjgoeCwgX21tX2NtcGVxX2VwaTgocywgdzMpKTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgciA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0Pih+X21tX21vdmVtYXNrX2VwaTgoeCkpOwotICAgICAgICBpZiAociAhPSAwKSB7ICAgLy8gc29tZSBvZiBjaGFyYWN0ZXJzIG1heSBiZSBub24td2hpdGVzcGFjZQotI2lmZGVmIF9NU0NfVkVSICAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgZmlyc3Qgbm9uLXdoaXRlc3BhY2UKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICAgICAgICAgX0JpdFNjYW5Gb3J3YXJkKCZvZmZzZXQsIHIpOwotICAgICAgICAgICAgcmV0dXJuIHAgKyBvZmZzZXQ7Ci0jZWxzZQotICAgICAgICAgICAgcmV0dXJuIHAgKyBfX2J1aWx0aW5fZmZzKHIpIC0gMTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotfQotCi1pbmxpbmUgY29uc3QgY2hhciAqU2tpcFdoaXRlc3BhY2VfU0lNRChjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBlbmQpIHsKLSAgICAvLyBGYXN0IHJldHVybiBmb3Igc2luZ2xlIG5vbi13aGl0ZXNwYWNlCi0gICAgaWYgKHAgIT0gZW5kICYmICgqcCA9PSAnICcgfHwgKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInIHx8ICpwID09ICdcdCcpKQotICAgICAgICArK3A7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gcDsKLQotICAgIC8vIFRoZSByZXN0IG9mIHN0cmluZwotICAgICNkZWZpbmUgQzE2KGMpIHsgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYywgYyB9Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgd2hpdGVzcGFjZXNbNF1bMTZdID0geyBDMTYoJyAnKSwgQzE2KCdcbicpLCBDMTYoJ1xyJyksIEMxNignXHQnKSB9OwotICAgICN1bmRlZiBDMTYKLQotICAgIGNvbnN0IF9fbTEyOGkgdzAgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZ3aGl0ZXNwYWNlc1swXVswXSkpOwotICAgIGNvbnN0IF9fbTEyOGkgdzEgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZ3aGl0ZXNwYWNlc1sxXVswXSkpOwotICAgIGNvbnN0IF9fbTEyOGkgdzIgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZ3aGl0ZXNwYWNlc1syXVswXSkpOwotICAgIGNvbnN0IF9fbTEyOGkgdzMgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZ3aGl0ZXNwYWNlc1szXVswXSkpOwotCi0gICAgZm9yICg7IHAgPD0gZW5kIC0gMTY7IHAgKz0gMTYpIHsKLSAgICAgICAgY29uc3QgX19tMTI4aSBzID0gX21tX2xvYWR1X3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSAqPihwKSk7Ci0gICAgICAgIF9fbTEyOGkgeCA9IF9tbV9jbXBlcV9lcGk4KHMsIHcwKTsKLSAgICAgICAgeCA9IF9tbV9vcl9zaTEyOCh4LCBfbW1fY21wZXFfZXBpOChzLCB3MSkpOwotICAgICAgICB4ID0gX21tX29yX3NpMTI4KHgsIF9tbV9jbXBlcV9lcGk4KHMsIHcyKSk7Ci0gICAgICAgIHggPSBfbW1fb3Jfc2kxMjgoeCwgX21tX2NtcGVxX2VwaTgocywgdzMpKTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgciA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0Pih+X21tX21vdmVtYXNrX2VwaTgoeCkpOwotICAgICAgICBpZiAociAhPSAwKSB7ICAgLy8gc29tZSBvZiBjaGFyYWN0ZXJzIG1heSBiZSBub24td2hpdGVzcGFjZQotI2lmZGVmIF9NU0NfVkVSICAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgZmlyc3Qgbm9uLXdoaXRlc3BhY2UKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICAgICAgICAgX0JpdFNjYW5Gb3J3YXJkKCZvZmZzZXQsIHIpOwotICAgICAgICAgICAgcmV0dXJuIHAgKyBvZmZzZXQ7Ci0jZWxzZQotICAgICAgICAgICAgcmV0dXJuIHAgKyBfX2J1aWx0aW5fZmZzKHIpIC0gMTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFNraXBXaGl0ZXNwYWNlKHAsIGVuZCk7Ci19Ci0KLSNlbmRpZiAvLyBSQVBJREpTT05fU1NFMgotCi0jaWZkZWYgUkFQSURKU09OX1NJTUQKLS8vISBUZW1wbGF0ZSBmdW5jdGlvbiBzcGVjaWFsaXphdGlvbiBmb3IgSW5zaXR1U3RyaW5nU3RyZWFtCi10ZW1wbGF0ZTw+IGlubGluZSB2b2lkIFNraXBXaGl0ZXNwYWNlKEluc2l0dVN0cmluZ1N0cmVhbSYgaXMpIHsgCi0gICAgaXMuc3JjXyA9IGNvbnN0X2Nhc3Q8Y2hhcio+KFNraXBXaGl0ZXNwYWNlX1NJTUQoaXMuc3JjXykpOwotfQotCi0vLyEgVGVtcGxhdGUgZnVuY3Rpb24gc3BlY2lhbGl6YXRpb24gZm9yIFN0cmluZ1N0cmVhbQotdGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBTa2lwV2hpdGVzcGFjZShTdHJpbmdTdHJlYW0mIGlzKSB7Ci0gICAgaXMuc3JjXyA9IFNraXBXaGl0ZXNwYWNlX1NJTUQoaXMuc3JjXyk7Ci19Ci0KLXRlbXBsYXRlPD4gaW5saW5lIHZvaWQgU2tpcFdoaXRlc3BhY2UoRW5jb2RlZElucHV0U3RyZWFtPFVURjg8PiwgTWVtb3J5U3RyZWFtPiYgaXMpIHsKLSAgICBpcy5pc18uc3JjXyA9IFNraXBXaGl0ZXNwYWNlX1NJTUQoaXMuaXNfLnNyY18sIGlzLmlzXy5lbmRfKTsKLX0KLSNlbmRpZiAvLyBSQVBJREpTT05fU0lNRAotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBHZW5lcmljUmVhZGVyCi0KLS8vISBTQVgtc3R5bGUgSlNPTiBwYXJzZXIuIFVzZSBccmVmIFJlYWRlciBmb3IgVVRGOCBlbmNvZGluZyBhbmQgZGVmYXVsdCBhbGxvY2F0b3IuCi0vKiEgR2VuZXJpY1JlYWRlciBwYXJzZXMgSlNPTiB0ZXh0IGZyb20gYSBzdHJlYW0sIGFuZCBzZW5kIGV2ZW50cyBzeW5jaHJvbm91c2x5IHRvIGFuIAotICAgIG9iamVjdCBpbXBsZW1lbnRpbmcgSGFuZGxlciBjb25jZXB0LgotCi0gICAgSXQgbmVlZHMgdG8gYWxsb2NhdGUgYSBzdGFjayBmb3Igc3RvcmluZyBhIHNpbmdsZSBkZWNvZGVkIHN0cmluZyBkdXJpbmcgCi0gICAgbm9uLWRlc3RydWN0aXZlIHBhcnNpbmcuCi0KLSAgICBGb3IgaW4tc2l0dSBwYXJzaW5nLCB0aGUgZGVjb2RlZCBzdHJpbmcgaXMgZGlyZWN0bHkgd3JpdHRlbiB0byB0aGUgc291cmNlIAotICAgIHRleHQgc3RyaW5nLCBubyB0ZW1wb3JhcnkgYnVmZmVyIGlzIHJlcXVpcmVkLgotCi0gICAgQSBHZW5lcmljUmVhZGVyIG9iamVjdCBjYW4gYmUgcmV1c2VkIGZvciBwYXJzaW5nIG11bHRpcGxlIEpTT04gdGV4dC4KLSAgICAKLSAgICBcdHBhcmFtIFNvdXJjZUVuY29kaW5nIEVuY29kaW5nIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAgXHRwYXJhbSBUYXJnZXRFbmNvZGluZyBFbmNvZGluZyBvZiB0aGUgcGFyc2Ugb3V0cHV0LgotICAgIFx0cGFyYW0gU3RhY2tBbGxvY2F0b3IgQWxsb2NhdG9yIHR5cGUgZm9yIHN0YWNrLgotKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VFbmNvZGluZywgdHlwZW5hbWUgVGFyZ2V0RW5jb2RpbmcsIHR5cGVuYW1lIFN0YWNrQWxsb2NhdG9yID0gQ3J0QWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY1JlYWRlciB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBTb3VyY2VFbmNvZGluZzo6Q2ggQ2g7IC8vITwgU291cmNlRW5jb2RpbmcgY2hhcmFjdGVyIHR5cGUKLQotICAgIC8vISBDb25zdHJ1Y3Rvci4KLSAgICAvKiEgXHBhcmFtIHN0YWNrQWxsb2NhdG9yIE9wdGlvbmFsIGFsbG9jYXRvciBmb3IgYWxsb2NhdGluZyBzdGFjayBtZW1vcnkuIChPbmx5IHVzZSBmb3Igbm9uLWRlc3RydWN0aXZlIHBhcnNpbmcpCi0gICAgICAgIFxwYXJhbSBzdGFja0NhcGFjaXR5IHN0YWNrIGNhcGFjaXR5IGluIGJ5dGVzIGZvciBzdG9yaW5nIGEgc2luZ2xlIGRlY29kZWQgc3RyaW5nLiAgKE9ubHkgdXNlIGZvciBub24tZGVzdHJ1Y3RpdmUgcGFyc2luZykKLSAgICAqLwotICAgIEdlbmVyaWNSZWFkZXIoU3RhY2tBbGxvY2F0b3IqIHN0YWNrQWxsb2NhdG9yID0gMCwgc2l6ZV90IHN0YWNrQ2FwYWNpdHkgPSBrRGVmYXVsdFN0YWNrQ2FwYWNpdHkpIDogc3RhY2tfKHN0YWNrQWxsb2NhdG9yLCBzdGFja0NhcGFjaXR5KSwgcGFyc2VSZXN1bHRfKCkge30KLQotICAgIC8vISBQYXJzZSBKU09OIHRleHQuCi0gICAgLyohIFx0cGFyYW0gcGFyc2VGbGFncyBDb21iaW5hdGlvbiBvZiBccmVmIFBhcnNlRmxhZy4KLSAgICAgICAgXHRwYXJhbSBJbnB1dFN0cmVhbSBUeXBlIG9mIGlucHV0IHN0cmVhbSwgaW1wbGVtZW50aW5nIFN0cmVhbSBjb25jZXB0LgotICAgICAgICBcdHBhcmFtIEhhbmRsZXIgVHlwZSBvZiBoYW5kbGVyLCBpbXBsZW1lbnRpbmcgSGFuZGxlciBjb25jZXB0LgotICAgICAgICBccGFyYW0gaXMgSW5wdXQgc3RyZWFtIHRvIGJlIHBhcnNlZC4KLSAgICAgICAgXHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gcmVjZWl2ZSBldmVudHMuCi0gICAgICAgIFxyZXR1cm4gV2hldGhlciB0aGUgcGFyc2luZyBpcyBzdWNjZXNzZnVsLgotICAgICovCi0gICAgdGVtcGxhdGUgPHVuc2lnbmVkIHBhcnNlRmxhZ3MsIHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBIYW5kbGVyPgotICAgIFBhcnNlUmVzdWx0IFBhcnNlKElucHV0U3RyZWFtJiBpcywgSGFuZGxlciYgaGFuZGxlcikgewotICAgICAgICBpZiAocGFyc2VGbGFncyAmIGtQYXJzZUl0ZXJhdGl2ZUZsYWcpCi0gICAgICAgICAgICByZXR1cm4gSXRlcmF0aXZlUGFyc2U8cGFyc2VGbGFncz4oaXMsIGhhbmRsZXIpOwotCi0gICAgICAgIHBhcnNlUmVzdWx0Xy5DbGVhcigpOwotCi0gICAgICAgIENsZWFyU3RhY2tPbkV4aXQgc2NvcGUoKnRoaXMpOwotCi0gICAgICAgIFNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHM8cGFyc2VGbGFncz4oaXMpOwotICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1JfRUFSTFlfUkVUVVJOKHBhcnNlUmVzdWx0Xyk7Ci0KLSAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWShpcy5QZWVrKCkgPT0gJ1wwJykpIHsKLSAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9OT1JFVFVSTihrUGFyc2VFcnJvckRvY3VtZW50RW1wdHksIGlzLlRlbGwoKSk7Ci0gICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1JfRUFSTFlfUkVUVVJOKHBhcnNlUmVzdWx0Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBQYXJzZVZhbHVlPHBhcnNlRmxhZ3M+KGlzLCBoYW5kbGVyKTsKLSAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9FQVJMWV9SRVRVUk4ocGFyc2VSZXN1bHRfKTsKLQotICAgICAgICAgICAgaWYgKCEocGFyc2VGbGFncyAmIGtQYXJzZVN0b3BXaGVuRG9uZUZsYWcpKSB7Ci0gICAgICAgICAgICAgICAgU2tpcFdoaXRlc3BhY2VBbmRDb21tZW50czxwYXJzZUZsYWdzPihpcyk7Ci0gICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SX0VBUkxZX1JFVFVSTihwYXJzZVJlc3VsdF8pOwotCi0gICAgICAgICAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWShpcy5QZWVrKCkgIT0gJ1wwJykpIHsKLSAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SX05PUkVUVVJOKGtQYXJzZUVycm9yRG9jdW1lbnRSb290Tm90U2luZ3VsYXIsIGlzLlRlbGwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9FQVJMWV9SRVRVUk4ocGFyc2VSZXN1bHRfKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyc2VSZXN1bHRfOwotICAgIH0KLQotICAgIC8vISBQYXJzZSBKU09OIHRleHQgKHdpdGggXHJlZiBrUGFyc2VEZWZhdWx0RmxhZ3MpCi0gICAgLyohIFx0cGFyYW0gSW5wdXRTdHJlYW0gVHlwZSBvZiBpbnB1dCBzdHJlYW0sIGltcGxlbWVudGluZyBTdHJlYW0gY29uY2VwdAotICAgICAgICBcdHBhcmFtIEhhbmRsZXIgVHlwZSBvZiBoYW5kbGVyLCBpbXBsZW1lbnRpbmcgSGFuZGxlciBjb25jZXB0LgotICAgICAgICBccGFyYW0gaXMgSW5wdXQgc3RyZWFtIHRvIGJlIHBhcnNlZC4KLSAgICAgICAgXHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gcmVjZWl2ZSBldmVudHMuCi0gICAgICAgIFxyZXR1cm4gV2hldGhlciB0aGUgcGFyc2luZyBpcyBzdWNjZXNzZnVsLgotICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBIYW5kbGVyPgotICAgIFBhcnNlUmVzdWx0IFBhcnNlKElucHV0U3RyZWFtJiBpcywgSGFuZGxlciYgaGFuZGxlcikgewotICAgICAgICByZXR1cm4gUGFyc2U8a1BhcnNlRGVmYXVsdEZsYWdzPihpcywgaGFuZGxlcik7Ci0gICAgfQotCi0gICAgLy8hIFdoZXRoZXIgYSBwYXJzZSBlcnJvciBoYXMgb2NjdXJlZCBpbiB0aGUgbGFzdCBwYXJzaW5nLgotICAgIGJvb2wgSGFzUGFyc2VFcnJvcigpIGNvbnN0IHsgcmV0dXJuIHBhcnNlUmVzdWx0Xy5Jc0Vycm9yKCk7IH0KLSAgICAKLSAgICAvLyEgR2V0IHRoZSBccmVmIFBhcnNlRXJyb3JDb2RlIG9mIGxhc3QgcGFyc2luZy4KLSAgICBQYXJzZUVycm9yQ29kZSBHZXRQYXJzZUVycm9yQ29kZSgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlUmVzdWx0Xy5Db2RlKCk7IH0KLQotICAgIC8vISBHZXQgdGhlIHBvc2l0aW9uIG9mIGxhc3QgcGFyc2luZyBlcnJvciBpbiBpbnB1dCwgMCBvdGhlcndpc2UuCi0gICAgc2l6ZV90IEdldEVycm9yT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gcGFyc2VSZXN1bHRfLk9mZnNldCgpOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2b2lkIFNldFBhcnNlRXJyb3IoUGFyc2VFcnJvckNvZGUgY29kZSwgc2l6ZV90IG9mZnNldCkgeyBwYXJzZVJlc3VsdF8uU2V0KGNvZGUsIG9mZnNldCk7IH0KLQotcHJpdmF0ZToKLSAgICAvLyBQcm9oaWJpdCBjb3B5IGNvbnN0cnVjdG9yICYgYXNzaWdubWVudCBvcGVyYXRvci4KLSAgICBHZW5lcmljUmVhZGVyKGNvbnN0IEdlbmVyaWNSZWFkZXImKTsKLSAgICBHZW5lcmljUmVhZGVyJiBvcGVyYXRvcj0oY29uc3QgR2VuZXJpY1JlYWRlciYpOwotCi0gICAgdm9pZCBDbGVhclN0YWNrKCkgeyBzdGFja18uQ2xlYXIoKTsgfQotCi0gICAgLy8gY2xlYXIgc3RhY2sgb24gYW55IGV4aXQgZnJvbSBQYXJzZVN0cmVhbSwgZS5nLiBkdWUgdG8gZXhjZXB0aW9uCi0gICAgc3RydWN0IENsZWFyU3RhY2tPbkV4aXQgewotICAgICAgICBleHBsaWNpdCBDbGVhclN0YWNrT25FeGl0KEdlbmVyaWNSZWFkZXImIHIpIDogcl8ocikge30KLSAgICAgICAgfkNsZWFyU3RhY2tPbkV4aXQoKSB7IHJfLkNsZWFyU3RhY2soKTsgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIEdlbmVyaWNSZWFkZXImIHJfOwotICAgICAgICBDbGVhclN0YWNrT25FeGl0KGNvbnN0IENsZWFyU3RhY2tPbkV4aXQmKTsKLSAgICAgICAgQ2xlYXJTdGFja09uRXhpdCYgb3BlcmF0b3I9KGNvbnN0IENsZWFyU3RhY2tPbkV4aXQmKTsKLSAgICB9OwotCi0gICAgdGVtcGxhdGU8dW5zaWduZWQgcGFyc2VGbGFncywgdHlwZW5hbWUgSW5wdXRTdHJlYW0+Ci0gICAgdm9pZCBTa2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKElucHV0U3RyZWFtJiBpcykgewotICAgICAgICBTa2lwV2hpdGVzcGFjZShpcyk7Ci0KLSAgICAgICAgaWYgKHBhcnNlRmxhZ3MgJiBrUGFyc2VDb21tZW50c0ZsYWcpIHsKLSAgICAgICAgICAgIHdoaWxlIChSQVBJREpTT05fVU5MSUtFTFkoQ29uc3VtZShpcywgJy8nKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoQ29uc3VtZShpcywgJyonKSkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWShpcy5QZWVrKCkgPT0gJ1wwJykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVW5zcGVjaWZpY1N5bnRheEVycm9yLCBpcy5UZWxsKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQ29uc3VtZShpcywgJyonKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25zdW1lKGlzLCAnLycpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5UYWtlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUkFQSURKU09OX0xJS0VMWShDb25zdW1lKGlzLCAnLycpKSkKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlzLlBlZWsoKSAhPSAnXDAnICYmIGlzLlRha2UoKSAhPSAnXG4nKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclVuc3BlY2lmaWNTeW50YXhFcnJvciwgaXMuVGVsbCgpKTsKLQotICAgICAgICAgICAgICAgIFNraXBXaGl0ZXNwYWNlKGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFBhcnNlIG9iamVjdDogeyBzdHJpbmcgOiB2YWx1ZSwgLi4uIH0KLSAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBwYXJzZUZsYWdzLCB0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgICB2b2lkIFBhcnNlT2JqZWN0KElucHV0U3RyZWFtJiBpcywgSGFuZGxlciYgaGFuZGxlcikgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGlzLlBlZWsoKSA9PSAneycpOwotICAgICAgICBpcy5UYWtlKCk7ICAvLyBTa2lwICd7JwotICAgICAgICAKLSAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWSghaGFuZGxlci5TdGFydE9iamVjdCgpKSkKLSAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCBpcy5UZWxsKCkpOwotCi0gICAgICAgIFNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHM8cGFyc2VGbGFncz4oaXMpOwotICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1JfRUFSTFlfUkVUVVJOX1ZPSUQ7Ci0KLSAgICAgICAgaWYgKENvbnN1bWUoaXMsICd9JykpIHsKLSAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoIWhhbmRsZXIuRW5kT2JqZWN0KDApKSkgIC8vIGVtcHR5IG9iamVjdAotICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCBpcy5UZWxsKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChTaXplVHlwZSBtZW1iZXJDb3VudCA9IDA7OykgewotICAgICAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWShpcy5QZWVrKCkgIT0gJyInKSkKLSAgICAgICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1Ioa1BhcnNlRXJyb3JPYmplY3RNaXNzTmFtZSwgaXMuVGVsbCgpKTsKLQotICAgICAgICAgICAgUGFyc2VTdHJpbmc8cGFyc2VGbGFncz4oaXMsIGhhbmRsZXIsIHRydWUpOwotICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SX0VBUkxZX1JFVFVSTl9WT0lEOwotCi0gICAgICAgICAgICBTa2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzPHBhcnNlRmxhZ3M+KGlzKTsKLSAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9FQVJMWV9SRVRVUk5fVk9JRDsKLQotICAgICAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWSghQ29uc3VtZShpcywgJzonKSkpCi0gICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yT2JqZWN0TWlzc0NvbG9uLCBpcy5UZWxsKCkpOwotCi0gICAgICAgICAgICBTa2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzPHBhcnNlRmxhZ3M+KGlzKTsKLSAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9FQVJMWV9SRVRVUk5fVk9JRDsKLQotICAgICAgICAgICAgUGFyc2VWYWx1ZTxwYXJzZUZsYWdzPihpcywgaGFuZGxlcik7Ci0gICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1JfRUFSTFlfUkVUVVJOX1ZPSUQ7Ci0KLSAgICAgICAgICAgIFNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHM8cGFyc2VGbGFncz4oaXMpOwotICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SX0VBUkxZX1JFVFVSTl9WT0lEOwotCi0gICAgICAgICAgICArK21lbWJlckNvdW50OwotCi0gICAgICAgICAgICBzd2l0Y2ggKGlzLlBlZWsoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgJywnOgotICAgICAgICAgICAgICAgICAgICBpcy5UYWtlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHM8cGFyc2VGbGFncz4oaXMpOwotICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1JfRUFSTFlfUkVUVVJOX1ZPSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ30nOiAKLSAgICAgICAgICAgICAgICAgICAgaXMuVGFrZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKCFoYW5kbGVyLkVuZE9iamVjdChtZW1iZXJDb3VudCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVGVybWluYXRpb24sIGlzLlRlbGwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiAgCi0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvck9iamVjdE1pc3NDb21tYU9yQ3VybHlCcmFja2V0LCBpcy5UZWxsKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcnNlRmxhZ3MgJiBrUGFyc2VUcmFpbGluZ0NvbW1hc0ZsYWcpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXMuUGVlaygpID09ICd9JykgewotICAgICAgICAgICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKCFoYW5kbGVyLkVuZE9iamVjdChtZW1iZXJDb3VudCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVGVybWluYXRpb24sIGlzLlRlbGwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlzLlRha2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFBhcnNlIGFycmF5OiBbIHZhbHVlLCAuLi4gXQotICAgIHRlbXBsYXRlPHVuc2lnbmVkIHBhcnNlRmxhZ3MsIHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBIYW5kbGVyPgotICAgIHZvaWQgUGFyc2VBcnJheShJbnB1dFN0cmVhbSYgaXMsIEhhbmRsZXImIGhhbmRsZXIpIHsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChpcy5QZWVrKCkgPT0gJ1snKTsKLSAgICAgICAgaXMuVGFrZSgpOyAgLy8gU2tpcCAnWycKLSAgICAgICAgCi0gICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoIWhhbmRsZXIuU3RhcnRBcnJheSgpKSkKLSAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCBpcy5UZWxsKCkpOwotICAgICAgICAKLSAgICAgICAgU2tpcFdoaXRlc3BhY2VBbmRDb21tZW50czxwYXJzZUZsYWdzPihpcyk7Ci0gICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9FQVJMWV9SRVRVUk5fVk9JRDsKLQotICAgICAgICBpZiAoQ29uc3VtZShpcywgJ10nKSkgewotICAgICAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWSghaGFuZGxlci5FbmRBcnJheSgwKSkpIC8vIGVtcHR5IGFycmF5Ci0gICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVGVybWluYXRpb24sIGlzLlRlbGwoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFNpemVUeXBlIGVsZW1lbnRDb3VudCA9IDA7OykgewotICAgICAgICAgICAgUGFyc2VWYWx1ZTxwYXJzZUZsYWdzPihpcywgaGFuZGxlcik7Ci0gICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1JfRUFSTFlfUkVUVVJOX1ZPSUQ7Ci0KLSAgICAgICAgICAgICsrZWxlbWVudENvdW50OwotICAgICAgICAgICAgU2tpcFdoaXRlc3BhY2VBbmRDb21tZW50czxwYXJzZUZsYWdzPihpcyk7Ci0gICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1JfRUFSTFlfUkVUVVJOX1ZPSUQ7Ci0KLSAgICAgICAgICAgIGlmIChDb25zdW1lKGlzLCAnLCcpKSB7Ci0gICAgICAgICAgICAgICAgU2tpcFdoaXRlc3BhY2VBbmRDb21tZW50czxwYXJzZUZsYWdzPihpcyk7Ci0gICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SX0VBUkxZX1JFVFVSTl9WT0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoQ29uc3VtZShpcywgJ10nKSkgewotICAgICAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoIWhhbmRsZXIuRW5kQXJyYXkoZWxlbWVudENvdW50KSkpCi0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCBpcy5UZWxsKCkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1Ioa1BhcnNlRXJyb3JBcnJheU1pc3NDb21tYU9yU3F1YXJlQnJhY2tldCwgaXMuVGVsbCgpKTsKLQotICAgICAgICAgICAgaWYgKHBhcnNlRmxhZ3MgJiBrUGFyc2VUcmFpbGluZ0NvbW1hc0ZsYWcpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXMuUGVlaygpID09ICddJykgewotICAgICAgICAgICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKCFoYW5kbGVyLkVuZEFycmF5KGVsZW1lbnRDb3VudCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVGVybWluYXRpb24sIGlzLlRlbGwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlzLlRha2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHRlbXBsYXRlPHVuc2lnbmVkIHBhcnNlRmxhZ3MsIHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBIYW5kbGVyPgotICAgIHZvaWQgUGFyc2VOdWxsKElucHV0U3RyZWFtJiBpcywgSGFuZGxlciYgaGFuZGxlcikgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGlzLlBlZWsoKSA9PSAnbicpOwotICAgICAgICBpcy5UYWtlKCk7Ci0KLSAgICAgICAgaWYgKFJBUElESlNPTl9MSUtFTFkoQ29uc3VtZShpcywgJ3UnKSAmJiBDb25zdW1lKGlzLCAnbCcpICYmIENvbnN1bWUoaXMsICdsJykpKSB7Ci0gICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKCFoYW5kbGVyLk51bGwoKSkpCi0gICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVGVybWluYXRpb24sIGlzLlRlbGwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVmFsdWVJbnZhbGlkLCBpcy5UZWxsKCkpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHVuc2lnbmVkIHBhcnNlRmxhZ3MsIHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBIYW5kbGVyPgotICAgIHZvaWQgUGFyc2VUcnVlKElucHV0U3RyZWFtJiBpcywgSGFuZGxlciYgaGFuZGxlcikgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKGlzLlBlZWsoKSA9PSAndCcpOwotICAgICAgICBpcy5UYWtlKCk7Ci0KLSAgICAgICAgaWYgKFJBUElESlNPTl9MSUtFTFkoQ29uc3VtZShpcywgJ3InKSAmJiBDb25zdW1lKGlzLCAndScpICYmIENvbnN1bWUoaXMsICdlJykpKSB7Ci0gICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKCFoYW5kbGVyLkJvb2wodHJ1ZSkpKQotICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCBpcy5UZWxsKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclZhbHVlSW52YWxpZCwgaXMuVGVsbCgpKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBwYXJzZUZsYWdzLCB0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgICB2b2lkIFBhcnNlRmFsc2UoSW5wdXRTdHJlYW0mIGlzLCBIYW5kbGVyJiBoYW5kbGVyKSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoaXMuUGVlaygpID09ICdmJyk7Ci0gICAgICAgIGlzLlRha2UoKTsKLQotICAgICAgICBpZiAoUkFQSURKU09OX0xJS0VMWShDb25zdW1lKGlzLCAnYScpICYmIENvbnN1bWUoaXMsICdsJykgJiYgQ29uc3VtZShpcywgJ3MnKSAmJiBDb25zdW1lKGlzLCAnZScpKSkgewotICAgICAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWSghaGFuZGxlci5Cb29sKGZhbHNlKSkpCi0gICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVGVybWluYXRpb24sIGlzLlRlbGwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVmFsdWVJbnZhbGlkLCBpcy5UZWxsKCkpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0U3RyZWFtPgotICAgIFJBUElESlNPTl9GT1JDRUlOTElORSBzdGF0aWMgYm9vbCBDb25zdW1lKElucHV0U3RyZWFtJiBpcywgdHlwZW5hbWUgSW5wdXRTdHJlYW06OkNoIGV4cGVjdCkgewotICAgICAgICBpZiAoUkFQSURKU09OX0xJS0VMWShpcy5QZWVrKCkgPT0gZXhwZWN0KSkgewotICAgICAgICAgICAgaXMuVGFrZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBwYXJzZSBmb3VyIGhleGlkZWNpbWFsIGRpZ2l0cyBpbiBcdVhYWFggaW4gUGFyc2VTdHJpbmcoKS4KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFN0cmVhbT4KLSAgICB1bnNpZ25lZCBQYXJzZUhleDQoSW5wdXRTdHJlYW0mIGlzLCBzaXplX3QgZXNjYXBlT2Zmc2V0KSB7Ci0gICAgICAgIHVuc2lnbmVkIGNvZGVwb2ludCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICBDaCBjID0gaXMuUGVlaygpOwotICAgICAgICAgICAgY29kZXBvaW50IDw8PSA0OwotICAgICAgICAgICAgY29kZXBvaW50ICs9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjKTsKLSAgICAgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLSAgICAgICAgICAgICAgICBjb2RlcG9pbnQgLT0gJzAnOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCi0gICAgICAgICAgICAgICAgY29kZXBvaW50IC09ICdBJyAtIDEwOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCi0gICAgICAgICAgICAgICAgY29kZXBvaW50IC09ICdhJyAtIDEwOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SX05PUkVUVVJOKGtQYXJzZUVycm9yU3RyaW5nVW5pY29kZUVzY2FwZUludmFsaWRIZXgsIGVzY2FwZU9mZnNldCk7Ci0gICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SX0VBUkxZX1JFVFVSTigwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlzLlRha2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29kZXBvaW50OwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KLSAgICBjbGFzcyBTdGFja1N0cmVhbSB7Ci0gICAgcHVibGljOgotICAgICAgICB0eXBlZGVmIENoYXJUeXBlIENoOwotCi0gICAgICAgIFN0YWNrU3RyZWFtKGludGVybmFsOjpTdGFjazxTdGFja0FsbG9jYXRvcj4mIHN0YWNrKSA6IHN0YWNrXyhzdGFjayksIGxlbmd0aF8oMCkge30KLSAgICAgICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIHZvaWQgUHV0KENoIGMpIHsKLSAgICAgICAgICAgICpzdGFja18udGVtcGxhdGUgUHVzaDxDaD4oKSA9IGM7Ci0gICAgICAgICAgICArK2xlbmd0aF87Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFJBUElESlNPTl9GT1JDRUlOTElORSB2b2lkKiBQdXNoKFNpemVUeXBlIGNvdW50KSB7Ci0gICAgICAgICAgICBsZW5ndGhfICs9IGNvdW50OwotICAgICAgICAgICAgcmV0dXJuIHN0YWNrXy50ZW1wbGF0ZSBQdXNoPENoPihjb3VudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXzsgfQotCi0gICAgICAgIENoKiBQb3AoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhY2tfLnRlbXBsYXRlIFBvcDxDaD4obGVuZ3RoXyk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFN0YWNrU3RyZWFtKGNvbnN0IFN0YWNrU3RyZWFtJik7Ci0gICAgICAgIFN0YWNrU3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgU3RhY2tTdHJlYW0mKTsKLQotICAgICAgICBpbnRlcm5hbDo6U3RhY2s8U3RhY2tBbGxvY2F0b3I+JiBzdGFja187Ci0gICAgICAgIFNpemVUeXBlIGxlbmd0aF87Ci0gICAgfTsKLQotICAgIC8vIFBhcnNlIHN0cmluZyBhbmQgZ2VuZXJhdGUgU3RyaW5nIGV2ZW50LiBEaWZmZXJlbnQgY29kZSBwYXRocyBmb3Iga1BhcnNlSW5zaXR1RmxhZy4KLSAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBwYXJzZUZsYWdzLCB0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgICB2b2lkIFBhcnNlU3RyaW5nKElucHV0U3RyZWFtJiBpcywgSGFuZGxlciYgaGFuZGxlciwgYm9vbCBpc0tleSA9IGZhbHNlKSB7Ci0gICAgICAgIGludGVybmFsOjpTdHJlYW1Mb2NhbENvcHk8SW5wdXRTdHJlYW0+IGNvcHkoaXMpOwotICAgICAgICBJbnB1dFN0cmVhbSYgcyhjb3B5LnMpOwotCi0gICAgICAgIFJBUElESlNPTl9BU1NFUlQocy5QZWVrKCkgPT0gJ1wiJyk7Ci0gICAgICAgIHMuVGFrZSgpOyAgLy8gU2tpcCAnXCInCi0KLSAgICAgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIGlmIChwYXJzZUZsYWdzICYga1BhcnNlSW5zaXR1RmxhZykgewotICAgICAgICAgICAgdHlwZW5hbWUgSW5wdXRTdHJlYW06OkNoICpoZWFkID0gcy5QdXRCZWdpbigpOwotICAgICAgICAgICAgUGFyc2VTdHJpbmdUb1N0cmVhbTxwYXJzZUZsYWdzLCBTb3VyY2VFbmNvZGluZywgU291cmNlRW5jb2Rpbmc+KHMsIHMpOwotICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SX0VBUkxZX1JFVFVSTl9WT0lEOwotICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHMuUHV0RW5kKGhlYWQpIC0gMTsKLSAgICAgICAgICAgIFJBUElESlNPTl9BU1NFUlQobGVuZ3RoIDw9IDB4RkZGRkZGRkYpOwotICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgVGFyZ2V0RW5jb2Rpbmc6OkNoKiBjb25zdCBzdHIgPSByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIFRhcmdldEVuY29kaW5nOjpDaCo+KGhlYWQpOwotICAgICAgICAgICAgc3VjY2VzcyA9IChpc0tleSA/IGhhbmRsZXIuS2V5KHN0ciwgU2l6ZVR5cGUobGVuZ3RoKSwgZmFsc2UpIDogaGFuZGxlci5TdHJpbmcoc3RyLCBTaXplVHlwZShsZW5ndGgpLCBmYWxzZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgU3RhY2tTdHJlYW08dHlwZW5hbWUgVGFyZ2V0RW5jb2Rpbmc6OkNoPiBzdGFja1N0cmVhbShzdGFja18pOwotICAgICAgICAgICAgUGFyc2VTdHJpbmdUb1N0cmVhbTxwYXJzZUZsYWdzLCBTb3VyY2VFbmNvZGluZywgVGFyZ2V0RW5jb2Rpbmc+KHMsIHN0YWNrU3RyZWFtKTsKLSAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9FQVJMWV9SRVRVUk5fVk9JRDsKLSAgICAgICAgICAgIFNpemVUeXBlIGxlbmd0aCA9IHN0YXRpY19jYXN0PFNpemVUeXBlPihzdGFja1N0cmVhbS5MZW5ndGgoKSkgLSAxOwotICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgVGFyZ2V0RW5jb2Rpbmc6OkNoKiBjb25zdCBzdHIgPSBzdGFja1N0cmVhbS5Qb3AoKTsKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSAoaXNLZXkgPyBoYW5kbGVyLktleShzdHIsIGxlbmd0aCwgdHJ1ZSkgOiBoYW5kbGVyLlN0cmluZyhzdHIsIGxlbmd0aCwgdHJ1ZSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoIXN1Y2Nlc3MpKQotICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVGVybWluYXRpb24sIHMuVGVsbCgpKTsKLSAgICB9Ci0KLSAgICAvLyBQYXJzZSBzdHJpbmcgdG8gYW4gb3V0cHV0IGlzCi0gICAgLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVmaXgvc3VmZml4IGRvdWJsZSBxdW90ZXMsIGVzY2FwaW5nLCBhbmQgb3B0aW9uYWwgZW5jb2RpbmcgdmFsaWRhdGlvbi4KLSAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBwYXJzZUZsYWdzLCB0eXBlbmFtZSBTRW5jb2RpbmcsIHR5cGVuYW1lIFRFbmNvZGluZywgdHlwZW5hbWUgSW5wdXRTdHJlYW0sIHR5cGVuYW1lIE91dHB1dFN0cmVhbT4KLSAgICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgdm9pZCBQYXJzZVN0cmluZ1RvU3RyZWFtKElucHV0U3RyZWFtJiBpcywgT3V0cHV0U3RyZWFtJiBvcykgewotLy8hQGNvbmQgUkFQSURKU09OX0hJRERFTl9GUk9NX0RPWFlHRU4KLSNkZWZpbmUgWjE2IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZXNjYXBlWzI1Nl0gPSB7Ci0gICAgICAgICAgICBaMTYsIFoxNiwgMCwgMCwnXCInLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCcvJywgCi0gICAgICAgICAgICBaMTYsIFoxNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwnXFwnLCAwLCAwLCAwLCAKLSAgICAgICAgICAgIDAsIDAsJ1xiJywgMCwgMCwgMCwnXGYnLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCdcbicsIDAsIAotICAgICAgICAgICAgMCwgMCwnXHInLCAwLCdcdCcsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIAotICAgICAgICAgICAgWjE2LCBaMTYsIFoxNiwgWjE2LCBaMTYsIFoxNiwgWjE2LCBaMTYKLSAgICAgICAgfTsKLSN1bmRlZiBaMTYKLS8vIUBlbmRjb25kCi0KLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgLy8gU2NhbiBhbmQgY29weSBzdHJpbmcgYmVmb3JlICJcXFwiIiBvciA8IDB4MjAuIFRoaXMgaXMgYW4gb3B0aW9uYWwgb3B0aW16YXRpb24uCi0gICAgICAgICAgICBpZiAoIShwYXJzZUZsYWdzICYga1BhcnNlVmFsaWRhdGVFbmNvZGluZ0ZsYWcpKQotICAgICAgICAgICAgICAgIFNjYW5Db3B5VW5lc2NhcGVkU3RyaW5nKGlzLCBvcyk7Ci0KLSAgICAgICAgICAgIENoIGMgPSBpcy5QZWVrKCk7Ci0gICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKGMgPT0gJ1xcJykpIHsgICAgLy8gRXNjYXBlCi0gICAgICAgICAgICAgICAgc2l6ZV90IGVzY2FwZU9mZnNldCA9IGlzLlRlbGwoKTsgICAgLy8gRm9yIGludmFsaWQgZXNjYXBpbmcsIHJlcG9ydCB0aGUgaW5pdGFsICdcXCcgYXMgZXJyb3Igb2Zmc2V0Ci0gICAgICAgICAgICAgICAgaXMuVGFrZSgpOwotICAgICAgICAgICAgICAgIENoIGUgPSBpcy5QZWVrKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChzaXplb2YoQ2gpID09IDEgfHwgdW5zaWduZWQoZSkgPCAyNTYpICYmIFJBUElESlNPTl9MSUtFTFkoZXNjYXBlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGUpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXMuVGFrZSgpOwotICAgICAgICAgICAgICAgICAgICBvcy5QdXQoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgVEVuY29kaW5nOjpDaD4oZXNjYXBlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGUpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChSQVBJREpTT05fTElLRUxZKGUgPT0gJ3UnKSkgeyAgICAvLyBVbmljb2RlCi0gICAgICAgICAgICAgICAgICAgIGlzLlRha2UoKTsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29kZXBvaW50ID0gUGFyc2VIZXg0KGlzLCBlc2NhcGVPZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1JfRUFSTFlfUkVUVVJOX1ZPSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoY29kZXBvaW50ID49IDB4RDgwMCAmJiBjb2RlcG9pbnQgPD0gMHhEQkZGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIFVURi0xNiBzdXJyb2dhdGUgcGFpcgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWSghQ29uc3VtZShpcywgJ1xcJykgfHwgIUNvbnN1bWUoaXMsICd1JykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclN0cmluZ1VuaWNvZGVTdXJyb2dhdGVJbnZhbGlkLCBlc2NhcGVPZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29kZXBvaW50MiA9IFBhcnNlSGV4NChpcywgZXNjYXBlT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9FQVJMWV9SRVRVUk5fVk9JRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoY29kZXBvaW50MiA8IDB4REMwMCB8fCBjb2RlcG9pbnQyID4gMHhERkZGKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1Ioa1BhcnNlRXJyb3JTdHJpbmdVbmljb2RlU3Vycm9nYXRlSW52YWxpZCwgZXNjYXBlT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVwb2ludCA9ICgoKGNvZGVwb2ludCAtIDB4RDgwMCkgPDwgMTApIHwgKGNvZGVwb2ludDIgLSAweERDMDApKSArIDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgVEVuY29kaW5nOjpFbmNvZGUob3MsIGNvZGVwb2ludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yU3RyaW5nRXNjYXBlSW52YWxpZCwgZXNjYXBlT2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFJBUElESlNPTl9VTkxJS0VMWShjID09ICciJykpIHsgICAgLy8gQ2xvc2luZyBkb3VibGUgcXVvdGUKLSAgICAgICAgICAgICAgICBpcy5UYWtlKCk7Ci0gICAgICAgICAgICAgICAgb3MuUHV0KCdcMCcpOyAgIC8vIG51bGwtdGVybWluYXRlIHRoZSBzdHJpbmcKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChSQVBJREpTT05fVU5MSUtFTFkoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGMpIDwgMHgyMCkpIHsgLy8gUkZDIDQ2Mjc6IHVuZXNjYXBlZCA9ICV4MjAtMjEgLyAleDIzLTVCIC8gJXg1RC0xMEZGRkYKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXDAnKQotICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1Ioa1BhcnNlRXJyb3JTdHJpbmdNaXNzUXVvdGF0aW9uTWFyaywgaXMuVGVsbCgpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclN0cmluZ0VzY2FwZUludmFsaWQsIGlzLlRlbGwoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gaXMuVGVsbCgpOwotICAgICAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoKHBhcnNlRmxhZ3MgJiBrUGFyc2VWYWxpZGF0ZUVuY29kaW5nRmxhZyA/IAotICAgICAgICAgICAgICAgICAgICAhVHJhbnNjb2RlcjxTRW5jb2RpbmcsIFRFbmNvZGluZz46OlZhbGlkYXRlKGlzLCBvcykgOiAKLSAgICAgICAgICAgICAgICAgICAgIVRyYW5zY29kZXI8U0VuY29kaW5nLCBURW5jb2Rpbmc+OjpUcmFuc2NvZGUoaXMsIG9zKSkpKQotICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1Ioa1BhcnNlRXJyb3JTdHJpbmdJbnZhbGlkRW5jb2RpbmcsIG9mZnNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgT3V0cHV0U3RyZWFtPgotICAgIHN0YXRpYyBSQVBJREpTT05fRk9SQ0VJTkxJTkUgdm9pZCBTY2FuQ29weVVuZXNjYXBlZFN0cmluZyhJbnB1dFN0cmVhbSYsIE91dHB1dFN0cmVhbSYpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcgZm9yIGdlbmVyaWMgdmVyc2lvbgotICAgIH0KLQotI2lmIGRlZmluZWQoUkFQSURKU09OX1NTRTIpIHx8IGRlZmluZWQoUkFQSURKU09OX1NTRTQyKQotICAgIC8vIFN0cmluZ1N0cmVhbSAtPiBTdGFja1N0cmVhbTxjaGFyPgotICAgIHN0YXRpYyBSQVBJREpTT05fRk9SQ0VJTkxJTkUgdm9pZCBTY2FuQ29weVVuZXNjYXBlZFN0cmluZyhTdHJpbmdTdHJlYW0mIGlzLCBTdGFja1N0cmVhbTxjaGFyPiYgb3MpIHsKLSAgICAgICAgY29uc3QgY2hhciogcCA9IGlzLnNyY187Ci0KLSAgICAgICAgLy8gU2NhbiBvbmUgYnkgb25lIHVudGlsIGFsaWdubWVudCAodW5hbGlnbmVkIGxvYWQgbWF5IGNyb3NzIHBhZ2UgYm91bmRhcnkgYW5kIGNhdXNlIGNyYXNoKQotICAgICAgICBjb25zdCBjaGFyKiBuZXh0QWxpZ25lZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KChyZWludGVycHJldF9jYXN0PHNpemVfdD4ocCkgKyAxNSkgJiBzdGF0aWNfY2FzdDxzaXplX3Q+KH4xNSkpOwotICAgICAgICB3aGlsZSAocCAhPSBuZXh0QWxpZ25lZCkKLSAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoKnAgPT0gJ1wiJykgfHwgUkFQSURKU09OX1VOTElLRUxZKCpwID09ICdcXCcpIHx8IFJBUElESlNPTl9VTkxJS0VMWShzdGF0aWNfY2FzdDx1bnNpZ25lZD4oKnApIDwgMHgyMCkpIHsKLSAgICAgICAgICAgICAgICBpcy5zcmNfID0gcDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgb3MuUHV0KCpwKyspOwotCi0gICAgICAgIC8vIFRoZSByZXN0IG9mIHN0cmluZyB1c2luZyBTSU1ECi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRxdW90ZVsxNl0gPSB7ICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicsICdcIicgfTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgYnNsYXNoWzE2XSA9IHsgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJywgJ1xcJyB9OwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzcGFjZVsxNl0gID0geyAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5IH07Ci0gICAgICAgIGNvbnN0IF9fbTEyOGkgZHEgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZkcXVvdGVbMF0pKTsKLSAgICAgICAgY29uc3QgX19tMTI4aSBicyA9IF9tbV9sb2FkdV9zaTEyOChyZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkgKj4oJmJzbGFzaFswXSkpOwotICAgICAgICBjb25zdCBfX20xMjhpIHNwID0gX21tX2xvYWR1X3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSAqPigmc3BhY2VbMF0pKTsKLQotICAgICAgICBmb3IgKDs7IHAgKz0gMTYpIHsKLSAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkgcyA9IF9tbV9sb2FkX3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSAqPihwKSk7Ci0gICAgICAgICAgICBjb25zdCBfX20xMjhpIHQxID0gX21tX2NtcGVxX2VwaTgocywgZHEpOwotICAgICAgICAgICAgY29uc3QgX19tMTI4aSB0MiA9IF9tbV9jbXBlcV9lcGk4KHMsIGJzKTsKLSAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkgdDMgPSBfbW1fY21wZXFfZXBpOChfbW1fbWF4X2VwdTgocywgc3ApLCBzcCk7IC8vIHMgPCAweDIwIDw9PiBtYXgocywgMHgxOSkgPT0gMHgxOQotICAgICAgICAgICAgY29uc3QgX19tMTI4aSB4ID0gX21tX29yX3NpMTI4KF9tbV9vcl9zaTEyOCh0MSwgdDIpLCB0Myk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KF9tbV9tb3ZlbWFza19lcGk4KHgpKTsKLSAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkociAhPSAwKSkgeyAgIC8vIHNvbWUgb2YgY2hhcmFjdGVycyBpcyBlc2NhcGVkCi0gICAgICAgICAgICAgICAgU2l6ZVR5cGUgbGVuZ3RoOwotICAgICNpZmRlZiBfTVNDX1ZFUiAgICAgICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIGZpcnN0IGVzY2FwZWQKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgICAgICAgICAgICBfQml0U2NhbkZvcndhcmQoJm9mZnNldCwgcik7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gb2Zmc2V0OwotICAgICNlbHNlCi0gICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8U2l6ZVR5cGU+KF9fYnVpbHRpbl9mZnMocikgLSAxKTsKLSAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICBjaGFyKiBxID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ob3MuUHVzaChsZW5ndGgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBxW2ldID0gcFtpXTsKLQotICAgICAgICAgICAgICAgIHAgKz0gbGVuZ3RoOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX21tX3N0b3JldV9zaTEyOChyZWludGVycHJldF9jYXN0PF9fbTEyOGkgKj4ob3MuUHVzaCgxNikpLCBzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaXMuc3JjXyA9IHA7Ci0gICAgfQotCi0gICAgLy8gSW5zaXR1U3RyaW5nU3RyZWFtIC0+IEluc2l0dVN0cmluZ1N0cmVhbQotICAgIHN0YXRpYyBSQVBJREpTT05fRk9SQ0VJTkxJTkUgdm9pZCBTY2FuQ29weVVuZXNjYXBlZFN0cmluZyhJbnNpdHVTdHJpbmdTdHJlYW0mIGlzLCBJbnNpdHVTdHJpbmdTdHJlYW0mIG9zKSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoJmlzID09ICZvcyk7Ci0gICAgICAgICh2b2lkKW9zOwotCi0gICAgICAgIGlmIChpcy5zcmNfID09IGlzLmRzdF8pIHsKLSAgICAgICAgICAgIFNraXBVbmVzY2FwZWRTdHJpbmcoaXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciogcCA9IGlzLnNyY187Ci0gICAgICAgIGNoYXIgKnEgPSBpcy5kc3RfOwotCi0gICAgICAgIC8vIFNjYW4gb25lIGJ5IG9uZSB1bnRpbCBhbGlnbm1lbnQgKHVuYWxpZ25lZCBsb2FkIG1heSBjcm9zcyBwYWdlIGJvdW5kYXJ5IGFuZCBjYXVzZSBjcmFzaCkKLSAgICAgICAgY29uc3QgY2hhciogbmV4dEFsaWduZWQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHApICsgMTUpICYgc3RhdGljX2Nhc3Q8c2l6ZV90Pih+MTUpKTsKLSAgICAgICAgd2hpbGUgKHAgIT0gbmV4dEFsaWduZWQpCi0gICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKCpwID09ICdcIicpIHx8IFJBUElESlNPTl9VTkxJS0VMWSgqcCA9PSAnXFwnKSB8fCBSQVBJREpTT05fVU5MSUtFTFkoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KCpwKSA8IDB4MjApKSB7Ci0gICAgICAgICAgICAgICAgaXMuc3JjXyA9IHA7Ci0gICAgICAgICAgICAgICAgaXMuZHN0XyA9IHE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcSsrID0gKnArKzsKLQotICAgICAgICAvLyBUaGUgcmVzdCBvZiBzdHJpbmcgdXNpbmcgU0lNRAotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBkcXVvdGVbMTZdID0geyAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInLCAnXCInIH07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGJzbGFzaFsxNl0gPSB7ICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcgfTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc3BhY2VbMTZdID0geyAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5IH07Ci0gICAgICAgIGNvbnN0IF9fbTEyOGkgZHEgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZkcXVvdGVbMF0pKTsKLSAgICAgICAgY29uc3QgX19tMTI4aSBicyA9IF9tbV9sb2FkdV9zaTEyOChyZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkgKj4oJmJzbGFzaFswXSkpOwotICAgICAgICBjb25zdCBfX20xMjhpIHNwID0gX21tX2xvYWR1X3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSAqPigmc3BhY2VbMF0pKTsKLQotICAgICAgICBmb3IgKDs7IHAgKz0gMTYsIHEgKz0gMTYpIHsKLSAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkgcyA9IF9tbV9sb2FkX3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSAqPihwKSk7Ci0gICAgICAgICAgICBjb25zdCBfX20xMjhpIHQxID0gX21tX2NtcGVxX2VwaTgocywgZHEpOwotICAgICAgICAgICAgY29uc3QgX19tMTI4aSB0MiA9IF9tbV9jbXBlcV9lcGk4KHMsIGJzKTsKLSAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkgdDMgPSBfbW1fY21wZXFfZXBpOChfbW1fbWF4X2VwdTgocywgc3ApLCBzcCk7IC8vIHMgPCAweDIwIDw9PiBtYXgocywgMHgxOSkgPT0gMHgxOQotICAgICAgICAgICAgY29uc3QgX19tMTI4aSB4ID0gX21tX29yX3NpMTI4KF9tbV9vcl9zaTEyOCh0MSwgdDIpLCB0Myk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KF9tbV9tb3ZlbWFza19lcGk4KHgpKTsKLSAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkociAhPSAwKSkgeyAgIC8vIHNvbWUgb2YgY2hhcmFjdGVycyBpcyBlc2NhcGVkCi0gICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aDsKLSNpZmRlZiBfTVNDX1ZFUiAgICAgICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIGZpcnN0IGVzY2FwZWQKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgICAgICAgICAgICBfQml0U2NhbkZvcndhcmQoJm9mZnNldCwgcik7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gb2Zmc2V0OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBsZW5ndGggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fYnVpbHRpbl9mZnMocikgLSAxKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2hhciogcGVuZCA9IHAgKyBsZW5ndGg7IHAgIT0gcGVuZDsgKQotICAgICAgICAgICAgICAgICAgICAqcSsrID0gKnArKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxfX20xMjhpICo+KHEpLCBzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlzLnNyY18gPSBwOwotICAgICAgICBpcy5kc3RfID0gcTsKLSAgICB9Ci0KLSAgICAvLyBXaGVuIHJlYWQvd3JpdGUgcG9pbnRlcnMgYXJlIHRoZSBzYW1lIGZvciBpbnNpdHUgc3RyZWFtLCBqdXN0IHNraXAgdW5lc2NhcGVkIGNoYXJhY3RlcnMKLSAgICBzdGF0aWMgUkFQSURKU09OX0ZPUkNFSU5MSU5FIHZvaWQgU2tpcFVuZXNjYXBlZFN0cmluZyhJbnNpdHVTdHJpbmdTdHJlYW0mIGlzKSB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoaXMuc3JjXyA9PSBpcy5kc3RfKTsKLSAgICAgICAgY2hhciogcCA9IGlzLnNyY187Ci0KLSAgICAgICAgLy8gU2NhbiBvbmUgYnkgb25lIHVudGlsIGFsaWdubWVudCAodW5hbGlnbmVkIGxvYWQgbWF5IGNyb3NzIHBhZ2UgYm91bmRhcnkgYW5kIGNhdXNlIGNyYXNoKQotICAgICAgICBjb25zdCBjaGFyKiBuZXh0QWxpZ25lZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KChyZWludGVycHJldF9jYXN0PHNpemVfdD4ocCkgKyAxNSkgJiBzdGF0aWNfY2FzdDxzaXplX3Q+KH4xNSkpOwotICAgICAgICBmb3IgKDsgcCAhPSBuZXh0QWxpZ25lZDsgcCsrKQotICAgICAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWSgqcCA9PSAnXCInKSB8fCBSQVBJREpTT05fVU5MSUtFTFkoKnAgPT0gJ1xcJykgfHwgUkFQSURKU09OX1VOTElLRUxZKHN0YXRpY19jYXN0PHVuc2lnbmVkPigqcCkgPCAweDIwKSkgewotICAgICAgICAgICAgICAgIGlzLnNyY18gPSBpcy5kc3RfID0gcDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIHJlc3Qgb2Ygc3RyaW5nIHVzaW5nIFNJTUQKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZHF1b3RlWzE2XSA9IHsgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJyB9OwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBic2xhc2hbMTZdID0geyAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnLCAnXFwnIH07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNwYWNlWzE2XSA9IHsgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSwgMHgxOSB9OwotICAgICAgICBjb25zdCBfX20xMjhpIGRxID0gX21tX2xvYWR1X3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSAqPigmZHF1b3RlWzBdKSk7Ci0gICAgICAgIGNvbnN0IF9fbTEyOGkgYnMgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZic2xhc2hbMF0pKTsKLSAgICAgICAgY29uc3QgX19tMTI4aSBzcCA9IF9tbV9sb2FkdV9zaTEyOChyZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkgKj4oJnNwYWNlWzBdKSk7Ci0KLSAgICAgICAgZm9yICg7OyBwICs9IDE2KSB7Ci0gICAgICAgICAgICBjb25zdCBfX20xMjhpIHMgPSBfbW1fbG9hZF9zaTEyOChyZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkgKj4ocCkpOwotICAgICAgICAgICAgY29uc3QgX19tMTI4aSB0MSA9IF9tbV9jbXBlcV9lcGk4KHMsIGRxKTsKLSAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkgdDIgPSBfbW1fY21wZXFfZXBpOChzLCBicyk7Ci0gICAgICAgICAgICBjb25zdCBfX20xMjhpIHQzID0gX21tX2NtcGVxX2VwaTgoX21tX21heF9lcHU4KHMsIHNwKSwgc3ApOyAvLyBzIDwgMHgyMCA8PT4gbWF4KHMsIDB4MTkpID09IDB4MTkKLSAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkgeCA9IF9tbV9vcl9zaTEyOChfbW1fb3Jfc2kxMjgodDEsIHQyKSwgdDMpOwotICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgciA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihfbW1fbW92ZW1hc2tfZXBpOCh4KSk7Ci0gICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKHIgIT0gMCkpIHsgICAvLyBzb21lIG9mIGNoYXJhY3RlcnMgaXMgZXNjYXBlZAotICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGg7Ci0jaWZkZWYgX01TQ19WRVIgICAgICAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiBmaXJzdCBlc2NhcGVkCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgX0JpdFNjYW5Gb3J3YXJkKCZvZmZzZXQsIHIpOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IG9mZnNldDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2J1aWx0aW5fZmZzKHIpIC0gMSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBwICs9IGxlbmd0aDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlzLnNyY18gPSBpcy5kc3RfID0gcDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0U3RyZWFtLCBib29sIGJhY2t1cD4KLSAgICBjbGFzcyBOdW1iZXJTdHJlYW07Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFN0cmVhbT4KLSAgICBjbGFzcyBOdW1iZXJTdHJlYW08SW5wdXRTdHJlYW0sIGZhbHNlPiB7Ci0gICAgcHVibGljOgotICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIElucHV0U3RyZWFtOjpDaCBDaDsKLQotICAgICAgICBOdW1iZXJTdHJlYW0oR2VuZXJpY1JlYWRlciYgcmVhZGVyLCBJbnB1dFN0cmVhbSYgcykgOiBpcyhzKSB7ICh2b2lkKXJlYWRlcjsgIH0KLSAgICAgICAgfk51bWJlclN0cmVhbSgpIHt9Ci0KLSAgICAgICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIENoIFBlZWsoKSBjb25zdCB7IHJldHVybiBpcy5QZWVrKCk7IH0KLSAgICAgICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIENoIFRha2VQdXNoKCkgeyByZXR1cm4gaXMuVGFrZSgpOyB9Ci0gICAgICAgIFJBUElESlNPTl9GT1JDRUlOTElORSBDaCBUYWtlKCkgeyByZXR1cm4gaXMuVGFrZSgpOyB9Ci0JCSAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIHZvaWQgUHVzaChjaGFyKSB7fQotCi0gICAgICAgIHNpemVfdCBUZWxsKCkgeyByZXR1cm4gaXMuVGVsbCgpOyB9Ci0gICAgICAgIHNpemVfdCBMZW5ndGgoKSB7IHJldHVybiAwOyB9Ci0gICAgICAgIGNvbnN0IGNoYXIqIFBvcCgpIHsgcmV0dXJuIDA7IH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgTnVtYmVyU3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgTnVtYmVyU3RyZWFtJik7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0mIGlzOwotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dFN0cmVhbT4KLSAgICBjbGFzcyBOdW1iZXJTdHJlYW08SW5wdXRTdHJlYW0sIHRydWU+IDogcHVibGljIE51bWJlclN0cmVhbTxJbnB1dFN0cmVhbSwgZmFsc2U+IHsKLSAgICAgICAgdHlwZWRlZiBOdW1iZXJTdHJlYW08SW5wdXRTdHJlYW0sIGZhbHNlPiBCYXNlOwotICAgIHB1YmxpYzoKLSAgICAgICAgTnVtYmVyU3RyZWFtKEdlbmVyaWNSZWFkZXImIHJlYWRlciwgSW5wdXRTdHJlYW0mIGlzKSA6IE51bWJlclN0cmVhbTxJbnB1dFN0cmVhbSwgZmFsc2U+KHJlYWRlciwgaXMpLCBzdGFja1N0cmVhbShyZWFkZXIuc3RhY2tfKSB7fQotICAgICAgICB+TnVtYmVyU3RyZWFtKCkge30KLQotICAgICAgICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgQ2ggVGFrZVB1c2goKSB7Ci0gICAgICAgICAgICBzdGFja1N0cmVhbS5QdXQoc3RhdGljX2Nhc3Q8Y2hhcj4oQmFzZTo6aXMuUGVlaygpKSk7Ci0gICAgICAgICAgICByZXR1cm4gQmFzZTo6aXMuVGFrZSgpOwotICAgICAgICB9Ci0KLQkJICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgdm9pZCBQdXNoKGNoYXIgYykgewotCQkJICBzdGFja1N0cmVhbS5QdXQoYyk7Ci0JCSAgfQotCi0gICAgICAgIHNpemVfdCBMZW5ndGgoKSB7IHJldHVybiBzdGFja1N0cmVhbS5MZW5ndGgoKTsgfQotCi0gICAgICAgIGNvbnN0IGNoYXIqIFBvcCgpIHsKLSAgICAgICAgICAgIHN0YWNrU3RyZWFtLlB1dCgnXDAnKTsKLSAgICAgICAgICAgIHJldHVybiBzdGFja1N0cmVhbS5Qb3AoKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgU3RhY2tTdHJlYW08Y2hhcj4gc3RhY2tTdHJlYW07Ci0gICAgfTsKLQotICAgIHRlbXBsYXRlPHVuc2lnbmVkIHBhcnNlRmxhZ3MsIHR5cGVuYW1lIElucHV0U3RyZWFtLCB0eXBlbmFtZSBIYW5kbGVyPgotICAgIHZvaWQgUGFyc2VOdW1iZXIoSW5wdXRTdHJlYW0mIGlzLCBIYW5kbGVyJiBoYW5kbGVyKSB7Ci0gICAgICAgIGludGVybmFsOjpTdHJlYW1Mb2NhbENvcHk8SW5wdXRTdHJlYW0+IGNvcHkoaXMpOwotICAgICAgICBOdW1iZXJTdHJlYW08SW5wdXRTdHJlYW0sCi0gICAgICAgICAgICAoKHBhcnNlRmxhZ3MgJiBrUGFyc2VOdW1iZXJzQXNTdHJpbmdzRmxhZykgIT0gMCkgPwotICAgICAgICAgICAgICAgICgocGFyc2VGbGFncyAmIGtQYXJzZUluc2l0dUZsYWcpID09IDApIDoKLSAgICAgICAgICAgICAgICAoKHBhcnNlRmxhZ3MgJiBrUGFyc2VGdWxsUHJlY2lzaW9uRmxhZykgIT0gMCk+IHMoKnRoaXMsIGNvcHkucyk7Ci0KLSAgICAgICAgc2l6ZV90IHN0YXJ0T2Zmc2V0ID0gcy5UZWxsKCk7Ci0KLSAgICAgICAgLy8gUGFyc2UgbWludXMKLSAgICAgICAgYm9vbCBtaW51cyA9IENvbnN1bWUocywgJy0nKTsKLQotICAgICAgICAvLyBQYXJzZSBpbnQ6IHplcm8gLyAoIGRpZ2l0MS05ICpESUdJVCApCi0gICAgICAgIHVuc2lnbmVkIGkgPSAwOwotICAgICAgICB1aW50NjRfdCBpNjQgPSAwOwotICAgICAgICBib29sIHVzZTY0Yml0ID0gZmFsc2U7Ci0gICAgICAgIGludCBzaWduaWZpY2FuZERpZ2l0ID0gMDsKLSAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWShzLlBlZWsoKSA9PSAnMCcpKSB7Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIHMuVGFrZVB1c2goKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChSQVBJREpTT05fTElLRUxZKHMuUGVlaygpID49ICcxJyAmJiBzLlBlZWsoKSA8PSAnOScpKSB7Ci0gICAgICAgICAgICBpID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHMuVGFrZVB1c2goKSAtICcwJyk7Ci0KLSAgICAgICAgICAgIGlmIChtaW51cykKLSAgICAgICAgICAgICAgICB3aGlsZSAoUkFQSURKU09OX0xJS0VMWShzLlBlZWsoKSA+PSAnMCcgJiYgcy5QZWVrKCkgPD0gJzknKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKGkgPj0gMjE0NzQ4MzY0KSkgeyAvLyAyXjMxID0gMjE0NzQ4MzY0OAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJBUElESlNPTl9MSUtFTFkoaSAhPSAyMTQ3NDgzNjQgfHwgcy5QZWVrKCkgPiAnOCcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U2NGJpdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSA9IGkgKiAxMCArIHN0YXRpY19jYXN0PHVuc2lnbmVkPihzLlRha2VQdXNoKCkgLSAnMCcpOwotICAgICAgICAgICAgICAgICAgICBzaWduaWZpY2FuZERpZ2l0Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHdoaWxlIChSQVBJREpTT05fTElLRUxZKHMuUGVlaygpID49ICcwJyAmJiBzLlBlZWsoKSA8PSAnOScpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoaSA+PSA0Mjk0OTY3MjkpKSB7IC8vIDJeMzIgLSAxID0gNDI5NDk2NzI5NQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJBUElESlNPTl9MSUtFTFkoaSAhPSA0Mjk0OTY3MjkgfHwgcy5QZWVrKCkgPiAnNScpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U2NGJpdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSA9IGkgKiAxMCArIHN0YXRpY19jYXN0PHVuc2lnbmVkPihzLlRha2VQdXNoKCkgLSAnMCcpOwotICAgICAgICAgICAgICAgICAgICBzaWduaWZpY2FuZERpZ2l0Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclZhbHVlSW52YWxpZCwgcy5UZWxsKCkpOwotCi0gICAgICAgIC8vIFBhcnNlIDY0Yml0IGludAotICAgICAgICBib29sIHVzZURvdWJsZSA9IGZhbHNlOwotICAgICAgICBkb3VibGUgZCA9IDAuMDsKLSAgICAgICAgaWYgKHVzZTY0Yml0KSB7Ci0gICAgICAgICAgICBpZiAobWludXMpIAotICAgICAgICAgICAgICAgIHdoaWxlIChSQVBJREpTT05fTElLRUxZKHMuUGVlaygpID49ICcwJyAmJiBzLlBlZWsoKSA8PSAnOScpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKGk2NCA+PSBSQVBJREpTT05fVUlOVDY0X0MyKDB4MENDQ0NDQ0MsIDB4Q0NDQ0NDQ0MpKSkgLy8gMl42MyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDgKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSQVBJREpTT05fTElLRUxZKGk2NCAhPSBSQVBJREpTT05fVUlOVDY0X0MyKDB4MENDQ0NDQ0MsIDB4Q0NDQ0NDQ0MpIHx8IHMuUGVlaygpID4gJzgnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGk2NCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRG91YmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaTY0ID0gaTY0ICogMTAgKyBzdGF0aWNfY2FzdDx1bnNpZ25lZD4ocy5UYWtlUHVzaCgpIC0gJzAnKTsKLSAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbmREaWdpdCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3aGlsZSAoUkFQSURKU09OX0xJS0VMWShzLlBlZWsoKSA+PSAnMCcgJiYgcy5QZWVrKCkgPD0gJzknKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKGk2NCA+PSBSQVBJREpTT05fVUlOVDY0X0MyKDB4MTk5OTk5OTksIDB4OTk5OTk5OTkpKSkgLy8gMl42NCAtIDEgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJBUElESlNPTl9MSUtFTFkoaTY0ICE9IFJBUElESlNPTl9VSU5UNjRfQzIoMHgxOTk5OTk5OSwgMHg5OTk5OTk5OSkgfHwgcy5QZWVrKCkgPiAnNScpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oaTY0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VEb3VibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpNjQgPSBpNjQgKiAxMCArIHN0YXRpY19jYXN0PHVuc2lnbmVkPihzLlRha2VQdXNoKCkgLSAnMCcpOwotICAgICAgICAgICAgICAgICAgICBzaWduaWZpY2FuZERpZ2l0Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRm9yY2UgZG91YmxlIGZvciBiaWcgaW50ZWdlcgotICAgICAgICBpZiAodXNlRG91YmxlKSB7Ci0gICAgICAgICAgICB3aGlsZSAoUkFQSURKU09OX0xJS0VMWShzLlBlZWsoKSA+PSAnMCcgJiYgcy5QZWVrKCkgPD0gJzknKSkgewotICAgICAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoZCA+PSAxLjc5NzY5MzEzNDg2MjMxNTdlMzA3KSkgLy8gREJMX01BWCAvIDEwLjAKLSAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yTnVtYmVyVG9vQmlnLCBzdGFydE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgZCA9IGQgKiAxMCArIChzLlRha2VQdXNoKCkgLSAnMCcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUGFyc2UgZnJhYyA9IGRlY2ltYWwtcG9pbnQgMSpESUdJVAotICAgICAgICBpbnQgZXhwRnJhYyA9IDA7Ci0gICAgICAgIHNpemVfdCBkZWNpbWFsUG9zaXRpb247Ci0gICAgICAgIGlmIChDb25zdW1lKHMsICcuJykpIHsKLSAgICAgICAgICAgIGlmICgoKHBhcnNlRmxhZ3MgJiBrUGFyc2VOdW1iZXJzQXNTdHJpbmdzRmxhZykgIT0gMCkgJiYgKChwYXJzZUZsYWdzICYga1BhcnNlSW5zaXR1RmxhZykgPT0gMCkpIHsKLQkJCQkJcy5QdXNoKCcuJyk7Ci0JCQkJfQotICAgICAgICAgICAgZGVjaW1hbFBvc2l0aW9uID0gcy5MZW5ndGgoKTsKLQotICAgICAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWSghKHMuUGVlaygpID49ICcwJyAmJiBzLlBlZWsoKSA8PSAnOScpKSkKLSAgICAgICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1Ioa1BhcnNlRXJyb3JOdW1iZXJNaXNzRnJhY3Rpb24sIHMuVGVsbCgpKTsKLQotICAgICAgICAgICAgaWYgKCF1c2VEb3VibGUpIHsKLSNpZiBSQVBJREpTT05fNjRCSVQKLSAgICAgICAgICAgICAgICAvLyBVc2UgaTY0IHRvIHN0b3JlIHNpZ25pZmljYW5kIGluIDY0LWJpdCBhcmNoaXRlY3R1cmUKLSAgICAgICAgICAgICAgICBpZiAoIXVzZTY0Yml0KQotICAgICAgICAgICAgICAgICAgICBpNjQgPSBpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoUkFQSURKU09OX0xJS0VMWShzLlBlZWsoKSA+PSAnMCcgJiYgcy5QZWVrKCkgPD0gJzknKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaTY0ID4gUkFQSURKU09OX1VJTlQ2NF9DMigweDFGRkZGRiwgMHhGRkZGRkZGRikpIC8vIDJeNTMgLSAxIGZvciBmYXN0IHBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGk2NCA9IGk2NCAqIDEwICsgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHMuVGFrZVB1c2goKSAtICcwJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLWV4cEZyYWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaTY0ICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmlmaWNhbmREaWdpdCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oaTY0KTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgLy8gVXNlIGRvdWJsZSB0byBzdG9yZSBzaWduaWZpY2FuZCBpbiAzMi1iaXQgYXJjaGl0ZWN0dXJlCi0gICAgICAgICAgICAgICAgZCA9IHN0YXRpY19jYXN0PGRvdWJsZT4odXNlNjRiaXQgPyBpNjQgOiBpKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHVzZURvdWJsZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChSQVBJREpTT05fTElLRUxZKHMuUGVlaygpID49ICcwJyAmJiBzLlBlZWsoKSA8PSAnOScpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpZ25pZmljYW5kRGlnaXQgPCAxNykgewotICAgICAgICAgICAgICAgICAgICBkID0gZCAqIDEwLjAgKyAocy5UYWtlUHVzaCgpIC0gJzAnKTsKLSAgICAgICAgICAgICAgICAgICAgLS1leHBGcmFjOwotICAgICAgICAgICAgICAgICAgICBpZiAoUkFQSURKU09OX0xJS0VMWShkID4gMC4wKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25pZmljYW5kRGlnaXQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzLlRha2VQdXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZGVjaW1hbFBvc2l0aW9uID0gcy5MZW5ndGgoKTsgLy8gZGVjaW1hbCBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIGludGVnZXIuCi0KLSAgICAgICAgLy8gUGFyc2UgZXhwID0gZSBbIG1pbnVzIC8gcGx1cyBdIDEqRElHSVQKLSAgICAgICAgaW50IGV4cCA9IDA7Ci0gICAgICAgIGlmIChDb25zdW1lKHMsICdlJykgfHwgQ29uc3VtZShzLCAnRScpKSB7Ci0gICAgICAgICAgICBpZiAoICgocGFyc2VGbGFncyAmIGtQYXJzZU51bWJlcnNBc1N0cmluZ3NGbGFnKSAhPSAwKSAmJiAoKHBhcnNlRmxhZ3MgJiBrUGFyc2VJbnNpdHVGbGFnKSA9PSAwKSApIHsKLSAgICAgICAgICAgICAgICBzLlB1c2goICdlJyApOwotICAgICAgICAgICAgfQotCi0JCQkgICBpZiAoIXVzZURvdWJsZSkgewotICAgICAgICAgICAgICAgIGQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KHVzZTY0Yml0ID8gaTY0IDogaSk7Ci0gICAgICAgICAgICAgICAgdXNlRG91YmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBleHBNaW51cyA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKENvbnN1bWUocywgJysnKSkKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICBlbHNlIGlmIChDb25zdW1lKHMsICctJykpCi0gICAgICAgICAgICAgICAgZXhwTWludXMgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAoUkFQSURKU09OX0xJS0VMWShzLlBlZWsoKSA+PSAnMCcgJiYgcy5QZWVrKCkgPD0gJzknKSkgewotICAgICAgICAgICAgICAgIGV4cCA9IHN0YXRpY19jYXN0PGludD4ocy5UYWtlKCkgLSAnMCcpOwotICAgICAgICAgICAgICAgIGlmIChleHBNaW51cykgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoUkFQSURKU09OX0xJS0VMWShzLlBlZWsoKSA+PSAnMCcgJiYgcy5QZWVrKCkgPD0gJzknKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwID0gZXhwICogMTAgKyBzdGF0aWNfY2FzdDxpbnQ+KHMuVGFrZSgpIC0gJzAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHAgPj0gMjE0NzQ4MzY0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzc3VlICMzMTM6IHByZXZlbnQgb3ZlcmZsb3cgZXhwb25lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoUkFQSURKU09OX1VOTElLRUxZKHMuUGVlaygpID49ICcwJyAmJiBzLlBlZWsoKSA8PSAnOScpKSAgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiBleHBvbmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLlRha2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsgIC8vIHBvc2l0aXZlIGV4cAotICAgICAgICAgICAgICAgICAgICBpbnQgbWF4RXhwID0gMzA4IC0gZXhwRnJhYzsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFJBUElESlNPTl9MSUtFTFkocy5QZWVrKCkgPj0gJzAnICYmIHMuUGVlaygpIDw9ICc5JykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cCA9IGV4cCAqIDEwICsgc3RhdGljX2Nhc3Q8aW50PihzLlRha2UoKSAtICcwJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKGV4cCA+IG1heEV4cCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yTnVtYmVyVG9vQmlnLCBzdGFydE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yTnVtYmVyTWlzc0V4cG9uZW50LCBzLlRlbGwoKSk7Ci0KLSAgICAgICAgICAgIGlmIChleHBNaW51cykKLSAgICAgICAgICAgICAgICBleHAgPSAtZXhwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluaXNoIHBhcnNpbmcsIGNhbGwgZXZlbnQgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIG51bWJlci4KLSAgICAgICAgYm9vbCBjb250ID0gdHJ1ZTsKLQotICAgICAgICBpZiAocGFyc2VGbGFncyAmIGtQYXJzZU51bWJlcnNBc1N0cmluZ3NGbGFnKSB7Ci0gICAgICAgICAgICBpZiAocGFyc2VGbGFncyAmIGtQYXJzZUluc2l0dUZsYWcpIHsKLSAgICAgICAgICAgICAgICBzLlBvcCgpOyAgLy8gUG9wIHN0YWNrIG5vIG1hdHRlciBpZiBpdCB3aWxsIGJlIHVzZWQgb3Igbm90LgotICAgICAgICAgICAgICAgIHR5cGVuYW1lIElucHV0U3RyZWFtOjpDaCogaGVhZCA9IGlzLlB1dEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGxlbmd0aCA9IHMuVGVsbCgpIC0gc3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgUkFQSURKU09OX0FTU0VSVChsZW5ndGggPD0gMHhGRkZGRkZGRik7Ci0gICAgICAgICAgICAgICAgLy8gdW5hYmxlIHRvIGluc2VydCB0aGUgXDAgY2hhcmFjdGVyIGhlcmUsIGl0IHdpbGwgZXJhc2UgdGhlIGNvbW1hIGFmdGVyIHRoaXMgbnVtYmVyCi0gICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgVGFyZ2V0RW5jb2Rpbmc6OkNoKiBjb25zdCBzdHIgPSByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIFRhcmdldEVuY29kaW5nOjpDaCo+KGhlYWQpOwotICAgICAgICAgICAgICAgIGNvbnQgPSBoYW5kbGVyLlJhd051bWJlcihzdHIsIFNpemVUeXBlKGxlbmd0aCksIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFN0YWNrU3RyZWFtPHR5cGVuYW1lIFRhcmdldEVuY29kaW5nOjpDaD4gc3RhY2tTdHJlYW0oc3RhY2tfKTsKLSAgICAgICAgICAgICAgICBTaXplVHlwZSBudW1DaGFyc1RvQ29weSA9IHN0YXRpY19jYXN0PFNpemVUeXBlPihzLkxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobnVtQ2hhcnNUb0NvcHktLSkgewotICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGVyPFNvdXJjZUVuY29kaW5nLCBUYXJnZXRFbmNvZGluZz46OlRyYW5zY29kZShpcywgc3RhY2tTdHJlYW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGFja1N0cmVhbS5QdXQoJ1wwJyk7Ci0gICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgVGFyZ2V0RW5jb2Rpbmc6OkNoKiBzdHIgPSBzdGFja1N0cmVhbS5Qb3AoKTsKLSAgICAgICAgICAgICAgICBjb25zdCBTaXplVHlwZSBsZW5ndGggPSBzdGF0aWNfY2FzdDxTaXplVHlwZT4oc3RhY2tTdHJlYW0uTGVuZ3RoKCkpIC0gMTsKLSAgICAgICAgICAgICAgICBjb250ID0gaGFuZGxlci5SYXdOdW1iZXIoc3RyLCBTaXplVHlwZShsZW5ndGgpLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHMuTGVuZ3RoKCk7Ci0gICAgICAgICAgIGNvbnN0IGNoYXIqIGRlY2ltYWwgPSBzLlBvcCgpOyAgLy8gUG9wIHN0YWNrIG5vIG1hdHRlciBpZiBpdCB3aWxsIGJlIHVzZWQgb3Igbm90LgotCi0gICAgICAgICAgIGlmICh1c2VEb3VibGUpIHsKLSAgICAgICAgICAgICAgIGludCBwID0gZXhwICsgZXhwRnJhYzsKLSAgICAgICAgICAgICAgIGlmIChwYXJzZUZsYWdzICYga1BhcnNlRnVsbFByZWNpc2lvbkZsYWcpCi0gICAgICAgICAgICAgICAgICAgZCA9IGludGVybmFsOjpTdHJ0b2RGdWxsUHJlY2lzaW9uKGQsIHAsIGRlY2ltYWwsIGxlbmd0aCwgZGVjaW1hbFBvc2l0aW9uLCBleHApOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIGQgPSBpbnRlcm5hbDo6U3RydG9kTm9ybWFsUHJlY2lzaW9uKGQsIHApOwotCi0gICAgICAgICAgICAgICBjb250ID0gaGFuZGxlci5Eb3VibGUobWludXMgPyAtZCA6IGQpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgaWYgKHVzZTY0Yml0KSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKG1pbnVzKQotICAgICAgICAgICAgICAgICAgICAgICBjb250ID0gaGFuZGxlci5JbnQ2NChzdGF0aWNfY2FzdDxpbnQ2NF90Pih+aTY0ICsgMSkpOwotICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgY29udCA9IGhhbmRsZXIuVWludDY0KGk2NCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICBpZiAobWludXMpCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnQgPSBoYW5kbGVyLkludChzdGF0aWNfY2FzdDxpbnQzMl90Pih+aSArIDEpKTsKLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnQgPSBoYW5kbGVyLlVpbnQoaSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKCFjb250KSkKLSAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCBzdGFydE9mZnNldCk7Ci0gICAgfQotCi0gICAgLy8gUGFyc2UgYW55IEpTT04gdmFsdWUKLSAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBwYXJzZUZsYWdzLCB0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgICB2b2lkIFBhcnNlVmFsdWUoSW5wdXRTdHJlYW0mIGlzLCBIYW5kbGVyJiBoYW5kbGVyKSB7Ci0gICAgICAgIHN3aXRjaCAoaXMuUGVlaygpKSB7Ci0gICAgICAgICAgICBjYXNlICduJzogUGFyc2VOdWxsICA8cGFyc2VGbGFncz4oaXMsIGhhbmRsZXIpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3QnOiBQYXJzZVRydWUgIDxwYXJzZUZsYWdzPihpcywgaGFuZGxlcik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnZic6IFBhcnNlRmFsc2UgPHBhcnNlRmxhZ3M+KGlzLCBoYW5kbGVyKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICciJzogUGFyc2VTdHJpbmc8cGFyc2VGbGFncz4oaXMsIGhhbmRsZXIpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3snOiBQYXJzZU9iamVjdDxwYXJzZUZsYWdzPihpcywgaGFuZGxlcik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnWyc6IFBhcnNlQXJyYXkgPHBhcnNlRmxhZ3M+KGlzLCBoYW5kbGVyKTsgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0IDogCi0gICAgICAgICAgICAgICAgICAgICAgUGFyc2VOdW1iZXI8cGFyc2VGbGFncz4oaXMsIGhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSXRlcmF0aXZlIFBhcnNpbmcKLQotICAgIC8vIFN0YXRlcwotICAgIGVudW0gSXRlcmF0aXZlUGFyc2luZ1N0YXRlIHsKLSAgICAgICAgSXRlcmF0aXZlUGFyc2luZ1N0YXJ0U3RhdGUgPSAwLAotICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRmluaXNoU3RhdGUsCi0gICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLAotCi0gICAgICAgIC8vIE9iamVjdCBzdGF0ZXMKLSAgICAgICAgSXRlcmF0aXZlUGFyc2luZ09iamVjdEluaXRpYWxTdGF0ZSwKLSAgICAgICAgSXRlcmF0aXZlUGFyc2luZ01lbWJlcktleVN0YXRlLAotICAgICAgICBJdGVyYXRpdmVQYXJzaW5nS2V5VmFsdWVEZWxpbWl0ZXJTdGF0ZSwKLSAgICAgICAgSXRlcmF0aXZlUGFyc2luZ01lbWJlclZhbHVlU3RhdGUsCi0gICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdNZW1iZXJEZWxpbWl0ZXJTdGF0ZSwKLSAgICAgICAgSXRlcmF0aXZlUGFyc2luZ09iamVjdEZpbmlzaFN0YXRlLAotCi0gICAgICAgIC8vIEFycmF5IHN0YXRlcwotICAgICAgICBJdGVyYXRpdmVQYXJzaW5nQXJyYXlJbml0aWFsU3RhdGUsCi0gICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFbGVtZW50U3RhdGUsCi0gICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFbGVtZW50RGVsaW1pdGVyU3RhdGUsCi0gICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdBcnJheUZpbmlzaFN0YXRlLAotCi0gICAgICAgIC8vIFNpbmdsZSB2YWx1ZSBzdGF0ZQotICAgICAgICBJdGVyYXRpdmVQYXJzaW5nVmFsdWVTdGF0ZQotICAgIH07Ci0KLSAgICBlbnVtIHsgY0l0ZXJhdGl2ZVBhcnNpbmdTdGF0ZUNvdW50ID0gSXRlcmF0aXZlUGFyc2luZ1ZhbHVlU3RhdGUgKyAxIH07Ci0KLSAgICAvLyBUb2tlbnMKLSAgICBlbnVtIFRva2VuIHsKLSAgICAgICAgTGVmdEJyYWNrZXRUb2tlbiA9IDAsCi0gICAgICAgIFJpZ2h0QnJhY2tldFRva2VuLAotCi0gICAgICAgIExlZnRDdXJseUJyYWNrZXRUb2tlbiwKLSAgICAgICAgUmlnaHRDdXJseUJyYWNrZXRUb2tlbiwKLQotICAgICAgICBDb21tYVRva2VuLAotICAgICAgICBDb2xvblRva2VuLAotCi0gICAgICAgIFN0cmluZ1Rva2VuLAotICAgICAgICBGYWxzZVRva2VuLAotICAgICAgICBUcnVlVG9rZW4sCi0gICAgICAgIE51bGxUb2tlbiwKLSAgICAgICAgTnVtYmVyVG9rZW4sCi0KLSAgICAgICAga1Rva2VuQ291bnQKLSAgICB9OwotCi0gICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIFRva2VuIFRva2VuaXplKENoIGMpIHsKLQotLy8hQGNvbmQgUkFQSURKU09OX0hJRERFTl9GUk9NX0RPWFlHRU4KLSNkZWZpbmUgTiBOdW1iZXJUb2tlbgotI2RlZmluZSBOMTYgTixOLE4sTixOLE4sTixOLE4sTixOLE4sTixOLE4sTgotICAgICAgICAvLyBNYXBzIGZyb20gQVNDSUkgdG8gVG9rZW4KLSAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdG9rZW5NYXBbMjU2XSA9IHsKLSAgICAgICAgICAgIE4xNiwgLy8gMDB+MEYKLSAgICAgICAgICAgIE4xNiwgLy8gMTB+MUYKLSAgICAgICAgICAgIE4sIE4sIFN0cmluZ1Rva2VuLCBOLCBOLCBOLCBOLCBOLCBOLCBOLCBOLCBOLCBDb21tYVRva2VuLCBOLCBOLCBOLCAvLyAyMH4yRgotICAgICAgICAgICAgTiwgTiwgTiwgTiwgTiwgTiwgTiwgTiwgTiwgTiwgQ29sb25Ub2tlbiwgTiwgTiwgTiwgTiwgTiwgLy8gMzB+M0YKLSAgICAgICAgICAgIE4xNiwgLy8gNDB+NEYKLSAgICAgICAgICAgIE4sIE4sIE4sIE4sIE4sIE4sIE4sIE4sIE4sIE4sIE4sIExlZnRCcmFja2V0VG9rZW4sIE4sIFJpZ2h0QnJhY2tldFRva2VuLCBOLCBOLCAvLyA1MH41RgotICAgICAgICAgICAgTiwgTiwgTiwgTiwgTiwgTiwgRmFsc2VUb2tlbiwgTiwgTiwgTiwgTiwgTiwgTiwgTiwgTnVsbFRva2VuLCBOLCAvLyA2MH42RgotICAgICAgICAgICAgTiwgTiwgTiwgTiwgVHJ1ZVRva2VuLCBOLCBOLCBOLCBOLCBOLCBOLCBMZWZ0Q3VybHlCcmFja2V0VG9rZW4sIE4sIFJpZ2h0Q3VybHlCcmFja2V0VG9rZW4sIE4sIE4sIC8vIDcwfjdGCi0gICAgICAgICAgICBOMTYsIE4xNiwgTjE2LCBOMTYsIE4xNiwgTjE2LCBOMTYsIE4xNiAvLyA4MH5GRgotICAgICAgICB9OwotI3VuZGVmIE4KLSN1bmRlZiBOMTYKLS8vIUBlbmRjb25kCi0gICAgICAgIAotICAgICAgICBpZiAoc2l6ZW9mKENoKSA9PSAxIHx8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjKSA8IDI1NikKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUb2tlbj4odG9rZW5NYXBbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYyldKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIE51bWJlclRva2VuOwotICAgIH0KLQotICAgIFJBUElESlNPTl9GT1JDRUlOTElORSBJdGVyYXRpdmVQYXJzaW5nU3RhdGUgUHJlZGljdChJdGVyYXRpdmVQYXJzaW5nU3RhdGUgc3RhdGUsIFRva2VuIHRva2VuKSB7Ci0gICAgICAgIC8vIGN1cnJlbnQgc3RhdGUgeCBvbmUgbG9va2FoZWFkIHRva2VuIC0+IG5ldyBzdGF0ZQotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBHW2NJdGVyYXRpdmVQYXJzaW5nU3RhdGVDb3VudF1ba1Rva2VuQ291bnRdID0gewotICAgICAgICAgICAgLy8gU3RhcnQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nQXJyYXlJbml0aWFsU3RhdGUsICAvLyBMZWZ0IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAvLyBSaWdodCBicmFja2V0Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ09iamVjdEluaXRpYWxTdGF0ZSwgLy8gTGVmdCBjdXJseSBicmFja2V0Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgLy8gUmlnaHQgY3VybHkgYnJhY2tldAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgIC8vIENvbW1hCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgLy8gQ29sb24KLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nVmFsdWVTdGF0ZSwgICAgICAgICAvLyBTdHJpbmcKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nVmFsdWVTdGF0ZSwgICAgICAgICAvLyBGYWxzZQotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdWYWx1ZVN0YXRlLCAgICAgICAgIC8vIFRydWUKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nVmFsdWVTdGF0ZSwgICAgICAgICAvLyBOdWxsCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ1ZhbHVlU3RhdGUgICAgICAgICAgLy8gTnVtYmVyCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgLy8gRmluaXNoKHNpbmsgc3RhdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC8vIEVycm9yKHNpbmsgc3RhdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC8vIE9iamVjdEluaXRpYWwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAvLyBMZWZ0IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAvLyBSaWdodCBicmFja2V0Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgLy8gTGVmdCBjdXJseSBicmFja2V0Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ09iamVjdEZpbmlzaFN0YXRlLCAgLy8gUmlnaHQgY3VybHkgYnJhY2tldAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgIC8vIENvbW1hCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgLy8gQ29sb24KLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nTWVtYmVyS2V5U3RhdGUsICAgICAvLyBTdHJpbmcKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAvLyBGYWxzZQotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgIC8vIFRydWUKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAvLyBOdWxsCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUgICAgICAgICAgLy8gTnVtYmVyCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgLy8gTWVtYmVyS2V5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgICAgIC8vIExlZnQgYnJhY2tldAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBSaWdodCBicmFja2V0Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgICAgIC8vIExlZnQgY3VybHkgYnJhY2tldAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBSaWdodCBjdXJseSBicmFja2V0Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgICAgIC8vIENvbW1hCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0tleVZhbHVlRGVsaW1pdGVyU3RhdGUsIC8vIENvbG9uCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgICAgIC8vIFN0cmluZwotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBGYWxzZQotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBUcnVlCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgICAgIC8vIE51bGwKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSAgICAgICAgICAgICAgLy8gTnVtYmVyCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgLy8gS2V5VmFsdWVEZWxpbWl0ZXIKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nQXJyYXlJbml0aWFsU3RhdGUsICAgICAgLy8gTGVmdCBicmFja2V0KHB1c2ggTWVtYmVyVmFsdWUgc3RhdGUpCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgICAgIC8vIFJpZ2h0IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nT2JqZWN0SW5pdGlhbFN0YXRlLCAgICAgLy8gTGVmdCBjdXJseSBicmFja2V0KHB1c2ggTWVtYmVyVmFsdWUgc3RhdGUpCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgICAgIC8vIFJpZ2h0IGN1cmx5IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gQ29tbWEKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gQ29sb24KLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nTWVtYmVyVmFsdWVTdGF0ZSwgICAgICAgLy8gU3RyaW5nCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ01lbWJlclZhbHVlU3RhdGUsICAgICAgIC8vIEZhbHNlCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ01lbWJlclZhbHVlU3RhdGUsICAgICAgIC8vIFRydWUKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nTWVtYmVyVmFsdWVTdGF0ZSwgICAgICAgLy8gTnVsbAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdNZW1iZXJWYWx1ZVN0YXRlICAgICAgICAvLyBOdW1iZXIKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAvLyBNZW1iZXJWYWx1ZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBMZWZ0IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gUmlnaHQgYnJhY2tldAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBMZWZ0IGN1cmx5IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nT2JqZWN0RmluaXNoU3RhdGUsICAgICAgLy8gUmlnaHQgY3VybHkgYnJhY2tldAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdNZW1iZXJEZWxpbWl0ZXJTdGF0ZSwgICAvLyBDb21tYQotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBDb2xvbgotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBTdHJpbmcKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gRmFsc2UKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gVHJ1ZQotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBOdWxsCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUgICAgICAgICAgICAgIC8vIE51bWJlcgotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC8vIE1lbWJlckRlbGltaXRlcgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgIC8vIExlZnQgYnJhY2tldAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgIC8vIFJpZ2h0IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAvLyBMZWZ0IGN1cmx5IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nT2JqZWN0RmluaXNoU3RhdGUsICAvLyBSaWdodCBjdXJseSBicmFja2V0Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgLy8gQ29tbWEKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAvLyBDb2xvbgotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdNZW1iZXJLZXlTdGF0ZSwgICAgIC8vIFN0cmluZwotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgIC8vIEZhbHNlCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgLy8gVHJ1ZQotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgIC8vIE51bGwKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSAgICAgICAgICAvLyBOdW1iZXIKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAvLyBPYmplY3RGaW5pc2goc2luayBzdGF0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgLy8gQXJyYXlJbml0aWFsCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0FycmF5SW5pdGlhbFN0YXRlLCAgICAgIC8vIExlZnQgYnJhY2tldChwdXNoIEVsZW1lbnQgc3RhdGUpCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0FycmF5RmluaXNoU3RhdGUsICAgICAgIC8vIFJpZ2h0IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nT2JqZWN0SW5pdGlhbFN0YXRlLCAgICAgLy8gTGVmdCBjdXJseSBicmFja2V0KHB1c2ggRWxlbWVudCBzdGF0ZSkKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gUmlnaHQgY3VybHkgYnJhY2tldAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBDb21tYQotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBDb2xvbgotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFbGVtZW50U3RhdGUsICAgICAgICAgICAvLyBTdHJpbmcKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRWxlbWVudFN0YXRlLCAgICAgICAgICAgLy8gRmFsc2UKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRWxlbWVudFN0YXRlLCAgICAgICAgICAgLy8gVHJ1ZQotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFbGVtZW50U3RhdGUsICAgICAgICAgICAvLyBOdWxsCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0VsZW1lbnRTdGF0ZSAgICAgICAgICAgIC8vIE51bWJlcgotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC8vIEVsZW1lbnQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gTGVmdCBicmFja2V0Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0FycmF5RmluaXNoU3RhdGUsICAgICAgIC8vIFJpZ2h0IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gTGVmdCBjdXJseSBicmFja2V0Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgICAgIC8vIFJpZ2h0IGN1cmx5IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRWxlbWVudERlbGltaXRlclN0YXRlLCAgLy8gQ29tbWEKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gQ29sb24KLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gU3RyaW5nCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgICAgIC8vIEZhbHNlCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsICAgICAgICAgICAgIC8vIFRydWUKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gTnVsbAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlICAgICAgICAgICAgICAvLyBOdW1iZXIKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAvLyBFbGVtZW50RGVsaW1pdGVyCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0FycmF5SW5pdGlhbFN0YXRlLCAgICAgIC8vIExlZnQgYnJhY2tldChwdXNoIEVsZW1lbnQgc3RhdGUpCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0FycmF5RmluaXNoU3RhdGUsICAgICAgIC8vIFJpZ2h0IGJyYWNrZXQKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nT2JqZWN0SW5pdGlhbFN0YXRlLCAgICAgLy8gTGVmdCBjdXJseSBicmFja2V0KHB1c2ggRWxlbWVudCBzdGF0ZSkKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgICAgICAgICAgICAgLy8gUmlnaHQgY3VybHkgYnJhY2tldAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBDb21tYQotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCAgICAgICAgICAgICAvLyBDb2xvbgotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFbGVtZW50U3RhdGUsICAgICAgICAgICAvLyBTdHJpbmcKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRWxlbWVudFN0YXRlLCAgICAgICAgICAgLy8gRmFsc2UKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRWxlbWVudFN0YXRlLCAgICAgICAgICAgLy8gVHJ1ZQotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFbGVtZW50U3RhdGUsICAgICAgICAgICAvLyBOdWxsCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0VsZW1lbnRTdGF0ZSAgICAgICAgICAgIC8vIE51bWJlcgotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC8vIEFycmF5RmluaXNoKHNpbmsgc3RhdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC8vIFNpbmdsZSBWYWx1ZSAoc2luayBzdGF0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsCi0gICAgICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLCBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZSwgSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUsIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlLAotICAgICAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07IC8vIEVuZCBvZiBHCi0KLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEl0ZXJhdGl2ZVBhcnNpbmdTdGF0ZT4oR1tzdGF0ZV1bdG9rZW5dKTsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIGFuIGFkdmFuY2UgaW4gdGhlIHRva2VuIHN0cmVhbSBhbmQgc3RhdGUgYmFzZWQgb24gdGhlIGNhbmRpZGF0ZSBkZXN0aW5hdGlvbiBzdGF0ZSB3aGljaCB3YXMgcmV0dXJuZWQgYnkgVHJhbnNpdCgpLgotICAgIC8vIE1heSByZXR1cm4gYSBuZXcgc3RhdGUgb24gc3RhdGUgcG9wLgotICAgIHRlbXBsYXRlIDx1bnNpZ25lZCBwYXJzZUZsYWdzLCB0eXBlbmFtZSBJbnB1dFN0cmVhbSwgdHlwZW5hbWUgSGFuZGxlcj4KLSAgICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgSXRlcmF0aXZlUGFyc2luZ1N0YXRlIFRyYW5zaXQoSXRlcmF0aXZlUGFyc2luZ1N0YXRlIHNyYywgVG9rZW4gdG9rZW4sIEl0ZXJhdGl2ZVBhcnNpbmdTdGF0ZSBkc3QsIElucHV0U3RyZWFtJiBpcywgSGFuZGxlciYgaGFuZGxlcikgewotICAgICAgICAodm9pZCl0b2tlbjsKLQotICAgICAgICBzd2l0Y2ggKGRzdCkgewotICAgICAgICBjYXNlIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlOgotICAgICAgICAgICAgcmV0dXJuIGRzdDsKLQotICAgICAgICBjYXNlIEl0ZXJhdGl2ZVBhcnNpbmdPYmplY3RJbml0aWFsU3RhdGU6Ci0gICAgICAgIGNhc2UgSXRlcmF0aXZlUGFyc2luZ0FycmF5SW5pdGlhbFN0YXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBQdXNoIHRoZSBzdGF0ZShFbGVtZW50IG9yIE1lbWViZXJWYWx1ZSkgaWYgd2UgYXJlIG5lc3RlZCBpbiBhbm90aGVyIGFycmF5IG9yIHZhbHVlIG9mIG1lbWJlci4KLSAgICAgICAgICAgIC8vIEluIHRoaXMgd2F5IHdlIGNhbiBnZXQgdGhlIGNvcnJlY3Qgc3RhdGUgb24gT2JqZWN0RmluaXNoIG9yIEFycmF5RmluaXNoIGJ5IGZyYW1lIHBvcC4KLSAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdTdGF0ZSBuID0gc3JjOwotICAgICAgICAgICAgaWYgKHNyYyA9PSBJdGVyYXRpdmVQYXJzaW5nQXJyYXlJbml0aWFsU3RhdGUgfHwgc3JjID09IEl0ZXJhdGl2ZVBhcnNpbmdFbGVtZW50RGVsaW1pdGVyU3RhdGUpCi0gICAgICAgICAgICAgICAgbiA9IEl0ZXJhdGl2ZVBhcnNpbmdFbGVtZW50U3RhdGU7Ci0gICAgICAgICAgICBlbHNlIGlmIChzcmMgPT0gSXRlcmF0aXZlUGFyc2luZ0tleVZhbHVlRGVsaW1pdGVyU3RhdGUpCi0gICAgICAgICAgICAgICAgbiA9IEl0ZXJhdGl2ZVBhcnNpbmdNZW1iZXJWYWx1ZVN0YXRlOwotICAgICAgICAgICAgLy8gUHVzaCBjdXJyZW50IHN0YXRlLgotICAgICAgICAgICAgKnN0YWNrXy50ZW1wbGF0ZSBQdXNoPFNpemVUeXBlPigxKSA9IG47Ci0gICAgICAgICAgICAvLyBJbml0aWFsaXplIGFuZCBwdXNoIHRoZSBtZW1iZXIvZWxlbWVudCBjb3VudC4KLSAgICAgICAgICAgICpzdGFja18udGVtcGxhdGUgUHVzaDxTaXplVHlwZT4oMSkgPSAwOwotICAgICAgICAgICAgLy8gQ2FsbCBoYW5kbGVyCi0gICAgICAgICAgICBib29sIGhyID0gKGRzdCA9PSBJdGVyYXRpdmVQYXJzaW5nT2JqZWN0SW5pdGlhbFN0YXRlKSA/IGhhbmRsZXIuU3RhcnRPYmplY3QoKSA6IGhhbmRsZXIuU3RhcnRBcnJheSgpOwotICAgICAgICAgICAgLy8gT24gaGFuZGxlciBzaG9ydCBjaXJjdWl0cyB0aGUgcGFyc2luZy4KLSAgICAgICAgICAgIGlmICghaHIpIHsKLSAgICAgICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1JfTk9SRVRVUk4oa1BhcnNlRXJyb3JUZXJtaW5hdGlvbiwgaXMuVGVsbCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpcy5UYWtlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRzdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgSXRlcmF0aXZlUGFyc2luZ01lbWJlcktleVN0YXRlOgotICAgICAgICAgICAgUGFyc2VTdHJpbmc8cGFyc2VGbGFncz4oaXMsIGhhbmRsZXIsIHRydWUpOwotICAgICAgICAgICAgaWYgKEhhc1BhcnNlRXJyb3IoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRzdDsKLQotICAgICAgICBjYXNlIEl0ZXJhdGl2ZVBhcnNpbmdLZXlWYWx1ZURlbGltaXRlclN0YXRlOgotICAgICAgICAgICAgUkFQSURKU09OX0FTU0VSVCh0b2tlbiA9PSBDb2xvblRva2VuKTsKLSAgICAgICAgICAgIGlzLlRha2UoKTsKLSAgICAgICAgICAgIHJldHVybiBkc3Q7Ci0KLSAgICAgICAgY2FzZSBJdGVyYXRpdmVQYXJzaW5nTWVtYmVyVmFsdWVTdGF0ZToKLSAgICAgICAgICAgIC8vIE11c3QgYmUgbm9uLWNvbXBvdW5kIHZhbHVlLiBPciBpdCB3b3VsZCBiZSBPYmplY3RJbml0aWFsIG9yIEFycmF5SW5pdGlhbCBzdGF0ZS4KLSAgICAgICAgICAgIFBhcnNlVmFsdWU8cGFyc2VGbGFncz4oaXMsIGhhbmRsZXIpOwotICAgICAgICAgICAgaWYgKEhhc1BhcnNlRXJyb3IoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkc3Q7Ci0KLSAgICAgICAgY2FzZSBJdGVyYXRpdmVQYXJzaW5nRWxlbWVudFN0YXRlOgotICAgICAgICAgICAgLy8gTXVzdCBiZSBub24tY29tcG91bmQgdmFsdWUuIE9yIGl0IHdvdWxkIGJlIE9iamVjdEluaXRpYWwgb3IgQXJyYXlJbml0aWFsIHN0YXRlLgotICAgICAgICAgICAgUGFyc2VWYWx1ZTxwYXJzZUZsYWdzPihpcywgaGFuZGxlcik7Ci0gICAgICAgICAgICBpZiAoSGFzUGFyc2VFcnJvcigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRzdDsKLQotICAgICAgICBjYXNlIEl0ZXJhdGl2ZVBhcnNpbmdNZW1iZXJEZWxpbWl0ZXJTdGF0ZToKLSAgICAgICAgY2FzZSBJdGVyYXRpdmVQYXJzaW5nRWxlbWVudERlbGltaXRlclN0YXRlOgotICAgICAgICAgICAgaXMuVGFrZSgpOwotICAgICAgICAgICAgLy8gVXBkYXRlIG1lbWJlci9lbGVtZW50IGNvdW50LgotICAgICAgICAgICAgKnN0YWNrXy50ZW1wbGF0ZSBUb3A8U2l6ZVR5cGU+KCkgPSAqc3RhY2tfLnRlbXBsYXRlIFRvcDxTaXplVHlwZT4oKSArIDE7Ci0gICAgICAgICAgICByZXR1cm4gZHN0OwotCi0gICAgICAgIGNhc2UgSXRlcmF0aXZlUGFyc2luZ09iamVjdEZpbmlzaFN0YXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUcmFuc2l0IGZyb20gZGVsaW1pdGVyIGlzIG9ubHkgYWxsb3dlZCB3aGVuIHRyYWlsaW5nIGNvbW1hcyBhcmUgZW5hYmxlZAotICAgICAgICAgICAgaWYgKCEocGFyc2VGbGFncyAmIGtQYXJzZVRyYWlsaW5nQ29tbWFzRmxhZykgJiYgc3JjID09IEl0ZXJhdGl2ZVBhcnNpbmdNZW1iZXJEZWxpbWl0ZXJTdGF0ZSkgewotICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9OT1JFVFVSTihrUGFyc2VFcnJvck9iamVjdE1pc3NOYW1lLCBpcy5UZWxsKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEdldCBtZW1iZXIgY291bnQuCi0gICAgICAgICAgICBTaXplVHlwZSBjID0gKnN0YWNrXy50ZW1wbGF0ZSBQb3A8U2l6ZVR5cGU+KDEpOwotICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBpcyBub3QgZW1wdHksIGNvdW50IHRoZSBsYXN0IG1lbWJlci4KLSAgICAgICAgICAgIGlmIChzcmMgPT0gSXRlcmF0aXZlUGFyc2luZ01lbWJlclZhbHVlU3RhdGUpCi0gICAgICAgICAgICAgICAgKytjOwotICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgc3RhdGUuCi0gICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nU3RhdGUgbiA9IHN0YXRpY19jYXN0PEl0ZXJhdGl2ZVBhcnNpbmdTdGF0ZT4oKnN0YWNrXy50ZW1wbGF0ZSBQb3A8U2l6ZVR5cGU+KDEpKTsKLSAgICAgICAgICAgIC8vIFRyYW5zaXQgdG8gRmluaXNoIHN0YXRlIGlmIHRoaXMgaXMgdGhlIHRvcG1vc3Qgc2NvcGUuCi0gICAgICAgICAgICBpZiAobiA9PSBJdGVyYXRpdmVQYXJzaW5nU3RhcnRTdGF0ZSkKLSAgICAgICAgICAgICAgICBuID0gSXRlcmF0aXZlUGFyc2luZ0ZpbmlzaFN0YXRlOwotICAgICAgICAgICAgLy8gQ2FsbCBoYW5kbGVyCi0gICAgICAgICAgICBib29sIGhyID0gaGFuZGxlci5FbmRPYmplY3QoYyk7Ci0gICAgICAgICAgICAvLyBPbiBoYW5kbGVyIHNob3J0IGNpcmN1aXRzIHRoZSBwYXJzaW5nLgotICAgICAgICAgICAgaWYgKCFocikgewotICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9OT1JFVFVSTihrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCBpcy5UZWxsKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlzLlRha2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgSXRlcmF0aXZlUGFyc2luZ0FycmF5RmluaXNoU3RhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRyYW5zaXQgZnJvbSBkZWxpbWl0ZXIgaXMgb25seSBhbGxvd2VkIHdoZW4gdHJhaWxpbmcgY29tbWFzIGFyZSBlbmFibGVkCi0gICAgICAgICAgICBpZiAoIShwYXJzZUZsYWdzICYga1BhcnNlVHJhaWxpbmdDb21tYXNGbGFnKSAmJiBzcmMgPT0gSXRlcmF0aXZlUGFyc2luZ0VsZW1lbnREZWxpbWl0ZXJTdGF0ZSkgewotICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9OT1JFVFVSTihrUGFyc2VFcnJvclZhbHVlSW52YWxpZCwgaXMuVGVsbCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBHZXQgZWxlbWVudCBjb3VudC4KLSAgICAgICAgICAgIFNpemVUeXBlIGMgPSAqc3RhY2tfLnRlbXBsYXRlIFBvcDxTaXplVHlwZT4oMSk7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgYXJyYXkgaXMgbm90IGVtcHR5LCBjb3VudCB0aGUgbGFzdCBlbGVtZW50LgotICAgICAgICAgICAgaWYgKHNyYyA9PSBJdGVyYXRpdmVQYXJzaW5nRWxlbWVudFN0YXRlKQotICAgICAgICAgICAgICAgICsrYzsKLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIHN0YXRlLgotICAgICAgICAgICAgSXRlcmF0aXZlUGFyc2luZ1N0YXRlIG4gPSBzdGF0aWNfY2FzdDxJdGVyYXRpdmVQYXJzaW5nU3RhdGU+KCpzdGFja18udGVtcGxhdGUgUG9wPFNpemVUeXBlPigxKSk7Ci0gICAgICAgICAgICAvLyBUcmFuc2l0IHRvIEZpbmlzaCBzdGF0ZSBpZiB0aGlzIGlzIHRoZSB0b3Btb3N0IHNjb3BlLgotICAgICAgICAgICAgaWYgKG4gPT0gSXRlcmF0aXZlUGFyc2luZ1N0YXJ0U3RhdGUpCi0gICAgICAgICAgICAgICAgbiA9IEl0ZXJhdGl2ZVBhcnNpbmdGaW5pc2hTdGF0ZTsKLSAgICAgICAgICAgIC8vIENhbGwgaGFuZGxlcgotICAgICAgICAgICAgYm9vbCBociA9IGhhbmRsZXIuRW5kQXJyYXkoYyk7Ci0gICAgICAgICAgICAvLyBPbiBoYW5kbGVyIHNob3J0IGNpcmN1aXRzIHRoZSBwYXJzaW5nLgotICAgICAgICAgICAgaWYgKCFocikgewotICAgICAgICAgICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9OT1JFVFVSTihrUGFyc2VFcnJvclRlcm1pbmF0aW9uLCBpcy5UZWxsKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYXRpdmVQYXJzaW5nRXJyb3JTdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlzLlRha2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBUaGlzIGJyYW5jaCBpcyBmb3IgSXRlcmF0aXZlUGFyc2luZ1ZhbHVlU3RhdGUgYWN0dWFsbHkuCi0gICAgICAgICAgICAvLyBVc2UgYGRlZmF1bHQ6YCByYXRoZXIgdGhhbgotICAgICAgICAgICAgLy8gYGNhc2UgSXRlcmF0aXZlUGFyc2luZ1ZhbHVlU3RhdGU6YCBpcyBmb3IgY29kZSBjb3ZlcmFnZS4KLQotICAgICAgICAgICAgLy8gVGhlIEl0ZXJhdGl2ZVBhcnNpbmdTdGFydFN0YXRlIGlzIG5vdCBlbnVtZXJhdGVkIGluIHRoaXMgc3dpdGNoLWNhc2UuCi0gICAgICAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIGZvciB0aGF0IGNhc2UuIEFuZCBpdCBjYW4gYmUgY2F1Z2h0IGJ5IGZvbGxvd2luZyBhc3NlcnRpb24uCi0KLSAgICAgICAgICAgIC8vIFRoZSBJdGVyYXRpdmVQYXJzaW5nRmluaXNoU3RhdGUgaXMgbm90IGVudW1lcmF0ZWQgaW4gdGhpcyBzd2l0Y2gtY2FzZSBlaXRoZXIuCi0gICAgICAgICAgICAvLyBJdCBpcyBhICJkZXJpdmF0aXZlIiBzdGF0ZSB3aGljaCBjYW5ub3QgdHJpZ2dlcmVkIGZyb20gUHJlZGljdCgpIGRpcmVjdGx5LgotICAgICAgICAgICAgLy8gVGhlcmVmb3JlIGl0IGNhbm5vdCBoYXBwZW4gaGVyZS4gQW5kIGl0IGNhbiBiZSBjYXVnaHQgYnkgZm9sbG93aW5nIGFzc2VydGlvbi4KLSAgICAgICAgICAgIFJBUElESlNPTl9BU1NFUlQoZHN0ID09IEl0ZXJhdGl2ZVBhcnNpbmdWYWx1ZVN0YXRlKTsKLQotICAgICAgICAgICAgLy8gTXVzdCBiZSBub24tY29tcG91bmQgdmFsdWUuIE9yIGl0IHdvdWxkIGJlIE9iamVjdEluaXRpYWwgb3IgQXJyYXlJbml0aWFsIHN0YXRlLgotICAgICAgICAgICAgUGFyc2VWYWx1ZTxwYXJzZUZsYWdzPihpcywgaGFuZGxlcik7Ci0gICAgICAgICAgICBpZiAoSGFzUGFyc2VFcnJvcigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdGl2ZVBhcnNpbmdFcnJvclN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdGl2ZVBhcnNpbmdGaW5pc2hTdGF0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dFN0cmVhbT4KLSAgICB2b2lkIEhhbmRsZUVycm9yKEl0ZXJhdGl2ZVBhcnNpbmdTdGF0ZSBzcmMsIElucHV0U3RyZWFtJiBpcykgewotICAgICAgICBpZiAoSGFzUGFyc2VFcnJvcigpKSB7Ci0gICAgICAgICAgICAvLyBFcnJvciBmbGFnIGhhcyBiZWVuIHNldC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc3dpdGNoIChzcmMpIHsKLSAgICAgICAgY2FzZSBJdGVyYXRpdmVQYXJzaW5nU3RhcnRTdGF0ZTogICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1Ioa1BhcnNlRXJyb3JEb2N1bWVudEVtcHR5LCBpcy5UZWxsKCkpOyByZXR1cm47Ci0gICAgICAgIGNhc2UgSXRlcmF0aXZlUGFyc2luZ0ZpbmlzaFN0YXRlOiAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yRG9jdW1lbnRSb290Tm90U2luZ3VsYXIsIGlzLlRlbGwoKSk7IHJldHVybjsKLSAgICAgICAgY2FzZSBJdGVyYXRpdmVQYXJzaW5nT2JqZWN0SW5pdGlhbFN0YXRlOgotICAgICAgICBjYXNlIEl0ZXJhdGl2ZVBhcnNpbmdNZW1iZXJEZWxpbWl0ZXJTdGF0ZTogIFJBUElESlNPTl9QQVJTRV9FUlJPUihrUGFyc2VFcnJvck9iamVjdE1pc3NOYW1lLCBpcy5UZWxsKCkpOyByZXR1cm47Ci0gICAgICAgIGNhc2UgSXRlcmF0aXZlUGFyc2luZ01lbWJlcktleVN0YXRlOiAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yT2JqZWN0TWlzc0NvbG9uLCBpcy5UZWxsKCkpOyByZXR1cm47Ci0gICAgICAgIGNhc2UgSXRlcmF0aXZlUGFyc2luZ01lbWJlclZhbHVlU3RhdGU6ICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yT2JqZWN0TWlzc0NvbW1hT3JDdXJseUJyYWNrZXQsIGlzLlRlbGwoKSk7IHJldHVybjsKLSAgICAgICAgY2FzZSBJdGVyYXRpdmVQYXJzaW5nS2V5VmFsdWVEZWxpbWl0ZXJTdGF0ZToKLSAgICAgICAgY2FzZSBJdGVyYXRpdmVQYXJzaW5nQXJyYXlJbml0aWFsU3RhdGU6Ci0gICAgICAgIGNhc2UgSXRlcmF0aXZlUGFyc2luZ0VsZW1lbnREZWxpbWl0ZXJTdGF0ZTogUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yVmFsdWVJbnZhbGlkLCBpcy5UZWxsKCkpOyByZXR1cm47Ci0gICAgICAgIGNhc2UgSXRlcmF0aXZlUGFyc2luZ0VsZW1lbnRTdGF0ZTogICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SKGtQYXJzZUVycm9yQXJyYXlNaXNzQ29tbWFPclNxdWFyZUJyYWNrZXQsIGlzLlRlbGwoKSk7IHJldHVybjsKLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fUEFSU0VfRVJST1Ioa1BhcnNlRXJyb3JVbnNwZWNpZmljU3ludGF4RXJyb3IsIGlzLlRlbGwoKSk7IHJldHVybjsKLSAgICAgICAgfSAgICAgICAKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dW5zaWduZWQgcGFyc2VGbGFncywgdHlwZW5hbWUgSW5wdXRTdHJlYW0sIHR5cGVuYW1lIEhhbmRsZXI+Ci0gICAgUGFyc2VSZXN1bHQgSXRlcmF0aXZlUGFyc2UoSW5wdXRTdHJlYW0mIGlzLCBIYW5kbGVyJiBoYW5kbGVyKSB7Ci0gICAgICAgIHBhcnNlUmVzdWx0Xy5DbGVhcigpOwotICAgICAgICBDbGVhclN0YWNrT25FeGl0IHNjb3BlKCp0aGlzKTsKLSAgICAgICAgSXRlcmF0aXZlUGFyc2luZ1N0YXRlIHN0YXRlID0gSXRlcmF0aXZlUGFyc2luZ1N0YXJ0U3RhdGU7Ci0KLSAgICAgICAgU2tpcFdoaXRlc3BhY2VBbmRDb21tZW50czxwYXJzZUZsYWdzPihpcyk7Ci0gICAgICAgIFJBUElESlNPTl9QQVJTRV9FUlJPUl9FQVJMWV9SRVRVUk4ocGFyc2VSZXN1bHRfKTsKLSAgICAgICAgd2hpbGUgKGlzLlBlZWsoKSAhPSAnXDAnKSB7Ci0gICAgICAgICAgICBUb2tlbiB0ID0gVG9rZW5pemUoaXMuUGVlaygpKTsKLSAgICAgICAgICAgIEl0ZXJhdGl2ZVBhcnNpbmdTdGF0ZSBuID0gUHJlZGljdChzdGF0ZSwgdCk7Ci0gICAgICAgICAgICBJdGVyYXRpdmVQYXJzaW5nU3RhdGUgZCA9IFRyYW5zaXQ8cGFyc2VGbGFncz4oc3RhdGUsIHQsIG4sIGlzLCBoYW5kbGVyKTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gSXRlcmF0aXZlUGFyc2luZ0Vycm9yU3RhdGUpIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVFcnJvcihzdGF0ZSwgaXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0ZSA9IGQ7Ci0KLSAgICAgICAgICAgIC8vIERvIG5vdCBmdXJ0aGVyIGNvbnN1bWUgc3RyZWFtcyBpZiBhIHJvb3QgSlNPTiBoYXMgYmVlbiBwYXJzZWQuCi0gICAgICAgICAgICBpZiAoKHBhcnNlRmxhZ3MgJiBrUGFyc2VTdG9wV2hlbkRvbmVGbGFnKSAmJiBzdGF0ZSA9PSBJdGVyYXRpdmVQYXJzaW5nRmluaXNoU3RhdGUpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIFNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHM8cGFyc2VGbGFncz4oaXMpOwotICAgICAgICAgICAgUkFQSURKU09OX1BBUlNFX0VSUk9SX0VBUkxZX1JFVFVSTihwYXJzZVJlc3VsdF8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIHRoZSBlbmQgb2YgZmlsZS4KLSAgICAgICAgaWYgKHN0YXRlICE9IEl0ZXJhdGl2ZVBhcnNpbmdGaW5pc2hTdGF0ZSkKLSAgICAgICAgICAgIEhhbmRsZUVycm9yKHN0YXRlLCBpcyk7Ci0KLSAgICAgICAgcmV0dXJuIHBhcnNlUmVzdWx0XzsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtEZWZhdWx0U3RhY2tDYXBhY2l0eSA9IDI1NjsgICAgLy8hPCBEZWZhdWx0IHN0YWNrIGNhcGFjaXR5IGluIGJ5dGVzIGZvciBzdG9yaW5nIGEgc2luZ2xlIGRlY29kZWQgc3RyaW5nLgotICAgIGludGVybmFsOjpTdGFjazxTdGFja0FsbG9jYXRvcj4gc3RhY2tfOyAgLy8hPCBBIHN0YWNrIGZvciBzdG9yaW5nIGRlY29kZWQgc3RyaW5nIHRlbXBvcmFyaWx5IGR1cmluZyBub24tZGVzdHJ1Y3RpdmUgcGFyc2luZy4KLSAgICBQYXJzZVJlc3VsdCBwYXJzZVJlc3VsdF87Ci19OyAvLyBjbGFzcyBHZW5lcmljUmVhZGVyCi0KLS8vISBSZWFkZXIgd2l0aCBVVEY4IGVuY29kaW5nIGFuZCBkZWZhdWx0IGFsbG9jYXRvci4KLXR5cGVkZWYgR2VuZXJpY1JlYWRlcjxVVEY4PD4sIFVURjg8PiA+IFJlYWRlcjsKLQotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUE9QCi0jZW5kaWYKLQotCi0jaWZkZWYgX19HTlVDX18KLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLSNpZmRlZiBfTVNDX1ZFUgotUkFQSURKU09OX0RJQUdfUE9QCi0jZW5kaWYKLQotI2VuZGlmIC8vIFJBUElESlNPTl9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vc2NoZW1hLmggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL3NjaGVtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRhOGE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vc2NoZW1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDA3ICswLDAgQEAKLS8vIFRlbmNlbnQgaXMgcGxlYXNlZCB0byBzdXBwb3J0IHRoZSBvcGVuIHNvdXJjZSBjb21tdW5pdHkgYnkgbWFraW5nIFJhcGlkSlNPTiBhdmFpbGFibGUtPgotLy8gCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTUgVEhMIEEyOSBMaW1pdGVkLCBhIFRlbmNlbnQgY29tcGFueSwgYW5kIE1pbG8gWWlwLT4gQWxsIHJpZ2h0cyByZXNlcnZlZC0+Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKLS8vIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS0+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly9vcGVuc291cmNlLT5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQtPiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAKLS8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UtPgotCi0jaWZuZGVmIFJBUElESlNPTl9TQ0hFTUFfSF8KLSNkZWZpbmUgUkFQSURKU09OX1NDSEVNQV9IXwotCi0jaW5jbHVkZSAiZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJwb2ludGVyLmgiCi0jaW5jbHVkZSA8Y21hdGg+IC8vIGFicywgZmxvb3IKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKHdlYWstdnRhYmxlcykKLVJBUElESlNPTl9ESUFHX09GRihleGl0LXRpbWUtZGVzdHJ1Y3RvcnMpCi1SQVBJREpTT05fRElBR19PRkYoYysrOTgtY29tcGF0LXBlZGFudGljKQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChSQVBJREpTT05fU0NIRU1BX1VTRV9JTlRFUk5BTFJFR0VYKQotI2RlZmluZSBSQVBJREpTT05fU0NIRU1BX1VTRV9JTlRFUk5BTFJFR0VYIDEKLSNlbHNlCi0jZGVmaW5lIFJBUElESlNPTl9TQ0hFTUFfVVNFX0lOVEVSTkFMUkVHRVggMAotI2VuZGlmCi0KLSNpZiAhUkFQSURKU09OX1NDSEVNQV9VU0VfSU5URVJOQUxSRUdFWCAmJiAhZGVmaW5lZChSQVBJREpTT05fU0NIRU1BX1VTRV9TVERSRUdFWCkgJiYgKF9fY3BsdXNwbHVzID49MjAxMTAzTCB8fCAoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTgwMCkpCi0jZGVmaW5lIFJBUElESlNPTl9TQ0hFTUFfVVNFX1NURFJFR0VYIDEKLSNlbHNlCi0jZGVmaW5lIFJBUElESlNPTl9TQ0hFTUFfVVNFX1NURFJFR0VYIDAKLSNlbmRpZgotCi0jaWYgUkFQSURKU09OX1NDSEVNQV9VU0VfSU5URVJOQUxSRUdFWAotI2luY2x1ZGUgImludGVybmFsL3JlZ2V4LmgiCi0jZWxpZiBSQVBJREpTT05fU0NIRU1BX1VTRV9TVERSRUdFWAotI2luY2x1ZGUgPHJlZ2V4PgotI2VuZGlmCi0KLSNpZiBSQVBJREpTT05fU0NIRU1BX1VTRV9JTlRFUk5BTFJFR0VYIHx8IFJBUElESlNPTl9TQ0hFTUFfVVNFX1NURFJFR0VYCi0jZGVmaW5lIFJBUElESlNPTl9TQ0hFTUFfSEFTX1JFR0VYIDEKLSNlbHNlCi0jZGVmaW5lIFJBUElESlNPTl9TQ0hFTUFfSEFTX1JFR0VYIDAKLSNlbmRpZgotCi0jaWZuZGVmIFJBUElESlNPTl9TQ0hFTUFfVkVSQk9TRQotI2RlZmluZSBSQVBJREpTT05fU0NIRU1BX1ZFUkJPU0UgMAotI2VuZGlmCi0KLSNpZiBSQVBJREpTT05fU0NIRU1BX1ZFUkJPU0UKLSNpbmNsdWRlICJzdHJpbmdidWZmZXIuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykKLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRihlZmZjKyspCi0jZW5kaWYKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKHZhcmlhZGljLW1hY3JvcykKLSNlbmRpZgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFZlcmJvc2UgVXRpbGl0aWVzCi0KLSNpZiBSQVBJREpTT05fU0NIRU1BX1ZFUkJPU0UKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotaW5saW5lIHZvaWQgUHJpbnRJbnZhbGlkS2V5d29yZChjb25zdCBjaGFyKiBrZXl3b3JkKSB7Ci0gICAgcHJpbnRmKCJGYWlsIGtleXdvcmQ6ICVzXG4iLCBrZXl3b3JkKTsKLX0KLQotaW5saW5lIHZvaWQgUHJpbnRJbnZhbGlkS2V5d29yZChjb25zdCB3Y2hhcl90KiBrZXl3b3JkKSB7Ci0gICAgd3ByaW50ZihMIkZhaWwga2V5d29yZDogJWxzXG4iLCBrZXl3b3JkKTsKLX0KLQotaW5saW5lIHZvaWQgUHJpbnRJbnZhbGlkRG9jdW1lbnQoY29uc3QgY2hhciogZG9jdW1lbnQpIHsKLSAgICBwcmludGYoIkZhaWwgZG9jdW1lbnQ6ICVzXG5cbiIsIGRvY3VtZW50KTsKLX0KLQotaW5saW5lIHZvaWQgUHJpbnRJbnZhbGlkRG9jdW1lbnQoY29uc3Qgd2NoYXJfdCogZG9jdW1lbnQpIHsKLSAgICB3cHJpbnRmKEwiRmFpbCBkb2N1bWVudDogJWxzXG5cbiIsIGRvY3VtZW50KTsKLX0KLQotaW5saW5lIHZvaWQgUHJpbnRWYWxpZGF0b3JQb2ludGVycyh1bnNpZ25lZCBkZXB0aCwgY29uc3QgY2hhciogcywgY29uc3QgY2hhciogZCkgewotICAgIHByaW50ZigiUzogJSpzJXNcbkQ6ICUqcyVzXG5cbiIsIGRlcHRoICogNCwgIiAiLCBzLCBkZXB0aCAqIDQsICIgIiwgZCk7Ci19Ci0KLWlubGluZSB2b2lkIFByaW50VmFsaWRhdG9yUG9pbnRlcnModW5zaWduZWQgZGVwdGgsIGNvbnN0IHdjaGFyX3QqIHMsIGNvbnN0IHdjaGFyX3QqIGQpIHsKLSAgICB3cHJpbnRmKEwiUzogJSpscyVsc1xuRDogJSpscyVsc1xuXG4iLCBkZXB0aCAqIDQsIEwiICIsIHMsIGRlcHRoICogNCwgTCIgIiwgZCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLSNlbmRpZiAvLyBSQVBJREpTT05fU0NIRU1BX1ZFUkJPU0UKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4KLQotI2lmIFJBUElESlNPTl9TQ0hFTUFfVkVSQk9TRQotI2RlZmluZSBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1ZFUkJPU0Uoa2V5d29yZCkgaW50ZXJuYWw6OlByaW50SW52YWxpZEtleXdvcmQoa2V5d29yZCkKLSNlbHNlCi0jZGVmaW5lIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfVkVSQk9TRShrZXl3b3JkKQotI2VuZGlmCi0KLSNkZWZpbmUgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oa2V5d29yZClcCi1SQVBJREpTT05fTVVMVElMSU5FTUFDUk9fQkVHSU5cCi0gICAgY29udGV4dC5pbnZhbGlkS2V5d29yZCA9IGtleXdvcmQuR2V0U3RyaW5nKCk7XAotICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfVkVSQk9TRShrZXl3b3JkLkdldFN0cmluZygpKTtcCi0gICAgcmV0dXJuIGZhbHNlO1wKLVJBUElESlNPTl9NVUxUSUxJTkVNQUNST19FTkQKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY1NjaGVtYURvY3VtZW50OwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2NoZW1hRG9jdW1lbnRUeXBlPgotY2xhc3MgU2NoZW1hOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJU2NoZW1hVmFsaWRhdG9yCi0KLWNsYXNzIElTY2hlbWFWYWxpZGF0b3IgewotcHVibGljOgotICAgIHZpcnR1YWwgfklTY2hlbWFWYWxpZGF0b3IoKSB7fQotICAgIHZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgY29uc3QgPSAwOwotfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSVNjaGVtYVN0YXRlRmFjdG9yeQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2NoZW1hVHlwZT4KLWNsYXNzIElTY2hlbWFTdGF0ZUZhY3RvcnkgewotcHVibGljOgotICAgIHZpcnR1YWwgfklTY2hlbWFTdGF0ZUZhY3RvcnkoKSB7fQotICAgIHZpcnR1YWwgSVNjaGVtYVZhbGlkYXRvciogQ3JlYXRlU2NoZW1hVmFsaWRhdG9yKGNvbnN0IFNjaGVtYVR5cGUmKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIERlc3Ryb3lTY2hlbWFWYWxpZGF0b3IoSVNjaGVtYVZhbGlkYXRvciogdmFsaWRhdG9yKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkKiBDcmVhdGVIYXNoZXIoKSA9IDA7Ci0gICAgdmlydHVhbCB1aW50NjRfdCBHZXRIYXNoQ29kZSh2b2lkKiBoYXNoZXIpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgRGVzdHJvcnlIYXNoZXIodm9pZCogaGFzaGVyKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkKiBNYWxsb2NTdGF0ZShzaXplX3Qgc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCogUmVhbGxvY1N0YXRlKHZvaWQqIG9yaWdpbmFsUHRyLCBzaXplX3Qgb3JpZ2luYWxTaXplLCBzaXplX3QgbmV3U2l6ZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBGcmVlU3RhdGUodm9pZCogcCkgPSAwOwotfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSGFzaGVyCi0KLS8vIEZvciBjb21wYXJpc29uIG9mIGNvbXBvdW5kIHZhbHVlCi10ZW1wbGF0ZTx0eXBlbmFtZSBFbmNvZGluZywgdHlwZW5hbWUgQWxsb2NhdG9yPgotY2xhc3MgSGFzaGVyIHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEVuY29kaW5nOjpDaCBDaDsKLQotICAgIEhhc2hlcihBbGxvY2F0b3IqIGFsbG9jYXRvciA9IDAsIHNpemVfdCBzdGFja0NhcGFjaXR5ID0ga0RlZmF1bHRTaXplKSA6IHN0YWNrXyhhbGxvY2F0b3IsIHN0YWNrQ2FwYWNpdHkpIHt9Ci0KLSAgICBib29sIE51bGwoKSB7IHJldHVybiBXcml0ZVR5cGUoa051bGxUeXBlKTsgfQotICAgIGJvb2wgQm9vbChib29sIGIpIHsgcmV0dXJuIFdyaXRlVHlwZShiID8ga1RydWVUeXBlIDoga0ZhbHNlVHlwZSk7IH0KLSAgICBib29sIEludChpbnQgaSkgeyBOdW1iZXIgbjsgbi51LmkgPSBpOyBuLmQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGkpOyByZXR1cm4gV3JpdGVOdW1iZXIobik7IH0KLSAgICBib29sIFVpbnQodW5zaWduZWQgdSkgeyBOdW1iZXIgbjsgbi51LnUgPSB1OyBuLmQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KHUpOyByZXR1cm4gV3JpdGVOdW1iZXIobik7IH0KLSAgICBib29sIEludDY0KGludDY0X3QgaSkgeyBOdW1iZXIgbjsgbi51LmkgPSBpOyBuLmQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGkpOyByZXR1cm4gV3JpdGVOdW1iZXIobik7IH0KLSAgICBib29sIFVpbnQ2NCh1aW50NjRfdCB1KSB7IE51bWJlciBuOyBuLnUudSA9IHU7IG4uZCA9IHN0YXRpY19jYXN0PGRvdWJsZT4odSk7IHJldHVybiBXcml0ZU51bWJlcihuKTsgfQotICAgIGJvb2wgRG91YmxlKGRvdWJsZSBkKSB7IAotICAgICAgICBOdW1iZXIgbjsgCi0gICAgICAgIGlmIChkIDwgMCkgbi51LmkgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihkKTsKLSAgICAgICAgZWxzZSAgICAgICBuLnUudSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihkKTsgCi0gICAgICAgIG4uZCA9IGQ7Ci0gICAgICAgIHJldHVybiBXcml0ZU51bWJlcihuKTsKLSAgICB9Ci0KLSAgICBib29sIFJhd051bWJlcihjb25zdCBDaCogc3RyLCBTaXplVHlwZSBsZW4sIGJvb2wpIHsKLSAgICAgICAgV3JpdGVCdWZmZXIoa051bWJlclR5cGUsIHN0ciwgbGVuICogc2l6ZW9mKENoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgU3RyaW5nKGNvbnN0IENoKiBzdHIsIFNpemVUeXBlIGxlbiwgYm9vbCkgewotICAgICAgICBXcml0ZUJ1ZmZlcihrU3RyaW5nVHlwZSwgc3RyLCBsZW4gKiBzaXplb2YoQ2gpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBTdGFydE9iamVjdCgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBib29sIEtleShjb25zdCBDaCogc3RyLCBTaXplVHlwZSBsZW4sIGJvb2wgY29weSkgeyByZXR1cm4gU3RyaW5nKHN0ciwgbGVuLCBjb3B5KTsgfQotICAgIGJvb2wgRW5kT2JqZWN0KFNpemVUeXBlIG1lbWJlckNvdW50KSB7IAotICAgICAgICB1aW50NjRfdCBoID0gSGFzaCgwLCBrT2JqZWN0VHlwZSk7Ci0gICAgICAgIHVpbnQ2NF90KiBrdiA9IHN0YWNrXy50ZW1wbGF0ZSBQb3A8dWludDY0X3Q+KG1lbWJlckNvdW50ICogMik7Ci0gICAgICAgIGZvciAoU2l6ZVR5cGUgaSA9IDA7IGkgPCBtZW1iZXJDb3VudDsgaSsrKQotICAgICAgICAgICAgaCBePSBIYXNoKGt2W2kgKiAyXSwga3ZbaSAqIDIgKyAxXSk7ICAvLyBVc2UgeG9yIHRvIGFjaGlldmUgbWVtYmVyIG9yZGVyIGluc2Vuc2l0aXZlCi0gICAgICAgICpzdGFja18udGVtcGxhdGUgUHVzaDx1aW50NjRfdD4oKSA9IGg7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBib29sIFN0YXJ0QXJyYXkoKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgYm9vbCBFbmRBcnJheShTaXplVHlwZSBlbGVtZW50Q291bnQpIHsgCi0gICAgICAgIHVpbnQ2NF90IGggPSBIYXNoKDAsIGtBcnJheVR5cGUpOwotICAgICAgICB1aW50NjRfdCogZSA9IHN0YWNrXy50ZW1wbGF0ZSBQb3A8dWludDY0X3Q+KGVsZW1lbnRDb3VudCk7Ci0gICAgICAgIGZvciAoU2l6ZVR5cGUgaSA9IDA7IGkgPCBlbGVtZW50Q291bnQ7IGkrKykKLSAgICAgICAgICAgIGggPSBIYXNoKGgsIGVbaV0pOyAvLyBVc2UgaGFzaCB0byBhY2hpZXZlIGVsZW1lbnQgb3JkZXIgc2Vuc2l0aXZlCi0gICAgICAgICpzdGFja18udGVtcGxhdGUgUHVzaDx1aW50NjRfdD4oKSA9IGg7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIHN0YWNrXy5HZXRTaXplKCkgPT0gc2l6ZW9mKHVpbnQ2NF90KTsgfQotCi0gICAgdWludDY0X3QgR2V0SGFzaENvZGUoKSBjb25zdCB7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQoSXNWYWxpZCgpKTsKLSAgICAgICAgcmV0dXJuICpzdGFja18udGVtcGxhdGUgVG9wPHVpbnQ2NF90PigpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtEZWZhdWx0U2l6ZSA9IDI1NjsKLSAgICBzdHJ1Y3QgTnVtYmVyIHsKLSAgICAgICAgdW5pb24gVSB7Ci0gICAgICAgICAgICB1aW50NjRfdCB1OwotICAgICAgICAgICAgaW50NjRfdCBpOwotICAgICAgICB9dTsKLSAgICAgICAgZG91YmxlIGQ7Ci0gICAgfTsKLQotICAgIGJvb2wgV3JpdGVUeXBlKFR5cGUgdHlwZSkgeyByZXR1cm4gV3JpdGVCdWZmZXIodHlwZSwgMCwgMCk7IH0KLSAgICAKLSAgICBib29sIFdyaXRlTnVtYmVyKGNvbnN0IE51bWJlciYgbikgeyByZXR1cm4gV3JpdGVCdWZmZXIoa051bWJlclR5cGUsICZuLCBzaXplb2YobikpOyB9Ci0gICAgCi0gICAgYm9vbCBXcml0ZUJ1ZmZlcihUeXBlIHR5cGUsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIHsKLSAgICAgICAgLy8gRk5WLTFhIGZyb20gaHR0cDovL2lzdGhlLmNvbS9jaG9uZ28vdGVjaC9jb21wL2Zudi8KLSAgICAgICAgdWludDY0X3QgaCA9IEhhc2goUkFQSURKU09OX1VJTlQ2NF9DMigweDg0MjIyMzI1LCAweGNiZjI5Y2U0KSwgdHlwZSk7Ci0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGQgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oZGF0YSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgICAgICAgICBoID0gSGFzaChoLCBkW2ldKTsKLSAgICAgICAgKnN0YWNrXy50ZW1wbGF0ZSBQdXNoPHVpbnQ2NF90PigpID0gaDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgc3RhdGljIHVpbnQ2NF90IEhhc2godWludDY0X3QgaCwgdWludDY0X3QgZCkgewotICAgICAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1ByaW1lID0gUkFQSURKU09OX1VJTlQ2NF9DMigweDAwMDAwMTAwLCAweDAwMDAwMWIzKTsKLSAgICAgICAgaCBePSBkOwotICAgICAgICBoICo9IGtQcmltZTsKLSAgICAgICAgcmV0dXJuIGg7Ci0gICAgfQotCi0gICAgU3RhY2s8QWxsb2NhdG9yPiBzdGFja187Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTY2hlbWFWYWxpZGF0aW9uQ29udGV4dAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2NoZW1hRG9jdW1lbnRUeXBlPgotc3RydWN0IFNjaGVtYVZhbGlkYXRpb25Db250ZXh0IHsKLSAgICB0eXBlZGVmIFNjaGVtYTxTY2hlbWFEb2N1bWVudFR5cGU+IFNjaGVtYVR5cGU7Ci0gICAgdHlwZWRlZiBJU2NoZW1hU3RhdGVGYWN0b3J5PFNjaGVtYVR5cGU+IFNjaGVtYVZhbGlkYXRvckZhY3RvcnlUeXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgU2NoZW1hVHlwZTo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZhbHVlVHlwZTo6Q2ggQ2g7Ci0KLSAgICBlbnVtIFBhdHRlcm5WYWxpZGF0b3JUeXBlIHsKLSAgICAgICAga1BhdHRlcm5WYWxpZGF0b3JPbmx5LAotICAgICAgICBrUGF0dGVyblZhbGlkYXRvcldpdGhQcm9wZXJ0eSwKLSAgICAgICAga1BhdHRlcm5WYWxpZGF0b3JXaXRoQWRkaXRpb25hbFByb3BlcnR5Ci0gICAgfTsKLQotICAgIFNjaGVtYVZhbGlkYXRpb25Db250ZXh0KFNjaGVtYVZhbGlkYXRvckZhY3RvcnlUeXBlJiBmLCBjb25zdCBTY2hlbWFUeXBlKiBzKSA6Ci0gICAgICAgIGZhY3RvcnkoZiksCi0gICAgICAgIHNjaGVtYShzKSwKLSAgICAgICAgdmFsdWVTY2hlbWEoKSwKLSAgICAgICAgaW52YWxpZEtleXdvcmQoKSwKLSAgICAgICAgaGFzaGVyKCksCi0gICAgICAgIGFycmF5RWxlbWVudEhhc2hDb2RlcygpLAotICAgICAgICB2YWxpZGF0b3JzKCksCi0gICAgICAgIHZhbGlkYXRvckNvdW50KCksCi0gICAgICAgIHBhdHRlcm5Qcm9wZXJ0aWVzVmFsaWRhdG9ycygpLAotICAgICAgICBwYXR0ZXJuUHJvcGVydGllc1ZhbGlkYXRvckNvdW50KCksCi0gICAgICAgIHBhdHRlcm5Qcm9wZXJ0aWVzU2NoZW1hcygpLAotICAgICAgICBwYXR0ZXJuUHJvcGVydGllc1NjaGVtYUNvdW50KCksCi0gICAgICAgIHZhbHVlUGF0dGVyblZhbGlkYXRvclR5cGUoa1BhdHRlcm5WYWxpZGF0b3JPbmx5KSwKLSAgICAgICAgb2JqZWN0RGVwZW5kZW5jaWVzKCksCi0gICAgICAgIGluQXJyYXkoZmFsc2UpLAotICAgICAgICB2YWx1ZVVuaXF1ZW5lc3MoZmFsc2UpLAotICAgICAgICBhcnJheVVuaXF1ZW5lc3MoZmFsc2UpCi0gICAgewotICAgIH0KLQotICAgIH5TY2hlbWFWYWxpZGF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKGhhc2hlcikKLSAgICAgICAgICAgIGZhY3RvcnkuRGVzdHJvcnlIYXNoZXIoaGFzaGVyKTsKLSAgICAgICAgaWYgKHZhbGlkYXRvcnMpIHsKLSAgICAgICAgICAgIGZvciAoU2l6ZVR5cGUgaSA9IDA7IGkgPCB2YWxpZGF0b3JDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgIGZhY3RvcnkuRGVzdHJveVNjaGVtYVZhbGlkYXRvcih2YWxpZGF0b3JzW2ldKTsKLSAgICAgICAgICAgIGZhY3RvcnkuRnJlZVN0YXRlKHZhbGlkYXRvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXR0ZXJuUHJvcGVydGllc1ZhbGlkYXRvcnMpIHsKLSAgICAgICAgICAgIGZvciAoU2l6ZVR5cGUgaSA9IDA7IGkgPCBwYXR0ZXJuUHJvcGVydGllc1ZhbGlkYXRvckNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgZmFjdG9yeS5EZXN0cm95U2NoZW1hVmFsaWRhdG9yKHBhdHRlcm5Qcm9wZXJ0aWVzVmFsaWRhdG9yc1tpXSk7Ci0gICAgICAgICAgICBmYWN0b3J5LkZyZWVTdGF0ZShwYXR0ZXJuUHJvcGVydGllc1ZhbGlkYXRvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXR0ZXJuUHJvcGVydGllc1NjaGVtYXMpCi0gICAgICAgICAgICBmYWN0b3J5LkZyZWVTdGF0ZShwYXR0ZXJuUHJvcGVydGllc1NjaGVtYXMpOwotICAgICAgICBpZiAob2JqZWN0RGVwZW5kZW5jaWVzKQotICAgICAgICAgICAgZmFjdG9yeS5GcmVlU3RhdGUob2JqZWN0RGVwZW5kZW5jaWVzKTsKLSAgICB9Ci0KLSAgICBTY2hlbWFWYWxpZGF0b3JGYWN0b3J5VHlwZSYgZmFjdG9yeTsKLSAgICBjb25zdCBTY2hlbWFUeXBlKiBzY2hlbWE7Ci0gICAgY29uc3QgU2NoZW1hVHlwZSogdmFsdWVTY2hlbWE7Ci0gICAgY29uc3QgQ2gqIGludmFsaWRLZXl3b3JkOwotICAgIHZvaWQqIGhhc2hlcjsgLy8gT25seSB2YWxpZGF0b3IgYWNjZXNzCi0gICAgdm9pZCogYXJyYXlFbGVtZW50SGFzaENvZGVzOyAvLyBPbmx5IHZhbGlkYXRvciBhY2Nlc3MgdGhpcwotICAgIElTY2hlbWFWYWxpZGF0b3IqKiB2YWxpZGF0b3JzOwotICAgIFNpemVUeXBlIHZhbGlkYXRvckNvdW50OwotICAgIElTY2hlbWFWYWxpZGF0b3IqKiBwYXR0ZXJuUHJvcGVydGllc1ZhbGlkYXRvcnM7Ci0gICAgU2l6ZVR5cGUgcGF0dGVyblByb3BlcnRpZXNWYWxpZGF0b3JDb3VudDsKLSAgICBjb25zdCBTY2hlbWFUeXBlKiogcGF0dGVyblByb3BlcnRpZXNTY2hlbWFzOwotICAgIFNpemVUeXBlIHBhdHRlcm5Qcm9wZXJ0aWVzU2NoZW1hQ291bnQ7Ci0gICAgUGF0dGVyblZhbGlkYXRvclR5cGUgdmFsdWVQYXR0ZXJuVmFsaWRhdG9yVHlwZTsKLSAgICBQYXR0ZXJuVmFsaWRhdG9yVHlwZSBvYmplY3RQYXR0ZXJuVmFsaWRhdG9yVHlwZTsKLSAgICBTaXplVHlwZSBvYmplY3RSZXF1aXJlZENvdW50OwotICAgIFNpemVUeXBlIGFycmF5RWxlbWVudEluZGV4OwotICAgIGJvb2wqIG9iamVjdERlcGVuZGVuY2llczsKLSAgICBib29sIGluQXJyYXk7Ci0gICAgYm9vbCB2YWx1ZVVuaXF1ZW5lc3M7Ci0gICAgYm9vbCBhcnJheVVuaXF1ZW5lc3M7Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTY2hlbWEKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFNjaGVtYURvY3VtZW50VHlwZT4KLWNsYXNzIFNjaGVtYSB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBTY2hlbWFEb2N1bWVudFR5cGU6OlZhbHVlVHlwZSBWYWx1ZVR5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBTY2hlbWFEb2N1bWVudFR5cGU6OkFsbG9jYXRvclR5cGUgQWxsb2NhdG9yVHlwZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFNjaGVtYURvY3VtZW50VHlwZTo6UG9pbnRlclR5cGUgUG9pbnRlclR5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGU6OkVuY29kaW5nVHlwZSBFbmNvZGluZ1R5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBFbmNvZGluZ1R5cGU6OkNoIENoOwotICAgIHR5cGVkZWYgU2NoZW1hVmFsaWRhdGlvbkNvbnRleHQ8U2NoZW1hRG9jdW1lbnRUeXBlPiBDb250ZXh0OwotICAgIHR5cGVkZWYgU2NoZW1hPFNjaGVtYURvY3VtZW50VHlwZT4gU2NoZW1hVHlwZTsKLSAgICB0eXBlZGVmIEdlbmVyaWNWYWx1ZTxFbmNvZGluZ1R5cGUsIEFsbG9jYXRvclR5cGU+IFNWYWx1ZTsKLSAgICBmcmllbmQgY2xhc3MgR2VuZXJpY1NjaGVtYURvY3VtZW50PFZhbHVlVHlwZSwgQWxsb2NhdG9yVHlwZT47Ci0KLSAgICBTY2hlbWEoU2NoZW1hRG9jdW1lbnRUeXBlKiBzY2hlbWFEb2N1bWVudCwgY29uc3QgUG9pbnRlclR5cGUmIHAsIGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUsIGNvbnN0IFZhbHVlVHlwZSYgZG9jdW1lbnQsIEFsbG9jYXRvclR5cGUqIGFsbG9jYXRvcikgOgotICAgICAgICBhbGxvY2F0b3JfKGFsbG9jYXRvciksCi0gICAgICAgIGVudW1fKCksCi0gICAgICAgIGVudW1Db3VudF8oKSwKLSAgICAgICAgbm90XygpLAotICAgICAgICB0eXBlXygoMSA8PCBrVG90YWxTY2hlbWFUeXBlKSAtIDEpLCAvLyB0eXBlbGVzcwotICAgICAgICB2YWxpZGF0b3JDb3VudF8oKSwKLSAgICAgICAgcHJvcGVydGllc18oKSwKLSAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXNTY2hlbWFfKCksCi0gICAgICAgIHBhdHRlcm5Qcm9wZXJ0aWVzXygpLAotICAgICAgICBwYXR0ZXJuUHJvcGVydHlDb3VudF8oKSwKLSAgICAgICAgcHJvcGVydHlDb3VudF8oKSwKLSAgICAgICAgcmVxdWlyZWRDb3VudF8oKSwKLSAgICAgICAgbWluUHJvcGVydGllc18oKSwKLSAgICAgICAgbWF4UHJvcGVydGllc18oU2l6ZVR5cGUofjApKSwKLSAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXNfKHRydWUpLAotICAgICAgICBoYXNEZXBlbmRlbmNpZXNfKCksCi0gICAgICAgIGhhc1NjaGVtYURlcGVuZGVuY2llc18oKSwKLSAgICAgICAgYWRkaXRpb25hbEl0ZW1zU2NoZW1hXygpLAotICAgICAgICBpdGVtc0xpc3RfKCksCi0gICAgICAgIGl0ZW1zVHVwbGVfKCksCi0gICAgICAgIGl0ZW1zVHVwbGVDb3VudF8oKSwKLSAgICAgICAgbWluSXRlbXNfKCksCi0gICAgICAgIG1heEl0ZW1zXyhTaXplVHlwZSh+MCkpLAotICAgICAgICBhZGRpdGlvbmFsSXRlbXNfKHRydWUpLAotICAgICAgICB1bmlxdWVJdGVtc18oZmFsc2UpLAotICAgICAgICBwYXR0ZXJuXygpLAotICAgICAgICBtaW5MZW5ndGhfKDApLAotICAgICAgICBtYXhMZW5ndGhfKH5TaXplVHlwZSgwKSksCi0gICAgICAgIGV4Y2x1c2l2ZU1pbmltdW1fKGZhbHNlKSwKLSAgICAgICAgZXhjbHVzaXZlTWF4aW11bV8oZmFsc2UpCi0gICAgewotICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIFNjaGVtYURvY3VtZW50VHlwZTo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKLSAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBWYWx1ZVR5cGU6OkNvbnN0VmFsdWVJdGVyYXRvciBDb25zdFZhbHVlSXRlcmF0b3I7Ci0gICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVmFsdWVUeXBlOjpDb25zdE1lbWJlckl0ZXJhdG9yIENvbnN0TWVtYmVySXRlcmF0b3I7Ci0KLSAgICAgICAgaWYgKCF2YWx1ZS5Jc09iamVjdCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChjb25zdCBWYWx1ZVR5cGUqIHYgPSBHZXRNZW1iZXIodmFsdWUsIEdldFR5cGVTdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIHR5cGVfID0gMDsKLSAgICAgICAgICAgIGlmICh2LT5Jc1N0cmluZygpKQotICAgICAgICAgICAgICAgIEFkZFR5cGUoKnYpOwotICAgICAgICAgICAgZWxzZSBpZiAodi0+SXNBcnJheSgpKQotICAgICAgICAgICAgICAgIGZvciAoQ29uc3RWYWx1ZUl0ZXJhdG9yIGl0ciA9IHYtPkJlZ2luKCk7IGl0ciAhPSB2LT5FbmQoKTsgKytpdHIpCi0gICAgICAgICAgICAgICAgICAgIEFkZFR5cGUoKml0cik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29uc3QgVmFsdWVUeXBlKiB2ID0gR2V0TWVtYmVyKHZhbHVlLCBHZXRFbnVtU3RyaW5nKCkpKQotICAgICAgICAgICAgaWYgKHYtPklzQXJyYXkoKSAmJiB2LT5TaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZW51bV8gPSBzdGF0aWNfY2FzdDx1aW50NjRfdCo+KGFsbG9jYXRvcl8tPk1hbGxvYyhzaXplb2YodWludDY0X3QpICogdi0+U2l6ZSgpKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChDb25zdFZhbHVlSXRlcmF0b3IgaXRyID0gdi0+QmVnaW4oKTsgaXRyICE9IHYtPkVuZCgpOyArK2l0cikgewotICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIEhhc2hlcjxFbmNvZGluZ1R5cGUsIE1lbW9yeVBvb2xBbGxvY2F0b3I8PiA+IEVudW1IYXNoZXJUeXBlOwotICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyNTYgKyAyNF07Ci0gICAgICAgICAgICAgICAgICAgIE1lbW9yeVBvb2xBbGxvY2F0b3I8PiBoYXNoZXJBbGxvY2F0b3IoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIEVudW1IYXNoZXJUeXBlIGgoJmhhc2hlckFsbG9jYXRvciwgMjU2KTsKLSAgICAgICAgICAgICAgICAgICAgaXRyLT5BY2NlcHQoaCk7Ci0gICAgICAgICAgICAgICAgICAgIGVudW1fW2VudW1Db3VudF8rK10gPSBoLkdldEhhc2hDb2RlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIEFzc2lnbklmRXhpc3QoYWxsT2ZfLCAqc2NoZW1hRG9jdW1lbnQsIHAsIHZhbHVlLCBHZXRBbGxPZlN0cmluZygpLCBkb2N1bWVudCk7Ci0gICAgICAgIEFzc2lnbklmRXhpc3QoYW55T2ZfLCAqc2NoZW1hRG9jdW1lbnQsIHAsIHZhbHVlLCBHZXRBbnlPZlN0cmluZygpLCBkb2N1bWVudCk7Ci0gICAgICAgIEFzc2lnbklmRXhpc3Qob25lT2ZfLCAqc2NoZW1hRG9jdW1lbnQsIHAsIHZhbHVlLCBHZXRPbmVPZlN0cmluZygpLCBkb2N1bWVudCk7Ci0KLSAgICAgICAgaWYgKGNvbnN0IFZhbHVlVHlwZSogdiA9IEdldE1lbWJlcih2YWx1ZSwgR2V0Tm90U3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICBzY2hlbWFEb2N1bWVudC0+Q3JlYXRlU2NoZW1hKCZub3RfLCBwLkFwcGVuZChHZXROb3RTdHJpbmcoKSwgYWxsb2NhdG9yXyksICp2LCBkb2N1bWVudCk7Ci0gICAgICAgICAgICBub3RWYWxpZGF0b3JJbmRleF8gPSB2YWxpZGF0b3JDb3VudF87Ci0gICAgICAgICAgICB2YWxpZGF0b3JDb3VudF8rKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE9iamVjdAotCi0gICAgICAgIGNvbnN0IFZhbHVlVHlwZSogcHJvcGVydGllcyA9IEdldE1lbWJlcih2YWx1ZSwgR2V0UHJvcGVydGllc1N0cmluZygpKTsKLSAgICAgICAgY29uc3QgVmFsdWVUeXBlKiByZXF1aXJlZCA9IEdldE1lbWJlcih2YWx1ZSwgR2V0UmVxdWlyZWRTdHJpbmcoKSk7Ci0gICAgICAgIGNvbnN0IFZhbHVlVHlwZSogZGVwZW5kZW5jaWVzID0gR2V0TWVtYmVyKHZhbHVlLCBHZXREZXBlbmRlbmNpZXNTdHJpbmcoKSk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdhdGhlciBwcm9wZXJ0aWVzIGZyb20gcHJvcGVydGllcy9yZXF1aXJlZC9kZXBlbmRlbmNpZXMKLSAgICAgICAgICAgIFNWYWx1ZSBhbGxQcm9wZXJ0aWVzKGtBcnJheVR5cGUpOwotCi0gICAgICAgICAgICBpZiAocHJvcGVydGllcyAmJiBwcm9wZXJ0aWVzLT5Jc09iamVjdCgpKQotICAgICAgICAgICAgICAgIGZvciAoQ29uc3RNZW1iZXJJdGVyYXRvciBpdHIgPSBwcm9wZXJ0aWVzLT5NZW1iZXJCZWdpbigpOyBpdHIgIT0gcHJvcGVydGllcy0+TWVtYmVyRW5kKCk7ICsraXRyKQotICAgICAgICAgICAgICAgICAgICBBZGRVbmlxdWVFbGVtZW50KGFsbFByb3BlcnRpZXMsIGl0ci0+bmFtZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChyZXF1aXJlZCAmJiByZXF1aXJlZC0+SXNBcnJheSgpKQotICAgICAgICAgICAgICAgIGZvciAoQ29uc3RWYWx1ZUl0ZXJhdG9yIGl0ciA9IHJlcXVpcmVkLT5CZWdpbigpOyBpdHIgIT0gcmVxdWlyZWQtPkVuZCgpOyArK2l0cikKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ci0+SXNTdHJpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZFVuaXF1ZUVsZW1lbnQoYWxsUHJvcGVydGllcywgKml0cik7Ci0KLSAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMgJiYgZGVwZW5kZW5jaWVzLT5Jc09iamVjdCgpKQotICAgICAgICAgICAgICAgIGZvciAoQ29uc3RNZW1iZXJJdGVyYXRvciBpdHIgPSBkZXBlbmRlbmNpZXMtPk1lbWJlckJlZ2luKCk7IGl0ciAhPSBkZXBlbmRlbmNpZXMtPk1lbWJlckVuZCgpOyArK2l0cikgewotICAgICAgICAgICAgICAgICAgICBBZGRVbmlxdWVFbGVtZW50KGFsbFByb3BlcnRpZXMsIGl0ci0+bmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdHItPnZhbHVlLklzQXJyYXkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ29uc3RWYWx1ZUl0ZXJhdG9yIGkgPSBpdHItPnZhbHVlLkJlZ2luKCk7IGkgIT0gaXRyLT52YWx1ZS5FbmQoKTsgKytpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLT5Jc1N0cmluZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRVbmlxdWVFbGVtZW50KGFsbFByb3BlcnRpZXMsICppKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhbGxQcm9wZXJ0aWVzLlNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eUNvdW50XyA9IGFsbFByb3BlcnRpZXMuU2l6ZSgpOwotICAgICAgICAgICAgICAgIHByb3BlcnRpZXNfID0gc3RhdGljX2Nhc3Q8UHJvcGVydHkqPihhbGxvY2F0b3JfLT5NYWxsb2Moc2l6ZW9mKFByb3BlcnR5KSAqIHByb3BlcnR5Q291bnRfKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChTaXplVHlwZSBpID0gMDsgaSA8IHByb3BlcnR5Q291bnRfOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3ICgmcHJvcGVydGllc19baV0pIFByb3BlcnR5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNfW2ldLm5hbWUgPSBhbGxQcm9wZXJ0aWVzW2ldOwotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzX1tpXS5zY2hlbWEgPSBHZXRUeXBlbGVzcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMtPklzT2JqZWN0KCkpIHsKLSAgICAgICAgICAgIFBvaW50ZXJUeXBlIHEgPSBwLkFwcGVuZChHZXRQcm9wZXJ0aWVzU3RyaW5nKCksIGFsbG9jYXRvcl8pOwotICAgICAgICAgICAgZm9yIChDb25zdE1lbWJlckl0ZXJhdG9yIGl0ciA9IHByb3BlcnRpZXMtPk1lbWJlckJlZ2luKCk7IGl0ciAhPSBwcm9wZXJ0aWVzLT5NZW1iZXJFbmQoKTsgKytpdHIpIHsKLSAgICAgICAgICAgICAgICBTaXplVHlwZSBpbmRleDsKLSAgICAgICAgICAgICAgICBpZiAoRmluZFByb3BlcnR5SW5kZXgoaXRyLT5uYW1lLCAmaW5kZXgpKQotICAgICAgICAgICAgICAgICAgICBzY2hlbWFEb2N1bWVudC0+Q3JlYXRlU2NoZW1hKCZwcm9wZXJ0aWVzX1tpbmRleF0uc2NoZW1hLCBxLkFwcGVuZChpdHItPm5hbWUsIGFsbG9jYXRvcl8pLCBpdHItPnZhbHVlLCBkb2N1bWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29uc3QgVmFsdWVUeXBlKiB2ID0gR2V0TWVtYmVyKHZhbHVlLCBHZXRQYXR0ZXJuUHJvcGVydGllc1N0cmluZygpKSkgewotICAgICAgICAgICAgUG9pbnRlclR5cGUgcSA9IHAuQXBwZW5kKEdldFBhdHRlcm5Qcm9wZXJ0aWVzU3RyaW5nKCksIGFsbG9jYXRvcl8pOwotICAgICAgICAgICAgcGF0dGVyblByb3BlcnRpZXNfID0gc3RhdGljX2Nhc3Q8UGF0dGVyblByb3BlcnR5Kj4oYWxsb2NhdG9yXy0+TWFsbG9jKHNpemVvZihQYXR0ZXJuUHJvcGVydHkpICogdi0+TWVtYmVyQ291bnQoKSkpOwotICAgICAgICAgICAgcGF0dGVyblByb3BlcnR5Q291bnRfID0gMDsKLQotICAgICAgICAgICAgZm9yIChDb25zdE1lbWJlckl0ZXJhdG9yIGl0ciA9IHYtPk1lbWJlckJlZ2luKCk7IGl0ciAhPSB2LT5NZW1iZXJFbmQoKTsgKytpdHIpIHsKLSAgICAgICAgICAgICAgICBuZXcgKCZwYXR0ZXJuUHJvcGVydGllc19bcGF0dGVyblByb3BlcnR5Q291bnRfXSkgUGF0dGVyblByb3BlcnR5KCk7Ci0gICAgICAgICAgICAgICAgcGF0dGVyblByb3BlcnRpZXNfW3BhdHRlcm5Qcm9wZXJ0eUNvdW50X10ucGF0dGVybiA9IENyZWF0ZVBhdHRlcm4oaXRyLT5uYW1lKTsKLSAgICAgICAgICAgICAgICBzY2hlbWFEb2N1bWVudC0+Q3JlYXRlU2NoZW1hKCZwYXR0ZXJuUHJvcGVydGllc19bcGF0dGVyblByb3BlcnR5Q291bnRfXS5zY2hlbWEsIHEuQXBwZW5kKGl0ci0+bmFtZSwgYWxsb2NhdG9yXyksIGl0ci0+dmFsdWUsIGRvY3VtZW50KTsKLSAgICAgICAgICAgICAgICBwYXR0ZXJuUHJvcGVydHlDb3VudF8rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXF1aXJlZCAmJiByZXF1aXJlZC0+SXNBcnJheSgpKQotICAgICAgICAgICAgZm9yIChDb25zdFZhbHVlSXRlcmF0b3IgaXRyID0gcmVxdWlyZWQtPkJlZ2luKCk7IGl0ciAhPSByZXF1aXJlZC0+RW5kKCk7ICsraXRyKQotICAgICAgICAgICAgICAgIGlmIChpdHItPklzU3RyaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2l6ZVR5cGUgaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChGaW5kUHJvcGVydHlJbmRleCgqaXRyLCAmaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzX1tpbmRleF0ucmVxdWlyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDb3VudF8rKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBpZiAoZGVwZW5kZW5jaWVzICYmIGRlcGVuZGVuY2llcy0+SXNPYmplY3QoKSkgewotICAgICAgICAgICAgUG9pbnRlclR5cGUgcSA9IHAuQXBwZW5kKEdldERlcGVuZGVuY2llc1N0cmluZygpLCBhbGxvY2F0b3JfKTsKLSAgICAgICAgICAgIGhhc0RlcGVuZGVuY2llc18gPSB0cnVlOwotICAgICAgICAgICAgZm9yIChDb25zdE1lbWJlckl0ZXJhdG9yIGl0ciA9IGRlcGVuZGVuY2llcy0+TWVtYmVyQmVnaW4oKTsgaXRyICE9IGRlcGVuZGVuY2llcy0+TWVtYmVyRW5kKCk7ICsraXRyKSB7Ci0gICAgICAgICAgICAgICAgU2l6ZVR5cGUgc291cmNlSW5kZXg7Ci0gICAgICAgICAgICAgICAgaWYgKEZpbmRQcm9wZXJ0eUluZGV4KGl0ci0+bmFtZSwgJnNvdXJjZUluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXRyLT52YWx1ZS5Jc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNfW3NvdXJjZUluZGV4XS5kZXBlbmRlbmNpZXMgPSBzdGF0aWNfY2FzdDxib29sKj4oYWxsb2NhdG9yXy0+TWFsbG9jKHNpemVvZihib29sKSAqIHByb3BlcnR5Q291bnRfKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbXNldChwcm9wZXJ0aWVzX1tzb3VyY2VJbmRleF0uZGVwZW5kZW5jaWVzLCAwLCBzaXplb2YoYm9vbCkqIHByb3BlcnR5Q291bnRfKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ29uc3RWYWx1ZUl0ZXJhdG9yIHRhcmdldEl0ciA9IGl0ci0+dmFsdWUuQmVnaW4oKTsgdGFyZ2V0SXRyICE9IGl0ci0+dmFsdWUuRW5kKCk7ICsrdGFyZ2V0SXRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZVR5cGUgdGFyZ2V0SW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZpbmRQcm9wZXJ0eUluZGV4KCp0YXJnZXRJdHIsICZ0YXJnZXRJbmRleCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNfW3NvdXJjZUluZGV4XS5kZXBlbmRlbmNpZXNbdGFyZ2V0SW5kZXhdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdHItPnZhbHVlLklzT2JqZWN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc1NjaGVtYURlcGVuZGVuY2llc18gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hRG9jdW1lbnQtPkNyZWF0ZVNjaGVtYSgmcHJvcGVydGllc19bc291cmNlSW5kZXhdLmRlcGVuZGVuY2llc1NjaGVtYSwgcS5BcHBlbmQoaXRyLT5uYW1lLCBhbGxvY2F0b3JfKSwgaXRyLT52YWx1ZSwgZG9jdW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc19bc291cmNlSW5kZXhdLmRlcGVuZGVuY2llc1ZhbGlkYXRvckluZGV4ID0gdmFsaWRhdG9yQ291bnRfOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yQ291bnRfKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29uc3QgVmFsdWVUeXBlKiB2ID0gR2V0TWVtYmVyKHZhbHVlLCBHZXRBZGRpdGlvbmFsUHJvcGVydGllc1N0cmluZygpKSkgewotICAgICAgICAgICAgaWYgKHYtPklzQm9vbCgpKQotICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzXyA9IHYtPkdldEJvb2woKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHYtPklzT2JqZWN0KCkpCi0gICAgICAgICAgICAgICAgc2NoZW1hRG9jdW1lbnQtPkNyZWF0ZVNjaGVtYSgmYWRkaXRpb25hbFByb3BlcnRpZXNTY2hlbWFfLCBwLkFwcGVuZChHZXRBZGRpdGlvbmFsUHJvcGVydGllc1N0cmluZygpLCBhbGxvY2F0b3JfKSwgKnYsIGRvY3VtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIEFzc2lnbklmRXhpc3QobWluUHJvcGVydGllc18sIHZhbHVlLCBHZXRNaW5Qcm9wZXJ0aWVzU3RyaW5nKCkpOwotICAgICAgICBBc3NpZ25JZkV4aXN0KG1heFByb3BlcnRpZXNfLCB2YWx1ZSwgR2V0TWF4UHJvcGVydGllc1N0cmluZygpKTsKLQotICAgICAgICAvLyBBcnJheQotICAgICAgICBpZiAoY29uc3QgVmFsdWVUeXBlKiB2ID0gR2V0TWVtYmVyKHZhbHVlLCBHZXRJdGVtc1N0cmluZygpKSkgewotICAgICAgICAgICAgUG9pbnRlclR5cGUgcSA9IHAuQXBwZW5kKEdldEl0ZW1zU3RyaW5nKCksIGFsbG9jYXRvcl8pOwotICAgICAgICAgICAgaWYgKHYtPklzT2JqZWN0KCkpIC8vIExpc3QgdmFsaWRhdGlvbgotICAgICAgICAgICAgICAgIHNjaGVtYURvY3VtZW50LT5DcmVhdGVTY2hlbWEoJml0ZW1zTGlzdF8sIHEsICp2LCBkb2N1bWVudCk7Ci0gICAgICAgICAgICBlbHNlIGlmICh2LT5Jc0FycmF5KCkpIHsgLy8gVHVwbGUgdmFsaWRhdGlvbgotICAgICAgICAgICAgICAgIGl0ZW1zVHVwbGVfID0gc3RhdGljX2Nhc3Q8Y29uc3QgU2NoZW1hKio+KGFsbG9jYXRvcl8tPk1hbGxvYyhzaXplb2YoY29uc3QgU2NoZW1hKikgKiB2LT5TaXplKCkpKTsKLSAgICAgICAgICAgICAgICBTaXplVHlwZSBpbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChDb25zdFZhbHVlSXRlcmF0b3IgaXRyID0gdi0+QmVnaW4oKTsgaXRyICE9IHYtPkVuZCgpOyArK2l0ciwgaW5kZXgrKykKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hRG9jdW1lbnQtPkNyZWF0ZVNjaGVtYSgmaXRlbXNUdXBsZV9baXRlbXNUdXBsZUNvdW50XysrXSwgcS5BcHBlbmQoaW5kZXgsIGFsbG9jYXRvcl8pLCAqaXRyLCBkb2N1bWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBc3NpZ25JZkV4aXN0KG1pbkl0ZW1zXywgdmFsdWUsIEdldE1pbkl0ZW1zU3RyaW5nKCkpOwotICAgICAgICBBc3NpZ25JZkV4aXN0KG1heEl0ZW1zXywgdmFsdWUsIEdldE1heEl0ZW1zU3RyaW5nKCkpOwotCi0gICAgICAgIGlmIChjb25zdCBWYWx1ZVR5cGUqIHYgPSBHZXRNZW1iZXIodmFsdWUsIEdldEFkZGl0aW9uYWxJdGVtc1N0cmluZygpKSkgewotICAgICAgICAgICAgaWYgKHYtPklzQm9vbCgpKQotICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxJdGVtc18gPSB2LT5HZXRCb29sKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICh2LT5Jc09iamVjdCgpKQotICAgICAgICAgICAgICAgIHNjaGVtYURvY3VtZW50LT5DcmVhdGVTY2hlbWEoJmFkZGl0aW9uYWxJdGVtc1NjaGVtYV8sIHAuQXBwZW5kKEdldEFkZGl0aW9uYWxJdGVtc1N0cmluZygpLCBhbGxvY2F0b3JfKSwgKnYsIGRvY3VtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIEFzc2lnbklmRXhpc3QodW5pcXVlSXRlbXNfLCB2YWx1ZSwgR2V0VW5pcXVlSXRlbXNTdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gU3RyaW5nCi0gICAgICAgIEFzc2lnbklmRXhpc3QobWluTGVuZ3RoXywgdmFsdWUsIEdldE1pbkxlbmd0aFN0cmluZygpKTsKLSAgICAgICAgQXNzaWduSWZFeGlzdChtYXhMZW5ndGhfLCB2YWx1ZSwgR2V0TWF4TGVuZ3RoU3RyaW5nKCkpOwotCi0gICAgICAgIGlmIChjb25zdCBWYWx1ZVR5cGUqIHYgPSBHZXRNZW1iZXIodmFsdWUsIEdldFBhdHRlcm5TdHJpbmcoKSkpCi0gICAgICAgICAgICBwYXR0ZXJuXyA9IENyZWF0ZVBhdHRlcm4oKnYpOwotCi0gICAgICAgIC8vIE51bWJlcgotICAgICAgICBpZiAoY29uc3QgVmFsdWVUeXBlKiB2ID0gR2V0TWVtYmVyKHZhbHVlLCBHZXRNaW5pbXVtU3RyaW5nKCkpKQotICAgICAgICAgICAgaWYgKHYtPklzTnVtYmVyKCkpCi0gICAgICAgICAgICAgICAgbWluaW11bV8uQ29weUZyb20oKnYsICphbGxvY2F0b3JfKTsKLQotICAgICAgICBpZiAoY29uc3QgVmFsdWVUeXBlKiB2ID0gR2V0TWVtYmVyKHZhbHVlLCBHZXRNYXhpbXVtU3RyaW5nKCkpKQotICAgICAgICAgICAgaWYgKHYtPklzTnVtYmVyKCkpCi0gICAgICAgICAgICAgICAgbWF4aW11bV8uQ29weUZyb20oKnYsICphbGxvY2F0b3JfKTsKLQotICAgICAgICBBc3NpZ25JZkV4aXN0KGV4Y2x1c2l2ZU1pbmltdW1fLCB2YWx1ZSwgR2V0RXhjbHVzaXZlTWluaW11bVN0cmluZygpKTsKLSAgICAgICAgQXNzaWduSWZFeGlzdChleGNsdXNpdmVNYXhpbXVtXywgdmFsdWUsIEdldEV4Y2x1c2l2ZU1heGltdW1TdHJpbmcoKSk7Ci0KLSAgICAgICAgaWYgKGNvbnN0IFZhbHVlVHlwZSogdiA9IEdldE1lbWJlcih2YWx1ZSwgR2V0TXVsdGlwbGVPZlN0cmluZygpKSkKLSAgICAgICAgICAgIGlmICh2LT5Jc051bWJlcigpICYmIHYtPkdldERvdWJsZSgpID4gMC4wKQotICAgICAgICAgICAgICAgIG11bHRpcGxlT2ZfLkNvcHlGcm9tKCp2LCAqYWxsb2NhdG9yXyk7Ci0gICAgfQotCi0gICAgflNjaGVtYSgpIHsKLSAgICAgICAgYWxsb2NhdG9yXy0+RnJlZShlbnVtXyk7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzXykgewotICAgICAgICAgICAgZm9yIChTaXplVHlwZSBpID0gMDsgaSA8IHByb3BlcnR5Q291bnRfOyBpKyspCi0gICAgICAgICAgICAgICAgcHJvcGVydGllc19baV0uflByb3BlcnR5KCk7Ci0gICAgICAgICAgICBBbGxvY2F0b3JUeXBlOjpGcmVlKHByb3BlcnRpZXNfKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGF0dGVyblByb3BlcnRpZXNfKSB7Ci0gICAgICAgICAgICBmb3IgKFNpemVUeXBlIGkgPSAwOyBpIDwgcGF0dGVyblByb3BlcnR5Q291bnRfOyBpKyspCi0gICAgICAgICAgICAgICAgcGF0dGVyblByb3BlcnRpZXNfW2ldLn5QYXR0ZXJuUHJvcGVydHkoKTsKLSAgICAgICAgICAgIEFsbG9jYXRvclR5cGU6OkZyZWUocGF0dGVyblByb3BlcnRpZXNfKTsKLSAgICAgICAgfQotICAgICAgICBBbGxvY2F0b3JUeXBlOjpGcmVlKGl0ZW1zVHVwbGVfKTsKLSNpZiBSQVBJREpTT05fU0NIRU1BX0hBU19SRUdFWAotICAgICAgICBpZiAocGF0dGVybl8pIHsKLSAgICAgICAgICAgIHBhdHRlcm5fLT5+UmVnZXhUeXBlKCk7Ci0gICAgICAgICAgICBhbGxvY2F0b3JfLT5GcmVlKHBhdHRlcm5fKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gICAgYm9vbCBCZWdpblZhbHVlKENvbnRleHQmIGNvbnRleHQpIGNvbnN0IHsKLSAgICAgICAgaWYgKGNvbnRleHQuaW5BcnJheSkgewotICAgICAgICAgICAgaWYgKHVuaXF1ZUl0ZW1zXykKLSAgICAgICAgICAgICAgICBjb250ZXh0LnZhbHVlVW5pcXVlbmVzcyA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChpdGVtc0xpc3RfKQotICAgICAgICAgICAgICAgIGNvbnRleHQudmFsdWVTY2hlbWEgPSBpdGVtc0xpc3RfOwotICAgICAgICAgICAgZWxzZSBpZiAoaXRlbXNUdXBsZV8pIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5hcnJheUVsZW1lbnRJbmRleCA8IGl0ZW1zVHVwbGVDb3VudF8pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudmFsdWVTY2hlbWEgPSBpdGVtc1R1cGxlX1tjb250ZXh0LmFycmF5RWxlbWVudEluZGV4XTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGRpdGlvbmFsSXRlbXNTY2hlbWFfKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnZhbHVlU2NoZW1hID0gYWRkaXRpb25hbEl0ZW1zU2NoZW1hXzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGRpdGlvbmFsSXRlbXNfKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnZhbHVlU2NoZW1hID0gR2V0VHlwZWxlc3MoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldEl0ZW1zU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNvbnRleHQudmFsdWVTY2hlbWEgPSBHZXRUeXBlbGVzcygpOwotCi0gICAgICAgICAgICBjb250ZXh0LmFycmF5RWxlbWVudEluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIGJvb2wgRW5kVmFsdWUoQ29udGV4dCYgY29udGV4dCkgY29uc3QgewotICAgICAgICBpZiAoY29udGV4dC5wYXR0ZXJuUHJvcGVydGllc1ZhbGlkYXRvckNvdW50ID4gMCkgewotICAgICAgICAgICAgYm9vbCBvdGhlclZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBTaXplVHlwZSBjb3VudCA9IGNvbnRleHQucGF0dGVyblByb3BlcnRpZXNWYWxpZGF0b3JDb3VudDsKLSAgICAgICAgICAgIGlmIChjb250ZXh0Lm9iamVjdFBhdHRlcm5WYWxpZGF0b3JUeXBlICE9IENvbnRleHQ6OmtQYXR0ZXJuVmFsaWRhdG9yT25seSkKLSAgICAgICAgICAgICAgICBvdGhlclZhbGlkID0gY29udGV4dC5wYXR0ZXJuUHJvcGVydGllc1ZhbGlkYXRvcnNbLS1jb3VudF0tPklzVmFsaWQoKTsKLQotICAgICAgICAgICAgYm9vbCBwYXR0ZXJuVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChTaXplVHlwZSBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LnBhdHRlcm5Qcm9wZXJ0aWVzVmFsaWRhdG9yc1tpXS0+SXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5WYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb250ZXh0Lm9iamVjdFBhdHRlcm5WYWxpZGF0b3JUeXBlID09IENvbnRleHQ6OmtQYXR0ZXJuVmFsaWRhdG9yT25seSkgewotICAgICAgICAgICAgICAgIGlmICghcGF0dGVyblZhbGlkKQotICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXRQYXR0ZXJuUHJvcGVydGllc1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRleHQub2JqZWN0UGF0dGVyblZhbGlkYXRvclR5cGUgPT0gQ29udGV4dDo6a1BhdHRlcm5WYWxpZGF0b3JXaXRoUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBhdHRlcm5WYWxpZCB8fCAhb3RoZXJWYWxpZCkKLSAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0UGF0dGVyblByb3BlcnRpZXNTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghcGF0dGVyblZhbGlkICYmICFvdGhlclZhbGlkKSAvLyBrUGF0dGVyblZhbGlkYXRvcldpdGhBZGRpdGlvbmFsUHJvcGVydHkpCi0gICAgICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0UGF0dGVyblByb3BlcnRpZXNTdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW51bV8pIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IGggPSBjb250ZXh0LmZhY3RvcnkuR2V0SGFzaENvZGUoY29udGV4dC5oYXNoZXIpOwotICAgICAgICAgICAgZm9yIChTaXplVHlwZSBpID0gMDsgaSA8IGVudW1Db3VudF87IGkrKykKLSAgICAgICAgICAgICAgICBpZiAoZW51bV9baV0gPT0gaCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZEVudW07Ci0gICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXRFbnVtU3RyaW5nKCkpOwotICAgICAgICAgICAgZm91bmRFbnVtOjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhbGxPZl8uc2NoZW1hcykKLSAgICAgICAgICAgIGZvciAoU2l6ZVR5cGUgaSA9IGFsbE9mXy5iZWdpbjsgaSA8IGFsbE9mXy5iZWdpbiArIGFsbE9mXy5jb3VudDsgaSsrKQotICAgICAgICAgICAgICAgIGlmICghY29udGV4dC52YWxpZGF0b3JzW2ldLT5Jc1ZhbGlkKCkpCi0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldEFsbE9mU3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGFueU9mXy5zY2hlbWFzKSB7Ci0gICAgICAgICAgICBmb3IgKFNpemVUeXBlIGkgPSBhbnlPZl8uYmVnaW47IGkgPCBhbnlPZl8uYmVnaW4gKyBhbnlPZl8uY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dC52YWxpZGF0b3JzW2ldLT5Jc1ZhbGlkKCkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmRBbnk7Ci0gICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXRBbnlPZlN0cmluZygpKTsKLSAgICAgICAgICAgIGZvdW5kQW55OjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvbmVPZl8uc2NoZW1hcykgewotICAgICAgICAgICAgYm9vbCBvbmVWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChTaXplVHlwZSBpID0gb25lT2ZfLmJlZ2luOyBpIDwgb25lT2ZfLmJlZ2luICsgb25lT2ZfLmNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudmFsaWRhdG9yc1tpXS0+SXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvbmVWYWxpZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldE9uZU9mU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBvbmVWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFvbmVWYWxpZCkKLSAgICAgICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXRPbmVPZlN0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChub3RfICYmIGNvbnRleHQudmFsaWRhdG9yc1tub3RWYWxpZGF0b3JJbmRleF9dLT5Jc1ZhbGlkKCkpCi0gICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXROb3RTdHJpbmcoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBOdWxsKENvbnRleHQmIGNvbnRleHQpIGNvbnN0IHsgCi0gICAgICAgIGlmICghKHR5cGVfICYgKDEgPDwga051bGxTY2hlbWFUeXBlKSkpCi0gICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXRUeXBlU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gQ3JlYXRlUGFyYWxsZWxWYWxpZGF0b3IoY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIGJvb2wgQm9vbChDb250ZXh0JiBjb250ZXh0LCBib29sKSBjb25zdCB7IAotICAgICAgICBpZiAoISh0eXBlXyAmICgxIDw8IGtCb29sZWFuU2NoZW1hVHlwZSkpKQotICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0VHlwZVN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIENyZWF0ZVBhcmFsbGVsVmFsaWRhdG9yKGNvbnRleHQpOwotICAgIH0KLQotICAgIGJvb2wgSW50KENvbnRleHQmIGNvbnRleHQsIGludCBpKSBjb25zdCB7Ci0gICAgICAgIGlmICghQ2hlY2tJbnQoY29udGV4dCwgaSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBDcmVhdGVQYXJhbGxlbFZhbGlkYXRvcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBib29sIFVpbnQoQ29udGV4dCYgY29udGV4dCwgdW5zaWduZWQgdSkgY29uc3QgewotICAgICAgICBpZiAoIUNoZWNrVWludChjb250ZXh0LCB1KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIENyZWF0ZVBhcmFsbGVsVmFsaWRhdG9yKGNvbnRleHQpOwotICAgIH0KLQotICAgIGJvb2wgSW50NjQoQ29udGV4dCYgY29udGV4dCwgaW50NjRfdCBpKSBjb25zdCB7Ci0gICAgICAgIGlmICghQ2hlY2tJbnQoY29udGV4dCwgaSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBDcmVhdGVQYXJhbGxlbFZhbGlkYXRvcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBib29sIFVpbnQ2NChDb250ZXh0JiBjb250ZXh0LCB1aW50NjRfdCB1KSBjb25zdCB7Ci0gICAgICAgIGlmICghQ2hlY2tVaW50KGNvbnRleHQsIHUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gQ3JlYXRlUGFyYWxsZWxWYWxpZGF0b3IoY29udGV4dCk7Ci0gICAgfQotCi0gICAgYm9vbCBEb3VibGUoQ29udGV4dCYgY29udGV4dCwgZG91YmxlIGQpIGNvbnN0IHsKLSAgICAgICAgaWYgKCEodHlwZV8gJiAoMSA8PCBrTnVtYmVyU2NoZW1hVHlwZSkpKQotICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0VHlwZVN0cmluZygpKTsKLQotICAgICAgICBpZiAoIW1pbmltdW1fLklzTnVsbCgpICYmICFDaGVja0RvdWJsZU1pbmltdW0oY29udGV4dCwgZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFtYXhpbXVtXy5Jc051bGwoKSAmJiAhQ2hlY2tEb3VibGVNYXhpbXVtKGNvbnRleHQsIGQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYgKCFtdWx0aXBsZU9mXy5Jc051bGwoKSAmJiAhQ2hlY2tEb3VibGVNdWx0aXBsZU9mKGNvbnRleHQsIGQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIENyZWF0ZVBhcmFsbGVsVmFsaWRhdG9yKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBib29sIFN0cmluZyhDb250ZXh0JiBjb250ZXh0LCBjb25zdCBDaCogc3RyLCBTaXplVHlwZSBsZW5ndGgsIGJvb2wpIGNvbnN0IHsKLSAgICAgICAgaWYgKCEodHlwZV8gJiAoMSA8PCBrU3RyaW5nU2NoZW1hVHlwZSkpKQotICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0VHlwZVN0cmluZygpKTsKLQotICAgICAgICBpZiAobWluTGVuZ3RoXyAhPSAwIHx8IG1heExlbmd0aF8gIT0gU2l6ZVR5cGUofjApKSB7Ci0gICAgICAgICAgICBTaXplVHlwZSBjb3VudDsKLSAgICAgICAgICAgIGlmIChpbnRlcm5hbDo6Q291bnRTdHJpbmdDb2RlUG9pbnQ8RW5jb2RpbmdUeXBlPihzdHIsIGxlbmd0aCwgJmNvdW50KSkgewotICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IG1pbkxlbmd0aF8pCi0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldE1pbkxlbmd0aFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBtYXhMZW5ndGhfKQotICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXRNYXhMZW5ndGhTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGF0dGVybl8gJiYgIUlzUGF0dGVybk1hdGNoKHBhdHRlcm5fLCBzdHIsIGxlbmd0aCkpCi0gICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXRQYXR0ZXJuU3RyaW5nKCkpOwotCi0gICAgICAgIHJldHVybiBDcmVhdGVQYXJhbGxlbFZhbGlkYXRvcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBib29sIFN0YXJ0T2JqZWN0KENvbnRleHQmIGNvbnRleHQpIGNvbnN0IHsgCi0gICAgICAgIGlmICghKHR5cGVfICYgKDEgPDwga09iamVjdFNjaGVtYVR5cGUpKSkKLSAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldFR5cGVTdHJpbmcoKSk7Ci0KLSAgICAgICAgY29udGV4dC5vYmplY3RSZXF1aXJlZENvdW50ID0gMDsKLSAgICAgICAgaWYgKGhhc0RlcGVuZGVuY2llc18pIHsKLSAgICAgICAgICAgIGNvbnRleHQub2JqZWN0RGVwZW5kZW5jaWVzID0gc3RhdGljX2Nhc3Q8Ym9vbCo+KGNvbnRleHQuZmFjdG9yeS5NYWxsb2NTdGF0ZShzaXplb2YoYm9vbCkgKiBwcm9wZXJ0eUNvdW50XykpOwotICAgICAgICAgICAgc3RkOjptZW1zZXQoY29udGV4dC5vYmplY3REZXBlbmRlbmNpZXMsIDAsIHNpemVvZihib29sKSAqIHByb3BlcnR5Q291bnRfKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXR0ZXJuUHJvcGVydGllc18pIHsgLy8gcHJlLWFsbG9jYXRlIHNjaGVtYSBhcnJheQotICAgICAgICAgICAgU2l6ZVR5cGUgY291bnQgPSBwYXR0ZXJuUHJvcGVydHlDb3VudF8gKyAxOyAvLyBleHRyYSBmb3IgdmFsdWVQYXR0ZXJuVmFsaWRhdG9yVHlwZQotICAgICAgICAgICAgY29udGV4dC5wYXR0ZXJuUHJvcGVydGllc1NjaGVtYXMgPSBzdGF0aWNfY2FzdDxjb25zdCBTY2hlbWFUeXBlKio+KGNvbnRleHQuZmFjdG9yeS5NYWxsb2NTdGF0ZShzaXplb2YoY29uc3QgU2NoZW1hVHlwZSopICogY291bnQpKTsKLSAgICAgICAgICAgIGNvbnRleHQucGF0dGVyblByb3BlcnRpZXNTY2hlbWFDb3VudCA9IDA7Ci0gICAgICAgICAgICBzdGQ6Om1lbXNldChjb250ZXh0LnBhdHRlcm5Qcm9wZXJ0aWVzU2NoZW1hcywgMCwgc2l6ZW9mKFNjaGVtYVR5cGUqKSAqIGNvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDcmVhdGVQYXJhbGxlbFZhbGlkYXRvcihjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCBLZXkoQ29udGV4dCYgY29udGV4dCwgY29uc3QgQ2gqIHN0ciwgU2l6ZVR5cGUgbGVuLCBib29sKSBjb25zdCB7Ci0gICAgICAgIGlmIChwYXR0ZXJuUHJvcGVydGllc18pIHsKLSAgICAgICAgICAgIGNvbnRleHQucGF0dGVyblByb3BlcnRpZXNTY2hlbWFDb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKFNpemVUeXBlIGkgPSAwOyBpIDwgcGF0dGVyblByb3BlcnR5Q291bnRfOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5Qcm9wZXJ0aWVzX1tpXS5wYXR0ZXJuICYmIElzUGF0dGVybk1hdGNoKHBhdHRlcm5Qcm9wZXJ0aWVzX1tpXS5wYXR0ZXJuLCBzdHIsIGxlbikpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucGF0dGVyblByb3BlcnRpZXNTY2hlbWFzW2NvbnRleHQucGF0dGVyblByb3BlcnRpZXNTY2hlbWFDb3VudCsrXSA9IHBhdHRlcm5Qcm9wZXJ0aWVzX1tpXS5zY2hlbWE7Ci0gICAgICAgIH0KLQotICAgICAgICBTaXplVHlwZSBpbmRleDsKLSAgICAgICAgaWYgKEZpbmRQcm9wZXJ0eUluZGV4KFZhbHVlVHlwZShzdHIsIGxlbikuTW92ZSgpLCAmaW5kZXgpKSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5wYXR0ZXJuUHJvcGVydGllc1NjaGVtYUNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQucGF0dGVyblByb3BlcnRpZXNTY2hlbWFzW2NvbnRleHQucGF0dGVyblByb3BlcnRpZXNTY2hlbWFDb3VudCsrXSA9IHByb3BlcnRpZXNfW2luZGV4XS5zY2hlbWE7Ci0gICAgICAgICAgICAgICAgY29udGV4dC52YWx1ZVNjaGVtYSA9IEdldFR5cGVsZXNzKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC52YWx1ZVBhdHRlcm5WYWxpZGF0b3JUeXBlID0gQ29udGV4dDo6a1BhdHRlcm5WYWxpZGF0b3JXaXRoUHJvcGVydHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29udGV4dC52YWx1ZVNjaGVtYSA9IHByb3BlcnRpZXNfW2luZGV4XS5zY2hlbWE7Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzX1tpbmRleF0ucmVxdWlyZWQpCi0gICAgICAgICAgICAgICAgY29udGV4dC5vYmplY3RSZXF1aXJlZENvdW50Kys7Ci0KLSAgICAgICAgICAgIGlmIChoYXNEZXBlbmRlbmNpZXNfKQotICAgICAgICAgICAgICAgIGNvbnRleHQub2JqZWN0RGVwZW5kZW5jaWVzW2luZGV4XSA9IHRydWU7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFkZGl0aW9uYWxQcm9wZXJ0aWVzU2NoZW1hXykgewotICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxQcm9wZXJ0aWVzU2NoZW1hXyAmJiBjb250ZXh0LnBhdHRlcm5Qcm9wZXJ0aWVzU2NoZW1hQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5wYXR0ZXJuUHJvcGVydGllc1NjaGVtYXNbY29udGV4dC5wYXR0ZXJuUHJvcGVydGllc1NjaGVtYUNvdW50KytdID0gYWRkaXRpb25hbFByb3BlcnRpZXNTY2hlbWFfOwotICAgICAgICAgICAgICAgIGNvbnRleHQudmFsdWVTY2hlbWEgPSBHZXRUeXBlbGVzcygpOwotICAgICAgICAgICAgICAgIGNvbnRleHQudmFsdWVQYXR0ZXJuVmFsaWRhdG9yVHlwZSA9IENvbnRleHQ6OmtQYXR0ZXJuVmFsaWRhdG9yV2l0aEFkZGl0aW9uYWxQcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb250ZXh0LnZhbHVlU2NoZW1hID0gYWRkaXRpb25hbFByb3BlcnRpZXNTY2hlbWFfOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYWRkaXRpb25hbFByb3BlcnRpZXNfKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnZhbHVlU2NoZW1hID0gR2V0VHlwZWxlc3MoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRleHQucGF0dGVyblByb3BlcnRpZXNTY2hlbWFDb3VudCA9PSAwKSAvLyBwYXR0ZXJuUHJvcGVydGllcyBhcmUgbm90IGFkZGl0aW9uYWwgcHJvcGVydGllcwotICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0QWRkaXRpb25hbFByb3BlcnRpZXNTdHJpbmcoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBFbmRPYmplY3QoQ29udGV4dCYgY29udGV4dCwgU2l6ZVR5cGUgbWVtYmVyQ291bnQpIGNvbnN0IHsKLSAgICAgICAgaWYgKGNvbnRleHQub2JqZWN0UmVxdWlyZWRDb3VudCAhPSByZXF1aXJlZENvdW50XykKLSAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldFJlcXVpcmVkU3RyaW5nKCkpOwotCi0gICAgICAgIGlmIChtZW1iZXJDb3VudCA8IG1pblByb3BlcnRpZXNfKQotICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0TWluUHJvcGVydGllc1N0cmluZygpKTsKLQotICAgICAgICBpZiAobWVtYmVyQ291bnQgPiBtYXhQcm9wZXJ0aWVzXykKLSAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldE1heFByb3BlcnRpZXNTdHJpbmcoKSk7Ci0KLSAgICAgICAgaWYgKGhhc0RlcGVuZGVuY2llc18pIHsKLSAgICAgICAgICAgIGZvciAoU2l6ZVR5cGUgc291cmNlSW5kZXggPSAwOyBzb3VyY2VJbmRleCA8IHByb3BlcnR5Q291bnRfOyBzb3VyY2VJbmRleCsrKQotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm9iamVjdERlcGVuZGVuY2llc1tzb3VyY2VJbmRleF0pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNfW3NvdXJjZUluZGV4XS5kZXBlbmRlbmNpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU2l6ZVR5cGUgdGFyZ2V0SW5kZXggPSAwOyB0YXJnZXRJbmRleCA8IHByb3BlcnR5Q291bnRfOyB0YXJnZXRJbmRleCsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzX1tzb3VyY2VJbmRleF0uZGVwZW5kZW5jaWVzW3RhcmdldEluZGV4XSAmJiAhY29udGV4dC5vYmplY3REZXBlbmRlbmNpZXNbdGFyZ2V0SW5kZXhdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXREZXBlbmRlbmNpZXNTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydGllc19bc291cmNlSW5kZXhdLmRlcGVuZGVuY2llc1NjaGVtYSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGV4dC52YWxpZGF0b3JzW3Byb3BlcnRpZXNfW3NvdXJjZUluZGV4XS5kZXBlbmRlbmNpZXNWYWxpZGF0b3JJbmRleF0tPklzVmFsaWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXREZXBlbmRlbmNpZXNTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBTdGFydEFycmF5KENvbnRleHQmIGNvbnRleHQpIGNvbnN0IHsgCi0gICAgICAgIGlmICghKHR5cGVfICYgKDEgPDwga0FycmF5U2NoZW1hVHlwZSkpKQotICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0VHlwZVN0cmluZygpKTsKLQotICAgICAgICBjb250ZXh0LmFycmF5RWxlbWVudEluZGV4ID0gMDsKLSAgICAgICAgY29udGV4dC5pbkFycmF5ID0gdHJ1ZTsKLQotICAgICAgICByZXR1cm4gQ3JlYXRlUGFyYWxsZWxWYWxpZGF0b3IoY29udGV4dCk7Ci0gICAgfQotCi0gICAgYm9vbCBFbmRBcnJheShDb250ZXh0JiBjb250ZXh0LCBTaXplVHlwZSBlbGVtZW50Q291bnQpIGNvbnN0IHsgCi0gICAgICAgIGNvbnRleHQuaW5BcnJheSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYgKGVsZW1lbnRDb3VudCA8IG1pbkl0ZW1zXykKLSAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldE1pbkl0ZW1zU3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGVsZW1lbnRDb3VudCA+IG1heEl0ZW1zXykKLSAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldE1heEl0ZW1zU3RyaW5nKCkpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIGZ1bmN0aW9ucyBmb3Igc3RyaW5nIGxpdGVyYWwgYWNjb3JkaW5nIHRvIENoCi0jZGVmaW5lIFJBUElESlNPTl9TVFJJTkdfKG5hbWUsIC4uLikgXAotICAgIHN0YXRpYyBjb25zdCBWYWx1ZVR5cGUmIEdldCMjbmFtZSMjU3RyaW5nKCkge1wKLSAgICAgICAgc3RhdGljIGNvbnN0IENoIHNbXSA9IHsgX19WQV9BUkdTX18sICdcMCcgfTtcCi0gICAgICAgIHN0YXRpYyBjb25zdCBWYWx1ZVR5cGUgdihzLCBzaXplb2YocykgLyBzaXplb2YoQ2gpIC0gMSk7XAotICAgICAgICByZXR1cm4gdjtcCi0gICAgfQotCi0gICAgUkFQSURKU09OX1NUUklOR18oTnVsbCwgJ24nLCAndScsICdsJywgJ2wnKQotICAgIFJBUElESlNPTl9TVFJJTkdfKEJvb2xlYW4sICdiJywgJ28nLCAnbycsICdsJywgJ2UnLCAnYScsICduJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhPYmplY3QsICdvJywgJ2InLCAnaicsICdlJywgJ2MnLCAndCcpCi0gICAgUkFQSURKU09OX1NUUklOR18oQXJyYXksICdhJywgJ3InLCAncicsICdhJywgJ3knKQotICAgIFJBUElESlNPTl9TVFJJTkdfKFN0cmluZywgJ3MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhOdW1iZXIsICduJywgJ3UnLCAnbScsICdiJywgJ2UnLCAncicpCi0gICAgUkFQSURKU09OX1NUUklOR18oSW50ZWdlciwgJ2knLCAnbicsICd0JywgJ2UnLCAnZycsICdlJywgJ3InKQotICAgIFJBUElESlNPTl9TVFJJTkdfKFR5cGUsICd0JywgJ3knLCAncCcsICdlJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhFbnVtLCAnZScsICduJywgJ3UnLCAnbScpCi0gICAgUkFQSURKU09OX1NUUklOR18oQWxsT2YsICdhJywgJ2wnLCAnbCcsICdPJywgJ2YnKQotICAgIFJBUElESlNPTl9TVFJJTkdfKEFueU9mLCAnYScsICduJywgJ3knLCAnTycsICdmJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhPbmVPZiwgJ28nLCAnbicsICdlJywgJ08nLCAnZicpCi0gICAgUkFQSURKU09OX1NUUklOR18oTm90LCAnbicsICdvJywgJ3QnKQotICAgIFJBUElESlNPTl9TVFJJTkdfKFByb3BlcnRpZXMsICdwJywgJ3InLCAnbycsICdwJywgJ2UnLCAncicsICd0JywgJ2knLCAnZScsICdzJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhSZXF1aXJlZCwgJ3InLCAnZScsICdxJywgJ3UnLCAnaScsICdyJywgJ2UnLCAnZCcpCi0gICAgUkFQSURKU09OX1NUUklOR18oRGVwZW5kZW5jaWVzLCAnZCcsICdlJywgJ3AnLCAnZScsICduJywgJ2QnLCAnZScsICduJywgJ2MnLCAnaScsICdlJywgJ3MnKQotICAgIFJBUElESlNPTl9TVFJJTkdfKFBhdHRlcm5Qcm9wZXJ0aWVzLCAncCcsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnbicsICdQJywgJ3InLCAnbycsICdwJywgJ2UnLCAncicsICd0JywgJ2knLCAnZScsICdzJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhBZGRpdGlvbmFsUHJvcGVydGllcywgJ2EnLCAnZCcsICdkJywgJ2knLCAndCcsICdpJywgJ28nLCAnbicsICdhJywgJ2wnLCAnUCcsICdyJywgJ28nLCAncCcsICdlJywgJ3InLCAndCcsICdpJywgJ2UnLCAncycpCi0gICAgUkFQSURKU09OX1NUUklOR18oTWluUHJvcGVydGllcywgJ20nLCAnaScsICduJywgJ1AnLCAncicsICdvJywgJ3AnLCAnZScsICdyJywgJ3QnLCAnaScsICdlJywgJ3MnKQotICAgIFJBUElESlNPTl9TVFJJTkdfKE1heFByb3BlcnRpZXMsICdtJywgJ2EnLCAneCcsICdQJywgJ3InLCAnbycsICdwJywgJ2UnLCAncicsICd0JywgJ2knLCAnZScsICdzJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhJdGVtcywgJ2knLCAndCcsICdlJywgJ20nLCAncycpCi0gICAgUkFQSURKU09OX1NUUklOR18oTWluSXRlbXMsICdtJywgJ2knLCAnbicsICdJJywgJ3QnLCAnZScsICdtJywgJ3MnKQotICAgIFJBUElESlNPTl9TVFJJTkdfKE1heEl0ZW1zLCAnbScsICdhJywgJ3gnLCAnSScsICd0JywgJ2UnLCAnbScsICdzJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhBZGRpdGlvbmFsSXRlbXMsICdhJywgJ2QnLCAnZCcsICdpJywgJ3QnLCAnaScsICdvJywgJ24nLCAnYScsICdsJywgJ0knLCAndCcsICdlJywgJ20nLCAncycpCi0gICAgUkFQSURKU09OX1NUUklOR18oVW5pcXVlSXRlbXMsICd1JywgJ24nLCAnaScsICdxJywgJ3UnLCAnZScsICdJJywgJ3QnLCAnZScsICdtJywgJ3MnKQotICAgIFJBUElESlNPTl9TVFJJTkdfKE1pbkxlbmd0aCwgJ20nLCAnaScsICduJywgJ0wnLCAnZScsICduJywgJ2cnLCAndCcsICdoJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhNYXhMZW5ndGgsICdtJywgJ2EnLCAneCcsICdMJywgJ2UnLCAnbicsICdnJywgJ3QnLCAnaCcpCi0gICAgUkFQSURKU09OX1NUUklOR18oUGF0dGVybiwgJ3AnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ24nKQotICAgIFJBUElESlNPTl9TVFJJTkdfKE1pbmltdW0sICdtJywgJ2knLCAnbicsICdpJywgJ20nLCAndScsICdtJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhNYXhpbXVtLCAnbScsICdhJywgJ3gnLCAnaScsICdtJywgJ3UnLCAnbScpCi0gICAgUkFQSURKU09OX1NUUklOR18oRXhjbHVzaXZlTWluaW11bSwgJ2UnLCAneCcsICdjJywgJ2wnLCAndScsICdzJywgJ2knLCAndicsICdlJywgJ00nLCAnaScsICduJywgJ2knLCAnbScsICd1JywgJ20nKQotICAgIFJBUElESlNPTl9TVFJJTkdfKEV4Y2x1c2l2ZU1heGltdW0sICdlJywgJ3gnLCAnYycsICdsJywgJ3UnLCAncycsICdpJywgJ3YnLCAnZScsICdNJywgJ2EnLCAneCcsICdpJywgJ20nLCAndScsICdtJykKLSAgICBSQVBJREpTT05fU1RSSU5HXyhNdWx0aXBsZU9mLCAnbScsICd1JywgJ2wnLCAndCcsICdpJywgJ3AnLCAnbCcsICdlJywgJ08nLCAnZicpCi0KLSN1bmRlZiBSQVBJREpTT05fU1RSSU5HXwotCi1wcml2YXRlOgotICAgIGVudW0gU2NoZW1hVmFsdWVUeXBlIHsKLSAgICAgICAga051bGxTY2hlbWFUeXBlLAotICAgICAgICBrQm9vbGVhblNjaGVtYVR5cGUsCi0gICAgICAgIGtPYmplY3RTY2hlbWFUeXBlLAotICAgICAgICBrQXJyYXlTY2hlbWFUeXBlLAotICAgICAgICBrU3RyaW5nU2NoZW1hVHlwZSwKLSAgICAgICAga051bWJlclNjaGVtYVR5cGUsCi0gICAgICAgIGtJbnRlZ2VyU2NoZW1hVHlwZSwKLSAgICAgICAga1RvdGFsU2NoZW1hVHlwZQotICAgIH07Ci0KLSNpZiBSQVBJREpTT05fU0NIRU1BX1VTRV9JTlRFUk5BTFJFR0VYCi0gICAgICAgIHR5cGVkZWYgaW50ZXJuYWw6OkdlbmVyaWNSZWdleDxFbmNvZGluZ1R5cGU+IFJlZ2V4VHlwZTsKLSNlbGlmIFJBUElESlNPTl9TQ0hFTUFfVVNFX1NURFJFR0VYCi0gICAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19yZWdleDxDaD4gUmVnZXhUeXBlOwotI2Vsc2UKLSAgICAgICAgdHlwZWRlZiBjaGFyIFJlZ2V4VHlwZTsKLSNlbmRpZgotCi0gICAgc3RydWN0IFNjaGVtYUFycmF5IHsKLSAgICAgICAgU2NoZW1hQXJyYXkoKSA6IHNjaGVtYXMoKSwgY291bnQoKSB7fQotICAgICAgICB+U2NoZW1hQXJyYXkoKSB7IEFsbG9jYXRvclR5cGU6OkZyZWUoc2NoZW1hcyk7IH0KLSAgICAgICAgY29uc3QgU2NoZW1hVHlwZSoqIHNjaGVtYXM7Ci0gICAgICAgIFNpemVUeXBlIGJlZ2luOyAvLyBiZWdpbiBpbmRleCBvZiBjb250ZXh0LnZhbGlkYXRvcnMKLSAgICAgICAgU2l6ZVR5cGUgY291bnQ7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBTY2hlbWFUeXBlKiBHZXRUeXBlbGVzcygpIHsKLSAgICAgICAgc3RhdGljIFNjaGVtYVR5cGUgdHlwZWxlc3MoMCwgUG9pbnRlclR5cGUoKSwgVmFsdWVUeXBlKGtPYmplY3RUeXBlKS5Nb3ZlKCksIFZhbHVlVHlwZShrT2JqZWN0VHlwZSkuTW92ZSgpLCAwKTsKLSAgICAgICAgcmV0dXJuICZ0eXBlbGVzczsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVjEsIHR5cGVuYW1lIFYyPgotICAgIHZvaWQgQWRkVW5pcXVlRWxlbWVudChWMSYgYSwgY29uc3QgVjImIHYpIHsKLSAgICAgICAgZm9yICh0eXBlbmFtZSBWMTo6Q29uc3RWYWx1ZUl0ZXJhdG9yIGl0ciA9IGEuQmVnaW4oKTsgaXRyICE9IGEuRW5kKCk7ICsraXRyKQotICAgICAgICAgICAgaWYgKCppdHIgPT0gdikKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFYxIGModiwgKmFsbG9jYXRvcl8pOwotICAgICAgICBhLlB1c2hCYWNrKGMsICphbGxvY2F0b3JfKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY29uc3QgVmFsdWVUeXBlKiBHZXRNZW1iZXIoY29uc3QgVmFsdWVUeXBlJiB2YWx1ZSwgY29uc3QgVmFsdWVUeXBlJiBuYW1lKSB7Ci0gICAgICAgIHR5cGVuYW1lIFZhbHVlVHlwZTo6Q29uc3RNZW1iZXJJdGVyYXRvciBpdHIgPSB2YWx1ZS5GaW5kTWVtYmVyKG5hbWUpOwotICAgICAgICByZXR1cm4gaXRyICE9IHZhbHVlLk1lbWJlckVuZCgpID8gJihpdHItPnZhbHVlKSA6IDA7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgQXNzaWduSWZFeGlzdChib29sJiBvdXQsIGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUsIGNvbnN0IFZhbHVlVHlwZSYgbmFtZSkgewotICAgICAgICBpZiAoY29uc3QgVmFsdWVUeXBlKiB2ID0gR2V0TWVtYmVyKHZhbHVlLCBuYW1lKSkKLSAgICAgICAgICAgIGlmICh2LT5Jc0Jvb2woKSkKLSAgICAgICAgICAgICAgICBvdXQgPSB2LT5HZXRCb29sKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgQXNzaWduSWZFeGlzdChTaXplVHlwZSYgb3V0LCBjb25zdCBWYWx1ZVR5cGUmIHZhbHVlLCBjb25zdCBWYWx1ZVR5cGUmIG5hbWUpIHsKLSAgICAgICAgaWYgKGNvbnN0IFZhbHVlVHlwZSogdiA9IEdldE1lbWJlcih2YWx1ZSwgbmFtZSkpCi0gICAgICAgICAgICBpZiAodi0+SXNVaW50NjQoKSAmJiB2LT5HZXRVaW50NjQoKSA8PSBTaXplVHlwZSh+MCkpCi0gICAgICAgICAgICAgICAgb3V0ID0gc3RhdGljX2Nhc3Q8U2l6ZVR5cGU+KHYtPkdldFVpbnQ2NCgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIEFzc2lnbklmRXhpc3QoU2NoZW1hQXJyYXkmIG91dCwgU2NoZW1hRG9jdW1lbnRUeXBlJiBzY2hlbWFEb2N1bWVudCwgY29uc3QgUG9pbnRlclR5cGUmIHAsIGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUsIGNvbnN0IFZhbHVlVHlwZSYgbmFtZSwgY29uc3QgVmFsdWVUeXBlJiBkb2N1bWVudCkgewotICAgICAgICBpZiAoY29uc3QgVmFsdWVUeXBlKiB2ID0gR2V0TWVtYmVyKHZhbHVlLCBuYW1lKSkgewotICAgICAgICAgICAgaWYgKHYtPklzQXJyYXkoKSAmJiB2LT5TaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgUG9pbnRlclR5cGUgcSA9IHAuQXBwZW5kKG5hbWUsIGFsbG9jYXRvcl8pOwotICAgICAgICAgICAgICAgIG91dC5jb3VudCA9IHYtPlNpemUoKTsKLSAgICAgICAgICAgICAgICBvdXQuc2NoZW1hcyA9IHN0YXRpY19jYXN0PGNvbnN0IFNjaGVtYSoqPihhbGxvY2F0b3JfLT5NYWxsb2Mob3V0LmNvdW50ICogc2l6ZW9mKGNvbnN0IFNjaGVtYSopKSk7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KG91dC5zY2hlbWFzLCAwLCBzaXplb2YoU2NoZW1hKikqIG91dC5jb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTaXplVHlwZSBpID0gMDsgaSA8IG91dC5jb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBzY2hlbWFEb2N1bWVudC5DcmVhdGVTY2hlbWEoJm91dC5zY2hlbWFzW2ldLCBxLkFwcGVuZChpLCBhbGxvY2F0b3JfKSwgKCp2KVtpXSwgZG9jdW1lbnQpOwotICAgICAgICAgICAgICAgIG91dC5iZWdpbiA9IHZhbGlkYXRvckNvdW50XzsKLSAgICAgICAgICAgICAgICB2YWxpZGF0b3JDb3VudF8gKz0gb3V0LmNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jaWYgUkFQSURKU09OX1NDSEVNQV9VU0VfSU5URVJOQUxSRUdFWAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5cGU+Ci0gICAgUmVnZXhUeXBlKiBDcmVhdGVQYXR0ZXJuKGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlLklzU3RyaW5nKCkpIHsKLSAgICAgICAgICAgIFJlZ2V4VHlwZSogciA9IG5ldyAoYWxsb2NhdG9yXy0+TWFsbG9jKHNpemVvZihSZWdleFR5cGUpKSkgUmVnZXhUeXBlKHZhbHVlLkdldFN0cmluZygpKTsKLSAgICAgICAgICAgIGlmICghci0+SXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgci0+flJlZ2V4VHlwZSgpOwotICAgICAgICAgICAgICAgIHIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgSXNQYXR0ZXJuTWF0Y2goY29uc3QgUmVnZXhUeXBlKiBwYXR0ZXJuLCBjb25zdCBDaCAqc3RyLCBTaXplVHlwZSkgewotICAgICAgICByZXR1cm4gcGF0dGVybi0+U2VhcmNoKHN0cik7Ci0gICAgfQotI2VsaWYgUkFQSURKU09OX1NDSEVNQV9VU0VfU1REUkVHRVgKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeXBlPgotICAgIFJlZ2V4VHlwZSogQ3JlYXRlUGF0dGVybihjb25zdCBWYWx1ZVR5cGUmIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZS5Jc1N0cmluZygpKQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IChhbGxvY2F0b3JfLT5NYWxsb2Moc2l6ZW9mKFJlZ2V4VHlwZSkpKSBSZWdleFR5cGUodmFsdWUuR2V0U3RyaW5nKCksIHN0ZDo6c2l6ZV90KHZhbHVlLkdldFN0cmluZ0xlbmd0aCgpKSwgc3RkOjpyZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKGNvbnN0IHN0ZDo6cmVnZXhfZXJyb3ImKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIElzUGF0dGVybk1hdGNoKGNvbnN0IFJlZ2V4VHlwZSogcGF0dGVybiwgY29uc3QgQ2ggKnN0ciwgU2l6ZVR5cGUgbGVuZ3RoKSB7Ci0gICAgICAgIHN0ZDo6bWF0Y2hfcmVzdWx0czxjb25zdCBDaCo+IHI7Ci0gICAgICAgIHJldHVybiBzdGQ6OnJlZ2V4X3NlYXJjaChzdHIsIHN0ciArIGxlbmd0aCwgciwgKnBhdHRlcm4pOwotICAgIH0KLSNlbHNlCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHlwZT4KLSAgICBSZWdleFR5cGUqIENyZWF0ZVBhdHRlcm4oY29uc3QgVmFsdWVUeXBlJikgeyByZXR1cm4gMDsgfQotCi0gICAgc3RhdGljIGJvb2wgSXNQYXR0ZXJuTWF0Y2goY29uc3QgUmVnZXhUeXBlKiwgY29uc3QgQ2ggKiwgU2l6ZVR5cGUpIHsgcmV0dXJuIHRydWU7IH0KLSNlbmRpZiAvLyBSQVBJREpTT05fU0NIRU1BX1VTRV9TVERSRUdFWAotCi0gICAgdm9pZCBBZGRUeXBlKGNvbnN0IFZhbHVlVHlwZSYgdHlwZSkgewotICAgICAgICBpZiAgICAgICh0eXBlID09IEdldE51bGxTdHJpbmcoKSAgICkgdHlwZV8gfD0gMSA8PCBrTnVsbFNjaGVtYVR5cGU7Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gR2V0Qm9vbGVhblN0cmluZygpKSB0eXBlXyB8PSAxIDw8IGtCb29sZWFuU2NoZW1hVHlwZTsKLSAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBHZXRPYmplY3RTdHJpbmcoKSApIHR5cGVfIHw9IDEgPDwga09iamVjdFNjaGVtYVR5cGU7Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gR2V0QXJyYXlTdHJpbmcoKSAgKSB0eXBlXyB8PSAxIDw8IGtBcnJheVNjaGVtYVR5cGU7Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gR2V0U3RyaW5nU3RyaW5nKCkgKSB0eXBlXyB8PSAxIDw8IGtTdHJpbmdTY2hlbWFUeXBlOwotICAgICAgICBlbHNlIGlmICh0eXBlID09IEdldEludGVnZXJTdHJpbmcoKSkgdHlwZV8gfD0gMSA8PCBrSW50ZWdlclNjaGVtYVR5cGU7Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gR2V0TnVtYmVyU3RyaW5nKCkgKSB0eXBlXyB8PSAoMSA8PCBrTnVtYmVyU2NoZW1hVHlwZSkgfCAoMSA8PCBrSW50ZWdlclNjaGVtYVR5cGUpOwotICAgIH0KLQotICAgIGJvb2wgQ3JlYXRlUGFyYWxsZWxWYWxpZGF0b3IoQ29udGV4dCYgY29udGV4dCkgY29uc3QgewotICAgICAgICBpZiAoZW51bV8gfHwgY29udGV4dC5hcnJheVVuaXF1ZW5lc3MpCi0gICAgICAgICAgICBjb250ZXh0Lmhhc2hlciA9IGNvbnRleHQuZmFjdG9yeS5DcmVhdGVIYXNoZXIoKTsKLQotICAgICAgICBpZiAodmFsaWRhdG9yQ291bnRfKSB7Ci0gICAgICAgICAgICBSQVBJREpTT05fQVNTRVJUKGNvbnRleHQudmFsaWRhdG9ycyA9PSAwKTsKLSAgICAgICAgICAgIGNvbnRleHQudmFsaWRhdG9ycyA9IHN0YXRpY19jYXN0PElTY2hlbWFWYWxpZGF0b3IqKj4oY29udGV4dC5mYWN0b3J5Lk1hbGxvY1N0YXRlKHNpemVvZihJU2NoZW1hVmFsaWRhdG9yKikgKiB2YWxpZGF0b3JDb3VudF8pKTsKLSAgICAgICAgICAgIGNvbnRleHQudmFsaWRhdG9yQ291bnQgPSB2YWxpZGF0b3JDb3VudF87Ci0KLSAgICAgICAgICAgIGlmIChhbGxPZl8uc2NoZW1hcykKLSAgICAgICAgICAgICAgICBDcmVhdGVTY2hlbWFWYWxpZGF0b3JzKGNvbnRleHQsIGFsbE9mXyk7Ci0KLSAgICAgICAgICAgIGlmIChhbnlPZl8uc2NoZW1hcykKLSAgICAgICAgICAgICAgICBDcmVhdGVTY2hlbWFWYWxpZGF0b3JzKGNvbnRleHQsIGFueU9mXyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChvbmVPZl8uc2NoZW1hcykKLSAgICAgICAgICAgICAgICBDcmVhdGVTY2hlbWFWYWxpZGF0b3JzKGNvbnRleHQsIG9uZU9mXyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChub3RfKQotICAgICAgICAgICAgICAgIGNvbnRleHQudmFsaWRhdG9yc1tub3RWYWxpZGF0b3JJbmRleF9dID0gY29udGV4dC5mYWN0b3J5LkNyZWF0ZVNjaGVtYVZhbGlkYXRvcigqbm90Xyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChoYXNTY2hlbWFEZXBlbmRlbmNpZXNfKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTaXplVHlwZSBpID0gMDsgaSA8IHByb3BlcnR5Q291bnRfOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzX1tpXS5kZXBlbmRlbmNpZXNTY2hlbWEpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnZhbGlkYXRvcnNbcHJvcGVydGllc19baV0uZGVwZW5kZW5jaWVzVmFsaWRhdG9ySW5kZXhdID0gY29udGV4dC5mYWN0b3J5LkNyZWF0ZVNjaGVtYVZhbGlkYXRvcigqcHJvcGVydGllc19baV0uZGVwZW5kZW5jaWVzU2NoZW1hKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHZvaWQgQ3JlYXRlU2NoZW1hVmFsaWRhdG9ycyhDb250ZXh0JiBjb250ZXh0LCBjb25zdCBTY2hlbWFBcnJheSYgc2NoZW1hcykgY29uc3QgewotICAgICAgICBmb3IgKFNpemVUeXBlIGkgPSAwOyBpIDwgc2NoZW1hcy5jb3VudDsgaSsrKQotICAgICAgICAgICAgY29udGV4dC52YWxpZGF0b3JzW3NjaGVtYXMuYmVnaW4gKyBpXSA9IGNvbnRleHQuZmFjdG9yeS5DcmVhdGVTY2hlbWFWYWxpZGF0b3IoKnNjaGVtYXMuc2NoZW1hc1tpXSk7Ci0gICAgfQotCi0gICAgLy8gTyhuKQotICAgIGJvb2wgRmluZFByb3BlcnR5SW5kZXgoY29uc3QgVmFsdWVUeXBlJiBuYW1lLCBTaXplVHlwZSogb3V0SW5kZXgpIGNvbnN0IHsKLSAgICAgICAgU2l6ZVR5cGUgbGVuID0gbmFtZS5HZXRTdHJpbmdMZW5ndGgoKTsKLSAgICAgICAgY29uc3QgQ2gqIHN0ciA9IG5hbWUuR2V0U3RyaW5nKCk7Ci0gICAgICAgIGZvciAoU2l6ZVR5cGUgaW5kZXggPSAwOyBpbmRleCA8IHByb3BlcnR5Q291bnRfOyBpbmRleCsrKQotICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNfW2luZGV4XS5uYW1lLkdldFN0cmluZ0xlbmd0aCgpID09IGxlbiAmJiAKLSAgICAgICAgICAgICAgICAoc3RkOjptZW1jbXAocHJvcGVydGllc19baW5kZXhdLm5hbWUuR2V0U3RyaW5nKCksIHN0ciwgc2l6ZW9mKENoKSAqIGxlbikgPT0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKm91dEluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIENoZWNrSW50KENvbnRleHQmIGNvbnRleHQsIGludDY0X3QgaSkgY29uc3QgewotICAgICAgICBpZiAoISh0eXBlXyAmICgoMSA8PCBrSW50ZWdlclNjaGVtYVR5cGUpIHwgKDEgPDwga051bWJlclNjaGVtYVR5cGUpKSkpCi0gICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXRUeXBlU3RyaW5nKCkpOwotCi0gICAgICAgIGlmICghbWluaW11bV8uSXNOdWxsKCkpIHsKLSAgICAgICAgICAgIGlmIChtaW5pbXVtXy5Jc0ludDY0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXhjbHVzaXZlTWluaW11bV8gPyBpIDw9IG1pbmltdW1fLkdldEludDY0KCkgOiBpIDwgbWluaW11bV8uR2V0SW50NjQoKSkKLSAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0TWluaW11bVN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFDaGVja0RvdWJsZU1pbmltdW0oY29udGV4dCwgc3RhdGljX2Nhc3Q8ZG91YmxlPihpKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtYXhpbXVtXy5Jc051bGwoKSkgewotICAgICAgICAgICAgaWYgKG1heGltdW1fLklzSW50NjQoKSkgewotICAgICAgICAgICAgICAgIGlmIChleGNsdXNpdmVNYXhpbXVtXyA/IGkgPj0gbWF4aW11bV8uR2V0SW50NjQoKSA6IGkgPiBtYXhpbXVtXy5HZXRJbnQ2NCgpKQotICAgICAgICAgICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXRNYXhpbXVtU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIUNoZWNrRG91YmxlTWF4aW11bShjb250ZXh0LCBzdGF0aWNfY2FzdDxkb3VibGU+KGkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW11bHRpcGxlT2ZfLklzTnVsbCgpKSB7Ci0gICAgICAgICAgICBpZiAobXVsdGlwbGVPZl8uSXNVaW50NjQoKSkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oaSA+PSAwID8gaSA6IC1pKSAlIG11bHRpcGxlT2ZfLkdldFVpbnQ2NCgpICE9IDApCi0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldE11bHRpcGxlT2ZTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghQ2hlY2tEb3VibGVNdWx0aXBsZU9mKGNvbnRleHQsIHN0YXRpY19jYXN0PGRvdWJsZT4oaSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgQ2hlY2tVaW50KENvbnRleHQmIGNvbnRleHQsIHVpbnQ2NF90IGkpIGNvbnN0IHsKLSAgICAgICAgaWYgKCEodHlwZV8gJiAoKDEgPDwga0ludGVnZXJTY2hlbWFUeXBlKSB8ICgxIDw8IGtOdW1iZXJTY2hlbWFUeXBlKSkpKQotICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0VHlwZVN0cmluZygpKTsKLQotICAgICAgICBpZiAoIW1pbmltdW1fLklzTnVsbCgpKSB7Ci0gICAgICAgICAgICBpZiAobWluaW11bV8uSXNVaW50NjQoKSkgewotICAgICAgICAgICAgICAgIGlmIChleGNsdXNpdmVNaW5pbXVtXyA/IGkgPD0gbWluaW11bV8uR2V0VWludDY0KCkgOiBpIDwgbWluaW11bV8uR2V0VWludDY0KCkpCi0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldE1pbmltdW1TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghQ2hlY2tEb3VibGVNaW5pbXVtKGNvbnRleHQsIHN0YXRpY19jYXN0PGRvdWJsZT4oaSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbWF4aW11bV8uSXNOdWxsKCkpIHsKLSAgICAgICAgICAgIGlmIChtYXhpbXVtXy5Jc1VpbnQ2NCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4Y2x1c2l2ZU1heGltdW1fID8gaSA+PSBtYXhpbXVtXy5HZXRVaW50NjQoKSA6IGkgPiBtYXhpbXVtXy5HZXRVaW50NjQoKSkKLSAgICAgICAgICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0TWF4aW11bVN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFDaGVja0RvdWJsZU1heGltdW0oY29udGV4dCwgc3RhdGljX2Nhc3Q8ZG91YmxlPihpKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtdWx0aXBsZU9mXy5Jc051bGwoKSkgewotICAgICAgICAgICAgaWYgKG11bHRpcGxlT2ZfLklzVWludDY0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSAlIG11bHRpcGxlT2ZfLkdldFVpbnQ2NCgpICE9IDApCi0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKEdldE11bHRpcGxlT2ZTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghQ2hlY2tEb3VibGVNdWx0aXBsZU9mKGNvbnRleHQsIHN0YXRpY19jYXN0PGRvdWJsZT4oaSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgQ2hlY2tEb3VibGVNaW5pbXVtKENvbnRleHQmIGNvbnRleHQsIGRvdWJsZSBkKSBjb25zdCB7Ci0gICAgICAgIGlmIChleGNsdXNpdmVNaW5pbXVtXyA/IGQgPD0gbWluaW11bV8uR2V0RG91YmxlKCkgOiBkIDwgbWluaW11bV8uR2V0RG91YmxlKCkpCi0gICAgICAgICAgICBSQVBJREpTT05fSU5WQUxJRF9LRVlXT1JEX1JFVFVSTihHZXRNaW5pbXVtU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIENoZWNrRG91YmxlTWF4aW11bShDb250ZXh0JiBjb250ZXh0LCBkb3VibGUgZCkgY29uc3QgewotICAgICAgICBpZiAoZXhjbHVzaXZlTWF4aW11bV8gPyBkID49IG1heGltdW1fLkdldERvdWJsZSgpIDogZCA+IG1heGltdW1fLkdldERvdWJsZSgpKQotICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0TWF4aW11bVN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBDaGVja0RvdWJsZU11bHRpcGxlT2YoQ29udGV4dCYgY29udGV4dCwgZG91YmxlIGQpIGNvbnN0IHsKLSAgICAgICAgZG91YmxlIGEgPSBzdGQ6OmFicyhkKSwgYiA9IHN0ZDo6YWJzKG11bHRpcGxlT2ZfLkdldERvdWJsZSgpKTsKLSAgICAgICAgZG91YmxlIHEgPSBzdGQ6OmZsb29yKGEgLyBiKTsKLSAgICAgICAgZG91YmxlIHIgPSBhIC0gcSAqIGI7Ci0gICAgICAgIGlmIChyID4gMC4wKQotICAgICAgICAgICAgUkFQSURKU09OX0lOVkFMSURfS0VZV09SRF9SRVRVUk4oR2V0TXVsdGlwbGVPZlN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgc3RydWN0IFByb3BlcnR5IHsKLSAgICAgICAgUHJvcGVydHkoKSA6IHNjaGVtYSgpLCBkZXBlbmRlbmNpZXNTY2hlbWEoKSwgZGVwZW5kZW5jaWVzVmFsaWRhdG9ySW5kZXgoKSwgZGVwZW5kZW5jaWVzKCksIHJlcXVpcmVkKGZhbHNlKSB7fQotICAgICAgICB+UHJvcGVydHkoKSB7IEFsbG9jYXRvclR5cGU6OkZyZWUoZGVwZW5kZW5jaWVzKTsgfQotICAgICAgICBTVmFsdWUgbmFtZTsKLSAgICAgICAgY29uc3QgU2NoZW1hVHlwZSogc2NoZW1hOwotICAgICAgICBjb25zdCBTY2hlbWFUeXBlKiBkZXBlbmRlbmNpZXNTY2hlbWE7Ci0gICAgICAgIFNpemVUeXBlIGRlcGVuZGVuY2llc1ZhbGlkYXRvckluZGV4OwotICAgICAgICBib29sKiBkZXBlbmRlbmNpZXM7Ci0gICAgICAgIGJvb2wgcmVxdWlyZWQ7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBQYXR0ZXJuUHJvcGVydHkgewotICAgICAgICBQYXR0ZXJuUHJvcGVydHkoKSA6IHNjaGVtYSgpLCBwYXR0ZXJuKCkge30KLSAgICAgICAgflBhdHRlcm5Qcm9wZXJ0eSgpIHsgCi0gICAgICAgICAgICBpZiAocGF0dGVybikgewotICAgICAgICAgICAgICAgIHBhdHRlcm4tPn5SZWdleFR5cGUoKTsKLSAgICAgICAgICAgICAgICBBbGxvY2F0b3JUeXBlOjpGcmVlKHBhdHRlcm4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IFNjaGVtYVR5cGUqIHNjaGVtYTsKLSAgICAgICAgUmVnZXhUeXBlKiBwYXR0ZXJuOwotICAgIH07Ci0KLSAgICBBbGxvY2F0b3JUeXBlKiBhbGxvY2F0b3JfOwotICAgIHVpbnQ2NF90KiBlbnVtXzsKLSAgICBTaXplVHlwZSBlbnVtQ291bnRfOwotICAgIFNjaGVtYUFycmF5IGFsbE9mXzsKLSAgICBTY2hlbWFBcnJheSBhbnlPZl87Ci0gICAgU2NoZW1hQXJyYXkgb25lT2ZfOwotICAgIGNvbnN0IFNjaGVtYVR5cGUqIG5vdF87Ci0gICAgdW5zaWduZWQgdHlwZV87IC8vIGJpdG1hc2sgb2Yga1NjaGVtYVR5cGUKLSAgICBTaXplVHlwZSB2YWxpZGF0b3JDb3VudF87Ci0gICAgU2l6ZVR5cGUgbm90VmFsaWRhdG9ySW5kZXhfOwotCi0gICAgUHJvcGVydHkqIHByb3BlcnRpZXNfOwotICAgIGNvbnN0IFNjaGVtYVR5cGUqIGFkZGl0aW9uYWxQcm9wZXJ0aWVzU2NoZW1hXzsKLSAgICBQYXR0ZXJuUHJvcGVydHkqIHBhdHRlcm5Qcm9wZXJ0aWVzXzsKLSAgICBTaXplVHlwZSBwYXR0ZXJuUHJvcGVydHlDb3VudF87Ci0gICAgU2l6ZVR5cGUgcHJvcGVydHlDb3VudF87Ci0gICAgU2l6ZVR5cGUgcmVxdWlyZWRDb3VudF87Ci0gICAgU2l6ZVR5cGUgbWluUHJvcGVydGllc187Ci0gICAgU2l6ZVR5cGUgbWF4UHJvcGVydGllc187Ci0gICAgYm9vbCBhZGRpdGlvbmFsUHJvcGVydGllc187Ci0gICAgYm9vbCBoYXNEZXBlbmRlbmNpZXNfOwotICAgIGJvb2wgaGFzU2NoZW1hRGVwZW5kZW5jaWVzXzsKLQotICAgIGNvbnN0IFNjaGVtYVR5cGUqIGFkZGl0aW9uYWxJdGVtc1NjaGVtYV87Ci0gICAgY29uc3QgU2NoZW1hVHlwZSogaXRlbXNMaXN0XzsKLSAgICBjb25zdCBTY2hlbWFUeXBlKiogaXRlbXNUdXBsZV87Ci0gICAgU2l6ZVR5cGUgaXRlbXNUdXBsZUNvdW50XzsKLSAgICBTaXplVHlwZSBtaW5JdGVtc187Ci0gICAgU2l6ZVR5cGUgbWF4SXRlbXNfOwotICAgIGJvb2wgYWRkaXRpb25hbEl0ZW1zXzsKLSAgICBib29sIHVuaXF1ZUl0ZW1zXzsKLQotICAgIFJlZ2V4VHlwZSogcGF0dGVybl87Ci0gICAgU2l6ZVR5cGUgbWluTGVuZ3RoXzsKLSAgICBTaXplVHlwZSBtYXhMZW5ndGhfOwotCi0gICAgU1ZhbHVlIG1pbmltdW1fOwotICAgIFNWYWx1ZSBtYXhpbXVtXzsKLSAgICBTVmFsdWUgbXVsdGlwbGVPZl87Ci0gICAgYm9vbCBleGNsdXNpdmVNaW5pbXVtXzsKLSAgICBib29sIGV4Y2x1c2l2ZU1heGltdW1fOwotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgU3RhY2ssIHR5cGVuYW1lIENoPgotc3RydWN0IFRva2VuSGVscGVyIHsKLSAgICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgc3RhdGljIHZvaWQgQXBwZW5kSW5kZXhUb2tlbihTdGFjayYgZG9jdW1lbnRTdGFjaywgU2l6ZVR5cGUgaW5kZXgpIHsKLSAgICAgICAgKmRvY3VtZW50U3RhY2sudGVtcGxhdGUgUHVzaDxDaD4oKSA9ICcvJzsKLSAgICAgICAgY2hhciBidWZmZXJbMjFdOwotICAgICAgICBzaXplX3QgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pigoc2l6ZW9mKFNpemVUeXBlKSA9PSA0ID8gdTMydG9hKGluZGV4LCBidWZmZXIpIDogdTY0dG9hKGluZGV4LCBidWZmZXIpKSAtIGJ1ZmZlcik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAqZG9jdW1lbnRTdGFjay50ZW1wbGF0ZSBQdXNoPENoPigpID0gYnVmZmVyW2ldOwotICAgIH0KLX07Ci0KLS8vIFBhcnRpYWwgc3BlY2lhbGl6ZWQgdmVyc2lvbiBmb3IgY2hhciB0byBwcmV2ZW50IGJ1ZmZlciBjb3B5aW5nLgotdGVtcGxhdGUgPHR5cGVuYW1lIFN0YWNrPgotc3RydWN0IFRva2VuSGVscGVyPFN0YWNrLCBjaGFyPiB7Ci0gICAgUkFQSURKU09OX0ZPUkNFSU5MSU5FIHN0YXRpYyB2b2lkIEFwcGVuZEluZGV4VG9rZW4oU3RhY2smIGRvY3VtZW50U3RhY2ssIFNpemVUeXBlIGluZGV4KSB7Ci0gICAgICAgIGlmIChzaXplb2YoU2l6ZVR5cGUpID09IDQpIHsKLSAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciA9IGRvY3VtZW50U3RhY2sudGVtcGxhdGUgUHVzaDxjaGFyPigxICsgMTApOyAvLyAnLycgKyB1aW50Ci0gICAgICAgICAgICAqYnVmZmVyKysgPSAnLyc7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBlbmQgPSBpbnRlcm5hbDo6dTMydG9hKGluZGV4LCBidWZmZXIpOwotICAgICAgICAgICAgIGRvY3VtZW50U3RhY2sudGVtcGxhdGUgUG9wPGNoYXI+KHN0YXRpY19jYXN0PHNpemVfdD4oMTAgLSAoZW5kIC0gYnVmZmVyKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY2hhciAqYnVmZmVyID0gZG9jdW1lbnRTdGFjay50ZW1wbGF0ZSBQdXNoPGNoYXI+KDEgKyAyMCk7IC8vICcvJyArIHVpbnQ2NAotICAgICAgICAgICAgKmJ1ZmZlcisrID0gJy8nOwotICAgICAgICAgICAgY29uc3QgY2hhciogZW5kID0gaW50ZXJuYWw6OnU2NHRvYShpbmRleCwgYnVmZmVyKTsKLSAgICAgICAgICAgIGRvY3VtZW50U3RhY2sudGVtcGxhdGUgUG9wPGNoYXI+KHN0YXRpY19jYXN0PHNpemVfdD4oMjAgLSAoZW5kIC0gYnVmZmVyKSkpOwotICAgICAgICB9Ci0gICAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSUdlbmVyaWNSZW1vdGVTY2hlbWFEb2N1bWVudFByb3ZpZGVyCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTY2hlbWFEb2N1bWVudFR5cGU+Ci1jbGFzcyBJR2VuZXJpY1JlbW90ZVNjaGVtYURvY3VtZW50UHJvdmlkZXIgewotcHVibGljOgotICAgIHR5cGVkZWYgdHlwZW5hbWUgU2NoZW1hRG9jdW1lbnRUeXBlOjpDaCBDaDsKLQotICAgIHZpcnR1YWwgfklHZW5lcmljUmVtb3RlU2NoZW1hRG9jdW1lbnRQcm92aWRlcigpIHt9Ci0gICAgdmlydHVhbCBjb25zdCBTY2hlbWFEb2N1bWVudFR5cGUqIEdldFJlbW90ZURvY3VtZW50KGNvbnN0IENoKiB1cmksIFNpemVUeXBlIGxlbmd0aCkgPSAwOwotfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR2VuZXJpY1NjaGVtYURvY3VtZW50Ci0KLS8vISBKU09OIHNjaGVtYSBkb2N1bWVudC4KLS8qIQotICAgIEEgSlNPTiBzY2hlbWEgZG9jdW1lbnQgaXMgYSBjb21waWxlZCB2ZXJzaW9uIG9mIGEgSlNPTiBzY2hlbWEuCi0gICAgSXQgaXMgYmFzaWNhbGx5IGEgdHJlZSBvZiBpbnRlcm5hbDo6U2NoZW1hLgotCi0gICAgXG5vdGUgVGhpcyBpcyBhbiBpbW11dGFibGUgY2xhc3MgKGkuZS4gaXRzIGluc3RhbmNlIGNhbm5vdCBiZSBtb2RpZmllZCBhZnRlciBjb25zdHJ1Y3Rpb24pLgotICAgIFx0cGFyYW0gVmFsdWVUIFR5cGUgb2YgSlNPTiB2YWx1ZSAoZS5nLiBcYyBWYWx1ZSApLCB3aGljaCBhbHNvIGRldGVybWluZSB0aGUgZW5jb2RpbmcuCi0gICAgXHRwYXJhbSBBbGxvY2F0b3IgQWxsb2NhdG9yIHR5cGUgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IG9mIHRoaXMgZG9jdW1lbnQuCi0qLwotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgQWxsb2NhdG9yID0gQ3J0QWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY1NjaGVtYURvY3VtZW50IHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFZhbHVlVCBWYWx1ZVR5cGU7Ci0gICAgdHlwZWRlZiBJR2VuZXJpY1JlbW90ZVNjaGVtYURvY3VtZW50UHJvdmlkZXI8R2VuZXJpY1NjaGVtYURvY3VtZW50PiBJUmVtb3RlU2NoZW1hRG9jdW1lbnRQcm92aWRlclR5cGU7Ci0gICAgdHlwZWRlZiBBbGxvY2F0b3IgQWxsb2NhdG9yVHlwZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFZhbHVlVHlwZTo6RW5jb2RpbmdUeXBlIEVuY29kaW5nVHlwZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEVuY29kaW5nVHlwZTo6Q2ggQ2g7Ci0gICAgdHlwZWRlZiBpbnRlcm5hbDo6U2NoZW1hPEdlbmVyaWNTY2hlbWFEb2N1bWVudD4gU2NoZW1hVHlwZTsKLSAgICB0eXBlZGVmIEdlbmVyaWNQb2ludGVyPFZhbHVlVHlwZSwgQWxsb2NhdG9yPiBQb2ludGVyVHlwZTsKLSAgICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OlNjaGVtYTxHZW5lcmljU2NoZW1hRG9jdW1lbnQ+OwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPgotICAgIGZyaWVuZCBjbGFzcyBHZW5lcmljU2NoZW1hVmFsaWRhdG9yOwotCi0gICAgLy8hIENvbnN0cnVjdG9yLgotICAgIC8qIQotICAgICAgICBDb21waWxlIGEgSlNPTiBkb2N1bWVudCBpbnRvIHNjaGVtYSBkb2N1bWVudC4KLQotICAgICAgICBccGFyYW0gZG9jdW1lbnQgQSBKU09OIGRvY3VtZW50IGFzIHNvdXJjZS4KLSAgICAgICAgXHBhcmFtIHJlbW90ZVByb3ZpZGVyIEFuIG9wdGlvbmFsIHJlbW90ZSBzY2hlbWEgZG9jdW1lbnQgcHJvdmlkZXIgZm9yIHJlc29sdmluZyByZW1vdGUgcmVmZXJlbmNlLiBDYW4gYmUgbnVsbC4KLSAgICAgICAgXHBhcmFtIGFsbG9jYXRvciBBbiBvcHRpb25hbCBhbGxvY2F0b3IgaW5zdGFuY2UgZm9yIGFsbG9jYXRpbmcgbWVtb3J5LiBDYW4gYmUgbnVsbC4KLSAgICAqLwotICAgIEdlbmVyaWNTY2hlbWFEb2N1bWVudChjb25zdCBWYWx1ZVR5cGUmIGRvY3VtZW50LCBJUmVtb3RlU2NoZW1hRG9jdW1lbnRQcm92aWRlclR5cGUqIHJlbW90ZVByb3ZpZGVyID0gMCwgQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwKSBSQVBJREpTT05fTk9FWENFUFQgOiAKLSAgICAgICAgcmVtb3RlUHJvdmlkZXJfKHJlbW90ZVByb3ZpZGVyKSwKLSAgICAgICAgYWxsb2NhdG9yXyhhbGxvY2F0b3IpLAotICAgICAgICBvd25BbGxvY2F0b3JfKCksCi0gICAgICAgIHJvb3RfKCksCi0gICAgICAgIHNjaGVtYU1hcF8oYWxsb2NhdG9yLCBrSW5pdGlhbFNjaGVtYU1hcFNpemUpLAotICAgICAgICBzY2hlbWFSZWZfKGFsbG9jYXRvciwga0luaXRpYWxTY2hlbWFSZWZTaXplKQotICAgIHsKLSAgICAgICAgaWYgKCFhbGxvY2F0b3JfKQotICAgICAgICAgICAgb3duQWxsb2NhdG9yXyA9IGFsbG9jYXRvcl8gPSBSQVBJREpTT05fTkVXKEFsbG9jYXRvcigpKTsKLQotICAgICAgICAvLyBHZW5lcmF0ZSByb290IHNjaGVtYSwgaXQgd2lsbCBjYWxsIENyZWF0ZVNjaGVtYSgpIHRvIGNyZWF0ZSBzdWItc2NoZW1hcywKLSAgICAgICAgLy8gQW5kIGNhbGwgQWRkUmVmU2NoZW1hKCkgaWYgdGhlcmUgYXJlICRyZWYuCi0gICAgICAgIENyZWF0ZVNjaGVtYVJlY3Vyc2l2ZSgmcm9vdF8sIFBvaW50ZXJUeXBlKCksIGRvY3VtZW50LCBkb2N1bWVudCk7Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSAkcmVmCi0gICAgICAgIHdoaWxlICghc2NoZW1hUmVmXy5FbXB0eSgpKSB7Ci0gICAgICAgICAgICBTY2hlbWFSZWZFbnRyeSogcmVmRW50cnkgPSBzY2hlbWFSZWZfLnRlbXBsYXRlIFBvcDxTY2hlbWFSZWZFbnRyeT4oMSk7Ci0gICAgICAgICAgICBpZiAoY29uc3QgU2NoZW1hVHlwZSogcyA9IEdldFNjaGVtYShyZWZFbnRyeS0+dGFyZ2V0KSkgewotICAgICAgICAgICAgICAgIGlmIChyZWZFbnRyeS0+c2NoZW1hKQotICAgICAgICAgICAgICAgICAgICAqcmVmRW50cnktPnNjaGVtYSA9IHM7Ci0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgZW50cnkgaW4gbWFwIGlmIG5vdCBleGlzdAotICAgICAgICAgICAgICAgIGlmICghR2V0U2NoZW1hKHJlZkVudHJ5LT5zb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ldyAoc2NoZW1hTWFwXy50ZW1wbGF0ZSBQdXNoPFNjaGVtYUVudHJ5PigpKSBTY2hlbWFFbnRyeShyZWZFbnRyeS0+c291cmNlLCBjb25zdF9jYXN0PFNjaGVtYVR5cGUqPihzKSwgZmFsc2UsIGFsbG9jYXRvcl8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlZkVudHJ5LT5+U2NoZW1hUmVmRW50cnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJBUElESlNPTl9BU1NFUlQocm9vdF8gIT0gMCk7Ci0KLSAgICAgICAgc2NoZW1hUmVmXy5TaHJpbmtUb0ZpdCgpOyAvLyBEZWFsbG9jYXRlIGFsbCBtZW1vcnkgZm9yIHJlZgotICAgIH0KLQotI2lmIFJBUElESlNPTl9IQVNfQ1hYMTFfUlZBTFVFX1JFRlMKLSAgICAvLyEgTW92ZSBjb25zdHJ1Y3RvciBpbiBDKysxMQotICAgIEdlbmVyaWNTY2hlbWFEb2N1bWVudChHZW5lcmljU2NoZW1hRG9jdW1lbnQmJiByaHMpIFJBUElESlNPTl9OT0VYQ0VQVCA6Ci0gICAgICAgIHJlbW90ZVByb3ZpZGVyXyhyaHMucmVtb3RlUHJvdmlkZXJfKSwKLSAgICAgICAgYWxsb2NhdG9yXyhyaHMuYWxsb2NhdG9yXyksCi0gICAgICAgIG93bkFsbG9jYXRvcl8ocmhzLm93bkFsbG9jYXRvcl8pLAotICAgICAgICByb290XyhyaHMucm9vdF8pLAotICAgICAgICBzY2hlbWFNYXBfKHN0ZDo6bW92ZShyaHMuc2NoZW1hTWFwXykpLAotICAgICAgICBzY2hlbWFSZWZfKHN0ZDo6bW92ZShyaHMuc2NoZW1hUmVmXykpCi0gICAgewotICAgICAgICByaHMucmVtb3RlUHJvdmlkZXJfID0gMDsKLSAgICAgICAgcmhzLmFsbG9jYXRvcl8gPSAwOwotICAgICAgICByaHMub3duQWxsb2NhdG9yXyA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyEgRGVzdHJ1Y3RvcgotICAgIH5HZW5lcmljU2NoZW1hRG9jdW1lbnQoKSB7Ci0gICAgICAgIHdoaWxlICghc2NoZW1hTWFwXy5FbXB0eSgpKQotICAgICAgICAgICAgc2NoZW1hTWFwXy50ZW1wbGF0ZSBQb3A8U2NoZW1hRW50cnk+KDEpLT5+U2NoZW1hRW50cnkoKTsKLQotICAgICAgICBSQVBJREpTT05fREVMRVRFKG93bkFsbG9jYXRvcl8pOwotICAgIH0KLQotICAgIC8vISBHZXQgdGhlIHJvb3Qgc2NoZW1hLgotICAgIGNvbnN0IFNjaGVtYVR5cGUmIEdldFJvb3QoKSBjb25zdCB7IHJldHVybiAqcm9vdF87IH0KLQotcHJpdmF0ZToKLSAgICAvLyEgUHJvaGliaXQgY29weWluZwotICAgIEdlbmVyaWNTY2hlbWFEb2N1bWVudChjb25zdCBHZW5lcmljU2NoZW1hRG9jdW1lbnQmKTsKLSAgICAvLyEgUHJvaGliaXQgYXNzaWdubWVudAotICAgIEdlbmVyaWNTY2hlbWFEb2N1bWVudCYgb3BlcmF0b3I9KGNvbnN0IEdlbmVyaWNTY2hlbWFEb2N1bWVudCYpOwotCi0gICAgc3RydWN0IFNjaGVtYVJlZkVudHJ5IHsKLSAgICAgICAgU2NoZW1hUmVmRW50cnkoY29uc3QgUG9pbnRlclR5cGUmIHMsIGNvbnN0IFBvaW50ZXJUeXBlJiB0LCBjb25zdCBTY2hlbWFUeXBlKiogb3V0U2NoZW1hLCBBbGxvY2F0b3IgKmFsbG9jYXRvcikgOiBzb3VyY2UocywgYWxsb2NhdG9yKSwgdGFyZ2V0KHQsIGFsbG9jYXRvciksIHNjaGVtYShvdXRTY2hlbWEpIHt9Ci0gICAgICAgIFBvaW50ZXJUeXBlIHNvdXJjZTsKLSAgICAgICAgUG9pbnRlclR5cGUgdGFyZ2V0OwotICAgICAgICBjb25zdCBTY2hlbWFUeXBlKiogc2NoZW1hOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU2NoZW1hRW50cnkgewotICAgICAgICBTY2hlbWFFbnRyeShjb25zdCBQb2ludGVyVHlwZSYgcCwgU2NoZW1hVHlwZSogcywgYm9vbCBvLCBBbGxvY2F0b3IqIGFsbG9jYXRvcikgOiBwb2ludGVyKHAsIGFsbG9jYXRvciksIHNjaGVtYShzKSwgb3duZWQobykge30KLSAgICAgICAgflNjaGVtYUVudHJ5KCkgewotICAgICAgICAgICAgaWYgKG93bmVkKSB7Ci0gICAgICAgICAgICAgICAgc2NoZW1hLT5+U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgICAgIEFsbG9jYXRvcjo6RnJlZShzY2hlbWEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFBvaW50ZXJUeXBlIHBvaW50ZXI7Ci0gICAgICAgIFNjaGVtYVR5cGUqIHNjaGVtYTsKLSAgICAgICAgYm9vbCBvd25lZDsKLSAgICB9OwotCi0gICAgdm9pZCBDcmVhdGVTY2hlbWFSZWN1cnNpdmUoY29uc3QgU2NoZW1hVHlwZSoqIHNjaGVtYSwgY29uc3QgUG9pbnRlclR5cGUmIHBvaW50ZXIsIGNvbnN0IFZhbHVlVHlwZSYgdiwgY29uc3QgVmFsdWVUeXBlJiBkb2N1bWVudCkgewotICAgICAgICBpZiAoc2NoZW1hKQotICAgICAgICAgICAgKnNjaGVtYSA9IFNjaGVtYVR5cGU6OkdldFR5cGVsZXNzKCk7Ci0KLSAgICAgICAgaWYgKHYuR2V0VHlwZSgpID09IGtPYmplY3RUeXBlKSB7Ci0gICAgICAgICAgICBjb25zdCBTY2hlbWFUeXBlKiBzID0gR2V0U2NoZW1hKHBvaW50ZXIpOwotICAgICAgICAgICAgaWYgKCFzKQotICAgICAgICAgICAgICAgIENyZWF0ZVNjaGVtYShzY2hlbWEsIHBvaW50ZXIsIHYsIGRvY3VtZW50KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYSkKLSAgICAgICAgICAgICAgICAqc2NoZW1hID0gczsKLQotICAgICAgICAgICAgZm9yICh0eXBlbmFtZSBWYWx1ZVR5cGU6OkNvbnN0TWVtYmVySXRlcmF0b3IgaXRyID0gdi5NZW1iZXJCZWdpbigpOyBpdHIgIT0gdi5NZW1iZXJFbmQoKTsgKytpdHIpCi0gICAgICAgICAgICAgICAgQ3JlYXRlU2NoZW1hUmVjdXJzaXZlKDAsIHBvaW50ZXIuQXBwZW5kKGl0ci0+bmFtZSwgYWxsb2NhdG9yXyksIGl0ci0+dmFsdWUsIGRvY3VtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh2LkdldFR5cGUoKSA9PSBrQXJyYXlUeXBlKQotICAgICAgICAgICAgZm9yIChTaXplVHlwZSBpID0gMDsgaSA8IHYuU2l6ZSgpOyBpKyspCi0gICAgICAgICAgICAgICAgQ3JlYXRlU2NoZW1hUmVjdXJzaXZlKDAsIHBvaW50ZXIuQXBwZW5kKGksIGFsbG9jYXRvcl8pLCB2W2ldLCBkb2N1bWVudCk7Ci0gICAgfQotCi0gICAgdm9pZCBDcmVhdGVTY2hlbWEoY29uc3QgU2NoZW1hVHlwZSoqIHNjaGVtYSwgY29uc3QgUG9pbnRlclR5cGUmIHBvaW50ZXIsIGNvbnN0IFZhbHVlVHlwZSYgdiwgY29uc3QgVmFsdWVUeXBlJiBkb2N1bWVudCkgewotICAgICAgICBSQVBJREpTT05fQVNTRVJUKHBvaW50ZXIuSXNWYWxpZCgpKTsKLSAgICAgICAgaWYgKHYuSXNPYmplY3QoKSkgewotICAgICAgICAgICAgaWYgKCFIYW5kbGVSZWZTY2hlbWEocG9pbnRlciwgc2NoZW1hLCB2LCBkb2N1bWVudCkpIHsKLSAgICAgICAgICAgICAgICBTY2hlbWFUeXBlKiBzID0gbmV3IChhbGxvY2F0b3JfLT5NYWxsb2Moc2l6ZW9mKFNjaGVtYVR5cGUpKSkgU2NoZW1hVHlwZSh0aGlzLCBwb2ludGVyLCB2LCBkb2N1bWVudCwgYWxsb2NhdG9yXyk7Ci0gICAgICAgICAgICAgICAgbmV3IChzY2hlbWFNYXBfLnRlbXBsYXRlIFB1c2g8U2NoZW1hRW50cnk+KCkpIFNjaGVtYUVudHJ5KHBvaW50ZXIsIHMsIHRydWUsIGFsbG9jYXRvcl8pOwotICAgICAgICAgICAgICAgIGlmIChzY2hlbWEpCi0gICAgICAgICAgICAgICAgICAgICpzY2hlbWEgPSBzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBIYW5kbGVSZWZTY2hlbWEoY29uc3QgUG9pbnRlclR5cGUmIHNvdXJjZSwgY29uc3QgU2NoZW1hVHlwZSoqIHNjaGVtYSwgY29uc3QgVmFsdWVUeXBlJiB2LCBjb25zdCBWYWx1ZVR5cGUmIGRvY3VtZW50KSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBDaCBrUmVmU3RyaW5nW10gPSB7ICckJywgJ3InLCAnZScsICdmJywgJ1wwJyB9OwotICAgICAgICBzdGF0aWMgY29uc3QgVmFsdWVUeXBlIGtSZWZWYWx1ZShrUmVmU3RyaW5nLCA0KTsKLQotICAgICAgICB0eXBlbmFtZSBWYWx1ZVR5cGU6OkNvbnN0TWVtYmVySXRlcmF0b3IgaXRyID0gdi5GaW5kTWVtYmVyKGtSZWZWYWx1ZSk7Ci0gICAgICAgIGlmIChpdHIgPT0gdi5NZW1iZXJFbmQoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoaXRyLT52YWx1ZS5Jc1N0cmluZygpKSB7Ci0gICAgICAgICAgICBTaXplVHlwZSBsZW4gPSBpdHItPnZhbHVlLkdldFN0cmluZ0xlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGxlbiA+IDApIHsKLSAgICAgICAgICAgICAgICBjb25zdCBDaCogcyA9IGl0ci0+dmFsdWUuR2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU2l6ZVR5cGUgaSA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBsZW4gJiYgc1tpXSAhPSAnIycpIC8vIEZpbmQgdGhlIGZpcnN0ICMKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7IC8vIFJlbW90ZSByZWZlcmVuY2UsIHJlc29sdmUgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW90ZVByb3ZpZGVyXykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnN0IEdlbmVyaWNTY2hlbWFEb2N1bWVudCogcmVtb3RlRG9jdW1lbnQgPSByZW1vdGVQcm92aWRlcl8tPkdldFJlbW90ZURvY3VtZW50KHMsIGkgLSAxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJUeXBlIHBvaW50ZXIoJnNbaV0sIGxlbiAtIGksIGFsbG9jYXRvcl8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2ludGVyLklzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uc3QgU2NoZW1hVHlwZSogc2MgPSByZW1vdGVEb2N1bWVudC0+R2V0U2NoZW1hKHBvaW50ZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzY2hlbWEgPSBzYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNbaV0gPT0gJyMnKSB7IC8vIExvY2FsIHJlZmVyZW5jZSwgZGVmZXIgcmVzb2x1dGlvbgotICAgICAgICAgICAgICAgICAgICBQb2ludGVyVHlwZSBwb2ludGVyKCZzW2ldLCBsZW4gLSBpLCBhbGxvY2F0b3JfKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50ZXIuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uc3QgVmFsdWVUeXBlKiBudiA9IHBvaW50ZXIuR2V0KGRvY3VtZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSGFuZGxlUmVmU2NoZW1hKHNvdXJjZSwgc2NoZW1hLCAqbnYsIGRvY3VtZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyAoc2NoZW1hUmVmXy50ZW1wbGF0ZSBQdXNoPFNjaGVtYVJlZkVudHJ5PigpKSBTY2hlbWFSZWZFbnRyeShzb3VyY2UsIHBvaW50ZXIsIHNjaGVtYSwgYWxsb2NhdG9yXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgU2NoZW1hVHlwZSogR2V0U2NoZW1hKGNvbnN0IFBvaW50ZXJUeXBlJiBwb2ludGVyKSBjb25zdCB7Ci0gICAgICAgIGZvciAoY29uc3QgU2NoZW1hRW50cnkqIHRhcmdldCA9IHNjaGVtYU1hcF8udGVtcGxhdGUgQm90dG9tPFNjaGVtYUVudHJ5PigpOyB0YXJnZXQgIT0gc2NoZW1hTWFwXy50ZW1wbGF0ZSBFbmQ8U2NoZW1hRW50cnk+KCk7ICsrdGFyZ2V0KQotICAgICAgICAgICAgaWYgKHBvaW50ZXIgPT0gdGFyZ2V0LT5wb2ludGVyKQotICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQtPnNjaGVtYTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUG9pbnRlclR5cGUgR2V0UG9pbnRlcihjb25zdCBTY2hlbWFUeXBlKiBzY2hlbWEpIGNvbnN0IHsKLSAgICAgICAgZm9yIChjb25zdCBTY2hlbWFFbnRyeSogdGFyZ2V0ID0gc2NoZW1hTWFwXy50ZW1wbGF0ZSBCb3R0b208U2NoZW1hRW50cnk+KCk7IHRhcmdldCAhPSBzY2hlbWFNYXBfLnRlbXBsYXRlIEVuZDxTY2hlbWFFbnRyeT4oKTsgKyt0YXJnZXQpCi0gICAgICAgICAgICBpZiAoc2NoZW1hID09IHRhcmdldC0+c2NoZW1hKQotICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQtPnBvaW50ZXI7Ci0gICAgICAgIHJldHVybiBQb2ludGVyVHlwZSgpOwotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0luaXRpYWxTY2hlbWFNYXBTaXplID0gNjQ7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrSW5pdGlhbFNjaGVtYVJlZlNpemUgPSA2NDsKLQotICAgIElSZW1vdGVTY2hlbWFEb2N1bWVudFByb3ZpZGVyVHlwZSogcmVtb3RlUHJvdmlkZXJfOwotICAgIEFsbG9jYXRvciAqYWxsb2NhdG9yXzsKLSAgICBBbGxvY2F0b3IgKm93bkFsbG9jYXRvcl87Ci0gICAgY29uc3QgU2NoZW1hVHlwZSogcm9vdF87ICAgICAgICAgICAgICAgIC8vITwgUm9vdCBzY2hlbWEuCi0gICAgaW50ZXJuYWw6OlN0YWNrPEFsbG9jYXRvcj4gc2NoZW1hTWFwXzsgIC8vIFN0b3JlcyBjcmVhdGVkIFBvaW50ZXIgLT4gU2NoZW1hcwotICAgIGludGVybmFsOjpTdGFjazxBbGxvY2F0b3I+IHNjaGVtYVJlZl87ICAvLyBTdG9yZXMgUG9pbnRlciBmcm9tICRyZWYgYW5kIHNjaGVtYSB3aGljaCBob2xkcyB0aGUgJHJlZgotfTsKLQotLy8hIEdlbmVyaWNTY2hlbWFEb2N1bWVudCB1c2luZyBWYWx1ZSB0eXBlLgotdHlwZWRlZiBHZW5lcmljU2NoZW1hRG9jdW1lbnQ8VmFsdWU+IFNjaGVtYURvY3VtZW50OwotLy8hIElHZW5lcmljUmVtb3RlU2NoZW1hRG9jdW1lbnRQcm92aWRlciB1c2luZyBTY2hlbWFEb2N1bWVudC4KLXR5cGVkZWYgSUdlbmVyaWNSZW1vdGVTY2hlbWFEb2N1bWVudFByb3ZpZGVyPFNjaGVtYURvY3VtZW50PiBJUmVtb3RlU2NoZW1hRG9jdW1lbnRQcm92aWRlcjsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR2VuZXJpY1NjaGVtYVZhbGlkYXRvcgotCi0vLyEgSlNPTiBTY2hlbWEgVmFsaWRhdG9yLgotLyohCi0gICAgQSBTQVggc3R5bGUgSlNPTiBzY2hlbWEgdmFsaWRhdG9yLgotICAgIEl0IHVzZXMgYSBcYyBHZW5lcmljU2NoZW1hRG9jdW1lbnQgdG8gdmFsaWRhdGUgU0FYIGV2ZW50cy4KLSAgICBJdCBkZWxlZ2F0ZXMgdGhlIGluY29taW5nIFNBWCBldmVudHMgdG8gYW4gb3V0cHV0IGhhbmRsZXIuCi0gICAgVGhlIGRlZmF1bHQgb3V0cHV0IGhhbmRsZXIgZG9lcyBub3RoaW5nLgotICAgIEl0IGNhbiBiZSByZXVzZWQgbXVsdGlwbGUgdGltZXMgYnkgY2FsbGluZyBcYyBSZXNldCgpLgotCi0gICAgXHRwYXJhbSBTY2hlbWFEb2N1bWVudFR5cGUgVHlwZSBvZiBzY2hlbWEgZG9jdW1lbnQuCi0gICAgXHRwYXJhbSBPdXRwdXRIYW5kbGVyIFR5cGUgb2Ygb3V0cHV0IGhhbmRsZXIuIERlZmF1bHQgaGFuZGxlciBkb2VzIG5vdGhpbmcuCi0gICAgXHRwYXJhbSBTdGF0ZUFsbG9jYXRvciBBbGxvY2F0b3IgZm9yIHN0b3JpbmcgdGhlIGludGVybmFsIHZhbGlkYXRpb24gc3RhdGVzLgotKi8KLXRlbXBsYXRlIDwKLSAgICB0eXBlbmFtZSBTY2hlbWFEb2N1bWVudFR5cGUsCi0gICAgdHlwZW5hbWUgT3V0cHV0SGFuZGxlciA9IEJhc2VSZWFkZXJIYW5kbGVyPHR5cGVuYW1lIFNjaGVtYURvY3VtZW50VHlwZTo6U2NoZW1hVHlwZTo6RW5jb2RpbmdUeXBlPiwKLSAgICB0eXBlbmFtZSBTdGF0ZUFsbG9jYXRvciA9IENydEFsbG9jYXRvcj4KLWNsYXNzIEdlbmVyaWNTY2hlbWFWYWxpZGF0b3IgOgotICAgIHB1YmxpYyBpbnRlcm5hbDo6SVNjaGVtYVN0YXRlRmFjdG9yeTx0eXBlbmFtZSBTY2hlbWFEb2N1bWVudFR5cGU6OlNjaGVtYVR5cGU+LCAKLSAgICBwdWJsaWMgaW50ZXJuYWw6OklTY2hlbWFWYWxpZGF0b3IKLXsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFNjaGVtYURvY3VtZW50VHlwZTo6U2NoZW1hVHlwZSBTY2hlbWFUeXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgU2NoZW1hRG9jdW1lbnRUeXBlOjpQb2ludGVyVHlwZSBQb2ludGVyVHlwZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFNjaGVtYVR5cGU6OkVuY29kaW5nVHlwZSBFbmNvZGluZ1R5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBFbmNvZGluZ1R5cGU6OkNoIENoOwotCi0gICAgLy8hIENvbnN0cnVjdG9yIHdpdGhvdXQgb3V0cHV0IGhhbmRsZXIuCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBzY2hlbWFEb2N1bWVudCBUaGUgc2NoZW1hIGRvY3VtZW50IHRvIGNvbmZvcm0gdG8uCi0gICAgICAgIFxwYXJhbSBhbGxvY2F0b3IgT3B0aW9uYWwgYWxsb2NhdG9yIGZvciBzdG9yaW5nIGludGVybmFsIHZhbGlkYXRpb24gc3RhdGVzLgotICAgICAgICBccGFyYW0gc2NoZW1hU3RhY2tDYXBhY2l0eSBPcHRpb25hbCBpbml0aWFsIGNhcGFjaXR5IG9mIHNjaGVtYSBwYXRoIHN0YWNrLgotICAgICAgICBccGFyYW0gZG9jdW1lbnRTdGFja0NhcGFjaXR5IE9wdGlvbmFsIGluaXRpYWwgY2FwYWNpdHkgb2YgZG9jdW1lbnQgcGF0aCBzdGFjay4KLSAgICAqLwotICAgIEdlbmVyaWNTY2hlbWFWYWxpZGF0b3IoCi0gICAgICAgIGNvbnN0IFNjaGVtYURvY3VtZW50VHlwZSYgc2NoZW1hRG9jdW1lbnQsCi0gICAgICAgIFN0YXRlQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwLCAKLSAgICAgICAgc2l6ZV90IHNjaGVtYVN0YWNrQ2FwYWNpdHkgPSBrRGVmYXVsdFNjaGVtYVN0YWNrQ2FwYWNpdHksCi0gICAgICAgIHNpemVfdCBkb2N1bWVudFN0YWNrQ2FwYWNpdHkgPSBrRGVmYXVsdERvY3VtZW50U3RhY2tDYXBhY2l0eSkKLSAgICAgICAgOgotICAgICAgICBzY2hlbWFEb2N1bWVudF8oJnNjaGVtYURvY3VtZW50KSwKLSAgICAgICAgcm9vdF8oc2NoZW1hRG9jdW1lbnQuR2V0Um9vdCgpKSwKLSAgICAgICAgb3V0cHV0SGFuZGxlcl8oR2V0TnVsbEhhbmRsZXIoKSksCi0gICAgICAgIHN0YXRlQWxsb2NhdG9yXyhhbGxvY2F0b3IpLAotICAgICAgICBvd25TdGF0ZUFsbG9jYXRvcl8oMCksCi0gICAgICAgIHNjaGVtYVN0YWNrXyhhbGxvY2F0b3IsIHNjaGVtYVN0YWNrQ2FwYWNpdHkpLAotICAgICAgICBkb2N1bWVudFN0YWNrXyhhbGxvY2F0b3IsIGRvY3VtZW50U3RhY2tDYXBhY2l0eSksCi0gICAgICAgIHZhbGlkXyh0cnVlKQotI2lmIFJBUElESlNPTl9TQ0hFTUFfVkVSQk9TRQotICAgICAgICAsIGRlcHRoXygwKQotI2VuZGlmCi0gICAgewotICAgIH0KLQotICAgIC8vISBDb25zdHJ1Y3RvciB3aXRoIG91dHB1dCBoYW5kbGVyLgotICAgIC8qIQotICAgICAgICBccGFyYW0gc2NoZW1hRG9jdW1lbnQgVGhlIHNjaGVtYSBkb2N1bWVudCB0byBjb25mb3JtIHRvLgotICAgICAgICBccGFyYW0gYWxsb2NhdG9yIE9wdGlvbmFsIGFsbG9jYXRvciBmb3Igc3RvcmluZyBpbnRlcm5hbCB2YWxpZGF0aW9uIHN0YXRlcy4KLSAgICAgICAgXHBhcmFtIHNjaGVtYVN0YWNrQ2FwYWNpdHkgT3B0aW9uYWwgaW5pdGlhbCBjYXBhY2l0eSBvZiBzY2hlbWEgcGF0aCBzdGFjay4KLSAgICAgICAgXHBhcmFtIGRvY3VtZW50U3RhY2tDYXBhY2l0eSBPcHRpb25hbCBpbml0aWFsIGNhcGFjaXR5IG9mIGRvY3VtZW50IHBhdGggc3RhY2suCi0gICAgKi8KLSAgICBHZW5lcmljU2NoZW1hVmFsaWRhdG9yKAotICAgICAgICBjb25zdCBTY2hlbWFEb2N1bWVudFR5cGUmIHNjaGVtYURvY3VtZW50LAotICAgICAgICBPdXRwdXRIYW5kbGVyJiBvdXRwdXRIYW5kbGVyLAotICAgICAgICBTdGF0ZUFsbG9jYXRvciogYWxsb2NhdG9yID0gMCwgCi0gICAgICAgIHNpemVfdCBzY2hlbWFTdGFja0NhcGFjaXR5ID0ga0RlZmF1bHRTY2hlbWFTdGFja0NhcGFjaXR5LAotICAgICAgICBzaXplX3QgZG9jdW1lbnRTdGFja0NhcGFjaXR5ID0ga0RlZmF1bHREb2N1bWVudFN0YWNrQ2FwYWNpdHkpCi0gICAgICAgIDoKLSAgICAgICAgc2NoZW1hRG9jdW1lbnRfKCZzY2hlbWFEb2N1bWVudCksCi0gICAgICAgIHJvb3RfKHNjaGVtYURvY3VtZW50LkdldFJvb3QoKSksCi0gICAgICAgIG91dHB1dEhhbmRsZXJfKG91dHB1dEhhbmRsZXIpLAotICAgICAgICBzdGF0ZUFsbG9jYXRvcl8oYWxsb2NhdG9yKSwKLSAgICAgICAgb3duU3RhdGVBbGxvY2F0b3JfKDApLAotICAgICAgICBzY2hlbWFTdGFja18oYWxsb2NhdG9yLCBzY2hlbWFTdGFja0NhcGFjaXR5KSwKLSAgICAgICAgZG9jdW1lbnRTdGFja18oYWxsb2NhdG9yLCBkb2N1bWVudFN0YWNrQ2FwYWNpdHkpLAotICAgICAgICB2YWxpZF8odHJ1ZSkKLSNpZiBSQVBJREpTT05fU0NIRU1BX1ZFUkJPU0UKLSAgICAgICAgLCBkZXB0aF8oMCkKLSNlbmRpZgotICAgIHsKLSAgICB9Ci0KLSAgICAvLyEgRGVzdHJ1Y3Rvci4KLSAgICB+R2VuZXJpY1NjaGVtYVZhbGlkYXRvcigpIHsKLSAgICAgICAgUmVzZXQoKTsKLSAgICAgICAgUkFQSURKU09OX0RFTEVURShvd25TdGF0ZUFsbG9jYXRvcl8pOwotICAgIH0KLQotICAgIC8vISBSZXNldCB0aGUgaW50ZXJuYWwgc3RhdGVzLgotICAgIHZvaWQgUmVzZXQoKSB7Ci0gICAgICAgIHdoaWxlICghc2NoZW1hU3RhY2tfLkVtcHR5KCkpCi0gICAgICAgICAgICBQb3BTY2hlbWEoKTsKLSAgICAgICAgZG9jdW1lbnRTdGFja18uQ2xlYXIoKTsKLSAgICAgICAgdmFsaWRfID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyEgQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgaXMgdmFsaWQuCi0gICAgLy8gSW1wbGVtZW50YXRpb24gb2YgSVNjaGVtYVZhbGlkYXRvcgotICAgIHZpcnR1YWwgYm9vbCBJc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gdmFsaWRfOyB9Ci0KLSAgICAvLyEgR2V0cyB0aGUgSlNPTiBwb2ludGVyIHBvaW50ZWQgdG8gdGhlIGludmFsaWQgc2NoZW1hLgotICAgIFBvaW50ZXJUeXBlIEdldEludmFsaWRTY2hlbWFQb2ludGVyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gc2NoZW1hU3RhY2tfLkVtcHR5KCkgPyBQb2ludGVyVHlwZSgpIDogc2NoZW1hRG9jdW1lbnRfLT5HZXRQb2ludGVyKCZDdXJyZW50U2NoZW1hKCkpOwotICAgIH0KLQotICAgIC8vISBHZXRzIHRoZSBrZXl3b3JkIG9mIGludmFsaWQgc2NoZW1hLgotICAgIGNvbnN0IENoKiBHZXRJbnZhbGlkU2NoZW1hS2V5d29yZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVN0YWNrXy5FbXB0eSgpID8gMCA6IEN1cnJlbnRDb250ZXh0KCkuaW52YWxpZEtleXdvcmQ7Ci0gICAgfQotCi0gICAgLy8hIEdldHMgdGhlIEpTT04gcG9pbnRlciBwb2ludGVkIHRvIHRoZSBpbnZhbGlkIHZhbHVlLgotICAgIFBvaW50ZXJUeXBlIEdldEludmFsaWREb2N1bWVudFBvaW50ZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudFN0YWNrXy5FbXB0eSgpID8gUG9pbnRlclR5cGUoKSA6IFBvaW50ZXJUeXBlKGRvY3VtZW50U3RhY2tfLnRlbXBsYXRlIEJvdHRvbTxDaD4oKSwgZG9jdW1lbnRTdGFja18uR2V0U2l6ZSgpIC8gc2l6ZW9mKENoKSk7Ci0gICAgfQotCi0jaWYgUkFQSURKU09OX1NDSEVNQV9WRVJCT1NFCi0jZGVmaW5lIFJBUElESlNPTl9TQ0hFTUFfSEFORExFX0JFR0lOX1ZFUkJPU0VfKCkgXAotUkFQSURKU09OX01VTFRJTElORU1BQ1JPX0JFR0lOXAotICAgICpkb2N1bWVudFN0YWNrXy50ZW1wbGF0ZSBQdXNoPENoPigpID0gJ1wwJztcCi0gICAgZG9jdW1lbnRTdGFja18udGVtcGxhdGUgUG9wPENoPigxKTtcCi0gICAgaW50ZXJuYWw6OlByaW50SW52YWxpZERvY3VtZW50KGRvY3VtZW50U3RhY2tfLnRlbXBsYXRlIEJvdHRvbTxDaD4oKSk7XAotUkFQSURKU09OX01VTFRJTElORU1BQ1JPX0VORAotI2Vsc2UKLSNkZWZpbmUgUkFQSURKU09OX1NDSEVNQV9IQU5ETEVfQkVHSU5fVkVSQk9TRV8oKQotI2VuZGlmCi0KLSNkZWZpbmUgUkFQSURKU09OX1NDSEVNQV9IQU5ETEVfQkVHSU5fKG1ldGhvZCwgYXJnMSlcCi0gICAgaWYgKCF2YWxpZF8pIHJldHVybiBmYWxzZTsgXAotICAgIGlmICghQmVnaW5WYWx1ZSgpIHx8ICFDdXJyZW50U2NoZW1hKCkubWV0aG9kIGFyZzEpIHtcCi0gICAgICAgIFJBUElESlNPTl9TQ0hFTUFfSEFORExFX0JFR0lOX1ZFUkJPU0VfKCk7XAotICAgICAgICByZXR1cm4gdmFsaWRfID0gZmFsc2U7XAotICAgIH0KLQotI2RlZmluZSBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9QQVJBTExFTF8obWV0aG9kLCBhcmcyKVwKLSAgICBmb3IgKENvbnRleHQqIGNvbnRleHQgPSBzY2hlbWFTdGFja18udGVtcGxhdGUgQm90dG9tPENvbnRleHQ+KCk7IGNvbnRleHQgIT0gc2NoZW1hU3RhY2tfLnRlbXBsYXRlIEVuZDxDb250ZXh0PigpOyBjb250ZXh0KyspIHtcCi0gICAgICAgIGlmIChjb250ZXh0LT5oYXNoZXIpXAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SGFzaGVyVHlwZSo+KGNvbnRleHQtPmhhc2hlciktPm1ldGhvZCBhcmcyO1wKLSAgICAgICAgaWYgKGNvbnRleHQtPnZhbGlkYXRvcnMpXAotICAgICAgICAgICAgZm9yIChTaXplVHlwZSBpXyA9IDA7IGlfIDwgY29udGV4dC0+dmFsaWRhdG9yQ291bnQ7IGlfKyspXAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEdlbmVyaWNTY2hlbWFWYWxpZGF0b3IqPihjb250ZXh0LT52YWxpZGF0b3JzW2lfXSktPm1ldGhvZCBhcmcyO1wKLSAgICAgICAgaWYgKGNvbnRleHQtPnBhdHRlcm5Qcm9wZXJ0aWVzVmFsaWRhdG9ycylcCi0gICAgICAgICAgICBmb3IgKFNpemVUeXBlIGlfID0gMDsgaV8gPCBjb250ZXh0LT5wYXR0ZXJuUHJvcGVydGllc1ZhbGlkYXRvckNvdW50OyBpXysrKVwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxHZW5lcmljU2NoZW1hVmFsaWRhdG9yKj4oY29udGV4dC0+cGF0dGVyblByb3BlcnRpZXNWYWxpZGF0b3JzW2lfXSktPm1ldGhvZCBhcmcyO1wKLSAgICB9Ci0KLSNkZWZpbmUgUkFQSURKU09OX1NDSEVNQV9IQU5ETEVfRU5EXyhtZXRob2QsIGFyZzIpXAotICAgIHJldHVybiB2YWxpZF8gPSBFbmRWYWx1ZSgpICYmIG91dHB1dEhhbmRsZXJfLm1ldGhvZCBhcmcyCi0KLSNkZWZpbmUgUkFQSURKU09OX1NDSEVNQV9IQU5ETEVfVkFMVUVfKG1ldGhvZCwgYXJnMSwgYXJnMikgXAotICAgIFJBUElESlNPTl9TQ0hFTUFfSEFORExFX0JFR0lOXyAgIChtZXRob2QsIGFyZzEpO1wKLSAgICBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9QQVJBTExFTF8obWV0aG9kLCBhcmcyKTtcCi0gICAgUkFQSURKU09OX1NDSEVNQV9IQU5ETEVfRU5EXyAgICAgKG1ldGhvZCwgYXJnMikKLQotICAgIGJvb2wgTnVsbCgpICAgICAgICAgICAgIHsgUkFQSURKU09OX1NDSEVNQV9IQU5ETEVfVkFMVUVfKE51bGwsICAgKEN1cnJlbnRDb250ZXh0KCkgICApLCAoICkpOyB9Ci0gICAgYm9vbCBCb29sKGJvb2wgYikgICAgICAgeyBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9WQUxVRV8oQm9vbCwgICAoQ3VycmVudENvbnRleHQoKSwgYiksIChiKSk7IH0KLSAgICBib29sIEludChpbnQgaSkgICAgICAgICB7IFJBUElESlNPTl9TQ0hFTUFfSEFORExFX1ZBTFVFXyhJbnQsICAgIChDdXJyZW50Q29udGV4dCgpLCBpKSwgKGkpKTsgfQotICAgIGJvb2wgVWludCh1bnNpZ25lZCB1KSAgIHsgUkFQSURKU09OX1NDSEVNQV9IQU5ETEVfVkFMVUVfKFVpbnQsICAgKEN1cnJlbnRDb250ZXh0KCksIHUpLCAodSkpOyB9Ci0gICAgYm9vbCBJbnQ2NChpbnQ2NF90IGkpICAgeyBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9WQUxVRV8oSW50NjQsICAoQ3VycmVudENvbnRleHQoKSwgaSksIChpKSk7IH0KLSAgICBib29sIFVpbnQ2NCh1aW50NjRfdCB1KSB7IFJBUElESlNPTl9TQ0hFTUFfSEFORExFX1ZBTFVFXyhVaW50NjQsIChDdXJyZW50Q29udGV4dCgpLCB1KSwgKHUpKTsgfQotICAgIGJvb2wgRG91YmxlKGRvdWJsZSBkKSAgIHsgUkFQSURKU09OX1NDSEVNQV9IQU5ETEVfVkFMVUVfKERvdWJsZSwgKEN1cnJlbnRDb250ZXh0KCksIGQpLCAoZCkpOyB9Ci0gICAgYm9vbCBSYXdOdW1iZXIoY29uc3QgQ2gqIHN0ciwgU2l6ZVR5cGUgbGVuZ3RoLCBib29sIGNvcHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJBUElESlNPTl9TQ0hFTUFfSEFORExFX1ZBTFVFXyhTdHJpbmcsIChDdXJyZW50Q29udGV4dCgpLCBzdHIsIGxlbmd0aCwgY29weSksIChzdHIsIGxlbmd0aCwgY29weSkpOyB9Ci0gICAgYm9vbCBTdHJpbmcoY29uc3QgQ2gqIHN0ciwgU2l6ZVR5cGUgbGVuZ3RoLCBib29sIGNvcHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJBUElESlNPTl9TQ0hFTUFfSEFORExFX1ZBTFVFXyhTdHJpbmcsIChDdXJyZW50Q29udGV4dCgpLCBzdHIsIGxlbmd0aCwgY29weSksIChzdHIsIGxlbmd0aCwgY29weSkpOyB9Ci0KLSAgICBib29sIFN0YXJ0T2JqZWN0KCkgewotICAgICAgICBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9CRUdJTl8oU3RhcnRPYmplY3QsIChDdXJyZW50Q29udGV4dCgpKSk7Ci0gICAgICAgIFJBUElESlNPTl9TQ0hFTUFfSEFORExFX1BBUkFMTEVMXyhTdGFydE9iamVjdCwgKCkpOwotICAgICAgICByZXR1cm4gdmFsaWRfID0gb3V0cHV0SGFuZGxlcl8uU3RhcnRPYmplY3QoKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCBLZXkoY29uc3QgQ2gqIHN0ciwgU2l6ZVR5cGUgbGVuLCBib29sIGNvcHkpIHsKLSAgICAgICAgaWYgKCF2YWxpZF8pIHJldHVybiBmYWxzZTsKLSAgICAgICAgQXBwZW5kVG9rZW4oc3RyLCBsZW4pOwotICAgICAgICBpZiAoIUN1cnJlbnRTY2hlbWEoKS5LZXkoQ3VycmVudENvbnRleHQoKSwgc3RyLCBsZW4sIGNvcHkpKSByZXR1cm4gdmFsaWRfID0gZmFsc2U7Ci0gICAgICAgIFJBUElESlNPTl9TQ0hFTUFfSEFORExFX1BBUkFMTEVMXyhLZXksIChzdHIsIGxlbiwgY29weSkpOwotICAgICAgICByZXR1cm4gdmFsaWRfID0gb3V0cHV0SGFuZGxlcl8uS2V5KHN0ciwgbGVuLCBjb3B5KTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCBFbmRPYmplY3QoU2l6ZVR5cGUgbWVtYmVyQ291bnQpIHsgCi0gICAgICAgIGlmICghdmFsaWRfKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFJBUElESlNPTl9TQ0hFTUFfSEFORExFX1BBUkFMTEVMXyhFbmRPYmplY3QsIChtZW1iZXJDb3VudCkpOwotICAgICAgICBpZiAoIUN1cnJlbnRTY2hlbWEoKS5FbmRPYmplY3QoQ3VycmVudENvbnRleHQoKSwgbWVtYmVyQ291bnQpKSByZXR1cm4gdmFsaWRfID0gZmFsc2U7Ci0gICAgICAgIFJBUElESlNPTl9TQ0hFTUFfSEFORExFX0VORF8oRW5kT2JqZWN0LCAobWVtYmVyQ291bnQpKTsKLSAgICB9Ci0KLSAgICBib29sIFN0YXJ0QXJyYXkoKSB7Ci0gICAgICAgIFJBUElESlNPTl9TQ0hFTUFfSEFORExFX0JFR0lOXyhTdGFydEFycmF5LCAoQ3VycmVudENvbnRleHQoKSkpOwotICAgICAgICBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9QQVJBTExFTF8oU3RhcnRBcnJheSwgKCkpOwotICAgICAgICByZXR1cm4gdmFsaWRfID0gb3V0cHV0SGFuZGxlcl8uU3RhcnRBcnJheSgpOwotICAgIH0KLSAgICAKLSAgICBib29sIEVuZEFycmF5KFNpemVUeXBlIGVsZW1lbnRDb3VudCkgewotICAgICAgICBpZiAoIXZhbGlkXykgcmV0dXJuIGZhbHNlOwotICAgICAgICBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9QQVJBTExFTF8oRW5kQXJyYXksIChlbGVtZW50Q291bnQpKTsKLSAgICAgICAgaWYgKCFDdXJyZW50U2NoZW1hKCkuRW5kQXJyYXkoQ3VycmVudENvbnRleHQoKSwgZWxlbWVudENvdW50KSkgcmV0dXJuIHZhbGlkXyA9IGZhbHNlOwotICAgICAgICBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9FTkRfKEVuZEFycmF5LCAoZWxlbWVudENvdW50KSk7Ci0gICAgfQotCi0jdW5kZWYgUkFQSURKU09OX1NDSEVNQV9IQU5ETEVfQkVHSU5fVkVSQk9TRV8KLSN1bmRlZiBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9CRUdJTl8KLSN1bmRlZiBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9QQVJBTExFTF8KLSN1bmRlZiBSQVBJREpTT05fU0NIRU1BX0hBTkRMRV9WQUxVRV8KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIElTY2hlbWFTdGF0ZUZhY3Rvcnk8U2NoZW1hVHlwZT4KLSAgICB2aXJ0dWFsIElTY2hlbWFWYWxpZGF0b3IqIENyZWF0ZVNjaGVtYVZhbGlkYXRvcihjb25zdCBTY2hlbWFUeXBlJiByb290KSB7Ci0gICAgICAgIHJldHVybiBuZXcgKEdldFN0YXRlQWxsb2NhdG9yKCkuTWFsbG9jKHNpemVvZihHZW5lcmljU2NoZW1hVmFsaWRhdG9yKSkpIEdlbmVyaWNTY2hlbWFWYWxpZGF0b3IoKnNjaGVtYURvY3VtZW50Xywgcm9vdCwKLSNpZiBSQVBJREpTT05fU0NIRU1BX1ZFUkJPU0UKLSAgICAgICAgZGVwdGhfICsgMSwKLSNlbmRpZgotICAgICAgICAmR2V0U3RhdGVBbGxvY2F0b3IoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIERlc3Ryb3lTY2hlbWFWYWxpZGF0b3IoSVNjaGVtYVZhbGlkYXRvciogdmFsaWRhdG9yKSB7Ci0gICAgICAgIEdlbmVyaWNTY2hlbWFWYWxpZGF0b3IqIHYgPSBzdGF0aWNfY2FzdDxHZW5lcmljU2NoZW1hVmFsaWRhdG9yKj4odmFsaWRhdG9yKTsKLSAgICAgICAgdi0+fkdlbmVyaWNTY2hlbWFWYWxpZGF0b3IoKTsKLSAgICAgICAgU3RhdGVBbGxvY2F0b3I6OkZyZWUodik7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkKiBDcmVhdGVIYXNoZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgKEdldFN0YXRlQWxsb2NhdG9yKCkuTWFsbG9jKHNpemVvZihIYXNoZXJUeXBlKSkpIEhhc2hlclR5cGUoJkdldFN0YXRlQWxsb2NhdG9yKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdWludDY0X3QgR2V0SGFzaENvZGUodm9pZCogaGFzaGVyKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxIYXNoZXJUeXBlKj4oaGFzaGVyKS0+R2V0SGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgRGVzdHJvcnlIYXNoZXIodm9pZCogaGFzaGVyKSB7Ci0gICAgICAgIEhhc2hlclR5cGUqIGggPSBzdGF0aWNfY2FzdDxIYXNoZXJUeXBlKj4oaGFzaGVyKTsKLSAgICAgICAgaC0+fkhhc2hlclR5cGUoKTsKLSAgICAgICAgU3RhdGVBbGxvY2F0b3I6OkZyZWUoaCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkKiBNYWxsb2NTdGF0ZShzaXplX3Qgc2l6ZSkgewotICAgICAgICByZXR1cm4gR2V0U3RhdGVBbGxvY2F0b3IoKS5NYWxsb2Moc2l6ZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkKiBSZWFsbG9jU3RhdGUodm9pZCogb3JpZ2luYWxQdHIsIHNpemVfdCBvcmlnaW5hbFNpemUsIHNpemVfdCBuZXdTaXplKSB7Ci0gICAgICAgIHJldHVybiBHZXRTdGF0ZUFsbG9jYXRvcigpLlJlYWxsb2Mob3JpZ2luYWxQdHIsIG9yaWdpbmFsU2l6ZSwgbmV3U2l6ZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIEZyZWVTdGF0ZSh2b2lkKiBwKSB7Ci0gICAgICAgIHJldHVybiBTdGF0ZUFsbG9jYXRvcjo6RnJlZShwKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBTY2hlbWFUeXBlOjpDb250ZXh0IENvbnRleHQ7Ci0gICAgdHlwZWRlZiBHZW5lcmljVmFsdWU8VVRGODw+LCBTdGF0ZUFsbG9jYXRvcj4gSGFzaENvZGVBcnJheTsKLSAgICB0eXBlZGVmIGludGVybmFsOjpIYXNoZXI8RW5jb2RpbmdUeXBlLCBTdGF0ZUFsbG9jYXRvcj4gSGFzaGVyVHlwZTsKLQotICAgIEdlbmVyaWNTY2hlbWFWYWxpZGF0b3IoIAotICAgICAgICBjb25zdCBTY2hlbWFEb2N1bWVudFR5cGUmIHNjaGVtYURvY3VtZW50LAotICAgICAgICBjb25zdCBTY2hlbWFUeXBlJiByb290LAotI2lmIFJBUElESlNPTl9TQ0hFTUFfVkVSQk9TRQotICAgICAgICB1bnNpZ25lZCBkZXB0aCwKLSNlbmRpZgotICAgICAgICBTdGF0ZUFsbG9jYXRvciogYWxsb2NhdG9yID0gMCwKLSAgICAgICAgc2l6ZV90IHNjaGVtYVN0YWNrQ2FwYWNpdHkgPSBrRGVmYXVsdFNjaGVtYVN0YWNrQ2FwYWNpdHksCi0gICAgICAgIHNpemVfdCBkb2N1bWVudFN0YWNrQ2FwYWNpdHkgPSBrRGVmYXVsdERvY3VtZW50U3RhY2tDYXBhY2l0eSkKLSAgICAgICAgOgotICAgICAgICBzY2hlbWFEb2N1bWVudF8oJnNjaGVtYURvY3VtZW50KSwKLSAgICAgICAgcm9vdF8ocm9vdCksCi0gICAgICAgIG91dHB1dEhhbmRsZXJfKEdldE51bGxIYW5kbGVyKCkpLAotICAgICAgICBzdGF0ZUFsbG9jYXRvcl8oYWxsb2NhdG9yKSwKLSAgICAgICAgb3duU3RhdGVBbGxvY2F0b3JfKDApLAotICAgICAgICBzY2hlbWFTdGFja18oYWxsb2NhdG9yLCBzY2hlbWFTdGFja0NhcGFjaXR5KSwKLSAgICAgICAgZG9jdW1lbnRTdGFja18oYWxsb2NhdG9yLCBkb2N1bWVudFN0YWNrQ2FwYWNpdHkpLAotICAgICAgICB2YWxpZF8odHJ1ZSkKLSNpZiBSQVBJREpTT05fU0NIRU1BX1ZFUkJPU0UKLSAgICAgICAgLCBkZXB0aF8oZGVwdGgpCi0jZW5kaWYKLSAgICB7Ci0gICAgfQotCi0gICAgU3RhdGVBbGxvY2F0b3ImIEdldFN0YXRlQWxsb2NhdG9yKCkgewotICAgICAgICBpZiAoIXN0YXRlQWxsb2NhdG9yXykKLSAgICAgICAgICAgIHN0YXRlQWxsb2NhdG9yXyA9IG93blN0YXRlQWxsb2NhdG9yXyA9IFJBUElESlNPTl9ORVcoU3RhdGVBbGxvY2F0b3IoKSk7Ci0gICAgICAgIHJldHVybiAqc3RhdGVBbGxvY2F0b3JfOwotICAgIH0KLQotICAgIGJvb2wgQmVnaW5WYWx1ZSgpIHsKLSAgICAgICAgaWYgKHNjaGVtYVN0YWNrXy5FbXB0eSgpKQotICAgICAgICAgICAgUHVzaFNjaGVtYShyb290Xyk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKEN1cnJlbnRDb250ZXh0KCkuaW5BcnJheSkKLSAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VG9rZW5IZWxwZXI8aW50ZXJuYWw6OlN0YWNrPFN0YXRlQWxsb2NhdG9yPiwgQ2g+OjpBcHBlbmRJbmRleFRva2VuKGRvY3VtZW50U3RhY2tfLCBDdXJyZW50Q29udGV4dCgpLmFycmF5RWxlbWVudEluZGV4KTsKLQotICAgICAgICAgICAgaWYgKCFDdXJyZW50U2NoZW1hKCkuQmVnaW5WYWx1ZShDdXJyZW50Q29udGV4dCgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIFNpemVUeXBlIGNvdW50ID0gQ3VycmVudENvbnRleHQoKS5wYXR0ZXJuUHJvcGVydGllc1NjaGVtYUNvdW50OwotICAgICAgICAgICAgY29uc3QgU2NoZW1hVHlwZSoqIHNhID0gQ3VycmVudENvbnRleHQoKS5wYXR0ZXJuUHJvcGVydGllc1NjaGVtYXM7Ci0gICAgICAgICAgICB0eXBlbmFtZSBDb250ZXh0OjpQYXR0ZXJuVmFsaWRhdG9yVHlwZSBwYXR0ZXJuVmFsaWRhdG9yVHlwZSA9IEN1cnJlbnRDb250ZXh0KCkudmFsdWVQYXR0ZXJuVmFsaWRhdG9yVHlwZTsKLSAgICAgICAgICAgIGJvb2wgdmFsdWVVbmlxdWVuZXNzID0gQ3VycmVudENvbnRleHQoKS52YWx1ZVVuaXF1ZW5lc3M7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudENvbnRleHQoKS52YWx1ZVNjaGVtYSkKLSAgICAgICAgICAgICAgICBQdXNoU2NoZW1hKCpDdXJyZW50Q29udGV4dCgpLnZhbHVlU2NoZW1hKTsKLQotICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIEN1cnJlbnRDb250ZXh0KCkub2JqZWN0UGF0dGVyblZhbGlkYXRvclR5cGUgPSBwYXR0ZXJuVmFsaWRhdG9yVHlwZTsKLSAgICAgICAgICAgICAgICBJU2NoZW1hVmFsaWRhdG9yKiomIHZhID0gQ3VycmVudENvbnRleHQoKS5wYXR0ZXJuUHJvcGVydGllc1ZhbGlkYXRvcnM7Ci0gICAgICAgICAgICAgICAgU2l6ZVR5cGUmIHZhbGlkYXRvckNvdW50ID0gQ3VycmVudENvbnRleHQoKS5wYXR0ZXJuUHJvcGVydGllc1ZhbGlkYXRvckNvdW50OwotICAgICAgICAgICAgICAgIHZhID0gc3RhdGljX2Nhc3Q8SVNjaGVtYVZhbGlkYXRvcioqPihNYWxsb2NTdGF0ZShzaXplb2YoSVNjaGVtYVZhbGlkYXRvciopICogY291bnQpKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNpemVUeXBlIGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgdmFbdmFsaWRhdG9yQ291bnQrK10gPSBDcmVhdGVTY2hlbWFWYWxpZGF0b3IoKnNhW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ3VycmVudENvbnRleHQoKS5hcnJheVVuaXF1ZW5lc3MgPSB2YWx1ZVVuaXF1ZW5lc3M7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBFbmRWYWx1ZSgpIHsKLSAgICAgICAgaWYgKCFDdXJyZW50U2NoZW1hKCkuRW5kVmFsdWUoQ3VycmVudENvbnRleHQoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZiBSQVBJREpTT05fU0NIRU1BX1ZFUkJPU0UKLSAgICAgICAgR2VuZXJpY1N0cmluZ0J1ZmZlcjxFbmNvZGluZ1R5cGU+IHNiOwotICAgICAgICBzY2hlbWFEb2N1bWVudF8tPkdldFBvaW50ZXIoJkN1cnJlbnRTY2hlbWEoKSkuU3RyaW5naWZ5KHNiKTsKLQotICAgICAgICAqZG9jdW1lbnRTdGFja18udGVtcGxhdGUgUHVzaDxDaD4oKSA9ICdcMCc7Ci0gICAgICAgIGRvY3VtZW50U3RhY2tfLnRlbXBsYXRlIFBvcDxDaD4oMSk7Ci0gICAgICAgIGludGVybmFsOjpQcmludFZhbGlkYXRvclBvaW50ZXJzKGRlcHRoXywgc2IuR2V0U3RyaW5nKCksIGRvY3VtZW50U3RhY2tfLnRlbXBsYXRlIEJvdHRvbTxDaD4oKSk7Ci0jZW5kaWYKLQotICAgICAgICB1aW50NjRfdCBoID0gQ3VycmVudENvbnRleHQoKS5hcnJheVVuaXF1ZW5lc3MgPyBzdGF0aWNfY2FzdDxIYXNoZXJUeXBlKj4oQ3VycmVudENvbnRleHQoKS5oYXNoZXIpLT5HZXRIYXNoQ29kZSgpIDogMDsKLSAgICAgICAgCi0gICAgICAgIFBvcFNjaGVtYSgpOwotCi0gICAgICAgIGlmICghc2NoZW1hU3RhY2tfLkVtcHR5KCkpIHsKLSAgICAgICAgICAgIENvbnRleHQmIGNvbnRleHQgPSBDdXJyZW50Q29udGV4dCgpOwotICAgICAgICAgICAgaWYgKGNvbnRleHQudmFsdWVVbmlxdWVuZXNzKSB7Ci0gICAgICAgICAgICAgICAgSGFzaENvZGVBcnJheSogYSA9IHN0YXRpY19jYXN0PEhhc2hDb2RlQXJyYXkqPihjb250ZXh0LmFycmF5RWxlbWVudEhhc2hDb2Rlcyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFhKQotICAgICAgICAgICAgICAgICAgICBDdXJyZW50Q29udGV4dCgpLmFycmF5RWxlbWVudEhhc2hDb2RlcyA9IGEgPSBuZXcgKEdldFN0YXRlQWxsb2NhdG9yKCkuTWFsbG9jKHNpemVvZihIYXNoQ29kZUFycmF5KSkpIEhhc2hDb2RlQXJyYXkoa0FycmF5VHlwZSk7Ci0gICAgICAgICAgICAgICAgZm9yICh0eXBlbmFtZSBIYXNoQ29kZUFycmF5OjpDb25zdFZhbHVlSXRlcmF0b3IgaXRyID0gYS0+QmVnaW4oKTsgaXRyICE9IGEtPkVuZCgpOyArK2l0cikKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ci0+R2V0VWludDY0KCkgPT0gaCkKLSAgICAgICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9JTlZBTElEX0tFWVdPUkRfUkVUVVJOKFNjaGVtYVR5cGU6OkdldFVuaXF1ZUl0ZW1zU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGEtPlB1c2hCYWNrKGgsIEdldFN0YXRlQWxsb2NhdG9yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXN0IHRva2VuIG9mIGRvY3VtZW50IHBvaW50ZXIKLSAgICAgICAgd2hpbGUgKCFkb2N1bWVudFN0YWNrXy5FbXB0eSgpICYmICpkb2N1bWVudFN0YWNrXy50ZW1wbGF0ZSBQb3A8Q2g+KDEpICE9ICcvJykKLSAgICAgICAgICAgIDsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB2b2lkIEFwcGVuZFRva2VuKGNvbnN0IENoKiBzdHIsIFNpemVUeXBlIGxlbikgewotICAgICAgICBkb2N1bWVudFN0YWNrXy50ZW1wbGF0ZSBSZXNlcnZlPENoPigxICsgbGVuICogMik7IC8vIHdvcnN0IGNhc2UgYWxsIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgYXMgdHdvIGNoYXJhY3RlcnMKLSAgICAgICAgKmRvY3VtZW50U3RhY2tfLnRlbXBsYXRlIFB1c2hVbnNhZmU8Q2g+KCkgPSAnLyc7Ci0gICAgICAgIGZvciAoU2l6ZVR5cGUgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKHN0cltpXSA9PSAnficpIHsKLSAgICAgICAgICAgICAgICAqZG9jdW1lbnRTdGFja18udGVtcGxhdGUgUHVzaFVuc2FmZTxDaD4oKSA9ICd+JzsKLSAgICAgICAgICAgICAgICAqZG9jdW1lbnRTdGFja18udGVtcGxhdGUgUHVzaFVuc2FmZTxDaD4oKSA9ICcwJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0cltpXSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICAqZG9jdW1lbnRTdGFja18udGVtcGxhdGUgUHVzaFVuc2FmZTxDaD4oKSA9ICd+JzsKLSAgICAgICAgICAgICAgICAqZG9jdW1lbnRTdGFja18udGVtcGxhdGUgUHVzaFVuc2FmZTxDaD4oKSA9ICcxJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqZG9jdW1lbnRTdGFja18udGVtcGxhdGUgUHVzaFVuc2FmZTxDaD4oKSA9IHN0cltpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFJBUElESlNPTl9GT1JDRUlOTElORSB2b2lkIFB1c2hTY2hlbWEoY29uc3QgU2NoZW1hVHlwZSYgc2NoZW1hKSB7IG5ldyAoc2NoZW1hU3RhY2tfLnRlbXBsYXRlIFB1c2g8Q29udGV4dD4oKSkgQ29udGV4dCgqdGhpcywgJnNjaGVtYSk7IH0KLSAgICAKLSAgICBSQVBJREpTT05fRk9SQ0VJTkxJTkUgdm9pZCBQb3BTY2hlbWEoKSB7Ci0gICAgICAgIENvbnRleHQqIGMgPSBzY2hlbWFTdGFja18udGVtcGxhdGUgUG9wPENvbnRleHQ+KDEpOwotICAgICAgICBpZiAoSGFzaENvZGVBcnJheSogYSA9IHN0YXRpY19jYXN0PEhhc2hDb2RlQXJyYXkqPihjLT5hcnJheUVsZW1lbnRIYXNoQ29kZXMpKSB7Ci0gICAgICAgICAgICBhLT5+SGFzaENvZGVBcnJheSgpOwotICAgICAgICAgICAgU3RhdGVBbGxvY2F0b3I6OkZyZWUoYSk7Ci0gICAgICAgIH0KLSAgICAgICAgYy0+fkNvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBjb25zdCBTY2hlbWFUeXBlJiBDdXJyZW50U2NoZW1hKCkgY29uc3QgeyByZXR1cm4gKnNjaGVtYVN0YWNrXy50ZW1wbGF0ZSBUb3A8Q29udGV4dD4oKS0+c2NoZW1hOyB9Ci0gICAgQ29udGV4dCYgQ3VycmVudENvbnRleHQoKSB7IHJldHVybiAqc2NoZW1hU3RhY2tfLnRlbXBsYXRlIFRvcDxDb250ZXh0PigpOyB9Ci0gICAgY29uc3QgQ29udGV4dCYgQ3VycmVudENvbnRleHQoKSBjb25zdCB7IHJldHVybiAqc2NoZW1hU3RhY2tfLnRlbXBsYXRlIFRvcDxDb250ZXh0PigpOyB9Ci0KLSAgICBzdGF0aWMgT3V0cHV0SGFuZGxlciYgR2V0TnVsbEhhbmRsZXIoKSB7Ci0gICAgICAgIHN0YXRpYyBPdXRwdXRIYW5kbGVyIG51bGxIYW5kbGVyOwotICAgICAgICByZXR1cm4gbnVsbEhhbmRsZXI7Ci0gICAgfQotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRGVmYXVsdFNjaGVtYVN0YWNrQ2FwYWNpdHkgPSAxMDI0OwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0RlZmF1bHREb2N1bWVudFN0YWNrQ2FwYWNpdHkgPSAyNTY7Ci0gICAgY29uc3QgU2NoZW1hRG9jdW1lbnRUeXBlKiBzY2hlbWFEb2N1bWVudF87Ci0gICAgY29uc3QgU2NoZW1hVHlwZSYgcm9vdF87Ci0gICAgT3V0cHV0SGFuZGxlciYgb3V0cHV0SGFuZGxlcl87Ci0gICAgU3RhdGVBbGxvY2F0b3IqIHN0YXRlQWxsb2NhdG9yXzsKLSAgICBTdGF0ZUFsbG9jYXRvciogb3duU3RhdGVBbGxvY2F0b3JfOwotICAgIGludGVybmFsOjpTdGFjazxTdGF0ZUFsbG9jYXRvcj4gc2NoZW1hU3RhY2tfOyAgICAvLyE8IHN0YWNrIHRvIHN0b3JlIHRoZSBjdXJyZW50IHBhdGggb2Ygc2NoZW1hIChCYXNlU2NoZW1hVHlwZSAqKQotICAgIGludGVybmFsOjpTdGFjazxTdGF0ZUFsbG9jYXRvcj4gZG9jdW1lbnRTdGFja187ICAvLyE8IHN0YWNrIHRvIHN0b3JlIHRoZSBjdXJyZW50IHBhdGggb2YgdmFsaWRhdGluZyBkb2N1bWVudCAoQ2gpCi0gICAgYm9vbCB2YWxpZF87Ci0jaWYgUkFQSURKU09OX1NDSEVNQV9WRVJCT1NFCi0gICAgdW5zaWduZWQgZGVwdGhfOwotI2VuZGlmCi19OwotCi10eXBlZGVmIEdlbmVyaWNTY2hlbWFWYWxpZGF0b3I8U2NoZW1hRG9jdW1lbnQ+IFNjaGVtYVZhbGlkYXRvcjsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU2NoZW1hVmFsaWRhdGluZ1JlYWRlcgotCi0vLyEgQSBoZWxwZXIgY2xhc3MgZm9yIHBhcnNpbmcgd2l0aCB2YWxpZGF0aW9uLgotLyohCi0gICAgVGhpcyBoZWxwZXIgY2xhc3MgaXMgYSBmdW5jdG9yLCBkZXNpZ25lZCBhcyBhIHBhcmFtZXRlciBvZiBccmVmIEdlbmVyaWNEb2N1bWVudDo6UG9wdWxhdGUoKS4KLQotICAgIFx0cGFyYW0gcGFyc2VGbGFncyBDb21iaW5hdGlvbiBvZiBccmVmIFBhcnNlRmxhZy4KLSAgICBcdHBhcmFtIElucHV0U3RyZWFtIFR5cGUgb2YgaW5wdXQgc3RyZWFtLCBpbXBsZW1lbnRpbmcgU3RyZWFtIGNvbmNlcHQuCi0gICAgXHRwYXJhbSBTb3VyY2VFbmNvZGluZyBFbmNvZGluZyBvZiB0aGUgaW5wdXQgc3RyZWFtLgotICAgIFx0cGFyYW0gU2NoZW1hRG9jdW1lbnRUeXBlIFR5cGUgb2Ygc2NoZW1hIGRvY3VtZW50LgotICAgIFx0cGFyYW0gU3RhY2tBbGxvY2F0b3IgQWxsb2NhdG9yIHR5cGUgZm9yIHN0YWNrLgotKi8KLXRlbXBsYXRlIDwKLSAgICB1bnNpZ25lZCBwYXJzZUZsYWdzLAotICAgIHR5cGVuYW1lIElucHV0U3RyZWFtLAotICAgIHR5cGVuYW1lIFNvdXJjZUVuY29kaW5nLAotICAgIHR5cGVuYW1lIFNjaGVtYURvY3VtZW50VHlwZSA9IFNjaGVtYURvY3VtZW50LAotICAgIHR5cGVuYW1lIFN0YWNrQWxsb2NhdG9yID0gQ3J0QWxsb2NhdG9yPgotY2xhc3MgU2NoZW1hVmFsaWRhdGluZ1JlYWRlciB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBTY2hlbWFEb2N1bWVudFR5cGU6OlBvaW50ZXJUeXBlIFBvaW50ZXJUeXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgSW5wdXRTdHJlYW06OkNoIENoOwotCi0gICAgLy8hIENvbnN0cnVjdG9yCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBpcyBJbnB1dCBzdHJlYW0uCi0gICAgICAgIFxwYXJhbSBzZCBTY2hlbWEgZG9jdW1lbnQuCi0gICAgKi8KLSAgICBTY2hlbWFWYWxpZGF0aW5nUmVhZGVyKElucHV0U3RyZWFtJiBpcywgY29uc3QgU2NoZW1hRG9jdW1lbnRUeXBlJiBzZCkgOiBpc18oaXMpLCBzZF8oc2QpLCBpbnZhbGlkU2NoZW1hS2V5d29yZF8oKSwgaXNWYWxpZF8odHJ1ZSkge30KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyPgotICAgIGJvb2wgb3BlcmF0b3IoKShIYW5kbGVyJiBoYW5kbGVyKSB7Ci0gICAgICAgIEdlbmVyaWNSZWFkZXI8U291cmNlRW5jb2RpbmcsIHR5cGVuYW1lIFNjaGVtYURvY3VtZW50VHlwZTo6RW5jb2RpbmdUeXBlLCBTdGFja0FsbG9jYXRvcj4gcmVhZGVyOwotICAgICAgICBHZW5lcmljU2NoZW1hVmFsaWRhdG9yPFNjaGVtYURvY3VtZW50VHlwZSwgSGFuZGxlcj4gdmFsaWRhdG9yKHNkXywgaGFuZGxlcik7Ci0gICAgICAgIHBhcnNlUmVzdWx0XyA9IHJlYWRlci50ZW1wbGF0ZSBQYXJzZTxwYXJzZUZsYWdzPihpc18sIHZhbGlkYXRvcik7Ci0KLSAgICAgICAgaWYgKChpc1ZhbGlkXyA9IHZhbGlkYXRvci5Jc1ZhbGlkKCkpKSB7Ci0gICAgICAgICAgICBpbnZhbGlkU2NoZW1hUG9pbnRlcl8gPSBQb2ludGVyVHlwZSgpOwotICAgICAgICAgICAgaW52YWxpZFNjaGVtYUtleXdvcmRfID0gMDsKLSAgICAgICAgICAgIGludmFsaWREb2N1bWVudFBvaW50ZXJfID0gUG9pbnRlclR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGludmFsaWRTY2hlbWFQb2ludGVyXyA9IHZhbGlkYXRvci5HZXRJbnZhbGlkU2NoZW1hUG9pbnRlcigpOwotICAgICAgICAgICAgaW52YWxpZFNjaGVtYUtleXdvcmRfID0gdmFsaWRhdG9yLkdldEludmFsaWRTY2hlbWFLZXl3b3JkKCk7Ci0gICAgICAgICAgICBpbnZhbGlkRG9jdW1lbnRQb2ludGVyXyA9IHZhbGlkYXRvci5HZXRJbnZhbGlkRG9jdW1lbnRQb2ludGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyc2VSZXN1bHRfOwotICAgIH0KLQotICAgIGNvbnN0IFBhcnNlUmVzdWx0JiBHZXRQYXJzZVJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIHBhcnNlUmVzdWx0XzsgfQotICAgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIGlzVmFsaWRfOyB9Ci0gICAgY29uc3QgUG9pbnRlclR5cGUmIEdldEludmFsaWRTY2hlbWFQb2ludGVyKCkgY29uc3QgeyByZXR1cm4gaW52YWxpZFNjaGVtYVBvaW50ZXJfOyB9Ci0gICAgY29uc3QgQ2gqIEdldEludmFsaWRTY2hlbWFLZXl3b3JkKCkgY29uc3QgeyByZXR1cm4gaW52YWxpZFNjaGVtYUtleXdvcmRfOyB9Ci0gICAgY29uc3QgUG9pbnRlclR5cGUmIEdldEludmFsaWREb2N1bWVudFBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBpbnZhbGlkRG9jdW1lbnRQb2ludGVyXzsgfQotCi1wcml2YXRlOgotICAgIElucHV0U3RyZWFtJiBpc187Ci0gICAgY29uc3QgU2NoZW1hRG9jdW1lbnRUeXBlJiBzZF87Ci0KLSAgICBQYXJzZVJlc3VsdCBwYXJzZVJlc3VsdF87Ci0gICAgUG9pbnRlclR5cGUgaW52YWxpZFNjaGVtYVBvaW50ZXJfOwotICAgIGNvbnN0IENoKiBpbnZhbGlkU2NoZW1hS2V5d29yZF87Ci0gICAgUG9pbnRlclR5cGUgaW52YWxpZERvY3VtZW50UG9pbnRlcl87Ci0gICAgYm9vbCBpc1ZhbGlkXzsKLX07Ci0KLVJBUElESlNPTl9OQU1FU1BBQ0VfRU5ECi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQotUkFQSURKU09OX0RJQUdfUE9QCi0jZW5kaWYKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUE9QCi0jZW5kaWYKLQotI2VuZGlmIC8vIFJBUElESlNPTl9TQ0hFTUFfSF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vc3RyZWFtLmggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL3N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI3ODNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vc3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInJhcGlkanNvbi5oIgotCi0jaWZuZGVmIFJBUElESlNPTl9TVFJFQU1fSF8KLSNkZWZpbmUgUkFQSURKU09OX1NUUkVBTV9IXwotCi0jaW5jbHVkZSAiZW5jb2RpbmdzLmgiCi0KLVJBUElESlNPTl9OQU1FU1BBQ0VfQkVHSU4KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gIFN0cmVhbQotCi0vKiEgXGNsYXNzIHJhcGlkanNvbjo6U3RyZWFtCi0gICAgXGJyaWVmIENvbmNlcHQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgY2hhcmFjdGVycy4KLQotICAgIEZvciByZWFkLW9ubHkgc3RyZWFtLCBubyBuZWVkIHRvIGltcGxlbWVudCBQdXRCZWdpbigpLCBQdXQoKSwgRmx1c2goKSBhbmQgUHV0RW5kKCkuCi0KLSAgICBGb3Igd3JpdGUtb25seSBzdHJlYW0sIG9ubHkgbmVlZCB0byBpbXBsZW1lbnQgUHV0KCkgYW5kIEZsdXNoKCkuCi0KLVxjb2RlCi1jb25jZXB0IFN0cmVhbSB7Ci0gICAgdHlwZW5hbWUgQ2g7ICAgIC8vITwgQ2hhcmFjdGVyIHR5cGUgb2YgdGhlIHN0cmVhbS4KLQotICAgIC8vISBSZWFkIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHN0cmVhbSB3aXRob3V0IG1vdmluZyB0aGUgcmVhZCBjdXJzb3IuCi0gICAgQ2ggUGVlaygpIGNvbnN0OwotCi0gICAgLy8hIFJlYWQgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGZyb20gc3RyZWFtIGFuZCBtb3ZpbmcgdGhlIHJlYWQgY3Vyc29yIHRvIG5leHQgY2hhcmFjdGVyLgotICAgIENoIFRha2UoKTsKLQotICAgIC8vISBHZXQgdGhlIGN1cnJlbnQgcmVhZCBjdXJzb3IuCi0gICAgLy8hIFxyZXR1cm4gTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHN0YXJ0LgotICAgIHNpemVfdCBUZWxsKCk7Ci0KLSAgICAvLyEgQmVnaW4gd3JpdGluZyBvcGVyYXRpb24gYXQgdGhlIGN1cnJlbnQgcmVhZCBwb2ludGVyLgotICAgIC8vISBccmV0dXJuIFRoZSBiZWdpbiB3cml0ZXIgcG9pbnRlci4KLSAgICBDaCogUHV0QmVnaW4oKTsKLQotICAgIC8vISBXcml0ZSBhIGNoYXJhY3Rlci4KLSAgICB2b2lkIFB1dChDaCBjKTsKLQotICAgIC8vISBGbHVzaCB0aGUgYnVmZmVyLgotICAgIHZvaWQgRmx1c2goKTsKLQotICAgIC8vISBFbmQgdGhlIHdyaXRpbmcgb3BlcmF0aW9uLgotICAgIC8vISBccGFyYW0gYmVnaW4gVGhlIGJlZ2luIHdyaXRlIHBvaW50ZXIgcmV0dXJuZWQgYnkgUHV0QmVnaW4oKS4KLSAgICAvLyEgXHJldHVybiBOdW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLgotICAgIHNpemVfdCBQdXRFbmQoQ2gqIGJlZ2luKTsKLX0KLVxlbmRjb2RlCi0qLwotCi0vLyEgUHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3Igc3RyZWFtLgotLyohCi0gICAgQnkgdXNpbmcgdHJhaXRzIHBhdHRlcm4sIHRoaXMgdHlwZSBwcm92aWRlcyBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3Igc3RyZWFtLgotICAgIEZvciBjdXN0b20gc3RyZWFtLCB0aGlzIHR5cGUgY2FuIGJlIHNwZWNpYWxpemVkIGZvciBvdGhlciBjb25maWd1cmF0aW9uLgotICAgIFNlZSBURVNUKFJlYWRlciwgQ3VzdG9tU3RyaW5nU3RyZWFtKSBpbiByZWFkZXJ0ZXN0LmNwcCBmb3IgZXhhbXBsZS4KLSovCi10ZW1wbGF0ZTx0eXBlbmFtZSBTdHJlYW0+Ci1zdHJ1Y3QgU3RyZWFtVHJhaXRzIHsKLSAgICAvLyEgV2hldGhlciB0byBtYWtlIGxvY2FsIGNvcHkgb2Ygc3RyZWFtIGZvciBvcHRpbWl6YXRpb24gZHVyaW5nIHBhcnNpbmcuCi0gICAgLyohCi0gICAgICAgIEJ5IGRlZmF1bHQsIGZvciBzYWZldHksIHN0cmVhbXMgZG8gbm90IHVzZSBsb2NhbCBjb3B5IG9wdGltaXphdGlvbi4KLSAgICAgICAgU3RyZWFtIHRoYXQgY2FuIGJlIGNvcGllZCBmYXN0IHNob3VsZCBzcGVjaWFsaXplIHRoaXMsIGxpa2UgU3RyZWFtVHJhaXRzPFN0cmluZ1N0cmVhbT4uCi0gICAgKi8KLSAgICBlbnVtIHsgY29weU9wdGltaXphdGlvbiA9IDAgfTsKLX07Ci0KLS8vISBSZXNlcnZlIG4gY2hhcmFjdGVycyBmb3Igd3JpdGluZyB0byBhIHN0cmVhbS4KLXRlbXBsYXRlPHR5cGVuYW1lIFN0cmVhbT4KLWlubGluZSB2b2lkIFB1dFJlc2VydmUoU3RyZWFtJiBzdHJlYW0sIHNpemVfdCBjb3VudCkgewotICAgICh2b2lkKXN0cmVhbTsKLSAgICAodm9pZCljb3VudDsKLX0KLQotLy8hIFdyaXRlIGNoYXJhY3RlciB0byBhIHN0cmVhbSwgcHJlc3VtaW5nIGJ1ZmZlciBpcyByZXNlcnZlZC4KLXRlbXBsYXRlPHR5cGVuYW1lIFN0cmVhbT4KLWlubGluZSB2b2lkIFB1dFVuc2FmZShTdHJlYW0mIHN0cmVhbSwgdHlwZW5hbWUgU3RyZWFtOjpDaCBjKSB7Ci0gICAgc3RyZWFtLlB1dChjKTsKLX0KLQotLy8hIFB1dCBOIGNvcGllcyBvZiBhIGNoYXJhY3RlciB0byBhIHN0cmVhbS4KLXRlbXBsYXRlPHR5cGVuYW1lIFN0cmVhbSwgdHlwZW5hbWUgQ2g+Ci1pbmxpbmUgdm9pZCBQdXROKFN0cmVhbSYgc3RyZWFtLCBDaCBjLCBzaXplX3QgbikgewotICAgIFB1dFJlc2VydmU8U3RyZWFtPihzdHJlYW0sIG4pOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKQotICAgICAgICBQdXRVbnNhZmUoc3RyZWFtLCBjKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gU3RyaW5nU3RyZWFtCi0KLS8vISBSZWFkLW9ubHkgc3RyaW5nIHN0cmVhbS4KLS8qISBcbm90ZSBpbXBsZW1lbnRzIFN0cmVhbSBjb25jZXB0Ci0qLwotdGVtcGxhdGUgPHR5cGVuYW1lIEVuY29kaW5nPgotc3RydWN0IEdlbmVyaWNTdHJpbmdTdHJlYW0gewotICAgIHR5cGVkZWYgdHlwZW5hbWUgRW5jb2Rpbmc6OkNoIENoOwotCi0gICAgR2VuZXJpY1N0cmluZ1N0cmVhbShjb25zdCBDaCAqc3JjKSA6IHNyY18oc3JjKSwgaGVhZF8oc3JjKSB7fQotCi0gICAgQ2ggUGVlaygpIGNvbnN0IHsgcmV0dXJuICpzcmNfOyB9Ci0gICAgQ2ggVGFrZSgpIHsgcmV0dXJuICpzcmNfKys7IH0KLSAgICBzaXplX3QgVGVsbCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4oc3JjXyAtIGhlYWRfKTsgfQotCi0gICAgQ2gqIFB1dEJlZ2luKCkgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgcmV0dXJuIDA7IH0KLSAgICB2b2lkIFB1dChDaCkgeyBSQVBJREpTT05fQVNTRVJUKGZhbHNlKTsgfQotICAgIHZvaWQgRmx1c2goKSB7IFJBUElESlNPTl9BU1NFUlQoZmFsc2UpOyB9Ci0gICAgc2l6ZV90IFB1dEVuZChDaCopIHsgUkFQSURKU09OX0FTU0VSVChmYWxzZSk7IHJldHVybiAwOyB9Ci0KLSAgICBjb25zdCBDaCogc3JjXzsgICAgIC8vITwgQ3VycmVudCByZWFkIHBvc2l0aW9uLgotICAgIGNvbnN0IENoKiBoZWFkXzsgICAgLy8hPCBPcmlnaW5hbCBoZWFkIG9mIHRoZSBzdHJpbmcuCi19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRW5jb2Rpbmc+Ci1zdHJ1Y3QgU3RyZWFtVHJhaXRzPEdlbmVyaWNTdHJpbmdTdHJlYW08RW5jb2Rpbmc+ID4gewotICAgIGVudW0geyBjb3B5T3B0aW1pemF0aW9uID0gMSB9OwotfTsKLQotLy8hIFN0cmluZyBzdHJlYW0gd2l0aCBVVEY4IGVuY29kaW5nLgotdHlwZWRlZiBHZW5lcmljU3RyaW5nU3RyZWFtPFVURjg8PiA+IFN0cmluZ1N0cmVhbTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSW5zaXR1U3RyaW5nU3RyZWFtCi0KLS8vISBBIHJlYWQtd3JpdGUgc3RyaW5nIHN0cmVhbS4KLS8qISBUaGlzIHN0cmluZyBzdHJlYW0gaXMgcGFydGljdWxhcmx5IGRlc2lnbmVkIGZvciBpbi1zaXR1IHBhcnNpbmcuCi0gICAgXG5vdGUgaW1wbGVtZW50cyBTdHJlYW0gY29uY2VwdAotKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbmNvZGluZz4KLXN0cnVjdCBHZW5lcmljSW5zaXR1U3RyaW5nU3RyZWFtIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIEVuY29kaW5nOjpDaCBDaDsKLQotICAgIEdlbmVyaWNJbnNpdHVTdHJpbmdTdHJlYW0oQ2ggKnNyYykgOiBzcmNfKHNyYyksIGRzdF8oMCksIGhlYWRfKHNyYykge30KLQotICAgIC8vIFJlYWQKLSAgICBDaCBQZWVrKCkgeyByZXR1cm4gKnNyY187IH0KLSAgICBDaCBUYWtlKCkgeyByZXR1cm4gKnNyY18rKzsgfQotICAgIHNpemVfdCBUZWxsKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihzcmNfIC0gaGVhZF8pOyB9Ci0KLSAgICAvLyBXcml0ZQotICAgIHZvaWQgUHV0KENoIGMpIHsgUkFQSURKU09OX0FTU0VSVChkc3RfICE9IDApOyAqZHN0XysrID0gYzsgfQotCi0gICAgQ2gqIFB1dEJlZ2luKCkgeyByZXR1cm4gZHN0XyA9IHNyY187IH0KLSAgICBzaXplX3QgUHV0RW5kKENoKiBiZWdpbikgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pihkc3RfIC0gYmVnaW4pOyB9Ci0gICAgdm9pZCBGbHVzaCgpIHt9Ci0KLSAgICBDaCogUHVzaChzaXplX3QgY291bnQpIHsgQ2gqIGJlZ2luID0gZHN0XzsgZHN0XyArPSBjb3VudDsgcmV0dXJuIGJlZ2luOyB9Ci0gICAgdm9pZCBQb3Aoc2l6ZV90IGNvdW50KSB7IGRzdF8gLT0gY291bnQ7IH0KLQotICAgIENoKiBzcmNfOwotICAgIENoKiBkc3RfOwotICAgIENoKiBoZWFkXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbmNvZGluZz4KLXN0cnVjdCBTdHJlYW1UcmFpdHM8R2VuZXJpY0luc2l0dVN0cmluZ1N0cmVhbTxFbmNvZGluZz4gPiB7Ci0gICAgZW51bSB7IGNvcHlPcHRpbWl6YXRpb24gPSAxIH07Ci19OwotCi0vLyEgSW5zaXR1IHN0cmluZyBzdHJlYW0gd2l0aCBVVEY4IGVuY29kaW5nLgotdHlwZWRlZiBHZW5lcmljSW5zaXR1U3RyaW5nU3RyZWFtPFVURjg8PiA+IEluc2l0dVN0cmluZ1N0cmVhbTsKLQotUkFQSURKU09OX05BTUVTUEFDRV9FTkQKLQotI2VuZGlmIC8vIFJBUElESlNPTl9TVFJFQU1fSF8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vc3RyaW5nYnVmZmVyLmggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2luY2x1ZGUvcmFwaWRqc29uL3N0cmluZ2J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGYzNGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vc3RyaW5nYnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8gVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4KLS8vIAotLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRITCBBMjkgTGltaXRlZCwgYSBUZW5jZW50IGNvbXBhbnksIGFuZCBNaWxvIFlpcC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAotLy8gaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLS8vIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAKLS8vIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIAotLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBSQVBJREpTT05fU1RSSU5HQlVGRkVSX0hfCi0jZGVmaW5lIFJBUElESlNPTl9TVFJJTkdCVUZGRVJfSF8KLQotI2luY2x1ZGUgInN0cmVhbS5oIgotI2luY2x1ZGUgImludGVybmFsL3N0YWNrLmgiCi0KLSNpZiBSQVBJREpTT05fSEFTX0NYWDExX1JWQUxVRV9SRUZTCi0jaW5jbHVkZSA8dXRpbGl0eT4gLy8gc3RkOjptb3ZlCi0jZW5kaWYKLQotI2luY2x1ZGUgImludGVybmFsL3N0YWNrLmgiCi0KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRihjKys5OC1jb21wYXQpCi0jZW5kaWYKLQotUkFQSURKU09OX05BTUVTUEFDRV9CRUdJTgotCi0vLyEgUmVwcmVzZW50cyBhbiBpbi1tZW1vcnkgb3V0cHV0IHN0cmVhbS4KLS8qIQotICAgIFx0cGFyYW0gRW5jb2RpbmcgRW5jb2Rpbmcgb2YgdGhlIHN0cmVhbS4KLSAgICBcdHBhcmFtIEFsbG9jYXRvciB0eXBlIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBidWZmZXIuCi0gICAgXG5vdGUgaW1wbGVtZW50cyBTdHJlYW0gY29uY2VwdAotKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbmNvZGluZywgdHlwZW5hbWUgQWxsb2NhdG9yID0gQ3J0QWxsb2NhdG9yPgotY2xhc3MgR2VuZXJpY1N0cmluZ0J1ZmZlciB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBFbmNvZGluZzo6Q2ggQ2g7Ci0KLSAgICBHZW5lcmljU3RyaW5nQnVmZmVyKEFsbG9jYXRvciogYWxsb2NhdG9yID0gMCwgc2l6ZV90IGNhcGFjaXR5ID0ga0RlZmF1bHRDYXBhY2l0eSkgOiBzdGFja18oYWxsb2NhdG9yLCBjYXBhY2l0eSkge30KLQotI2lmIFJBUElESlNPTl9IQVNfQ1hYMTFfUlZBTFVFX1JFRlMKLSAgICBHZW5lcmljU3RyaW5nQnVmZmVyKEdlbmVyaWNTdHJpbmdCdWZmZXImJiByaHMpIDogc3RhY2tfKHN0ZDo6bW92ZShyaHMuc3RhY2tfKSkge30KLSAgICBHZW5lcmljU3RyaW5nQnVmZmVyJiBvcGVyYXRvcj0oR2VuZXJpY1N0cmluZ0J1ZmZlciYmIHJocykgewotICAgICAgICBpZiAoJnJocyAhPSB0aGlzKQotICAgICAgICAgICAgc3RhY2tfID0gc3RkOjptb3ZlKHJocy5zdGFja18pOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotI2VuZGlmCi0KLSAgICB2b2lkIFB1dChDaCBjKSB7ICpzdGFja18udGVtcGxhdGUgUHVzaDxDaD4oKSA9IGM7IH0KLSAgICB2b2lkIFB1dFVuc2FmZShDaCBjKSB7ICpzdGFja18udGVtcGxhdGUgUHVzaFVuc2FmZTxDaD4oKSA9IGM7IH0KLSAgICB2b2lkIEZsdXNoKCkge30KLQotICAgIHZvaWQgQ2xlYXIoKSB7IHN0YWNrXy5DbGVhcigpOyB9Ci0gICAgdm9pZCBTaHJpbmtUb0ZpdCgpIHsKLSAgICAgICAgLy8gUHVzaCBhbmQgcG9wIGEgbnVsbCB0ZXJtaW5hdG9yLiBUaGlzIGlzIHNhZmUuCi0gICAgICAgICpzdGFja18udGVtcGxhdGUgUHVzaDxDaD4oKSA9ICdcMCc7Ci0gICAgICAgIHN0YWNrXy5TaHJpbmtUb0ZpdCgpOwotICAgICAgICBzdGFja18udGVtcGxhdGUgUG9wPENoPigxKTsKLSAgICB9Ci0KLSAgICB2b2lkIFJlc2VydmUoc2l6ZV90IGNvdW50KSB7IHN0YWNrXy50ZW1wbGF0ZSBSZXNlcnZlPENoPihjb3VudCk7IH0KLSAgICBDaCogUHVzaChzaXplX3QgY291bnQpIHsgcmV0dXJuIHN0YWNrXy50ZW1wbGF0ZSBQdXNoPENoPihjb3VudCk7IH0KLSAgICBDaCogUHVzaFVuc2FmZShzaXplX3QgY291bnQpIHsgcmV0dXJuIHN0YWNrXy50ZW1wbGF0ZSBQdXNoVW5zYWZlPENoPihjb3VudCk7IH0KLSAgICB2b2lkIFBvcChzaXplX3QgY291bnQpIHsgc3RhY2tfLnRlbXBsYXRlIFBvcDxDaD4oY291bnQpOyB9Ci0KLSAgICBjb25zdCBDaCogR2V0U3RyaW5nKCkgY29uc3QgewotICAgICAgICAvLyBQdXNoIGFuZCBwb3AgYSBudWxsIHRlcm1pbmF0b3IuIFRoaXMgaXMgc2FmZS4KLSAgICAgICAgKnN0YWNrXy50ZW1wbGF0ZSBQdXNoPENoPigpID0gJ1wwJzsKLSAgICAgICAgc3RhY2tfLnRlbXBsYXRlIFBvcDxDaD4oMSk7Ci0KLSAgICAgICAgcmV0dXJuIHN0YWNrXy50ZW1wbGF0ZSBCb3R0b208Q2g+KCk7Ci0gICAgfQotCi0gICAgc2l6ZV90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBzdGFja18uR2V0U2l6ZSgpOyB9Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtEZWZhdWx0Q2FwYWNpdHkgPSAyNTY7Ci0gICAgbXV0YWJsZSBpbnRlcm5hbDo6U3RhY2s8QWxsb2NhdG9yPiBzdGFja187Ci0KLXByaXZhdGU6Ci0gICAgLy8gUHJvaGliaXQgY29weSBjb25zdHJ1Y3RvciAmIGFzc2lnbm1lbnQgb3BlcmF0b3IuCi0gICAgR2VuZXJpY1N0cmluZ0J1ZmZlcihjb25zdCBHZW5lcmljU3RyaW5nQnVmZmVyJik7Ci0gICAgR2VuZXJpY1N0cmluZ0J1ZmZlciYgb3BlcmF0b3I9KGNvbnN0IEdlbmVyaWNTdHJpbmdCdWZmZXImKTsKLX07Ci0KLS8vISBTdHJpbmcgYnVmZmVyIHdpdGggVVRGOCBlbmNvZGluZwotdHlwZWRlZiBHZW5lcmljU3RyaW5nQnVmZmVyPFVURjg8PiA+IFN0cmluZ0J1ZmZlcjsKLQotdGVtcGxhdGU8dHlwZW5hbWUgRW5jb2RpbmcsIHR5cGVuYW1lIEFsbG9jYXRvcj4KLWlubGluZSB2b2lkIFB1dFJlc2VydmUoR2VuZXJpY1N0cmluZ0J1ZmZlcjxFbmNvZGluZywgQWxsb2NhdG9yPiYgc3RyZWFtLCBzaXplX3QgY291bnQpIHsKLSAgICBzdHJlYW0uUmVzZXJ2ZShjb3VudCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEVuY29kaW5nLCB0eXBlbmFtZSBBbGxvY2F0b3I+Ci1pbmxpbmUgdm9pZCBQdXRVbnNhZmUoR2VuZXJpY1N0cmluZ0J1ZmZlcjxFbmNvZGluZywgQWxsb2NhdG9yPiYgc3RyZWFtLCB0eXBlbmFtZSBFbmNvZGluZzo6Q2ggYykgewotICAgIHN0cmVhbS5QdXRVbnNhZmUoYyk7Ci19Ci0KLS8vISBJbXBsZW1lbnQgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBQdXROKCkgd2l0aCBtZW1zZXQoKSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLgotdGVtcGxhdGU8PgotaW5saW5lIHZvaWQgUHV0TihHZW5lcmljU3RyaW5nQnVmZmVyPFVURjg8PiA+JiBzdHJlYW0sIGNoYXIgYywgc2l6ZV90IG4pIHsKLSAgICBzdGQ6Om1lbXNldChzdHJlYW0uc3RhY2tfLlB1c2g8Y2hhcj4obiksIGMsIG4gKiBzaXplb2YoYykpOwotfQotCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi1SQVBJREpTT05fRElBR19QT1AKLSNlbmRpZgotCi0jZW5kaWYgLy8gUkFQSURKU09OX1NUUklOR0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi93cml0ZXIuaCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci9yYXBpZGpzb24vaW5jbHVkZS9yYXBpZGpzb24vd3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDlmNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9pbmNsdWRlL3JhcGlkanNvbi93cml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vLyBUZW5jZW50IGlzIHBsZWFzZWQgdG8gc3VwcG9ydCB0aGUgb3BlbiBzb3VyY2UgY29tbXVuaXR5IGJ5IG1ha2luZyBSYXBpZEpTT04gYXZhaWxhYmxlLgotLy8gCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTUgVEhMIEEyOSBMaW1pdGVkLCBhIFRlbmNlbnQgY29tcGFueSwgYW5kIE1pbG8gWWlwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0Ci0vLyBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIAotLy8gdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIAotLy8gQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgCi0vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFJBUElESlNPTl9XUklURVJfSF8KLSNkZWZpbmUgUkFQSURKU09OX1dSSVRFUl9IXwotCi0jaW5jbHVkZSAic3RyZWFtLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwvc3RhY2suaCIKLSNpbmNsdWRlICJpbnRlcm5hbC9zdHJmdW5jLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwvZHRvYS5oIgotI2luY2x1ZGUgImludGVybmFsL2l0b2EuaCIKLSNpbmNsdWRlICJzdHJpbmdidWZmZXIuaCIKLSNpbmNsdWRlIDxuZXc+ICAgICAgLy8gcGxhY2VtZW50IG5ldwotCi0jaWYgZGVmaW5lZChSQVBJREpTT05fU0lNRCkgJiYgZGVmaW5lZChfTVNDX1ZFUikKLSNpbmNsdWRlIDxpbnRyaW4uaD4KLSNwcmFnbWEgaW50cmluc2ljKF9CaXRTY2FuRm9yd2FyZCkKLSNlbmRpZgotI2lmZGVmIFJBUElESlNPTl9TU0U0MgotI2luY2x1ZGUgPG5tbWludHJpbi5oPgotI2VsaWYgZGVmaW5lZChSQVBJREpTT05fU1NFMikKLSNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KLSNlbmRpZgotCi0jaWZkZWYgX01TQ19WRVIKLVJBUElESlNPTl9ESUFHX1BVU0gKLVJBUElESlNPTl9ESUFHX09GRig0MTI3KSAvLyBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50Ci0jZW5kaWYKLQotI2lmZGVmIF9fY2xhbmdfXwotUkFQSURKU09OX0RJQUdfUFVTSAotUkFQSURKU09OX0RJQUdfT0ZGKHBhZGRlZCkKLSNlbmRpZgotCi1SQVBJREpTT05fTkFNRVNQQUNFX0JFR0lOCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFdyaXRlRmxhZwotCi0vKiEgXGRlZiBSQVBJREpTT05fV1JJVEVfREVGQVVMVF9GTEFHUyAKLSAgICBcaW5ncm91cCBSQVBJREpTT05fQ09ORklHCi0gICAgXGJyaWVmIFVzZXItZGVmaW5lZCBrV3JpdGVEZWZhdWx0RmxhZ3MgZGVmaW5pdGlvbi4KLQotICAgIFVzZXIgY2FuIGRlZmluZSB0aGlzIGFzIGFueSBcYyBXcml0ZUZsYWcgY29tYmluYXRpb25zLgotKi8KLSNpZm5kZWYgUkFQSURKU09OX1dSSVRFX0RFRkFVTFRfRkxBR1MKLSNkZWZpbmUgUkFQSURKU09OX1dSSVRFX0RFRkFVTFRfRkxBR1Mga1dyaXRlTm9GbGFncwotI2VuZGlmCi0KLS8vISBDb21iaW5hdGlvbiBvZiB3cml0ZUZsYWdzCi1lbnVtIFdyaXRlRmxhZyB7Ci0gICAga1dyaXRlTm9GbGFncyA9IDAsICAgICAgICAgICAgICAvLyE8IE5vIGZsYWdzIGFyZSBzZXQuCi0gICAga1dyaXRlVmFsaWRhdGVFbmNvZGluZ0ZsYWcgPSAxLCAvLyE8IFZhbGlkYXRlIGVuY29kaW5nIG9mIEpTT04gc3RyaW5ncy4KLSAgICBrV3JpdGVEZWZhdWx0RmxhZ3MgPSBSQVBJREpTT05fV1JJVEVfREVGQVVMVF9GTEFHUyAgLy8hPCBEZWZhdWx0IHdyaXRlIGZsYWdzLiBDYW4gYmUgY3VzdG9taXplZCBieSBkZWZpbmluZyBSQVBJREpTT05fV1JJVEVfREVGQVVMVF9GTEFHUwotfTsKLQotLy8hIEpTT04gd3JpdGVyCi0vKiEgV3JpdGVyIGltcGxlbWVudHMgdGhlIGNvbmNlcHQgSGFuZGxlci4KLSAgICBJdCBnZW5lcmF0ZXMgSlNPTiB0ZXh0IGJ5IGV2ZW50cyB0byBhbiBvdXRwdXQgb3MuCi0KLSAgICBVc2VyIG1heSBwcm9ncmFtbWF0aWNhbGx5IGNhbGxzIHRoZSBmdW5jdGlvbnMgb2YgYSB3cml0ZXIgdG8gZ2VuZXJhdGUgSlNPTiB0ZXh0LgotCi0gICAgT24gdGhlIG90aGVyIHNpZGUsIGEgd3JpdGVyIGNhbiBhbHNvIGJlIHBhc3NlZCB0byBvYmplY3RzIHRoYXQgZ2VuZXJhdGVzIGV2ZW50cywgCi0KLSAgICBmb3IgZXhhbXBsZSBSZWFkZXI6OlBhcnNlKCkgYW5kIERvY3VtZW50OjpBY2NlcHQoKS4KLQotICAgIFx0cGFyYW0gT3V0cHV0U3RyZWFtIFR5cGUgb2Ygb3V0cHV0IHN0cmVhbS4KLSAgICBcdHBhcmFtIFNvdXJjZUVuY29kaW5nIEVuY29kaW5nIG9mIHNvdXJjZSBzdHJpbmcuCi0gICAgXHRwYXJhbSBUYXJnZXRFbmNvZGluZyBFbmNvZGluZyBvZiBvdXRwdXQgc3RyZWFtLgotICAgIFx0cGFyYW0gU3RhY2tBbGxvY2F0b3IgVHlwZSBvZiBhbGxvY2F0b3IgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IG9mIHN0YWNrLgotICAgIFxub3RlIGltcGxlbWVudHMgSGFuZGxlciBjb25jZXB0Ci0qLwotdGVtcGxhdGU8dHlwZW5hbWUgT3V0cHV0U3RyZWFtLCB0eXBlbmFtZSBTb3VyY2VFbmNvZGluZyA9IFVURjg8PiwgdHlwZW5hbWUgVGFyZ2V0RW5jb2RpbmcgPSBVVEY4PD4sIHR5cGVuYW1lIFN0YWNrQWxsb2NhdG9yID0gQ3J0QWxsb2NhdG9yLCB1bnNpZ25lZCB3cml0ZUZsYWdzID0ga1dyaXRlRGVmYXVsdEZsYWdzPgotY2xhc3MgV3JpdGVyIHsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFNvdXJjZUVuY29kaW5nOjpDaCBDaDsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRNYXhEZWNpbWFsUGxhY2VzID0gMzI0OwotCi0gICAgLy8hIENvbnN0cnVjdG9yCi0gICAgLyohIFxwYXJhbSBvcyBPdXRwdXQgc3RyZWFtLgotICAgICAgICBccGFyYW0gc3RhY2tBbGxvY2F0b3IgVXNlciBzdXBwbGllZCBhbGxvY2F0b3IuIElmIGl0IGlzIG51bGwsIGl0IHdpbGwgY3JlYXRlIGEgcHJpdmF0ZSBvbmUuCi0gICAgICAgIFxwYXJhbSBsZXZlbERlcHRoIEluaXRpYWwgY2FwYWNpdHkgb2Ygc3RhY2suCi0gICAgKi8KLSAgICBleHBsaWNpdAotICAgIFdyaXRlcihPdXRwdXRTdHJlYW0mIG9zLCBTdGFja0FsbG9jYXRvciogc3RhY2tBbGxvY2F0b3IgPSAwLCBzaXplX3QgbGV2ZWxEZXB0aCA9IGtEZWZhdWx0TGV2ZWxEZXB0aCkgOiAKLSAgICAgICAgb3NfKCZvcyksIGxldmVsX3N0YWNrXyhzdGFja0FsbG9jYXRvciwgbGV2ZWxEZXB0aCAqIHNpemVvZihMZXZlbCkpLCBtYXhEZWNpbWFsUGxhY2VzXyhrRGVmYXVsdE1heERlY2ltYWxQbGFjZXMpLCBoYXNSb290XyhmYWxzZSkge30KLQotICAgIGV4cGxpY2l0Ci0gICAgV3JpdGVyKFN0YWNrQWxsb2NhdG9yKiBhbGxvY2F0b3IgPSAwLCBzaXplX3QgbGV2ZWxEZXB0aCA9IGtEZWZhdWx0TGV2ZWxEZXB0aCkgOgotICAgICAgICBvc18oMCksIGxldmVsX3N0YWNrXyhhbGxvY2F0b3IsIGxldmVsRGVwdGggKiBzaXplb2YoTGV2ZWwpKSwgbWF4RGVjaW1hbFBsYWNlc18oa0RlZmF1bHRNYXhEZWNpbWFsUGxhY2VzKSwgaGFzUm9vdF8oZmFsc2UpIHt9Ci0KLSAgICAvLyEgUmVzZXQgdGhlIHdyaXRlciB3aXRoIGEgbmV3IHN0cmVhbS4KLSAgICAvKiEKLSAgICAgICAgVGhpcyBmdW5jdGlvbiByZXNldCB0aGUgd3JpdGVyIHdpdGggYSBuZXcgc3RyZWFtIGFuZCBkZWZhdWx0IHNldHRpbmdzLAotICAgICAgICBpbiBvcmRlciB0byBtYWtlIGEgV3JpdGVyIG9iamVjdCByZXVzYWJsZSBmb3Igb3V0cHV0IG11bHRpcGxlIEpTT05zLgotCi0gICAgICAgIFxwYXJhbSBvcyBOZXcgb3V0cHV0IHN0cmVhbS4KLSAgICAgICAgXGNvZGUKLSAgICAgICAgV3JpdGVyPE91dHB1dFN0cmVhbT4gd3JpdGVyKG9zMSk7Ci0gICAgICAgIHdyaXRlci5TdGFydE9iamVjdCgpOwotICAgICAgICAvLyAuLi4KLSAgICAgICAgd3JpdGVyLkVuZE9iamVjdCgpOwotCi0gICAgICAgIHdyaXRlci5SZXNldChvczIpOwotICAgICAgICB3cml0ZXIuU3RhcnRPYmplY3QoKTsKLSAgICAgICAgLy8gLi4uCi0gICAgICAgIHdyaXRlci5FbmRPYmplY3QoKTsKLSAgICAgICAgXGVuZGNvZGUKLSAgICAqLwotICAgIHZvaWQgUmVzZXQoT3V0cHV0U3RyZWFtJiBvcykgewotICAgICAgICBvc18gPSAmb3M7Ci0gICAgICAgIGhhc1Jvb3RfID0gZmFsc2U7Ci0gICAgICAgIGxldmVsX3N0YWNrXy5DbGVhcigpOwotICAgIH0KLQotICAgIC8vISBDaGVja3Mgd2hldGhlciB0aGUgb3V0cHV0IGlzIGEgY29tcGxldGUgSlNPTi4KLSAgICAvKiEKLSAgICAgICAgQSBjb21wbGV0ZSBKU09OIGhhcyBhIGNvbXBsZXRlIHJvb3Qgb2JqZWN0IG9yIGFycmF5LgotICAgICovCi0gICAgYm9vbCBJc0NvbXBsZXRlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gaGFzUm9vdF8gJiYgbGV2ZWxfc3RhY2tfLkVtcHR5KCk7Ci0gICAgfQotCi0gICAgaW50IEdldE1heERlY2ltYWxQbGFjZXMoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtYXhEZWNpbWFsUGxhY2VzXzsKLSAgICB9Ci0KLSAgICAvLyEgU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgZm9yIGRvdWJsZSBvdXRwdXQuCi0gICAgLyohCi0gICAgICAgIFRoaXMgc2V0dGluZyB0cnVuY2F0ZXMgdGhlIG91dHB1dCB3aXRoIHNwZWNpZmllZCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMuCi0KLSAgICAgICAgRm9yIGV4YW1wbGUsIAotCi0gICAgICAgIFxjb2RlCi0gICAgICAgIHdyaXRlci5TZXRNYXhEZWNpbWFsUGxhY2VzKDMpOwotICAgICAgICB3cml0ZXIuU3RhcnRBcnJheSgpOwotICAgICAgICB3cml0ZXIuRG91YmxlKDAuMTIzNDUpOyAgICAgICAgICAgICAgICAgLy8gIjAuMTIzIgotICAgICAgICB3cml0ZXIuRG91YmxlKDAuMDAwMSk7ICAgICAgICAgICAgICAgICAgLy8gIjAuMCIKLSAgICAgICAgd3JpdGVyLkRvdWJsZSgxLjIzNDU2Nzg5MDEyMzQ1NmUzMCk7ICAgIC8vICIxLjIzNDU2Nzg5MDEyMzQ1NmUzMCIgKGRvIG5vdCB0cnVuY2F0ZSBzaWduaWZpY2FuZCBmb3IgcG9zaXRpdmUgZXhwb25lbnQpCi0gICAgICAgIHdyaXRlci5Eb3VibGUoMS4yM2UtNCk7ICAgICAgICAgICAgICAgICAvLyAiMC4wIiAgICAgICAgICAgICAgICAgIChkbyB0cnVuY2F0ZSBzaWduaWZpY2FuZCBmb3IgbmVnYXRpdmUgZXhwb25lbnQpCi0gICAgICAgIHdyaXRlci5FbmRBcnJheSgpOwotICAgICAgICBcZW5kY29kZQotCi0gICAgICAgIFRoZSBkZWZhdWx0IHNldHRpbmcgZG9lcyBub3QgdHJ1bmNhdGUgYW55IGRlY2ltYWwgcGxhY2VzLiBZb3UgY2FuIHJlc3RvcmUgdG8gdGhpcyBzZXR0aW5nIGJ5IGNhbGxpbmcKLSAgICAgICAgXGNvZGUKLSAgICAgICAgd3JpdGVyLlNldE1heERlY2ltYWxQbGFjZXMoV3JpdGVyOjprRGVmYXVsdE1heERlY2ltYWxQbGFjZXMpOwotICAgICAgICBcZW5kY29kZQotICAgICovCi0gICAgdm9pZCBTZXRNYXhEZWNpbWFsUGxhY2VzKGludCBtYXhEZWNpbWFsUGxhY2VzKSB7Ci0gICAgICAgIG1heERlY2ltYWxQbGFjZXNfID0gbWF4RGVjaW1hbFBsYWNlczsKLSAgICB9Ci0KLSAgICAvKiFAbmFtZSBJbXBsZW1lbnRhdGlvbiBvZiBIYW5kbGVyCi0gICAgICAgIFxzZWUgSGFuZGxlcgotICAgICovCi0gICAgLy9AewotCi0gICAgYm9vbCBOdWxsKCkgICAgICAgICAgICAgICAgIHsgUHJlZml4KGtOdWxsVHlwZSk7ICAgcmV0dXJuIFdyaXRlTnVsbCgpOyB9Ci0gICAgYm9vbCBCb29sKGJvb2wgYikgICAgICAgICAgIHsgUHJlZml4KGIgPyBrVHJ1ZVR5cGUgOiBrRmFsc2VUeXBlKTsgcmV0dXJuIFdyaXRlQm9vbChiKTsgfQotICAgIGJvb2wgSW50KGludCBpKSAgICAgICAgICAgICB7IFByZWZpeChrTnVtYmVyVHlwZSk7IHJldHVybiBXcml0ZUludChpKTsgfQotICAgIGJvb2wgVWludCh1bnNpZ25lZCB1KSAgICAgICB7IFByZWZpeChrTnVtYmVyVHlwZSk7IHJldHVybiBXcml0ZVVpbnQodSk7IH0KLSAgICBib29sIEludDY0KGludDY0X3QgaTY0KSAgICAgeyBQcmVmaXgoa051bWJlclR5cGUpOyByZXR1cm4gV3JpdGVJbnQ2NChpNjQpOyB9Ci0gICAgYm9vbCBVaW50NjQodWludDY0X3QgdTY0KSAgIHsgUHJlZml4KGtOdW1iZXJUeXBlKTsgcmV0dXJuIFdyaXRlVWludDY0KHU2NCk7IH0KLQotICAgIC8vISBXcml0ZXMgdGhlIGdpdmVuIFxjIGRvdWJsZSB2YWx1ZSB0byB0aGUgc3RyZWFtCi0gICAgLyohCi0gICAgICAgIFxwYXJhbSBkIFRoZSB2YWx1ZSB0byBiZSB3cml0dGVuLgotICAgICAgICBccmV0dXJuIFdoZXRoZXIgaXQgaXMgc3VjY2VlZC4KLSAgICAqLwotICAgIGJvb2wgRG91YmxlKGRvdWJsZSBkKSAgICAgICB7IFByZWZpeChrTnVtYmVyVHlwZSk7IHJldHVybiBXcml0ZURvdWJsZShkKTsgfQotCi0gICAgYm9vbCBSYXdOdW1iZXIoY29uc3QgQ2gqIHN0ciwgU2l6ZVR5cGUgbGVuZ3RoLCBib29sIGNvcHkgPSBmYWxzZSkgewotICAgICAgICAodm9pZCljb3B5OwotICAgICAgICBQcmVmaXgoa051bWJlclR5cGUpOwotICAgICAgICByZXR1cm4gV3JpdGVTdHJpbmcoc3RyLCBsZW5ndGgpOwotICAgIH0KLQotICAgIGJvb2wgU3RyaW5nKGNvbnN0IENoKiBzdHIsIFNpemVUeXBlIGxlbmd0aCwgYm9vbCBjb3B5ID0gZmFsc2UpIHsKLSAgICAgICAgKHZvaWQpY29weTsKLSAgICAgICAgUHJlZml4KGtTdHJpbmdUeXBlKTsKLSAgICAgICAgcmV0dXJuIFdyaXRlU3RyaW5nKHN0ciwgbGVuZ3RoKTsKLSAgICB9Ci0KLSNpZiBSQVBJREpTT05fSEFTX1NURFNUUklORwotICAgIGJvb2wgU3RyaW5nKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPENoPiYgc3RyKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmcoc3RyLmRhdGEoKSwgU2l6ZVR5cGUoc3RyLnNpemUoKSkpOwotICAgIH0KLSNlbmRpZgotCi0gICAgYm9vbCBTdGFydE9iamVjdCgpIHsKLSAgICAgICAgUHJlZml4KGtPYmplY3RUeXBlKTsKLSAgICAgICAgbmV3IChsZXZlbF9zdGFja18udGVtcGxhdGUgUHVzaDxMZXZlbD4oKSkgTGV2ZWwoZmFsc2UpOwotICAgICAgICByZXR1cm4gV3JpdGVTdGFydE9iamVjdCgpOwotICAgIH0KLQotICAgIGJvb2wgS2V5KGNvbnN0IENoKiBzdHIsIFNpemVUeXBlIGxlbmd0aCwgYm9vbCBjb3B5ID0gZmFsc2UpIHsgcmV0dXJuIFN0cmluZyhzdHIsIGxlbmd0aCwgY29weSk7IH0KLQotICAgIGJvb2wgRW5kT2JqZWN0KFNpemVUeXBlIG1lbWJlckNvdW50ID0gMCkgewotICAgICAgICAodm9pZCltZW1iZXJDb3VudDsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChsZXZlbF9zdGFja18uR2V0U2l6ZSgpID49IHNpemVvZihMZXZlbCkpOwotICAgICAgICBSQVBJREpTT05fQVNTRVJUKCFsZXZlbF9zdGFja18udGVtcGxhdGUgVG9wPExldmVsPigpLT5pbkFycmF5KTsKLSAgICAgICAgbGV2ZWxfc3RhY2tfLnRlbXBsYXRlIFBvcDxMZXZlbD4oMSk7Ci0gICAgICAgIGJvb2wgcmV0ID0gV3JpdGVFbmRPYmplY3QoKTsKLSAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWShsZXZlbF9zdGFja18uRW1wdHkoKSkpICAgLy8gZW5kIG9mIGpzb24gdGV4dAotICAgICAgICAgICAgb3NfLT5GbHVzaCgpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGJvb2wgU3RhcnRBcnJheSgpIHsKLSAgICAgICAgUHJlZml4KGtBcnJheVR5cGUpOwotICAgICAgICBuZXcgKGxldmVsX3N0YWNrXy50ZW1wbGF0ZSBQdXNoPExldmVsPigpKSBMZXZlbCh0cnVlKTsKLSAgICAgICAgcmV0dXJuIFdyaXRlU3RhcnRBcnJheSgpOwotICAgIH0KLQotICAgIGJvb2wgRW5kQXJyYXkoU2l6ZVR5cGUgZWxlbWVudENvdW50ID0gMCkgewotICAgICAgICAodm9pZCllbGVtZW50Q291bnQ7Ci0gICAgICAgIFJBUElESlNPTl9BU1NFUlQobGV2ZWxfc3RhY2tfLkdldFNpemUoKSA+PSBzaXplb2YoTGV2ZWwpKTsKLSAgICAgICAgUkFQSURKU09OX0FTU0VSVChsZXZlbF9zdGFja18udGVtcGxhdGUgVG9wPExldmVsPigpLT5pbkFycmF5KTsKLSAgICAgICAgbGV2ZWxfc3RhY2tfLnRlbXBsYXRlIFBvcDxMZXZlbD4oMSk7Ci0gICAgICAgIGJvb2wgcmV0ID0gV3JpdGVFbmRBcnJheSgpOwotICAgICAgICBpZiAoUkFQSURKU09OX1VOTElLRUxZKGxldmVsX3N0YWNrXy5FbXB0eSgpKSkgICAvLyBlbmQgb2YganNvbiB0ZXh0Ci0gICAgICAgICAgICBvc18tPkZsdXNoKCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIC8vQH0KLQotICAgIC8qISBAbmFtZSBDb252ZW5pZW5jZSBleHRlbnNpb25zICovCi0gICAgLy9AewotCi0gICAgLy8hIFNpbXBsZXIgYnV0IHNsb3dlciBvdmVybG9hZC4KLSAgICBib29sIFN0cmluZyhjb25zdCBDaCogc3RyKSB7IHJldHVybiBTdHJpbmcoc3RyLCBpbnRlcm5hbDo6U3RyTGVuKHN0cikpOyB9Ci0gICAgYm9vbCBLZXkoY29uc3QgQ2gqIHN0cikgeyByZXR1cm4gS2V5KHN0ciwgaW50ZXJuYWw6OlN0ckxlbihzdHIpKTsgfQotCi0gICAgLy9AfQotCi0gICAgLy8hIFdyaXRlIGEgcmF3IEpTT04gdmFsdWUuCi0gICAgLyohCi0gICAgICAgIEZvciB1c2VyIHRvIHdyaXRlIGEgc3RyaW5naWZpZWQgSlNPTiBhcyBhIHZhbHVlLgotCi0gICAgICAgIFxwYXJhbSBqc29uIEEgd2VsbC1mb3JtZWQgSlNPTiB2YWx1ZS4gSXQgc2hvdWxkIG5vdCBjb250YWluIG51bGwgY2hhcmFjdGVyIHdpdGhpbiBbMCwgbGVuZ3RoIC0gMV0gcmFuZ2UuCi0gICAgICAgIFxwYXJhbSBsZW5ndGggTGVuZ3RoIG9mIHRoZSBqc29uLgotICAgICAgICBccGFyYW0gdHlwZSBUeXBlIG9mIHRoZSByb290IG9mIGpzb24uCi0gICAgKi8KLSAgICBib29sIFJhd1ZhbHVlKGNvbnN0IENoKiBqc29uLCBzaXplX3QgbGVuZ3RoLCBUeXBlIHR5cGUpIHsgUHJlZml4KHR5cGUpOyByZXR1cm4gV3JpdGVSYXdWYWx1ZShqc29uLCBsZW5ndGgpOyB9Ci0KLXByb3RlY3RlZDoKLSAgICAvLyEgSW5mb3JtYXRpb24gZm9yIGVhY2ggbmVzdGVkIGxldmVsCi0gICAgc3RydWN0IExldmVsIHsKLSAgICAgICAgTGV2ZWwoYm9vbCBpbkFycmF5XykgOiB2YWx1ZUNvdW50KDApLCBpbkFycmF5KGluQXJyYXlfKSB7fQotICAgICAgICBzaXplX3QgdmFsdWVDb3VudDsgIC8vITwgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGlzIGxldmVsCi0gICAgICAgIGJvb2wgaW5BcnJheTsgICAgICAgLy8hPCB0cnVlIGlmIGluIGFycmF5LCBvdGhlcndpc2UgaW4gb2JqZWN0Ci0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0RlZmF1bHRMZXZlbERlcHRoID0gMzI7Ci0KLSAgICBib29sIFdyaXRlTnVsbCgpICB7Ci0gICAgICAgIFB1dFJlc2VydmUoKm9zXywgNCk7Ci0gICAgICAgIFB1dFVuc2FmZSgqb3NfLCAnbicpOyBQdXRVbnNhZmUoKm9zXywgJ3UnKTsgUHV0VW5zYWZlKCpvc18sICdsJyk7IFB1dFVuc2FmZSgqb3NfLCAnbCcpOyByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIFdyaXRlQm9vbChib29sIGIpICB7Ci0gICAgICAgIGlmIChiKSB7Ci0gICAgICAgICAgICBQdXRSZXNlcnZlKCpvc18sIDQpOwotICAgICAgICAgICAgUHV0VW5zYWZlKCpvc18sICd0Jyk7IFB1dFVuc2FmZSgqb3NfLCAncicpOyBQdXRVbnNhZmUoKm9zXywgJ3UnKTsgUHV0VW5zYWZlKCpvc18sICdlJyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBQdXRSZXNlcnZlKCpvc18sIDUpOwotICAgICAgICAgICAgUHV0VW5zYWZlKCpvc18sICdmJyk7IFB1dFVuc2FmZSgqb3NfLCAnYScpOyBQdXRVbnNhZmUoKm9zXywgJ2wnKTsgUHV0VW5zYWZlKCpvc18sICdzJyk7IFB1dFVuc2FmZSgqb3NfLCAnZScpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgV3JpdGVJbnQoaW50IGkpIHsKLSAgICAgICAgY2hhciBidWZmZXJbMTFdOwotICAgICAgICBjb25zdCBjaGFyKiBlbmQgPSBpbnRlcm5hbDo6aTMydG9hKGksIGJ1ZmZlcik7Ci0gICAgICAgIFB1dFJlc2VydmUoKm9zXywgc3RhdGljX2Nhc3Q8c2l6ZV90PihlbmQgLSBidWZmZXIpKTsKLSAgICAgICAgZm9yIChjb25zdCBjaGFyKiBwID0gYnVmZmVyOyBwICE9IGVuZDsgKytwKQotICAgICAgICAgICAgUHV0VW5zYWZlKCpvc18sIHN0YXRpY19jYXN0PHR5cGVuYW1lIFRhcmdldEVuY29kaW5nOjpDaD4oKnApKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgYm9vbCBXcml0ZVVpbnQodW5zaWduZWQgdSkgewotICAgICAgICBjaGFyIGJ1ZmZlclsxMF07Ci0gICAgICAgIGNvbnN0IGNoYXIqIGVuZCA9IGludGVybmFsOjp1MzJ0b2EodSwgYnVmZmVyKTsKLSAgICAgICAgUHV0UmVzZXJ2ZSgqb3NfLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGVuZCAtIGJ1ZmZlcikpOwotICAgICAgICBmb3IgKGNvbnN0IGNoYXIqIHAgPSBidWZmZXI7IHAgIT0gZW5kOyArK3ApCi0gICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgVGFyZ2V0RW5jb2Rpbmc6OkNoPigqcCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIFdyaXRlSW50NjQoaW50NjRfdCBpNjQpIHsKLSAgICAgICAgY2hhciBidWZmZXJbMjFdOwotICAgICAgICBjb25zdCBjaGFyKiBlbmQgPSBpbnRlcm5hbDo6aTY0dG9hKGk2NCwgYnVmZmVyKTsKLSAgICAgICAgUHV0UmVzZXJ2ZSgqb3NfLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGVuZCAtIGJ1ZmZlcikpOwotICAgICAgICBmb3IgKGNvbnN0IGNoYXIqIHAgPSBidWZmZXI7IHAgIT0gZW5kOyArK3ApCi0gICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgVGFyZ2V0RW5jb2Rpbmc6OkNoPigqcCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIFdyaXRlVWludDY0KHVpbnQ2NF90IHU2NCkgewotICAgICAgICBjaGFyIGJ1ZmZlclsyMF07Ci0gICAgICAgIGNoYXIqIGVuZCA9IGludGVybmFsOjp1NjR0b2EodTY0LCBidWZmZXIpOwotICAgICAgICBQdXRSZXNlcnZlKCpvc18sIHN0YXRpY19jYXN0PHNpemVfdD4oZW5kIC0gYnVmZmVyKSk7Ci0gICAgICAgIGZvciAoY2hhciogcCA9IGJ1ZmZlcjsgcCAhPSBlbmQ7ICsrcCkKLSAgICAgICAgICAgIFB1dFVuc2FmZSgqb3NfLCBzdGF0aWNfY2FzdDx0eXBlbmFtZSBUYXJnZXRFbmNvZGluZzo6Q2g+KCpwKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgV3JpdGVEb3VibGUoZG91YmxlIGQpIHsKLSAgICAgICAgaWYgKGludGVybmFsOjpEb3VibGUoZCkuSXNOYW5PckluZigpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgY2hhciBidWZmZXJbMjVdOwotICAgICAgICBjaGFyKiBlbmQgPSBpbnRlcm5hbDo6ZHRvYShkLCBidWZmZXIsIG1heERlY2ltYWxQbGFjZXNfKTsKLSAgICAgICAgUHV0UmVzZXJ2ZSgqb3NfLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGVuZCAtIGJ1ZmZlcikpOwotICAgICAgICBmb3IgKGNoYXIqIHAgPSBidWZmZXI7IHAgIT0gZW5kOyArK3ApCi0gICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgVGFyZ2V0RW5jb2Rpbmc6OkNoPigqcCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIFdyaXRlU3RyaW5nKGNvbnN0IENoKiBzdHIsIFNpemVUeXBlIGxlbmd0aCkgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IHR5cGVuYW1lIFRhcmdldEVuY29kaW5nOjpDaCBoZXhEaWdpdHNbMTZdID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicgfTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZXNjYXBlWzI1Nl0gPSB7Ci0jZGVmaW5lIFoxNiAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCi0gICAgICAgICAgICAvLzAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgQSAgICBCICAgIEMgICAgRCAgICBFICAgIEYKLSAgICAgICAgICAgICd1JywgJ3UnLCAndScsICd1JywgJ3UnLCAndScsICd1JywgJ3UnLCAnYicsICd0JywgJ24nLCAndScsICdmJywgJ3InLCAndScsICd1JywgLy8gMDAKLSAgICAgICAgICAgICd1JywgJ3UnLCAndScsICd1JywgJ3UnLCAndScsICd1JywgJ3UnLCAndScsICd1JywgJ3UnLCAndScsICd1JywgJ3UnLCAndScsICd1JywgLy8gMTAKLSAgICAgICAgICAgICAgMCwgICAwLCAnIicsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgLy8gMjAKLSAgICAgICAgICAgIFoxNiwgWjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzB+NEYKLSAgICAgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsJ1xcJywgICAwLCAgIDAsICAgMCwgLy8gNTAKLSAgICAgICAgICAgIFoxNiwgWjE2LCBaMTYsIFoxNiwgWjE2LCBaMTYsIFoxNiwgWjE2LCBaMTYsIFoxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNjB+RkYKLSN1bmRlZiBaMTYKLSAgICAgICAgfTsKLQotICAgICAgICBpZiAoVGFyZ2V0RW5jb2Rpbmc6OnN1cHBvcnRVbmljb2RlKQotICAgICAgICAgICAgUHV0UmVzZXJ2ZSgqb3NfLCAyICsgbGVuZ3RoICogNik7IC8vICJcdXh4eHguLi4iCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFB1dFJlc2VydmUoKm9zXywgMiArIGxlbmd0aCAqIDEyKTsgIC8vICJcdXh4eHhcdXl5eXkuLi4iCi0KLSAgICAgICAgUHV0VW5zYWZlKCpvc18sICdcIicpOwotICAgICAgICBHZW5lcmljU3RyaW5nU3RyZWFtPFNvdXJjZUVuY29kaW5nPiBpcyhzdHIpOwotICAgICAgICB3aGlsZSAoU2NhbldyaXRlVW5lc2NhcGVkU3RyaW5nKGlzLCBsZW5ndGgpKSB7Ci0gICAgICAgICAgICBjb25zdCBDaCBjID0gaXMuUGVlaygpOwotICAgICAgICAgICAgaWYgKCFUYXJnZXRFbmNvZGluZzo6c3VwcG9ydFVuaWNvZGUgJiYgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGMpID49IDB4ODApIHsKLSAgICAgICAgICAgICAgICAvLyBVbmljb2RlIGVzY2FwaW5nCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgY29kZXBvaW50OwotICAgICAgICAgICAgICAgIGlmIChSQVBJREpTT05fVU5MSUtFTFkoIVNvdXJjZUVuY29kaW5nOjpEZWNvZGUoaXMsICZjb2RlcG9pbnQpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIFB1dFVuc2FmZSgqb3NfLCAnXFwnKTsKLSAgICAgICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgJ3UnKTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZXBvaW50IDw9IDB4RDdGRiB8fCAoY29kZXBvaW50ID49IDB4RTAwMCAmJiBjb2RlcG9pbnQgPD0gMHhGRkZGKSkgewotICAgICAgICAgICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgaGV4RGlnaXRzWyhjb2RlcG9pbnQgPj4gMTIpICYgMTVdKTsKLSAgICAgICAgICAgICAgICAgICAgUHV0VW5zYWZlKCpvc18sIGhleERpZ2l0c1soY29kZXBvaW50ID4+ICA4KSAmIDE1XSk7Ci0gICAgICAgICAgICAgICAgICAgIFB1dFVuc2FmZSgqb3NfLCBoZXhEaWdpdHNbKGNvZGVwb2ludCA+PiAgNCkgJiAxNV0pOwotICAgICAgICAgICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgaGV4RGlnaXRzWyhjb2RlcG9pbnQgICAgICApICYgMTVdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFJBUElESlNPTl9BU1NFUlQoY29kZXBvaW50ID49IDB4MDEwMDAwICYmIGNvZGVwb2ludCA8PSAweDEwRkZGRik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN1cnJvZ2F0ZSBwYWlyCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHMgPSBjb2RlcG9pbnQgLSAweDAxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVhZCA9IChzID4+IDEwKSArIDB4RDgwMDsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdHJhaWwgPSAocyAmIDB4M0ZGKSArIDB4REMwMDsKLSAgICAgICAgICAgICAgICAgICAgUHV0VW5zYWZlKCpvc18sIGhleERpZ2l0c1sobGVhZCA+PiAxMikgJiAxNV0pOwotICAgICAgICAgICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgaGV4RGlnaXRzWyhsZWFkID4+ICA4KSAmIDE1XSk7Ci0gICAgICAgICAgICAgICAgICAgIFB1dFVuc2FmZSgqb3NfLCBoZXhEaWdpdHNbKGxlYWQgPj4gIDQpICYgMTVdKTsKLSAgICAgICAgICAgICAgICAgICAgUHV0VW5zYWZlKCpvc18sIGhleERpZ2l0c1sobGVhZCAgICAgICkgJiAxNV0pOwotICAgICAgICAgICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgJ1xcJyk7Ci0gICAgICAgICAgICAgICAgICAgIFB1dFVuc2FmZSgqb3NfLCAndScpOwotICAgICAgICAgICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgaGV4RGlnaXRzWyh0cmFpbCA+PiAxMikgJiAxNV0pOwotICAgICAgICAgICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgaGV4RGlnaXRzWyh0cmFpbCA+PiAgOCkgJiAxNV0pOwotICAgICAgICAgICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgaGV4RGlnaXRzWyh0cmFpbCA+PiAgNCkgJiAxNV0pOwotICAgICAgICAgICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgaGV4RGlnaXRzWyh0cmFpbCAgICAgICkgJiAxNV0pOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKHNpemVvZihDaCkgPT0gMSB8fCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYykgPCAyNTYpICYmIFJBUElESlNPTl9VTkxJS0VMWShlc2NhcGVbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYyldKSkgIHsKLSAgICAgICAgICAgICAgICBpcy5UYWtlKCk7Ci0gICAgICAgICAgICAgICAgUHV0VW5zYWZlKCpvc18sICdcXCcpOwotICAgICAgICAgICAgICAgIFB1dFVuc2FmZSgqb3NfLCBzdGF0aWNfY2FzdDx0eXBlbmFtZSBUYXJnZXRFbmNvZGluZzo6Q2g+KGVzY2FwZVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKV0pKTsKLSAgICAgICAgICAgICAgICBpZiAoZXNjYXBlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpXSA9PSAndScpIHsKLSAgICAgICAgICAgICAgICAgICAgUHV0VW5zYWZlKCpvc18sICcwJyk7Ci0gICAgICAgICAgICAgICAgICAgIFB1dFVuc2FmZSgqb3NfLCAnMCcpOwotICAgICAgICAgICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywgaGV4RGlnaXRzW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpID4+IDRdKTsKLSAgICAgICAgICAgICAgICAgICAgUHV0VW5zYWZlKCpvc18sIGhleERpZ2l0c1tzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjKSAmIDB4Rl0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFJBUElESlNPTl9VTkxJS0VMWSghKHdyaXRlRmxhZ3MgJiBrV3JpdGVWYWxpZGF0ZUVuY29kaW5nRmxhZyA/IAotICAgICAgICAgICAgICAgIFRyYW5zY29kZXI8U291cmNlRW5jb2RpbmcsIFRhcmdldEVuY29kaW5nPjo6VmFsaWRhdGUoaXMsICpvc18pIDoKLSAgICAgICAgICAgICAgICBUcmFuc2NvZGVyPFNvdXJjZUVuY29kaW5nLCBUYXJnZXRFbmNvZGluZz46OlRyYW5zY29kZVVuc2FmZShpcywgKm9zXykpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUHV0VW5zYWZlKCpvc18sICdcIicpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIFNjYW5Xcml0ZVVuZXNjYXBlZFN0cmluZyhHZW5lcmljU3RyaW5nU3RyZWFtPFNvdXJjZUVuY29kaW5nPiYgaXMsIHNpemVfdCBsZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIFJBUElESlNPTl9MSUtFTFkoaXMuVGVsbCgpIDwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBib29sIFdyaXRlU3RhcnRPYmplY3QoKSB7IG9zXy0+UHV0KCd7Jyk7IHJldHVybiB0cnVlOyB9Ci0gICAgYm9vbCBXcml0ZUVuZE9iamVjdCgpICAgeyBvc18tPlB1dCgnfScpOyByZXR1cm4gdHJ1ZTsgfQotICAgIGJvb2wgV3JpdGVTdGFydEFycmF5KCkgIHsgb3NfLT5QdXQoJ1snKTsgcmV0dXJuIHRydWU7IH0KLSAgICBib29sIFdyaXRlRW5kQXJyYXkoKSAgICB7IG9zXy0+UHV0KCddJyk7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBib29sIFdyaXRlUmF3VmFsdWUoY29uc3QgQ2gqIGpzb24sIHNpemVfdCBsZW5ndGgpIHsKLSAgICAgICAgUHV0UmVzZXJ2ZSgqb3NfLCBsZW5ndGgpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBSQVBJREpTT05fQVNTRVJUKGpzb25baV0gIT0gJ1wwJyk7Ci0gICAgICAgICAgICBQdXRVbnNhZmUoKm9zXywganNvbltpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgdm9pZCBQcmVmaXgoVHlwZSB0eXBlKSB7Ci0gICAgICAgICh2b2lkKXR5cGU7Ci0gICAgICAgIGlmIChSQVBJREpTT05fTElLRUxZKGxldmVsX3N0YWNrXy5HZXRTaXplKCkgIT0gMCkpIHsgLy8gdGhpcyB2YWx1ZSBpcyBub3QgYXQgcm9vdAotICAgICAgICAgICAgTGV2ZWwqIGxldmVsID0gbGV2ZWxfc3RhY2tfLnRlbXBsYXRlIFRvcDxMZXZlbD4oKTsKLSAgICAgICAgICAgIGlmIChsZXZlbC0+dmFsdWVDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobGV2ZWwtPmluQXJyYXkpIAotICAgICAgICAgICAgICAgICAgICBvc18tPlB1dCgnLCcpOyAvLyBhZGQgY29tbWEgaWYgaXQgaXMgbm90IHRoZSBmaXJzdCBlbGVtZW50IGluIGFycmF5Ci0gICAgICAgICAgICAgICAgZWxzZSAgLy8gaW4gb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgIG9zXy0+UHV0KChsZXZlbC0+dmFsdWVDb3VudCAlIDIgPT0gMCkgPyAnLCcgOiAnOicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFsZXZlbC0+aW5BcnJheSAmJiBsZXZlbC0+dmFsdWVDb3VudCAlIDIgPT0gMCkKLSAgICAgICAgICAgICAgICBSQVBJREpTT05fQVNTRVJUKHR5cGUgPT0ga1N0cmluZ1R5cGUpOyAgLy8gaWYgaXQncyBpbiBvYmplY3QsIHRoZW4gZXZlbiBudW1iZXIgc2hvdWxkIGJlIGEgbmFtZQotICAgICAgICAgICAgbGV2ZWwtPnZhbHVlQ291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFJBUElESlNPTl9BU1NFUlQoIWhhc1Jvb3RfKTsgICAgLy8gU2hvdWxkIG9ubHkgaGFzIG9uZSBhbmQgb25seSBvbmUgcm9vdC4KLSAgICAgICAgICAgIGhhc1Jvb3RfID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE91dHB1dFN0cmVhbSogb3NfOwotICAgIGludGVybmFsOjpTdGFjazxTdGFja0FsbG9jYXRvcj4gbGV2ZWxfc3RhY2tfOwotICAgIGludCBtYXhEZWNpbWFsUGxhY2VzXzsKLSAgICBib29sIGhhc1Jvb3RfOwotCi1wcml2YXRlOgotICAgIC8vIFByb2hpYml0IGNvcHkgY29uc3RydWN0b3IgJiBhc3NpZ25tZW50IG9wZXJhdG9yLgotICAgIFdyaXRlcihjb25zdCBXcml0ZXImKTsKLSAgICBXcml0ZXImIG9wZXJhdG9yPShjb25zdCBXcml0ZXImKTsKLX07Ci0KLS8vIEZ1bGwgc3BlY2lhbGl6YXRpb24gZm9yIFN0cmluZ1N0cmVhbSB0byBwcmV2ZW50IG1lbW9yeSBjb3B5aW5nCi0KLXRlbXBsYXRlPD4KLWlubGluZSBib29sIFdyaXRlcjxTdHJpbmdCdWZmZXI+OjpXcml0ZUludChpbnQgaSkgewotICAgIGNoYXIgKmJ1ZmZlciA9IG9zXy0+UHVzaCgxMSk7Ci0gICAgY29uc3QgY2hhciogZW5kID0gaW50ZXJuYWw6OmkzMnRvYShpLCBidWZmZXIpOwotICAgIG9zXy0+UG9wKHN0YXRpY19jYXN0PHNpemVfdD4oMTEgLSAoZW5kIC0gYnVmZmVyKSkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTw+Ci1pbmxpbmUgYm9vbCBXcml0ZXI8U3RyaW5nQnVmZmVyPjo6V3JpdGVVaW50KHVuc2lnbmVkIHUpIHsKLSAgICBjaGFyICpidWZmZXIgPSBvc18tPlB1c2goMTApOwotICAgIGNvbnN0IGNoYXIqIGVuZCA9IGludGVybmFsOjp1MzJ0b2EodSwgYnVmZmVyKTsKLSAgICBvc18tPlBvcChzdGF0aWNfY2FzdDxzaXplX3Q+KDEwIC0gKGVuZCAtIGJ1ZmZlcikpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGU8PgotaW5saW5lIGJvb2wgV3JpdGVyPFN0cmluZ0J1ZmZlcj46OldyaXRlSW50NjQoaW50NjRfdCBpNjQpIHsKLSAgICBjaGFyICpidWZmZXIgPSBvc18tPlB1c2goMjEpOwotICAgIGNvbnN0IGNoYXIqIGVuZCA9IGludGVybmFsOjppNjR0b2EoaTY0LCBidWZmZXIpOwotICAgIG9zXy0+UG9wKHN0YXRpY19jYXN0PHNpemVfdD4oMjEgLSAoZW5kIC0gYnVmZmVyKSkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTw+Ci1pbmxpbmUgYm9vbCBXcml0ZXI8U3RyaW5nQnVmZmVyPjo6V3JpdGVVaW50NjQodWludDY0X3QgdSkgewotICAgIGNoYXIgKmJ1ZmZlciA9IG9zXy0+UHVzaCgyMCk7Ci0gICAgY29uc3QgY2hhciogZW5kID0gaW50ZXJuYWw6OnU2NHRvYSh1LCBidWZmZXIpOwotICAgIG9zXy0+UG9wKHN0YXRpY19jYXN0PHNpemVfdD4oMjAgLSAoZW5kIC0gYnVmZmVyKSkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTw+Ci1pbmxpbmUgYm9vbCBXcml0ZXI8U3RyaW5nQnVmZmVyPjo6V3JpdGVEb3VibGUoZG91YmxlIGQpIHsKLSAgICBpZiAoaW50ZXJuYWw6OkRvdWJsZShkKS5Jc05hbk9ySW5mKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBjaGFyICpidWZmZXIgPSBvc18tPlB1c2goMjUpOwotICAgIGNoYXIqIGVuZCA9IGludGVybmFsOjpkdG9hKGQsIGJ1ZmZlciwgbWF4RGVjaW1hbFBsYWNlc18pOwotICAgIG9zXy0+UG9wKHN0YXRpY19jYXN0PHNpemVfdD4oMjUgLSAoZW5kIC0gYnVmZmVyKSkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi0jaWYgZGVmaW5lZChSQVBJREpTT05fU1NFMikgfHwgZGVmaW5lZChSQVBJREpTT05fU1NFNDIpCi10ZW1wbGF0ZTw+Ci1pbmxpbmUgYm9vbCBXcml0ZXI8U3RyaW5nQnVmZmVyPjo6U2NhbldyaXRlVW5lc2NhcGVkU3RyaW5nKFN0cmluZ1N0cmVhbSYgaXMsIHNpemVfdCBsZW5ndGgpIHsKLSAgICBpZiAobGVuZ3RoIDwgMTYpCi0gICAgICAgIHJldHVybiBSQVBJREpTT05fTElLRUxZKGlzLlRlbGwoKSA8IGxlbmd0aCk7Ci0KLSAgICBpZiAoIVJBUElESlNPTl9MSUtFTFkoaXMuVGVsbCgpIDwgbGVuZ3RoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY29uc3QgY2hhciogcCA9IGlzLnNyY187Ci0gICAgY29uc3QgY2hhciogZW5kID0gaXMuaGVhZF8gKyBsZW5ndGg7Ci0gICAgY29uc3QgY2hhciogbmV4dEFsaWduZWQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHApICsgMTUpICYgc3RhdGljX2Nhc3Q8c2l6ZV90Pih+MTUpKTsKLSAgICBjb25zdCBjaGFyKiBlbmRBbGlnbmVkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGVuZCkgJiBzdGF0aWNfY2FzdDxzaXplX3Q+KH4xNSkpOwotICAgIGlmIChuZXh0QWxpZ25lZCA+IGVuZCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICB3aGlsZSAocCAhPSBuZXh0QWxpZ25lZCkKLSAgICAgICAgaWYgKCpwIDwgMHgyMCB8fCAqcCA9PSAnXCInIHx8ICpwID09ICdcXCcpIHsKLSAgICAgICAgICAgIGlzLnNyY18gPSBwOwotICAgICAgICAgICAgcmV0dXJuIFJBUElESlNPTl9MSUtFTFkoaXMuVGVsbCgpIDwgbGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvc18tPlB1dFVuc2FmZSgqcCsrKTsKLQotICAgIC8vIFRoZSByZXN0IG9mIHN0cmluZyB1c2luZyBTSU1ECi0gICAgc3RhdGljIGNvbnN0IGNoYXIgZHF1b3RlWzE2XSA9IHsgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJywgJ1wiJyB9OwotICAgIHN0YXRpYyBjb25zdCBjaGFyIGJzbGFzaFsxNl0gPSB7ICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcsICdcXCcgfTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBzcGFjZVsxNl0gID0geyAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5LCAweDE5IH07Ci0gICAgY29uc3QgX19tMTI4aSBkcSA9IF9tbV9sb2FkdV9zaTEyOChyZWludGVycHJldF9jYXN0PGNvbnN0IF9fbTEyOGkgKj4oJmRxdW90ZVswXSkpOwotICAgIGNvbnN0IF9fbTEyOGkgYnMgPSBfbW1fbG9hZHVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KCZic2xhc2hbMF0pKTsKLSAgICBjb25zdCBfX20xMjhpIHNwID0gX21tX2xvYWR1X3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSAqPigmc3BhY2VbMF0pKTsKLQotICAgIGZvciAoOyBwICE9IGVuZEFsaWduZWQ7IHAgKz0gMTYpIHsKLSAgICAgICAgY29uc3QgX19tMTI4aSBzID0gX21tX2xvYWRfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBfX20xMjhpICo+KHApKTsKLSAgICAgICAgY29uc3QgX19tMTI4aSB0MSA9IF9tbV9jbXBlcV9lcGk4KHMsIGRxKTsKLSAgICAgICAgY29uc3QgX19tMTI4aSB0MiA9IF9tbV9jbXBlcV9lcGk4KHMsIGJzKTsKLSAgICAgICAgY29uc3QgX19tMTI4aSB0MyA9IF9tbV9jbXBlcV9lcGk4KF9tbV9tYXhfZXB1OChzLCBzcCksIHNwKTsgLy8gcyA8IDB4MjAgPD0+IG1heChzLCAweDE5KSA9PSAweDE5Ci0gICAgICAgIGNvbnN0IF9fbTEyOGkgeCA9IF9tbV9vcl9zaTEyOChfbW1fb3Jfc2kxMjgodDEsIHQyKSwgdDMpOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCByID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KF9tbV9tb3ZlbWFza19lcGk4KHgpKTsKLSAgICAgICAgaWYgKFJBUElESlNPTl9VTkxJS0VMWShyICE9IDApKSB7ICAgLy8gc29tZSBvZiBjaGFyYWN0ZXJzIGlzIGVzY2FwZWQKLSAgICAgICAgICAgIFNpemVUeXBlIGxlbjsKLSNpZmRlZiBfTVNDX1ZFUiAgICAgICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIGZpcnN0IGVzY2FwZWQKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICAgICAgICAgX0JpdFNjYW5Gb3J3YXJkKCZvZmZzZXQsIHIpOwotICAgICAgICAgICAgbGVuID0gb2Zmc2V0OwotI2Vsc2UKLSAgICAgICAgICAgIGxlbiA9IHN0YXRpY19jYXN0PFNpemVUeXBlPihfX2J1aWx0aW5fZmZzKHIpIC0gMSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGNoYXIqIHEgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihvc18tPlB1c2hVbnNhZmUobGVuKSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgICAgICAgICAgIHFbaV0gPSBwW2ldOwotCi0gICAgICAgICAgICBwICs9IGxlbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIF9tbV9zdG9yZXVfc2kxMjgocmVpbnRlcnByZXRfY2FzdDxfX20xMjhpICo+KG9zXy0+UHVzaFVuc2FmZSgxNikpLCBzKTsKLSAgICB9Ci0KLSAgICBpcy5zcmNfID0gcDsKLSAgICByZXR1cm4gUkFQSURKU09OX0xJS0VMWShpcy5UZWxsKCkgPCBsZW5ndGgpOwotfQotI2VuZGlmIC8vIGRlZmluZWQoUkFQSURKU09OX1NTRTIpIHx8IGRlZmluZWQoUkFQSURKU09OX1NTRTQyKQotCi1SQVBJREpTT05fTkFNRVNQQUNFX0VORAotCi0jaWZkZWYgX01TQ19WRVIKLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLSNpZmRlZiBfX2NsYW5nX18KLVJBUElESlNPTl9ESUFHX1BPUAotI2VuZGlmCi0KLSNlbmRpZiAvLyBSQVBJREpTT05fUkFQSURKU09OX0hfCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2xpY2Vuc2UudHh0IGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3JhcGlkanNvbi9saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjYzE2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvcmFwaWRqc29uL2xpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotVGVuY2VudCBpcyBwbGVhc2VkIHRvIHN1cHBvcnQgdGhlIG9wZW4gc291cmNlIGNvbW11bml0eSBieSBtYWtpbmcgUmFwaWRKU09OIGF2YWlsYWJsZS4gCi0gCi1Db3B5cmlnaHQgKEMpIDIwMTUgVEhMIEEyOSBMaW1pdGVkLCBhIFRlbmNlbnQgY29tcGFueSwgYW5kIE1pbG8gWWlwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotSWYgeW91IGhhdmUgZG93bmxvYWRlZCBhIGNvcHkgb2YgdGhlIFJhcGlkSlNPTiBiaW5hcnkgZnJvbSBUZW5jZW50LCBwbGVhc2Ugbm90ZSB0aGF0IHRoZSBSYXBpZEpTT04gYmluYXJ5IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KLUlmIHlvdSBoYXZlIGRvd25sb2FkZWQgYSBjb3B5IG9mIHRoZSBSYXBpZEpTT04gc291cmNlIGNvZGUgZnJvbSBUZW5jZW50LCBwbGVhc2Ugbm90ZSB0aGF0IFJhcGlkSlNPTiBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UsIGV4Y2VwdCBmb3IgdGhlIHRoaXJkLXBhcnR5IGNvbXBvbmVudHMgbGlzdGVkIGJlbG93IHdoaWNoIGFyZSBzdWJqZWN0IHRvIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zLiAgWW91ciBpbnRlZ3JhdGlvbiBvZiBSYXBpZEpTT04gaW50byB5b3VyIG93biBwcm9qZWN0cyBtYXkgcmVxdWlyZSBjb21wbGlhbmNlIHdpdGggdGhlIE1JVCBMaWNlbnNlLCBhcyB3ZWxsIGFzIHRoZSBvdGhlciBsaWNlbnNlcyBhcHBsaWNhYmxlIHRvIHRoZSB0aGlyZC1wYXJ0eSBjb21wb25lbnRzIGluY2x1ZGVkIHdpdGhpbiBSYXBpZEpTT04uIFRvIGF2b2lkIHRoZSBwcm9ibGVtYXRpYyBKU09OIGxpY2Vuc2UgaW4geW91ciBvd24gcHJvamVjdHMsIGl0J3Mgc3VmZmljaWVudCB0byBleGNsdWRlIHRoZSBiaW4vanNvbmNoZWNrZXIvIGRpcmVjdG9yeSwgYXMgaXQncyB0aGUgb25seSBjb2RlIHVuZGVyIHRoZSBKU09OIGxpY2Vuc2UuCi1BIGNvcHkgb2YgdGhlIE1JVCBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZmlsZS4KLQotT3RoZXIgZGVwZW5kZW5jaWVzIGFuZCBsaWNlbnNlczoKLQotT3BlbiBTb3VyY2UgU29mdHdhcmUgTGljZW5zZWQgVW5kZXIgdGhlIEJTRCBMaWNlbnNlOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIG1zaW50dHlwZXMgcjI5IAotQ29weXJpZ2h0IChjKSAyMDA2LTIwMTMgQWxleGFuZGVyIENoZW1lcmlzIAotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0qIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0qIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSogTmVpdGhlciB0aGUgbmFtZSBvZiAgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLU9wZW4gU291cmNlIFNvZnR3YXJlIExpY2Vuc2VkIFVuZGVyIHRoZSBKU09OIExpY2Vuc2U6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1qc29uLm9yZyAKLUNvcHlyaWdodCAoYykgMjAwMiBKU09OLm9yZwotQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotSlNPTl9jaGVja2VyCi1Db3B5cmlnaHQgKGMpIDIwMDIgSlNPTi5vcmcKLUFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLQkKLVRlcm1zIG9mIHRoZSBKU09OIExpY2Vuc2U6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1UaGUgU29mdHdhcmUgc2hhbGwgYmUgdXNlZCBmb3IgR29vZCwgbm90IEV2aWwuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotCi1UZXJtcyBvZiB0aGUgTUlUIExpY2Vuc2U6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyLy5naXRpZ25vcmUgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjYxY2EwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vYmluYXJpZXMvCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9tb2RlbERlc2NyaXB0aW9uLnhtbCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL21vZGVsRGVzY3JpcHRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzE5ZDA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL21vZGVsRGVzY3JpcHRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxmbWlNb2RlbERlc2NyaXB0aW9uIGZtaVZlcnNpb249IjIuMCIgZ2VuZXJhdGlvbkRhdGVBbmRUaW1lPSIyMDE2LTEwLTI3VDEwOjIzOjU4LjgzNiswMjowMCIgZ2VuZXJhdGlvblRvb2w9Ik1va2EgRk1VIGV4cG9ydGVyIiBndWlkPSJhYTcwMzRlYS04NDM0LTQzNmItYTAwOS0zMmVmYmRiMzMyZTEiIG1vZGVsTmFtZT0iQzIiPgotICA8Q29TaW11bGF0aW9uIGNhbkJlSW5zdGFudGlhdGVkT25seU9uY2VQZXJQcm9jZXNzPSJ0cnVlIiBjYW5HZXRBbmRTZXRGTVVzdGF0ZT0iZmFsc2UiIGNhbkhhbmRsZVZhcmlhYmxlQ29tbXVuaWNhdGlvblN0ZXBTaXplPSJ0cnVlIiBjYW5JbnRlcnBvbGF0ZUlucHV0cz0iZmFsc2UiIGNhbk5vdFVzZU1lbW9yeU1hbmFnZW1lbnRGdW5jdGlvbnM9InRydWUiIGNhblJ1bkFzeW5jaHJvbnVvdXNseT0iZmFsc2UiIGNhblNlcmlhbGl6ZUZNVXN0YXRlPSJmYWxzZSIgbWF4T3V0cHV0RGVyaXZhdGl2ZU9yZGVyPSIwIiBtb2RlbElkZW50aWZpZXI9IkMyTGludXg2NCIgbmVlZHNFeGVjdXRpb25Ub29sPSJmYWxzZSIgcHJvdmlkZXNEaXJlY3Rpb25hbERlcml2YXRpdmU9ImZhbHNlIi8+Ci0gIDxNb2RlbFZhcmlhYmxlcz4KLSAgICA8U2NhbGFyVmFyaWFibGUgY2F1c2FsaXR5PSJvdXRwdXQiIGluaXRpYWw9ImV4YWN0IiBuYW1lPSJhYm9ydCIgdmFsdWVSZWZlcmVuY2U9IjAiIHZhcmlhYmlsaXR5PSJkaXNjcmV0ZSI+Ci0gICAgICA8Qm9vbGVhbiBzdGFydD0iZmFsc2UiLz4KLSAgICA8L1NjYWxhclZhcmlhYmxlPgotICAgIDxTY2FsYXJWYXJpYWJsZSBjYXVzYWxpdHk9Im91dHB1dCIgaW5pdGlhbD0iZXhhY3QiIG5hbWU9IlNpemUiIHZhbHVlUmVmZXJlbmNlPSIxIiB2YXJpYWJpbGl0eT0iZGlzY3JldGUiPgotICAgICAgPEludGVnZXIgc3RhcnQ9IjEwMCIvPgotICAgIDwvU2NhbGFyVmFyaWFibGU+Ci0gIDwvTW9kZWxWYXJpYWJsZXM+Ci0gIDxNb2RlbFN0cnVjdHVyZT4KLSAgICA8T3V0cHV0cz4KLSAgICAgIDxVbmtub3duIGluZGV4PSIxIi8+Ci0gICAgICA8VW5rbm93biBpbmRleD0iMiIvPgotICAgIDwvT3V0cHV0cz4KLSAgPC9Nb2RlbFN0cnVjdHVyZT4KLTwvZm1pTW9kZWxEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5wcm9maWxlL21vZGVsL0ZNSS5wcm9maWxlLnVtbCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5wcm9maWxlL21vZGVsL0ZNSS5wcm9maWxlLnVtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3NGM2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkucHJvZmlsZS9tb2RlbC9GTUkucHJvZmlsZS51bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx1bWw6UHJvZmlsZSB4bWk6dmVyc2lvbj0iMjAxMzEwMDEiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL3NwZWMvWE1JLzIwMTMxMDAxIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1MIiB4bWk6aWQ9Il9fS2kzb0t2RkVlU1hxS3FsSHp4MWdBIiBuYW1lPSJGTUlQcm9maWxlIiBtZXRhbW9kZWxSZWZlcmVuY2U9Il9fS2kzb2F2RkVlU1hxS3FsSHp4MWdBIj4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9zYXRFd2F5X0VlU1hxS3FsSHp4MWdBIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiLz4KLSAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9OZUFGOEFmREVlYWJQZm02NHliQ1pnIj4KLSAgICA8Ym9keT5UaGlzIFBhY2thZ2UgaXMgb25seSBwcmVzZW50IHRvIGNyZWF0ZSBhbiBVTUwgZGVzY3JpcHRpb24gb2YgRk1JIE1vZGVsZGVzY3JpcHRpb24gbWV0YW1vZGVsLCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGltcG9ydCBpdCBmcm9tIHRoaXMgRk1JUHJvZmlsZSBhbmQgdG8gcmVmZXJlbmNlIHRoZSBGbWlNb2RlbERlc2NyaXB0aW9uIGZyb20gdGhlIEZNVSBzdGVyZW90eXBlJiN4RDsKLTwvYm9keT4KLSAgPC9vd25lZENvbW1lbnQ+Ci0gIDxlbGVtZW50SW1wb3J0IHhtaTppZD0iX2xhWVB3S3ZHRWVTWHFLcWxIengxZ0EiIGFsaWFzPSJDbGFzcyI+Ci0gICAgPGltcG9ydGVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNDbGFzcyIvPgotICA8L2VsZW1lbnRJbXBvcnQ+Ci0gIDxlbGVtZW50SW1wb3J0IHhtaTppZD0iX3d2M0UwYXZIRWVTWHFLcWxIengxZ0EiIGFsaWFzPSJQb3J0Ij4KLSAgICA8aW1wb3J0ZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI1BvcnQiLz4KLSAgPC9lbGVtZW50SW1wb3J0PgotICA8ZWxlbWVudEltcG9ydCB4bWk6aWQ9Il93djNyNEt2SEVlU1hxS3FsSHp4MWdBIiBhbGlhcz0iUHJvcGVydHkiPgotICAgIDxpbXBvcnRlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjUHJvcGVydHkiLz4KLSAgPC9lbGVtZW50SW1wb3J0PgotICA8ZWxlbWVudEltcG9ydCB4bWk6aWQ9Il9yWXAtVUFPbEVlV1RaLWNvTUotQ2hRIiBhbGlhcz0iRGVwZW5kZW5jeSI+Ci0gICAgPGltcG9ydGVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNEZXBlbmRlbmN5Ii8+Ci0gIDwvZWxlbWVudEltcG9ydD4KLSAgPGVsZW1lbnRJbXBvcnQgeG1pOmlkPSJfUmdKbzBDUWVFZVdXZzgzUlh1M2U4dyIgYWxpYXM9IkNvbm5lY3RvciI+Ci0gICAgPGltcG9ydGVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNDb25uZWN0b3IiLz4KLSAgPC9lbGVtZW50SW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9fS2kzb2F2RkVlU1hxS3FsSHp4MWdBIj4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI18wIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfX0tpM29xdkZFZVNYcUtxbEh6eDFnQSI+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI18wIi8+Ci0gIDwvcGFja2FnZUltcG9ydD4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfT1BHNEVBaWFFZWFiUGZtNjR5YkNaZyI+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSJwYXRobWFwOi8vUEFQWVJVU19GTUlfUFJPRklMRS8uLi8uLi9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pL21vZGVsL01vZGVsRGVzY3JpcHRpb25Qcm94eS51bWwjX29aTWkwQ2dKRWVhRVBJQURMcFlIS1EiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9iZ192MENpaUVlYUVQSUFETHBZSEtRIj4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9InBhdGhtYXA6Ly9QQVBZUlVTX0ZNSV9QUk9GSUxFLy4uLy4uL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkvbW9kZWwvZm11bWV0YW1vZGVsLnVtbCNfcXFyVWNDaVJFZWFFUElBRExwWUhLUSIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il82WjdmY0swUkVlU1hxS3FsSHp4MWdBIiBuYW1lPSJGTVUiPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8xbjhhVUswVkVlU1hxS3FsSHp4MWdBIiBuYW1lPSJmbWlWZXJzaW9uIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9HUnRCNEswV0VlU1hxS3FsSHp4MWdBIiBuYW1lPSJtb2RlbE5hbWUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX0o0Y2ZFSzBXRWVTWHFLcWxIengxZ0EiIG5hbWU9Imd1aWQiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX01sV3hRSzBXRWVTWHFLcWxIengxZ0EiIG5hbWU9ImRlc2NyaXB0aW9uIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9NNktqb0swV0VlU1hxS3FsSHp4MWdBIiBuYW1lPSJhdXRob3IiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX1YtVXJ3SzBXRWVTWHFLcWxIengxZ0EiIG5hbWU9InZlcnNpb24iPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX1cwUU9NSzBXRWVTWHFLcWxIengxZ0EiIG5hbWU9ImNvcHlyaWdodCI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfWExJZElLMFdFZVNYcUtxbEh6eDFnQSIgbmFtZT0ibGljZW5zZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfWDNjSmdLMFdFZVNYcUtxbEh6eDFnQSIgbmFtZT0iZ2VuZXJhdGlvblRvb2wiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX1lITnE0SzBXRWVTWHFLcWxIengxZ0EiIG5hbWU9ImdlbmVyYXRpb25EYXRlQW5kVGltZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfWVh1TUVLMFdFZVNYcUtxbEh6eDFnQSIgbmFtZT0idmFyaWFibGVOYW1pbmdDb252ZW50aW9uIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9Zbnd6TUswV0VlU1hxS3FsSHp4MWdBIiBuYW1lPSJudW1iZXJPZkV2ZW50SW5kaWNhdG9ycyI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzE5Q0dvTVhaRWVTaWJjVWpOUnlSenciIG5hbWU9ImJhc2VfQ2xhc3MiIGFzc29jaWF0aW9uPSJfMTlDdHNNWFpFZVNpYmNVak5SeVJ6dyI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNDbGFzcyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX1JmVHk0SzFQRWVTWHFLcWxIengxZ0EiIG5hbWU9InNvdXJjZUZpbGVzIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9WWVVyMEsxUEVlU1hxS3FsSHp4MWdBIiBuYW1lPSJjYW5CZUluc3RhbnRpYXRlZE9ubHlPbmNlUGVyUHJvY2VzcyI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX1dhT05zSzFQRWVTWHFLcWxIengxZ0EiIG5hbWU9ImNhbkdldEFuZFNldEZNVXN0YXRlIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfWV9NcjRLMVBFZVNYcUtxbEh6eDFnQSIgbmFtZT0iY2FuTm90VXNlTWVtb3J5TWFuYWdlbWVudEZ1bmN0aW9ucyI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2FNVFlNSzFQRWVTWHFLcWxIengxZ0EiIG5hbWU9ImNhblNlcmlhbGl6ZUZNVXN0YXRlIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfZjVZUHdLMVBFZVNYcUtxbEh6eDFnQSIgbmFtZT0icHJvdmlkZXNEaXJlY3Rpb25hbERlcml2YXRpdmUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9lbTU3UUsxUEVlU1hxS3FsSHp4MWdBIiBuYW1lPSJuZWVkc0V4ZWN1dGlvblRvb2wiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9kQXYxd0sxUEVlU1hxS3FsSHp4MWdBIiBuYW1lPSJtb2RlbElkZW50aWZpZXIiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2piLWUwQ2loRWVhRVBJQURMcFlIS1EiIG5hbWU9Im1vZGVsRGVzY3JpcHRpb24iIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il9qYjhwb0NpaEVlYUVQSUFETHBZSEtRIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9QQVBZUlVTX0ZNSV9QUk9GSUxFLy4uLy4uL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkvbW9kZWwvTW9kZWxEZXNjcmlwdGlvblByb3h5LnVtbCNfb1pNaTB5Z0pFZWFFUElBRExwWUhLUSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2Z1ek5BaWlpRWVhRVBJQURMcFlIS1EiIG5hbWU9ImZtdUJ1bmRsZSIgYXNzb2NpYXRpb249Il9mdXlsOENpaUVlYUVQSUFETHBZSEtRIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9QQVBZUlVTX0ZNSV9QUk9GSUxFLy4uLy4uL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkvbW9kZWwvZm11bWV0YW1vZGVsLnVtbCNfQVBvemdDZ0tFZWFFUElBRExwWUhLUSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfbmp2TTBLMGlFZVNYcUtxbEh6eDFnQSIgbmFtZT0iUGFyYW1ldGVyIj4KLSAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfZWdoWWNNUGlFZVNpYmNVak5SeVJ6dyIgZ2VuZXJhbD0iX05SdlA4T3l0RWVTRUJLSldEQ3JBSVEiLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il94aFdGY0swaUVlU1hxS3FsSHp4MWdBIiBuYW1lPSJMb2NhbCI+Ci0gICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2Q4anZ3TVBpRWVTaWJjVWpOUnlSenciIGdlbmVyYWw9Il9OUnZQOE95dEVlU0VCS0pXRENyQUlRIi8+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfekFaWllLMU9FZVNYcUtxbEh6eDFnQSIgbmFtZT0iQ1NfRk1VIj4KLSAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfVzd6cDBNUGlFZVNpYmNVak5SeVJ6dyIgZ2VuZXJhbD0iXzZaN2ZjSzBSRWVTWHFLcWxIengxZ0EiLz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfMGZSVnNLMVBFZVNYcUtxbEh6eDFnQSIgbmFtZT0iY2FuSGFuZGxlVmFyaWFibGVDb21tdW5pY2F0aW9uU3RlcFNpemUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8yRm1hVUsxUEVlU1hxS3FsSHp4MWdBIiBuYW1lPSJjYW5JbnRlcnBvbGF0ZUlucHV0cyI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzVDNmdBSzFQRWVTWHFLcWxIengxZ0EiIG5hbWU9ImNhblJ1bkFzeW5jaHJvbnVvdXNseSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzdTTzNRSzFQRWVTWHFLcWxIengxZ0EiIG5hbWU9Im1heE91dHB1dERlcml2YXRpdmVPcmRlciI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX19hQWs4SzFQRWVTWHFLcWxIengxZ0EiIG5hbWU9Im5lZWRzRXhlY3V0aW9uVG9vbCI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3JXMDJvT3dkRWVTRUJLSldEQ3JBSVEiIG5hbWU9InN0YXJ0VGltZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzdMekxRT3dkRWVTRUJLSldEQ3JBSVEiIG5hbWU9InN0b3BUaW1lIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfLWhnaTBPd2RFZVNFQktKV0RDckFJUSIgbmFtZT0ic3RlcFNpemUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9BcjU5ME93ZUVlU0VCS0pXRENyQUlRIiBuYW1lPSJ0b2xlcmFuY2UiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iXzJyamNnSzFPRWVTWHFLcWxIengxZ0EiIG5hbWU9Ik1FX0ZNVSI+Ci0gICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX1hROWFjTVBpRWVTaWJjVWpOUnlSenciIGdlbmVyYWw9Il82WjdmY0swUkVlU1hxS3FsSHp4MWdBIi8+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2J0anZrSzFQRWVTWHFLcWxIengxZ0EiIG5hbWU9ImNvbXBsZXRlZEludGVncmF0b3JTdGVwTm90TmVlZGVkIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iXzE5Q3RzTVhaRWVTaWJjVWpOUnlSenciIG5hbWU9IkVfRk1VX0NsYXNzMSIgbWVtYmVyRW5kPSJfMTlDdHNjWFpFZVNpYmNVak5SeVJ6dyBfMTlDR29NWFpFZVNpYmNVak5SeVJ6dyI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il8xOUN0c2NYWkVlU2liY1VqTlJ5Unp3IiBuYW1lPSJleHRlbnNpb25fRk1VIiB0eXBlPSJfNlo3ZmNLMFJFZVNYcUtxbEh6eDFnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8xOUN0c01YWkVlU2liY1VqTlJ5Unp3Ii8+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfMEFiNTRPeWpFZVNFQktKV0RDckFJUSIgbmFtZT0iUG9ydCI+Ci0gICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX09hOTM4T3lrRWVTRUJLSldEQ3JBSVEiIGdlbmVyYWw9Il9OUnZQOE95dEVlU0VCS0pXRENyQUlRIi8+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX05tSFRrT3lrRWVTRUJLSldEQ3JBSVEiIG5hbWU9ImJhc2VfUG9ydCIgYXNzb2NpYXRpb249Il9ObUloc095a0VlU0VCS0pXRENyQUlRIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI1BvcnQiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9iaXI4SU95a0VlU0VCS0pXRENyQUlRIiBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9Il9DSmJlZ0FZUEVlYTM3SXBOcDl0b05RIi8+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il9ObUloc095a0VlU0VCS0pXRENyQUlRIiBuYW1lPSJFX1BvcnRfUG9ydDEiIG1lbWJlckVuZD0iX05tSWhzZXlrRWVTRUJLSldEQ3JBSVEgX05tSFRrT3lrRWVTRUJLSldEQ3JBSVEiPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfTm1JaHNleWtFZVNFQktKV0RDckFJUSIgbmFtZT0iZXh0ZW5zaW9uX1BvcnQiIHR5cGU9Il8wQWI1NE95akVlU0VCS0pXRENyQUlRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX05tSWhzT3lrRWVTRUJLSldEQ3JBSVEiLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il9OUnZQOE95dEVlU0VCS0pXRENyQUlRIiBuYW1lPSJTY2FsYXJWYXJpYWJsZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX1hSX000T3l0RWVTRUJLSldEQ3JBSVEiIG5hbWU9ImJhc2VfUHJvcGVydHkiIGFzc29jaWF0aW9uPSJfWFNBYkFPeXRFZVNFQktKV0RDckFJUSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNQcm9wZXJ0eSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX2hRMWJvT3l0RWVTRUJLSldEQ3JBSVEiIG5hbWU9ImRlc2NyaXB0aW9uIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9Rd2xka0pkZ0VlV1hIZTFMdF82ZU53IiBuYW1lPSJ2YXJpYWJpbGl0eSIgdHlwZT0iX202QWUwQ0NiRWVXdDRNaTFlYkVNZHciLz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfYzk4TFFKZGdFZVdYSGUxTHRfNmVOdyIgbmFtZT0iaW5pdGlhbCIgdHlwZT0iX0VKYzBnQ0NjRWVXdDRNaTFlYkVNZHciLz4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfZ3laVVVKZGdFZVdYSGUxTHRfNmVOdyIgbmFtZT0idmFsdWVSZWZlcmVuY2UiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL0Vjb3JlUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjRUludCIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8wcnBlZ0M1QkVlYTBfT0xEYXQya1FRIiB2YWx1ZT0iLTEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9yZUMzMENpaEVlYUVQSUFETHBZSEtRIiBuYW1lPSJmbWlWYXJpYWJsZSIgYXNzb2NpYXRpb249Il9yZUJDb0NpaEVlYUVQSUFETHBZSEtRIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9InBhdGhtYXA6Ly9QQVBZUlVTX0ZNSV9QUk9GSUxFLy4uLy4uL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkvbW9kZWwvTW9kZWxEZXNjcmlwdGlvblByb3h5LnVtbCNfb1pNaTFDZ0pFZWFFUElBRExwWUhLUSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il9YU0FiQU95dEVlU0VCS0pXRENyQUlRIiBuYW1lPSJFX1NjYWxhclZhcmlhYmxlX1Byb3BlcnR5MSIgbWVtYmVyRW5kPSJfWFNBYkFleXRFZVNFQktKV0RDckFJUSBfWFJfTTRPeXRFZVNFQktKV0RDckFJUSI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il9YU0FiQWV5dEVlU0VCS0pXRENyQUlRIiBuYW1lPSJleHRlbnNpb25fU2NhbGFyVmFyaWFibGUiIHR5cGU9Il9OUnZQOE95dEVlU0VCS0pXRENyQUlRIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX1hTQWJBT3l0RWVTRUJLSldEQ3JBSVEiLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il9kV05DRU81dUVlUzlGT3Z1SDUybnlRIiBuYW1lPSJJbmRlcGVuZGVudCI+Ci0gICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX2ZjX0lZTzV1RWVTOUZPdnVINTJueVEiIGdlbmVyYWw9Il9OUnZQOE95dEVlU0VCS0pXRENyQUlRIi8+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iX202QWUwQ0NiRWVXdDRNaTFlYkVNZHciIG5hbWU9IlZhcmlhYmlsaXR5S2luZCI+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9vY1hwY0NDYkVlV3Q0TWkxZWJFTWR3IiBuYW1lPSJjb25zdGFudCIvPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfb3k4OWNDQ2JFZVd0NE1pMWViRU1kdyIgbmFtZT0iZml4ZWQiLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3c3SFhZQ0NiRWVXdDRNaTFlYkVNZHciIG5hbWU9InR1bmFibGUiLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3gxaVlRQ0NiRWVXdDRNaTFlYkVNZHciIG5hbWU9ImRpc2NyZXRlIi8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95M29IWUNDYkVlV3Q0TWkxZWJFTWR3IiBuYW1lPSJjb250aW51b3VzIi8+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iX0VKYzBnQ0NjRWVXdDRNaTFlYkVNZHciIG5hbWU9IkluaXRpYWxLaW5kIj4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX0ZQc0QwQ0NjRWVXdDRNaTFlYkVNZHciIG5hbWU9ImV4YWN0Ii8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9GZXdha0NDY0VlV3Q0TWkxZWJFTWR3IiBuYW1lPSJhcHByb3giLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX0Y4a19BQ0NjRWVXdDRNaTFlYkVNZHciIG5hbWU9ImNhbGN1bGF0ZWQiLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfTVNvaUlDQ2NFZVd0NE1pMWViRU1kdyIgbmFtZT0iRGVwZW5kZW5jaWVzS2luZCI+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9QaFdnNENDY0VlV3Q0TWkxZWJFTWR3IiBuYW1lPSJkZXBlbmRlbnQiLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX1AwRlBvQ0NjRWVXdDRNaTFlYkVNZHciIG5hbWU9ImNvbnN0YW50Ii8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9RSGZUMENDY0VlV3Q0TWkxZWJFTWR3IiBuYW1lPSJmaXhlZCIvPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfUWJYNUlDQ2NFZVd0NE1pMWViRU1kdyIgbmFtZT0idHVuYWJsZSIvPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfUTVzejRDQ2NFZVd0NE1pMWViRU1kdyIgbmFtZT0iZGlzY3JldGUiLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il9YYmpzY0NDZUVlV3Q0TWkxZWJFTWR3IiBuYW1lPSJVbmtub3duIj4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfbV82eU1DQ2VFZVd0NE1pMWViRU1kdyIgbmFtZT0iYmFzZV9Qcm9wZXJ0eSIgYXNzb2NpYXRpb249Il9tXzE1c0NDZUVlV3Q0TWkxZWJFTWR3Ij4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI1Byb3BlcnR5Ii8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfTjVSTDhDQ2dFZVd0NE1pMWViRU1kdyIgbmFtZT0iZGVwZW5kZW5jaWVzIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1l2dV9NQ0NnRWVXdDRNaTFlYkVNZHciLz4KLSAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1l2eXBrQ0NnRWVXdDRNaTFlYkVNZHciIHZhbHVlPSIxIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfT3pHVzhDQ2dFZVd0NE1pMWViRU1kdyIgbmFtZT0iZGVwZW5kZW5jaWVzS2luZCI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il81d0s2UUNDZ0VlV3Q0TWkxZWJFTWR3Ii8+Ci0gICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il81d1B5d0NDZ0VlV3Q0TWkxZWJFTWR3IiB2YWx1ZT0iMSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfWUt1ZmtDQ2VFZVd0NE1pMWViRU1kdyIgbmFtZT0iT3V0cHV0VW5rbm93biI+Ci0gICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX0xyd0xnQ0NnRWVXdDRNaTFlYkVNZHciIGdlbmVyYWw9Il9YYmpzY0NDZUVlV3Q0TWkxZWJFTWR3Ii8+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfWW4zdWtDQ2VFZVd0NE1pMWViRU1kdyIgbmFtZT0iSW5pdGlhbFVua25vd24iPgotICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9NZ2xod0NDZ0VlV3Q0TWkxZWJFTWR3IiBnZW5lcmFsPSJfWGJqc2NDQ2VFZVd0NE1pMWViRU1kdyIvPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iX2x5M3dRQ0NlRWVXdDRNaTFlYkVNZHciIG5hbWU9IkRlcml2YXRpdmVVbmtub3duIj4KLSAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfTUo0UjhDQ2dFZVd0NE1pMWViRU1kdyIgZ2VuZXJhbD0iX1hianNjQ0NlRWVXdDRNaTFlYkVNZHciLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iX21fMTVzQ0NlRWVXdDRNaTFlYkVNZHciIG5hbWU9IkVfVW5rbm93bl9Qcm9wZXJ0eTEiIG1lbWJlckVuZD0iX21fNkxJQ0NlRWVXdDRNaTFlYkVNZHcgX21fNnlNQ0NlRWVXdDRNaTFlYkVNZHciPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfbV82TElDQ2VFZVd0NE1pMWViRU1kdyIgbmFtZT0iZXh0ZW5zaW9uX1Vua25vd24iIHR5cGU9Il9YYmpzY0NDZUVlV3Q0TWkxZWJFTWR3IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX21fMTVzQ0NlRWVXdDRNaTFlYkVNZHciLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il9rajZ6Y0NUSUVlV1dnODNSWHUzZTh3IiBuYW1lPSJDU19HcmFwaCI+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzAzVm9rSkhxRWVXQndlZ01HUjBzM2ciIG5hbWU9InN0YXJ0VGltZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxSZWFsIiB4bWk6aWQ9Il9MNEloVUpJRUVlV0J3ZWdNR1IwczNnIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfMTFURm9KSHFFZVdCd2VnTUdSMHMzZyIgbmFtZT0ic3RvcFRpbWUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfVUZIdzRKSUVFZVdCd2VnTUdSMHMzZyIgdmFsdWU9IjEwMC4wIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfVkd3TkFKSUVFZVdCd2VnTUdSMHMzZyIgbmFtZT0ic3RlcFNpemUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfYzl6QndKSUVFZVdCd2VnTUdSMHMzZyIgdmFsdWU9IjEwLjAiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9nLVhVTUpJRUVlV0J3ZWdNR1IwczNnIiBuYW1lPSJ0b2xlcmFuY2UiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfbDFHWm9KSUVFZVdCd2VnTUdSMHMzZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX21vMkt3SklFRWVXQndlZ01HUjBzM2ciIG5hbWU9InRvbGVyYW5jZURlZmluZWQiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfdFZGWlFKSUVFZVdCd2VnTUdSMHMzZyIgdmFsdWU9InRydWUiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il91OU1ta0pJRUVlV0J3ZWdNR1IwczNnIiBuYW1lPSJzdG9wVGltZURlZmluZWQiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfeWZ4OGdKSUVFZVdCd2VnTUdSMHMzZyIgdmFsdWU9InRydWUiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zaEt5d0pJRUVlV0J3ZWdNR1IwczNnIiBuYW1lPSJjb21wdXRlU2V0dXBFeHBlcmltZW50c0Zyb21GbXVzIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0d0Zkw4SklGRWVXQndlZ01HUjBzM2ciLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il92OFR0b1o1T0VlVzRocFZpdTA4NHdRIiBuYW1lPSJiYXNlX0NsYXNzIiBhc3NvY2lhdGlvbj0iX3Y4QXlzSjVPRWVXNGhwVml1MDg0d1EiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjQ2xhc3MiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iX3JlelNNSksyRWVXTkpPanRGTnhoakEiIG5hbWU9IkRlcml2YXRpdmVEZXBlbmRlbmN5Ij4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfdDJGNXNKSzJFZVdOSk9qdEZOeGhqQSIgbmFtZT0iYmFzZV9EZXBlbmRlbmN5IiBhc3NvY2lhdGlvbj0iX3QxX01BSksyRWVXTkpPanRGTnhoakEiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjRGVwZW5kZW5jeSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3VsSl9JSksyRWVXTkpPanRGTnhoakEiIG5hbWU9ImRlcGVuZGVuY3lLaW5kIiB0eXBlPSJfTVNvaUlDQ2NFZVd0NE1pMWViRU1kdyIvPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfdDFfTUFKSzJFZVdOSk9qdEZOeGhqQSIgbmFtZT0iRV9EZXJpdmF0aXZlRGVwZW5kZW5jeV9EZXBlbmRlbmN5MSIgbWVtYmVyRW5kPSJfdDJFRWdKSzJFZVdOSk9qdEZOeGhqQSBfdDJGNXNKSzJFZVdOSk9qdEZOeGhqQSI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il90MkVFZ0pLMkVlV05KT2p0Rk54aGpBIiBuYW1lPSJleHRlbnNpb25fRGVyaXZhdGl2ZURlcGVuZGVuY3kiIHR5cGU9Il9yZXpTTUpLMkVlV05KT2p0Rk54aGpBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3QxX01BSksyRWVXTkpPanRGTnhoakEiLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il8zaXQwVUpPWUVlV05KT2p0Rk54aGpBIiBuYW1lPSJPdXRwdXREZXBlbmRlbmN5Ij4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfQ2dZYndKT1pFZVdOSk9qdEZOeGhqQSIgbmFtZT0iYmFzZV9EZXBlbmRlbmN5IiBhc3NvY2lhdGlvbj0iX0NnV21rSk9aRWVXTkpPanRGTnhoakEiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjRGVwZW5kZW5jeSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJfNEZwaVFKT1lFZVdOSk9qdEZOeGhqQSIgbmFtZT0iSW5pdGlhbFVua25vd25EZXBlbmRlbmN5Ij4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfQ0daT2NKT1pFZVdOSk9qdEZOeGhqQSIgbmFtZT0iYmFzZV9EZXBlbmRlbmN5IiBhc3NvY2lhdGlvbj0iX0NHWFpRSk9aRWVXTkpPanRGTnhoakEiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjRGVwZW5kZW5jeSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il9DR1haUUpPWkVlV05KT2p0Rk54aGpBIiBuYW1lPSJFX0luaXRpYWxVbmtub3duRGVwZW5kZW5jeV9EZXBlbmRlbmN5MSIgbWVtYmVyRW5kPSJfQ0dZbllKT1pFZVdOSk9qdEZOeGhqQSBfQ0daT2NKT1pFZVdOSk9qdEZOeGhqQSI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9Il9DR1luWUpPWkVlV05KT2p0Rk54aGpBIiBuYW1lPSJleHRlbnNpb25fSW5pdGlhbFVua25vd25EZXBlbmRlbmN5IiB0eXBlPSJfNEZwaVFKT1lFZVdOSk9qdEZOeGhqQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il9DR1haUUpPWkVlV05KT2p0Rk54aGpBIi8+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Il9DZ1dta0pPWkVlV05KT2p0Rk54aGpBIiBuYW1lPSJFX091dHB1dERlcGVuZGVuY3lfRGVwZW5kZW5jeTEiIG1lbWJlckVuZD0iX0NnWDBzSk9aRWVXTkpPanRGTnhoakEgX0NnWWJ3Sk9aRWVXTkpPanRGTnhoakEiPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfQ2dYMHNKT1pFZVdOSk9qdEZOeGhqQSIgbmFtZT0iZXh0ZW5zaW9uX091dHB1dERlcGVuZGVuY3kiIHR5cGU9Il8zaXQwVUpPWUVlV05KT2p0Rk54aGpBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX0NnV21rSk9aRWVXTkpPanRGTnhoakEiLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Il9KZUpLc0pkZ0VlV1hIZTFMdF82ZU53IiBuYW1lPSJDYWxjdWxhdGVkUGFyYW1ldGVyIj4KLSAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfS1ZnM2tKZGdFZVdYSGUxTHRfNmVOdyIgZ2VuZXJhbD0iX05SdlA4T3l0RWVTRUJLSldEQ3JBSVEiLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfTVRHd01KZGhFZVdYSGUxTHRfNmVOdyIgbmFtZT0iQ2F1c2FsaXR5S2luZCI+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9NOUhXZ0pkaEVlV1hIZTFMdF82ZU53IiBuYW1lPSJwYXJhbWV0ZXIiLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX09Ob2pNSmRoRWVXWEhlMUx0XzZlTnciIG5hbWU9ImNhbGN1bGF0ZWRQYXJhbWV0ZXIiLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX09yQWJzSmRoRWVXWEhlMUx0XzZlTnciIG5hbWU9ImlucHV0Ii8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9QSFdaY0pkaEVlV1hIZTFMdF82ZU53IiBuYW1lPSJvdXRwdXQiLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX1B5LXdZSmRoRWVXWEhlMUx0XzZlTnciIG5hbWU9ImxvY2FsIi8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9RSGx1Y0pkaEVlV1hIZTFMdF82ZU53IiBuYW1lPSJpbmRlcGVuZGVudCIvPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJfdjhBeXNKNU9FZVc0aHBWaXUwODR3USIgbmFtZT0iRV9DU19HcmFwaF9DbGFzczIiIG1lbWJlckVuZD0iX3Y4VHRvSjVPRWVXNGhwVml1MDg0d1EgX3Y4VHRvWjVPRWVXNGhwVml1MDg0d1EiPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJfdjhUdG9KNU9FZVc0aHBWaXUwODR3USIgbmFtZT0iZXh0ZW5zaW9uX0NTX0dyYXBoIiB0eXBlPSJfa2o2emNDVElFZVdXZzgzUlh1M2U4dyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il92OEF5c0o1T0VlVzRocFZpdTA4NHdRIi8+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iX1ZMS2pzQVlIRWVhMzdJcE5wOXRvTlEiIG5hbWU9IlZhcmlhYmlsaXR5TmFtaW5nQ29udmVudGlvbiI+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9WTEtqc1FZSEVlYTM3SXBOcDl0b05RIiBuYW1lPSJmbGF0Ii8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9WTEtqc2dZSEVlYTM3SXBOcDl0b05RIiBuYW1lPSJzdHJ1Y3R1cmVkIi8+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iX1BpZUFZQVlJRWVhMzdJcE5wOXRvTlEiIG5hbWU9IkJhc2VVbml0Ij4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX1BpZUFZUVlJRWVhMzdJcE5wOXRvTlEiIG5hbWU9ImEiLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX1BpZUFZZ1lJRWVhMzdJcE5wOXRvTlEiIG5hbWU9ImNkIi8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9QaWVBWXdZSUVlYTM3SXBOcDl0b05RIiBuYW1lPSJmYWN0b3IiLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX1BpZUFaQVlJRWVhMzdJcE5wOXRvTlEiIG5hbWU9ImsiLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX1BpZUFaUVlJRWVhMzdJcE5wOXRvTlEiIG5hbWU9ImtnIi8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9QaWVBWmdZSUVlYTM3SXBOcDl0b05RIiBuYW1lPSJtIi8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9QaWVBWndZSUVlYTM3SXBOcDl0b05RIiBuYW1lPSJtb2wiLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX1BpZUFhQVlJRWVhMzdJcE5wOXRvTlEiIG5hbWU9Im9mZnNldCIvPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfUGllQWFRWUlFZWEzN0lwTnA5dG9OUSIgbmFtZT0icmFkIi8+Ci0gICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il9QaWVBYWdZSUVlYTM3SXBOcDl0b05RIiBuYW1lPSJzIi8+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iX0NKYmVnQVlQRWVhMzdJcE5wOXRvTlEiIG5hbWU9IkZsb3dEaXJlY3Rpb24iPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfRUxtS2tBWVBFZWEzN0lwTnA5dG9OUSIgbmFtZT0iaW4iLz4KLSAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX0U2UFpRQVlQRWVhMzdJcE5wOXRvTlEiIG5hbWU9Im91dCIvPgotICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfRnd0dVFBWVBFZWEzN0lwTnA5dG9OUSIgbmFtZT0iaW5vdXQiLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfamI4cG9DaWhFZWFFUElBRExwWUhLUSIgbWVtYmVyRW5kPSJfamItZTBDaWhFZWFFUElBRExwWUhLUSBfamItZTBTaWhFZWFFUElBRExwWUhLUSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9qYjkzd0NpaEVlYUVQSUFETHBZSEtRIiBzb3VyY2U9Im9yZy5lY2xpcHNlLnBhcHlydXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfamI5M3dTaWhFZWFFUElBRExwWUhLUSIga2V5PSJuYXR1cmUiIHZhbHVlPSJVTUxfTmF0dXJlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTppZD0iX2piLWUwU2loRWVhRVBJQURMcFlIS1EiIG5hbWU9ImZtdSIgdHlwZT0iXzZaN2ZjSzBSRWVTWHFLcWxIengxZ0EiIGFzc29jaWF0aW9uPSJfamI4cG9DaWhFZWFFUElBRExwWUhLUSIvPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il9yZUJDb0NpaEVlYUVQSUFETHBZSEtRIiBtZW1iZXJFbmQ9Il9yZUMzMENpaEVlYUVQSUFETHBZSEtRIF9yZUMzMFNpaEVlYUVQSUFETHBZSEtRIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3JlQ1F3Q2loRWVhRVBJQURMcFlIS1EiIHNvdXJjZT0ib3JnLmVjbGlwc2UucGFweXJ1cyI+Ci0gICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9yZUNRd1NpaEVlYUVQSUFETHBZSEtRIiBrZXk9Im5hdHVyZSIgdmFsdWU9IlVNTF9OYXR1cmUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8b3duZWRFbmQgeG1pOmlkPSJfcmVDMzBTaWhFZWFFUElBRExwWUhLUSIgbmFtZT0ic2NhbGFydmFyaWFibGUiIHR5cGU9Il9OUnZQOE95dEVlU0VCS0pXRENyQUlRIiBhc3NvY2lhdGlvbj0iX3JlQkNvQ2loRWVhRVBJQURMcFlIS1EiLz4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfZnV5bDhDaWlFZWFFUElBRExwWUhLUSIgbWVtYmVyRW5kPSJfZnV6TkFpaWlFZWFFUElBRExwWUhLUSBfZnV6TkF5aWlFZWFFUElBRExwWUhLUSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9mdXpOQUNpaUVlYUVQSUFETHBZSEtRIiBzb3VyY2U9Im9yZy5lY2xpcHNlLnBhcHlydXMiPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfZnV6TkFTaWlFZWFFUElBRExwWUhLUSIga2V5PSJuYXR1cmUiIHZhbHVlPSJVTUxfTmF0dXJlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPG93bmVkRW5kIHhtaTppZD0iX2Z1ek5BeWlpRWVhRVBJQURMcFlIS1EiIG5hbWU9ImZtdSIgdHlwZT0iXzZaN2ZjSzBSRWVTWHFLcWxIengxZ0EiIGFzc29jaWF0aW9uPSJfZnV5bDhDaWlFZWFFUElBRExwWUhLUSIvPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9BaFd6NEswV0VlU1hxS3FsSHp4MWdBIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0RnX2d3SkhERWVXQndlZ01HUjBzM2ciIHNvdXJjZT0iUGFweXJ1c1ZlcnNpb24iPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfRGdfZ3daSERFZVdCd2VnTUdSMHMzZyIga2V5PSJWZXJzaW9uIiB2YWx1ZT0iMC4xLjEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX0RnX2d3cEhERWVXQndlZ01HUjBzM2ciIGtleT0iQ29tbWVudCIgdmFsdWU9IiIvPgotICAgICAgPGRldGFpbHMgeG1pOmlkPSJfRGdfZ3c1SERFZVdCd2VnTUdSMHMzZyIga2V5PSJDb3B5cmlnaHQiIHZhbHVlPSIiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX0RnX2d4SkhERWVXQndlZ01HUjBzM2ciIGtleT0iRGF0ZSIgdmFsdWU9IjIwMTUtMDEtMjEiLz4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX0RnX2d4WkhERWVXQndlZ01HUjBzM2ciIGtleT0iQXV0aG9yIiB2YWx1ZT0iIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9BaHYxY0swV0VlU1hxS3FsSHp4MWdBIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5wYXB5cnVzLnVtbC5hbGYubGlicmFyaWVzL3Jlc291cmNlcy9hY3Rpb24tbGFuZ3VhZ2UtcHJvZmlsZS9BY3Rpb25MYW5ndWFnZS1Qcm9maWxlLnByb2ZpbGUudW1sI19LdjhFSUtGWEVlU19LTlgwbmZ2SVZRIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnBhcHlydXMudW1sLmFsZi5saWJyYXJpZXMvcmVzb3VyY2VzL2FjdGlvbi1sYW5ndWFnZS1wcm9maWxlL0FjdGlvbkxhbmd1YWdlLVByb2ZpbGUucHJvZmlsZS51bWwjQWN0aW9uTGFuZ3VhZ2UiLz4KLSAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfa0V0ZFVCd1VFZVdGUkx5Qm5xYTBvdyI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9rRXh1d0J3VUVlV0ZSTHlCbnFhMG93IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI196MU9GY0hqcUVkeThTNENyOFJjX05BIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjXzAiLz4KLSAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci08L3VtbDpQcm9maWxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvQzIvcmVzb3VyY2VzL21vZGVsL3BsdWdpbi9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZnVtbC5zdGFuZGFyZGxpYnJhcnkvcmVzb3VyY2VzL2ZVTUxfTGlicmFyeS51bWwgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mdW1sLnN0YW5kYXJkbGlicmFyeS9yZXNvdXJjZXMvZlVNTF9MaWJyYXJ5LnVtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwNjIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mdW1sLnN0YW5kYXJkbGlicmFyeS9yZXNvdXJjZXMvZlVNTF9MaWJyYXJ5LnVtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHVtbDpNb2RlbCB4bWk6dmVyc2lvbj0iMjAxMzEwMDEiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL3NwZWMvWE1JLzIwMTMxMDAxIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwiIHhtaTppZD0iXzAiIG5hbWU9IkZvdW5kYXRpb25hbE1vZGVsTGlicmFyeSI+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycyIgbmFtZT0iUHJpbWl0aXZlQmVoYXZpb3JzIj4KLSAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1fcGFja2FnZUltcG9ydC4wIj4KLSAgICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNfMCIvPgotICAgIDwvcGFja2FnZUltcG9ydD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucyIgbmFtZT0iSW50ZWdlckZ1bmN0aW9ucyI+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1Ub0ludGVnZXIiIG5hbWU9IlRvSW50ZWdlciIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtVG9JbnRlZ2VyLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtVG9JbnRlZ2VyLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLVRvSW50ZWdlci1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtbHQiIG5hbWU9IiZsdDsiIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLWx0LXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLWx0LXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLWx0LXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtcGx1cyIgbmFtZT0iKyIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtcGx1cy14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1wbHVzLXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLXBsdXMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1taW51cyIgbmFtZT0iLSIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtbWludXMteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtbWludXMteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtbWludXMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy10aW1lcyIgbmFtZT0iKiIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtdGltZXMteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtdGltZXMteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtdGltZXMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1EaXYiIG5hbWU9IkRpdiIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtRGl2LXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLURpdi15IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1EaXYtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtRGl2LXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1OZWciIG5hbWU9Ik5lZyIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtTmVnLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLU5lZy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLU1vZCIgbmFtZT0iTW9kIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1Nb2QteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtTW9kLXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLU1vZC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLU1heCIgbmFtZT0iTWF4IiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1NYXgteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtTWF4LXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLU1heC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLU1pbiIgbmFtZT0iTWluIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1NaW4teCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtTWluLXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLU1pbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLUFicyIgbmFtZT0iQWJzIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1BYnMteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtQWJzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtZ3QiIG5hbWU9Ij4iIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLWd0LXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLWd0LXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLWd0LXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtbGUiIG5hbWU9IiZsdDs9IiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1sZS14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1sZS15IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1sZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLWdlIiBuYW1lPSI+PSIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtZ2UteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtZ2UteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtZ2UtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1Ub1N0cmluZyIgbmFtZT0iVG9TdHJpbmciIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLVRvU3RyaW5nLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLVRvU3RyaW5nLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1Ub1VubGltaXRlZE5hdHVyYWwiIG5hbWU9IlRvVW5saW1pdGVkTmF0dXJhbCIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtVG9VbmxpbWl0ZWROYXR1cmFsLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLVRvVW5saW1pdGVkTmF0dXJhbC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1Ub1VubGltaXRlZE5hdHVyYWwtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLWRpdmlkZSIgbmFtZT0iLyIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0icmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1kaXZpZGUteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0icmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1kaXZpZGUteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0icmltaXRpdmVCZWhhdmlvcnMtSW50ZWdlckZ1bmN0aW9ucy1kaXZpZGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtZGl2aWRlLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMiIG5hbWU9IlJlYWxGdW5jdGlvbnMiPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtVG9JbnRlZ2VyIiBuYW1lPSJUb0ludGVnZXIiIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLVRvSW50ZWdlci14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1Ub0ludGVnZXItcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1sdCIgbmFtZT0iJmx0OyIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtbHQteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtbHQteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtbHQtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1wbHVzIiBuYW1lPSIrIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1wbHVzLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLXBsdXMteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtcGx1cy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLW1pbnVzIiBuYW1lPSItIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1taW51cy14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1taW51cy15IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1taW51cy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLXRpbWVzIiBuYW1lPSIqIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy10aW1lcy14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy10aW1lcy15IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy10aW1lcy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLWRpdmlkZSIgbmFtZT0iLyIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtZGl2aWRlLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLWRpdmlkZS15IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1kaXZpZGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtZGl2aWRlLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1OZWciIG5hbWU9Ik5lZyIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtTmVnLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLU5lZy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLU1heCIgbmFtZT0iTWF4IiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1NYXgteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtTWF4LXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLU1heC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLU1pbiIgbmFtZT0iTWluIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1NaW4teCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtTWluLXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLU1pbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLUFicyIgbmFtZT0iQWJzIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1BYnMteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtQWJzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtZ3QiIG5hbWU9Ij4iIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLWd0LXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLWd0LXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLWd0LXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtbGUiIG5hbWU9IiZsdDs9IiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1sZS14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1sZS15IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1sZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLWdlIiBuYW1lPSI+PSIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtZ2UteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtZ2UteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtZ2UtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1Ub1N0cmluZyIgbmFtZT0iVG9TdHJpbmciIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLVRvU3RyaW5nLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLVRvU3RyaW5nLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1GbG9vciIgbmFtZT0iRmxvb3IiIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLUZsb29yLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Il9QcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1GbG9vci1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLUZsb29yLVJvdW5kIiBuYW1lPSJSb3VuZCIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtUm91bmQteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtUm91bmQtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1JbnYiIG5hbWU9IkludiIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtSW52LXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLUludi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1SZWFsRnVuY3Rpb25zLVRvUmVhbCIgbmFtZT0iVG9SZWFsIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1Ub1JlYWwteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtUmVhbEZ1bmN0aW9ucy1Ub1JlYWwtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVJlYWxGdW5jdGlvbnMtVG9SZWFsLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMiIG5hbWU9IlVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMiPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMtVG9VbmxpbWl0ZWROYXR1cmFsIiBuYW1lPSJUb1VubGltaXRlZE5hdHVyYWwiIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLVRvVW5saW1pdGVkTmF0dXJhbC14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLVRvVW5saW1pdGVkTmF0dXJhbC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1Ub1VubGltaXRlZE5hdHVyYWwtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLWx0IiBuYW1lPSImbHQ7IiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1sdC14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1sdC15IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1sdC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLU1heCIgbmFtZT0iTWF4IiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1NYXgteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMtTWF4LXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLU1heC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLU1pbiIgbmFtZT0iTWluIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1NaW4teCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMtTWluLXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLU1pbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLWd0IiBuYW1lPSI+IiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1ndC14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1ndC15IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1ndC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLWxlIiBuYW1lPSImbHQ7PSIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMtbGUteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMtbGUteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMtbGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1nZSIgbmFtZT0iPj0iIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLWdlLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLWdlLXkiIG5hbWU9InkiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLWdlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMtVG9TdHJpbmciIG5hbWU9IlRvU3RyaW5nIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1Ub1N0cmluZy14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1Ub1N0cmluZy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMtVG9JbnRlZ2VyIiBuYW1lPSJUb0ludGVnZXIiIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1VbmxpbWl0ZWROYXR1cmFsRnVuY3Rpb25zLVRvSW50ZWdlci14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtVW5saW1pdGVkTmF0dXJhbEZ1bmN0aW9ucy1Ub0ludGVnZXItcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVVubGltaXRlZE5hdHVyYWxGdW5jdGlvbnMtVG9JbnRlZ2VyLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMiIG5hbWU9IkJvb2xlYW5GdW5jdGlvbnMiPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMtVG9Cb29sZWFuIiBuYW1lPSJUb0Jvb2xlYW4iIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1Cb29sZWFuRnVuY3Rpb25zLVRvQm9vbGVhbi14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1Cb29sZWFuRnVuY3Rpb25zLVRvQm9vbGVhbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtQm9vbGVhbkZ1bmN0aW9ucy1Ub0Jvb2xlYW4tcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1Cb29sZWFuRnVuY3Rpb25zLVRvU3RyaW5nIiBuYW1lPSJUb1N0cmluZyIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMtVG9TdHJpbmcteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMtVG9TdHJpbmctcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1Cb29sZWFuRnVuY3Rpb25zLU9yIiBuYW1lPSJPciIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMtT3IteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMtT3IteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMtT3ItcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtQm9vbGVhbkZ1bmN0aW9ucy1Yb3IiIG5hbWU9IlhvciIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMtWG9yLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1Cb29sZWFuRnVuY3Rpb25zLVhvci15IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtQm9vbGVhbkZ1bmN0aW9ucy1Yb3ItcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtQm9vbGVhbkZ1bmN0aW9ucy1BbmQiIG5hbWU9IkFuZCIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMtQW5kLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1Cb29sZWFuRnVuY3Rpb25zLUFuZC15IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtQm9vbGVhbkZ1bmN0aW9ucy1BbmQtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtQm9vbGVhbkZ1bmN0aW9ucy1JbXBsaWVzIiBuYW1lPSJJbXBsaWVzIiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtQm9vbGVhbkZ1bmN0aW9ucy1JbXBsaWVzLXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1Cb29sZWFuRnVuY3Rpb25zLUltcGxpZXMteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMtSW1wbGllcy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1Cb29sZWFuRnVuY3Rpb25zLU5vdCIgbmFtZT0iTm90IiBpc0Fic3RyYWN0PSJ0cnVlIiBpc1JlZW50cmFudD0iZmFsc2UiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtQm9vbGVhbkZ1bmN0aW9ucy1Ob3QteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUJvb2xlYW5GdW5jdGlvbnMtTm90LXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1TdHJpbmdGdW5jdGlvbnMiIG5hbWU9IlN0cmluZ0Z1bmN0aW9ucyI+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtU3RyaW5nRnVuY3Rpb25zLVNpemUiIG5hbWU9IlNpemUiIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1TdHJpbmdGdW5jdGlvbnMtU2l6ZS14IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1TdHJpbmdGdW5jdGlvbnMtU2l6ZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1TdHJpbmdGdW5jdGlvbnMtQ29uY2F0IiBuYW1lPSJDb25jYXQiIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1TdHJpbmdGdW5jdGlvbnMtQ29uY2F0LXgiIG5hbWU9IngiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVN0cmluZ0Z1bmN0aW9ucy1Db25jYXQteSIgbmFtZT0ieSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtU3RyaW5nRnVuY3Rpb25zLUNvbmNhdC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkZ1bmN0aW9uQmVoYXZpb3IiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVN0cmluZ0Z1bmN0aW9ucy1TdWJzdHJpbmciIG5hbWU9IlN1YnN0cmluZyIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVN0cmluZ0Z1bmN0aW9ucy1TdWJzdHJpbmcteCIgbmFtZT0ieCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtU3RyaW5nRnVuY3Rpb25zLVN1YnN0cmluZy1sb3dlciIgbmFtZT0ibG93ZXIiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1TdHJpbmdGdW5jdGlvbnMtU3Vic3RyaW5nLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLVN0cmluZ0Z1bmN0aW9ucy1TdWJzdHJpbmctcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1TdHJpbmdGdW5jdGlvbnMtU3Vic3RyaW5nLXVwcGVyIiBuYW1lPSJ1cHBlciI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1MaXN0RnVuY3Rpb25zIiBuYW1lPSJMaXN0RnVuY3Rpb25zIj4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1MaXN0RnVuY3Rpb25zLUxpc3RTaXplIiBuYW1lPSJMaXN0U2l6ZSIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNSZWVudHJhbnQ9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUxpc3RGdW5jdGlvbnMtTGlzdFNpemUtbGlzdCIgbmFtZT0ibGlzdCI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0U2l6ZS1saXN0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0U2l6ZS1saXN0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0U2l6ZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1MaXN0RnVuY3Rpb25zLUxpc3RHZXQiIG5hbWU9Ikxpc3RHZXQiIGlzQWJzdHJhY3Q9InRydWUiIGlzUmVlbnRyYW50PSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1MaXN0RnVuY3Rpb25zLUxpc3RHZXQtbGlzdCIgbmFtZT0ibGlzdCI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0R2V0LWxpc3QtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1MaXN0RnVuY3Rpb25zLUxpc3RHZXQtbGlzdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUxpc3RGdW5jdGlvbnMtTGlzdEdldC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUxpc3RGdW5jdGlvbnMtTGlzdEdldC1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUxpc3RGdW5jdGlvbnMtTGlzdEdldC1pbmRleCIgbmFtZT0iaW5kZXgiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiB4bWk6aWQ9IlByaW1pdGl2ZUJlaGF2aW9ycy1MaXN0RnVuY3Rpb25zLUxpc3RDb25jYXQiIG5hbWU9Ikxpc3RDb25jYXQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0Q29uY2F0LWxpc3QxIiBuYW1lPSJsaXN0MSI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0Q29uY2F0LWxpc3QxLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0Q29uY2F0LWxpc3QxLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0Q29uY2F0LWxpc3QyIiBuYW1lPSJsaXN0MiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0Q29uY2F0LWxpc3QyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0Q29uY2F0LWxpc3QyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0Q29uY2F0LXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcmltaXRpdmVCZWhhdmlvcnMtTGlzdEZ1bmN0aW9ucy1MaXN0Q29uY2F0LXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUHJpbWl0aXZlQmVoYXZpb3JzLUxpc3RGdW5jdGlvbnMtTGlzdENvbmNhdC1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQiIG5hbWU9IkJhc2ljSW5wdXRPdXRwdXQiPgotICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1fcGFja2FnZUltcG9ydC4wIiBpbXBvcnRlZFBhY2thZ2U9IkNvbW1vbiIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUNoYW5uZWwiIG5hbWU9IkNoYW5uZWwiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1DaGFubmVsLWdldE5hbWUiIG5hbWU9ImdldE5hbWUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUNoYW5uZWwtZ2V0TmFtZS1SZXR1cm5SZXN1bHQiIG5hbWU9IlJldHVyblJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUNoYW5uZWwtb3BlbiIgbmFtZT0ib3BlbiIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtQ2hhbm5lbC1vcGVuLWVycm9yU3RhdHVzIiBuYW1lPSJlcnJvclN0YXR1cyIgdHlwZT0iQ29tbW9uLVN0YXR1cyIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1DaGFubmVsLW9wZW4tZXJyb3JTdGF0dXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUNoYW5uZWwtY2xvc2UiIG5hbWU9ImNsb3NlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1DaGFubmVsLWNsb3NlLWVycm9yU3RhdHVzIiBuYW1lPSJlcnJvclN0YXR1cyIgdHlwZT0iQ29tbW9uLVN0YXR1cyIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1DaGFubmVsLWNsb3NlLWVycm9yU3RhdHVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1DaGFubmVsLWlzT3BlbiIgbmFtZT0iaXNPcGVuIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1DaGFubmVsLWlzT3Blbi1SZXR1cm5SZXN1bHQiIG5hbWU9IlJldHVyblJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1DaGFubmVsLWdldFN0YXR1cyIgbmFtZT0iZ2V0U3RhdHVzIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1DaGFubmVsLWdldFN0YXR1cy1SZXR1cm5SZXN1bHQiIG5hbWU9IlJldHVyblJlc3VsdCIgdHlwZT0iQ29tbW9uLVN0YXR1cyIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtSW5wdXRDaGFubmVsIiBuYW1lPSJJbnB1dENoYW5uZWwiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1JbnB1dENoYW5uZWwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkJhc2ljSW5wdXRPdXRwdXQtQ2hhbm5lbCIvPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1JbnB1dENoYW5uZWwtaGFzTW9yZSIgbmFtZT0iaGFzTW9yZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtSW5wdXRDaGFubmVsLWhhc01vcmUtUmV0dXJuUmVzdWx0IiBuYW1lPSJSZXR1cm5SZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtSW5wdXRDaGFubmVsLXJlYWQiIG5hbWU9InJlYWQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUlucHV0Q2hhbm5lbC1yZWFkLXZhbHVlIiBuYW1lPSJ2YWx1ZSIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1JbnB1dENoYW5uZWwtcmVhZC12YWx1ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUlucHV0Q2hhbm5lbC1yZWFkLWVycm9yU3RhdHVzIiBuYW1lPSJlcnJvclN0YXR1cyIgdHlwZT0iQ29tbW9uLVN0YXR1cyIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1JbnB1dENoYW5uZWwtcmVhZC1lcnJvclN0YXR1cy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtSW5wdXRDaGFubmVsLXBlZWsiIG5hbWU9InBlZWsiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUlucHV0Q2hhbm5lbC1wZWVrLXZhbHVlIiBuYW1lPSJ2YWx1ZSIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1JbnB1dENoYW5uZWwtcGVlay12YWx1ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUlucHV0Q2hhbm5lbC1wZWVrLWVycm9yU3RhdHVzIiBuYW1lPSJlcnJvclN0YXR1cyIgdHlwZT0iQ29tbW9uLVN0YXR1cyIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1JbnB1dENoYW5uZWwtcGVlay1lcnJvclN0YXR1cy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1PdXRwdXRDaGFubmVsIiBuYW1lPSJPdXRwdXRDaGFubmVsIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtT3V0cHV0Q2hhbm5lbC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQmFzaWNJbnB1dE91dHB1dC1DaGFubmVsIi8+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LU91dHB1dENoYW5uZWwtd3JpdGUiIG5hbWU9IndyaXRlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1PdXRwdXRDaGFubmVsLXdyaXRlLXZhbHVlIiBuYW1lPSJ2YWx1ZSIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LU91dHB1dENoYW5uZWwtd3JpdGUtZXJyb3JTdGF0dXMiIG5hbWU9ImVycm9yU3RhdHVzIiB0eXBlPSJDb21tb24tU3RhdHVzIiBkaXJlY3Rpb249Im91dCI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LU91dHB1dENoYW5uZWwtd3JpdGUtZXJyb3JTdGF0dXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LU91dHB1dENoYW5uZWwtaXNGdWxsIiBuYW1lPSJpc0Z1bGwiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LU91dHB1dENoYW5uZWwtaXNGdWxsLVJldHVyblJlc3VsdCIgbmFtZT0iUmV0dXJuUmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbCIgbmFtZT0iVGV4dElucHV0Q2hhbm5lbCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkJhc2ljSW5wdXRPdXRwdXQtSW5wdXRDaGFubmVsIi8+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcmVhZENoYXJhY3RlciIgbmFtZT0icmVhZENoYXJhY3RlciI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbC1yZWFkQ2hhcmFjdGVyLVJldHVyblJlc3VsdCIgbmFtZT0iUmV0dXJuUmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0SW5wdXRDaGFubmVsLXJlYWRDaGFyYWN0ZXItUmV0dXJuUmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbC1yZWFkQ2hhcmFjdGVyLWVycm9yU3RhdHVzIiBuYW1lPSJlcnJvclN0YXR1cyIgdHlwZT0iQ29tbW9uLVN0YXR1cyIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0SW5wdXRDaGFubmVsLXJlYWRDaGFyYWN0ZXItZXJyb3JTdGF0dXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcGVla0NoYXJhY3RlciIgbmFtZT0icGVla0NoYXJhY3RlciI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbC1wZWVrQ2hhcmFjdGVyLU93bmVkUGFyYW1ldGVyIiBuYW1lPSJPd25lZFBhcmFtZXRlciIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbC1wZWVrQ2hhcmFjdGVyLU93bmVkUGFyYW1ldGVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbC1wZWVrQ2hhcmFjdGVyLWVycm9yU3RhdHVzIiBuYW1lPSJlcnJvclN0YXR1cyIgdHlwZT0iQ29tbW9uLVN0YXR1cyIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0SW5wdXRDaGFubmVsLXBlZWtDaGFyYWN0ZXItZXJyb3JTdGF0dXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcmVhZExpbmUiIG5hbWU9InJlYWRMaW5lIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0SW5wdXRDaGFubmVsLXJlYWRMaW5lLVJldHVyblJlc3VsdCIgbmFtZT0iUmV0dXJuUmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcmVhZExpbmUtZXJyb3JTdGF0dXMiIG5hbWU9ImVycm9yU3RhdHVzIiB0eXBlPSJDb21tb24tU3RhdHVzIiBkaXJlY3Rpb249Im91dCI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcmVhZExpbmUtZXJyb3JTdGF0dXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcmVhZEludGVnZXIiIG5hbWU9InJlYWRJbnRlZ2VyIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0SW5wdXRDaGFubmVsLXJlYWRJbnRlZ2VyLVJldHVyblJlc3VsdCIgbmFtZT0iUmV0dXJuUmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbC1yZWFkSW50ZWdlci1SZXR1cm5SZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0SW5wdXRDaGFubmVsLXJlYWRJbnRlZ2VyLWVycm9yU3RhdHVzIiBuYW1lPSJlcnJvclN0YXR1cyIgdHlwZT0iQ29tbW9uLVN0YXR1cyIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0SW5wdXRDaGFubmVsLXJlYWRJbnRlZ2VyLWVycm9yU3RhdHVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0SW5wdXRDaGFubmVsLXJlYWRCb29sZWFuIiBuYW1lPSJyZWFkQm9vbGVhbiI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbC1yZWFkQm9vbGVhbi1SZXR1cm5SZXN1bHQiIG5hbWU9IlJldHVyblJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcmVhZEJvb2xlYW4tUmV0dXJuUmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbC1yZWFkQm9vbGVhbi1lcnJvclN0YXR1cyIgbmFtZT0iZXJyb3JTdGF0dXMiIHR5cGU9IkNvbW1vbi1TdGF0dXMiIGRpcmVjdGlvbj0ib3V0Ij4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbC1yZWFkQm9vbGVhbi1lcnJvclN0YXR1cy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dElucHV0Q2hhbm5lbC1yZWFkVW5saW1pdGVkTmF0dXJhbCIgbmFtZT0icmVhZFVubGltaXRlZE5hdHVyYWwiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcmVhZFVubGltaXRlZE5hdHVyYWwtUmV0dXJuUmVzdWx0IiBuYW1lPSJSZXR1cm5SZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0SW5wdXRDaGFubmVsLXJlYWRVbmxpbWl0ZWROYXR1cmFsLVJldHVyblJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcmVhZFVubGltaXRlZE5hdHVyYWwtZXJyb3JTdGF0dXMiIG5hbWU9ImVycm9yU3RhdHVzIiB0eXBlPSJDb21tb24tU3RhdHVzIiBkaXJlY3Rpb249Im91dCI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcmVhZFVubGltaXRlZE5hdHVyYWwtZXJyb3JTdGF0dXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dE91dHB1dENoYW5uZWwiIG5hbWU9IlRleHRPdXRwdXRDaGFubmVsIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dE91dHB1dENoYW5uZWwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkJhc2ljSW5wdXRPdXRwdXQtT3V0cHV0Q2hhbm5lbCIvPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0T3V0cHV0Q2hhbm5lbC13cml0ZVN0cmluZyIgbmFtZT0id3JpdGVTdHJpbmciPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRPdXRwdXRDaGFubmVsLXdyaXRlU3RyaW5nLXZhbHVlIiBuYW1lPSJ2YWx1ZSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRPdXRwdXRDaGFubmVsLXdyaXRlU3RyaW5nLWVycm9yU3RhdHVzIiBuYW1lPSJlcnJvclN0YXR1cyIgdHlwZT0iQ29tbW9uLVN0YXR1cyIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0T3V0cHV0Q2hhbm5lbC13cml0ZVN0cmluZy1lcnJvclN0YXR1cy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dE91dHB1dENoYW5uZWwtd3JpdGVOZXdMaW5lIiBuYW1lPSJ3cml0ZU5ld0xpbmUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRPdXRwdXRDaGFubmVsLXdyaXRlTmV3TGluZS1lcnJvclN0YXR1cyIgbmFtZT0iZXJyb3JTdGF0dXMiIHR5cGU9IkNvbW1vbi1TdGF0dXMiIGRpcmVjdGlvbj0ib3V0Ij4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dE91dHB1dENoYW5uZWwtd3JpdGVOZXdMaW5lLWVycm9yU3RhdHVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0T3V0cHV0Q2hhbm5lbC13cml0ZUxpbmUiIG5hbWU9IndyaXRlTGluZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dE91dHB1dENoYW5uZWwtd3JpdGVMaW5lLXZhbHVlIiBuYW1lPSJ2YWx1ZSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRPdXRwdXRDaGFubmVsLXdyaXRlTGluZS1lcnJvclN0YXR1cyIgbmFtZT0iZXJyb3JTdGF0dXMiIHR5cGU9IkNvbW1vbi1TdGF0dXMiIGRpcmVjdGlvbj0ib3V0Ij4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dE91dHB1dENoYW5uZWwtd3JpdGVMaW5lLWVycm9yU3RhdHVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0T3V0cHV0Q2hhbm5lbC13cml0ZUludGVnZXIiIG5hbWU9IndyaXRlSW50ZWdlciI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dE91dHB1dENoYW5uZWwtd3JpdGVJbnRlZ2VyLXZhbHVlIiBuYW1lPSJ2YWx1ZSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0T3V0cHV0Q2hhbm5lbC13cml0ZUludGVnZXItZXJyb3JTdGF0dXMiIG5hbWU9ImVycm9yU3RhdHVzIiB0eXBlPSJDb21tb24tU3RhdHVzIiBkaXJlY3Rpb249Im91dCI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRPdXRwdXRDaGFubmVsLXdyaXRlSW50ZWdlci1lcnJvclN0YXR1cy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dE91dHB1dENoYW5uZWwtd3JpdGVCb29sZWFuIiBuYW1lPSJ3cml0ZUJvb2xlYW4iPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRPdXRwdXRDaGFubmVsLXdyaXRlQm9vbGVhbi12YWx1ZSIgbmFtZT0idmFsdWUiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dE91dHB1dENoYW5uZWwtd3JpdGVCb29sZWFuLWVycm9yU3RhdHVzIiBuYW1lPSJlcnJvclN0YXR1cyIgdHlwZT0iQ29tbW9uLVN0YXR1cyIgZGlyZWN0aW9uPSJvdXQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0T3V0cHV0Q2hhbm5lbC13cml0ZUJvb2xlYW4tZXJyb3JTdGF0dXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRPdXRwdXRDaGFubmVsLXdyaXRlVW5saW1pdGVkTmF0dXJhbCIgbmFtZT0id3JpdGVVbmxpbWl0ZWROYXR1cmFsIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0T3V0cHV0Q2hhbm5lbC13cml0ZVVubGltaXRlZE5hdHVyYWwtdmFsdWUiIG5hbWU9InZhbHVlIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVRleHRPdXRwdXRDaGFubmVsLXdyaXRlVW5saW1pdGVkTmF0dXJhbC1lcnJvclN0YXR1cyIgbmFtZT0iZXJyb3JTdGF0dXMiIHR5cGU9IkNvbW1vbi1TdGF0dXMiIGRpcmVjdGlvbj0ib3V0Ij4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtVGV4dE91dHB1dENoYW5uZWwtd3JpdGVVbmxpbWl0ZWROYXR1cmFsLWVycm9yU3RhdHVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVN0YW5kYXJkSW5wdXRDaGFubmVsIiBuYW1lPSJTdGFuZGFyZElucHV0Q2hhbm5lbCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVN0YW5kYXJkSW5wdXRDaGFubmVsLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1TdGFuZGFyZE91dHB1dENoYW5uZWwiIG5hbWU9IlN0YW5kYXJkT3V0cHV0Q2hhbm5lbCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVN0YW5kYXJkT3V0cHV0Q2hhbm5lbC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQmFzaWNJbnB1dE91dHB1dC1UZXh0T3V0cHV0Q2hhbm5lbCIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZSIgbmFtZT0iV3JpdGVMaW5lIiBpc1JlZW50cmFudD0iZmFsc2UiIG5vZGU9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLVN0YW5kYXJkT3V0cHV0Q2hhbm5lbCBCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS13cml0ZUxpbmUgQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtdmFsdWUuMSBCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1lcnJvclN0YXR1cy4xIj4KLSAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLXZhbHVlIiBuYW1lPSJ2YWx1ZSI+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1lcnJvclN0YXR1cyIgbmFtZT0iZXJyb3JTdGF0dXMiIGRpcmVjdGlvbj0ib3V0Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1lcnJvclN0YXR1cy1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1fZWRnZS4wIiB0YXJnZXQ9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLXdyaXRlTGluZS1fdGFyZ2V0IiBzb3VyY2U9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLVN0YW5kYXJkT3V0cHV0Q2hhbm5lbC1fcmVzdWx0Ij4KLSAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1fZWRnZS4wLV9ndWFyZCI+Ci0gICAgICAgICAgPGJvZHk+PC9ib2R5PgotICAgICAgICA8L2d1YXJkPgotICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtX2VkZ2UuMC1fd2VpZ2h0IiB2YWx1ZT0iMSIvPgotICAgICAgPC9lZGdlPgotICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLV9lZGdlLjEiIHRhcmdldD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtd3JpdGVMaW5lLXZhbHVlIiBzb3VyY2U9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLXZhbHVlLjEiPgotICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLV9lZGdlLjEtX2d1YXJkIj4KLSAgICAgICAgICA8Ym9keT48L2JvZHk+Ci0gICAgICAgIDwvZ3VhcmQ+Ci0gICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1fZWRnZS4xLV93ZWlnaHQiIHZhbHVlPSIxIi8+Ci0gICAgICA8L2VkZ2U+Ci0gICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtX2VkZ2UuMiIgdGFyZ2V0PSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1lcnJvclN0YXR1cy4xIiBzb3VyY2U9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLXdyaXRlTGluZS1lcnJvclN0YXR1cyI+Ci0gICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtX2VkZ2UuMi1fZ3VhcmQiPgotICAgICAgICAgIDxib2R5PjwvYm9keT4KLSAgICAgICAgPC9ndWFyZD4KLSAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLV9lZGdlLjItX3dlaWdodCIgdmFsdWU9IjEiLz4KLSAgICAgIDwvZWRnZT4KLSAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZEV4dGVudEFjdGlvbiIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1TdGFuZGFyZE91dHB1dENoYW5uZWwiIG5hbWU9IlN0YW5kYXJkT3V0cHV0Q2hhbm5lbCIgY2xhc3NpZmllcj0iQmFzaWNJbnB1dE91dHB1dC1TdGFuZGFyZE91dHB1dENoYW5uZWwiPgotICAgICAgICA8cmVzdWx0IHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtU3RhbmRhcmRPdXRwdXRDaGFubmVsLV9yZXN1bHQiIG91dGdvaW5nPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1fZWRnZS4wIiB0eXBlPSJCYXNpY0lucHV0T3V0cHV0LVN0YW5kYXJkT3V0cHV0Q2hhbm5lbCI+Ci0gICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1TdGFuZGFyZE91dHB1dENoYW5uZWwtX3Jlc3VsdC1fdXBwZXJCb3VuZCIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLVN0YW5kYXJkT3V0cHV0Q2hhbm5lbC1fcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1TdGFuZGFyZE91dHB1dENoYW5uZWwtX3Jlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICA8L25vZGU+Ci0gICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkNhbGxPcGVyYXRpb25BY3Rpb24iIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtd3JpdGVMaW5lIiBuYW1lPSJ3cml0ZUxpbmUiIG9wZXJhdGlvbj0iQmFzaWNJbnB1dE91dHB1dC1UZXh0T3V0cHV0Q2hhbm5lbC13cml0ZUxpbmUiPgotICAgICAgICA8YXJndW1lbnQgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS13cml0ZUxpbmUtdmFsdWUiIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtX2VkZ2UuMSI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtd3JpdGVMaW5lLXZhbHVlLV91cHBlckJvdW5kIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L2FyZ3VtZW50PgotICAgICAgICA8cmVzdWx0IHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtd3JpdGVMaW5lLWVycm9yU3RhdHVzIiBuYW1lPSJlcnJvclN0YXR1cyIgb3V0Z29pbmc9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLV9lZGdlLjIiIHR5cGU9IkNvbW1vbi1TdGF0dXMiPgotICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtd3JpdGVMaW5lLWVycm9yU3RhdHVzLV91cHBlckJvdW5kIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtd3JpdGVMaW5lLWVycm9yU3RhdHVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvcmVzdWx0PgotICAgICAgICA8dGFyZ2V0IHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtd3JpdGVMaW5lLV90YXJnZXQiIGluY29taW5nPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1fZWRnZS4wIiB0eXBlPSJCYXNpY0lucHV0T3V0cHV0LVRleHRPdXRwdXRDaGFubmVsIj4KLSAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLXdyaXRlTGluZS1fdGFyZ2V0LV91cHBlckJvdW5kIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L3RhcmdldD4KLSAgICAgIDwvbm9kZT4KLSAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLXZhbHVlLjEiIG5hbWU9InZhbHVlIiBvdXRnb2luZz0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtX2VkZ2UuMSIgcGFyYW1ldGVyPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS12YWx1ZSI+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS12YWx1ZS4xLV91cHBlckJvdW5kIiB2YWx1ZT0iMSIvPgotICAgICAgPC9ub2RlPgotICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY3Rpdml0eVBhcmFtZXRlck5vZGUiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1Xcml0ZUxpbmUtZXJyb3JTdGF0dXMuMSIgbmFtZT0iZXJyb3JTdGF0dXMiIGluY29taW5nPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1fZWRnZS4yIiB0eXBlPSJDb21tb24tU3RhdHVzIiBwYXJhbWV0ZXI9IkJhc2ljSW5wdXRPdXRwdXQtV3JpdGVMaW5lLWVycm9yU3RhdHVzIj4KLSAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVdyaXRlTGluZS1lcnJvclN0YXR1cy4xLV91cHBlckJvdW5kIiB2YWx1ZT0iMSIvPgotICAgICAgPC9ub2RlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUFjdGl2ZUNoYW5uZWwiIG5hbWU9IkFjdGl2ZUNoYW5uZWwiIGlzQWJzdHJhY3Q9InRydWUiIGlzQWN0aXZlPSJ0cnVlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtQWN0aXZlQ2hhbm5lbC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQmFzaWNJbnB1dE91dHB1dC1DaGFubmVsIi8+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUFjdGl2ZUNoYW5uZWwtcmVnaXN0ZXIiIG5hbWU9InJlZ2lzdGVyIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1BY3RpdmVDaGFubmVsLXJlZ2lzdGVyLWxpc3RlbmVyIiBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iQ29tbW9uLUxpc3RlbmVyIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1BY3RpdmVDaGFubmVsLXVucmVnaXN0ZXIiIG5hbWU9InVucmVnaXN0ZXIiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LUFjdGl2ZUNoYW5uZWwtdW5yZWdpc3Rlci1saXN0ZW5lciIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9IkNvbW1vbi1MaXN0ZW5lciIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZSIgbmFtZT0iUmVhZExpbmUiIGlzUmVlbnRyYW50PSJmYWxzZSIgbm9kZT0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1TdGFuZGFyZElucHV0Q2hhbm5lbCBCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLXJlYWRMaW5lIEJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtZXJyb3JTdGF0dXMuMSBCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLXJlc3VsdC4xIj4KLSAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtZXJyb3JTdGF0dXMiIG5hbWU9ImVycm9yU3RhdHVzIiB0eXBlPSJDb21tb24tU3RhdHVzIiBkaXJlY3Rpb249Im91dCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1lcnJvclN0YXR1cy1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLV9lZGdlLjAiIHRhcmdldD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1yZWFkTGluZS1fdGFyZ2V0IiBzb3VyY2U9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtU3RhbmRhcmRJbnB1dENoYW5uZWwtX3Jlc3VsdCI+Ci0gICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1fZWRnZS4wLV9ndWFyZCI+Ci0gICAgICAgICAgPGJvZHk+PC9ib2R5PgotICAgICAgICA8L2d1YXJkPgotICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1fZWRnZS4wLV93ZWlnaHQiIHZhbHVlPSIxIi8+Ci0gICAgICA8L2VkZ2U+Ci0gICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1fZWRnZS4xIiB0YXJnZXQ9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtZXJyb3JTdGF0dXMuMSIgc291cmNlPSJCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLXJlYWRMaW5lLWVycm9yU3RhdHVzIj4KLSAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLV9lZGdlLjEtX2d1YXJkIj4KLSAgICAgICAgICA8Ym9keT48L2JvZHk+Ci0gICAgICAgIDwvZ3VhcmQ+Ci0gICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLV9lZGdlLjEtX3dlaWdodCIgdmFsdWU9IjEiLz4KLSAgICAgIDwvZWRnZT4KLSAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLV9lZGdlLjIiIHRhcmdldD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1yZXN1bHQuMSIgc291cmNlPSJCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLXJlYWRMaW5lLV9yZXN1bHQuMCI+Ci0gICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1fZWRnZS4yLV9ndWFyZCI+Ci0gICAgICAgICAgPGJvZHk+PC9ib2R5PgotICAgICAgICA8L2d1YXJkPgotICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1fZWRnZS4yLV93ZWlnaHQiIHZhbHVlPSIxIi8+Ci0gICAgICA8L2VkZ2U+Ci0gICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlJlYWRFeHRlbnRBY3Rpb24iIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1TdGFuZGFyZElucHV0Q2hhbm5lbCIgbmFtZT0iU3RhbmRhcmRJbnB1dENoYW5uZWwiIGNsYXNzaWZpZXI9IkJhc2ljSW5wdXRPdXRwdXQtU3RhbmRhcmRJbnB1dENoYW5uZWwiPgotICAgICAgICA8cmVzdWx0IHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1TdGFuZGFyZElucHV0Q2hhbm5lbC1fcmVzdWx0IiBvdXRnb2luZz0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1fZWRnZS4wIiB0eXBlPSJCYXNpY0lucHV0T3V0cHV0LVN0YW5kYXJkSW5wdXRDaGFubmVsIj4KLSAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtU3RhbmRhcmRJbnB1dENoYW5uZWwtX3Jlc3VsdC1fdXBwZXJCb3VuZCIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtU3RhbmRhcmRJbnB1dENoYW5uZWwtX3Jlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1TdGFuZGFyZElucHV0Q2hhbm5lbC1fcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L3Jlc3VsdD4KLSAgICAgIDwvbm9kZT4KLSAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6Q2FsbE9wZXJhdGlvbkFjdGlvbiIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLXJlYWRMaW5lIiBuYW1lPSJyZWFkTGluZSIgb3BlcmF0aW9uPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwtcmVhZExpbmUiPgotICAgICAgICA8cmVzdWx0IHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1yZWFkTGluZS1fcmVzdWx0LjAiIG91dGdvaW5nPSJCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLV9lZGdlLjIiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtcmVhZExpbmUtX3Jlc3VsdC4wLV91cHBlckJvdW5kIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L3Jlc3VsdD4KLSAgICAgICAgPHJlc3VsdCB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtcmVhZExpbmUtZXJyb3JTdGF0dXMiIG5hbWU9ImVycm9yU3RhdHVzIiBvdXRnb2luZz0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1fZWRnZS4xIiB0eXBlPSJDb21tb24tU3RhdHVzIj4KLSAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtcmVhZExpbmUtZXJyb3JTdGF0dXMtX3VwcGVyQm91bmQiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLXJlYWRMaW5lLWVycm9yU3RhdHVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvcmVzdWx0PgotICAgICAgICA8dGFyZ2V0IHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1yZWFkTGluZS1fdGFyZ2V0IiBpbmNvbWluZz0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1fZWRnZS4wIiB0eXBlPSJCYXNpY0lucHV0T3V0cHV0LVRleHRJbnB1dENoYW5uZWwiPgotICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1yZWFkTGluZS1fdGFyZ2V0LV91cHBlckJvdW5kIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L3RhcmdldD4KLSAgICAgIDwvbm9kZT4KLSAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtZXJyb3JTdGF0dXMuMSIgbmFtZT0iZXJyb3JTdGF0dXMiIGluY29taW5nPSJCYXNpY0lucHV0T3V0cHV0LVJlYWRMaW5lLV9lZGdlLjEiIHR5cGU9IkNvbW1vbi1TdGF0dXMiIHBhcmFtZXRlcj0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1lcnJvclN0YXR1cyI+Ci0gICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1lcnJvclN0YXR1cy4xLV91cHBlckJvdW5kIiB2YWx1ZT0iMSIvPgotICAgICAgPC9ub2RlPgotICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY3Rpdml0eVBhcmFtZXRlck5vZGUiIHhtaTppZD0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1yZXN1bHQuMSIgbmFtZT0icmVzdWx0IiBpbmNvbWluZz0iQmFzaWNJbnB1dE91dHB1dC1SZWFkTGluZS1fZWRnZS4yIiBwYXJhbWV0ZXI9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtcmVzdWx0Ij4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJhc2ljSW5wdXRPdXRwdXQtUmVhZExpbmUtcmVzdWx0LjEtX3VwcGVyQm91bmQiIHZhbHVlPSIxIi8+Ci0gICAgICA8L25vZGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJDb21tb24iIG5hbWU9IkNvbW1vbiI+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlNpZ25hbCIgeG1pOmlkPSJDb21tb24tTm90aWZpY2F0aW9uIiBuYW1lPSJOb3RpZmljYXRpb24iPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29tbW9uLU5vdGlmaWNhdGlvbi1jb250ZW50IiBuYW1lPSJjb250ZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbW1vbi1Ob3RpZmljYXRpb24tY29udGVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ29tbW9uLUxpc3RlbmVyIiBuYW1lPSJMaXN0ZW5lciIgaXNBYnN0cmFjdD0idHJ1ZSIgaXNBY3RpdmU9InRydWUiPgotICAgICAgPG93bmVkUmVjZXB0aW9uIHhtaTppZD0iQ29tbW9uLUxpc3RlbmVyLV9vd25lZFJlY2VwdGlvbi4wIiBuYW1lPSJOb3RpZmljYXRpb24iIHNpZ25hbD0iQ29tbW9uLU5vdGlmaWNhdGlvbiIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpEYXRhVHlwZSIgeG1pOmlkPSJDb21tb24tU3RhdHVzIiBuYW1lPSJTdGF0dXMiPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29tbW9uLVN0YXR1cy1jb250ZXh0IiBuYW1lPSJjb250ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29tbW9uLVN0YXR1cy1jb2RlIiBuYW1lPSJjb2RlIj4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb21tb24tU3RhdHVzLWRlc2NyaXB0aW9uIiBuYW1lPSJkZXNjcmlwdGlvbiI+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotPC91bWw6TW9kZWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnBhcHlydXMudW1sLmFsZi5saWJyYXJpZXMvcmVzb3VyY2VzL2FjdGlvbi1sYW5ndWFnZS1wcm9maWxlL0FjdGlvbkxhbmd1YWdlLVByb2ZpbGUucHJvZmlsZS51bWwgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnBhcHlydXMudW1sLmFsZi5saWJyYXJpZXMvcmVzb3VyY2VzL2FjdGlvbi1sYW5ndWFnZS1wcm9maWxlL0FjdGlvbkxhbmd1YWdlLVByb2ZpbGUucHJvZmlsZS51bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzJjMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvQzIvcmVzb3VyY2VzL21vZGVsL3BsdWdpbi9vcmcuZWNsaXBzZS5wYXB5cnVzLnVtbC5hbGYubGlicmFyaWVzL3Jlc291cmNlcy9hY3Rpb24tbGFuZ3VhZ2UtcHJvZmlsZS9BY3Rpb25MYW5ndWFnZS1Qcm9maWxlLnByb2ZpbGUudW1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx1bWw6UHJvZmlsZSB4bWk6dmVyc2lvbj0iMjAxMzEwMDEiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL3NwZWMvWE1JLzIwMTMxMDAxIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1MIiB4bWk6aWQ9IkFjdGlvbkxhbmd1YWdlIiBuYW1lPSJBY3Rpb25MYW5ndWFnZSIgVVJJPSJodHRwOi8vd3d3Lm9tZy5vcmcvc3BlYy9BTEYvMjAxMjA4MjcvQWN0aW9uTGFuZ3VhZ2UtUHJvZmlsZSIgbWV0YW1vZGVsUmVmZXJlbmNlPSJBY3Rpb25MYW5ndWFnZS1wYWNrYWdlSW1wb3J0Ij4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9zWXNlMElaTEVlS3l3NDl1UjZueDNnIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgIDxjb250ZW50cyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIHhtaTppZD0iX0t2OEVJS0ZYRWVTX0tOWDBuZnZJVlEiIG5hbWU9IkFjdGlvbkxhbmd1YWdlIiBuc1VSST0iaHR0cDovL3d3dy5vbWcub3JnL3NwZWMvQUxGLzIwMTIwODI3L0FjdGlvbkxhbmd1YWdlLVByb2ZpbGUiIG5zUHJlZml4PSJBY3Rpb25MYW5ndWFnZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0t2OTVVcUZYRWVTX0tOWDBuZnZJVlEiIHNvdXJjZT0iUGFweXJ1c1ZlcnNpb24iPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9Ldjk1VTZGWEVlU19LTlgwbmZ2SVZRIiBrZXk9IlZlcnNpb24iIHZhbHVlPSIwLjEuMSIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9Ldjk1VktGWEVlU19LTlgwbmZ2SVZRIiBrZXk9IkNvbW1lbnQiIHZhbHVlPSIiLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfS3Y5NVZhRlhFZVNfS05YMG5mdklWUSIga2V5PSJDb3B5cmlnaHQiIHZhbHVlPSIiLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfS3Y5NVZxRlhFZVNfS05YMG5mdklWUSIga2V5PSJEYXRlIiB2YWx1ZT0iMjAxNS0wMS0yMSIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9Ldjk1VjZGWEVlU19LTlgwbmZ2SVZRIiBrZXk9IkF1dGhvciIgdmFsdWU9IiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iX0t2OEVJYUZYRWVTX0tOWDBuZnZJVlEiIG5hbWU9IlRleHR1YWxSZXByZXNlbnRhdGlvbiI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfS3Y4RUlxRlhFZVNfS05YMG5mdklWUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIiByZWZlcmVuY2VzPSJBY3Rpb25MYW5ndWFnZS1UZXh0dWFsUmVwcmVzZW50YXRpb24iLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIHhtaTppZD0iX0t2OEVJNkZYRWVTX0tOWDBuZnZJVlEiIG5hbWU9ImJhc2VfQ29tbWVudCIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1MIy8vQ29tbWVudCIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il9LdjhFSmFGWEVlU19LTlgwbmZ2SVZRIiBuYW1lPSJsYW5ndWFnZSIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVHlwZXMjLy9TdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iX0t2OEVKNkZYRWVTX0tOWDBuZnZJVlEiIG5hbWU9IkJhY2t1cCI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfS3Y4RUtLRlhFZVNfS05YMG5mdklWUSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIi8+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiB4bWk6aWQ9Il9LdjhFS2FGWEVlU19LTlgwbmZ2SVZRIiBuYW1lPSJiYXNlX0NvbW1lbnQiIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIj4KLSAgICAgICAgICA8ZVR5cGUgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTCMvL0NvbW1lbnQiLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgeG1pOmlkPSJfS3Y4RUs2RlhFZVNfS05YMG5mdklWUSIgbmFtZT0idGltZXN0YW1wIiBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSI+Ci0gICAgICAgICAgPGVUeXBlIHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9UeXBlcyMvL1N0cmluZyIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il9LdjhFTGFGWEVlU19LTlgwbmZ2SVZRIiBuYW1lPSJzdGF0ZSIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJfS3Y4RUw2RlhFZVNfS05YMG5mdklWUSIvPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFRW51bSIgeG1pOmlkPSJfS3Y4RUw2RlhFZVNfS05YMG5mdklWUSIgbmFtZT0iQmFja3VwU3RhdGUiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0t2OEVNS0ZYRWVTX0tOWDBuZnZJVlEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCIvPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iX0t2OEVNYUZYRWVTX0tOWDBuZnZJVlEiIG5hbWU9IlNBVkVEIi8+Ci0gICAgICAgIDxlTGl0ZXJhbHMgeG1pOmlkPSJfS3Y4RU1xRlhFZVNfS05YMG5mdklWUSIgbmFtZT0iTUVSR0VEIiB2YWx1ZT0iMSIvPgotICAgICAgICA8ZUxpdGVyYWxzIHhtaTppZD0iX0t2OEVNNkZYRWVTX0tOWDBuZnZJVlEiIG5hbWU9Ik5PTkUiIHZhbHVlPSIyIi8+Ci0gICAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8L2NvbnRlbnRzPgotICAgIDxjb250ZW50cyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIHhtaTppZD0iX3NZc2UwWVpMRWVLeXc0OXVSNm54M2ciIG5hbWU9IkFjdGlvbkxhbmd1YWdlIiBuc1VSST0iaHR0cDovL3d3dy5vbWcub3JnL3NwZWMvQUxGLzIwMTIwODI3L0FjdGlvbkxhbmd1YWdlLVByb2ZpbGUiIG5zUHJlZml4PSJBY3Rpb25MYW5ndWFnZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3NZc2UyWVpMRWVLeXc0OXVSNm54M2ciIHNvdXJjZT0iUGFweXJ1c1ZlcnNpb24iPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9zWXNlMm9aTEVlS3l3NDl1UjZueDNnIiBrZXk9IlZlcnNpb24iIHZhbHVlPSIwLjEuMCIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9zWXNlMjRaTEVlS3l3NDl1UjZueDNnIiBrZXk9IkNvbW1lbnQiIHZhbHVlPSIiLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfc1lzZTNJWkxFZUt5dzQ5dVI2bngzZyIga2V5PSJDb3B5cmlnaHQiIHZhbHVlPSIiLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJfc1lzZTNZWkxFZUt5dzQ5dVI2bngzZyIga2V5PSJEYXRlIiB2YWx1ZT0iMjAxMy0wMy0wNiIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9zWXNlM29aTEVlS3l3NDl1UjZueDNnIiBrZXk9IkF1dGhvciIgdmFsdWU9IiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUNsYXNzaWZpZXJzIHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIHhtaTppZD0iX3NZc2Uwb1pMRWVLeXc0OXVSNm54M2ciIG5hbWU9IlRleHR1YWxSZXByZXNlbnRhdGlvbiI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfc1lzZTA0WkxFZUt5dzQ5dVI2bngzZyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIiByZWZlcmVuY2VzPSJBY3Rpb25MYW5ndWFnZS1UZXh0dWFsUmVwcmVzZW50YXRpb24iLz4KLSAgICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeG1pOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIHhtaTppZD0iX3NZc2UxSVpMRWVLeXc0OXVSNm54M2ciIG5hbWU9ImJhc2VfQ29tbWVudCIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1MIy8vQ29tbWVudCIvPgotICAgICAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiB4bWk6aWQ9Il9zWXNlMW9aTEVlS3l3NDl1UjZueDNnIiBuYW1lPSJsYW5ndWFnZSIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiPgotICAgICAgICAgIDxlVHlwZSB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVHlwZXMjLy9TdHJpbmciLz4KLSAgICAgICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPC9jb250ZW50cz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iQWN0aW9uTGFuZ3VhZ2UtcGFja2FnZUltcG9ydCI+Ci0gICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSIuLi8uLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNfMCIvPgotICA8L3BhY2thZ2VJbXBvcnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9IkFjdGlvbkxhbmd1YWdlLVRleHR1YWxSZXByZXNlbnRhdGlvbiIgbmFtZT0iVGV4dHVhbFJlcHJlc2VudGF0aW9uIj4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpb25MYW5ndWFnZS1UZXh0dWFsUmVwcmVzZW50YXRpb24tYmFzZV9Db21tZW50IiBuYW1lPSJiYXNlX0NvbW1lbnQiIGFzc29jaWF0aW9uPSJBY3Rpb25MYW5ndWFnZS1wYWNrYWdlZEVsZW1lbnQtMiI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi8uLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNDb21tZW50Ii8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpb25MYW5ndWFnZS1UZXh0dWFsUmVwcmVzZW50YXRpb24tbGFuZ3VhZ2UiIG5hbWU9Imxhbmd1YWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkFjdGlvbkxhbmd1YWdlLXBhY2thZ2VkRWxlbWVudC0yIiBtZW1iZXJFbmQ9IkFjdGlvbkxhbmd1YWdlLXBhY2thZ2VkRWxlbWVudC0yLW93bmVkRW5kIEFjdGlvbkxhbmd1YWdlLVRleHR1YWxSZXByZXNlbnRhdGlvbi1iYXNlX0NvbW1lbnQiIG5hdmlnYWJsZU93bmVkRW5kPSJBY3Rpb25MYW5ndWFnZS1wYWNrYWdlZEVsZW1lbnQtMi1vd25lZEVuZCI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkFjdGlvbkxhbmd1YWdlLXBhY2thZ2VkRWxlbWVudC0yLW93bmVkRW5kIiBuYW1lPSJleHRlbnNpb25fVGV4dHVhbFJlcHJlc2VudGF0aW9uIiB0eXBlPSJBY3Rpb25MYW5ndWFnZS1UZXh0dWFsUmVwcmVzZW50YXRpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJBY3Rpb25MYW5ndWFnZS1wYWNrYWdlZEVsZW1lbnQtMiI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGlvbkxhbmd1YWdlLXBhY2thZ2VkRWxlbWVudC0yLW93bmVkRW5kLWxvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLTwvdW1sOlByb2ZpbGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvRWNvcmVQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9FY29yZVByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmE4M2IwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9FY29yZVByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyMDEzMTAwMSIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvc3BlYy9YTUkvMjAxMzEwMDEiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczpzdGFuZGFyZD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTC9Qcm9maWxlL1N0YW5kYXJkIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwiPgotICA8dW1sOk1vZGVsIHhtaTppZD0iXzAiIG5hbWU9IkVjb3JlUHJpbWl0aXZlVHlwZXMiIFVSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzQuMi4wL0Vjb3JlUHJpbWl0aXZlVHlwZXMiPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVCaWdEZWNpbWFsIiBuYW1lPSJFQmlnRGVjaW1hbCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVCaWdJbnRlZ2VyIiBuYW1lPSJFQmlnSW50ZWdlciIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVCb29sZWFuIiBuYW1lPSJFQm9vbGVhbiIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVCb29sZWFuT2JqZWN0IiBuYW1lPSJFQm9vbGVhbk9iamVjdCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVCeXRlIiBuYW1lPSJFQnl0ZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVCeXRlQXJyYXkiIG5hbWU9IkVCeXRlQXJyYXkiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFQnl0ZU9iamVjdCIgbmFtZT0iRUJ5dGVPYmplY3QiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFQ2hhciIgbmFtZT0iRUNoYXIiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFQ2hhcmFjdGVyT2JqZWN0IiBuYW1lPSJFQ2hhcmFjdGVyT2JqZWN0Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRURhdGUiIG5hbWU9IkVEYXRlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRURpYWdub3N0aWNDaGFpbiIgbmFtZT0iRURpYWdub3N0aWNDaGFpbiIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVEb3VibGUiIG5hbWU9IkVEb3VibGUiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFRG91YmxlT2JqZWN0IiBuYW1lPSJFRG91YmxlT2JqZWN0Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUVMaXN0IiBuYW1lPSJFRUxpc3QiPgotICAgICAgPG93bmVkVGVtcGxhdGVTaWduYXR1cmUgeG1pOnR5cGU9InVtbDpSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlIiB4bWk6aWQ9IkVFTGlzdC1fb3duZWRFbGVtZW50LjAiIHBhcmFtZXRlcj0iRUVMaXN0LV9vd25lZEVsZW1lbnQuMC1fb3duZWRQYXJhbWV0ZXIuMCI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6dHlwZT0idW1sOkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlciIgeG1pOmlkPSJFRUxpc3QtX293bmVkRWxlbWVudC4wLV9vd25lZFBhcmFtZXRlci4wIiBwYXJhbWV0ZXJlZEVsZW1lbnQ9IkVFTGlzdC1fb3duZWRFbGVtZW50LjAtX293bmVkUGFyYW1ldGVyLjAtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50Ij4KLSAgICAgICAgICA8b3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFRUxpc3QtX293bmVkRWxlbWVudC4wLV9vd25lZFBhcmFtZXRlci4wLV9vd25lZFBhcmFtZXRlcmVkRWxlbWVudCIgbmFtZT0iRSIgdGVtcGxhdGVQYXJhbWV0ZXI9IkVFTGlzdC1fb3duZWRFbGVtZW50LjAtX293bmVkUGFyYW1ldGVyLjAiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRUZW1wbGF0ZVNpZ25hdHVyZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFRW51bWVyYXRvciIgbmFtZT0iRUVudW1lcmF0b3IiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFRmVhdHVyZU1hcCIgbmFtZT0iRUZlYXR1cmVNYXAiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFRmVhdHVyZU1hcEVudHJ5IiBuYW1lPSJFRmVhdHVyZU1hcEVudHJ5Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUZsb2F0IiBuYW1lPSJFRmxvYXQiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFRmxvYXRPYmplY3QiIG5hbWU9IkVGbG9hdE9iamVjdCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVJbnQiIG5hbWU9IkVJbnQiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFSW50ZWdlck9iamVjdCIgbmFtZT0iRUludGVnZXJPYmplY3QiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFSmF2YUNsYXNzIiBuYW1lPSJFSmF2YUNsYXNzIj4KLSAgICAgIDxvd25lZFRlbXBsYXRlU2lnbmF0dXJlIHhtaTp0eXBlPSJ1bWw6UmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgeG1pOmlkPSJFSmF2YUNsYXNzLV9vd25lZEVsZW1lbnQuMCIgcGFyYW1ldGVyPSJFSmF2YUNsYXNzLV9vd25lZEVsZW1lbnQuMC1fb3duZWRQYXJhbWV0ZXIuMCI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6dHlwZT0idW1sOkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlciIgeG1pOmlkPSJFSmF2YUNsYXNzLV9vd25lZEVsZW1lbnQuMC1fb3duZWRQYXJhbWV0ZXIuMCIgcGFyYW1ldGVyZWRFbGVtZW50PSJFSmF2YUNsYXNzLV9vd25lZEVsZW1lbnQuMC1fb3duZWRQYXJhbWV0ZXIuMC1fb3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQiPgotICAgICAgICAgIDxvd25lZFBhcmFtZXRlcmVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkVKYXZhQ2xhc3MtX293bmVkRWxlbWVudC4wLV9vd25lZFBhcmFtZXRlci4wLV9vd25lZFBhcmFtZXRlcmVkRWxlbWVudCIgbmFtZT0iVCIgdGVtcGxhdGVQYXJhbWV0ZXI9IkVKYXZhQ2xhc3MtX293bmVkRWxlbWVudC4wLV9vd25lZFBhcmFtZXRlci4wIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkVGVtcGxhdGVTaWduYXR1cmU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUphdmFPYmplY3QiIG5hbWU9IkVKYXZhT2JqZWN0Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUxvbmciIG5hbWU9IkVMb25nIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUxvbmdPYmplY3QiIG5hbWU9IkVMb25nT2JqZWN0Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRU1hcCIgbmFtZT0iRU1hcCI+Ci0gICAgICA8b3duZWRUZW1wbGF0ZVNpZ25hdHVyZSB4bWk6dHlwZT0idW1sOlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiIHhtaTppZD0iRU1hcC1fb3duZWRFbGVtZW50LjAiIHBhcmFtZXRlcj0iRU1hcC1fb3duZWRFbGVtZW50LjAtX293bmVkUGFyYW1ldGVyLjAgRU1hcC1fb3duZWRFbGVtZW50LjAtX293bmVkUGFyYW1ldGVyLjEiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOnR5cGU9InVtbDpDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiIHhtaTppZD0iRU1hcC1fb3duZWRFbGVtZW50LjAtX293bmVkUGFyYW1ldGVyLjAiIHBhcmFtZXRlcmVkRWxlbWVudD0iRU1hcC1fb3duZWRFbGVtZW50LjAtX293bmVkUGFyYW1ldGVyLjAtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50Ij4KLSAgICAgICAgICA8b3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFTWFwLV9vd25lZEVsZW1lbnQuMC1fb3duZWRQYXJhbWV0ZXIuMC1fb3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQiIG5hbWU9IksiIHRlbXBsYXRlUGFyYW1ldGVyPSJFTWFwLV9vd25lZEVsZW1lbnQuMC1fb3duZWRQYXJhbWV0ZXIuMCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOnR5cGU9InVtbDpDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiIHhtaTppZD0iRU1hcC1fb3duZWRFbGVtZW50LjAtX293bmVkUGFyYW1ldGVyLjEiIHBhcmFtZXRlcmVkRWxlbWVudD0iRU1hcC1fb3duZWRFbGVtZW50LjAtX293bmVkUGFyYW1ldGVyLjEtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50Ij4KLSAgICAgICAgICA8b3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFTWFwLV9vd25lZEVsZW1lbnQuMC1fb3duZWRQYXJhbWV0ZXIuMS1fb3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQiIG5hbWU9IlYiIHRlbXBsYXRlUGFyYW1ldGVyPSJFTWFwLV9vd25lZEVsZW1lbnQuMC1fb3duZWRQYXJhbWV0ZXIuMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZFRlbXBsYXRlU2lnbmF0dXJlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVSZXNvdXJjZSIgbmFtZT0iRVJlc291cmNlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRVJlc291cmNlU2V0IiBuYW1lPSJFUmVzb3VyY2VTZXQiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFU2hvcnQiIG5hbWU9IkVTaG9ydCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVTaG9ydE9iamVjdCIgbmFtZT0iRVNob3J0T2JqZWN0Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRVN0cmluZyIgbmFtZT0iRVN0cmluZyIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVUcmVlSXRlcmF0b3IiIG5hbWU9IkVUcmVlSXRlcmF0b3IiPgotICAgICAgPG93bmVkVGVtcGxhdGVTaWduYXR1cmUgeG1pOnR5cGU9InVtbDpSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlIiB4bWk6aWQ9IkVUcmVlSXRlcmF0b3ItX293bmVkRWxlbWVudC4wIiBwYXJhbWV0ZXI9IkVUcmVlSXRlcmF0b3ItX293bmVkRWxlbWVudC4wLV9vd25lZFBhcmFtZXRlci4wIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIiB4bWk6aWQ9IkVUcmVlSXRlcmF0b3ItX293bmVkRWxlbWVudC4wLV9vd25lZFBhcmFtZXRlci4wIiBwYXJhbWV0ZXJlZEVsZW1lbnQ9IkVUcmVlSXRlcmF0b3ItX293bmVkRWxlbWVudC4wLV9vd25lZFBhcmFtZXRlci4wLV9vd25lZFBhcmFtZXRlcmVkRWxlbWVudCI+Ci0gICAgICAgICAgPG93bmVkUGFyYW1ldGVyZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRVRyZWVJdGVyYXRvci1fb3duZWRFbGVtZW50LjAtX293bmVkUGFyYW1ldGVyLjAtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50IiBuYW1lPSJFIiB0ZW1wbGF0ZVBhcmFtZXRlcj0iRVRyZWVJdGVyYXRvci1fb3duZWRFbGVtZW50LjAtX293bmVkUGFyYW1ldGVyLjAiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRUZW1wbGF0ZVNpZ25hdHVyZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiIgbmFtZT0iRUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24iLz4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX3Byb2ZpbGVBcHBsaWNhdGlvbi4wIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfcHJvZmlsZUFwcGxpY2F0aW9uLjAtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZ1bWwyMkYyLjAuMDJGVU1MIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwvUHJvZmlsZS9TdGFuZGFyZCMvIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSIuLi9wcm9maWxlcy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfMCIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICA8L3VtbDpNb2RlbD4KLSAgPHN0YW5kYXJkOk1vZGVsTGlicmFyeSB4bWk6aWQ9Il9qVkMxOE1NREVlQ2oyWUhUalFxQ3F3IiBiYXNlX1BhY2thZ2U9Il8wIi8+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDJlYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvQzIvcmVzb3VyY2VzL21vZGVsL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyMDEzMTAwMSIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvc3BlYy9YTUkvMjAxMzEwMDEiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczpzdGFuZGFyZD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTC9Qcm9maWxlL1N0YW5kYXJkIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwiPgotICA8dW1sOk1vZGVsIHhtaTppZD0iXzAiIG5hbWU9IlByaW1pdGl2ZVR5cGVzIiBVUkk9Imh0dHA6Ly93d3cub21nLm9yZy9zcGVjL1ByaW1pdGl2ZVR5cGVzLzIwMTMxMDAxIj4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJCb29sZWFuIiBuYW1lPSJCb29sZWFuIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCb29sZWFuLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQm9vbGVhbiI+Ci0gICAgICAgIDxib2R5PkJvb2xlYW4gaXMgdXNlZCBmb3IgbG9naWNhbCBleHByZXNzaW9ucywgY29uc2lzdGluZyBvZiB0aGUgcHJlZGVmaW5lZCB2YWx1ZXMgdHJ1ZSBhbmQgZmFsc2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iSW50ZWdlciIgbmFtZT0iSW50ZWdlciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZWdlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVnZXIiPgotICAgICAgICA8Ym9keT5JbnRlZ2VyIGlzIGEgcHJpbWl0aXZlIHR5cGUgcmVwcmVzZW50aW5nIGludGVnZXIgdmFsdWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IlJlYWwiIG5hbWU9IlJlYWwiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFsIj4KLSAgICAgICAgPGJvZHk+UmVhbCBpcyBhIHByaW1pdGl2ZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgbWF0aGVtYXRpY2FsIGNvbmNlcHQgb2YgcmVhbC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJTdHJpbmciIG5hbWU9IlN0cmluZyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RyaW5nLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RyaW5nIj4KLSAgICAgICAgPGJvZHk+U3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbiBzb21lIHN1aXRhYmxlIGNoYXJhY3RlciBzZXQgdXNlZCB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb2RlbC4gQ2hhcmFjdGVyIHNldHMgbWF5IGluY2x1ZGUgbm9uLVJvbWFuIGFscGhhYmV0cyBhbmQgY2hhcmFjdGVycy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJVbmxpbWl0ZWROYXR1cmFsIiBuYW1lPSJVbmxpbWl0ZWROYXR1cmFsIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVbmxpbWl0ZWROYXR1cmFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVW5saW1pdGVkTmF0dXJhbCI+Ci0gICAgICAgIDxib2R5PlVubGltaXRlZE5hdHVyYWwgaXMgYSBwcmltaXRpdmUgdHlwZSByZXByZXNlbnRpbmcgdW5saW1pdGVkIG5hdHVyYWwgdmFsdWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfcHJvZmlsZUFwcGxpY2F0aW9uLjAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9wcm9maWxlQXBwbGljYXRpb24uMC1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfejFPRmNIanFFZHk4UzRDcjhSY19OQSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfMCIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfcHJvZmlsZUFwcGxpY2F0aW9uLjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9wcm9maWxlQXBwbGljYXRpb24uMS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTC9Qcm9maWxlL1N0YW5kYXJkIy8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9Ii4uL3Byb2ZpbGVzL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gIDwvdW1sOk1vZGVsPgotICA8c3RhbmRhcmQ6TW9kZWxMaWJyYXJ5IHhtaTppZD0iX0xTQVVjSXg3RWVPdW1lREpZVjBTY0EiIGJhc2VfUGFja2FnZT0iXzAiLz4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL21ldGFtb2RlbHMvRWNvcmUubWV0YW1vZGVsLnVtbCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL21ldGFtb2RlbHMvRWNvcmUubWV0YW1vZGVsLnVtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2ZDdjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9tZXRhbW9kZWxzL0Vjb3JlLm1ldGFtb2RlbC51bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyMDEzMTAwMSIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvc3BlYy9YTUkvMjAxMzEwMDEiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczpzdGFuZGFyZD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTC9Qcm9maWxlL1N0YW5kYXJkIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwiPgotICA8dW1sOk1vZGVsIHhtaTppZD0iXzAiIG5hbWU9IkVjb3JlIiBVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFQW5ub3RhdGlvbiIgbmFtZT0iRUFubm90YXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVBbm5vdGF0aW9uLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFQW5ub3RhdGlvbi1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGRWNvcmUtX2RldGFpbHMuMCIga2V5PSJjb25zdHJhaW50cyIgdmFsdWU9IldlbGxGb3JtZWRTb3VyY2VVUkkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRUFubm90YXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVNb2RlbEVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVBbm5vdGF0aW9uLXNvdXJjZSIgbmFtZT0ic291cmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVTdHJpbmciIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUFubm90YXRpb24tc291cmNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUFubm90YXRpb24tZGV0YWlscyIgbmFtZT0iZGV0YWlscyIgdHlwZT0iRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFfZGV0YWlsc19lQW5ub3RhdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUFubm90YXRpb24tZGV0YWlscy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVBbm5vdGF0aW9uLWRldGFpbHMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUFubm90YXRpb24tZU1vZGVsRWxlbWVudCIgbmFtZT0iZU1vZGVsRWxlbWVudCIgdHlwZT0iRU1vZGVsRWxlbWVudCIgaXNPcmRlcmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9lQW5ub3RhdGlvbnNfZU1vZGVsRWxlbWVudCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUFubm90YXRpb24tZU1vZGVsRWxlbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVBbm5vdGF0aW9uLWNvbnRlbnRzIiBuYW1lPSJjb250ZW50cyIgdHlwZT0iRU9iamVjdCIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQV9jb250ZW50c19lQW5ub3RhdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUFubm90YXRpb24tY29udGVudHMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFQW5ub3RhdGlvbi1jb250ZW50cy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFQW5ub3RhdGlvbi1yZWZlcmVuY2VzIiBuYW1lPSJyZWZlcmVuY2VzIiB0eXBlPSJFT2JqZWN0IiBpc09yZGVyZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX3JlZmVyZW5jZXNfZUFubm90YXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVBbm5vdGF0aW9uLXJlZmVyZW5jZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFQW5ub3RhdGlvbi1yZWZlcmVuY2VzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRUF0dHJpYnV0ZSIgbmFtZT0iRUF0dHJpYnV0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRUF0dHJpYnV0ZS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGRWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRUF0dHJpYnV0ZS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGRWNvcmUtX2RldGFpbHMuMCIga2V5PSJjb25zdHJhaW50cyIgdmFsdWU9IkNvbnNpc3RlbnRUcmFuc2llbnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRUF0dHJpYnV0ZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRVN0cnVjdHVyYWxGZWF0dXJlIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFQXR0cmlidXRlLWlkIiBuYW1lPSJpZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFQm9vbGVhbiIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQXR0cmlidXRlLWlkLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUF0dHJpYnV0ZS1lQXR0cmlidXRlVHlwZSIgbmFtZT0iZUF0dHJpYnV0ZVR5cGUiIHR5cGU9IkVEYXRhVHlwZSIgaXNPcmRlcmVkPSJ0cnVlIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX2VBdHRyaWJ1dGVUeXBlX2VBdHRyaWJ1dGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRUNsYXNzIiBuYW1lPSJFQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVDbGFzcy1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGRWNvcmUiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRUNsYXNzLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZS1fZGV0YWlscy4wIiBrZXk9ImNvbnN0cmFpbnRzIiB2YWx1ZT0iSW50ZXJmYWNlSXNBYnN0cmFjdCBBdE1vc3RPbmVJRCBVbmlxdWVGZWF0dXJlTmFtZXMgVW5pcXVlT3BlcmF0aW9uU2lnbmF0dXJlcyBOb0NpcmN1bGFyU3VwZXJUeXBlcyBXZWxsRm9ybWVkTWFwRW50cnlDbGFzcyBDb25zaXN0ZW50U3VwZXJUeXBlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFQ2xhc3MtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVDbGFzc2lmaWVyIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFQ2xhc3MtYWJzdHJhY3QiIG5hbWU9ImFic3RyYWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVCb29sZWFuIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVDbGFzcy1hYnN0cmFjdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVDbGFzcy1pbnRlcmZhY2UiIG5hbWU9ImludGVyZmFjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFQm9vbGVhbiIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3MtaW50ZXJmYWNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUNsYXNzLWVTdXBlclR5cGVzIiBuYW1lPSJlU3VwZXJUeXBlcyIgdHlwZT0iRUNsYXNzIiBpc09yZGVyZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX2VTdXBlclR5cGVzX2VDbGFzcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFQ2xhc3MtZVN1cGVyVHlwZXMtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkdlbk1vZGVsIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRUNsYXNzLWVTdXBlclR5cGVzLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZHZW5Nb2RlbC1fZGV0YWlscy4wIiBrZXk9InN1cHByZXNzZWRVbnNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFQ2xhc3MtZVN1cGVyVHlwZXMtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkdlbk1vZGVsLV9kZXRhaWxzLjEiIGtleT0ic3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzLWVTdXBlclR5cGVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRUNsYXNzLWVTdXBlclR5cGVzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVDbGFzcy1lT3BlcmF0aW9ucyIgbmFtZT0iZU9wZXJhdGlvbnMiIHR5cGU9IkVPcGVyYXRpb24iIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFfZU9wZXJhdGlvbnNfZUNvbnRhaW5pbmdDbGFzcyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzLWVPcGVyYXRpb25zLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRUNsYXNzLWVPcGVyYXRpb25zLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVDbGFzcy1lQWxsQXR0cmlidXRlcyIgbmFtZT0iZUFsbEF0dHJpYnV0ZXMiIHR5cGU9IkVBdHRyaWJ1dGUiIGlzT3JkZXJlZD0idHJ1ZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9lQWxsQXR0cmlidXRlc19lQ2xhc3MiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVDbGFzcy1lQWxsQXR0cmlidXRlcy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVDbGFzcy1lQWxsQXR0cmlidXRlcy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFQ2xhc3MtZUFsbFJlZmVyZW5jZXMiIG5hbWU9ImVBbGxSZWZlcmVuY2VzIiB0eXBlPSJFUmVmZXJlbmNlIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZUFsbFJlZmVyZW5jZXNfZUNsYXNzIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3MtZUFsbFJlZmVyZW5jZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFQ2xhc3MtZUFsbFJlZmVyZW5jZXMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUNsYXNzLWVSZWZlcmVuY2VzIiBuYW1lPSJlUmVmZXJlbmNlcyIgdHlwZT0iRVJlZmVyZW5jZSIgaXNPcmRlcmVkPSJ0cnVlIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX2VSZWZlcmVuY2VzX2VDbGFzcyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzLWVSZWZlcmVuY2VzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRUNsYXNzLWVSZWZlcmVuY2VzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVDbGFzcy1lQXR0cmlidXRlcyIgbmFtZT0iZUF0dHJpYnV0ZXMiIHR5cGU9IkVBdHRyaWJ1dGUiIGlzT3JkZXJlZD0idHJ1ZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9lQXR0cmlidXRlc19lQ2xhc3MiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVDbGFzcy1lQXR0cmlidXRlcy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVDbGFzcy1lQXR0cmlidXRlcy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFQ2xhc3MtZUFsbENvbnRhaW5tZW50cyIgbmFtZT0iZUFsbENvbnRhaW5tZW50cyIgdHlwZT0iRVJlZmVyZW5jZSIgaXNPcmRlcmVkPSJ0cnVlIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX2VBbGxDb250YWlubWVudHNfZUNsYXNzIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3MtZUFsbENvbnRhaW5tZW50cy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVDbGFzcy1lQWxsQ29udGFpbm1lbnRzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVDbGFzcy1lQWxsT3BlcmF0aW9ucyIgbmFtZT0iZUFsbE9wZXJhdGlvbnMiIHR5cGU9IkVPcGVyYXRpb24iIGlzT3JkZXJlZD0idHJ1ZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9lQWxsT3BlcmF0aW9uc19lQ2xhc3MiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVDbGFzcy1lQWxsT3BlcmF0aW9ucy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVDbGFzcy1lQWxsT3BlcmF0aW9ucy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFQ2xhc3MtZUFsbFN0cnVjdHVyYWxGZWF0dXJlcyIgbmFtZT0iZUFsbFN0cnVjdHVyYWxGZWF0dXJlcyIgdHlwZT0iRVN0cnVjdHVyYWxGZWF0dXJlIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZUFsbFN0cnVjdHVyYWxGZWF0dXJlc19lQ2xhc3MiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVDbGFzcy1lQWxsU3RydWN0dXJhbEZlYXR1cmVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRUNsYXNzLWVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUNsYXNzLWVBbGxTdXBlclR5cGVzIiBuYW1lPSJlQWxsU3VwZXJUeXBlcyIgdHlwZT0iRUNsYXNzIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZUFsbFN1cGVyVHlwZXNfZUNsYXNzIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3MtZUFsbFN1cGVyVHlwZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFQ2xhc3MtZUFsbFN1cGVyVHlwZXMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUNsYXNzLWVJREF0dHJpYnV0ZSIgbmFtZT0iZUlEQXR0cmlidXRlIiB0eXBlPSJFQXR0cmlidXRlIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZUlEQXR0cmlidXRlX2VDbGFzcyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzLWVJREF0dHJpYnV0ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVDbGFzcy1lU3RydWN0dXJhbEZlYXR1cmVzIiBuYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIiB0eXBlPSJFU3RydWN0dXJhbEZlYXR1cmUiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFfZVN0cnVjdHVyYWxGZWF0dXJlc19lQ29udGFpbmluZ0NsYXNzIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3MtZVN0cnVjdHVyYWxGZWF0dXJlcy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVDbGFzcy1lU3RydWN0dXJhbEZlYXR1cmVzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVDbGFzcy1lR2VuZXJpY1N1cGVyVHlwZXMiIG5hbWU9ImVHZW5lcmljU3VwZXJUeXBlcyIgdHlwZT0iRUdlbmVyaWNUeXBlIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJBX2VHZW5lcmljU3VwZXJUeXBlc19lQ2xhc3MiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRUNsYXNzLWVHZW5lcmljU3VwZXJUeXBlcy1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGR2VuTW9kZWwiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFQ2xhc3MtZUdlbmVyaWNTdXBlclR5cGVzLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZHZW5Nb2RlbC1fZGV0YWlscy4wIiBrZXk9InN1cHByZXNzZWRVbnNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFQ2xhc3MtZUdlbmVyaWNTdXBlclR5cGVzLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZHZW5Nb2RlbC1fZGV0YWlscy4xIiBrZXk9InN1cHByZXNzZWRJc1NldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVDbGFzcy1lR2VuZXJpY1N1cGVyVHlwZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFQ2xhc3MtZUdlbmVyaWNTdXBlclR5cGVzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVDbGFzcy1lQWxsR2VuZXJpY1N1cGVyVHlwZXMiIG5hbWU9ImVBbGxHZW5lcmljU3VwZXJUeXBlcyIgdHlwZT0iRUdlbmVyaWNUeXBlIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZUFsbEdlbmVyaWNTdXBlclR5cGVzX2VDbGFzcyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzLWVBbGxHZW5lcmljU3VwZXJUeXBlcy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVDbGFzcy1lQWxsR2VuZXJpY1N1cGVyVHlwZXMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRUNsYXNzLWlzU3VwZXJUeXBlT2YiIG5hbWU9ImlzU3VwZXJUeXBlT2YiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVDbGFzcy1pc1N1cGVyVHlwZU9mLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJFQm9vbGVhbiIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3MtaXNTdXBlclR5cGVPZi1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFQ2xhc3MtaXNTdXBlclR5cGVPZi1zb21lQ2xhc3MiIG5hbWU9InNvbWVDbGFzcyIgdHlwZT0iRUNsYXNzIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzLWlzU3VwZXJUeXBlT2Ytc29tZUNsYXNzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRUNsYXNzLWdldEZlYXR1cmVDb3VudCIgbmFtZT0iZ2V0RmVhdHVyZUNvdW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFQ2xhc3MtZ2V0RmVhdHVyZUNvdW50LV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJFSW50IiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVDbGFzcy1nZXRGZWF0dXJlQ291bnQtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFQ2xhc3MtZ2V0RVN0cnVjdHVyYWxGZWF0dXJlIiBuYW1lPSJnZXRFU3RydWN0dXJhbEZlYXR1cmUiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVDbGFzcy1nZXRFU3RydWN0dXJhbEZlYXR1cmUtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkVTdHJ1Y3R1cmFsRmVhdHVyZSIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3MtZ2V0RVN0cnVjdHVyYWxGZWF0dXJlLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVDbGFzcy1nZXRFU3RydWN0dXJhbEZlYXR1cmUtZmVhdHVyZUlEIiBuYW1lPSJmZWF0dXJlSUQiIHR5cGU9IkVJbnQiIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3MtZ2V0RVN0cnVjdHVyYWxGZWF0dXJlLWZlYXR1cmVJRC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVDbGFzcy1nZXRGZWF0dXJlSUQiIG5hbWU9ImdldEZlYXR1cmVJRCIgdmlzaWJpbGl0eT0icHVibGljIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRUNsYXNzLWdldEZlYXR1cmVJRC1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRUludCIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3MtZ2V0RmVhdHVyZUlELV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVDbGFzcy1nZXRGZWF0dXJlSUQtZmVhdHVyZSIgbmFtZT0iZmVhdHVyZSIgdHlwZT0iRVN0cnVjdHVyYWxGZWF0dXJlIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzLWdldEZlYXR1cmVJRC1mZWF0dXJlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRUNsYXNzLWdldEVTdHJ1Y3R1cmFsRmVhdHVyZS4xIiBuYW1lPSJnZXRFU3RydWN0dXJhbEZlYXR1cmUiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVDbGFzcy1nZXRFU3RydWN0dXJhbEZlYXR1cmUuMS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRVN0cnVjdHVyYWxGZWF0dXJlIiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVDbGFzcy1nZXRFU3RydWN0dXJhbEZlYXR1cmUuMS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFQ2xhc3MtZ2V0RVN0cnVjdHVyYWxGZWF0dXJlLjEtZmVhdHVyZU5hbWUiIG5hbWU9ImZlYXR1cmVOYW1lIiB0eXBlPSJFU3RyaW5nIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzLWdldEVTdHJ1Y3R1cmFsRmVhdHVyZS4xLWZlYXR1cmVOYW1lLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFQ2xhc3NpZmllciIgbmFtZT0iRUNsYXNzaWZpZXIiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVDbGFzc2lmaWVyLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFQ2xhc3NpZmllci1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGRWNvcmUtX2RldGFpbHMuMCIga2V5PSJjb25zdHJhaW50cyIgdmFsdWU9IldlbGxGb3JtZWRJbnN0YW5jZVR5cGVOYW1lIFVuaXF1ZVR5cGVQYXJhbWV0ZXJOYW1lcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFQ2xhc3NpZmllci1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRU5hbWVkRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUNsYXNzaWZpZXItaW5zdGFuY2VDbGFzc05hbWUiIG5hbWU9Imluc3RhbmNlQ2xhc3NOYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVTdHJpbmciIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFQ2xhc3NpZmllci1pbnN0YW5jZUNsYXNzTmFtZS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGR2VuTW9kZWwiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFQ2xhc3NpZmllci1pbnN0YW5jZUNsYXNzTmFtZS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGR2VuTW9kZWwtX2RldGFpbHMuMCIga2V5PSJzdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRUNsYXNzaWZpZXItaW5zdGFuY2VDbGFzc05hbWUtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkdlbk1vZGVsLV9kZXRhaWxzLjEiIGtleT0ic3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzaWZpZXItaW5zdGFuY2VDbGFzc05hbWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFQ2xhc3NpZmllci1pbnN0YW5jZUNsYXNzIiBuYW1lPSJpbnN0YW5jZUNsYXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVDbGFzc2lmaWVyLUVKYXZhQ2xhc3NfV2lsZGNhcmQiIGlzT3JkZXJlZD0idHJ1ZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3NpZmllci1pbnN0YW5jZUNsYXNzLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUNsYXNzaWZpZXItZGVmYXVsdFZhbHVlIiBuYW1lPSJkZWZhdWx0VmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iRUphdmFPYmplY3QiIGlzT3JkZXJlZD0idHJ1ZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3NpZmllci1kZWZhdWx0VmFsdWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFQ2xhc3NpZmllci1pbnN0YW5jZVR5cGVOYW1lIiBuYW1lPSJpbnN0YW5jZVR5cGVOYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVTdHJpbmciIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFQ2xhc3NpZmllci1pbnN0YW5jZVR5cGVOYW1lLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZHZW5Nb2RlbCIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVDbGFzc2lmaWVyLWluc3RhbmNlVHlwZU5hbWUtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkdlbk1vZGVsLV9kZXRhaWxzLjAiIGtleT0ic3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVDbGFzc2lmaWVyLWluc3RhbmNlVHlwZU5hbWUtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkdlbk1vZGVsLV9kZXRhaWxzLjEiIGtleT0ic3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzaWZpZXItaW5zdGFuY2VUeXBlTmFtZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVDbGFzc2lmaWVyLWVQYWNrYWdlIiBuYW1lPSJlUGFja2FnZSIgdHlwZT0iRVBhY2thZ2UiIGlzT3JkZXJlZD0idHJ1ZSIgaXNSZWFkT25seT0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZUNsYXNzaWZpZXJzX2VQYWNrYWdlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3NpZmllci1lUGFja2FnZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVDbGFzc2lmaWVyLWVUeXBlUGFyYW1ldGVycyIgbmFtZT0iZVR5cGVQYXJhbWV0ZXJzIiB0eXBlPSJFVHlwZVBhcmFtZXRlciIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQV9lVHlwZVBhcmFtZXRlcnNfZUNsYXNzaWZpZXIiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVDbGFzc2lmaWVyLWVUeXBlUGFyYW1ldGVycy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVDbGFzc2lmaWVyLWVUeXBlUGFyYW1ldGVycy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFQ2xhc3NpZmllci1pc0luc3RhbmNlIiBuYW1lPSJpc0luc3RhbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFQ2xhc3NpZmllci1pc0luc3RhbmNlLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJFQm9vbGVhbiIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFQ2xhc3NpZmllci1pc0luc3RhbmNlLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVDbGFzc2lmaWVyLWlzSW5zdGFuY2Utb2JqZWN0IiBuYW1lPSJvYmplY3QiIHR5cGU9IkVKYXZhT2JqZWN0IiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUNsYXNzaWZpZXItaXNJbnN0YW5jZS1vYmplY3QtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFQ2xhc3NpZmllci1nZXRDbGFzc2lmaWVySUQiIG5hbWU9ImdldENsYXNzaWZpZXJJRCIgdmlzaWJpbGl0eT0icHVibGljIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRUNsYXNzaWZpZXItZ2V0Q2xhc3NpZmllcklELV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJFSW50IiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVDbGFzc2lmaWVyLWdldENsYXNzaWZpZXJJRC1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxuZXN0ZWRDbGFzc2lmaWVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRUNsYXNzaWZpZXItV2lsZGNhcmQiIG5hbWU9IldpbGRjYXJkIi8+Ci0gICAgICA8bmVzdGVkQ2xhc3NpZmllciB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUNsYXNzaWZpZXItRUphdmFDbGFzc19XaWxkY2FyZCIgbmFtZT0iRUphdmFDbGFzc19XaWxkY2FyZCI+Ci0gICAgICAgIDx0ZW1wbGF0ZUJpbmRpbmcgeG1pOmlkPSJFQ2xhc3NpZmllci1FSmF2YUNsYXNzX1dpbGRjYXJkLV90ZW1wbGF0ZUJpbmRpbmcuMCIgc2lnbmF0dXJlPSJFSmF2YUNsYXNzLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlIj4KLSAgICAgICAgICA8cGFyYW1ldGVyU3Vic3RpdHV0aW9uIHhtaTppZD0iRUNsYXNzaWZpZXItRUphdmFDbGFzc19XaWxkY2FyZC1fdGVtcGxhdGVCaW5kaW5nLjAtX3BhcmFtZXRlclN1YnN0aXR1dGlvbi4wIiBhY3R1YWw9IkVDbGFzc2lmaWVyLVdpbGRjYXJkIiBmb3JtYWw9IkVKYXZhQ2xhc3MtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAiLz4KLSAgICAgICAgPC90ZW1wbGF0ZUJpbmRpbmc+Ci0gICAgICA8L25lc3RlZENsYXNzaWZpZXI+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkVEYXRhVHlwZSIgbmFtZT0iRURhdGFUeXBlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkVEYXRhVHlwZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRUNsYXNzaWZpZXIiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVEYXRhVHlwZS1zZXJpYWxpemFibGUiIG5hbWU9InNlcmlhbGl6YWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFQm9vbGVhbiIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFRGF0YVR5cGUtc2VyaWFsaXphYmxlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFRW51bSIgbmFtZT0iRUVudW0iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVFbnVtLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFRW51bS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGRWNvcmUtX2RldGFpbHMuMCIga2V5PSJjb25zdHJhaW50cyIgdmFsdWU9IlVuaXF1ZUVudW1lcmF0b3JOYW1lcyBVbmlxdWVFbnVtZXJhdG9yTGl0ZXJhbHMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRUVudW0tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVEYXRhVHlwZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUVudW0tZUxpdGVyYWxzIiBuYW1lPSJlTGl0ZXJhbHMiIHR5cGU9IkVFbnVtTGl0ZXJhbCIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQV9lTGl0ZXJhbHNfZUVudW0iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVFbnVtLWVMaXRlcmFscy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVFbnVtLWVMaXRlcmFscy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFRW51bS1nZXRFRW51bUxpdGVyYWwiIG5hbWU9ImdldEVFbnVtTGl0ZXJhbCIgdmlzaWJpbGl0eT0icHVibGljIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRUVudW0tZ2V0RUVudW1MaXRlcmFsLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJFRW51bUxpdGVyYWwiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUVudW0tZ2V0RUVudW1MaXRlcmFsLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVFbnVtLWdldEVFbnVtTGl0ZXJhbC1uYW1lIiBuYW1lPSJuYW1lIiB0eXBlPSJFU3RyaW5nIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUVudW0tZ2V0RUVudW1MaXRlcmFsLW5hbWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFRW51bS1nZXRFRW51bUxpdGVyYWwuMSIgbmFtZT0iZ2V0RUVudW1MaXRlcmFsIiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFRW51bS1nZXRFRW51bUxpdGVyYWwuMS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRUVudW1MaXRlcmFsIiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVFbnVtLWdldEVFbnVtTGl0ZXJhbC4xLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVFbnVtLWdldEVFbnVtTGl0ZXJhbC4xLXZhbHVlIiBuYW1lPSJ2YWx1ZSIgdHlwZT0iRUludCIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVFbnVtLWdldEVFbnVtTGl0ZXJhbC4xLXZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRUVudW0tZ2V0RUVudW1MaXRlcmFsQnlMaXRlcmFsIiBuYW1lPSJnZXRFRW51bUxpdGVyYWxCeUxpdGVyYWwiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVFbnVtLWdldEVFbnVtTGl0ZXJhbEJ5TGl0ZXJhbC1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRUVudW1MaXRlcmFsIiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVFbnVtLWdldEVFbnVtTGl0ZXJhbEJ5TGl0ZXJhbC1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFRW51bS1nZXRFRW51bUxpdGVyYWxCeUxpdGVyYWwtbGl0ZXJhbCIgbmFtZT0ibGl0ZXJhbCIgdHlwZT0iRVN0cmluZyIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVFbnVtLWdldEVFbnVtTGl0ZXJhbEJ5TGl0ZXJhbC1saXRlcmFsLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFRW51bUxpdGVyYWwiIG5hbWU9IkVFbnVtTGl0ZXJhbCI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFRW51bUxpdGVyYWwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVFbnVtTGl0ZXJhbC12YWx1ZSIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iRUludCIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFRW51bUxpdGVyYWwtdmFsdWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFRW51bUxpdGVyYWwtaW5zdGFuY2UiIG5hbWU9Imluc3RhbmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVFbnVtZXJhdG9yIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVFbnVtTGl0ZXJhbC1pbnN0YW5jZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVFbnVtTGl0ZXJhbC1saXRlcmFsIiBuYW1lPSJsaXRlcmFsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVTdHJpbmciIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUVudW1MaXRlcmFsLWxpdGVyYWwtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFRW51bUxpdGVyYWwtZUVudW0iIG5hbWU9ImVFbnVtIiB0eXBlPSJFRW51bSIgaXNPcmRlcmVkPSJ0cnVlIiBpc1JlYWRPbmx5PSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9lTGl0ZXJhbHNfZUVudW0iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVFbnVtTGl0ZXJhbC1lRW51bS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRUZhY3RvcnkiIG5hbWU9IkVGYWN0b3J5Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkVGYWN0b3J5LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFTW9kZWxFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFRmFjdG9yeS1lUGFja2FnZSIgbmFtZT0iZVBhY2thZ2UiIHR5cGU9IkVQYWNrYWdlIiBpc09yZGVyZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX2VQYWNrYWdlX2VGYWN0b3J5SW5zdGFuY2UiLz4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVGYWN0b3J5LWNyZWF0ZSIgbmFtZT0iY3JlYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFRmFjdG9yeS1jcmVhdGUtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkVPYmplY3QiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUZhY3RvcnktY3JlYXRlLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVGYWN0b3J5LWNyZWF0ZS1lQ2xhc3MiIG5hbWU9ImVDbGFzcyIgdHlwZT0iRUNsYXNzIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUZhY3RvcnktY3JlYXRlLWVDbGFzcy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVGYWN0b3J5LWNyZWF0ZUZyb21TdHJpbmciIG5hbWU9ImNyZWF0ZUZyb21TdHJpbmciIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVGYWN0b3J5LWNyZWF0ZUZyb21TdHJpbmctX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkVKYXZhT2JqZWN0IiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVGYWN0b3J5LWNyZWF0ZUZyb21TdHJpbmctX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRUZhY3RvcnktY3JlYXRlRnJvbVN0cmluZy1lRGF0YVR5cGUiIG5hbWU9ImVEYXRhVHlwZSIgdHlwZT0iRURhdGFUeXBlIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUZhY3RvcnktY3JlYXRlRnJvbVN0cmluZy1lRGF0YVR5cGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRUZhY3RvcnktY3JlYXRlRnJvbVN0cmluZy1saXRlcmFsVmFsdWUiIG5hbWU9ImxpdGVyYWxWYWx1ZSIgdHlwZT0iRVN0cmluZyIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVGYWN0b3J5LWNyZWF0ZUZyb21TdHJpbmctbGl0ZXJhbFZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRUZhY3RvcnktY29udmVydFRvU3RyaW5nIiBuYW1lPSJjb252ZXJ0VG9TdHJpbmciIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVGYWN0b3J5LWNvbnZlcnRUb1N0cmluZy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRVN0cmluZyIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFRmFjdG9yeS1jb252ZXJ0VG9TdHJpbmctX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRUZhY3RvcnktY29udmVydFRvU3RyaW5nLWVEYXRhVHlwZSIgbmFtZT0iZURhdGFUeXBlIiB0eXBlPSJFRGF0YVR5cGUiIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFRmFjdG9yeS1jb252ZXJ0VG9TdHJpbmctZURhdGFUeXBlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVGYWN0b3J5LWNvbnZlcnRUb1N0cmluZy1pbnN0YW5jZVZhbHVlIiBuYW1lPSJpbnN0YW5jZVZhbHVlIiB0eXBlPSJFSmF2YU9iamVjdCIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVGYWN0b3J5LWNvbnZlcnRUb1N0cmluZy1pbnN0YW5jZVZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFR2VuZXJpY1R5cGUiIG5hbWU9IkVHZW5lcmljVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRUdlbmVyaWNUeXBlLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFR2VuZXJpY1R5cGUtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkVjb3JlLV9kZXRhaWxzLjAiIGtleT0iY29uc3RyYWludHMiIHZhbHVlPSJDb25zaXN0ZW50VHlwZSBDb25zaXN0ZW50Qm91bmRzIENvbnNpc3RlbnRBcmd1bWVudHMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRUdlbmVyaWNUeXBlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFT2JqZWN0Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFR2VuZXJpY1R5cGUtZVVwcGVyQm91bmQiIG5hbWU9ImVVcHBlckJvdW5kIiB0eXBlPSJFR2VuZXJpY1R5cGUiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFfZVVwcGVyQm91bmRfZUdlbmVyaWNUeXBlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFR2VuZXJpY1R5cGUtZVVwcGVyQm91bmQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFR2VuZXJpY1R5cGUtZVR5cGVBcmd1bWVudHMiIG5hbWU9ImVUeXBlQXJndW1lbnRzIiB0eXBlPSJFR2VuZXJpY1R5cGUiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFfZVR5cGVBcmd1bWVudHNfZUdlbmVyaWNUeXBlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFR2VuZXJpY1R5cGUtZVR5cGVBcmd1bWVudHMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFR2VuZXJpY1R5cGUtZVR5cGVBcmd1bWVudHMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUdlbmVyaWNUeXBlLWVSYXdUeXBlIiBuYW1lPSJlUmF3VHlwZSIgdHlwZT0iRUNsYXNzaWZpZXIiIGlzT3JkZXJlZD0idHJ1ZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9lUmF3VHlwZV9lR2VuZXJpY1R5cGUiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVHZW5lcmljVHlwZS1lTG93ZXJCb3VuZCIgbmFtZT0iZUxvd2VyQm91bmQiIHR5cGU9IkVHZW5lcmljVHlwZSIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQV9lTG93ZXJCb3VuZF9lR2VuZXJpY1R5cGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVHZW5lcmljVHlwZS1lTG93ZXJCb3VuZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVHZW5lcmljVHlwZS1lVHlwZVBhcmFtZXRlciIgbmFtZT0iZVR5cGVQYXJhbWV0ZXIiIHR5cGU9IkVUeXBlUGFyYW1ldGVyIiBpc09yZGVyZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX2VUeXBlUGFyYW1ldGVyX2VHZW5lcmljVHlwZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRUdlbmVyaWNUeXBlLWVUeXBlUGFyYW1ldGVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRUdlbmVyaWNUeXBlLWVDbGFzc2lmaWVyIiBuYW1lPSJlQ2xhc3NpZmllciIgdHlwZT0iRUNsYXNzaWZpZXIiIGlzT3JkZXJlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZUNsYXNzaWZpZXJfZUdlbmVyaWNUeXBlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFR2VuZXJpY1R5cGUtZUNsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkVNb2RlbEVsZW1lbnQiIG5hbWU9IkVNb2RlbEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRU1vZGVsRWxlbWVudC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRU9iamVjdCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRU1vZGVsRWxlbWVudC1lQW5ub3RhdGlvbnMiIG5hbWU9ImVBbm5vdGF0aW9ucyIgdHlwZT0iRUFubm90YXRpb24iIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFfZUFubm90YXRpb25zX2VNb2RlbEVsZW1lbnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVNb2RlbEVsZW1lbnQtZUFubm90YXRpb25zLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRU1vZGVsRWxlbWVudC1lQW5ub3RhdGlvbnMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRU1vZGVsRWxlbWVudC1nZXRFQW5ub3RhdGlvbiIgbmFtZT0iZ2V0RUFubm90YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVNb2RlbEVsZW1lbnQtZ2V0RUFubm90YXRpb24tX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkVBbm5vdGF0aW9uIiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVNb2RlbEVsZW1lbnQtZ2V0RUFubm90YXRpb24tX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRU1vZGVsRWxlbWVudC1nZXRFQW5ub3RhdGlvbi1zb3VyY2UiIG5hbWU9InNvdXJjZSIgdHlwZT0iRVN0cmluZyIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVNb2RlbEVsZW1lbnQtZ2V0RUFubm90YXRpb24tc291cmNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFTmFtZWRFbGVtZW50IiBuYW1lPSJFTmFtZWRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFTmFtZWRFbGVtZW50LV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFTmFtZWRFbGVtZW50LV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZS1fZGV0YWlscy4wIiBrZXk9ImNvbnN0cmFpbnRzIiB2YWx1ZT0iV2VsbEZvcm1lZE5hbWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRU5hbWVkRWxlbWVudC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRU1vZGVsRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRU5hbWVkRWxlbWVudC1uYW1lIiBuYW1lPSJuYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVTdHJpbmciIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU5hbWVkRWxlbWVudC1uYW1lLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFT2JqZWN0IiBuYW1lPSJFT2JqZWN0Ij4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVPYmplY3QtZUNsYXNzIiBuYW1lPSJlQ2xhc3MiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVPYmplY3QtZUNsYXNzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJFQ2xhc3MiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU9iamVjdC1lQ2xhc3MtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFT2JqZWN0LWVJc1Byb3h5IiBuYW1lPSJlSXNQcm94eSIgdmlzaWJpbGl0eT0icHVibGljIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRU9iamVjdC1lSXNQcm94eS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRUJvb2xlYW4iIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU9iamVjdC1lSXNQcm94eS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVPYmplY3QtZVJlc291cmNlIiBuYW1lPSJlUmVzb3VyY2UiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVPYmplY3QtZVJlc291cmNlLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJFUmVzb3VyY2UiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU9iamVjdC1lUmVzb3VyY2UtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFT2JqZWN0LWVDb250YWluZXIiIG5hbWU9ImVDb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVPYmplY3QtZUNvbnRhaW5lci1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRU9iamVjdCIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFT2JqZWN0LWVDb250YWluZXItX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFT2JqZWN0LWVDb250YWluaW5nRmVhdHVyZSIgbmFtZT0iZUNvbnRhaW5pbmdGZWF0dXJlIiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFT2JqZWN0LWVDb250YWluaW5nRmVhdHVyZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRVN0cnVjdHVyYWxGZWF0dXJlIiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVPYmplY3QtZUNvbnRhaW5pbmdGZWF0dXJlLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRU9iamVjdC1lQ29udGFpbm1lbnRGZWF0dXJlIiBuYW1lPSJlQ29udGFpbm1lbnRGZWF0dXJlIiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFT2JqZWN0LWVDb250YWlubWVudEZlYXR1cmUtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkVSZWZlcmVuY2UiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU9iamVjdC1lQ29udGFpbm1lbnRGZWF0dXJlLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRU9iamVjdC1lQ29udGVudHMiIG5hbWU9ImVDb250ZW50cyIgdmlzaWJpbGl0eT0icHVibGljIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRU9iamVjdC1lQ29udGVudHMtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkVPYmplY3QtRUVMaXN0X0VPYmplY3QiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU9iamVjdC1lQ29udGVudHMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFT2JqZWN0LWVBbGxDb250ZW50cyIgbmFtZT0iZUFsbENvbnRlbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFT2JqZWN0LWVBbGxDb250ZW50cy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRU9iamVjdC1FVHJlZUl0ZXJhdG9yX0VPYmplY3QiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU9iamVjdC1lQWxsQ29udGVudHMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFT2JqZWN0LWVDcm9zc1JlZmVyZW5jZXMiIG5hbWU9ImVDcm9zc1JlZmVyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVPYmplY3QtZUNyb3NzUmVmZXJlbmNlcy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRU9iamVjdC1FRUxpc3RfRU9iamVjdCIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFT2JqZWN0LWVDcm9zc1JlZmVyZW5jZXMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFT2JqZWN0LWVHZXQiIG5hbWU9ImVHZXQiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVPYmplY3QtZUdldC1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRUphdmFPYmplY3QiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU9iamVjdC1lR2V0LV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVPYmplY3QtZUdldC1mZWF0dXJlIiBuYW1lPSJmZWF0dXJlIiB0eXBlPSJFU3RydWN0dXJhbEZlYXR1cmUiIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFT2JqZWN0LWVHZXQtZmVhdHVyZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVPYmplY3QtZUdldC4xIiBuYW1lPSJlR2V0IiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFT2JqZWN0LWVHZXQuMS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRUphdmFPYmplY3QiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU9iamVjdC1lR2V0LjEtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRU9iamVjdC1lR2V0LjEtZmVhdHVyZSIgbmFtZT0iZmVhdHVyZSIgdHlwZT0iRVN0cnVjdHVyYWxGZWF0dXJlIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU9iamVjdC1lR2V0LjEtZmVhdHVyZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFT2JqZWN0LWVHZXQuMS1yZXNvbHZlIiBuYW1lPSJyZXNvbHZlIiB0eXBlPSJFQm9vbGVhbiIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVPYmplY3QtZUdldC4xLXJlc29sdmUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFT2JqZWN0LWVTZXQiIG5hbWU9ImVTZXQiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVPYmplY3QtZVNldC1fb3duZWRQYXJhbWV0ZXIuMCIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFT2JqZWN0LWVTZXQtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRU9iamVjdC1lU2V0LWZlYXR1cmUiIG5hbWU9ImZlYXR1cmUiIHR5cGU9IkVTdHJ1Y3R1cmFsRmVhdHVyZSIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVPYmplY3QtZVNldC1mZWF0dXJlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVPYmplY3QtZVNldC1uZXdWYWx1ZSIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9IkVKYXZhT2JqZWN0IiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRU9iamVjdC1lU2V0LW5ld1ZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRU9iamVjdC1lSXNTZXQiIG5hbWU9ImVJc1NldCIgdmlzaWJpbGl0eT0icHVibGljIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRU9iamVjdC1lSXNTZXQtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkVCb29sZWFuIiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVPYmplY3QtZUlzU2V0LV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVPYmplY3QtZUlzU2V0LWZlYXR1cmUiIG5hbWU9ImZlYXR1cmUiIHR5cGU9IkVTdHJ1Y3R1cmFsRmVhdHVyZSIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVPYmplY3QtZUlzU2V0LWZlYXR1cmUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFT2JqZWN0LWVVbnNldCIgbmFtZT0iZVVuc2V0IiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFT2JqZWN0LWVVbnNldC1fb3duZWRQYXJhbWV0ZXIuMCIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFT2JqZWN0LWVVbnNldC1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFT2JqZWN0LWVVbnNldC1mZWF0dXJlIiBuYW1lPSJmZWF0dXJlIiB0eXBlPSJFU3RydWN0dXJhbEZlYXR1cmUiIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFT2JqZWN0LWVVbnNldC1mZWF0dXJlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG5lc3RlZENsYXNzaWZpZXIgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVPYmplY3QtRUVMaXN0X0VPYmplY3QiIG5hbWU9IkVFTGlzdF9FT2JqZWN0Ij4KLSAgICAgICAgPHRlbXBsYXRlQmluZGluZyB4bWk6aWQ9IkVPYmplY3QtRUVMaXN0X0VPYmplY3QtX3RlbXBsYXRlQmluZGluZy4wIiBzaWduYXR1cmU9IkVFTGlzdC1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZSI+Ci0gICAgICAgICAgPHBhcmFtZXRlclN1YnN0aXR1dGlvbiB4bWk6aWQ9IkVPYmplY3QtRUVMaXN0X0VPYmplY3QtX3RlbXBsYXRlQmluZGluZy4wLV9wYXJhbWV0ZXJTdWJzdGl0dXRpb24uMCIgYWN0dWFsPSJFT2JqZWN0IiBmb3JtYWw9IkVFTGlzdC1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMCIvPgotICAgICAgICA8L3RlbXBsYXRlQmluZGluZz4KLSAgICAgIDwvbmVzdGVkQ2xhc3NpZmllcj4KLSAgICAgIDxuZXN0ZWRDbGFzc2lmaWVyIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFT2JqZWN0LUVUcmVlSXRlcmF0b3JfRU9iamVjdCIgbmFtZT0iRVRyZWVJdGVyYXRvcl9FT2JqZWN0Ij4KLSAgICAgICAgPHRlbXBsYXRlQmluZGluZyB4bWk6aWQ9IkVPYmplY3QtRVRyZWVJdGVyYXRvcl9FT2JqZWN0LV90ZW1wbGF0ZUJpbmRpbmcuMCIgc2lnbmF0dXJlPSJFVHJlZUl0ZXJhdG9yLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlIj4KLSAgICAgICAgICA8cGFyYW1ldGVyU3Vic3RpdHV0aW9uIHhtaTppZD0iRU9iamVjdC1FVHJlZUl0ZXJhdG9yX0VPYmplY3QtX3RlbXBsYXRlQmluZGluZy4wLV9wYXJhbWV0ZXJTdWJzdGl0dXRpb24uMCIgYWN0dWFsPSJFT2JqZWN0IiBmb3JtYWw9IkVUcmVlSXRlcmF0b3ItX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAiLz4KLSAgICAgICAgPC90ZW1wbGF0ZUJpbmRpbmc+Ci0gICAgICA8L25lc3RlZENsYXNzaWZpZXI+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkVPcGVyYXRpb24iIG5hbWU9IkVPcGVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVPcGVyYXRpb24tX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkVjb3JlIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVPcGVyYXRpb24tX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkVjb3JlLV9kZXRhaWxzLjAiIGtleT0iY29uc3RyYWludHMiIHZhbHVlPSJVbmlxdWVQYXJhbWV0ZXJOYW1lcyBVbmlxdWVUeXBlUGFyYW1ldGVyTmFtZXMgTm9SZXBlYXRpbmdWb2lkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkVPcGVyYXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVUeXBlZEVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVPcGVyYXRpb24tZUNvbnRhaW5pbmdDbGFzcyIgbmFtZT0iZUNvbnRhaW5pbmdDbGFzcyIgdHlwZT0iRUNsYXNzIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGFzc29jaWF0aW9uPSJBX2VPcGVyYXRpb25zX2VDb250YWluaW5nQ2xhc3MiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVPcGVyYXRpb24tZUNvbnRhaW5pbmdDbGFzcy1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVPcGVyYXRpb24tZVR5cGVQYXJhbWV0ZXJzIiBuYW1lPSJlVHlwZVBhcmFtZXRlcnMiIHR5cGU9IkVUeXBlUGFyYW1ldGVyIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJBX2VUeXBlUGFyYW1ldGVyc19lT3BlcmF0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFT3BlcmF0aW9uLWVUeXBlUGFyYW1ldGVycy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVPcGVyYXRpb24tZVR5cGVQYXJhbWV0ZXJzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVPcGVyYXRpb24tZVBhcmFtZXRlcnMiIG5hbWU9ImVQYXJhbWV0ZXJzIiB0eXBlPSJFUGFyYW1ldGVyIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJBX2VQYXJhbWV0ZXJzX2VPcGVyYXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVPcGVyYXRpb24tZVBhcmFtZXRlcnMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFT3BlcmF0aW9uLWVQYXJhbWV0ZXJzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVPcGVyYXRpb24tZUV4Y2VwdGlvbnMiIG5hbWU9ImVFeGNlcHRpb25zIiB0eXBlPSJFQ2xhc3NpZmllciIgaXNPcmRlcmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9lRXhjZXB0aW9uc19lT3BlcmF0aW9uIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVPcGVyYXRpb24tZUV4Y2VwdGlvbnMtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkdlbk1vZGVsIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRU9wZXJhdGlvbi1lRXhjZXB0aW9ucy1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGR2VuTW9kZWwtX2RldGFpbHMuMCIga2V5PSJzdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRU9wZXJhdGlvbi1lRXhjZXB0aW9ucy1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGR2VuTW9kZWwtX2RldGFpbHMuMSIga2V5PSJzdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFT3BlcmF0aW9uLWVFeGNlcHRpb25zLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRU9wZXJhdGlvbi1lRXhjZXB0aW9ucy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFT3BlcmF0aW9uLWVHZW5lcmljRXhjZXB0aW9ucyIgbmFtZT0iZUdlbmVyaWNFeGNlcHRpb25zIiB0eXBlPSJFR2VuZXJpY1R5cGUiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFfZUdlbmVyaWNFeGNlcHRpb25zX2VPcGVyYXRpb24iPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRU9wZXJhdGlvbi1lR2VuZXJpY0V4Y2VwdGlvbnMtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkdlbk1vZGVsIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRU9wZXJhdGlvbi1lR2VuZXJpY0V4Y2VwdGlvbnMtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkdlbk1vZGVsLV9kZXRhaWxzLjAiIGtleT0ic3VwcHJlc3NlZFVuc2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVPcGVyYXRpb24tZUdlbmVyaWNFeGNlcHRpb25zLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZHZW5Nb2RlbC1fZGV0YWlscy4xIiBrZXk9InN1cHByZXNzZWRJc1NldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVPcGVyYXRpb24tZUdlbmVyaWNFeGNlcHRpb25zLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRU9wZXJhdGlvbi1lR2VuZXJpY0V4Y2VwdGlvbnMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFUGFja2FnZSIgbmFtZT0iRVBhY2thZ2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVQYWNrYWdlLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFUGFja2FnZS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGRWNvcmUtX2RldGFpbHMuMCIga2V5PSJjb25zdHJhaW50cyIgdmFsdWU9IldlbGxGb3JtZWROc1VSSSBXZWxsRm9ybWVkTnNQcmVmaXggVW5pcXVlU3VicGFja2FnZU5hbWVzIFVuaXF1ZUNsYXNzaWZpZXJOYW1lcyBVbmlxdWVOc1VSSXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRVBhY2thZ2UtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVQYWNrYWdlLW5zVVJJIiBuYW1lPSJuc1VSSSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFU3RyaW5nIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVQYWNrYWdlLW5zVVJJLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVBhY2thZ2UtbnNQcmVmaXgiIG5hbWU9Im5zUHJlZml4IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVTdHJpbmciIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVBhY2thZ2UtbnNQcmVmaXgtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFUGFja2FnZS1lRmFjdG9yeUluc3RhbmNlIiBuYW1lPSJlRmFjdG9yeUluc3RhbmNlIiB0eXBlPSJFRmFjdG9yeSIgaXNPcmRlcmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9lUGFja2FnZV9lRmFjdG9yeUluc3RhbmNlIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFUGFja2FnZS1lQ2xhc3NpZmllcnMiIG5hbWU9ImVDbGFzc2lmaWVycyIgdHlwZT0iRUNsYXNzaWZpZXIiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFfZUNsYXNzaWZpZXJzX2VQYWNrYWdlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFUGFja2FnZS1lQ2xhc3NpZmllcnMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFUGFja2FnZS1lQ2xhc3NpZmllcnMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVBhY2thZ2UtZVN1YnBhY2thZ2VzIiBuYW1lPSJlU3VicGFja2FnZXMiIHR5cGU9IkVQYWNrYWdlIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJBX2VTdWJwYWNrYWdlc19lU3VwZXJQYWNrYWdlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFUGFja2FnZS1lU3VicGFja2FnZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFUGFja2FnZS1lU3VicGFja2FnZXMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVBhY2thZ2UtZVN1cGVyUGFja2FnZSIgbmFtZT0iZVN1cGVyUGFja2FnZSIgdHlwZT0iRVBhY2thZ2UiIGlzT3JkZXJlZD0idHJ1ZSIgaXNSZWFkT25seT0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZVN1YnBhY2thZ2VzX2VTdXBlclBhY2thZ2UiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVQYWNrYWdlLWVTdXBlclBhY2thZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFUGFja2FnZS1nZXRFQ2xhc3NpZmllciIgbmFtZT0iZ2V0RUNsYXNzaWZpZXIiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVQYWNrYWdlLWdldEVDbGFzc2lmaWVyLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJFQ2xhc3NpZmllciIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFUGFja2FnZS1nZXRFQ2xhc3NpZmllci1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFUGFja2FnZS1nZXRFQ2xhc3NpZmllci1uYW1lIiBuYW1lPSJuYW1lIiB0eXBlPSJFU3RyaW5nIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVBhY2thZ2UtZ2V0RUNsYXNzaWZpZXItbmFtZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRVBhcmFtZXRlciIgbmFtZT0iRVBhcmFtZXRlciI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFUGFyYW1ldGVyLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFVHlwZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFUGFyYW1ldGVyLWVPcGVyYXRpb24iIG5hbWU9ImVPcGVyYXRpb24iIHR5cGU9IkVPcGVyYXRpb24iIGlzT3JkZXJlZD0idHJ1ZSIgaXNSZWFkT25seT0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZVBhcmFtZXRlcnNfZU9wZXJhdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVBhcmFtZXRlci1lT3BlcmF0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFUmVmZXJlbmNlIiBuYW1lPSJFUmVmZXJlbmNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFUmVmZXJlbmNlLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFUmVmZXJlbmNlLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZS1fZGV0YWlscy4wIiBrZXk9ImNvbnN0cmFpbnRzIiB2YWx1ZT0iQ29uc2lzdGVudE9wcG9zaXRlIFNpbmdsZUNvbnRhaW5lciBDb25zaXN0ZW50S2V5cyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFUmVmZXJlbmNlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFU3RydWN0dXJhbEZlYXR1cmUiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVSZWZlcmVuY2UtY29udGFpbm1lbnQiIG5hbWU9ImNvbnRhaW5tZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVCb29sZWFuIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVSZWZlcmVuY2UtY29udGFpbm1lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFUmVmZXJlbmNlLWNvbnRhaW5lciIgbmFtZT0iY29udGFpbmVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVCb29sZWFuIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVJlZmVyZW5jZS1jb250YWluZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFUmVmZXJlbmNlLXJlc29sdmVQcm94aWVzIiBuYW1lPSJyZXNvbHZlUHJveGllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFQm9vbGVhbiIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFUmVmZXJlbmNlLXJlc29sdmVQcm94aWVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVJlZmVyZW5jZS1lT3Bwb3NpdGUiIG5hbWU9ImVPcHBvc2l0ZSIgdHlwZT0iRVJlZmVyZW5jZSIgaXNPcmRlcmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9lT3Bwb3NpdGVfZVJlZmVyZW5jZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVJlZmVyZW5jZS1lT3Bwb3NpdGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFUmVmZXJlbmNlLWVSZWZlcmVuY2VUeXBlIiBuYW1lPSJlUmVmZXJlbmNlVHlwZSIgdHlwZT0iRUNsYXNzIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZVJlZmVyZW5jZVR5cGVfZVJlZmVyZW5jZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVJlZmVyZW5jZS1lS2V5cyIgbmFtZT0iZUtleXMiIHR5cGU9IkVBdHRyaWJ1dGUiIGlzT3JkZXJlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZUtleXNfZVJlZmVyZW5jZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVJlZmVyZW5jZS1lS2V5cy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVSZWZlcmVuY2UtZUtleXMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgbmFtZT0iRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkta2V5IiBuYW1lPSJrZXkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iRVN0cmluZyIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeS1rZXktX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeS12YWx1ZSIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iRVN0cmluZyIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeS12YWx1ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlIiBuYW1lPSJFU3RydWN0dXJhbEZlYXR1cmUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFVHlwZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFU3RydWN0dXJhbEZlYXR1cmUtZUNvbnRhaW5pbmdDbGFzcyIgbmFtZT0iZUNvbnRhaW5pbmdDbGFzcyIgdHlwZT0iRUNsYXNzIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGFzc29jaWF0aW9uPSJBX2VTdHJ1Y3R1cmFsRmVhdHVyZXNfZUNvbnRhaW5pbmdDbGFzcyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLWVDb250YWluaW5nQ2xhc3MtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFU3RydWN0dXJhbEZlYXR1cmUtY2hhbmdlYWJsZSIgbmFtZT0iY2hhbmdlYWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFQm9vbGVhbiIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFU3RydWN0dXJhbEZlYXR1cmUtY2hhbmdlYWJsZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVTdHJ1Y3R1cmFsRmVhdHVyZS12b2xhdGlsZSIgbmFtZT0idm9sYXRpbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iRUJvb2xlYW4iIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLXZvbGF0aWxlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLXRyYW5zaWVudCIgbmFtZT0idHJhbnNpZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVCb29sZWFuIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVTdHJ1Y3R1cmFsRmVhdHVyZS10cmFuc2llbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFU3RydWN0dXJhbEZlYXR1cmUtZGVmYXVsdFZhbHVlTGl0ZXJhbCIgbmFtZT0iZGVmYXVsdFZhbHVlTGl0ZXJhbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFU3RyaW5nIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVTdHJ1Y3R1cmFsRmVhdHVyZS1kZWZhdWx0VmFsdWVMaXRlcmFsLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLWRlZmF1bHRWYWx1ZSIgbmFtZT0iZGVmYXVsdFZhbHVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVKYXZhT2JqZWN0IiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLWRlZmF1bHRWYWx1ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVTdHJ1Y3R1cmFsRmVhdHVyZS11bnNldHRhYmxlIiBuYW1lPSJ1bnNldHRhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVCb29sZWFuIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVTdHJ1Y3R1cmFsRmVhdHVyZS11bnNldHRhYmxlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLWRlcml2ZWQiIG5hbWU9ImRlcml2ZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iRUJvb2xlYW4iIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLWRlcml2ZWQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFU3RydWN0dXJhbEZlYXR1cmUtZ2V0RmVhdHVyZUlEIiBuYW1lPSJnZXRGZWF0dXJlSUQiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVTdHJ1Y3R1cmFsRmVhdHVyZS1nZXRGZWF0dXJlSUQtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkVJbnQiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLWdldEZlYXR1cmVJRC1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVTdHJ1Y3R1cmFsRmVhdHVyZS1nZXRDb250YWluZXJDbGFzcyIgbmFtZT0iZ2V0Q29udGFpbmVyQ2xhc3MiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVTdHJ1Y3R1cmFsRmVhdHVyZS1nZXRDb250YWluZXJDbGFzcy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRVN0cnVjdHVyYWxGZWF0dXJlLUVKYXZhQ2xhc3NfV2lsZGNhcmQiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLWdldENvbnRhaW5lckNsYXNzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG5lc3RlZENsYXNzaWZpZXIgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFU3RydWN0dXJhbEZlYXR1cmUtV2lsZGNhcmQiIG5hbWU9IldpbGRjYXJkIi8+Ci0gICAgICA8bmVzdGVkQ2xhc3NpZmllciB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLUVKYXZhQ2xhc3NfV2lsZGNhcmQiIG5hbWU9IkVKYXZhQ2xhc3NfV2lsZGNhcmQiPgotICAgICAgICA8dGVtcGxhdGVCaW5kaW5nIHhtaTppZD0iRVN0cnVjdHVyYWxGZWF0dXJlLUVKYXZhQ2xhc3NfV2lsZGNhcmQtX3RlbXBsYXRlQmluZGluZy4wIiBzaWduYXR1cmU9IkVKYXZhQ2xhc3MtX293bmVkVGVtcGxhdGVTaWduYXR1cmUiPgotICAgICAgICAgIDxwYXJhbWV0ZXJTdWJzdGl0dXRpb24geG1pOmlkPSJFU3RydWN0dXJhbEZlYXR1cmUtRUphdmFDbGFzc19XaWxkY2FyZC1fdGVtcGxhdGVCaW5kaW5nLjAtX3BhcmFtZXRlclN1YnN0aXR1dGlvbi4wIiBhY3R1YWw9IkVTdHJ1Y3R1cmFsRmVhdHVyZS1XaWxkY2FyZCIgZm9ybWFsPSJFSmF2YUNsYXNzLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlLV9vd25lZFBhcmFtZXRlci4wIi8+Ci0gICAgICAgIDwvdGVtcGxhdGVCaW5kaW5nPgotICAgICAgPC9uZXN0ZWRDbGFzc2lmaWVyPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFVHlwZWRFbGVtZW50IiBuYW1lPSJFVHlwZWRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFVHlwZWRFbGVtZW50LV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFVHlwZWRFbGVtZW50LV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZFY29yZS1fZGV0YWlscy4wIiBrZXk9ImNvbnN0cmFpbnRzIiB2YWx1ZT0iVmFsaWRMb3dlckJvdW5kIFZhbGlkVXBwZXJCb3VuZCBDb25zaXN0ZW50Qm91bmRzIFZhbGlkVHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFVHlwZWRFbGVtZW50LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFTmFtZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFVHlwZWRFbGVtZW50LW9yZGVyZWQiIG5hbWU9Im9yZGVyZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iRUJvb2xlYW4iIGlzT3JkZXJlZD0idHJ1ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVR5cGVkRWxlbWVudC1vcmRlcmVkLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVR5cGVkRWxlbWVudC11bmlxdWUiIG5hbWU9InVuaXF1ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFQm9vbGVhbiIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFVHlwZWRFbGVtZW50LXVuaXF1ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtbG93ZXJCb3VuZCIgbmFtZT0ibG93ZXJCb3VuZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFSW50IiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtbG93ZXJCb3VuZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtdXBwZXJCb3VuZCIgbmFtZT0idXBwZXJCb3VuZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFSW50IiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtdXBwZXJCb3VuZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtbWFueSIgbmFtZT0ibWFueSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJFQm9vbGVhbiIgaXNPcmRlcmVkPSJ0cnVlIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtbWFueS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtcmVxdWlyZWQiIG5hbWU9InJlcXVpcmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9IkVCb29sZWFuIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVR5cGVkRWxlbWVudC1yZXF1aXJlZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtZVR5cGUiIG5hbWU9ImVUeXBlIiB0eXBlPSJFQ2xhc3NpZmllciIgaXNPcmRlcmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9lVHlwZV9lVHlwZWRFbGVtZW50Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtZVR5cGUtX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZlbWYyRjIwMDIyRkdlbk1vZGVsIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRVR5cGVkRWxlbWVudC1lVHlwZS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGR2VuTW9kZWwtX2RldGFpbHMuMCIga2V5PSJzdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRVR5cGVkRWxlbWVudC1lVHlwZS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGR2VuTW9kZWwtX2RldGFpbHMuMSIga2V5PSJzdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFVHlwZWRFbGVtZW50LWVUeXBlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRVR5cGVkRWxlbWVudC1lR2VuZXJpY1R5cGUiIG5hbWU9ImVHZW5lcmljVHlwZSIgdHlwZT0iRUdlbmVyaWNUeXBlIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJBX2VHZW5lcmljVHlwZV9lVHlwZWRFbGVtZW50Ij4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtZUdlbmVyaWNUeXBlLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZHZW5Nb2RlbCIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVUeXBlZEVsZW1lbnQtZUdlbmVyaWNUeXBlLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGZW1mMkYyMDAyMkZHZW5Nb2RlbC1fZGV0YWlscy4wIiBrZXk9InN1cHByZXNzZWRVbnNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFVHlwZWRFbGVtZW50LWVHZW5lcmljVHlwZS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRmVtZjJGMjAwMjJGR2VuTW9kZWwtX2RldGFpbHMuMSIga2V5PSJzdXBwcmVzc2VkSXNTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFVHlwZWRFbGVtZW50LWVHZW5lcmljVHlwZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRVR5cGVQYXJhbWV0ZXIiIG5hbWU9IkVUeXBlUGFyYW1ldGVyIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkVUeXBlUGFyYW1ldGVyLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFTmFtZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFVHlwZVBhcmFtZXRlci1lQm91bmRzIiBuYW1lPSJlQm91bmRzIiB0eXBlPSJFR2VuZXJpY1R5cGUiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFfZUJvdW5kc19lVHlwZVBhcmFtZXRlciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRVR5cGVQYXJhbWV0ZXItZUJvdW5kcy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVUeXBlUGFyYW1ldGVyLWVCb3VuZHMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VQYWNrYWdlX2VGYWN0b3J5SW5zdGFuY2UiIG5hbWU9IkFfZVBhY2thZ2VfZUZhY3RvcnlJbnN0YW5jZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFRmFjdG9yeS1lUGFja2FnZSBFUGFja2FnZS1lRmFjdG9yeUluc3RhbmNlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZUNsYXNzaWZpZXJzX2VQYWNrYWdlIiBuYW1lPSJBX2VDbGFzc2lmaWVyc19lUGFja2FnZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFUGFja2FnZS1lQ2xhc3NpZmllcnMgRUNsYXNzaWZpZXItZVBhY2thZ2UiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lU3VicGFja2FnZXNfZVN1cGVyUGFja2FnZSIgbmFtZT0iQV9lU3VicGFja2FnZXNfZVN1cGVyUGFja2FnZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFUGFja2FnZS1lU3VicGFja2FnZXMgRVBhY2thZ2UtZVN1cGVyUGFja2FnZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VVcHBlckJvdW5kX2VHZW5lcmljVHlwZSIgbmFtZT0iQV9lVXBwZXJCb3VuZF9lR2VuZXJpY1R5cGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRUdlbmVyaWNUeXBlLWVVcHBlckJvdW5kIEFfZVVwcGVyQm91bmRfZUdlbmVyaWNUeXBlLWVHZW5lcmljVHlwZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VVcHBlckJvdW5kX2VHZW5lcmljVHlwZS1lR2VuZXJpY1R5cGUiIG5hbWU9ImVHZW5lcmljVHlwZSIgdHlwZT0iRUdlbmVyaWNUeXBlIiBhc3NvY2lhdGlvbj0iQV9lVXBwZXJCb3VuZF9lR2VuZXJpY1R5cGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lVHlwZUFyZ3VtZW50c19lR2VuZXJpY1R5cGUiIG5hbWU9IkFfZVR5cGVBcmd1bWVudHNfZUdlbmVyaWNUeXBlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVHZW5lcmljVHlwZS1lVHlwZUFyZ3VtZW50cyBBX2VUeXBlQXJndW1lbnRzX2VHZW5lcmljVHlwZS1lR2VuZXJpY1R5cGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lVHlwZUFyZ3VtZW50c19lR2VuZXJpY1R5cGUtZUdlbmVyaWNUeXBlIiBuYW1lPSJlR2VuZXJpY1R5cGUiIHR5cGU9IkVHZW5lcmljVHlwZSIgYXNzb2NpYXRpb249IkFfZVR5cGVBcmd1bWVudHNfZUdlbmVyaWNUeXBlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZVJhd1R5cGVfZUdlbmVyaWNUeXBlIiBuYW1lPSJBX2VSYXdUeXBlX2VHZW5lcmljVHlwZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFR2VuZXJpY1R5cGUtZVJhd1R5cGUgQV9lUmF3VHlwZV9lR2VuZXJpY1R5cGUtZUdlbmVyaWNUeXBlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZVJhd1R5cGVfZUdlbmVyaWNUeXBlLWVHZW5lcmljVHlwZSIgbmFtZT0iZUdlbmVyaWNUeXBlIiB0eXBlPSJFR2VuZXJpY1R5cGUiIGFzc29jaWF0aW9uPSJBX2VSYXdUeXBlX2VHZW5lcmljVHlwZSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VMb3dlckJvdW5kX2VHZW5lcmljVHlwZSIgbmFtZT0iQV9lTG93ZXJCb3VuZF9lR2VuZXJpY1R5cGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRUdlbmVyaWNUeXBlLWVMb3dlckJvdW5kIEFfZUxvd2VyQm91bmRfZUdlbmVyaWNUeXBlLWVHZW5lcmljVHlwZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VMb3dlckJvdW5kX2VHZW5lcmljVHlwZS1lR2VuZXJpY1R5cGUiIG5hbWU9ImVHZW5lcmljVHlwZSIgdHlwZT0iRUdlbmVyaWNUeXBlIiBhc3NvY2lhdGlvbj0iQV9lTG93ZXJCb3VuZF9lR2VuZXJpY1R5cGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lVHlwZVBhcmFtZXRlcl9lR2VuZXJpY1R5cGUiIG5hbWU9IkFfZVR5cGVQYXJhbWV0ZXJfZUdlbmVyaWNUeXBlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVHZW5lcmljVHlwZS1lVHlwZVBhcmFtZXRlciBBX2VUeXBlUGFyYW1ldGVyX2VHZW5lcmljVHlwZS1lR2VuZXJpY1R5cGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lVHlwZVBhcmFtZXRlcl9lR2VuZXJpY1R5cGUtZUdlbmVyaWNUeXBlIiBuYW1lPSJlR2VuZXJpY1R5cGUiIHR5cGU9IkVHZW5lcmljVHlwZSIgYXNzb2NpYXRpb249IkFfZVR5cGVQYXJhbWV0ZXJfZUdlbmVyaWNUeXBlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZUNsYXNzaWZpZXJfZUdlbmVyaWNUeXBlIiBuYW1lPSJBX2VDbGFzc2lmaWVyX2VHZW5lcmljVHlwZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFR2VuZXJpY1R5cGUtZUNsYXNzaWZpZXIgQV9lQ2xhc3NpZmllcl9lR2VuZXJpY1R5cGUtZUdlbmVyaWNUeXBlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZUNsYXNzaWZpZXJfZUdlbmVyaWNUeXBlLWVHZW5lcmljVHlwZSIgbmFtZT0iZUdlbmVyaWNUeXBlIiB0eXBlPSJFR2VuZXJpY1R5cGUiIGFzc29jaWF0aW9uPSJBX2VDbGFzc2lmaWVyX2VHZW5lcmljVHlwZSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VCb3VuZHNfZVR5cGVQYXJhbWV0ZXIiIG5hbWU9IkFfZUJvdW5kc19lVHlwZVBhcmFtZXRlciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFVHlwZVBhcmFtZXRlci1lQm91bmRzIEFfZUJvdW5kc19lVHlwZVBhcmFtZXRlci1lVHlwZVBhcmFtZXRlciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VCb3VuZHNfZVR5cGVQYXJhbWV0ZXItZVR5cGVQYXJhbWV0ZXIiIG5hbWU9ImVUeXBlUGFyYW1ldGVyIiB0eXBlPSJFVHlwZVBhcmFtZXRlciIgYXNzb2NpYXRpb249IkFfZUJvdW5kc19lVHlwZVBhcmFtZXRlciIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VUeXBlUGFyYW1ldGVyc19lQ2xhc3NpZmllciIgbmFtZT0iQV9lVHlwZVBhcmFtZXRlcnNfZUNsYXNzaWZpZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRUNsYXNzaWZpZXItZVR5cGVQYXJhbWV0ZXJzIEFfZVR5cGVQYXJhbWV0ZXJzX2VDbGFzc2lmaWVyLWVDbGFzc2lmaWVyIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZVR5cGVQYXJhbWV0ZXJzX2VDbGFzc2lmaWVyLWVDbGFzc2lmaWVyIiBuYW1lPSJlQ2xhc3NpZmllciIgdHlwZT0iRUNsYXNzaWZpZXIiIGFzc29jaWF0aW9uPSJBX2VUeXBlUGFyYW1ldGVyc19lQ2xhc3NpZmllciIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VTdXBlclR5cGVzX2VDbGFzcyIgbmFtZT0iQV9lU3VwZXJUeXBlc19lQ2xhc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRUNsYXNzLWVTdXBlclR5cGVzIEFfZVN1cGVyVHlwZXNfZUNsYXNzLWVDbGFzcyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VTdXBlclR5cGVzX2VDbGFzcy1lQ2xhc3MiIG5hbWU9ImVDbGFzcyIgdHlwZT0iRUNsYXNzIiBhc3NvY2lhdGlvbj0iQV9lU3VwZXJUeXBlc19lQ2xhc3MiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lT3BlcmF0aW9uc19lQ29udGFpbmluZ0NsYXNzIiBuYW1lPSJBX2VPcGVyYXRpb25zX2VDb250YWluaW5nQ2xhc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRUNsYXNzLWVPcGVyYXRpb25zIEVPcGVyYXRpb24tZUNvbnRhaW5pbmdDbGFzcyIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VUeXBlUGFyYW1ldGVyc19lT3BlcmF0aW9uIiBuYW1lPSJBX2VUeXBlUGFyYW1ldGVyc19lT3BlcmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVPcGVyYXRpb24tZVR5cGVQYXJhbWV0ZXJzIEFfZVR5cGVQYXJhbWV0ZXJzX2VPcGVyYXRpb24tZU9wZXJhdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VUeXBlUGFyYW1ldGVyc19lT3BlcmF0aW9uLWVPcGVyYXRpb24iIG5hbWU9ImVPcGVyYXRpb24iIHR5cGU9IkVPcGVyYXRpb24iIGFzc29jaWF0aW9uPSJBX2VUeXBlUGFyYW1ldGVyc19lT3BlcmF0aW9uIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZVBhcmFtZXRlcnNfZU9wZXJhdGlvbiIgbmFtZT0iQV9lUGFyYW1ldGVyc19lT3BlcmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVPcGVyYXRpb24tZVBhcmFtZXRlcnMgRVBhcmFtZXRlci1lT3BlcmF0aW9uIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZUV4Y2VwdGlvbnNfZU9wZXJhdGlvbiIgbmFtZT0iQV9lRXhjZXB0aW9uc19lT3BlcmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVPcGVyYXRpb24tZUV4Y2VwdGlvbnMgQV9lRXhjZXB0aW9uc19lT3BlcmF0aW9uLWVPcGVyYXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lRXhjZXB0aW9uc19lT3BlcmF0aW9uLWVPcGVyYXRpb24iIG5hbWU9ImVPcGVyYXRpb24iIHR5cGU9IkVPcGVyYXRpb24iIGFzc29jaWF0aW9uPSJBX2VFeGNlcHRpb25zX2VPcGVyYXRpb24iLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lR2VuZXJpY0V4Y2VwdGlvbnNfZU9wZXJhdGlvbiIgbmFtZT0iQV9lR2VuZXJpY0V4Y2VwdGlvbnNfZU9wZXJhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFT3BlcmF0aW9uLWVHZW5lcmljRXhjZXB0aW9ucyBBX2VHZW5lcmljRXhjZXB0aW9uc19lT3BlcmF0aW9uLWVPcGVyYXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lR2VuZXJpY0V4Y2VwdGlvbnNfZU9wZXJhdGlvbi1lT3BlcmF0aW9uIiBuYW1lPSJlT3BlcmF0aW9uIiB0eXBlPSJFT3BlcmF0aW9uIiBhc3NvY2lhdGlvbj0iQV9lR2VuZXJpY0V4Y2VwdGlvbnNfZU9wZXJhdGlvbiIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VBbGxBdHRyaWJ1dGVzX2VDbGFzcyIgbmFtZT0iQV9lQWxsQXR0cmlidXRlc19lQ2xhc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRUNsYXNzLWVBbGxBdHRyaWJ1dGVzIEFfZUFsbEF0dHJpYnV0ZXNfZUNsYXNzLWVDbGFzcyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VBbGxBdHRyaWJ1dGVzX2VDbGFzcy1lQ2xhc3MiIG5hbWU9ImVDbGFzcyIgdHlwZT0iRUNsYXNzIiBhc3NvY2lhdGlvbj0iQV9lQWxsQXR0cmlidXRlc19lQ2xhc3MiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lT3Bwb3NpdGVfZVJlZmVyZW5jZSIgbmFtZT0iQV9lT3Bwb3NpdGVfZVJlZmVyZW5jZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFUmVmZXJlbmNlLWVPcHBvc2l0ZSBBX2VPcHBvc2l0ZV9lUmVmZXJlbmNlLWVSZWZlcmVuY2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lT3Bwb3NpdGVfZVJlZmVyZW5jZS1lUmVmZXJlbmNlIiBuYW1lPSJlUmVmZXJlbmNlIiB0eXBlPSJFUmVmZXJlbmNlIiBhc3NvY2lhdGlvbj0iQV9lT3Bwb3NpdGVfZVJlZmVyZW5jZSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VSZWZlcmVuY2VUeXBlX2VSZWZlcmVuY2UiIG5hbWU9IkFfZVJlZmVyZW5jZVR5cGVfZVJlZmVyZW5jZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFUmVmZXJlbmNlLWVSZWZlcmVuY2VUeXBlIEFfZVJlZmVyZW5jZVR5cGVfZVJlZmVyZW5jZS1lUmVmZXJlbmNlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZVJlZmVyZW5jZVR5cGVfZVJlZmVyZW5jZS1lUmVmZXJlbmNlIiBuYW1lPSJlUmVmZXJlbmNlIiB0eXBlPSJFUmVmZXJlbmNlIiBhc3NvY2lhdGlvbj0iQV9lUmVmZXJlbmNlVHlwZV9lUmVmZXJlbmNlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZUtleXNfZVJlZmVyZW5jZSIgbmFtZT0iQV9lS2V5c19lUmVmZXJlbmNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVSZWZlcmVuY2UtZUtleXMgQV9lS2V5c19lUmVmZXJlbmNlLWVSZWZlcmVuY2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lS2V5c19lUmVmZXJlbmNlLWVSZWZlcmVuY2UiIG5hbWU9ImVSZWZlcmVuY2UiIHR5cGU9IkVSZWZlcmVuY2UiIGFzc29jaWF0aW9uPSJBX2VLZXlzX2VSZWZlcmVuY2UiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lQWxsUmVmZXJlbmNlc19lQ2xhc3MiIG5hbWU9IkFfZUFsbFJlZmVyZW5jZXNfZUNsYXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVDbGFzcy1lQWxsUmVmZXJlbmNlcyBBX2VBbGxSZWZlcmVuY2VzX2VDbGFzcy1lQ2xhc3MiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lQWxsUmVmZXJlbmNlc19lQ2xhc3MtZUNsYXNzIiBuYW1lPSJlQ2xhc3MiIHR5cGU9IkVDbGFzcyIgYXNzb2NpYXRpb249IkFfZUFsbFJlZmVyZW5jZXNfZUNsYXNzIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZVJlZmVyZW5jZXNfZUNsYXNzIiBuYW1lPSJBX2VSZWZlcmVuY2VzX2VDbGFzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFQ2xhc3MtZVJlZmVyZW5jZXMgQV9lUmVmZXJlbmNlc19lQ2xhc3MtZUNsYXNzIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZVJlZmVyZW5jZXNfZUNsYXNzLWVDbGFzcyIgbmFtZT0iZUNsYXNzIiB0eXBlPSJFQ2xhc3MiIGFzc29jaWF0aW9uPSJBX2VSZWZlcmVuY2VzX2VDbGFzcyIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VBdHRyaWJ1dGVzX2VDbGFzcyIgbmFtZT0iQV9lQXR0cmlidXRlc19lQ2xhc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRUNsYXNzLWVBdHRyaWJ1dGVzIEFfZUF0dHJpYnV0ZXNfZUNsYXNzLWVDbGFzcyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VBdHRyaWJ1dGVzX2VDbGFzcy1lQ2xhc3MiIG5hbWU9ImVDbGFzcyIgdHlwZT0iRUNsYXNzIiBhc3NvY2lhdGlvbj0iQV9lQXR0cmlidXRlc19lQ2xhc3MiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lQWxsQ29udGFpbm1lbnRzX2VDbGFzcyIgbmFtZT0iQV9lQWxsQ29udGFpbm1lbnRzX2VDbGFzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFQ2xhc3MtZUFsbENvbnRhaW5tZW50cyBBX2VBbGxDb250YWlubWVudHNfZUNsYXNzLWVDbGFzcyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VBbGxDb250YWlubWVudHNfZUNsYXNzLWVDbGFzcyIgbmFtZT0iZUNsYXNzIiB0eXBlPSJFQ2xhc3MiIGFzc29jaWF0aW9uPSJBX2VBbGxDb250YWlubWVudHNfZUNsYXNzIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZUFsbE9wZXJhdGlvbnNfZUNsYXNzIiBuYW1lPSJBX2VBbGxPcGVyYXRpb25zX2VDbGFzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFQ2xhc3MtZUFsbE9wZXJhdGlvbnMgQV9lQWxsT3BlcmF0aW9uc19lQ2xhc3MtZUNsYXNzIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZUFsbE9wZXJhdGlvbnNfZUNsYXNzLWVDbGFzcyIgbmFtZT0iZUNsYXNzIiB0eXBlPSJFQ2xhc3MiIGFzc29jaWF0aW9uPSJBX2VBbGxPcGVyYXRpb25zX2VDbGFzcyIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VBbGxTdHJ1Y3R1cmFsRmVhdHVyZXNfZUNsYXNzIiBuYW1lPSJBX2VBbGxTdHJ1Y3R1cmFsRmVhdHVyZXNfZUNsYXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVDbGFzcy1lQWxsU3RydWN0dXJhbEZlYXR1cmVzIEFfZUFsbFN0cnVjdHVyYWxGZWF0dXJlc19lQ2xhc3MtZUNsYXNzIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZUFsbFN0cnVjdHVyYWxGZWF0dXJlc19lQ2xhc3MtZUNsYXNzIiBuYW1lPSJlQ2xhc3MiIHR5cGU9IkVDbGFzcyIgYXNzb2NpYXRpb249IkFfZUFsbFN0cnVjdHVyYWxGZWF0dXJlc19lQ2xhc3MiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lQWxsU3VwZXJUeXBlc19lQ2xhc3MiIG5hbWU9IkFfZUFsbFN1cGVyVHlwZXNfZUNsYXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVDbGFzcy1lQWxsU3VwZXJUeXBlcyBBX2VBbGxTdXBlclR5cGVzX2VDbGFzcy1lQ2xhc3MiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lQWxsU3VwZXJUeXBlc19lQ2xhc3MtZUNsYXNzIiBuYW1lPSJlQ2xhc3MiIHR5cGU9IkVDbGFzcyIgYXNzb2NpYXRpb249IkFfZUFsbFN1cGVyVHlwZXNfZUNsYXNzIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZUlEQXR0cmlidXRlX2VDbGFzcyIgbmFtZT0iQV9lSURBdHRyaWJ1dGVfZUNsYXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVDbGFzcy1lSURBdHRyaWJ1dGUgQV9lSURBdHRyaWJ1dGVfZUNsYXNzLWVDbGFzcyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VJREF0dHJpYnV0ZV9lQ2xhc3MtZUNsYXNzIiBuYW1lPSJlQ2xhc3MiIHR5cGU9IkVDbGFzcyIgYXNzb2NpYXRpb249IkFfZUlEQXR0cmlidXRlX2VDbGFzcyIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VTdHJ1Y3R1cmFsRmVhdHVyZXNfZUNvbnRhaW5pbmdDbGFzcyIgbmFtZT0iQV9lU3RydWN0dXJhbEZlYXR1cmVzX2VDb250YWluaW5nQ2xhc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRUNsYXNzLWVTdHJ1Y3R1cmFsRmVhdHVyZXMgRVN0cnVjdHVyYWxGZWF0dXJlLWVDb250YWluaW5nQ2xhc3MiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lR2VuZXJpY1N1cGVyVHlwZXNfZUNsYXNzIiBuYW1lPSJBX2VHZW5lcmljU3VwZXJUeXBlc19lQ2xhc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRUNsYXNzLWVHZW5lcmljU3VwZXJUeXBlcyBBX2VHZW5lcmljU3VwZXJUeXBlc19lQ2xhc3MtZUNsYXNzIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZUdlbmVyaWNTdXBlclR5cGVzX2VDbGFzcy1lQ2xhc3MiIG5hbWU9ImVDbGFzcyIgdHlwZT0iRUNsYXNzIiBhc3NvY2lhdGlvbj0iQV9lR2VuZXJpY1N1cGVyVHlwZXNfZUNsYXNzIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZUFsbEdlbmVyaWNTdXBlclR5cGVzX2VDbGFzcyIgbmFtZT0iQV9lQWxsR2VuZXJpY1N1cGVyVHlwZXNfZUNsYXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVDbGFzcy1lQWxsR2VuZXJpY1N1cGVyVHlwZXMgQV9lQWxsR2VuZXJpY1N1cGVyVHlwZXNfZUNsYXNzLWVDbGFzcyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VBbGxHZW5lcmljU3VwZXJUeXBlc19lQ2xhc3MtZUNsYXNzIiBuYW1lPSJlQ2xhc3MiIHR5cGU9IkVDbGFzcyIgYXNzb2NpYXRpb249IkFfZUFsbEdlbmVyaWNTdXBlclR5cGVzX2VDbGFzcyIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2RldGFpbHNfZUFubm90YXRpb24iIG5hbWU9IkFfZGV0YWlsc19lQW5ub3RhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFQW5ub3RhdGlvbi1kZXRhaWxzIEFfZGV0YWlsc19lQW5ub3RhdGlvbi1lQW5ub3RhdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2RldGFpbHNfZUFubm90YXRpb24tZUFubm90YXRpb24iIG5hbWU9ImVBbm5vdGF0aW9uIiB0eXBlPSJFQW5ub3RhdGlvbiIgYXNzb2NpYXRpb249IkFfZGV0YWlsc19lQW5ub3RhdGlvbiIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VBbm5vdGF0aW9uc19lTW9kZWxFbGVtZW50IiBuYW1lPSJBX2VBbm5vdGF0aW9uc19lTW9kZWxFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVNb2RlbEVsZW1lbnQtZUFubm90YXRpb25zIEVBbm5vdGF0aW9uLWVNb2RlbEVsZW1lbnQiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jb250ZW50c19lQW5ub3RhdGlvbiIgbmFtZT0iQV9jb250ZW50c19lQW5ub3RhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFQW5ub3RhdGlvbi1jb250ZW50cyBBX2NvbnRlbnRzX2VBbm5vdGF0aW9uLWVBbm5vdGF0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfY29udGVudHNfZUFubm90YXRpb24tZUFubm90YXRpb24iIG5hbWU9ImVBbm5vdGF0aW9uIiB0eXBlPSJFQW5ub3RhdGlvbiIgYXNzb2NpYXRpb249IkFfY29udGVudHNfZUFubm90YXRpb24iLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZWZlcmVuY2VzX2VBbm5vdGF0aW9uIiBuYW1lPSJBX3JlZmVyZW5jZXNfZUFubm90YXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRUFubm90YXRpb24tcmVmZXJlbmNlcyBBX3JlZmVyZW5jZXNfZUFubm90YXRpb24tZUFubm90YXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZWZlcmVuY2VzX2VBbm5vdGF0aW9uLWVBbm5vdGF0aW9uIiBuYW1lPSJlQW5ub3RhdGlvbiIgdHlwZT0iRUFubm90YXRpb24iIGFzc29jaWF0aW9uPSJBX3JlZmVyZW5jZXNfZUFubm90YXRpb24iLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lVHlwZV9lVHlwZWRFbGVtZW50IiBuYW1lPSJBX2VUeXBlX2VUeXBlZEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRVR5cGVkRWxlbWVudC1lVHlwZSBBX2VUeXBlX2VUeXBlZEVsZW1lbnQtZVR5cGVkRWxlbWVudCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VUeXBlX2VUeXBlZEVsZW1lbnQtZVR5cGVkRWxlbWVudCIgbmFtZT0iZVR5cGVkRWxlbWVudCIgdHlwZT0iRVR5cGVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfZVR5cGVfZVR5cGVkRWxlbWVudCIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VHZW5lcmljVHlwZV9lVHlwZWRFbGVtZW50IiBuYW1lPSJBX2VHZW5lcmljVHlwZV9lVHlwZWRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVUeXBlZEVsZW1lbnQtZUdlbmVyaWNUeXBlIEFfZUdlbmVyaWNUeXBlX2VUeXBlZEVsZW1lbnQtZVR5cGVkRWxlbWVudCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VHZW5lcmljVHlwZV9lVHlwZWRFbGVtZW50LWVUeXBlZEVsZW1lbnQiIG5hbWU9ImVUeXBlZEVsZW1lbnQiIHR5cGU9IkVUeXBlZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2VHZW5lcmljVHlwZV9lVHlwZWRFbGVtZW50Ii8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZUF0dHJpYnV0ZVR5cGVfZUF0dHJpYnV0ZSIgbmFtZT0iQV9lQXR0cmlidXRlVHlwZV9lQXR0cmlidXRlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVBdHRyaWJ1dGUtZUF0dHJpYnV0ZVR5cGUgQV9lQXR0cmlidXRlVHlwZV9lQXR0cmlidXRlLWVBdHRyaWJ1dGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lQXR0cmlidXRlVHlwZV9lQXR0cmlidXRlLWVBdHRyaWJ1dGUiIG5hbWU9ImVBdHRyaWJ1dGUiIHR5cGU9IkVBdHRyaWJ1dGUiIGFzc29jaWF0aW9uPSJBX2VBdHRyaWJ1dGVUeXBlX2VBdHRyaWJ1dGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lTGl0ZXJhbHNfZUVudW0iIG5hbWU9IkFfZUxpdGVyYWxzX2VFbnVtIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkVFbnVtLWVMaXRlcmFscyBFRW51bUxpdGVyYWwtZUVudW0iLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFQmlnRGVjaW1hbCIgbmFtZT0iRUJpZ0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVCaWdEZWNpbWFsLV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhIiBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRUJpZ0RlY2ltYWwtX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEtX2RldGFpbHMuMCIga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWwiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVCaWdJbnRlZ2VyIiBuYW1lPSJFQmlnSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRUJpZ0ludGVnZXItX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEiIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFQmlnSW50ZWdlci1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YS1fZGV0YWlscy4wIiBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50ZWdlciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUJvb2xlYW4iIG5hbWU9IkVCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFQm9vbGVhbi1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YSIgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVCb29sZWFuLV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjAiIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFQm9vbGVhbk9iamVjdCIgbmFtZT0iRUJvb2xlYW5PYmplY3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVCb29sZWFuT2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhIiBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRUJvb2xlYW5PYmplY3QtX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEtX2RldGFpbHMuMCIga2V5PSJuYW1lIiB2YWx1ZT0iRUJvb2xlYW46T2JqZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRUJvb2xlYW5PYmplY3QtX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEtX2RldGFpbHMuMSIga2V5PSJiYXNlVHlwZSIgdmFsdWU9IkVCb29sZWFuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkVCb29sZWFuT2JqZWN0LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFQm9vbGVhbiIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVCeXRlIiBuYW1lPSJFQnl0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRUJ5dGUtX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEiIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFQnl0ZS1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YS1fZGV0YWlscy4wIiBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYnl0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUJ5dGVBcnJheSIgbmFtZT0iRUJ5dGVBcnJheSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRUJ5dGVBcnJheS1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YSIgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVCeXRlQXJyYXktX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEtX2RldGFpbHMuMCIga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2hleEJpbmFyeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUJ5dGVPYmplY3QiIG5hbWU9IkVCeXRlT2JqZWN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFQnl0ZU9iamVjdC1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YSIgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVCeXRlT2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjAiIGtleT0ibmFtZSIgdmFsdWU9IkVCeXRlOk9iamVjdCIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVCeXRlT2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjEiIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJFQnl0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFQnl0ZU9iamVjdC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRUJ5dGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFQ2hhciIgbmFtZT0iRUNoYXIiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFQ2hhcmFjdGVyT2JqZWN0IiBuYW1lPSJFQ2hhcmFjdGVyT2JqZWN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFQ2hhcmFjdGVyT2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhIiBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRUNoYXJhY3Rlck9iamVjdC1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YS1fZGV0YWlscy4wIiBrZXk9Im5hbWUiIHZhbHVlPSJFQ2hhcjpPYmplY3QiLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFQ2hhcmFjdGVyT2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjEiIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJFQ2hhciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFQ2hhcmFjdGVyT2JqZWN0LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFQ2hhciIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVEYXRlIiBuYW1lPSJFRGF0ZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVEaWFnbm9zdGljQ2hhaW4iIG5hbWU9IkVEaWFnbm9zdGljQ2hhaW4iLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFRG91YmxlIiBuYW1lPSJFRG91YmxlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFRG91YmxlLV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhIiBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRURvdWJsZS1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YS1fZGV0YWlscy4wIiBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZG91YmxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFRG91YmxlT2JqZWN0IiBuYW1lPSJFRG91YmxlT2JqZWN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFRG91YmxlT2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhIiBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRURvdWJsZU9iamVjdC1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YS1fZGV0YWlscy4wIiBrZXk9Im5hbWUiIHZhbHVlPSJFRG91YmxlOk9iamVjdCIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVEb3VibGVPYmplY3QtX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEtX2RldGFpbHMuMSIga2V5PSJiYXNlVHlwZSIgdmFsdWU9IkVEb3VibGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRURvdWJsZU9iamVjdC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRURvdWJsZSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVFTGlzdCIgbmFtZT0iRUVMaXN0Ij4KLSAgICAgIDxvd25lZFRlbXBsYXRlU2lnbmF0dXJlIHhtaTp0eXBlPSJ1bWw6UmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgeG1pOmlkPSJFRUxpc3QtX293bmVkVGVtcGxhdGVTaWduYXR1cmUiIHBhcmFtZXRlcj0iRUVMaXN0LV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlLV9vd25lZFBhcmFtZXRlci4wIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIiB4bWk6aWQ9IkVFTGlzdC1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMCIgcGFyYW1ldGVyZWRFbGVtZW50PSJFRUxpc3QtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50Ij4KLSAgICAgICAgICA8b3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFRUxpc3QtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50IiBuYW1lPSJFIiB0ZW1wbGF0ZVBhcmFtZXRlcj0iRUVMaXN0LV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlLV9vd25lZFBhcmFtZXRlci4wIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkVGVtcGxhdGVTaWduYXR1cmU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUVudW1lcmF0b3IiIG5hbWU9IkVFbnVtZXJhdG9yIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUZlYXR1cmVNYXAiIG5hbWU9IkVGZWF0dXJlTWFwIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUZlYXR1cmVNYXBFbnRyeSIgbmFtZT0iRUZlYXR1cmVNYXBFbnRyeSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVGbG9hdCIgbmFtZT0iRUZsb2F0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFRmxvYXQtX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEiIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFRmxvYXQtX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEtX2RldGFpbHMuMCIga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Zsb2F0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFRmxvYXRPYmplY3QiIG5hbWU9IkVGbG9hdE9iamVjdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRUZsb2F0T2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhIiBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRUZsb2F0T2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjAiIGtleT0ibmFtZSIgdmFsdWU9IkVGbG9hdDpPYmplY3QiLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFRmxvYXRPYmplY3QtX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEtX2RldGFpbHMuMSIga2V5PSJiYXNlVHlwZSIgdmFsdWU9IkVGbG9hdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFRmxvYXRPYmplY3QtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVGbG9hdCIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVJbnQiIG5hbWU9IkVJbnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVJbnQtX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEiIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFSW50LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjAiIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVJbnRlZ2VyT2JqZWN0IiBuYW1lPSJFSW50ZWdlck9iamVjdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRUludGVnZXJPYmplY3QtX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEiIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFSW50ZWdlck9iamVjdC1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YS1fZGV0YWlscy4wIiBrZXk9Im5hbWUiIHZhbHVlPSJFSW50Ok9iamVjdCIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVJbnRlZ2VyT2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjEiIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJFSW50Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkVJbnRlZ2VyT2JqZWN0LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFSW50Ii8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUphdmFDbGFzcyIgbmFtZT0iRUphdmFDbGFzcyI+Ci0gICAgICA8b3duZWRUZW1wbGF0ZVNpZ25hdHVyZSB4bWk6dHlwZT0idW1sOlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiIHhtaTppZD0iRUphdmFDbGFzcy1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZSIgcGFyYW1ldGVyPSJFSmF2YUNsYXNzLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlLV9vd25lZFBhcmFtZXRlci4wIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIiB4bWk6aWQ9IkVKYXZhQ2xhc3MtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAiIHBhcmFtZXRlcmVkRWxlbWVudD0iRUphdmFDbGFzcy1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMC1fb3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQiPgotICAgICAgICAgIDxvd25lZFBhcmFtZXRlcmVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkVKYXZhQ2xhc3MtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50IiBuYW1lPSJUIiB0ZW1wbGF0ZVBhcmFtZXRlcj0iRUphdmFDbGFzcy1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZFRlbXBsYXRlU2lnbmF0dXJlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVKYXZhT2JqZWN0IiBuYW1lPSJFSmF2YU9iamVjdCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVMb25nIiBuYW1lPSJFTG9uZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRUxvbmctX2h0dHAyRjJGMkZvcmcyRmVjbGlwc2UyRmVtZjJGZWNvcmUyRnV0aWwyRkV4dGVuZGVkTWV0YURhdGEiIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOmlkPSJFTG9uZy1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YS1fZGV0YWlscy4wIiBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbG9uZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUxvbmdPYmplY3QiIG5hbWU9IkVMb25nT2JqZWN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFTG9uZ09iamVjdC1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YSIgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVMb25nT2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjAiIGtleT0ibmFtZSIgdmFsdWU9IkVMb25nOk9iamVjdCIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVMb25nT2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjEiIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJFTG9uZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFTG9uZ09iamVjdC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRUxvbmciLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFTWFwIiBuYW1lPSJFTWFwIj4KLSAgICAgIDxvd25lZFRlbXBsYXRlU2lnbmF0dXJlIHhtaTp0eXBlPSJ1bWw6UmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgeG1pOmlkPSJFTWFwLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlIiBwYXJhbWV0ZXI9IkVNYXAtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAgRU1hcC1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6dHlwZT0idW1sOkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlciIgeG1pOmlkPSJFTWFwLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlLV9vd25lZFBhcmFtZXRlci4wIiBwYXJhbWV0ZXJlZEVsZW1lbnQ9IkVNYXAtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50Ij4KLSAgICAgICAgICA8b3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFTWFwLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlLV9vd25lZFBhcmFtZXRlci4wLV9vd25lZFBhcmFtZXRlcmVkRWxlbWVudCIgbmFtZT0iSyIgdGVtcGxhdGVQYXJhbWV0ZXI9IkVNYXAtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTp0eXBlPSJ1bWw6Q2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIiB4bWk6aWQ9IkVNYXAtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjEiIHBhcmFtZXRlcmVkRWxlbWVudD0iRU1hcC1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMS1fb3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQiPgotICAgICAgICAgIDxvd25lZFBhcmFtZXRlcmVkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkVNYXAtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjEtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50IiBuYW1lPSJWIiB0ZW1wbGF0ZVBhcmFtZXRlcj0iRU1hcC1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZFRlbXBsYXRlU2lnbmF0dXJlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9IkVSZXNvdXJjZSIgbmFtZT0iRVJlc291cmNlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRVJlc291cmNlU2V0IiBuYW1lPSJFUmVzb3VyY2VTZXQiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFU2hvcnQiIG5hbWU9IkVTaG9ydCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iRVNob3J0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhIiBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRVNob3J0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjAiIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzaG9ydCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRVNob3J0T2JqZWN0IiBuYW1lPSJFU2hvcnRPYmplY3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9IkVTaG9ydE9iamVjdC1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YSIgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9IkVTaG9ydE9iamVjdC1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YS1fZGV0YWlscy4wIiBrZXk9Im5hbWUiIHZhbHVlPSJFU2hvcnQ6T2JqZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRVNob3J0T2JqZWN0LV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhLV9kZXRhaWxzLjEiIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJFU2hvcnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRVNob3J0T2JqZWN0LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFU2hvcnQiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFU3RyaW5nIiBuYW1lPSJFU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJFU3RyaW5nLV9odHRwMkYyRjJGb3JnMkZlY2xpcHNlMkZlbWYyRmVjb3JlMkZ1dGlsMkZFeHRlbmRlZE1ldGFEYXRhIiBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTppZD0iRVN0cmluZy1faHR0cDJGMkYyRm9yZzJGZWNsaXBzZTJGZW1mMkZlY29yZTJGdXRpbDJGRXh0ZW5kZWRNZXRhRGF0YS1fZGV0YWlscy4wIiBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJFVHJlZUl0ZXJhdG9yIiBuYW1lPSJFVHJlZUl0ZXJhdG9yIj4KLSAgICAgIDxvd25lZFRlbXBsYXRlU2lnbmF0dXJlIHhtaTp0eXBlPSJ1bWw6UmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgeG1pOmlkPSJFVHJlZUl0ZXJhdG9yLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlIiBwYXJhbWV0ZXI9IkVUcmVlSXRlcmF0b3ItX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOnR5cGU9InVtbDpDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiIHhtaTppZD0iRVRyZWVJdGVyYXRvci1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMCIgcGFyYW1ldGVyZWRFbGVtZW50PSJFVHJlZUl0ZXJhdG9yLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlLV9vd25lZFBhcmFtZXRlci4wLV9vd25lZFBhcmFtZXRlcmVkRWxlbWVudCI+Ci0gICAgICAgICAgPG93bmVkUGFyYW1ldGVyZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRVRyZWVJdGVyYXRvci1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMC1fb3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQiIG5hbWU9IkUiIHRlbXBsYXRlUGFyYW1ldGVyPSJFVHJlZUl0ZXJhdG9yLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlLV9vd25lZFBhcmFtZXRlci4wIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkVGVtcGxhdGVTaWduYXR1cmU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iRUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24iIG5hbWU9IkVJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIi8+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9wcm9maWxlQXBwbGljYXRpb24uMCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3Byb2ZpbGVBcHBsaWNhdGlvbi4wLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGdW1sMjJGMi4wLjAyRlVNTCIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI196MU9GY0hqcUVkeThTNENyOFJjX05BIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI18wIi8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9wcm9maWxlQXBwbGljYXRpb24uMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3Byb2ZpbGVBcHBsaWNhdGlvbi4xLV9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGdW1sMjJGMi4wLjAyRlVNTCIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1ML1Byb2ZpbGUvU3RhbmRhcmQjLyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0iLi4vcHJvZmlsZXMvU3RhbmRhcmQucHJvZmlsZS51bWwjXzAiLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgPC91bWw6TW9kZWw+Ci0gIDxzdGFuZGFyZDpNZXRhbW9kZWwgeG1pOmlkPSJfMllsSUVBTVlFZWF5LW9jbkE4RWNyQSIgYmFzZV9Nb2RlbD0iXzAiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWWx2SUFNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFQW5ub3RhdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iXzJZbVdNQU1ZRWVheS1vY25BOEVjckEiIGJhc2VfQ2xhc3M9IkVBdHRyaWJ1dGUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWW1XTVFNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFQ2xhc3MiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWW05UUFNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFQ2xhc3NpZmllciIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iXzJZbmtVQU1ZRWVheS1vY25BOEVjckEiIGJhc2VfQ2xhc3M9IkVDbGFzc2lmaWVyLVdpbGRjYXJkIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfMllua1VRTVlFZWF5LW9jbkE4RWNyQSIgYmFzZV9DbGFzcz0iRURhdGFUeXBlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfMllvTFlBTVlFZWF5LW9jbkE4RWNyQSIgYmFzZV9DbGFzcz0iRUVudW0iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWW9MWVFNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFRW51bUxpdGVyYWwiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWW95Y0FNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFRmFjdG9yeSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iXzJZb3ljUU1ZRWVheS1vY25BOEVjckEiIGJhc2VfQ2xhc3M9IkVHZW5lcmljVHlwZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iXzJZcFpnQU1ZRWVheS1vY25BOEVjckEiIGJhc2VfQ2xhc3M9IkVNb2RlbEVsZW1lbnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWXBaZ1FNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFTmFtZWRFbGVtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfMllxQWtBTVlFZWF5LW9jbkE4RWNyQSIgYmFzZV9DbGFzcz0iRU9iamVjdCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iXzJZcUFrUU1ZRWVheS1vY25BOEVjckEiIGJhc2VfQ2xhc3M9IkVPcGVyYXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWXFub0FNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFUGFja2FnZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iXzJZck9zQU1ZRWVheS1vY25BOEVjckEiIGJhc2VfQ2xhc3M9IkVQYXJhbWV0ZXIiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWXJPc1FNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFUmVmZXJlbmNlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfMllyT3NnTVlFZWF5LW9jbkE4RWNyQSIgYmFzZV9DbGFzcz0iRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWXIxd0FNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFU3RydWN0dXJhbEZlYXR1cmUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWXIxd1FNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFU3RydWN0dXJhbEZlYXR1cmUtV2lsZGNhcmQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWXNjMEFNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFVHlwZWRFbGVtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfMllzYzBRTVlFZWF5LW9jbkE4RWNyQSIgYmFzZV9DbGFzcz0iRVR5cGVQYXJhbWV0ZXIiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWXVTQUFNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFRUxpc3QtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfMll1NUVBTVlFZWF5LW9jbkE4RWNyQSIgYmFzZV9DbGFzcz0iRUphdmFDbGFzcy1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMC1fb3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il8yWXU1RVFNWUVlYXktb2NuQThFY3JBIiBiYXNlX0NsYXNzPSJFTWFwLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlLV9vd25lZFBhcmFtZXRlci4wLV9vd25lZFBhcmFtZXRlcmVkRWxlbWVudCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iXzJZdTVFZ01ZRWVheS1vY25BOEVjckEiIGJhc2VfQ2xhc3M9IkVNYXAtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjEtX293bmVkUGFyYW1ldGVyZWRFbGVtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfMll2Z0lBTVlFZWF5LW9jbkE4RWNyQSIgYmFzZV9DbGFzcz0iRVRyZWVJdGVyYXRvci1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMC1fb3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQiLz4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVhNGMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzk2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIwMTMxMDAxIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9zcGVjL1hNSS8yMDEzMTAwMSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOnN0YW5kYXJkPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1ML1Byb2ZpbGUvU3RhbmRhcmQiIHhtbG5zOnVtbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTCI+Ci0gIDx1bWw6TW9kZWwgeG1pOmlkPSJfMCIgbmFtZT0iVU1MIiBVUkk9Imh0dHA6Ly93d3cub21nLm9yZy9zcGVjL1VNTC8yMDEzMTAwMSI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGdW1sMjJGMi4wLjAyRlVNTCIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfaHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwtX1VNTDJGQWN0aW9ucyIgc291cmNlPSJVTUwvQWN0aW9ucyIgcmVmZXJlbmNlcz0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uLXJlc3VsdCBWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tdmFsdWUgVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIFZhcmlhYmxlQWN0aW9uLXZhcmlhYmxlIFZhcmlhYmxlQWN0aW9uIFdyaXRlTGlua0FjdGlvbiBXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXJlc3VsdCBXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXZhbHVlIFdyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24gV3JpdGVWYXJpYWJsZUFjdGlvbi12YWx1ZSBXcml0ZVZhcmlhYmxlQWN0aW9uIEV4cGFuc2lvbktpbmQgQWNjZXB0Q2FsbEFjdGlvbi1yZXR1cm5JbmZvcm1hdGlvbiBBY2NlcHRDYWxsQWN0aW9uIEFjY2VwdEV2ZW50QWN0aW9uLWlzVW5tYXJzaGFsbCBBY2NlcHRFdmVudEFjdGlvbi1yZXN1bHQgQWNjZXB0RXZlbnRBY3Rpb24tdHJpZ2dlciBBY2NlcHRFdmVudEFjdGlvbiBBY3Rpb24tY29udGV4dCBBY3Rpb24taW5wdXQgQWN0aW9uLWlzTG9jYWxseVJlZW50cmFudCBBY3Rpb24tbG9jYWxQb3N0Y29uZGl0aW9uIEFjdGlvbi1sb2NhbFByZWNvbmRpdGlvbiBBY3Rpb24tb3V0cHV0IEFjdGlvbi1jb250ZXh0LjEgQWN0aW9uLWFsbEFjdGlvbnMgQWN0aW9uLWFsbE93bmVkTm9kZXMgQWN0aW9uLWNvbnRhaW5pbmdCZWhhdmlvciBBY3Rpb24gQWN0aW9uSW5wdXRQaW4tZnJvbUFjdGlvbiBBY3Rpb25JbnB1dFBpbiBBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLWluc2VydEF0IEFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24taXNSZXBsYWNlQWxsIEFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24gQWRkVmFyaWFibGVWYWx1ZUFjdGlvbi1pbnNlcnRBdCBBZGRWYXJpYWJsZVZhbHVlQWN0aW9uLWlzUmVwbGFjZUFsbCBBZGRWYXJpYWJsZVZhbHVlQWN0aW9uIEJyb2FkY2FzdFNpZ25hbEFjdGlvbi1zaWduYWwgQnJvYWRjYXN0U2lnbmFsQWN0aW9uIENhbGxBY3Rpb24taXNTeW5jaHJvbm91cyBDYWxsQWN0aW9uLXJlc3VsdCBDYWxsQWN0aW9uLWlucHV0UGFyYW1ldGVycyBDYWxsQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMgQ2FsbEFjdGlvbiBDYWxsQmVoYXZpb3JBY3Rpb24tYmVoYXZpb3IgQ2FsbEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMgQ2FsbEJlaGF2aW9yQWN0aW9uLWlucHV0UGFyYW1ldGVycyBDYWxsQmVoYXZpb3JBY3Rpb24gQ2FsbE9wZXJhdGlvbkFjdGlvbi1vcGVyYXRpb24gQ2FsbE9wZXJhdGlvbkFjdGlvbi10YXJnZXQgQ2FsbE9wZXJhdGlvbkFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzIENhbGxPcGVyYXRpb25BY3Rpb24taW5wdXRQYXJhbWV0ZXJzIENhbGxPcGVyYXRpb25BY3Rpb24gQ2xhdXNlLWJvZHkgQ2xhdXNlLWJvZHlPdXRwdXQgQ2xhdXNlLWRlY2lkZXIgQ2xhdXNlLXByZWRlY2Vzc29yQ2xhdXNlIENsYXVzZS1zdWNjZXNzb3JDbGF1c2UgQ2xhdXNlLXRlc3QgQ2xhdXNlIENsZWFyQXNzb2NpYXRpb25BY3Rpb24tYXNzb2NpYXRpb24gQ2xlYXJBc3NvY2lhdGlvbkFjdGlvbi1vYmplY3QgQ2xlYXJBc3NvY2lhdGlvbkFjdGlvbiBDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXJlc3VsdCBDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIENsZWFyVmFyaWFibGVBY3Rpb24gQ29uZGl0aW9uYWxOb2RlLWNsYXVzZSBDb25kaXRpb25hbE5vZGUtaXNBc3N1cmVkIENvbmRpdGlvbmFsTm9kZS1pc0RldGVybWluYXRlIENvbmRpdGlvbmFsTm9kZS1yZXN1bHQgQ29uZGl0aW9uYWxOb2RlLWFsbEFjdGlvbnMgQ29uZGl0aW9uYWxOb2RlIENyZWF0ZUxpbmtBY3Rpb24tZW5kRGF0YSBDcmVhdGVMaW5rQWN0aW9uIENyZWF0ZUxpbmtPYmplY3RBY3Rpb24tcmVzdWx0IENyZWF0ZUxpbmtPYmplY3RBY3Rpb24gQ3JlYXRlT2JqZWN0QWN0aW9uLWNsYXNzaWZpZXIgQ3JlYXRlT2JqZWN0QWN0aW9uLXJlc3VsdCBDcmVhdGVPYmplY3RBY3Rpb24gRGVzdHJveUxpbmtBY3Rpb24tZW5kRGF0YSBEZXN0cm95TGlua0FjdGlvbiBEZXN0cm95T2JqZWN0QWN0aW9uLWlzRGVzdHJveUxpbmtzIERlc3Ryb3lPYmplY3RBY3Rpb24taXNEZXN0cm95T3duZWRPYmplY3RzIERlc3Ryb3lPYmplY3RBY3Rpb24tdGFyZ2V0IERlc3Ryb3lPYmplY3RBY3Rpb24gRXhwYW5zaW9uTm9kZS1yZWdpb25Bc0lucHV0IEV4cGFuc2lvbk5vZGUtcmVnaW9uQXNPdXRwdXQgRXhwYW5zaW9uTm9kZSBFeHBhbnNpb25SZWdpb24taW5wdXRFbGVtZW50IEV4cGFuc2lvblJlZ2lvbi1tb2RlIEV4cGFuc2lvblJlZ2lvbi1vdXRwdXRFbGVtZW50IEV4cGFuc2lvblJlZ2lvbiBJbnB1dFBpbiBJbnZvY2F0aW9uQWN0aW9uLWFyZ3VtZW50IEludm9jYXRpb25BY3Rpb24tb25Qb3J0IEludm9jYXRpb25BY3Rpb24gTGlua0FjdGlvbi1lbmREYXRhIExpbmtBY3Rpb24taW5wdXRWYWx1ZSBMaW5rQWN0aW9uLWFzc29jaWF0aW9uIExpbmtBY3Rpb24gTGlua0VuZENyZWF0aW9uRGF0YS1pbnNlcnRBdCBMaW5rRW5kQ3JlYXRpb25EYXRhLWlzUmVwbGFjZUFsbCBMaW5rRW5kQ3JlYXRpb25EYXRhLWFsbFBpbnMgTGlua0VuZENyZWF0aW9uRGF0YSBMaW5rRW5kRGF0YS1lbmQgTGlua0VuZERhdGEtcXVhbGlmaWVyIExpbmtFbmREYXRhLXZhbHVlIExpbmtFbmREYXRhLWFsbFBpbnMgTGlua0VuZERhdGEgTGlua0VuZERlc3RydWN0aW9uRGF0YS1kZXN0cm95QXQgTGlua0VuZERlc3RydWN0aW9uRGF0YS1pc0Rlc3Ryb3lEdXBsaWNhdGVzIExpbmtFbmREZXN0cnVjdGlvbkRhdGEtYWxsUGlucyBMaW5rRW5kRGVzdHJ1Y3Rpb25EYXRhIExvb3BOb2RlLWJvZHlPdXRwdXQgTG9vcE5vZGUtYm9keVBhcnQgTG9vcE5vZGUtZGVjaWRlciBMb29wTm9kZS1pc1Rlc3RlZEZpcnN0IExvb3BOb2RlLWxvb3BWYXJpYWJsZSBMb29wTm9kZS1sb29wVmFyaWFibGVJbnB1dCBMb29wTm9kZS1yZXN1bHQgTG9vcE5vZGUtc2V0dXBQYXJ0IExvb3BOb2RlLXRlc3QgTG9vcE5vZGUtYWxsQWN0aW9ucyBMb29wTm9kZS1zb3VyY2VOb2RlcyBMb29wTm9kZSBPcGFxdWVBY3Rpb24tYm9keSBPcGFxdWVBY3Rpb24taW5wdXRWYWx1ZSBPcGFxdWVBY3Rpb24tbGFuZ3VhZ2UgT3BhcXVlQWN0aW9uLW91dHB1dFZhbHVlIE9wYXF1ZUFjdGlvbiBPdXRwdXRQaW4gUGluLWlzQ29udHJvbCBQaW4gUXVhbGlmaWVyVmFsdWUtcXVhbGlmaWVyIFF1YWxpZmllclZhbHVlLXZhbHVlIFF1YWxpZmllclZhbHVlIFJhaXNlRXhjZXB0aW9uQWN0aW9uLWV4Y2VwdGlvbiBSYWlzZUV4Y2VwdGlvbkFjdGlvbiBSZWFkRXh0ZW50QWN0aW9uLWNsYXNzaWZpZXIgUmVhZEV4dGVudEFjdGlvbi1yZXN1bHQgUmVhZEV4dGVudEFjdGlvbiBSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLWNsYXNzaWZpZXIgUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1pc0RpcmVjdCBSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW9iamVjdCBSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLXJlc3VsdCBSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIFJlYWRMaW5rQWN0aW9uLXJlc3VsdCBSZWFkTGlua0FjdGlvbi1vcGVuRW5kIFJlYWRMaW5rQWN0aW9uIFJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLWVuZCBSZWFkTGlua09iamVjdEVuZEFjdGlvbi1vYmplY3QgUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tcmVzdWx0IFJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIFJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLW9iamVjdCBSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1xdWFsaWZpZXIgUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcmVzdWx0IFJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIFJlYWRTZWxmQWN0aW9uLXJlc3VsdCBSZWFkU2VsZkFjdGlvbiBSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tcmVzdWx0IFJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiBSZWFkVmFyaWFibGVBY3Rpb24tcmVzdWx0IFJlYWRWYXJpYWJsZUFjdGlvbiBSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLWlzUmVwbGFjZUFsbCBSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLW5ld0NsYXNzaWZpZXIgUmVjbGFzc2lmeU9iamVjdEFjdGlvbi1vYmplY3QgUmVjbGFzc2lmeU9iamVjdEFjdGlvbi1vbGRDbGFzc2lmaWVyIFJlY2xhc3NpZnlPYmplY3RBY3Rpb24gUmVkdWNlQWN0aW9uLWNvbGxlY3Rpb24gUmVkdWNlQWN0aW9uLWlzT3JkZXJlZCBSZWR1Y2VBY3Rpb24tcmVkdWNlciBSZWR1Y2VBY3Rpb24tcmVzdWx0IFJlZHVjZUFjdGlvbiBSZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLWlzUmVtb3ZlRHVwbGljYXRlcyBSZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLXJlbW92ZUF0IFJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24gUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbi1pc1JlbW92ZUR1cGxpY2F0ZXMgUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbi1yZW1vdmVBdCBSZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uIFJlcGx5QWN0aW9uLXJlcGx5VG9DYWxsIFJlcGx5QWN0aW9uLXJlcGx5VmFsdWUgUmVwbHlBY3Rpb24tcmV0dXJuSW5mb3JtYXRpb24gUmVwbHlBY3Rpb24gU2VuZE9iamVjdEFjdGlvbi1yZXF1ZXN0IFNlbmRPYmplY3RBY3Rpb24tdGFyZ2V0IFNlbmRPYmplY3RBY3Rpb24gU2VuZFNpZ25hbEFjdGlvbi1zaWduYWwgU2VuZFNpZ25hbEFjdGlvbi10YXJnZXQgU2VuZFNpZ25hbEFjdGlvbiBTZXF1ZW5jZU5vZGUtZXhlY3V0YWJsZU5vZGUgU2VxdWVuY2VOb2RlIFN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLW9iamVjdCBTdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbiBTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW9iamVjdCBTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMgU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1pbnB1dFBhcmFtZXRlcnMgU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1iZWhhdmlvciBTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uIFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW9iamVjdCBTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1zdHJ1Y3R1cmFsRmVhdHVyZSBTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWFjdGl2aXR5IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtZWRnZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLW11c3RJc29sYXRlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtbm9kZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXN0cnVjdHVyZWROb2RlSW5wdXQgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkTm9kZU91dHB1dCBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXZhcmlhYmxlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsQWN0aW9ucyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWFsbE93bmVkTm9kZXMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zb3VyY2VOb2RlcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXRhcmdldE5vZGVzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtY29udGFpbmluZ0FjdGl2aXR5IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgVGVzdElkZW50aXR5QWN0aW9uLWZpcnN0IFRlc3RJZGVudGl0eUFjdGlvbi1yZXN1bHQgVGVzdElkZW50aXR5QWN0aW9uLXNlY29uZCBUZXN0SWRlbnRpdHlBY3Rpb24gVW5tYXJzaGFsbEFjdGlvbi1vYmplY3QgVW5tYXJzaGFsbEFjdGlvbi1yZXN1bHQgVW5tYXJzaGFsbEFjdGlvbi11bm1hcnNoYWxsVHlwZSBVbm1hcnNoYWxsQWN0aW9uIFZhbHVlUGluLXZhbHVlIFZhbHVlUGluIEFfdmFsdWVfdmFsdWVQaW4tdmFsdWVQaW4gQV92YWx1ZV92YWx1ZVBpbiBBX3Jlc3VsdF91bm1hcnNoYWxsQWN0aW9uLXVubWFyc2hhbGxBY3Rpb24gQV9yZXN1bHRfdW5tYXJzaGFsbEFjdGlvbiBBX3VubWFyc2hhbGxUeXBlX3VubWFyc2hhbGxBY3Rpb24tdW5tYXJzaGFsbEFjdGlvbiBBX3VubWFyc2hhbGxUeXBlX3VubWFyc2hhbGxBY3Rpb24gQV9vYmplY3RfdW5tYXJzaGFsbEFjdGlvbi11bm1hcnNoYWxsQWN0aW9uIEFfb2JqZWN0X3VubWFyc2hhbGxBY3Rpb24gQV9maXJzdF90ZXN0SWRlbnRpdHlBY3Rpb24tdGVzdElkZW50aXR5QWN0aW9uIEFfZmlyc3RfdGVzdElkZW50aXR5QWN0aW9uIEFfc2Vjb25kX3Rlc3RJZGVudGl0eUFjdGlvbi10ZXN0SWRlbnRpdHlBY3Rpb24gQV9zZWNvbmRfdGVzdElkZW50aXR5QWN0aW9uIEFfcmVzdWx0X3Rlc3RJZGVudGl0eUFjdGlvbi10ZXN0SWRlbnRpdHlBY3Rpb24gQV9yZXN1bHRfdGVzdElkZW50aXR5QWN0aW9uIEFfc3RydWN0dXJlZE5vZGVPdXRwdXRfc3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIEFfc3RydWN0dXJlZE5vZGVPdXRwdXRfc3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBBX3N0cnVjdHVyZWROb2RlSW5wdXRfc3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIEFfc3RydWN0dXJlZE5vZGVJbnB1dF9zdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIEFfZWRnZV9pblN0cnVjdHVyZWROb2RlIEFfbm9kZV9pblN0cnVjdHVyZWROb2RlIEFfdmFyaWFibGVfc2NvcGUgQV9vYmplY3Rfc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24gQV9vYmplY3Rfc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24gQV9zdHJ1Y3R1cmFsRmVhdHVyZV9zdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1zdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiBBX3N0cnVjdHVyYWxGZWF0dXJlX3N0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIEFfb2JqZWN0X3N0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24tc3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbiBBX29iamVjdF9zdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uIEFfb2JqZWN0X3N0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLXN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uIEFfb2JqZWN0X3N0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uIEFfZXhlY3V0YWJsZU5vZGVfc2VxdWVuY2VOb2RlLXNlcXVlbmNlTm9kZSBBX2V4ZWN1dGFibGVOb2RlX3NlcXVlbmNlTm9kZSBBX3NpZ25hbF9zZW5kU2lnbmFsQWN0aW9uLXNlbmRTaWduYWxBY3Rpb24gQV9zaWduYWxfc2VuZFNpZ25hbEFjdGlvbiBBX3RhcmdldF9zZW5kU2lnbmFsQWN0aW9uLXNlbmRTaWduYWxBY3Rpb24gQV90YXJnZXRfc2VuZFNpZ25hbEFjdGlvbiBBX3JlcXVlc3Rfc2VuZE9iamVjdEFjdGlvbi1zZW5kT2JqZWN0QWN0aW9uIEFfcmVxdWVzdF9zZW5kT2JqZWN0QWN0aW9uIEFfdGFyZ2V0X3NlbmRPYmplY3RBY3Rpb24tc2VuZE9iamVjdEFjdGlvbiBBX3RhcmdldF9zZW5kT2JqZWN0QWN0aW9uIEFfcmV0dXJuSW5mb3JtYXRpb25fcmVwbHlBY3Rpb24tcmVwbHlBY3Rpb24gQV9yZXR1cm5JbmZvcm1hdGlvbl9yZXBseUFjdGlvbiBBX3JlcGx5VG9DYWxsX3JlcGx5QWN0aW9uLXJlcGx5QWN0aW9uIEFfcmVwbHlUb0NhbGxfcmVwbHlBY3Rpb24gQV9yZXBseVZhbHVlX3JlcGx5QWN0aW9uLXJlcGx5QWN0aW9uIEFfcmVwbHlWYWx1ZV9yZXBseUFjdGlvbiBBX3JlbW92ZUF0X3JlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24tcmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbiBBX3JlbW92ZUF0X3JlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24gQV9yZW1vdmVBdF9yZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLXJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24gQV9yZW1vdmVBdF9yZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIEFfY29sbGVjdGlvbl9yZWR1Y2VBY3Rpb24tcmVkdWNlQWN0aW9uIEFfY29sbGVjdGlvbl9yZWR1Y2VBY3Rpb24gQV9yZWR1Y2VyX3JlZHVjZUFjdGlvbi1yZWR1Y2VBY3Rpb24gQV9yZWR1Y2VyX3JlZHVjZUFjdGlvbiBBX3Jlc3VsdF9yZWR1Y2VBY3Rpb24tcmVkdWNlQWN0aW9uIEFfcmVzdWx0X3JlZHVjZUFjdGlvbiBBX29iamVjdF9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLXJlY2xhc3NpZnlPYmplY3RBY3Rpb24gQV9vYmplY3RfcmVjbGFzc2lmeU9iamVjdEFjdGlvbiBBX25ld0NsYXNzaWZpZXJfcmVjbGFzc2lmeU9iamVjdEFjdGlvbi1yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIEFfbmV3Q2xhc3NpZmllcl9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIEFfb2xkQ2xhc3NpZmllcl9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLXJlY2xhc3NpZnlPYmplY3RBY3Rpb24gQV9vbGRDbGFzc2lmaWVyX3JlY2xhc3NpZnlPYmplY3RBY3Rpb24gQV9yZXN1bHRfcmVhZFZhcmlhYmxlQWN0aW9uLXJlYWRWYXJpYWJsZUFjdGlvbiBBX3Jlc3VsdF9yZWFkVmFyaWFibGVBY3Rpb24gQV9yZXN1bHRfcmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiBBX3Jlc3VsdF9yZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24gQV9yZXN1bHRfcmVhZFNlbGZBY3Rpb24tcmVhZFNlbGZBY3Rpb24gQV9yZXN1bHRfcmVhZFNlbGZBY3Rpb24gQV9xdWFsaWZpZXJfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24gQV9xdWFsaWZpZXJfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24gQV9vYmplY3RfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24gQV9vYmplY3RfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24gQV9yZXN1bHRfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24gQV9yZXN1bHRfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24gQV9vYmplY3RfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRBY3Rpb24gQV9vYmplY3RfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24gQV9lbmRfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRBY3Rpb24gQV9lbmRfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24gQV9yZXN1bHRfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRBY3Rpb24gQV9yZXN1bHRfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24gQV9yZXN1bHRfcmVhZExpbmtBY3Rpb24tcmVhZExpbmtBY3Rpb24gQV9yZXN1bHRfcmVhZExpbmtBY3Rpb24gQV9jbGFzc2lmaWVyX3JlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiBBX2NsYXNzaWZpZXJfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiBBX3Jlc3VsdF9yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLXJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24gQV9yZXN1bHRfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiBBX29iamVjdF9yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLXJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24gQV9vYmplY3RfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiBBX3Jlc3VsdF9yZWFkRXh0ZW50QWN0aW9uLXJlYWRFeHRlbnRBY3Rpb24gQV9yZXN1bHRfcmVhZEV4dGVudEFjdGlvbiBBX2NsYXNzaWZpZXJfcmVhZEV4dGVudEFjdGlvbi1yZWFkRXh0ZW50QWN0aW9uIEFfY2xhc3NpZmllcl9yZWFkRXh0ZW50QWN0aW9uIEFfZXhjZXB0aW9uX3JhaXNlRXhjZXB0aW9uQWN0aW9uLXJhaXNlRXhjZXB0aW9uQWN0aW9uIEFfZXhjZXB0aW9uX3JhaXNlRXhjZXB0aW9uQWN0aW9uIEFfcXVhbGlmaWVyX3F1YWxpZmllclZhbHVlLXF1YWxpZmllclZhbHVlIEFfcXVhbGlmaWVyX3F1YWxpZmllclZhbHVlIEFfdmFsdWVfcXVhbGlmaWVyVmFsdWUtcXVhbGlmaWVyVmFsdWUgQV92YWx1ZV9xdWFsaWZpZXJWYWx1ZSBBX291dHB1dFZhbHVlX29wYXF1ZUFjdGlvbi1vcGFxdWVBY3Rpb24gQV9vdXRwdXRWYWx1ZV9vcGFxdWVBY3Rpb24gQV9pbnB1dFZhbHVlX29wYXF1ZUFjdGlvbi1vcGFxdWVBY3Rpb24gQV9pbnB1dFZhbHVlX29wYXF1ZUFjdGlvbiBBX3NldHVwUGFydF9sb29wTm9kZS1sb29wTm9kZSBBX3NldHVwUGFydF9sb29wTm9kZSBBX2JvZHlQYXJ0X2xvb3BOb2RlLWxvb3BOb2RlIEFfYm9keVBhcnRfbG9vcE5vZGUgQV9sb29wVmFyaWFibGVfbG9vcE5vZGUtbG9vcE5vZGUgQV9sb29wVmFyaWFibGVfbG9vcE5vZGUgQV9yZXN1bHRfbG9vcE5vZGUtbG9vcE5vZGUgQV9yZXN1bHRfbG9vcE5vZGUgQV9ib2R5T3V0cHV0X2xvb3BOb2RlLWxvb3BOb2RlIEFfYm9keU91dHB1dF9sb29wTm9kZSBBX2xvb3BWYXJpYWJsZUlucHV0X2xvb3BOb2RlLWxvb3BOb2RlIEFfbG9vcFZhcmlhYmxlSW5wdXRfbG9vcE5vZGUgQV90ZXN0X2xvb3BOb2RlLWxvb3BOb2RlIEFfdGVzdF9sb29wTm9kZSBBX2RlY2lkZXJfbG9vcE5vZGUtbG9vcE5vZGUgQV9kZWNpZGVyX2xvb3BOb2RlIEFfZGVzdHJveUF0X2xpbmtFbmREZXN0cnVjdGlvbkRhdGEtbGlua0VuZERlc3RydWN0aW9uRGF0YSBBX2Rlc3Ryb3lBdF9saW5rRW5kRGVzdHJ1Y3Rpb25EYXRhIEFfdmFsdWVfbGlua0VuZERhdGEtbGlua0VuZERhdGEgQV92YWx1ZV9saW5rRW5kRGF0YSBBX2VuZF9saW5rRW5kRGF0YS1saW5rRW5kRGF0YSBBX2VuZF9saW5rRW5kRGF0YSBBX3F1YWxpZmllcl9saW5rRW5kRGF0YS1saW5rRW5kRGF0YSBBX3F1YWxpZmllcl9saW5rRW5kRGF0YSBBX2luc2VydEF0X2xpbmtFbmRDcmVhdGlvbkRhdGEtbGlua0VuZENyZWF0aW9uRGF0YSBBX2luc2VydEF0X2xpbmtFbmRDcmVhdGlvbkRhdGEgQV9pbnB1dFZhbHVlX2xpbmtBY3Rpb24tbGlua0FjdGlvbiBBX2lucHV0VmFsdWVfbGlua0FjdGlvbiBBX2VuZERhdGFfbGlua0FjdGlvbi1saW5rQWN0aW9uIEFfZW5kRGF0YV9saW5rQWN0aW9uIEFfYXJndW1lbnRfaW52b2NhdGlvbkFjdGlvbi1pbnZvY2F0aW9uQWN0aW9uIEFfYXJndW1lbnRfaW52b2NhdGlvbkFjdGlvbiBBX29uUG9ydF9pbnZvY2F0aW9uQWN0aW9uLWludm9jYXRpb25BY3Rpb24gQV9vblBvcnRfaW52b2NhdGlvbkFjdGlvbiBBX2lucHV0RWxlbWVudF9yZWdpb25Bc0lucHV0IEFfb3V0cHV0RWxlbWVudF9yZWdpb25Bc091dHB1dCBBX3RhcmdldF9kZXN0cm95T2JqZWN0QWN0aW9uLWRlc3Ryb3lPYmplY3RBY3Rpb24gQV90YXJnZXRfZGVzdHJveU9iamVjdEFjdGlvbiBBX2VuZERhdGFfZGVzdHJveUxpbmtBY3Rpb24tZGVzdHJveUxpbmtBY3Rpb24gQV9lbmREYXRhX2Rlc3Ryb3lMaW5rQWN0aW9uIEFfY2xhc3NpZmllcl9jcmVhdGVPYmplY3RBY3Rpb24tY3JlYXRlT2JqZWN0QWN0aW9uIEFfY2xhc3NpZmllcl9jcmVhdGVPYmplY3RBY3Rpb24gQV9yZXN1bHRfY3JlYXRlT2JqZWN0QWN0aW9uLWNyZWF0ZU9iamVjdEFjdGlvbiBBX3Jlc3VsdF9jcmVhdGVPYmplY3RBY3Rpb24gQV9yZXN1bHRfY3JlYXRlTGlua09iamVjdEFjdGlvbi1jcmVhdGVMaW5rT2JqZWN0QWN0aW9uIEFfcmVzdWx0X2NyZWF0ZUxpbmtPYmplY3RBY3Rpb24gQV9lbmREYXRhX2NyZWF0ZUxpbmtBY3Rpb24tY3JlYXRlTGlua0FjdGlvbiBBX2VuZERhdGFfY3JlYXRlTGlua0FjdGlvbiBBX2NsYXVzZV9jb25kaXRpb25hbE5vZGUtY29uZGl0aW9uYWxOb2RlIEFfY2xhdXNlX2NvbmRpdGlvbmFsTm9kZSBBX3Jlc3VsdF9jb25kaXRpb25hbE5vZGUtY29uZGl0aW9uYWxOb2RlIEFfcmVzdWx0X2NvbmRpdGlvbmFsTm9kZSBBX3Jlc3VsdF9jbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLWNsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24gQV9yZXN1bHRfY2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiBBX29iamVjdF9jbGVhckFzc29jaWF0aW9uQWN0aW9uLWNsZWFyQXNzb2NpYXRpb25BY3Rpb24gQV9vYmplY3RfY2xlYXJBc3NvY2lhdGlvbkFjdGlvbiBBX2Fzc29jaWF0aW9uX2NsZWFyQXNzb2NpYXRpb25BY3Rpb24tY2xlYXJBc3NvY2lhdGlvbkFjdGlvbiBBX2Fzc29jaWF0aW9uX2NsZWFyQXNzb2NpYXRpb25BY3Rpb24gQV9kZWNpZGVyX2NsYXVzZS1jbGF1c2UgQV9kZWNpZGVyX2NsYXVzZSBBX2JvZHlPdXRwdXRfY2xhdXNlLWNsYXVzZSBBX2JvZHlPdXRwdXRfY2xhdXNlIEFfdGVzdF9jbGF1c2UtY2xhdXNlIEFfdGVzdF9jbGF1c2UgQV9ib2R5X2NsYXVzZS1jbGF1c2UgQV9ib2R5X2NsYXVzZSBBX3ByZWRlY2Vzc29yQ2xhdXNlX3N1Y2Nlc3NvckNsYXVzZSBBX3RhcmdldF9jYWxsT3BlcmF0aW9uQWN0aW9uLWNhbGxPcGVyYXRpb25BY3Rpb24gQV90YXJnZXRfY2FsbE9wZXJhdGlvbkFjdGlvbiBBX29wZXJhdGlvbl9jYWxsT3BlcmF0aW9uQWN0aW9uLWNhbGxPcGVyYXRpb25BY3Rpb24gQV9vcGVyYXRpb25fY2FsbE9wZXJhdGlvbkFjdGlvbiBBX2JlaGF2aW9yX2NhbGxCZWhhdmlvckFjdGlvbi1jYWxsQmVoYXZpb3JBY3Rpb24gQV9iZWhhdmlvcl9jYWxsQmVoYXZpb3JBY3Rpb24gQV9yZXN1bHRfY2FsbEFjdGlvbi1jYWxsQWN0aW9uIEFfcmVzdWx0X2NhbGxBY3Rpb24gQV9zaWduYWxfYnJvYWRjYXN0U2lnbmFsQWN0aW9uLWJyb2FkY2FzdFNpZ25hbEFjdGlvbiBBX3NpZ25hbF9icm9hZGNhc3RTaWduYWxBY3Rpb24gQV9pbnNlcnRBdF9hZGRWYXJpYWJsZVZhbHVlQWN0aW9uLWFkZFZhcmlhYmxlVmFsdWVBY3Rpb24gQV9pbnNlcnRBdF9hZGRWYXJpYWJsZVZhbHVlQWN0aW9uIEFfaW5zZXJ0QXRfYWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1hZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIEFfaW5zZXJ0QXRfYWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiBBX2Zyb21BY3Rpb25fYWN0aW9uSW5wdXRQaW4tYWN0aW9uSW5wdXRQaW4gQV9mcm9tQWN0aW9uX2FjdGlvbklucHV0UGluIEFfb3V0cHV0X2FjdGlvbi1hY3Rpb24gQV9vdXRwdXRfYWN0aW9uIEFfY29udGV4dF9hY3Rpb24tYWN0aW9uIEFfY29udGV4dF9hY3Rpb24gQV9pbnB1dF9hY3Rpb24tYWN0aW9uIEFfaW5wdXRfYWN0aW9uIEFfbG9jYWxQcmVjb25kaXRpb25fYWN0aW9uLWFjdGlvbiBBX2xvY2FsUHJlY29uZGl0aW9uX2FjdGlvbiBBX2xvY2FsUG9zdGNvbmRpdGlvbl9hY3Rpb24tYWN0aW9uIEFfbG9jYWxQb3N0Y29uZGl0aW9uX2FjdGlvbiBBX3RyaWdnZXJfYWNjZXB0RXZlbnRBY3Rpb24tYWNjZXB0RXZlbnRBY3Rpb24gQV90cmlnZ2VyX2FjY2VwdEV2ZW50QWN0aW9uIEFfcmVzdWx0X2FjY2VwdEV2ZW50QWN0aW9uLWFjY2VwdEV2ZW50QWN0aW9uIEFfcmVzdWx0X2FjY2VwdEV2ZW50QWN0aW9uIEFfcmV0dXJuSW5mb3JtYXRpb25fYWNjZXB0Q2FsbEFjdGlvbi1hY2NlcHRDYWxsQWN0aW9uIEFfcmV0dXJuSW5mb3JtYXRpb25fYWNjZXB0Q2FsbEFjdGlvbiBBX3ZhbHVlX3dyaXRlVmFyaWFibGVBY3Rpb24td3JpdGVWYXJpYWJsZUFjdGlvbiBBX3ZhbHVlX3dyaXRlVmFyaWFibGVBY3Rpb24gQV9yZXN1bHRfd3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi13cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIEFfcmVzdWx0X3dyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24gQV92YWx1ZV93cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXdyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24gQV92YWx1ZV93cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIEFfdmFyaWFibGVfdmFyaWFibGVBY3Rpb24tdmFyaWFibGVBY3Rpb24gQV92YXJpYWJsZV92YXJpYWJsZUFjdGlvbiBBX3Jlc3VsdF92YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tdmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIEFfcmVzdWx0X3ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiBBX3ZhbHVlX3ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbi12YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24gQV92YWx1ZV92YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfaHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwtX1VNTDJGQWN0aXZpdGllcyIgc291cmNlPSJVTUwvQWN0aXZpdGllcyIgcmVmZXJlbmNlcz0iQWN0aXZpdHktZWRnZSBBY3Rpdml0eS1ncm91cCBBY3Rpdml0eS1pc1JlYWRPbmx5IEFjdGl2aXR5LWlzU2luZ2xlRXhlY3V0aW9uIEFjdGl2aXR5LW5vZGUgQWN0aXZpdHktcGFydGl0aW9uIEFjdGl2aXR5LXN0cnVjdHVyZWROb2RlIEFjdGl2aXR5LXZhcmlhYmxlIEFjdGl2aXR5IEFjdGl2aXR5RWRnZS1hY3Rpdml0eSBBY3Rpdml0eUVkZ2UtZ3VhcmQgQWN0aXZpdHlFZGdlLWluR3JvdXAgQWN0aXZpdHlFZGdlLWluUGFydGl0aW9uIEFjdGl2aXR5RWRnZS1pblN0cnVjdHVyZWROb2RlIEFjdGl2aXR5RWRnZS1pbnRlcnJ1cHRzIEFjdGl2aXR5RWRnZS1yZWRlZmluZWRFZGdlIEFjdGl2aXR5RWRnZS1zb3VyY2UgQWN0aXZpdHlFZGdlLXRhcmdldCBBY3Rpdml0eUVkZ2Utd2VpZ2h0IEFjdGl2aXR5RWRnZS1pc0NvbnNpc3RlbnRXaXRoIEFjdGl2aXR5RWRnZSBBY3Rpdml0eUZpbmFsTm9kZSBBY3Rpdml0eUdyb3VwLWNvbnRhaW5lZEVkZ2UgQWN0aXZpdHlHcm91cC1jb250YWluZWROb2RlIEFjdGl2aXR5R3JvdXAtaW5BY3Rpdml0eSBBY3Rpdml0eUdyb3VwLXN1Ymdyb3VwIEFjdGl2aXR5R3JvdXAtc3VwZXJHcm91cCBBY3Rpdml0eUdyb3VwLWNvbnRhaW5pbmdBY3Rpdml0eSBBY3Rpdml0eUdyb3VwIEFjdGl2aXR5Tm9kZS1hY3Rpdml0eSBBY3Rpdml0eU5vZGUtaW5Hcm91cCBBY3Rpdml0eU5vZGUtaW5JbnRlcnJ1cHRpYmxlUmVnaW9uIEFjdGl2aXR5Tm9kZS1pblBhcnRpdGlvbiBBY3Rpdml0eU5vZGUtaW5TdHJ1Y3R1cmVkTm9kZSBBY3Rpdml0eU5vZGUtaW5jb21pbmcgQWN0aXZpdHlOb2RlLW91dGdvaW5nIEFjdGl2aXR5Tm9kZS1yZWRlZmluZWROb2RlIEFjdGl2aXR5Tm9kZS1jb250YWluaW5nQWN0aXZpdHkgQWN0aXZpdHlOb2RlLWlzQ29uc2lzdGVudFdpdGggQWN0aXZpdHlOb2RlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZS1wYXJhbWV0ZXIgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIEFjdGl2aXR5UGFydGl0aW9uLWVkZ2UgQWN0aXZpdHlQYXJ0aXRpb24taXNEaW1lbnNpb24gQWN0aXZpdHlQYXJ0aXRpb24taXNFeHRlcm5hbCBBY3Rpdml0eVBhcnRpdGlvbi1ub2RlIEFjdGl2aXR5UGFydGl0aW9uLXJlcHJlc2VudHMgQWN0aXZpdHlQYXJ0aXRpb24tc3VicGFydGl0aW9uIEFjdGl2aXR5UGFydGl0aW9uLXN1cGVyUGFydGl0aW9uIEFjdGl2aXR5UGFydGl0aW9uIENlbnRyYWxCdWZmZXJOb2RlIENvbnRyb2xGbG93IENvbnRyb2xOb2RlIERhdGFTdG9yZU5vZGUgRGVjaXNpb25Ob2RlLWRlY2lzaW9uSW5wdXQgRGVjaXNpb25Ob2RlLWRlY2lzaW9uSW5wdXRGbG93IERlY2lzaW9uTm9kZSBFeGNlcHRpb25IYW5kbGVyLWV4Y2VwdGlvbklucHV0IEV4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uVHlwZSBFeGNlcHRpb25IYW5kbGVyLWhhbmRsZXJCb2R5IEV4Y2VwdGlvbkhhbmRsZXItcHJvdGVjdGVkTm9kZSBFeGNlcHRpb25IYW5kbGVyIEV4ZWN1dGFibGVOb2RlLWhhbmRsZXIgRXhlY3V0YWJsZU5vZGUgRmluYWxOb2RlIEZsb3dGaW5hbE5vZGUgRm9ya05vZGUgSW5pdGlhbE5vZGUgSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uLWludGVycnVwdGluZ0VkZ2UgSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uLW5vZGUgSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uIEpvaW5Ob2RlLWlzQ29tYmluZUR1cGxpY2F0ZSBKb2luTm9kZS1qb2luU3BlYyBKb2luTm9kZSBNZXJnZU5vZGUgT2JqZWN0Rmxvdy1pc011bHRpY2FzdCBPYmplY3RGbG93LWlzTXVsdGlyZWNlaXZlIE9iamVjdEZsb3ctc2VsZWN0aW9uIE9iamVjdEZsb3ctdHJhbnNmb3JtYXRpb24gT2JqZWN0RmxvdyBPYmplY3ROb2RlLWluU3RhdGUgT2JqZWN0Tm9kZS1pc0NvbnRyb2xUeXBlIE9iamVjdE5vZGUtb3JkZXJpbmcgT2JqZWN0Tm9kZS1zZWxlY3Rpb24gT2JqZWN0Tm9kZS11cHBlckJvdW5kIE9iamVjdE5vZGUgVmFyaWFibGUtYWN0aXZpdHlTY29wZSBWYXJpYWJsZS1zY29wZSBWYXJpYWJsZS1pc0FjY2Vzc2libGVCeSBWYXJpYWJsZSBPYmplY3ROb2RlT3JkZXJpbmdLaW5kIEFfc2VsZWN0aW9uX29iamVjdE5vZGUtb2JqZWN0Tm9kZSBBX3NlbGVjdGlvbl9vYmplY3ROb2RlIEFfaW5TdGF0ZV9vYmplY3ROb2RlLW9iamVjdE5vZGUgQV9pblN0YXRlX29iamVjdE5vZGUgQV91cHBlckJvdW5kX29iamVjdE5vZGUtb2JqZWN0Tm9kZSBBX3VwcGVyQm91bmRfb2JqZWN0Tm9kZSBBX3RyYW5zZm9ybWF0aW9uX29iamVjdEZsb3ctb2JqZWN0RmxvdyBBX3RyYW5zZm9ybWF0aW9uX29iamVjdEZsb3cgQV9zZWxlY3Rpb25fb2JqZWN0Rmxvdy1vYmplY3RGbG93IEFfc2VsZWN0aW9uX29iamVjdEZsb3cgQV9qb2luU3BlY19qb2luTm9kZS1qb2luTm9kZSBBX2pvaW5TcGVjX2pvaW5Ob2RlIEFfaW50ZXJydXB0aW5nRWRnZV9pbnRlcnJ1cHRzIEFfaGFuZGxlcl9wcm90ZWN0ZWROb2RlIEFfaGFuZGxlckJvZHlfZXhjZXB0aW9uSGFuZGxlci1leGNlcHRpb25IYW5kbGVyIEFfaGFuZGxlckJvZHlfZXhjZXB0aW9uSGFuZGxlciBBX2V4Y2VwdGlvblR5cGVfZXhjZXB0aW9uSGFuZGxlci1leGNlcHRpb25IYW5kbGVyIEFfZXhjZXB0aW9uVHlwZV9leGNlcHRpb25IYW5kbGVyIEFfZXhjZXB0aW9uSW5wdXRfZXhjZXB0aW9uSGFuZGxlci1leGNlcHRpb25IYW5kbGVyIEFfZXhjZXB0aW9uSW5wdXRfZXhjZXB0aW9uSGFuZGxlciBBX2RlY2lzaW9uSW5wdXRfZGVjaXNpb25Ob2RlLWRlY2lzaW9uTm9kZSBBX2RlY2lzaW9uSW5wdXRfZGVjaXNpb25Ob2RlIEFfZGVjaXNpb25JbnB1dEZsb3dfZGVjaXNpb25Ob2RlLWRlY2lzaW9uTm9kZSBBX2RlY2lzaW9uSW5wdXRGbG93X2RlY2lzaW9uTm9kZSBBX3JlcHJlc2VudHNfYWN0aXZpdHlQYXJ0aXRpb24tYWN0aXZpdHlQYXJ0aXRpb24gQV9yZXByZXNlbnRzX2FjdGl2aXR5UGFydGl0aW9uIEFfc3VicGFydGl0aW9uX3N1cGVyUGFydGl0aW9uIEFfZWRnZV9pblBhcnRpdGlvbiBBX3BhcmFtZXRlcl9hY3Rpdml0eVBhcmFtZXRlck5vZGUtYWN0aXZpdHlQYXJhbWV0ZXJOb2RlIEFfcGFyYW1ldGVyX2FjdGl2aXR5UGFyYW1ldGVyTm9kZSBBX2luSW50ZXJydXB0aWJsZVJlZ2lvbl9ub2RlIEFfaW5QYXJ0aXRpb25fbm9kZSBBX2luY29taW5nX3RhcmdldF9ub2RlIEFfb3V0Z29pbmdfc291cmNlX25vZGUgQV9yZWRlZmluZWROb2RlX2FjdGl2aXR5Tm9kZS1hY3Rpdml0eU5vZGUgQV9yZWRlZmluZWROb2RlX2FjdGl2aXR5Tm9kZSBBX2NvbnRhaW5lZEVkZ2VfaW5Hcm91cCBBX2NvbnRhaW5lZE5vZGVfaW5Hcm91cCBBX3N1Ymdyb3VwX3N1cGVyR3JvdXAgQV9yZWRlZmluZWRFZGdlX2FjdGl2aXR5RWRnZS1hY3Rpdml0eUVkZ2UgQV9yZWRlZmluZWRFZGdlX2FjdGl2aXR5RWRnZSBBX3dlaWdodF9hY3Rpdml0eUVkZ2UtYWN0aXZpdHlFZGdlIEFfd2VpZ2h0X2FjdGl2aXR5RWRnZSBBX2d1YXJkX2FjdGl2aXR5RWRnZS1hY3Rpdml0eUVkZ2UgQV9ndWFyZF9hY3Rpdml0eUVkZ2UgQV9zdHJ1Y3R1cmVkTm9kZV9hY3Rpdml0eSBBX2dyb3VwX2luQWN0aXZpdHkgQV9ub2RlX2FjdGl2aXR5IEFfdmFyaWFibGVfYWN0aXZpdHlTY29wZSBBX2VkZ2VfYWN0aXZpdHkgQV9wYXJ0aXRpb25fYWN0aXZpdHktYWN0aXZpdHkgQV9wYXJ0aXRpb25fYWN0aXZpdHkiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfaHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwtX1VNTDJGQ2xhc3NpZmljYXRpb24iIHNvdXJjZT0iVU1ML0NsYXNzaWZpY2F0aW9uIiByZWZlcmVuY2VzPSJTdWJzdGl0dXRpb24tY29udHJhY3QgU3Vic3RpdHV0aW9uLXN1YnN0aXR1dGluZ0NsYXNzaWZpZXIgU3Vic3RpdHV0aW9uIEJlaGF2aW9yYWxGZWF0dXJlLWNvbmN1cnJlbmN5IEJlaGF2aW9yYWxGZWF0dXJlLWlzQWJzdHJhY3QgQmVoYXZpb3JhbEZlYXR1cmUtbWV0aG9kIEJlaGF2aW9yYWxGZWF0dXJlLW93bmVkUGFyYW1ldGVyIEJlaGF2aW9yYWxGZWF0dXJlLW93bmVkUGFyYW1ldGVyU2V0IEJlaGF2aW9yYWxGZWF0dXJlLXJhaXNlZEV4Y2VwdGlvbiBCZWhhdmlvcmFsRmVhdHVyZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20gQmVoYXZpb3JhbEZlYXR1cmUtaW5wdXRQYXJhbWV0ZXJzIEJlaGF2aW9yYWxGZWF0dXJlLW91dHB1dFBhcmFtZXRlcnMgQmVoYXZpb3JhbEZlYXR1cmUgQ2xhc3NpZmllci1hdHRyaWJ1dGUgQ2xhc3NpZmllci1jb2xsYWJvcmF0aW9uVXNlIENsYXNzaWZpZXItZmVhdHVyZSBDbGFzc2lmaWVyLWdlbmVyYWwgQ2xhc3NpZmllci1nZW5lcmFsaXphdGlvbiBDbGFzc2lmaWVyLWluaGVyaXRlZE1lbWJlciBDbGFzc2lmaWVyLWlzQWJzdHJhY3QgQ2xhc3NpZmllci1pc0ZpbmFsU3BlY2lhbGl6YXRpb24gQ2xhc3NpZmllci1vd25lZFRlbXBsYXRlU2lnbmF0dXJlIENsYXNzaWZpZXItb3duZWRVc2VDYXNlIENsYXNzaWZpZXItcG93ZXJ0eXBlRXh0ZW50IENsYXNzaWZpZXItcmVkZWZpbmVkQ2xhc3NpZmllciBDbGFzc2lmaWVyLXJlcHJlc2VudGF0aW9uIENsYXNzaWZpZXItc3Vic3RpdHV0aW9uIENsYXNzaWZpZXItdGVtcGxhdGVQYXJhbWV0ZXIgQ2xhc3NpZmllci11c2VDYXNlIENsYXNzaWZpZXItYWxsRmVhdHVyZXMgQ2xhc3NpZmllci1hbGxQYXJlbnRzIENsYXNzaWZpZXItY29uZm9ybXNUbyBDbGFzc2lmaWVyLWdlbmVyYWwuMSBDbGFzc2lmaWVyLWhhc1Zpc2liaWxpdHlPZiBDbGFzc2lmaWVyLWluaGVyaXQgQ2xhc3NpZmllci1pbmhlcml0YWJsZU1lbWJlcnMgQ2xhc3NpZmllci1pbmhlcml0ZWRNZW1iZXIuMSBDbGFzc2lmaWVyLWlzVGVtcGxhdGUgQ2xhc3NpZmllci1tYXlTcGVjaWFsaXplVHlwZSBDbGFzc2lmaWVyLXBhcmVudHMgQ2xhc3NpZmllci1kaXJlY3RseVJlYWxpemVkSW50ZXJmYWNlcyBDbGFzc2lmaWVyLWRpcmVjdGx5VXNlZEludGVyZmFjZXMgQ2xhc3NpZmllci1hbGxSZWFsaXplZEludGVyZmFjZXMgQ2xhc3NpZmllci1hbGxVc2VkSW50ZXJmYWNlcyBDbGFzc2lmaWVyLWlzU3Vic3RpdHV0YWJsZUZvciBDbGFzc2lmaWVyLWFsbEF0dHJpYnV0ZXMgQ2xhc3NpZmllci1hbGxTbG90dGFibGVGZWF0dXJlcyBDbGFzc2lmaWVyIENsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1hbGxvd1N1YnN0aXR1dGFibGUgQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWNvbnN0cmFpbmluZ0NsYXNzaWZpZXIgQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLXBhcmFtZXRlcmVkRWxlbWVudCBDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIgRmVhdHVyZS1mZWF0dXJpbmdDbGFzc2lmaWVyIEZlYXR1cmUtaXNTdGF0aWMgRmVhdHVyZSBHZW5lcmFsaXphdGlvbi1nZW5lcmFsIEdlbmVyYWxpemF0aW9uLWdlbmVyYWxpemF0aW9uU2V0IEdlbmVyYWxpemF0aW9uLWlzU3Vic3RpdHV0YWJsZSBHZW5lcmFsaXphdGlvbi1zcGVjaWZpYyBHZW5lcmFsaXphdGlvbiBHZW5lcmFsaXphdGlvblNldC1nZW5lcmFsaXphdGlvbiBHZW5lcmFsaXphdGlvblNldC1pc0NvdmVyaW5nIEdlbmVyYWxpemF0aW9uU2V0LWlzRGlzam9pbnQgR2VuZXJhbGl6YXRpb25TZXQtcG93ZXJ0eXBlIEdlbmVyYWxpemF0aW9uU2V0IEluc3RhbmNlU3BlY2lmaWNhdGlvbi1jbGFzc2lmaWVyIEluc3RhbmNlU3BlY2lmaWNhdGlvbi1zbG90IEluc3RhbmNlU3BlY2lmaWNhdGlvbi1zcGVjaWZpY2F0aW9uIEluc3RhbmNlU3BlY2lmaWNhdGlvbiBJbnN0YW5jZVZhbHVlLWluc3RhbmNlIEluc3RhbmNlVmFsdWUgT3BlcmF0aW9uLWJvZHlDb25kaXRpb24gT3BlcmF0aW9uLWNsYXNzIE9wZXJhdGlvbi1kYXRhdHlwZSBPcGVyYXRpb24taW50ZXJmYWNlIE9wZXJhdGlvbi1pc09yZGVyZWQgT3BlcmF0aW9uLWlzUXVlcnkgT3BlcmF0aW9uLWlzVW5pcXVlIE9wZXJhdGlvbi1sb3dlciBPcGVyYXRpb24tb3duZWRQYXJhbWV0ZXIgT3BlcmF0aW9uLXBvc3Rjb25kaXRpb24gT3BlcmF0aW9uLXByZWNvbmRpdGlvbiBPcGVyYXRpb24tcmFpc2VkRXhjZXB0aW9uIE9wZXJhdGlvbi1yZWRlZmluZWRPcGVyYXRpb24gT3BlcmF0aW9uLXRlbXBsYXRlUGFyYW1ldGVyIE9wZXJhdGlvbi10eXBlIE9wZXJhdGlvbi11cHBlciBPcGVyYXRpb24taXNDb25zaXN0ZW50V2l0aCBPcGVyYXRpb24taXNPcmRlcmVkLjEgT3BlcmF0aW9uLWlzVW5pcXVlLjEgT3BlcmF0aW9uLWxvd2VyLjEgT3BlcmF0aW9uLXJldHVyblJlc3VsdCBPcGVyYXRpb24tdHlwZS4xIE9wZXJhdGlvbi11cHBlci4xIE9wZXJhdGlvbiBPcGVyYXRpb25UZW1wbGF0ZVBhcmFtZXRlci1wYXJhbWV0ZXJlZEVsZW1lbnQgT3BlcmF0aW9uVGVtcGxhdGVQYXJhbWV0ZXIgUGFyYW1ldGVyLWRlZmF1bHQgUGFyYW1ldGVyLWRlZmF1bHRWYWx1ZSBQYXJhbWV0ZXItZGlyZWN0aW9uIFBhcmFtZXRlci1lZmZlY3QgUGFyYW1ldGVyLWlzRXhjZXB0aW9uIFBhcmFtZXRlci1pc1N0cmVhbSBQYXJhbWV0ZXItb3BlcmF0aW9uIFBhcmFtZXRlci1wYXJhbWV0ZXJTZXQgUGFyYW1ldGVyLWRlZmF1bHQuMSBQYXJhbWV0ZXIgUGFyYW1ldGVyU2V0LWNvbmRpdGlvbiBQYXJhbWV0ZXJTZXQtcGFyYW1ldGVyIFBhcmFtZXRlclNldCBQcm9wZXJ0eS1hZ2dyZWdhdGlvbiBQcm9wZXJ0eS1hc3NvY2lhdGlvbiBQcm9wZXJ0eS1hc3NvY2lhdGlvbkVuZCBQcm9wZXJ0eS1jbGFzcyBQcm9wZXJ0eS1kYXRhdHlwZSBQcm9wZXJ0eS1kZWZhdWx0VmFsdWUgUHJvcGVydHktaW50ZXJmYWNlIFByb3BlcnR5LWlzQ29tcG9zaXRlIFByb3BlcnR5LWlzRGVyaXZlZCBQcm9wZXJ0eS1pc0Rlcml2ZWRVbmlvbiBQcm9wZXJ0eS1pc0lEIFByb3BlcnR5LW9wcG9zaXRlIFByb3BlcnR5LW93bmluZ0Fzc29jaWF0aW9uIFByb3BlcnR5LXF1YWxpZmllciBQcm9wZXJ0eS1yZWRlZmluZWRQcm9wZXJ0eSBQcm9wZXJ0eS1zdWJzZXR0ZWRQcm9wZXJ0eSBQcm9wZXJ0eS1pc0F0dHJpYnV0ZSBQcm9wZXJ0eS1pc0NvbXBhdGlibGVXaXRoIFByb3BlcnR5LWlzQ29tcG9zaXRlLjEgUHJvcGVydHktaXNDb25zaXN0ZW50V2l0aCBQcm9wZXJ0eS1pc05hdmlnYWJsZSBQcm9wZXJ0eS1vcHBvc2l0ZS4xIFByb3BlcnR5LXN1YnNldHRpbmdDb250ZXh0IFByb3BlcnR5IFJlZGVmaW5hYmxlRWxlbWVudC1pc0xlYWYgUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5lZEVsZW1lbnQgUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5pdGlvbkNvbnRleHQgUmVkZWZpbmFibGVFbGVtZW50LWlzQ29uc2lzdGVudFdpdGggUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkIFJlZGVmaW5hYmxlRWxlbWVudCBSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWNsYXNzaWZpZXIgUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1leHRlbmRlZFNpZ25hdHVyZSBSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWluaGVyaXRlZFBhcmFtZXRlciBSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWluaGVyaXRlZFBhcmFtZXRlci4xIFJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaXNDb25zaXN0ZW50V2l0aCBSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlIFNsb3QtZGVmaW5pbmdGZWF0dXJlIFNsb3Qtb3duaW5nSW5zdGFuY2UgU2xvdC12YWx1ZSBTbG90IFN0cnVjdHVyYWxGZWF0dXJlLWlzUmVhZE9ubHkgU3RydWN0dXJhbEZlYXR1cmUgQWdncmVnYXRpb25LaW5kIENhbGxDb25jdXJyZW5jeUtpbmQgUGFyYW1ldGVyRGlyZWN0aW9uS2luZCBQYXJhbWV0ZXJFZmZlY3RLaW5kIEFfZGVmaW5pbmdGZWF0dXJlX3Nsb3Qtc2xvdCBBX2RlZmluaW5nRmVhdHVyZV9zbG90IEFfdmFsdWVfb3duaW5nU2xvdC1vd25pbmdTbG90IEFfdmFsdWVfb3duaW5nU2xvdCBBX2V4dGVuZGVkU2lnbmF0dXJlX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSBBX2V4dGVuZGVkU2lnbmF0dXJlX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUgQV9pbmhlcml0ZWRQYXJhbWV0ZXJfcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1yZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlIEFfaW5oZXJpdGVkUGFyYW1ldGVyX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUgQV9yZWRlZmluaXRpb25Db250ZXh0X3JlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluYWJsZUVsZW1lbnQgQV9yZWRlZmluaXRpb25Db250ZXh0X3JlZGVmaW5hYmxlRWxlbWVudCBBX3JlZGVmaW5lZEVsZW1lbnRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCBBX3JlZGVmaW5lZEVsZW1lbnRfcmVkZWZpbmFibGVFbGVtZW50IEFfcXVhbGlmaWVyX2Fzc29jaWF0aW9uRW5kIEFfcmVkZWZpbmVkUHJvcGVydHlfcHJvcGVydHktcHJvcGVydHkgQV9yZWRlZmluZWRQcm9wZXJ0eV9wcm9wZXJ0eSBBX2RlZmF1bHRWYWx1ZV9vd25pbmdQcm9wZXJ0eS1vd25pbmdQcm9wZXJ0eSBBX2RlZmF1bHRWYWx1ZV9vd25pbmdQcm9wZXJ0eSBBX29wcG9zaXRlX3Byb3BlcnR5LXByb3BlcnR5IEFfb3Bwb3NpdGVfcHJvcGVydHkgQV9zdWJzZXR0ZWRQcm9wZXJ0eV9wcm9wZXJ0eS1wcm9wZXJ0eSBBX3N1YnNldHRlZFByb3BlcnR5X3Byb3BlcnR5IEFfY29uZGl0aW9uX3BhcmFtZXRlclNldC1wYXJhbWV0ZXJTZXQgQV9jb25kaXRpb25fcGFyYW1ldGVyU2V0IEFfcGFyYW1ldGVyU2V0X3BhcmFtZXRlciBBX2RlZmF1bHRWYWx1ZV9vd25pbmdQYXJhbWV0ZXItb3duaW5nUGFyYW1ldGVyIEFfZGVmYXVsdFZhbHVlX293bmluZ1BhcmFtZXRlciBBX3R5cGVfb3BlcmF0aW9uLW9wZXJhdGlvbiBBX3R5cGVfb3BlcmF0aW9uIEFfb3BlcmF0aW9uX3RlbXBsYXRlUGFyYW1ldGVyX3BhcmFtZXRlcmVkRWxlbWVudCBBX2JvZHlDb25kaXRpb25fYm9keUNvbnRleHQtYm9keUNvbnRleHQgQV9ib2R5Q29uZGl0aW9uX2JvZHlDb250ZXh0IEFfcG9zdGNvbmRpdGlvbl9wb3N0Q29udGV4dC1wb3N0Q29udGV4dCBBX3Bvc3Rjb25kaXRpb25fcG9zdENvbnRleHQgQV9yZWRlZmluZWRPcGVyYXRpb25fb3BlcmF0aW9uLW9wZXJhdGlvbiBBX3JlZGVmaW5lZE9wZXJhdGlvbl9vcGVyYXRpb24gQV9yYWlzZWRFeGNlcHRpb25fb3BlcmF0aW9uLW9wZXJhdGlvbiBBX3JhaXNlZEV4Y2VwdGlvbl9vcGVyYXRpb24gQV9wcmVjb25kaXRpb25fcHJlQ29udGV4dC1wcmVDb250ZXh0IEFfcHJlY29uZGl0aW9uX3ByZUNvbnRleHQgQV9vd25lZFBhcmFtZXRlcl9vcGVyYXRpb24gQV9pbnN0YW5jZV9pbnN0YW5jZVZhbHVlLWluc3RhbmNlVmFsdWUgQV9pbnN0YW5jZV9pbnN0YW5jZVZhbHVlIEFfY2xhc3NpZmllcl9pbnN0YW5jZVNwZWNpZmljYXRpb24taW5zdGFuY2VTcGVjaWZpY2F0aW9uIEFfY2xhc3NpZmllcl9pbnN0YW5jZVNwZWNpZmljYXRpb24gQV9zbG90X293bmluZ0luc3RhbmNlIEFfc3BlY2lmaWNhdGlvbl9vd25pbmdJbnN0YW5jZVNwZWMtb3duaW5nSW5zdGFuY2VTcGVjIEFfc3BlY2lmaWNhdGlvbl9vd25pbmdJbnN0YW5jZVNwZWMgQV9nZW5lcmFsaXphdGlvblNldF9nZW5lcmFsaXphdGlvbiBBX2dlbmVyYWxfZ2VuZXJhbGl6YXRpb24tZ2VuZXJhbGl6YXRpb24gQV9nZW5lcmFsX2dlbmVyYWxpemF0aW9uIEFfY29uc3RyYWluaW5nQ2xhc3NpZmllcl9jbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItY2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIEFfY29uc3RyYWluaW5nQ2xhc3NpZmllcl9jbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIgQV9jbGFzc2lmaWVyX3RlbXBsYXRlUGFyYW1ldGVyX3BhcmFtZXRlcmVkRWxlbWVudCBBX3Bvd2VydHlwZUV4dGVudF9wb3dlcnR5cGUgQV9nZW5lcmFsaXphdGlvbl9zcGVjaWZpYyBBX2dlbmVyYWxfY2xhc3NpZmllci1jbGFzc2lmaWVyIEFfZ2VuZXJhbF9jbGFzc2lmaWVyIEFfZmVhdHVyZV9mZWF0dXJpbmdDbGFzc2lmaWVyIEFfc3Vic3RpdHV0aW9uX3N1YnN0aXR1dGluZ0NsYXNzaWZpZXIgQV9yZXByZXNlbnRhdGlvbl9jbGFzc2lmaWVyLWNsYXNzaWZpZXIgQV9yZXByZXNlbnRhdGlvbl9jbGFzc2lmaWVyIEFfb3duZWRUZW1wbGF0ZVNpZ25hdHVyZV9jbGFzc2lmaWVyIEFfaW5oZXJpdGVkTWVtYmVyX2luaGVyaXRpbmdDbGFzc2lmaWVyLWluaGVyaXRpbmdDbGFzc2lmaWVyIEFfaW5oZXJpdGVkTWVtYmVyX2luaGVyaXRpbmdDbGFzc2lmaWVyIEFfcmVkZWZpbmVkQ2xhc3NpZmllcl9jbGFzc2lmaWVyLWNsYXNzaWZpZXIgQV9yZWRlZmluZWRDbGFzc2lmaWVyX2NsYXNzaWZpZXIgQV9jb2xsYWJvcmF0aW9uVXNlX2NsYXNzaWZpZXItY2xhc3NpZmllciBBX2NvbGxhYm9yYXRpb25Vc2VfY2xhc3NpZmllciBBX2F0dHJpYnV0ZV9jbGFzc2lmaWVyLWNsYXNzaWZpZXIgQV9hdHRyaWJ1dGVfY2xhc3NpZmllciBBX293bmVkVXNlQ2FzZV9jbGFzc2lmaWVyLWNsYXNzaWZpZXIgQV9vd25lZFVzZUNhc2VfY2xhc3NpZmllciBBX293bmVkUGFyYW1ldGVyX293bmVyRm9ybWFsUGFyYW0tb3duZXJGb3JtYWxQYXJhbSBBX293bmVkUGFyYW1ldGVyX293bmVyRm9ybWFsUGFyYW0gQV9yYWlzZWRFeGNlcHRpb25fYmVoYXZpb3JhbEZlYXR1cmUtYmVoYXZpb3JhbEZlYXR1cmUgQV9yYWlzZWRFeGNlcHRpb25fYmVoYXZpb3JhbEZlYXR1cmUgQV9vd25lZFBhcmFtZXRlclNldF9iZWhhdmlvcmFsRmVhdHVyZS1iZWhhdmlvcmFsRmVhdHVyZSBBX293bmVkUGFyYW1ldGVyU2V0X2JlaGF2aW9yYWxGZWF0dXJlIEFfbWV0aG9kX3NwZWNpZmljYXRpb24gQV9jb250cmFjdF9zdWJzdGl0dXRpb24tc3Vic3RpdHV0aW9uIEFfY29udHJhY3Rfc3Vic3RpdHV0aW9uIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZ1bWwyMkYyLjAuMDJGVU1MLV9VTUwyRkNvbW1vbkJlaGF2aW9yIiBzb3VyY2U9IlVNTC9Db21tb25CZWhhdmlvciIgcmVmZXJlbmNlcz0iQW55UmVjZWl2ZUV2ZW50IEJlaGF2aW9yLWNvbnRleHQgQmVoYXZpb3ItaXNSZWVudHJhbnQgQmVoYXZpb3Itb3duZWRQYXJhbWV0ZXIgQmVoYXZpb3Itb3duZWRQYXJhbWV0ZXJTZXQgQmVoYXZpb3ItcG9zdGNvbmRpdGlvbiBCZWhhdmlvci1wcmVjb25kaXRpb24gQmVoYXZpb3Itc3BlY2lmaWNhdGlvbiBCZWhhdmlvci1yZWRlZmluZWRCZWhhdmlvciBCZWhhdmlvci1jb250ZXh0LjEgQmVoYXZpb3ItYmVoYXZpb3JlZENsYXNzaWZpZXIgQmVoYXZpb3ItaW5wdXRQYXJhbWV0ZXJzIEJlaGF2aW9yLW91dHB1dFBhcmFtZXRlcnMgQmVoYXZpb3IgQ2FsbEV2ZW50LW9wZXJhdGlvbiBDYWxsRXZlbnQgQ2hhbmdlRXZlbnQtY2hhbmdlRXhwcmVzc2lvbiBDaGFuZ2VFdmVudCBFdmVudCBGdW5jdGlvbkJlaGF2aW9yLWhhc0FsbERhdGFUeXBlQXR0cmlidXRlcyBGdW5jdGlvbkJlaGF2aW9yIE1lc3NhZ2VFdmVudCBPcGFxdWVCZWhhdmlvci1ib2R5IE9wYXF1ZUJlaGF2aW9yLWxhbmd1YWdlIE9wYXF1ZUJlaGF2aW9yIFNpZ25hbEV2ZW50LXNpZ25hbCBTaWduYWxFdmVudCBUaW1lRXZlbnQtaXNSZWxhdGl2ZSBUaW1lRXZlbnQtd2hlbiBUaW1lRXZlbnQgVHJpZ2dlci1ldmVudCBUcmlnZ2VyLXBvcnQgVHJpZ2dlciBBX2V2ZW50X3RyaWdnZXItdHJpZ2dlciBBX2V2ZW50X3RyaWdnZXIgQV9wb3J0X3RyaWdnZXItdHJpZ2dlciBBX3BvcnRfdHJpZ2dlciBBX3doZW5fdGltZUV2ZW50LXRpbWVFdmVudCBBX3doZW5fdGltZUV2ZW50IEFfc2lnbmFsX3NpZ25hbEV2ZW50LXNpZ25hbEV2ZW50IEFfc2lnbmFsX3NpZ25hbEV2ZW50IEFfY2hhbmdlRXhwcmVzc2lvbl9jaGFuZ2VFdmVudC1jaGFuZ2VFdmVudCBBX2NoYW5nZUV4cHJlc3Npb25fY2hhbmdlRXZlbnQgQV9vcGVyYXRpb25fY2FsbEV2ZW50LWNhbGxFdmVudCBBX29wZXJhdGlvbl9jYWxsRXZlbnQgQV9vd25lZFBhcmFtZXRlclNldF9iZWhhdmlvci1iZWhhdmlvciBBX293bmVkUGFyYW1ldGVyU2V0X2JlaGF2aW9yIEFfY29udGV4dF9iZWhhdmlvci1iZWhhdmlvciBBX2NvbnRleHRfYmVoYXZpb3IgQV9wcmVjb25kaXRpb25fYmVoYXZpb3ItYmVoYXZpb3IgQV9wcmVjb25kaXRpb25fYmVoYXZpb3IgQV9wb3N0Y29uZGl0aW9uX2JlaGF2aW9yLWJlaGF2aW9yIEFfcG9zdGNvbmRpdGlvbl9iZWhhdmlvciBBX3JlZGVmaW5lZEJlaGF2aW9yX2JlaGF2aW9yLWJlaGF2aW9yIEFfcmVkZWZpbmVkQmVoYXZpb3JfYmVoYXZpb3IgQV9vd25lZFBhcmFtZXRlcl9iZWhhdmlvci1iZWhhdmlvciBBX293bmVkUGFyYW1ldGVyX2JlaGF2aW9yIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZ1bWwyMkYyLjAuMDJGVU1MLV9VTUwyRkNvbW1vblN0cnVjdHVyZSIgc291cmNlPSJVTUwvQ29tbW9uU3RydWN0dXJlIiByZWZlcmVuY2VzPSJBYnN0cmFjdGlvbi1tYXBwaW5nIEFic3RyYWN0aW9uIENvbW1lbnQtYW5ub3RhdGVkRWxlbWVudCBDb21tZW50LWJvZHkgQ29tbWVudCBDb25zdHJhaW50LWNvbnN0cmFpbmVkRWxlbWVudCBDb25zdHJhaW50LWNvbnRleHQgQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uIENvbnN0cmFpbnQgRGVwZW5kZW5jeS1jbGllbnQgRGVwZW5kZW5jeS1zdXBwbGllciBEZXBlbmRlbmN5IERpcmVjdGVkUmVsYXRpb25zaGlwLXNvdXJjZSBEaXJlY3RlZFJlbGF0aW9uc2hpcC10YXJnZXQgRGlyZWN0ZWRSZWxhdGlvbnNoaXAgRWxlbWVudC1vd25lZENvbW1lbnQgRWxlbWVudC1vd25lZEVsZW1lbnQgRWxlbWVudC1vd25lciBFbGVtZW50LWFsbE93bmVkRWxlbWVudHMgRWxlbWVudC1tdXN0QmVPd25lZCBFbGVtZW50IEVsZW1lbnRJbXBvcnQtYWxpYXMgRWxlbWVudEltcG9ydC1pbXBvcnRlZEVsZW1lbnQgRWxlbWVudEltcG9ydC1pbXBvcnRpbmdOYW1lc3BhY2UgRWxlbWVudEltcG9ydC12aXNpYmlsaXR5IEVsZW1lbnRJbXBvcnQtZ2V0TmFtZSBFbGVtZW50SW1wb3J0IE11bHRpcGxpY2l0eUVsZW1lbnQtaXNPcmRlcmVkIE11bHRpcGxpY2l0eUVsZW1lbnQtaXNVbmlxdWUgTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlciBNdWx0aXBsaWNpdHlFbGVtZW50LWxvd2VyVmFsdWUgTXVsdGlwbGljaXR5RWxlbWVudC11cHBlciBNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyVmFsdWUgTXVsdGlwbGljaXR5RWxlbWVudC1jb21wYXRpYmxlV2l0aCBNdWx0aXBsaWNpdHlFbGVtZW50LWluY2x1ZGVzTXVsdGlwbGljaXR5IE11bHRpcGxpY2l0eUVsZW1lbnQtaXMgTXVsdGlwbGljaXR5RWxlbWVudC1pc011bHRpdmFsdWVkIE11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXIuMSBNdWx0aXBsaWNpdHlFbGVtZW50LWxvd2VyQm91bmQgTXVsdGlwbGljaXR5RWxlbWVudC11cHBlci4xIE11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXJCb3VuZCBNdWx0aXBsaWNpdHlFbGVtZW50IE5hbWVkRWxlbWVudC1jbGllbnREZXBlbmRlbmN5IE5hbWVkRWxlbWVudC1uYW1lIE5hbWVkRWxlbWVudC1uYW1lRXhwcmVzc2lvbiBOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIE5hbWVkRWxlbWVudC1xdWFsaWZpZWROYW1lIE5hbWVkRWxlbWVudC12aXNpYmlsaXR5IE5hbWVkRWxlbWVudC1hbGxOYW1lc3BhY2VzIE5hbWVkRWxlbWVudC1hbGxPd25pbmdQYWNrYWdlcyBOYW1lZEVsZW1lbnQtaXNEaXN0aW5ndWlzaGFibGVGcm9tIE5hbWVkRWxlbWVudC1xdWFsaWZpZWROYW1lLjEgTmFtZWRFbGVtZW50LXNlcGFyYXRvciBOYW1lZEVsZW1lbnQtY2xpZW50RGVwZW5kZW5jeS4xIE5hbWVkRWxlbWVudCBOYW1lc3BhY2UtZWxlbWVudEltcG9ydCBOYW1lc3BhY2UtaW1wb3J0ZWRNZW1iZXIgTmFtZXNwYWNlLW1lbWJlciBOYW1lc3BhY2Utb3duZWRNZW1iZXIgTmFtZXNwYWNlLW93bmVkUnVsZSBOYW1lc3BhY2UtcGFja2FnZUltcG9ydCBOYW1lc3BhY2UtZXhjbHVkZUNvbGxpc2lvbnMgTmFtZXNwYWNlLWdldE5hbWVzT2ZNZW1iZXIgTmFtZXNwYWNlLWltcG9ydE1lbWJlcnMgTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyLjEgTmFtZXNwYWNlLW1lbWJlcnNBcmVEaXN0aW5ndWlzaGFibGUgTmFtZXNwYWNlIFBhY2thZ2VhYmxlRWxlbWVudC12aXNpYmlsaXR5IFBhY2thZ2VhYmxlRWxlbWVudCBQYWNrYWdlSW1wb3J0LWltcG9ydGVkUGFja2FnZSBQYWNrYWdlSW1wb3J0LWltcG9ydGluZ05hbWVzcGFjZSBQYWNrYWdlSW1wb3J0LXZpc2liaWxpdHkgUGFja2FnZUltcG9ydCBQYXJhbWV0ZXJhYmxlRWxlbWVudC1vd25pbmdUZW1wbGF0ZVBhcmFtZXRlciBQYXJhbWV0ZXJhYmxlRWxlbWVudC10ZW1wbGF0ZVBhcmFtZXRlciBQYXJhbWV0ZXJhYmxlRWxlbWVudC1pc0NvbXBhdGlibGVXaXRoIFBhcmFtZXRlcmFibGVFbGVtZW50LWlzVGVtcGxhdGVQYXJhbWV0ZXIgUGFyYW1ldGVyYWJsZUVsZW1lbnQgUmVhbGl6YXRpb24gUmVsYXRpb25zaGlwLXJlbGF0ZWRFbGVtZW50IFJlbGF0aW9uc2hpcCBUZW1wbGF0ZWFibGVFbGVtZW50LW93bmVkVGVtcGxhdGVTaWduYXR1cmUgVGVtcGxhdGVhYmxlRWxlbWVudC10ZW1wbGF0ZUJpbmRpbmcgVGVtcGxhdGVhYmxlRWxlbWVudC1pc1RlbXBsYXRlIFRlbXBsYXRlYWJsZUVsZW1lbnQtcGFyYW1ldGVyYWJsZUVsZW1lbnRzIFRlbXBsYXRlYWJsZUVsZW1lbnQgVGVtcGxhdGVCaW5kaW5nLWJvdW5kRWxlbWVudCBUZW1wbGF0ZUJpbmRpbmctcGFyYW1ldGVyU3Vic3RpdHV0aW9uIFRlbXBsYXRlQmluZGluZy1zaWduYXR1cmUgVGVtcGxhdGVCaW5kaW5nIFRlbXBsYXRlUGFyYW1ldGVyLWRlZmF1bHQgVGVtcGxhdGVQYXJhbWV0ZXItb3duZWREZWZhdWx0IFRlbXBsYXRlUGFyYW1ldGVyLW93bmVkUGFyYW1ldGVyZWRFbGVtZW50IFRlbXBsYXRlUGFyYW1ldGVyLXBhcmFtZXRlcmVkRWxlbWVudCBUZW1wbGF0ZVBhcmFtZXRlci1zaWduYXR1cmUgVGVtcGxhdGVQYXJhbWV0ZXIgVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tYWN0dWFsIFRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLWZvcm1hbCBUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1vd25lZEFjdHVhbCBUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi10ZW1wbGF0ZUJpbmRpbmcgVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24gVGVtcGxhdGVTaWduYXR1cmUtb3duZWRQYXJhbWV0ZXIgVGVtcGxhdGVTaWduYXR1cmUtcGFyYW1ldGVyIFRlbXBsYXRlU2lnbmF0dXJlLXRlbXBsYXRlIFRlbXBsYXRlU2lnbmF0dXJlIFR5cGUtcGFja2FnZSBUeXBlLWNvbmZvcm1zVG8gVHlwZSBUeXBlZEVsZW1lbnQtdHlwZSBUeXBlZEVsZW1lbnQgVXNhZ2UgVmlzaWJpbGl0eUtpbmQgQV90eXBlX3R5cGVkRWxlbWVudC10eXBlZEVsZW1lbnQgQV90eXBlX3R5cGVkRWxlbWVudCBBX293bmVkUGFyYW1ldGVyX3NpZ25hdHVyZSBBX3BhcmFtZXRlcl90ZW1wbGF0ZVNpZ25hdHVyZS10ZW1wbGF0ZVNpZ25hdHVyZSBBX3BhcmFtZXRlcl90ZW1wbGF0ZVNpZ25hdHVyZSBBX2FjdHVhbF90ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi10ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiBBX2FjdHVhbF90ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiBBX293bmVkQWN0dWFsX293bmluZ1RlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLW93bmluZ1RlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uIEFfb3duZWRBY3R1YWxfb3duaW5nVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24gQV9mb3JtYWxfdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24gQV9mb3JtYWxfdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24gQV9vd25lZERlZmF1bHRfdGVtcGxhdGVQYXJhbWV0ZXItdGVtcGxhdGVQYXJhbWV0ZXIgQV9vd25lZERlZmF1bHRfdGVtcGxhdGVQYXJhbWV0ZXIgQV9vd25lZFBhcmFtZXRlcmVkRWxlbWVudF9vd25pbmdUZW1wbGF0ZVBhcmFtZXRlciBBX2RlZmF1bHRfdGVtcGxhdGVQYXJhbWV0ZXItdGVtcGxhdGVQYXJhbWV0ZXIgQV9kZWZhdWx0X3RlbXBsYXRlUGFyYW1ldGVyIEFfcGFyYW1ldGVyZWRFbGVtZW50X3RlbXBsYXRlUGFyYW1ldGVyIEFfc2lnbmF0dXJlX3RlbXBsYXRlQmluZGluZy10ZW1wbGF0ZUJpbmRpbmcgQV9zaWduYXR1cmVfdGVtcGxhdGVCaW5kaW5nIEFfcGFyYW1ldGVyU3Vic3RpdHV0aW9uX3RlbXBsYXRlQmluZGluZyBBX3RlbXBsYXRlQmluZGluZ19ib3VuZEVsZW1lbnQgQV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlX3RlbXBsYXRlIEFfcmVsYXRlZEVsZW1lbnRfcmVsYXRpb25zaGlwLXJlbGF0aW9uc2hpcCBBX3JlbGF0ZWRFbGVtZW50X3JlbGF0aW9uc2hpcCBBX2ltcG9ydGVkUGFja2FnZV9wYWNrYWdlSW1wb3J0LXBhY2thZ2VJbXBvcnQgQV9pbXBvcnRlZFBhY2thZ2VfcGFja2FnZUltcG9ydCBBX2VsZW1lbnRJbXBvcnRfaW1wb3J0aW5nTmFtZXNwYWNlIEFfb3duZWRNZW1iZXJfbmFtZXNwYWNlIEFfb3duZWRSdWxlX2NvbnRleHQgQV9wYWNrYWdlSW1wb3J0X2ltcG9ydGluZ05hbWVzcGFjZSBBX21lbWJlcl9tZW1iZXJOYW1lc3BhY2UtbWVtYmVyTmFtZXNwYWNlIEFfbWVtYmVyX21lbWJlck5hbWVzcGFjZSBBX2ltcG9ydGVkTWVtYmVyX25hbWVzcGFjZS1uYW1lc3BhY2UgQV9pbXBvcnRlZE1lbWJlcl9uYW1lc3BhY2UgQV9uYW1lRXhwcmVzc2lvbl9uYW1lZEVsZW1lbnQtbmFtZWRFbGVtZW50IEFfbmFtZUV4cHJlc3Npb25fbmFtZWRFbGVtZW50IEFfY2xpZW50RGVwZW5kZW5jeV9jbGllbnQgQV9sb3dlclZhbHVlX293bmluZ0xvd2VyLW93bmluZ0xvd2VyIEFfbG93ZXJWYWx1ZV9vd25pbmdMb3dlciBBX3VwcGVyVmFsdWVfb3duaW5nVXBwZXItb3duaW5nVXBwZXIgQV91cHBlclZhbHVlX293bmluZ1VwcGVyIEFfaW1wb3J0ZWRFbGVtZW50X2ltcG9ydC1pbXBvcnQgQV9pbXBvcnRlZEVsZW1lbnRfaW1wb3J0IEFfb3duZWRFbGVtZW50X293bmVyIEFfb3duZWRDb21tZW50X293bmluZ0VsZW1lbnQtb3duaW5nRWxlbWVudCBBX293bmVkQ29tbWVudF9vd25pbmdFbGVtZW50IEFfc291cmNlX2RpcmVjdGVkUmVsYXRpb25zaGlwLWRpcmVjdGVkUmVsYXRpb25zaGlwIEFfc291cmNlX2RpcmVjdGVkUmVsYXRpb25zaGlwIEFfdGFyZ2V0X2RpcmVjdGVkUmVsYXRpb25zaGlwLWRpcmVjdGVkUmVsYXRpb25zaGlwIEFfdGFyZ2V0X2RpcmVjdGVkUmVsYXRpb25zaGlwIEFfc3VwcGxpZXJfc3VwcGxpZXJEZXBlbmRlbmN5LXN1cHBsaWVyRGVwZW5kZW5jeSBBX3N1cHBsaWVyX3N1cHBsaWVyRGVwZW5kZW5jeSBBX2NvbnN0cmFpbmVkRWxlbWVudF9jb25zdHJhaW50LWNvbnN0cmFpbnQgQV9jb25zdHJhaW5lZEVsZW1lbnRfY29uc3RyYWludCBBX3NwZWNpZmljYXRpb25fb3duaW5nQ29uc3RyYWludC1vd25pbmdDb25zdHJhaW50IEFfc3BlY2lmaWNhdGlvbl9vd25pbmdDb25zdHJhaW50IEFfYW5ub3RhdGVkRWxlbWVudF9jb21tZW50LWNvbW1lbnQgQV9hbm5vdGF0ZWRFbGVtZW50X2NvbW1lbnQgQV9tYXBwaW5nX2Fic3RyYWN0aW9uLWFic3RyYWN0aW9uIEFfbWFwcGluZ19hYnN0cmFjdGlvbiIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGdW1sMjJGMi4wLjAyRlVNTC1fVU1MMkZEZXBsb3ltZW50cyIgc291cmNlPSJVTUwvRGVwbG95bWVudHMiIHJlZmVyZW5jZXM9IkFydGlmYWN0LWZpbGVOYW1lIEFydGlmYWN0LW1hbmlmZXN0YXRpb24gQXJ0aWZhY3QtbmVzdGVkQXJ0aWZhY3QgQXJ0aWZhY3Qtb3duZWRBdHRyaWJ1dGUgQXJ0aWZhY3Qtb3duZWRPcGVyYXRpb24gQXJ0aWZhY3QgQ29tbXVuaWNhdGlvblBhdGggRGVwbG95ZWRBcnRpZmFjdCBEZXBsb3ltZW50LWNvbmZpZ3VyYXRpb24gRGVwbG95bWVudC1kZXBsb3llZEFydGlmYWN0IERlcGxveW1lbnQtbG9jYXRpb24gRGVwbG95bWVudCBEZXBsb3ltZW50U3BlY2lmaWNhdGlvbi1kZXBsb3ltZW50IERlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWRlcGxveW1lbnRMb2NhdGlvbiBEZXBsb3ltZW50U3BlY2lmaWNhdGlvbi1leGVjdXRpb25Mb2NhdGlvbiBEZXBsb3ltZW50U3BlY2lmaWNhdGlvbiBEZXBsb3ltZW50VGFyZ2V0LWRlcGxveWVkRWxlbWVudCBEZXBsb3ltZW50VGFyZ2V0LWRlcGxveW1lbnQgRGVwbG95bWVudFRhcmdldC1kZXBsb3llZEVsZW1lbnQuMSBEZXBsb3ltZW50VGFyZ2V0IERldmljZSBFeGVjdXRpb25FbnZpcm9ubWVudCBNYW5pZmVzdGF0aW9uLXV0aWxpemVkRWxlbWVudCBNYW5pZmVzdGF0aW9uIE5vZGUtbmVzdGVkTm9kZSBOb2RlIEFfbmVzdGVkTm9kZV9ub2RlLW5vZGUgQV9uZXN0ZWROb2RlX25vZGUgQV91dGlsaXplZEVsZW1lbnRfbWFuaWZlc3RhdGlvbi1tYW5pZmVzdGF0aW9uIEFfdXRpbGl6ZWRFbGVtZW50X21hbmlmZXN0YXRpb24gQV9kZXBsb3llZEVsZW1lbnRfZGVwbG95bWVudFRhcmdldC1kZXBsb3ltZW50VGFyZ2V0IEFfZGVwbG95ZWRFbGVtZW50X2RlcGxveW1lbnRUYXJnZXQgQV9kZXBsb3ltZW50X2xvY2F0aW9uIEFfZGVwbG95ZWRBcnRpZmFjdF9kZXBsb3ltZW50Rm9yQXJ0aWZhY3QtZGVwbG95bWVudEZvckFydGlmYWN0IEFfZGVwbG95ZWRBcnRpZmFjdF9kZXBsb3ltZW50Rm9yQXJ0aWZhY3QgQV9jb25maWd1cmF0aW9uX2RlcGxveW1lbnQgQV9vd25lZEF0dHJpYnV0ZV9hcnRpZmFjdC1hcnRpZmFjdCBBX293bmVkQXR0cmlidXRlX2FydGlmYWN0IEFfb3duZWRPcGVyYXRpb25fYXJ0aWZhY3QtYXJ0aWZhY3QgQV9vd25lZE9wZXJhdGlvbl9hcnRpZmFjdCBBX25lc3RlZEFydGlmYWN0X2FydGlmYWN0LWFydGlmYWN0IEFfbmVzdGVkQXJ0aWZhY3RfYXJ0aWZhY3QgQV9tYW5pZmVzdGF0aW9uX2FydGlmYWN0LWFydGlmYWN0IEFfbWFuaWZlc3RhdGlvbl9hcnRpZmFjdCIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGdW1sMjJGMi4wLjAyRlVNTC1fVU1MMkZJbmZvcm1hdGlvbkZsb3dzIiBzb3VyY2U9IlVNTC9JbmZvcm1hdGlvbkZsb3dzIiByZWZlcmVuY2VzPSJJbmZvcm1hdGlvbkZsb3ctY29udmV5ZWQgSW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uU291cmNlIEluZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvblRhcmdldCBJbmZvcm1hdGlvbkZsb3ctcmVhbGl6YXRpb24gSW5mb3JtYXRpb25GbG93LXJlYWxpemluZ0FjdGl2aXR5RWRnZSBJbmZvcm1hdGlvbkZsb3ctcmVhbGl6aW5nQ29ubmVjdG9yIEluZm9ybWF0aW9uRmxvdy1yZWFsaXppbmdNZXNzYWdlIEluZm9ybWF0aW9uRmxvdyBJbmZvcm1hdGlvbkl0ZW0tcmVwcmVzZW50ZWQgSW5mb3JtYXRpb25JdGVtIEFfcmVwcmVzZW50ZWRfcmVwcmVzZW50YXRpb24tcmVwcmVzZW50YXRpb24gQV9yZXByZXNlbnRlZF9yZXByZXNlbnRhdGlvbiBBX2NvbnZleWVkX2NvbnZleWluZ0Zsb3ctY29udmV5aW5nRmxvdyBBX2NvbnZleWVkX2NvbnZleWluZ0Zsb3cgQV9yZWFsaXppbmdBY3Rpdml0eUVkZ2VfaW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uRmxvdyBBX3JlYWxpemluZ0FjdGl2aXR5RWRnZV9pbmZvcm1hdGlvbkZsb3cgQV9yZWFsaXppbmdNZXNzYWdlX2luZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvbkZsb3cgQV9yZWFsaXppbmdNZXNzYWdlX2luZm9ybWF0aW9uRmxvdyBBX2luZm9ybWF0aW9uU291cmNlX2luZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvbkZsb3cgQV9pbmZvcm1hdGlvblNvdXJjZV9pbmZvcm1hdGlvbkZsb3cgQV9yZWFsaXphdGlvbl9hYnN0cmFjdGlvbl9mbG93LWFic3RyYWN0aW9uIEFfcmVhbGl6YXRpb25fYWJzdHJhY3Rpb25fZmxvdyBBX3JlYWxpemluZ0Nvbm5lY3Rvcl9pbmZvcm1hdGlvbkZsb3ctaW5mb3JtYXRpb25GbG93IEFfcmVhbGl6aW5nQ29ubmVjdG9yX2luZm9ybWF0aW9uRmxvdyBBX2luZm9ybWF0aW9uVGFyZ2V0X2luZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvbkZsb3cgQV9pbmZvcm1hdGlvblRhcmdldF9pbmZvcm1hdGlvbkZsb3ciLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfaHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwtX1VNTDJGSW50ZXJhY3Rpb25zIiBzb3VyY2U9IlVNTC9JbnRlcmFjdGlvbnMiIHJlZmVyZW5jZXM9IkFjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24tYWN0aW9uIEFjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24gQmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uLWJlaGF2aW9yIEJlaGF2aW9yRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiBDb21iaW5lZEZyYWdtZW50LWNmcmFnbWVudEdhdGUgQ29tYmluZWRGcmFnbWVudC1pbnRlcmFjdGlvbk9wZXJhdG9yIENvbWJpbmVkRnJhZ21lbnQtb3BlcmFuZCBDb21iaW5lZEZyYWdtZW50IENvbnNpZGVySWdub3JlRnJhZ21lbnQtbWVzc2FnZSBDb25zaWRlcklnbm9yZUZyYWdtZW50IENvbnRpbnVhdGlvbi1zZXR0aW5nIENvbnRpbnVhdGlvbiBEZXN0cnVjdGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIEV4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLWV4ZWN1dGlvbiBFeGVjdXRpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiBFeGVjdXRpb25TcGVjaWZpY2F0aW9uLWZpbmlzaCBFeGVjdXRpb25TcGVjaWZpY2F0aW9uLXN0YXJ0IEV4ZWN1dGlvblNwZWNpZmljYXRpb24gR2F0ZS1pc091dHNpZGVDRiBHYXRlLWlzSW5zaWRlQ0YgR2F0ZS1pc0FjdHVhbCBHYXRlLWlzRm9ybWFsIEdhdGUtZ2V0TmFtZSBHYXRlLW1hdGNoZXMgR2F0ZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20gR2F0ZS1nZXRPcGVyYW5kIEdhdGUgR2VuZXJhbE9yZGVyaW5nLWFmdGVyIEdlbmVyYWxPcmRlcmluZy1iZWZvcmUgR2VuZXJhbE9yZGVyaW5nIEludGVyYWN0aW9uLWFjdGlvbiBJbnRlcmFjdGlvbi1mb3JtYWxHYXRlIEludGVyYWN0aW9uLWZyYWdtZW50IEludGVyYWN0aW9uLWxpZmVsaW5lIEludGVyYWN0aW9uLW1lc3NhZ2UgSW50ZXJhY3Rpb24gSW50ZXJhY3Rpb25Db25zdHJhaW50LW1heGludCBJbnRlcmFjdGlvbkNvbnN0cmFpbnQtbWluaW50IEludGVyYWN0aW9uQ29uc3RyYWludCBJbnRlcmFjdGlvbkZyYWdtZW50LWNvdmVyZWQgSW50ZXJhY3Rpb25GcmFnbWVudC1lbmNsb3NpbmdJbnRlcmFjdGlvbiBJbnRlcmFjdGlvbkZyYWdtZW50LWVuY2xvc2luZ09wZXJhbmQgSW50ZXJhY3Rpb25GcmFnbWVudC1nZW5lcmFsT3JkZXJpbmcgSW50ZXJhY3Rpb25GcmFnbWVudCBJbnRlcmFjdGlvbk9wZXJhbmQtZnJhZ21lbnQgSW50ZXJhY3Rpb25PcGVyYW5kLWd1YXJkIEludGVyYWN0aW9uT3BlcmFuZCBJbnRlcmFjdGlvblVzZS1hY3R1YWxHYXRlIEludGVyYWN0aW9uVXNlLWFyZ3VtZW50IEludGVyYWN0aW9uVXNlLXJlZmVyc1RvIEludGVyYWN0aW9uVXNlLXJldHVyblZhbHVlIEludGVyYWN0aW9uVXNlLXJldHVyblZhbHVlUmVjaXBpZW50IEludGVyYWN0aW9uVXNlIExpZmVsaW5lLWNvdmVyZWRCeSBMaWZlbGluZS1kZWNvbXBvc2VkQXMgTGlmZWxpbmUtaW50ZXJhY3Rpb24gTGlmZWxpbmUtcmVwcmVzZW50cyBMaWZlbGluZS1zZWxlY3RvciBMaWZlbGluZSBNZXNzYWdlLWFyZ3VtZW50IE1lc3NhZ2UtY29ubmVjdG9yIE1lc3NhZ2UtaW50ZXJhY3Rpb24gTWVzc2FnZS1tZXNzYWdlS2luZCBNZXNzYWdlLW1lc3NhZ2VTb3J0IE1lc3NhZ2UtcmVjZWl2ZUV2ZW50IE1lc3NhZ2Utc2VuZEV2ZW50IE1lc3NhZ2Utc2lnbmF0dXJlIE1lc3NhZ2UtbWVzc2FnZUtpbmQuMSBNZXNzYWdlLWlzRGlzdGluZ3Vpc2hhYmxlRnJvbSBNZXNzYWdlIE1lc3NhZ2VFbmQtbWVzc2FnZSBNZXNzYWdlRW5kLW9wcG9zaXRlRW5kIE1lc3NhZ2VFbmQtaXNTZW5kIE1lc3NhZ2VFbmQtaXNSZWNlaXZlIE1lc3NhZ2VFbmQtZW5jbG9zaW5nRnJhZ21lbnQgTWVzc2FnZUVuZCBNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tY292ZXJlZCBPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi10b0FmdGVyIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLXRvQmVmb3JlIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIFBhcnREZWNvbXBvc2l0aW9uIFN0YXRlSW52YXJpYW50LWNvdmVyZWQgU3RhdGVJbnZhcmlhbnQtaW52YXJpYW50IFN0YXRlSW52YXJpYW50IEludGVyYWN0aW9uT3BlcmF0b3JLaW5kIE1lc3NhZ2VLaW5kIE1lc3NhZ2VTb3J0IEFfaW52YXJpYW50X3N0YXRlSW52YXJpYW50LXN0YXRlSW52YXJpYW50IEFfaW52YXJpYW50X3N0YXRlSW52YXJpYW50IEFfY292ZXJlZF9zdGF0ZUludmFyaWFudC1zdGF0ZUludmFyaWFudCBBX2NvdmVyZWRfc3RhdGVJbnZhcmlhbnQgQV9jb3ZlcmVkX2V2ZW50cy1ldmVudHMgQV9jb3ZlcmVkX2V2ZW50cyBBX3RvQmVmb3JlX2FmdGVyIEFfbWVzc2FnZV9tZXNzYWdlRW5kLW1lc3NhZ2VFbmQgQV9tZXNzYWdlX21lc3NhZ2VFbmQgQV9zaWduYXR1cmVfbWVzc2FnZS1tZXNzYWdlIEFfc2lnbmF0dXJlX21lc3NhZ2UgQV9jb25uZWN0b3JfbWVzc2FnZS1tZXNzYWdlIEFfY29ubmVjdG9yX21lc3NhZ2UgQV9yZWNlaXZlRXZlbnRfZW5kTWVzc2FnZS1lbmRNZXNzYWdlIEFfcmVjZWl2ZUV2ZW50X2VuZE1lc3NhZ2UgQV9zZW5kRXZlbnRfZW5kTWVzc2FnZS1lbmRNZXNzYWdlIEFfc2VuZEV2ZW50X2VuZE1lc3NhZ2UgQV9hcmd1bWVudF9tZXNzYWdlLW1lc3NhZ2UgQV9hcmd1bWVudF9tZXNzYWdlIEFfc2VsZWN0b3JfbGlmZWxpbmUtbGlmZWxpbmUgQV9zZWxlY3Rvcl9saWZlbGluZSBBX2RlY29tcG9zZWRBc19saWZlbGluZS1saWZlbGluZSBBX2RlY29tcG9zZWRBc19saWZlbGluZSBBX3JlcHJlc2VudHNfbGlmZWxpbmUtbGlmZWxpbmUgQV9yZXByZXNlbnRzX2xpZmVsaW5lIEFfcmV0dXJuVmFsdWVSZWNpcGllbnRfaW50ZXJhY3Rpb25Vc2UtaW50ZXJhY3Rpb25Vc2UgQV9yZXR1cm5WYWx1ZVJlY2lwaWVudF9pbnRlcmFjdGlvblVzZSBBX3JlZmVyc1RvX2ludGVyYWN0aW9uVXNlLWludGVyYWN0aW9uVXNlIEFfcmVmZXJzVG9faW50ZXJhY3Rpb25Vc2UgQV9yZXR1cm5WYWx1ZV9pbnRlcmFjdGlvblVzZS1pbnRlcmFjdGlvblVzZSBBX3JldHVyblZhbHVlX2ludGVyYWN0aW9uVXNlIEFfYXJndW1lbnRfaW50ZXJhY3Rpb25Vc2UtaW50ZXJhY3Rpb25Vc2UgQV9hcmd1bWVudF9pbnRlcmFjdGlvblVzZSBBX2FjdHVhbEdhdGVfaW50ZXJhY3Rpb25Vc2UtaW50ZXJhY3Rpb25Vc2UgQV9hY3R1YWxHYXRlX2ludGVyYWN0aW9uVXNlIEFfZnJhZ21lbnRfZW5jbG9zaW5nT3BlcmFuZCBBX2d1YXJkX2ludGVyYWN0aW9uT3BlcmFuZC1pbnRlcmFjdGlvbk9wZXJhbmQgQV9ndWFyZF9pbnRlcmFjdGlvbk9wZXJhbmQgQV9nZW5lcmFsT3JkZXJpbmdfaW50ZXJhY3Rpb25GcmFnbWVudC1pbnRlcmFjdGlvbkZyYWdtZW50IEFfZ2VuZXJhbE9yZGVyaW5nX2ludGVyYWN0aW9uRnJhZ21lbnQgQV9jb3ZlcmVkX2NvdmVyZWRCeSBBX21pbmludF9pbnRlcmFjdGlvbkNvbnN0cmFpbnQtaW50ZXJhY3Rpb25Db25zdHJhaW50IEFfbWluaW50X2ludGVyYWN0aW9uQ29uc3RyYWludCBBX21heGludF9pbnRlcmFjdGlvbkNvbnN0cmFpbnQtaW50ZXJhY3Rpb25Db25zdHJhaW50IEFfbWF4aW50X2ludGVyYWN0aW9uQ29uc3RyYWludCBBX2FjdGlvbl9pbnRlcmFjdGlvbi1pbnRlcmFjdGlvbiBBX2FjdGlvbl9pbnRlcmFjdGlvbiBBX2Zvcm1hbEdhdGVfaW50ZXJhY3Rpb24taW50ZXJhY3Rpb24gQV9mb3JtYWxHYXRlX2ludGVyYWN0aW9uIEFfbGlmZWxpbmVfaW50ZXJhY3Rpb24gQV9mcmFnbWVudF9lbmNsb3NpbmdJbnRlcmFjdGlvbiBBX21lc3NhZ2VfaW50ZXJhY3Rpb24gQV9iZWZvcmVfdG9BZnRlciBBX2ZpbmlzaF9leGVjdXRpb25TcGVjaWZpY2F0aW9uLWV4ZWN1dGlvblNwZWNpZmljYXRpb24gQV9maW5pc2hfZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiBBX3N0YXJ0X2V4ZWN1dGlvblNwZWNpZmljYXRpb24tZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiBBX3N0YXJ0X2V4ZWN1dGlvblNwZWNpZmljYXRpb24gQV9leGVjdXRpb25fZXhlY3V0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tZXhlY3V0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gQV9leGVjdXRpb25fZXhlY3V0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gQV9tZXNzYWdlX2NvbnNpZGVySWdub3JlRnJhZ21lbnQtY29uc2lkZXJJZ25vcmVGcmFnbWVudCBBX21lc3NhZ2VfY29uc2lkZXJJZ25vcmVGcmFnbWVudCBBX2NmcmFnbWVudEdhdGVfY29tYmluZWRGcmFnbWVudC1jb21iaW5lZEZyYWdtZW50IEFfY2ZyYWdtZW50R2F0ZV9jb21iaW5lZEZyYWdtZW50IEFfb3BlcmFuZF9jb21iaW5lZEZyYWdtZW50LWNvbWJpbmVkRnJhZ21lbnQgQV9vcGVyYW5kX2NvbWJpbmVkRnJhZ21lbnQgQV9iZWhhdmlvcl9iZWhhdmlvckV4ZWN1dGlvblNwZWNpZmljYXRpb24tYmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uIEFfYmVoYXZpb3JfYmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uIEFfYWN0aW9uX2FjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24tYWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiBBX2FjdGlvbl9hY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2h0dHAyRjJGd3d3LmVjbGlwc2Uub3JnMkZ1bWwyMkYyLjAuMDJGVU1MLV9VTUwyRlBhY2thZ2VzIiBzb3VyY2U9IlVNTC9QYWNrYWdlcyIgcmVmZXJlbmNlcz0iRXh0ZW5zaW9uLWlzUmVxdWlyZWQgRXh0ZW5zaW9uLW1ldGFjbGFzcyBFeHRlbnNpb24tb3duZWRFbmQgRXh0ZW5zaW9uLWlzUmVxdWlyZWQuMSBFeHRlbnNpb24tbWV0YWNsYXNzLjEgRXh0ZW5zaW9uLW1ldGFjbGFzc0VuZCBFeHRlbnNpb24gRXh0ZW5zaW9uRW5kLWxvd2VyIEV4dGVuc2lvbkVuZC10eXBlIEV4dGVuc2lvbkVuZC1sb3dlckJvdW5kIEV4dGVuc2lvbkVuZCBJbWFnZS1jb250ZW50IEltYWdlLWZvcm1hdCBJbWFnZS1sb2NhdGlvbiBJbWFnZSBNb2RlbC12aWV3cG9pbnQgTW9kZWwgUGFja2FnZS1VUkkgUGFja2FnZS1uZXN0ZWRQYWNrYWdlIFBhY2thZ2UtbmVzdGluZ1BhY2thZ2UgUGFja2FnZS1vd25lZFN0ZXJlb3R5cGUgUGFja2FnZS1vd25lZFR5cGUgUGFja2FnZS1wYWNrYWdlTWVyZ2UgUGFja2FnZS1wYWNrYWdlZEVsZW1lbnQgUGFja2FnZS1wcm9maWxlQXBwbGljYXRpb24gUGFja2FnZS1hbGxBcHBsaWNhYmxlU3RlcmVvdHlwZXMgUGFja2FnZS1jb250YWluaW5nUHJvZmlsZSBQYWNrYWdlLW1ha2VzVmlzaWJsZSBQYWNrYWdlLW11c3RCZU93bmVkIFBhY2thZ2UtbmVzdGVkUGFja2FnZS4xIFBhY2thZ2Utb3duZWRTdGVyZW90eXBlLjEgUGFja2FnZS1vd25lZFR5cGUuMSBQYWNrYWdlLXZpc2libGVNZW1iZXJzIFBhY2thZ2UgUGFja2FnZU1lcmdlLW1lcmdlZFBhY2thZ2UgUGFja2FnZU1lcmdlLXJlY2VpdmluZ1BhY2thZ2UgUGFja2FnZU1lcmdlIFByb2ZpbGUtbWV0YWNsYXNzUmVmZXJlbmNlIFByb2ZpbGUtbWV0YW1vZGVsUmVmZXJlbmNlIFByb2ZpbGUgUHJvZmlsZUFwcGxpY2F0aW9uLWFwcGxpZWRQcm9maWxlIFByb2ZpbGVBcHBsaWNhdGlvbi1hcHBseWluZ1BhY2thZ2UgUHJvZmlsZUFwcGxpY2F0aW9uLWlzU3RyaWN0IFByb2ZpbGVBcHBsaWNhdGlvbiBTdGVyZW90eXBlLWljb24gU3RlcmVvdHlwZS1wcm9maWxlIFN0ZXJlb3R5cGUtY29udGFpbmluZ1Byb2ZpbGUgU3RlcmVvdHlwZS1wcm9maWxlLjEgU3RlcmVvdHlwZSBBX3Byb2ZpbGVfc3RlcmVvdHlwZS1zdGVyZW90eXBlIEFfcHJvZmlsZV9zdGVyZW90eXBlIEFfaWNvbl9zdGVyZW90eXBlLXN0ZXJlb3R5cGUgQV9pY29uX3N0ZXJlb3R5cGUgQV9hcHBsaWVkUHJvZmlsZV9wcm9maWxlQXBwbGljYXRpb24tcHJvZmlsZUFwcGxpY2F0aW9uIEFfYXBwbGllZFByb2ZpbGVfcHJvZmlsZUFwcGxpY2F0aW9uIEFfbWV0YWNsYXNzUmVmZXJlbmNlX3Byb2ZpbGUtcHJvZmlsZSBBX21ldGFjbGFzc1JlZmVyZW5jZV9wcm9maWxlIEFfbWV0YW1vZGVsUmVmZXJlbmNlX3Byb2ZpbGUtcHJvZmlsZSBBX21ldGFtb2RlbFJlZmVyZW5jZV9wcm9maWxlIEFfbWVyZ2VkUGFja2FnZV9wYWNrYWdlTWVyZ2UtcGFja2FnZU1lcmdlIEFfbWVyZ2VkUGFja2FnZV9wYWNrYWdlTWVyZ2UgQV9wYWNrYWdlZEVsZW1lbnRfb3duaW5nUGFja2FnZS1vd25pbmdQYWNrYWdlIEFfcGFja2FnZWRFbGVtZW50X293bmluZ1BhY2thZ2UgQV9wYWNrYWdlTWVyZ2VfcmVjZWl2aW5nUGFja2FnZSBBX25lc3RlZFBhY2thZ2VfbmVzdGluZ1BhY2thZ2UgQV9wcm9maWxlQXBwbGljYXRpb25fYXBwbHlpbmdQYWNrYWdlIEFfb3duZWRUeXBlX3BhY2thZ2UgQV9vd25lZFN0ZXJlb3R5cGVfb3duaW5nUGFja2FnZS1vd25pbmdQYWNrYWdlIEFfb3duZWRTdGVyZW90eXBlX293bmluZ1BhY2thZ2UgQV90eXBlX2V4dGVuc2lvbkVuZC1leHRlbnNpb25FbmQgQV90eXBlX2V4dGVuc2lvbkVuZCBBX293bmVkRW5kX2V4dGVuc2lvbi1leHRlbnNpb24gQV9vd25lZEVuZF9leHRlbnNpb24iLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfaHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwtX1VNTDJGU2ltcGxlQ2xhc3NpZmllcnMiIHNvdXJjZT0iVU1ML1NpbXBsZUNsYXNzaWZpZXJzIiByZWZlcmVuY2VzPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1jbGFzc2lmaWVyQmVoYXZpb3IgQmVoYXZpb3JlZENsYXNzaWZpZXItaW50ZXJmYWNlUmVhbGl6YXRpb24gQmVoYXZpb3JlZENsYXNzaWZpZXItb3duZWRCZWhhdmlvciBCZWhhdmlvcmVkQ2xhc3NpZmllciBEYXRhVHlwZS1vd25lZEF0dHJpYnV0ZSBEYXRhVHlwZS1vd25lZE9wZXJhdGlvbiBEYXRhVHlwZSBFbnVtZXJhdGlvbi1vd25lZExpdGVyYWwgRW51bWVyYXRpb24gRW51bWVyYXRpb25MaXRlcmFsLWNsYXNzaWZpZXIgRW51bWVyYXRpb25MaXRlcmFsLWVudW1lcmF0aW9uIEVudW1lcmF0aW9uTGl0ZXJhbC1jbGFzc2lmaWVyLjEgRW51bWVyYXRpb25MaXRlcmFsIEludGVyZmFjZS1uZXN0ZWRDbGFzc2lmaWVyIEludGVyZmFjZS1vd25lZEF0dHJpYnV0ZSBJbnRlcmZhY2Utb3duZWRPcGVyYXRpb24gSW50ZXJmYWNlLW93bmVkUmVjZXB0aW9uIEludGVyZmFjZS1wcm90b2NvbCBJbnRlcmZhY2UtcmVkZWZpbmVkSW50ZXJmYWNlIEludGVyZmFjZSBJbnRlcmZhY2VSZWFsaXphdGlvbi1jb250cmFjdCBJbnRlcmZhY2VSZWFsaXphdGlvbi1pbXBsZW1lbnRpbmdDbGFzc2lmaWVyIEludGVyZmFjZVJlYWxpemF0aW9uIFByaW1pdGl2ZVR5cGUgUmVjZXB0aW9uLXNpZ25hbCBSZWNlcHRpb24gU2lnbmFsLW93bmVkQXR0cmlidXRlIFNpZ25hbCBBX293bmVkQXR0cmlidXRlX293bmluZ1NpZ25hbC1vd25pbmdTaWduYWwgQV9vd25lZEF0dHJpYnV0ZV9vd25pbmdTaWduYWwgQV9zaWduYWxfcmVjZXB0aW9uLXJlY2VwdGlvbiBBX3NpZ25hbF9yZWNlcHRpb24gQV9jb250cmFjdF9pbnRlcmZhY2VSZWFsaXphdGlvbi1pbnRlcmZhY2VSZWFsaXphdGlvbiBBX2NvbnRyYWN0X2ludGVyZmFjZVJlYWxpemF0aW9uIEFfcHJvdG9jb2xfaW50ZXJmYWNlLWludGVyZmFjZSBBX3Byb3RvY29sX2ludGVyZmFjZSBBX293bmVkUmVjZXB0aW9uX2ludGVyZmFjZS1pbnRlcmZhY2UgQV9vd25lZFJlY2VwdGlvbl9pbnRlcmZhY2UgQV9yZWRlZmluZWRJbnRlcmZhY2VfaW50ZXJmYWNlLWludGVyZmFjZSBBX3JlZGVmaW5lZEludGVyZmFjZV9pbnRlcmZhY2UgQV9uZXN0ZWRDbGFzc2lmaWVyX2ludGVyZmFjZS1pbnRlcmZhY2UgQV9uZXN0ZWRDbGFzc2lmaWVyX2ludGVyZmFjZSBBX293bmVkT3BlcmF0aW9uX2ludGVyZmFjZSBBX293bmVkQXR0cmlidXRlX2ludGVyZmFjZSBBX2NsYXNzaWZpZXJfZW51bWVyYXRpb25MaXRlcmFsLWVudW1lcmF0aW9uTGl0ZXJhbCBBX2NsYXNzaWZpZXJfZW51bWVyYXRpb25MaXRlcmFsIEFfb3duZWRMaXRlcmFsX2VudW1lcmF0aW9uIEFfb3duZWRBdHRyaWJ1dGVfZGF0YXR5cGUgQV9vd25lZE9wZXJhdGlvbl9kYXRhdHlwZSBBX293bmVkQmVoYXZpb3JfYmVoYXZpb3JlZENsYXNzaWZpZXItYmVoYXZpb3JlZENsYXNzaWZpZXIgQV9vd25lZEJlaGF2aW9yX2JlaGF2aW9yZWRDbGFzc2lmaWVyIEFfY2xhc3NpZmllckJlaGF2aW9yX2JlaGF2aW9yZWRDbGFzc2lmaWVyLWJlaGF2aW9yZWRDbGFzc2lmaWVyIEFfY2xhc3NpZmllckJlaGF2aW9yX2JlaGF2aW9yZWRDbGFzc2lmaWVyIEFfaW50ZXJmYWNlUmVhbGl6YXRpb25faW1wbGVtZW50aW5nQ2xhc3NpZmllciIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGdW1sMjJGMi4wLjAyRlVNTC1fVU1MMkZTdGF0ZU1hY2hpbmVzIiBzb3VyY2U9IlVNTC9TdGF0ZU1hY2hpbmVzIiByZWZlcmVuY2VzPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZW50cnkgQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlLWV4aXQgQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlLXN0YXRlIENvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZSBGaW5hbFN0YXRlIFByb3RvY29sQ29uZm9ybWFuY2UtZ2VuZXJhbE1hY2hpbmUgUHJvdG9jb2xDb25mb3JtYW5jZS1zcGVjaWZpY01hY2hpbmUgUHJvdG9jb2xDb25mb3JtYW5jZSBQcm90b2NvbFN0YXRlTWFjaGluZS1jb25mb3JtYW5jZSBQcm90b2NvbFN0YXRlTWFjaGluZSBQcm90b2NvbFRyYW5zaXRpb24tcG9zdENvbmRpdGlvbiBQcm90b2NvbFRyYW5zaXRpb24tcHJlQ29uZGl0aW9uIFByb3RvY29sVHJhbnNpdGlvbi1yZWZlcnJlZCBQcm90b2NvbFRyYW5zaXRpb24tcmVmZXJyZWQuMSBQcm90b2NvbFRyYW5zaXRpb24gUHNldWRvc3RhdGUta2luZCBQc2V1ZG9zdGF0ZS1zdGF0ZSBQc2V1ZG9zdGF0ZS1zdGF0ZU1hY2hpbmUgUHNldWRvc3RhdGUgUmVnaW9uLWV4dGVuZGVkUmVnaW9uIFJlZ2lvbi1yZWRlZmluaXRpb25Db250ZXh0IFJlZ2lvbi1zdGF0ZSBSZWdpb24tc3RhdGVNYWNoaW5lIFJlZ2lvbi1zdWJ2ZXJ0ZXggUmVnaW9uLXRyYW5zaXRpb24gUmVnaW9uLWJlbG9uZ3NUb1BTTSBSZWdpb24tY29udGFpbmluZ1N0YXRlTWFjaGluZSBSZWdpb24taXNDb25zaXN0ZW50V2l0aCBSZWdpb24taXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQgUmVnaW9uLXJlZGVmaW5pdGlvbkNvbnRleHQuMSBSZWdpb24gU3RhdGUtY29ubmVjdGlvbiBTdGF0ZS1jb25uZWN0aW9uUG9pbnQgU3RhdGUtZGVmZXJyYWJsZVRyaWdnZXIgU3RhdGUtZG9BY3Rpdml0eSBTdGF0ZS1lbnRyeSBTdGF0ZS1leGl0IFN0YXRlLWlzQ29tcG9zaXRlIFN0YXRlLWlzT3J0aG9nb25hbCBTdGF0ZS1pc1NpbXBsZSBTdGF0ZS1pc1N1Ym1hY2hpbmVTdGF0ZSBTdGF0ZS1yZWRlZmluZWRTdGF0ZSBTdGF0ZS1yZWRlZmluaXRpb25Db250ZXh0IFN0YXRlLXJlZ2lvbiBTdGF0ZS1zdGF0ZUludmFyaWFudCBTdGF0ZS1zdWJtYWNoaW5lIFN0YXRlLWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUgU3RhdGUtaXNDb21wb3NpdGUuMSBTdGF0ZS1pc0NvbnNpc3RlbnRXaXRoIFN0YXRlLWlzT3J0aG9nb25hbC4xIFN0YXRlLWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkIFN0YXRlLWlzU2ltcGxlLjEgU3RhdGUtaXNTdWJtYWNoaW5lU3RhdGUuMSBTdGF0ZS1yZWRlZmluaXRpb25Db250ZXh0LjEgU3RhdGUgU3RhdGVNYWNoaW5lLWNvbm5lY3Rpb25Qb2ludCBTdGF0ZU1hY2hpbmUtZXh0ZW5kZWRTdGF0ZU1hY2hpbmUgU3RhdGVNYWNoaW5lLXJlZ2lvbiBTdGF0ZU1hY2hpbmUtc3VibWFjaGluZVN0YXRlIFN0YXRlTWFjaGluZS1MQ0EgU3RhdGVNYWNoaW5lLWFuY2VzdG9yIFN0YXRlTWFjaGluZS1pc0NvbnNpc3RlbnRXaXRoIFN0YXRlTWFjaGluZS1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZCBTdGF0ZU1hY2hpbmUtTENBU3RhdGUgU3RhdGVNYWNoaW5lIFRyYW5zaXRpb24tY29udGFpbmVyIFRyYW5zaXRpb24tZWZmZWN0IFRyYW5zaXRpb24tZ3VhcmQgVHJhbnNpdGlvbi1raW5kIFRyYW5zaXRpb24tcmVkZWZpbmVkVHJhbnNpdGlvbiBUcmFuc2l0aW9uLXJlZGVmaW5pdGlvbkNvbnRleHQgVHJhbnNpdGlvbi1zb3VyY2UgVHJhbnNpdGlvbi10YXJnZXQgVHJhbnNpdGlvbi10cmlnZ2VyIFRyYW5zaXRpb24tY29udGFpbmluZ1N0YXRlTWFjaGluZSBUcmFuc2l0aW9uLWlzQ29uc2lzdGVudFdpdGggVHJhbnNpdGlvbi1yZWRlZmluaXRpb25Db250ZXh0LjEgVHJhbnNpdGlvbiBWZXJ0ZXgtY29udGFpbmVyIFZlcnRleC1pbmNvbWluZyBWZXJ0ZXgtb3V0Z29pbmcgVmVydGV4LWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUgVmVydGV4LWluY29taW5nLjEgVmVydGV4LW91dGdvaW5nLjEgVmVydGV4LWlzQ29udGFpbmVkSW5TdGF0ZSBWZXJ0ZXgtaXNDb250YWluZWRJblJlZ2lvbiBWZXJ0ZXggUHNldWRvc3RhdGVLaW5kIFRyYW5zaXRpb25LaW5kIEFfaW5jb21pbmdfdGFyZ2V0X3ZlcnRleCBBX291dGdvaW5nX3NvdXJjZV92ZXJ0ZXggQV90cmlnZ2VyX3RyYW5zaXRpb24tdHJhbnNpdGlvbiBBX3RyaWdnZXJfdHJhbnNpdGlvbiBBX2d1YXJkX3RyYW5zaXRpb24tdHJhbnNpdGlvbiBBX2d1YXJkX3RyYW5zaXRpb24gQV9yZWRlZmluZWRUcmFuc2l0aW9uX3RyYW5zaXRpb24tdHJhbnNpdGlvbiBBX3JlZGVmaW5lZFRyYW5zaXRpb25fdHJhbnNpdGlvbiBBX3JlZGVmaW5pdGlvbkNvbnRleHRfdHJhbnNpdGlvbi10cmFuc2l0aW9uIEFfcmVkZWZpbml0aW9uQ29udGV4dF90cmFuc2l0aW9uIEFfZWZmZWN0X3RyYW5zaXRpb24tdHJhbnNpdGlvbiBBX2VmZmVjdF90cmFuc2l0aW9uIEFfc3VibWFjaGluZVN0YXRlX3N1Ym1hY2hpbmUgQV9jb25uZWN0aW9uUG9pbnRfc3RhdGVNYWNoaW5lIEFfcmVnaW9uX3N0YXRlTWFjaGluZSBBX2V4dGVuZGVkU3RhdGVNYWNoaW5lX3N0YXRlTWFjaGluZS1zdGF0ZU1hY2hpbmUgQV9leHRlbmRlZFN0YXRlTWFjaGluZV9zdGF0ZU1hY2hpbmUgQV9yZWRlZmluaXRpb25Db250ZXh0X3N0YXRlLXN0YXRlIEFfcmVkZWZpbml0aW9uQ29udGV4dF9zdGF0ZSBBX3JlZ2lvbl9zdGF0ZSBBX3N0YXRlSW52YXJpYW50X293bmluZ1N0YXRlLW93bmluZ1N0YXRlIEFfc3RhdGVJbnZhcmlhbnRfb3duaW5nU3RhdGUgQV9yZWRlZmluZWRTdGF0ZV9zdGF0ZS1zdGF0ZSBBX3JlZGVmaW5lZFN0YXRlX3N0YXRlIEFfZGVmZXJyYWJsZVRyaWdnZXJfc3RhdGUtc3RhdGUgQV9kZWZlcnJhYmxlVHJpZ2dlcl9zdGF0ZSBBX2Nvbm5lY3Rpb25fc3RhdGUgQV9lbnRyeV9zdGF0ZS1zdGF0ZSBBX2VudHJ5X3N0YXRlIEFfY29ubmVjdGlvblBvaW50X3N0YXRlIEFfZG9BY3Rpdml0eV9zdGF0ZS1zdGF0ZSBBX2RvQWN0aXZpdHlfc3RhdGUgQV9leGl0X3N0YXRlLXN0YXRlIEFfZXhpdF9zdGF0ZSBBX2V4dGVuZGVkUmVnaW9uX3JlZ2lvbi1yZWdpb24gQV9leHRlbmRlZFJlZ2lvbl9yZWdpb24gQV9zdWJ2ZXJ0ZXhfY29udGFpbmVyIEFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWdpb24tcmVnaW9uIEFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWdpb24gQV90cmFuc2l0aW9uX2NvbnRhaW5lciBBX3JlZmVycmVkX3Byb3RvY29sVHJhbnNpdGlvbi1wcm90b2NvbFRyYW5zaXRpb24gQV9yZWZlcnJlZF9wcm90b2NvbFRyYW5zaXRpb24gQV9wcmVDb25kaXRpb25fcHJvdG9jb2xUcmFuc2l0aW9uLXByb3RvY29sVHJhbnNpdGlvbiBBX3ByZUNvbmRpdGlvbl9wcm90b2NvbFRyYW5zaXRpb24gQV9wb3N0Q29uZGl0aW9uX293bmluZ1RyYW5zaXRpb24tb3duaW5nVHJhbnNpdGlvbiBBX3Bvc3RDb25kaXRpb25fb3duaW5nVHJhbnNpdGlvbiBBX2NvbmZvcm1hbmNlX3NwZWNpZmljTWFjaGluZSBBX2dlbmVyYWxNYWNoaW5lX3Byb3RvY29sQ29uZm9ybWFuY2UtcHJvdG9jb2xDb25mb3JtYW5jZSBBX2dlbmVyYWxNYWNoaW5lX3Byb3RvY29sQ29uZm9ybWFuY2UgQV9lbnRyeV9jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtY29ubmVjdGlvblBvaW50UmVmZXJlbmNlIEFfZW50cnlfY29ubmVjdGlvblBvaW50UmVmZXJlbmNlIEFfZXhpdF9jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtY29ubmVjdGlvblBvaW50UmVmZXJlbmNlIEFfZXhpdF9jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfaHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwtX1VNTDJGU3RydWN0dXJlZENsYXNzaWZpZXJzIiBzb3VyY2U9IlVNTC9TdHJ1Y3R1cmVkQ2xhc3NpZmllcnMiIHJlZmVyZW5jZXM9IkFzc29jaWF0aW9uLWVuZFR5cGUgQXNzb2NpYXRpb24taXNEZXJpdmVkIEFzc29jaWF0aW9uLW1lbWJlckVuZCBBc3NvY2lhdGlvbi1uYXZpZ2FibGVPd25lZEVuZCBBc3NvY2lhdGlvbi1vd25lZEVuZCBBc3NvY2lhdGlvbi1lbmRUeXBlLjEgQXNzb2NpYXRpb24gQXNzb2NpYXRpb25DbGFzcyBDbGFzcy1leHRlbnNpb24gQ2xhc3MtaXNBYnN0cmFjdCBDbGFzcy1pc0FjdGl2ZSBDbGFzcy1uZXN0ZWRDbGFzc2lmaWVyIENsYXNzLW93bmVkQXR0cmlidXRlIENsYXNzLW93bmVkT3BlcmF0aW9uIENsYXNzLW93bmVkUmVjZXB0aW9uIENsYXNzLXN1cGVyQ2xhc3MgQ2xhc3MtZXh0ZW5zaW9uLjEgQ2xhc3Mtc3VwZXJDbGFzcy4xIENsYXNzIENvbGxhYm9yYXRpb24tY29sbGFib3JhdGlvblJvbGUgQ29sbGFib3JhdGlvbiBDb2xsYWJvcmF0aW9uVXNlLXJvbGVCaW5kaW5nIENvbGxhYm9yYXRpb25Vc2UtdHlwZSBDb2xsYWJvcmF0aW9uVXNlIENvbXBvbmVudC1pc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQgQ29tcG9uZW50LXBhY2thZ2VkRWxlbWVudCBDb21wb25lbnQtcHJvdmlkZWQgQ29tcG9uZW50LXJlYWxpemF0aW9uIENvbXBvbmVudC1yZXF1aXJlZCBDb21wb25lbnQtcHJvdmlkZWQuMSBDb21wb25lbnQtcmVxdWlyZWQuMSBDb21wb25lbnQgQ29tcG9uZW50UmVhbGl6YXRpb24tYWJzdHJhY3Rpb24gQ29tcG9uZW50UmVhbGl6YXRpb24tcmVhbGl6aW5nQ2xhc3NpZmllciBDb21wb25lbnRSZWFsaXphdGlvbiBDb25uZWN0YWJsZUVsZW1lbnQtZW5kIENvbm5lY3RhYmxlRWxlbWVudC10ZW1wbGF0ZVBhcmFtZXRlciBDb25uZWN0YWJsZUVsZW1lbnQtZW5kLjEgQ29ubmVjdGFibGVFbGVtZW50IENvbm5lY3RhYmxlRWxlbWVudFRlbXBsYXRlUGFyYW1ldGVyLXBhcmFtZXRlcmVkRWxlbWVudCBDb25uZWN0YWJsZUVsZW1lbnRUZW1wbGF0ZVBhcmFtZXRlciBDb25uZWN0b3ItY29udHJhY3QgQ29ubmVjdG9yLWVuZCBDb25uZWN0b3Ita2luZCBDb25uZWN0b3ItcmVkZWZpbmVkQ29ubmVjdG9yIENvbm5lY3Rvci10eXBlIENvbm5lY3Rvci1raW5kLjEgQ29ubmVjdG9yIENvbm5lY3RvckVuZC1kZWZpbmluZ0VuZCBDb25uZWN0b3JFbmQtcGFydFdpdGhQb3J0IENvbm5lY3RvckVuZC1yb2xlIENvbm5lY3RvckVuZC1kZWZpbmluZ0VuZC4xIENvbm5lY3RvckVuZCBFbmNhcHN1bGF0ZWRDbGFzc2lmaWVyLW93bmVkUG9ydCBFbmNhcHN1bGF0ZWRDbGFzc2lmaWVyLW93bmVkUG9ydC4xIEVuY2Fwc3VsYXRlZENsYXNzaWZpZXIgUG9ydC1pc0JlaGF2aW9yIFBvcnQtaXNDb25qdWdhdGVkIFBvcnQtaXNTZXJ2aWNlIFBvcnQtcHJvdG9jb2wgUG9ydC1wcm92aWRlZCBQb3J0LXJlZGVmaW5lZFBvcnQgUG9ydC1yZXF1aXJlZCBQb3J0LXByb3ZpZGVkLjEgUG9ydC1yZXF1aXJlZC4xIFBvcnQtYmFzaWNQcm92aWRlZCBQb3J0LWJhc2ljUmVxdWlyZWQgUG9ydCBTdHJ1Y3R1cmVkQ2xhc3NpZmllci1vd25lZEF0dHJpYnV0ZSBTdHJ1Y3R1cmVkQ2xhc3NpZmllci1vd25lZENvbm5lY3RvciBTdHJ1Y3R1cmVkQ2xhc3NpZmllci1wYXJ0IFN0cnVjdHVyZWRDbGFzc2lmaWVyLXJvbGUgU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC4xIFN0cnVjdHVyZWRDbGFzc2lmaWVyLWFsbFJvbGVzIFN0cnVjdHVyZWRDbGFzc2lmaWVyIENvbm5lY3RvcktpbmQgQV9wYXJ0X3N0cnVjdHVyZWRDbGFzc2lmaWVyLXN0cnVjdHVyZWRDbGFzc2lmaWVyIEFfcGFydF9zdHJ1Y3R1cmVkQ2xhc3NpZmllciBBX293bmVkQ29ubmVjdG9yX3N0cnVjdHVyZWRDbGFzc2lmaWVyLXN0cnVjdHVyZWRDbGFzc2lmaWVyIEFfb3duZWRDb25uZWN0b3Jfc3RydWN0dXJlZENsYXNzaWZpZXIgQV9vd25lZEF0dHJpYnV0ZV9zdHJ1Y3R1cmVkQ2xhc3NpZmllci1zdHJ1Y3R1cmVkQ2xhc3NpZmllciBBX293bmVkQXR0cmlidXRlX3N0cnVjdHVyZWRDbGFzc2lmaWVyIEFfcm9sZV9zdHJ1Y3R1cmVkQ2xhc3NpZmllci1zdHJ1Y3R1cmVkQ2xhc3NpZmllciBBX3JvbGVfc3RydWN0dXJlZENsYXNzaWZpZXIgQV9wcm90b2NvbF9wb3J0LXBvcnQgQV9wcm90b2NvbF9wb3J0IEFfcmVxdWlyZWRfcG9ydC1wb3J0IEFfcmVxdWlyZWRfcG9ydCBBX3JlZGVmaW5lZFBvcnRfcG9ydC1wb3J0IEFfcmVkZWZpbmVkUG9ydF9wb3J0IEFfcHJvdmlkZWRfcG9ydC1wb3J0IEFfcHJvdmlkZWRfcG9ydCBBX293bmVkUG9ydF9lbmNhcHN1bGF0ZWRDbGFzc2lmaWVyLWVuY2Fwc3VsYXRlZENsYXNzaWZpZXIgQV9vd25lZFBvcnRfZW5jYXBzdWxhdGVkQ2xhc3NpZmllciBBX3BhcnRXaXRoUG9ydF9jb25uZWN0b3JFbmQtY29ubmVjdG9yRW5kIEFfcGFydFdpdGhQb3J0X2Nvbm5lY3RvckVuZCBBX2RlZmluaW5nRW5kX2Nvbm5lY3RvckVuZC1jb25uZWN0b3JFbmQgQV9kZWZpbmluZ0VuZF9jb25uZWN0b3JFbmQgQV9lbmRfY29ubmVjdG9yLWNvbm5lY3RvciBBX2VuZF9jb25uZWN0b3IgQV9yZWRlZmluZWRDb25uZWN0b3JfY29ubmVjdG9yLWNvbm5lY3RvciBBX3JlZGVmaW5lZENvbm5lY3Rvcl9jb25uZWN0b3IgQV9jb250cmFjdF9jb25uZWN0b3ItY29ubmVjdG9yIEFfY29udHJhY3RfY29ubmVjdG9yIEFfdHlwZV9jb25uZWN0b3ItY29ubmVjdG9yIEFfdHlwZV9jb25uZWN0b3IgQV9jb25uZWN0YWJsZUVsZW1lbnRfdGVtcGxhdGVQYXJhbWV0ZXJfcGFyYW1ldGVyZWRFbGVtZW50IEFfZW5kX3JvbGUgQV9yZWFsaXppbmdDbGFzc2lmaWVyX2NvbXBvbmVudFJlYWxpemF0aW9uLWNvbXBvbmVudFJlYWxpemF0aW9uIEFfcmVhbGl6aW5nQ2xhc3NpZmllcl9jb21wb25lbnRSZWFsaXphdGlvbiBBX3JlcXVpcmVkX2NvbXBvbmVudC1jb21wb25lbnQgQV9yZXF1aXJlZF9jb21wb25lbnQgQV9wYWNrYWdlZEVsZW1lbnRfY29tcG9uZW50LWNvbXBvbmVudCBBX3BhY2thZ2VkRWxlbWVudF9jb21wb25lbnQgQV9yZWFsaXphdGlvbl9hYnN0cmFjdGlvbl9jb21wb25lbnQgQV9wcm92aWRlZF9jb21wb25lbnQtY29tcG9uZW50IEFfcHJvdmlkZWRfY29tcG9uZW50IEFfdHlwZV9jb2xsYWJvcmF0aW9uVXNlLWNvbGxhYm9yYXRpb25Vc2UgQV90eXBlX2NvbGxhYm9yYXRpb25Vc2UgQV9yb2xlQmluZGluZ19jb2xsYWJvcmF0aW9uVXNlLWNvbGxhYm9yYXRpb25Vc2UgQV9yb2xlQmluZGluZ19jb2xsYWJvcmF0aW9uVXNlIEFfY29sbGFib3JhdGlvblJvbGVfY29sbGFib3JhdGlvbi1jb2xsYWJvcmF0aW9uIEFfY29sbGFib3JhdGlvblJvbGVfY29sbGFib3JhdGlvbiBBX293bmVkT3BlcmF0aW9uX2NsYXNzIEFfc3VwZXJDbGFzc19jbGFzcy1jbGFzcyBBX3N1cGVyQ2xhc3NfY2xhc3MgQV9leHRlbnNpb25fbWV0YWNsYXNzIEFfb3duZWRBdHRyaWJ1dGVfY2xhc3MgQV9uZXN0ZWRDbGFzc2lmaWVyX25lc3RpbmdDbGFzcy1uZXN0aW5nQ2xhc3MgQV9uZXN0ZWRDbGFzc2lmaWVyX25lc3RpbmdDbGFzcyBBX293bmVkUmVjZXB0aW9uX2NsYXNzLWNsYXNzIEFfb3duZWRSZWNlcHRpb25fY2xhc3MgQV9tZW1iZXJFbmRfYXNzb2NpYXRpb24gQV9lbmRUeXBlX2Fzc29jaWF0aW9uLWFzc29jaWF0aW9uIEFfZW5kVHlwZV9hc3NvY2lhdGlvbiBBX293bmVkRW5kX293bmluZ0Fzc29jaWF0aW9uIEFfbmF2aWdhYmxlT3duZWRFbmRfYXNzb2NpYXRpb24tYXNzb2NpYXRpb24gQV9uYXZpZ2FibGVPd25lZEVuZF9hc3NvY2lhdGlvbiIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9odHRwMkYyRnd3dy5lY2xpcHNlLm9yZzJGdW1sMjJGMi4wLjAyRlVNTC1fVU1MMkZVc2VDYXNlcyIgc291cmNlPSJVTUwvVXNlQ2FzZXMiIHJlZmVyZW5jZXM9IkFjdG9yIEV4dGVuZC1jb25kaXRpb24gRXh0ZW5kLWV4dGVuZGVkQ2FzZSBFeHRlbmQtZXh0ZW5zaW9uIEV4dGVuZC1leHRlbnNpb25Mb2NhdGlvbiBFeHRlbmQgRXh0ZW5zaW9uUG9pbnQtdXNlQ2FzZSBFeHRlbnNpb25Qb2ludCBJbmNsdWRlLWFkZGl0aW9uIEluY2x1ZGUtaW5jbHVkaW5nQ2FzZSBJbmNsdWRlIFVzZUNhc2UtZXh0ZW5kIFVzZUNhc2UtZXh0ZW5zaW9uUG9pbnQgVXNlQ2FzZS1pbmNsdWRlIFVzZUNhc2Utc3ViamVjdCBVc2VDYXNlLWFsbEluY2x1ZGVkVXNlQ2FzZXMgVXNlQ2FzZSBBX2V4dGVuc2lvblBvaW50X3VzZUNhc2UgQV9pbmNsdWRlX2luY2x1ZGluZ0Nhc2UgQV9zdWJqZWN0X3VzZUNhc2UgQV9leHRlbmRfZXh0ZW5zaW9uIEFfYWRkaXRpb25faW5jbHVkZS1pbmNsdWRlIEFfYWRkaXRpb25faW5jbHVkZSBBX2V4dGVuc2lvbkxvY2F0aW9uX2V4dGVuc2lvbi1leHRlbnNpb24gQV9leHRlbnNpb25Mb2NhdGlvbl9leHRlbnNpb24gQV9jb25kaXRpb25fZXh0ZW5kLWV4dGVuZCBBX2NvbmRpdGlvbl9leHRlbmQgQV9leHRlbmRlZENhc2VfZXh0ZW5kLWV4dGVuZCBBX2V4dGVuZGVkQ2FzZV9leHRlbmQiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfaHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwtX1VNTDJGVmFsdWVzIiBzb3VyY2U9IlVNTC9WYWx1ZXMiIHJlZmVyZW5jZXM9IkR1cmF0aW9uLWV4cHIgRHVyYXRpb24tb2JzZXJ2YXRpb24gRHVyYXRpb24gRHVyYXRpb25Db25zdHJhaW50LWZpcnN0RXZlbnQgRHVyYXRpb25Db25zdHJhaW50LXNwZWNpZmljYXRpb24gRHVyYXRpb25Db25zdHJhaW50IER1cmF0aW9uSW50ZXJ2YWwtbWF4IER1cmF0aW9uSW50ZXJ2YWwtbWluIER1cmF0aW9uSW50ZXJ2YWwgRHVyYXRpb25PYnNlcnZhdGlvbi1ldmVudCBEdXJhdGlvbk9ic2VydmF0aW9uLWZpcnN0RXZlbnQgRHVyYXRpb25PYnNlcnZhdGlvbiBFeHByZXNzaW9uLW9wZXJhbmQgRXhwcmVzc2lvbi1zeW1ib2wgRXhwcmVzc2lvbiBJbnRlcnZhbC1tYXggSW50ZXJ2YWwtbWluIEludGVydmFsIEludGVydmFsQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uIEludGVydmFsQ29uc3RyYWludCBMaXRlcmFsQm9vbGVhbi12YWx1ZSBMaXRlcmFsQm9vbGVhbi1ib29sZWFuVmFsdWUgTGl0ZXJhbEJvb2xlYW4taXNDb21wdXRhYmxlIExpdGVyYWxCb29sZWFuIExpdGVyYWxJbnRlZ2VyLXZhbHVlIExpdGVyYWxJbnRlZ2VyLWludGVnZXJWYWx1ZSBMaXRlcmFsSW50ZWdlci1pc0NvbXB1dGFibGUgTGl0ZXJhbEludGVnZXIgTGl0ZXJhbE51bGwtaXNDb21wdXRhYmxlIExpdGVyYWxOdWxsLWlzTnVsbCBMaXRlcmFsTnVsbCBMaXRlcmFsUmVhbC12YWx1ZSBMaXRlcmFsUmVhbC1pc0NvbXB1dGFibGUgTGl0ZXJhbFJlYWwtcmVhbFZhbHVlIExpdGVyYWxSZWFsIExpdGVyYWxTcGVjaWZpY2F0aW9uIExpdGVyYWxTdHJpbmctdmFsdWUgTGl0ZXJhbFN0cmluZy1pc0NvbXB1dGFibGUgTGl0ZXJhbFN0cmluZy1zdHJpbmdWYWx1ZSBMaXRlcmFsU3RyaW5nIExpdGVyYWxVbmxpbWl0ZWROYXR1cmFsLXZhbHVlIExpdGVyYWxVbmxpbWl0ZWROYXR1cmFsLWlzQ29tcHV0YWJsZSBMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC11bmxpbWl0ZWRWYWx1ZSBMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCBPYnNlcnZhdGlvbiBPcGFxdWVFeHByZXNzaW9uLWJlaGF2aW9yIE9wYXF1ZUV4cHJlc3Npb24tYm9keSBPcGFxdWVFeHByZXNzaW9uLWxhbmd1YWdlIE9wYXF1ZUV4cHJlc3Npb24tcmVzdWx0IE9wYXF1ZUV4cHJlc3Npb24taXNJbnRlZ3JhbCBPcGFxdWVFeHByZXNzaW9uLWlzTm9uTmVnYXRpdmUgT3BhcXVlRXhwcmVzc2lvbi1pc1Bvc2l0aXZlIE9wYXF1ZUV4cHJlc3Npb24tcmVzdWx0LjEgT3BhcXVlRXhwcmVzc2lvbi12YWx1ZSBPcGFxdWVFeHByZXNzaW9uIFN0cmluZ0V4cHJlc3Npb24tb3duaW5nRXhwcmVzc2lvbiBTdHJpbmdFeHByZXNzaW9uLXN1YkV4cHJlc3Npb24gU3RyaW5nRXhwcmVzc2lvbi1zdHJpbmdWYWx1ZSBTdHJpbmdFeHByZXNzaW9uIFRpbWVDb25zdHJhaW50LWZpcnN0RXZlbnQgVGltZUNvbnN0cmFpbnQtc3BlY2lmaWNhdGlvbiBUaW1lQ29uc3RyYWludCBUaW1lRXhwcmVzc2lvbi1leHByIFRpbWVFeHByZXNzaW9uLW9ic2VydmF0aW9uIFRpbWVFeHByZXNzaW9uIFRpbWVJbnRlcnZhbC1tYXggVGltZUludGVydmFsLW1pbiBUaW1lSW50ZXJ2YWwgVGltZU9ic2VydmF0aW9uLWV2ZW50IFRpbWVPYnNlcnZhdGlvbi1maXJzdEV2ZW50IFRpbWVPYnNlcnZhdGlvbiBWYWx1ZVNwZWNpZmljYXRpb24tYm9vbGVhblZhbHVlIFZhbHVlU3BlY2lmaWNhdGlvbi1pbnRlZ2VyVmFsdWUgVmFsdWVTcGVjaWZpY2F0aW9uLWlzQ29tcGF0aWJsZVdpdGggVmFsdWVTcGVjaWZpY2F0aW9uLWlzQ29tcHV0YWJsZSBWYWx1ZVNwZWNpZmljYXRpb24taXNOdWxsIFZhbHVlU3BlY2lmaWNhdGlvbi1yZWFsVmFsdWUgVmFsdWVTcGVjaWZpY2F0aW9uLXN0cmluZ1ZhbHVlIFZhbHVlU3BlY2lmaWNhdGlvbi11bmxpbWl0ZWRWYWx1ZSBWYWx1ZVNwZWNpZmljYXRpb24gQV9ldmVudF90aW1lT2JzZXJ2YXRpb24tdGltZU9ic2VydmF0aW9uIEFfZXZlbnRfdGltZU9ic2VydmF0aW9uIEFfbWF4X3RpbWVJbnRlcnZhbC10aW1lSW50ZXJ2YWwgQV9tYXhfdGltZUludGVydmFsIEFfbWluX3RpbWVJbnRlcnZhbC10aW1lSW50ZXJ2YWwgQV9taW5fdGltZUludGVydmFsIEFfZXhwcl90aW1lRXhwcmVzc2lvbi10aW1lRXhwcmVzc2lvbiBBX2V4cHJfdGltZUV4cHJlc3Npb24gQV9vYnNlcnZhdGlvbl90aW1lRXhwcmVzc2lvbi10aW1lRXhwcmVzc2lvbiBBX29ic2VydmF0aW9uX3RpbWVFeHByZXNzaW9uIEFfc3BlY2lmaWNhdGlvbl90aW1lQ29uc3RyYWludC10aW1lQ29uc3RyYWludCBBX3NwZWNpZmljYXRpb25fdGltZUNvbnN0cmFpbnQgQV9zdWJFeHByZXNzaW9uX293bmluZ0V4cHJlc3Npb24gQV9yZXN1bHRfb3BhcXVlRXhwcmVzc2lvbi1vcGFxdWVFeHByZXNzaW9uIEFfcmVzdWx0X29wYXF1ZUV4cHJlc3Npb24gQV9iZWhhdmlvcl9vcGFxdWVFeHByZXNzaW9uLW9wYXF1ZUV4cHJlc3Npb24gQV9iZWhhdmlvcl9vcGFxdWVFeHByZXNzaW9uIEFfc3BlY2lmaWNhdGlvbl9pbnRlcnZhbENvbnN0cmFpbnQtaW50ZXJ2YWxDb25zdHJhaW50IEFfc3BlY2lmaWNhdGlvbl9pbnRlcnZhbENvbnN0cmFpbnQgQV9tYXhfaW50ZXJ2YWwtaW50ZXJ2YWwgQV9tYXhfaW50ZXJ2YWwgQV9taW5faW50ZXJ2YWwtaW50ZXJ2YWwgQV9taW5faW50ZXJ2YWwgQV9vcGVyYW5kX2V4cHJlc3Npb24tZXhwcmVzc2lvbiBBX29wZXJhbmRfZXhwcmVzc2lvbiBBX2V2ZW50X2R1cmF0aW9uT2JzZXJ2YXRpb24tZHVyYXRpb25PYnNlcnZhdGlvbiBBX2V2ZW50X2R1cmF0aW9uT2JzZXJ2YXRpb24gQV9tYXhfZHVyYXRpb25JbnRlcnZhbC1kdXJhdGlvbkludGVydmFsIEFfbWF4X2R1cmF0aW9uSW50ZXJ2YWwgQV9taW5fZHVyYXRpb25JbnRlcnZhbC1kdXJhdGlvbkludGVydmFsIEFfbWluX2R1cmF0aW9uSW50ZXJ2YWwgQV9zcGVjaWZpY2F0aW9uX2R1cmF0aW9uQ29uc3RyYWludC1kdXJhdGlvbkNvbnN0cmFpbnQgQV9zcGVjaWZpY2F0aW9uX2R1cmF0aW9uQ29uc3RyYWludCBBX2V4cHJfZHVyYXRpb24tZHVyYXRpb24gQV9leHByX2R1cmF0aW9uIEFfb2JzZXJ2YXRpb25fZHVyYXRpb24tZHVyYXRpb24gQV9vYnNlcnZhdGlvbl9kdXJhdGlvbiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX3BhY2thZ2VJbXBvcnQuMCI+Ci0gICAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjXzAiLz4KLSAgICA8L3BhY2thZ2VJbXBvcnQ+Ci0gICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfcGFja2FnZUltcG9ydC4xIj4KLSAgICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI18wIi8+Ci0gICAgPC9wYWNrYWdlSW1wb3J0PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NsaWVudF9jbGllbnREZXBlbmRlbmN5IiBuYW1lPSJBX2NsaWVudF9jbGllbnREZXBlbmRlbmN5IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFfY2xpZW50X2NsaWVudERlcGVuZGVuY3ktY2xpZW50IE5hbWVkRWxlbWVudC1jbGllbnREZXBlbmRlbmN5Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfY2xpZW50X2NsaWVudERlcGVuZGVuY3ktY2xpZW50IiBuYW1lPSJjbGllbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Ik5hbWVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfY2xpZW50X2NsaWVudERlcGVuZGVuY3kiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfY2xpZW50X2NsaWVudERlcGVuZGVuY3ktY2xpZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yb2xlX2VuZCIgbmFtZT0iQV9yb2xlX2VuZCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBX3JvbGVfZW5kLXJvbGUgQ29ubmVjdGFibGVFbGVtZW50LWVuZCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JvbGVfZW5kLXJvbGUiIG5hbWU9InJvbGUiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9IkNvbm5lY3RhYmxlRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcm9sZV9lbmQiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV90YXJnZXRfdmVydGV4X2luY29taW5nIiBuYW1lPSJBX3RhcmdldF92ZXJ0ZXhfaW5jb21pbmciIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQV90YXJnZXRfdmVydGV4X2luY29taW5nLXRhcmdldCBWZXJ0ZXgtaW5jb21pbmciPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV90YXJnZXRfdmVydGV4X2luY29taW5nLXRhcmdldCIgbmFtZT0idGFyZ2V0IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJWZXJ0ZXgiIGFzc29jaWF0aW9uPSJBX3RhcmdldF92ZXJ0ZXhfaW5jb21pbmciLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zb3VyY2VfdmVydGV4X291dGdvaW5nIiBuYW1lPSJBX3NvdXJjZV92ZXJ0ZXhfb3V0Z29pbmciIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQV9zb3VyY2VfdmVydGV4X291dGdvaW5nLXNvdXJjZSBWZXJ0ZXgtb3V0Z29pbmciPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9zb3VyY2VfdmVydGV4X291dGdvaW5nLXNvdXJjZSIgbmFtZT0ic291cmNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJWZXJ0ZXgiIGFzc29jaWF0aW9uPSJBX3NvdXJjZV92ZXJ0ZXhfb3V0Z29pbmciLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9hY3Rpdml0eV9zdHJ1Y3R1cmVkTm9kZSIgbmFtZT0iQV9hY3Rpdml0eV9zdHJ1Y3R1cmVkTm9kZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWFjdGl2aXR5IEFfYWN0aXZpdHlfc3RydWN0dXJlZE5vZGUtc3RydWN0dXJlZE5vZGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9hY3Rpdml0eV9zdHJ1Y3R1cmVkTm9kZS1zdHJ1Y3R1cmVkTm9kZSIgbmFtZT0ic3RydWN0dXJlZE5vZGUiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIGFzc29jaWF0aW9uPSJBX2FjdGl2aXR5X3N0cnVjdHVyZWROb2RlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2FjdGl2aXR5X3N0cnVjdHVyZWROb2RlLXN0cnVjdHVyZWROb2RlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9hY3Rpdml0eV9zdHJ1Y3R1cmVkTm9kZS1zdHJ1Y3R1cmVkTm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkludGVyZmFjZSIgeG1pOmlkPSJBY3Rpdml0eUNvbnRlbnQiIG5hbWU9IkFjdGl2aXR5Q29udGVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJBY3Rpdml0eUNvbnRlbnQtY29udGFpbmluZ0FjdGl2aXR5IiBuYW1lPSJjb250YWluaW5nQWN0aXZpdHkiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJBY3Rpdml0eUNvbnRlbnQtY29udGFpbmluZ0FjdGl2aXR5LWNvbnRhaW5pbmdBY3Rpdml0eSIgbmFtZT0iY29udGFpbmluZ0FjdGl2aXR5IiB0eXBlPSJBY3Rpdml0eSIgZGlyZWN0aW9uPSJyZXR1cm4iIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY3Rpdml0eUNvbnRlbnQtY29udGFpbmluZ0FjdGl2aXR5LWNvbnRhaW5pbmdBY3Rpdml0eS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiBuYW1lPSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIGlzIGFuIEFjdGlvbiB0aGF0IGV2YWx1YXRlcyBhIFZhbHVlU3BlY2lmaWNhdGlvbiBhbmQgcHJvdmlkZXMgYSByZXN1bHQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uLW11bHRpcGxpY2l0eSIgbmFtZT0ibXVsdGlwbGljaXR5IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tbXVsdGlwbGljaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uLW11bHRpcGxpY2l0eSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcmVzdWx0IE91dHB1dFBpbiBpcyAxLi4xPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbi1tdWx0aXBsaWNpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlc3VsdC5pcygxLDEpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tY29tcGF0aWJsZV90eXBlIiBuYW1lPSJjb21wYXRpYmxlX3R5cGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbi1jb21wYXRpYmxlX3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tY29tcGF0aWJsZV90eXBlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBvZiB0aGUgdmFsdWUgVmFsdWVTcGVjaWZpY2F0aW9uIG11c3QgY29uZm9ybSB0byB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IE91dHB1dFBpbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uLWNvbXBhdGlibGVfdHlwZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dmFsdWUudHlwZS5jb25mb3Jtc1RvKHJlc3VsdC50eXBlKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJPdXRwdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24tb3V0cHV0IiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfdmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbi1yZXN1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tcmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgT3V0cHV0UGluIG9uIHdoaWNoIHRoZSByZXN1bHQgdmFsdWUgaXMgcGxhY2VkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uLXZhbHVlIiBuYW1lPSJ2YWx1ZSIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3ZhbHVlX3ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tdmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tdmFsdWUiPgotICAgICAgICAgIDxib2R5PlRoZSBWYWx1ZVNwZWNpZmljYXRpb24gdG8gYmUgZXZhbHVhdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJWYXJpYWJsZUFjdGlvbiIgbmFtZT0iVmFyaWFibGVBY3Rpb24iIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhcmlhYmxlQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmFyaWFibGVBY3Rpb24iPgotICAgICAgICA8Ym9keT5WYXJpYWJsZUFjdGlvbiBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgQWN0aW9ucyB0aGF0IG9wZXJhdGUgb24gYSBzcGVjaWZpZWQgVmFyaWFibGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVmFyaWFibGVBY3Rpb24tc2NvcGVfb2ZfdmFyaWFibGUiIG5hbWU9InNjb3BlX29mX3ZhcmlhYmxlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlZhcmlhYmxlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhcmlhYmxlQWN0aW9uLXNjb3BlX29mX3ZhcmlhYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmFyaWFibGVBY3Rpb24tc2NvcGVfb2ZfdmFyaWFibGUiPgotICAgICAgICAgIDxib2R5PlRoZSBWYXJpYWJsZUFjdGlvbiBtdXN0IGJlIGluIHRoZSBzY29wZSBvZiB0aGUgdmFyaWFibGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlZhcmlhYmxlQWN0aW9uLXNjb3BlX29mX3ZhcmlhYmxlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT52YXJpYWJsZS5pc0FjY2Vzc2libGVCeShzZWxmKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJWYXJpYWJsZUFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJWYXJpYWJsZUFjdGlvbi12YXJpYWJsZSIgbmFtZT0idmFyaWFibGUiIHR5cGU9IlZhcmlhYmxlIiBhc3NvY2lhdGlvbj0iQV92YXJpYWJsZV92YXJpYWJsZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWYXJpYWJsZUFjdGlvbi12YXJpYWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZhcmlhYmxlQWN0aW9uLXZhcmlhYmxlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgVmFyaWFibGUgdG8gYmUgcmVhZCBvciB3cml0dGVuLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJXcml0ZUxpbmtBY3Rpb24iIG5hbWU9IldyaXRlTGlua0FjdGlvbiIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iV3JpdGVMaW5rQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iV3JpdGVMaW5rQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+V3JpdGVMaW5rQWN0aW9uIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBMaW5rQWN0aW9ucyB0aGF0IGNyZWF0ZSBhbmQgZGVzdHJveSBsaW5rcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJXcml0ZUxpbmtBY3Rpb24tYWxsb3dfYWNjZXNzIiBuYW1lPSJhbGxvd19hY2Nlc3MiIGNvbnN0cmFpbmVkRWxlbWVudD0iV3JpdGVMaW5rQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IldyaXRlTGlua0FjdGlvbi1hbGxvd19hY2Nlc3MtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJXcml0ZUxpbmtBY3Rpb24tYWxsb3dfYWNjZXNzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdmlzaWJpbGl0eSBvZiBhdCBsZWFzdCBvbmUgZW5kIG11c3QgYWxsb3cgYWNjZXNzIGZyb20gdGhlIGNvbnRleHQgQ2xhc3NpZmllciBvZiB0aGUgV3JpdGVMaW5rQWN0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJXcml0ZUxpbmtBY3Rpb24tYWxsb3dfYWNjZXNzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lbmREYXRhLmVuZC0+ZXhpc3RzKGVuZCB8JiN4RDsKLSAgZW5kLnR5cGU9Xydjb250ZXh0JyBvciYjeEQ7Ci0gIGVuZC52aXNpYmlsaXR5PVZpc2liaWxpdHlLaW5kOjpwdWJsaWMgb3IgJiN4RDsKLSAgZW5kLnZpc2liaWxpdHk9VmlzaWJpbGl0eUtpbmQ6OnByb3RlY3RlZCBhbmQmI3hEOwotICBlbmREYXRhLmVuZC0+ZXhpc3RzKG90aGVyIHwgJiN4RDsKLSAgICBvdGhlciZsdDs+ZW5kIGFuZCBfJ2NvbnRleHQnLmNvbmZvcm1zVG8ob3RoZXIudHlwZS5vY2xBc1R5cGUoQ2xhc3NpZmllcikpKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iV3JpdGVMaW5rQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJMaW5rQWN0aW9uIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIG5hbWU9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+V3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgU3RydWN0dXJhbEZlYXR1cmVBY3Rpb25zIHRoYXQgY2hhbmdlIFN0cnVjdHVyYWxGZWF0dXJlIHZhbHVlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9yZXN1bHQiIG5hbWU9Im11bHRpcGxpY2l0eV9vZl9yZXN1bHQiIGNvbnN0cmFpbmVkRWxlbWVudD0iV3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9yZXN1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJlc3VsdCBPdXRwdXRQaW4gbXVzdCBiZSAxLi4xLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9yZXN1bHQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlc3VsdCAmbHQ7PiBudWxsIGltcGxpZXMgcmVzdWx0LmlzKDEsMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdHlwZV9vZl92YWx1ZSIgbmFtZT0idHlwZV9vZl92YWx1ZSIgY29uc3RyYWluZWRFbGVtZW50PSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdHlwZV9vZl92YWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdHlwZV9vZl92YWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHR5cGUgb2YgdGhlIHZhbHVlIElucHV0UGluIG11c3QgY29uZm9ybSB0byB0aGUgdHlwZSBvZiB0aGUgc3RydWN0dXJhbEZlYXR1cmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdHlwZV9vZl92YWx1ZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dmFsdWUgJmx0Oz4gbnVsbCBpbXBsaWVzIHZhbHVlLnR5cGUuY29uZm9ybXNUbyhzdHJ1Y3R1cmFsRmVhdHVyZS50eXBlKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iV3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfdmFsdWUiIG5hbWU9Im11bHRpcGxpY2l0eV9vZl92YWx1ZSIgY29uc3RyYWluZWRFbGVtZW50PSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tbXVsdGlwbGljaXR5X29mX3ZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iV3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfdmFsdWUiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHZhbHVlIElucHV0UGluIGlzIDEuLjEuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tbXVsdGlwbGljaXR5X29mX3ZhbHVlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT52YWx1ZSZsdDs+bnVsbCBpbXBsaWVzIHZhbHVlLmlzKDEsMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdHlwZV9vZl9yZXN1bHQiIG5hbWU9InR5cGVfb2ZfcmVzdWx0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iV3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi10eXBlX29mX3Jlc3VsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdHlwZV9vZl9yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlIG9mIHRoZSByZXN1bHQgT3V0cHV0UGluIGlzIHRoZSBzYW1lIGFzIHRoZSB0eXBlIG9mIHRoZSBpbmhlcml0ZWQgb2JqZWN0IElucHV0UGluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXR5cGVfb2ZfcmVzdWx0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5yZXN1bHQgJmx0Oz4gbnVsbCBpbXBsaWVzIHJlc3VsdC50eXBlID0gb2JqZWN0LnR5cGU8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iV3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9Ik91dHB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1vdXRwdXQiIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF93cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iV3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBPdXRwdXRQaW4gb24gd2hpY2ggaXMgcHV0IHRoZSBpbnB1dCBvYmplY3QgYXMgbW9kaWZpZWQgYnkgdGhlIFdyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdmFsdWUiIG5hbWU9InZhbHVlIiB0eXBlPSJJbnB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1pbnB1dCIgYXNzb2NpYXRpb249IkFfdmFsdWVfd3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iV3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi12YWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIElucHV0UGluIHRoYXQgcHJvdmlkZXMgdGhlIHZhbHVlIHRvIGJlIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgU3RydWN0dXJhbEZlYXR1cmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJXcml0ZVZhcmlhYmxlQWN0aW9uIiBuYW1lPSJXcml0ZVZhcmlhYmxlQWN0aW9uIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJXcml0ZVZhcmlhYmxlQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iV3JpdGVWYXJpYWJsZUFjdGlvbiI+Ci0gICAgICAgIDxib2R5PldyaXRlVmFyaWFibGVBY3Rpb24gaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIFZhcmlhYmxlQWN0aW9ucyB0aGF0IGNoYW5nZSBWYXJpYWJsZSB2YWx1ZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iV3JpdGVWYXJpYWJsZUFjdGlvbi12YWx1ZV90eXBlIiBuYW1lPSJ2YWx1ZV90eXBlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IldyaXRlVmFyaWFibGVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iV3JpdGVWYXJpYWJsZUFjdGlvbi12YWx1ZV90eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iV3JpdGVWYXJpYWJsZUFjdGlvbi12YWx1ZV90eXBlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBvZiB0aGUgdmFsdWUgSW5wdXRQaW4gbXVzdCBjb25mb3JtIHRvIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iV3JpdGVWYXJpYWJsZUFjdGlvbi12YWx1ZV90eXBlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT52YWx1ZSAmbHQ7PiBudWxsIGltcGxpZXMgdmFsdWUudHlwZS5jb25mb3Jtc1RvKHZhcmlhYmxlLnR5cGUpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJXcml0ZVZhcmlhYmxlQWN0aW9uLW11bHRpcGxpY2l0eSIgbmFtZT0ibXVsdGlwbGljaXR5IiBjb25zdHJhaW5lZEVsZW1lbnQ9IldyaXRlVmFyaWFibGVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iV3JpdGVWYXJpYWJsZUFjdGlvbi1tdWx0aXBsaWNpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJXcml0ZVZhcmlhYmxlQWN0aW9uLW11bHRpcGxpY2l0eSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgdmFsdWUgSW5wdXRQaW4gaXMgMS4uMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iV3JpdGVWYXJpYWJsZUFjdGlvbi1tdWx0aXBsaWNpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnZhbHVlJmx0Oz5udWxsIGltcGxpZXMgdmFsdWUuaXMoMSwxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJXcml0ZVZhcmlhYmxlQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJWYXJpYWJsZUFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iV3JpdGVWYXJpYWJsZUFjdGlvbi12YWx1ZSIgbmFtZT0idmFsdWUiIHR5cGU9IklucHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLWlucHV0IiBhc3NvY2lhdGlvbj0iQV92YWx1ZV93cml0ZVZhcmlhYmxlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IldyaXRlVmFyaWFibGVBY3Rpb24tdmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJXcml0ZVZhcmlhYmxlQWN0aW9uLXZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgSW5wdXRQaW4gdGhhdCBnaXZlcyB0aGUgdmFsdWUgdG8gYmUgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBWYXJpYWJsZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IldyaXRlVmFyaWFibGVBY3Rpb24tdmFsdWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9IkV4cGFuc2lvbktpbmQiIG5hbWU9IkV4cGFuc2lvbktpbmQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4cGFuc2lvbktpbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHBhbnNpb25LaW5kIj4KLSAgICAgICAgPGJvZHk+RXhwYW5zaW9uS2luZCBpcyBhbiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gc3BlY2lmeSBob3cgYW4gRXhwYW5zaW9uUmVnaW9uIGV4ZWN1dGVzIGl0cyBjb250ZW50cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJFeHBhbnNpb25LaW5kLXBhcmFsbGVsIiBuYW1lPSJwYXJhbGxlbCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHBhbnNpb25LaW5kLXBhcmFsbGVsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXhwYW5zaW9uS2luZC1wYXJhbGxlbCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGNvbnRlbnQgb2YgdGhlIEV4cGFuc2lvblJlZ2lvbiBpcyBleGVjdXRlZCBjb25jdXJyZW50bHkgZm9yIHRoZSBlbGVtZW50cyBvZiB0aGUgaW5wdXQgY29sbGVjdGlvbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkV4cGFuc2lvbktpbmQtaXRlcmF0aXZlIiBuYW1lPSJpdGVyYXRpdmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhwYW5zaW9uS2luZC1pdGVyYXRpdmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHBhbnNpb25LaW5kLWl0ZXJhdGl2ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGNvbnRlbnQgb2YgdGhlIEV4cGFuc2lvblJlZ2lvbiBpcyBleGVjdXRlZCBpdGVyYXRpdmVseSBmb3IgdGhlIGVsZW1lbnRzIG9mIHRoZSBpbnB1dCBjb2xsZWN0aW9ucywgaW4gdGhlIG9yZGVyIG9mIHRoZSBpbnB1dCBlbGVtZW50cywgaWYgdGhlIGNvbGxlY3Rpb25zIGFyZSBvcmRlcmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJFeHBhbnNpb25LaW5kLXN0cmVhbSIgbmFtZT0ic3RyZWFtIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4cGFuc2lvbktpbmQtc3RyZWFtLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXhwYW5zaW9uS2luZC1zdHJlYW0iPgotICAgICAgICAgIDxib2R5PkEgc3RyZWFtIG9mIGlucHV0IGNvbGxlY3Rpb24gZWxlbWVudHMgZmxvd3MgaW50byBhIHNpbmdsZSBleGVjdXRpb24gb2YgdGhlIGNvbnRlbnQgb2YgdGhlIEV4cGFuc2lvblJlZ2lvbiwgaW4gdGhlIG9yZGVyIG9mIHRoZSBjb2xsZWN0aW9uIGVsZW1lbnRzIGlmIHRoZSBpbnB1dCBjb2xsZWN0aW9ucyBhcmUgb3JkZXJlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkFjY2VwdENhbGxBY3Rpb24iIG5hbWU9IkFjY2VwdENhbGxBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjY2VwdENhbGxBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY2NlcHRDYWxsQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QW4gQWNjZXB0Q2FsbEFjdGlvbiBpcyBhbiBBY2NlcHRFdmVudEFjdGlvbiB0aGF0IGhhbmRsZXMgdGhlIHJlY2VpcHQgb2YgYSBzeW5jaHJvbm91cyBjYWxsIHJlcXVlc3QuIEluIGFkZGl0aW9uIHRvIHRoZSB2YWx1ZXMgZnJvbSB0aGUgT3BlcmF0aW9uIGlucHV0IHBhcmFtZXRlcnMsIHRoZSBBY3Rpb24gcHJvZHVjZXMgYW4gb3V0cHV0IHRoYXQgaXMgbmVlZGVkIGxhdGVyIHRvIHN1cHBseSB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIFJlcGx5QWN0aW9uIG5lY2Vzc2FyeSB0byByZXR1cm4gY29udHJvbCB0byB0aGUgY2FsbGVyLiBBbiBBY2NlcHRDYWxsQWN0aW9uIGlzIGZvciBzeW5jaHJvbm91cyBjYWxscy4gSWYgaXQgaXMgdXNlZCB0byBoYW5kbGUgYW4gYXN5bmNocm9ub3VzIGNhbGwsIGV4ZWN1dGlvbiBvZiB0aGUgc3Vic2VxdWVudCBSZXBseUFjdGlvbiB3aWxsIGNvbXBsZXRlIGltbWVkaWF0ZWx5IHdpdGggbm8gZWZmZWN0LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFjY2VwdENhbGxBY3Rpb24tcmVzdWx0X3BpbnMiIG5hbWU9InJlc3VsdF9waW5zIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFjY2VwdENhbGxBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWNjZXB0Q2FsbEFjdGlvbi1yZXN1bHRfcGlucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjY2VwdENhbGxBY3Rpb24tcmVzdWx0X3BpbnMiPgotICAgICAgICAgIDxib2R5PlRoZSBudW1iZXIgb2YgcmVzdWx0IE91dHB1dFBpbnMgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGlucHV0IChpbiBhbmQgaW5vdXQpIG93bmVkUGFyYW1ldGVycyBvZiB0aGUgT3BlcmF0aW9uIHNwZWNpZmllZCBieSB0aGUgdHJpZ2dlciBFdmVudC4gVGhlIHR5cGUsIG9yZGVyaW5nIGFuZCBtdWx0aXBsaWNpdHkgb2YgZWFjaCByZXN1bHQgT3V0cHV0UGluIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IFBhcmFtZXRlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWNjZXB0Q2FsbEFjdGlvbi1yZXN1bHRfcGlucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bGV0IHBhcmFtZXRlcjogT3JkZXJlZFNldChQYXJhbWV0ZXIpID0gdHJpZ2dlci5ldmVudC0+YXNTZXF1ZW5jZSgpLT5maXJzdCgpLm9jbEFzVHlwZShDYWxsRXZlbnQpLm9wZXJhdGlvbi5pbnB1dFBhcmFtZXRlcnMoKSBpbiYjeEQ7Ci1yZXN1bHQtPnNpemUoKSA9IHBhcmFtZXRlci0+c2l6ZSgpIGFuZCYjeEQ7Ci1TZXF1ZW5jZXsxLi5yZXN1bHQtPnNpemUoKX0tPmZvckFsbChpIHwgJiN4RDsKLQlwYXJhbWV0ZXItPmF0KGkpLnR5cGUuY29uZm9ybXNUbyhyZXN1bHQtPmF0KGkpLnR5cGUpIGFuZCAmI3hEOwotCXBhcmFtZXRlci0+YXQoaSkuaXNPcmRlcmVkID0gcmVzdWx0LT5hdChpKS5pc09yZGVyZWQgYW5kJiN4RDsKLQlwYXJhbWV0ZXItPmF0KGkpLmNvbXBhdGlibGVXaXRoKHJlc3VsdC0+YXQoaSkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWNjZXB0Q2FsbEFjdGlvbi10cmlnZ2VyX2NhbGxfZXZlbnQiIG5hbWU9InRyaWdnZXJfY2FsbF9ldmVudCIgY29uc3RyYWluZWRFbGVtZW50PSJBY2NlcHRDYWxsQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjY2VwdENhbGxBY3Rpb24tdHJpZ2dlcl9jYWxsX2V2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWNjZXB0Q2FsbEFjdGlvbi10cmlnZ2VyX2NhbGxfZXZlbnQiPgotICAgICAgICAgIDxib2R5PlRoZSBhY3Rpb24gbXVzdCBoYXZlIGV4YWN0bHkgb25lIHRyaWdnZXIsIHdoaWNoIG11c3QgYmUgZm9yIGEgQ2FsbEV2ZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY2NlcHRDYWxsQWN0aW9uLXRyaWdnZXJfY2FsbF9ldmVudC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dHJpZ2dlci0+c2l6ZSgpPTEgYW5kJiN4RDsKLXRyaWdnZXItPmFzU2VxdWVuY2UoKS0+Zmlyc3QoKS5ldmVudC5vY2xJc0tpbmRPZihDYWxsRXZlbnQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY2NlcHRDYWxsQWN0aW9uLXVubWFyc2hhbGwiIG5hbWU9InVubWFyc2hhbGwiIGNvbnN0cmFpbmVkRWxlbWVudD0iQWNjZXB0Q2FsbEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY2NlcHRDYWxsQWN0aW9uLXVubWFyc2hhbGwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY2NlcHRDYWxsQWN0aW9uLXVubWFyc2hhbGwiPgotICAgICAgICAgIDxib2R5PmlzVW5tcmFzaGFsbCBtdXN0IGJlIHRydWUgZm9yIGFuIEFjY2VwdENhbGxBY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjY2VwdENhbGxBY3Rpb24tdW5tYXJzaGFsbC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aXNVbm1hcnNoYWxsID0gdHJ1ZTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBY2NlcHRDYWxsQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBY2NlcHRFdmVudEFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWNjZXB0Q2FsbEFjdGlvbi1yZXR1cm5JbmZvcm1hdGlvbiIgbmFtZT0icmV0dXJuSW5mb3JtYXRpb24iIHR5cGU9Ik91dHB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1vdXRwdXQiIGFzc29jaWF0aW9uPSJBX3JldHVybkluZm9ybWF0aW9uX2FjY2VwdENhbGxBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWNjZXB0Q2FsbEFjdGlvbi1yZXR1cm5JbmZvcm1hdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjY2VwdENhbGxBY3Rpb24tcmV0dXJuSW5mb3JtYXRpb24iPgotICAgICAgICAgIDxib2R5PkFuIE91dHB1dFBpbiB3aGVyZSBhIHZhbHVlIGlzIHBsYWNlZCBjb250YWluaW5nIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gcGVyZm9ybSBhIHN1YnNlcXVlbnQgUmVwbHlBY3Rpb24gYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBjYWxsZXIuIFRoZSBjb250ZW50cyBvZiB0aGlzIHZhbHVlIGFyZSBvcGFxdWUuIEl0IGNhbiBiZSBwYXNzZWQgYW5kIGNvcGllZCBidXQgaXQgY2Fubm90IGJlIG1hbmlwdWxhdGVkIGJ5IHRoZSBtb2RlbC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQWNjZXB0RXZlbnRBY3Rpb24iIG5hbWU9IkFjY2VwdEV2ZW50QWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjY2VwdEV2ZW50QWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QW4gQWNjZXB0RXZlbnRBY3Rpb24gaXMgYW4gQWN0aW9uIHRoYXQgd2FpdHMgZm9yIHRoZSBvY2N1cnJlbmNlIG9mIG9uZSBvciBtb3JlIHNwZWNpZmljIEV2ZW50cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1vbmVfb3V0cHV0X3BpbiIgbmFtZT0ib25lX291dHB1dF9waW4iIGNvbnN0cmFpbmVkRWxlbWVudD0iQWNjZXB0RXZlbnRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWNjZXB0RXZlbnRBY3Rpb24tb25lX291dHB1dF9waW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY2NlcHRFdmVudEFjdGlvbi1vbmVfb3V0cHV0X3BpbiI+Ci0gICAgICAgICAgPGJvZHk+SWYgaXNVbm1hcnNoYWxsPWZhbHNlIGFuZCBhbnkgb2YgdGhlIHRyaWdnZXJzIGFyZSBmb3IgU2lnbmFsRXZlbnRzIG9yIFRpbWVFdmVudHMsIHRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgcmVzdWx0IE91dHB1dFBpbiB3aXRoIG11bHRpcGxpY2l0eSAxLi4xLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1vbmVfb3V0cHV0X3Bpbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bm90IGlzVW5tYXJzaGFsbCBhbmQgdHJpZ2dlci0+ZXhpc3RzKGV2ZW50Lm9jbElzS2luZE9mKFNpZ25hbEV2ZW50KSBvciBldmVudC5vY2xJc0tpbmRPZihUaW1lRXZlbnQpKSBpbXBsaWVzICYjeEQ7Ci0Jb3V0cHV0LT5zaXplKCkgPSAxIGFuZCBvdXRwdXQtPmZpcnN0KCkuaXMoMSwxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWNjZXB0RXZlbnRBY3Rpb24tbm9faW5wdXRfcGlucyIgbmFtZT0ibm9faW5wdXRfcGlucyIgY29uc3RyYWluZWRFbGVtZW50PSJBY2NlcHRFdmVudEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1ub19pbnB1dF9waW5zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWNjZXB0RXZlbnRBY3Rpb24tbm9faW5wdXRfcGlucyI+Ci0gICAgICAgICAgPGJvZHk+QWNjZXB0RXZlbnRBY3Rpb25zIG1heSBoYXZlIG5vIGlucHV0IHBpbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjY2VwdEV2ZW50QWN0aW9uLW5vX2lucHV0X3BpbnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlucHV0LT5zaXplKCkgPSAwPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1ub19vdXRwdXRfcGlucyIgbmFtZT0ibm9fb3V0cHV0X3BpbnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQWNjZXB0RXZlbnRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWNjZXB0RXZlbnRBY3Rpb24tbm9fb3V0cHV0X3BpbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY2NlcHRFdmVudEFjdGlvbi1ub19vdXRwdXRfcGlucyI+Ci0gICAgICAgICAgPGJvZHk+VGhlcmUgYXJlIG5vIE91dHB1dFBpbnMgaWYgdGhlIHRyaWdnZXIgZXZlbnRzIGFyZSBvbmx5IENoYW5nZUV2ZW50cyBhbmQvb3IgQ2FsbEV2ZW50cyB3aGVuIHRoaXMgYWN0aW9uIGlzIGFuIGluc3RhbmNlIG9mIEFjY2VwdEV2ZW50QWN0aW9uIGFuZCBub3QgYW4gaW5zdGFuY2Ugb2YgYSBkZXNjZW5kYW50IG9mIEFjY2VwdEV2ZW50QWN0aW9uIChzdWNoIGFzIEFjY2VwdENhbGxBY3Rpb24pLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1ub19vdXRwdXRfcGlucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KHNlbGYub2NsSXNUeXBlT2YoQWNjZXB0RXZlbnRBY3Rpb24pIGFuZCYjeEQ7Ci0gICAodHJpZ2dlci0+Zm9yQWxsKGV2ZW50Lm9jbElzS2luZE9mKENoYW5nZUV2ZW50KSBvciAgJiN4RDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQub2NsSXNLaW5kT2YoQ2FsbEV2ZW50KSkpKSYjeEQ7Ci1pbXBsaWVzIG91dHB1dC0+c2l6ZSgpID0gMDwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWNjZXB0RXZlbnRBY3Rpb24tdW5tYXJzaGFsbF9zaWduYWxfZXZlbnRzIiBuYW1lPSJ1bm1hcnNoYWxsX3NpZ25hbF9ldmVudHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQWNjZXB0RXZlbnRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWNjZXB0RXZlbnRBY3Rpb24tdW5tYXJzaGFsbF9zaWduYWxfZXZlbnRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWNjZXB0RXZlbnRBY3Rpb24tdW5tYXJzaGFsbF9zaWduYWxfZXZlbnRzIj4KLSAgICAgICAgICA8Ym9keT5JZiBpc1VubWFyc2hhbGwgaXMgdHJ1ZSAoYW5kIHRoaXMgaXMgbm90IGFuIEFjY2VwdENhbGxBY3Rpb24pLCB0aGVyZSBtdXN0IGJlIGV4YWN0bHkgb25lIHRyaWdnZXIsIHdoaWNoIGlzIGZvciBhIFNpZ25hbEV2ZW50LiBUaGUgbnVtYmVyIG9mIHJlc3VsdCBvdXRwdXQgcGlucyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBvZiB0aGUgc2lnbmFsLiBUaGUgdHlwZSBhbmQgb3JkZXJpbmcgb2YgZWFjaCByZXN1bHQgb3V0cHV0IHBpbiBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgc2lnbmFsLiBUaGUgbXVsdGlwbGljaXR5IG9mIGVhY2ggcmVzdWx0IG91dHB1dCBwaW4gbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjY2VwdEV2ZW50QWN0aW9uLXVubWFyc2hhbGxfc2lnbmFsX2V2ZW50cy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aXNVbm1hcnNoYWxsIGFuZCBzZWxmLm9jbElzVHlwZU9mKEFjY2VwdEV2ZW50QWN0aW9uKSBpbXBsaWVzJiN4RDsKLQl0cmlnZ2VyLT5zaXplKCk9MSBhbmQmI3hEOwotCXRyaWdnZXItPmFzU2VxdWVuY2UoKS0+Zmlyc3QoKS5ldmVudC5vY2xJc0tpbmRPZihTaWduYWxFdmVudCkgYW5kJiN4RDsKLQlsZXQgYXR0cmlidXRlOiBPcmRlcmVkU2V0KFByb3BlcnR5KSA9IHRyaWdnZXItPmFzU2VxdWVuY2UoKS0+Zmlyc3QoKS5ldmVudC5vY2xBc1R5cGUoU2lnbmFsRXZlbnQpLnNpZ25hbC5hbGxBdHRyaWJ1dGVzKCkgaW4mI3hEOwotCWF0dHJpYnV0ZS0+c2l6ZSgpPjAgYW5kIHJlc3VsdC0+c2l6ZSgpID0gYXR0cmlidXRlLT5zaXplKCkgYW5kJiN4RDsKLQlTZXF1ZW5jZXsxLi5yZXN1bHQtPnNpemUoKX0tPmZvckFsbChpIHwgJiN4RDsKLQkJcmVzdWx0LT5hdChpKS50eXBlID0gYXR0cmlidXRlLT5hdChpKS50eXBlIGFuZCAmI3hEOwotCQlyZXN1bHQtPmF0KGkpLmlzT3JkZXJlZCA9IGF0dHJpYnV0ZS0+YXQoaSkuaXNPcmRlcmVkIGFuZCYjeEQ7Ci0JCXJlc3VsdC0+YXQoaSkuaW5jbHVkZXNNdWx0aXBsaWNpdHkoYXR0cmlidXRlLT5hdChpKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1jb25mb3JtaW5nX3R5cGUiIG5hbWU9ImNvbmZvcm1pbmdfdHlwZSIgY29uc3RyYWluZWRFbGVtZW50PSJBY2NlcHRFdmVudEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1jb25mb3JtaW5nX3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY2NlcHRFdmVudEFjdGlvbi1jb25mb3JtaW5nX3R5cGUiPgotICAgICAgICAgIDxib2R5PklmIGlzVW5tYXJzaGFsbD1mYWxzZSBhbmQgYWxsIHRoZSB0cmlnZ2VycyBhcmUgZm9yIFNpZ25hbEV2ZW50cywgdGhlbiB0aGUgdHlwZSBvZiB0aGUgc2luZ2xlIHJlc3VsdCBPdXRwdXRQaW4gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhbGwgdGhlIHNpZ25hbHMgbXVzdCBjb25mb3JtIHRvIGl0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1jb25mb3JtaW5nX3R5cGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5vdCBpc1VubWFyc2hhbGwgaW1wbGllcyAmI3hEOwotCXJlc3VsdC0+aXNFbXB0eSgpIG9yJiN4RDsKLQlsZXQgdHlwZTogVHlwZSA9IHJlc3VsdC0+Zmlyc3QoKS50eXBlIGluJiN4RDsKLQl0eXBlPW51bGwgb3IgJiN4RDsKLQkJKHRyaWdnZXItPmZvckFsbChldmVudC5vY2xJc0tpbmRPZihTaWduYWxFdmVudCkpIGFuZCAmI3hEOwotCQkgdHJpZ2dlci5ldmVudC5vY2xBc1R5cGUoU2lnbmFsRXZlbnQpLnNpZ25hbC0+Zm9yQWxsKHMgfCBzLmNvbmZvcm1zVG8odHlwZSkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1pc1VubWFyc2hhbGwiIG5hbWU9ImlzVW5tYXJzaGFsbCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1pc1VubWFyc2hhbGwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY2NlcHRFdmVudEFjdGlvbi1pc1VubWFyc2hhbGwiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGlzIGEgc2luZ2xlIE91dHB1dFBpbiBmb3IgYSBTaWduYWxFdmVudCBvY2N1cnJlbmNlLCBvciBtdWx0aXBsZSBPdXRwdXRQaW5zIGZvciBhdHRyaWJ1dGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSBvZiB0aGUgU2lnbmFsIGFzc29jaWF0ZWQgd2l0aCBhIFNpZ25hbEV2ZW50IG9jY3VycmVuY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iQWNjZXB0RXZlbnRBY3Rpb24taXNVbm1hcnNoYWxsLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iT3V0cHV0UGluIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24tb3V0cHV0IiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfYWNjZXB0RXZlbnRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWNjZXB0RXZlbnRBY3Rpb24tcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWNjZXB0RXZlbnRBY3Rpb24tcmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5PdXRwdXRQaW5zIGhvbGRpbmcgdGhlIHZhbHVlcyByZWNlaXZlZCBmcm9tIGFuIEV2ZW50IG9jY3VycmVuY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWNjZXB0RXZlbnRBY3Rpb24tdHJpZ2dlciIgbmFtZT0idHJpZ2dlciIgdHlwZT0iVHJpZ2dlciIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV90cmlnZ2VyX2FjY2VwdEV2ZW50QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjY2VwdEV2ZW50QWN0aW9uLXRyaWdnZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY2NlcHRFdmVudEFjdGlvbi10cmlnZ2VyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgVHJpZ2dlcnMgc3BlY2lmeWluZyB0aGUgRXZlbnRzIG9mIHdoaWNoIHRoZSBBY2NlcHRFdmVudEFjdGlvbiB3YWl0cyBmb3Igb2NjdXJyZW5jZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBY2NlcHRFdmVudEFjdGlvbi10cmlnZ2VyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQWN0aW9uIiBuYW1lPSJBY3Rpb24iIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkFuIEFjdGlvbiBpcyB0aGUgZnVuZGFtZW50YWwgdW5pdCBvZiBleGVjdXRhYmxlIGZ1bmN0aW9uYWxpdHkuIFRoZSBleGVjdXRpb24gb2YgYW4gQWN0aW9uIHJlcHJlc2VudHMgc29tZSB0cmFuc2Zvcm1hdGlvbiBvciBwcm9jZXNzaW5nIGluIHRoZSBtb2RlbGVkIHN5c3RlbS4gQWN0aW9ucyBwcm92aWRlIHRoZSBFeGVjdXRhYmxlTm9kZXMgd2l0aGluIEFjdGl2aXRpZXMgYW5kIG1heSBhbHNvIGJlIHVzZWQgd2l0aGluIEludGVyYWN0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRXhlY3V0YWJsZU5vZGUiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGlvbi1jb250ZXh0IiBuYW1lPSJjb250ZXh0IiB0eXBlPSJDbGFzc2lmaWVyIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX2NvbnRleHRfYWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGlvbi1jb250ZXh0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aW9uLWNvbnRleHQiPgotICAgICAgICAgIDxib2R5PlRoZSBjb250ZXh0IENsYXNzaWZpZXIgb2YgdGhlIEJlaGF2aW9yIHRoYXQgY29udGFpbnMgdGhpcyBBY3Rpb24sIG9yIHRoZSBCZWhhdmlvciBpdHNlbGYgaWYgaXQgaGFzIG5vIGNvbnRleHQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY3Rpb24tY29udGV4dC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGlvbi1pbnB1dCIgbmFtZT0iaW5wdXQiIHR5cGU9IklucHV0UGluIiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfaW5wdXRfYWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGlvbi1pbnB1dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGlvbi1pbnB1dCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG9yZGVyZWQgc2V0IG9mIElucHV0UGlucyByZXByZXNlbnRpbmcgdGhlIGlucHV0cyB0byB0aGUgQWN0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aW9uLWlucHV0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aW9uLWlucHV0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGlvbi1pc0xvY2FsbHlSZWVudHJhbnQiIG5hbWU9ImlzTG9jYWxseVJlZW50cmFudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpb24taXNMb2NhbGx5UmVlbnRyYW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aW9uLWlzTG9jYWxseVJlZW50cmFudCI+Ci0gICAgICAgICAgPGJvZHk+SWYgdHJ1ZSwgdGhlIEFjdGlvbiBjYW4gYmVnaW4gYSBuZXcsIGNvbmN1cnJlbnQgZXhlY3V0aW9uLCBldmVuIGlmIHRoZXJlIGlzIGFscmVhZHkgYW5vdGhlciBleGVjdXRpb24gb2YgdGhlIEFjdGlvbiBvbmdvaW5nLiBJZiBmYWxzZSwgdGhlIEFjdGlvbiBjYW5ub3QgYmVnaW4gYSBuZXcgZXhlY3V0aW9uIHVudGlsIGFueSBwcmV2aW91cyBleGVjdXRpb24gaGFzIGNvbXBsZXRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJBY3Rpb24taXNMb2NhbGx5UmVlbnRyYW50LV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpb24tbG9jYWxQb3N0Y29uZGl0aW9uIiBuYW1lPSJsb2NhbFBvc3Rjb25kaXRpb24iIHR5cGU9IkNvbnN0cmFpbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfbG9jYWxQb3N0Y29uZGl0aW9uX2FjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpb24tbG9jYWxQb3N0Y29uZGl0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aW9uLWxvY2FsUG9zdGNvbmRpdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+QSBDb25zdHJhaW50IHRoYXQgbXVzdCBiZSBzYXRpc2ZpZWQgd2hlbiBleGVjdXRpb24gb2YgdGhlIEFjdGlvbiBpcyBjb21wbGV0ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY3Rpb24tbG9jYWxQb3N0Y29uZGl0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aW9uLWxvY2FsUG9zdGNvbmRpdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpb24tbG9jYWxQcmVjb25kaXRpb24iIG5hbWU9ImxvY2FsUHJlY29uZGl0aW9uIiB0eXBlPSJDb25zdHJhaW50IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2xvY2FsUHJlY29uZGl0aW9uX2FjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpb24tbG9jYWxQcmVjb25kaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpb24tbG9jYWxQcmVjb25kaXRpb24iPgotICAgICAgICAgIDxib2R5PkEgQ29uc3RyYWludCB0aGF0IG11c3QgYmUgc2F0aXNmaWVkIHdoZW4gZXhlY3V0aW9uIG9mIHRoZSBBY3Rpb24gaXMgc3RhcnRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGlvbi1sb2NhbFByZWNvbmRpdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFjdGlvbi1sb2NhbFByZWNvbmRpdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpb24tb3V0cHV0IiBuYW1lPSJvdXRwdXQiIHR5cGU9Ik91dHB1dFBpbiIgaXNPcmRlcmVkPSJ0cnVlIiBpc1JlYWRPbmx5PSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBpc0Rlcml2ZWQ9InRydWUiIGlzRGVyaXZlZFVuaW9uPSJ0cnVlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX291dHB1dF9hY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aW9uLW91dHB1dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGlvbi1vdXRwdXQiPgotICAgICAgICAgIDxib2R5PlRoZSBvcmRlcmVkIHNldCBvZiBPdXRwdXRQaW5zIHJlcHJlc2VudGluZyBvdXRwdXRzIGZyb20gdGhlIEFjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGlvbi1vdXRwdXQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBY3Rpb24tb3V0cHV0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkFjdGlvbi1jb250ZXh0LjEiIG5hbWU9ImNvbnRleHQiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iQWN0aW9uLWNvbnRleHQuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGlvbi1jb250ZXh0LjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpb24tY29udGV4dC4xIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVyaXZhdGlvbiBmb3IgdGhlIGNvbnRleHQgcHJvcGVydHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFjdGlvbi1jb250ZXh0LjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpb24tY29udGV4dC4xIEFjdGlvbi1jb250ZXh0Ij4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWN0aW9uLWNvbnRleHQuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGxldCBiZWhhdmlvcjogQmVoYXZpb3IgPSBzZWxmLmNvbnRhaW5pbmdCZWhhdmlvcigpIGluJiN4RDsKLWlmIGJlaGF2aW9yPW51bGwgdGhlbiBudWxsJiN4RDsKLWVsc2UgaWYgYmVoYXZpb3IuXydjb250ZXh0JyA9IG51bGwgdGhlbiBiZWhhdmlvciYjeEQ7Ci1lbHNlIGJlaGF2aW9yLl8nY29udGV4dCcmI3hEOwotZW5kaWYmI3hEOwotZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkFjdGlvbi1jb250ZXh0LjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkNsYXNzaWZpZXIiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGlvbi1jb250ZXh0LjEtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQWN0aW9uLWFsbEFjdGlvbnMiIG5hbWU9ImFsbEFjdGlvbnMiIGJvZHlDb25kaXRpb249IkFjdGlvbi1hbGxBY3Rpb25zLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aW9uLWFsbEFjdGlvbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpb24tYWxsQWN0aW9ucyI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJuIHRoaXMgQWN0aW9uIGFuZCBhbGwgQWN0aW9ucyBjb250YWluZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbiBpdC4gQnkgZGVmYXVsdCBvbmx5IHRoZSBBY3Rpb24gaXRzZWxmIGlzIHJldHVybmVkLCBidXQgdGhlIG9wZXJhdGlvbiBpcyBvdmVycmlkZGVuIGZvciBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2Rlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWN0aW9uLWFsbEFjdGlvbnMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpb24tYWxsQWN0aW9ucyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGlvbi1hbGxBY3Rpb25zLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc2VsZi0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQWN0aW9uLWFsbEFjdGlvbnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkFjdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aW9uLWFsbEFjdGlvbnMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBY3Rpb24tYWxsQWN0aW9ucy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQWN0aW9uLWFsbE93bmVkTm9kZXMiIG5hbWU9ImFsbE93bmVkTm9kZXMiIGJvZHlDb25kaXRpb249IkFjdGlvbi1hbGxPd25lZE5vZGVzLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aW9uLWFsbE93bmVkTm9kZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpb24tYWxsT3duZWROb2RlcyI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJucyBhbGwgdGhlIEFjdGl2aXR5Tm9kZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBvd25lZCBieSB0aGlzIEFjdGlvbi4gVGhpcyBpbmNsdWRlcyBhdCBsZWFzdCBhbGwgdGhlIFBpbnMgb2YgdGhlIEFjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWN0aW9uLWFsbE93bmVkTm9kZXMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpb24tYWxsT3duZWROb2RlcyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGlvbi1hbGxPd25lZE5vZGVzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaW5wdXQub2NsQXNUeXBlKFBpbiktPmFzU2V0KCktPnVuaW9uKG91dHB1dC0+YXNTZXQoKSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkFjdGlvbi1hbGxPd25lZE5vZGVzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJBY3Rpdml0eU5vZGUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGlvbi1hbGxPd25lZE5vZGVzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aW9uLWFsbE93bmVkTm9kZXMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkFjdGlvbi1jb250YWluaW5nQmVoYXZpb3IiIG5hbWU9ImNvbnRhaW5pbmdCZWhhdmlvciIgYm9keUNvbmRpdGlvbj0iQWN0aW9uLWNvbnRhaW5pbmdCZWhhdmlvci1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFjdGlvbi1jb250YWluaW5nQmVoYXZpb3Itc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpb24tY29udGFpbmluZ0JlaGF2aW9yIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWN0aW9uLWNvbnRhaW5pbmdCZWhhdmlvci1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIGluU3RydWN0dXJlZE5vZGUmbHQ7Pm51bGwgdGhlbiBpblN0cnVjdHVyZWROb2RlLmNvbnRhaW5pbmdCZWhhdmlvcigpICYjeEQ7Ci1lbHNlIGlmIGFjdGl2aXR5Jmx0Oz5udWxsIHRoZW4gYWN0aXZpdHkmI3hEOwotZWxzZSBpbnRlcmFjdGlvbiAmI3hEOwotZW5kaWYmI3hEOwotZW5kaWYmI3hEOwotKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJBY3Rpb24tY29udGFpbmluZ0JlaGF2aW9yLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJCZWhhdmlvciIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aW9uLWNvbnRhaW5pbmdCZWhhdmlvci1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkFjdGlvbklucHV0UGluIiBuYW1lPSJBY3Rpb25JbnB1dFBpbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aW9uSW5wdXRQaW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpb25JbnB1dFBpbiI+Ci0gICAgICAgIDxib2R5PkFuIEFjdGlvbklucHV0UGluIGlzIGEga2luZCBvZiBJbnB1dFBpbiB0aGF0IGV4ZWN1dGVzIGFuIEFjdGlvbiB0byBkZXRlcm1pbmUgdGhlIHZhbHVlcyB0byBpbnB1dCB0byBhbm90aGVyIEFjdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY3Rpb25JbnB1dFBpbi1pbnB1dF9waW4iIG5hbWU9ImlucHV0X3BpbiIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpb25JbnB1dFBpbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpb25JbnB1dFBpbi1pbnB1dF9waW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpb25JbnB1dFBpbi1pbnB1dF9waW4iPgotICAgICAgICAgIDxib2R5PlRoZSBmcm9tQWN0aW9uIG9mIGFuIEFjdGlvbklucHV0UGluIG11c3Qgb25seSBoYXZlIEFjdGlvbklucHV0UGlucyBhcyBJbnB1dFBpbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGlvbklucHV0UGluLWlucHV0X3Bpbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZnJvbUFjdGlvbi5pbnB1dC0+Zm9yQWxsKG9jbElzS2luZE9mKEFjdGlvbklucHV0UGluKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFjdGlvbklucHV0UGluLW9uZV9vdXRwdXRfcGluIiBuYW1lPSJvbmVfb3V0cHV0X3BpbiIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpb25JbnB1dFBpbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpb25JbnB1dFBpbi1vbmVfb3V0cHV0X3Bpbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGlvbklucHV0UGluLW9uZV9vdXRwdXRfcGluIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZnJvbUFjdGlvbiBvZiBhbiBBY3Rpb25JbnB1dFBpbiBtdXN0IGhhdmUgZXhhY3RseSBvbmUgT3V0cHV0UGluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY3Rpb25JbnB1dFBpbi1vbmVfb3V0cHV0X3Bpbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZnJvbUFjdGlvbi5vdXRwdXQtPnNpemUoKSA9IDE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFjdGlvbklucHV0UGluLW5vX2NvbnRyb2xfb3Jfb2JqZWN0X2Zsb3ciIG5hbWU9Im5vX2NvbnRyb2xfb3Jfb2JqZWN0X2Zsb3ciIGNvbnN0cmFpbmVkRWxlbWVudD0iQWN0aW9uSW5wdXRQaW4iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aW9uSW5wdXRQaW4tbm9fY29udHJvbF9vcl9vYmplY3RfZmxvdy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGlvbklucHV0UGluLW5vX2NvbnRyb2xfb3Jfb2JqZWN0X2Zsb3ciPgotICAgICAgICAgIDxib2R5PlRoZSBmcm9tQWN0aW9uIG9mIGFuIEFjdGlvbklucHV0UGluIGNhbm5vdCBoYXZlIEFjdGl2aXR5RWRnZXMgY29taW5nIGludG8gb3Igb3V0IG9mIGl0IG9yIGl0cyBQaW5zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY3Rpb25JbnB1dFBpbi1ub19jb250cm9sX29yX29iamVjdF9mbG93LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5mcm9tQWN0aW9uLmluY29taW5nLT51bmlvbihvdXRnb2luZyktPmlzRW1wdHkoKSBhbmQmI3hEOwotZnJvbUFjdGlvbi5pbnB1dC5pbmNvbWluZy0+aXNFbXB0eSgpIGFuZCYjeEQ7Ci1mcm9tQWN0aW9uLm91dHB1dC5vdXRnb2luZy0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFjdGlvbklucHV0UGluLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJJbnB1dFBpbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aW9uSW5wdXRQaW4tZnJvbUFjdGlvbiIgbmFtZT0iZnJvbUFjdGlvbiIgdHlwZT0iQWN0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2Zyb21BY3Rpb25fYWN0aW9uSW5wdXRQaW4iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aW9uSW5wdXRQaW4tZnJvbUFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGlvbklucHV0UGluLWZyb21BY3Rpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBBY3Rpb24gdXNlZCB0byBwcm92aWRlIHRoZSB2YWx1ZXMgb2YgdGhlIEFjdGlvbklucHV0UGluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiBuYW1lPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkFuIEFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24gaXMgYSBXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIGZvciBhZGRpbmcgdmFsdWVzIHRvIGEgU3RydWN0dXJhbEZlYXR1cmUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1yZXF1aXJlZF92YWx1ZSIgbmFtZT0icmVxdWlyZWRfdmFsdWUiIGNvbnN0cmFpbmVkRWxlbWVudD0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLXJlcXVpcmVkX3ZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1yZXF1aXJlZF92YWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+QSB2YWx1ZSBJbnB1dFBpbiBpcyByZXF1aXJlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1yZXF1aXJlZF92YWx1ZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dmFsdWUmbHQ7Pm51bGw8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24taW5zZXJ0QXRfcGluIiBuYW1lPSJpbnNlcnRBdF9waW4iIGNvbnN0cmFpbmVkRWxlbWVudD0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLWluc2VydEF0X3Bpbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24taW5zZXJ0QXRfcGluIj4KLSAgICAgICAgICA8Ym9keT5BZGRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbnMgYWRkaW5nIGEgdmFsdWUgdG8gb3JkZXJlZCBTdHJ1Y3R1cmFsRmVhdHVyZXMgbXVzdCBoYXZlIGEgc2luZ2xlIElucHV0UGluIGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50IHdpdGggdHlwZSBVbmxpbWl0ZWROYXR1cmFsIGFuZCBtdWx0aXBsaWNpdHkgb2YgMS4uMSBpZiBpc1JlcGxhY2VBbGw9ZmFsc2UsIGFuZCBtdXN0IGhhdmUgbm8gSW5wdXQgUGluIGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50IHdoZW4gdGhlIFN0cnVjdHVyYWxGZWF0dXJlIGlzIHVub3JkZXJlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1pbnNlcnRBdF9waW4tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlmIG5vdCBzdHJ1Y3R1cmFsRmVhdHVyZS5pc09yZGVyZWQgdGhlbiBpbnNlcnRBdCA9IG51bGwKLWVsc2UgCi0gIG5vdCBpc1JlcGxhY2VBbGwgaW1wbGllcwotICAJaW5zZXJ0QXQmbHQ7Pm51bGwgYW5kIAotICAJaW5zZXJ0QXQtPmZvckFsbCh0eXBlPVVubGltaXRlZE5hdHVyYWwgYW5kIGlzKDEsMS5vY2xBc1R5cGUoVW5saW1pdGVkTmF0dXJhbCkpKQotZW5kaWY8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iV3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1pbnNlcnRBdCIgbmFtZT0iaW5zZXJ0QXQiIHR5cGU9IklucHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLWlucHV0IiBhc3NvY2lhdGlvbj0iQV9pbnNlcnRBdF9hZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24taW5zZXJ0QXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLWluc2VydEF0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgSW5wdXRQaW4gdGhhdCBnaXZlcyB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSB2YWx1ZSBpbiBhbiBvcmRlcmVkIFN0cnVjdHVyYWxGZWF0dXJlLiBUaGUgdHlwZSBvZiB0aGUgaW5zZXJ0QXQgSW5wdXRQaW4gaXMgVW5saW1pdGVkTmF0dXJhbCwgYnV0IHRoZSB2YWx1ZSBjYW5ub3QgYmUgemVyby4gSXQgaXMgb21pdHRlZCBmb3IgdW5vcmRlcmVkIFN0cnVjdHVyYWxGZWF0dXJlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24taW5zZXJ0QXQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLWlzUmVwbGFjZUFsbCIgbmFtZT0iaXNSZXBsYWNlQWxsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24taXNSZXBsYWNlQWxsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1pc1JlcGxhY2VBbGwiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB3aGV0aGVyIGV4aXN0aW5nIHZhbHVlcyBvZiB0aGUgU3RydWN0dXJhbEZlYXR1cmUgc2hvdWxkIGJlIHJlbW92ZWQgYmVmb3JlIGFkZGluZyB0aGUgbmV3IHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24taXNSZXBsYWNlQWxsLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkFkZFZhcmlhYmxlVmFsdWVBY3Rpb24iIG5hbWU9IkFkZFZhcmlhYmxlVmFsdWVBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFkZFZhcmlhYmxlVmFsdWVBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBZGRWYXJpYWJsZVZhbHVlQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QW4gQWRkVmFyaWFibGVWYWx1ZUFjdGlvbiBpcyBhIFdyaXRlVmFyaWFibGVBY3Rpb24gZm9yIGFkZGluZyB2YWx1ZXMgdG8gYSBWYXJpYWJsZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBZGRWYXJpYWJsZVZhbHVlQWN0aW9uLXJlcXVpcmVkX3ZhbHVlIiBuYW1lPSJyZXF1aXJlZF92YWx1ZSIgY29uc3RyYWluZWRFbGVtZW50PSJBZGRWYXJpYWJsZVZhbHVlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFkZFZhcmlhYmxlVmFsdWVBY3Rpb24tcmVxdWlyZWRfdmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBZGRWYXJpYWJsZVZhbHVlQWN0aW9uLXJlcXVpcmVkX3ZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5BIHZhbHVlIElucHV0UGluIGlzIHJlcXVpcmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBZGRWYXJpYWJsZVZhbHVlQWN0aW9uLXJlcXVpcmVkX3ZhbHVlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT52YWx1ZSAmbHQ7PiBudWxsPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBZGRWYXJpYWJsZVZhbHVlQWN0aW9uLWluc2VydEF0X3BpbiIgbmFtZT0iaW5zZXJ0QXRfcGluIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFkZFZhcmlhYmxlVmFsdWVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWRkVmFyaWFibGVWYWx1ZUFjdGlvbi1pbnNlcnRBdF9waW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBZGRWYXJpYWJsZVZhbHVlQWN0aW9uLWluc2VydEF0X3BpbiI+Ci0gICAgICAgICAgPGJvZHk+QWRkVmFyaWFibGVWYWx1ZUFjdGlvbnMgZm9yIG9yZGVyZWQgVmFyaWFibGVzIG11c3QgaGF2ZSBhIHNpbmdsZSBJbnB1dFBpbiBmb3IgdGhlIGluc2VydGlvbiBwb2ludCB3aXRoIHR5cGUgVW5saW10ZWROYXR1cmFsIGFuZCBtdWx0aXBsaWNpdHkgb2YgMS4uMSBpZiBpc1JlcGxhY2VBbGw9ZmFsc2UsIG90aGVyd2lzZSB0aGUgQWN0aW9uIGhhcyBubyBJbnB1dFBpbiBmb3IgdGhlIGluc2VydGlvbiBwb2ludC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWRkVmFyaWFibGVWYWx1ZUFjdGlvbi1pbnNlcnRBdF9waW4tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlmIG5vdCB2YXJpYWJsZS5pc09yZGVyZWQgdGhlbiBpbnNlcnRBdCA9IG51bGwKLWVsc2UgCi0gIG5vdCBpc1JlcGxhY2VBbGwgaW1wbGllcwotICAJaW5zZXJ0QXQmbHQ7Pm51bGwgYW5kIAotICAJaW5zZXJ0QXQtPmZvckFsbCh0eXBlPVVubGltaXRlZE5hdHVyYWwgYW5kIGlzKDEsMS5vY2xBc1R5cGUoVW5saW1pdGVkTmF0dXJhbCkpKQotZW5kaWY8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQWRkVmFyaWFibGVWYWx1ZUFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iV3JpdGVWYXJpYWJsZUFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWRkVmFyaWFibGVWYWx1ZUFjdGlvbi1pbnNlcnRBdCIgbmFtZT0iaW5zZXJ0QXQiIHR5cGU9IklucHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLWlucHV0IiBhc3NvY2lhdGlvbj0iQV9pbnNlcnRBdF9hZGRWYXJpYWJsZVZhbHVlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFkZFZhcmlhYmxlVmFsdWVBY3Rpb24taW5zZXJ0QXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBZGRWYXJpYWJsZVZhbHVlQWN0aW9uLWluc2VydEF0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgSW5wdXRQaW4gdGhhdCBnaXZlcyB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdG8gaW5zZXJ0IGEgbmV3IHZhbHVlIG9yIG1vdmUgYW4gZXhpc3RpbmcgdmFsdWUgaW4gb3JkZXJlZCBWYXJpYWJsZXMuIFRoZSB0eXBlIG9mIHRoZSBpbnNlcnRBdCBJbnB1dFBpbiBpcyBVbmxpbWl0ZWROYXR1cmFsLCBidXQgdGhlIHZhbHVlIGNhbm5vdCBiZSB6ZXJvLiBJdCBpcyBvbWl0dGVkIGZvciB1bm9yZGVyZWQgVmFyaWFibGVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWRkVmFyaWFibGVWYWx1ZUFjdGlvbi1pbnNlcnRBdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFkZFZhcmlhYmxlVmFsdWVBY3Rpb24taXNSZXBsYWNlQWxsIiBuYW1lPSJpc1JlcGxhY2VBbGwiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWRkVmFyaWFibGVWYWx1ZUFjdGlvbi1pc1JlcGxhY2VBbGwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBZGRWYXJpYWJsZVZhbHVlQWN0aW9uLWlzUmVwbGFjZUFsbCI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHdoZXRoZXIgZXhpc3RpbmcgdmFsdWVzIG9mIHRoZSBWYXJpYWJsZSBzaG91bGQgYmUgcmVtb3ZlZCBiZWZvcmUgYWRkaW5nIHRoZSBuZXcgdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iQWRkVmFyaWFibGVWYWx1ZUFjdGlvbi1pc1JlcGxhY2VBbGwtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQnJvYWRjYXN0U2lnbmFsQWN0aW9uIiBuYW1lPSJCcm9hZGNhc3RTaWduYWxBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJyb2FkY2FzdFNpZ25hbEFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJyb2FkY2FzdFNpZ25hbEFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgQnJvYWRjYXN0U2lnbmFsQWN0aW9uIGlzIGFuIEludm9jYXRpb25BY3Rpb24gdGhhdCB0cmFuc21pdHMgYSBTaWduYWwgaW5zdGFuY2UgdG8gYWxsIHRoZSBwb3RlbnRpYWwgdGFyZ2V0IG9iamVjdHMgaW4gdGhlIHN5c3RlbS4gVmFsdWVzIGZyb20gdGhlIGFyZ3VtZW50IElucHV0UGlucyBhcmUgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIFNpZ25hbC4gVGhlIHJlcXVlc3RvciBjb250aW51ZXMgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBTaWduYWwgaW5zdGFuY2VzIGFyZSBzZW50IG91dCBhbmQgY2Fubm90IHJlY2VpdmUgcmVwbHkgdmFsdWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkJyb2FkY2FzdFNpZ25hbEFjdGlvbi1udW1iZXJfb2ZfYXJndW1lbnRzIiBuYW1lPSJudW1iZXJfb2ZfYXJndW1lbnRzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkJyb2FkY2FzdFNpZ25hbEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCcm9hZGNhc3RTaWduYWxBY3Rpb24tbnVtYmVyX29mX2FyZ3VtZW50cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJyb2FkY2FzdFNpZ25hbEFjdGlvbi1udW1iZXJfb2ZfYXJndW1lbnRzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgbnVtYmVyIG9mIGFyZ3VtZW50IElucHV0UGlucyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBpbiB0aGUgc2lnbmFsLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJCcm9hZGNhc3RTaWduYWxBY3Rpb24tbnVtYmVyX29mX2FyZ3VtZW50cy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+YXJndW1lbnQtPnNpemUoKSA9IHNpZ25hbC5hbGxBdHRyaWJ1dGVzKCktPnNpemUoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQnJvYWRjYXN0U2lnbmFsQWN0aW9uLXR5cGVfb3JkZXJpbmdfbXVsdGlwbGljaXR5IiBuYW1lPSJ0eXBlX29yZGVyaW5nX211bHRpcGxpY2l0eSIgY29uc3RyYWluZWRFbGVtZW50PSJCcm9hZGNhc3RTaWduYWxBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQnJvYWRjYXN0U2lnbmFsQWN0aW9uLXR5cGVfb3JkZXJpbmdfbXVsdGlwbGljaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQnJvYWRjYXN0U2lnbmFsQWN0aW9uLXR5cGVfb3JkZXJpbmdfbXVsdGlwbGljaXR5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSwgb3JkZXJpbmcsIGFuZCBtdWx0aXBsaWNpdHkgb2YgYW4gYXJndW1lbnQgSW5wdXRQaW4gbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIHNpZ25hbC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQnJvYWRjYXN0U2lnbmFsQWN0aW9uLXR5cGVfb3JkZXJpbmdfbXVsdGlwbGljaXR5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5sZXQgYXR0cmlidXRlOiBPcmRlcmVkU2V0KFByb3BlcnR5KSA9IHNpZ25hbC5hbGxBdHRyaWJ1dGVzKCkgaW4mI3hEOwotU2VxdWVuY2V7MS4uYXJndW1lbnQtPnNpemUoKX0tPmZvckFsbChpIHwgJiN4RDsKLQlhcmd1bWVudC0+YXQoaSkudHlwZS5jb25mb3Jtc1RvKGF0dHJpYnV0ZS0+YXQoaSkudHlwZSkgYW5kICYjeEQ7Ci0JYXJndW1lbnQtPmF0KGkpLmlzT3JkZXJlZCA9IGF0dHJpYnV0ZS0+YXQoaSkuaXNPcmRlcmVkIGFuZCYjeEQ7Ci0JYXJndW1lbnQtPmF0KGkpLmNvbXBhdGlibGVXaXRoKGF0dHJpYnV0ZS0+YXQoaSkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQnJvYWRjYXN0U2lnbmFsQWN0aW9uLW5vX29ucG9ydCIgbmFtZT0ibm9fb25wb3J0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkJyb2FkY2FzdFNpZ25hbEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCcm9hZGNhc3RTaWduYWxBY3Rpb24tbm9fb25wb3J0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQnJvYWRjYXN0U2lnbmFsQWN0aW9uLW5vX29ucG9ydCI+Ci0gICAgICAgICAgPGJvZHk+QSBCcm9hZGNhc2VTaWduYWxBY3Rpb24gbWF5IG5vdCBzcGVjaWZ5IG9uUG9ydC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQnJvYWRjYXN0U2lnbmFsQWN0aW9uLW5vX29ucG9ydC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b25Qb3J0PW51bGw8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQnJvYWRjYXN0U2lnbmFsQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJJbnZvY2F0aW9uQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJCcm9hZGNhc3RTaWduYWxBY3Rpb24tc2lnbmFsIiBuYW1lPSJzaWduYWwiIHR5cGU9IlNpZ25hbCIgYXNzb2NpYXRpb249IkFfc2lnbmFsX2Jyb2FkY2FzdFNpZ25hbEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCcm9hZGNhc3RTaWduYWxBY3Rpb24tc2lnbmFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQnJvYWRjYXN0U2lnbmFsQWN0aW9uLXNpZ25hbCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFNpZ25hbCB3aG9zZSBpbnN0YW5jZXMgYXJlIHRvIGJlIHNlbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNhbGxBY3Rpb24iIG5hbWU9IkNhbGxBY3Rpb24iIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNhbGxBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDYWxsQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+Q2FsbEFjdGlvbiBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgQWN0aW9ucyB0aGF0IGludm9rZSBhIEJlaGF2aW9yIHdpdGggZ2l2ZW4gYXJndW1lbnQgdmFsdWVzIGFuZCAoaWYgdGhlIGludm9jYXRpb24gaXMgc3luY2hyb25vdXMpIHJlY2VpdmUgcmVwbHkgdmFsdWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNhbGxBY3Rpb24tYXJndW1lbnRfcGlucyIgbmFtZT0iYXJndW1lbnRfcGlucyIgY29uc3RyYWluZWRFbGVtZW50PSJDYWxsQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNhbGxBY3Rpb24tYXJndW1lbnRfcGlucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNhbGxBY3Rpb24tYXJndW1lbnRfcGlucyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG51bWJlciBvZiBhcmd1bWVudCBJbnB1dFBpbnMgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGlucHV0IChpbiBhbmQgaW5vdXQpIG93bmVkUGFyYW1ldGVycyBvZiB0aGUgY2FsbGVkIEJlaGF2aW9yIG9yIE9wZXJhdGlvbi4gVGhlIHR5cGUsIG9yZGVyaW5nIGFuZCBtdWx0aXBsaWNpdHkgb2YgZWFjaCBhcmd1bWVudCBJbnB1dFBpbiBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCBQYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNhbGxBY3Rpb24tYXJndW1lbnRfcGlucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bGV0IHBhcmFtZXRlcjogT3JkZXJlZFNldChQYXJhbWV0ZXIpID0gc2VsZi5pbnB1dFBhcmFtZXRlcnMoKSBpbiYjeEQ7Ci1hcmd1bWVudC0+c2l6ZSgpID0gcGFyYW1ldGVyLT5zaXplKCkgYW5kJiN4RDsKLVNlcXVlbmNlezEuLmFyZ3VtZW50LT5zaXplKCl9LT5mb3JBbGwoaSB8ICYjeEQ7Ci0JYXJndW1lbnQtPmF0KGkpLnR5cGUuY29uZm9ybXNUbyhwYXJhbWV0ZXItPmF0KGkpLnR5cGUpIGFuZCAmI3hEOwotCWFyZ3VtZW50LT5hdChpKS5pc09yZGVyZWQgPSBwYXJhbWV0ZXItPmF0KGkpLmlzT3JkZXJlZCBhbmQmI3hEOwotCWFyZ3VtZW50LT5hdChpKS5jb21wYXRpYmxlV2l0aChwYXJhbWV0ZXItPmF0KGkpKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNhbGxBY3Rpb24tcmVzdWx0X3BpbnMiIG5hbWU9InJlc3VsdF9waW5zIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNhbGxBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2FsbEFjdGlvbi1yZXN1bHRfcGlucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNhbGxBY3Rpb24tcmVzdWx0X3BpbnMiPgotICAgICAgICAgIDxib2R5PlRoZSBudW1iZXIgb2YgcmVzdWx0IE91dHB1dFBpbnMgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIG91dHB1dCAoaW5vdXQsIG91dCBhbmQgcmV0dXJuKSBvd25lZFBhcmFtZXRlcnMgb2YgdGhlIGNhbGxlZCBCZWhhdmlvciBvciBPcGVyYXRpb24uIFRoZSB0eXBlLCBvcmRlcmluZyBhbmQgbXVsdGlwbGljaXR5IG9mIGVhY2ggcmVzdWx0IE91dHB1dFBpbiBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCBQYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNhbGxBY3Rpb24tcmVzdWx0X3BpbnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmxldCBwYXJhbWV0ZXI6IE9yZGVyZWRTZXQoUGFyYW1ldGVyKSA9IHNlbGYub3V0cHV0UGFyYW1ldGVycygpIGluJiN4RDsKLXJlc3VsdC0+c2l6ZSgpID0gcGFyYW1ldGVyLT5zaXplKCkgYW5kJiN4RDsKLVNlcXVlbmNlezEuLnJlc3VsdC0+c2l6ZSgpfS0+Zm9yQWxsKGkgfCAmI3hEOwotCXBhcmFtZXRlci0+YXQoaSkudHlwZS5jb25mb3Jtc1RvKHJlc3VsdC0+YXQoaSkudHlwZSkgYW5kICYjeEQ7Ci0JcGFyYW1ldGVyLT5hdChpKS5pc09yZGVyZWQgPSByZXN1bHQtPmF0KGkpLmlzT3JkZXJlZCBhbmQmI3hEOwotCXBhcmFtZXRlci0+YXQoaSkuY29tcGF0aWJsZVdpdGgocmVzdWx0LT5hdChpKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDYWxsQWN0aW9uLXN5bmNocm9ub3VzX2NhbGwiIG5hbWU9InN5bmNocm9ub3VzX2NhbGwiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2FsbEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDYWxsQWN0aW9uLXN5bmNocm9ub3VzX2NhbGwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDYWxsQWN0aW9uLXN5bmNocm9ub3VzX2NhbGwiPgotICAgICAgICAgIDxib2R5Pk9ubHkgc3luY2hyb25vdXMgQ2FsbEFjdGlvbnMgY2FuIGhhdmUgcmVzdWx0IE91dHB1dFBpbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNhbGxBY3Rpb24tc3luY2hyb25vdXNfY2FsbC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVzdWx0LT5ub3RFbXB0eSgpIGltcGxpZXMgaXNTeW5jaHJvbm91czwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDYWxsQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJJbnZvY2F0aW9uQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDYWxsQWN0aW9uLWlzU3luY2hyb25vdXMiIG5hbWU9ImlzU3luY2hyb25vdXMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2FsbEFjdGlvbi1pc1N5bmNocm9ub3VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2FsbEFjdGlvbi1pc1N5bmNocm9ub3VzIj4KLSAgICAgICAgICA8Ym9keT5JZiB0cnVlLCB0aGUgY2FsbCBpcyBzeW5jaHJvbm91cyBhbmQgdGhlIGNhbGxlciB3YWl0cyBmb3IgY29tcGxldGlvbiBvZiB0aGUgaW52b2tlZCBCZWhhdmlvci4gSWYgZmFsc2UsIHRoZSBjYWxsIGlzIGFzeW5jaHJvbm91cyBhbmQgdGhlIGNhbGxlciBwcm9jZWVkcyBpbW1lZGlhdGVseSBhbmQgY2Fubm90IHJlY2VpdmUgcmV0dXJuIHZhbHVlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJDYWxsQWN0aW9uLWlzU3luY2hyb25vdXMtX2RlZmF1bHRWYWx1ZSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDYWxsQWN0aW9uLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJPdXRwdXRQaW4iIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1vdXRwdXQiIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF9jYWxsQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNhbGxBY3Rpb24tcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2FsbEFjdGlvbi1yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBPdXRwdXRQaW5zIG9uIHdoaWNoIHRoZSByZXBseSB2YWx1ZXMgZnJvbSB0aGUgaW52b2NhdGlvbiBhcmUgcGxhY2VkIChpZiB0aGUgY2FsbCBpcyBzeW5jaHJvbm91cykuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDYWxsQWN0aW9uLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNhbGxBY3Rpb24tcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNhbGxBY3Rpb24taW5wdXRQYXJhbWV0ZXJzIiBuYW1lPSJpbnB1dFBhcmFtZXRlcnMiIGlzQWJzdHJhY3Q9InRydWUiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2FsbEFjdGlvbi1pbnB1dFBhcmFtZXRlcnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDYWxsQWN0aW9uLWlucHV0UGFyYW1ldGVycyI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJuIHRoZSBpbiBhbmQgaW5vdXQgb3duZWRQYXJhbWV0ZXJzIG9mIHRoZSBCZWhhdmlvciBvciBPcGVyYXRpb24gYmVpbmcgY2FsbGVkLiAoVGhpcyBvcGVyYXRpb24gaXMgYWJzdHJhY3QgYW5kIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgb2YgQ2FsbEFjdGlvbi4pPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2FsbEFjdGlvbi1pbnB1dFBhcmFtZXRlcnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlBhcmFtZXRlciIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDYWxsQWN0aW9uLWlucHV0UGFyYW1ldGVycy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNhbGxBY3Rpb24taW5wdXRQYXJhbWV0ZXJzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDYWxsQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMiIG5hbWU9Im91dHB1dFBhcmFtZXRlcnMiIGlzQWJzdHJhY3Q9InRydWUiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2FsbEFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2FsbEFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzIj4KLSAgICAgICAgICA8Ym9keT5SZXR1cm4gdGhlIGlub3V0LCBvdXQgYW5kIHJldHVybiBvd25lZFBhcmFtZXRlcnMgb2YgdGhlIEJlaGF2aW9yIG9yIE9wZXJhdGlvbiBiZWluZyBjYWxsZWQuIChUaGlzIG9wZXJhdGlvbiBpcyBhYnN0cmFjdCBhbmQgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyBvZiBDYWxsQWN0aW9uLik8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDYWxsQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlBhcmFtZXRlciIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDYWxsQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDYWxsQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ2FsbEJlaGF2aW9yQWN0aW9uIiBuYW1lPSJDYWxsQmVoYXZpb3JBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNhbGxCZWhhdmlvckFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNhbGxCZWhhdmlvckFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgQ2FsbEJlaGF2aW9yQWN0aW9uIGlzIGEgQ2FsbEFjdGlvbiB0aGF0IGludm9rZXMgYSBCZWhhdmlvciBkaXJlY3RseS4gVGhlIGFyZ3VtZW50IHZhbHVlcyBvZiB0aGUgQ2FsbEJlaGF2aW9yQWN0aW9uIGFyZSBwYXNzZWQgb24gdGhlIGlucHV0IFBhcmFtZXRlcnMgb2YgdGhlIGludm9rZWQgQmVoYXZpb3IuIElmIHRoZSBjYWxsIGlzIHN5bmNocm9ub3VzLCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBDYWxsQmVoYXZpb3JBY3Rpb24gd2FpdHMgdW50aWwgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgaW52b2tlZCBCZWhhdmlvciBjb21wbGV0ZXMgYW5kIHRoZSB2YWx1ZXMgb2Ygb3V0cHV0IFBhcmFtZXRlcnMgb2YgdGhlIEJlaGF2aW9yIGFyZSBwbGFjZWQgb24gdGhlIHJlc3VsdCBPdXRwdXRQaW5zLiBJZiB0aGUgY2FsbCBpcyBhc3luY2hyb25vdXMsIHRoZSBDYWxsQmVoYXZpb3JBY3Rpb24gY29tcGxldGVzIGltbWVkaWF0ZWx5IGFuZCBubyByZXN1bHRzIHZhbHVlcyBjYW4gYmUgcHJvdmlkZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2FsbEJlaGF2aW9yQWN0aW9uLW5vX29ucG9ydCIgbmFtZT0ibm9fb25wb3J0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNhbGxCZWhhdmlvckFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDYWxsQmVoYXZpb3JBY3Rpb24tbm9fb25wb3J0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2FsbEJlaGF2aW9yQWN0aW9uLW5vX29ucG9ydCI+Ci0gICAgICAgICAgPGJvZHk+QSBDYWxsQmVoYXZpb3JBY3Rpb24gbWF5IG5vdCBzcGVjaWZ5IG9uUG9ydC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2FsbEJlaGF2aW9yQWN0aW9uLW5vX29ucG9ydC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b25Qb3J0PW51bGw8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQ2FsbEJlaGF2aW9yQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJDYWxsQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDYWxsQmVoYXZpb3JBY3Rpb24tYmVoYXZpb3IiIG5hbWU9ImJlaGF2aW9yIiB0eXBlPSJCZWhhdmlvciIgYXNzb2NpYXRpb249IkFfYmVoYXZpb3JfY2FsbEJlaGF2aW9yQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNhbGxCZWhhdmlvckFjdGlvbi1iZWhhdmlvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNhbGxCZWhhdmlvckFjdGlvbi1iZWhhdmlvciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEJlaGF2aW9yIGJlaW5nIGludm9rZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDYWxsQmVoYXZpb3JBY3Rpb24tb3V0cHV0UGFyYW1ldGVycyIgbmFtZT0ib3V0cHV0UGFyYW1ldGVycyIgYm9keUNvbmRpdGlvbj0iQ2FsbEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJDYWxsQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2FsbEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDYWxsQmVoYXZpb3JBY3Rpb24tb3V0cHV0UGFyYW1ldGVycyI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJuIHRoZSBpbm91dCwgb3V0IGFuZCByZXR1cm4gb3duZWRQYXJhbWV0ZXJzIG9mIHRoZSBCZWhhdmlvciBiZWluZyBjYWxsZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNhbGxCZWhhdmlvckFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2FsbEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDYWxsQmVoYXZpb3JBY3Rpb24tb3V0cHV0UGFyYW1ldGVycy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGJlaGF2aW9yLm91dHB1dFBhcmFtZXRlcnMoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2FsbEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlBhcmFtZXRlciIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDYWxsQmVoYXZpb3JBY3Rpb24tb3V0cHV0UGFyYW1ldGVycy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNhbGxCZWhhdmlvckFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDYWxsQmVoYXZpb3JBY3Rpb24taW5wdXRQYXJhbWV0ZXJzIiBuYW1lPSJpbnB1dFBhcmFtZXRlcnMiIGJvZHlDb25kaXRpb249IkNhbGxCZWhhdmlvckFjdGlvbi1pbnB1dFBhcmFtZXRlcnMtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJDYWxsQWN0aW9uLWlucHV0UGFyYW1ldGVycyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDYWxsQmVoYXZpb3JBY3Rpb24taW5wdXRQYXJhbWV0ZXJzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2FsbEJlaGF2aW9yQWN0aW9uLWlucHV0UGFyYW1ldGVycyI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJuIHRoZSBpbiBhbmQgaW5vdXQgb3duZWRQYXJhbWV0ZXJzIG9mIHRoZSBCZWhhdmlvciBiZWluZyBjYWxsZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNhbGxCZWhhdmlvckFjdGlvbi1pbnB1dFBhcmFtZXRlcnMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDYWxsQmVoYXZpb3JBY3Rpb24taW5wdXRQYXJhbWV0ZXJzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2FsbEJlaGF2aW9yQWN0aW9uLWlucHV0UGFyYW1ldGVycy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGJlaGF2aW9yLmlucHV0UGFyYW1ldGVycygpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDYWxsQmVoYXZpb3JBY3Rpb24taW5wdXRQYXJhbWV0ZXJzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQYXJhbWV0ZXIiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2FsbEJlaGF2aW9yQWN0aW9uLWlucHV0UGFyYW1ldGVycy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNhbGxCZWhhdmlvckFjdGlvbi1pbnB1dFBhcmFtZXRlcnMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbiIgbmFtZT0iQ2FsbE9wZXJhdGlvbkFjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNhbGxPcGVyYXRpb25BY3Rpb24iPgotICAgICAgICA8Ym9keT5BIENhbGxPcGVyYXRpb25BY3Rpb24gaXMgYSBDYWxsQWN0aW9uIHRoYXQgdHJhbnNtaXRzIGFuIE9wZXJhdGlvbiBjYWxsIHJlcXVlc3QgdG8gdGhlIHRhcmdldCBvYmplY3QsIHdoZXJlIGl0IG1heSBjYXVzZSB0aGUgaW52b2NhdGlvbiBvZiBhc3NvY2lhdGVkIEJlaGF2aW9yLiBUaGUgYXJndW1lbnQgdmFsdWVzIG9mIHRoZSBDYWxsT3BlcmF0aW9uQWN0aW9uIGFyZSBwYXNzZWQgb24gdGhlIGlucHV0IFBhcmFtZXRlcnMgb2YgdGhlIE9wZXJhdGlvbi4gSWYgY2FsbCBpcyBzeW5jaHJvbm91cywgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgQ2FsbE9wZXJhdGlvbkFjdGlvbiB3YWl0cyB1bnRpbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBpbnZva2VkIE9wZXJhdGlvbiBjb21wbGV0ZXMgYW5kIHRoZSB2YWx1ZXMgb2Ygb3V0cHV0IFBhcmFtZXRlcnMgb2YgdGhlIE9wZXJhdGlvbiBhcmUgcGxhY2VkIG9uIHRoZSByZXN1bHQgT3V0cHV0UGlucy4gSWYgdGhlIGNhbGwgaXMgYXN5bmNocm9ub3VzLCB0aGUgQ2FsbE9wZXJhdGlvbkFjdGlvbiBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgYW5kIG5vIHJlc3VsdHMgdmFsdWVzIGNhbiBiZSBwcm92aWRlZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDYWxsT3BlcmF0aW9uQWN0aW9uLXR5cGVfdGFyZ2V0X3BpbiIgbmFtZT0idHlwZV90YXJnZXRfcGluIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNhbGxPcGVyYXRpb25BY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi10eXBlX3RhcmdldF9waW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDYWxsT3BlcmF0aW9uQWN0aW9uLXR5cGVfdGFyZ2V0X3BpbiI+Ci0gICAgICAgICAgPGJvZHk+SWYgb25Qb3J0IGhhcyBubyB2YWx1ZSwgdGhlIG9wZXJhdGlvbiBtdXN0IGJlIGFuIG93bmVkIG9yIGluaGVyaXRlZCBmZWF0dXJlIG9mIHRoZSB0eXBlIG9mIHRoZSB0YXJnZXQgSW5wdXRQaW4sIG90aGVyd2lzZSB0aGUgUG9ydCBnaXZlbiBieSBvblBvcnQgbXVzdCBiZSBhbiBvd25lZCBvciBpbmhlcml0ZWQgZmVhdHVyZSBvZiB0aGUgdHlwZSBvZiB0aGUgdGFyZ2V0IElucHV0UGluLCBhbmQgdGhlIFBvcnQgbXVzdCBoYXZlIGEgcmVxdWlyZWQgb3IgcHJvdmlkZWQgSW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbiBhcyBhbiBvd25lZCBvciBpbmhlcml0ZWQgZmVhdHVyZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi10eXBlX3RhcmdldF9waW4tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlmIG9uUG9ydD1udWxsIHRoZW4gIHRhcmdldC50eXBlLm9jbEFzVHlwZShDbGFzc2lmaWVyKS5hbGxGZWF0dXJlcygpLT5pbmNsdWRlcyhvcGVyYXRpb24pJiN4RDsKLWVsc2UgdGFyZ2V0LnR5cGUub2NsQXNUeXBlKENsYXNzaWZpZXIpLmFsbEZlYXR1cmVzKCktPmluY2x1ZGVzKG9uUG9ydCkgYW5kIG9uUG9ydC5wcm92aWRlZC0+dW5pb24ob25Qb3J0LnJlcXVpcmVkKS5hbGxGZWF0dXJlcygpLT5pbmNsdWRlcyhvcGVyYXRpb24pJiN4RDsKLWVuZGlmPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNhbGxPcGVyYXRpb25BY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkNhbGxBY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNhbGxPcGVyYXRpb25BY3Rpb24tb3BlcmF0aW9uIiBuYW1lPSJvcGVyYXRpb24iIHR5cGU9Ik9wZXJhdGlvbiIgYXNzb2NpYXRpb249IkFfb3BlcmF0aW9uX2NhbGxPcGVyYXRpb25BY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1vcGVyYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDYWxsT3BlcmF0aW9uQWN0aW9uLW9wZXJhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE9wZXJhdGlvbiBiZWluZyBpbnZva2VkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi10YXJnZXQiIG5hbWU9InRhcmdldCIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX3RhcmdldF9jYWxsT3BlcmF0aW9uQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNhbGxPcGVyYXRpb25BY3Rpb24tdGFyZ2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi10YXJnZXQiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbiB0aGF0IHByb3ZpZGVzIHRoZSB0YXJnZXQgb2JqZWN0IHRvIHdoaWNoIHRoZSBPcGVyYXRpb24gY2FsbCByZXF1ZXN0IGlzIHNlbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDYWxsT3BlcmF0aW9uQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMiIG5hbWU9Im91dHB1dFBhcmFtZXRlcnMiIGJvZHlDb25kaXRpb249IkNhbGxPcGVyYXRpb25BY3Rpb24tb3V0cHV0UGFyYW1ldGVycy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IkNhbGxBY3Rpb24tb3V0cHV0UGFyYW1ldGVycyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDYWxsT3BlcmF0aW9uQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDYWxsT3BlcmF0aW9uQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMiPgotICAgICAgICAgIDxib2R5PlJldHVybiB0aGUgaW5vdXQsIG91dCBhbmQgcmV0dXJuIG93bmVkUGFyYW1ldGVycyBvZiB0aGUgT3BlcmF0aW9uIGJlaW5nIGNhbGxlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAob3BlcmF0aW9uLm91dHB1dFBhcmFtZXRlcnMoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQYXJhbWV0ZXIiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1vdXRwdXRQYXJhbWV0ZXJzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDYWxsT3BlcmF0aW9uQWN0aW9uLWlucHV0UGFyYW1ldGVycyIgbmFtZT0iaW5wdXRQYXJhbWV0ZXJzIiBib2R5Q29uZGl0aW9uPSJDYWxsT3BlcmF0aW9uQWN0aW9uLWlucHV0UGFyYW1ldGVycy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IkNhbGxBY3Rpb24taW5wdXRQYXJhbWV0ZXJzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNhbGxPcGVyYXRpb25BY3Rpb24taW5wdXRQYXJhbWV0ZXJzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1pbnB1dFBhcmFtZXRlcnMiPgotICAgICAgICAgIDxib2R5PlJldHVybiB0aGUgaW4gYW5kIGlub3V0IG93bmVkUGFyYW1ldGVycyBvZiB0aGUgT3BlcmF0aW9uIGJlaW5nIGNhbGxlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1pbnB1dFBhcmFtZXRlcnMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDYWxsT3BlcmF0aW9uQWN0aW9uLWlucHV0UGFyYW1ldGVycyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNhbGxPcGVyYXRpb25BY3Rpb24taW5wdXRQYXJhbWV0ZXJzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAob3BlcmF0aW9uLmlucHV0UGFyYW1ldGVycygpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDYWxsT3BlcmF0aW9uQWN0aW9uLWlucHV0UGFyYW1ldGVycy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUGFyYW1ldGVyIiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNhbGxPcGVyYXRpb25BY3Rpb24taW5wdXRQYXJhbWV0ZXJzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi1pbnB1dFBhcmFtZXRlcnMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ2xhdXNlIiBuYW1lPSJDbGF1c2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXVzZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXVzZSI+Ci0gICAgICAgIDxib2R5PkEgQ2xhdXNlIGlzIGFuIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGJyYW5jaCBvZiBhIENvbmRpdGlvbmFsTm9kZSwgaW5jbHVkaW5nIGEgdGVzdCBhbmQgYSBib2R5IHNlY3Rpb24uIFRoZSBib2R5IHNlY3Rpb24gaXMgZXhlY3V0ZWQgb25seSBpZiAoYnV0IG5vdCBuZWNlc3NhcmlseSBpZikgdGhlIHRlc3Qgc2VjdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGF1c2UtYm9keV9vdXRwdXRfcGlucyIgbmFtZT0iYm9keV9vdXRwdXRfcGlucyIgY29uc3RyYWluZWRFbGVtZW50PSJDbGF1c2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhdXNlLWJvZHlfb3V0cHV0X3BpbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGF1c2UtYm9keV9vdXRwdXRfcGlucyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGJvZHlPdXRwdXQgUGlucyBhcmUgT3V0cHV0UGlucyBvbiBBY3Rpb25zIGluIHRoZSBib2R5IG9mIHRoZSBDbGF1c2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXVzZS1ib2R5X291dHB1dF9waW5zLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5fJ2JvZHknLm9jbEFzVHlwZShBY3Rpb24pLmFsbEFjdGlvbnMoKS5vdXRwdXQtPmluY2x1ZGVzQWxsKGJvZHlPdXRwdXQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGF1c2UtZGVjaWRlcl9vdXRwdXQiIG5hbWU9ImRlY2lkZXJfb3V0cHV0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXVzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGF1c2UtZGVjaWRlcl9vdXRwdXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGF1c2UtZGVjaWRlcl9vdXRwdXQiPgotICAgICAgICAgIDxib2R5PlRoZSBkZWNpZGVyIFBpbiBtdXN0IGJlIG9uIGFuIEFjdGlvbiBpbiB0aGUgdGVzdCBzZWN0aW9uIG9mIHRoZSBDbGF1c2UgYW5kIG11c3QgYmUgb2YgdHlwZSBCb29sZWFuIHdpdGggbXVsdGlwbGljaXR5IDEuLjEuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXVzZS1kZWNpZGVyX291dHB1dC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dGVzdC5vY2xBc1R5cGUoQWN0aW9uKS5hbGxBY3Rpb25zKCkub3V0cHV0LT5pbmNsdWRlcyhkZWNpZGVyKSBhbmQmI3hEOwotZGVjaWRlci50eXBlID0gQm9vbGVhbiBhbmQmI3hEOwotZGVjaWRlci5pcygxLDEpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGF1c2UtdGVzdF9hbmRfYm9keSIgbmFtZT0idGVzdF9hbmRfYm9keSIgY29uc3RyYWluZWRFbGVtZW50PSJDbGF1c2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhdXNlLXRlc3RfYW5kX2JvZHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGF1c2UtdGVzdF9hbmRfYm9keSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHRlc3QgYW5kIGJvZHkgcGFydHMgb2YgYSBDb25kaXRpb25hbE5vZGUgbXVzdCBiZSBkaXNqb2ludCB3aXRoIGVhY2ggb3RoZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXVzZS10ZXN0X2FuZF9ib2R5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT50ZXN0LT5pbnRlcnNlY3Rpb24oXydib2R5JyktPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDbGF1c2UtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXVzZS1ib2R5IiBuYW1lPSJib2R5IiB0eXBlPSJFeGVjdXRhYmxlTm9kZSIgYXNzb2NpYXRpb249IkFfYm9keV9jbGF1c2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhdXNlLWJvZHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGF1c2UtYm9keSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNldCBvZiBFeGVjdXRhYmxlTm9kZXMgdGhhdCBhcmUgZXhlY3V0ZWQgaWYgdGhlIHRlc3QgZXZhbHVhdGVzIHRvIHRydWUgYW5kIHRoZSBDbGF1c2UgaXMgY2hvc2VuIG92ZXIgb3RoZXIgQ2xhdXNlcyB3aXRoaW4gdGhlIENvbmRpdGlvbmFsTm9kZSB0aGF0IGFsc28gaGF2ZSB0ZXN0cyB0aGF0IGV2YWx1YXRlIHRvIHRydWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGF1c2UtYm9keS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXVzZS1ib2R5LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXVzZS1ib2R5T3V0cHV0IiBuYW1lPSJib2R5T3V0cHV0IiB0eXBlPSJPdXRwdXRQaW4iIGlzT3JkZXJlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfYm9keU91dHB1dF9jbGF1c2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhdXNlLWJvZHlPdXRwdXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGF1c2UtYm9keU91dHB1dCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE91dHB1dFBpbnMgb24gQWN0aW9ucyB3aXRoaW4gdGhlIGJvZHkgc2VjdGlvbiB3aG9zZSB2YWx1ZXMgYXJlIG1vdmVkIHRvIHRoZSByZXN1bHQgT3V0cHV0UGlucyBvZiB0aGUgY29udGFpbmluZyBDb25kaXRpb25hbE5vZGUgYWZ0ZXIgZXhlY3V0aW9uIG9mIHRoZSBib2R5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhdXNlLWJvZHlPdXRwdXQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGF1c2UtYm9keU91dHB1dC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGF1c2UtZGVjaWRlciIgbmFtZT0iZGVjaWRlciIgdHlwZT0iT3V0cHV0UGluIiBhc3NvY2lhdGlvbj0iQV9kZWNpZGVyX2NsYXVzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGF1c2UtZGVjaWRlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXVzZS1kZWNpZGVyIj4KLSAgICAgICAgICA8Ym9keT5BbiBPdXRwdXRQaW4gb24gYW4gQWN0aW9uIGluIHRoZSB0ZXN0IHNlY3Rpb24gd2hvc2UgQm9vbGVhbiB2YWx1ZSBkZXRlcm1pbmVzIHRoZSByZXN1bHQgb2YgdGhlIHRlc3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGF1c2UtcHJlZGVjZXNzb3JDbGF1c2UiIG5hbWU9InByZWRlY2Vzc29yQ2xhdXNlIiB0eXBlPSJDbGF1c2UiIGFzc29jaWF0aW9uPSJBX3ByZWRlY2Vzc29yQ2xhdXNlX3N1Y2Nlc3NvckNsYXVzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGF1c2UtcHJlZGVjZXNzb3JDbGF1c2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGF1c2UtcHJlZGVjZXNzb3JDbGF1c2UiPgotICAgICAgICAgIDxib2R5PkEgc2V0IG9mIENsYXVzZXMgd2hvc2UgdGVzdHMgbXVzdCBhbGwgZXZhbHVhdGUgdG8gZmFsc2UgYmVmb3JlIHRoaXMgQ2xhdXNlIGNhbiBldmFsdWF0ZSBpdHMgdGVzdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXVzZS1wcmVkZWNlc3NvckNsYXVzZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXVzZS1wcmVkZWNlc3NvckNsYXVzZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGF1c2Utc3VjY2Vzc29yQ2xhdXNlIiBuYW1lPSJzdWNjZXNzb3JDbGF1c2UiIHR5cGU9IkNsYXVzZSIgYXNzb2NpYXRpb249IkFfcHJlZGVjZXNzb3JDbGF1c2Vfc3VjY2Vzc29yQ2xhdXNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXVzZS1zdWNjZXNzb3JDbGF1c2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGF1c2Utc3VjY2Vzc29yQ2xhdXNlIj4KLSAgICAgICAgICA8Ym9keT5BIHNldCBvZiBDbGF1c2VzIHRoYXQgbWF5IG5vdCBldmFsdWF0ZSB0aGVpciB0ZXN0cyB1bmxlc3MgdGhlIHRlc3QgZm9yIHRoaXMgQ2xhdXNlIGV2YWx1YXRlcyB0byBmYWxzZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXVzZS1zdWNjZXNzb3JDbGF1c2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGF1c2Utc3VjY2Vzc29yQ2xhdXNlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXVzZS10ZXN0IiBuYW1lPSJ0ZXN0IiB0eXBlPSJFeGVjdXRhYmxlTm9kZSIgYXNzb2NpYXRpb249IkFfdGVzdF9jbGF1c2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhdXNlLXRlc3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGF1c2UtdGVzdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNldCBvZiBFeGVjdXRhYmxlTm9kZXMgdGhhdCBhcmUgZXhlY3V0ZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIHRlc3QgcmVzdWx0IGZvciB0aGUgQ2xhdXNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhdXNlLXRlc3QtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJDbGVhckFzc29jaWF0aW9uQWN0aW9uIiBuYW1lPSJDbGVhckFzc29jaWF0aW9uQWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGVhckFzc29jaWF0aW9uQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xlYXJBc3NvY2lhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgQ2xlYXJBc3NvY2lhdGlvbkFjdGlvbiBpcyBhbiBBY3Rpb24gdGhhdCBkZXN0cm95cyBhbGwgbGlua3Mgb2YgYW4gQXNzb2NpYXRpb24gaW4gd2hpY2ggYSBwYXJ0aWN1bGFyIG9iamVjdCBwYXJ0aWNpcGF0ZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xlYXJBc3NvY2lhdGlvbkFjdGlvbi1tdWx0aXBsaWNpdHkiIG5hbWU9Im11bHRpcGxpY2l0eSIgY29uc3RyYWluZWRFbGVtZW50PSJDbGVhckFzc29jaWF0aW9uQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsZWFyQXNzb2NpYXRpb25BY3Rpb24tbXVsdGlwbGljaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xlYXJBc3NvY2lhdGlvbkFjdGlvbi1tdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIG9iamVjdCBJbnB1dFBpbiBpcyAxLi4xLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGVhckFzc29jaWF0aW9uQWN0aW9uLW11bHRpcGxpY2l0eS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LmlzKDEsMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsZWFyQXNzb2NpYXRpb25BY3Rpb24tc2FtZV90eXBlIiBuYW1lPSJzYW1lX3R5cGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2xlYXJBc3NvY2lhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGVhckFzc29jaWF0aW9uQWN0aW9uLXNhbWVfdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsZWFyQXNzb2NpYXRpb25BY3Rpb24tc2FtZV90eXBlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBvZiB0aGUgSW5wdXRQaW4gbXVzdCBjb25mb3JtIHRvIHRoZSB0eXBlIG9mIGF0IGxlYXN0IG9uZSBvZiB0aGUgbWVtYmVyRW5kcyBvZiB0aGUgYXNzb2NpYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsZWFyQXNzb2NpYXRpb25BY3Rpb24tc2FtZV90eXBlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5hc3NvY2lhdGlvbi5tZW1iZXJFbmQtPmV4aXN0cyhzZWxmLm9iamVjdC50eXBlLmNvbmZvcm1zVG8odHlwZSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNsZWFyQXNzb2NpYXRpb25BY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2xlYXJBc3NvY2lhdGlvbkFjdGlvbi1hc3NvY2lhdGlvbiIgbmFtZT0iYXNzb2NpYXRpb24iIHR5cGU9IkFzc29jaWF0aW9uIiBhc3NvY2lhdGlvbj0iQV9hc3NvY2lhdGlvbl9jbGVhckFzc29jaWF0aW9uQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsZWFyQXNzb2NpYXRpb25BY3Rpb24tYXNzb2NpYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGVhckFzc29jaWF0aW9uQWN0aW9uLWFzc29jaWF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQXNzb2NpYXRpb24gdG8gYmUgY2xlYXJlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsZWFyQXNzb2NpYXRpb25BY3Rpb24tb2JqZWN0IiBuYW1lPSJvYmplY3QiIHR5cGU9IklucHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLWlucHV0IiBhc3NvY2lhdGlvbj0iQV9vYmplY3RfY2xlYXJBc3NvY2lhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGVhckFzc29jaWF0aW9uQWN0aW9uLW9iamVjdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsZWFyQXNzb2NpYXRpb25BY3Rpb24tb2JqZWN0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgSW5wdXRQaW4gdGhhdCBnaXZlcyB0aGUgb2JqZWN0IHdob3NlIHBhcnRpY2lwYXRpb24gaW4gdGhlIEFzc29jaWF0aW9uIGlzIHRvIGJlIGNsZWFyZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIG5hbWU9IkNsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIGlzIGEgU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24gdGhhdCByZW1vdmVzIGFsbCB2YWx1ZXMgb2YgYSBTdHJ1Y3R1cmFsRmVhdHVyZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXR5cGVfb2ZfcmVzdWx0IiBuYW1lPSJ0eXBlX29mX3Jlc3VsdCIgY29uc3RyYWluZWRFbGVtZW50PSJDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdHlwZV9vZl9yZXN1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXR5cGVfb2ZfcmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBvZiB0aGUgcmVzdWx0IE91dHB1dFBpbiBpcyB0aGUgc2FtZSBhcyB0aGUgdHlwZSBvZiB0aGUgaW5oZXJpdGVkIG9iamVjdCBJbnB1dFBpbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi10eXBlX29mX3Jlc3VsdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVzdWx0Jmx0Oz5udWxsIGltcGxpZXMgcmVzdWx0LnR5cGUgPSBvYmplY3QudHlwZTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfcmVzdWx0IiBuYW1lPSJtdWx0aXBsaWNpdHlfb2ZfcmVzdWx0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfcmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIHRoZSByZXN1bHQgT3V0cHV0UGluIG11c3QgYmUgMS4uMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfcmVzdWx0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5yZXN1bHQmbHQ7Pm51bGwgaW1wbGllcyByZXN1bHQuaXMoMSwxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iT3V0cHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLW91dHB1dCIgYXNzb2NpYXRpb249IkFfcmVzdWx0X2NsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1yZXN1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXJlc3VsdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE91dHB1dFBpbiBvbiB3aGljaCBpcyBwdXQgdGhlIGlucHV0IG9iamVjdCBhcyBtb2RpZmllZCBieSB0aGUgQ2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJDbGVhclZhcmlhYmxlQWN0aW9uIiBuYW1lPSJDbGVhclZhcmlhYmxlQWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGVhclZhcmlhYmxlQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xlYXJWYXJpYWJsZUFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgQ2xlYXJWYXJpYWJsZUFjdGlvbiBpcyBhIFZhcmlhYmxlQWN0aW9uIHRoYXQgcmVtb3ZlcyBhbGwgdmFsdWVzIG9mIGEgVmFyaWFibGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDbGVhclZhcmlhYmxlQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJWYXJpYWJsZUFjdGlvbiIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUiIG5hbWU9IkNvbmRpdGlvbmFsTm9kZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29uZGl0aW9uYWxOb2RlIj4KLSAgICAgICAgPGJvZHk+QSBDb25kaXRpb25hbE5vZGUgaXMgYSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHRoYXQgY2hvb3NlcyBvbmUgYW1vbmcgc29tZSBudW1iZXIgb2YgYWx0ZXJuYXRpdmUgY29sbGVjdGlvbnMgb2YgRXhlY3V0YWJsZU5vZGVzIHRvIGV4ZWN1dGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLXJlc3VsdF9ub19pbmNvbWluZyIgbmFtZT0icmVzdWx0X25vX2luY29taW5nIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbmRpdGlvbmFsTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtcmVzdWx0X25vX2luY29taW5nLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29uZGl0aW9uYWxOb2RlLXJlc3VsdF9ub19pbmNvbWluZyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHJlc3VsdCBPdXRwdXRQaW5zIGhhdmUgbm8gaW5jb21pbmcgZWRnZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbmRpdGlvbmFsTm9kZS1yZXN1bHRfbm9faW5jb21pbmctX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlc3VsdC5pbmNvbWluZy0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtbm9faW5wdXRfcGlucyIgbmFtZT0ibm9faW5wdXRfcGlucyIgY29uc3RyYWluZWRFbGVtZW50PSJDb25kaXRpb25hbE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLW5vX2lucHV0X3BpbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25kaXRpb25hbE5vZGUtbm9faW5wdXRfcGlucyI+Ci0gICAgICAgICAgPGJvZHk+QSBDb25kaXRpb25hbE5vZGUgaGFzIG5vIElucHV0UGlucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLW5vX2lucHV0X3BpbnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlucHV0LT5pc0VtcHR5KCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbmRpdGlvbmFsTm9kZS1vbmVfY2xhdXNlX3dpdGhfZXhlY3V0YWJsZV9ub2RlIiBuYW1lPSJvbmVfY2xhdXNlX3dpdGhfZXhlY3V0YWJsZV9ub2RlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbmRpdGlvbmFsTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtb25lX2NsYXVzZV93aXRoX2V4ZWN1dGFibGVfbm9kZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbmRpdGlvbmFsTm9kZS1vbmVfY2xhdXNlX3dpdGhfZXhlY3V0YWJsZV9ub2RlIj4KLSAgICAgICAgICA8Ym9keT5ObyBFeGVjdXRhYmxlTm9kZSBpbiB0aGUgQ29uZGl0aW9uTm9kZSBtYXkgYXBwZWFyIGluIHRoZSB0ZXN0IG9yIGJvZHkgcGFydCBvZiBtb3JlIHRoYW4gb25lIGNsYXVzZSBvZiBhIENvbmRpdGlvbmFsTm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLW9uZV9jbGF1c2Vfd2l0aF9leGVjdXRhYmxlX25vZGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5vZGUtPnNlbGVjdChvY2xJc0tpbmRPZihFeGVjdXRhYmxlTm9kZSkpLm9jbEFzVHlwZShFeGVjdXRhYmxlTm9kZSktPmZvckFsbChuIHwgJiN4RDsKLQlzZWxmLmNsYXVzZS0+c2VsZWN0KHRlc3QtPnVuaW9uKF8nYm9keScpLT5pbmNsdWRlcyhuKSktPnNpemUoKT0xKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLW1hdGNoaW5nX291dHB1dF9waW5zIiBuYW1lPSJtYXRjaGluZ19vdXRwdXRfcGlucyIgY29uc3RyYWluZWRFbGVtZW50PSJDb25kaXRpb25hbE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLW1hdGNoaW5nX291dHB1dF9waW5zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29uZGl0aW9uYWxOb2RlLW1hdGNoaW5nX291dHB1dF9waW5zIj4KLSAgICAgICAgICA8Ym9keT5FYWNoIGNsYXVzZSBvZiBhIENvbmRpdGlvbmFsTm9kZSBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGJvZHlPdXRwdXQgcGlucyBhcyB0aGUgQ29uZGl0aW9uYWxOb2RlIGhhcyByZXN1bHQgT3V0cHV0UGlucywgYW5kIGVhY2ggY2xhdXNlIGJvZHlPdXRwdXQgUGluIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJlc3VsdCBPdXRwdXRQaW4gKGJ5IHBvc2l0aW9uYWwgb3JkZXIpIGluIHR5cGUsIG11bHRpcGxpY2l0eSwgb3JkZXJpbmcsIGFuZCB1bmlxdWVuZXNzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtbWF0Y2hpbmdfb3V0cHV0X3BpbnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmNsYXVzZS0+Zm9yQWxsKCYjeEQ7Ci0JYm9keU91dHB1dC0+c2l6ZSgpPXNlbGYucmVzdWx0LT5zaXplKCkgYW5kJiN4RDsKLQlTZXF1ZW5jZXsxLi5zZWxmLnJlc3VsdC0+c2l6ZSgpfS0+Zm9yQWxsKGkgfCYjeEQ7Ci0JCWJvZHlPdXRwdXQtPmF0KGkpLnR5cGUuY29uZm9ybXNUbyhyZXN1bHQtPmF0KGkpLnR5cGUpIGFuZCYjeEQ7Ci0JCWJvZHlPdXRwdXQtPmF0KGkpLmlzT3JkZXJlZCA9IHJlc3VsdC0+YXQoaSkuaXNPcmRlcmVkIGFuZCYjeEQ7Ci0JCWJvZHlPdXRwdXQtPmF0KGkpLmlzVW5pcXVlID0gcmVzdWx0LT5hdChpKS5pc1VuaXF1ZSBhbmQmI3hEOwotCQlib2R5T3V0cHV0LT5hdChpKS5jb21wYXRpYmxlV2l0aChyZXN1bHQtPmF0KGkpKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtZXhlY3V0YWJsZV9ub2RlcyIgbmFtZT0iZXhlY3V0YWJsZV9ub2RlcyIgY29uc3RyYWluZWRFbGVtZW50PSJDb25kaXRpb25hbE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLWV4ZWN1dGFibGVfbm9kZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25kaXRpb25hbE5vZGUtZXhlY3V0YWJsZV9ub2RlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHVuaW9uIG9mIHRoZSBFeGVjdXRhYmxlTm9kZXMgaW4gdGhlIHRlc3QgYW5kIGJvZHkgcGFydHMgb2YgYWxsIGNsYXVzZXMgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgc3Vic2V0IG9mIG5vZGVzIGNvbnRhaW5lZCBpbiB0aGUgQ29uZGl0aW9uYWxOb2RlIChjb25zaWRlcmVkIGFzIGEgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgdGhhdCBhcmUgRXhlY3V0YWJsZU5vZGVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtZXhlY3V0YWJsZV9ub2Rlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+Y2xhdXNlLnRlc3QtPnVuaW9uKGNsYXVzZS5fJ2JvZHknKSA9IG5vZGUtPnNlbGVjdChvY2xJc0tpbmRPZihFeGVjdXRhYmxlTm9kZSkpLm9jbEFzVHlwZShFeGVjdXRhYmxlTm9kZSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbmRpdGlvbmFsTm9kZS1jbGF1c2Vfbm9fcHJlZGVjZXNzb3IiIG5hbWU9ImNsYXVzZV9ub19wcmVkZWNlc3NvciIgY29uc3RyYWluZWRFbGVtZW50PSJDb25kaXRpb25hbE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLWNsYXVzZV9ub19wcmVkZWNlc3Nvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbmRpdGlvbmFsTm9kZS1jbGF1c2Vfbm9fcHJlZGVjZXNzb3IiPgotICAgICAgICAgIDxib2R5Pk5vIHR3byBjbGF1c2VzIHdpdGhpbiBhIENvbmRpdGlvbmFsTm9kZSBtYXkgYmUgcHJlZGVjZXNzb3JDbGF1c2VzIG9mIGVhY2ggb3RoZXIsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtY2xhdXNlX25vX3ByZWRlY2Vzc29yLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5jbGF1c2UtPmNsb3N1cmUocHJlZGVjZXNzb3JDbGF1c2UpLT5pbnRlcnNlY3Rpb24oY2xhdXNlKS0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNvbmRpdGlvbmFsTm9kZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLWNsYXVzZSIgbmFtZT0iY2xhdXNlIiB0eXBlPSJDbGF1c2UiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfY2xhdXNlX2NvbmRpdGlvbmFsTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtY2xhdXNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29uZGl0aW9uYWxOb2RlLWNsYXVzZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNldCBvZiBDbGF1c2VzIGNvbXBvc2luZyB0aGUgQ29uZGl0aW9uYWxOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLWNsYXVzZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtaXNBc3N1cmVkIiBuYW1lPSJpc0Fzc3VyZWQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLWlzQXNzdXJlZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbmRpdGlvbmFsTm9kZS1pc0Fzc3VyZWQiPgotICAgICAgICAgIDxib2R5PklmIHRydWUsIHRoZSBtb2RlbGVyIGFzc2VydHMgdGhhdCB0aGUgdGVzdCBmb3IgYXQgbGVhc3Qgb25lIENsYXVzZSBvZiB0aGUgQ29uZGl0aW9uYWxOb2RlIHdpbGwgc3VjY2VlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtaXNBc3N1cmVkLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtaXNEZXRlcm1pbmF0ZSIgbmFtZT0iaXNEZXRlcm1pbmF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtaXNEZXRlcm1pbmF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbmRpdGlvbmFsTm9kZS1pc0RldGVybWluYXRlIj4KLSAgICAgICAgICA8Ym9keT5JZiB0cnVlLCB0aGUgbW9kZWxlciBhc3NlcnRzIHRoYXQgdGhlIHRlc3QgZm9yIGF0IG1vc3Qgb25lIENsYXVzZSBvZiB0aGUgQ29uZGl0aW9uYWxOb2RlIHdpbGwgc3VjY2VlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtaXNEZXRlcm1pbmF0ZS1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJPdXRwdXRQaW4iIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgcmVkZWZpbmVkUHJvcGVydHk9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc3RydWN0dXJlZE5vZGVPdXRwdXQiIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF9jb25kaXRpb25hbE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLXJlc3VsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbmRpdGlvbmFsTm9kZS1yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBPdXRwdXRQaW5zIHRoYXQgb250byB3aGljaCBhcmUgbW92ZWQgdmFsdWVzIGZyb20gdGhlIGJvZHlPdXRwdXRzIG9mIHRoZSBDbGF1c2Ugc2VsZWN0ZWQgZm9yIGV4ZWN1dGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbmRpdGlvbmFsTm9kZS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNvbmRpdGlvbmFsTm9kZS1hbGxBY3Rpb25zIiBuYW1lPSJhbGxBY3Rpb25zIiBib2R5Q29uZGl0aW9uPSJDb25kaXRpb25hbE5vZGUtYWxsQWN0aW9ucy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IkFjdGlvbi1hbGxBY3Rpb25zIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsQWN0aW9ucyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtYWxsQWN0aW9ucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbmRpdGlvbmFsTm9kZS1hbGxBY3Rpb25zIj4KLSAgICAgICAgICA8Ym9keT5SZXR1cm4gb25seSB0aGlzIENvbmRpdGlvbmFsTm9kZS4gVGhpcyBwcmV2ZW50cyBBY3Rpb25zIHdpdGhpbiB0aGUgQ29uZGl0aW9uYWxOb2RlIGZyb20gaGF2aW5nIHRoZWlyIE91dHB1dFBpbnMgdXNlZCBhcyBib2R5T3V0cHV0cyBvciBkZWNpZGVyIFBpbnMgaW4gY29udGFpbmluZyBMb29wTm9kZXMgb3IgQ29uZGl0aW9uYWxOb2Rlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLWFsbEFjdGlvbnMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDb25kaXRpb25hbE5vZGUtYWxsQWN0aW9ucyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbmRpdGlvbmFsTm9kZS1hbGxBY3Rpb25zLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc2VsZi0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLWFsbEFjdGlvbnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkFjdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ29uZGl0aW9uYWxOb2RlLWFsbEFjdGlvbnMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb25kaXRpb25hbE5vZGUtYWxsQWN0aW9ucy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJDcmVhdGVMaW5rQWN0aW9uIiBuYW1lPSJDcmVhdGVMaW5rQWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDcmVhdGVMaW5rQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ3JlYXRlTGlua0FjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgQ3JlYXRlTGlua0FjdGlvbiBpcyBhIFdyaXRlTGlua0FjdGlvbiBmb3IgY3JlYXRpbmcgbGlua3MuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ3JlYXRlTGlua0FjdGlvbi1hc3NvY2lhdGlvbl9ub3RfYWJzdHJhY3QiIG5hbWU9ImFzc29jaWF0aW9uX25vdF9hYnN0cmFjdCIgY29uc3RyYWluZWRFbGVtZW50PSJDcmVhdGVMaW5rQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNyZWF0ZUxpbmtBY3Rpb24tYXNzb2NpYXRpb25fbm90X2Fic3RyYWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ3JlYXRlTGlua0FjdGlvbi1hc3NvY2lhdGlvbl9ub3RfYWJzdHJhY3QiPgotICAgICAgICAgIDxib2R5PlRoZSBBc3NvY2lhdGlvbiBjYW5ub3QgYmUgYW4gYWJzdHJhY3QgQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ3JlYXRlTGlua0FjdGlvbi1hc3NvY2lhdGlvbl9ub3RfYWJzdHJhY3QtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5vdCBzZWxmLmFzc29jaWF0aW9uKCkuaXNBYnN0cmFjdDwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDcmVhdGVMaW5rQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJXcml0ZUxpbmtBY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNyZWF0ZUxpbmtBY3Rpb24tZW5kRGF0YSIgbmFtZT0iZW5kRGF0YSIgdHlwZT0iTGlua0VuZENyZWF0aW9uRGF0YSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgcmVkZWZpbmVkUHJvcGVydHk9IkxpbmtBY3Rpb24tZW5kRGF0YSIgYXNzb2NpYXRpb249IkFfZW5kRGF0YV9jcmVhdGVMaW5rQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNyZWF0ZUxpbmtBY3Rpb24tZW5kRGF0YS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNyZWF0ZUxpbmtBY3Rpb24tZW5kRGF0YSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIExpbmtFbmREYXRhIHRoYXQgc3BlY2lmaWVzIHRoZSB2YWx1ZXMgdG8gYmUgcGxhY2VkIG9uIHRoZSBBc3NvY2lhdGlvbiBlbmRzIGZvciB0aGUgbmV3IGxpbmsuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDcmVhdGVMaW5rQWN0aW9uLWVuZERhdGEtX2xvd2VyVmFsdWUiIHZhbHVlPSIyIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ3JlYXRlTGlua0FjdGlvbi1lbmREYXRhLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ3JlYXRlTGlua09iamVjdEFjdGlvbiIgbmFtZT0iQ3JlYXRlTGlua09iamVjdEFjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ3JlYXRlTGlua09iamVjdEFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNyZWF0ZUxpbmtPYmplY3RBY3Rpb24iPgotICAgICAgICA8Ym9keT5BIENyZWF0ZUxpbmtPYmplY3RBY3Rpb24gaXMgYSBDcmVhdGVMaW5rQWN0aW9uIGZvciBjcmVhdGluZyBsaW5rIG9iamVjdHMgKEFzc29jaWF0aW9uQ2xhc3NlIGluc3RhbmNlcykuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ3JlYXRlTGlua09iamVjdEFjdGlvbi1tdWx0aXBsaWNpdHkiIG5hbWU9Im11bHRpcGxpY2l0eSIgY29uc3RyYWluZWRFbGVtZW50PSJDcmVhdGVMaW5rT2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNyZWF0ZUxpbmtPYmplY3RBY3Rpb24tbXVsdGlwbGljaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ3JlYXRlTGlua09iamVjdEFjdGlvbi1tdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIE91dHB1dFBpbiBpcyAxLi4xLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDcmVhdGVMaW5rT2JqZWN0QWN0aW9uLW11bHRpcGxpY2l0eS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVzdWx0LmlzKDEsMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNyZWF0ZUxpbmtPYmplY3RBY3Rpb24tdHlwZV9vZl9yZXN1bHQiIG5hbWU9InR5cGVfb2ZfcmVzdWx0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNyZWF0ZUxpbmtPYmplY3RBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ3JlYXRlTGlua09iamVjdEFjdGlvbi10eXBlX29mX3Jlc3VsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNyZWF0ZUxpbmtPYmplY3RBY3Rpb24tdHlwZV9vZl9yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlIG9mIHRoZSByZXN1bHQgT3V0cHV0UGluIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIEFzc29jaWF0aW9uIG9mIHRoZSBDcmVhdGVMaW5rT2JqZWN0QWN0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDcmVhdGVMaW5rT2JqZWN0QWN0aW9uLXR5cGVfb2ZfcmVzdWx0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5yZXN1bHQudHlwZSA9IGFzc29jaWF0aW9uKCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNyZWF0ZUxpbmtPYmplY3RBY3Rpb24tYXNzb2NpYXRpb25fY2xhc3MiIG5hbWU9ImFzc29jaWF0aW9uX2NsYXNzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNyZWF0ZUxpbmtPYmplY3RBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ3JlYXRlTGlua09iamVjdEFjdGlvbi1hc3NvY2lhdGlvbl9jbGFzcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNyZWF0ZUxpbmtPYmplY3RBY3Rpb24tYXNzb2NpYXRpb25fY2xhc3MiPgotICAgICAgICAgIDxib2R5PlRoZSBBc3NvY2lhdGlvbiBtdXN0IGJlIGFuIEFzc29jaWF0aW9uQ2xhc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNyZWF0ZUxpbmtPYmplY3RBY3Rpb24tYXNzb2NpYXRpb25fY2xhc3MtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnNlbGYuYXNzb2NpYXRpb24oKS5vY2xJc0tpbmRPZihBc3NvY2lhdGlvbkNsYXNzKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDcmVhdGVMaW5rT2JqZWN0QWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJDcmVhdGVMaW5rQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDcmVhdGVMaW5rT2JqZWN0QWN0aW9uLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJPdXRwdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24tb3V0cHV0IiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfY3JlYXRlTGlua09iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDcmVhdGVMaW5rT2JqZWN0QWN0aW9uLXJlc3VsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNyZWF0ZUxpbmtPYmplY3RBY3Rpb24tcmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgb3V0cHV0IHBpbiBvbiB3aGljaCB0aGUgbmV3bHkgY3JlYXRlZCBsaW5rIG9iamVjdCBpcyBwbGFjZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNyZWF0ZU9iamVjdEFjdGlvbiIgbmFtZT0iQ3JlYXRlT2JqZWN0QWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDcmVhdGVPYmplY3RBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDcmVhdGVPYmplY3RBY3Rpb24iPgotICAgICAgICA8Ym9keT5BIENyZWF0ZU9iamVjdEFjdGlvbiBpcyBhbiBBY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDcmVhdGVPYmplY3RBY3Rpb24tY2xhc3NpZmllcl9ub3RfYWJzdHJhY3QiIG5hbWU9ImNsYXNzaWZpZXJfbm90X2Fic3RyYWN0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNyZWF0ZU9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDcmVhdGVPYmplY3RBY3Rpb24tY2xhc3NpZmllcl9ub3RfYWJzdHJhY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDcmVhdGVPYmplY3RBY3Rpb24tY2xhc3NpZmllcl9ub3RfYWJzdHJhY3QiPgotICAgICAgICAgIDxib2R5PlRoZSBjbGFzc2lmaWVyIGNhbm5vdCBiZSBhYnN0cmFjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ3JlYXRlT2JqZWN0QWN0aW9uLWNsYXNzaWZpZXJfbm90X2Fic3RyYWN0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5ub3QgY2xhc3NpZmllci5pc0Fic3RyYWN0PC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDcmVhdGVPYmplY3RBY3Rpb24tbXVsdGlwbGljaXR5IiBuYW1lPSJtdWx0aXBsaWNpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ3JlYXRlT2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNyZWF0ZU9iamVjdEFjdGlvbi1tdWx0aXBsaWNpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDcmVhdGVPYmplY3RBY3Rpb24tbXVsdGlwbGljaXR5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIHRoZSByZXN1bHQgT3V0cHV0UGluIGlzIDEuLjEuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNyZWF0ZU9iamVjdEFjdGlvbi1tdWx0aXBsaWNpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlc3VsdC5pcygxLDEpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDcmVhdGVPYmplY3RBY3Rpb24tY2xhc3NpZmllcl9ub3RfYXNzb2NpYXRpb25fY2xhc3MiIG5hbWU9ImNsYXNzaWZpZXJfbm90X2Fzc29jaWF0aW9uX2NsYXNzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNyZWF0ZU9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDcmVhdGVPYmplY3RBY3Rpb24tY2xhc3NpZmllcl9ub3RfYXNzb2NpYXRpb25fY2xhc3MtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDcmVhdGVPYmplY3RBY3Rpb24tY2xhc3NpZmllcl9ub3RfYXNzb2NpYXRpb25fY2xhc3MiPgotICAgICAgICAgIDxib2R5PlRoZSBjbGFzc2lmaWVyIGNhbm5vdCBiZSBhbiBBc3NvY2lhdGlvbkNsYXNzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDcmVhdGVPYmplY3RBY3Rpb24tY2xhc3NpZmllcl9ub3RfYXNzb2NpYXRpb25fY2xhc3MtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5vdCBjbGFzc2lmaWVyLm9jbElzS2luZE9mKEFzc29jaWF0aW9uQ2xhc3MpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDcmVhdGVPYmplY3RBY3Rpb24tc2FtZV90eXBlIiBuYW1lPSJzYW1lX3R5cGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ3JlYXRlT2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNyZWF0ZU9iamVjdEFjdGlvbi1zYW1lX3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDcmVhdGVPYmplY3RBY3Rpb24tc2FtZV90eXBlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBvZiB0aGUgcmVzdWx0IE91dHB1dFBpbiBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBjbGFzc2lmaWVyIG9mIHRoZSBDcmVhdGVPYmplY3RBY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNyZWF0ZU9iamVjdEFjdGlvbi1zYW1lX3R5cGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlc3VsdC50eXBlID0gY2xhc3NpZmllcjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDcmVhdGVPYmplY3RBY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ3JlYXRlT2JqZWN0QWN0aW9uLWNsYXNzaWZpZXIiIG5hbWU9ImNsYXNzaWZpZXIiIHR5cGU9IkNsYXNzaWZpZXIiIGFzc29jaWF0aW9uPSJBX2NsYXNzaWZpZXJfY3JlYXRlT2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNyZWF0ZU9iamVjdEFjdGlvbi1jbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ3JlYXRlT2JqZWN0QWN0aW9uLWNsYXNzaWZpZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBDbGFzc2lmaWVyIHRvIGJlIGluc3RhbnRpYXRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNyZWF0ZU9iamVjdEFjdGlvbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iT3V0cHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLW91dHB1dCIgYXNzb2NpYXRpb249IkFfcmVzdWx0X2NyZWF0ZU9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDcmVhdGVPYmplY3RBY3Rpb24tcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ3JlYXRlT2JqZWN0QWN0aW9uLXJlc3VsdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE91dHB1dFBpbiBvbiB3aGljaCB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QgaXMgcGxhY2VkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJEZXN0cm95TGlua0FjdGlvbiIgbmFtZT0iRGVzdHJveUxpbmtBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlc3Ryb3lMaW5rQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVzdHJveUxpbmtBY3Rpb24iPgotICAgICAgICA8Ym9keT5BIERlc3Ryb3lMaW5rQWN0aW9uIGlzIGEgV3JpdGVMaW5rQWN0aW9uIHRoYXQgZGVzdHJveXMgbGlua3MgKGluY2x1ZGluZyBsaW5rIG9iamVjdHMpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRGVzdHJveUxpbmtBY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IldyaXRlTGlua0FjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRGVzdHJveUxpbmtBY3Rpb24tZW5kRGF0YSIgbmFtZT0iZW5kRGF0YSIgdHlwZT0iTGlua0VuZERlc3RydWN0aW9uRGF0YSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgcmVkZWZpbmVkUHJvcGVydHk9IkxpbmtBY3Rpb24tZW5kRGF0YSIgYXNzb2NpYXRpb249IkFfZW5kRGF0YV9kZXN0cm95TGlua0FjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZXN0cm95TGlua0FjdGlvbi1lbmREYXRhLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVzdHJveUxpbmtBY3Rpb24tZW5kRGF0YSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIExpbmtFbmREYXRhIHRoYXQgdGhlIHZhbHVlcyBvZiB0aGUgQXNzb2NpYXRpb24gZW5kcyBmb3IgdGhlIGxpbmtzIHRvIGJlIGRlc3Ryb3llZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkRlc3Ryb3lMaW5rQWN0aW9uLWVuZERhdGEtX2xvd2VyVmFsdWUiIHZhbHVlPSIyIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRGVzdHJveUxpbmtBY3Rpb24tZW5kRGF0YS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkRlc3Ryb3lPYmplY3RBY3Rpb24iIG5hbWU9IkRlc3Ryb3lPYmplY3RBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlc3Ryb3lPYmplY3RBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZXN0cm95T2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBEZXN0cm95T2JqZWN0QWN0aW9uIGlzIGFuIEFjdGlvbiB0aGF0IGRlc3Ryb3lzIG9iamVjdHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRGVzdHJveU9iamVjdEFjdGlvbi1tdWx0aXBsaWNpdHkiIG5hbWU9Im11bHRpcGxpY2l0eSIgY29uc3RyYWluZWRFbGVtZW50PSJEZXN0cm95T2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlc3Ryb3lPYmplY3RBY3Rpb24tbXVsdGlwbGljaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVzdHJveU9iamVjdEFjdGlvbi1tdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHRhcmdlIElpbnB1dFBpbiBpcyAxLi4xLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJEZXN0cm95T2JqZWN0QWN0aW9uLW11bHRpcGxpY2l0eS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dGFyZ2V0LmlzKDEsMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkRlc3Ryb3lPYmplY3RBY3Rpb24tbm9fdHlwZSIgbmFtZT0ibm9fdHlwZSIgY29uc3RyYWluZWRFbGVtZW50PSJEZXN0cm95T2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlc3Ryb3lPYmplY3RBY3Rpb24tbm9fdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRlc3Ryb3lPYmplY3RBY3Rpb24tbm9fdHlwZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHRhcmdldCBJbnB1dFBpbiBoYXMgbm8gdHlwZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRGVzdHJveU9iamVjdEFjdGlvbi1ub190eXBlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT50YXJnZXQudHlwZT0gbnVsbDwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJEZXN0cm95T2JqZWN0QWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkRlc3Ryb3lPYmplY3RBY3Rpb24taXNEZXN0cm95TGlua3MiIG5hbWU9ImlzRGVzdHJveUxpbmtzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlc3Ryb3lPYmplY3RBY3Rpb24taXNEZXN0cm95TGlua3MtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZXN0cm95T2JqZWN0QWN0aW9uLWlzRGVzdHJveUxpbmtzIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgd2hldGhlciBsaW5rcyBpbiB3aGljaCB0aGUgb2JqZWN0IHBhcnRpY2lwYXRlcyBhcmUgZGVzdHJveWVkIGFsb25nIHdpdGggdGhlIG9iamVjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJEZXN0cm95T2JqZWN0QWN0aW9uLWlzRGVzdHJveUxpbmtzLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJEZXN0cm95T2JqZWN0QWN0aW9uLWlzRGVzdHJveU93bmVkT2JqZWN0cyIgbmFtZT0iaXNEZXN0cm95T3duZWRPYmplY3RzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlc3Ryb3lPYmplY3RBY3Rpb24taXNEZXN0cm95T3duZWRPYmplY3RzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVzdHJveU9iamVjdEFjdGlvbi1pc0Rlc3Ryb3lPd25lZE9iamVjdHMiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB3aGV0aGVyIG9iamVjdHMgb3duZWQgYnkgdGhlIG9iamVjdCAodmlhIGNvbXBvc2l0aW9uKSBhcmUgZGVzdHJveWVkIGFsb25nIHdpdGggdGhlIG9iamVjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJEZXN0cm95T2JqZWN0QWN0aW9uLWlzRGVzdHJveU93bmVkT2JqZWN0cy1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRGVzdHJveU9iamVjdEFjdGlvbi10YXJnZXQiIG5hbWU9InRhcmdldCIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX3RhcmdldF9kZXN0cm95T2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlc3Ryb3lPYmplY3RBY3Rpb24tdGFyZ2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVzdHJveU9iamVjdEFjdGlvbi10YXJnZXQiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbiBwcm92aWRpbmcgdGhlIG9iamVjdCB0byBiZSBkZXN0cm95ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkV4cGFuc2lvbk5vZGUiIG5hbWU9IkV4cGFuc2lvbk5vZGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4cGFuc2lvbk5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHBhbnNpb25Ob2RlIj4KLSAgICAgICAgPGJvZHk+QW4gRXhwYW5zaW9uTm9kZSBpcyBhbiBPYmplY3ROb2RlIHVzZWQgdG8gaW5kaWNhdGUgYSBjb2xsZWN0aW9uIGlucHV0IG9yIG91dHB1dCBmb3IgYW4gRXhwYW5zaW9uUmVnaW9uLiBBIGNvbGxlY3Rpb24gaW5wdXQgb2YgYW4gRXhwYW5zaW9uUmVnaW9uIGNvbnRhaW5zIGEgY29sbGVjdGlvbiB0aGF0IGlzIGJyb2tlbiBpbnRvIGl0cyBpbmRpdmlkdWFsIGVsZW1lbnRzIGluc2lkZSB0aGUgcmVnaW9uLCB3aG9zZSBjb250ZW50IGlzIGV4ZWN1dGVkIG9uY2UgcGVyIGVsZW1lbnQuIEEgY29sbGVjdGlvbiBvdXRwdXQgb2YgYW4gRXhwYW5zaW9uUmVnaW9uIGNvbWJpbmVzIGluZGl2aWR1YWwgZWxlbWVudHMgcHJvZHVjZWQgYnkgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcmVnaW9uIGludG8gYSBjb2xsZWN0aW9uIGZvciB1c2Ugb3V0c2lkZSB0aGUgcmVnaW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkV4cGFuc2lvbk5vZGUtcmVnaW9uX2FzX2lucHV0X29yX291dHB1dCIgbmFtZT0icmVnaW9uX2FzX2lucHV0X29yX291dHB1dCIgY29uc3RyYWluZWRFbGVtZW50PSJFeHBhbnNpb25Ob2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4cGFuc2lvbk5vZGUtcmVnaW9uX2FzX2lucHV0X29yX291dHB1dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4cGFuc2lvbk5vZGUtcmVnaW9uX2FzX2lucHV0X29yX291dHB1dCI+Ci0gICAgICAgICAgPGJvZHk+T25lIG9mIHJlZ2lvbkFzSW5wdXQgb3IgcmVnaW9uQXNPdXRwdXQgbXVzdCBiZSBub24tZW1wdHksIGJ1dCBub3QgYm90aC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRXhwYW5zaW9uTm9kZS1yZWdpb25fYXNfaW5wdXRfb3Jfb3V0cHV0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5yZWdpb25Bc0lucHV0LT5ub3RFbXB0eSgpIHhvciByZWdpb25Bc091dHB1dC0+bm90RW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFeHBhbnNpb25Ob2RlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJPYmplY3ROb2RlIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFeHBhbnNpb25Ob2RlLXJlZ2lvbkFzSW5wdXQiIG5hbWU9InJlZ2lvbkFzSW5wdXQiIHR5cGU9IkV4cGFuc2lvblJlZ2lvbiIgYXNzb2NpYXRpb249IkFfaW5wdXRFbGVtZW50X3JlZ2lvbkFzSW5wdXQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhwYW5zaW9uTm9kZS1yZWdpb25Bc0lucHV0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXhwYW5zaW9uTm9kZS1yZWdpb25Bc0lucHV0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgRXhwYW5zaW9uUmVnaW9uIGZvciB3aGljaCB0aGUgRXhwYW5zaW9uTm9kZSBpcyBhbiBpbnB1dC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkV4cGFuc2lvbk5vZGUtcmVnaW9uQXNJbnB1dC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4cGFuc2lvbk5vZGUtcmVnaW9uQXNPdXRwdXQiIG5hbWU9InJlZ2lvbkFzT3V0cHV0IiB0eXBlPSJFeHBhbnNpb25SZWdpb24iIGFzc29jaWF0aW9uPSJBX291dHB1dEVsZW1lbnRfcmVnaW9uQXNPdXRwdXQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhwYW5zaW9uTm9kZS1yZWdpb25Bc091dHB1dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4cGFuc2lvbk5vZGUtcmVnaW9uQXNPdXRwdXQiPgotICAgICAgICAgIDxib2R5PlRoZSBFeHBhbnNpb25SZWdpb24gZm9yIHdoaWNoIHRoZSBFeHBhbnNpb25Ob2RlIGlzIGFuIG91dHB1dC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkV4cGFuc2lvbk5vZGUtcmVnaW9uQXNPdXRwdXQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkV4cGFuc2lvblJlZ2lvbiIgbmFtZT0iRXhwYW5zaW9uUmVnaW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHBhbnNpb25SZWdpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHBhbnNpb25SZWdpb24iPgotICAgICAgICA8Ym9keT5BbiBFeHBhbnNpb25SZWdpb24gaXMgYSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHRoYXQgZXhlY3V0ZXMgaXRzIGNvbnRlbnQgbXVsdGlwbGUgdGltZXMgY29ycmVzcG9uZGluZyB0byBlbGVtZW50cyBvZiBpbnB1dCBjb2xsZWN0aW9uKHMpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRXhwYW5zaW9uUmVnaW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFeHBhbnNpb25SZWdpb24taW5wdXRFbGVtZW50IiBuYW1lPSJpbnB1dEVsZW1lbnQiIHR5cGU9IkV4cGFuc2lvbk5vZGUiIGFzc29jaWF0aW9uPSJBX2lucHV0RWxlbWVudF9yZWdpb25Bc0lucHV0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4cGFuc2lvblJlZ2lvbi1pbnB1dEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHBhbnNpb25SZWdpb24taW5wdXRFbGVtZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgRXhwYW5zaW9uTm9kZXMgdGhhdCBob2xkIHRoZSBpbnB1dCBjb2xsZWN0aW9ucyBmb3IgdGhlIEV4cGFuc2lvblJlZ2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkV4cGFuc2lvblJlZ2lvbi1pbnB1dEVsZW1lbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRXhwYW5zaW9uUmVnaW9uLW1vZGUiIG5hbWU9Im1vZGUiIHR5cGU9IkV4cGFuc2lvbktpbmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhwYW5zaW9uUmVnaW9uLW1vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHBhbnNpb25SZWdpb24tbW9kZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG1vZGUgaW4gd2hpY2ggdGhlIEV4cGFuc2lvblJlZ2lvbiBleGVjdXRlcyBpdHMgY29udGVudHMuIElmIHBhcmFsbGVsLCBleGVjdXRpb25zIGFyZSBjb25jdXJyZW50LiBJZiBpdGVyYXRpdmUsIGV4ZWN1dGlvbnMgYXJlIHNlcXVlbnRpYWwuIElmIHN0cmVhbSwgYSBzdHJlYW0gb2YgdmFsdWVzIGZsb3dzIGludG8gYSBzaW5nbGUgZXhlY3V0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9IkV4cGFuc2lvblJlZ2lvbi1tb2RlLV9kZWZhdWx0VmFsdWUiIHR5cGU9IkV4cGFuc2lvbktpbmQiIGluc3RhbmNlPSJFeHBhbnNpb25LaW5kLWl0ZXJhdGl2ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4cGFuc2lvblJlZ2lvbi1vdXRwdXRFbGVtZW50IiBuYW1lPSJvdXRwdXRFbGVtZW50IiB0eXBlPSJFeHBhbnNpb25Ob2RlIiBhc3NvY2lhdGlvbj0iQV9vdXRwdXRFbGVtZW50X3JlZ2lvbkFzT3V0cHV0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4cGFuc2lvblJlZ2lvbi1vdXRwdXRFbGVtZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXhwYW5zaW9uUmVnaW9uLW91dHB1dEVsZW1lbnQiPgotICAgICAgICAgIDxib2R5PlRoZSBFeHBhbnNpb25Ob2RlcyB0aGF0IGZvcm0gdGhlIG91dHB1dCBjb2xsZWN0aW9ucyBvZiB0aGUgRXhwYW5zaW9uUmVnaW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRXhwYW5zaW9uUmVnaW9uLW91dHB1dEVsZW1lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFeHBhbnNpb25SZWdpb24tb3V0cHV0RWxlbWVudC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IklucHV0UGluIiBuYW1lPSJJbnB1dFBpbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5wdXRQaW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnB1dFBpbiI+Ci0gICAgICAgIDxib2R5PkFuIElucHV0UGluIGlzIGEgUGluIHRoYXQgaG9sZHMgaW5wdXQgdmFsdWVzIHRvIGJlIGNvbnN1bWVkIGJ5IGFuIEFjdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJJbnB1dFBpbi1vdXRnb2luZ19lZGdlc19zdHJ1Y3R1cmVkX29ubHkiIG5hbWU9Im91dGdvaW5nX2VkZ2VzX3N0cnVjdHVyZWRfb25seSIgY29uc3RyYWluZWRFbGVtZW50PSJJbnB1dFBpbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnB1dFBpbi1vdXRnb2luZ19lZGdlc19zdHJ1Y3R1cmVkX29ubHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnB1dFBpbi1vdXRnb2luZ19lZGdlc19zdHJ1Y3R1cmVkX29ubHkiPgotICAgICAgICAgIDxib2R5PkFuIElucHV0UGluIG1heSBoYXZlIG91dGdvaW5nIEFjdGl2aXR5RWRnZXMgb25seSB3aGVuIGl0IGlzIG93bmVkIGJ5IGEgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSwgYW5kIHRoZXNlIGVkZ2VzIG11c3QgdGFyZ2V0IGEgbm9kZSBjb250YWluZWQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGluIHRoZSBvd25pbmcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW5wdXRQaW4tb3V0Z29pbmdfZWRnZXNfc3RydWN0dXJlZF9vbmx5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vdXRnb2luZy0+bm90RW1wdHkoKSBpbXBsaWVzJiN4RDsKLQlhY3Rpb24mbHQ7Pm51bGwgYW5kJiN4RDsKLQlhY3Rpb24ub2NsSXNLaW5kT2YoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgYW5kJiN4RDsKLQlhY3Rpb24ub2NsQXNUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpLmFsbE93bmVkTm9kZXMoKS0+aW5jbHVkZXNBbGwob3V0Z29pbmcudGFyZ2V0KTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJJbnB1dFBpbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iUGluIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Ikludm9jYXRpb25BY3Rpb24iIG5hbWU9Ikludm9jYXRpb25BY3Rpb24iIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikludm9jYXRpb25BY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnZvY2F0aW9uQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+SW52b2NhdGlvbkFjdGlvbiBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgdGhlIHZhcmlvdXMgYWN0aW9ucyB0aGF0IHJlcXVlc3QgQmVoYXZpb3IgaW52b2NhdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ikludm9jYXRpb25BY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW52b2NhdGlvbkFjdGlvbi1hcmd1bWVudCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9IklucHV0UGluIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX2FyZ3VtZW50X2ludm9jYXRpb25BY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW52b2NhdGlvbkFjdGlvbi1hcmd1bWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikludm9jYXRpb25BY3Rpb24tYXJndW1lbnQiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbnMgdGhhdCBwcm92aWRlIHRoZSBhcmd1bWVudCB2YWx1ZXMgcGFzc2VkIGluIHRoZSBpbnZvY2F0aW9uIHJlcXVlc3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnZvY2F0aW9uQWN0aW9uLWFyZ3VtZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW52b2NhdGlvbkFjdGlvbi1hcmd1bWVudC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnZvY2F0aW9uQWN0aW9uLW9uUG9ydCIgbmFtZT0ib25Qb3J0IiB0eXBlPSJQb3J0IiBhc3NvY2lhdGlvbj0iQV9vblBvcnRfaW52b2NhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnZvY2F0aW9uQWN0aW9uLW9uUG9ydC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikludm9jYXRpb25BY3Rpb24tb25Qb3J0Ij4KLSAgICAgICAgICA8Ym9keT5Gb3IgQ2FsbE9wZXJhdGlvbkFjdGlvbnMsIFNlbmRTaWduYWxBY3Rpb25zLCBhbmQgU2VuZE9iamVjdEFjdGlvbnMsIGFuIG9wdGlvbmFsIFBvcnQgb2YgdGhlIHRhcmdldCBvYmplY3QgdGhyb3VnaCB3aGljaCB0aGUgaW52b2NhdGlvbiByZXF1ZXN0IGlzIHNlbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnZvY2F0aW9uQWN0aW9uLW9uUG9ydC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iTGlua0FjdGlvbiIgbmFtZT0iTGlua0FjdGlvbiIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0FjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpbmtBY3Rpb24iPgotICAgICAgICA8Ym9keT5MaW5rQWN0aW9uIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBhbGwgQWN0aW9ucyB0aGF0IGlkZW50aWZ5IHRoZSBsaW5rcyB0byBiZSBhY3RlZCBvbiB1c2luZyBMaW5rRW5kRGF0YS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaW5rQWN0aW9uLXNhbWVfcGlucyIgbmFtZT0ic2FtZV9waW5zIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkxpbmtBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0FjdGlvbi1zYW1lX3BpbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaW5rQWN0aW9uLXNhbWVfcGlucyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGlucHV0VmFsdWUgSW5wdXRQaW5zIGlzIHRoZSBzYW1lIGFzIHRoZSB1bmlvbiBvZiBhbGwgdGhlIElucHV0UGlucyByZWZlcmVuY2VkIGJ5IHRoZSBlbmREYXRhLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaW5rQWN0aW9uLXNhbWVfcGlucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aW5wdXRWYWx1ZS0+YXNCYWcoKT1lbmREYXRhLmFsbFBpbnMoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTGlua0FjdGlvbi1zYW1lX2Fzc29jaWF0aW9uIiBuYW1lPSJzYW1lX2Fzc29jaWF0aW9uIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkxpbmtBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0FjdGlvbi1zYW1lX2Fzc29jaWF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0FjdGlvbi1zYW1lX2Fzc29jaWF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZW5kcyBvZiB0aGUgZW5kRGF0YSBtdXN0IGFsbCBiZSBmcm9tIHRoZSBzYW1lIEFzc29jaWF0aW9uIGFuZCBpbmNsdWRlIGFsbCBhbmQgb25seSB0aGUgbWVtYmVyRW5kcyBvZiB0aGF0IGFzc29jaWF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaW5rQWN0aW9uLXNhbWVfYXNzb2NpYXRpb24tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmVuZERhdGEuZW5kID0gc2VsZi5hc3NvY2lhdGlvbigpLm1lbWJlckVuZC0+YXNCYWcoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTGlua0FjdGlvbi1ub3Rfc3RhdGljIiBuYW1lPSJub3Rfc3RhdGljIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkxpbmtBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0FjdGlvbi1ub3Rfc3RhdGljLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0FjdGlvbi1ub3Rfc3RhdGljIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZW5kcyBvZiB0aGUgZW5kRGF0YSBtdXN0IG5vdCBiZSBzdGF0aWMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkxpbmtBY3Rpb24tbm90X3N0YXRpYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZW5kRGF0YS0+Zm9yQWxsKG5vdCBlbmQuaXNTdGF0aWMpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkxpbmtBY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTGlua0FjdGlvbi1lbmREYXRhIiBuYW1lPSJlbmREYXRhIiB0eXBlPSJMaW5rRW5kRGF0YSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9lbmREYXRhX2xpbmtBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0FjdGlvbi1lbmREYXRhLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0FjdGlvbi1lbmREYXRhIj4KLSAgICAgICAgICA8Ym9keT5UaGUgTGlua0VuZERhdGEgaWRlbnRpZnlpbmcgdGhlIHZhbHVlcyBvbiB0aGUgZW5kcyBvZiB0aGUgbGlua3MgYWN0aW5nIG9uIGJ5IHRoaXMgTGlua0FjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkxpbmtBY3Rpb24tZW5kRGF0YS1fbG93ZXJWYWx1ZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJMaW5rQWN0aW9uLWVuZERhdGEtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTGlua0FjdGlvbi1pbnB1dFZhbHVlIiBuYW1lPSJpbnB1dFZhbHVlIiB0eXBlPSJJbnB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1pbnB1dCIgYXNzb2NpYXRpb249IkFfaW5wdXRWYWx1ZV9saW5rQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpbmtBY3Rpb24taW5wdXRWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpbmtBY3Rpb24taW5wdXRWYWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+SW5wdXRQaW5zIHVzZWQgYnkgdGhlIExpbmtFbmREYXRhIG9mIHRoZSBMaW5rQWN0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTGlua0FjdGlvbi1pbnB1dFZhbHVlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkxpbmtBY3Rpb24tYXNzb2NpYXRpb24iIG5hbWU9ImFzc29jaWF0aW9uIiBib2R5Q29uZGl0aW9uPSJMaW5rQWN0aW9uLWFzc29jaWF0aW9uLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0FjdGlvbi1hc3NvY2lhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpbmtBY3Rpb24tYXNzb2NpYXRpb24iPgotICAgICAgICAgIDxib2R5PlJldHVybnMgdGhlIEFzc29jaWF0aW9uIGFjdGVkIG9uIGJ5IHRoaXMgTGlua0FjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTGlua0FjdGlvbi1hc3NvY2lhdGlvbi1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkxpbmtBY3Rpb24tYXNzb2NpYXRpb24iPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaW5rQWN0aW9uLWFzc29jaWF0aW9uLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoZW5kRGF0YS0+YXNTZXF1ZW5jZSgpLT5maXJzdCgpLmVuZC5hc3NvY2lhdGlvbik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTGlua0FjdGlvbi1hc3NvY2lhdGlvbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iQXNzb2NpYXRpb24iIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJMaW5rRW5kQ3JlYXRpb25EYXRhIiBuYW1lPSJMaW5rRW5kQ3JlYXRpb25EYXRhIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaW5rRW5kQ3JlYXRpb25EYXRhLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0VuZENyZWF0aW9uRGF0YSI+Ci0gICAgICAgIDxib2R5PkxpbmtFbmRDcmVhdGlvbkRhdGEgaXMgTGlua0VuZERhdGEgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3Igb25lIGVuZCBvZiBhIGxpbmsgdG8gYmUgY3JlYXRlZCBieSBhIENyZWF0ZUxpbmtBY3Rpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTGlua0VuZENyZWF0aW9uRGF0YS1pbnNlcnRBdF9waW4iIG5hbWU9Imluc2VydEF0X3BpbiIgY29uc3RyYWluZWRFbGVtZW50PSJMaW5rRW5kQ3JlYXRpb25EYXRhIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpbmtFbmRDcmVhdGlvbkRhdGEtaW5zZXJ0QXRfcGluLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0VuZENyZWF0aW9uRGF0YS1pbnNlcnRBdF9waW4iPgotICAgICAgICAgIDxib2R5PkxpbmtFbmRDcmVhdGlvbkRhdGEgZm9yIG9yZGVyZWQgQXNzb2NpYXRpb24gZW5kcyBtdXN0IGhhdmUgYSBzaW5nbGUgaW5zZXJ0QXQgSW5wdXRQaW4gZm9yIHRoZSBpbnNlcnRpb24gcG9pbnQgd2l0aCB0eXBlIFVubGltaXRlZE5hdHVyYWwgYW5kIG11bHRpcGxpY2l0eSBvZiAxLi4xLCBpZiBpc1JlcGxhY2VBbGw9ZmFsc2UsIGFuZCBtdXN0IGhhdmUgbm8gSW5wdXRQaW4gZm9yIHRoZSBpbnNlcnRpb24gcG9pbnQgd2hlbiB0aGUgYXNzb2NpYXRpb24gZW5kcyBhcmUgdW5vcmRlcmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaW5rRW5kQ3JlYXRpb25EYXRhLWluc2VydEF0X3Bpbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aWYgIG5vdCBlbmQuaXNPcmRlcmVkCi10aGVuIGluc2VydEF0ID0gbnVsbAotZWxzZQotCW5vdCBpc1JlcGxhY2VBbGw9ZmFsc2UgaW1wbGllcwotCWluc2VydEF0ICZsdDs+IG51bGwgYW5kIGluc2VydEF0LT5mb3JBbGwodHlwZT1VbmxpbWl0ZWROYXR1cmFsIGFuZCBpcygxLDEpKQotZW5kaWY8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iTGlua0VuZENyZWF0aW9uRGF0YS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTGlua0VuZERhdGEiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkxpbmtFbmRDcmVhdGlvbkRhdGEtaW5zZXJ0QXQiIG5hbWU9Imluc2VydEF0IiB0eXBlPSJJbnB1dFBpbiIgYXNzb2NpYXRpb249IkFfaW5zZXJ0QXRfbGlua0VuZENyZWF0aW9uRGF0YSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaW5rRW5kQ3JlYXRpb25EYXRhLWluc2VydEF0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0VuZENyZWF0aW9uRGF0YS1pbnNlcnRBdCI+Ci0gICAgICAgICAgPGJvZHk+Rm9yIG9yZGVyZWQgQXNzb2NpYXRpb24gZW5kcywgdGhlIElucHV0UGluIHRoYXQgcHJvdmlkZXMgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBuZXcgbGluayBzaG91bGQgYmUgaW5zZXJ0ZWQgb3Igd2hlcmUgYW4gZXhpc3RpbmcgbGluayBzaG91bGQgYmUgbW92ZWQgdG8uIFRoZSB0eXBlIG9mIHRoZSBpbnNlcnRBdCBJbnB1dFBpbiBpcyBVbmxpbWl0ZWROYXR1cmFsLCBidXQgdGhlIGlucHV0IGNhbm5vdCBiZSB6ZXJvLiBJdCBpcyBvbWl0dGVkIGZvciBBc3NvY2lhdGlvbiBlbmRzIHRoYXQgYXJlIG5vdCBvcmRlcmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTGlua0VuZENyZWF0aW9uRGF0YS1pbnNlcnRBdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkxpbmtFbmRDcmVhdGlvbkRhdGEtaXNSZXBsYWNlQWxsIiBuYW1lPSJpc1JlcGxhY2VBbGwiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0VuZENyZWF0aW9uRGF0YS1pc1JlcGxhY2VBbGwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaW5rRW5kQ3JlYXRpb25EYXRhLWlzUmVwbGFjZUFsbCI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGV4aXN0aW5nIGxpbmtzIGVtYW5hdGluZyBmcm9tIHRoZSBvYmplY3Qgb24gdGhpcyBlbmQgc2hvdWxkIGJlIGRlc3Ryb3llZCBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgbGluay48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJMaW5rRW5kQ3JlYXRpb25EYXRhLWlzUmVwbGFjZUFsbC1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTGlua0VuZENyZWF0aW9uRGF0YS1hbGxQaW5zIiBuYW1lPSJhbGxQaW5zIiBib2R5Q29uZGl0aW9uPSJMaW5rRW5kQ3JlYXRpb25EYXRhLWFsbFBpbnMtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJMaW5rRW5kRGF0YS1hbGxQaW5zIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpbmtFbmRDcmVhdGlvbkRhdGEtYWxsUGlucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpbmtFbmRDcmVhdGlvbkRhdGEtYWxsUGlucyI+Ci0gICAgICAgICAgPGJvZHk+QWRkcyB0aGUgaW5zZXJ0QXQgSW5wdXRQaW4gKGlmIGFueSkgdG8gdGhlIHNldCBvZiBhbGwgUGlucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTGlua0VuZENyZWF0aW9uRGF0YS1hbGxQaW5zLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTGlua0VuZENyZWF0aW9uRGF0YS1hbGxQaW5zIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTGlua0VuZENyZWF0aW9uRGF0YS1hbGxQaW5zLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc2VsZi5MaW5rRW5kRGF0YTo6YWxsUGlucygpLT5pbmNsdWRpbmcoaW5zZXJ0QXQpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJMaW5rRW5kQ3JlYXRpb25EYXRhLWFsbFBpbnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IklucHV0UGluIiBpc1VuaXF1ZT0iZmFsc2UiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkxpbmtFbmRDcmVhdGlvbkRhdGEtYWxsUGlucy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkxpbmtFbmRDcmVhdGlvbkRhdGEtYWxsUGlucy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJMaW5rRW5kRGF0YSIgbmFtZT0iTGlua0VuZERhdGEiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpbmtFbmREYXRhLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0VuZERhdGEiPgotICAgICAgICA8Ym9keT5MaW5rRW5kRGF0YSBpcyBhbiBFbGVtZW50IHRoYXQgaWRlbnRpZmllcyBvbiBlbmQgb2YgYSBsaW5rIHRvIGJlIHJlYWQgb3Igd3JpdHRlbiBieSBhIExpbmtBY3Rpb24uIEFzIGEgbGluayAodGhhdCBpcyBub3QgYSBsaW5rIG9iamVjdCkgY2Fubm90IGJlIHBhc3NlZCBhcyBhIHJ1bnRpbWUgdmFsdWUgdG8gb3IgZnJvbSBhbiBBY3Rpb24sIGl0IGlzIGluc3RlYWQgaWRlbnRpZmllZCBieSBpdHMgZW5kIG9iamVjdHMgYW5kIHF1YWxpZmllciB2YWx1ZXMsIGlmIGFueS4gQSBMaW5rRW5kRGF0YSBpbnN0YW5jZSBwcm92aWRlcyB0aGVzZSB2YWx1ZXMgZm9yIGEgc2luZ2xlIEFzc29jaWF0aW9uIGVuZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaW5rRW5kRGF0YS1zYW1lX3R5cGUiIG5hbWU9InNhbWVfdHlwZSIgY29uc3RyYWluZWRFbGVtZW50PSJMaW5rRW5kRGF0YSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaW5rRW5kRGF0YS1zYW1lX3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaW5rRW5kRGF0YS1zYW1lX3R5cGUiPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBJbnB1dFBpbiBjb25mb3JtcyB0byB0aGUgdHlwZSBvZiB0aGUgQXNzb2NpYXRpb24gZW5kLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaW5rRW5kRGF0YS1zYW1lX3R5cGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnZhbHVlJmx0Oz5udWxsIGltcGxpZXMgdmFsdWUudHlwZS5jb25mb3Jtc1RvKGVuZC50eXBlKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTGlua0VuZERhdGEtbXVsdGlwbGljaXR5IiBuYW1lPSJtdWx0aXBsaWNpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iTGlua0VuZERhdGEiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0VuZERhdGEtbXVsdGlwbGljaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0VuZERhdGEtbXVsdGlwbGljaXR5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIHRoZSB2YWx1ZSBJbnB1dFBpbiBtdXN0IGJlIDEuLjEuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkxpbmtFbmREYXRhLW11bHRpcGxpY2l0eS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dmFsdWUmbHQ7Pm51bGwgaW1wbGllcyB2YWx1ZS5pcygxLDEpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaW5rRW5kRGF0YS1lbmRfb2JqZWN0X2lucHV0X3BpbiIgbmFtZT0iZW5kX29iamVjdF9pbnB1dF9waW4iIGNvbnN0cmFpbmVkRWxlbWVudD0iTGlua0VuZERhdGEiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0VuZERhdGEtZW5kX29iamVjdF9pbnB1dF9waW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaW5rRW5kRGF0YS1lbmRfb2JqZWN0X2lucHV0X3BpbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHZhbHVlIElucHV0UGluIGlzIG5vdCBhbHNvIHRoZSBxdWFsaWZpZXIgdmFsdWUgSW5wdXRQaW4uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkxpbmtFbmREYXRhLWVuZF9vYmplY3RfaW5wdXRfcGluLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT52YWx1ZS0+ZXhjbHVkZXNBbGwocXVhbGlmaWVyLnZhbHVlKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTGlua0VuZERhdGEtcHJvcGVydHlfaXNfYXNzb2NpYXRpb25fZW5kIiBuYW1lPSJwcm9wZXJ0eV9pc19hc3NvY2lhdGlvbl9lbmQiIGNvbnN0cmFpbmVkRWxlbWVudD0iTGlua0VuZERhdGEiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0VuZERhdGEtcHJvcGVydHlfaXNfYXNzb2NpYXRpb25fZW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0VuZERhdGEtcHJvcGVydHlfaXNfYXNzb2NpYXRpb25fZW5kIj4KLSAgICAgICAgICA8Ym9keT5UaGUgUHJvcGVydHkgbXVzdCBiZSBhbiBBc3NvY2lhdGlvbiBtZW1iZXJFbmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkxpbmtFbmREYXRhLXByb3BlcnR5X2lzX2Fzc29jaWF0aW9uX2VuZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZW5kLmFzc29jaWF0aW9uICZsdDs+IG51bGw8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkxpbmtFbmREYXRhLXF1YWxpZmllcnMiIG5hbWU9InF1YWxpZmllcnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTGlua0VuZERhdGEiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0VuZERhdGEtcXVhbGlmaWVycy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpbmtFbmREYXRhLXF1YWxpZmllcnMiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWFsaWZpZXJzIG11c3QgYmUgcXVhbGlmaWVycyBvZiB0aGUgQXNzb2NpYXRpb24gZW5kLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaW5rRW5kRGF0YS1xdWFsaWZpZXJzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lbmQucXVhbGlmaWVyLT5pbmNsdWRlc0FsbChxdWFsaWZpZXIucXVhbGlmaWVyKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJMaW5rRW5kRGF0YS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTGlua0VuZERhdGEtZW5kIiBuYW1lPSJlbmQiIHR5cGU9IlByb3BlcnR5IiBhc3NvY2lhdGlvbj0iQV9lbmRfbGlua0VuZERhdGEiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0VuZERhdGEtZW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0VuZERhdGEtZW5kIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQXNzb2NpYXRpb27CoGVuZMKgZm9ywqB3aGljaMKgdGhpc8KgTGlua0VuZERhdGHCoHNwZWNpZmllc8KgdmFsdWVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTGlua0VuZERhdGEtcXVhbGlmaWVyIiBuYW1lPSJxdWFsaWZpZXIiIHR5cGU9IlF1YWxpZmllclZhbHVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3F1YWxpZmllcl9saW5rRW5kRGF0YSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaW5rRW5kRGF0YS1xdWFsaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaW5rRW5kRGF0YS1xdWFsaWZpZXIiPgotICAgICAgICAgIDxib2R5PkEgc2V0IG9mIFF1YWxpZmllclZhbHVlcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciB0aGUgcXVhbGlmaWVycyBvZiB0aGUgZW5kLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTGlua0VuZERhdGEtcXVhbGlmaWVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTGlua0VuZERhdGEtcXVhbGlmaWVyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkxpbmtFbmREYXRhLXZhbHVlIiBuYW1lPSJ2YWx1ZSIgdHlwZT0iSW5wdXRQaW4iIGFzc29jaWF0aW9uPSJBX3ZhbHVlX2xpbmtFbmREYXRhIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpbmtFbmREYXRhLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0VuZERhdGEtdmFsdWUiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbiB0aGF0IHByb3ZpZGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBlbmQuIFRoaXMgSW5wdXRQaW4gaXMgb21pdHRlZCBpZiB0aGUgTGlua0VuZERhdGEgc3BlY2lmaWVzIHRoZSAmcXVvdDtvcGVuJnF1b3Q7IGVuZCBmb3IgYSBSZWFkTGlua0FjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkxpbmtFbmREYXRhLXZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTGlua0VuZERhdGEtYWxsUGlucyIgbmFtZT0iYWxsUGlucyIgYm9keUNvbmRpdGlvbj0iTGlua0VuZERhdGEtYWxsUGlucy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpbmtFbmREYXRhLWFsbFBpbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaW5rRW5kRGF0YS1hbGxQaW5zIj4KLSAgICAgICAgICA8Ym9keT5SZXR1cm5zIGFsbCB0aGUgSW5wdXRQaW5zIHJlZmVyZW5jZWQgYnkgdGhpcyBMaW5rRW5kRGF0YS4gQnkgZGVmYXVsdCB0aGlzIGluY2x1ZGVzIHRoZSB2YWx1ZSBhbmQgcXVhbGlmaWVyIElucHV0UGlucywgYnV0IHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoZSBvcGVyYXRpb24gdG8gYWRkIG90aGVyIElucHV0UGlucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTGlua0VuZERhdGEtYWxsUGlucy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkxpbmtFbmREYXRhLWFsbFBpbnMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaW5rRW5kRGF0YS1hbGxQaW5zLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAodmFsdWUtPmFzQmFnKCktPnVuaW9uKHF1YWxpZmllci52YWx1ZSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkxpbmtFbmREYXRhLWFsbFBpbnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IklucHV0UGluIiBpc1VuaXF1ZT0iZmFsc2UiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkxpbmtFbmREYXRhLWFsbFBpbnMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJMaW5rRW5kRGF0YS1hbGxQaW5zLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEiIG5hbWU9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaW5rRW5kRGVzdHJ1Y3Rpb25EYXRhIj4KLSAgICAgICAgPGJvZHk+TGlua0VuZERlc3RydWN0aW9uRGF0YSBpcyBMaW5rRW5kRGF0YSB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBvbmUgZW5kIG9mIGEgbGluayB0byBiZSBkZXN0cm95ZWQgYnkgYSBEZXN0cm95TGlua0FjdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaW5rRW5kRGVzdHJ1Y3Rpb25EYXRhLWRlc3Ryb3lBdF9waW4iIG5hbWU9ImRlc3Ryb3lBdF9waW4iIGNvbnN0cmFpbmVkRWxlbWVudD0iTGlua0VuZERlc3RydWN0aW9uRGF0YSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaW5rRW5kRGVzdHJ1Y3Rpb25EYXRhLWRlc3Ryb3lBdF9waW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaW5rRW5kRGVzdHJ1Y3Rpb25EYXRhLWRlc3Ryb3lBdF9waW4iPgotICAgICAgICAgIDxib2R5PkxpbmtFbmREZXN0cnVjdGlvbkRhdGEgZm9yIG9yZGVyZWQsIG5vbnVuaXF1ZSBBc3NvY2lhdGlvbiBlbmRzIG11c3QgaGF2ZSBhIHNpbmdsZSBkZXN0cm95QXQgSW5wdXRQaW4gaWYgaXNEZXN0cm95RHVwbGljYXRlcyBpcyBmYWxzZSwgd2hpY2ggbXVzdCBiZSBvZiB0eXBlIFVubGltaXRlZE5hdHVyYWwgYW5kIGhhdmUgYSBtdWx0aXBsaWNpdHkgb2YgMS4uMS4gT3RoZXJ3aXNlLCB0aGUgYWN0aW9uIGhhcyBubyBkZXN0cm95QXQgaW5wdXQgcGluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaW5rRW5kRGVzdHJ1Y3Rpb25EYXRhLWRlc3Ryb3lBdF9waW4tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlmICBub3QgZW5kLmlzT3JkZXJlZCBvciBlbmQuaXNVbmlxdWUgb3IgaXNEZXN0cm95RHVwbGljYXRlcyYjeEQ7Ci10aGVuIGRlc3Ryb3lBdCA9IG51bGwmI3hEOwotZWxzZSYjeEQ7Ci0JZGVzdHJveUF0ICZsdDs+IG51bGwgYW5kICYjeEQ7Ci0JZGVzdHJveUF0LT5mb3JBbGwodHlwZT1VbmxpbWl0ZWROYXR1cmFsIGFuZCBpcygxLDEpKSYjeEQ7Ci1lbmRpZjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJMaW5rRW5kRGVzdHJ1Y3Rpb25EYXRhLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJMaW5rRW5kRGF0YSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTGlua0VuZERlc3RydWN0aW9uRGF0YS1kZXN0cm95QXQiIG5hbWU9ImRlc3Ryb3lBdCIgdHlwZT0iSW5wdXRQaW4iIGFzc29jaWF0aW9uPSJBX2Rlc3Ryb3lBdF9saW5rRW5kRGVzdHJ1Y3Rpb25EYXRhIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEtZGVzdHJveUF0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0VuZERlc3RydWN0aW9uRGF0YS1kZXN0cm95QXQiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbiB0aGF0IHByb3ZpZGVzIHRoZSBwb3NpdGlvbiBvZiBhbiBleGlzdGluZyBsaW5rIHRvIGJlIGRlc3Ryb3llZCBpbiBhbiBvcmRlcmVkLCBub251bmlxdWUgQXNzb2NpYXRpb24gZW5kLiBUaGUgdHlwZSBvZiB0aGUgZGVzdHJveUF0IElucHV0UGluIGlzIFVubGltaXRlZE5hdHVyYWwsIGJ1dCB0aGUgdmFsdWUgY2Fubm90IGJlIHplcm8gb3IgdW5saW1pdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTGlua0VuZERlc3RydWN0aW9uRGF0YS1kZXN0cm95QXQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMaW5rRW5kRGVzdHJ1Y3Rpb25EYXRhLWlzRGVzdHJveUR1cGxpY2F0ZXMiIG5hbWU9ImlzRGVzdHJveUR1cGxpY2F0ZXMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlua0VuZERlc3RydWN0aW9uRGF0YS1pc0Rlc3Ryb3lEdXBsaWNhdGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlua0VuZERlc3RydWN0aW9uRGF0YS1pc0Rlc3Ryb3lEdXBsaWNhdGVzIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgd2hldGhlciB0byBkZXN0cm95IGR1cGxpY2F0ZXMgb2YgdGhlIHZhbHVlIGluIG5vbnVuaXF1ZSBBc3NvY2lhdGlvbiBlbmRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEtaXNEZXN0cm95RHVwbGljYXRlcy1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTGlua0VuZERlc3RydWN0aW9uRGF0YS1hbGxQaW5zIiBuYW1lPSJhbGxQaW5zIiBib2R5Q29uZGl0aW9uPSJMaW5rRW5kRGVzdHJ1Y3Rpb25EYXRhLWFsbFBpbnMtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJMaW5rRW5kRGF0YS1hbGxQaW5zIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEtYWxsUGlucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEtYWxsUGlucyI+Ci0gICAgICAgICAgPGJvZHk+QWRkcyB0aGUgZGVzdHJveUF0IElucHV0UGluIChpZiBhbnkpIHRvIHRoZSBzZXQgb2YgYWxsIFBpbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEtYWxsUGlucy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEtYWxsUGlucyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEtYWxsUGlucy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHNlbGYuTGlua0VuZERhdGE6OmFsbFBpbnMoKS0+aW5jbHVkaW5nKGRlc3Ryb3lBdCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkxpbmtFbmREZXN0cnVjdGlvbkRhdGEtYWxsUGlucy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iSW5wdXRQaW4iIGlzVW5pcXVlPSJmYWxzZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTGlua0VuZERlc3RydWN0aW9uRGF0YS1hbGxQaW5zLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTGlua0VuZERlc3RydWN0aW9uRGF0YS1hbGxQaW5zLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Ikxvb3BOb2RlIiBuYW1lPSJMb29wTm9kZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTG9vcE5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMb29wTm9kZSI+Ci0gICAgICAgIDxib2R5PkEgTG9vcE5vZGUgaXMgYSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHRoYXQgcmVwcmVzZW50cyBhbiBpdGVyYXRpdmUgbG9vcCB3aXRoIHNldHVwLCB0ZXN0LCBhbmQgYm9keSBzZWN0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMb29wTm9kZS1yZXN1bHRfbm9faW5jb21pbmciIG5hbWU9InJlc3VsdF9ub19pbmNvbWluZyIgY29uc3RyYWluZWRFbGVtZW50PSJMb29wTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMb29wTm9kZS1yZXN1bHRfbm9faW5jb21pbmctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMb29wTm9kZS1yZXN1bHRfbm9faW5jb21pbmciPgotICAgICAgICAgIDxib2R5PlRoZSByZXN1bHQgT3V0cHV0UGlucyBoYXZlIG5vIGluY29taW5nIGVkZ2VzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMb29wTm9kZS1yZXN1bHRfbm9faW5jb21pbmctX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlc3VsdC5pbmNvbWluZy0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMb29wTm9kZS1pbnB1dF9lZGdlcyIgbmFtZT0iaW5wdXRfZWRnZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTG9vcE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTG9vcE5vZGUtaW5wdXRfZWRnZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMb29wTm9kZS1pbnB1dF9lZGdlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGxvb3BWYXJpYWJsZUlucHV0cyBtdXN0IG5vdCBoYXZlIG91dGdvaW5nIGVkZ2VzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMb29wTm9kZS1pbnB1dF9lZGdlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bG9vcFZhcmlhYmxlSW5wdXQub3V0Z29pbmctPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTG9vcE5vZGUtZXhlY3V0YWJsZV9ub2RlcyIgbmFtZT0iZXhlY3V0YWJsZV9ub2RlcyIgY29uc3RyYWluZWRFbGVtZW50PSJMb29wTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMb29wTm9kZS1leGVjdXRhYmxlX25vZGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTG9vcE5vZGUtZXhlY3V0YWJsZV9ub2RlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHVuaW9uIG9mIHRoZSBFeGVjdXRhYmxlTm9kZXMgaW4gdGhlIHNldHVwUGFydCwgdGVzdCBhbmQgYm9keVBhcnQgb2YgYSBMb29wTm9kZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBzdWJzZXQgb2Ygbm9kZXMgY29udGFpbmVkIGluIHRoZSBMb29wTm9kZSAoY29uc2lkZXJlZCBhcyBhIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHRoYXQgYXJlIEV4ZWN1dGFibGVOb2Rlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTG9vcE5vZGUtZXhlY3V0YWJsZV9ub2Rlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2V0dXBQYXJ0LT51bmlvbih0ZXN0KS0+dW5pb24oYm9keVBhcnQpPW5vZGUtPnNlbGVjdChvY2xJc0tpbmRPZihFeGVjdXRhYmxlTm9kZSkpLm9jbEFzVHlwZShFeGVjdXRhYmxlTm9kZSktPmFzU2V0KCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ikxvb3BOb2RlLWJvZHlfb3V0cHV0X3BpbnMiIG5hbWU9ImJvZHlfb3V0cHV0X3BpbnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTG9vcE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTG9vcE5vZGUtYm9keV9vdXRwdXRfcGlucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikxvb3BOb2RlLWJvZHlfb3V0cHV0X3BpbnMiPgotICAgICAgICAgIDxib2R5PlRoZSBib2R5T3V0cHV0IHBpbnMgYXJlIE91dHB1dFBpbnMgb24gQWN0aW9ucyBpbiB0aGUgYm9keSBvZiB0aGUgTG9vcE5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ikxvb3BOb2RlLWJvZHlfb3V0cHV0X3BpbnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmJvZHlQYXJ0Lm9jbEFzVHlwZShBY3Rpb24pLmFsbEFjdGlvbnMoKS5vdXRwdXQtPmluY2x1ZGVzQWxsKGJvZHlPdXRwdXQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMb29wTm9kZS1zZXR1cF90ZXN0X2FuZF9ib2R5IiBuYW1lPSJzZXR1cF90ZXN0X2FuZF9ib2R5IiBjb25zdHJhaW5lZEVsZW1lbnQ9Ikxvb3BOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLXNldHVwX3Rlc3RfYW5kX2JvZHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMb29wTm9kZS1zZXR1cF90ZXN0X2FuZF9ib2R5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgdGVzdCBhbmQgYm9keSBwYXJ0cyBvZiBhIENvbmRpdGlvbmFsTm9kZSBtdXN0IGJlIGRpc2pvaW50IHdpdGggZWFjaCBvdGhlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTG9vcE5vZGUtc2V0dXBfdGVzdF9hbmRfYm9keS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2V0dXBQYXJ0LT5pbnRlcnNlY3Rpb24odGVzdCktPmlzRW1wdHkoKSBhbmQmI3hEOwotc2V0dXBQYXJ0LT5pbnRlcnNlY3Rpb24oYm9keVBhcnQpLT5pc0VtcHR5KCkgYW5kJiN4RDsKLXRlc3QtPmludGVyc2VjdGlvbihib2R5UGFydCktPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTG9vcE5vZGUtbWF0Y2hpbmdfb3V0cHV0X3BpbnMiIG5hbWU9Im1hdGNoaW5nX291dHB1dF9waW5zIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ikxvb3BOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLW1hdGNoaW5nX291dHB1dF9waW5zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTG9vcE5vZGUtbWF0Y2hpbmdfb3V0cHV0X3BpbnMiPgotICAgICAgICAgIDxib2R5PkEgTG9vcE5vZGUgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBib2R5T3V0cHV0IFBpbnMgYXMgbG9vcFZhcmlhYmxlcywgYW5kIGVhY2ggYm9keU91dHB1dCBQaW4gbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbG9vcFZhcmlhYmxlIChieSBwb3NpdGlvbmFsIG9yZGVyKSBpbiB0eXBlLCBtdWx0aXBsaWNpdHksIG9yZGVyaW5nIGFuZCB1bmlxdWVuZXNzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMb29wTm9kZS1tYXRjaGluZ19vdXRwdXRfcGlucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+Ym9keU91dHB1dC0+c2l6ZSgpPWxvb3BWYXJpYWJsZS0+c2l6ZSgpIGFuZCYjeEQ7Ci1TZXF1ZW5jZXsxLi5sb29wVmFyaWFibGUtPnNpemUoKX0tPmZvckFsbChpIHwmI3hEOwotCWJvZHlPdXRwdXQtPmF0KGkpLnR5cGUuY29uZm9ybXNUbyhsb29wVmFyaWFibGUtPmF0KGkpLnR5cGUpIGFuZCYjeEQ7Ci0JYm9keU91dHB1dC0+YXQoaSkuaXNPcmRlcmVkID0gbG9vcFZhcmlhYmxlLT5hdChpKS5pc09yZGVyZWQgYW5kJiN4RDsKLQlib2R5T3V0cHV0LT5hdChpKS5pc1VuaXF1ZSA9IGxvb3BWYXJpYWJsZS0+YXQoaSkuaXNVbmlxdWUgYW5kJiN4RDsKLQlsb29wVmFyaWFibGUtPmF0KGkpLmluY2x1ZGVzTXVsdGlwbGljaXR5KGJvZHlPdXRwdXQtPmF0KGkpKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ikxvb3BOb2RlLW1hdGNoaW5nX2xvb3BfdmFyaWFibGVzIiBuYW1lPSJtYXRjaGluZ19sb29wX3ZhcmlhYmxlcyIgY29uc3RyYWluZWRFbGVtZW50PSJMb29wTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMb29wTm9kZS1tYXRjaGluZ19sb29wX3ZhcmlhYmxlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikxvb3BOb2RlLW1hdGNoaW5nX2xvb3BfdmFyaWFibGVzIj4KLSAgICAgICAgICA8Ym9keT5BIExvb3BOb2RlIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgbG9vcFZhcmlhYmxlSW5wdXRzIGFuZCBsb29wVmFyaWFibGVzLCBhbmQgdGhleSBtdXN0IG1hdGNoIGluIHR5cGUsIHVuaXF1ZW5lc3MgYW5kIG11bHRpcGxpY2l0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTG9vcE5vZGUtbWF0Y2hpbmdfbG9vcF92YXJpYWJsZXMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pmxvb3BWYXJpYWJsZUlucHV0LT5zaXplKCk9bG9vcFZhcmlhYmxlLT5zaXplKCkgYW5kJiN4RDsKLWxvb3BWYXJpYWJsZUlucHV0LnR5cGU9bG9vcFZhcmlhYmxlLnR5cGUgYW5kJiN4RDsKLWxvb3BWYXJpYWJsZUlucHV0LmlzVW5pcXVlPWxvb3BWYXJpYWJsZS5pc1VuaXF1ZSBhbmQmI3hEOwotbG9vcFZhcmlhYmxlSW5wdXQubG93ZXI9bG9vcFZhcmlhYmxlLmxvd2VyIGFuZCYjeEQ7Ci1sb29wVmFyaWFibGVJbnB1dC51cHBlcj1sb29wVmFyaWFibGUudXBwZXI8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ikxvb3BOb2RlLW1hdGNoaW5nX3Jlc3VsdF9waW5zIiBuYW1lPSJtYXRjaGluZ19yZXN1bHRfcGlucyIgY29uc3RyYWluZWRFbGVtZW50PSJMb29wTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMb29wTm9kZS1tYXRjaGluZ19yZXN1bHRfcGlucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikxvb3BOb2RlLW1hdGNoaW5nX3Jlc3VsdF9waW5zIj4KLSAgICAgICAgICA8Ym9keT5BIExvb3BOb2RlIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgcmVzdWx0IE91dHB1dFBpbnMgYW5kIGxvb3BWYXJpYWJsZXMsIGFuZCB0aGV5IG11c3QgbWF0Y2ggaW4gdHlwZSwgdW5pcXVlbmVzcyBhbmQgbXVsdGlwbGljaXR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMb29wTm9kZS1tYXRjaGluZ19yZXN1bHRfcGlucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVzdWx0LT5zaXplKCk9bG9vcFZhcmlhYmxlLT5zaXplKCkgYW5kJiN4RDsKLXJlc3VsdC50eXBlPWxvb3BWYXJpYWJsZS50eXBlIGFuZCYjeEQ7Ci1yZXN1bHQuaXNVbmlxdWU9bG9vcFZhcmlhYmxlLmlzVW5pcXVlIGFuZCYjeEQ7Ci1yZXN1bHQubG93ZXI9bG9vcFZhcmlhYmxlLmxvd2VyIGFuZCYjeEQ7Ci1yZXN1bHQudXBwZXI9bG9vcFZhcmlhYmxlLnVwcGVyPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMb29wTm9kZS1sb29wX3ZhcmlhYmxlX291dGdvaW5nIiBuYW1lPSJsb29wX3ZhcmlhYmxlX291dGdvaW5nIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ikxvb3BOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLWxvb3BfdmFyaWFibGVfb3V0Z29pbmctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMb29wTm9kZS1sb29wX3ZhcmlhYmxlX291dGdvaW5nIj4KLSAgICAgICAgICA8Ym9keT5BbGwgQWN0aXZpdHlFZGdlcyBvdXRnb2luZyBmcm9tIGxvb3BWYXJpYWJsZSBPdXRwdXRQaW5zIG11c3QgaGF2ZSB0YXJnZXRzIHdpdGhpbiB0aGUgTG9vcE5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ikxvb3BOb2RlLWxvb3BfdmFyaWFibGVfb3V0Z29pbmctX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmFsbE93bmVkTm9kZXMoKS0+aW5jbHVkZXNBbGwobG9vcFZhcmlhYmxlLm91dGdvaW5nLnRhcmdldCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iTG9vcE5vZGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ikxvb3BOb2RlLWJvZHlPdXRwdXQiIG5hbWU9ImJvZHlPdXRwdXQiIHR5cGU9Ik91dHB1dFBpbiIgaXNPcmRlcmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9ib2R5T3V0cHV0X2xvb3BOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLWJvZHlPdXRwdXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMb29wTm9kZS1ib2R5T3V0cHV0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgT3V0cHV0UGlucyBvbiBBY3Rpb25zIHdpdGhpbiB0aGUgYm9keVBhcnQsIHRoZSB2YWx1ZXMgb2Ygd2hpY2ggYXJlIG1vdmVkIHRvIHRoZSBsb29wVmFyaWFibGUgT3V0cHV0UGlucyBhZnRlciB0aGUgY29tcGxldGlvbiBvZiBlYWNoIGV4ZWN1dGlvbiBvZiB0aGUgYm9keVBhcnQsIGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhlIGxvb3AgYmVnaW5zIG9yIGJlZm9yZSB0aGUgbG9vcCBleGl0cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ikxvb3BOb2RlLWJvZHlPdXRwdXQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJMb29wTm9kZS1ib2R5T3V0cHV0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ikxvb3BOb2RlLWJvZHlQYXJ0IiBuYW1lPSJib2R5UGFydCIgdHlwZT0iRXhlY3V0YWJsZU5vZGUiIGFzc29jaWF0aW9uPSJBX2JvZHlQYXJ0X2xvb3BOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLWJvZHlQYXJ0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTG9vcE5vZGUtYm9keVBhcnQiPgotICAgICAgICAgIDxib2R5PlRoZSBzZXQgb2YgRXhlY3V0YWJsZU5vZGVzIHRoYXQgcGVyZm9ybSB0aGUgcmVwZXRpdGl2ZSBjb21wdXRhdGlvbnMgb2YgdGhlIGxvb3AuIFRoZSBib2R5UGFydCBpcyBleGVjdXRlZCBhcyBsb25nIGFzIHRoZSB0ZXN0IHNlY3Rpb24gcHJvZHVjZXMgYSB0cnVlIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTG9vcE5vZGUtYm9keVBhcnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJMb29wTm9kZS1ib2R5UGFydC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMb29wTm9kZS1kZWNpZGVyIiBuYW1lPSJkZWNpZGVyIiB0eXBlPSJPdXRwdXRQaW4iIGFzc29jaWF0aW9uPSJBX2RlY2lkZXJfbG9vcE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTG9vcE5vZGUtZGVjaWRlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikxvb3BOb2RlLWRlY2lkZXIiPgotICAgICAgICAgIDxib2R5PkFuIE91dHB1dFBpbiBvbiBhbiBBY3Rpb24gaW4gdGhlIHRlc3Qgc2VjdGlvbiB3aG9zZSBCb29sZWFuIHZhbHVlIGRldGVybWluZXMgd2hldGhlciB0byBjb250aW51ZSBleGVjdXRpbmcgdGhlIGxvb3AgYm9keVBhcnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMb29wTm9kZS1pc1Rlc3RlZEZpcnN0IiBuYW1lPSJpc1Rlc3RlZEZpcnN0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLWlzVGVzdGVkRmlyc3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMb29wTm9kZS1pc1Rlc3RlZEZpcnN0Ij4KLSAgICAgICAgICA8Ym9keT5JZiB0cnVlLCB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgYmVmb3JlIHRoZSBmaXJzdCBleGVjdXRpb24gb2YgdGhlIGJvZHlQYXJ0LiBJZiBmYWxzZSwgdGhlIGJvZHlQYXJ0IGlzIGV4ZWN1dGVkIG9uY2UgYmVmb3JlIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJMb29wTm9kZS1pc1Rlc3RlZEZpcnN0LV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMb29wTm9kZS1sb29wVmFyaWFibGUiIG5hbWU9Imxvb3BWYXJpYWJsZSIgdHlwZT0iT3V0cHV0UGluIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfbG9vcFZhcmlhYmxlX2xvb3BOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLWxvb3BWYXJpYWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikxvb3BOb2RlLWxvb3BWYXJpYWJsZSI+Ci0gICAgICAgICAgPGJvZHk+QSBsaXN0IG9mIE91dHB1dFBpbnMgdGhhdCBob2xkIHRoZSB2YWx1ZXMgb2YgdGhlIGxvb3AgdmFyaWFibGVzIGR1cmluZyBhbiBleGVjdXRpb24gb2YgdGhlIGxvb3AuIFdoZW4gdGhlIHRlc3QgZmFpbHMsIHRoZSB2YWx1ZXMgYXJlIG1vdmVkIHRvIHRoZSByZXN1bHQgT3V0cHV0UGlucyBvZiB0aGUgbG9vcC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ikxvb3BOb2RlLWxvb3BWYXJpYWJsZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ikxvb3BOb2RlLWxvb3BWYXJpYWJsZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMb29wTm9kZS1sb29wVmFyaWFibGVJbnB1dCIgbmFtZT0ibG9vcFZhcmlhYmxlSW5wdXQiIHR5cGU9IklucHV0UGluIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHJlZGVmaW5lZFByb3BlcnR5PSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXN0cnVjdHVyZWROb2RlSW5wdXQiIGFzc29jaWF0aW9uPSJBX2xvb3BWYXJpYWJsZUlucHV0X2xvb3BOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLWxvb3BWYXJpYWJsZUlucHV0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTG9vcE5vZGUtbG9vcFZhcmlhYmxlSW5wdXQiPgotICAgICAgICAgIDxib2R5PkEgbGlzdCBvZiBJbnB1dFBpbnMgd2hvc2UgdmFsdWVzIGFyZSBtb3ZlZCBpbnRvIHRoZSBsb29wVmFyaWFibGUgUGlucyBiZWZvcmUgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ikxvb3BOb2RlLWxvb3BWYXJpYWJsZUlucHV0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTG9vcE5vZGUtbG9vcFZhcmlhYmxlSW5wdXQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTG9vcE5vZGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9Ik91dHB1dFBpbiIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiByZWRlZmluZWRQcm9wZXJ0eT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkTm9kZU91dHB1dCIgYXNzb2NpYXRpb249IkFfcmVzdWx0X2xvb3BOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLXJlc3VsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikxvb3BOb2RlLXJlc3VsdCI+Ci0gICAgICAgICAgPGJvZHk+QSBsaXN0IG9mIE91dHB1dFBpbnMgdGhhdCByZWNlaXZlIHRoZSBsb29wVmFyaWFibGUgdmFsdWVzIGFmdGVyIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCBhbmQgY29uc3RpdHV0ZSB0aGUgb3V0cHV0IG9mIHRoZSBMb29wTm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ikxvb3BOb2RlLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ikxvb3BOb2RlLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMb29wTm9kZS1zZXR1cFBhcnQiIG5hbWU9InNldHVwUGFydCIgdHlwZT0iRXhlY3V0YWJsZU5vZGUiIGFzc29jaWF0aW9uPSJBX3NldHVwUGFydF9sb29wTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMb29wTm9kZS1zZXR1cFBhcnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMb29wTm9kZS1zZXR1cFBhcnQiPgotICAgICAgICAgIDxib2R5PlRoZSBzZXQgb2YgRXhlY3V0YWJsZU5vZGVzIGV4ZWN1dGVkIGJlZm9yZSB0aGUgZmlyc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wLCBpbiBvcmRlciB0byBpbml0aWFsaXplIHZhbHVlcyBvciBwZXJmb3JtIG90aGVyIHNldHVwIGNvbXB1dGF0aW9ucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ikxvb3BOb2RlLXNldHVwUGFydC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ikxvb3BOb2RlLXNldHVwUGFydC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMb29wTm9kZS10ZXN0IiBuYW1lPSJ0ZXN0IiB0eXBlPSJFeGVjdXRhYmxlTm9kZSIgYXNzb2NpYXRpb249IkFfdGVzdF9sb29wTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMb29wTm9kZS10ZXN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTG9vcE5vZGUtdGVzdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNldCBvZiBFeGVjdXRhYmxlTm9kZXMgZXhlY3V0ZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgdGVzdCByZXN1bHQgZm9yIHRoZSBsb29wLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTG9vcE5vZGUtdGVzdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJMb29wTm9kZS1hbGxBY3Rpb25zIiBuYW1lPSJhbGxBY3Rpb25zIiBib2R5Q29uZGl0aW9uPSJMb29wTm9kZS1hbGxBY3Rpb25zLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iQWN0aW9uLWFsbEFjdGlvbnMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1hbGxBY3Rpb25zIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLWFsbEFjdGlvbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMb29wTm9kZS1hbGxBY3Rpb25zIj4KLSAgICAgICAgICA8Ym9keT5SZXR1cm4gb25seSB0aGlzIExvb3BOb2RlLiBUaGlzIHByZXZlbnRzIEFjdGlvbnMgd2l0aGluIHRoZSBMb29wTm9kZSBmcm9tIGhhdmluZyB0aGVpciBPdXRwdXRQaW5zIHVzZWQgYXMgYm9keU91dHB1dHMgb3IgZGVjaWRlciBQaW5zIGluIGNvbnRhaW5pbmcgTG9vcE5vZGVzIG9yIENvbmRpdGlvbmFsTm9kZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ikxvb3BOb2RlLWFsbEFjdGlvbnMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJMb29wTm9kZS1hbGxBY3Rpb25zIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTG9vcE5vZGUtYWxsQWN0aW9ucy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHNlbGYtPmFzU2V0KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ikxvb3BOb2RlLWFsbEFjdGlvbnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkFjdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTG9vcE5vZGUtYWxsQWN0aW9ucy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ikxvb3BOb2RlLWFsbEFjdGlvbnMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ikxvb3BOb2RlLXNvdXJjZU5vZGVzIiBuYW1lPSJzb3VyY2VOb2RlcyIgYm9keUNvbmRpdGlvbj0iTG9vcE5vZGUtc291cmNlTm9kZXMtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXNvdXJjZU5vZGVzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikxvb3BOb2RlLXNvdXJjZU5vZGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTG9vcE5vZGUtc291cmNlTm9kZXMiPgotICAgICAgICAgIDxib2R5PlJldHVybiB0aGUgbG9vcFZhcmlhYmxlIE91dHB1dFBpbnMgaW4gYWRkaXRpb24gdG8gb3RoZXIgc291cmNlIG5vZGVzIGZvciB0aGUgTG9vcE5vZGUgYXMgYSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMb29wTm9kZS1zb3VyY2VOb2Rlcy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ikxvb3BOb2RlLXNvdXJjZU5vZGVzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTG9vcE5vZGUtc291cmNlTm9kZXMtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChzZWxmLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU6OnNvdXJjZU5vZGVzKCktPnVuaW9uKGxvb3BWYXJpYWJsZSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ikxvb3BOb2RlLXNvdXJjZU5vZGVzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJBY3Rpdml0eU5vZGUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ikxvb3BOb2RlLXNvdXJjZU5vZGVzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTG9vcE5vZGUtc291cmNlTm9kZXMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iT3BhcXVlQWN0aW9uIiBuYW1lPSJPcGFxdWVBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wYXF1ZUFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wYXF1ZUFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkFuIE9wYXF1ZUFjdGlvbiBpcyBhbiBBY3Rpb24gd2hvc2UgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3BlY2lmaWVkIHdpdGhpbiBVTUwuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT3BhcXVlQWN0aW9uLWxhbmd1YWdlX2JvZHlfc2l6ZSIgbmFtZT0ibGFuZ3VhZ2VfYm9keV9zaXplIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik9wYXF1ZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVBY3Rpb24tbGFuZ3VhZ2VfYm9keV9zaXplLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BhcXVlQWN0aW9uLWxhbmd1YWdlX2JvZHlfc2l6ZSI+Ci0gICAgICAgICAgPGJvZHk+SWYgdGhlIGxhbmd1YWdlIGF0dHJpYnV0ZSBpcyBub3QgZW1wdHksIHRoZW4gdGhlIHNpemUgb2YgdGhlIGJvZHkgYW5kIGxhbmd1YWdlIGxpc3RzIG11c3QgYmUgdGhlIHNhbWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wYXF1ZUFjdGlvbi1sYW5ndWFnZV9ib2R5X3NpemUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pmxhbmd1YWdlLT5ub3RFbXB0eSgpIGltcGxpZXMgKF8nYm9keSctPnNpemUoKSA9IGxhbmd1YWdlLT5zaXplKCkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ik9wYXF1ZUFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGFxdWVBY3Rpb24tYm9keSIgbmFtZT0iYm9keSIgaXNPcmRlcmVkPSJ0cnVlIiBpc1VuaXF1ZT0iZmFsc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BhcXVlQWN0aW9uLWJvZHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGFxdWVBY3Rpb24tYm9keSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSB0ZXh0dWFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIEFjdGlvbiwgaW4gb25lIG9yIG1vcmUgbGFuZ3VhZ2VzIG90aGVyIHRoYW4gVU1MLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wYXF1ZUFjdGlvbi1ib2R5LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iT3BhcXVlQWN0aW9uLWJvZHktX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT3BhcXVlQWN0aW9uLWlucHV0VmFsdWUiIG5hbWU9ImlucHV0VmFsdWUiIHR5cGU9IklucHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLWlucHV0IiBhc3NvY2lhdGlvbj0iQV9pbnB1dFZhbHVlX29wYXF1ZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVBY3Rpb24taW5wdXRWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wYXF1ZUFjdGlvbi1pbnB1dFZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgSW5wdXRQaW5zIHByb3ZpZGluZyBpbnB1dHMgdG8gdGhlIE9wYXF1ZUFjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wYXF1ZUFjdGlvbi1pbnB1dFZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iT3BhcXVlQWN0aW9uLWlucHV0VmFsdWUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT3BhcXVlQWN0aW9uLWxhbmd1YWdlIiBuYW1lPSJsYW5ndWFnZSIgaXNPcmRlcmVkPSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wYXF1ZUFjdGlvbi1sYW5ndWFnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wYXF1ZUFjdGlvbi1sYW5ndWFnZSI+Ci0gICAgICAgICAgPGJvZHk+SWYgcHJvdmlkZWQsIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbGFuZ3VhZ2UgdXNlZCBmb3IgZWFjaCBvZiB0aGUgYm9keSBTdHJpbmdzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wYXF1ZUFjdGlvbi1sYW5ndWFnZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik9wYXF1ZUFjdGlvbi1sYW5ndWFnZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGFxdWVBY3Rpb24tb3V0cHV0VmFsdWUiIG5hbWU9Im91dHB1dFZhbHVlIiB0eXBlPSJPdXRwdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24tb3V0cHV0IiBhc3NvY2lhdGlvbj0iQV9vdXRwdXRWYWx1ZV9vcGFxdWVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BhcXVlQWN0aW9uLW91dHB1dFZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BhcXVlQWN0aW9uLW91dHB1dFZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgT3V0cHV0UGlucyBvbiB3aGljaCB0aGUgT3BhcXVlQWN0aW9uIHByb3ZpZGVzIG91dHB1dHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJPcGFxdWVBY3Rpb24tb3V0cHV0VmFsdWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJPcGFxdWVBY3Rpb24tb3V0cHV0VmFsdWUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJPdXRwdXRQaW4iIG5hbWU9Ik91dHB1dFBpbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3V0cHV0UGluLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3V0cHV0UGluIj4KLSAgICAgICAgPGJvZHk+QW4gT3V0cHV0UGluIGlzIGEgUGluIHRoYXQgaG9sZHMgb3V0cHV0IHZhbHVlcyBwcm9kdWNlZCBieSBhbiBBY3Rpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT3V0cHV0UGluLWluY29taW5nX2VkZ2VzX3N0cnVjdHVyZWRfb25seSIgbmFtZT0iaW5jb21pbmdfZWRnZXNfc3RydWN0dXJlZF9vbmx5IiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik91dHB1dFBpbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPdXRwdXRQaW4taW5jb21pbmdfZWRnZXNfc3RydWN0dXJlZF9vbmx5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3V0cHV0UGluLWluY29taW5nX2VkZ2VzX3N0cnVjdHVyZWRfb25seSI+Ci0gICAgICAgICAgPGJvZHk+QW4gT3V0cHV0UGluIG1heSBoYXZlIGluY29taW5nIEFjdGl2aXR5RWRnZXMgb25seSB3aGVuIGl0IGlzIG93bmVkIGJ5IGEgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSwgYW5kIHRoZXNlIGVkZ2VzIG11c3QgaGF2ZSBzb3VyY2VzIGNvbnRhaW5lZCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgaW4gdGhlIG93bmluZyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJPdXRwdXRQaW4taW5jb21pbmdfZWRnZXNfc3RydWN0dXJlZF9vbmx5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pbmNvbWluZy0+bm90RW1wdHkoKSBpbXBsaWVzJiN4RDsKLQlhY3Rpb24mbHQ7Pm51bGwgYW5kJiN4RDsKLQlhY3Rpb24ub2NsSXNLaW5kT2YoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgYW5kJiN4RDsKLQlhY3Rpb24ub2NsQXNUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpLmFsbE93bmVkTm9kZXMoKS0+aW5jbHVkZXNBbGwoaW5jb21pbmcuc291cmNlKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJPdXRwdXRQaW4tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlBpbiIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJQaW4iIG5hbWU9IlBpbiIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGluLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGluIj4KLSAgICAgICAgPGJvZHk+QSBQaW4gaXMgYW4gT2JqZWN0Tm9kZSBhbmQgTXVsdGlwbGljaXR5RWxlbWVudCB0aGF0IHByb3ZpZGVzIGlucHV0IHZhbHVlcyB0byBhbiBBY3Rpb24gb3IgYWNjZXB0cyBvdXRwdXQgdmFsdWVzIGZyb20gYW4gQWN0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBpbi1jb250cm9sX3BpbnMiIG5hbWU9ImNvbnRyb2xfcGlucyIgY29uc3RyYWluZWRFbGVtZW50PSJQaW4iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGluLWNvbnRyb2xfcGlucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBpbi1jb250cm9sX3BpbnMiPgotICAgICAgICAgIDxib2R5PkEgY29udHJvbCBQaW4gaGFzIGEgY29udHJvbCB0eXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQaW4tY29udHJvbF9waW5zLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pc0NvbnRyb2wgaW1wbGllcyBpc0NvbnRyb2xUeXBlPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQaW4tbm90X3VuaXF1ZSIgbmFtZT0ibm90X3VuaXF1ZSIgY29uc3RyYWluZWRFbGVtZW50PSJQaW4iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGluLW5vdF91bmlxdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQaW4tbm90X3VuaXF1ZSI+Ci0gICAgICAgICAgPGJvZHk+UGluIG11bHRpcGxpY2l0eSBpcyBub3QgdW5pcXVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQaW4tbm90X3VuaXF1ZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bm90IGlzVW5pcXVlPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlBpbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iT2JqZWN0Tm9kZSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUGluLV9nZW5lcmFsaXphdGlvbi4xIiBnZW5lcmFsPSJNdWx0aXBsaWNpdHlFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQaW4taXNDb250cm9sIiBuYW1lPSJpc0NvbnRyb2wiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGluLWlzQ29udHJvbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBpbi1pc0NvbnRyb2wiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB3aGV0aGVyIHRoZSBQaW4gcHJvdmlkZXMgZGF0YSB0byB0aGUgQWN0aW9uIG9yIGp1c3QgY29udHJvbHMgaG93IHRoZSBBY3Rpb24gZXhlY3V0ZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iUGluLWlzQ29udHJvbC1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJRdWFsaWZpZXJWYWx1ZSIgbmFtZT0iUXVhbGlmaWVyVmFsdWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlF1YWxpZmllclZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUXVhbGlmaWVyVmFsdWUiPgotICAgICAgICA8Ym9keT5BIFF1YWxpZmllclZhbHVlIGlzIGFuIEVsZW1lbnQgdGhhdCBpcyB1c2VkIGFzIHBhcnQgb2YgTGlua0VuZERhdGEgdG8gcHJvdmlkZSB0aGUgdmFsdWUgZm9yIGEgc2luZ2xlIHF1YWxpZmllciBvZiB0aGUgZW5kIGdpdmVuIGJ5IHRoZSBMaW5rRW5kRGF0YS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJRdWFsaWZpZXJWYWx1ZS1tdWx0aXBsaWNpdHlfb2ZfcXVhbGlmaWVyIiBuYW1lPSJtdWx0aXBsaWNpdHlfb2ZfcXVhbGlmaWVyIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlF1YWxpZmllclZhbHVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlF1YWxpZmllclZhbHVlLW11bHRpcGxpY2l0eV9vZl9xdWFsaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJRdWFsaWZpZXJWYWx1ZS1tdWx0aXBsaWNpdHlfb2ZfcXVhbGlmaWVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIHRoZSB2YWx1ZSBJbnB1dFBpbiBpcyAxLi4xLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJRdWFsaWZpZXJWYWx1ZS1tdWx0aXBsaWNpdHlfb2ZfcXVhbGlmaWVyLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT52YWx1ZS5pcygxLDEpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJRdWFsaWZpZXJWYWx1ZS10eXBlX29mX3F1YWxpZmllciIgbmFtZT0idHlwZV9vZl9xdWFsaWZpZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iUXVhbGlmaWVyVmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUXVhbGlmaWVyVmFsdWUtdHlwZV9vZl9xdWFsaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJRdWFsaWZpZXJWYWx1ZS10eXBlX29mX3F1YWxpZmllciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHR5cGUgb2YgdGhlIHZhbHVlIElucHV0UGluIGNvbmZvcm1zIHRvIHRoZSB0eXBlIG9mIHRoZSBxdWFsaWZpZXIgUHJvcGVydHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlF1YWxpZmllclZhbHVlLXR5cGVfb2ZfcXVhbGlmaWVyLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT52YWx1ZS50eXBlLmNvbmZvcm1zVG8ocXVhbGlmaWVyLnR5cGUpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJRdWFsaWZpZXJWYWx1ZS1xdWFsaWZpZXJfYXR0cmlidXRlIiBuYW1lPSJxdWFsaWZpZXJfYXR0cmlidXRlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlF1YWxpZmllclZhbHVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlF1YWxpZmllclZhbHVlLXF1YWxpZmllcl9hdHRyaWJ1dGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJRdWFsaWZpZXJWYWx1ZS1xdWFsaWZpZXJfYXR0cmlidXRlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVhbGlmaWVyIG11c3QgYmUgYSBxdWFsaWZpZXIgb2YgdGhlIEFzc29jaWF0aW9uIGVuZCBvZiB0aGUgbGlua0VuZERhdGEgdGhhdCBvd25zIHRoaXMgUXVhbGlmaWVyVmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlF1YWxpZmllclZhbHVlLXF1YWxpZmllcl9hdHRyaWJ1dGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmxpbmtFbmREYXRhLmVuZC5xdWFsaWZpZXItPmluY2x1ZGVzKHF1YWxpZmllcik8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUXVhbGlmaWVyVmFsdWUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlF1YWxpZmllclZhbHVlLXF1YWxpZmllciIgbmFtZT0icXVhbGlmaWVyIiB0eXBlPSJQcm9wZXJ0eSIgYXNzb2NpYXRpb249IkFfcXVhbGlmaWVyX3F1YWxpZmllclZhbHVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlF1YWxpZmllclZhbHVlLXF1YWxpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlF1YWxpZmllclZhbHVlLXF1YWxpZmllciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1YWxpZmllciBQcm9wZXJ0eSBmb3Igd2hpY2ggdGhlIHZhbHVlIGlzIHRvIGJlIHNwZWNpZmllZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlF1YWxpZmllclZhbHVlLXZhbHVlIiBuYW1lPSJ2YWx1ZSIgdHlwZT0iSW5wdXRQaW4iIGFzc29jaWF0aW9uPSJBX3ZhbHVlX3F1YWxpZmllclZhbHVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlF1YWxpZmllclZhbHVlLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUXVhbGlmaWVyVmFsdWUtdmFsdWUiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbiBmcm9tIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgZm9yIHRoZSBxdWFsaWZpZXIgaXMgdGFrZW4uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlJhaXNlRXhjZXB0aW9uQWN0aW9uIiBuYW1lPSJSYWlzZUV4Y2VwdGlvbkFjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmFpc2VFeGNlcHRpb25BY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSYWlzZUV4Y2VwdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgUmFpc2VFeGNlcHRpb25BY3Rpb24gaXMgYW4gQWN0aW9uIHRoYXQgY2F1c2VzIGFuIGV4Y2VwdGlvbiB0byBvY2N1ci4gVGhlIGlucHV0IHZhbHVlIGJlY29tZXMgdGhlIGV4Y2VwdGlvbiBvYmplY3QuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJSYWlzZUV4Y2VwdGlvbkFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSYWlzZUV4Y2VwdGlvbkFjdGlvbi1leGNlcHRpb24iIG5hbWU9ImV4Y2VwdGlvbiIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX2V4Y2VwdGlvbl9yYWlzZUV4Y2VwdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSYWlzZUV4Y2VwdGlvbkFjdGlvbi1leGNlcHRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSYWlzZUV4Y2VwdGlvbkFjdGlvbi1leGNlcHRpb24iPgotICAgICAgICAgIDxib2R5PkFuIElucHV0UGluIHdob3NlIHZhbHVlIGJlY29tZXMgdGhlIGV4Y2VwdGlvbiBvYmplY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlJlYWRFeHRlbnRBY3Rpb24iIG5hbWU9IlJlYWRFeHRlbnRBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRFeHRlbnRBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkRXh0ZW50QWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBSZWFkRXh0ZW50QWN0aW9uIGlzIGFuIEFjdGlvbiB0aGF0IHJldHJpZXZlcyB0aGUgY3VycmVudCBpbnN0YW5jZXMgb2YgYSBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRFeHRlbnRBY3Rpb24tdHlwZV9pc19jbGFzc2lmaWVyIiBuYW1lPSJ0eXBlX2lzX2NsYXNzaWZpZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZEV4dGVudEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkRXh0ZW50QWN0aW9uLXR5cGVfaXNfY2xhc3NpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRFeHRlbnRBY3Rpb24tdHlwZV9pc19jbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBvZiB0aGUgcmVzdWx0IE91dHB1dFBpbiBpcyB0aGUgY2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZEV4dGVudEFjdGlvbi10eXBlX2lzX2NsYXNzaWZpZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlc3VsdC50eXBlID0gY2xhc3NpZmllcjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZEV4dGVudEFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfcmVzdWx0IiBuYW1lPSJtdWx0aXBsaWNpdHlfb2ZfcmVzdWx0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlYWRFeHRlbnRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZEV4dGVudEFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZEV4dGVudEFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfcmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIHRoZSByZXN1bHQgT3V0cHV0UGluIGlzIDAuLiouPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRFeHRlbnRBY3Rpb24tbXVsdGlwbGljaXR5X29mX3Jlc3VsdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVzdWx0LmlzKDAsKik8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUmVhZEV4dGVudEFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZWFkRXh0ZW50QWN0aW9uLWNsYXNzaWZpZXIiIG5hbWU9ImNsYXNzaWZpZXIiIHR5cGU9IkNsYXNzaWZpZXIiIGFzc29jaWF0aW9uPSJBX2NsYXNzaWZpZXJfcmVhZEV4dGVudEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkRXh0ZW50QWN0aW9uLWNsYXNzaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkRXh0ZW50QWN0aW9uLWNsYXNzaWZpZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBDbGFzc2lmaWVyIHdob3NlIGluc3RhbmNlcyBhcmUgdG8gYmUgcmV0cmlldmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVhZEV4dGVudEFjdGlvbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iT3V0cHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLW91dHB1dCIgYXNzb2NpYXRpb249IkFfcmVzdWx0X3JlYWRFeHRlbnRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZEV4dGVudEFjdGlvbi1yZXN1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkRXh0ZW50QWN0aW9uLXJlc3VsdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE91dHB1dFBpbiBvbiB3aGljaCB0aGUgQ2xhc3NpZmllciBpbnN0YW5jZXMgYXJlIHBsYWNlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiIgbmFtZT0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24iPgotICAgICAgICA8Ym9keT5BIFJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24gaXMgYW4gQWN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9iamVjdCBpcyBjbGFzc2lmaWVkIGJ5IGEgZ2l2ZW4gQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW5vX3R5cGUiIG5hbWU9Im5vX3R5cGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW5vX3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW5vX3R5cGUiPgotICAgICAgICAgIDxib2R5PlRoZSBvYmplY3QgSW5wdXRQaW4gaGFzIG5vIHR5cGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tbm9fdHlwZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LnR5cGUgPSBudWxsPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW11bHRpcGxpY2l0eV9vZl9vdXRwdXQiIG5hbWU9Im11bHRpcGxpY2l0eV9vZl9vdXRwdXQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW11bHRpcGxpY2l0eV9vZl9vdXRwdXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW11bHRpcGxpY2l0eV9vZl9vdXRwdXQiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJlc3VsdCBPdXRwdXRQaW4gaXMgMS4uMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1tdWx0aXBsaWNpdHlfb2Zfb3V0cHV0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5yZXN1bHQuaXMoMSwxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1ib29sZWFuX3Jlc3VsdCIgbmFtZT0iYm9vbGVhbl9yZXN1bHQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLWJvb2xlYW5fcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1ib29sZWFuX3Jlc3VsdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBPdXRwdXRQaW4gaXMgQm9vbGVhbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1ib29sZWFuX3Jlc3VsdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVzdWx0LnR5cGUgPSBCb29sZWFuPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW11bHRpcGxpY2l0eV9vZl9pbnB1dCIgbmFtZT0ibXVsdGlwbGljaXR5X29mX2lucHV0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfaW5wdXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW11bHRpcGxpY2l0eV9vZl9pbnB1dCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgb2JqZWN0IElucHV0UGluIGlzIDEuLjEuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tbXVsdGlwbGljaXR5X29mX2lucHV0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vYmplY3QuaXMoMSwxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tY2xhc3NpZmllciIgbmFtZT0iY2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfY2xhc3NpZmllcl9yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tY2xhc3NpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tY2xhc3NpZmllciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIENsYXNzaWZpZXIgYWdhaW5zdCB3aGljaCB0aGUgY2xhc3NpZmljYXRpb24gb2YgdGhlIGlucHV0IG9iamVjdCBpcyB0ZXN0ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLWlzRGlyZWN0IiBuYW1lPSJpc0RpcmVjdCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLWlzRGlyZWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1pc0RpcmVjdCI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGlucHV0IG9iamVjdCBtdXN0IGJlIGRpcmVjdGx5IGNsYXNzaWZpZWQgYnkgdGhlIGdpdmVuIENsYXNzaWZpZXIgb3Igd2hldGhlciBpdCBtYXkgYWxzbyBiZSBhbiBpbnN0YW5jZSBvZiBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZSBnaXZlbiBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24taXNEaXJlY3QtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tb2JqZWN0IiBuYW1lPSJvYmplY3QiIHR5cGU9IklucHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLWlucHV0IiBhc3NvY2lhdGlvbj0iQV9vYmplY3RfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW9iamVjdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tb2JqZWN0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgSW5wdXRQaW4gdGhhdCBob2xkcyB0aGUgb2JqZWN0IHdob3NlIGNsYXNzaWZpY2F0aW9uIGlzIHRvIGJlIHRlc3RlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9Ik91dHB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1vdXRwdXQiIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF9yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBPdXRwdXRQaW4gdGhhdCBob2xkcyB0aGUgQm9vbGVhbiByZXN1bHQgb2YgdGhlIHRlc3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlJlYWRMaW5rQWN0aW9uIiBuYW1lPSJSZWFkTGlua0FjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkTGlua0FjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgUmVhZExpbmtBY3Rpb24gaXMgYSBMaW5rQWN0aW9uIHRoYXQgbmF2aWdhdGVzIGFjcm9zcyBhbiBBc3NvY2lhdGlvbiB0byByZXRyaWV2ZSB0aGUgb2JqZWN0cyBvbiBvbmUgZW5kLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRMaW5rQWN0aW9uLXR5cGVfYW5kX29yZGVyaW5nIiBuYW1lPSJ0eXBlX2FuZF9vcmRlcmluZyIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkTGlua0FjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua0FjdGlvbi10eXBlX2FuZF9vcmRlcmluZy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRMaW5rQWN0aW9uLXR5cGVfYW5kX29yZGVyaW5nIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBhbmQgb3JkZXJpbmcgb2YgdGhlIHJlc3VsdCBPdXRwdXRQaW4gYXJlIHNhbWUgYXMgdGhlIHR5cGUgYW5kIG9yZGVyaW5nIG9mIHRoZSBvcGVuIEFzc29jaWF0aW9uIGVuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtBY3Rpb24tdHlwZV9hbmRfb3JkZXJpbmctX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnNlbGYub3BlbkVuZCgpLT5mb3JBbGwodHlwZT1yZXN1bHQudHlwZSBhbmQgaXNPcmRlcmVkPXJlc3VsdC5pc09yZGVyZWQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkTGlua0FjdGlvbi1jb21wYXRpYmxlX211bHRpcGxpY2l0eSIgbmFtZT0iY29tcGF0aWJsZV9tdWx0aXBsaWNpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZExpbmtBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtBY3Rpb24tY29tcGF0aWJsZV9tdWx0aXBsaWNpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkTGlua0FjdGlvbi1jb21wYXRpYmxlX211bHRpcGxpY2l0eSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgb3BlbiBBc3NvY2lhdGlvbiBlbmQgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcmVzdWx0IE91dHB1dFBpbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtBY3Rpb24tY29tcGF0aWJsZV9tdWx0aXBsaWNpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnNlbGYub3BlbkVuZCgpLT5maXJzdCgpLmNvbXBhdGlibGVXaXRoKHJlc3VsdCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRMaW5rQWN0aW9uLXZpc2liaWxpdHkiIG5hbWU9InZpc2liaWxpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZExpbmtBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtBY3Rpb24tdmlzaWJpbGl0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRMaW5rQWN0aW9uLXZpc2liaWxpdHkiPgotICAgICAgICAgIDxib2R5PlZpc2liaWxpdHkgb2YgdGhlIG9wZW4gZW5kIG11c3QgYWxsb3cgYWNjZXNzIGZyb20gdGhlIG9iamVjdCBwZXJmb3JtaW5nIHRoZSBhY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRMaW5rQWN0aW9uLXZpc2liaWxpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmxldCBvcGVuRW5kIDogUHJvcGVydHkgPSBzZWxmLm9wZW5FbmQoKS0+Zmlyc3QoKSBpbgotICBvcGVuRW5kLnZpc2liaWxpdHkgPSBWaXNpYmlsaXR5S2luZDo6cHVibGljIG9yIAotICBlbmREYXRhLT5leGlzdHMob2VkIHwgCi0gICAgb2VkLmVuZCZsdDs+b3BlbkVuZCBhbmQgCi0gICAgKF8nY29udGV4dCcgPSBvZWQuZW5kLnR5cGUgb3IgCi0gICAgICAob3BlbkVuZC52aXNpYmlsaXR5ID0gVmlzaWJpbGl0eUtpbmQ6OnByb3RlY3RlZCBhbmQgCi0gICAgICAgIF8nY29udGV4dCcuY29uZm9ybXNUbyhvZWQuZW5kLnR5cGUub2NsQXNUeXBlKENsYXNzaWZpZXIpKSkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZExpbmtBY3Rpb24tb25lX29wZW5fZW5kIiBuYW1lPSJvbmVfb3Blbl9lbmQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZExpbmtBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtBY3Rpb24tb25lX29wZW5fZW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtBY3Rpb24tb25lX29wZW5fZW5kIj4KLSAgICAgICAgICA8Ym9keT5FeGFjdGx5IG9uZSBsaW5rRW5kRGF0YSBzcGVjaWZpY2F0aW9uIChjb3JyZXNwb25kaW5nIHRvIHRoZSAmcXVvdDtvcGVuJnF1b3Q7IGVuZCkgbXVzdCBub3QgaGF2ZSBhbiB2YWx1ZSBJbnB1dFBpbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtBY3Rpb24tb25lX29wZW5fZW5kLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zZWxmLm9wZW5FbmQoKS0+c2l6ZSgpID0gMTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZExpbmtBY3Rpb24tbmF2aWdhYmxlX29wZW5fZW5kIiBuYW1lPSJuYXZpZ2FibGVfb3Blbl9lbmQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZExpbmtBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtBY3Rpb24tbmF2aWdhYmxlX29wZW5fZW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtBY3Rpb24tbmF2aWdhYmxlX29wZW5fZW5kIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb3BlbiBlbmQgbXVzdCBiZSBuYXZpZ2FibGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRMaW5rQWN0aW9uLW5hdmlnYWJsZV9vcGVuX2VuZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2VsZi5vcGVuRW5kKCktPmZpcnN0KCkuaXNOYXZpZ2FibGUoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJSZWFkTGlua0FjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTGlua0FjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVhZExpbmtBY3Rpb24tcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9Ik91dHB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1vdXRwdXQiIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF9yZWFkTGlua0FjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua0FjdGlvbi1yZXN1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkTGlua0FjdGlvbi1yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBPdXRwdXRQaW4gb24gd2hpY2ggdGhlIG9iamVjdHMgcmV0cmlldmVkIGZyb20gdGhlICZxdW90O29wZW4mcXVvdDsgZW5kIG9mIHRob3NlIGxpbmtzIHdob3NlIHZhbHVlcyBvbiBvdGhlciBlbmRzIGFyZSBnaXZlbiBieSB0aGUgZW5kRGF0YS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlJlYWRMaW5rQWN0aW9uLW9wZW5FbmQiIG5hbWU9Im9wZW5FbmQiIGJvZHlDb25kaXRpb249IlJlYWRMaW5rQWN0aW9uLW9wZW5FbmQtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua0FjdGlvbi1vcGVuRW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtBY3Rpb24tb3BlbkVuZCI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJucyB0aGUgZW5kcyBjb3JyZXNwb25kaW5nIHRvIGVuZERhdGEgd2l0aCBubyB2YWx1ZSBJbnB1dFBpbi4gKEEgd2VsbC1mb3JtZWQgUmVhZExpbmtBY3Rpb24gaXMgY29uc3RyYWluZWQgdG8gaGF2ZSBvbmx5IG9uZSBvZiB0aGVzZS4pPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRMaW5rQWN0aW9uLW9wZW5FbmQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkTGlua0FjdGlvbi1vcGVuRW5kIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtBY3Rpb24tb3BlbkVuZC1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGVuZERhdGEtPnNlbGVjdCh2YWx1ZT1udWxsKS5lbmQtPmFzT3JkZXJlZFNldCgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJSZWFkTGlua0FjdGlvbi1vcGVuRW5kLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQcm9wZXJ0eSIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJSZWFkTGlua0FjdGlvbi1vcGVuRW5kLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUmVhZExpbmtBY3Rpb24tb3BlbkVuZC1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbiIgbmFtZT0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24iPgotICAgICAgICA8Ym9keT5BIFJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIGlzIGFuIEFjdGlvbiB0aGF0IHJldHJpZXZlcyBhbiBlbmQgb2JqZWN0IGZyb20gYSBsaW5rIG9iamVjdC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi1wcm9wZXJ0eSIgbmFtZT0icHJvcGVydHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tcHJvcGVydHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi1wcm9wZXJ0eSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGVuZCBQcm9wZXJ0eSBtdXN0IGJlIGFuIEFzc29jaWF0aW9uIG1lbWJlckVuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tcHJvcGVydHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmVuZC5hc3NvY2lhdGlvbiAmbHQ7PiBudWxsPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi1tdWx0aXBsaWNpdHlfb2Zfb2JqZWN0IiBuYW1lPSJtdWx0aXBsaWNpdHlfb2Zfb2JqZWN0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9vYmplY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi1tdWx0aXBsaWNpdHlfb2Zfb2JqZWN0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIHRoZSBvYmplY3QgSW5wdXRQaW4gaXMgMS4uMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tbXVsdGlwbGljaXR5X29mX29iamVjdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LmlzKDEsMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLWVuZHNfb2ZfYXNzb2NpYXRpb24iIG5hbWU9ImVuZHNfb2ZfYXNzb2NpYXRpb24iIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tZW5kc19vZl9hc3NvY2lhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLWVuZHNfb2ZfYXNzb2NpYXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBlbmRzIG9mIHRoZSBhc3NvY2lhdGlvbiBtdXN0IG5vdCBiZSBzdGF0aWMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLWVuZHNfb2ZfYXNzb2NpYXRpb24tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmVuZC5hc3NvY2lhdGlvbi5tZW1iZXJFbmQtPmZvckFsbChlIHwgbm90IGUuaXNTdGF0aWMpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi10eXBlX29mX3Jlc3VsdCIgbmFtZT0idHlwZV9vZl9yZXN1bHQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tdHlwZV9vZl9yZXN1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi10eXBlX29mX3Jlc3VsdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBPdXRwdXRQaW4gaXMgdGhlIHNhbWUgYXMgdGhlIHR5cGUgb2YgdGhlIGVuZCBQcm9wZXJ0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tdHlwZV9vZl9yZXN1bHQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlc3VsdC50eXBlID0gZW5kLnR5cGU8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9yZXN1bHQiIG5hbWU9Im11bHRpcGxpY2l0eV9vZl9yZXN1bHQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tbXVsdGlwbGljaXR5X29mX3Jlc3VsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJlc3VsdCBPdXRwdXRQaW4gaXMgMS4uMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tbXVsdGlwbGljaXR5X29mX3Jlc3VsdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVzdWx0LmlzKDEsMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLXR5cGVfb2Zfb2JqZWN0IiBuYW1lPSJ0eXBlX29mX29iamVjdCIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi10eXBlX29mX29iamVjdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLXR5cGVfb2Zfb2JqZWN0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBvZiB0aGUgb2JqZWN0IElucHV0UGluIGlzIHRoZSBBc3NvY2lhdGlvbkNsYXNzIHRoYXQgb3ducyB0aGUgZW5kIFByb3BlcnR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi10eXBlX29mX29iamVjdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LnR5cGUgPSBlbmQuYXNzb2NpYXRpb248L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLWFzc29jaWF0aW9uX29mX2Fzc29jaWF0aW9uIiBuYW1lPSJhc3NvY2lhdGlvbl9vZl9hc3NvY2lhdGlvbiIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi1hc3NvY2lhdGlvbl9vZl9hc3NvY2lhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLWFzc29jaWF0aW9uX29mX2Fzc29jaWF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgYXNzb2NpYXRpb24gb2YgdGhlIGVuZCBtdXN0IGJlIGFuIEFzc29jaWF0aW9uQ2xhc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLWFzc29jaWF0aW9uX29mX2Fzc29jaWF0aW9uLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lbmQuYXNzb2NpYXRpb24ub2NsSXNLaW5kT2YoQXNzb2NpYXRpb25DbGFzcyk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tZW5kIiBuYW1lPSJlbmQiIHR5cGU9IlByb3BlcnR5IiBhc3NvY2lhdGlvbj0iQV9lbmRfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tZW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tZW5kIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQXNzb2NpYXRpb24gZW5kIHRvIGJlIHJlYWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi1vYmplY3QiIG5hbWU9Im9iamVjdCIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX29iamVjdF9yZWFkTGlua09iamVjdEVuZEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi1vYmplY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi1vYmplY3QiPgotICAgICAgICAgIDxib2R5PlRoZSBpbnB1dCBwaW4gZnJvbSB3aGljaCB0aGUgbGluayBvYmplY3QgaXMgb2J0YWluZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iT3V0cHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLW91dHB1dCIgYXNzb2NpYXRpb249IkFfcmVzdWx0X3JlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLXJlc3VsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLXJlc3VsdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE91dHB1dFBpbiB3aGVyZSB0aGUgcmVzdWx0IHZhbHVlIGlzIHBsYWNlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iIG5hbWU9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiBpcyBhbiBBY3Rpb24gdGhhdCByZXRyaWV2ZXMgYSBxdWFsaWZpZXIgZW5kIHZhbHVlIGZyb20gYSBsaW5rIG9iamVjdC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1tdWx0aXBsaWNpdHlfb2Zfb2JqZWN0IiBuYW1lPSJtdWx0aXBsaWNpdHlfb2Zfb2JqZWN0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9vYmplY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1tdWx0aXBsaWNpdHlfb2Zfb2JqZWN0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIHRoZSBvYmplY3QgSW5wdXRQaW4gaXMgMS4uMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tbXVsdGlwbGljaXR5X29mX29iamVjdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LmlzKDEsMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLXR5cGVfb2Zfb2JqZWN0IiBuYW1lPSJ0eXBlX29mX29iamVjdCIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi10eXBlX29mX29iamVjdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLXR5cGVfb2Zfb2JqZWN0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBvZiB0aGUgb2JqZWN0IElucHV0UGluIGlzIHRoZSBBc3NvY2lhdGlvbkNsYXNzIHRoYXQgb3ducyB0aGUgQXNzb2NpYXRpb24gZW5kIHRoYXQgaGFzIHRoZSBnaXZlbiBxdWFsaWZpZXIgUHJvcGVydHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLXR5cGVfb2Zfb2JqZWN0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vYmplY3QudHlwZSA9IHF1YWxpZmllci5hc3NvY2lhdGlvbkVuZC5hc3NvY2lhdGlvbjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tbXVsdGlwbGljaXR5X29mX3F1YWxpZmllciIgbmFtZT0ibXVsdGlwbGljaXR5X29mX3F1YWxpZmllciIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfcXVhbGlmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tbXVsdGlwbGljaXR5X29mX3F1YWxpZmllciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcXVhbGlmaWVyIFByb3BlcnR5IGlzIDEuLjEuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9xdWFsaWZpZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnF1YWxpZmllci5pcygxLDEpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1lbmRzX29mX2Fzc29jaWF0aW9uIiBuYW1lPSJlbmRzX29mX2Fzc29jaWF0aW9uIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLWVuZHNfb2ZfYXNzb2NpYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1lbmRzX29mX2Fzc29jaWF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZW5kcyBvZiB0aGUgQXNzb2NpYXRpb24gbXVzdCBub3QgYmUgc3RhdGljLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1lbmRzX29mX2Fzc29jaWF0aW9uLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5xdWFsaWZpZXIuYXNzb2NpYXRpb25FbmQuYXNzb2NpYXRpb24ubWVtYmVyRW5kLT5mb3JBbGwoZSB8IG5vdCBlLmlzU3RhdGljKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tbXVsdGlwbGljaXR5X29mX3Jlc3VsdCIgbmFtZT0ibXVsdGlwbGljaXR5X29mX3Jlc3VsdCIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tbXVsdGlwbGljaXR5X29mX3Jlc3VsdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcmVzdWx0IE91dHB1dFBpbiBpcyAxLi4xLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1tdWx0aXBsaWNpdHlfb2ZfcmVzdWx0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5yZXN1bHQuaXMoMSwxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tc2FtZV90eXBlIiBuYW1lPSJzYW1lX3R5cGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tc2FtZV90eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tc2FtZV90eXBlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBvZiB0aGUgcmVzdWx0IE91dHB1dFBpbiBpcyB0aGUgc2FtZSBhcyB0aGUgdHlwZSBvZiB0aGUgcXVhbGlmaWVyIFByb3BlcnR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1zYW1lX3R5cGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlc3VsdC50eXBlID0gcXVhbGlmaWVyLnR5cGU8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLWFzc29jaWF0aW9uX29mX2Fzc29jaWF0aW9uIiBuYW1lPSJhc3NvY2lhdGlvbl9vZl9hc3NvY2lhdGlvbiIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1hc3NvY2lhdGlvbl9vZl9hc3NvY2lhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLWFzc29jaWF0aW9uX29mX2Fzc29jaWF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgYXNzb2NpYXRpb24gb2YgdGhlIEFzc29jaWF0aW9uIGVuZCBvZiB0aGUgcXVhbGlmaWVyIFByb3BlcnR5IG11c3QgYmUgYW4gQXNzb2NpYXRpb25DbGFzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tYXNzb2NpYXRpb25fb2ZfYXNzb2NpYXRpb24tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnF1YWxpZmllci5hc3NvY2lhdGlvbkVuZC5hc3NvY2lhdGlvbi5vY2xJc0tpbmRPZihBc3NvY2lhdGlvbkNsYXNzKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcXVhbGlmaWVyX2F0dHJpYnV0ZSIgbmFtZT0icXVhbGlmaWVyX2F0dHJpYnV0ZSIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1xdWFsaWZpZXJfYXR0cmlidXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcXVhbGlmaWVyX2F0dHJpYnV0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1YWxpZmllciBQcm9wZXJ0eSBtdXN0IGJlIGEgcXVhbGlmaWVyIG9mIGFuIEFzc29jaWF0aW9uIGVuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcXVhbGlmaWVyX2F0dHJpYnV0ZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cXVhbGlmaWVyLmFzc29jaWF0aW9uRW5kICZsdDs+IG51bGw8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tb2JqZWN0IiBuYW1lPSJvYmplY3QiIHR5cGU9IklucHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLWlucHV0IiBhc3NvY2lhdGlvbj0iQV9vYmplY3RfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tb2JqZWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tb2JqZWN0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgSW5wdXRQaW4gZnJvbSB3aGljaCB0aGUgbGluayBvYmplY3QgaXMgb2J0YWluZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1xdWFsaWZpZXIiIG5hbWU9InF1YWxpZmllciIgdHlwZT0iUHJvcGVydHkiIGFzc29jaWF0aW9uPSJBX3F1YWxpZmllcl9yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1xdWFsaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1xdWFsaWZpZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWFsaWZpZXIgUHJvcGVydHkgdG8gYmUgcmVhZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJPdXRwdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24tb3V0cHV0IiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgT3V0cHV0UGluIHdoZXJlIHRoZSByZXN1bHQgdmFsdWUgaXMgcGxhY2VkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJSZWFkU2VsZkFjdGlvbiIgbmFtZT0iUmVhZFNlbGZBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRTZWxmQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZFNlbGZBY3Rpb24iPgotICAgICAgICA8Ym9keT5BIFJlYWRTZWxmQWN0aW9uIGlzIGFuIEFjdGlvbiB0aGF0IHJldHJpZXZlcyB0aGUgY29udGV4dCBvYmplY3Qgb2YgdGhlIEJlaGF2aW9yIGV4ZWN1dGlvbiB3aXRoaW4gd2hpY2ggdGhlIFJlYWRTZWxmQWN0aW9uIGV4ZWN1dGlvbiBpcyB0YWtpbmcgcGxhY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZFNlbGZBY3Rpb24tY29udGFpbmVkIiBuYW1lPSJjb250YWluZWQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZFNlbGZBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZFNlbGZBY3Rpb24tY29udGFpbmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZFNlbGZBY3Rpb24tY29udGFpbmVkIj4KLSAgICAgICAgICA8Ym9keT5BIFJlYWRTZWxmQWN0aW9uIG11c3QgaGF2ZSBhIGNvbnRleHQgQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZFNlbGZBY3Rpb24tY29udGFpbmVkLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5fJ2NvbnRleHQnICZsdDs+IG51bGw8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlYWRTZWxmQWN0aW9uLW11bHRpcGxpY2l0eSIgbmFtZT0ibXVsdGlwbGljaXR5IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlYWRTZWxmQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRTZWxmQWN0aW9uLW11bHRpcGxpY2l0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWRTZWxmQWN0aW9uLW11bHRpcGxpY2l0eSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgcmVzdWx0IE91dHB1dFBpbiBpcyAxLi4xLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWFkU2VsZkFjdGlvbi1tdWx0aXBsaWNpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlc3VsdC5pcygxLDEpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkU2VsZkFjdGlvbi1ub3Rfc3RhdGljIiBuYW1lPSJub3Rfc3RhdGljIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlYWRTZWxmQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRTZWxmQWN0aW9uLW5vdF9zdGF0aWMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkU2VsZkFjdGlvbi1ub3Rfc3RhdGljIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgUmVhZFNlbGZBY3Rpb24gaXMgY29udGFpbmVkIGluIGFuIEJlaGF2aW9yIHRoYXQgaXMgYWN0aW5nIGFzIGEgbWV0aG9kLCB0aGVuIHRoZSBPcGVyYXRpb24gb2YgdGhlIG1ldGhvZCBtdXN0IG5vdCBiZSBzdGF0aWMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRTZWxmQWN0aW9uLW5vdF9zdGF0aWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmxldCBiZWhhdmlvcjogQmVoYXZpb3IgPSBzZWxmLmNvbnRhaW5pbmdCZWhhdmlvcigpIGluJiN4RDsKLWJlaGF2aW9yLnNwZWNpZmljYXRpb24mbHQ7Pm51bGwgaW1wbGllcyBub3QgYmVoYXZpb3Iuc3BlY2lmaWNhdGlvbi5pc1N0YXRpYzwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZFNlbGZBY3Rpb24tdHlwZSIgbmFtZT0idHlwZSIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkU2VsZkFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkU2VsZkFjdGlvbi10eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZFNlbGZBY3Rpb24tdHlwZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBPdXRwdXRQaW4gaXMgdGhlIGNvbnRleHQgQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZFNlbGZBY3Rpb24tdHlwZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVzdWx0LnR5cGUgPSBfJ2NvbnRleHQnPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlJlYWRTZWxmQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlYWRTZWxmQWN0aW9uLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJPdXRwdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24tb3V0cHV0IiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfcmVhZFNlbGZBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZFNlbGZBY3Rpb24tcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZFNlbGZBY3Rpb24tcmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgT3V0cHV0UGluIG9uIHdoaWNoIHRoZSBjb250ZXh0IG9iamVjdCBpcyBwbGFjZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgbmFtZT0iUmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgICA8Ym9keT5BIFJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiBpcyBhIFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIHRoYXQgcmV0cmlldmVzIHRoZSB2YWx1ZXMgb2YgYSBTdHJ1Y3R1cmFsRmVhdHVyZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tbXVsdGlwbGljaXR5IiBuYW1lPSJtdWx0aXBsaWNpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1tdWx0aXBsaWNpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tbXVsdGlwbGljaXR5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIHRoZSBTdHJ1Y3R1cmFsRmVhdHVyZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByZXN1bHQgT3V0cHV0UGluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tbXVsdGlwbGljaXR5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zdHJ1Y3R1cmFsRmVhdHVyZS5jb21wYXRpYmxlV2l0aChyZXN1bHQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdHlwZV9hbmRfb3JkZXJpbmciIG5hbWU9InR5cGVfYW5kX29yZGVyaW5nIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdHlwZV9hbmRfb3JkZXJpbmctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdHlwZV9hbmRfb3JkZXJpbmciPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlIGFuZCBvcmRlcmluZyBvZiB0aGUgcmVzdWx0IE91dHB1dFBpbiBhcmUgdGhlIHNhbWUgYXMgdGhlIHR5cGUgYW5kIG9yZGVyaW5nIG9mIHRoZSBTdHJ1Y3R1cmFsRmVhdHVyZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXR5cGVfYW5kX29yZGVyaW5nLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5yZXN1bHQudHlwZSA9c3RydWN0dXJhbEZlYXR1cmUudHlwZSBhbmQgCi1yZXN1bHQuaXNPcmRlcmVkID0gc3RydWN0dXJhbEZlYXR1cmUuaXNPcmRlcmVkPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iT3V0cHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLW91dHB1dCIgYXNzb2NpYXRpb249IkFfcmVzdWx0X3JlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXJlc3VsdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE91dHB1dFBpbiBvbiB3aGljaCB0aGUgcmVzdWx0IHZhbHVlcyBhcmUgcGxhY2VkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJSZWFkVmFyaWFibGVBY3Rpb24iIG5hbWU9IlJlYWRWYXJpYWJsZUFjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZFZhcmlhYmxlQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZFZhcmlhYmxlQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBSZWFkVmFyaWFibGVBY3Rpb24gaXMgYSBWYXJpYWJsZUFjdGlvbiB0aGF0IHJldHJpZXZlcyB0aGUgdmFsdWVzIG9mIGEgVmFyaWFibGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZFZhcmlhYmxlQWN0aW9uLXR5cGVfYW5kX29yZGVyaW5nIiBuYW1lPSJ0eXBlX2FuZF9vcmRlcmluZyIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkVmFyaWFibGVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZFZhcmlhYmxlQWN0aW9uLXR5cGVfYW5kX29yZGVyaW5nLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZFZhcmlhYmxlQWN0aW9uLXR5cGVfYW5kX29yZGVyaW5nIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBhbmQgb3JkZXJpbmcgb2YgdGhlIHJlc3VsdCBPdXRwdXRQaW4gYXJlIHRoZSBzYW1lIGFzIHRoZSB0eXBlIGFuZCBvcmRlcmluZyBvZiB0aGUgdmFyaWFibGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlYWRWYXJpYWJsZUFjdGlvbi10eXBlX2FuZF9vcmRlcmluZy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVzdWx0LnR5cGUgPXZhcmlhYmxlLnR5cGUgYW5kIAotcmVzdWx0LmlzT3JkZXJlZCA9IHZhcmlhYmxlLmlzT3JkZXJlZDwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhZFZhcmlhYmxlQWN0aW9uLWNvbXBhdGlibGVfbXVsdGlwbGljaXR5IiBuYW1lPSJjb21wYXRpYmxlX211bHRpcGxpY2l0eSIgY29uc3RyYWluZWRFbGVtZW50PSJSZWFkVmFyaWFibGVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVhZFZhcmlhYmxlQWN0aW9uLWNvbXBhdGlibGVfbXVsdGlwbGljaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhZFZhcmlhYmxlQWN0aW9uLWNvbXBhdGlibGVfbXVsdGlwbGljaXR5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIHRoZSB2YXJpYWJsZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBvdXRwdXQgcGluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWFkVmFyaWFibGVBY3Rpb24tY29tcGF0aWJsZV9tdWx0aXBsaWNpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnZhcmlhYmxlLmNvbXBhdGlibGVXaXRoKHJlc3VsdCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUmVhZFZhcmlhYmxlQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJWYXJpYWJsZUFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVhZFZhcmlhYmxlQWN0aW9uLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJPdXRwdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24tb3V0cHV0IiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfcmVhZFZhcmlhYmxlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWRWYXJpYWJsZUFjdGlvbi1yZXN1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWFkVmFyaWFibGVBY3Rpb24tcmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgT3V0cHV0UGluIG9uIHdoaWNoIHRoZSByZXN1bHQgdmFsdWVzIGFyZSBwbGFjZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24iIG5hbWU9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIGlzIGFuIEFjdGlvbiB0aGF0IGNoYW5nZXMgdGhlIENsYXNzaWZpZXJzIHRoYXQgY2xhc3NpZnkgYW4gb2JqZWN0LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24taW5wdXRfcGluIiBuYW1lPSJpbnB1dF9waW4iIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVjbGFzc2lmeU9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLWlucHV0X3Bpbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24taW5wdXRfcGluIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb2JqZWN0IElucHV0UGluIGhhcyBubyB0eXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLWlucHV0X3Bpbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LnR5cGUgPSBudWxsPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLWNsYXNzaWZpZXJfbm90X2Fic3RyYWN0IiBuYW1lPSJjbGFzc2lmaWVyX25vdF9hYnN0cmFjdCIgY29uc3RyYWluZWRFbGVtZW50PSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tY2xhc3NpZmllcl9ub3RfYWJzdHJhY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLWNsYXNzaWZpZXJfbm90X2Fic3RyYWN0Ij4KLSAgICAgICAgICA8Ym9keT5Ob25lIG9mIHRoZSBuZXdDbGFzc2lmaWVycyBtYXkgYmUgYWJzdHJhY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tY2xhc3NpZmllcl9ub3RfYWJzdHJhY3QtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5vdCBuZXdDbGFzc2lmaWVyLT5leGlzdHMoaXNBYnN0cmFjdCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tbXVsdGlwbGljaXR5IiBuYW1lPSJtdWx0aXBsaWNpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVjbGFzc2lmeU9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLW11bHRpcGxpY2l0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tbXVsdGlwbGljaXR5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIHRoZSBvYmplY3QgSW5wdXRQaW4gaXMgMS4uMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVjbGFzc2lmeU9iamVjdEFjdGlvbi1tdWx0aXBsaWNpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm9iamVjdC5pcygxLDEpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVjbGFzc2lmeU9iamVjdEFjdGlvbi1pc1JlcGxhY2VBbGwiIG5hbWU9ImlzUmVwbGFjZUFsbCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLWlzUmVwbGFjZUFsbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24taXNSZXBsYWNlQWxsIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgd2hldGhlciBleGlzdGluZyBDbGFzc2lmaWVycyBzaG91bGQgYmUgcmVtb3ZlZCBiZWZvcmUgYWRkaW5nIHRoZSBuZXcgQ2xhc3NpZmllcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iUmVjbGFzc2lmeU9iamVjdEFjdGlvbi1pc1JlcGxhY2VBbGwtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tbmV3Q2xhc3NpZmllciIgbmFtZT0ibmV3Q2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfbmV3Q2xhc3NpZmllcl9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tbmV3Q2xhc3NpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tbmV3Q2xhc3NpZmllciI+Ci0gICAgICAgICAgPGJvZHk+QSBzZXQgb2YgQ2xhc3NpZmllcnMgdG8gYmUgYWRkZWQgdG8gdGhlIENsYXNzaWZpZXJzIG9mIHRoZSBnaXZlbiBvYmplY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLW5ld0NsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLW5ld0NsYXNzaWZpZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVjbGFzc2lmeU9iamVjdEFjdGlvbi1vYmplY3QiIG5hbWU9Im9iamVjdCIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX29iamVjdF9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tb2JqZWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVjbGFzc2lmeU9iamVjdEFjdGlvbi1vYmplY3QiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbiB0aGF0IGhvbGRzIHRoZSBvYmplY3QgdG8gYmUgcmVjbGFzc2lmaWVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVjbGFzc2lmeU9iamVjdEFjdGlvbi1vbGRDbGFzc2lmaWVyIiBuYW1lPSJvbGRDbGFzc2lmaWVyIiB0eXBlPSJDbGFzc2lmaWVyIiBhc3NvY2lhdGlvbj0iQV9vbGRDbGFzc2lmaWVyX3JlY2xhc3NpZnlPYmplY3RBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVjbGFzc2lmeU9iamVjdEFjdGlvbi1vbGRDbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVjbGFzc2lmeU9iamVjdEFjdGlvbi1vbGRDbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5BIHNldCBvZiBDbGFzc2lmaWVycyB0byBiZSByZW1vdmVkIGZyb20gdGhlIENsYXNzaWZpZXJzIG9mIHRoZSBnaXZlbiBvYmplY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLW9sZENsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLW9sZENsYXNzaWZpZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJSZWR1Y2VBY3Rpb24iIG5hbWU9IlJlZHVjZUFjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkdWNlQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVkdWNlQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBSZWR1Y2VBY3Rpb24gaXMgYW4gQWN0aW9uIHRoYXQgcmVkdWNlcyBhIGNvbGxlY3Rpb24gdG8gYSBzaW5nbGUgdmFsdWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBjb2xsZWN0aW9uIHVzaW5nIGEgcmVkdWNlciBCZWhhdmlvci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWR1Y2VBY3Rpb24tcmVkdWNlcl9pbnB1dHNfb3V0cHV0IiBuYW1lPSJyZWR1Y2VyX2lucHV0c19vdXRwdXQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVkdWNlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlZHVjZUFjdGlvbi1yZWR1Y2VyX2lucHV0c19vdXRwdXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWR1Y2VBY3Rpb24tcmVkdWNlcl9pbnB1dHNfb3V0cHV0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgcmVkdWNlciBCZWhhdmlvciBtdXN0IGhhdmUgdHdvIGlucHV0IG93bmVkUGFyYW1ldGVycyBhbmQgb25lIG91dHB1dCBvd25lZFBhcmFtZXRlciwgd2hlcmUgdGhlIHR5cGUgb2YgdGhlIG91dHB1dCBQYXJhbWV0ZXIgYW5kIHRoZSB0eXBlIG9mIGVsZW1lbnRzIG9mIHRoZSBpbnB1dCBjb2xsZWN0aW9uIGNvbmZvcm0gdG8gdGhlIHR5cGVzIG9mIHRoZSBpbnB1dCBQYXJhbWV0ZXJzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWR1Y2VBY3Rpb24tcmVkdWNlcl9pbnB1dHNfb3V0cHV0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5sZXQgaW5wdXRzOiBPcmRlcmVkU2V0KFBhcmFtZXRlcikgPSByZWR1Y2VyLmlucHV0UGFyYW1ldGVycygpIGluJiN4RDsKLWxldCBvdXRwdXRzOiBPcmRlcmVkU2V0KFBhcmFtZXRlcikgPSByZWR1Y2VyLm91dHB1dFBhcmFtZXRlcnMoKSBpbiYjeEQ7Ci1pbnB1dHMtPnNpemUoKT0yIGFuZCBvdXRwdXRzLT5zaXplKCk9MSBhbmQmI3hEOwotaW5wdXRzLnR5cGUtPmZvckFsbCh0IHwgJiN4RDsKLQlvdXRwdXRzLnR5cGUtPmZvckFsbChjb25mb3Jtc1RvKHQpKSBhbmQgJiN4RDsKLQktLSBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBvbmx5IGNoZWNrcyB0aGUgY2FzZSB3aGVuIHRoZSBjb2xsZWN0aW9uIGlzIHZpYSBtdWx0aXBsZSB0b2tlbnMuJiN4RDsKLQljb2xsZWN0aW9uLnVwcGVyQm91bmQoKT4xIGltcGxpZXMgY29sbGVjdGlvbi50eXBlLmNvbmZvcm1zVG8odCkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWR1Y2VBY3Rpb24taW5wdXRfdHlwZV9pc19jb2xsZWN0aW9uIiBuYW1lPSJpbnB1dF90eXBlX2lzX2NvbGxlY3Rpb24iIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVkdWNlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlZHVjZUFjdGlvbi1pbnB1dF90eXBlX2lzX2NvbGxlY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWR1Y2VBY3Rpb24taW5wdXRfdHlwZV9pc19jb2xsZWN0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiBJbnB1dFBpbiBtdXN0IGJlIGEgY29sbGVjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVkdWNlQWN0aW9uLWlucHV0X3R5cGVfaXNfY29sbGVjdGlvbi1fc3BlY2lmaWNhdGlvbiIgbGFuZ3VhZ2U9IiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVkdWNlQWN0aW9uLW91dHB1dF90eXBlc19hcmVfY29tcGF0aWJsZSIgbmFtZT0ib3V0cHV0X3R5cGVzX2FyZV9jb21wYXRpYmxlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZHVjZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWR1Y2VBY3Rpb24tb3V0cHV0X3R5cGVzX2FyZV9jb21wYXRpYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVkdWNlQWN0aW9uLW91dHB1dF90eXBlc19hcmVfY29tcGF0aWJsZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHR5cGUgb2YgdGhlIG91dHB1dCBvZiB0aGUgcmVkdWNlciBCZWhhdmlvciBtdXN0IGNvbmZvcm0gdG8gdGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBPdXRwdXRQaW4uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlZHVjZUFjdGlvbi1vdXRwdXRfdHlwZXNfYXJlX2NvbXBhdGlibGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlZHVjZXIub3V0cHV0UGFyYW1ldGVycygpLnR5cGUtPmZvckFsbChjb25mb3Jtc1RvKHJlc3VsdC50eXBlKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUmVkdWNlQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlZHVjZUFjdGlvbi1jb2xsZWN0aW9uIiBuYW1lPSJjb2xsZWN0aW9uIiB0eXBlPSJJbnB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1pbnB1dCIgYXNzb2NpYXRpb249IkFfY29sbGVjdGlvbl9yZWR1Y2VBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkdWNlQWN0aW9uLWNvbGxlY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWR1Y2VBY3Rpb24tY29sbGVjdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIElucHV0UGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvbGxlY3Rpb24gdG8gYmUgcmVkdWNlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlZHVjZUFjdGlvbi1pc09yZGVyZWQiIG5hbWU9ImlzT3JkZXJlZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWR1Y2VBY3Rpb24taXNPcmRlcmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVkdWNlQWN0aW9uLWlzT3JkZXJlZCI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9yZGVyIG9mIHRoZSBpbnB1dCBjb2xsZWN0aW9uIHNob3VsZCBkZXRlcm1pbmUgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSByZWR1Y2VyIEJlaGF2aW9yIGlzIGFwcGxpZWQgdG8gaXRzIGVsZW1lbnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IlJlZHVjZUFjdGlvbi1pc09yZGVyZWQtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlZHVjZUFjdGlvbi1yZWR1Y2VyIiBuYW1lPSJyZWR1Y2VyIiB0eXBlPSJCZWhhdmlvciIgYXNzb2NpYXRpb249IkFfcmVkdWNlcl9yZWR1Y2VBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkdWNlQWN0aW9uLXJlZHVjZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWR1Y2VBY3Rpb24tcmVkdWNlciI+Ci0gICAgICAgICAgPGJvZHk+QSBCZWhhdmlvciB0aGF0IGlzIHJlcHJlYXRlZGx5IGFwcGxpZWQgdG8gdHdvIGVsZW1lbnRzIG9mIHRoZSBpbnB1dCBjb2xsZWN0aW9uIHRvIHByb2R1Y2UgYSB2YWx1ZSB0aGF0IGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgZWxlbWVudHMgb2YgdGhlIGNvbGxlY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZWR1Y2VBY3Rpb24tcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9Ik91dHB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1vdXRwdXQiIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF9yZWR1Y2VBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkdWNlQWN0aW9uLXJlc3VsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZHVjZUFjdGlvbi1yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBvdXRwdXQgcGluIG9uIHdoaWNoIHRoZSByZXN1bHQgdmFsdWUgaXMgcGxhY2VkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJSZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiBuYW1lPSJSZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgUmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiBpcyBhIFdyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24gdGhhdCByZW1vdmVzIHZhbHVlcyBmcm9tIGEgU3RydWN0dXJhbEZlYXR1cmUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1yZW1vdmVBdF9hbmRfdmFsdWUiIG5hbWU9InJlbW92ZUF0X2FuZF92YWx1ZSIgY29uc3RyYWluZWRFbGVtZW50PSJSZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24tcmVtb3ZlQXRfYW5kX3ZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1yZW1vdmVBdF9hbmRfdmFsdWUiPgotICAgICAgICAgIDxib2R5PlJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25zIHJlbW92aW5nIGEgdmFsdWUgZnJvbSBvcmRlcmVkLCBub24tdW5pcXVlIFN0cnVjdHVyYWxGZWF0dXJlcyBtdXN0IGhhdmUgYSBzaW5nbGUgcmVtb3ZlQXQgSW5wdXRQaW4gYW5kIG5vIHZhbHVlIElucHV0UGluLCBpZiBpc1JlbW92ZUR1cGxpY2F0ZXMgaXMgZmFsc2UuIFRoZSByZW1vdmVBdCBJbnB1dFBpbiBtdXN0IGJlIG9mIHR5cGUgVW5saW1pdGVkIE5hdHVyYWwgd2l0aCBtdWx0aXBsaWNpdHkgMS4uMS4gT3RoZXJ3aXNlLCB0aGUgQWN0aW9uIGhhcyBhIHZhbHVlIElucHV0UGluIGFuZCBubyByZW1vdmVBdCBJbnB1dFBpbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1yZW1vdmVBdF9hbmRfdmFsdWUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlmIHN0cnVjdHVyYWxGZWF0dXJlLmlzT3JkZXJlZCBhbmQgbm90IHN0cnVjdHVyYWxGZWF0dXJlLmlzVW5pcXVlIGFuZCAgbm90IGlzUmVtb3ZlRHVwbGljYXRlcyB0aGVuJiN4RDsKLSAgdmFsdWUgPSBudWxsIGFuZCYjeEQ7Ci0gIHJlbW92ZUF0ICZsdDs+IG51bGwgYW5kJiN4RDsKLSAgcmVtb3ZlQXQudHlwZSA9IFVubGltaXRlZE5hdHVyYWwgYW5kJiN4RDsKLSAgcmVtb3ZlQXQuaXMoMSwxKSYjeEQ7Ci1lbHNlJiN4RDsKLSAgcmVtb3ZlQXQgPSBudWxsIGFuZCB2YWx1ZSAmbHQ7PiBudWxsJiN4RDsKLWVuZGlmPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24taXNSZW1vdmVEdXBsaWNhdGVzIiBuYW1lPSJpc1JlbW92ZUR1cGxpY2F0ZXMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1pc1JlbW92ZUR1cGxpY2F0ZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLWlzUmVtb3ZlRHVwbGljYXRlcyI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHdoZXRoZXIgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgb2YgdGhlIHZhbHVlIGluIG5vbnVuaXF1ZSBTdHJ1Y3R1cmFsRmVhdHVyZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iUmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1pc1JlbW92ZUR1cGxpY2F0ZXMtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24tcmVtb3ZlQXQiIG5hbWU9InJlbW92ZUF0IiB0eXBlPSJJbnB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1pbnB1dCIgYXNzb2NpYXRpb249IkFfcmVtb3ZlQXRfcmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLXJlbW92ZUF0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1yZW1vdmVBdCI+Ci0gICAgICAgICAgPGJvZHk+QW4gSW5wdXRQaW4gdGhhdCBwcm92aWRlcyB0aGUgcG9zaXRpb24gb2YgYW4gZXhpc3RpbmcgdmFsdWUgdG8gcmVtb3ZlIGluIG9yZGVyZWQsIG5vbnVuaXF1ZSBzdHJ1Y3R1cmFsIGZlYXR1cmVzLiBUaGUgdHlwZSBvZiB0aGUgcmVtb3ZlQXQgSW5wdXRQaW4gaXMgVW5saW1pdGVkTmF0dXJhbCwgYnV0IHRoZSB2YWx1ZSBjYW5ub3QgYmUgemVybyBvciB1bmxpbWl0ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJSZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLXJlbW92ZUF0LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJSZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uIiBuYW1lPSJSZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbiBpcyBhIFdyaXRlVmFyaWFibGVBY3Rpb24gdGhhdCByZW1vdmVzIHZhbHVlcyBmcm9tIGEgVmFyaWFibGVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24tcmVtb3ZlQXRfYW5kX3ZhbHVlIiBuYW1lPSJyZW1vdmVBdF9hbmRfdmFsdWUiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uLXJlbW92ZUF0X2FuZF92YWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24tcmVtb3ZlQXRfYW5kX3ZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5SZWFkVmFyaWFibGVBY3Rpb25zIHJlbW92aW5nIGEgdmFsdWUgZnJvbSBvcmRlcmVkLCBub24tdW5pcXVlIFZhcmlhYmxlcyBtdXN0IGhhdmUgYSBzaW5nbGUgcmVtb3ZlQXQgSW5wdXRQaW4gYW5kIG5vIHZhbHVlIElucHV0UGluLCBpZiBpc1JlbW92ZUR1cGxpY2F0ZXMgaXMgZmFsc2UuIFRoZSByZW1vdmVBdCBJbnB1dFBpbiBtdXN0IGJlIG9mIHR5cGUgVW5saW1pdGVkIE5hdHVyYWwgd2l0aCBtdWx0aXBsaWNpdHkgMS4uMS4gT3RoZXJ3aXNlLCB0aGUgQWN0aW9uIGhhcyBhIHZhbHVlIElucHV0UGluIGFuZCBubyByZW1vdmVBdCBJbnB1dFBpbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbi1yZW1vdmVBdF9hbmRfdmFsdWUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlmICB2YXJpYWJsZS5pc09yZGVyZWQgYW5kIG5vdCB2YXJpYWJsZS5pc1VuaXF1ZSBhbmQgbm90IGlzUmVtb3ZlRHVwbGljYXRlcyB0aGVuICYjeEQ7Ci0gIHZhbHVlID0gbnVsbCBhbmQmI3hEOwotICByZW1vdmVBdCAmbHQ7PiBudWxsIGFuZCYjeEQ7Ci0gIHJlbW92ZUF0LnR5cGUgPSBVbmxpbWl0ZWROYXR1cmFsIGFuZCYjeEQ7Ci0gIHJlbW92ZUF0LmlzKDEsMSkmI3hEOwotZWxzZSYjeEQ7Ci0gIHJlbW92ZUF0ID0gbnVsbCBhbmQgdmFsdWUgJmx0Oz4gbnVsbCYjeEQ7Ci1lbmRpZjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJSZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJXcml0ZVZhcmlhYmxlQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uLWlzUmVtb3ZlRHVwbGljYXRlcyIgbmFtZT0iaXNSZW1vdmVEdXBsaWNhdGVzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24taXNSZW1vdmVEdXBsaWNhdGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbi1pc1JlbW92ZUR1cGxpY2F0ZXMiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB3aGV0aGVyIHRvIHJlbW92ZSBkdXBsaWNhdGVzIG9mIHRoZSB2YWx1ZSBpbiBub251bmlxdWUgVmFyaWFibGVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IlJlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24taXNSZW1vdmVEdXBsaWNhdGVzLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uLXJlbW92ZUF0IiBuYW1lPSJyZW1vdmVBdCIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX3JlbW92ZUF0X3JlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbi1yZW1vdmVBdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24tcmVtb3ZlQXQiPgotICAgICAgICAgIDxib2R5PkFuIElucHV0UGluIHRoYXQgcHJvdmlkZXMgdGhlIHBvc2l0aW9uIG9mIGFuIGV4aXN0aW5nIHZhbHVlIHRvIHJlbW92ZSBpbiBvcmRlcmVkLCBub251bmlxdWUgVmFyaWFibGVzLiBUaGUgdHlwZSBvZiB0aGUgcmVtb3ZlQXQgSW5wdXRQaW4gaXMgVW5saW1pdGVkTmF0dXJhbCwgYnV0IHRoZSB2YWx1ZSBjYW5ub3QgYmUgemVybyBvciB1bmxpbWl0ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJSZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uLXJlbW92ZUF0LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJSZXBseUFjdGlvbiIgbmFtZT0iUmVwbHlBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlcGx5QWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVwbHlBY3Rpb24iPgotICAgICAgICA8Ym9keT5BIFJlcGx5QWN0aW9uIGlzIGFuIEFjdGlvbiB0aGF0IGFjY2VwdHMgYSBzZXQgb2YgcmVwbHkgdmFsdWVzIGFuZCBhIHZhbHVlIGNvbnRhaW5pbmcgcmV0dXJuIGluZm9ybWF0aW9uIHByb2R1Y2VkIGJ5IGEgcHJldmlvdXMgQWNjZXB0Q2FsbEFjdGlvbi4gVGhlIFJlcGx5QWN0aW9uIHJldHVybnMgdGhlIHZhbHVlcyB0byB0aGUgY2FsbGVyIG9mIHRoZSBwcmV2aW91cyBjYWxsLCBjb21wbGV0aW5nIGV4ZWN1dGlvbiBvZiB0aGUgY2FsbC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZXBseUFjdGlvbi1waW5zX21hdGNoX3BhcmFtZXRlciIgbmFtZT0icGluc19tYXRjaF9wYXJhbWV0ZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVwbHlBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVwbHlBY3Rpb24tcGluc19tYXRjaF9wYXJhbWV0ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZXBseUFjdGlvbi1waW5zX21hdGNoX3BhcmFtZXRlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHJlcGx5VmFsdWUgSW5wdXRQaW5zIG11c3QgbWF0Y2ggdGhlIG91dHB1dCAocmV0dXJuLCBvdXQsIGFuZCBpbm91dCkgcGFyYW1ldGVycyBvZiB0aGUgb3BlcmF0aW9uIG9mIHRoZSBldmVudCBvZiB0aGUgcmVwbHlUb0NhbGwgVHJpZ2dlciBpbiBudW1iZXIsIHR5cGUsIG9yZGVyaW5nLCBhbmQgbXVsdGlwbGljaXR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZXBseUFjdGlvbi1waW5zX21hdGNoX3BhcmFtZXRlci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bGV0IHBhcmFtZXRlcjpPcmRlcmVkU2V0KFBhcmFtZXRlcikgPSByZXBseVRvQ2FsbC5ldmVudC5vY2xBc1R5cGUoQ2FsbEV2ZW50KS5vcGVyYXRpb24ub3V0cHV0UGFyYW1ldGVycygpIGluJiN4RDsKLXJlcGx5VmFsdWUtPnNpemUoKT1wYXJhbWV0ZXItPnNpemUoKSBhbmQmI3hEOwotU2VxdWVuY2V7MS4ucmVwbHlWYWx1ZS0+c2l6ZSgpfS0+Zm9yQWxsKGkgfCYjeEQ7Ci0JcmVwbHlWYWx1ZS0+YXQoaSkudHlwZS5jb25mb3Jtc1RvKHBhcmFtZXRlci0+YXQoaSkudHlwZSkgYW5kJiN4RDsKLQlyZXBseVZhbHVlLT5hdChpKS5pc09yZGVyZWQ9cGFyYW1ldGVyLT5hdChpKS5pc09yZGVyZWQgYW5kJiN4RDsKLQlyZXBseVZhbHVlLT5hdChpKS5jb21wYXRpYmxlV2l0aChwYXJhbWV0ZXItPmF0KGkpKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlcGx5QWN0aW9uLWV2ZW50X29uX3JlcGx5X3RvX2NhbGxfdHJpZ2dlciIgbmFtZT0iZXZlbnRfb25fcmVwbHlfdG9fY2FsbF90cmlnZ2VyIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlcGx5QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlcGx5QWN0aW9uLWV2ZW50X29uX3JlcGx5X3RvX2NhbGxfdHJpZ2dlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlcGx5QWN0aW9uLWV2ZW50X29uX3JlcGx5X3RvX2NhbGxfdHJpZ2dlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGV2ZW50IG9mIHRoZSByZXBseVRvQ2FsbCBUcmlnZ2VyIG11c3QgYmUgYSBDYWxsRXZlbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlcGx5QWN0aW9uLWV2ZW50X29uX3JlcGx5X3RvX2NhbGxfdHJpZ2dlci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVwbHlUb0NhbGwuZXZlbnQub2NsSXNLaW5kT2YoQ2FsbEV2ZW50KTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJSZXBseUFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZXBseUFjdGlvbi1yZXBseVRvQ2FsbCIgbmFtZT0icmVwbHlUb0NhbGwiIHR5cGU9IlRyaWdnZXIiIGFzc29jaWF0aW9uPSJBX3JlcGx5VG9DYWxsX3JlcGx5QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlcGx5QWN0aW9uLXJlcGx5VG9DYWxsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVwbHlBY3Rpb24tcmVwbHlUb0NhbGwiPgotICAgICAgICAgIDxib2R5PlRoZSBUcmlnZ2VyIHNwZWNpZnlpbmcgdGhlIE9wZXJhdGlvbiB3aG9zZSBjYWxsIGlzIGJlaW5nIHJlcGxpZWQgdG8uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZXBseUFjdGlvbi1yZXBseVZhbHVlIiBuYW1lPSJyZXBseVZhbHVlIiB0eXBlPSJJbnB1dFBpbiIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLWlucHV0IiBhc3NvY2lhdGlvbj0iQV9yZXBseVZhbHVlX3JlcGx5QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlcGx5QWN0aW9uLXJlcGx5VmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZXBseUFjdGlvbi1yZXBseVZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5BIGxpc3Qgb2YgSW5wdXRQaW5zIHByb3ZpZGluZyB0aGUgdmFsdWVzIGZvciB0aGUgb3V0cHV0IChpbm91dCwgb3V0LCBhbmQgcmV0dXJuKSBQYXJhbWV0ZXJzIG9mIHRoZSBPcGVyYXRpb24uIFRoZXNlIHZhbHVlcyBhcmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlJlcGx5QWN0aW9uLXJlcGx5VmFsdWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJSZXBseUFjdGlvbi1yZXBseVZhbHVlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlcGx5QWN0aW9uLXJldHVybkluZm9ybWF0aW9uIiBuYW1lPSJyZXR1cm5JbmZvcm1hdGlvbiIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX3JldHVybkluZm9ybWF0aW9uX3JlcGx5QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlcGx5QWN0aW9uLXJldHVybkluZm9ybWF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVwbHlBY3Rpb24tcmV0dXJuSW5mb3JtYXRpb24iPgotICAgICAgICAgIDxib2R5PkFuIElucHV0UGluIHRoYXQgaG9sZHMgdGhlIHJldHVybiBpbmZvcm1hdGlvbiB2YWx1ZSBwcm9kdWNlZCBieSBhbiBlYXJsaWVyIEFjY2VwdENhbGxBY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlNlbmRPYmplY3RBY3Rpb24iIG5hbWU9IlNlbmRPYmplY3RBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNlbmRPYmplY3RBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTZW5kT2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBTZW5kT2JqZWN0QWN0aW9uIGlzIGFuIEludm9jYXRpb25BY3Rpb24gdGhhdCB0cmFuc21pdHMgYW4gaW5wdXQgb2JqZWN0IHRvIHRoZSB0YXJnZXQgb2JqZWN0LCB3aGljaCBpcyBoYW5kbGVkIGFzIGEgcmVxdWVzdCBtZXNzYWdlIGJ5IHRoZSB0YXJnZXQgb2JqZWN0LiBUaGUgcmVxdWVzdG9yIGNvbnRpbnVlcyBleGVjdXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG9iamVjdCBpcyBzZW50IG91dCBhbmQgY2Fubm90IHJlY2VpdmUgcmVwbHkgdmFsdWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlNlbmRPYmplY3RBY3Rpb24tdHlwZV90YXJnZXRfcGluIiBuYW1lPSJ0eXBlX3RhcmdldF9waW4iIGNvbnN0cmFpbmVkRWxlbWVudD0iU2VuZE9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTZW5kT2JqZWN0QWN0aW9uLXR5cGVfdGFyZ2V0X3Bpbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNlbmRPYmplY3RBY3Rpb24tdHlwZV90YXJnZXRfcGluIj4KLSAgICAgICAgICA8Ym9keT5JZiBvblBvcnQgaXMgbm90IGVtcHR5LCB0aGUgUG9ydCBnaXZlbiBieSBvblBvcnQgbXVzdCBiZSBhbiBvd25lZCBvciBpbmhlcml0ZWQgZmVhdHVyZSBvZiB0aGUgdHlwZSBvZiB0aGUgdGFyZ2V0IElucHV0UGluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTZW5kT2JqZWN0QWN0aW9uLXR5cGVfdGFyZ2V0X3Bpbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b25Qb3J0Jmx0Oz5udWxsIGltcGxpZXMgdGFyZ2V0LnR5cGUub2NsQXNUeXBlKENsYXNzaWZpZXIpLmFsbEZlYXR1cmVzKCktPmluY2x1ZGVzKG9uUG9ydCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU2VuZE9iamVjdEFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iSW52b2NhdGlvbkFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU2VuZE9iamVjdEFjdGlvbi1yZXF1ZXN0IiBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJJbnB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgcmVkZWZpbmVkUHJvcGVydHk9Ikludm9jYXRpb25BY3Rpb24tYXJndW1lbnQiIGFzc29jaWF0aW9uPSJBX3JlcXVlc3Rfc2VuZE9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTZW5kT2JqZWN0QWN0aW9uLXJlcXVlc3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTZW5kT2JqZWN0QWN0aW9uLXJlcXVlc3QiPgotICAgICAgICAgIDxib2R5PlRoZSByZXF1ZXN0IG9iamVjdCwgd2hpY2ggaXMgdHJhbnNtaXR0ZWQgdG8gdGhlIHRhcmdldCBvYmplY3QuIFRoZSBvYmplY3QgbWF5IGJlIGNvcGllZCBpbiB0cmFuc21pc3Npb24sIHNvIGlkZW50aXR5IG1pZ2h0IG5vdCBiZSBwcmVzZXJ2ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTZW5kT2JqZWN0QWN0aW9uLXRhcmdldCIgbmFtZT0idGFyZ2V0IiB0eXBlPSJJbnB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1pbnB1dCIgYXNzb2NpYXRpb249IkFfdGFyZ2V0X3NlbmRPYmplY3RBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2VuZE9iamVjdEFjdGlvbi10YXJnZXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTZW5kT2JqZWN0QWN0aW9uLXRhcmdldCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHRhcmdldCBvYmplY3QgdG8gd2hpY2ggdGhlIG9iamVjdCBpcyBzZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJTZW5kU2lnbmFsQWN0aW9uIiBuYW1lPSJTZW5kU2lnbmFsQWN0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTZW5kU2lnbmFsQWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU2VuZFNpZ25hbEFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgU2VuZFNpZ25hbEFjdGlvbiBpcyBhbiBJbnZvY2F0aW9uQWN0aW9uIHRoYXQgY3JlYXRlcyBhIFNpZ25hbCBpbnN0YW5jZSBhbmQgdHJhbnNtaXRzIGl0IHRvIHRoZSB0YXJnZXQgb2JqZWN0LiBWYWx1ZXMgZnJvbSB0aGUgYXJndW1lbnQgSW5wdXRQaW5zIGFyZSB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlcyBvZiB0aGUgU2lnbmFsLiBUaGUgcmVxdWVzdG9yIGNvbnRpbnVlcyBleGVjdXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIFNpZ25hbCBpbnN0YW5jZSBpcyBzZW50IG91dCBhbmQgY2Fubm90IHJlY2VpdmUgcmVwbHkgdmFsdWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlNlbmRTaWduYWxBY3Rpb24tdHlwZV9vcmRlcmluZ19tdWx0aXBsaWNpdHkiIG5hbWU9InR5cGVfb3JkZXJpbmdfbXVsdGlwbGljaXR5IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlNlbmRTaWduYWxBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2VuZFNpZ25hbEFjdGlvbi10eXBlX29yZGVyaW5nX211bHRpcGxpY2l0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNlbmRTaWduYWxBY3Rpb24tdHlwZV9vcmRlcmluZ19tdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlLCBvcmRlcmluZywgYW5kIG11bHRpcGxpY2l0eSBvZiBhbiBhcmd1bWVudCBJbnB1dFBpbiBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgc2lnbmFsLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTZW5kU2lnbmFsQWN0aW9uLXR5cGVfb3JkZXJpbmdfbXVsdGlwbGljaXR5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5sZXQgYXR0cmlidXRlOiBPcmRlcmVkU2V0KFByb3BlcnR5KSA9IHNpZ25hbC5hbGxBdHRyaWJ1dGVzKCkgaW4mI3hEOwotU2VxdWVuY2V7MS4uYXJndW1lbnQtPnNpemUoKX0tPmZvckFsbChpIHwgJiN4RDsKLQlhcmd1bWVudC0+YXQoaSkudHlwZS5jb25mb3Jtc1RvKGF0dHJpYnV0ZS0+YXQoaSkudHlwZSkgYW5kICYjeEQ7Ci0JYXJndW1lbnQtPmF0KGkpLmlzT3JkZXJlZCA9IGF0dHJpYnV0ZS0+YXQoaSkuaXNPcmRlcmVkIGFuZCYjeEQ7Ci0JYXJndW1lbnQtPmF0KGkpLmNvbXBhdGlibGVXaXRoKGF0dHJpYnV0ZS0+YXQoaSkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iU2VuZFNpZ25hbEFjdGlvbi1udW1iZXJfb3JkZXIiIG5hbWU9Im51bWJlcl9vcmRlciIgY29uc3RyYWluZWRFbGVtZW50PSJTZW5kU2lnbmFsQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNlbmRTaWduYWxBY3Rpb24tbnVtYmVyX29yZGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU2VuZFNpZ25hbEFjdGlvbi1udW1iZXJfb3JkZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBudW1iZXIgYW5kIG9yZGVyIG9mIGFyZ3VtZW50IElucHV0UGlucyBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgYW5kIG9yZGVyIG9mIGF0dHJpYnV0ZXMgb2YgdGhlIHNpZ25hbC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU2VuZFNpZ25hbEFjdGlvbi1udW1iZXJfb3JkZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmFyZ3VtZW50LT5zaXplKCk9c2lnbmFsLmFsbEF0dHJpYnV0ZXMoKS0+c2l6ZSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTZW5kU2lnbmFsQWN0aW9uLXR5cGVfdGFyZ2V0X3BpbiIgbmFtZT0idHlwZV90YXJnZXRfcGluIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlNlbmRTaWduYWxBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2VuZFNpZ25hbEFjdGlvbi10eXBlX3RhcmdldF9waW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTZW5kU2lnbmFsQWN0aW9uLXR5cGVfdGFyZ2V0X3BpbiI+Ci0gICAgICAgICAgPGJvZHk+SWYgb25Qb3J0IGlzIG5vdCBlbXB0eSwgdGhlIFBvcnQgZ2l2ZW4gYnkgb25Qb3J0IG11c3QgYmUgYW4gb3duZWQgb3IgaW5oZXJpdGVkIGZlYXR1cmUgb2YgdGhlIHR5cGUgb2YgdGhlIHRhcmdldCBJbnB1dFBpbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU2VuZFNpZ25hbEFjdGlvbi10eXBlX3RhcmdldF9waW4tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5vdCBvblBvcnQtPmlzRW1wdHkoKSBpbXBsaWVzIHRhcmdldC50eXBlLm9jbEFzVHlwZShDbGFzc2lmaWVyKS5hbGxGZWF0dXJlcygpLT5pbmNsdWRlcyhvblBvcnQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlNlbmRTaWduYWxBY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ikludm9jYXRpb25BY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlNlbmRTaWduYWxBY3Rpb24tc2lnbmFsIiBuYW1lPSJzaWduYWwiIHR5cGU9IlNpZ25hbCIgYXNzb2NpYXRpb249IkFfc2lnbmFsX3NlbmRTaWduYWxBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2VuZFNpZ25hbEFjdGlvbi1zaWduYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTZW5kU2lnbmFsQWN0aW9uLXNpZ25hbCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFNpZ25hbCB3aG9zZSBpbnN0YW5jZSBpcyB0cmFuc21pdHRlZCB0byB0aGUgdGFyZ2V0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU2VuZFNpZ25hbEFjdGlvbi10YXJnZXQiIG5hbWU9InRhcmdldCIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX3RhcmdldF9zZW5kU2lnbmFsQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNlbmRTaWduYWxBY3Rpb24tdGFyZ2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU2VuZFNpZ25hbEFjdGlvbi10YXJnZXQiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbiB0aGF0IHByb3ZpZGVzIHRoZSB0YXJnZXQgb2JqZWN0IHRvIHdoaWNoIHRoZSBTaWduYWwgaW5zdGFuY2UgaXMgc2VudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iU2VxdWVuY2VOb2RlIiBuYW1lPSJTZXF1ZW5jZU5vZGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNlcXVlbmNlTm9kZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNlcXVlbmNlTm9kZSI+Ci0gICAgICAgIDxib2R5PkEgU2VxdWVuY2VOb2RlIGlzIGEgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSB0aGF0IGV4ZWN1dGVzIGEgc2VxdWVuY2Ugb2YgRXhlY3V0YWJsZU5vZGVzIGluIG9yZGVyLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU2VxdWVuY2VOb2RlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTZXF1ZW5jZU5vZGUtZXhlY3V0YWJsZU5vZGUiIG5hbWU9ImV4ZWN1dGFibGVOb2RlIiB0eXBlPSJFeGVjdXRhYmxlTm9kZSIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiByZWRlZmluZWRQcm9wZXJ0eT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1ub2RlIiBhc3NvY2lhdGlvbj0iQV9leGVjdXRhYmxlTm9kZV9zZXF1ZW5jZU5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2VxdWVuY2VOb2RlLWV4ZWN1dGFibGVOb2RlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU2VxdWVuY2VOb2RlLWV4ZWN1dGFibGVOb2RlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb3JkZXJlZCBzZXQgb2YgRXhlY3V0YWJsZU5vZGVzIHRvIGJlIHNlcXVlbmNlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlNlcXVlbmNlTm9kZS1leGVjdXRhYmxlTm9kZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlNlcXVlbmNlTm9kZS1leGVjdXRhYmxlTm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uIiBuYW1lPSJTdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhcnRDbGFzc2lmaWVyQmVoYXZpb3JBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgU3RhcnRDbGFzc2lmaWVyQmVoYXZpb3JBY3Rpb24gaXMgYW4gQWN0aW9uIHRoYXQgc3RhcnRzIHRoZSBjbGFzc2lmaWVyQmVoYXZpb3Igb2YgdGhlIGlucHV0IG9iamVjdC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbi1tdWx0aXBsaWNpdHkiIG5hbWU9Im11bHRpcGxpY2l0eSIgY29uc3RyYWluZWRFbGVtZW50PSJTdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbi1tdWx0aXBsaWNpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbi1tdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIG9iamVjdCBJbnB1dFBpbiBpcyAxLi4xPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLW11bHRpcGxpY2l0eS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LmlzKDEsMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLXR5cGVfaGFzX2NsYXNzaWZpZXIiIG5hbWU9InR5cGVfaGFzX2NsYXNzaWZpZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhcnRDbGFzc2lmaWVyQmVoYXZpb3JBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhcnRDbGFzc2lmaWVyQmVoYXZpb3JBY3Rpb24tdHlwZV9oYXNfY2xhc3NpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLXR5cGVfaGFzX2NsYXNzaWZpZXIiPgotICAgICAgICAgIDxib2R5PklmIHRoZSBJbnB1dFBpbiBoYXMgYSB0eXBlLCB0aGVuIHRoZSB0eXBlIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzIG11c3QgaGF2ZSBhIGNsYXNzaWZpZXJCZWhhdmlvci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhcnRDbGFzc2lmaWVyQmVoYXZpb3JBY3Rpb24tdHlwZV9oYXNfY2xhc3NpZmllci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LnR5cGUtPm5vdEVtcHR5KCkgaW1wbGllcyAmI3hEOwotICAgKG9iamVjdC50eXBlLm9jbElzS2luZE9mKEJlaGF2aW9yZWRDbGFzc2lmaWVyKSBhbmQgb2JqZWN0LnR5cGUub2NsQXNUeXBlKEJlaGF2aW9yZWRDbGFzc2lmaWVyKS5jbGFzc2lmaWVyQmVoYXZpb3ImbHQ7Pm51bGwpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBY3Rpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLW9iamVjdCIgbmFtZT0ib2JqZWN0IiB0eXBlPSJJbnB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1pbnB1dCIgYXNzb2NpYXRpb249IkFfb2JqZWN0X3N0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLW9iamVjdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLW9iamVjdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIElucHV0UGluIHRoYXQgaG9sZHMgdGhlIG9iamVjdCB3aG9zZSBjbGFzc2lmaWVyQmVoYXZpb3IgaXMgdG8gYmUgc3RhcnRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbiIgbmFtZT0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24iPgotICAgICAgICA8Ym9keT5BIFN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24gaXMgYW4gSW52b2NhdGlvbkFjdGlvbiB0aGF0IHN0YXJ0cyB0aGUgZXhlY3V0aW9uIGVpdGhlciBvZiBhIGRpcmVjdGx5IGluc3RhbnRpYXRlZCBCZWhhdmlvciBvciBvZiB0aGUgY2xhc3NpZmllckJlaGF2aW9yIG9mIGFuIG9iamVjdC4gQXJndW1lbnQgdmFsdWVzIG1heSBiZSBzdXBwbGllZCBmb3IgdGhlIGlucHV0IFBhcmFtZXRlcnMgb2YgdGhlIEJlaGF2aW9yLiBJZiB0aGUgQmVoYXZpb3IgaXMgaW52b2tlZCBzeW5jaHJvbm91c2x5LCB0aGVuIG91dHB1dCB2YWx1ZXMgbWF5IGJlIG9idGFpbmVkIGZvciBvdXRwdXQgUGFyYW1ldGVycy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9vYmplY3QiIG5hbWU9Im11bHRpcGxpY2l0eV9vZl9vYmplY3QiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9vYmplY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW11bHRpcGxpY2l0eV9vZl9vYmplY3QiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIG9iamVjdCBJbnB1dFBpbiBtdXN0IGJlIDEuLjEuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24tbXVsdGlwbGljaXR5X29mX29iamVjdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LmlzKDEsMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24tdHlwZV9vZl9vYmplY3QiIG5hbWU9InR5cGVfb2Zfb2JqZWN0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi10eXBlX29mX29iamVjdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24tdHlwZV9vZl9vYmplY3QiPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlIG9mIHRoZSBvYmplY3QgSW5wdXRQaW4gbXVzdCBiZSBlaXRoZXIgYSBCZWhhdmlvciBvciBhIEJlaGF2aW9yZWRDbGFzc2lmaWVyIHdpdGggYSBjbGFzc2lmaWVyQmVoYXZpb3IuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24tdHlwZV9vZl9vYmplY3QtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnNlbGYuYmVoYXZpb3IoKSZsdDs+bnVsbDwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1ub19vbnBvcnQiIG5hbWU9Im5vX29ucG9ydCIgY29uc3RyYWluZWRFbGVtZW50PSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24tbm9fb25wb3J0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1ub19vbnBvcnQiPgotICAgICAgICAgIDxib2R5PkEgU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbiBtYXkgbm90IHNwZWNpZnkgb25Qb3J0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW5vX29ucG9ydC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b25Qb3J0LT5pc0VtcHR5KCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQ2FsbEFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1vYmplY3QiIG5hbWU9Im9iamVjdCIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX29iamVjdF9zdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24tb2JqZWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1vYmplY3QiPgotICAgICAgICAgIDxib2R5PkFuIElucHV0UGluIHRoYXQgaG9sZHMgdGhlIG9iamVjdCB0aGF0IGlzIGVpdGhlciBhIEJlaGF2aW9yIHRvIGJlIHN0YXJ0ZWQgb3IgaGFzIGEgY2xhc3NpZmllckJlaGF2aW9yIHRvIGJlIHN0YXJ0ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMiIG5hbWU9Im91dHB1dFBhcmFtZXRlcnMiIGJvZHlDb25kaXRpb249IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24tb3V0cHV0UGFyYW1ldGVycy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IkNhbGxBY3Rpb24tb3V0cHV0UGFyYW1ldGVycyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMiPgotICAgICAgICAgIDxib2R5PlJldHVybiB0aGUgaW5vdXQsIG91dCBhbmQgcmV0dXJuIG93bmVkUGFyYW1ldGVycyBvZiB0aGUgQmVoYXZpb3IgYmVpbmcgY2FsbGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChzZWxmLmJlaGF2aW9yKCkub3V0cHV0UGFyYW1ldGVycygpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlBhcmFtZXRlciIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW91dHB1dFBhcmFtZXRlcnMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24taW5wdXRQYXJhbWV0ZXJzIiBuYW1lPSJpbnB1dFBhcmFtZXRlcnMiIGJvZHlDb25kaXRpb249IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24taW5wdXRQYXJhbWV0ZXJzLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iQ2FsbEFjdGlvbi1pbnB1dFBhcmFtZXRlcnMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1pbnB1dFBhcmFtZXRlcnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLWlucHV0UGFyYW1ldGVycyI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJuIHRoZSBpbiBhbmQgaW5vdXQgb3duZWRQYXJhbWV0ZXJzIG9mIHRoZSBCZWhhdmlvciBiZWluZyBjYWxsZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24taW5wdXRQYXJhbWV0ZXJzLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1pbnB1dFBhcmFtZXRlcnMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLWlucHV0UGFyYW1ldGVycy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHNlbGYuYmVoYXZpb3IoKS5pbnB1dFBhcmFtZXRlcnMoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1pbnB1dFBhcmFtZXRlcnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlBhcmFtZXRlciIgaXNPcmRlcmVkPSJ0cnVlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLWlucHV0UGFyYW1ldGVycy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24taW5wdXRQYXJhbWV0ZXJzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLWJlaGF2aW9yIiBuYW1lPSJiZWhhdmlvciIgYm9keUNvbmRpdGlvbj0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1iZWhhdmlvci1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24tYmVoYXZpb3ItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLWJlaGF2aW9yIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IElucHV0UGluIGlzIGEgQmVoYXZpb3IsIHRoZW4gdGhhdCBCZWhhdmlvci4gT3RoZXJ3aXNlLCBpZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IElucHV0UGluIGlzIGEgQmVoYXZpb3JlZENsYXNzaWZpZXIsIHRoZW4gdGhlIGNsYXNzaWZpZXJCZWhhdmlvciBvZiB0aGF0IEJlaGF2aW9yZWRDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLWJlaGF2aW9yLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1iZWhhdmlvciI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24tYmVoYXZpb3Itc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBvYmplY3QudHlwZS5vY2xJc0tpbmRPZihCZWhhdmlvcikgdGhlbiYjeEQ7Ci0gIG9iamVjdC50eXBlLm9jbEFzVHlwZShCZWhhdmlvcikmI3hEOwotZWxzZSBpZiBvYmplY3QudHlwZS5vY2xJc0tpbmRPZihCZWhhdmlvcmVkQ2xhc3NpZmllcikgdGhlbiYjeEQ7Ci0gIG9iamVjdC50eXBlLm9jbEFzVHlwZShCZWhhdmlvcmVkQ2xhc3NpZmllcikuY2xhc3NpZmllckJlaGF2aW9yJiN4RDsKLWVsc2UmI3hEOwotICBudWxsJiN4RDsKLWVuZGlmJiN4RDsKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLWJlaGF2aW9yLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJCZWhhdmlvciIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1iZWhhdmlvci1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiBuYW1lPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiI+Ci0gICAgICAgIDxib2R5PlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBhbGwgQWN0aW9ucyB0aGF0IG9wZXJhdGUgb24gU3RydWN0dXJhbEZlYXR1cmVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW11bHRpcGxpY2l0eSIgbmFtZT0ibXVsdGlwbGljaXR5IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW11bHRpcGxpY2l0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW11bHRpcGxpY2l0eSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgb2JqZWN0IElucHV0UGluIG11c3QgYmUgMS4uMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tbXVsdGlwbGljaXR5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vYmplY3QuaXMoMSwxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tb2JqZWN0X3R5cGUiIG5hbWU9Im9iamVjdF90eXBlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW9iamVjdF90eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tb2JqZWN0X3R5cGUiPgotICAgICAgICAgIDxib2R5PlRoZSBzdHJ1Y3R1cmFsRmVhdHVyZSBtdXN0IGVpdGhlciBiZSBhbiBvd25lZCBvciBpbmhlcml0ZWQgZmVhdHVyZSBvZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IElucHV0UGluLCBvciBpdCBtdXN0IGJlIGFuIG93bmVkIGVuZCBvZiBhIGJpbmFyeSBBc3NvY2lhdGlvbiB3aG9zZSBvcHBvc2l0ZSBlbmQgaGFkIGFzIGEgdHlwZSB0byB3aGljaCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IElucHV0UGluIGNvbmZvcm1zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1vYmplY3RfdHlwZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LnR5cGUub2NsQXNUeXBlKENsYXNzaWZpZXIpLmFsbEZlYXR1cmVzKCktPmluY2x1ZGVzKHN0cnVjdHVyYWxGZWF0dXJlKSBvciYjeEQ7Ci0Jb2JqZWN0LnR5cGUuY29uZm9ybXNUbyhzdHJ1Y3R1cmFsRmVhdHVyZS5vY2xBc1R5cGUoUHJvcGVydHkpLm9wcG9zaXRlLnR5cGUpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi12aXNpYmlsaXR5IiBuYW1lPSJ2aXNpYmlsaXR5IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXZpc2liaWxpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi12aXNpYmlsaXR5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgdmlzaWJpbGl0eSBvZiB0aGUgc3RydWN0dXJhbEZlYXR1cmUgbXVzdCBhbGxvdyBhY2Nlc3MgZnJvbSB0aGUgb2JqZWN0IHBlcmZvcm1pbmcgdGhlIFJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tdmlzaWJpbGl0eS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c3RydWN0dXJhbEZlYXR1cmUudmlzaWJpbGl0eSA9IFZpc2liaWxpdHlLaW5kOjpwdWJsaWMgb3IKLV8nY29udGV4dCcuYWxsRmVhdHVyZXMoKS0+aW5jbHVkZXMoc3RydWN0dXJhbEZlYXR1cmUpIG9yCi1zdHJ1Y3R1cmFsRmVhdHVyZS52aXNpYmlsaXR5PVZpc2liaWxpdHlLaW5kOjpwcm90ZWN0ZWQgYW5kCi1fJ2NvbnRleHQnLmNvbmZvcm1zVG8oc3RydWN0dXJhbEZlYXR1cmUub2NsQXNUeXBlKFByb3BlcnR5KS5vcHBvc2l0ZS50eXBlLm9jbEFzVHlwZShDbGFzc2lmaWVyKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW5vdF9zdGF0aWMiIG5hbWU9Im5vdF9zdGF0aWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tbm90X3N0YXRpYy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW5vdF9zdGF0aWMiPgotICAgICAgICAgIDxib2R5PlRoZSBzdHJ1Y3R1cmFsRmVhdHVyZSBtdXN0IG5vdCBiZSBzdGF0aWMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW5vdF9zdGF0aWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5vdCBzdHJ1Y3R1cmFsRmVhdHVyZS5pc1N0YXRpYzwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tb25lX2ZlYXR1cmluZ19jbGFzc2lmaWVyIiBuYW1lPSJvbmVfZmVhdHVyaW5nX2NsYXNzaWZpZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tb25lX2ZlYXR1cmluZ19jbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tb25lX2ZlYXR1cmluZ19jbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgc3RydWN0dXJhbEZlYXR1cmUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGZlYXR1cmluZ0NsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLW9uZV9mZWF0dXJpbmdfY2xhc3NpZmllci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c3RydWN0dXJhbEZlYXR1cmUuZmVhdHVyaW5nQ2xhc3NpZmllci0+c2l6ZSgpID0gMTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1vYmplY3QiIG5hbWU9Im9iamVjdCIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX29iamVjdF9zdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1vYmplY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1vYmplY3QiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbiBmcm9tIHdoaWNoIHRoZSBvYmplY3Qgd2hvc2UgU3RydWN0dXJhbEZlYXR1cmUgaXMgdG8gYmUgcmVhZCBvciB3cml0dGVuIGlzIG9idGFpbmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tc3RydWN0dXJhbEZlYXR1cmUiIG5hbWU9InN0cnVjdHVyYWxGZWF0dXJlIiB0eXBlPSJTdHJ1Y3R1cmFsRmVhdHVyZSIgYXNzb2NpYXRpb249IkFfc3RydWN0dXJhbEZlYXR1cmVfc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tc3RydWN0dXJhbEZlYXR1cmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1zdHJ1Y3R1cmFsRmVhdHVyZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFN0cnVjdHVyYWxGZWF0dXJlIHRvIGJlIHJlYWQgb3Igd3JpdHRlbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiPgotICAgICAgICA8Ym9keT5BIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgaXMgYW4gQWN0aW9uIHRoYXQgaXMgYWxzbyBhbiBBY3Rpdml0eUdyb3VwIGFuZCB3aG9zZSBiZWhhdmlvciBpcyBzcGVjaWZpZWQgYnkgdGhlIEFjdGl2aXR5Tm9kZXMgYW5kIEFjdGl2aXR5RWRnZXMgaXQgc28gY29udGFpbnMuIFVubGlrZSBvdGhlciBraW5kcyBvZiBBY3Rpdml0eUdyb3VwLCBhIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgb3ducyB0aGUgQWN0aXZpdHlOb2RlcyBhbmQgQWN0aXZpdHlFZGdlcyBpdCBjb250YWlucywgYW5kIHNvIGEgbm9kZSBvciBlZGdlIGNhbiBvbmx5IGJlIGRpcmVjdGx5IGNvbnRhaW5lZCBpbiBvbmUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSwgdGhvdWdoIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVzIG1heSBiZSBuZXN0ZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1vdXRwdXRfcGluX2VkZ2VzIiBuYW1lPSJvdXRwdXRfcGluX2VkZ2VzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1vdXRwdXRfcGluX2VkZ2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1vdXRwdXRfcGluX2VkZ2VzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb3V0Z29pbmcgQWN0aXZpdHlFZGdlcyBvZiB0aGUgT3V0cHV0UGlucyBvZiBhIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgbXVzdCBoYXZlIHRhcmdldHMgdGhhdCBhcmUgbm90IHdpdGhpbiB0aGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1vdXRwdXRfcGluX2VkZ2VzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vdXRwdXQub3V0Z29pbmcudGFyZ2V0LT5leGNsdWRlc0FsbChhbGxPd25lZE5vZGVzKCktaW5wdXQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWVkZ2VzIiBuYW1lPSJlZGdlcyIgY29uc3RyYWluZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtZWRnZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWVkZ2VzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZWRnZXMgb2YgYSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGFyZSBhbGwgdGhlIEFjdGl2aXR5RWRnZXMgd2l0aCBzb3VyY2UgYW5kIHRhcmdldCBBY3Rpdml0eU5vZGVzIGNvbnRhaW5lZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHdpdGhpbiB0aGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IG5vdCBjb250YWluZWQgaW4gYW55IG1vcmUgZGVlcGx5IG5lc3RlZCBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWVkZ2VzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lZGdlPXNlbGYuc291cmNlTm9kZXMoKS5vdXRnb2luZy0+aW50ZXJzZWN0aW9uKHNlbGYuYWxsT3duZWROb2RlcygpLmluY29taW5nKS0+JiN4RDsKLQl1bmlvbihzZWxmLnRhcmdldE5vZGVzKCkuaW5jb21pbmctPmludGVyc2VjdGlvbihzZWxmLmFsbE93bmVkTm9kZXMoKS5vdXRnb2luZykpLT5hc1NldCgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWlucHV0X3Bpbl9lZGdlcyIgbmFtZT0iaW5wdXRfcGluX2VkZ2VzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1pbnB1dF9waW5fZWRnZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWlucHV0X3Bpbl9lZGdlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGluY29taW5nIEFjdGl2aXR5RWRnZXMgb2YgYW4gSW5wdXRQaW4gb2YgYSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIG11c3QgaGF2ZSBzb3VyY2VzIHRoYXQgYXJlIG5vdCB3aXRoaW4gdGhlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtaW5wdXRfcGluX2VkZ2VzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pbnB1dC5pbmNvbWluZy5zb3VyY2UtPmV4Y2x1ZGVzQWxsKGFsbE93bmVkTm9kZXMoKS1vdXRwdXQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik5hbWVzcGFjZSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iQWN0aXZpdHlHcm91cCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1fZ2VuZXJhbGl6YXRpb24uMiIgZ2VuZXJhbD0iQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWFjdGl2aXR5IiBuYW1lPSJhY3Rpdml0eSIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiB0eXBlPSJBY3Rpdml0eSIgaXNEZXJpdmVkPSJ0cnVlIiByZWRlZmluZWRQcm9wZXJ0eT0iQWN0aXZpdHlHcm91cC1pbkFjdGl2aXR5IEFjdGl2aXR5Tm9kZS1hY3Rpdml0eSIgYXNzb2NpYXRpb249IkFfYWN0aXZpdHlfc3RydWN0dXJlZE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1hY3Rpdml0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWN0aXZpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBBY3Rpdml0eSBpbW1lZGlhdGVseSBjb250YWluaW5nIHRoZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLCBpZiBpdCBpcyBub3QgY29udGFpbmVkIGluIGFub3RoZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWN0aXZpdHktX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWVkZ2UiIG5hbWU9ImVkZ2UiIHR5cGU9IkFjdGl2aXR5RWRnZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGl2aXR5R3JvdXAtY29udGFpbmVkRWRnZSBFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfZWRnZV9pblN0cnVjdHVyZWROb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtZWRnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtZWRnZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEFjdGl2aXR5RWRnZXMgaW1tZWRpYXRlbHkgY29udGFpbmVkIGluIHRoZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1lZGdlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1lZGdlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtbXVzdElzb2xhdGUiIG5hbWU9Im11c3RJc29sYXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtbXVzdElzb2xhdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLW11c3RJc29sYXRlIj4KLSAgICAgICAgICA8Ym9keT5JZiB0cnVlLCB0aGVuIGFueSBvYmplY3QgdXNlZCBieSBhbiBBY3Rpb24gd2l0aGluIHRoZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNhbm5vdCBiZSBhY2Nlc3NlZCBieSBhbnkgQWN0aW9uIG91dHNpZGUgdGhlIG5vZGUgdW50aWwgdGhlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgYXMgYSB3aG9sZSBjb21wbGV0ZXMuIEFueSBjb25jdXJyZW50IEFjdGlvbnMgdGhhdCB3b3VsZCByZXN1bHQgaW4gYWNjZXNzaW5nIHN1Y2ggb2JqZWN0cyBhcmUgcmVxdWlyZWQgdG8gaGF2ZSB0aGVpciBleGVjdXRpb24gZGVmZXJyZWQgdW50aWwgdGhlIGNvbXBsZXRpb24gb2YgdGhlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1tdXN0SXNvbGF0ZS1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1ub2RlIiBuYW1lPSJub2RlIiB0eXBlPSJBY3Rpdml0eU5vZGUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpdml0eUdyb3VwLWNvbnRhaW5lZE5vZGUgRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX25vZGVfaW5TdHJ1Y3R1cmVkTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLW5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLW5vZGUiPgotICAgICAgICAgIDxib2R5PlRoZSBBY3Rpdml0eU5vZGVzIGltbWVkaWF0ZWx5IGNvbnRhaW5lZCBpbiB0aGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtbm9kZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtbm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXN0cnVjdHVyZWROb2RlSW5wdXQiIG5hbWU9InN0cnVjdHVyZWROb2RlSW5wdXQiIHR5cGU9IklucHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLWlucHV0IiBhc3NvY2lhdGlvbj0iQV9zdHJ1Y3R1cmVkTm9kZUlucHV0X3N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkTm9kZUlucHV0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkTm9kZUlucHV0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgSW5wdXRQaW5zIG93bmVkIGJ5IHRoZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkTm9kZUlucHV0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkTm9kZUlucHV0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc3RydWN0dXJlZE5vZGVPdXRwdXQiIG5hbWU9InN0cnVjdHVyZWROb2RlT3V0cHV0IiB0eXBlPSJPdXRwdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24tb3V0cHV0IiBhc3NvY2lhdGlvbj0iQV9zdHJ1Y3R1cmVkTm9kZU91dHB1dF9zdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc3RydWN0dXJlZE5vZGVPdXRwdXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXN0cnVjdHVyZWROb2RlT3V0cHV0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgT3V0cHV0UGlucyBvd25lZCBieSB0aGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc3RydWN0dXJlZE5vZGVPdXRwdXQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXN0cnVjdHVyZWROb2RlT3V0cHV0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtdmFyaWFibGUiIG5hbWU9InZhcmlhYmxlIiB0eXBlPSJWYXJpYWJsZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfdmFyaWFibGVfc2NvcGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS12YXJpYWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtdmFyaWFibGUiPgotICAgICAgICAgIDxib2R5PlRoZSBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgc2NvcGUgb2YgdGhlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXZhcmlhYmxlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS12YXJpYWJsZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWFsbEFjdGlvbnMiIG5hbWU9ImFsbEFjdGlvbnMiIGJvZHlDb25kaXRpb249IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsQWN0aW9ucy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IkFjdGlvbi1hbGxBY3Rpb25zIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsQWN0aW9ucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsQWN0aW9ucyI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJucyB0aGlzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgYW5kIGFsbCBBY3Rpb25zIGNvbnRhaW5lZCBpbiBpdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1hbGxBY3Rpb25zLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1hbGxBY3Rpb25zIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1hbGxBY3Rpb25zLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobm9kZS0+c2VsZWN0KG9jbElzS2luZE9mKEFjdGlvbikpLm9jbEFzVHlwZShBY3Rpb24pLmFsbEFjdGlvbnMoKS0+aW5jbHVkaW5nKHNlbGYpLT5hc1NldCgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWFsbEFjdGlvbnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkFjdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1hbGxBY3Rpb25zLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1hbGxBY3Rpb25zLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWFsbE93bmVkTm9kZXMiIG5hbWU9ImFsbE93bmVkTm9kZXMiIGJvZHlDb25kaXRpb249IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsT3duZWROb2Rlcy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IkFjdGlvbi1hbGxPd25lZE5vZGVzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsT3duZWROb2Rlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsT3duZWROb2RlcyI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJucyBhbGwgdGhlIEFjdGl2aXR5Tm9kZXMgY29udGFpbmVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgd2l0aGluIHRoaXMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSwgaW4gYWRkaXRpb24gdG8gdGhlIFBpbnMgb2YgdGhlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsT3duZWROb2Rlcy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsT3duZWROb2RlcyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsT3duZWROb2Rlcy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHNlbGYuQWN0aW9uOjphbGxPd25lZE5vZGVzKCktPnVuaW9uKG5vZGUpLT51bmlvbihub2RlLT5zZWxlY3Qob2NsSXNLaW5kT2YoQWN0aW9uKSkub2NsQXNUeXBlKEFjdGlvbikuYWxsT3duZWROb2RlcygpKS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1hbGxPd25lZE5vZGVzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJBY3Rpdml0eU5vZGUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsT3duZWROb2Rlcy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtYWxsT3duZWROb2Rlcy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zb3VyY2VOb2RlcyIgbmFtZT0ic291cmNlTm9kZXMiIGJvZHlDb25kaXRpb249IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc291cmNlTm9kZXMtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXNvdXJjZU5vZGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zb3VyY2VOb2RlcyI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJuIHRob3NlIEFjdGl2aXR5Tm9kZXMgY29udGFpbmVkIGltbWVkaWF0ZWx5IHdpdGhpbiB0aGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSB0aGF0IG1heSBhY3QgYXMgc291cmNlcyBvZiBlZGdlcyBvd25lZCBieSB0aGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zb3VyY2VOb2Rlcy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc291cmNlTm9kZXMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXNvdXJjZU5vZGVzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobm9kZS0+dW5pb24oaW5wdXQub2NsQXNUeXBlKEFjdGl2aXR5Tm9kZSktPmFzU2V0KCkpLT4mI3hEOwotICB1bmlvbihub2RlLT5zZWxlY3Qob2NsSXNLaW5kT2YoQWN0aW9uKSkub2NsQXNUeXBlKEFjdGlvbikub3V0cHV0KS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zb3VyY2VOb2Rlcy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iQWN0aXZpdHlOb2RlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXNvdXJjZU5vZGVzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zb3VyY2VOb2Rlcy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS10YXJnZXROb2RlcyIgbmFtZT0idGFyZ2V0Tm9kZXMiIGJvZHlDb25kaXRpb249IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtdGFyZ2V0Tm9kZXMtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXRhcmdldE5vZGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS10YXJnZXROb2RlcyI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJuIHRob3NlIEFjdGl2aXR5Tm9kZXMgY29udGFpbmVkIGltbWVkaWF0ZWx5IHdpdGhpbiB0aGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSB0aGF0IG1heSBhY3QgYXMgdGFyZ2V0cyBvZiBlZGdlcyBvd25lZCBieSB0aGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS10YXJnZXROb2Rlcy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtdGFyZ2V0Tm9kZXMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXRhcmdldE5vZGVzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobm9kZS0+dW5pb24ob3V0cHV0Lm9jbEFzVHlwZShBY3Rpdml0eU5vZGUpLT5hc1NldCgpKS0+JiN4RDsKLSAgdW5pb24obm9kZS0+c2VsZWN0KG9jbElzS2luZE9mKEFjdGlvbikpLm9jbEFzVHlwZShBY3Rpb24pLmlucHV0KS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS10YXJnZXROb2Rlcy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iQWN0aXZpdHlOb2RlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXRhcmdldE5vZGVzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS10YXJnZXROb2Rlcy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1jb250YWluaW5nQWN0aXZpdHkiIG5hbWU9ImNvbnRhaW5pbmdBY3Rpdml0eSIgYm9keUNvbmRpdGlvbj0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1jb250YWluaW5nQWN0aXZpdHktc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJBY3Rpdml0eUdyb3VwLWNvbnRhaW5pbmdBY3Rpdml0eSBBY3Rpdml0eU5vZGUtY29udGFpbmluZ0FjdGl2aXR5IEFjdGl2aXR5Q29udGVudC1jb250YWluaW5nQWN0aXZpdHkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1jb250YWluaW5nQWN0aXZpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWNvbnRhaW5pbmdBY3Rpdml0eSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEFjdGl2aXR5IHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjb250YWlucyB0aGlzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgKGNvbnNpZGVyZWQgYXMgYW4gQWN0aW9uKS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1jb250YWluaW5nQWN0aXZpdHktc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWNvbnRhaW5pbmdBY3Rpdml0eSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtY29udGFpbmluZ0FjdGl2aXR5LXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc2VsZi5BY3Rpb246OmNvbnRhaW5pbmdBY3Rpdml0eSgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLWNvbnRhaW5pbmdBY3Rpdml0eS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iQWN0aXZpdHkiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUtY29udGFpbmluZ0FjdGl2aXR5LXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVGVzdElkZW50aXR5QWN0aW9uIiBuYW1lPSJUZXN0SWRlbnRpdHlBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRlc3RJZGVudGl0eUFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlc3RJZGVudGl0eUFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgVGVzdElkZW50aXR5QWN0aW9uIGlzIGFuIEFjdGlvbiB0aGF0IHRlc3RzIGlmIHR3byB2YWx1ZXMgYXJlIGlkZW50aWNhbCBvYmplY3RzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRlc3RJZGVudGl0eUFjdGlvbi1tdWx0aXBsaWNpdHkiIG5hbWU9Im11bHRpcGxpY2l0eSIgY29uc3RyYWluZWRFbGVtZW50PSJUZXN0SWRlbnRpdHlBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVzdElkZW50aXR5QWN0aW9uLW11bHRpcGxpY2l0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlc3RJZGVudGl0eUFjdGlvbi1tdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIElucHV0UGlucyBpcyAxLi4xLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUZXN0SWRlbnRpdHlBY3Rpb24tbXVsdGlwbGljaXR5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5maXJzdC5pcygxLDEpIGFuZCBzZWNvbmQuaXMoMSwxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVGVzdElkZW50aXR5QWN0aW9uLW5vX3R5cGUiIG5hbWU9Im5vX3R5cGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iVGVzdElkZW50aXR5QWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRlc3RJZGVudGl0eUFjdGlvbi1ub190eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVzdElkZW50aXR5QWN0aW9uLW5vX3R5cGUiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbnMgaGF2ZSBubyB0eXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUZXN0SWRlbnRpdHlBY3Rpb24tbm9fdHlwZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+Zmlyc3QudHlwZT0gbnVsbCBhbmQgc2Vjb25kLnR5cGUgPSBudWxsPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJUZXN0SWRlbnRpdHlBY3Rpb24tcmVzdWx0X2lzX2Jvb2xlYW4iIG5hbWU9InJlc3VsdF9pc19ib29sZWFuIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlRlc3RJZGVudGl0eUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZXN0SWRlbnRpdHlBY3Rpb24tcmVzdWx0X2lzX2Jvb2xlYW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUZXN0SWRlbnRpdHlBY3Rpb24tcmVzdWx0X2lzX2Jvb2xlYW4iPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlIG9mIHRoZSByZXN1bHQgT3V0cHV0UGluIGlzIEJvb2xlYW4uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRlc3RJZGVudGl0eUFjdGlvbi1yZXN1bHRfaXNfYm9vbGVhbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVzdWx0LnR5cGU9Qm9vbGVhbjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJUZXN0SWRlbnRpdHlBY3Rpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVGVzdElkZW50aXR5QWN0aW9uLWZpcnN0IiBuYW1lPSJmaXJzdCIgdHlwZT0iSW5wdXRQaW4iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpb24taW5wdXQiIGFzc29jaWF0aW9uPSJBX2ZpcnN0X3Rlc3RJZGVudGl0eUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZXN0SWRlbnRpdHlBY3Rpb24tZmlyc3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUZXN0SWRlbnRpdHlBY3Rpb24tZmlyc3QiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnB1dFBpbiBvbiB3aGljaCB0aGUgZmlyc3QgaW5wdXQgb2JqZWN0IGlzIHBsYWNlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRlc3RJZGVudGl0eUFjdGlvbi1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iT3V0cHV0UGluIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aW9uLW91dHB1dCIgYXNzb2NpYXRpb249IkFfcmVzdWx0X3Rlc3RJZGVudGl0eUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZXN0SWRlbnRpdHlBY3Rpb24tcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVzdElkZW50aXR5QWN0aW9uLXJlc3VsdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE91dHB1dFBpbiB3aG9zZSBCb29sZWFuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoZSB0d28gaW5wdXQgb2JqZWN0cyBhcmUgaWRlbnRpY2FsLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVGVzdElkZW50aXR5QWN0aW9uLXNlY29uZCIgbmFtZT0ic2Vjb25kIiB0eXBlPSJJbnB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1pbnB1dCIgYXNzb2NpYXRpb249IkFfc2Vjb25kX3Rlc3RJZGVudGl0eUFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZXN0SWRlbnRpdHlBY3Rpb24tc2Vjb25kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVzdElkZW50aXR5QWN0aW9uLXNlY29uZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE91dHB1dFBpbiBvbiB3aGljaCB0aGUgc2Vjb25kIGlucHV0IG9iamVjdCBpcyBwbGFjZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlVubWFyc2hhbGxBY3Rpb24iIG5hbWU9IlVubWFyc2hhbGxBY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlVubWFyc2hhbGxBY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJVbm1hcnNoYWxsQWN0aW9uIj4KLSAgICAgICAgPGJvZHk+QW4gVW5tYXJzaGFsbEFjdGlvbiBpcyBhbiBBY3Rpb24gdGhhdCByZXRyaWV2ZXMgdGhlIHZhbHVlcyBvZiB0aGUgU3RydWN0dXJhbEZlYXR1cmVzIG9mIGFuIG9iamVjdCBhbmQgcGxhY2VzIHRoZW0gb24gT3V0cHV0UGlucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLXN0cnVjdHVyYWxfZmVhdHVyZSIgbmFtZT0ic3RydWN0dXJhbF9mZWF0dXJlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlVubWFyc2hhbGxBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVW5tYXJzaGFsbEFjdGlvbi1zdHJ1Y3R1cmFsX2ZlYXR1cmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJVbm1hcnNoYWxsQWN0aW9uLXN0cnVjdHVyYWxfZmVhdHVyZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHVubWFyc2hhbGxUeXBlIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgU3RydWN0dXJhbEZlYXR1cmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlVubWFyc2hhbGxBY3Rpb24tc3RydWN0dXJhbF9mZWF0dXJlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT51bm1hcnNoYWxsVHlwZS5hbGxBdHRyaWJ1dGVzKCktPnNpemUoKSA+PSAxPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLW51bWJlcl9vZl9yZXN1bHQiIG5hbWU9Im51bWJlcl9vZl9yZXN1bHQiIGNvbnN0cmFpbmVkRWxlbWVudD0iVW5tYXJzaGFsbEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLW51bWJlcl9vZl9yZXN1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJVbm1hcnNoYWxsQWN0aW9uLW51bWJlcl9vZl9yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBudW1iZXIgb2YgcmVzdWx0IG91dHB1dFBpbnMgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgb2YgdGhlIHVubWFyc2hhbGxUeXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLW51bWJlcl9vZl9yZXN1bHQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnVubWFyc2hhbGxUeXBlLmFsbEF0dHJpYnV0ZXMoKS0+c2l6ZSgpID0gcmVzdWx0LT5zaXplKCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlVubWFyc2hhbGxBY3Rpb24tdHlwZV9vcmRlcmluZ19hbmRfbXVsdGlwbGljaXR5IiBuYW1lPSJ0eXBlX29yZGVyaW5nX2FuZF9tdWx0aXBsaWNpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iVW5tYXJzaGFsbEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLXR5cGVfb3JkZXJpbmdfYW5kX211bHRpcGxpY2l0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlVubWFyc2hhbGxBY3Rpb24tdHlwZV9vcmRlcmluZ19hbmRfbXVsdGlwbGljaXR5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgdHlwZSwgb3JkZXJpbmcgYW5kIG11bHRpcGxpY2l0eSBvZiBlYWNoIGF0dHJpYnV0ZSBvZiB0aGUgdW5tYXJzaGFsbFR5cGUgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUsIG9yZGVyaW5nIGFuZCBtdWx0aXBsaWNpdHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcmVzdWx0IE91dHB1dFBpbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVW5tYXJzaGFsbEFjdGlvbi10eXBlX29yZGVyaW5nX2FuZF9tdWx0aXBsaWNpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmxldCBhdHRyaWJ1dGU6T3JkZXJlZFNldChQcm9wZXJ0eSkgPSB1bm1hcnNoYWxsVHlwZS5hbGxBdHRyaWJ1dGVzKCkgaW4mI3hEOwotU2VxdWVuY2V7MS4ucmVzdWx0LT5zaXplKCl9LT5mb3JBbGwoaSB8ICYjeEQ7Ci0JYXR0cmlidXRlLT5hdChpKS50eXBlLmNvbmZvcm1zVG8ocmVzdWx0LT5hdChpKS50eXBlKSBhbmQmI3hEOwotCWF0dHJpYnV0ZS0+YXQoaSkuaXNPcmRlcmVkPXJlc3VsdC0+YXQoaSkuaXNPcmRlcmVkIGFuZCYjeEQ7Ci0JYXR0cmlidXRlLT5hdChpKS5jb21wYXRpYmxlV2l0aChyZXN1bHQtPmF0KGkpKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlVubWFyc2hhbGxBY3Rpb24tbXVsdGlwbGljaXR5X29mX29iamVjdCIgbmFtZT0ibXVsdGlwbGljaXR5X29mX29iamVjdCIgY29uc3RyYWluZWRFbGVtZW50PSJVbm1hcnNoYWxsQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlVubWFyc2hhbGxBY3Rpb24tbXVsdGlwbGljaXR5X29mX29iamVjdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlVubWFyc2hhbGxBY3Rpb24tbXVsdGlwbGljaXR5X29mX29iamVjdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgb2JqZWN0IElucHV0UGluIGlzIDEuLjE8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVW5tYXJzaGFsbEFjdGlvbi1tdWx0aXBsaWNpdHlfb2Zfb2JqZWN0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vYmplY3QuaXMoMSwxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVW5tYXJzaGFsbEFjdGlvbi1vYmplY3RfdHlwZSIgbmFtZT0ib2JqZWN0X3R5cGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iVW5tYXJzaGFsbEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLW9iamVjdF90eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVW5tYXJzaGFsbEFjdGlvbi1vYmplY3RfdHlwZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHR5cGUgb2YgdGhlIG9iamVjdCBJbnB1dFBpbiBjb25mb3JtIHRvIHRoZSB1bm1hcnNoYWxsVHlwZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVW5tYXJzaGFsbEFjdGlvbi1vYmplY3RfdHlwZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b2JqZWN0LnR5cGUuY29uZm9ybXNUbyh1bm1hcnNoYWxsVHlwZSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iVW5tYXJzaGFsbEFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLW9iamVjdCIgbmFtZT0ib2JqZWN0IiB0eXBlPSJJbnB1dFBpbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1pbnB1dCIgYXNzb2NpYXRpb249IkFfb2JqZWN0X3VubWFyc2hhbGxBY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVW5tYXJzaGFsbEFjdGlvbi1vYmplY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJVbm1hcnNoYWxsQWN0aW9uLW9iamVjdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIElucHV0UGluIHRoYXQgZ2l2ZXMgdGhlIG9iamVjdCB0byBiZSB1bm1hcnNoYWxsZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJPdXRwdXRQaW4iIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGlvbi1vdXRwdXQiIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF91bm1hcnNoYWxsQWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlVubWFyc2hhbGxBY3Rpb24tcmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVW5tYXJzaGFsbEFjdGlvbi1yZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBPdXRwdXRQaW5zIG9uIHdoaWNoIGFyZSBwbGFjZWQgdGhlIHZhbHVlcyBvZiB0aGUgU3RydWN0dXJhbEZlYXR1cmVzIG9mIHRoZSBpbnB1dCBvYmplY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLXVubWFyc2hhbGxUeXBlIiBuYW1lPSJ1bm1hcnNoYWxsVHlwZSIgdHlwZT0iQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfdW5tYXJzaGFsbFR5cGVfdW5tYXJzaGFsbEFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVbm1hcnNoYWxsQWN0aW9uLXVubWFyc2hhbGxUeXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVW5tYXJzaGFsbEFjdGlvbi11bm1hcnNoYWxsVHlwZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byBiZSB1bm1hcnNoYWxsZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlZhbHVlUGluIiBuYW1lPSJWYWx1ZVBpbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVmFsdWVQaW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWYWx1ZVBpbiI+Ci0gICAgICAgIDxib2R5PkEgVmFsdWVQaW4gaXMgYW4gSW5wdXRQaW4gdGhhdCBwcm92aWRlcyBhIHZhbHVlIGJ5IGV2YWx1YXRpbmcgYSBWYWx1ZVNwZWNpZmljYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVmFsdWVQaW4tbm9faW5jb21pbmdfZWRnZXMiIG5hbWU9Im5vX2luY29taW5nX2VkZ2VzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlZhbHVlUGluIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlUGluLW5vX2luY29taW5nX2VkZ2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmFsdWVQaW4tbm9faW5jb21pbmdfZWRnZXMiPgotICAgICAgICAgIDxib2R5PkEgVmFsdWVQaW4gbWF5IGhhdmUgbm8gaW5jb21pbmcgQWN0aXZpdHlFZGdlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVmFsdWVQaW4tbm9faW5jb21pbmdfZWRnZXMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmluY29taW5nLT5pc0VtcHR5KCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlZhbHVlUGluLWNvbXBhdGlibGVfdHlwZSIgbmFtZT0iY29tcGF0aWJsZV90eXBlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlZhbHVlUGluIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlUGluLWNvbXBhdGlibGVfdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZhbHVlUGluLWNvbXBhdGlibGVfdHlwZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHR5cGUgb2YgdGhlIHZhbHVlIFZhbHVlU3BlY2lmaWNhdGlvbiBtdXN0IGNvbmZvcm0gdG8gdGhlIHR5cGUgb2YgdGhlIFZhbHVlUGluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJWYWx1ZVBpbi1jb21wYXRpYmxlX3R5cGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnZhbHVlLnR5cGUuY29uZm9ybXNUbyh0eXBlKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJWYWx1ZVBpbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iSW5wdXRQaW4iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlZhbHVlUGluLXZhbHVlIiBuYW1lPSJ2YWx1ZSIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3ZhbHVlX3ZhbHVlUGluIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlUGluLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmFsdWVQaW4tdmFsdWUiPgotICAgICAgICAgIDxib2R5PlRoZSBWYWx1ZVNwZWNpZmljYXRpb24gdGhhdCBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIHRoZSB2YWx1ZSB0aGF0IHRoZSBWYWx1ZVBpbiB3aWxsIHByb3ZpZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdmFsdWVfdmFsdWVQaW4iIG5hbWU9IkFfdmFsdWVfdmFsdWVQaW4iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVmFsdWVQaW4tdmFsdWUgQV92YWx1ZV92YWx1ZVBpbi12YWx1ZVBpbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3ZhbHVlX3ZhbHVlUGluLXZhbHVlUGluIiBuYW1lPSJ2YWx1ZVBpbiIgdHlwZT0iVmFsdWVQaW4iIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV92YWx1ZV92YWx1ZVBpbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV92YWx1ZV92YWx1ZVBpbi12YWx1ZVBpbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXN1bHRfdW5tYXJzaGFsbEFjdGlvbiIgbmFtZT0iQV9yZXN1bHRfdW5tYXJzaGFsbEFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJVbm1hcnNoYWxsQWN0aW9uLXJlc3VsdCBBX3Jlc3VsdF91bm1hcnNoYWxsQWN0aW9uLXVubWFyc2hhbGxBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXN1bHRfdW5tYXJzaGFsbEFjdGlvbi11bm1hcnNoYWxsQWN0aW9uIiBuYW1lPSJ1bm1hcnNoYWxsQWN0aW9uIiB0eXBlPSJVbm1hcnNoYWxsQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9vdXRwdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfcmVzdWx0X3VubWFyc2hhbGxBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVzdWx0X3VubWFyc2hhbGxBY3Rpb24tdW5tYXJzaGFsbEFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV91bm1hcnNoYWxsVHlwZV91bm1hcnNoYWxsQWN0aW9uIiBuYW1lPSJBX3VubWFyc2hhbGxUeXBlX3VubWFyc2hhbGxBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVW5tYXJzaGFsbEFjdGlvbi11bm1hcnNoYWxsVHlwZSBBX3VubWFyc2hhbGxUeXBlX3VubWFyc2hhbGxBY3Rpb24tdW5tYXJzaGFsbEFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3VubWFyc2hhbGxUeXBlX3VubWFyc2hhbGxBY3Rpb24tdW5tYXJzaGFsbEFjdGlvbiIgbmFtZT0idW5tYXJzaGFsbEFjdGlvbiIgdHlwZT0iVW5tYXJzaGFsbEFjdGlvbiIgYXNzb2NpYXRpb249IkFfdW5tYXJzaGFsbFR5cGVfdW5tYXJzaGFsbEFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV91bm1hcnNoYWxsVHlwZV91bm1hcnNoYWxsQWN0aW9uLXVubWFyc2hhbGxBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3VubWFyc2hhbGxUeXBlX3VubWFyc2hhbGxBY3Rpb24tdW5tYXJzaGFsbEFjdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb2JqZWN0X3VubWFyc2hhbGxBY3Rpb24iIG5hbWU9IkFfb2JqZWN0X3VubWFyc2hhbGxBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVW5tYXJzaGFsbEFjdGlvbi1vYmplY3QgQV9vYmplY3RfdW5tYXJzaGFsbEFjdGlvbi11bm1hcnNoYWxsQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb2JqZWN0X3VubWFyc2hhbGxBY3Rpb24tdW5tYXJzaGFsbEFjdGlvbiIgbmFtZT0idW5tYXJzaGFsbEFjdGlvbiIgdHlwZT0iVW5tYXJzaGFsbEFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfb2JqZWN0X3VubWFyc2hhbGxBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfb2JqZWN0X3VubWFyc2hhbGxBY3Rpb24tdW5tYXJzaGFsbEFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9maXJzdF90ZXN0SWRlbnRpdHlBY3Rpb24iIG5hbWU9IkFfZmlyc3RfdGVzdElkZW50aXR5QWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRlc3RJZGVudGl0eUFjdGlvbi1maXJzdCBBX2ZpcnN0X3Rlc3RJZGVudGl0eUFjdGlvbi10ZXN0SWRlbnRpdHlBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9maXJzdF90ZXN0SWRlbnRpdHlBY3Rpb24tdGVzdElkZW50aXR5QWN0aW9uIiBuYW1lPSJ0ZXN0SWRlbnRpdHlBY3Rpb24iIHR5cGU9IlRlc3RJZGVudGl0eUFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfZmlyc3RfdGVzdElkZW50aXR5QWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2ZpcnN0X3Rlc3RJZGVudGl0eUFjdGlvbi10ZXN0SWRlbnRpdHlBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc2Vjb25kX3Rlc3RJZGVudGl0eUFjdGlvbiIgbmFtZT0iQV9zZWNvbmRfdGVzdElkZW50aXR5QWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRlc3RJZGVudGl0eUFjdGlvbi1zZWNvbmQgQV9zZWNvbmRfdGVzdElkZW50aXR5QWN0aW9uLXRlc3RJZGVudGl0eUFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3NlY29uZF90ZXN0SWRlbnRpdHlBY3Rpb24tdGVzdElkZW50aXR5QWN0aW9uIiBuYW1lPSJ0ZXN0SWRlbnRpdHlBY3Rpb24iIHR5cGU9IlRlc3RJZGVudGl0eUFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfc2Vjb25kX3Rlc3RJZGVudGl0eUFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9zZWNvbmRfdGVzdElkZW50aXR5QWN0aW9uLXRlc3RJZGVudGl0eUFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXN1bHRfdGVzdElkZW50aXR5QWN0aW9uIiBuYW1lPSJBX3Jlc3VsdF90ZXN0SWRlbnRpdHlBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVGVzdElkZW50aXR5QWN0aW9uLXJlc3VsdCBBX3Jlc3VsdF90ZXN0SWRlbnRpdHlBY3Rpb24tdGVzdElkZW50aXR5QWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVzdWx0X3Rlc3RJZGVudGl0eUFjdGlvbi10ZXN0SWRlbnRpdHlBY3Rpb24iIG5hbWU9InRlc3RJZGVudGl0eUFjdGlvbiIgdHlwZT0iVGVzdElkZW50aXR5QWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9vdXRwdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfcmVzdWx0X3Rlc3RJZGVudGl0eUFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXN1bHRfdGVzdElkZW50aXR5QWN0aW9uLXRlc3RJZGVudGl0eUFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zdHJ1Y3R1cmVkTm9kZU91dHB1dF9zdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIiBuYW1lPSJBX3N0cnVjdHVyZWROb2RlT3V0cHV0X3N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkTm9kZU91dHB1dCBBX3N0cnVjdHVyZWROb2RlT3V0cHV0X3N0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc3RydWN0dXJlZEFjdGl2aXR5Tm9kZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3N0cnVjdHVyZWROb2RlT3V0cHV0X3N0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgbmFtZT0ic3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfb3V0cHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX3N0cnVjdHVyZWROb2RlT3V0cHV0X3N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc3RydWN0dXJlZE5vZGVPdXRwdXRfc3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3N0cnVjdHVyZWROb2RlSW5wdXRfc3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgbmFtZT0iQV9zdHJ1Y3R1cmVkTm9kZUlucHV0X3N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkTm9kZUlucHV0IEFfc3RydWN0dXJlZE5vZGVJbnB1dF9zdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9zdHJ1Y3R1cmVkTm9kZUlucHV0X3N0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgbmFtZT0ic3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfc3RydWN0dXJlZE5vZGVJbnB1dF9zdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3N0cnVjdHVyZWROb2RlSW5wdXRfc3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1zdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VkZ2VfaW5TdHJ1Y3R1cmVkTm9kZSIgbmFtZT0iQV9lZGdlX2luU3RydWN0dXJlZE5vZGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS1lZGdlIEFjdGl2aXR5RWRnZS1pblN0cnVjdHVyZWROb2RlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbm9kZV9pblN0cnVjdHVyZWROb2RlIiBuYW1lPSJBX25vZGVfaW5TdHJ1Y3R1cmVkTm9kZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLW5vZGUgQWN0aXZpdHlOb2RlLWluU3RydWN0dXJlZE5vZGUiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV92YXJpYWJsZV9zY29wZSIgbmFtZT0iQV92YXJpYWJsZV9zY29wZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXZhcmlhYmxlIFZhcmlhYmxlLXNjb3BlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb2JqZWN0X3N0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiBuYW1lPSJBX29iamVjdF9zdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1vYmplY3QgQV9vYmplY3Rfc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vYmplY3Rfc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIG5hbWU9InN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiB0eXBlPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfb2JqZWN0X3N0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX29iamVjdF9zdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1zdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zdHJ1Y3R1cmFsRmVhdHVyZV9zdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgbmFtZT0iQV9zdHJ1Y3R1cmFsRmVhdHVyZV9zdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1zdHJ1Y3R1cmFsRmVhdHVyZSBBX3N0cnVjdHVyYWxGZWF0dXJlX3N0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfc3RydWN0dXJhbEZlYXR1cmVfc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIG5hbWU9InN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiB0eXBlPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgYXNzb2NpYXRpb249IkFfc3RydWN0dXJhbEZlYXR1cmVfc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc3RydWN0dXJhbEZlYXR1cmVfc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tc3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3N0cnVjdHVyYWxGZWF0dXJlX3N0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vYmplY3Rfc3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbiIgbmFtZT0iQV9vYmplY3Rfc3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLW9iamVjdCBBX29iamVjdF9zdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLXN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vYmplY3Rfc3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1zdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uIiBuYW1lPSJzdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uIiB0eXBlPSJTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9pbnB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9vYmplY3Rfc3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vYmplY3Rfc3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbi1zdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX29iamVjdF9zdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbiIgbmFtZT0iQV9vYmplY3Rfc3RhcnRDbGFzc2lmaWVyQmVoYXZpb3JBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RhcnRDbGFzc2lmaWVyQmVoYXZpb3JBY3Rpb24tb2JqZWN0IEFfb2JqZWN0X3N0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLXN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb2JqZWN0X3N0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uLXN0YXJ0Q2xhc3NpZmllckJlaGF2aW9yQWN0aW9uIiBuYW1lPSJzdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbiIgdHlwZT0iU3RhcnRDbGFzc2lmaWVyQmVoYXZpb3JBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX2lucHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX29iamVjdF9zdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vYmplY3Rfc3RhcnRDbGFzc2lmaWVyQmVoYXZpb3JBY3Rpb24tc3RhcnRDbGFzc2lmaWVyQmVoYXZpb3JBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZXhlY3V0YWJsZU5vZGVfc2VxdWVuY2VOb2RlIiBuYW1lPSJBX2V4ZWN1dGFibGVOb2RlX3NlcXVlbmNlTm9kZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTZXF1ZW5jZU5vZGUtZXhlY3V0YWJsZU5vZGUgQV9leGVjdXRhYmxlTm9kZV9zZXF1ZW5jZU5vZGUtc2VxdWVuY2VOb2RlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZXhlY3V0YWJsZU5vZGVfc2VxdWVuY2VOb2RlLXNlcXVlbmNlTm9kZSIgbmFtZT0ic2VxdWVuY2VOb2RlIiB0eXBlPSJTZXF1ZW5jZU5vZGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpdml0eU5vZGUtaW5TdHJ1Y3R1cmVkTm9kZSIgYXNzb2NpYXRpb249IkFfZXhlY3V0YWJsZU5vZGVfc2VxdWVuY2VOb2RlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2V4ZWN1dGFibGVOb2RlX3NlcXVlbmNlTm9kZS1zZXF1ZW5jZU5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc2lnbmFsX3NlbmRTaWduYWxBY3Rpb24iIG5hbWU9IkFfc2lnbmFsX3NlbmRTaWduYWxBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU2VuZFNpZ25hbEFjdGlvbi1zaWduYWwgQV9zaWduYWxfc2VuZFNpZ25hbEFjdGlvbi1zZW5kU2lnbmFsQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfc2lnbmFsX3NlbmRTaWduYWxBY3Rpb24tc2VuZFNpZ25hbEFjdGlvbiIgbmFtZT0ic2VuZFNpZ25hbEFjdGlvbiIgdHlwZT0iU2VuZFNpZ25hbEFjdGlvbiIgYXNzb2NpYXRpb249IkFfc2lnbmFsX3NlbmRTaWduYWxBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc2lnbmFsX3NlbmRTaWduYWxBY3Rpb24tc2VuZFNpZ25hbEFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfc2lnbmFsX3NlbmRTaWduYWxBY3Rpb24tc2VuZFNpZ25hbEFjdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdGFyZ2V0X3NlbmRTaWduYWxBY3Rpb24iIG5hbWU9IkFfdGFyZ2V0X3NlbmRTaWduYWxBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU2VuZFNpZ25hbEFjdGlvbi10YXJnZXQgQV90YXJnZXRfc2VuZFNpZ25hbEFjdGlvbi1zZW5kU2lnbmFsQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdGFyZ2V0X3NlbmRTaWduYWxBY3Rpb24tc2VuZFNpZ25hbEFjdGlvbiIgbmFtZT0ic2VuZFNpZ25hbEFjdGlvbiIgdHlwZT0iU2VuZFNpZ25hbEFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfdGFyZ2V0X3NlbmRTaWduYWxBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdGFyZ2V0X3NlbmRTaWduYWxBY3Rpb24tc2VuZFNpZ25hbEFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXF1ZXN0X3NlbmRPYmplY3RBY3Rpb24iIG5hbWU9IkFfcmVxdWVzdF9zZW5kT2JqZWN0QWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlNlbmRPYmplY3RBY3Rpb24tcmVxdWVzdCBBX3JlcXVlc3Rfc2VuZE9iamVjdEFjdGlvbi1zZW5kT2JqZWN0QWN0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFfcmVxdWVzdF9zZW5kT2JqZWN0QWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBX2FyZ3VtZW50X2ludm9jYXRpb25BY3Rpb24iLz4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVxdWVzdF9zZW5kT2JqZWN0QWN0aW9uLXNlbmRPYmplY3RBY3Rpb24iIG5hbWU9InNlbmRPYmplY3RBY3Rpb24iIHR5cGU9IlNlbmRPYmplY3RBY3Rpb24iIHJlZGVmaW5lZFByb3BlcnR5PSJBX2FyZ3VtZW50X2ludm9jYXRpb25BY3Rpb24taW52b2NhdGlvbkFjdGlvbiIgYXNzb2NpYXRpb249IkFfcmVxdWVzdF9zZW5kT2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JlcXVlc3Rfc2VuZE9iamVjdEFjdGlvbi1zZW5kT2JqZWN0QWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3RhcmdldF9zZW5kT2JqZWN0QWN0aW9uIiBuYW1lPSJBX3RhcmdldF9zZW5kT2JqZWN0QWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlNlbmRPYmplY3RBY3Rpb24tdGFyZ2V0IEFfdGFyZ2V0X3NlbmRPYmplY3RBY3Rpb24tc2VuZE9iamVjdEFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3RhcmdldF9zZW5kT2JqZWN0QWN0aW9uLXNlbmRPYmplY3RBY3Rpb24iIG5hbWU9InNlbmRPYmplY3RBY3Rpb24iIHR5cGU9IlNlbmRPYmplY3RBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX2lucHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX3RhcmdldF9zZW5kT2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3RhcmdldF9zZW5kT2JqZWN0QWN0aW9uLXNlbmRPYmplY3RBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmV0dXJuSW5mb3JtYXRpb25fcmVwbHlBY3Rpb24iIG5hbWU9IkFfcmV0dXJuSW5mb3JtYXRpb25fcmVwbHlBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVwbHlBY3Rpb24tcmV0dXJuSW5mb3JtYXRpb24gQV9yZXR1cm5JbmZvcm1hdGlvbl9yZXBseUFjdGlvbi1yZXBseUFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JldHVybkluZm9ybWF0aW9uX3JlcGx5QWN0aW9uLXJlcGx5QWN0aW9uIiBuYW1lPSJyZXBseUFjdGlvbiIgdHlwZT0iUmVwbHlBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX2lucHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX3JldHVybkluZm9ybWF0aW9uX3JlcGx5QWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JldHVybkluZm9ybWF0aW9uX3JlcGx5QWN0aW9uLXJlcGx5QWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlcGx5VG9DYWxsX3JlcGx5QWN0aW9uIiBuYW1lPSJBX3JlcGx5VG9DYWxsX3JlcGx5QWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlJlcGx5QWN0aW9uLXJlcGx5VG9DYWxsIEFfcmVwbHlUb0NhbGxfcmVwbHlBY3Rpb24tcmVwbHlBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXBseVRvQ2FsbF9yZXBseUFjdGlvbi1yZXBseUFjdGlvbiIgbmFtZT0icmVwbHlBY3Rpb24iIHR5cGU9IlJlcGx5QWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9yZXBseVRvQ2FsbF9yZXBseUFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXBseVRvQ2FsbF9yZXBseUFjdGlvbi1yZXBseUFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXBseVZhbHVlX3JlcGx5QWN0aW9uIiBuYW1lPSJBX3JlcGx5VmFsdWVfcmVwbHlBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVwbHlBY3Rpb24tcmVwbHlWYWx1ZSBBX3JlcGx5VmFsdWVfcmVwbHlBY3Rpb24tcmVwbHlBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXBseVZhbHVlX3JlcGx5QWN0aW9uLXJlcGx5QWN0aW9uIiBuYW1lPSJyZXBseUFjdGlvbiIgdHlwZT0iUmVwbHlBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX2lucHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX3JlcGx5VmFsdWVfcmVwbHlBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVwbHlWYWx1ZV9yZXBseUFjdGlvbi1yZXBseUFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZW1vdmVBdF9yZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uIiBuYW1lPSJBX3JlbW92ZUF0X3JlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbi1yZW1vdmVBdCBBX3JlbW92ZUF0X3JlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24tcmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlbW92ZUF0X3JlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24tcmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbiIgbmFtZT0icmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbiIgdHlwZT0iUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfcmVtb3ZlQXRfcmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZW1vdmVBdF9yZW1vdmVWYXJpYWJsZVZhbHVlQWN0aW9uLXJlbW92ZVZhcmlhYmxlVmFsdWVBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVtb3ZlQXRfcmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgbmFtZT0iQV9yZW1vdmVBdF9yZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24tcmVtb3ZlQXQgQV9yZW1vdmVBdF9yZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLXJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZW1vdmVBdF9yZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLXJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIG5hbWU9InJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIHR5cGU9IlJlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX2lucHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX3JlbW92ZUF0X3JlbW92ZVN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVtb3ZlQXRfcmVtb3ZlU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1yZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NvbGxlY3Rpb25fcmVkdWNlQWN0aW9uIiBuYW1lPSJBX2NvbGxlY3Rpb25fcmVkdWNlQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlJlZHVjZUFjdGlvbi1jb2xsZWN0aW9uIEFfY29sbGVjdGlvbl9yZWR1Y2VBY3Rpb24tcmVkdWNlQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfY29sbGVjdGlvbl9yZWR1Y2VBY3Rpb24tcmVkdWNlQWN0aW9uIiBuYW1lPSJyZWR1Y2VBY3Rpb24iIHR5cGU9IlJlZHVjZUFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfY29sbGVjdGlvbl9yZWR1Y2VBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfY29sbGVjdGlvbl9yZWR1Y2VBY3Rpb24tcmVkdWNlQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlZHVjZXJfcmVkdWNlQWN0aW9uIiBuYW1lPSJBX3JlZHVjZXJfcmVkdWNlQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlJlZHVjZUFjdGlvbi1yZWR1Y2VyIEFfcmVkdWNlcl9yZWR1Y2VBY3Rpb24tcmVkdWNlQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVkdWNlcl9yZWR1Y2VBY3Rpb24tcmVkdWNlQWN0aW9uIiBuYW1lPSJyZWR1Y2VBY3Rpb24iIHR5cGU9IlJlZHVjZUFjdGlvbiIgYXNzb2NpYXRpb249IkFfcmVkdWNlcl9yZWR1Y2VBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVkdWNlcl9yZWR1Y2VBY3Rpb24tcmVkdWNlQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9yZWR1Y2VyX3JlZHVjZUFjdGlvbi1yZWR1Y2VBY3Rpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Jlc3VsdF9yZWR1Y2VBY3Rpb24iIG5hbWU9IkFfcmVzdWx0X3JlZHVjZUFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJSZWR1Y2VBY3Rpb24tcmVzdWx0IEFfcmVzdWx0X3JlZHVjZUFjdGlvbi1yZWR1Y2VBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXN1bHRfcmVkdWNlQWN0aW9uLXJlZHVjZUFjdGlvbiIgbmFtZT0icmVkdWNlQWN0aW9uIiB0eXBlPSJSZWR1Y2VBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX291dHB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfcmVkdWNlQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Jlc3VsdF9yZWR1Y2VBY3Rpb24tcmVkdWNlQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX29iamVjdF9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIiBuYW1lPSJBX29iamVjdF9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tb2JqZWN0IEFfb2JqZWN0X3JlY2xhc3NpZnlPYmplY3RBY3Rpb24tcmVjbGFzc2lmeU9iamVjdEFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX29iamVjdF9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLXJlY2xhc3NpZnlPYmplY3RBY3Rpb24iIG5hbWU9InJlY2xhc3NpZnlPYmplY3RBY3Rpb24iIHR5cGU9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX2lucHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX29iamVjdF9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX29iamVjdF9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLXJlY2xhc3NpZnlPYmplY3RBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbmV3Q2xhc3NpZmllcl9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIiBuYW1lPSJBX25ld0NsYXNzaWZpZXJfcmVjbGFzc2lmeU9iamVjdEFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLW5ld0NsYXNzaWZpZXIgQV9uZXdDbGFzc2lmaWVyX3JlY2xhc3NpZnlPYmplY3RBY3Rpb24tcmVjbGFzc2lmeU9iamVjdEFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX25ld0NsYXNzaWZpZXJfcmVjbGFzc2lmeU9iamVjdEFjdGlvbi1yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIiBuYW1lPSJyZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIiB0eXBlPSJSZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9uZXdDbGFzc2lmaWVyX3JlY2xhc3NpZnlPYmplY3RBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbmV3Q2xhc3NpZmllcl9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLXJlY2xhc3NpZnlPYmplY3RBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX25ld0NsYXNzaWZpZXJfcmVjbGFzc2lmeU9iamVjdEFjdGlvbi1yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vbGRDbGFzc2lmaWVyX3JlY2xhc3NpZnlPYmplY3RBY3Rpb24iIG5hbWU9IkFfb2xkQ2xhc3NpZmllcl9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24tb2xkQ2xhc3NpZmllciBBX29sZENsYXNzaWZpZXJfcmVjbGFzc2lmeU9iamVjdEFjdGlvbi1yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb2xkQ2xhc3NpZmllcl9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLXJlY2xhc3NpZnlPYmplY3RBY3Rpb24iIG5hbWU9InJlY2xhc3NpZnlPYmplY3RBY3Rpb24iIHR5cGU9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24iIGFzc29jaWF0aW9uPSJBX29sZENsYXNzaWZpZXJfcmVjbGFzc2lmeU9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vbGRDbGFzc2lmaWVyX3JlY2xhc3NpZnlPYmplY3RBY3Rpb24tcmVjbGFzc2lmeU9iamVjdEFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfb2xkQ2xhc3NpZmllcl9yZWNsYXNzaWZ5T2JqZWN0QWN0aW9uLXJlY2xhc3NpZnlPYmplY3RBY3Rpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Jlc3VsdF9yZWFkVmFyaWFibGVBY3Rpb24iIG5hbWU9IkFfcmVzdWx0X3JlYWRWYXJpYWJsZUFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJSZWFkVmFyaWFibGVBY3Rpb24tcmVzdWx0IEFfcmVzdWx0X3JlYWRWYXJpYWJsZUFjdGlvbi1yZWFkVmFyaWFibGVBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXN1bHRfcmVhZFZhcmlhYmxlQWN0aW9uLXJlYWRWYXJpYWJsZUFjdGlvbiIgbmFtZT0icmVhZFZhcmlhYmxlQWN0aW9uIiB0eXBlPSJSZWFkVmFyaWFibGVBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX291dHB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfcmVhZFZhcmlhYmxlQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Jlc3VsdF9yZWFkVmFyaWFibGVBY3Rpb24tcmVhZFZhcmlhYmxlQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Jlc3VsdF9yZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIG5hbWU9IkFfcmVzdWx0X3JlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tcmVzdWx0IEFfcmVzdWx0X3JlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1yZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXN1bHRfcmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgbmFtZT0icmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiB0eXBlPSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX291dHB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfcmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Jlc3VsdF9yZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tcmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Jlc3VsdF9yZWFkU2VsZkFjdGlvbiIgbmFtZT0iQV9yZXN1bHRfcmVhZFNlbGZBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVhZFNlbGZBY3Rpb24tcmVzdWx0IEFfcmVzdWx0X3JlYWRTZWxmQWN0aW9uLXJlYWRTZWxmQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVzdWx0X3JlYWRTZWxmQWN0aW9uLXJlYWRTZWxmQWN0aW9uIiBuYW1lPSJyZWFkU2VsZkFjdGlvbiIgdHlwZT0iUmVhZFNlbGZBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX291dHB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfcmVhZFNlbGZBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVzdWx0X3JlYWRTZWxmQWN0aW9uLXJlYWRTZWxmQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3F1YWxpZmllcl9yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiIgbmFtZT0iQV9xdWFsaWZpZXJfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcXVhbGlmaWVyIEFfcXVhbGlmaWVyX3JlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLXJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcXVhbGlmaWVyX3JlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLXJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIiBuYW1lPSJyZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiIgdHlwZT0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iIGFzc29jaWF0aW9uPSJBX3F1YWxpZmllcl9yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9xdWFsaWZpZXJfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb2JqZWN0X3JlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIiBuYW1lPSJBX29iamVjdF9yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1vYmplY3QgQV9vYmplY3RfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vYmplY3RfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iIG5hbWU9InJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIiB0eXBlPSJSZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfb2JqZWN0X3JlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX29iamVjdF9yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXN1bHRfcmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iIG5hbWU9IkFfcmVzdWx0X3JlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uLXJlc3VsdCBBX3Jlc3VsdF9yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3Jlc3VsdF9yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbiIgbmFtZT0icmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iIHR5cGU9IlJlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9vdXRwdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfcmVzdWx0X3JlYWRMaW5rT2JqZWN0RW5kUXVhbGlmaWVyQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Jlc3VsdF9yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1yZWFkTGlua09iamVjdEVuZFF1YWxpZmllckFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vYmplY3RfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24iIG5hbWU9IkFfb2JqZWN0X3JlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLW9iamVjdCBBX29iamVjdF9yZWFkTGlua09iamVjdEVuZEFjdGlvbi1yZWFkTGlua09iamVjdEVuZEFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX29iamVjdF9yZWFkTGlua09iamVjdEVuZEFjdGlvbi1yZWFkTGlua09iamVjdEVuZEFjdGlvbiIgbmFtZT0icmVhZExpbmtPYmplY3RFbmRBY3Rpb24iIHR5cGU9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9pbnB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9vYmplY3RfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfb2JqZWN0X3JlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLXJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VuZF9yZWFkTGlua09iamVjdEVuZEFjdGlvbiIgbmFtZT0iQV9lbmRfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24tZW5kIEFfZW5kX3JlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLXJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZW5kX3JlYWRMaW5rT2JqZWN0RW5kQWN0aW9uLXJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIiBuYW1lPSJyZWFkTGlua09iamVjdEVuZEFjdGlvbiIgdHlwZT0iUmVhZExpbmtPYmplY3RFbmRBY3Rpb24iIGFzc29jaWF0aW9uPSJBX2VuZF9yZWFkTGlua09iamVjdEVuZEFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9lbmRfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVzdWx0X3JlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIiBuYW1lPSJBX3Jlc3VsdF9yZWFkTGlua09iamVjdEVuZEFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbi1yZXN1bHQgQV9yZXN1bHRfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXN1bHRfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRBY3Rpb24iIG5hbWU9InJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIiB0eXBlPSJSZWFkTGlua09iamVjdEVuZEFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfb3V0cHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF9yZWFkTGlua09iamVjdEVuZEFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXN1bHRfcmVhZExpbmtPYmplY3RFbmRBY3Rpb24tcmVhZExpbmtPYmplY3RFbmRBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVzdWx0X3JlYWRMaW5rQWN0aW9uIiBuYW1lPSJBX3Jlc3VsdF9yZWFkTGlua0FjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJSZWFkTGlua0FjdGlvbi1yZXN1bHQgQV9yZXN1bHRfcmVhZExpbmtBY3Rpb24tcmVhZExpbmtBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXN1bHRfcmVhZExpbmtBY3Rpb24tcmVhZExpbmtBY3Rpb24iIG5hbWU9InJlYWRMaW5rQWN0aW9uIiB0eXBlPSJSZWFkTGlua0FjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfb3V0cHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF9yZWFkTGlua0FjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXN1bHRfcmVhZExpbmtBY3Rpb24tcmVhZExpbmtBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY2xhc3NpZmllcl9yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIiBuYW1lPSJBX2NsYXNzaWZpZXJfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLWNsYXNzaWZpZXIgQV9jbGFzc2lmaWVyX3JlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2NsYXNzaWZpZXJfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIiBuYW1lPSJyZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIiB0eXBlPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9jbGFzc2lmaWVyX3JlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfY2xhc3NpZmllcl9yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLXJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NsYXNzaWZpZXJfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXN1bHRfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiIgbmFtZT0iQV9yZXN1bHRfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLXJlc3VsdCBBX3Jlc3VsdF9yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLXJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXN1bHRfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIiBuYW1lPSJyZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIiB0eXBlPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9vdXRwdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfcmVzdWx0X3JlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVzdWx0X3JlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24tcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vYmplY3RfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiIgbmFtZT0iQV9vYmplY3RfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLW9iamVjdCBBX29iamVjdF9yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLXJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vYmplY3RfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIiBuYW1lPSJyZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIiB0eXBlPSJSZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9pbnB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9vYmplY3RfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vYmplY3RfcmVhZElzQ2xhc3NpZmllZE9iamVjdEFjdGlvbi1yZWFkSXNDbGFzc2lmaWVkT2JqZWN0QWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Jlc3VsdF9yZWFkRXh0ZW50QWN0aW9uIiBuYW1lPSJBX3Jlc3VsdF9yZWFkRXh0ZW50QWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlJlYWRFeHRlbnRBY3Rpb24tcmVzdWx0IEFfcmVzdWx0X3JlYWRFeHRlbnRBY3Rpb24tcmVhZEV4dGVudEFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3Jlc3VsdF9yZWFkRXh0ZW50QWN0aW9uLXJlYWRFeHRlbnRBY3Rpb24iIG5hbWU9InJlYWRFeHRlbnRBY3Rpb24iIHR5cGU9IlJlYWRFeHRlbnRBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX291dHB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfcmVhZEV4dGVudEFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXN1bHRfcmVhZEV4dGVudEFjdGlvbi1yZWFkRXh0ZW50QWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NsYXNzaWZpZXJfcmVhZEV4dGVudEFjdGlvbiIgbmFtZT0iQV9jbGFzc2lmaWVyX3JlYWRFeHRlbnRBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVhZEV4dGVudEFjdGlvbi1jbGFzc2lmaWVyIEFfY2xhc3NpZmllcl9yZWFkRXh0ZW50QWN0aW9uLXJlYWRFeHRlbnRBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jbGFzc2lmaWVyX3JlYWRFeHRlbnRBY3Rpb24tcmVhZEV4dGVudEFjdGlvbiIgbmFtZT0icmVhZEV4dGVudEFjdGlvbiIgdHlwZT0iUmVhZEV4dGVudEFjdGlvbiIgYXNzb2NpYXRpb249IkFfY2xhc3NpZmllcl9yZWFkRXh0ZW50QWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2NsYXNzaWZpZXJfcmVhZEV4dGVudEFjdGlvbi1yZWFkRXh0ZW50QWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2V4Y2VwdGlvbl9yYWlzZUV4Y2VwdGlvbkFjdGlvbiIgbmFtZT0iQV9leGNlcHRpb25fcmFpc2VFeGNlcHRpb25BY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmFpc2VFeGNlcHRpb25BY3Rpb24tZXhjZXB0aW9uIEFfZXhjZXB0aW9uX3JhaXNlRXhjZXB0aW9uQWN0aW9uLXJhaXNlRXhjZXB0aW9uQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZXhjZXB0aW9uX3JhaXNlRXhjZXB0aW9uQWN0aW9uLXJhaXNlRXhjZXB0aW9uQWN0aW9uIiBuYW1lPSJyYWlzZUV4Y2VwdGlvbkFjdGlvbiIgdHlwZT0iUmFpc2VFeGNlcHRpb25BY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX2lucHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX2V4Y2VwdGlvbl9yYWlzZUV4Y2VwdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9leGNlcHRpb25fcmFpc2VFeGNlcHRpb25BY3Rpb24tcmFpc2VFeGNlcHRpb25BY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcXVhbGlmaWVyX3F1YWxpZmllclZhbHVlIiBuYW1lPSJBX3F1YWxpZmllcl9xdWFsaWZpZXJWYWx1ZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJRdWFsaWZpZXJWYWx1ZS1xdWFsaWZpZXIgQV9xdWFsaWZpZXJfcXVhbGlmaWVyVmFsdWUtcXVhbGlmaWVyVmFsdWUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9xdWFsaWZpZXJfcXVhbGlmaWVyVmFsdWUtcXVhbGlmaWVyVmFsdWUiIG5hbWU9InF1YWxpZmllclZhbHVlIiB0eXBlPSJRdWFsaWZpZXJWYWx1ZSIgYXNzb2NpYXRpb249IkFfcXVhbGlmaWVyX3F1YWxpZmllclZhbHVlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3F1YWxpZmllcl9xdWFsaWZpZXJWYWx1ZS1xdWFsaWZpZXJWYWx1ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcXVhbGlmaWVyX3F1YWxpZmllclZhbHVlLXF1YWxpZmllclZhbHVlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV92YWx1ZV9xdWFsaWZpZXJWYWx1ZSIgbmFtZT0iQV92YWx1ZV9xdWFsaWZpZXJWYWx1ZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJRdWFsaWZpZXJWYWx1ZS12YWx1ZSBBX3ZhbHVlX3F1YWxpZmllclZhbHVlLXF1YWxpZmllclZhbHVlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdmFsdWVfcXVhbGlmaWVyVmFsdWUtcXVhbGlmaWVyVmFsdWUiIG5hbWU9InF1YWxpZmllclZhbHVlIiB0eXBlPSJRdWFsaWZpZXJWYWx1ZSIgYXNzb2NpYXRpb249IkFfdmFsdWVfcXVhbGlmaWVyVmFsdWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdmFsdWVfcXVhbGlmaWVyVmFsdWUtcXVhbGlmaWVyVmFsdWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3V0cHV0VmFsdWVfb3BhcXVlQWN0aW9uIiBuYW1lPSJBX291dHB1dFZhbHVlX29wYXF1ZUFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJPcGFxdWVBY3Rpb24tb3V0cHV0VmFsdWUgQV9vdXRwdXRWYWx1ZV9vcGFxdWVBY3Rpb24tb3BhcXVlQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb3V0cHV0VmFsdWVfb3BhcXVlQWN0aW9uLW9wYXF1ZUFjdGlvbiIgbmFtZT0ib3BhcXVlQWN0aW9uIiB0eXBlPSJPcGFxdWVBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX291dHB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9vdXRwdXRWYWx1ZV9vcGFxdWVBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfb3V0cHV0VmFsdWVfb3BhcXVlQWN0aW9uLW9wYXF1ZUFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9pbnB1dFZhbHVlX29wYXF1ZUFjdGlvbiIgbmFtZT0iQV9pbnB1dFZhbHVlX29wYXF1ZUFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJPcGFxdWVBY3Rpb24taW5wdXRWYWx1ZSBBX2lucHV0VmFsdWVfb3BhcXVlQWN0aW9uLW9wYXF1ZUFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2lucHV0VmFsdWVfb3BhcXVlQWN0aW9uLW9wYXF1ZUFjdGlvbiIgbmFtZT0ib3BhcXVlQWN0aW9uIiB0eXBlPSJPcGFxdWVBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX2lucHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX2lucHV0VmFsdWVfb3BhcXVlQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2lucHV0VmFsdWVfb3BhcXVlQWN0aW9uLW9wYXF1ZUFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zZXR1cFBhcnRfbG9vcE5vZGUiIG5hbWU9IkFfc2V0dXBQYXJ0X2xvb3BOb2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ikxvb3BOb2RlLXNldHVwUGFydCBBX3NldHVwUGFydF9sb29wTm9kZS1sb29wTm9kZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3NldHVwUGFydF9sb29wTm9kZS1sb29wTm9kZSIgbmFtZT0ibG9vcE5vZGUiIHR5cGU9Ikxvb3BOb2RlIiBhc3NvY2lhdGlvbj0iQV9zZXR1cFBhcnRfbG9vcE5vZGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc2V0dXBQYXJ0X2xvb3BOb2RlLWxvb3BOb2RlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2JvZHlQYXJ0X2xvb3BOb2RlIiBuYW1lPSJBX2JvZHlQYXJ0X2xvb3BOb2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ikxvb3BOb2RlLWJvZHlQYXJ0IEFfYm9keVBhcnRfbG9vcE5vZGUtbG9vcE5vZGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9ib2R5UGFydF9sb29wTm9kZS1sb29wTm9kZSIgbmFtZT0ibG9vcE5vZGUiIHR5cGU9Ikxvb3BOb2RlIiBhc3NvY2lhdGlvbj0iQV9ib2R5UGFydF9sb29wTm9kZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9ib2R5UGFydF9sb29wTm9kZS1sb29wTm9kZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9sb29wVmFyaWFibGVfbG9vcE5vZGUiIG5hbWU9IkFfbG9vcFZhcmlhYmxlX2xvb3BOb2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ikxvb3BOb2RlLWxvb3BWYXJpYWJsZSBBX2xvb3BWYXJpYWJsZV9sb29wTm9kZS1sb29wTm9kZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2xvb3BWYXJpYWJsZV9sb29wTm9kZS1sb29wTm9kZSIgbmFtZT0ibG9vcE5vZGUiIHR5cGU9Ikxvb3BOb2RlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfbG9vcFZhcmlhYmxlX2xvb3BOb2RlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2xvb3BWYXJpYWJsZV9sb29wTm9kZS1sb29wTm9kZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXN1bHRfbG9vcE5vZGUiIG5hbWU9IkFfcmVzdWx0X2xvb3BOb2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ikxvb3BOb2RlLXJlc3VsdCBBX3Jlc3VsdF9sb29wTm9kZS1sb29wTm9kZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3Jlc3VsdF9sb29wTm9kZS1sb29wTm9kZSIgbmFtZT0ibG9vcE5vZGUiIHR5cGU9Ikxvb3BOb2RlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9zdHJ1Y3R1cmVkTm9kZU91dHB1dF9zdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLXN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF9sb29wTm9kZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXN1bHRfbG9vcE5vZGUtbG9vcE5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfYm9keU91dHB1dF9sb29wTm9kZSIgbmFtZT0iQV9ib2R5T3V0cHV0X2xvb3BOb2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ikxvb3BOb2RlLWJvZHlPdXRwdXQgQV9ib2R5T3V0cHV0X2xvb3BOb2RlLWxvb3BOb2RlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfYm9keU91dHB1dF9sb29wTm9kZS1sb29wTm9kZSIgbmFtZT0ibG9vcE5vZGUiIHR5cGU9Ikxvb3BOb2RlIiBhc3NvY2lhdGlvbj0iQV9ib2R5T3V0cHV0X2xvb3BOb2RlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2JvZHlPdXRwdXRfbG9vcE5vZGUtbG9vcE5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2JvZHlPdXRwdXRfbG9vcE5vZGUtbG9vcE5vZGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2xvb3BWYXJpYWJsZUlucHV0X2xvb3BOb2RlIiBuYW1lPSJBX2xvb3BWYXJpYWJsZUlucHV0X2xvb3BOb2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ikxvb3BOb2RlLWxvb3BWYXJpYWJsZUlucHV0IEFfbG9vcFZhcmlhYmxlSW5wdXRfbG9vcE5vZGUtbG9vcE5vZGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9sb29wVmFyaWFibGVJbnB1dF9sb29wTm9kZS1sb29wTm9kZSIgbmFtZT0ibG9vcE5vZGUiIHR5cGU9Ikxvb3BOb2RlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9zdHJ1Y3R1cmVkTm9kZUlucHV0X3N0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgYXNzb2NpYXRpb249IkFfbG9vcFZhcmlhYmxlSW5wdXRfbG9vcE5vZGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbG9vcFZhcmlhYmxlSW5wdXRfbG9vcE5vZGUtbG9vcE5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdGVzdF9sb29wTm9kZSIgbmFtZT0iQV90ZXN0X2xvb3BOb2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ikxvb3BOb2RlLXRlc3QgQV90ZXN0X2xvb3BOb2RlLWxvb3BOb2RlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdGVzdF9sb29wTm9kZS1sb29wTm9kZSIgbmFtZT0ibG9vcE5vZGUiIHR5cGU9Ikxvb3BOb2RlIiBhc3NvY2lhdGlvbj0iQV90ZXN0X2xvb3BOb2RlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Rlc3RfbG9vcE5vZGUtbG9vcE5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZGVjaWRlcl9sb29wTm9kZSIgbmFtZT0iQV9kZWNpZGVyX2xvb3BOb2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ikxvb3BOb2RlLWRlY2lkZXIgQV9kZWNpZGVyX2xvb3BOb2RlLWxvb3BOb2RlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZGVjaWRlcl9sb29wTm9kZS1sb29wTm9kZSIgbmFtZT0ibG9vcE5vZGUiIHR5cGU9Ikxvb3BOb2RlIiBhc3NvY2lhdGlvbj0iQV9kZWNpZGVyX2xvb3BOb2RlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2RlY2lkZXJfbG9vcE5vZGUtbG9vcE5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZGVzdHJveUF0X2xpbmtFbmREZXN0cnVjdGlvbkRhdGEiIG5hbWU9IkFfZGVzdHJveUF0X2xpbmtFbmREZXN0cnVjdGlvbkRhdGEiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iTGlua0VuZERlc3RydWN0aW9uRGF0YS1kZXN0cm95QXQgQV9kZXN0cm95QXRfbGlua0VuZERlc3RydWN0aW9uRGF0YS1saW5rRW5kRGVzdHJ1Y3Rpb25EYXRhIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZGVzdHJveUF0X2xpbmtFbmREZXN0cnVjdGlvbkRhdGEtbGlua0VuZERlc3RydWN0aW9uRGF0YSIgbmFtZT0ibGlua0VuZERlc3RydWN0aW9uRGF0YSIgdHlwZT0iTGlua0VuZERlc3RydWN0aW9uRGF0YSIgYXNzb2NpYXRpb249IkFfZGVzdHJveUF0X2xpbmtFbmREZXN0cnVjdGlvbkRhdGEiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZGVzdHJveUF0X2xpbmtFbmREZXN0cnVjdGlvbkRhdGEtbGlua0VuZERlc3RydWN0aW9uRGF0YS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV92YWx1ZV9saW5rRW5kRGF0YSIgbmFtZT0iQV92YWx1ZV9saW5rRW5kRGF0YSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJMaW5rRW5kRGF0YS12YWx1ZSBBX3ZhbHVlX2xpbmtFbmREYXRhLWxpbmtFbmREYXRhIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdmFsdWVfbGlua0VuZERhdGEtbGlua0VuZERhdGEiIG5hbWU9ImxpbmtFbmREYXRhIiB0eXBlPSJMaW5rRW5kRGF0YSIgYXNzb2NpYXRpb249IkFfdmFsdWVfbGlua0VuZERhdGEiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdmFsdWVfbGlua0VuZERhdGEtbGlua0VuZERhdGEtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZW5kX2xpbmtFbmREYXRhIiBuYW1lPSJBX2VuZF9saW5rRW5kRGF0YSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJMaW5rRW5kRGF0YS1lbmQgQV9lbmRfbGlua0VuZERhdGEtbGlua0VuZERhdGEiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lbmRfbGlua0VuZERhdGEtbGlua0VuZERhdGEiIG5hbWU9ImxpbmtFbmREYXRhIiB0eXBlPSJMaW5rRW5kRGF0YSIgYXNzb2NpYXRpb249IkFfZW5kX2xpbmtFbmREYXRhIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2VuZF9saW5rRW5kRGF0YS1saW5rRW5kRGF0YS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfZW5kX2xpbmtFbmREYXRhLWxpbmtFbmREYXRhLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9xdWFsaWZpZXJfbGlua0VuZERhdGEiIG5hbWU9IkFfcXVhbGlmaWVyX2xpbmtFbmREYXRhIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkxpbmtFbmREYXRhLXF1YWxpZmllciBBX3F1YWxpZmllcl9saW5rRW5kRGF0YS1saW5rRW5kRGF0YSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3F1YWxpZmllcl9saW5rRW5kRGF0YS1saW5rRW5kRGF0YSIgbmFtZT0ibGlua0VuZERhdGEiIHR5cGU9IkxpbmtFbmREYXRhIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfcXVhbGlmaWVyX2xpbmtFbmREYXRhIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW5zZXJ0QXRfbGlua0VuZENyZWF0aW9uRGF0YSIgbmFtZT0iQV9pbnNlcnRBdF9saW5rRW5kQ3JlYXRpb25EYXRhIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkxpbmtFbmRDcmVhdGlvbkRhdGEtaW5zZXJ0QXQgQV9pbnNlcnRBdF9saW5rRW5kQ3JlYXRpb25EYXRhLWxpbmtFbmRDcmVhdGlvbkRhdGEiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9pbnNlcnRBdF9saW5rRW5kQ3JlYXRpb25EYXRhLWxpbmtFbmRDcmVhdGlvbkRhdGEiIG5hbWU9ImxpbmtFbmRDcmVhdGlvbkRhdGEiIHR5cGU9IkxpbmtFbmRDcmVhdGlvbkRhdGEiIGFzc29jaWF0aW9uPSJBX2luc2VydEF0X2xpbmtFbmRDcmVhdGlvbkRhdGEiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfaW5zZXJ0QXRfbGlua0VuZENyZWF0aW9uRGF0YS1saW5rRW5kQ3JlYXRpb25EYXRhLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2lucHV0VmFsdWVfbGlua0FjdGlvbiIgbmFtZT0iQV9pbnB1dFZhbHVlX2xpbmtBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iTGlua0FjdGlvbi1pbnB1dFZhbHVlIEFfaW5wdXRWYWx1ZV9saW5rQWN0aW9uLWxpbmtBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9pbnB1dFZhbHVlX2xpbmtBY3Rpb24tbGlua0FjdGlvbiIgbmFtZT0ibGlua0FjdGlvbiIgdHlwZT0iTGlua0FjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfaW5wdXRWYWx1ZV9saW5rQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2lucHV0VmFsdWVfbGlua0FjdGlvbi1saW5rQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VuZERhdGFfbGlua0FjdGlvbiIgbmFtZT0iQV9lbmREYXRhX2xpbmtBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iTGlua0FjdGlvbi1lbmREYXRhIEFfZW5kRGF0YV9saW5rQWN0aW9uLWxpbmtBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lbmREYXRhX2xpbmtBY3Rpb24tbGlua0FjdGlvbiIgbmFtZT0ibGlua0FjdGlvbiIgdHlwZT0iTGlua0FjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2VuZERhdGFfbGlua0FjdGlvbiIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2FyZ3VtZW50X2ludm9jYXRpb25BY3Rpb24iIG5hbWU9IkFfYXJndW1lbnRfaW52b2NhdGlvbkFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnZvY2F0aW9uQWN0aW9uLWFyZ3VtZW50IEFfYXJndW1lbnRfaW52b2NhdGlvbkFjdGlvbi1pbnZvY2F0aW9uQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfYXJndW1lbnRfaW52b2NhdGlvbkFjdGlvbi1pbnZvY2F0aW9uQWN0aW9uIiBuYW1lPSJpbnZvY2F0aW9uQWN0aW9uIiB0eXBlPSJJbnZvY2F0aW9uQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9pbnB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9hcmd1bWVudF9pbnZvY2F0aW9uQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2FyZ3VtZW50X2ludm9jYXRpb25BY3Rpb24taW52b2NhdGlvbkFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vblBvcnRfaW52b2NhdGlvbkFjdGlvbiIgbmFtZT0iQV9vblBvcnRfaW52b2NhdGlvbkFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnZvY2F0aW9uQWN0aW9uLW9uUG9ydCBBX29uUG9ydF9pbnZvY2F0aW9uQWN0aW9uLWludm9jYXRpb25BY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vblBvcnRfaW52b2NhdGlvbkFjdGlvbi1pbnZvY2F0aW9uQWN0aW9uIiBuYW1lPSJpbnZvY2F0aW9uQWN0aW9uIiB0eXBlPSJJbnZvY2F0aW9uQWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9vblBvcnRfaW52b2NhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vblBvcnRfaW52b2NhdGlvbkFjdGlvbi1pbnZvY2F0aW9uQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9vblBvcnRfaW52b2NhdGlvbkFjdGlvbi1pbnZvY2F0aW9uQWN0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9pbnB1dEVsZW1lbnRfcmVnaW9uQXNJbnB1dCIgbmFtZT0iQV9pbnB1dEVsZW1lbnRfcmVnaW9uQXNJbnB1dCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFeHBhbnNpb25SZWdpb24taW5wdXRFbGVtZW50IEV4cGFuc2lvbk5vZGUtcmVnaW9uQXNJbnB1dCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX291dHB1dEVsZW1lbnRfcmVnaW9uQXNPdXRwdXQiIG5hbWU9IkFfb3V0cHV0RWxlbWVudF9yZWdpb25Bc091dHB1dCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFeHBhbnNpb25SZWdpb24tb3V0cHV0RWxlbWVudCBFeHBhbnNpb25Ob2RlLXJlZ2lvbkFzT3V0cHV0Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdGFyZ2V0X2Rlc3Ryb3lPYmplY3RBY3Rpb24iIG5hbWU9IkFfdGFyZ2V0X2Rlc3Ryb3lPYmplY3RBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRGVzdHJveU9iamVjdEFjdGlvbi10YXJnZXQgQV90YXJnZXRfZGVzdHJveU9iamVjdEFjdGlvbi1kZXN0cm95T2JqZWN0QWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdGFyZ2V0X2Rlc3Ryb3lPYmplY3RBY3Rpb24tZGVzdHJveU9iamVjdEFjdGlvbiIgbmFtZT0iZGVzdHJveU9iamVjdEFjdGlvbiIgdHlwZT0iRGVzdHJveU9iamVjdEFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfdGFyZ2V0X2Rlc3Ryb3lPYmplY3RBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdGFyZ2V0X2Rlc3Ryb3lPYmplY3RBY3Rpb24tZGVzdHJveU9iamVjdEFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lbmREYXRhX2Rlc3Ryb3lMaW5rQWN0aW9uIiBuYW1lPSJBX2VuZERhdGFfZGVzdHJveUxpbmtBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRGVzdHJveUxpbmtBY3Rpb24tZW5kRGF0YSBBX2VuZERhdGFfZGVzdHJveUxpbmtBY3Rpb24tZGVzdHJveUxpbmtBY3Rpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQV9lbmREYXRhX2Rlc3Ryb3lMaW5rQWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBX2VuZERhdGFfbGlua0FjdGlvbiIvPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lbmREYXRhX2Rlc3Ryb3lMaW5rQWN0aW9uLWRlc3Ryb3lMaW5rQWN0aW9uIiBuYW1lPSJkZXN0cm95TGlua0FjdGlvbiIgdHlwZT0iRGVzdHJveUxpbmtBY3Rpb24iIHJlZGVmaW5lZFByb3BlcnR5PSJBX2VuZERhdGFfbGlua0FjdGlvbi1saW5rQWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9lbmREYXRhX2Rlc3Ryb3lMaW5rQWN0aW9uIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY2xhc3NpZmllcl9jcmVhdGVPYmplY3RBY3Rpb24iIG5hbWU9IkFfY2xhc3NpZmllcl9jcmVhdGVPYmplY3RBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ3JlYXRlT2JqZWN0QWN0aW9uLWNsYXNzaWZpZXIgQV9jbGFzc2lmaWVyX2NyZWF0ZU9iamVjdEFjdGlvbi1jcmVhdGVPYmplY3RBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jbGFzc2lmaWVyX2NyZWF0ZU9iamVjdEFjdGlvbi1jcmVhdGVPYmplY3RBY3Rpb24iIG5hbWU9ImNyZWF0ZU9iamVjdEFjdGlvbiIgdHlwZT0iQ3JlYXRlT2JqZWN0QWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9jbGFzc2lmaWVyX2NyZWF0ZU9iamVjdEFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jbGFzc2lmaWVyX2NyZWF0ZU9iamVjdEFjdGlvbi1jcmVhdGVPYmplY3RBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NsYXNzaWZpZXJfY3JlYXRlT2JqZWN0QWN0aW9uLWNyZWF0ZU9iamVjdEFjdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVzdWx0X2NyZWF0ZU9iamVjdEFjdGlvbiIgbmFtZT0iQV9yZXN1bHRfY3JlYXRlT2JqZWN0QWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNyZWF0ZU9iamVjdEFjdGlvbi1yZXN1bHQgQV9yZXN1bHRfY3JlYXRlT2JqZWN0QWN0aW9uLWNyZWF0ZU9iamVjdEFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3Jlc3VsdF9jcmVhdGVPYmplY3RBY3Rpb24tY3JlYXRlT2JqZWN0QWN0aW9uIiBuYW1lPSJjcmVhdGVPYmplY3RBY3Rpb24iIHR5cGU9IkNyZWF0ZU9iamVjdEFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfb3V0cHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF9jcmVhdGVPYmplY3RBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVzdWx0X2NyZWF0ZU9iamVjdEFjdGlvbi1jcmVhdGVPYmplY3RBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVzdWx0X2NyZWF0ZUxpbmtPYmplY3RBY3Rpb24iIG5hbWU9IkFfcmVzdWx0X2NyZWF0ZUxpbmtPYmplY3RBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ3JlYXRlTGlua09iamVjdEFjdGlvbi1yZXN1bHQgQV9yZXN1bHRfY3JlYXRlTGlua09iamVjdEFjdGlvbi1jcmVhdGVMaW5rT2JqZWN0QWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVzdWx0X2NyZWF0ZUxpbmtPYmplY3RBY3Rpb24tY3JlYXRlTGlua09iamVjdEFjdGlvbiIgbmFtZT0iY3JlYXRlTGlua09iamVjdEFjdGlvbiIgdHlwZT0iQ3JlYXRlTGlua09iamVjdEFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfb3V0cHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX3Jlc3VsdF9jcmVhdGVMaW5rT2JqZWN0QWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Jlc3VsdF9jcmVhdGVMaW5rT2JqZWN0QWN0aW9uLWNyZWF0ZUxpbmtPYmplY3RBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZW5kRGF0YV9jcmVhdGVMaW5rQWN0aW9uIiBuYW1lPSJBX2VuZERhdGFfY3JlYXRlTGlua0FjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDcmVhdGVMaW5rQWN0aW9uLWVuZERhdGEgQV9lbmREYXRhX2NyZWF0ZUxpbmtBY3Rpb24tY3JlYXRlTGlua0FjdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBX2VuZERhdGFfY3JlYXRlTGlua0FjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQV9lbmREYXRhX2xpbmtBY3Rpb24iLz4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZW5kRGF0YV9jcmVhdGVMaW5rQWN0aW9uLWNyZWF0ZUxpbmtBY3Rpb24iIG5hbWU9ImNyZWF0ZUxpbmtBY3Rpb24iIHR5cGU9IkNyZWF0ZUxpbmtBY3Rpb24iIHJlZGVmaW5lZFByb3BlcnR5PSJBX2VuZERhdGFfbGlua0FjdGlvbi1saW5rQWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9lbmREYXRhX2NyZWF0ZUxpbmtBY3Rpb24iLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jbGF1c2VfY29uZGl0aW9uYWxOb2RlIiBuYW1lPSJBX2NsYXVzZV9jb25kaXRpb25hbE5vZGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ29uZGl0aW9uYWxOb2RlLWNsYXVzZSBBX2NsYXVzZV9jb25kaXRpb25hbE5vZGUtY29uZGl0aW9uYWxOb2RlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfY2xhdXNlX2NvbmRpdGlvbmFsTm9kZS1jb25kaXRpb25hbE5vZGUiIG5hbWU9ImNvbmRpdGlvbmFsTm9kZSIgdHlwZT0iQ29uZGl0aW9uYWxOb2RlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfY2xhdXNlX2NvbmRpdGlvbmFsTm9kZSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Jlc3VsdF9jb25kaXRpb25hbE5vZGUiIG5hbWU9IkFfcmVzdWx0X2NvbmRpdGlvbmFsTm9kZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDb25kaXRpb25hbE5vZGUtcmVzdWx0IEFfcmVzdWx0X2NvbmRpdGlvbmFsTm9kZS1jb25kaXRpb25hbE5vZGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXN1bHRfY29uZGl0aW9uYWxOb2RlLWNvbmRpdGlvbmFsTm9kZSIgbmFtZT0iY29uZGl0aW9uYWxOb2RlIiB0eXBlPSJDb25kaXRpb25hbE5vZGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3N0cnVjdHVyZWROb2RlT3V0cHV0X3N0cnVjdHVyZWRBY3Rpdml0eU5vZGUtc3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgYXNzb2NpYXRpb249IkFfcmVzdWx0X2NvbmRpdGlvbmFsTm9kZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXN1bHRfY29uZGl0aW9uYWxOb2RlLWNvbmRpdGlvbmFsTm9kZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXN1bHRfY2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgbmFtZT0iQV9yZXN1bHRfY2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXJlc3VsdCBBX3Jlc3VsdF9jbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLWNsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXN1bHRfY2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1jbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiBuYW1lPSJjbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiB0eXBlPSJDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9vdXRwdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfcmVzdWx0X2NsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVzdWx0X2NsZWFyU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tY2xlYXJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vYmplY3RfY2xlYXJBc3NvY2lhdGlvbkFjdGlvbiIgbmFtZT0iQV9vYmplY3RfY2xlYXJBc3NvY2lhdGlvbkFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGVhckFzc29jaWF0aW9uQWN0aW9uLW9iamVjdCBBX29iamVjdF9jbGVhckFzc29jaWF0aW9uQWN0aW9uLWNsZWFyQXNzb2NpYXRpb25BY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vYmplY3RfY2xlYXJBc3NvY2lhdGlvbkFjdGlvbi1jbGVhckFzc29jaWF0aW9uQWN0aW9uIiBuYW1lPSJjbGVhckFzc29jaWF0aW9uQWN0aW9uIiB0eXBlPSJDbGVhckFzc29jaWF0aW9uQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9pbnB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9vYmplY3RfY2xlYXJBc3NvY2lhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vYmplY3RfY2xlYXJBc3NvY2lhdGlvbkFjdGlvbi1jbGVhckFzc29jaWF0aW9uQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2Fzc29jaWF0aW9uX2NsZWFyQXNzb2NpYXRpb25BY3Rpb24iIG5hbWU9IkFfYXNzb2NpYXRpb25fY2xlYXJBc3NvY2lhdGlvbkFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGVhckFzc29jaWF0aW9uQWN0aW9uLWFzc29jaWF0aW9uIEFfYXNzb2NpYXRpb25fY2xlYXJBc3NvY2lhdGlvbkFjdGlvbi1jbGVhckFzc29jaWF0aW9uQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfYXNzb2NpYXRpb25fY2xlYXJBc3NvY2lhdGlvbkFjdGlvbi1jbGVhckFzc29jaWF0aW9uQWN0aW9uIiBuYW1lPSJjbGVhckFzc29jaWF0aW9uQWN0aW9uIiB0eXBlPSJDbGVhckFzc29jaWF0aW9uQWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9hc3NvY2lhdGlvbl9jbGVhckFzc29jaWF0aW9uQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2Fzc29jaWF0aW9uX2NsZWFyQXNzb2NpYXRpb25BY3Rpb24tY2xlYXJBc3NvY2lhdGlvbkFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9kZWNpZGVyX2NsYXVzZSIgbmFtZT0iQV9kZWNpZGVyX2NsYXVzZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGF1c2UtZGVjaWRlciBBX2RlY2lkZXJfY2xhdXNlLWNsYXVzZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2RlY2lkZXJfY2xhdXNlLWNsYXVzZSIgbmFtZT0iY2xhdXNlIiB0eXBlPSJDbGF1c2UiIGFzc29jaWF0aW9uPSJBX2RlY2lkZXJfY2xhdXNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2RlY2lkZXJfY2xhdXNlLWNsYXVzZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9ib2R5T3V0cHV0X2NsYXVzZSIgbmFtZT0iQV9ib2R5T3V0cHV0X2NsYXVzZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGF1c2UtYm9keU91dHB1dCBBX2JvZHlPdXRwdXRfY2xhdXNlLWNsYXVzZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2JvZHlPdXRwdXRfY2xhdXNlLWNsYXVzZSIgbmFtZT0iY2xhdXNlIiB0eXBlPSJDbGF1c2UiIGFzc29jaWF0aW9uPSJBX2JvZHlPdXRwdXRfY2xhdXNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2JvZHlPdXRwdXRfY2xhdXNlLWNsYXVzZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfYm9keU91dHB1dF9jbGF1c2UtY2xhdXNlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV90ZXN0X2NsYXVzZSIgbmFtZT0iQV90ZXN0X2NsYXVzZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGF1c2UtdGVzdCBBX3Rlc3RfY2xhdXNlLWNsYXVzZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3Rlc3RfY2xhdXNlLWNsYXVzZSIgbmFtZT0iY2xhdXNlIiB0eXBlPSJDbGF1c2UiIGFzc29jaWF0aW9uPSJBX3Rlc3RfY2xhdXNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Rlc3RfY2xhdXNlLWNsYXVzZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9ib2R5X2NsYXVzZSIgbmFtZT0iQV9ib2R5X2NsYXVzZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGF1c2UtYm9keSBBX2JvZHlfY2xhdXNlLWNsYXVzZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2JvZHlfY2xhdXNlLWNsYXVzZSIgbmFtZT0iY2xhdXNlIiB0eXBlPSJDbGF1c2UiIGFzc29jaWF0aW9uPSJBX2JvZHlfY2xhdXNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2JvZHlfY2xhdXNlLWNsYXVzZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9wcmVkZWNlc3NvckNsYXVzZV9zdWNjZXNzb3JDbGF1c2UiIG5hbWU9IkFfcHJlZGVjZXNzb3JDbGF1c2Vfc3VjY2Vzc29yQ2xhdXNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNsYXVzZS1wcmVkZWNlc3NvckNsYXVzZSBDbGF1c2Utc3VjY2Vzc29yQ2xhdXNlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdGFyZ2V0X2NhbGxPcGVyYXRpb25BY3Rpb24iIG5hbWU9IkFfdGFyZ2V0X2NhbGxPcGVyYXRpb25BY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ2FsbE9wZXJhdGlvbkFjdGlvbi10YXJnZXQgQV90YXJnZXRfY2FsbE9wZXJhdGlvbkFjdGlvbi1jYWxsT3BlcmF0aW9uQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdGFyZ2V0X2NhbGxPcGVyYXRpb25BY3Rpb24tY2FsbE9wZXJhdGlvbkFjdGlvbiIgbmFtZT0iY2FsbE9wZXJhdGlvbkFjdGlvbiIgdHlwZT0iQ2FsbE9wZXJhdGlvbkFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfdGFyZ2V0X2NhbGxPcGVyYXRpb25BY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdGFyZ2V0X2NhbGxPcGVyYXRpb25BY3Rpb24tY2FsbE9wZXJhdGlvbkFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vcGVyYXRpb25fY2FsbE9wZXJhdGlvbkFjdGlvbiIgbmFtZT0iQV9vcGVyYXRpb25fY2FsbE9wZXJhdGlvbkFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDYWxsT3BlcmF0aW9uQWN0aW9uLW9wZXJhdGlvbiBBX29wZXJhdGlvbl9jYWxsT3BlcmF0aW9uQWN0aW9uLWNhbGxPcGVyYXRpb25BY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vcGVyYXRpb25fY2FsbE9wZXJhdGlvbkFjdGlvbi1jYWxsT3BlcmF0aW9uQWN0aW9uIiBuYW1lPSJjYWxsT3BlcmF0aW9uQWN0aW9uIiB0eXBlPSJDYWxsT3BlcmF0aW9uQWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9vcGVyYXRpb25fY2FsbE9wZXJhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vcGVyYXRpb25fY2FsbE9wZXJhdGlvbkFjdGlvbi1jYWxsT3BlcmF0aW9uQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9vcGVyYXRpb25fY2FsbE9wZXJhdGlvbkFjdGlvbi1jYWxsT3BlcmF0aW9uQWN0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9iZWhhdmlvcl9jYWxsQmVoYXZpb3JBY3Rpb24iIG5hbWU9IkFfYmVoYXZpb3JfY2FsbEJlaGF2aW9yQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNhbGxCZWhhdmlvckFjdGlvbi1iZWhhdmlvciBBX2JlaGF2aW9yX2NhbGxCZWhhdmlvckFjdGlvbi1jYWxsQmVoYXZpb3JBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9iZWhhdmlvcl9jYWxsQmVoYXZpb3JBY3Rpb24tY2FsbEJlaGF2aW9yQWN0aW9uIiBuYW1lPSJjYWxsQmVoYXZpb3JBY3Rpb24iIHR5cGU9IkNhbGxCZWhhdmlvckFjdGlvbiIgYXNzb2NpYXRpb249IkFfYmVoYXZpb3JfY2FsbEJlaGF2aW9yQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2JlaGF2aW9yX2NhbGxCZWhhdmlvckFjdGlvbi1jYWxsQmVoYXZpb3JBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2JlaGF2aW9yX2NhbGxCZWhhdmlvckFjdGlvbi1jYWxsQmVoYXZpb3JBY3Rpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Jlc3VsdF9jYWxsQWN0aW9uIiBuYW1lPSJBX3Jlc3VsdF9jYWxsQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNhbGxBY3Rpb24tcmVzdWx0IEFfcmVzdWx0X2NhbGxBY3Rpb24tY2FsbEFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3Jlc3VsdF9jYWxsQWN0aW9uLWNhbGxBY3Rpb24iIG5hbWU9ImNhbGxBY3Rpb24iIHR5cGU9IkNhbGxBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX291dHB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfY2FsbEFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXN1bHRfY2FsbEFjdGlvbi1jYWxsQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3NpZ25hbF9icm9hZGNhc3RTaWduYWxBY3Rpb24iIG5hbWU9IkFfc2lnbmFsX2Jyb2FkY2FzdFNpZ25hbEFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJCcm9hZGNhc3RTaWduYWxBY3Rpb24tc2lnbmFsIEFfc2lnbmFsX2Jyb2FkY2FzdFNpZ25hbEFjdGlvbi1icm9hZGNhc3RTaWduYWxBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9zaWduYWxfYnJvYWRjYXN0U2lnbmFsQWN0aW9uLWJyb2FkY2FzdFNpZ25hbEFjdGlvbiIgbmFtZT0iYnJvYWRjYXN0U2lnbmFsQWN0aW9uIiB0eXBlPSJCcm9hZGNhc3RTaWduYWxBY3Rpb24iIGFzc29jaWF0aW9uPSJBX3NpZ25hbF9icm9hZGNhc3RTaWduYWxBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc2lnbmFsX2Jyb2FkY2FzdFNpZ25hbEFjdGlvbi1icm9hZGNhc3RTaWduYWxBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3NpZ25hbF9icm9hZGNhc3RTaWduYWxBY3Rpb24tYnJvYWRjYXN0U2lnbmFsQWN0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9pbnNlcnRBdF9hZGRWYXJpYWJsZVZhbHVlQWN0aW9uIiBuYW1lPSJBX2luc2VydEF0X2FkZFZhcmlhYmxlVmFsdWVBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQWRkVmFyaWFibGVWYWx1ZUFjdGlvbi1pbnNlcnRBdCBBX2luc2VydEF0X2FkZFZhcmlhYmxlVmFsdWVBY3Rpb24tYWRkVmFyaWFibGVWYWx1ZUFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2luc2VydEF0X2FkZFZhcmlhYmxlVmFsdWVBY3Rpb24tYWRkVmFyaWFibGVWYWx1ZUFjdGlvbiIgbmFtZT0iYWRkVmFyaWFibGVWYWx1ZUFjdGlvbiIgdHlwZT0iQWRkVmFyaWFibGVWYWx1ZUFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfaW5wdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfaW5zZXJ0QXRfYWRkVmFyaWFibGVWYWx1ZUFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9pbnNlcnRBdF9hZGRWYXJpYWJsZVZhbHVlQWN0aW9uLWFkZFZhcmlhYmxlVmFsdWVBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW5zZXJ0QXRfYWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgbmFtZT0iQV9pbnNlcnRBdF9hZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24taW5zZXJ0QXQgQV9pbnNlcnRBdF9hZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLWFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9pbnNlcnRBdF9hZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLWFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIG5hbWU9ImFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIHR5cGU9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX2lucHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX2luc2VydEF0X2FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfaW5zZXJ0QXRfYWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbi1hZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2Zyb21BY3Rpb25fYWN0aW9uSW5wdXRQaW4iIG5hbWU9IkFfZnJvbUFjdGlvbl9hY3Rpb25JbnB1dFBpbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpb25JbnB1dFBpbi1mcm9tQWN0aW9uIEFfZnJvbUFjdGlvbl9hY3Rpb25JbnB1dFBpbi1hY3Rpb25JbnB1dFBpbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2Zyb21BY3Rpb25fYWN0aW9uSW5wdXRQaW4tYWN0aW9uSW5wdXRQaW4iIG5hbWU9ImFjdGlvbklucHV0UGluIiB0eXBlPSJBY3Rpb25JbnB1dFBpbiIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2Zyb21BY3Rpb25fYWN0aW9uSW5wdXRQaW4iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZnJvbUFjdGlvbl9hY3Rpb25JbnB1dFBpbi1hY3Rpb25JbnB1dFBpbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vdXRwdXRfYWN0aW9uIiBuYW1lPSJBX291dHB1dF9hY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJBY3Rpb24tb3V0cHV0IEFfb3V0cHV0X2FjdGlvbi1hY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vdXRwdXRfYWN0aW9uLWFjdGlvbiIgbmFtZT0iYWN0aW9uIiB0eXBlPSJBY3Rpb24iIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9vdXRwdXRfYWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX291dHB1dF9hY3Rpb24tYWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NvbnRleHRfYWN0aW9uIiBuYW1lPSJBX2NvbnRleHRfYWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBpc0Rlcml2ZWQ9InRydWUiIG1lbWJlckVuZD0iQWN0aW9uLWNvbnRleHQgQV9jb250ZXh0X2FjdGlvbi1hY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jb250ZXh0X2FjdGlvbi1hY3Rpb24iIG5hbWU9ImFjdGlvbiIgdHlwZT0iQWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9jb250ZXh0X2FjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jb250ZXh0X2FjdGlvbi1hY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NvbnRleHRfYWN0aW9uLWFjdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW5wdXRfYWN0aW9uIiBuYW1lPSJBX2lucHV0X2FjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkFjdGlvbi1pbnB1dCBBX2lucHV0X2FjdGlvbi1hY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9pbnB1dF9hY3Rpb24tYWN0aW9uIiBuYW1lPSJhY3Rpb24iIHR5cGU9IkFjdGlvbiIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBpc0Rlcml2ZWRVbmlvbj0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2lucHV0X2FjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9pbnB1dF9hY3Rpb24tYWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2xvY2FsUHJlY29uZGl0aW9uX2FjdGlvbiIgbmFtZT0iQV9sb2NhbFByZWNvbmRpdGlvbl9hY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQWN0aW9uLWxvY2FsUHJlY29uZGl0aW9uIEFfbG9jYWxQcmVjb25kaXRpb25fYWN0aW9uLWFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2xvY2FsUHJlY29uZGl0aW9uX2FjdGlvbi1hY3Rpb24iIG5hbWU9ImFjdGlvbiIgdHlwZT0iQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfbG9jYWxQcmVjb25kaXRpb25fYWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2xvY2FsUHJlY29uZGl0aW9uX2FjdGlvbi1hY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbG9jYWxQb3N0Y29uZGl0aW9uX2FjdGlvbiIgbmFtZT0iQV9sb2NhbFBvc3Rjb25kaXRpb25fYWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFjdGlvbi1sb2NhbFBvc3Rjb25kaXRpb24gQV9sb2NhbFBvc3Rjb25kaXRpb25fYWN0aW9uLWFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2xvY2FsUG9zdGNvbmRpdGlvbl9hY3Rpb24tYWN0aW9uIiBuYW1lPSJhY3Rpb24iIHR5cGU9IkFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2xvY2FsUG9zdGNvbmRpdGlvbl9hY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbG9jYWxQb3N0Y29uZGl0aW9uX2FjdGlvbi1hY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdHJpZ2dlcl9hY2NlcHRFdmVudEFjdGlvbiIgbmFtZT0iQV90cmlnZ2VyX2FjY2VwdEV2ZW50QWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFjY2VwdEV2ZW50QWN0aW9uLXRyaWdnZXIgQV90cmlnZ2VyX2FjY2VwdEV2ZW50QWN0aW9uLWFjY2VwdEV2ZW50QWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdHJpZ2dlcl9hY2NlcHRFdmVudEFjdGlvbi1hY2NlcHRFdmVudEFjdGlvbiIgbmFtZT0iYWNjZXB0RXZlbnRBY3Rpb24iIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfdHJpZ2dlcl9hY2NlcHRFdmVudEFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV90cmlnZ2VyX2FjY2VwdEV2ZW50QWN0aW9uLWFjY2VwdEV2ZW50QWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Jlc3VsdF9hY2NlcHRFdmVudEFjdGlvbiIgbmFtZT0iQV9yZXN1bHRfYWNjZXB0RXZlbnRBY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQWNjZXB0RXZlbnRBY3Rpb24tcmVzdWx0IEFfcmVzdWx0X2FjY2VwdEV2ZW50QWN0aW9uLWFjY2VwdEV2ZW50QWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVzdWx0X2FjY2VwdEV2ZW50QWN0aW9uLWFjY2VwdEV2ZW50QWN0aW9uIiBuYW1lPSJhY2NlcHRFdmVudEFjdGlvbiIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX291dHB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfYWNjZXB0RXZlbnRBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVzdWx0X2FjY2VwdEV2ZW50QWN0aW9uLWFjY2VwdEV2ZW50QWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JldHVybkluZm9ybWF0aW9uX2FjY2VwdENhbGxBY3Rpb24iIG5hbWU9IkFfcmV0dXJuSW5mb3JtYXRpb25fYWNjZXB0Q2FsbEFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY2NlcHRDYWxsQWN0aW9uLXJldHVybkluZm9ybWF0aW9uIEFfcmV0dXJuSW5mb3JtYXRpb25fYWNjZXB0Q2FsbEFjdGlvbi1hY2NlcHRDYWxsQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmV0dXJuSW5mb3JtYXRpb25fYWNjZXB0Q2FsbEFjdGlvbi1hY2NlcHRDYWxsQWN0aW9uIiBuYW1lPSJhY2NlcHRDYWxsQWN0aW9uIiB0eXBlPSJBY2NlcHRDYWxsQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9vdXRwdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfcmV0dXJuSW5mb3JtYXRpb25fYWNjZXB0Q2FsbEFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXR1cm5JbmZvcm1hdGlvbl9hY2NlcHRDYWxsQWN0aW9uLWFjY2VwdENhbGxBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdmFsdWVfd3JpdGVWYXJpYWJsZUFjdGlvbiIgbmFtZT0iQV92YWx1ZV93cml0ZVZhcmlhYmxlQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IldyaXRlVmFyaWFibGVBY3Rpb24tdmFsdWUgQV92YWx1ZV93cml0ZVZhcmlhYmxlQWN0aW9uLXdyaXRlVmFyaWFibGVBY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV92YWx1ZV93cml0ZVZhcmlhYmxlQWN0aW9uLXdyaXRlVmFyaWFibGVBY3Rpb24iIG5hbWU9IndyaXRlVmFyaWFibGVBY3Rpb24iIHR5cGU9IldyaXRlVmFyaWFibGVBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX2lucHV0X2FjdGlvbi1hY3Rpb24iIGFzc29jaWF0aW9uPSJBX3ZhbHVlX3dyaXRlVmFyaWFibGVBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdmFsdWVfd3JpdGVWYXJpYWJsZUFjdGlvbi13cml0ZVZhcmlhYmxlQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Jlc3VsdF93cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiBuYW1lPSJBX3Jlc3VsdF93cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24tcmVzdWx0IEFfcmVzdWx0X3dyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24td3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3Jlc3VsdF93cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXdyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIG5hbWU9IndyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIHR5cGU9IldyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX291dHB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfd3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXN1bHRfd3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi13cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3ZhbHVlX3dyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24iIG5hbWU9IkFfdmFsdWVfd3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uLXZhbHVlIEFfdmFsdWVfd3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi13cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdmFsdWVfd3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi13cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiBuYW1lPSJ3cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiB0eXBlPSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9pbnB1dF9hY3Rpb24tYWN0aW9uIiBhc3NvY2lhdGlvbj0iQV92YWx1ZV93cml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3ZhbHVlX3dyaXRlU3RydWN0dXJhbEZlYXR1cmVBY3Rpb24td3JpdGVTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV92YXJpYWJsZV92YXJpYWJsZUFjdGlvbiIgbmFtZT0iQV92YXJpYWJsZV92YXJpYWJsZUFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJWYXJpYWJsZUFjdGlvbi12YXJpYWJsZSBBX3ZhcmlhYmxlX3ZhcmlhYmxlQWN0aW9uLXZhcmlhYmxlQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdmFyaWFibGVfdmFyaWFibGVBY3Rpb24tdmFyaWFibGVBY3Rpb24iIG5hbWU9InZhcmlhYmxlQWN0aW9uIiB0eXBlPSJWYXJpYWJsZUFjdGlvbiIgYXNzb2NpYXRpb249IkFfdmFyaWFibGVfdmFyaWFibGVBY3Rpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdmFyaWFibGVfdmFyaWFibGVBY3Rpb24tdmFyaWFibGVBY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3ZhcmlhYmxlX3ZhcmlhYmxlQWN0aW9uLXZhcmlhYmxlQWN0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXN1bHRfdmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiBuYW1lPSJBX3Jlc3VsdF92YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uLXJlc3VsdCBBX3Jlc3VsdF92YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tdmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVzdWx0X3ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbi12YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIG5hbWU9InZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9vdXRwdXRfYWN0aW9uLWFjdGlvbiIgYXNzb2NpYXRpb249IkFfcmVzdWx0X3ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXN1bHRfdmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uLXZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV92YWx1ZV92YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIG5hbWU9IkFfdmFsdWVfdmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbi12YWx1ZSBBX3ZhbHVlX3ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbi12YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV92YWx1ZV92YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tdmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiBuYW1lPSJ2YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX3ZhbHVlX3ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV92YWx1ZV92YWx1ZVNwZWNpZmljYXRpb25BY3Rpb24tdmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJBY3Rpdml0eSIgbmFtZT0iQWN0aXZpdHkiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHkiPgotICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eSBpcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBwYXJhbWV0ZXJpemVkIEJlaGF2aW9yIGFzIHRoZSBjb29yZGluYXRlZCBzZXF1ZW5jaW5nIG9mIHN1Ym9yZGluYXRlIHVuaXRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFjdGl2aXR5LW1heGltdW1fb25lX3BhcmFtZXRlcl9ub2RlIiBuYW1lPSJtYXhpbXVtX29uZV9wYXJhbWV0ZXJfbm9kZSIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpdml0eSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eS1tYXhpbXVtX29uZV9wYXJhbWV0ZXJfbm9kZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5LW1heGltdW1fb25lX3BhcmFtZXRlcl9ub2RlIj4KLSAgICAgICAgICA8Ym9keT5BIFBhcmFtZXRlciB3aXRoIGRpcmVjdGlvbiBvdGhlciB0aGFuIGlub3V0IG11c3QgaGF2ZSBleGFjdGx5IG9uZSBBY3Rpdml0eVBhcmFtZXRlck5vZGUgaW4gYW4gQWN0aXZpdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGl2aXR5LW1heGltdW1fb25lX3BhcmFtZXRlcl9ub2RlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vd25lZFBhcmFtZXRlci0+Zm9yQWxsKHAgfCAmI3hEOwotICAgcC5kaXJlY3Rpb24gJmx0Oz4gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6aW5vdXQgaW1wbGllcyBub2RlLT5zZWxlY3QoJiN4RDsKLSAgICAgICBvY2xJc0tpbmRPZihBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGFuZCBvY2xBc1R5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKS5wYXJhbWV0ZXIgPSBwKS0+c2l6ZSgpPSAxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWN0aXZpdHktbWF4aW11bV90d29fcGFyYW1ldGVyX25vZGVzIiBuYW1lPSJtYXhpbXVtX3R3b19wYXJhbWV0ZXJfbm9kZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQWN0aXZpdHkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHktbWF4aW11bV90d29fcGFyYW1ldGVyX25vZGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHktbWF4aW11bV90d29fcGFyYW1ldGVyX25vZGVzIj4KLSAgICAgICAgICA8Ym9keT5BIFBhcmFtZXRlciB3aXRoIGRpcmVjdGlvbiBpbm91dCBtdXN0IGhhdmUgZXhhY3RseSB0d28gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlcyBpbiBhbiBBY3Rpdml0eSwgYXQgbW9zdCBvbmUgd2l0aCBpbmNvbWluZyBBY3Rpdml0eUVkZ2VzIGFuZCBhdCBtb3N0IG9uZSB3aXRoIG91dGdvaW5nIEFjdGl2aXR5RWRnZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGl2aXR5LW1heGltdW1fdHdvX3BhcmFtZXRlcl9ub2Rlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b3duZWRQYXJhbWV0ZXItPmZvckFsbChwIHwgJiN4RDsKLXAuZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6aW5vdXQgaW1wbGllcyYjeEQ7Ci1sZXQgYXNzb2NpYXRlZE5vZGVzIDogU2V0KEFjdGl2aXR5Tm9kZSkgPSBub2RlLT5zZWxlY3QoJiN4RDsKLSAgICAgICBvY2xJc0tpbmRPZihBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGFuZCBvY2xBc1R5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKS5wYXJhbWV0ZXIgPSBwKSBpbiAmI3hEOwotICBhc3NvY2lhdGVkTm9kZXMtPnNpemUoKT0yIGFuZCYjeEQ7Ci0gIGFzc29jaWF0ZWROb2Rlcy0+c2VsZWN0KGluY29taW5nLT5ub3RFbXB0eSgpKS0+c2l6ZSgpJmx0Oz0xIGFuZCYjeEQ7Ci0gIGFzc29jaWF0ZWROb2Rlcy0+c2VsZWN0KG91dGdvaW5nLT5ub3RFbXB0eSgpKS0+c2l6ZSgpJmx0Oz0xJiN4RDsKLSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQWN0aXZpdHktX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkJlaGF2aW9yIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eS1vd25lZEdyb3VwIiBuYW1lPSJvd25lZEdyb3VwIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIHR5cGU9IkFjdGl2aXR5R3JvdXAiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpdml0eS1ncm91cCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHktb3duZWRHcm91cC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFjdGl2aXR5LW93bmVkR3JvdXAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHktb3duZWROb2RlIiBuYW1lPSJvd25lZE5vZGUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgdHlwZT0iQWN0aXZpdHlOb2RlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aXZpdHktbm9kZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHktb3duZWROb2RlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHktb3duZWROb2RlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5LWVkZ2UiIG5hbWU9ImVkZ2UiIHR5cGU9IkFjdGl2aXR5RWRnZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9lZGdlX2FjdGl2aXR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5LWVkZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eS1lZGdlIj4KLSAgICAgICAgICA8Ym9keT5BY3Rpdml0eUVkZ2VzIGV4cHJlc3NpbmcgZmxvdyBiZXR3ZWVuIHRoZSBub2RlcyBvZiB0aGUgQWN0aXZpdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY3Rpdml0eS1lZGdlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHktZWRnZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eS1ncm91cCIgbmFtZT0iZ3JvdXAiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgdHlwZT0iQWN0aXZpdHlHcm91cCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2dyb3VwX2luQWN0aXZpdHkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHktZ3JvdXAtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eS1ncm91cCI+Ci0gICAgICAgICAgPGJvZHk+VG9wLWxldmVsIEFjdGl2aXR5R3JvdXBzIGluIHRoZSBBY3Rpdml0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGl2aXR5LWdyb3VwLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHktZ3JvdXAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHktaXNSZWFkT25seSIgbmFtZT0iaXNSZWFkT25seSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eS1pc1JlYWRPbmx5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHktaXNSZWFkT25seSI+Ci0gICAgICAgICAgPGJvZHk+SWYgdHJ1ZSwgdGhpcyBBY3Rpdml0eSBtdXN0IG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIG9iamVjdHMuIFRoZSBkZWZhdWx0IGlzIGZhbHNlIChhbiBBY3Rpdml0eSBtYXkgbWFrZSBub25sb2NhbCBjaGFuZ2VzKS4gKFRoaXMgaXMgYW4gYXNzZXJ0aW9uLCBub3QgYW4gZXhlY3V0YWJsZSBwcm9wZXJ0eS4gSXQgbWF5IGJlIHVzZWQgYnkgYW4gZXhlY3V0aW9uIGVuZ2luZSB0byBvcHRpbWl6ZSBtb2RlbCBleGVjdXRpb24uIElmIHRoZSBhc3NlcnRpb24gaXMgdmlvbGF0ZWQgYnkgdGhlIEFjdGl2aXR5LCB0aGVuIHRoZSBtb2RlbCBpcyBpbGwtZm9ybWVkLik8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJBY3Rpdml0eS1pc1JlYWRPbmx5LV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eS1pc1NpbmdsZUV4ZWN1dGlvbiIgbmFtZT0iaXNTaW5nbGVFeGVjdXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHktaXNTaW5nbGVFeGVjdXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eS1pc1NpbmdsZUV4ZWN1dGlvbiI+Ci0gICAgICAgICAgPGJvZHk+SWYgdHJ1ZSwgYWxsIGludm9jYXRpb25zIG9mIHRoZSBBY3Rpdml0eSBhcmUgaGFuZGxlZCBieSB0aGUgc2FtZSBleGVjdXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iQWN0aXZpdHktaXNTaW5nbGVFeGVjdXRpb24tX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5LW5vZGUiIG5hbWU9Im5vZGUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgdHlwZT0iQWN0aXZpdHlOb2RlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBpc0Rlcml2ZWQ9InRydWUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfbm9kZV9hY3Rpdml0eSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eS1ub2RlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHktbm9kZSI+Ci0gICAgICAgICAgPGJvZHk+QWN0aXZpdHlOb2RlcyBjb29yZGluYXRlZCBieSB0aGUgQWN0aXZpdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY3Rpdml0eS1ub2RlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHktbm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eS1wYXJ0aXRpb24iIG5hbWU9InBhcnRpdGlvbiIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiB0eXBlPSJBY3Rpdml0eVBhcnRpdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGl2aXR5LWdyb3VwIEFjdGl2aXR5LW93bmVkR3JvdXAiIGFzc29jaWF0aW9uPSJBX3BhcnRpdGlvbl9hY3Rpdml0eSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eS1wYXJ0aXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eS1wYXJ0aXRpb24iPgotICAgICAgICAgIDxib2R5PlRvcC1sZXZlbCBBY3Rpdml0eVBhcnRpdGlvbnMgaW4gdGhlIEFjdGl2aXR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHktcGFydGl0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHktcGFydGl0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5LXN0cnVjdHVyZWROb2RlIiBuYW1lPSJzdHJ1Y3R1cmVkTm9kZSIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiB0eXBlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aXZpdHktZ3JvdXAgQWN0aXZpdHktbm9kZSIgYXNzb2NpYXRpb249IkFfc3RydWN0dXJlZE5vZGVfYWN0aXZpdHkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHktc3RydWN0dXJlZE5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eS1zdHJ1Y3R1cmVkTm9kZSI+Ci0gICAgICAgICAgPGJvZHk+VG9wLWxldmVsIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVzIGluIHRoZSBBY3Rpdml0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGl2aXR5LXN0cnVjdHVyZWROb2RlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHktc3RydWN0dXJlZE5vZGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHktdmFyaWFibGUiIG5hbWU9InZhcmlhYmxlIiB0eXBlPSJWYXJpYWJsZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfdmFyaWFibGVfYWN0aXZpdHlTY29wZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eS12YXJpYWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5LXZhcmlhYmxlIj4KLSAgICAgICAgICA8Ym9keT5Ub3AtbGV2ZWwgVmFyaWFibGVzIGRlZmluZWQgYnkgdGhlIEFjdGl2aXR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHktdmFyaWFibGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBY3Rpdml0eS12YXJpYWJsZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkFjdGl2aXR5RWRnZSIgbmFtZT0iQWN0aXZpdHlFZGdlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eUVkZ2UiPgotICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eUVkZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIGRpcmVjdGVkIGNvbm5lY3Rpb25zIGJldHdlZW4gdHdvIEFjdGl2aXR5Tm9kZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWN0aXZpdHlFZGdlLXNvdXJjZV9hbmRfdGFyZ2V0IiBuYW1lPSJzb3VyY2VfYW5kX3RhcmdldCIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpdml0eUVkZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlFZGdlLXNvdXJjZV9hbmRfdGFyZ2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlFZGdlLXNvdXJjZV9hbmRfdGFyZ2V0Ij4KLSAgICAgICAgICA8Ym9keT5JZiBhbiBBY3Rpdml0eUVkZ2UgaXMgZGlyZWN0bHkgb3duZWQgYnkgYW4gQWN0aXZpdHksIHRoZW4gaXRzIHNvdXJjZSBhbmQgdGFyZ2V0IG11c3QgYmUgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjb250YWluZWQgaW4gdGhlIHNhbWUgQWN0aXZpdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGl2aXR5RWRnZS1zb3VyY2VfYW5kX3RhcmdldC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+YWN0aXZpdHkmbHQ7Pm51bGwgaW1wbGllcyBzb3VyY2UuY29udGFpbmluZ0FjdGl2aXR5KCkgPSBhY3Rpdml0eSBhbmQgdGFyZ2V0LmNvbnRhaW5pbmdBY3Rpdml0eSgpID0gYWN0aXZpdHk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQWN0aXZpdHlFZGdlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5RWRnZS1hY3Rpdml0eSIgbmFtZT0iYWN0aXZpdHkiIHR5cGU9IkFjdGl2aXR5IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfZWRnZV9hY3Rpdml0eSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtYWN0aXZpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eUVkZ2UtYWN0aXZpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBBY3Rpdml0eSBjb250YWluaW5nIHRoZSBBY3Rpdml0eUVkZ2UsIGlmIGl0IGlzIGRpcmVjdGx5IG93bmVkIGJ5IGFuIEFjdGl2aXR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlFZGdlLWFjdGl2aXR5LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlFZGdlLWd1YXJkIiBuYW1lPSJndWFyZCIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2d1YXJkX2FjdGl2aXR5RWRnZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtZ3VhcmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eUVkZ2UtZ3VhcmQiPgotICAgICAgICAgIDxib2R5PkEgVmFsdWVTcGVjaWZpY2F0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIHRvIGRldGVybWluZSBpZiBhIHRva2VuIGNhbiB0cmF2ZXJzZSB0aGUgQWN0aXZpdHlFZGdlLiBJZiBhbiBBY3Rpdml0eUVkZ2UgaGFzIG5vIGd1YXJkLCB0aGVuIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIHRva2VucyB0cmF2ZXJzaW5nIHRoZSBlZGdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlFZGdlLWd1YXJkLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlFZGdlLWluR3JvdXAiIG5hbWU9ImluR3JvdXAiIHR5cGU9IkFjdGl2aXR5R3JvdXAiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIGFzc29jaWF0aW9uPSJBX2NvbnRhaW5lZEVkZ2VfaW5Hcm91cCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtaW5Hcm91cC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5RWRnZS1pbkdyb3VwIj4KLSAgICAgICAgICA8Ym9keT5BY3Rpdml0eUdyb3VwcyBjb250YWluaW5nIHRoZSBBY3Rpdml0eUVkZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtaW5Hcm91cC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFjdGl2aXR5RWRnZS1pbkdyb3VwLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5RWRnZS1pblBhcnRpdGlvbiIgbmFtZT0iaW5QYXJ0aXRpb24iIHR5cGU9IkFjdGl2aXR5UGFydGl0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aXZpdHlFZGdlLWluR3JvdXAiIGFzc29jaWF0aW9uPSJBX2VkZ2VfaW5QYXJ0aXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlFZGdlLWluUGFydGl0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlFZGdlLWluUGFydGl0aW9uIj4KLSAgICAgICAgICA8Ym9keT5BY3Rpdml0eVBhcnRpdGlvbnMgY29udGFpbmluZyB0aGUgQWN0aXZpdHlFZGdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlFZGdlLWluUGFydGl0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHlFZGdlLWluUGFydGl0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5RWRnZS1pblN0cnVjdHVyZWROb2RlIiBuYW1lPSJpblN0cnVjdHVyZWROb2RlIiB0eXBlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aXZpdHlFZGdlLWluR3JvdXAgRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfZWRnZV9pblN0cnVjdHVyZWROb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5RWRnZS1pblN0cnVjdHVyZWROb2RlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlFZGdlLWluU3RydWN0dXJlZE5vZGUiPgotICAgICAgICAgIDxib2R5PlRoZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5pbmcgdGhlIEFjdGl2aXR5RWRnZSwgaWYgaXQgaXMgb3duZWQgYnkgYSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlFZGdlLWluU3RydWN0dXJlZE5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtaW50ZXJydXB0cyIgbmFtZT0iaW50ZXJydXB0cyIgdHlwZT0iSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uIiBhc3NvY2lhdGlvbj0iQV9pbnRlcnJ1cHRpbmdFZGdlX2ludGVycnVwdHMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlFZGdlLWludGVycnVwdHMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eUVkZ2UtaW50ZXJydXB0cyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVycnVwdGlibGVBY3Rpdml0eVJlZ2lvbiBmb3Igd2hpY2ggdGhpcyBBY3Rpdml0eUVkZ2UgaXMgYW4gaW50ZXJydXB0aW5nRWRnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGl2aXR5RWRnZS1pbnRlcnJ1cHRzLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlFZGdlLXJlZGVmaW5lZEVkZ2UiIG5hbWU9InJlZGVmaW5lZEVkZ2UiIHR5cGU9IkFjdGl2aXR5RWRnZSIgc3Vic2V0dGVkUHJvcGVydHk9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluZWRFZGdlX2FjdGl2aXR5RWRnZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtcmVkZWZpbmVkRWRnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5RWRnZS1yZWRlZmluZWRFZGdlIj4KLSAgICAgICAgICA8Ym9keT5BY3Rpdml0eUVkZ2VzIGZyb20gYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgQWN0aXZpdHkgY29udGFpbmluZyB0aGlzIEFjdGl2aXR5RWRnZSB0aGF0IGFyZSByZWRlZmluZWQgYnkgdGhpcyBBY3Rpdml0eUVkZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtcmVkZWZpbmVkRWRnZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFjdGl2aXR5RWRnZS1yZWRlZmluZWRFZGdlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5RWRnZS1zb3VyY2UiIG5hbWU9InNvdXJjZSIgdHlwZT0iQWN0aXZpdHlOb2RlIiBhc3NvY2lhdGlvbj0iQV9vdXRnb2luZ19zb3VyY2Vfbm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eUVkZ2Utc291cmNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlFZGdlLXNvdXJjZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEFjdGl2aXR5Tm9kZSBmcm9tIHdoaWNoIHRva2VucyBhcmUgdGFrZW4gd2hlbiB0aGV5IHRyYXZlcnNlIHRoZSBBY3Rpdml0eUVkZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtdGFyZ2V0IiBuYW1lPSJ0YXJnZXQiIHR5cGU9IkFjdGl2aXR5Tm9kZSIgYXNzb2NpYXRpb249IkFfaW5jb21pbmdfdGFyZ2V0X25vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlFZGdlLXRhcmdldC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5RWRnZS10YXJnZXQiPgotICAgICAgICAgIDxib2R5PlRoZSBBY3Rpdml0eU5vZGUgdG8gd2hpY2ggdG9rZW5zIGFyZSBwdXQgd2hlbiB0aGV5IHRyYXZlcnNlIHRoZSBBY3Rpdml0eUVkZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eUVkZ2Utd2VpZ2h0IiBuYW1lPSJ3ZWlnaHQiIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV93ZWlnaHRfYWN0aXZpdHlFZGdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5RWRnZS13ZWlnaHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eUVkZ2Utd2VpZ2h0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbWluaW11bSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgbXVzdCB0cmF2ZXJzZSB0aGUgQWN0aXZpdHlFZGdlIGF0IHRoZSBzYW1lIHRpbWUuIElmIG5vIHdlaWdodCBpcyBzcGVjaWZpZWQsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIGEgY29uc3RhbnQgdmFsdWUgb2YgMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGl2aXR5RWRnZS13ZWlnaHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJBY3Rpdml0eUVkZ2UtaXNDb25zaXN0ZW50V2l0aCIgbmFtZT0iaXNDb25zaXN0ZW50V2l0aCIgYm9keUNvbmRpdGlvbj0iQWN0aXZpdHlFZGdlLWlzQ29uc2lzdGVudFdpdGgtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJSZWRlZmluYWJsZUVsZW1lbnQtaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtaXNDb25zaXN0ZW50V2l0aC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFjdGl2aXR5RWRnZS1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWN0aXZpdHlFZGdlLWlzQ29uc2lzdGVudFdpdGgtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChyZWRlZmluaW5nRWxlbWVudC5vY2xJc0tpbmRPZihBY3Rpdml0eUVkZ2UpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJBY3Rpdml0eUVkZ2UtaXNDb25zaXN0ZW50V2l0aC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQWN0aXZpdHlFZGdlLWlzQ29uc2lzdGVudFdpdGgtcmVkZWZpbmluZ0VsZW1lbnQiIG5hbWU9InJlZGVmaW5pbmdFbGVtZW50IiB0eXBlPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkFjdGl2aXR5RmluYWxOb2RlIiBuYW1lPSJBY3Rpdml0eUZpbmFsTm9kZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlGaW5hbE5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eUZpbmFsTm9kZSI+Ci0gICAgICAgIDxib2R5PkFuIEFjdGl2aXR5RmluYWxOb2RlIGlzIGEgRmluYWxOb2RlIHRoYXQgdGVybWluYXRlcyB0aGUgZXhlY3V0aW9uIG9mIGl0cyBvd25pbmcgQWN0aXZpdHkgb3IgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFjdGl2aXR5RmluYWxOb2RlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJGaW5hbE5vZGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQWN0aXZpdHlHcm91cCIgbmFtZT0iQWN0aXZpdHlHcm91cCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlHcm91cC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5R3JvdXAiPgotICAgICAgICA8Ym9keT5BY3Rpdml0eUdyb3VwIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBkZWZpbmluZyBzZXRzIG9mIEFjdGl2aXR5Tm9kZXMgYW5kIEFjdGl2aXR5RWRnZXMgaW4gYW4gQWN0aXZpdHkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWN0aXZpdHlHcm91cC1ub2Rlc19hbmRfZWRnZXMiIG5hbWU9Im5vZGVzX2FuZF9lZGdlcyIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpdml0eUdyb3VwIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtbm9kZXNfYW5kX2VkZ2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlHcm91cC1ub2Rlc19hbmRfZWRnZXMiPgotICAgICAgICAgIDxib2R5PkFsbCBjb250YWluZWROb2RlcyBhbmQgY29udGFpbmVFZGdlcyBvZiBhbiBBY3Rpdml0eUdyb3VwIG11c3QgYmUgaW4gdGhlIHNhbWUgQWN0aXZpdHkgYXMgdGhlIGdyb3VwLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY3Rpdml0eUdyb3VwLW5vZGVzX2FuZF9lZGdlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+Y29udGFpbmVkTm9kZS0+Zm9yQWxsKGFjdGl2aXR5ID0gc2VsZi5jb250YWluaW5nQWN0aXZpdHkoKSkgYW5kICYjeEQ7Ci1jb250YWluZWRFZGdlLT5mb3JBbGwoYWN0aXZpdHkgPSBzZWxmLmNvbnRhaW5pbmdBY3Rpdml0eSgpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWN0aXZpdHlHcm91cC1ub3RfY29udGFpbmVkIiBuYW1lPSJub3RfY29udGFpbmVkIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFjdGl2aXR5R3JvdXAiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlHcm91cC1ub3RfY29udGFpbmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlHcm91cC1ub3RfY29udGFpbmVkIj4KLSAgICAgICAgICA8Ym9keT5ObyBjb250YWluZWROb2RlIG9yIGNvbnRhaW5lZEVkZ2Ugb2YgYW4gQWN0aXZpdHlHcm91cCBtYXkgYmUgY29udGFpbmVkIGJ5IGl0cyBzdWJncm91cHMgb3IgaXRzIHN1cGVyR3JvdXBzLCB0cmFuc2l0aXZlbHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtbm90X2NvbnRhaW5lZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c3ViZ3JvdXAtPmNsb3N1cmUoc3ViZ3JvdXApLmNvbnRhaW5lZE5vZGUtPmV4Y2x1ZGVzQWxsKGNvbnRhaW5lZE5vZGUpIGFuZCYjeEQ7Ci1zdXBlckdyb3VwLT5jbG9zdXJlKHN1cGVyR3JvdXApLmNvbnRhaW5lZE5vZGUtPmV4Y2x1ZGVzQWxsKGNvbnRhaW5lZE5vZGUpIGFuZCAmI3hEOwotc3ViZ3JvdXAtPmNsb3N1cmUoc3ViZ3JvdXApLmNvbnRhaW5lZEVkZ2UtPmV4Y2x1ZGVzQWxsKGNvbnRhaW5lZEVkZ2UpIGFuZCAmI3hEOwotc3VwZXJHcm91cC0+Y2xvc3VyZShzdXBlckdyb3VwKS5jb250YWluZWRFZGdlLT5leGNsdWRlc0FsbChjb250YWluZWRFZGdlKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBY3Rpdml0eUdyb3VwLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBY3Rpdml0eUNvbnRlbnQiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9Ik5hbWVkRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlHcm91cC1jb250YWluZWRFZGdlIiBuYW1lPSJjb250YWluZWRFZGdlIiB0eXBlPSJBY3Rpdml0eUVkZ2UiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIGFzc29jaWF0aW9uPSJBX2NvbnRhaW5lZEVkZ2VfaW5Hcm91cCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eUdyb3VwLWNvbnRhaW5lZEVkZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eUdyb3VwLWNvbnRhaW5lZEVkZ2UiPgotICAgICAgICAgIDxib2R5PkFjdGl2aXR5RWRnZXMgaW1tZWRpYXRlbHkgY29udGFpbmVkIGluIHRoZSBBY3Rpdml0eUdyb3VwLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlHcm91cC1jb250YWluZWRFZGdlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHlHcm91cC1jb250YWluZWRFZGdlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtY29udGFpbmVkTm9kZSIgbmFtZT0iY29udGFpbmVkTm9kZSIgdHlwZT0iQWN0aXZpdHlOb2RlIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGlzRGVyaXZlZFVuaW9uPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9jb250YWluZWROb2RlX2luR3JvdXAiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlHcm91cC1jb250YWluZWROb2RlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlHcm91cC1jb250YWluZWROb2RlIj4KLSAgICAgICAgICA8Ym9keT5BY3Rpdml0eU5vZGVzIGltbWVkaWF0ZWx5IGNvbnRhaW5lZCBpbiB0aGUgQWN0aXZpdHlHcm91cC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtY29udGFpbmVkTm9kZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtY29udGFpbmVkTm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eUdyb3VwLWluQWN0aXZpdHkiIG5hbWU9ImluQWN0aXZpdHkiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgdHlwZT0iQWN0aXZpdHkiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9ncm91cF9pbkFjdGl2aXR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtaW5BY3Rpdml0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5R3JvdXAtaW5BY3Rpdml0eSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEFjdGl2aXR5IGNvbnRhaW5pbmcgdGhlIEFjdGl2aXR5R3JvdXAsIGlmIGl0IGlzIGRpcmVjdGx5IG93bmVkIGJ5IGFuIEFjdGl2aXR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlHcm91cC1pbkFjdGl2aXR5LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlHcm91cC1zdWJncm91cCIgbmFtZT0ic3ViZ3JvdXAiIHR5cGU9IkFjdGl2aXR5R3JvdXAiIGlzUmVhZE9ubHk9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfc3ViZ3JvdXBfc3VwZXJHcm91cCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eUdyb3VwLXN1Ymdyb3VwLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlHcm91cC1zdWJncm91cCI+Ci0gICAgICAgICAgPGJvZHk+T3RoZXIgQWN0aXZpdHlHcm91cHMgaW1tZWRpYXRlbHkgY29udGFpbmVkIGluIHRoaXMgQWN0aXZpdHlHcm91cC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtc3ViZ3JvdXAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBY3Rpdml0eUdyb3VwLXN1Ymdyb3VwLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtc3VwZXJHcm91cCIgbmFtZT0ic3VwZXJHcm91cCIgdHlwZT0iQWN0aXZpdHlHcm91cCIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBpc0Rlcml2ZWRVbmlvbj0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX3N1Ymdyb3VwX3N1cGVyR3JvdXAiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlHcm91cC1zdXBlckdyb3VwLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlHcm91cC1zdXBlckdyb3VwIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQWN0aXZpdHlHcm91cCBpbW1lZGlhdGVseSBjb250YWluaW5nIHRoaXMgQWN0aXZpdHlHcm91cCwgaWYgaXQgaXMgZGlyZWN0bHkgb3duZWQgYnkgYW5vdGhlciBBY3Rpdml0eUdyb3VwLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlHcm91cC1zdXBlckdyb3VwLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQWN0aXZpdHlHcm91cC1jb250YWluaW5nQWN0aXZpdHkiIG5hbWU9ImNvbnRhaW5pbmdBY3Rpdml0eSIgYm9keUNvbmRpdGlvbj0iQWN0aXZpdHlHcm91cC1jb250YWluaW5nQWN0aXZpdHktc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJBY3Rpdml0eUNvbnRlbnQtY29udGFpbmluZ0FjdGl2aXR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtY29udGFpbmluZ0FjdGl2aXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlHcm91cC1jb250YWluaW5nQWN0aXZpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBBY3Rpdml0eSB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgY29udGFpbnMgdGhpcyBBY3Rpdml0eUdyb3VwLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY3Rpdml0eUdyb3VwLWNvbnRhaW5pbmdBY3Rpdml0eS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFjdGl2aXR5R3JvdXAtY29udGFpbmluZ0FjdGl2aXR5Ij4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWN0aXZpdHlHcm91cC1jb250YWluaW5nQWN0aXZpdHktc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBzdXBlckdyb3VwJmx0Oz5udWxsIHRoZW4gc3VwZXJHcm91cC5jb250YWluaW5nQWN0aXZpdHkoKSYjeEQ7Ci1lbHNlIGluQWN0aXZpdHkmI3hEOwotZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkFjdGl2aXR5R3JvdXAtY29udGFpbmluZ0FjdGl2aXR5LXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJBY3Rpdml0eSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlHcm91cC1jb250YWluaW5nQWN0aXZpdHktcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJBY3Rpdml0eU5vZGUiIG5hbWU9IkFjdGl2aXR5Tm9kZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlOb2RlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlOb2RlIj4KLSAgICAgICAgPGJvZHk+QWN0aXZpdHlOb2RlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwb2ludHMgaW4gdGhlIGZsb3cgb2YgYW4gQWN0aXZpdHkgY29ubmVjdGVkIGJ5IEFjdGl2aXR5RWRnZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBY3Rpdml0eU5vZGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGl2aXR5Q29udGVudCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQWN0aXZpdHlOb2RlLV9nZW5lcmFsaXphdGlvbi4xIiBnZW5lcmFsPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1hY3Rpdml0eSIgbmFtZT0iYWN0aXZpdHkiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgdHlwZT0iQWN0aXZpdHkiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9ub2RlX2FjdGl2aXR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1hY3Rpdml0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5Tm9kZS1hY3Rpdml0eSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEFjdGl2aXR5IGNvbnRhaW5pbmcgdGhlIEFjdGl2aXR5Tm9kZSwgaWYgaXQgaXMgZGlyZWN0bHkgb3duZWQgYnkgYW4gQWN0aXZpdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY3Rpdml0eU5vZGUtYWN0aXZpdHktX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eU5vZGUtaW5Hcm91cCIgbmFtZT0iaW5Hcm91cCIgdHlwZT0iQWN0aXZpdHlHcm91cCIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBpc0Rlcml2ZWRVbmlvbj0idHJ1ZSIgYXNzb2NpYXRpb249IkFfY29udGFpbmVkTm9kZV9pbkdyb3VwIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1pbkdyb3VwLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlOb2RlLWluR3JvdXAiPgotICAgICAgICAgIDxib2R5PkFjdGl2aXR5R3JvdXBzIGNvbnRhaW5pbmcgdGhlIEFjdGl2aXR5Tm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1pbkdyb3VwLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHlOb2RlLWluR3JvdXAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlOb2RlLWluSW50ZXJydXB0aWJsZVJlZ2lvbiIgbmFtZT0iaW5JbnRlcnJ1cHRpYmxlUmVnaW9uIiB0eXBlPSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpdml0eU5vZGUtaW5Hcm91cCIgYXNzb2NpYXRpb249IkFfaW5JbnRlcnJ1cHRpYmxlUmVnaW9uX25vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlOb2RlLWluSW50ZXJydXB0aWJsZVJlZ2lvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5Tm9kZS1pbkludGVycnVwdGlibGVSZWdpb24iPgotICAgICAgICAgIDxib2R5PkludGVycnVwdGlibGVBY3Rpdml0eVJlZ2lvbnMgY29udGFpbmluZyB0aGUgQWN0aXZpdHlOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlOb2RlLWluSW50ZXJydXB0aWJsZVJlZ2lvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1pbkludGVycnVwdGlibGVSZWdpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlOb2RlLWluUGFydGl0aW9uIiBuYW1lPSJpblBhcnRpdGlvbiIgdHlwZT0iQWN0aXZpdHlQYXJ0aXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpdml0eU5vZGUtaW5Hcm91cCIgYXNzb2NpYXRpb249IkFfaW5QYXJ0aXRpb25fbm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eU5vZGUtaW5QYXJ0aXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eU5vZGUtaW5QYXJ0aXRpb24iPgotICAgICAgICAgIDxib2R5PkFjdGl2aXR5UGFydGl0aW9ucyBjb250YWluaW5nIHRoZSBBY3Rpdml0eU5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY3Rpdml0eU5vZGUtaW5QYXJ0aXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBY3Rpdml0eU5vZGUtaW5QYXJ0aXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlOb2RlLWluU3RydWN0dXJlZE5vZGUiIG5hbWU9ImluU3RydWN0dXJlZE5vZGUiIHR5cGU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpdml0eU5vZGUtaW5Hcm91cCBFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9ub2RlX2luU3RydWN0dXJlZE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlOb2RlLWluU3RydWN0dXJlZE5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eU5vZGUtaW5TdHJ1Y3R1cmVkTm9kZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmluZyB0aGUgQWN0dml0eU5vZGUsIGlmIGl0IGlzIGRpcmVjdGx5IG93bmVkIGJ5IGEgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1pblN0cnVjdHVyZWROb2RlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlOb2RlLWluY29taW5nIiBuYW1lPSJpbmNvbWluZyIgdHlwZT0iQWN0aXZpdHlFZGdlIiBhc3NvY2lhdGlvbj0iQV9pbmNvbWluZ190YXJnZXRfbm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eU5vZGUtaW5jb21pbmctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eU5vZGUtaW5jb21pbmciPgotICAgICAgICAgIDxib2R5PkFjdGl2aXR5RWRnZXMgdGhhdCBoYXZlIHRoZSBBY3Rpdml0eU5vZGUgYXMgdGhlaXIgdGFyZ2V0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlOb2RlLWluY29taW5nLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHlOb2RlLWluY29taW5nLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1vdXRnb2luZyIgbmFtZT0ib3V0Z29pbmciIHR5cGU9IkFjdGl2aXR5RWRnZSIgYXNzb2NpYXRpb249IkFfb3V0Z29pbmdfc291cmNlX25vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlOb2RlLW91dGdvaW5nLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlOb2RlLW91dGdvaW5nIj4KLSAgICAgICAgICA8Ym9keT5BY3Rpdml0eUVkZ2VzIHRoYXQgaGF2ZSB0aGUgQWN0aXZpdHlOb2RlIGFzIHRoZWlyIHNvdXJjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1vdXRnb2luZy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1vdXRnb2luZy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eU5vZGUtcmVkZWZpbmVkTm9kZSIgbmFtZT0icmVkZWZpbmVkTm9kZSIgdHlwZT0iQWN0aXZpdHlOb2RlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5lZE5vZGVfYWN0aXZpdHlOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1yZWRlZmluZWROb2RlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlOb2RlLXJlZGVmaW5lZE5vZGUiPgotICAgICAgICAgIDxib2R5PkFjdGl2aXR5Tm9kZXMgZnJvbSBhIGdlbmVyYWxpemF0aW9uIG9mIHRoZSBBY3Rpdml0eSBjb250YWluaW5pbmcgdGhpcyBBY3Rpdml0eU5vZGUgdGhhdCBhcmUgcmVkZWZpbmVkIGJ5IHRoaXMgQWN0aXZpdHlOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlOb2RlLXJlZGVmaW5lZE5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBY3Rpdml0eU5vZGUtcmVkZWZpbmVkTm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJBY3Rpdml0eU5vZGUtY29udGFpbmluZ0FjdGl2aXR5IiBuYW1lPSJjb250YWluaW5nQWN0aXZpdHkiIGJvZHlDb25kaXRpb249IkFjdGl2aXR5Tm9kZS1jb250YWluaW5nQWN0aXZpdHktc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJBY3Rpdml0eUNvbnRlbnQtY29udGFpbmluZ0FjdGl2aXR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1jb250YWluaW5nQWN0aXZpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eU5vZGUtY29udGFpbmluZ0FjdGl2aXR5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgQWN0aXZpdHkgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGNvbnRhaW5zIHRoaXMgQWN0aXZpdHlOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY3Rpdml0eU5vZGUtY29udGFpbmluZ0FjdGl2aXR5LXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQWN0aXZpdHlOb2RlLWNvbnRhaW5pbmdBY3Rpdml0eSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGl2aXR5Tm9kZS1jb250YWluaW5nQWN0aXZpdHktc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBpblN0cnVjdHVyZWROb2RlJmx0Oz5udWxsIHRoZW4gaW5TdHJ1Y3R1cmVkTm9kZS5jb250YWluaW5nQWN0aXZpdHkoKSYjeEQ7Ci1lbHNlIGFjdGl2aXR5JiN4RDsKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJBY3Rpdml0eU5vZGUtY29udGFpbmluZ0FjdGl2aXR5LXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJBY3Rpdml0eSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlOb2RlLWNvbnRhaW5pbmdBY3Rpdml0eS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJBY3Rpdml0eU5vZGUtaXNDb25zaXN0ZW50V2l0aCIgbmFtZT0iaXNDb25zaXN0ZW50V2l0aCIgYm9keUNvbmRpdGlvbj0iQWN0aXZpdHlOb2RlLWlzQ29uc2lzdGVudFdpdGgtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJSZWRlZmluYWJsZUVsZW1lbnQtaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY3Rpdml0eU5vZGUtaXNDb25zaXN0ZW50V2l0aC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFjdGl2aXR5Tm9kZS1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWN0aXZpdHlOb2RlLWlzQ29uc2lzdGVudFdpdGgtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChyZWRlZmluaW5nRWxlbWVudC5vY2xJc0tpbmRPZihBY3Rpdml0eU5vZGUpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJBY3Rpdml0eU5vZGUtaXNDb25zaXN0ZW50V2l0aC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQWN0aXZpdHlOb2RlLWlzQ29uc2lzdGVudFdpdGgtcmVkZWZpbmluZ0VsZW1lbnQiIG5hbWU9InJlZGVmaW5pbmdFbGVtZW50IiB0eXBlPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgbmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eVBhcmFtZXRlck5vZGUiPgotICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eVBhcmFtZXRlck5vZGUgaXMgYW4gT2JqZWN0Tm9kZSBmb3IgYWNjZXB0aW5nIHZhbHVlcyBmcm9tIHRoZSBpbnB1dCBQYXJhbWV0ZXJzIG9yIHByb3ZpZGluZyB2YWx1ZXMgdG8gdGhlIG91dHB1dCBQYXJhbWV0ZXJzIG9mIGFuIEFjdGl2aXR5LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZS1ub19vdXRnb2luZ19lZGdlcyIgbmFtZT0ibm9fb3V0Z29pbmdfZWRnZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZS1ub19vdXRnb2luZ19lZGdlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZS1ub19vdXRnb2luZ19lZGdlcyI+Ci0gICAgICAgICAgPGJvZHk+QW4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHdpdGggbm8gb3V0Z29pbmcgQWN0aXZpdHlFZGdlcyBhbmQgb25lIG9yIG1vcmUgaW5jb21pbmcgQWN0aXZpdHlFZGdlcyBtdXN0IGhhdmUgYSBwYXJhbWV0ZXIgd2l0aCBkaXJlY3Rpb24gb3V0LCBpbm91dCwgb3IgcmV0dXJuLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUtbm9fb3V0Z29pbmdfZWRnZXMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihpbmNvbWluZy0+bm90RW1wdHkoKSBhbmQgb3V0Z29pbmctPmlzRW1wdHkoKSkgaW1wbGllcyAmI3hEOwotCShwYXJhbWV0ZXIuZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6b3V0IG9yICYjeEQ7Ci0JIHBhcmFtZXRlci5kaXJlY3Rpb24gPSBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kOjppbm91dCBvciAmI3hEOwotCSBwYXJhbWV0ZXIuZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6cmV0dXJuKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlLWhhc19wYXJhbWV0ZXJzIiBuYW1lPSJoYXNfcGFyYW1ldGVycyIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpdml0eVBhcmFtZXRlck5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlLWhhc19wYXJhbWV0ZXJzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlLWhhc19wYXJhbWV0ZXJzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcGFyYW1ldGVyIG9mIGFuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSBtdXN0IGJlIGZyb20gdGhlIGNvbnRhaW5pbmcgQWN0aXZpdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZS1oYXNfcGFyYW1ldGVycy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+YWN0aXZpdHkub3duZWRQYXJhbWV0ZXItPmluY2x1ZGVzKHBhcmFtZXRlcik8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZS1zYW1lX3R5cGUiIG5hbWU9InNhbWVfdHlwZSIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpdml0eVBhcmFtZXRlck5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlLXNhbWVfdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZS1zYW1lX3R5cGUiPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlIG9mIGFuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSBpcyB0aGUgc2FtZSBhcyB0aGUgdHlwZSBvZiBpdHMgcGFyYW1ldGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUtc2FtZV90eXBlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT50eXBlID0gcGFyYW1ldGVyLnR5cGU8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZS1ub19pbmNvbWluZ19lZGdlcyIgbmFtZT0ibm9faW5jb21pbmdfZWRnZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZS1ub19pbmNvbWluZ19lZGdlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZS1ub19pbmNvbWluZ19lZGdlcyI+Ci0gICAgICAgICAgPGJvZHk+QW4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHdpdGggbm8gaW5jb21pbmcgQWN0aXZpdHlFZGdlcyBhbmQgb25lIG9yIG1vcmUgb3V0Z29pbmcgQWN0aXZpdHlFZGdlcyBtdXN0IGhhdmUgYSBwYXJhbWV0ZXIgd2l0aCBkaXJlY3Rpb24gaW4gb3IgaW5vdXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZS1ub19pbmNvbWluZ19lZGdlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KG91dGdvaW5nLT5ub3RFbXB0eSgpIGFuZCBpbmNvbWluZy0+aXNFbXB0eSgpKSBpbXBsaWVzICYjeEQ7Ci0JKHBhcmFtZXRlci5kaXJlY3Rpb24gPSBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kOjpfJ2luJyBvciAmI3hEOwotCSBwYXJhbWV0ZXIuZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6aW5vdXQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUtbm9fZWRnZXMiIG5hbWU9Im5vX2VkZ2VzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUtbm9fZWRnZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eVBhcmFtZXRlck5vZGUtbm9fZWRnZXMiPgotICAgICAgICAgIDxib2R5PkFuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSBtYXkgaGF2ZSBhbGwgaW5jb21pbmcgQWN0aXZpdHlFZGdlcyBvciBhbGwgb3V0Z29pbmcgQWN0aXZpdHlFZGdlcywgYnV0IGl0IG11c3Qgbm90IGhhdmUgYm90aCBpbmNvbWluZyBhbmQgb3V0Z29pbmcgQWN0aXZpdHlFZGdlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlLW5vX2VkZ2VzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pbmNvbWluZy0+aXNFbXB0eSgpIG9yIG91dGdvaW5nLT5pc0VtcHR5KCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJPYmplY3ROb2RlIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUtcGFyYW1ldGVyIiBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9IlBhcmFtZXRlciIgYXNzb2NpYXRpb249IkFfcGFyYW1ldGVyX2FjdGl2aXR5UGFyYW1ldGVyTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUtcGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlLXBhcmFtZXRlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFBhcmFtZXRlciBmb3Igd2hpY2ggdGhlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSB3aWxsIGJlIGFjY2VwdGluZyBvciBwcm92aWRpbmcgdmFsdWVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbiIgbmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlQYXJ0aXRpb24iPgotICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eVBhcnRpdGlvbiBpcyBhIGtpbmQgb2YgQWN0aXZpdHlHcm91cCBmb3IgaWRlbnRpZnlpbmcgQWN0aXZpdHlOb2RlcyB0aGF0IGhhdmUgc29tZSBjaGFyYWN0ZXJpc3RpYyBpbiBjb21tb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tcmVwcmVzZW50c19jbGFzc2lmaWVyIiBuYW1lPSJyZXByZXNlbnRzX2NsYXNzaWZpZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iQWN0aXZpdHlQYXJ0aXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tcmVwcmVzZW50c19jbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlQYXJ0aXRpb24tcmVwcmVzZW50c19jbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5JZiBhIG5vbi1leHRlcm5hbCBBY3Rpdml0eVBhcnRpdGlvbiByZXByZXNlbnRzIGEgQ2xhc3NpZmllciBhbmQgaGFzIGEgc3VwZXJQYXJ0aXRpb24sIHRoZW4gdGhlIHN1cGVyUGFydGl0aW9uIG11c3QgcmVwcmVzZW50IGEgQ2xhc3NpZmllciwgYW5kIHRoZSBDbGFzc2lmaWVyIG9mIHRoZSBzdWJwYXJ0aXRpb24gbXVzdCBiZSBuZXN0ZWQgKG5lc3RlZENsYXNzaWZpZXIgb3Igb3duZWRCZWhhdmlvcikgaW4gdGhlIENsYXNzaWZpZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHN1cGVyUGFydGl0aW9uLCBvciBiZSBhdCB0aGUgY29udGFpbmVkIGVuZCBvZiBhIGNvbXBvc2l0aW9uIEFzc29jaWF0aW9uIHdpdGggdGhlIENsYXNzaWZpZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHN1cGVyUGFydGl0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1yZXByZXNlbnRzX2NsYXNzaWZpZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pihub3QgaXNFeHRlcm5hbCBhbmQgcmVwcmVzZW50cy5vY2xJc0tpbmRPZihDbGFzc2lmaWVyKSBhbmQgc3VwZXJQYXJ0aXRpb24tPm5vdEVtcHR5KCkpIGltcGxpZXMmI3hEOwotKCYjeEQ7Ci0gICBsZXQgcmVwcmVzZW50ZWRDbGFzc2lmaWVyIDogQ2xhc3NpZmllciA9IHJlcHJlc2VudHMub2NsQXNUeXBlKENsYXNzaWZpZXIpIGluJiN4RDsKLSAgICAgc3VwZXJQYXJ0aXRpb24ucmVwcmVzZW50cy5vY2xJc0tpbmRPZihDbGFzc2lmaWVyKSBhbmQmI3hEOwotICAgICAgbGV0IHJlcHJlc2VudGVkU3VwZXJDbGFzc2lmaWVyIDogQ2xhc3NpZmllciA9IHN1cGVyUGFydGl0aW9uLnJlcHJlc2VudHMub2NsQXNUeXBlKENsYXNzaWZpZXIpIGluJiN4RDsKLSAgICAgICAocmVwcmVzZW50ZWRTdXBlckNsYXNzaWZpZXIub2NsSXNLaW5kT2YoQmVoYXZpb3JlZENsYXNzaWZpZXIpIGFuZCByZXByZXNlbnRlZENsYXNzaWZpZXIub2NsSXNLaW5kT2YoQmVoYXZpb3IpIGFuZCAmI3hEOwotICAgICAgICByZXByZXNlbnRlZFN1cGVyQ2xhc3NpZmllci5vY2xBc1R5cGUoQmVoYXZpb3JlZENsYXNzaWZpZXIpLm93bmVkQmVoYXZpb3ItPmluY2x1ZGVzKHJlcHJlc2VudGVkQ2xhc3NpZmllci5vY2xBc1R5cGUoQmVoYXZpb3IpKSkgJiN4RDsKLSAgICAgICBvciYjeEQ7Ci0gICAgICAgKHJlcHJlc2VudGVkU3VwZXJDbGFzc2lmaWVyLm9jbElzS2luZE9mKENsYXNzKSBhbmQgIHJlcHJlc2VudGVkU3VwZXJDbGFzc2lmaWVyLm9jbEFzVHlwZShDbGFzcykubmVzdGVkQ2xhc3NpZmllci0+aW5jbHVkZXMocmVwcmVzZW50ZWRDbGFzc2lmaWVyKSkmI3hEOwotICAgICAgIG9yJiN4RDsKLSAgICAgICAoQXNzb2NpYXRpb24uYWxsSW5zdGFuY2VzKCktPmV4aXN0cyhhIHwgYS5tZW1iZXJFbmQtPmV4aXN0cyhlbmQxIHwgZW5kMS5pc0NvbXBvc2l0ZSBhbmQgZW5kMS50eXBlID0gcmVwcmVzZW50ZWRDbGFzc2lmaWVyIGFuZCAmI3hEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubWVtYmVyRW5kLT5leGlzdHMoZW5kMiB8IGVuZDEmbHQ7PmVuZDIgYW5kIGVuZDIudHlwZSA9IHJlcHJlc2VudGVkU3VwZXJDbGFzc2lmaWVyKSkpKSYjeEQ7Ci0pPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1yZXByZXNlbnRzX3Byb3BlcnR5X2FuZF9pc19jb250YWluZWQiIG5hbWU9InJlcHJlc2VudHNfcHJvcGVydHlfYW5kX2lzX2NvbnRhaW5lZCIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpdml0eVBhcnRpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1yZXByZXNlbnRzX3Byb3BlcnR5X2FuZF9pc19jb250YWluZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eVBhcnRpdGlvbi1yZXByZXNlbnRzX3Byb3BlcnR5X2FuZF9pc19jb250YWluZWQiPgotICAgICAgICAgIDxib2R5PklmIGFuIEFjdGl2aXR5UGFydGl0aW9uIHJlcHJlc2VudHMgYSBQcm9wZXJ0eSBhbmQgaGFzIGEgc3VwZXJQYXJ0aXRpb24sIHRoZW4gdGhlIFByb3BlcnR5IG11c3QgYmUgb2YgYSBDbGFzc2lmaWVyIHJlcHJlc2VudGVkIGJ5IHRoZSBzdXBlclBhcnRpdGlvbiwgb3Igb2YgYSBDbGFzc2lmaWVyIHRoYXQgaXMgdGhlIHR5cGUgb2YgYSBQcm9wZXJ0eSByZXByZXNlbnRlZCBieSB0aGUgc3VwZXJQYXJ0aXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLXJlcHJlc2VudHNfcHJvcGVydHlfYW5kX2lzX2NvbnRhaW5lZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KHJlcHJlc2VudHMub2NsSXNLaW5kT2YoUHJvcGVydHkpIGFuZCBzdXBlclBhcnRpdGlvbi0+bm90RW1wdHkoKSkgaW1wbGllcyYjeEQ7Ci0oJiN4RDsKLSAgKHN1cGVyUGFydGl0aW9uLnJlcHJlc2VudHMub2NsSXNLaW5kT2YoQ2xhc3NpZmllcikgYW5kIHJlcHJlc2VudHMub3duZXIgPSBzdXBlclBhcnRpdGlvbi5yZXByZXNlbnRzKSBvciAmI3hEOwotICAoc3VwZXJQYXJ0aXRpb24ucmVwcmVzZW50cy5vY2xJc0tpbmRPZihQcm9wZXJ0eSkgYW5kIHJlcHJlc2VudHMub3duZXIgPSBzdXBlclBhcnRpdGlvbi5yZXByZXNlbnRzLm9jbEFzVHlwZShQcm9wZXJ0eSkudHlwZSkmI3hEOwotKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tcmVwcmVzZW50c19wcm9wZXJ0eSIgbmFtZT0icmVwcmVzZW50c19wcm9wZXJ0eSIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpdml0eVBhcnRpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1yZXByZXNlbnRzX3Byb3BlcnR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlQYXJ0aXRpb24tcmVwcmVzZW50c19wcm9wZXJ0eSI+Ci0gICAgICAgICAgPGJvZHk+SWYgYW4gQWN0aXZpdHlQYXJ0aXRpb24gcmVwcmVzZW50cyBhIFByb3BlcnR5IGFuZCBoYXMgYSBzdXBlclBhcnRpdGlvbiByZXByZXNlbnRpbmcgYSBDbGFzc2lmaWVyLCB0aGVuIGFsbCB0aGUgb3RoZXIgbm9uLWV4dGVybmFsIHN1YnBhcnRpdGlvbnMgb2YgdGhlIHN1cGVyUGFydGl0aW9uIG11c3QgcmVwcmVzZW50IFByb3BlcnRpZXMgZGlyZWN0bHkgb3duZWQgYnkgdGhlIHNhbWUgQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tcmVwcmVzZW50c19wcm9wZXJ0eS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KHJlcHJlc2VudHMub2NsSXNLaW5kT2YoUHJvcGVydHkpIGFuZCBzdXBlclBhcnRpdGlvbi0+bm90RW1wdHkoKSBhbmQgc3VwZXJQYXJ0aXRpb24ucmVwcmVzZW50cy5vY2xJc0tpbmRPZihDbGFzc2lmaWVyKSkgaW1wbGllcyYjeEQ7Ci0oJiN4RDsKLSAgbGV0IHJlcHJlc2VudGVkQ2xhc3NpZmllciA6IENsYXNzaWZpZXIgPSBzdXBlclBhcnRpdGlvbi5yZXByZXNlbnRzLm9jbEFzVHlwZShDbGFzc2lmaWVyKSYjeEQ7Ci0gIGluJiN4RDsKLSAgICBzdXBlclBhcnRpdGlvbi5zdWJwYXJ0aXRpb24tPnJlamVjdChpc0V4dGVybmFsKS0+Zm9yQWxsKHAgfCAmI3hEOwotICAgICAgIHAucmVwcmVzZW50cy5vY2xJc0tpbmRPZihQcm9wZXJ0eSkgYW5kIHAub3duZXI9cmVwcmVzZW50ZWRDbGFzc2lmaWVyKSYjeEQ7Ci0pPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1kaW1lbnNpb25fbm90X2NvbnRhaW5lZCIgbmFtZT0iZGltZW5zaW9uX25vdF9jb250YWluZWQiIGNvbnN0cmFpbmVkRWxlbWVudD0iQWN0aXZpdHlQYXJ0aXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tZGltZW5zaW9uX25vdF9jb250YWluZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eVBhcnRpdGlvbi1kaW1lbnNpb25fbm90X2NvbnRhaW5lZCI+Ci0gICAgICAgICAgPGJvZHk+QW4gQWN0dml2aXR5UGFydGl0aW9uIHdpdGggaXNEaW1lbnNpb24gPSB0cnVlIG1heSBub3QgYmUgY29udGFpbmVkIGJ5IGFub3RoZXIgQWN0aXZpdHlQYXJ0aXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLWRpbWVuc2lvbl9ub3RfY29udGFpbmVkLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pc0RpbWVuc2lvbiBpbXBsaWVzIHN1cGVyUGFydGl0aW9uLT5pc0VtcHR5KCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGl2aXR5R3JvdXAiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLWVkZ2UiIG5hbWU9ImVkZ2UiIHR5cGU9IkFjdGl2aXR5RWRnZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGl2aXR5R3JvdXAtY29udGFpbmVkRWRnZSIgYXNzb2NpYXRpb249IkFfZWRnZV9pblBhcnRpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1lZGdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlQYXJ0aXRpb24tZWRnZSI+Ci0gICAgICAgICAgPGJvZHk+QWN0aXZpdHlFZGdlcyBpbW1lZGlhdGVseSBjb250YWluZWQgaW4gdGhlIEFjdGl2aXR5UGFydGl0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tZWRnZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLWVkZ2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24taXNEaW1lbnNpb24iIG5hbWU9ImlzRGltZW5zaW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLWlzRGltZW5zaW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlQYXJ0aXRpb24taXNEaW1lbnNpb24iPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB3aGV0aGVyIHRoZSBBY3Rpdml0eVBhcnRpdGlvbiBncm91cHMgb3RoZXIgQWN0aXZpdHlQYXJ0aXRpb25zIGFsb25nIGEgZGltZW5zaW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLWlzRGltZW5zaW9uLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1pc0V4dGVybmFsIiBuYW1lPSJpc0V4dGVybmFsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLWlzRXh0ZXJuYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eVBhcnRpdGlvbi1pc0V4dGVybmFsIj4KLSAgICAgICAgICA8Ym9keT5JbmRpY2F0ZXMgd2hldGhlciB0aGUgQWN0aXZpdHlQYXJ0aXRpb24gcmVwcmVzZW50cyBhbiBlbnRpdHkgdG8gd2hpY2ggdGhlIHBhcnRpdGlvbmluZyBzdHJ1Y3R1cmUgZG9lcyBub3QgYXBwbHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24taXNFeHRlcm5hbC1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tbm9kZSIgbmFtZT0ibm9kZSIgdHlwZT0iQWN0aXZpdHlOb2RlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aXZpdHlHcm91cC1jb250YWluZWROb2RlIiBhc3NvY2lhdGlvbj0iQV9pblBhcnRpdGlvbl9ub2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLW5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eVBhcnRpdGlvbi1ub2RlIj4KLSAgICAgICAgICA8Ym9keT5BY3Rpdml0eU5vZGVzIGltbWVkaWF0ZWx5IGNvbnRhaW5lZCBpbiB0aGUgQWN0aXZpdHlQYXJ0aXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1ub2RlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tbm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1yZXByZXNlbnRzIiBuYW1lPSJyZXByZXNlbnRzIiB0eXBlPSJFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9yZXByZXNlbnRzX2FjdGl2aXR5UGFydGl0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLXJlcHJlc2VudHMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpdml0eVBhcnRpdGlvbi1yZXByZXNlbnRzIj4KLSAgICAgICAgICA8Ym9keT5BbiBFbGVtZW50IHJlcHJlc2VudGVkIGJ5IHRoZSBmdW5jdGlvbmFsaXR5IG1vZGVsZWQgd2l0aGluIHRoZSBBY3Rpdml0eVBhcnRpdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLXJlcHJlc2VudHMtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1zdWJwYXJ0aXRpb24iIG5hbWU9InN1YnBhcnRpdGlvbiIgdHlwZT0iQWN0aXZpdHlQYXJ0aXRpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpdml0eUdyb3VwLXN1Ymdyb3VwIiBhc3NvY2lhdGlvbj0iQV9zdWJwYXJ0aXRpb25fc3VwZXJQYXJ0aXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tc3VicGFydGl0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0aXZpdHlQYXJ0aXRpb24tc3VicGFydGl0aW9uIj4KLSAgICAgICAgICA8Ym9keT5PdGhlciBBY3Rpdml0eVBhcnRpdGlvbnMgaW1tZWRpYXRlbHkgY29udGFpbmVkIGluIHRoaXMgQWN0aXZpdHlQYXJ0aXRpb24gKGFzIGl0cyBzdWJncm91cHMpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tc3VicGFydGl0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tc3VicGFydGl0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGl2aXR5UGFydGl0aW9uLXN1cGVyUGFydGl0aW9uIiBuYW1lPSJzdXBlclBhcnRpdGlvbiIgdHlwZT0iQWN0aXZpdHlQYXJ0aXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBY3Rpdml0eUdyb3VwLXN1cGVyR3JvdXAiIGFzc29jaWF0aW9uPSJBX3N1YnBhcnRpdGlvbl9zdXBlclBhcnRpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rpdml0eVBhcnRpdGlvbi1zdXBlclBhcnRpdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGl2aXR5UGFydGl0aW9uLXN1cGVyUGFydGl0aW9uIj4KLSAgICAgICAgICA8Ym9keT5PdGhlciBBY3Rpdml0eVBhcnRpdGlvbnMgaW1tZWRpYXRlbHkgY29udGFpbmluZyB0aGlzIEFjdGl2aXR5UGFydGl0aW9uIChhcyBpdHMgc3VwZXJHcm91cHMpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWN0aXZpdHlQYXJ0aXRpb24tc3VwZXJQYXJ0aXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNlbnRyYWxCdWZmZXJOb2RlIiBuYW1lPSJDZW50cmFsQnVmZmVyTm9kZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2VudHJhbEJ1ZmZlck5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDZW50cmFsQnVmZmVyTm9kZSI+Ci0gICAgICAgIDxib2R5PkEgQ2VudHJhbEJ1ZmZlck5vZGUgaXMgYW4gT2JqZWN0Tm9kZSBmb3IgbWFuYWdpbmcgZmxvd3MgZnJvbSBtdWx0aXBsZSBzb3VyY2VzIGFuZCB0YXJnZXRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQ2VudHJhbEJ1ZmZlck5vZGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik9iamVjdE5vZGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ29udHJvbEZsb3ciIG5hbWU9IkNvbnRyb2xGbG93Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb250cm9sRmxvdy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbnRyb2xGbG93Ij4KLSAgICAgICAgPGJvZHk+QSBDb250cm9sRmxvdyBpcyBhbiBBY3Rpdml0eUVkZ2UgdHJhdmVyc2VkIGJ5IGNvbnRyb2wgdG9rZW5zIG9yIG9iamVjdCB0b2tlbnMgb2YgY29udHJvbCB0eXBlLCB3aGljaCBhcmUgdXNlIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiBFeGVjdXRhYmxlTm9kZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29udHJvbEZsb3ctb2JqZWN0X25vZGVzIiBuYW1lPSJvYmplY3Rfbm9kZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ29udHJvbEZsb3ciPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29udHJvbEZsb3ctb2JqZWN0X25vZGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29udHJvbEZsb3ctb2JqZWN0X25vZGVzIj4KLSAgICAgICAgICA8Ym9keT5Db250cm9sRmxvd3MgbWF5IG5vdCBoYXZlIE9iamVjdE5vZGVzIGF0IGVpdGhlciBlbmQsIGV4Y2VwdCBmb3IgT2JqZWN0Tm9kZXMgd2l0aCBjb250cm9sIHR5cGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbnRyb2xGbG93LW9iamVjdF9ub2Rlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KHNvdXJjZS5vY2xJc0tpbmRPZihPYmplY3ROb2RlKSBpbXBsaWVzIHNvdXJjZS5vY2xBc1R5cGUoT2JqZWN0Tm9kZSkuaXNDb250cm9sVHlwZSkgYW5kICYjeEQ7Ci0odGFyZ2V0Lm9jbElzS2luZE9mKE9iamVjdE5vZGUpIGltcGxpZXMgdGFyZ2V0Lm9jbEFzVHlwZShPYmplY3ROb2RlKS5pc0NvbnRyb2xUeXBlKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDb250cm9sRmxvdy1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQWN0aXZpdHlFZGdlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNvbnRyb2xOb2RlIiBuYW1lPSJDb250cm9sTm9kZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29udHJvbE5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb250cm9sTm9kZSI+Ci0gICAgICAgIDxib2R5PkEgQ29udHJvbE5vZGUgaXMgYW4gYWJzdHJhY3QgQWN0aXZpdHlOb2RlIHRoYXQgY29vcmRpbmF0ZXMgZmxvd3MgaW4gYW4gQWN0aXZpdHkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDb250cm9sTm9kZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQWN0aXZpdHlOb2RlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkRhdGFTdG9yZU5vZGUiIG5hbWU9IkRhdGFTdG9yZU5vZGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRhdGFTdG9yZU5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEYXRhU3RvcmVOb2RlIj4KLSAgICAgICAgPGJvZHk+QSBEYXRhU3RvcmVOb2RlIGlzIGEgQ2VudHJhbEJ1ZmZlck5vZGUgZm9yIHBlcnNpc3RlbnQgZGF0YS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkRhdGFTdG9yZU5vZGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkNlbnRyYWxCdWZmZXJOb2RlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkRlY2lzaW9uTm9kZSIgbmFtZT0iRGVjaXNpb25Ob2RlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZWNpc2lvbk5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZWNpc2lvbk5vZGUiPgotICAgICAgICA8Ym9keT5BIERlY2lzaW9uTm9kZSBpcyBhIENvbnRyb2xOb2RlIHRoYXQgY2hvb3NlcyBiZXR3ZWVuIG91dGdvaW5nIEFjdGl2aXR5RWRnZXMgZm9yIHRoZSByb3V0aW5nIG9mIHRva2Vucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJEZWNpc2lvbk5vZGUtemVyb19pbnB1dF9wYXJhbWV0ZXJzIiBuYW1lPSJ6ZXJvX2lucHV0X3BhcmFtZXRlcnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iRGVjaXNpb25Ob2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlY2lzaW9uTm9kZS16ZXJvX2lucHV0X3BhcmFtZXRlcnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZWNpc2lvbk5vZGUtemVyb19pbnB1dF9wYXJhbWV0ZXJzIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgRGVjaXNpb25Ob2RlIGhhcyBubyBkZWNpc2lvbklucHV0RmxvdyBhbmQgYW4gaW5jb21pbmcgQ29udHJvbEZsb3csIHRoZW4gYW55IGRlY2lzaW9uSW5wdXQgQmVoYXZpb3IgaGFzIG5vIGluIHBhcmFtZXRlcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkRlY2lzaW9uTm9kZS16ZXJvX2lucHV0X3BhcmFtZXRlcnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihkZWNpc2lvbklucHV0Jmx0Oz5udWxsIGFuZCBkZWNpc2lvbklucHV0Rmxvdz1udWxsIGFuZCBpbmNvbWluZy0+ZXhpc3RzKG9jbElzS2luZE9mKENvbnRyb2xGbG93KSkpIGltcGxpZXMmI3hEOwotICAgZGVjaXNpb25JbnB1dC5pbnB1dFBhcmFtZXRlcnMoKS0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJEZWNpc2lvbk5vZGUtZWRnZXMiIG5hbWU9ImVkZ2VzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkRlY2lzaW9uTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZWNpc2lvbk5vZGUtZWRnZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZWNpc2lvbk5vZGUtZWRnZXMiPgotICAgICAgICAgIDxib2R5PlRoZSBBY3Rpdml0eUVkZ2VzIGluY29taW5nIHRvIGFuZCBvdXRnb2luZyBmcm9tIGEgRGVjaXNpb25Ob2RlLCBvdGhlciB0aGFuIHRoZSBkZWNpc2lvbklucHV0RmxvdyAoaWYgYW55KSwgbXVzdCBiZSBlaXRoZXIgYWxsIE9iamVjdEZsb3dzIG9yIGFsbCBDb250cm9sRmxvd3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkRlY2lzaW9uTm9kZS1lZGdlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bGV0IGFsbEVkZ2VzOiBTZXQoQWN0aXZpdHlFZGdlKSA9IGluY29taW5nLT51bmlvbihvdXRnb2luZykgaW4mI3hEOwotbGV0IGFsbFJlbGV2YW50RWRnZXM6IFNldChBY3Rpdml0eUVkZ2UpID0gaWYgZGVjaXNpb25JbnB1dEZsb3ctPm5vdEVtcHR5KCkgdGhlbiBhbGxFZGdlcy0+ZXhjbHVkaW5nKGRlY2lzaW9uSW5wdXRGbG93KSBlbHNlIGFsbEVkZ2VzIGVuZGlmIGluJiN4RDsKLWFsbFJlbGV2YW50RWRnZXMtPmZvckFsbChvY2xJc0tpbmRPZihDb250cm9sRmxvdykpIG9yIGFsbFJlbGV2YW50RWRnZXMtPmZvckFsbChvY2xJc0tpbmRPZihPYmplY3RGbG93KSkmI3hEOwotPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJEZWNpc2lvbk5vZGUtZGVjaXNpb25faW5wdXRfZmxvd19pbmNvbWluZyIgbmFtZT0iZGVjaXNpb25faW5wdXRfZmxvd19pbmNvbWluZyIgY29uc3RyYWluZWRFbGVtZW50PSJEZWNpc2lvbk5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGVjaXNpb25Ob2RlLWRlY2lzaW9uX2lucHV0X2Zsb3dfaW5jb21pbmctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZWNpc2lvbk5vZGUtZGVjaXNpb25faW5wdXRfZmxvd19pbmNvbWluZyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRlY2lzaW9uSW5wdXRGbG93IG9mIGEgRGVjaXNpb25Ob2RlIG11c3QgYmUgYW4gaW5jb21pbmcgQWN0aXZpdHlFZGdlIG9mIHRoZSBEZWNpc2lvbk5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkRlY2lzaW9uTm9kZS1kZWNpc2lvbl9pbnB1dF9mbG93X2luY29taW5nLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pbmNvbWluZy0+aW5jbHVkZXMoZGVjaXNpb25JbnB1dEZsb3cpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJEZWNpc2lvbk5vZGUtdHdvX2lucHV0X3BhcmFtZXRlcnMiIG5hbWU9InR3b19pbnB1dF9wYXJhbWV0ZXJzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkRlY2lzaW9uTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZWNpc2lvbk5vZGUtdHdvX2lucHV0X3BhcmFtZXRlcnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZWNpc2lvbk5vZGUtdHdvX2lucHV0X3BhcmFtZXRlcnMiPgotICAgICAgICAgIDxib2R5PklmIHRoZSBEZWNpc2lvbk5vZGUgaGFzIGEgZGVjaXNpb25JbnB1dEZsb3cgYW5kIGFuIHNlY29uZCBpbmNvbWluZyBPYmplY3RGbG93LCB0aGVuIGFueSBkZWNpc2lvbklucHV0IGhhcyB0d28gaW4gUGFyYW1ldGVycywgdGhlIGZpcnN0IG9mIHdoaWNoIGhhcyBhIHR5cGUgdGhhdCBpcyB0aGUgc2FtZSBhcyBvciBhIHN1cGVydHlwZSBvZiB0aGUgdHlwZSBvZiBvYmplY3QgdG9rZW5zIG9mZmVyZWQgb24gdGhlIG5vbi1kZWNpc2lvbklucHV0RmxvdyBhbmQgdGhlIHNlY29uZCBvZiB3aGljaCBoYXMgYSB0eXBlIHRoYXQgaXMgdGhlIHNhbWUgYXMgb3IgYSBzdXBlcnR5cGUgb2YgdGhlIHR5cGUgb2Ygb2JqZWN0IHRva2VucyBvZmZlcmVkIG9uIHRoZSBkZWNpc2lvbklucHV0Rmxvdy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRGVjaXNpb25Ob2RlLXR3b19pbnB1dF9wYXJhbWV0ZXJzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oZGVjaXNpb25JbnB1dCZsdDs+bnVsbCBhbmQgZGVjaXNpb25JbnB1dEZsb3cmbHQ7Pm51bGwgYW5kIGluY29taW5nLT5mb3JBbGwob2NsSXNLaW5kT2YoT2JqZWN0RmxvdykpKSBpbXBsaWVzJiN4RDsKLQlkZWNpc2lvbklucHV0LmlucHV0UGFyYW1ldGVycygpLT5zaXplKCk9MjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRGVjaXNpb25Ob2RlLWluY29taW5nX291dGdvaW5nX2VkZ2VzIiBuYW1lPSJpbmNvbWluZ19vdXRnb2luZ19lZGdlcyIgY29uc3RyYWluZWRFbGVtZW50PSJEZWNpc2lvbk5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGVjaXNpb25Ob2RlLWluY29taW5nX291dGdvaW5nX2VkZ2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVjaXNpb25Ob2RlLWluY29taW5nX291dGdvaW5nX2VkZ2VzIj4KLSAgICAgICAgICA8Ym9keT5BIERlY2lzaW9uTm9kZSBoYXMgb25lIG9yIHR3byBpbmNvbWluZyBBY3Rpdml0eUVkZ2VzIGFuZCBhdCBsZWFzdCBvbmUgb3V0Z29pbmcgQWN0aXZpdHlFZGdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJEZWNpc2lvbk5vZGUtaW5jb21pbmdfb3V0Z29pbmdfZWRnZXMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihpbmNvbWluZy0+c2l6ZSgpID0gMSBvciBpbmNvbWluZy0+c2l6ZSgpID0gMikgYW5kIG91dGdvaW5nLT5zaXplKCkgPiAwPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJEZWNpc2lvbk5vZGUtaW5jb21pbmdfY29udHJvbF9vbmVfaW5wdXRfcGFyYW1ldGVyIiBuYW1lPSJpbmNvbWluZ19jb250cm9sX29uZV9pbnB1dF9wYXJhbWV0ZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iRGVjaXNpb25Ob2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlY2lzaW9uTm9kZS1pbmNvbWluZ19jb250cm9sX29uZV9pbnB1dF9wYXJhbWV0ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZWNpc2lvbk5vZGUtaW5jb21pbmdfY29udHJvbF9vbmVfaW5wdXRfcGFyYW1ldGVyIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgRGVjaXNpb25Ob2RlIGhhcyBhIGRlY2lzaW9uSW5wdXRGbG93IGFuZCBhbiBpbmNvbWluZyBDb250cm9sRmxvdywgdGhlbiBhbnkgZGVjaXNpb25JbnB1dCBCZWhhdmlvciBoYXMgb25lIGluIFBhcmFtZXRlciB3aG9zZSB0eXBlIGlzIHRoZSBzYW1lIGFzIG9yIGEgc3VwZXJ0eXBlIG9mIHRoZSB0eXBlIG9mIG9iamVjdCB0b2tlbnMgb2ZmZXJlZCBvbiB0aGUgZGVjaXNpb25JbnB1dEZsb3cuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkRlY2lzaW9uTm9kZS1pbmNvbWluZ19jb250cm9sX29uZV9pbnB1dF9wYXJhbWV0ZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihkZWNpc2lvbklucHV0Jmx0Oz5udWxsIGFuZCBkZWNpc2lvbklucHV0RmxvdyZsdDs+bnVsbCBhbmQgaW5jb21pbmctPmV4aXN0cyhvY2xJc0tpbmRPZihDb250cm9sRmxvdykpKSBpbXBsaWVzJiN4RDsKLQlkZWNpc2lvbklucHV0LmlucHV0UGFyYW1ldGVycygpLT5zaXplKCk9MTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRGVjaXNpb25Ob2RlLXBhcmFtZXRlcnMiIG5hbWU9InBhcmFtZXRlcnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iRGVjaXNpb25Ob2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlY2lzaW9uTm9kZS1wYXJhbWV0ZXJzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVjaXNpb25Ob2RlLXBhcmFtZXRlcnMiPgotICAgICAgICAgIDxib2R5PkEgZGVjaXNpb25JbnB1dCBCZWhhdmlvciBoYXMgbm8gb3V0IHBhcmFtZXRlcnMsIG5vIGlub3V0IHBhcmFtZXRlcnMsIGFuZCBvbmUgcmV0dXJuIHBhcmFtZXRlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRGVjaXNpb25Ob2RlLXBhcmFtZXRlcnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmRlY2lzaW9uSW5wdXQmbHQ7Pm51bGwgaW1wbGllcyAmI3hEOwotICAoZGVjaXNpb25JbnB1dC5vd25lZFBhcmFtZXRlci0+Zm9yQWxsKHBhciB8ICYjeEQ7Ci0gICAgIHBhci5kaXJlY3Rpb24gJmx0Oz4gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6b3V0IGFuZCAmI3hEOwotICAgICBwYXIuZGlyZWN0aW9uICZsdDs+IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Omlub3V0ICkgYW5kJiN4RDsKLSAgIGRlY2lzaW9uSW5wdXQub3duZWRQYXJhbWV0ZXItPm9uZShwYXIgfCAmI3hEOwotICAgICBwYXIuZGlyZWN0aW9uICZsdDs+IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6OnJldHVybikpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJEZWNpc2lvbk5vZGUtaW5jb21pbmdfb2JqZWN0X29uZV9pbnB1dF9wYXJhbWV0ZXIiIG5hbWU9ImluY29taW5nX29iamVjdF9vbmVfaW5wdXRfcGFyYW1ldGVyIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkRlY2lzaW9uTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZWNpc2lvbk5vZGUtaW5jb21pbmdfb2JqZWN0X29uZV9pbnB1dF9wYXJhbWV0ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZWNpc2lvbk5vZGUtaW5jb21pbmdfb2JqZWN0X29uZV9pbnB1dF9wYXJhbWV0ZXIiPgotICAgICAgICAgIDxib2R5PklmIHRoZSBEZWNpc2lvbk5vZGUgaGFzIG5vIGRlY2lzaW9uSW5wdXRGbG93IGFuZCBhbiBpbmNvbWluZyBPYmplY3RGbG93LCB0aGVuIGFueSBkZWNpc2lvbklucHV0IEJlaGF2aW9yIGhhcyBvbmUgaW4gUGFyYW1ldGVyIHdob3NlIHR5cGUgaXMgdGhlIHNhbWUgYXMgb3IgYSBzdXBlcnR5cGUgb2YgdGhlIHR5cGUgb2Ygb2JqZWN0IHRva2VucyBvZmZlcmVkIG9uIHRoZSBpbmNvbWluZyBPYmplY3RGbG93LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJEZWNpc2lvbk5vZGUtaW5jb21pbmdfb2JqZWN0X29uZV9pbnB1dF9wYXJhbWV0ZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihkZWNpc2lvbklucHV0Jmx0Oz5udWxsIGFuZCBkZWNpc2lvbklucHV0Rmxvdz1udWxsIGFuZCBpbmNvbWluZy0+Zm9yQWxsKG9jbElzS2luZE9mKE9iamVjdEZsb3cpKSkgaW1wbGllcyYjeEQ7Ci0JZGVjaXNpb25JbnB1dC5pbnB1dFBhcmFtZXRlcnMoKS0+c2l6ZSgpPTE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRGVjaXNpb25Ob2RlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJDb250cm9sTm9kZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRGVjaXNpb25Ob2RlLWRlY2lzaW9uSW5wdXQiIG5hbWU9ImRlY2lzaW9uSW5wdXQiIHR5cGU9IkJlaGF2aW9yIiBhc3NvY2lhdGlvbj0iQV9kZWNpc2lvbklucHV0X2RlY2lzaW9uTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZWNpc2lvbk5vZGUtZGVjaXNpb25JbnB1dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRlY2lzaW9uTm9kZS1kZWNpc2lvbklucHV0Ij4KLSAgICAgICAgICA8Ym9keT5BIEJlaGF2aW9yIHRoYXQgaXMgZXhlY3V0ZWQgdG8gcHJvdmlkZSBhbiBpbnB1dCB0byBndWFyZCBWYWx1ZVNwZWNpZmljYXRpb25zIG9uIEFjdGl2aXR5RWRnZXMgb3V0Z29pbmcgZnJvbSB0aGUgRGVjaXNpb25Ob2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRGVjaXNpb25Ob2RlLWRlY2lzaW9uSW5wdXQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJEZWNpc2lvbk5vZGUtZGVjaXNpb25JbnB1dEZsb3ciIG5hbWU9ImRlY2lzaW9uSW5wdXRGbG93IiB0eXBlPSJPYmplY3RGbG93IiBhc3NvY2lhdGlvbj0iQV9kZWNpc2lvbklucHV0Rmxvd19kZWNpc2lvbk5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGVjaXNpb25Ob2RlLWRlY2lzaW9uSW5wdXRGbG93LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVjaXNpb25Ob2RlLWRlY2lzaW9uSW5wdXRGbG93Ij4KLSAgICAgICAgICA8Ym9keT5BbiBhZGRpdGlvbmFsIEFjdGl2aXR5RWRnZSBpbmNvbWluZyB0byB0aGUgRGVjaXNpb25Ob2RlIHRoYXQgcHJvdmlkZXMgYSBkZWNpc2lvbiBpbnB1dCB2YWx1ZSBmb3IgdGhlIGd1YXJkcyBWYWx1ZVNwZWNpZmljYXRpb25zIG9uIEFjdGl2aXR5RWRnZXMgb3V0Z29pbmcgZnJvbSB0aGUgRGVjaXNpb25Ob2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRGVjaXNpb25Ob2RlLWRlY2lzaW9uSW5wdXRGbG93LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyIiBuYW1lPSJFeGNlcHRpb25IYW5kbGVyIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXhjZXB0aW9uSGFuZGxlciI+Ci0gICAgICAgIDxib2R5PkFuIEV4Y2VwdGlvbkhhbmRsZXIgaXMgYW4gRWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGhhbmRsZXJCb2R5IEV4ZWN1dGFibGVOb2RlIHRvIGV4ZWN1dGUgaW4gY2FzZSB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIHByb3RlY3RlZCBFeGVjdXRhYmxlTm9kZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLWhhbmRsZXJfYm9keV9lZGdlcyIgbmFtZT0iaGFuZGxlcl9ib2R5X2VkZ2VzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkV4Y2VwdGlvbkhhbmRsZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhjZXB0aW9uSGFuZGxlci1oYW5kbGVyX2JvZHlfZWRnZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeGNlcHRpb25IYW5kbGVyLWhhbmRsZXJfYm9keV9lZGdlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGhhbmRsZXJCb2R5IGhhcyBubyBpbmNvbWluZyBvciBvdXRnb2luZyBBY3Rpdml0eUVkZ2VzIGFuZCB0aGUgZXhjZXB0aW9uSW5wdXQgaGFzIG5vIGluY29taW5nIEFjdGl2aXR5RWRnZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkV4Y2VwdGlvbkhhbmRsZXItaGFuZGxlcl9ib2R5X2VkZ2VzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5oYW5kbGVyQm9keS5pbmNvbWluZy0+aXNFbXB0eSgpIGFuZCBoYW5kbGVyQm9keS5vdXRnb2luZy0+aXNFbXB0eSgpIGFuZCBleGNlcHRpb25JbnB1dC5pbmNvbWluZy0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLW91dHB1dF9waW5zIiBuYW1lPSJvdXRwdXRfcGlucyIgY29uc3RyYWluZWRFbGVtZW50PSJFeGNlcHRpb25IYW5kbGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4Y2VwdGlvbkhhbmRsZXItb3V0cHV0X3BpbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeGNlcHRpb25IYW5kbGVyLW91dHB1dF9waW5zIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgcHJvdGVjdGVkTm9kZSBpcyBhbiBBY3Rpb24gd2l0aCBPdXRwdXRQaW5zLCB0aGVuIHRoZSBoYW5kbGVyQm9keSBtdXN0IGFsc28gYmUgYW4gQWN0aW9uIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIE91dHB1dFBpbnMsIHdoaWNoIGFyZSBjb21wYXRpYmxlIGluIHR5cGUsIG9yZGVyaW5nLCBhbmQgbXVsdGlwbGljaXR5IHRvIHRob3NlIG9mIHRoZSBwcm90ZWN0ZWROb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLW91dHB1dF9waW5zLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4ocHJvdGVjdGVkTm9kZS5vY2xJc0tpbmRPZihBY3Rpb24pIGFuZCBwcm90ZWN0ZWROb2RlLm9jbEFzVHlwZShBY3Rpb24pLm91dHB1dC0+bm90RW1wdHkoKSkgaW1wbGllcyYjeEQ7Ci0oJiN4RDsKLSAgaGFuZGxlckJvZHkub2NsSXNLaW5kT2YoQWN0aW9uKSBhbmQgJiN4RDsKLSAgbGV0IHByb3RlY3RlZE5vZGVPdXRwdXQgOiBPcmRlcmVkU2V0KE91dHB1dFBpbikgPSBwcm90ZWN0ZWROb2RlLm9jbEFzVHlwZShBY3Rpb24pLm91dHB1dCwmI3hEOwotICAgICAgICBoYW5kbGVyQm9keU91dHB1dCA6IE9yZGVyZWRTZXQoT3V0cHV0UGluKSA9ICBoYW5kbGVyQm9keS5vY2xBc1R5cGUoQWN0aW9uKS5vdXRwdXQgaW4mI3hEOwotICAgIHByb3RlY3RlZE5vZGVPdXRwdXQtPnNpemUoKSA9IGhhbmRsZXJCb2R5T3V0cHV0LT5zaXplKCkgYW5kJiN4RDsKLSAgICBTZXF1ZW5jZXsxLi5wcm90ZWN0ZWROb2RlT3V0cHV0LT5zaXplKCl9LT5mb3JBbGwoaSB8JiN4RDsKLSAgICAJaGFuZGxlckJvZHlPdXRwdXQtPmF0KGkpLnR5cGUuY29uZm9ybXNUbyhwcm90ZWN0ZWROb2RlT3V0cHV0LT5hdChpKS50eXBlKSBhbmQmI3hEOwotICAgIAloYW5kbGVyQm9keU91dHB1dC0+YXQoaSkuaXNPcmRlcmVkPXByb3RlY3RlZE5vZGVPdXRwdXQtPmF0KGkpLmlzT3JkZXJlZCBhbmQmI3hEOwotICAgIAloYW5kbGVyQm9keU91dHB1dC0+YXQoaSkuY29tcGF0aWJsZVdpdGgocHJvdGVjdGVkTm9kZU91dHB1dC0+YXQoaSkpKSYjeEQ7Ci0pPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLW9uZV9pbnB1dCIgbmFtZT0ib25lX2lucHV0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkV4Y2VwdGlvbkhhbmRsZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhjZXB0aW9uSGFuZGxlci1vbmVfaW5wdXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeGNlcHRpb25IYW5kbGVyLW9uZV9pbnB1dCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGhhbmRsZXJCb2R5IGlzIGFuIEFjdGlvbiB3aXRoIG9uZSBJbnB1dFBpbiwgYW5kIHRoYXQgSW5wdXRQaW4gaXMgdGhlIHNhbWUgYXMgdGhlIGV4Y2VwdGlvbklucHV0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLW9uZV9pbnB1dC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aGFuZGxlckJvZHkub2NsSXNLaW5kT2YoQWN0aW9uKSBhbmQmI3hEOwotbGV0IGlucHV0czogT3JkZXJlZFNldChJbnB1dFBpbikgPSBoYW5kbGVyQm9keS5vY2xBc1R5cGUoQWN0aW9uKS5pbnB1dCBpbiYjeEQ7Ci1pbnB1dHMtPnNpemUoKT0xIGFuZCBpbnB1dHMtPmZpcnN0KCk9ZXhjZXB0aW9uSW5wdXQ8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkV4Y2VwdGlvbkhhbmRsZXItZWRnZV9zb3VyY2VfdGFyZ2V0IiBuYW1lPSJlZGdlX3NvdXJjZV90YXJnZXQiIGNvbnN0cmFpbmVkRWxlbWVudD0iRXhjZXB0aW9uSGFuZGxlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLWVkZ2Vfc291cmNlX3RhcmdldC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4Y2VwdGlvbkhhbmRsZXItZWRnZV9zb3VyY2VfdGFyZ2V0Ij4KLSAgICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eUVkZ2UgdGhhdCBoYXMgYSBzb3VyY2Ugd2l0aGluIHRoZSBoYW5kbGVyQm9keSBvZiBhbiBFeGNlcHRpb25IYW5kbGVyIG11c3QgaGF2ZSBpdHMgdGFyZ2V0IGluIHRoZSBoYW5kbGVyQm9keSBhbHNvLCBhbmQgdmljZSB2ZXJzYS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRXhjZXB0aW9uSGFuZGxlci1lZGdlX3NvdXJjZV90YXJnZXQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmxldCBub2RlczpTZXQoQWN0aXZpdHlOb2RlKSA9IGhhbmRsZXJCb2R5Lm9jbEFzVHlwZShBY3Rpb24pLmFsbE93bmVkTm9kZXMoKSBpbiYjeEQ7Ci1ub2Rlcy5vdXRnb2luZy0+Zm9yQWxsKG5vZGVzLT5pbmNsdWRlcyh0YXJnZXQpKSBhbmQmI3hEOwotbm9kZXMuaW5jb21pbmctPmZvckFsbChub2Rlcy0+aW5jbHVkZXMoc291cmNlKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkV4Y2VwdGlvbkhhbmRsZXItaGFuZGxlcl9ib2R5X293bmVyIiBuYW1lPSJoYW5kbGVyX2JvZHlfb3duZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iRXhjZXB0aW9uSGFuZGxlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLWhhbmRsZXJfYm9keV9vd25lci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4Y2VwdGlvbkhhbmRsZXItaGFuZGxlcl9ib2R5X293bmVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgaGFuZGxlckJvZHkgbXVzdCBoYXZlIHRoZSBzYW1lIG93bmVyIGFzIHRoZSBwcm90ZWN0ZWROb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLWhhbmRsZXJfYm9keV9vd25lci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aGFuZGxlckJvZHkub3duZXI9cHJvdGVjdGVkTm9kZS5vd25lcjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRXhjZXB0aW9uSGFuZGxlci1leGNlcHRpb25faW5wdXRfdHlwZSIgbmFtZT0iZXhjZXB0aW9uX2lucHV0X3R5cGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iRXhjZXB0aW9uSGFuZGxlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLWV4Y2VwdGlvbl9pbnB1dF90eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXhjZXB0aW9uSGFuZGxlci1leGNlcHRpb25faW5wdXRfdHlwZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGV4Y2VwdGlvbklucHV0IG11c3QgZWl0aGVyIGhhdmUgbm8gdHlwZSBvciBldmVyeSBleGNlcHRpb25UeXBlIG11c3QgY29uZm9ybSB0byB0aGUgZXhjZXB0aW9uSW5wdXQgdHlwZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRXhjZXB0aW9uSGFuZGxlci1leGNlcHRpb25faW5wdXRfdHlwZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZXhjZXB0aW9uSW5wdXQudHlwZT1udWxsIG9yICYjeEQ7Ci1leGNlcHRpb25UeXBlLT5mb3JBbGwoY29uZm9ybXNUbyhleGNlcHRpb25JbnB1dC50eXBlLm9jbEFzVHlwZShDbGFzc2lmaWVyKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkV4Y2VwdGlvbkhhbmRsZXItX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uSW5wdXQiIG5hbWU9ImV4Y2VwdGlvbklucHV0IiB0eXBlPSJPYmplY3ROb2RlIiBhc3NvY2lhdGlvbj0iQV9leGNlcHRpb25JbnB1dF9leGNlcHRpb25IYW5kbGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uSW5wdXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeGNlcHRpb25IYW5kbGVyLWV4Y2VwdGlvbklucHV0Ij4KLSAgICAgICAgICA8Ym9keT5BbiBPYmplY3ROb2RlIHdpdGhpbiB0aGUgaGFuZGxlckJvZHkuIFdoZW4gdGhlIEV4Y2VwdGlvbkhhbmRsZXIgY2F0Y2hlcyBhbiBleGNlcHRpb24sIHRoZSBleGNlcHRpb24gdG9rZW4gaXMgcGxhY2VkIG9uIHRoaXMgT2JqZWN0Tm9kZSwgY2F1c2luZyB0aGUgaGFuZGxlckJvZHkgdG8gZXhlY3V0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uVHlwZSIgbmFtZT0iZXhjZXB0aW9uVHlwZSIgdHlwZT0iQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfZXhjZXB0aW9uVHlwZV9leGNlcHRpb25IYW5kbGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uVHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uVHlwZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIENsYXNzaWZpZXJzIHdob3NlIGluc3RhbmNlcyB0aGUgRXhjZXB0aW9uSGFuZGxlciBjYXRjaGVzIGFzIGV4Y2VwdGlvbnMuIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hvc2UgdHlwZSBpcyBhbnkgZXhjZXB0aW9uVHlwZSwgdGhlIEV4Y2VwdGlvbkhhbmRsZXIgY2F0Y2hlcyB0aGUgZXhjZXB0aW9uIGFuZCBleGVjdXRlcyB0aGUgaGFuZGxlckJvZHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLWV4Y2VwdGlvblR5cGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRXhjZXB0aW9uSGFuZGxlci1oYW5kbGVyQm9keSIgbmFtZT0iaGFuZGxlckJvZHkiIHR5cGU9IkV4ZWN1dGFibGVOb2RlIiBhc3NvY2lhdGlvbj0iQV9oYW5kbGVyQm9keV9leGNlcHRpb25IYW5kbGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4Y2VwdGlvbkhhbmRsZXItaGFuZGxlckJvZHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeGNlcHRpb25IYW5kbGVyLWhhbmRsZXJCb2R5Ij4KLSAgICAgICAgICA8Ym9keT5BbiBFeGVjdXRhYmxlTm9kZSB0aGF0IGlzIGV4ZWN1dGVkIGlmIHRoZSBFeGNlcHRpb25IYW5kbGVyIGNhdGNoZXMgYW4gZXhjZXB0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRXhjZXB0aW9uSGFuZGxlci1wcm90ZWN0ZWROb2RlIiBuYW1lPSJwcm90ZWN0ZWROb2RlIiB0eXBlPSJFeGVjdXRhYmxlTm9kZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2hhbmRsZXJfcHJvdGVjdGVkTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeGNlcHRpb25IYW5kbGVyLXByb3RlY3RlZE5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeGNlcHRpb25IYW5kbGVyLXByb3RlY3RlZE5vZGUiPgotICAgICAgICAgIDxib2R5PlRoZSBFeGVjdXRhYmxlTm9kZSBwcm90ZWN0ZWQgYnkgdGhlIEV4Y2VwdGlvbkhhbmRsZXIuIElmIGFuIGV4Y2VwdGlvbiBwcm9wYWdhdGVzIG91dCBvZiB0aGUgcHJvdGVjdGVkTm9kZSBhbmQgaGFzIGEgdHlwZSBtYXRjaGluZyBvbmUgb2YgdGhlIGV4Y2VwdGlvblR5cGVzLCB0aGVuIGl0IGlzIGNhdWdodCBieSB0aGlzIEV4Y2VwdGlvbkhhbmRsZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkV4ZWN1dGFibGVOb2RlIiBuYW1lPSJFeGVjdXRhYmxlTm9kZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhlY3V0YWJsZU5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeGVjdXRhYmxlTm9kZSI+Ci0gICAgICAgIDxib2R5PkFuIEV4ZWN1dGFibGVOb2RlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBBY3Rpdml0eU5vZGVzIHdob3NlIGV4ZWN1dGlvbiBtYXkgYmUgY29udHJvbGxlZCB1c2luZyBDb250cm9sRmxvd3MgYW5kIHRvIHdoaWNoIEV4Y2VwdGlvbkhhbmRsZXJzIG1heSBiZSBhdHRhY2hlZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkV4ZWN1dGFibGVOb2RlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4ZWN1dGFibGVOb2RlLWhhbmRsZXIiIG5hbWU9ImhhbmRsZXIiIHR5cGU9IkV4Y2VwdGlvbkhhbmRsZXIiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfaGFuZGxlcl9wcm90ZWN0ZWROb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4ZWN1dGFibGVOb2RlLWhhbmRsZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeGVjdXRhYmxlTm9kZS1oYW5kbGVyIj4KLSAgICAgICAgICA8Ym9keT5BIHNldCBvZiBFeGNlcHRpb25IYW5kbGVycyB0aGF0IGFyZSBleGFtaW5lZCBpZiBhbiBleGNlcHRpb24gcHJvcGFnYXRlcyBvdXQgb2YgdGhlIEV4Y2VwdGlvbk5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFeGVjdXRhYmxlTm9kZS1oYW5kbGVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRXhlY3V0YWJsZU5vZGUtaGFuZGxlci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkZpbmFsTm9kZSIgbmFtZT0iRmluYWxOb2RlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJGaW5hbE5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJGaW5hbE5vZGUiPgotICAgICAgICA8Ym9keT5BIEZpbmFsTm9kZSBpcyBhbiBhYnN0cmFjdCBDb250cm9sTm9kZSBhdCB3aGljaCBhIGZsb3cgaW4gYW4gQWN0aXZpdHkgc3RvcHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRmluYWxOb2RlLW5vX291dGdvaW5nX2VkZ2VzIiBuYW1lPSJub19vdXRnb2luZ19lZGdlcyIgY29uc3RyYWluZWRFbGVtZW50PSJGaW5hbE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRmluYWxOb2RlLW5vX291dGdvaW5nX2VkZ2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRmluYWxOb2RlLW5vX291dGdvaW5nX2VkZ2VzIj4KLSAgICAgICAgICA8Ym9keT5BIEZpbmFsTm9kZSBoYXMgbm8gb3V0Z29pbmcgQWN0aXZpdHlFZGdlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRmluYWxOb2RlLW5vX291dGdvaW5nX2VkZ2VzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vdXRnb2luZy0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkZpbmFsTm9kZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQ29udHJvbE5vZGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRmxvd0ZpbmFsTm9kZSIgbmFtZT0iRmxvd0ZpbmFsTm9kZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRmxvd0ZpbmFsTm9kZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkZsb3dGaW5hbE5vZGUiPgotICAgICAgICA8Ym9keT5BIEZsb3dGaW5hbE5vZGUgaXMgYSBGaW5hbE5vZGUgdGhhdCB0ZXJtaW5hdGVzIGEgZmxvdyBieSBjb25zdW1pbmcgdGhlIHRva2VucyBvZmZlcmVkIHRvIGl0LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRmxvd0ZpbmFsTm9kZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRmluYWxOb2RlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkZvcmtOb2RlIiBuYW1lPSJGb3JrTm9kZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRm9ya05vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJGb3JrTm9kZSI+Ci0gICAgICAgIDxib2R5PkEgRm9ya05vZGUgaXMgYSBDb250cm9sTm9kZSB0aGF0IHNwbGl0cyBhIGZsb3cgaW50byBtdWx0aXBsZSBjb25jdXJyZW50IGZsb3dzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkZvcmtOb2RlLWVkZ2VzIiBuYW1lPSJlZGdlcyIgY29uc3RyYWluZWRFbGVtZW50PSJGb3JrTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJGb3JrTm9kZS1lZGdlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkZvcmtOb2RlLWVkZ2VzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQWN0aXZpdHlFZGdlcyBpbmNvbWluZyB0byBhbmQgb3V0Z29pbmcgZnJvbSBhIEZvcmtOb2RlIG11c3QgYmUgZWl0aGVyIGFsbCBPYmplY3RGbG93cyBvciBhbGwgQ29udHJvbEZsb3dzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJGb3JrTm9kZS1lZGdlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bGV0IGFsbEVkZ2VzIDogU2V0KEFjdGl2aXR5RWRnZSkgPSBpbmNvbWluZy0+dW5pb24ob3V0Z29pbmcpIGluJiN4RDsKLWFsbEVkZ2VzLT5mb3JBbGwob2NsSXNLaW5kT2YoQ29udHJvbEZsb3cpKSBvciBhbGxFZGdlcy0+Zm9yQWxsKG9jbElzS2luZE9mKE9iamVjdEZsb3cpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRm9ya05vZGUtb25lX2luY29taW5nX2VkZ2UiIG5hbWU9Im9uZV9pbmNvbWluZ19lZGdlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkZvcmtOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkZvcmtOb2RlLW9uZV9pbmNvbWluZ19lZGdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRm9ya05vZGUtb25lX2luY29taW5nX2VkZ2UiPgotICAgICAgICAgIDxib2R5PkEgRm9ya05vZGUgaGFzIG9uZSBpbmNvbWluZyBBY3Rpdml0eUVkZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkZvcmtOb2RlLW9uZV9pbmNvbWluZ19lZGdlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pbmNvbWluZy0+c2l6ZSgpPTE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRm9ya05vZGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkNvbnRyb2xOb2RlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkluaXRpYWxOb2RlIiBuYW1lPSJJbml0aWFsTm9kZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5pdGlhbE5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbml0aWFsTm9kZSI+Ci0gICAgICAgIDxib2R5PkFuIEluaXRpYWxOb2RlIGlzIGEgQ29udHJvbE5vZGUgdGhhdCBvZmZlcnMgYSBzaW5nbGUgY29udHJvbCB0b2tlbiB3aGVuIGluaXRpYWxseSBlbmFibGVkLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkluaXRpYWxOb2RlLW5vX2luY29taW5nX2VkZ2VzIiBuYW1lPSJub19pbmNvbWluZ19lZGdlcyIgY29uc3RyYWluZWRFbGVtZW50PSJJbml0aWFsTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbml0aWFsTm9kZS1ub19pbmNvbWluZ19lZGdlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkluaXRpYWxOb2RlLW5vX2luY29taW5nX2VkZ2VzIj4KLSAgICAgICAgICA8Ym9keT5BbiBJbml0aWFsTm9kZSBoYXMgbm8gaW5jb21pbmcgQWN0aXZpdHlFZGdlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW5pdGlhbE5vZGUtbm9faW5jb21pbmdfZWRnZXMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmluY29taW5nLT5pc0VtcHR5KCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkluaXRpYWxOb2RlLWNvbnRyb2xfZWRnZXMiIG5hbWU9ImNvbnRyb2xfZWRnZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iSW5pdGlhbE5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5pdGlhbE5vZGUtY29udHJvbF9lZGdlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkluaXRpYWxOb2RlLWNvbnRyb2xfZWRnZXMiPgotICAgICAgICAgIDxib2R5PkFsbCB0aGUgb3V0Z29pbmcgQWN0aXZpdHlFZGdlcyBmcm9tIGFuIEluaXRpYWxOb2RlIG11c3QgYmUgQ29udHJvbEZsb3dzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbml0aWFsTm9kZS1jb250cm9sX2VkZ2VzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vdXRnb2luZy0+Zm9yQWxsKG9jbElzS2luZE9mKENvbnRyb2xGbG93KSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iSW5pdGlhbE5vZGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkNvbnRyb2xOb2RlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkludGVycnVwdGlibGVBY3Rpdml0eVJlZ2lvbiIgbmFtZT0iSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24iPgotICAgICAgICA8Ym9keT5BbiBJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24gaXMgYW4gQWN0aXZpdHlHcm91cCB0aGF0IHN1cHBvcnRzIHRoZSB0ZXJtaW5hdGlvbiBvZiB0b2tlbnMgZmxvd2luZyBpbiB0aGUgcG9ydGlvbnMgb2YgYW4gYWN0aXZpdHkgd2l0aGluIGl0LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkludGVycnVwdGlibGVBY3Rpdml0eVJlZ2lvbi1pbnRlcnJ1cHRpbmdfZWRnZXMiIG5hbWU9ImludGVycnVwdGluZ19lZGdlcyIgY29uc3RyYWluZWRFbGVtZW50PSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uLWludGVycnVwdGluZ19lZGdlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVycnVwdGlibGVBY3Rpdml0eVJlZ2lvbi1pbnRlcnJ1cHRpbmdfZWRnZXMiPgotICAgICAgICAgIDxib2R5PlRoZSBpbnRlcnJ1cHRpbmdFZGdlcyBvZiBhbiBJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24gbXVzdCBoYXZlIHRoZWlyIHNvdXJjZSBpbiB0aGUgcmVnaW9uIGFuZCB0aGVpciB0YXJnZXQgb3V0c2lkZSB0aGUgcmVnaW9uLCBidXQgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5IGNvbnRhaW5pbmcgdGhlIHJlZ2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uLWludGVycnVwdGluZ19lZGdlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aW50ZXJydXB0aW5nRWRnZS0+Zm9yQWxsKGVkZ2UgfCAmI3hEOwotICBub2RlLT5pbmNsdWRlcyhlZGdlLnNvdXJjZSkgYW5kIG5vZGUtPmV4Y2x1ZGVzKGVkZ2UudGFyZ2V0KSBhbmQgZWRnZS50YXJnZXQuY29udGFpbmluZ0FjdGl2aXR5KCkgPSBpbkFjdGl2aXR5KTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGl2aXR5R3JvdXAiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVycnVwdGlibGVBY3Rpdml0eVJlZ2lvbi1pbnRlcnJ1cHRpbmdFZGdlIiBuYW1lPSJpbnRlcnJ1cHRpbmdFZGdlIiB0eXBlPSJBY3Rpdml0eUVkZ2UiIGFzc29jaWF0aW9uPSJBX2ludGVycnVwdGluZ0VkZ2VfaW50ZXJydXB0cyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24taW50ZXJydXB0aW5nRWRnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVycnVwdGlibGVBY3Rpdml0eVJlZ2lvbi1pbnRlcnJ1cHRpbmdFZGdlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQWN0aXZpdHlFZGdlcyBsZWF2aW5nIHRoZSBJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24gb24gd2hpY2ggYSB0cmF2ZXJzaW5nIHRva2VuIHdpbGwgcmVzdWx0IGluIHRoZSB0ZXJtaW5hdGlvbiBvZiBvdGhlciB0b2tlbnMgZmxvd2luZyBpbiB0aGUgSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uLWludGVycnVwdGluZ0VkZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24taW50ZXJydXB0aW5nRWRnZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24tbm9kZSIgbmFtZT0ibm9kZSIgdHlwZT0iQWN0aXZpdHlOb2RlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQWN0aXZpdHlHcm91cC1jb250YWluZWROb2RlIiBhc3NvY2lhdGlvbj0iQV9pbkludGVycnVwdGlibGVSZWdpb25fbm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24tbm9kZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVycnVwdGlibGVBY3Rpdml0eVJlZ2lvbi1ub2RlIj4KLSAgICAgICAgICA8Ym9keT5BY3Rpdml0eU5vZGVzIGltbWVkaWF0ZWx5IGNvbnRhaW5lZCBpbiB0aGUgSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uLW5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24tbm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkpvaW5Ob2RlIiBuYW1lPSJKb2luTm9kZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSm9pbk5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJKb2luTm9kZSI+Ci0gICAgICAgIDxib2R5PkEgSm9pbk5vZGUgaXMgYSBDb250cm9sTm9kZSB0aGF0IHN5bmNocm9uaXplcyBtdWx0aXBsZSBmbG93cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJKb2luTm9kZS1vbmVfb3V0Z29pbmdfZWRnZSIgbmFtZT0ib25lX291dGdvaW5nX2VkZ2UiIGNvbnN0cmFpbmVkRWxlbWVudD0iSm9pbk5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSm9pbk5vZGUtb25lX291dGdvaW5nX2VkZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJKb2luTm9kZS1vbmVfb3V0Z29pbmdfZWRnZSI+Ci0gICAgICAgICAgPGJvZHk+QSBKb2luTm9kZSBoYXMgb25lIG91dGdvaW5nIEFjdGl2aXR5RWRnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSm9pbk5vZGUtb25lX291dGdvaW5nX2VkZ2UtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm91dGdvaW5nLT5zaXplKCkgPSAxPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJKb2luTm9kZS1pbmNvbWluZ19vYmplY3RfZmxvdyIgbmFtZT0iaW5jb21pbmdfb2JqZWN0X2Zsb3ciIGNvbnN0cmFpbmVkRWxlbWVudD0iSm9pbk5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSm9pbk5vZGUtaW5jb21pbmdfb2JqZWN0X2Zsb3ctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJKb2luTm9kZS1pbmNvbWluZ19vYmplY3RfZmxvdyI+Ci0gICAgICAgICAgPGJvZHk+SWYgb25lIG9mIHRoZSBpbmNvbWluZyBBY3Rpdml0eUVkZ2VzIG9mIGEgSm9pbk5vZGUgaXMgYW4gT2JqZWN0RmxvdywgdGhlbiBpdHMgb3V0Z29pbmcgQWN0aXZpdHlFZGdlIG11c3QgYmUgYW4gT2JqZWN0Rmxvdy4gT3RoZXJ3aXNlIGl0cyBvdXRnb2luZyBBY3Rpdml0eUVkZ2UgbXVzdCBiZSBhIENvbnRyb2xGbG93LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJKb2luTm9kZS1pbmNvbWluZ19vYmplY3RfZmxvdy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aWYgaW5jb21pbmctPmV4aXN0cyhvY2xJc0tpbmRPZihPYmplY3RGbG93KSkgdGhlbiBvdXRnb2luZy0+Zm9yQWxsKG9jbElzS2luZE9mKE9iamVjdEZsb3cpKSYjeEQ7Ci1lbHNlIG91dGdvaW5nLT5mb3JBbGwob2NsSXNLaW5kT2YoQ29udHJvbEZsb3cpKSYjeEQ7Ci1lbmRpZjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJKb2luTm9kZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQ29udHJvbE5vZGUiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkpvaW5Ob2RlLWlzQ29tYmluZUR1cGxpY2F0ZSIgbmFtZT0iaXNDb21iaW5lRHVwbGljYXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkpvaW5Ob2RlLWlzQ29tYmluZUR1cGxpY2F0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkpvaW5Ob2RlLWlzQ29tYmluZUR1cGxpY2F0ZSI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIHdoZXRoZXIgaW5jb21pbmcgdG9rZW5zIGhhdmluZyBvYmplY3RzIHdpdGggdGhlIHNhbWUgaWRlbnRpdHkgYXJlIGNvbWJpbmVkIGludG8gb25lIGJ5IHRoZSBKb2luTm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJKb2luTm9kZS1pc0NvbWJpbmVEdXBsaWNhdGUtX2RlZmF1bHRWYWx1ZSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJKb2luTm9kZS1qb2luU3BlYyIgbmFtZT0iam9pblNwZWMiIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9qb2luU3BlY19qb2luTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJKb2luTm9kZS1qb2luU3BlYy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkpvaW5Ob2RlLWpvaW5TcGVjIj4KLSAgICAgICAgICA8Ym9keT5BIFZhbHVlU3BlY2lmaWNhdGlvbiBnaXZpbmcgdGhlIGNvbmRpdGlvbiB1bmRlciB3aGljaCB0aGUgSm9pbk5vZGUgd2lsbCBvZmZlciBhIHRva2VuIG9uIGl0cyBvdXRnb2luZyBBY3Rpdml0eUVkZ2UuIElmIG5vIGpvaW5TcGVjIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgSm9pbk5vZGUgd2lsbCBvZmZlciBhbiBvdXRnb2luZyB0b2tlbiBpZiB0b2tlbnMgYXJlIG9mZmVyZWQgb24gYWxsIG9mIGl0cyBpbmNvbWluZyBBY3Rpdml0eUVkZ2VzIChhbiAmcXVvdDthbmQmcXVvdDsgY29uZGl0aW9uKS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkpvaW5Ob2RlLWpvaW5TcGVjLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJNZXJnZU5vZGUiIG5hbWU9Ik1lcmdlTm9kZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVyZ2VOb2RlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVyZ2VOb2RlIj4KLSAgICAgICAgPGJvZHk+QSBtZXJnZSBub2RlIGlzIGEgY29udHJvbCBub2RlIHRoYXQgYnJpbmdzIHRvZ2V0aGVyIG11bHRpcGxlIGFsdGVybmF0ZSBmbG93cy4gSXQgaXMgbm90IHVzZWQgdG8gc3luY2hyb25pemUgY29uY3VycmVudCBmbG93cyBidXQgdG8gYWNjZXB0IG9uZSBhbW9uZyBzZXZlcmFsIGFsdGVybmF0ZSBmbG93cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNZXJnZU5vZGUtb25lX291dGdvaW5nX2VkZ2UiIG5hbWU9Im9uZV9vdXRnb2luZ19lZGdlIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik1lcmdlTm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNZXJnZU5vZGUtb25lX291dGdvaW5nX2VkZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXJnZU5vZGUtb25lX291dGdvaW5nX2VkZ2UiPgotICAgICAgICAgIDxib2R5PkEgTWVyZ2VOb2RlIGhhcyBvbmUgb3V0Z29pbmcgQWN0aXZpdHlFZGdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNZXJnZU5vZGUtb25lX291dGdvaW5nX2VkZ2UtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm91dGdvaW5nLT5zaXplKCk9MTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVyZ2VOb2RlLWVkZ2VzIiBuYW1lPSJlZGdlcyIgY29uc3RyYWluZWRFbGVtZW50PSJNZXJnZU5vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVyZ2VOb2RlLWVkZ2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVyZ2VOb2RlLWVkZ2VzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQWN0aXZpdHlFZGdlcyBpbmNvbWluZyB0byBhbmQgb3V0Z29pbmcgZnJvbSBhIE1lcmdlTm9kZSBtdXN0IGJlIGVpdGhlciBhbGwgT2JqZWN0Rmxvd3Mgb3IgYWxsIENvbnRyb2xGbG93cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTWVyZ2VOb2RlLWVkZ2VzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5sZXQgYWxsRWRnZXMgOiBTZXQoQWN0aXZpdHlFZGdlKSA9IGluY29taW5nLT51bmlvbihvdXRnb2luZykgaW4mI3hEOwotYWxsRWRnZXMtPmZvckFsbChvY2xJc0tpbmRPZihDb250cm9sRmxvdykpIG9yIGFsbEVkZ2VzLT5mb3JBbGwob2NsSXNLaW5kT2YoT2JqZWN0RmxvdykpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ik1lcmdlTm9kZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQ29udHJvbE5vZGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iT2JqZWN0RmxvdyIgbmFtZT0iT2JqZWN0RmxvdyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT2JqZWN0Rmxvdy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdEZsb3ciPgotICAgICAgICA8Ym9keT5BbiBPYmplY3RGbG93IGlzIGFuIEFjdGl2aXR5RWRnZSB0aGF0IGlzIHRyYXZlcnNlZCBieSBvYmplY3QgdG9rZW5zIHRoYXQgbWF5IGhvbGQgdmFsdWVzLiBPYmplY3QgZmxvd3MgYWxzbyBzdXBwb3J0IG11bHRpY2FzdC9yZWNlaXZlLCB0b2tlbiBzZWxlY3Rpb24gZnJvbSBvYmplY3Qgbm9kZXMsIGFuZCB0cmFuc2Zvcm1hdGlvbiBvZiB0b2tlbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT2JqZWN0Rmxvdy1pbnB1dF9hbmRfb3V0cHV0X3BhcmFtZXRlciIgbmFtZT0iaW5wdXRfYW5kX291dHB1dF9wYXJhbWV0ZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iT2JqZWN0RmxvdyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPYmplY3RGbG93LWlucHV0X2FuZF9vdXRwdXRfcGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Rmxvdy1pbnB1dF9hbmRfb3V0cHV0X3BhcmFtZXRlciI+Ci0gICAgICAgICAgPGJvZHk+QSBzZWxlY3Rpb24gQmVoYXZpb3IgaGFzIG9uZSBpbnB1dCBQYXJhbWV0ZXIgYW5kIG9uZSBvdXRwdXQgUGFyYW1ldGVyLiBUaGUgaW5wdXQgUGFyYW1ldGVyIG11c3QgaGF2ZSB0aGUgc2FtZSBhcyBvciBhIHN1cGVydHlwZSBvZiB0aGUgdHlwZSBvZiB0aGUgc291cmNlIE9iamVjdE5vZGUsIGJlIG5vbi11bmlxdWUgYW5kIGhhdmUgbXVsdGlwbGljaXR5IDAuLiouIFRoZSBvdXRwdXQgUGFyYW1ldGVyIG11c3QgYmUgdGhlIHNhbWUgb3IgYSBzdWJ0eXBlIG9mIHRoZSB0eXBlIG9mIHNvdXJjZSBPYmplY3ROb2RlLiBUaGUgQmVoYXZpb3IgY2Fubm90IGhhdmUgc2lkZSBlZmZlY3RzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJPYmplY3RGbG93LWlucHV0X2FuZF9vdXRwdXRfcGFyYW1ldGVyLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zZWxlY3Rpb24mbHQ7Pm51bGwgaW1wbGllcyYjeEQ7Ci0Jc2VsZWN0aW9uLmlucHV0UGFyYW1ldGVycygpLT5zaXplKCk9MSBhbmQmI3hEOwotCXNlbGVjdGlvbi5pbnB1dFBhcmFtZXRlcnMoKS0+Zm9yQWxsKG5vdCBpc1VuaXF1ZSBhbmQgaXMoMCwqKSkgYW5kJiN4RDsKLQlzZWxlY3Rpb24ub3V0cHV0UGFyYW1ldGVycygpLT5zaXplKCk9MTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT2JqZWN0Rmxvdy1ub19leGVjdXRhYmxlX25vZGVzIiBuYW1lPSJub19leGVjdXRhYmxlX25vZGVzIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik9iamVjdEZsb3ciPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT2JqZWN0Rmxvdy1ub19leGVjdXRhYmxlX25vZGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Rmxvdy1ub19leGVjdXRhYmxlX25vZGVzIj4KLSAgICAgICAgICA8Ym9keT5PYmplY3RGbG93cyBtYXkgbm90IGhhdmUgRXhlY3V0YWJsZU5vZGVzIGF0IGVpdGhlciBlbmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9iamVjdEZsb3ctbm9fZXhlY3V0YWJsZV9ub2Rlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bm90IChzb3VyY2Uub2NsSXNLaW5kT2YoRXhlY3V0YWJsZU5vZGUpIG9yIHRhcmdldC5vY2xJc0tpbmRPZihFeGVjdXRhYmxlTm9kZSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPYmplY3RGbG93LXRyYW5zZm9ybWF0aW9uX2JlaGF2aW9yIiBuYW1lPSJ0cmFuc2Zvcm1hdGlvbl9iZWhhdmlvciIgY29uc3RyYWluZWRFbGVtZW50PSJPYmplY3RGbG93Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdEZsb3ctdHJhbnNmb3JtYXRpb25fYmVoYXZpb3ItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPYmplY3RGbG93LXRyYW5zZm9ybWF0aW9uX2JlaGF2aW9yIj4KLSAgICAgICAgICA8Ym9keT5BIHRyYW5zZm9ybWF0aW9uIEJlaGF2aW9yIGhhcyBvbmUgaW5wdXQgUGFyYW1ldGVyIGFuZCBvbmUgb3V0cHV0IFBhcmFtZXRlci4gVGhlIGlucHV0IFBhcmFtZXRlciBtdXN0IGJlIHRoZSBzYW1lIGFzIG9yIGEgc3VwZXJ0eXBlIG9mIHRoZSB0eXBlIG9mIG9iamVjdCB0b2tlbiBjb21pbmcgZnJvbSB0aGUgc291cmNlIGVuZC4gVGhlIG91dHB1dCBQYXJhbWV0ZXIgbXVzdCBiZSB0aGUgc2FtZSBvciBhIHN1YnR5cGUgb2YgdGhlIHR5cGUgb2Ygb2JqZWN0IHRva2VuIGV4cGVjdGVkIGRvd25zdHJlYW0uIFRoZSBCZWhhdmlvciBjYW5ub3QgaGF2ZSBzaWRlIGVmZmVjdHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9iamVjdEZsb3ctdHJhbnNmb3JtYXRpb25fYmVoYXZpb3ItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnRyYW5zZm9ybWF0aW9uJmx0Oz5udWxsIGltcGxpZXMmI3hEOwotCXRyYW5zZm9ybWF0aW9uLmlucHV0UGFyYW1ldGVycygpLT5zaXplKCk9MSBhbmQmI3hEOwotCXRyYW5zZm9ybWF0aW9uLm91dHB1dFBhcmFtZXRlcnMoKS0+c2l6ZSgpPTE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik9iamVjdEZsb3ctc2VsZWN0aW9uX2JlaGF2aW9yIiBuYW1lPSJzZWxlY3Rpb25fYmVoYXZpb3IiIGNvbnN0cmFpbmVkRWxlbWVudD0iT2JqZWN0RmxvdyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPYmplY3RGbG93LXNlbGVjdGlvbl9iZWhhdmlvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdEZsb3ctc2VsZWN0aW9uX2JlaGF2aW9yIj4KLSAgICAgICAgICA8Ym9keT5BbiBPYmplY3RGbG93IG1heSBoYXZlIGEgc2VsZWN0aW9uIEJlaGF2aW9yIG9ubHkgaWYgaXQgaGFzIGFuIE9iamVjdE5vZGUgYXMgaXRzIHNvdXJjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iT2JqZWN0Rmxvdy1zZWxlY3Rpb25fYmVoYXZpb3ItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnNlbGVjdGlvbiZsdDs+bnVsbCBpbXBsaWVzIHNvdXJjZS5vY2xJc0tpbmRPZihPYmplY3ROb2RlKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT2JqZWN0Rmxvdy1jb21wYXRpYmxlX3R5cGVzIiBuYW1lPSJjb21wYXRpYmxlX3R5cGVzIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik9iamVjdEZsb3ciPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT2JqZWN0Rmxvdy1jb21wYXRpYmxlX3R5cGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Rmxvdy1jb21wYXRpYmxlX3R5cGVzIj4KLSAgICAgICAgICA8Ym9keT5PYmplY3ROb2RlcyBjb25uZWN0ZWQgYnkgYW4gT2JqZWN0Rmxvdywgd2l0aCBvcHRpb25hbGx5IGludGVydmVuaW5nIENvbnRyb2xOb2RlcywgbXVzdCBoYXZlIGNvbXBhdGlibGUgdHlwZXMuIEluIHBhcnRpY3VsYXIsIHRoZSBkb3duc3RyZWFtIE9iamVjdE5vZGUgdHlwZSBtdXN0IGJlIHRoZSBzYW1lIG9yIGEgc3VwZXJ0eXBlIG9mIHRoZSB1cHN0cmVhbSBPYmplY3ROb2RlIHR5cGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9iamVjdEZsb3ctY29tcGF0aWJsZV90eXBlcy1fc3BlY2lmaWNhdGlvbiIgbGFuZ3VhZ2U9IiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT2JqZWN0Rmxvdy1zYW1lX3VwcGVyX2JvdW5kcyIgbmFtZT0ic2FtZV91cHBlcl9ib3VuZHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iT2JqZWN0RmxvdyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPYmplY3RGbG93LXNhbWVfdXBwZXJfYm91bmRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Rmxvdy1zYW1lX3VwcGVyX2JvdW5kcyI+Ci0gICAgICAgICAgPGJvZHk+T2JqZWN0Tm9kZXMgY29ubmVjdGVkIGJ5IGFuIE9iamVjdEZsb3csIHdpdGggb3B0aW9uYWxseSBpbnRlcnZlbmluZyBDb250cm9sTm9kZXMsIG11c3QgaGF2ZSB0aGUgc2FtZSB1cHBlckJvdW5kcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iT2JqZWN0Rmxvdy1zYW1lX3VwcGVyX2JvdW5kcy1fc3BlY2lmaWNhdGlvbiIgbGFuZ3VhZ2U9IiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT2JqZWN0Rmxvdy10YXJnZXQiIG5hbWU9InRhcmdldCIgY29uc3RyYWluZWRFbGVtZW50PSJPYmplY3RGbG93Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdEZsb3ctdGFyZ2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Rmxvdy10YXJnZXQiPgotICAgICAgICAgIDxib2R5PkFuIE9iamVjdEZsb3cgd2l0aCBhIGNvbnN0YW50IHdlaWdodCBtYXkgbm90IHRhcmdldCBhbiBPYmplY3ROb2RlLCB3aXRoIG9wdGlvbmFsbHkgaW50ZXJ2ZW5pbmcgQ29udHJvbE5vZGVzLCB0aGF0IGhhcyBhbiB1cHBlciBib3VuZCBsZXNzIHRoYW4gdGhlIHdlaWdodC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iT2JqZWN0Rmxvdy10YXJnZXQtX3NwZWNpZmljYXRpb24iIGxhbmd1YWdlPSIiLz4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik9iamVjdEZsb3ctaXNfbXVsdGljYXN0X29yX2lzX211bHRpcmVjZWl2ZSIgbmFtZT0iaXNfbXVsdGljYXN0X29yX2lzX211bHRpcmVjZWl2ZSIgY29uc3RyYWluZWRFbGVtZW50PSJPYmplY3RGbG93Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdEZsb3ctaXNfbXVsdGljYXN0X29yX2lzX211bHRpcmVjZWl2ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdEZsb3ctaXNfbXVsdGljYXN0X29yX2lzX211bHRpcmVjZWl2ZSI+Ci0gICAgICAgICAgPGJvZHk+aXNNdWx0aWNhc3QgYW5kIGlzTXVsdGlyZWNlaXZlIGNhbm5vdCBib3RoIGJlIHRydWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9iamVjdEZsb3ctaXNfbXVsdGljYXN0X29yX2lzX211bHRpcmVjZWl2ZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bm90IChpc011bHRpY2FzdCBhbmQgaXNNdWx0aXJlY2VpdmUpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ik9iamVjdEZsb3ctX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFjdGl2aXR5RWRnZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT2JqZWN0Rmxvdy1pc011bHRpY2FzdCIgbmFtZT0iaXNNdWx0aWNhc3QiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT2JqZWN0Rmxvdy1pc011bHRpY2FzdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdEZsb3ctaXNNdWx0aWNhc3QiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB3aGV0aGVyIHRoZSBvYmplY3RzIGluIHRoZSBPYmplY3RGbG93IGFyZSBwYXNzZWQgYnkgbXVsdGljYXN0aW5nLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Ik9iamVjdEZsb3ctaXNNdWx0aWNhc3QtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9iamVjdEZsb3ctaXNNdWx0aXJlY2VpdmUiIG5hbWU9ImlzTXVsdGlyZWNlaXZlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdEZsb3ctaXNNdWx0aXJlY2VpdmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPYmplY3RGbG93LWlzTXVsdGlyZWNlaXZlIj4KLSAgICAgICAgICA8Ym9keT5JbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0cyBpbiB0aGUgT2JqZWN0RmxvdyBhcmUgZ2F0aGVyZWQgZnJvbSByZXNwb25kZW50cyB0byBtdWx0aWNhc3RpbmcuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iT2JqZWN0Rmxvdy1pc011bHRpcmVjZWl2ZS1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT2JqZWN0Rmxvdy1zZWxlY3Rpb24iIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iQmVoYXZpb3IiIGFzc29jaWF0aW9uPSJBX3NlbGVjdGlvbl9vYmplY3RGbG93Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdEZsb3ctc2VsZWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Rmxvdy1zZWxlY3Rpb24iPgotICAgICAgICAgIDxib2R5PkEgQmVoYXZpb3IgdXNlZCB0byBzZWxlY3QgdG9rZW5zIGZyb20gYSBzb3VyY2UgT2JqZWN0Tm9kZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9iamVjdEZsb3ctc2VsZWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT2JqZWN0Rmxvdy10cmFuc2Zvcm1hdGlvbiIgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9IkJlaGF2aW9yIiBhc3NvY2lhdGlvbj0iQV90cmFuc2Zvcm1hdGlvbl9vYmplY3RGbG93Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdEZsb3ctdHJhbnNmb3JtYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPYmplY3RGbG93LXRyYW5zZm9ybWF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5BIEJlaGF2aW9yIHVzZWQgdG8gY2hhbmdlIG9yIHJlcGxhY2Ugb2JqZWN0IHRva2VucyBmbG93aW5nIGFsb25nIHRoZSBPYmplY3RGbG93LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iT2JqZWN0Rmxvdy10cmFuc2Zvcm1hdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iT2JqZWN0Tm9kZSIgbmFtZT0iT2JqZWN0Tm9kZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT2JqZWN0Tm9kZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdE5vZGUiPgotICAgICAgICA8Ym9keT5BbiBPYmplY3ROb2RlIGlzIGFuIGFic3RyYWN0IEFjdGl2aXR5Tm9kZSB0aGF0IG1heSBob2xkIHRva2VucyB3aXRoaW4gdGhlIG9iamVjdCBmbG93IGluIGFuIEFjdGl2aXR5LiBPYmplY3ROb2RlcyBhbHNvIHN1cHBvcnQgdG9rZW4gc2VsZWN0aW9uLCBsaW1pdGF0aW9uIG9uIHRoZSBudW1iZXIgb2YgdG9rZW5zIGhlbGQsIHNwZWNpZmljYXRpb24gb2YgdGhlIHN0YXRlIHJlcXVpcmVkIGZvciB0b2tlbnMgYmVpbmcgaGVsZCwgYW5kIGNhcnJ5aW5nIGNvbnRyb2wgdmFsdWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik9iamVjdE5vZGUtaW5wdXRfb3V0cHV0X3BhcmFtZXRlciIgbmFtZT0iaW5wdXRfb3V0cHV0X3BhcmFtZXRlciIgY29uc3RyYWluZWRFbGVtZW50PSJPYmplY3ROb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdE5vZGUtaW5wdXRfb3V0cHV0X3BhcmFtZXRlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdE5vZGUtaW5wdXRfb3V0cHV0X3BhcmFtZXRlciI+Ci0gICAgICAgICAgPGJvZHk+QSBzZWxlY3Rpb24gQmVoYXZpb3IgaGFzIG9uZSBpbnB1dCBQYXJhbWV0ZXIgYW5kIG9uZSBvdXRwdXQgUGFyYW1ldGVyLiBUaGUgaW5wdXQgUGFyYW1ldGVyIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzICBvciBhIHN1cGVydHlwZSBvZiB0aGUgdHlwZSBvZiBPYmplY3ROb2RlLCBiZSBub24tdW5pcXVlLCBhbmQgaGF2ZSBtdWx0aXBsaWNpdHkgMC4uKi4gVGhlIG91dHB1dCBQYXJhbWV0ZXIgbXVzdCBiZSB0aGUgc2FtZSBvciBhIHN1YnR5cGUgb2YgdGhlIHR5cGUgb2YgT2JqZWN0Tm9kZS4gVGhlIEJlaGF2aW9yIGNhbm5vdCBoYXZlIHNpZGUgZWZmZWN0cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iT2JqZWN0Tm9kZS1pbnB1dF9vdXRwdXRfcGFyYW1ldGVyLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zZWxlY3Rpb24mbHQ7Pm51bGwgaW1wbGllcyYjeEQ7Ci0Jc2VsZWN0aW9uLmlucHV0UGFyYW1ldGVycygpLT5zaXplKCk9MSBhbmQmI3hEOwotCXNlbGVjdGlvbi5pbnB1dFBhcmFtZXRlcnMoKS0+Zm9yQWxsKHAgfCBub3QgcC5pc1VuaXF1ZSBhbmQgcC5pcygwLCopIGFuZCBzZWxmLnR5cGUuY29uZm9ybXNUbyhwLnR5cGUpKSBhbmQmI3hEOwotCXNlbGVjdGlvbi5vdXRwdXRQYXJhbWV0ZXJzKCktPnNpemUoKT0xIGFuZCYjeEQ7Ci0JCXNlbGVjdGlvbi5pbnB1dFBhcmFtZXRlcnMoKS0+Zm9yQWxsKHAgfCBzZWxmLnR5cGUuY29uZm9ybXNUbyhwLnR5cGUpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT2JqZWN0Tm9kZS1zZWxlY3Rpb25fYmVoYXZpb3IiIG5hbWU9InNlbGVjdGlvbl9iZWhhdmlvciIgY29uc3RyYWluZWRFbGVtZW50PSJPYmplY3ROb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdE5vZGUtc2VsZWN0aW9uX2JlaGF2aW9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Tm9kZS1zZWxlY3Rpb25fYmVoYXZpb3IiPgotICAgICAgICAgIDxib2R5PklmIGFuIE9iamVjdE5vZGUgaGFzIGEgc2VsZWN0aW9uIEJlaGF2aW9yLCB0aGVuIHRoZSBvcmRlcmluZyBvZiB0aGUgb2JqZWN0IG5vZGUgaXMgb3JkZXJlZCwgYW5kIHZpY2UgdmVyc2EuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9iamVjdE5vZGUtc2VsZWN0aW9uX2JlaGF2aW9yLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oc2VsZWN0aW9uJmx0Oz5udWxsKSA9IChvcmRlcmluZz1PYmplY3ROb2RlT3JkZXJpbmdLaW5kOjpvcmRlcmVkKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT2JqZWN0Tm9kZS1vYmplY3RfZmxvd19lZGdlcyIgbmFtZT0ib2JqZWN0X2Zsb3dfZWRnZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iT2JqZWN0Tm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPYmplY3ROb2RlLW9iamVjdF9mbG93X2VkZ2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Tm9kZS1vYmplY3RfZmxvd19lZGdlcyI+Ci0gICAgICAgICAgPGJvZHk+SWYgaXNDb250cm9sVHlwZT1mYWxzZSwgdGhlIEFjdGl2aXR5RWRnZXMgaW5jb21pbmcgdG8gb3Igb3V0Z29pbmcgZnJvbSBhbiBPYmplY3ROb2RlIG11c3QgYWxsIGJlIE9iamVjdEZsb3dzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJPYmplY3ROb2RlLW9iamVjdF9mbG93X2VkZ2VzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4obm90IGlzQ29udHJvbFR5cGUpIGltcGxpZXMgaW5jb21pbmctPnVuaW9uKG91dGdvaW5nKS0+Zm9yQWxsKG9jbElzS2luZE9mKE9iamVjdEZsb3cpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJPYmplY3ROb2RlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJUeXBlZEVsZW1lbnQiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ik9iamVjdE5vZGUtX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IkFjdGl2aXR5Tm9kZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT2JqZWN0Tm9kZS1pblN0YXRlIiBuYW1lPSJpblN0YXRlIiB0eXBlPSJTdGF0ZSIgYXNzb2NpYXRpb249IkFfaW5TdGF0ZV9vYmplY3ROb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdE5vZGUtaW5TdGF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdE5vZGUtaW5TdGF0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFN0YXRlcyByZXF1aXJlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlcyBoZWxkIGJ5IHRva2VucyBvbiB0aGlzIE9iamVjdE5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJPYmplY3ROb2RlLWluU3RhdGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJPYmplY3ROb2RlLWluU3RhdGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT2JqZWN0Tm9kZS1pc0NvbnRyb2xUeXBlIiBuYW1lPSJpc0NvbnRyb2xUeXBlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdE5vZGUtaXNDb250cm9sVHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdE5vZGUtaXNDb250cm9sVHlwZSI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIHR5cGUgb2YgdGhlIE9iamVjdE5vZGUgaXMgdG8gYmUgdHJlYXRlZCBhcyByZXByZXNlbnRpbmcgY29udHJvbCB2YWx1ZXMgdGhhdCBtYXkgdHJhdmVyc2UgQ29udHJvbEZsb3dzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Ik9iamVjdE5vZGUtaXNDb250cm9sVHlwZS1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT2JqZWN0Tm9kZS1vcmRlcmluZyIgbmFtZT0ib3JkZXJpbmciIHR5cGU9Ik9iamVjdE5vZGVPcmRlcmluZ0tpbmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT2JqZWN0Tm9kZS1vcmRlcmluZy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdE5vZGUtb3JkZXJpbmciPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyBob3cgdGhlIHRva2VucyBoZWxkIGJ5IHRoZSBPYmplY3ROb2RlIGFyZSBvcmRlcmVkIGZvciBzZWxlY3Rpb24gdG8gdHJhdmVyc2UgQWN0aXZpdHlFZGdlcyBvdXRnb2luZyBmcm9tIHRoZSBPYmplY3ROb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9Ik9iamVjdE5vZGUtb3JkZXJpbmctX2RlZmF1bHRWYWx1ZSIgdHlwZT0iT2JqZWN0Tm9kZU9yZGVyaW5nS2luZCIgaW5zdGFuY2U9Ik9iamVjdE5vZGVPcmRlcmluZ0tpbmQtRklGTyIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9iamVjdE5vZGUtc2VsZWN0aW9uIiBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9IkJlaGF2aW9yIiBhc3NvY2lhdGlvbj0iQV9zZWxlY3Rpb25fb2JqZWN0Tm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPYmplY3ROb2RlLXNlbGVjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdE5vZGUtc2VsZWN0aW9uIj4KLSAgICAgICAgICA8Ym9keT5BIEJlaGF2aW9yIHVzZWQgdG8gc2VsZWN0IHRva2VucyB0byBiZSBvZmZlcmVkIG9uIG91dGdvaW5nIEFjdGl2aXR5RWRnZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJPYmplY3ROb2RlLXNlbGVjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9iamVjdE5vZGUtdXBwZXJCb3VuZCIgbmFtZT0idXBwZXJCb3VuZCIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3VwcGVyQm91bmRfb2JqZWN0Tm9kZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPYmplY3ROb2RlLXVwcGVyQm91bmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPYmplY3ROb2RlLXVwcGVyQm91bmQiPgotICAgICAgICAgIDxib2R5PlRoZSBtYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdGhhdCBtYXkgYmUgaGVsZCBieSB0aGlzIE9iamVjdE5vZGUuIFRva2VucyBjYW5ub3QgZmxvdyBpbnRvIHRoZSBPYmplY3ROb2RlIGlmIHRoZSB1cHBlckJvdW5kIGlzIHJlYWNoZWQuIElmIG5vIHVwcGVyQm91bmQgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZXJlIGlzIG5vIGxpbWl0IG9uIGhvdyBtYW55IHRva2VucyB0aGUgT2JqZWN0Tm9kZSBjYW4gaG9sZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9iamVjdE5vZGUtdXBwZXJCb3VuZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVmFyaWFibGUiIG5hbWU9IlZhcmlhYmxlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWYXJpYWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZhcmlhYmxlIj4KLSAgICAgICAgPGJvZHk+QSBWYXJpYWJsZSBpcyBhIENvbm5lY3RhYmxlRWxlbWVudCB0aGF0IG1heSBzdG9yZSB2YWx1ZXMgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgYW4gQWN0aXZpdHkuIFJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlIHZhbHVlcyBvZiBhIFZhcmlhYmxlIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIG1lYW5zIGZvciBwYXNzaW5nIGRhdGEgdGhhbiB0aGUgdXNlIG9mIE9iamVjdEZsb3dzLiBBIFZhcmlhYmxlIG1heSBiZSBvd25lZCBkaXJlY3RseSBieSBhbiBBY3Rpdml0eSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhY2Nlc3NpYmxlIGZyb20gYW55d2hlcmUgd2l0aGluIHRoYXQgYWN0aXZpdHksIG9yIGl0IG1heSBiZSBvd25lZCBieSBhIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUsIGluIHdoaWNoIGNhc2UgaXQgaXMgb25seSBhY2Nlc3NpYmxlIHdpdGhpbiB0aGF0IG5vZGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJWYXJpYWJsZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQ29ubmVjdGFibGVFbGVtZW50Ii8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJWYXJpYWJsZS1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iTXVsdGlwbGljaXR5RWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVmFyaWFibGUtYWN0aXZpdHlTY29wZSIgbmFtZT0iYWN0aXZpdHlTY29wZSIgdHlwZT0iQWN0aXZpdHkiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV92YXJpYWJsZV9hY3Rpdml0eVNjb3BlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhcmlhYmxlLWFjdGl2aXR5U2NvcGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWYXJpYWJsZS1hY3Rpdml0eVNjb3BlIj4KLSAgICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eSB0aGF0IG93bnMgdGhlIFZhcmlhYmxlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVmFyaWFibGUtYWN0aXZpdHlTY29wZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlZhcmlhYmxlLXNjb3BlIiBuYW1lPSJzY29wZSIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX3ZhcmlhYmxlX3Njb3BlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhcmlhYmxlLXNjb3BlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmFyaWFibGUtc2NvcGUiPgotICAgICAgICAgIDxib2R5PkEgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSB0aGF0IG93bnMgdGhlIFZhcmlhYmxlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVmFyaWFibGUtc2NvcGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJWYXJpYWJsZS1pc0FjY2Vzc2libGVCeSIgbmFtZT0iaXNBY2Nlc3NpYmxlQnkiIGJvZHlDb25kaXRpb249IlZhcmlhYmxlLWlzQWNjZXNzaWJsZUJ5LXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVmFyaWFibGUtaXNBY2Nlc3NpYmxlQnktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWYXJpYWJsZS1pc0FjY2Vzc2libGVCeSI+Ci0gICAgICAgICAgPGJvZHk+QSBWYXJpYWJsZSBpcyBhY2Nlc3NpYmxlIGJ5IEFjdGlvbnMgd2l0aGluIGl0cyBzY29wZSAodGhlIEFjdGl2aXR5IG9yIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgdGhhdCBvd25zIGl0KS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iVmFyaWFibGUtaXNBY2Nlc3NpYmxlQnktc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJWYXJpYWJsZS1pc0FjY2Vzc2libGVCeSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlZhcmlhYmxlLWlzQWNjZXNzaWJsZUJ5LXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgc2NvcGUmbHQ7Pm51bGwgdGhlbiBzY29wZS5hbGxPd25lZE5vZGVzKCktPmluY2x1ZGVzKGEpJiN4RDsKLWVsc2UgYS5jb250YWluaW5nQWN0aXZpdHkoKT1hY3Rpdml0eVNjb3BlJiN4RDsKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJWYXJpYWJsZS1pc0FjY2Vzc2libGVCeS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVmFyaWFibGUtaXNBY2Nlc3NpYmxlQnktYSIgbmFtZT0iYSIgdHlwZT0iQWN0aW9uIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJPYmplY3ROb2RlT3JkZXJpbmdLaW5kIiBuYW1lPSJPYmplY3ROb2RlT3JkZXJpbmdLaW5kIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPYmplY3ROb2RlT3JkZXJpbmdLaW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Tm9kZU9yZGVyaW5nS2luZCI+Ci0gICAgICAgIDxib2R5Pk9iamVjdE5vZGVPcmRlcmluZ0tpbmQgaXMgYW4gZW51bWVyYXRpb24gaW5kaWNhdGluZyBxdWV1aW5nIG9yZGVyIGZvciBvZmZlcmluZyB0aGUgdG9rZW5zIGhlbGQgYnkgYW4gT2JqZWN0Tm9kZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJPYmplY3ROb2RlT3JkZXJpbmdLaW5kLXVub3JkZXJlZCIgbmFtZT0idW5vcmRlcmVkIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdE5vZGVPcmRlcmluZ0tpbmQtdW5vcmRlcmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Tm9kZU9yZGVyaW5nS2luZC11bm9yZGVyZWQiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB0aGF0IHRva2VucyBhcmUgdW5vcmRlcmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJPYmplY3ROb2RlT3JkZXJpbmdLaW5kLW9yZGVyZWQiIG5hbWU9Im9yZGVyZWQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT2JqZWN0Tm9kZU9yZGVyaW5nS2luZC1vcmRlcmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2JqZWN0Tm9kZU9yZGVyaW5nS2luZC1vcmRlcmVkIj4KLSAgICAgICAgICA8Ym9keT5JbmRpY2F0ZXMgdGhhdCB0b2tlbnMgYXJlIG9yZGVyZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Ik9iamVjdE5vZGVPcmRlcmluZ0tpbmQtTElGTyIgbmFtZT0iTElGTyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPYmplY3ROb2RlT3JkZXJpbmdLaW5kLUxJRk8tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPYmplY3ROb2RlT3JkZXJpbmdLaW5kLUxJRk8iPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB0aGF0IHRva2VucyBhcmUgcXVldWVkIGluIGEgbGFzdCBpbiwgZmlyc3Qgb3V0IG1hbm5lci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iT2JqZWN0Tm9kZU9yZGVyaW5nS2luZC1GSUZPIiBuYW1lPSJGSUZPIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9iamVjdE5vZGVPcmRlcmluZ0tpbmQtRklGTy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9iamVjdE5vZGVPcmRlcmluZ0tpbmQtRklGTyI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIHRoYXQgdG9rZW5zIGFyZSBxdWV1ZWQgaW4gYSBmaXJzdCBpbiwgZmlyc3Qgb3V0IG1hbm5lci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc2VsZWN0aW9uX29iamVjdE5vZGUiIG5hbWU9IkFfc2VsZWN0aW9uX29iamVjdE5vZGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iT2JqZWN0Tm9kZS1zZWxlY3Rpb24gQV9zZWxlY3Rpb25fb2JqZWN0Tm9kZS1vYmplY3ROb2RlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfc2VsZWN0aW9uX29iamVjdE5vZGUtb2JqZWN0Tm9kZSIgbmFtZT0ib2JqZWN0Tm9kZSIgdHlwZT0iT2JqZWN0Tm9kZSIgYXNzb2NpYXRpb249IkFfc2VsZWN0aW9uX29iamVjdE5vZGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc2VsZWN0aW9uX29iamVjdE5vZGUtb2JqZWN0Tm9kZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfc2VsZWN0aW9uX29iamVjdE5vZGUtb2JqZWN0Tm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW5TdGF0ZV9vYmplY3ROb2RlIiBuYW1lPSJBX2luU3RhdGVfb2JqZWN0Tm9kZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJPYmplY3ROb2RlLWluU3RhdGUgQV9pblN0YXRlX29iamVjdE5vZGUtb2JqZWN0Tm9kZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2luU3RhdGVfb2JqZWN0Tm9kZS1vYmplY3ROb2RlIiBuYW1lPSJvYmplY3ROb2RlIiB0eXBlPSJPYmplY3ROb2RlIiBhc3NvY2lhdGlvbj0iQV9pblN0YXRlX29iamVjdE5vZGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfaW5TdGF0ZV9vYmplY3ROb2RlLW9iamVjdE5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2luU3RhdGVfb2JqZWN0Tm9kZS1vYmplY3ROb2RlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV91cHBlckJvdW5kX29iamVjdE5vZGUiIG5hbWU9IkFfdXBwZXJCb3VuZF9vYmplY3ROb2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik9iamVjdE5vZGUtdXBwZXJCb3VuZCBBX3VwcGVyQm91bmRfb2JqZWN0Tm9kZS1vYmplY3ROb2RlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdXBwZXJCb3VuZF9vYmplY3ROb2RlLW9iamVjdE5vZGUiIG5hbWU9Im9iamVjdE5vZGUiIHR5cGU9Ik9iamVjdE5vZGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV91cHBlckJvdW5kX29iamVjdE5vZGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdXBwZXJCb3VuZF9vYmplY3ROb2RlLW9iamVjdE5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdHJhbnNmb3JtYXRpb25fb2JqZWN0RmxvdyIgbmFtZT0iQV90cmFuc2Zvcm1hdGlvbl9vYmplY3RGbG93IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik9iamVjdEZsb3ctdHJhbnNmb3JtYXRpb24gQV90cmFuc2Zvcm1hdGlvbl9vYmplY3RGbG93LW9iamVjdEZsb3ciPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV90cmFuc2Zvcm1hdGlvbl9vYmplY3RGbG93LW9iamVjdEZsb3ciIG5hbWU9Im9iamVjdEZsb3ciIHR5cGU9Ik9iamVjdEZsb3ciIGFzc29jaWF0aW9uPSJBX3RyYW5zZm9ybWF0aW9uX29iamVjdEZsb3ciPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdHJhbnNmb3JtYXRpb25fb2JqZWN0Rmxvdy1vYmplY3RGbG93LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV90cmFuc2Zvcm1hdGlvbl9vYmplY3RGbG93LW9iamVjdEZsb3ctX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3NlbGVjdGlvbl9vYmplY3RGbG93IiBuYW1lPSJBX3NlbGVjdGlvbl9vYmplY3RGbG93IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik9iamVjdEZsb3ctc2VsZWN0aW9uIEFfc2VsZWN0aW9uX29iamVjdEZsb3ctb2JqZWN0RmxvdyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3NlbGVjdGlvbl9vYmplY3RGbG93LW9iamVjdEZsb3ciIG5hbWU9Im9iamVjdEZsb3ciIHR5cGU9Ik9iamVjdEZsb3ciIGFzc29jaWF0aW9uPSJBX3NlbGVjdGlvbl9vYmplY3RGbG93Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3NlbGVjdGlvbl9vYmplY3RGbG93LW9iamVjdEZsb3ctX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3NlbGVjdGlvbl9vYmplY3RGbG93LW9iamVjdEZsb3ctX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2pvaW5TcGVjX2pvaW5Ob2RlIiBuYW1lPSJBX2pvaW5TcGVjX2pvaW5Ob2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkpvaW5Ob2RlLWpvaW5TcGVjIEFfam9pblNwZWNfam9pbk5vZGUtam9pbk5vZGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9qb2luU3BlY19qb2luTm9kZS1qb2luTm9kZSIgbmFtZT0iam9pbk5vZGUiIHR5cGU9IkpvaW5Ob2RlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfam9pblNwZWNfam9pbk5vZGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfam9pblNwZWNfam9pbk5vZGUtam9pbk5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW50ZXJydXB0aW5nRWRnZV9pbnRlcnJ1cHRzIiBuYW1lPSJBX2ludGVycnVwdGluZ0VkZ2VfaW50ZXJydXB0cyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcnJ1cHRpYmxlQWN0aXZpdHlSZWdpb24taW50ZXJydXB0aW5nRWRnZSBBY3Rpdml0eUVkZ2UtaW50ZXJydXB0cyIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2hhbmRsZXJfcHJvdGVjdGVkTm9kZSIgbmFtZT0iQV9oYW5kbGVyX3Byb3RlY3RlZE5vZGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRXhlY3V0YWJsZU5vZGUtaGFuZGxlciBFeGNlcHRpb25IYW5kbGVyLXByb3RlY3RlZE5vZGUiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9oYW5kbGVyQm9keV9leGNlcHRpb25IYW5kbGVyIiBuYW1lPSJBX2hhbmRsZXJCb2R5X2V4Y2VwdGlvbkhhbmRsZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRXhjZXB0aW9uSGFuZGxlci1oYW5kbGVyQm9keSBBX2hhbmRsZXJCb2R5X2V4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uSGFuZGxlciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2hhbmRsZXJCb2R5X2V4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uSGFuZGxlciIgbmFtZT0iZXhjZXB0aW9uSGFuZGxlciIgdHlwZT0iRXhjZXB0aW9uSGFuZGxlciIgYXNzb2NpYXRpb249IkFfaGFuZGxlckJvZHlfZXhjZXB0aW9uSGFuZGxlciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9oYW5kbGVyQm9keV9leGNlcHRpb25IYW5kbGVyLWV4Y2VwdGlvbkhhbmRsZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2hhbmRsZXJCb2R5X2V4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uSGFuZGxlci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZXhjZXB0aW9uVHlwZV9leGNlcHRpb25IYW5kbGVyIiBuYW1lPSJBX2V4Y2VwdGlvblR5cGVfZXhjZXB0aW9uSGFuZGxlciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFeGNlcHRpb25IYW5kbGVyLWV4Y2VwdGlvblR5cGUgQV9leGNlcHRpb25UeXBlX2V4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uSGFuZGxlciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2V4Y2VwdGlvblR5cGVfZXhjZXB0aW9uSGFuZGxlci1leGNlcHRpb25IYW5kbGVyIiBuYW1lPSJleGNlcHRpb25IYW5kbGVyIiB0eXBlPSJFeGNlcHRpb25IYW5kbGVyIiBhc3NvY2lhdGlvbj0iQV9leGNlcHRpb25UeXBlX2V4Y2VwdGlvbkhhbmRsZXIiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZXhjZXB0aW9uVHlwZV9leGNlcHRpb25IYW5kbGVyLWV4Y2VwdGlvbkhhbmRsZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2V4Y2VwdGlvblR5cGVfZXhjZXB0aW9uSGFuZGxlci1leGNlcHRpb25IYW5kbGVyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9leGNlcHRpb25JbnB1dF9leGNlcHRpb25IYW5kbGVyIiBuYW1lPSJBX2V4Y2VwdGlvbklucHV0X2V4Y2VwdGlvbkhhbmRsZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRXhjZXB0aW9uSGFuZGxlci1leGNlcHRpb25JbnB1dCBBX2V4Y2VwdGlvbklucHV0X2V4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uSGFuZGxlciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2V4Y2VwdGlvbklucHV0X2V4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uSGFuZGxlciIgbmFtZT0iZXhjZXB0aW9uSGFuZGxlciIgdHlwZT0iRXhjZXB0aW9uSGFuZGxlciIgYXNzb2NpYXRpb249IkFfZXhjZXB0aW9uSW5wdXRfZXhjZXB0aW9uSGFuZGxlciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9leGNlcHRpb25JbnB1dF9leGNlcHRpb25IYW5kbGVyLWV4Y2VwdGlvbkhhbmRsZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2V4Y2VwdGlvbklucHV0X2V4Y2VwdGlvbkhhbmRsZXItZXhjZXB0aW9uSGFuZGxlci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZGVjaXNpb25JbnB1dF9kZWNpc2lvbk5vZGUiIG5hbWU9IkFfZGVjaXNpb25JbnB1dF9kZWNpc2lvbk5vZGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRGVjaXNpb25Ob2RlLWRlY2lzaW9uSW5wdXQgQV9kZWNpc2lvbklucHV0X2RlY2lzaW9uTm9kZS1kZWNpc2lvbk5vZGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9kZWNpc2lvbklucHV0X2RlY2lzaW9uTm9kZS1kZWNpc2lvbk5vZGUiIG5hbWU9ImRlY2lzaW9uTm9kZSIgdHlwZT0iRGVjaXNpb25Ob2RlIiBhc3NvY2lhdGlvbj0iQV9kZWNpc2lvbklucHV0X2RlY2lzaW9uTm9kZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9kZWNpc2lvbklucHV0X2RlY2lzaW9uTm9kZS1kZWNpc2lvbk5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2RlY2lzaW9uSW5wdXRfZGVjaXNpb25Ob2RlLWRlY2lzaW9uTm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZGVjaXNpb25JbnB1dEZsb3dfZGVjaXNpb25Ob2RlIiBuYW1lPSJBX2RlY2lzaW9uSW5wdXRGbG93X2RlY2lzaW9uTm9kZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJEZWNpc2lvbk5vZGUtZGVjaXNpb25JbnB1dEZsb3cgQV9kZWNpc2lvbklucHV0Rmxvd19kZWNpc2lvbk5vZGUtZGVjaXNpb25Ob2RlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZGVjaXNpb25JbnB1dEZsb3dfZGVjaXNpb25Ob2RlLWRlY2lzaW9uTm9kZSIgbmFtZT0iZGVjaXNpb25Ob2RlIiB0eXBlPSJEZWNpc2lvbk5vZGUiIGFzc29jaWF0aW9uPSJBX2RlY2lzaW9uSW5wdXRGbG93X2RlY2lzaW9uTm9kZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9kZWNpc2lvbklucHV0Rmxvd19kZWNpc2lvbk5vZGUtZGVjaXNpb25Ob2RlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlcHJlc2VudHNfYWN0aXZpdHlQYXJ0aXRpb24iIG5hbWU9IkFfcmVwcmVzZW50c19hY3Rpdml0eVBhcnRpdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eVBhcnRpdGlvbi1yZXByZXNlbnRzIEFfcmVwcmVzZW50c19hY3Rpdml0eVBhcnRpdGlvbi1hY3Rpdml0eVBhcnRpdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlcHJlc2VudHNfYWN0aXZpdHlQYXJ0aXRpb24tYWN0aXZpdHlQYXJ0aXRpb24iIG5hbWU9ImFjdGl2aXR5UGFydGl0aW9uIiB0eXBlPSJBY3Rpdml0eVBhcnRpdGlvbiIgYXNzb2NpYXRpb249IkFfcmVwcmVzZW50c19hY3Rpdml0eVBhcnRpdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXByZXNlbnRzX2FjdGl2aXR5UGFydGl0aW9uLWFjdGl2aXR5UGFydGl0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9yZXByZXNlbnRzX2FjdGl2aXR5UGFydGl0aW9uLWFjdGl2aXR5UGFydGl0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zdWJwYXJ0aXRpb25fc3VwZXJQYXJ0aXRpb24iIG5hbWU9IkFfc3VicGFydGl0aW9uX3N1cGVyUGFydGl0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFjdGl2aXR5UGFydGl0aW9uLXN1YnBhcnRpdGlvbiBBY3Rpdml0eVBhcnRpdGlvbi1zdXBlclBhcnRpdGlvbiIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VkZ2VfaW5QYXJ0aXRpb24iIG5hbWU9IkFfZWRnZV9pblBhcnRpdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eVBhcnRpdGlvbi1lZGdlIEFjdGl2aXR5RWRnZS1pblBhcnRpdGlvbiIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3BhcmFtZXRlcl9hY3Rpdml0eVBhcmFtZXRlck5vZGUiIG5hbWU9IkFfcGFyYW1ldGVyX2FjdGl2aXR5UGFyYW1ldGVyTm9kZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUtcGFyYW1ldGVyIEFfcGFyYW1ldGVyX2FjdGl2aXR5UGFyYW1ldGVyTm9kZS1hY3Rpdml0eVBhcmFtZXRlck5vZGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9wYXJhbWV0ZXJfYWN0aXZpdHlQYXJhbWV0ZXJOb2RlLWFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgbmFtZT0iYWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB0eXBlPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUiIGFzc29jaWF0aW9uPSJBX3BhcmFtZXRlcl9hY3Rpdml0eVBhcmFtZXRlck5vZGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcGFyYW1ldGVyX2FjdGl2aXR5UGFyYW1ldGVyTm9kZS1hY3Rpdml0eVBhcmFtZXRlck5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3BhcmFtZXRlcl9hY3Rpdml0eVBhcmFtZXRlck5vZGUtYWN0aXZpdHlQYXJhbWV0ZXJOb2RlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9pbkludGVycnVwdGlibGVSZWdpb25fbm9kZSIgbmFtZT0iQV9pbkludGVycnVwdGlibGVSZWdpb25fbm9kZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eU5vZGUtaW5JbnRlcnJ1cHRpYmxlUmVnaW9uIEludGVycnVwdGlibGVBY3Rpdml0eVJlZ2lvbi1ub2RlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW5QYXJ0aXRpb25fbm9kZSIgbmFtZT0iQV9pblBhcnRpdGlvbl9ub2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFjdGl2aXR5Tm9kZS1pblBhcnRpdGlvbiBBY3Rpdml0eVBhcnRpdGlvbi1ub2RlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW5jb21pbmdfdGFyZ2V0X25vZGUiIG5hbWU9IkFfaW5jb21pbmdfdGFyZ2V0X25vZGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQWN0aXZpdHlOb2RlLWluY29taW5nIEFjdGl2aXR5RWRnZS10YXJnZXQiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vdXRnb2luZ19zb3VyY2Vfbm9kZSIgbmFtZT0iQV9vdXRnb2luZ19zb3VyY2Vfbm9kZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eU5vZGUtb3V0Z29pbmcgQWN0aXZpdHlFZGdlLXNvdXJjZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlZGVmaW5lZE5vZGVfYWN0aXZpdHlOb2RlIiBuYW1lPSJBX3JlZGVmaW5lZE5vZGVfYWN0aXZpdHlOb2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFjdGl2aXR5Tm9kZS1yZWRlZmluZWROb2RlIEFfcmVkZWZpbmVkTm9kZV9hY3Rpdml0eU5vZGUtYWN0aXZpdHlOb2RlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVkZWZpbmVkTm9kZV9hY3Rpdml0eU5vZGUtYWN0aXZpdHlOb2RlIiBuYW1lPSJhY3Rpdml0eU5vZGUiIHR5cGU9IkFjdGl2aXR5Tm9kZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfcmVkZWZpbmVkRWxlbWVudF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluZWROb2RlX2FjdGl2aXR5Tm9kZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZWRlZmluZWROb2RlX2FjdGl2aXR5Tm9kZS1hY3Rpdml0eU5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlZGVmaW5lZE5vZGVfYWN0aXZpdHlOb2RlLWFjdGl2aXR5Tm9kZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY29udGFpbmVkRWRnZV9pbkdyb3VwIiBuYW1lPSJBX2NvbnRhaW5lZEVkZ2VfaW5Hcm91cCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkFjdGl2aXR5R3JvdXAtY29udGFpbmVkRWRnZSBBY3Rpdml0eUVkZ2UtaW5Hcm91cCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NvbnRhaW5lZE5vZGVfaW5Hcm91cCIgbmFtZT0iQV9jb250YWluZWROb2RlX2luR3JvdXAiIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eUdyb3VwLWNvbnRhaW5lZE5vZGUgQWN0aXZpdHlOb2RlLWluR3JvdXAiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zdWJncm91cF9zdXBlckdyb3VwIiBuYW1lPSJBX3N1Ymdyb3VwX3N1cGVyR3JvdXAiIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eUdyb3VwLXN1Ymdyb3VwIEFjdGl2aXR5R3JvdXAtc3VwZXJHcm91cCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlZGVmaW5lZEVkZ2VfYWN0aXZpdHlFZGdlIiBuYW1lPSJBX3JlZGVmaW5lZEVkZ2VfYWN0aXZpdHlFZGdlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFjdGl2aXR5RWRnZS1yZWRlZmluZWRFZGdlIEFfcmVkZWZpbmVkRWRnZV9hY3Rpdml0eUVkZ2UtYWN0aXZpdHlFZGdlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVkZWZpbmVkRWRnZV9hY3Rpdml0eUVkZ2UtYWN0aXZpdHlFZGdlIiBuYW1lPSJhY3Rpdml0eUVkZ2UiIHR5cGU9IkFjdGl2aXR5RWRnZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfcmVkZWZpbmVkRWxlbWVudF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluZWRFZGdlX2FjdGl2aXR5RWRnZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZWRlZmluZWRFZGdlX2FjdGl2aXR5RWRnZS1hY3Rpdml0eUVkZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlZGVmaW5lZEVkZ2VfYWN0aXZpdHlFZGdlLWFjdGl2aXR5RWRnZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfd2VpZ2h0X2FjdGl2aXR5RWRnZSIgbmFtZT0iQV93ZWlnaHRfYWN0aXZpdHlFZGdlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFjdGl2aXR5RWRnZS13ZWlnaHQgQV93ZWlnaHRfYWN0aXZpdHlFZGdlLWFjdGl2aXR5RWRnZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3dlaWdodF9hY3Rpdml0eUVkZ2UtYWN0aXZpdHlFZGdlIiBuYW1lPSJhY3Rpdml0eUVkZ2UiIHR5cGU9IkFjdGl2aXR5RWRnZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX3dlaWdodF9hY3Rpdml0eUVkZ2UiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfd2VpZ2h0X2FjdGl2aXR5RWRnZS1hY3Rpdml0eUVkZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZ3VhcmRfYWN0aXZpdHlFZGdlIiBuYW1lPSJBX2d1YXJkX2FjdGl2aXR5RWRnZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eUVkZ2UtZ3VhcmQgQV9ndWFyZF9hY3Rpdml0eUVkZ2UtYWN0aXZpdHlFZGdlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZ3VhcmRfYWN0aXZpdHlFZGdlLWFjdGl2aXR5RWRnZSIgbmFtZT0iYWN0aXZpdHlFZGdlIiB0eXBlPSJBY3Rpdml0eUVkZ2UiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9ndWFyZF9hY3Rpdml0eUVkZ2UiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZ3VhcmRfYWN0aXZpdHlFZGdlLWFjdGl2aXR5RWRnZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zdHJ1Y3R1cmVkTm9kZV9hY3Rpdml0eSIgbmFtZT0iQV9zdHJ1Y3R1cmVkTm9kZV9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eS1zdHJ1Y3R1cmVkTm9kZSBBX3N0cnVjdHVyZWROb2RlX2FjdGl2aXR5LWFjdGl2aXR5Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfc3RydWN0dXJlZE5vZGVfYWN0aXZpdHktYWN0aXZpdHkiIG5hbWU9ImFjdGl2aXR5IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJBY3Rpdml0eSIgYXNzb2NpYXRpb249IkFfc3RydWN0dXJlZE5vZGVfYWN0aXZpdHkiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc3RydWN0dXJlZE5vZGVfYWN0aXZpdHktYWN0aXZpdHktX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZ3JvdXBfaW5BY3Rpdml0eSIgbmFtZT0iQV9ncm91cF9pbkFjdGl2aXR5IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFjdGl2aXR5LWdyb3VwIEFjdGl2aXR5R3JvdXAtaW5BY3Rpdml0eSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX25vZGVfYWN0aXZpdHkiIG5hbWU9IkFfbm9kZV9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eS1ub2RlIEFjdGl2aXR5Tm9kZS1hY3Rpdml0eSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3ZhcmlhYmxlX2FjdGl2aXR5U2NvcGUiIG5hbWU9IkFfdmFyaWFibGVfYWN0aXZpdHlTY29wZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eS12YXJpYWJsZSBWYXJpYWJsZS1hY3Rpdml0eVNjb3BlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZWRnZV9hY3Rpdml0eSIgbmFtZT0iQV9lZGdlX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFjdGl2aXR5LWVkZ2UgQWN0aXZpdHlFZGdlLWFjdGl2aXR5Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcGFydGl0aW9uX2FjdGl2aXR5IiBuYW1lPSJBX3BhcnRpdGlvbl9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpdml0eS1wYXJ0aXRpb24gQV9wYXJ0aXRpb25fYWN0aXZpdHktYWN0aXZpdHkiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9wYXJ0aXRpb25fYWN0aXZpdHktYWN0aXZpdHkiIG5hbWU9ImFjdGl2aXR5IiB0eXBlPSJBY3Rpdml0eSIgc3Vic2V0dGVkUHJvcGVydHk9IkFjdGl2aXR5R3JvdXAtaW5BY3Rpdml0eSIgYXNzb2NpYXRpb249IkFfcGFydGl0aW9uX2FjdGl2aXR5Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3BhcnRpdGlvbl9hY3Rpdml0eS1hY3Rpdml0eS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iU3Vic3RpdHV0aW9uIiBuYW1lPSJTdWJzdGl0dXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN1YnN0aXR1dGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN1YnN0aXR1dGlvbiI+Ci0gICAgICAgIDxib2R5PkEgc3Vic3RpdHV0aW9uIGlzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGNsYXNzaWZpZXJzIHNpZ25pZnlpbmcgdGhhdCB0aGUgc3Vic3RpdHV0aW5nIGNsYXNzaWZpZXIgY29tcGxpZXMgd2l0aCB0aGUgY29udHJhY3Qgc3BlY2lmaWVkIGJ5IHRoZSBjb250cmFjdCBjbGFzc2lmaWVyLiBUaGlzIGltcGxpZXMgdGhhdCBpbnN0YW5jZXMgb2YgdGhlIHN1YnN0aXR1dGluZyBjbGFzc2lmaWVyIGFyZSBydW50aW1lIHN1YnN0aXR1dGFibGUgd2hlcmUgaW5zdGFuY2VzIG9mIHRoZSBjb250cmFjdCBjbGFzc2lmaWVyIGFyZSBleHBlY3RlZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlN1YnN0aXR1dGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iUmVhbGl6YXRpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN1YnN0aXR1dGlvbi1jb250cmFjdCIgbmFtZT0iY29udHJhY3QiIHR5cGU9IkNsYXNzaWZpZXIiIHN1YnNldHRlZFByb3BlcnR5PSJEZXBlbmRlbmN5LXN1cHBsaWVyIiBhc3NvY2lhdGlvbj0iQV9jb250cmFjdF9zdWJzdGl0dXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3Vic3RpdHV0aW9uLWNvbnRyYWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3Vic3RpdHV0aW9uLWNvbnRyYWN0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgY29udHJhY3Qgd2l0aCB3aGljaCB0aGUgc3Vic3RpdHV0aW5nIGNsYXNzaWZpZXIgY29tcGxpZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdWJzdGl0dXRpb24tc3Vic3RpdHV0aW5nQ2xhc3NpZmllciIgbmFtZT0ic3Vic3RpdHV0aW5nQ2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgc3Vic2V0dGVkUHJvcGVydHk9IkRlcGVuZGVuY3ktY2xpZW50IEVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX3N1YnN0aXR1dGlvbl9zdWJzdGl0dXRpbmdDbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN1YnN0aXR1dGlvbi1zdWJzdGl0dXRpbmdDbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3Vic3RpdHV0aW9uLXN1YnN0aXR1dGluZ0NsYXNzaWZpZXIiPgotICAgICAgICAgIDxib2R5Pkluc3RhbmNlcyBvZiB0aGUgc3Vic3RpdHV0aW5nIGNsYXNzaWZpZXIgYXJlIHJ1bnRpbWUgc3Vic3RpdHV0YWJsZSB3aGVyZSBpbnN0YW5jZXMgb2YgdGhlIGNvbnRyYWN0IGNsYXNzaWZpZXIgYXJlIGV4cGVjdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZSIgbmFtZT0iQmVoYXZpb3JhbEZlYXR1cmUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JhbEZlYXR1cmUiPgotICAgICAgICA8Ym9keT5BIEJlaGF2aW9yYWxGZWF0dXJlIGlzIGEgZmVhdHVyZSBvZiBhIENsYXNzaWZpZXIgdGhhdCBzcGVjaWZpZXMgYW4gYXNwZWN0IG9mIHRoZSBiZWhhdmlvciBvZiBpdHMgaW5zdGFuY2VzLiAgQSBCZWhhdmlvcmFsRmVhdHVyZSBpcyBpbXBsZW1lbnRlZCAocmVhbGl6ZWQpIGJ5IGEgQmVoYXZpb3IuIEEgQmVoYXZpb3JhbEZlYXR1cmUgc3BlY2lmaWVzIHRoYXQgYSBDbGFzc2lmaWVyIHdpbGwgcmVzcG9uZCB0byBhIGRlc2lnbmF0ZWQgcmVxdWVzdCBieSBpbnZva2luZyBpdHMgaW1wbGVtZW50aW5nIG1ldGhvZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1hYnN0cmFjdF9ub19tZXRob2QiIG5hbWU9ImFic3RyYWN0X25vX21ldGhvZCIgY29uc3RyYWluZWRFbGVtZW50PSJCZWhhdmlvcmFsRmVhdHVyZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1hYnN0cmFjdF9ub19tZXRob2QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCZWhhdmlvcmFsRmVhdHVyZS1hYnN0cmFjdF9ub19tZXRob2QiPgotICAgICAgICAgIDxib2R5PldoZW4gaXNBYnN0cmFjdCBpcyB0cnVlIHRoZXJlIGFyZSBubyBtZXRob2RzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1hYnN0cmFjdF9ub19tZXRob2QtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlzQWJzdHJhY3QgaW1wbGllcyBtZXRob2QtPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRmVhdHVyZSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9Ik5hbWVzcGFjZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtY29uY3VycmVuY3kiIG5hbWU9ImNvbmN1cnJlbmN5IiB0eXBlPSJDYWxsQ29uY3VycmVuY3lLaW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWNvbmN1cnJlbmN5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JhbEZlYXR1cmUtY29uY3VycmVuY3kiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB0aGUgc2VtYW50aWNzIG9mIGNvbmN1cnJlbnQgY2FsbHMgdG8gdGhlIHNhbWUgcGFzc2l2ZSBpbnN0YW5jZSAoaS5lLiwgYW4gaW5zdGFuY2Ugb3JpZ2luYXRpbmcgZnJvbSBhIENsYXNzIHdpdGggaXNBY3RpdmUgYmVpbmcgZmFsc2UpLiBBY3RpdmUgaW5zdGFuY2VzIGNvbnRyb2wgYWNjZXNzIHRvIHRoZWlyIG93biBCZWhhdmlvcmFsRmVhdHVyZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtY29uY3VycmVuY3ktX2RlZmF1bHRWYWx1ZSIgdHlwZT0iQ2FsbENvbmN1cnJlbmN5S2luZCIgaW5zdGFuY2U9IkNhbGxDb25jdXJyZW5jeUtpbmQtc2VxdWVudGlhbCIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlzQWJzdHJhY3QiIG5hbWU9ImlzQWJzdHJhY3QiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtaXNBYnN0cmFjdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlzQWJzdHJhY3QiPgotICAgICAgICAgIDxib2R5PklmIHRydWUsIHRoZW4gdGhlIEJlaGF2aW9yYWxGZWF0dXJlIGRvZXMgbm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24sIGFuZCBvbmUgbXVzdCBiZSBzdXBwbGllZCBieSBhIG1vcmUgc3BlY2lmaWMgQ2xhc3NpZmllci4gSWYgZmFsc2UsIHRoZSBCZWhhdmlvcmFsRmVhdHVyZSBtdXN0IGhhdmUgYW4gaW1wbGVtZW50YXRpb24gaW4gdGhlIENsYXNzaWZpZXIgb3Igb25lIG11c3QgYmUgaW5oZXJpdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlzQWJzdHJhY3QtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLW1ldGhvZCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJCZWhhdmlvciIgYXNzb2NpYXRpb249IkFfbWV0aG9kX3NwZWNpZmljYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtbWV0aG9kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JhbEZlYXR1cmUtbWV0aG9kIj4KLSAgICAgICAgICA8Ym9keT5BIEJlaGF2aW9yIHRoYXQgaW1wbGVtZW50cyB0aGUgQmVoYXZpb3JhbEZlYXR1cmUuIFRoZXJlIG1heSBiZSBhdCBtb3N0IG9uZSBCZWhhdmlvciBmb3IgYSBwYXJ0aWN1bGFyIHBhaXJpbmcgb2YgYSBDbGFzc2lmaWVyIChhcyBvd25lciBvZiB0aGUgQmVoYXZpb3IpIGFuZCBhIEJlaGF2aW9yYWxGZWF0dXJlIChhcyBzcGVjaWZpY2F0aW9uIG9mIHRoZSBCZWhhdmlvcikuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1tZXRob2QtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1tZXRob2QtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtb3duZWRQYXJhbWV0ZXIiIG5hbWU9Im93bmVkUGFyYW1ldGVyIiB0eXBlPSJQYXJhbWV0ZXIiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfb3duZWRQYXJhbWV0ZXJfb3duZXJGb3JtYWxQYXJhbSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1vd25lZFBhcmFtZXRlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yYWxGZWF0dXJlLW93bmVkUGFyYW1ldGVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb3JkZXJlZCBzZXQgb2YgZm9ybWFsIFBhcmFtZXRlcnMgb2YgdGhpcyBCZWhhdmlvcmFsRmVhdHVyZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLW93bmVkUGFyYW1ldGVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtb3duZWRQYXJhbWV0ZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtb3duZWRQYXJhbWV0ZXJTZXQiIG5hbWU9Im93bmVkUGFyYW1ldGVyU2V0IiB0eXBlPSJQYXJhbWV0ZXJTZXQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX293bmVkUGFyYW1ldGVyU2V0X2JlaGF2aW9yYWxGZWF0dXJlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLW93bmVkUGFyYW1ldGVyU2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JhbEZlYXR1cmUtb3duZWRQYXJhbWV0ZXJTZXQiPgotICAgICAgICAgIDxib2R5PlRoZSBQYXJhbWV0ZXJTZXRzIG93bmVkIGJ5IHRoaXMgQmVoYXZpb3JhbEZlYXR1cmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1vd25lZFBhcmFtZXRlclNldC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLW93bmVkUGFyYW1ldGVyU2V0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLXJhaXNlZEV4Y2VwdGlvbiIgbmFtZT0icmFpc2VkRXhjZXB0aW9uIiB0eXBlPSJUeXBlIiBhc3NvY2lhdGlvbj0iQV9yYWlzZWRFeGNlcHRpb25fYmVoYXZpb3JhbEZlYXR1cmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtcmFpc2VkRXhjZXB0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JhbEZlYXR1cmUtcmFpc2VkRXhjZXB0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgVHlwZXMgcmVwcmVzZW50aW5nIGV4Y2VwdGlvbnMgdGhhdCBtYXkgYmUgcmFpc2VkIGR1cmluZyBhbiBpbnZvY2F0aW9uIG9mIHRoaXMgQmVoYXZpb3JhbEZlYXR1cmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1yYWlzZWRFeGNlcHRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1yYWlzZWRFeGNlcHRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtY3JlYXRlUmV0dXJuUmVzdWx0IiBuYW1lPSJjcmVhdGVSZXR1cm5SZXN1bHQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtY3JlYXRlUmV0dXJuUmVzdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JhbEZlYXR1cmUtY3JlYXRlUmV0dXJuUmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5DcmVhdGVzIGEgcmV0dXJuIHJlc3VsdCBwYXJhbWV0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHR5cGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtY3JlYXRlUmV0dXJuUmVzdWx0LV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJQYXJhbWV0ZXIiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWNyZWF0ZVJldHVyblJlc3VsdC1uYW1lIiBuYW1lPSJuYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1jcmVhdGVSZXR1cm5SZXN1bHQtbmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yYWxGZWF0dXJlLWNyZWF0ZVJldHVyblJlc3VsdC1uYW1lIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuYW1lIGZvciB0aGUgbmV3IHJldHVybiByZXN1bHQsIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtY3JlYXRlUmV0dXJuUmVzdWx0LW5hbWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWNyZWF0ZVJldHVyblJlc3VsdC1uYW1lLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1jcmVhdGVSZXR1cm5SZXN1bHQtdHlwZSIgbmFtZT0idHlwZSIgdHlwZT0iVHlwZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtY3JlYXRlUmV0dXJuUmVzdWx0LXR5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCZWhhdmlvcmFsRmVhdHVyZS1jcmVhdGVSZXR1cm5SZXN1bHQtdHlwZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBmb3IgdGhlIG5ldyByZXR1cm4gcmVzdWx0LCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWNyZWF0ZVJldHVyblJlc3VsdC10eXBlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1jcmVhdGVSZXR1cm5SZXN1bHQtdHlwZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20iIG5hbWU9ImlzRGlzdGluZ3Vpc2hhYmxlRnJvbSIgYm9keUNvbmRpdGlvbj0iQmVoYXZpb3JhbEZlYXR1cmUtaXNEaXN0aW5ndWlzaGFibGVGcm9tLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iTmFtZWRFbGVtZW50LWlzRGlzdGluZ3Vpc2hhYmxlRnJvbSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCZWhhdmlvcmFsRmVhdHVyZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20iPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpc0Rpc3Rpbmd1aXNoYWJsZUZyb20oKSBkZXRlcm1pbmVzIHdoZXRoZXIgdHdvIEJlaGF2aW9yYWxGZWF0dXJlcyBtYXkgY29leGlzdCBpbiB0aGUgc2FtZSBOYW1lc3BhY2UuIEl0IHNwZWNpZmllcyB0aGF0IHRoZXkgbXVzdCBoYXZlIGRpZmZlcmVudCBzaWduYXR1cmVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJCZWhhdmlvcmFsRmVhdHVyZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20iPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICgobi5vY2xJc0tpbmRPZihCZWhhdmlvcmFsRmVhdHVyZSkgYW5kIG5zLmdldE5hbWVzT2ZNZW1iZXIoc2VsZiktPmludGVyc2VjdGlvbihucy5nZXROYW1lc09mTWVtYmVyKG4pKS0+bm90RW1wdHkoKSkgaW1wbGllcwotICBTZXR7c2VsZn0tPmluY2x1ZGluZyhuLm9jbEFzVHlwZShCZWhhdmlvcmFsRmVhdHVyZSkpLT5pc1VuaXF1ZShvd25lZFBhcmFtZXRlci0+Y29sbGVjdChwfAotICBUdXBsZSB7IG5hbWU9cC5uYW1lLCB0eXBlPXAudHlwZSxlZmZlY3Q9cC5lZmZlY3QsZGlyZWN0aW9uPXAuZGlyZWN0aW9uLGlzRXhjZXB0aW9uPXAuaXNFeGNlcHRpb24sCi0gICAgICAgICAgICAgIGlzU3RyZWFtPXAuaXNTdHJlYW0saXNPcmRlcmVkPXAuaXNPcmRlcmVkLGlzVW5pcXVlPXAuaXNVbmlxdWUsbG93ZXI9cC5sb3dlciwgdXBwZXI9cC51cHBlciB9KSkKLSAgKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlzRGlzdGluZ3Vpc2hhYmxlRnJvbS1uIiBuYW1lPSJuIiB0eXBlPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtaXNEaXN0aW5ndWlzaGFibGVGcm9tLW5zIiBuYW1lPSJucyIgdHlwZT0iTmFtZXNwYWNlIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtaW5wdXRQYXJhbWV0ZXJzIiBuYW1lPSJpbnB1dFBhcmFtZXRlcnMiIGJvZHlDb25kaXRpb249IkJlaGF2aW9yYWxGZWF0dXJlLWlucHV0UGFyYW1ldGVycy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlucHV0UGFyYW1ldGVycy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlucHV0UGFyYW1ldGVycyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG93bmVkUGFyYW1ldGVycyB3aXRoIGRpcmVjdGlvbiBpbiBhbmQgaW5vdXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlucHV0UGFyYW1ldGVycy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlucHV0UGFyYW1ldGVycyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlucHV0UGFyYW1ldGVycy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKG93bmVkUGFyYW1ldGVyLT5zZWxlY3QoZGlyZWN0aW9uPVBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Ol8naW4nIG9yIGRpcmVjdGlvbj1QYXJhbWV0ZXJEaXJlY3Rpb25LaW5kOjppbm91dCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlucHV0UGFyYW1ldGVycy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUGFyYW1ldGVyIiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlucHV0UGFyYW1ldGVycy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLWlucHV0UGFyYW1ldGVycy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtb3V0cHV0UGFyYW1ldGVycyIgbmFtZT0ib3V0cHV0UGFyYW1ldGVycyIgYm9keUNvbmRpdGlvbj0iQmVoYXZpb3JhbEZlYXR1cmUtb3V0cHV0UGFyYW1ldGVycy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLW91dHB1dFBhcmFtZXRlcnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCZWhhdmlvcmFsRmVhdHVyZS1vdXRwdXRQYXJhbWV0ZXJzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb3duZWRQYXJhbWV0ZXJzIHdpdGggZGlyZWN0aW9uIG91dCwgaW5vdXQsIG9yIHJldHVybi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtb3V0cHV0UGFyYW1ldGVycy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkJlaGF2aW9yYWxGZWF0dXJlLW91dHB1dFBhcmFtZXRlcnMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1vdXRwdXRQYXJhbWV0ZXJzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAob3duZWRQYXJhbWV0ZXItPnNlbGVjdChkaXJlY3Rpb249UGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6b3V0IG9yIGRpcmVjdGlvbj1QYXJhbWV0ZXJEaXJlY3Rpb25LaW5kOjppbm91dCBvciBkaXJlY3Rpb249UGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6cmV0dXJuKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmUtb3V0cHV0UGFyYW1ldGVycy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUGFyYW1ldGVyIiBpc09yZGVyZWQ9InRydWUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlLW91dHB1dFBhcmFtZXRlcnMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJCZWhhdmlvcmFsRmVhdHVyZS1vdXRwdXRQYXJhbWV0ZXJzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNsYXNzaWZpZXIiIG5hbWU9IkNsYXNzaWZpZXIiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyIj4KLSAgICAgICAgPGJvZHk+QSBDbGFzc2lmaWVyIHJlcHJlc2VudHMgYSBjbGFzc2lmaWNhdGlvbiBvZiBpbnN0YW5jZXMgYWNjb3JkaW5nIHRvIHRoZWlyIEZlYXR1cmVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsYXNzaWZpZXItc3BlY2lhbGl6ZV90eXBlIiBuYW1lPSJzcGVjaWFsaXplX3R5cGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2xhc3NpZmllciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLXNwZWNpYWxpemVfdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItc3BlY2lhbGl6ZV90eXBlIj4KLSAgICAgICAgICA8Ym9keT5BIENsYXNzaWZpZXIgbWF5IG9ubHkgc3BlY2lhbGl6ZSBDbGFzc2lmaWVycyBvZiBhIHZhbGlkIHR5cGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzaWZpZXItc3BlY2lhbGl6ZV90eXBlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5wYXJlbnRzKCktPmZvckFsbChjIHwgc2VsZi5tYXlTcGVjaWFsaXplVHlwZShjKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsYXNzaWZpZXItbWFwc190b19nZW5lcmFsaXphdGlvbl9zZXQiIG5hbWU9Im1hcHNfdG9fZ2VuZXJhbGl6YXRpb25fc2V0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1tYXBzX3RvX2dlbmVyYWxpemF0aW9uX3NldC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItbWFwc190b19nZW5lcmFsaXphdGlvbl9zZXQiPgotICAgICAgICAgIDxib2R5PlRoZSBDbGFzc2lmaWVyIHRoYXQgbWFwcyB0byBhIEdlbmVyYWxpemF0aW9uU2V0IG1heSBuZWl0aGVyIGJlIGEgc3BlY2lmaWMgbm9yIGEgZ2VuZXJhbCBDbGFzc2lmaWVyIGluIGFueSBvZiB0aGUgR2VuZXJhbGl6YXRpb24gcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGF0IEdlbmVyYWxpemF0aW9uU2V0LiBJbiBvdGhlciB3b3JkcywgYSBwb3dlciB0eXBlIG1heSBub3QgYmUgYW4gaW5zdGFuY2Ugb2YgaXRzZWxmIG5vciBtYXkgaXRzIGluc3RhbmNlcyBhbHNvIGJlIGl0cyBzdWJjbGFzc2VzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLW1hcHNfdG9fZ2VuZXJhbGl6YXRpb25fc2V0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5wb3dlcnR5cGVFeHRlbnQtPmZvckFsbCggZ3MgfCAmI3hEOwotICBncy5nZW5lcmFsaXphdGlvbi0+Zm9yQWxsKCBnZW4gfCAmI3hEOwotICAgIG5vdCAoZ2VuLmdlbmVyYWwgPSBzZWxmKSBhbmQgbm90IGdlbi5nZW5lcmFsLmFsbFBhcmVudHMoKS0+aW5jbHVkZXMoc2VsZikgYW5kIG5vdCAoZ2VuLnNwZWNpZmljID0gc2VsZikgYW5kIG5vdCBzZWxmLmFsbFBhcmVudHMoKS0+aW5jbHVkZXMoZ2VuLnNwZWNpZmljKSAmI3hEOwotICApKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllci1ub25fZmluYWxfcGFyZW50cyIgbmFtZT0ibm9uX2ZpbmFsX3BhcmVudHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2xhc3NpZmllciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLW5vbl9maW5hbF9wYXJlbnRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1ub25fZmluYWxfcGFyZW50cyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHBhcmVudHMgb2YgYSBDbGFzc2lmaWVyIG11c3QgYmUgbm9uLWZpbmFsLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLW5vbl9maW5hbF9wYXJlbnRzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5wYXJlbnRzKCktPmZvckFsbChub3QgaXNGaW5hbFNwZWNpYWxpemF0aW9uKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllci1ub19jeWNsZXNfaW5fZ2VuZXJhbGl6YXRpb24iIG5hbWU9Im5vX2N5Y2xlc19pbl9nZW5lcmFsaXphdGlvbiIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItbm9fY3ljbGVzX2luX2dlbmVyYWxpemF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1ub19jeWNsZXNfaW5fZ2VuZXJhbGl6YXRpb24iPgotICAgICAgICAgIDxib2R5PkdlbmVyYWxpemF0aW9uIGhpZXJhcmNoaWVzIG11c3QgYmUgZGlyZWN0ZWQgYW5kIGFjeWNsaWNhbC4gQSBDbGFzc2lmaWVyIGNhbiBub3QgYmUgYm90aCBhIHRyYW5zaXRpdmVseSBnZW5lcmFsIGFuZCB0cmFuc2l0aXZlbHkgc3BlY2lmaWMgQ2xhc3NpZmllciBvZiB0aGUgc2FtZSBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLW5vX2N5Y2xlc19pbl9nZW5lcmFsaXphdGlvbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bm90IGFsbFBhcmVudHMoKS0+aW5jbHVkZXMoc2VsZik8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQ2xhc3NpZmllci1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLV9nZW5lcmFsaXphdGlvbi4xIiBnZW5lcmFsPSJUeXBlIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLV9nZW5lcmFsaXphdGlvbi4yIiBnZW5lcmFsPSJUZW1wbGF0ZWFibGVFbGVtZW50Ii8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLV9nZW5lcmFsaXphdGlvbi4zIiBnZW5lcmFsPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXNzaWZpZXItYXR0cmlidXRlIiBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9IlByb3BlcnR5IiBpc09yZGVyZWQ9InRydWUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCBDbGFzc2lmaWVyLWZlYXR1cmUiIGFzc29jaWF0aW9uPSJBX2F0dHJpYnV0ZV9jbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItYXR0cmlidXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1hdHRyaWJ1dGUiPgotICAgICAgICAgIDxib2R5PkFsbCBvZiB0aGUgUHJvcGVydGllcyB0aGF0IGFyZSBkaXJlY3QgKGkuZS4sIG5vdCBpbmhlcml0ZWQgb3IgaW1wb3J0ZWQpIGF0dHJpYnV0ZXMgb2YgdGhlIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyLWF0dHJpYnV0ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItYXR0cmlidXRlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXNzaWZpZXItY29sbGFib3JhdGlvblVzZSIgbmFtZT0iY29sbGFib3JhdGlvblVzZSIgdHlwZT0iQ29sbGFib3JhdGlvblVzZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9jb2xsYWJvcmF0aW9uVXNlX2NsYXNzaWZpZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1jb2xsYWJvcmF0aW9uVXNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1jb2xsYWJvcmF0aW9uVXNlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQ29sbGFib3JhdGlvblVzZXMgb3duZWQgYnkgdGhlIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyLWNvbGxhYm9yYXRpb25Vc2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWNvbGxhYm9yYXRpb25Vc2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2xhc3NpZmllci1mZWF0dXJlIiBuYW1lPSJmZWF0dXJlIiB0eXBlPSJGZWF0dXJlIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGlzRGVyaXZlZFVuaW9uPSJ0cnVlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW1lbWJlciIgYXNzb2NpYXRpb249IkFfZmVhdHVyZV9mZWF0dXJpbmdDbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItZmVhdHVyZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZmVhdHVyZSI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIGVhY2ggRmVhdHVyZSBkaXJlY3RseSBkZWZpbmVkIGluIHRoZSBjbGFzc2lmaWVyLiBOb3RlIHRoYXQgdGhlcmUgbWF5IGJlIG1lbWJlcnMgb2YgdGhlIENsYXNzaWZpZXIgdGhhdCBhcmUgb2YgdGhlIHR5cGUgRmVhdHVyZSBidXQgYXJlIG5vdCBpbmNsdWRlZCwgZS5nLiwgaW5oZXJpdGVkIGZlYXR1cmVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1mZWF0dXJlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1mZWF0dXJlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXNzaWZpZXItZ2VuZXJhbCIgbmFtZT0iZ2VuZXJhbCIgdHlwZT0iQ2xhc3NpZmllciIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9nZW5lcmFsX2NsYXNzaWZpZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1nZW5lcmFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1nZW5lcmFsIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZ2VuZXJhbGl6aW5nIENsYXNzaWZpZXJzIGZvciB0aGlzIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyLWdlbmVyYWwtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWdlbmVyYWwtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2xhc3NpZmllci1nZW5lcmFsaXphdGlvbiIgbmFtZT0iZ2VuZXJhbGl6YXRpb24iIHR5cGU9IkdlbmVyYWxpemF0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9zb3VyY2VfZGlyZWN0ZWRSZWxhdGlvbnNoaXAtZGlyZWN0ZWRSZWxhdGlvbnNoaXAgRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2dlbmVyYWxpemF0aW9uX3NwZWNpZmljIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItZ2VuZXJhbGl6YXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLWdlbmVyYWxpemF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgR2VuZXJhbGl6YXRpb24gcmVsYXRpb25zaGlwcyBmb3IgdGhpcyBDbGFzc2lmaWVyLiBUaGVzZSBHZW5lcmFsaXphdGlvbnMgbmF2aWdhdGUgdG8gbW9yZSBnZW5lcmFsIENsYXNzaWZpZXJzIGluIHRoZSBnZW5lcmFsaXphdGlvbiBoaWVyYXJjaHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyLWdlbmVyYWxpemF0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1nZW5lcmFsaXphdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGFzc2lmaWVyLWluaGVyaXRlZE1lbWJlciIgbmFtZT0iaW5oZXJpdGVkTWVtYmVyIiB0eXBlPSJOYW1lZEVsZW1lbnQiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1tZW1iZXIiIGFzc29jaWF0aW9uPSJBX2luaGVyaXRlZE1lbWJlcl9pbmhlcml0aW5nQ2xhc3NpZmllciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLWluaGVyaXRlZE1lbWJlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItaW5oZXJpdGVkTWVtYmVyIj4KLSAgICAgICAgICA8Ym9keT5BbGwgZWxlbWVudHMgaW5oZXJpdGVkIGJ5IHRoaXMgQ2xhc3NpZmllciBmcm9tIGl0cyBnZW5lcmFsIENsYXNzaWZpZXJzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1pbmhlcml0ZWRNZW1iZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWluaGVyaXRlZE1lbWJlci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGFzc2lmaWVyLWlzQWJzdHJhY3QiIG5hbWU9ImlzQWJzdHJhY3QiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1pc0Fic3RyYWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1pc0Fic3RyYWN0Ij4KLSAgICAgICAgICA8Ym9keT5JZiB0cnVlLCB0aGUgQ2xhc3NpZmllciBjYW4gb25seSBiZSBpbnN0YW50aWF0ZWQgYnkgaW5zdGFudGlhdGluZyBvbmUgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gQW4gYWJzdHJhY3QgQ2xhc3NpZmllciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IG90aGVyIENsYXNzaWZpZXJzIGUuZy4sIGFzIHRoZSB0YXJnZXQgb2YgQXNzb2NpYXRpb25zIG9yIEdlbmVyYWxpemF0aW9ucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJDbGFzc2lmaWVyLWlzQWJzdHJhY3QtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXNzaWZpZXItaXNGaW5hbFNwZWNpYWxpemF0aW9uIiBuYW1lPSJpc0ZpbmFsU3BlY2lhbGl6YXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1pc0ZpbmFsU3BlY2lhbGl6YXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLWlzRmluYWxTcGVjaWFsaXphdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+SWYgdHJ1ZSwgdGhlIENsYXNzaWZpZXIgY2Fubm90IGJlIHNwZWNpYWxpemVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IkNsYXNzaWZpZXItaXNGaW5hbFNwZWNpYWxpemF0aW9uLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGFzc2lmaWVyLW93bmVkVGVtcGxhdGVTaWduYXR1cmUiIG5hbWU9Im93bmVkVGVtcGxhdGVTaWduYXR1cmUiIHR5cGU9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHJlZGVmaW5lZFByb3BlcnR5PSJUZW1wbGF0ZWFibGVFbGVtZW50LW93bmVkVGVtcGxhdGVTaWduYXR1cmUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCIgYXNzb2NpYXRpb249IkFfb3duZWRUZW1wbGF0ZVNpZ25hdHVyZV9jbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItb3duZWRUZW1wbGF0ZVNpZ25hdHVyZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG9wdGlvbmFsIFJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUgc3BlY2lmeWluZyB0aGUgZm9ybWFsIHRlbXBsYXRlIHBhcmFtZXRlcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyLW93bmVkVGVtcGxhdGVTaWduYXR1cmUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGFzc2lmaWVyLW93bmVkVXNlQ2FzZSIgbmFtZT0ib3duZWRVc2VDYXNlIiB0eXBlPSJVc2VDYXNlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZFVzZUNhc2VfY2xhc3NpZmllciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLW93bmVkVXNlQ2FzZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItb3duZWRVc2VDYXNlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgVXNlQ2FzZXMgb3duZWQgYnkgdGhpcyBjbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1vd25lZFVzZUNhc2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLW93bmVkVXNlQ2FzZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGFzc2lmaWVyLXBvd2VydHlwZUV4dGVudCIgbmFtZT0icG93ZXJ0eXBlRXh0ZW50IiB0eXBlPSJHZW5lcmFsaXphdGlvblNldCIgYXNzb2NpYXRpb249IkFfcG93ZXJ0eXBlRXh0ZW50X3Bvd2VydHlwZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLXBvd2VydHlwZUV4dGVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItcG93ZXJ0eXBlRXh0ZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgR2VuZXJhbGl6YXRpb25TZXQgb2Ygd2hpY2ggdGhpcyBDbGFzc2lmaWVyIGlzIGEgcG93ZXIgdHlwZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItcG93ZXJ0eXBlRXh0ZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1wb3dlcnR5cGVFeHRlbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2xhc3NpZmllci1yZWRlZmluZWRDbGFzc2lmaWVyIiBuYW1lPSJyZWRlZmluZWRDbGFzc2lmaWVyIiB0eXBlPSJDbGFzc2lmaWVyIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5lZENsYXNzaWZpZXJfY2xhc3NpZmllciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLXJlZGVmaW5lZENsYXNzaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLXJlZGVmaW5lZENsYXNzaWZpZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBDbGFzc2lmaWVycyByZWRlZmluZWQgYnkgdGhpcyBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1yZWRlZmluZWRDbGFzc2lmaWVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1yZWRlZmluZWRDbGFzc2lmaWVyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXNzaWZpZXItcmVwcmVzZW50YXRpb24iIG5hbWU9InJlcHJlc2VudGF0aW9uIiB0eXBlPSJDb2xsYWJvcmF0aW9uVXNlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQ2xhc3NpZmllci1jb2xsYWJvcmF0aW9uVXNlIiBhc3NvY2lhdGlvbj0iQV9yZXByZXNlbnRhdGlvbl9jbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItcmVwcmVzZW50YXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLXJlcHJlc2VudGF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5BIENvbGxhYm9yYXRpb25Vc2Ugd2hpY2ggaW5kaWNhdGVzIHRoZSBDb2xsYWJvcmF0aW9uIHRoYXQgcmVwcmVzZW50cyB0aGlzIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyLXJlcHJlc2VudGF0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2xhc3NpZmllci1zdWJzdGl0dXRpb24iIG5hbWU9InN1YnN0aXR1dGlvbiIgdHlwZT0iU3Vic3RpdHV0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQgTmFtZWRFbGVtZW50LWNsaWVudERlcGVuZGVuY3kiIGFzc29jaWF0aW9uPSJBX3N1YnN0aXR1dGlvbl9zdWJzdGl0dXRpbmdDbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItc3Vic3RpdHV0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1zdWJzdGl0dXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBTdWJzdGl0dXRpb25zIG93bmVkIGJ5IHRoaXMgQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItc3Vic3RpdHV0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1zdWJzdGl0dXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2xhc3NpZmllci10ZW1wbGF0ZVBhcmFtZXRlciIgbmFtZT0idGVtcGxhdGVQYXJhbWV0ZXIiIHR5cGU9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlciIgcmVkZWZpbmVkUHJvcGVydHk9IlBhcmFtZXRlcmFibGVFbGVtZW50LXRlbXBsYXRlUGFyYW1ldGVyIiBhc3NvY2lhdGlvbj0iQV9jbGFzc2lmaWVyX3RlbXBsYXRlUGFyYW1ldGVyX3BhcmFtZXRlcmVkRWxlbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLXRlbXBsYXRlUGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci10ZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIHRoYXQgZXhwb3NlcyB0aGlzIGVsZW1lbnQgYXMgYSBmb3JtYWwgcGFyYW1ldGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci10ZW1wbGF0ZVBhcmFtZXRlci1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXNzaWZpZXItdXNlQ2FzZSIgbmFtZT0idXNlQ2FzZSIgdHlwZT0iVXNlQ2FzZSIgYXNzb2NpYXRpb249IkFfc3ViamVjdF91c2VDYXNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItdXNlQ2FzZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItdXNlQ2FzZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNldCBvZiBVc2VDYXNlcyBmb3Igd2hpY2ggdGhpcyBDbGFzc2lmaWVyIGlzIHRoZSBzdWJqZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci11c2VDYXNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci11c2VDYXNlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0QWxsQXR0cmlidXRlcyIgbmFtZT0iZ2V0QWxsQXR0cmlidXRlcyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLWdldEFsbEF0dHJpYnV0ZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLWdldEFsbEF0dHJpYnV0ZXMiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyBjbGFzc2lmaWVyLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2xhc3NpZmllci1nZXRBbGxBdHRyaWJ1dGVzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJQcm9wZXJ0eSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1nZXRBbGxBdHRyaWJ1dGVzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWdldEFsbEF0dHJpYnV0ZXMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ2xhc3NpZmllci1nZXRBbGxPcGVyYXRpb25zIiBuYW1lPSJnZXRBbGxPcGVyYXRpb25zIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0QWxsT3BlcmF0aW9ucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZ2V0QWxsT3BlcmF0aW9ucyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIGFsbCB0aGUgb3BlcmF0aW9ucyBvZiB0aGlzIGNsYXNzaWZpZXIsIGluY2x1ZGluZyB0aG9zZSBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWdldEFsbE9wZXJhdGlvbnMtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9Ik9wZXJhdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1nZXRBbGxPcGVyYXRpb25zLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWdldEFsbE9wZXJhdGlvbnMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ2xhc3NpZmllci1nZXRBbGxVc2VkSW50ZXJmYWNlcyIgbmFtZT0iZ2V0QWxsVXNlZEludGVyZmFjZXMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1nZXRBbGxVc2VkSW50ZXJmYWNlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZ2V0QWxsVXNlZEludGVyZmFjZXMiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyBhbGwgdGhlIGludGVyZmFjZXMgb24gd2hpY2ggdGhpcyBjbGFzc2lmaWVyIG9yIGFueSBvZiBpdHMgcGFyZW50cyBoYXMgYSB1c2FnZSBkZXBlbmRlbmN5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0QWxsVXNlZEludGVyZmFjZXMtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkludGVyZmFjZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1nZXRBbGxVc2VkSW50ZXJmYWNlcy1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1nZXRBbGxVc2VkSW50ZXJmYWNlcy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbiIgbmFtZT0iZ2V0T3BlcmF0aW9uIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24iPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgZmlyc3Qgb3BlcmF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBwYXJhbWV0ZXIgbmFtZXMsIGFuZCBwYXJhbWV0ZXIgdHlwZXMgZnJvbSB0aGlzIGNsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24tX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9Ik9wZXJhdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24tX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbi1uYW1lIiBuYW1lPSJuYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbi1uYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24tbmFtZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIHRvIHJldHJpZXZlLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLW5hbWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLW5hbWUtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzIiBuYW1lPSJwYXJhbWV0ZXJOYW1lcyIgaXNPcmRlcmVkPSJ0cnVlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbi1wYXJhbWV0ZXJOYW1lcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBwYXJhbWV0ZXIgbmFtZXMgb2YgdGhlIG9wZXJhdGlvbiB0byByZXRyaWV2ZSwgb3IgbnVsbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbi1wYXJhbWV0ZXJOYW1lcy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24tcGFyYW1ldGVyTmFtZXMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLXBhcmFtZXRlclR5cGVzIiBuYW1lPSJwYXJhbWV0ZXJUeXBlcyIgdHlwZT0iVHlwZSIgaXNPcmRlcmVkPSJ0cnVlIiBpc1VuaXF1ZT0iZmFsc2UiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLXBhcmFtZXRlclR5cGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24tcGFyYW1ldGVyVHlwZXMiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHBhcmFtZXRlciB0eXBlcyBvZiB0aGUgb3BlcmF0aW9uIHRvIHJldHJpZXZlLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLXBhcmFtZXRlclR5cGVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbi1wYXJhbWV0ZXJUeXBlcy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbi4xIiBuYW1lPSJnZXRPcGVyYXRpb24iIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24uMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgZmlyc3Qgb3BlcmF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBwYXJhbWV0ZXIgbmFtZXMsIGFuZCBwYXJhbWV0ZXIgdHlwZXMgZnJvbSB0aGlzIGNsYXNzaWZpZXIsIGlnbm9yaW5nIGNhc2UgaWYgaW5kaWNhdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9Ik9wZXJhdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24uMS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24uMS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24uMS1uYW1lIiBuYW1lPSJuYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbi4xLW5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbi4xLW5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0byByZXRyaWV2ZSwgb3IgbnVsbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbi4xLW5hbWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEtbmFtZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24uMS1wYXJhbWV0ZXJOYW1lcyIgbmFtZT0icGFyYW1ldGVyTmFtZXMiIGlzT3JkZXJlZD0idHJ1ZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24uMS1wYXJhbWV0ZXJOYW1lcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEtcGFyYW1ldGVyTmFtZXMiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHBhcmFtZXRlciBuYW1lcyBvZiB0aGUgb3BlcmF0aW9uIHRvIHJldHJpZXZlLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEtcGFyYW1ldGVyTmFtZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEtcGFyYW1ldGVyTmFtZXMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEtcGFyYW1ldGVyVHlwZXMiIG5hbWU9InBhcmFtZXRlclR5cGVzIiB0eXBlPSJUeXBlIiBpc09yZGVyZWQ9InRydWUiIGlzVW5pcXVlPSJmYWxzZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24uMS1wYXJhbWV0ZXJUeXBlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEtcGFyYW1ldGVyVHlwZXMiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHBhcmFtZXRlciB0eXBlcyBvZiB0aGUgb3BlcmF0aW9uIHRvIHJldHJpZXZlLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEtcGFyYW1ldGVyVHlwZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEtcGFyYW1ldGVyVHlwZXMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9uLjEtaWdub3JlQ2FzZSIgbmFtZT0iaWdub3JlQ2FzZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24uMS1pZ25vcmVDYXNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb24uMS1pZ25vcmVDYXNlIj4KLSAgICAgICAgICAgIDxib2R5PldoZXRoZXIgdG8gaWdub3JlIGNhc2UgaW4gU3RyaW5nIGNvbXBhcmlzb25zLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb25zIiBuYW1lPSJnZXRPcGVyYXRpb25zIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9ucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZ2V0T3BlcmF0aW9ucyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBvcGVyYXRpb25zIG9mIHRoaXMgY2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbnMtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9Ik9wZXJhdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1nZXRPcGVyYXRpb25zLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWdldE9wZXJhdGlvbnMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ2xhc3NpZmllci1nZXRVc2VkSW50ZXJmYWNlcyIgbmFtZT0iZ2V0VXNlZEludGVyZmFjZXMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1nZXRVc2VkSW50ZXJmYWNlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZ2V0VXNlZEludGVyZmFjZXMiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgaW50ZXJmYWNlcyBvbiB3aGljaCB0aGlzIGNsYXNzaWZpZXIgaGFzIGEgdXNhZ2UgZGVwZW5kZW5jeS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWdldFVzZWRJbnRlcmZhY2VzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJJbnRlcmZhY2UiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0VXNlZEludGVyZmFjZXMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2V0VXNlZEludGVyZmFjZXMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ2xhc3NpZmllci1hbGxGZWF0dXJlcyIgbmFtZT0iYWxsRmVhdHVyZXMiIGJvZHlDb25kaXRpb249IkNsYXNzaWZpZXItYWxsRmVhdHVyZXMtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbEZlYXR1cmVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1hbGxGZWF0dXJlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGFsbEZlYXR1cmVzKCkgZ2l2ZXMgYWxsIG9mIHRoZSBGZWF0dXJlcyBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBDbGFzc2lmaWVyLiBJbiBnZW5lcmFsLCB0aHJvdWdoIG1lY2hhbmlzbXMgc3VjaCBhcyBpbmhlcml0YW5jZSwgdGhpcyB3aWxsIGJlIGEgbGFyZ2VyIHNldCB0aGFuIGZlYXR1cmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsRmVhdHVyZXMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyLWFsbEZlYXR1cmVzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2xhc3NpZmllci1hbGxGZWF0dXJlcy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKG1lbWJlci0+c2VsZWN0KG9jbElzS2luZE9mKEZlYXR1cmUpKS0+Y29sbGVjdChvY2xBc1R5cGUoRmVhdHVyZSkpLT5hc1NldCgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbEZlYXR1cmVzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJGZWF0dXJlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbEZlYXR1cmVzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1hbGxGZWF0dXJlcy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ2xhc3NpZmllci1hbGxQYXJlbnRzIiBuYW1lPSJhbGxQYXJlbnRzIiBib2R5Q29uZGl0aW9uPSJDbGFzc2lmaWVyLWFsbFBhcmVudHMtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbFBhcmVudHMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLWFsbFBhcmVudHMiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBhbGxQYXJlbnRzKCkgZ2l2ZXMgYWxsIG9mIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGFuY2VzdG9ycyBvZiBhIGdlbmVyYWxpemVkIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsUGFyZW50cy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXItYWxsUGFyZW50cyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsUGFyZW50cy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHBhcmVudHMoKS0+dW5pb24ocGFyZW50cygpLT5jb2xsZWN0KGFsbFBhcmVudHMoKSktPmFzU2V0KCkpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbFBhcmVudHMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkNsYXNzaWZpZXIiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsUGFyZW50cy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsUGFyZW50cy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ2xhc3NpZmllci1jb25mb3Jtc1RvIiBuYW1lPSJjb25mb3Jtc1RvIiBib2R5Q29uZGl0aW9uPSJDbGFzc2lmaWVyLWNvbmZvcm1zVG8tc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJUeXBlLWNvbmZvcm1zVG8iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1jb25mb3Jtc1RvLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1jb25mb3Jtc1RvIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgY29uZm9ybXNUbygpIGdpdmVzIHRydWUgZm9yIGEgQ2xhc3NpZmllciB0aGF0IGRlZmluZXMgYSB0eXBlIHRoYXQgY29uZm9ybXMgdG8gYW5vdGhlci4gVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgaW4gdGhlIHNwZWNpZmljYXRpb24gb2Ygc2lnbmF0dXJlIGNvbmZvcm1hbmNlIGZvciBvcGVyYXRpb25zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzc2lmaWVyLWNvbmZvcm1zVG8tc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyLWNvbmZvcm1zVG8iPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLWNvbmZvcm1zVG8tc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBvdGhlci5vY2xJc0tpbmRPZihDbGFzc2lmaWVyKSB0aGVuJiN4RDsKLSAgbGV0IG90aGVyQ2xhc3NpZmllciA6IENsYXNzaWZpZXIgPSBvdGhlci5vY2xBc1R5cGUoQ2xhc3NpZmllcikgaW4mI3hEOwotICAgIHNlbGYgPSBvdGhlckNsYXNzaWZpZXIgb3IgYWxsUGFyZW50cygpLT5pbmNsdWRlcyhvdGhlckNsYXNzaWZpZXIpJiN4RDsKLWVsc2UmI3hEOwotICBmYWxzZSYjeEQ7Ci1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2xhc3NpZmllci1jb25mb3Jtc1RvLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWNvbmZvcm1zVG8tb3RoZXIiIG5hbWU9Im90aGVyIiB0eXBlPSJUeXBlIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ2xhc3NpZmllci1nZW5lcmFsLjEiIG5hbWU9ImdlbmVyYWwiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iQ2xhc3NpZmllci1nZW5lcmFsLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLWdlbmVyYWwuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZ2VuZXJhbC4xIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZ2VuZXJhbCBDbGFzc2lmaWVycyBhcmUgdGhlIG9uZXMgcmVmZXJlbmNlZCBieSB0aGUgR2VuZXJhbGl6YXRpb24gcmVsYXRpb25zaGlwcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllci1nZW5lcmFsLjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyLWdlbmVyYWwuMSBDbGFzc2lmaWVyLWdlbmVyYWwiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLWdlbmVyYWwuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHBhcmVudHMoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2xhc3NpZmllci1nZW5lcmFsLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkNsYXNzaWZpZXIiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItZ2VuZXJhbC4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1nZW5lcmFsLjEtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNsYXNzaWZpZXItaGFzVmlzaWJpbGl0eU9mIiBuYW1lPSJoYXNWaXNpYmlsaXR5T2YiIGJvZHlDb25kaXRpb249IkNsYXNzaWZpZXItaGFzVmlzaWJpbGl0eU9mLXNwZWMiIGlzUXVlcnk9InRydWUiIHByZWNvbmRpdGlvbj0iQ2xhc3NpZmllci1oYXNWaXNpYmlsaXR5T2YtcHJlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItaGFzVmlzaWJpbGl0eU9mLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1oYXNWaXNpYmlsaXR5T2YiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBoYXNWaXNpYmlsaXR5T2YoKSBkZXRlcm1pbmVzIHdoZXRoZXIgYSBOYW1lZEVsZW1lbnQgaXMgdmlzaWJsZSBpbiB0aGUgY2xhc3NpZmllci4gTm9uLXByaXZhdGUgbWVtYmVycyBhcmUgdmlzaWJsZS4gSXQgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgYXJndW1lbnQgaXMgc29tZXRoaW5nIG93bmVkIGJ5IGEgcGFyZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzc2lmaWVyLWhhc1Zpc2liaWxpdHlPZi1wcmUiIG5hbWU9InByZSIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyLWhhc1Zpc2liaWxpdHlPZiI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzaWZpZXItaGFzVmlzaWJpbGl0eU9mLXByZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PmFsbFBhcmVudHMoKS0+aW5jbHVkaW5nKHNlbGYpLT5jb2xsZWN0KG1lbWJlciktPmluY2x1ZGVzKG4pPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzc2lmaWVyLWhhc1Zpc2liaWxpdHlPZi1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXItaGFzVmlzaWJpbGl0eU9mIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2xhc3NpZmllci1oYXNWaXNpYmlsaXR5T2Ytc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChuLnZpc2liaWxpdHkgJmx0Oz4gVmlzaWJpbGl0eUtpbmQ6OnByaXZhdGUpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItaGFzVmlzaWJpbGl0eU9mLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWhhc1Zpc2liaWxpdHlPZi1uIiBuYW1lPSJuIiB0eXBlPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLWluaGVyaXQiIG5hbWU9ImluaGVyaXQiIGJvZHlDb25kaXRpb249IkNsYXNzaWZpZXItaW5oZXJpdC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItaW5oZXJpdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGluaGVyaXQoKSBkZWZpbmVzIGhvdyB0byBpbmhlcml0IGEgc2V0IG9mIGVsZW1lbnRzIHBhc3NlZCBhcyBpdHMgYXJndW1lbnQuICBJdCBleGNsdWRlcyByZWRlZmluZWQgZWxlbWVudHMgZnJvbSB0aGUgcmVzdWx0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzc2lmaWVyLWluaGVyaXQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyLWluaGVyaXQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLWluaGVyaXQtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpbmhzLT5yZWplY3QoaW5oIHwmI3hEOwotICBpbmgub2NsSXNLaW5kT2YoUmVkZWZpbmFibGVFbGVtZW50KSBhbmQmI3hEOwotICBvd25lZE1lbWJlci0+c2VsZWN0KG9jbElzS2luZE9mKFJlZGVmaW5hYmxlRWxlbWVudCkpLT4mI3hEOwotICAgIHNlbGVjdChyZWRlZmluZWRFbGVtZW50LT5pbmNsdWRlcyhpbmgub2NsQXNUeXBlKFJlZGVmaW5hYmxlRWxlbWVudCkpKSYjeEQ7Ci0gICAgICAgLT5ub3RFbXB0eSgpKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2xhc3NpZmllci1pbmhlcml0LXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJOYW1lZEVsZW1lbnQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdC1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdC1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdC1pbmhzIiBuYW1lPSJpbmhzIiB0eXBlPSJOYW1lZEVsZW1lbnQiPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1pbmhlcml0LWluaHMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdC1pbmhzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdGFibGVNZW1iZXJzIiBuYW1lPSJpbmhlcml0YWJsZU1lbWJlcnMiIGJvZHlDb25kaXRpb249IkNsYXNzaWZpZXItaW5oZXJpdGFibGVNZW1iZXJzLXNwZWMiIGlzUXVlcnk9InRydWUiIHByZWNvbmRpdGlvbj0iQ2xhc3NpZmllci1pbmhlcml0YWJsZU1lbWJlcnMtcHJlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdGFibGVNZW1iZXJzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1pbmhlcml0YWJsZU1lbWJlcnMiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpbmhlcml0YWJsZU1lbWJlcnMoKSBnaXZlcyBhbGwgb2YgdGhlIG1lbWJlcnMgb2YgYSBDbGFzc2lmaWVyIHRoYXQgbWF5IGJlIGluaGVyaXRlZCBpbiBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzLCBzdWJqZWN0IHRvIHdoYXRldmVyIHZpc2liaWxpdHkgcmVzdHJpY3Rpb25zIGFwcGx5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzc2lmaWVyLWluaGVyaXRhYmxlTWVtYmVycy1wcmUiIG5hbWU9InByZSIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyLWluaGVyaXRhYmxlTWVtYmVycyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdGFibGVNZW1iZXJzLXByZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PmMuYWxsUGFyZW50cygpLT5pbmNsdWRlcyhzZWxmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllci1pbmhlcml0YWJsZU1lbWJlcnMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyLWluaGVyaXRhYmxlTWVtYmVycyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdGFibGVNZW1iZXJzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobWVtYmVyLT5zZWxlY3QobSB8IGMuaGFzVmlzaWJpbGl0eU9mKG0pKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2xhc3NpZmllci1pbmhlcml0YWJsZU1lbWJlcnMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9Ik5hbWVkRWxlbWVudCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1pbmhlcml0YWJsZU1lbWJlcnMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWluaGVyaXRhYmxlTWVtYmVycy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdGFibGVNZW1iZXJzLWMiIG5hbWU9ImMiIHR5cGU9IkNsYXNzaWZpZXIiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLWluaGVyaXRlZE1lbWJlci4xIiBuYW1lPSJpbmhlcml0ZWRNZW1iZXIiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iQ2xhc3NpZmllci1pbmhlcml0ZWRNZW1iZXIuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdGVkTWVtYmVyLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLWluaGVyaXRlZE1lbWJlci4xIj4KLSAgICAgICAgICA8Ym9keT5UaGUgaW5oZXJpdGVkTWVtYmVyIGFzc29jaWF0aW9uIGlzIGRlcml2ZWQgYnkgaW5oZXJpdGluZyB0aGUgaW5oZXJpdGFibGUgbWVtYmVycyBvZiB0aGUgcGFyZW50cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllci1pbmhlcml0ZWRNZW1iZXIuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXItaW5oZXJpdGVkTWVtYmVyLjEgQ2xhc3NpZmllci1pbmhlcml0ZWRNZW1iZXIiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLWluaGVyaXRlZE1lbWJlci4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaW5oZXJpdChwYXJlbnRzKCktPmNvbGxlY3QoaW5oZXJpdGFibGVNZW1iZXJzKHNlbGYpKS0+YXNTZXQoKSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdGVkTWVtYmVyLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9Ik5hbWVkRWxlbWVudCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1pbmhlcml0ZWRNZW1iZXIuMS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItaW5oZXJpdGVkTWVtYmVyLjEtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNsYXNzaWZpZXItaXNUZW1wbGF0ZSIgbmFtZT0iaXNUZW1wbGF0ZSIgYm9keUNvbmRpdGlvbj0iQ2xhc3NpZmllci1pc1RlbXBsYXRlLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iVGVtcGxhdGVhYmxlRWxlbWVudC1pc1RlbXBsYXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItaXNUZW1wbGF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItaXNUZW1wbGF0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzVGVtcGxhdGUoKSByZXR1cm5zIHdoZXRoZXIgdGhpcyBDbGFzc2lmaWVyIGlzIGFjdHVhbGx5IGEgdGVtcGxhdGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsYXNzaWZpZXItaXNUZW1wbGF0ZS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXItaXNUZW1wbGF0ZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzaWZpZXItaXNUZW1wbGF0ZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKG93bmVkVGVtcGxhdGVTaWduYXR1cmUgJmx0Oz4gbnVsbCBvciBnZW5lcmFsLT5leGlzdHMoZyB8IGcuaXNUZW1wbGF0ZSgpKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2xhc3NpZmllci1pc1RlbXBsYXRlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNsYXNzaWZpZXItbWF5U3BlY2lhbGl6ZVR5cGUiIG5hbWU9Im1heVNwZWNpYWxpemVUeXBlIiBib2R5Q29uZGl0aW9uPSJDbGFzc2lmaWVyLW1heVNwZWNpYWxpemVUeXBlLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1tYXlTcGVjaWFsaXplVHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItbWF5U3BlY2lhbGl6ZVR5cGUiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBtYXlTcGVjaWFsaXplVHlwZSgpIGRldGVybWluZXMgd2hldGhlciB0aGlzIGNsYXNzaWZpZXIgbWF5IGhhdmUgYSBnZW5lcmFsaXphdGlvbiByZWxhdGlvbnNoaXAgdG8gY2xhc3NpZmllcnMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLiBCeSBkZWZhdWx0IGEgY2xhc3NpZmllciBtYXkgc3BlY2lhbGl6ZSBjbGFzc2lmaWVycyBvZiB0aGUgc2FtZSBvciBhIG1vcmUgZ2VuZXJhbCB0eXBlLiBJdCBpcyBpbnRlbmRlZCB0byBiZSByZWRlZmluZWQgYnkgY2xhc3NpZmllcnMgdGhhdCBoYXZlIGRpZmZlcmVudCBzcGVjaWFsaXphdGlvbiBjb25zdHJhaW50cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllci1tYXlTcGVjaWFsaXplVHlwZS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXItbWF5U3BlY2lhbGl6ZVR5cGUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLW1heVNwZWNpYWxpemVUeXBlLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc2VsZi5vY2xJc0tpbmRPZihjLm9jbFR5cGUoKSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItbWF5U3BlY2lhbGl6ZVR5cGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItbWF5U3BlY2lhbGl6ZVR5cGUtYyIgbmFtZT0iYyIgdHlwZT0iQ2xhc3NpZmllciIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNsYXNzaWZpZXItcGFyZW50cyIgbmFtZT0icGFyZW50cyIgYm9keUNvbmRpdGlvbj0iQ2xhc3NpZmllci1wYXJlbnRzLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1wYXJlbnRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllci1wYXJlbnRzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgcGFyZW50cygpIGdpdmVzIGFsbCBvZiB0aGUgaW1tZWRpYXRlIGFuY2VzdG9ycyBvZiBhIGdlbmVyYWxpemVkIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsYXNzaWZpZXItcGFyZW50cy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXItcGFyZW50cyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzaWZpZXItcGFyZW50cy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGdlbmVyYWxpemF0aW9uLmdlbmVyYWwtPmFzU2V0KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItcGFyZW50cy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iQ2xhc3NpZmllciIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1wYXJlbnRzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1wYXJlbnRzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLWRpcmVjdGx5UmVhbGl6ZWRJbnRlcmZhY2VzIiBuYW1lPSJkaXJlY3RseVJlYWxpemVkSW50ZXJmYWNlcyIgYm9keUNvbmRpdGlvbj0iQ2xhc3NpZmllci1kaXJlY3RseVJlYWxpemVkSW50ZXJmYWNlcy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItZGlyZWN0bHlSZWFsaXplZEludGVyZmFjZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLWRpcmVjdGx5UmVhbGl6ZWRJbnRlcmZhY2VzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgSW50ZXJmYWNlcyBkaXJlY3RseSByZWFsaXplZCBieSB0aGlzIENsYXNzaWZpZXI8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllci1kaXJlY3RseVJlYWxpemVkSW50ZXJmYWNlcy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXItZGlyZWN0bHlSZWFsaXplZEludGVyZmFjZXMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLWRpcmVjdGx5UmVhbGl6ZWRJbnRlcmZhY2VzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoKGNsaWVudERlcGVuZGVuY3ktPiYjeEQ7Ci0gIHNlbGVjdChvY2xJc0tpbmRPZihSZWFsaXphdGlvbikgYW5kIHN1cHBsaWVyLT5mb3JBbGwob2NsSXNLaW5kT2YoSW50ZXJmYWNlKSkpKS0+JiN4RDsKLSAgICAgIGNvbGxlY3Qoc3VwcGxpZXIub2NsQXNUeXBlKEludGVyZmFjZSkpLT5hc1NldCgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWRpcmVjdGx5UmVhbGl6ZWRJbnRlcmZhY2VzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJJbnRlcmZhY2UiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItZGlyZWN0bHlSZWFsaXplZEludGVyZmFjZXMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWRpcmVjdGx5UmVhbGl6ZWRJbnRlcmZhY2VzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLWRpcmVjdGx5VXNlZEludGVyZmFjZXMiIG5hbWU9ImRpcmVjdGx5VXNlZEludGVyZmFjZXMiIGJvZHlDb25kaXRpb249IkNsYXNzaWZpZXItZGlyZWN0bHlVc2VkSW50ZXJmYWNlcy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItZGlyZWN0bHlVc2VkSW50ZXJmYWNlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItZGlyZWN0bHlVc2VkSW50ZXJmYWNlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyZmFjZXMgZGlyZWN0bHkgdXNlZCBieSB0aGlzIENsYXNzaWZpZXI8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllci1kaXJlY3RseVVzZWRJbnRlcmZhY2VzLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2xhc3NpZmllci1kaXJlY3RseVVzZWRJbnRlcmZhY2VzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2xhc3NpZmllci1kaXJlY3RseVVzZWRJbnRlcmZhY2VzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoKHN1cHBsaWVyRGVwZW5kZW5jeS0+JiN4RDsKLSAgc2VsZWN0KG9jbElzS2luZE9mKFVzYWdlKSBhbmQgY2xpZW50LT5mb3JBbGwob2NsSXNLaW5kT2YoSW50ZXJmYWNlKSkpKS0+JiN4RDsKLSAgICBjb2xsZWN0KGNsaWVudC5vY2xBc1R5cGUoSW50ZXJmYWNlKSktPmFzU2V0KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItZGlyZWN0bHlVc2VkSW50ZXJmYWNlcy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iSW50ZXJmYWNlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyLWRpcmVjdGx5VXNlZEludGVyZmFjZXMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWRpcmVjdGx5VXNlZEludGVyZmFjZXMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsUmVhbGl6ZWRJbnRlcmZhY2VzIiBuYW1lPSJhbGxSZWFsaXplZEludGVyZmFjZXMiIGJvZHlDb25kaXRpb249IkNsYXNzaWZpZXItYWxsUmVhbGl6ZWRJbnRlcmZhY2VzLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1hbGxSZWFsaXplZEludGVyZmFjZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLWFsbFJlYWxpemVkSW50ZXJmYWNlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyZmFjZXMgcmVhbGl6ZWQgYnkgdGhpcyBDbGFzc2lmaWVyIGFuZCBhbGwgb2YgaXRzIGdlbmVyYWxpemF0aW9uczwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbFJlYWxpemVkSW50ZXJmYWNlcy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXItYWxsUmVhbGl6ZWRJbnRlcmZhY2VzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2xhc3NpZmllci1hbGxSZWFsaXplZEludGVyZmFjZXMtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChkaXJlY3RseVJlYWxpemVkSW50ZXJmYWNlcygpLT51bmlvbihzZWxmLmFsbFBhcmVudHMoKS0+Y29sbGVjdChkaXJlY3RseVJlYWxpemVkSW50ZXJmYWNlcygpKSktPmFzU2V0KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsUmVhbGl6ZWRJbnRlcmZhY2VzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJJbnRlcmZhY2UiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsUmVhbGl6ZWRJbnRlcmZhY2VzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1hbGxSZWFsaXplZEludGVyZmFjZXMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsVXNlZEludGVyZmFjZXMiIG5hbWU9ImFsbFVzZWRJbnRlcmZhY2VzIiBib2R5Q29uZGl0aW9uPSJDbGFzc2lmaWVyLWFsbFVzZWRJbnRlcmZhY2VzLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllci1hbGxVc2VkSW50ZXJmYWNlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXItYWxsVXNlZEludGVyZmFjZXMiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnRlcmZhY2VzIHVzZWQgYnkgdGhpcyBDbGFzc2lmaWVyIGFuZCBhbGwgb2YgaXRzIGdlbmVyYWxpemF0aW9uczwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbFVzZWRJbnRlcmZhY2VzLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2xhc3NpZmllci1hbGxVc2VkSW50ZXJmYWNlcyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsVXNlZEludGVyZmFjZXMtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChkaXJlY3RseVVzZWRJbnRlcmZhY2VzKCktPnVuaW9uKHNlbGYuYWxsUGFyZW50cygpLT5jb2xsZWN0KGRpcmVjdGx5VXNlZEludGVyZmFjZXMoKSkpLT5hc1NldCgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbFVzZWRJbnRlcmZhY2VzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJJbnRlcmZhY2UiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsVXNlZEludGVyZmFjZXMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbFVzZWRJbnRlcmZhY2VzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLWlzU3Vic3RpdHV0YWJsZUZvciIgbmFtZT0iaXNTdWJzdGl0dXRhYmxlRm9yIiBib2R5Q29uZGl0aW9uPSJDbGFzc2lmaWVyLWlzU3Vic3RpdHV0YWJsZUZvci1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsYXNzaWZpZXItaXNTdWJzdGl0dXRhYmxlRm9yLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2xhc3NpZmllci1pc1N1YnN0aXR1dGFibGVGb3IiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLWlzU3Vic3RpdHV0YWJsZUZvci1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHN1YnN0aXR1dGlvbi5jb250cmFjdC0+aW5jbHVkZXMoY29udHJhY3QpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWlzU3Vic3RpdHV0YWJsZUZvci1jb250cmFjdCIgbmFtZT0iY29udHJhY3QiIHR5cGU9IkNsYXNzaWZpZXIiLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ2xhc3NpZmllci1pc1N1YnN0aXR1dGFibGVGb3ItcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ2xhc3NpZmllci1hbGxBdHRyaWJ1dGVzIiBuYW1lPSJhbGxBdHRyaWJ1dGVzIiBib2R5Q29uZGl0aW9uPSJDbGFzc2lmaWVyLWFsbEF0dHJpYnV0ZXMtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbEF0dHJpYnV0ZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLWFsbEF0dHJpYnV0ZXMiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBhbGxBdHRyaWJ1dGVzIGdpdmVzIGFuIG9yZGVyZWQgc2V0IG9mIGFsbCBvd25lZCBhbmQgaW5oZXJpdGVkIGF0dHJpYnV0ZXMgb2YgdGhlIENsYXNzaWZpZXIuIEFsbCBvd25lZCBhdHRyaWJ1dGVzIGFwcGVhciBiZWZvcmUgYW55IGluaGVyaXRlZCBhdHRyaWJ1dGVzLCBhbmQgdGhlIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGZyb20gYW55IG1vcmUgc3BlY2lmaWMgcGFyZW50IENsYXNzaWZpZXIgYXBwZWFyIGJlZm9yZSB0aG9zZSBvZiBhbnkgbW9yZSBnZW5lcmFsIHBhcmVudCBDbGFzc2lmaWVyLiBIb3dldmVyLCBpZiB0aGUgQ2xhc3NpZmllciBoYXMgbXVsdGlwbGUgaW1tZWRpYXRlIHBhcmVudHMsIHRoZW4gdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHRoZSBzZXRzIG9mIGF0dHJpYnV0ZXMgZnJvbSB0aG9zZSBwYXJlbnRzIGlzIG5vdCBkZWZpbmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbEF0dHJpYnV0ZXMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyLWFsbEF0dHJpYnV0ZXMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbEF0dHJpYnV0ZXMtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChhdHRyaWJ1dGUtPmFzU2VxdWVuY2UoKS0+dW5pb24ocGFyZW50cygpLT5hc1NlcXVlbmNlKCkuYWxsQXR0cmlidXRlcygpKS0+c2VsZWN0KHAgfCBtZW1iZXItPmluY2x1ZGVzKHApKS0+YXNPcmRlcmVkU2V0KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsQXR0cmlidXRlcy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUHJvcGVydHkiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1hbGxBdHRyaWJ1dGVzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3NpZmllci1hbGxBdHRyaWJ1dGVzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDbGFzc2lmaWVyLWFsbFNsb3R0YWJsZUZlYXR1cmVzIiBuYW1lPSJhbGxTbG90dGFibGVGZWF0dXJlcyIgYm9keUNvbmRpdGlvbj0iQ2xhc3NpZmllci1hbGxTbG90dGFibGVGZWF0dXJlcy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsU2xvdHRhYmxlRmVhdHVyZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyLWFsbFNsb3R0YWJsZUZlYXR1cmVzIj4KLSAgICAgICAgICA8Ym9keT5BbGwgU3RydWN0dXJhbEZlYXR1cmVzIHJlbGF0ZWQgdG8gdGhlIENsYXNzaWZpZXIgdGhhdCBtYXkgaGF2ZSBTbG90cywgaW5jbHVkaW5nIGRpcmVjdCBhdHRyaWJ1dGVzLCBpbmhlcml0ZWQgYXR0cmlidXRlcywgcHJpdmF0ZSBhdHRyaWJ1dGVzIGluIGdlbmVyYWxpemF0aW9ucywgYW5kIG1lbWJlckVuZHMgb2YgQXNzb2NpYXRpb25zLCBidXQgZXhjbHVkaW5nIHJlZGVmaW5lZCBTdHJ1Y3R1cmFsRmVhdHVyZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsU2xvdHRhYmxlRmVhdHVyZXMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyLWFsbFNsb3R0YWJsZUZlYXR1cmVzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2xhc3NpZmllci1hbGxTbG90dGFibGVGZWF0dXJlcy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKG1lbWJlci0+c2VsZWN0KG9jbElzS2luZE9mKFN0cnVjdHVyYWxGZWF0dXJlKSktPiYjeEQ7Ci0gIGNvbGxlY3Qob2NsQXNUeXBlKFN0cnVjdHVyYWxGZWF0dXJlKSktPiYjeEQ7Ci0gICB1bmlvbihzZWxmLmluaGVyaXQoc2VsZi5hbGxQYXJlbnRzKCktPmNvbGxlY3QocCB8IHAuYXR0cmlidXRlKS0+YXNTZXQoKSktPiYjeEQ7Ci0gICAgIGNvbGxlY3Qob2NsQXNUeXBlKFN0cnVjdHVyYWxGZWF0dXJlKSkpLT5hc1NldCgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzc2lmaWVyLWFsbFNsb3R0YWJsZUZlYXR1cmVzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJTdHJ1Y3R1cmFsRmVhdHVyZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NpZmllci1hbGxTbG90dGFibGVGZWF0dXJlcy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXItYWxsU2xvdHRhYmxlRmVhdHVyZXMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIiBuYW1lPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgIDxib2R5PkEgQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIGV4cG9zZXMgYSBDbGFzc2lmaWVyIGFzIGEgZm9ybWFsIHRlbXBsYXRlIHBhcmFtZXRlci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItaGFzX2NvbnN0cmFpbmluZ19jbGFzc2lmaWVyIiBuYW1lPSJoYXNfY29uc3RyYWluaW5nX2NsYXNzaWZpZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1oYXNfY29uc3RyYWluaW5nX2NsYXNzaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItaGFzX2NvbnN0cmFpbmluZ19jbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5JZiBhbGxvd1N1YnN0aXR1dGFibGUgaXMgdHJ1ZSwgdGhlbiB0aGVyZSBtdXN0IGJlIGEgY29uc3RyYWluaW5nQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWhhc19jb25zdHJhaW5pbmdfY2xhc3NpZmllci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+YWxsb3dTdWJzdGl0dXRhYmxlIGltcGxpZXMgY29uc3RyYWluaW5nQ2xhc3NpZmllci0+bm90RW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLXBhcmFtZXRlcmVkX2VsZW1lbnRfbm9fZmVhdHVyZXMiIG5hbWU9InBhcmFtZXRlcmVkX2VsZW1lbnRfbm9fZmVhdHVyZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1wYXJhbWV0ZXJlZF9lbGVtZW50X25vX2ZlYXR1cmVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLXBhcmFtZXRlcmVkX2VsZW1lbnRfbm9fZmVhdHVyZXMiPgotICAgICAgICAgIDxib2R5PlRoZSBwYXJhbWV0ZXJlZEVsZW1lbnQgaGFzIG5vIGRpcmVjdCBmZWF0dXJlcywgYW5kIGlmIGNvbnN0cmFpbmVkRWxlbWVudCBpcyBlbXB0eSBpdCBoYXMgbm8gZ2VuZXJhbGl6YXRpb25zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItcGFyYW1ldGVyZWRfZWxlbWVudF9ub19mZWF0dXJlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cGFyYW1ldGVyZWRFbGVtZW50LmZlYXR1cmUtPmlzRW1wdHkoKSBhbmQgKGNvbnN0cmFpbmluZ0NsYXNzaWZpZXItPmlzRW1wdHkoKSBpbXBsaWVzICBwYXJhbWV0ZXJlZEVsZW1lbnQuYWxsUGFyZW50cygpLT5pc0VtcHR5KCkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItbWF0Y2hpbmdfYWJzdHJhY3QiIG5hbWU9Im1hdGNoaW5nX2Fic3RyYWN0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItbWF0Y2hpbmdfYWJzdHJhY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItbWF0Y2hpbmdfYWJzdHJhY3QiPgotICAgICAgICAgIDxib2R5PklmIHRoZSBwYXJhbWV0ZXJlZEVsZW1lbnQgaXMgbm90IGFic3RyYWN0LCB0aGVuIHRoZSBDbGFzc2lmaWVyIHVzZWQgYXMgYW4gYXJndW1lbnQgc2hhbGwgbm90IGJlIGFic3RyYWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItbWF0Y2hpbmdfYWJzdHJhY3QtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pihub3QgcGFyYW1ldGVyZWRFbGVtZW50LmlzQWJzdHJhY3QpIGltcGxpZXMgdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24uYWN0dWFsLT5mb3JBbGwoYSB8IG5vdCBhLm9jbEFzVHlwZShDbGFzc2lmaWVyKS5pc0Fic3RyYWN0KTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWFjdHVhbF9pc19jbGFzc2lmaWVyIiBuYW1lPSJhY3R1YWxfaXNfY2xhc3NpZmllciIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWFjdHVhbF9pc19jbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWFjdHVhbF9pc19jbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgYXJndW1lbnQgdG8gYSBDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIgaXMgYSBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItYWN0dWFsX2lzX2NsYXNzaWZpZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PiB0ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi5hY3R1YWwtPmZvckFsbChhIHwgYS5vY2xJc0tpbmRPZihDbGFzc2lmaWVyKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1jb25zdHJhaW5pbmdfY2xhc3NpZmllcnNfY29uc3RyYWluX2FyZ3MiIG5hbWU9ImNvbnN0cmFpbmluZ19jbGFzc2lmaWVyc19jb25zdHJhaW5fYXJncyIgY29uc3RyYWluZWRFbGVtZW50PSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWNvbnN0cmFpbmluZ19jbGFzc2lmaWVyc19jb25zdHJhaW5fYXJncy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1jb25zdHJhaW5pbmdfY2xhc3NpZmllcnNfY29uc3RyYWluX2FyZ3MiPgotICAgICAgICAgIDxib2R5PklmIHRoZXJlIGFyZSBhbnkgY29uc3RyYWluaW5nQ2xhc3NpZmllcnMsIHRoZW4gZXZlcnkgYXJndW1lbnQgbXVzdCBiZSB0aGUgc2FtZSBhcyBvciBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZW0sIG9yIGlmIGFsbG93U3Vic3RpdHV0YWJsZSBpcyB0cnVlLCB0aGVuIGl0IGNhbiBhbHNvIGJlIHN1YnN0aXR1dGFibGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1jb25zdHJhaW5pbmdfY2xhc3NpZmllcnNfY29uc3RyYWluX2FyZ3MtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLmFjdHVhbC0+Zm9yQWxsKCBhIHwmI3hEOwotICBsZXQgYXJnIDogQ2xhc3NpZmllciA9IGEub2NsQXNUeXBlKENsYXNzaWZpZXIpIGluJiN4RDsKLSAgICBjb25zdHJhaW5pbmdDbGFzc2lmaWVyLT5mb3JBbGwoJiN4RDsKLSAgICAgIGNjIHwgICYjeEQ7Ci0gICAgICAgICBhcmcgPSBjYyBvciBhcmcuY29uZm9ybXNUbyhjYykgb3IgKGFsbG93U3Vic3RpdHV0YWJsZSBhbmQgYXJnLmlzU3Vic3RpdHV0YWJsZUZvcihjYykpJiN4RDsKLSAgICAgICkmI3hEOwotKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWNvbnN0cmFpbmluZ19jbGFzc2lmaWVyc19jb25zdHJhaW5fcGFyYW1ldGVyZWRfZWxlbWVudCIgbmFtZT0iY29uc3RyYWluaW5nX2NsYXNzaWZpZXJzX2NvbnN0cmFpbl9wYXJhbWV0ZXJlZF9lbGVtZW50IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItY29uc3RyYWluaW5nX2NsYXNzaWZpZXJzX2NvbnN0cmFpbl9wYXJhbWV0ZXJlZF9lbGVtZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWNvbnN0cmFpbmluZ19jbGFzc2lmaWVyc19jb25zdHJhaW5fcGFyYW1ldGVyZWRfZWxlbWVudCI+Ci0gICAgICAgICAgPGJvZHk+SWYgdGhlcmUgYXJlIGFueSBjb25zdHJhaW5pbmdDbGFzc2lmaWVycywgdGhlbiB0aGUgcGFyYW1ldGVyZWRFbGVtZW50IG11c3QgYmUgdGhlIHNhbWUgYXMgb3IgYSBzcGVjaWFsaXphdGlvbiBvZiB0aGVtLCBvciBpZiBhbGxvd1N1YnN0aXR1dGFibGUgaXMgdHJ1ZSwgdGhlbiBpdCBjYW4gYWxzbyBiZSBzdWJzdGl0dXRhYmxlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItY29uc3RyYWluaW5nX2NsYXNzaWZpZXJzX2NvbnN0cmFpbl9wYXJhbWV0ZXJlZF9lbGVtZW50LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5jb25zdHJhaW5pbmdDbGFzc2lmaWVyLT5mb3JBbGwoJiN4RDsKLSAgICAgY2MgfCAgcGFyYW1ldGVyZWRFbGVtZW50ID0gY2Mgb3IgcGFyYW1ldGVyZWRFbGVtZW50LmNvbmZvcm1zVG8oY2MpIG9yIChhbGxvd1N1YnN0aXR1dGFibGUgYW5kIHBhcmFtZXRlcmVkRWxlbWVudC5pc1N1YnN0aXR1dGFibGVGb3IoY2MpKSYjeEQ7Ci0pPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iVGVtcGxhdGVQYXJhbWV0ZXIiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1hbGxvd1N1YnN0aXR1dGFibGUiIG5hbWU9ImFsbG93U3Vic3RpdHV0YWJsZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItYWxsb3dTdWJzdGl0dXRhYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWFsbG93U3Vic3RpdHV0YWJsZSI+Ci0gICAgICAgICAgPGJvZHk+Q29uc3RyYWlucyB0aGUgcmVxdWlyZWQgcmVsYXRpb25zaGlwIGJldHdlZW4gYW4gYWN0dWFsIHBhcmFtZXRlciBhbmQgdGhlIHBhcmFtZXRlcmVkRWxlbWVudCBmb3IgdGhpcyBmb3JtYWwgcGFyYW1ldGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1hbGxvd1N1YnN0aXR1dGFibGUtX2RlZmF1bHRWYWx1ZSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItY29uc3RyYWluaW5nQ2xhc3NpZmllciIgbmFtZT0iY29uc3RyYWluaW5nQ2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfY29uc3RyYWluaW5nQ2xhc3NpZmllcl9jbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWNvbnN0cmFpbmluZ0NsYXNzaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItY29uc3RyYWluaW5nQ2xhc3NpZmllciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGNsYXNzaWZpZXJzIHRoYXQgY29uc3RyYWluIHRoZSBhcmd1bWVudCB0aGF0IGNhbiBiZSB1c2VkIGZvciB0aGUgcGFyYW1ldGVyLiBJZiB0aGUgYWxsb3dTdWJzdGl0dXRhYmxlIGF0dHJpYnV0ZSBpcyB0cnVlLCB0aGVuIGFueSBDbGFzc2lmaWVyIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgY29uc3RyYWluaW5nIENsYXNzaWZpZXIgY2FuIGJlIHN1YnN0aXR1dGVkOyBvdGhlcndpc2UsIGl0IG11c3QgYmUgZWl0aGVyIHRoaXMgQ2xhc3NpZmllciBvciBvbmUgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBlbXB0eSwgdGhlcmUgYXJlIG5vIGNvbnN0cmFpbnRzIG9uIHRoZSBDbGFzc2lmaWVyIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gYXJndW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItY29uc3RyYWluaW5nQ2xhc3NpZmllci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1jb25zdHJhaW5pbmdDbGFzc2lmaWVyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1wYXJhbWV0ZXJlZEVsZW1lbnQiIG5hbWU9InBhcmFtZXRlcmVkRWxlbWVudCIgdHlwZT0iQ2xhc3NpZmllciIgcmVkZWZpbmVkUHJvcGVydHk9IlRlbXBsYXRlUGFyYW1ldGVyLXBhcmFtZXRlcmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfY2xhc3NpZmllcl90ZW1wbGF0ZVBhcmFtZXRlcl9wYXJhbWV0ZXJlZEVsZW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLXBhcmFtZXRlcmVkRWxlbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1wYXJhbWV0ZXJlZEVsZW1lbnQiPgotICAgICAgICAgIDxib2R5PlRoZSBDbGFzc2lmaWVyIGV4cG9zZWQgYnkgdGhpcyBDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkZlYXR1cmUiIG5hbWU9IkZlYXR1cmUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkZlYXR1cmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJGZWF0dXJlIj4KLSAgICAgICAgPGJvZHk+QSBGZWF0dXJlIGRlY2xhcmVzIGEgYmVoYXZpb3JhbCBvciBzdHJ1Y3R1cmFsIGNoYXJhY3RlcmlzdGljIG9mIENsYXNzaWZpZXJzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRmVhdHVyZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iUmVkZWZpbmFibGVFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJGZWF0dXJlLWZlYXR1cmluZ0NsYXNzaWZpZXIiIG5hbWU9ImZlYXR1cmluZ0NsYXNzaWZpZXIiIHR5cGU9IkNsYXNzaWZpZXIiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIHN1YnNldHRlZFByb3BlcnR5PSJBX21lbWJlcl9tZW1iZXJOYW1lc3BhY2UtbWVtYmVyTmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9mZWF0dXJlX2ZlYXR1cmluZ0NsYXNzaWZpZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRmVhdHVyZS1mZWF0dXJpbmdDbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRmVhdHVyZS1mZWF0dXJpbmdDbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQ2xhc3NpZmllcnMgdGhhdCBoYXZlIHRoaXMgRmVhdHVyZSBhcyBhIGZlYXR1cmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJGZWF0dXJlLWZlYXR1cmluZ0NsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJGZWF0dXJlLWZlYXR1cmluZ0NsYXNzaWZpZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRmVhdHVyZS1pc1N0YXRpYyIgbmFtZT0iaXNTdGF0aWMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRmVhdHVyZS1pc1N0YXRpYy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkZlYXR1cmUtaXNTdGF0aWMiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB3aGV0aGVyIHRoaXMgRmVhdHVyZSBjaGFyYWN0ZXJpemVzIGluZGl2aWR1YWwgaW5zdGFuY2VzIGNsYXNzaWZpZWQgYnkgdGhlIENsYXNzaWZpZXIgKGZhbHNlKSBvciB0aGUgQ2xhc3NpZmllciBpdHNlbGYgKHRydWUpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IkZlYXR1cmUtaXNTdGF0aWMtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iR2VuZXJhbGl6YXRpb24iIG5hbWU9IkdlbmVyYWxpemF0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJHZW5lcmFsaXphdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkdlbmVyYWxpemF0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBHZW5lcmFsaXphdGlvbiBpcyBhIHRheG9ub21pYyByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIG1vcmUgZ2VuZXJhbCBDbGFzc2lmaWVyIGFuZCBhIG1vcmUgc3BlY2lmaWMgQ2xhc3NpZmllci4gRWFjaCBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWMgQ2xhc3NpZmllciBpcyBhbHNvIGFuIGluc3RhbmNlIG9mIHRoZSBnZW5lcmFsIENsYXNzaWZpZXIuIFRoZSBzcGVjaWZpYyBDbGFzc2lmaWVyIGluaGVyaXRzIHRoZSBmZWF0dXJlcyBvZiB0aGUgbW9yZSBnZW5lcmFsIENsYXNzaWZpZXIuIEEgR2VuZXJhbGl6YXRpb24gaXMgb3duZWQgYnkgdGhlIHNwZWNpZmljIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJHZW5lcmFsaXphdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uLWdlbmVyYWwiIG5hbWU9ImdlbmVyYWwiIHR5cGU9IkNsYXNzaWZpZXIiIHN1YnNldHRlZFByb3BlcnR5PSJEaXJlY3RlZFJlbGF0aW9uc2hpcC10YXJnZXQiIGFzc29jaWF0aW9uPSJBX2dlbmVyYWxfZ2VuZXJhbGl6YXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2VuZXJhbGl6YXRpb24tZ2VuZXJhbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkdlbmVyYWxpemF0aW9uLWdlbmVyYWwiPgotICAgICAgICAgIDxib2R5PlRoZSBnZW5lcmFsIGNsYXNzaWZpZXIgaW4gdGhlIEdlbmVyYWxpemF0aW9uIHJlbGF0aW9uc2hpcC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uLWdlbmVyYWxpemF0aW9uU2V0IiBuYW1lPSJnZW5lcmFsaXphdGlvblNldCIgdHlwZT0iR2VuZXJhbGl6YXRpb25TZXQiIGFzc29jaWF0aW9uPSJBX2dlbmVyYWxpemF0aW9uU2V0X2dlbmVyYWxpemF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uLWdlbmVyYWxpemF0aW9uU2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2VuZXJhbGl6YXRpb24tZ2VuZXJhbGl6YXRpb25TZXQiPgotICAgICAgICAgIDxib2R5PlJlcHJlc2VudHMgYSBzZXQgb2YgaW5zdGFuY2VzIG9mIEdlbmVyYWxpemF0aW9uLiAgQSBHZW5lcmFsaXphdGlvbiBtYXkgYXBwZWFyIGluIG1hbnkgR2VuZXJhbGl6YXRpb25TZXRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iR2VuZXJhbGl6YXRpb24tZ2VuZXJhbGl6YXRpb25TZXQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJHZW5lcmFsaXphdGlvbi1nZW5lcmFsaXphdGlvblNldC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJHZW5lcmFsaXphdGlvbi1pc1N1YnN0aXR1dGFibGUiIG5hbWU9ImlzU3Vic3RpdHV0YWJsZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJHZW5lcmFsaXphdGlvbi1pc1N1YnN0aXR1dGFibGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJHZW5lcmFsaXphdGlvbi1pc1N1YnN0aXR1dGFibGUiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpYyBDbGFzc2lmaWVyIGNhbiBiZSB1c2VkIHdoZXJldmVyIHRoZSBnZW5lcmFsIENsYXNzaWZpZXIgY2FuIGJlIHVzZWQuIElmIHRydWUsIHRoZSBleGVjdXRpb24gdHJhY2VzIG9mIHRoZSBzcGVjaWZpYyBDbGFzc2lmaWVyIHNoYWxsIGJlIGEgc3VwZXJzZXQgb2YgdGhlIGV4ZWN1dGlvbiB0cmFjZXMgb2YgdGhlIGdlbmVyYWwgQ2xhc3NpZmllci4gSWYgZmFsc2UsIHRoZXJlIGlzIG5vIHN1Y2ggY29uc3RyYWludCBvbiBleGVjdXRpb24gdHJhY2VzLiBJZiB1bnNldCwgdGhlIG1vZGVsZXIgaGFzIG5vdCBzdGF0ZWQgd2hldGhlciB0aGVyZSBpcyBzdWNoIGEgY29uc3RyYWludCBvciBub3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uLWlzU3Vic3RpdHV0YWJsZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iR2VuZXJhbGl6YXRpb24taXNTdWJzdGl0dXRhYmxlLV9kZWZhdWx0VmFsdWUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iR2VuZXJhbGl6YXRpb24tc3BlY2lmaWMiIG5hbWU9InNwZWNpZmljIiB0eXBlPSJDbGFzc2lmaWVyIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAtc291cmNlIEVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2dlbmVyYWxpemF0aW9uX3NwZWNpZmljIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uLXNwZWNpZmljLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2VuZXJhbGl6YXRpb24tc3BlY2lmaWMiPgotICAgICAgICAgIDxib2R5PlRoZSBzcGVjaWFsaXppbmcgQ2xhc3NpZmllciBpbiB0aGUgR2VuZXJhbGl6YXRpb24gcmVsYXRpb25zaGlwLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJHZW5lcmFsaXphdGlvblNldCIgbmFtZT0iR2VuZXJhbGl6YXRpb25TZXQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uU2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2VuZXJhbGl6YXRpb25TZXQiPgotICAgICAgICA8Ym9keT5BIEdlbmVyYWxpemF0aW9uU2V0IGlzIGEgUGFja2FnZWFibGVFbGVtZW50IHdob3NlIGluc3RhbmNlcyByZXByZXNlbnQgc2V0cyBvZiBHZW5lcmFsaXphdGlvbiByZWxhdGlvbnNoaXBzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uU2V0LWdlbmVyYWxpemF0aW9uX3NhbWVfY2xhc3NpZmllciIgbmFtZT0iZ2VuZXJhbGl6YXRpb25fc2FtZV9jbGFzc2lmaWVyIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkdlbmVyYWxpemF0aW9uU2V0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uU2V0LWdlbmVyYWxpemF0aW9uX3NhbWVfY2xhc3NpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkdlbmVyYWxpemF0aW9uU2V0LWdlbmVyYWxpemF0aW9uX3NhbWVfY2xhc3NpZmllciI+Ci0gICAgICAgICAgPGJvZHk+RXZlcnkgR2VuZXJhbGl6YXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBHZW5lcmFsaXphdGlvblNldCBtdXN0IGhhdmUgdGhlIHNhbWUgZ2VuZXJhbCBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJHZW5lcmFsaXphdGlvblNldC1nZW5lcmFsaXphdGlvbl9zYW1lX2NsYXNzaWZpZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmdlbmVyYWxpemF0aW9uLT5jb2xsZWN0KGdlbmVyYWwpLT5hc1NldCgpLT5zaXplKCkgJmx0Oz0gMTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iR2VuZXJhbGl6YXRpb25TZXQtbWFwc190b19nZW5lcmFsaXphdGlvbl9zZXQiIG5hbWU9Im1hcHNfdG9fZ2VuZXJhbGl6YXRpb25fc2V0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkdlbmVyYWxpemF0aW9uU2V0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uU2V0LW1hcHNfdG9fZ2VuZXJhbGl6YXRpb25fc2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2VuZXJhbGl6YXRpb25TZXQtbWFwc190b19nZW5lcmFsaXphdGlvbl9zZXQiPgotICAgICAgICAgIDxib2R5PlRoZSBDbGFzc2lmaWVyIHRoYXQgbWFwcyB0byBhIEdlbmVyYWxpemF0aW9uU2V0IG1heSBuZWl0aGVyIGJlIGEgc3BlY2lmaWMgbm9yIGEgZ2VuZXJhbCBDbGFzc2lmaWVyIGluIGFueSBvZiB0aGUgR2VuZXJhbGl6YXRpb24gcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGF0IEdlbmVyYWxpemF0aW9uU2V0LiBJbiBvdGhlciB3b3JkcywgYSBwb3dlciB0eXBlIG1heSBub3QgYmUgYW4gaW5zdGFuY2Ugb2YgaXRzZWxmIG5vciBtYXkgaXRzIGluc3RhbmNlcyBiZSBpdHMgc3ViY2xhc3Nlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iR2VuZXJhbGl6YXRpb25TZXQtbWFwc190b19nZW5lcmFsaXphdGlvbl9zZXQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnBvd2VydHlwZSAmbHQ7PiBudWxsIGltcGxpZXMgZ2VuZXJhbGl6YXRpb24tPmZvckFsbCggZ2VuIHwgJiN4RDsKLSAgICBub3QgKGdlbi5nZW5lcmFsID0gcG93ZXJ0eXBlKSBhbmQgbm90IGdlbi5nZW5lcmFsLmFsbFBhcmVudHMoKS0+aW5jbHVkZXMocG93ZXJ0eXBlKSBhbmQgbm90IChnZW4uc3BlY2lmaWMgPSBwb3dlcnR5cGUpIGFuZCBub3QgcG93ZXJ0eXBlLmFsbFBhcmVudHMoKS0+aW5jbHVkZXMoZ2VuLnNwZWNpZmljKSYjeEQ7Ci0gICk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iR2VuZXJhbGl6YXRpb25TZXQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlBhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iR2VuZXJhbGl6YXRpb25TZXQtZ2VuZXJhbGl6YXRpb24iIG5hbWU9ImdlbmVyYWxpemF0aW9uIiB0eXBlPSJHZW5lcmFsaXphdGlvbiIgYXNzb2NpYXRpb249IkFfZ2VuZXJhbGl6YXRpb25TZXRfZ2VuZXJhbGl6YXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2VuZXJhbGl6YXRpb25TZXQtZ2VuZXJhbGl6YXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJHZW5lcmFsaXphdGlvblNldC1nZW5lcmFsaXphdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+RGVzaWduYXRlcyB0aGUgaW5zdGFuY2VzIG9mIEdlbmVyYWxpemF0aW9uIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhpcyBHZW5lcmFsaXphdGlvblNldC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uU2V0LWdlbmVyYWxpemF0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iR2VuZXJhbGl6YXRpb25TZXQtZ2VuZXJhbGl6YXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iR2VuZXJhbGl6YXRpb25TZXQtaXNDb3ZlcmluZyIgbmFtZT0iaXNDb3ZlcmluZyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJHZW5lcmFsaXphdGlvblNldC1pc0NvdmVyaW5nLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2VuZXJhbGl6YXRpb25TZXQtaXNDb3ZlcmluZyI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzICh2aWEgdGhlIGFzc29jaWF0ZWQgR2VuZXJhbGl6YXRpb25zKSB3aGV0aGVyIG9yIG5vdCB0aGUgc2V0IG9mIHNwZWNpZmljIENsYXNzaWZpZXJzIGFyZSBjb3ZlcmluZyBmb3IgYSBwYXJ0aWN1bGFyIGdlbmVyYWwgY2xhc3NpZmllci4gV2hlbiBpc0NvdmVyaW5nIGlzIHRydWUsIGV2ZXJ5IGluc3RhbmNlIG9mIGEgcGFydGljdWxhciBnZW5lcmFsIENsYXNzaWZpZXIgaXMgYWxzbyBhbiBpbnN0YW5jZSBvZiBhdCBsZWFzdCBvbmUgb2YgaXRzIHNwZWNpZmljIENsYXNzaWZpZXJzIGZvciB0aGUgR2VuZXJhbGl6YXRpb25TZXQuIFdoZW4gaXNDb3ZlcmluZyBpcyBmYWxzZSwgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiB0aGUgcGFydGljdWxhciBnZW5lcmFsIENsYXNzaWZpZXIgdGhhdCBhcmUgbm90IGluc3RhbmNlcyBvZiBhdCBsZWFzdCBvbmUgb2YgaXRzIHNwZWNpZmljIENsYXNzaWZpZXJzIGRlZmluZWQgZm9yIHRoZSBHZW5lcmFsaXphdGlvblNldC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJHZW5lcmFsaXphdGlvblNldC1pc0NvdmVyaW5nLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJHZW5lcmFsaXphdGlvblNldC1pc0Rpc2pvaW50IiBuYW1lPSJpc0Rpc2pvaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkdlbmVyYWxpemF0aW9uU2V0LWlzRGlzam9pbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJHZW5lcmFsaXphdGlvblNldC1pc0Rpc2pvaW50Ij4KLSAgICAgICAgICA8Ym9keT5JbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHNldCBvZiBzcGVjaWZpYyBDbGFzc2lmaWVycyBpbiBhIEdlbmVyYWxpemF0aW9uIHJlbGF0aW9uc2hpcCBoYXZlIGluc3RhbmNlIGluIGNvbW1vbi4gSWYgaXNEaXNqb2ludCBpcyB0cnVlLCB0aGUgc3BlY2lmaWMgQ2xhc3NpZmllcnMgZm9yIGEgcGFydGljdWxhciBHZW5lcmFsaXphdGlvblNldCBoYXZlIG5vIG1lbWJlcnMgaW4gY29tbW9uOyB0aGF0IGlzLCB0aGVpciBpbnRlcnNlY3Rpb24gaXMgZW1wdHkuIElmIGlzRGlzam9pbnQgaXMgZmFsc2UsIHRoZSBzcGVjaWZpYyBDbGFzc2lmaWVycyBpbiBhIHBhcnRpY3VsYXIgR2VuZXJhbGl6YXRpb25TZXQgaGF2ZSBvbmUgb3IgbW9yZSBtZW1iZXJzIGluIGNvbW1vbjsgdGhhdCBpcywgdGhlaXIgaW50ZXJzZWN0aW9uIGlzIG5vdCBlbXB0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJHZW5lcmFsaXphdGlvblNldC1pc0Rpc2pvaW50LV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJHZW5lcmFsaXphdGlvblNldC1wb3dlcnR5cGUiIG5hbWU9InBvd2VydHlwZSIgdHlwZT0iQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfcG93ZXJ0eXBlRXh0ZW50X3Bvd2VydHlwZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJHZW5lcmFsaXphdGlvblNldC1wb3dlcnR5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJHZW5lcmFsaXphdGlvblNldC1wb3dlcnR5cGUiPgotICAgICAgICAgIDxib2R5PkRlc2lnbmF0ZXMgdGhlIENsYXNzaWZpZXIgdGhhdCBpcyBkZWZpbmVkIGFzIHRoZSBwb3dlciB0eXBlIGZvciB0aGUgYXNzb2NpYXRlZCBHZW5lcmFsaXphdGlvblNldCwgaWYgdGhlcmUgaXMgb25lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iR2VuZXJhbGl6YXRpb25TZXQtcG93ZXJ0eXBlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24iIG5hbWU9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPGJvZHk+QW4gSW5zdGFuY2VTcGVjaWZpY2F0aW9uIGlzIGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gaW5zdGFuY2UgaW4gYSBtb2RlbGVkIHN5c3RlbS4gQW4gSW5zdGFuY2VTcGVjaWZpY2F0aW9uIGNhbiBhY3QgYXMgYSBEZXBsb3ltZW50VGFyZ2V0IGluIGEgRGVwbG95bWVudCByZWxhdGlvbnNoaXAsIGluIHRoZSBjYXNlIHRoYXQgaXQgcmVwcmVzZW50cyBhbiBpbnN0YW5jZSBvZiBhIE5vZGUuIEl0IGNhbiBhbHNvIGFjdCBhcyBhIERlcGxveWVkQXJ0aWZhY3QsIGlmIGl0IHJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgYW4gQXJ0aWZhY3QuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLWRlcGxveW1lbnRfYXJ0aWZhY3QiIG5hbWU9ImRlcGxveW1lbnRfYXJ0aWZhY3QiIGNvbnN0cmFpbmVkRWxlbWVudD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbi1kZXBsb3ltZW50X2FydGlmYWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLWRlcGxveW1lbnRfYXJ0aWZhY3QiPgotICAgICAgICAgIDxib2R5PkFuIEluc3RhbmNlU3BlY2lmaWNhdGlvbiBjYW4gYWN0IGFzIGEgRGVwbG95ZWRBcnRpZmFjdCBpZiBpdCByZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGFuIEFydGlmYWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tZGVwbG95bWVudF9hcnRpZmFjdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZGVwbG95bWVudEZvckFydGlmYWN0LT5ub3RFbXB0eSgpIGltcGxpZXMgY2xhc3NpZmllci0+ZXhpc3RzKG9jbElzS2luZE9mKEFydGlmYWN0KSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbi1zdHJ1Y3R1cmFsX2ZlYXR1cmUiIG5hbWU9InN0cnVjdHVyYWxfZmVhdHVyZSIgY29uc3RyYWluZWRFbGVtZW50PSJJbnN0YW5jZVNwZWNpZmljYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLXN0cnVjdHVyYWxfZmVhdHVyZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbi1zdHJ1Y3R1cmFsX2ZlYXR1cmUiPgotICAgICAgICAgIDxib2R5Pk5vIG1vcmUgdGhhbiBvbmUgc2xvdCBpbiBhbiBJbnN0YW5jZVNwZWNpZmljYXRpb24gbWF5IGhhdmUgdGhlIHNhbWUgZGVmaW5pbmdGZWF0dXJlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tc3RydWN0dXJhbF9mZWF0dXJlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5jbGFzc2lmaWVyLT5mb3JBbGwoYyB8IChjLmFsbFNsb3R0YWJsZUZlYXR1cmVzKCktPmZvckFsbChmIHwgc2xvdC0+c2VsZWN0KHMgfCBzLmRlZmluaW5nRmVhdHVyZSA9IGYpLT5zaXplKCkgJmx0Oz0gMSkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLWRlZmluaW5nX2ZlYXR1cmUiIG5hbWU9ImRlZmluaW5nX2ZlYXR1cmUiIGNvbnN0cmFpbmVkRWxlbWVudD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbi1kZWZpbmluZ19mZWF0dXJlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLWRlZmluaW5nX2ZlYXR1cmUiPgotICAgICAgICAgIDxib2R5PlRoZSBkZWZpbmluZ0ZlYXR1cmUgb2YgZWFjaCBzbG90IGlzIGEgU3RydWN0dXJhbEZlYXR1cmUgcmVsYXRlZCB0byBhIGNsYXNzaWZpZXIgb2YgdGhlIEluc3RhbmNlU3BlY2lmaWNhdGlvbiwgaW5jbHVkaW5nIGRpcmVjdCBhdHRyaWJ1dGVzLCBpbmhlcml0ZWQgYXR0cmlidXRlcywgcHJpdmF0ZSBhdHRyaWJ1dGVzIGluIGdlbmVyYWxpemF0aW9ucywgYW5kIG1lbWJlckVuZHMgb2YgQXNzb2NpYXRpb25zLCBidXQgZXhjbHVkaW5nIHJlZGVmaW5lZCBTdHJ1Y3R1cmFsRmVhdHVyZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbi1kZWZpbmluZ19mZWF0dXJlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zbG90LT5mb3JBbGwocyB8IGNsYXNzaWZpZXItPmV4aXN0cyAoYyB8IGMuYWxsU2xvdHRhYmxlRmVhdHVyZXMoKS0+aW5jbHVkZXMgKHMuZGVmaW5pbmdGZWF0dXJlKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tZGVwbG95bWVudF90YXJnZXQiIG5hbWU9ImRlcGxveW1lbnRfdGFyZ2V0IiBjb25zdHJhaW5lZEVsZW1lbnQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tZGVwbG95bWVudF90YXJnZXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnN0YW5jZVNwZWNpZmljYXRpb24tZGVwbG95bWVudF90YXJnZXQiPgotICAgICAgICAgIDxib2R5PkFuIEluc3RhbmNlU3BlY2lmaWNhdGlvbiBjYW4gYWN0IGFzIGEgRGVwbG95bWVudFRhcmdldCBpZiBpdCByZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGEgTm9kZSBhbmQgZnVuY3Rpb25zIGFzIGEgcGFydCBpbiB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIGFuIGVuY29tcGFzc2luZyBOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tZGVwbG95bWVudF90YXJnZXQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmRlcGxveW1lbnQtPm5vdEVtcHR5KCkgaW1wbGllcyBjbGFzc2lmaWVyLT5leGlzdHMobm9kZSB8IG5vZGUub2NsSXNLaW5kT2YoTm9kZSkgYW5kIE5vZGUuYWxsSW5zdGFuY2VzKCktPmV4aXN0cyhuIHwgbi5wYXJ0LT5leGlzdHMocCB8IHAudHlwZSA9IG5vZGUpKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJEZXBsb3ltZW50VGFyZ2V0Ii8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IlBhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLV9nZW5lcmFsaXphdGlvbi4yIiBnZW5lcmFsPSJEZXBsb3llZEFydGlmYWN0Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tY2xhc3NpZmllciIgbmFtZT0iY2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfY2xhc3NpZmllcl9pbnN0YW5jZVNwZWNpZmljYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLWNsYXNzaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnN0YW5jZVNwZWNpZmljYXRpb24tY2xhc3NpZmllciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIENsYXNzaWZpZXIgb3IgQ2xhc3NpZmllcnMgb2YgdGhlIHJlcHJlc2VudGVkIGluc3RhbmNlLiBJZiBtdWx0aXBsZSBDbGFzc2lmaWVycyBhcmUgc3BlY2lmaWVkLCB0aGUgaW5zdGFuY2UgaXMgY2xhc3NpZmllZCBieSBhbGwgb2YgdGhlbS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbi1jbGFzc2lmaWVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLWNsYXNzaWZpZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLXNsb3QiIG5hbWU9InNsb3QiIHR5cGU9IlNsb3QiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfc2xvdF9vd25pbmdJbnN0YW5jZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tc2xvdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbi1zbG90Ij4KLSAgICAgICAgICA8Ym9keT5BIFNsb3QgZ2l2aW5nIHRoZSB2YWx1ZSBvciB2YWx1ZXMgb2YgYSBTdHJ1Y3R1cmFsRmVhdHVyZSBvZiB0aGUgaW5zdGFuY2UuIEFuIEluc3RhbmNlU3BlY2lmaWNhdGlvbiBjYW4gaGF2ZSBvbmUgU2xvdCBwZXIgU3RydWN0dXJhbEZlYXR1cmUgb2YgaXRzIENsYXNzaWZpZXJzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZlYXR1cmVzLiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIG1vZGVsIGEgU2xvdCBmb3IgZXZlcnkgU3RydWN0dXJhbEZlYXR1cmUsIGluIHdoaWNoIGNhc2UgdGhlIEluc3RhbmNlU3BlY2lmaWNhdGlvbiBpcyBhIHBhcnRpYWwgZGVzY3JpcHRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tc2xvdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbi1zbG90LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbi1zcGVjaWZpY2F0aW9uIiBuYW1lPSJzcGVjaWZpY2F0aW9uIiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfc3BlY2lmaWNhdGlvbl9vd25pbmdJbnN0YW5jZVNwZWMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLXNwZWNpZmljYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnN0YW5jZVNwZWNpZmljYXRpb24tc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+QSBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0byBjb21wdXRlLCBkZXJpdmUsIG9yIGNvbnN0cnVjdCB0aGUgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tc3BlY2lmaWNhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iSW5zdGFuY2VWYWx1ZSIgbmFtZT0iSW5zdGFuY2VWYWx1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5zdGFuY2VWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ikluc3RhbmNlVmFsdWUiPgotICAgICAgICA8Ym9keT5BbiBJbnN0YW5jZVZhbHVlIGlzIGEgVmFsdWVTcGVjaWZpY2F0aW9uIHRoYXQgaWRlbnRpZmllcyBhbiBpbnN0YW5jZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ikluc3RhbmNlVmFsdWUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlZhbHVlU3BlY2lmaWNhdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW5zdGFuY2VWYWx1ZS1pbnN0YW5jZSIgbmFtZT0iaW5zdGFuY2UiIHR5cGU9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbiIgYXNzb2NpYXRpb249IkFfaW5zdGFuY2VfaW5zdGFuY2VWYWx1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnN0YW5jZVZhbHVlLWluc3RhbmNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5zdGFuY2VWYWx1ZS1pbnN0YW5jZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEluc3RhbmNlU3BlY2lmaWNhdGlvbiB0aGF0IHJlcHJlc2VudHMgdGhlIHNwZWNpZmllZCB2YWx1ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ikluc3RhbmNlVmFsdWUtc3RyaW5nVmFsdWUiIG5hbWU9InN0cmluZ1ZhbHVlIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJJbnN0YW5jZVZhbHVlLXN0cmluZ1ZhbHVlLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJPcGVyYXRpb24iIG5hbWU9Ik9wZXJhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uIj4KLSAgICAgICAgPGJvZHk+QW4gT3BlcmF0aW9uIGlzIGEgQmVoYXZpb3JhbEZlYXR1cmUgb2YgYSBDbGFzc2lmaWVyIHRoYXQgc3BlY2lmaWVzIHRoZSBuYW1lLCB0eXBlLCBwYXJhbWV0ZXJzLCBhbmQgY29uc3RyYWludHMgZm9yIGludm9raW5nIGFuIGFzc29jaWF0ZWQgQmVoYXZpb3IuIEFuIE9wZXJhdGlvbiBtYXkgaW52b2tlIGJvdGggdGhlIGV4ZWN1dGlvbiBvZiBtZXRob2QgYmVoYXZpb3JzIGFzIHdlbGwgYXMgb3RoZXIgYmVoYXZpb3JhbCByZXNwb25zZXMuIE9wZXJhdGlvbiBzcGVjaWFsaXplcyBUZW1wbGF0ZWFibGVFbGVtZW50IGluIG9yZGVyIHRvIHN1cHBvcnQgc3BlY2lmaWNhdGlvbiBvZiB0ZW1wbGF0ZSBvcGVyYXRpb25zIGFuZCBib3VuZCBvcGVyYXRpb25zLiBPcGVyYXRpb24gc3BlY2lhbGl6ZXMgUGFyYW1ldGVyYWJsZUVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGFuIG9wZXJhdGlvbiBjYW4gYmUgZXhwb3NlZCBhcyBhIGZvcm1hbCB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGFuZCBwcm92aWRlZCBhcyBhbiBhY3R1YWwgcGFyYW1ldGVyIGluIGEgYmluZGluZyBvZiBhIHRlbXBsYXRlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik9wZXJhdGlvbi1hdF9tb3N0X29uZV9yZXR1cm4iIG5hbWU9ImF0X21vc3Rfb25lX3JldHVybiIgY29uc3RyYWluZWRFbGVtZW50PSJPcGVyYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLWF0X21vc3Rfb25lX3JldHVybi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wZXJhdGlvbi1hdF9tb3N0X29uZV9yZXR1cm4iPgotICAgICAgICAgIDxib2R5PkFuIE9wZXJhdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSByZXR1cm4gcGFyYW1ldGVyOyBpLmUuLCBhbiBvd25lZCBwYXJhbWV0ZXIgd2l0aCB0aGUgZGlyZWN0aW9uIHNldCB0byAncmV0dXJuLic8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iT3BlcmF0aW9uLWF0X21vc3Rfb25lX3JldHVybi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2VsZi5vd25lZFBhcmFtZXRlci0+c2VsZWN0KGRpcmVjdGlvbiA9IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6OnJldHVybiktPnNpemUoKSAmbHQ7PSAxPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPcGVyYXRpb24tb25seV9ib2R5X2Zvcl9xdWVyeSIgbmFtZT0ib25seV9ib2R5X2Zvcl9xdWVyeSIgY29uc3RyYWluZWRFbGVtZW50PSJPcGVyYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLW9ubHlfYm9keV9mb3JfcXVlcnktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGVyYXRpb24tb25seV9ib2R5X2Zvcl9xdWVyeSI+Ci0gICAgICAgICAgPGJvZHk+QSBib2R5Q29uZGl0aW9uIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYSBxdWVyeSBPcGVyYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wZXJhdGlvbi1vbmx5X2JvZHlfZm9yX3F1ZXJ5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5ib2R5Q29uZGl0aW9uICZsdDs+IG51bGwgaW1wbGllcyBpc1F1ZXJ5PC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ik9wZXJhdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iVGVtcGxhdGVhYmxlRWxlbWVudCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iT3BlcmF0aW9uLV9nZW5lcmFsaXphdGlvbi4xIiBnZW5lcmFsPSJQYXJhbWV0ZXJhYmxlRWxlbWVudCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iT3BlcmF0aW9uLV9nZW5lcmFsaXphdGlvbi4yIiBnZW5lcmFsPSJCZWhhdmlvcmFsRmVhdHVyZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT3BlcmF0aW9uLWJvZHlDb25kaXRpb24iIG5hbWU9ImJvZHlDb25kaXRpb24iIHR5cGU9IkNvbnN0cmFpbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRSdWxlIiBhc3NvY2lhdGlvbj0iQV9ib2R5Q29uZGl0aW9uX2JvZHlDb250ZXh0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wZXJhdGlvbi1ib2R5Q29uZGl0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLWJvZHlDb25kaXRpb24iPgotICAgICAgICAgIDxib2R5PkFuIG9wdGlvbmFsIENvbnN0cmFpbnQgb24gdGhlIHJlc3VsdCB2YWx1ZXMgb2YgYW4gaW52b2NhdGlvbiBvZiB0aGlzIE9wZXJhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wZXJhdGlvbi1ib2R5Q29uZGl0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT3BlcmF0aW9uLWNsYXNzIiBuYW1lPSJjbGFzcyIgdHlwZT0iQ2xhc3MiIHN1YnNldHRlZFByb3BlcnR5PSJGZWF0dXJlLWZlYXR1cmluZ0NsYXNzaWZpZXIgTmFtZWRFbGVtZW50LW5hbWVzcGFjZSBSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbml0aW9uQ29udGV4dCIgYXNzb2NpYXRpb249IkFfb3duZWRPcGVyYXRpb25fY2xhc3MiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLWNsYXNzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLWNsYXNzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQ2xhc3MgdGhhdCBvd25zIHRoaXMgb3BlcmF0aW9uLCBpZiBhbnkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJPcGVyYXRpb24tY2xhc3MtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGVyYXRpb24tZGF0YXR5cGUiIG5hbWU9ImRhdGF0eXBlIiB0eXBlPSJEYXRhVHlwZSIgc3Vic2V0dGVkUHJvcGVydHk9IkZlYXR1cmUtZmVhdHVyaW5nQ2xhc3NpZmllciBOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIFJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25Db250ZXh0IiBhc3NvY2lhdGlvbj0iQV9vd25lZE9wZXJhdGlvbl9kYXRhdHlwZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGVyYXRpb24tZGF0YXR5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGVyYXRpb24tZGF0YXR5cGUiPgotICAgICAgICAgIDxib2R5PlRoZSBEYXRhVHlwZSB0aGF0IG93bnMgdGhpcyBPcGVyYXRpb24sIGlmIGFueS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wZXJhdGlvbi1kYXRhdHlwZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9wZXJhdGlvbi1pbnRlcmZhY2UiIG5hbWU9ImludGVyZmFjZSIgdHlwZT0iSW50ZXJmYWNlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRmVhdHVyZS1mZWF0dXJpbmdDbGFzc2lmaWVyIE5hbWVkRWxlbWVudC1uYW1lc3BhY2UgUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5pdGlvbkNvbnRleHQiIGFzc29jaWF0aW9uPSJBX293bmVkT3BlcmF0aW9uX2ludGVyZmFjZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGVyYXRpb24taW50ZXJmYWNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLWludGVyZmFjZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyZmFjZSB0aGF0IG93bnMgdGhpcyBPcGVyYXRpb24sIGlmIGFueS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wZXJhdGlvbi1pbnRlcmZhY2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGVyYXRpb24taXNPcmRlcmVkIiBuYW1lPSJpc09yZGVyZWQiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGVyYXRpb24taXNPcmRlcmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLWlzT3JkZXJlZCI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJldHVybiBwYXJhbWV0ZXIgaXMgb3JkZXJlZCBvciBub3QsIGlmIHByZXNlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgcmV0dXJuIHJlc3VsdCBmb3IgdGhpcyBPcGVyYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9wZXJhdGlvbi1pc1F1ZXJ5IiBuYW1lPSJpc1F1ZXJ5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wZXJhdGlvbi1pc1F1ZXJ5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLWlzUXVlcnkiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB3aGV0aGVyIGFuIGV4ZWN1dGlvbiBvZiB0aGUgQmVoYXZpb3JhbEZlYXR1cmUgbGVhdmVzIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtIHVuY2hhbmdlZCAoaXNRdWVyeT10cnVlKSBvciB3aGV0aGVyIHNpZGUgZWZmZWN0cyBtYXkgb2NjdXIgKGlzUXVlcnk9ZmFsc2UpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Ik9wZXJhdGlvbi1pc1F1ZXJ5LV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGVyYXRpb24taXNVbmlxdWUiIG5hbWU9ImlzVW5pcXVlIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLWlzVW5pcXVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLWlzVW5pcXVlIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgd2hldGhlciB0aGUgcmV0dXJuIHBhcmFtZXRlciBpcyB1bmlxdWUgb3Igbm90LCBpZiBwcmVzZW50LiBUaGlzIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgcmV0dXJuIHJlc3VsdCBmb3IgdGhpcyBPcGVyYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iT3BlcmF0aW9uLWlzVW5pcXVlLV9kZWZhdWx0VmFsdWUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT3BlcmF0aW9uLWxvd2VyIiBuYW1lPSJsb3dlciIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wZXJhdGlvbi1sb3dlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wZXJhdGlvbi1sb3dlciI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBsb3dlciBtdWx0aXBsaWNpdHkgb2YgdGhlIHJldHVybiBwYXJhbWV0ZXIsIGlmIHByZXNlbnQuIFRoaXMgaW5mb3JtYXRpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSByZXR1cm4gcmVzdWx0IGZvciB0aGlzIE9wZXJhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iT3BlcmF0aW9uLWxvd2VyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJPcGVyYXRpb24tbG93ZXItX2RlZmF1bHRWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGVyYXRpb24tb3duZWRQYXJhbWV0ZXIiIG5hbWU9Im93bmVkUGFyYW1ldGVyIiB0eXBlPSJQYXJhbWV0ZXIiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgcmVkZWZpbmVkUHJvcGVydHk9IkJlaGF2aW9yYWxGZWF0dXJlLW93bmVkUGFyYW1ldGVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZFBhcmFtZXRlcl9vcGVyYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLW93bmVkUGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLW93bmVkUGFyYW1ldGVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcGFyYW1ldGVycyBvd25lZCBieSB0aGlzIE9wZXJhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wZXJhdGlvbi1vd25lZFBhcmFtZXRlci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik9wZXJhdGlvbi1vd25lZFBhcmFtZXRlci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGVyYXRpb24tcG9zdGNvbmRpdGlvbiIgbmFtZT0icG9zdGNvbmRpdGlvbiIgdHlwZT0iQ29uc3RyYWludCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZFJ1bGUiIGFzc29jaWF0aW9uPSJBX3Bvc3Rjb25kaXRpb25fcG9zdENvbnRleHQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLXBvc3Rjb25kaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGVyYXRpb24tcG9zdGNvbmRpdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+QW4gb3B0aW9uYWwgc2V0IG9mIENvbnN0cmFpbnRzIHNwZWNpZnlpbmcgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gd2hlbiB0aGUgT3BlcmF0aW9uIGlzIGNvbXBsZXRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wZXJhdGlvbi1wb3N0Y29uZGl0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iT3BlcmF0aW9uLXBvc3Rjb25kaXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT3BlcmF0aW9uLXByZWNvbmRpdGlvbiIgbmFtZT0icHJlY29uZGl0aW9uIiB0eXBlPSJDb25zdHJhaW50IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW93bmVkUnVsZSIgYXNzb2NpYXRpb249IkFfcHJlY29uZGl0aW9uX3ByZUNvbnRleHQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLXByZWNvbmRpdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wZXJhdGlvbi1wcmVjb25kaXRpb24iPgotICAgICAgICAgIDxib2R5PkFuIG9wdGlvbmFsIHNldCBvZiBDb25zdHJhaW50cyBvbiB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSB3aGVuIHRoZSBPcGVyYXRpb24gaXMgaW52b2tlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wZXJhdGlvbi1wcmVjb25kaXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJPcGVyYXRpb24tcHJlY29uZGl0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9wZXJhdGlvbi1yYWlzZWRFeGNlcHRpb24iIG5hbWU9InJhaXNlZEV4Y2VwdGlvbiIgdHlwZT0iVHlwZSIgcmVkZWZpbmVkUHJvcGVydHk9IkJlaGF2aW9yYWxGZWF0dXJlLXJhaXNlZEV4Y2VwdGlvbiIgYXNzb2NpYXRpb249IkFfcmFpc2VkRXhjZXB0aW9uX29wZXJhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGVyYXRpb24tcmFpc2VkRXhjZXB0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLXJhaXNlZEV4Y2VwdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFR5cGVzIHJlcHJlc2VudGluZyBleGNlcHRpb25zIHRoYXQgbWF5IGJlIHJhaXNlZCBkdXJpbmcgYW4gaW52b2NhdGlvbiBvZiB0aGlzIG9wZXJhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wZXJhdGlvbi1yYWlzZWRFeGNlcHRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJPcGVyYXRpb24tcmFpc2VkRXhjZXB0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9wZXJhdGlvbi1yZWRlZmluZWRPcGVyYXRpb24iIG5hbWU9InJlZGVmaW5lZE9wZXJhdGlvbiIgdHlwZT0iT3BlcmF0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5lZE9wZXJhdGlvbl9vcGVyYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLXJlZGVmaW5lZE9wZXJhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wZXJhdGlvbi1yZWRlZmluZWRPcGVyYXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBPcGVyYXRpb25zIHRoYXQgYXJlIHJlZGVmaW5lZCBieSB0aGlzIE9wZXJhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wZXJhdGlvbi1yZWRlZmluZWRPcGVyYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJPcGVyYXRpb24tcmVkZWZpbmVkT3BlcmF0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9wZXJhdGlvbi10ZW1wbGF0ZVBhcmFtZXRlciIgbmFtZT0idGVtcGxhdGVQYXJhbWV0ZXIiIHR5cGU9Ik9wZXJhdGlvblRlbXBsYXRlUGFyYW1ldGVyIiByZWRlZmluZWRQcm9wZXJ0eT0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtdGVtcGxhdGVQYXJhbWV0ZXIiIGFzc29jaWF0aW9uPSJBX29wZXJhdGlvbl90ZW1wbGF0ZVBhcmFtZXRlcl9wYXJhbWV0ZXJlZEVsZW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLXRlbXBsYXRlUGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLXRlbXBsYXRlUGFyYW1ldGVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgT3BlcmF0aW9uVGVtcGxhdGVQYXJhbWV0ZXIgdGhhdCBleHBvc2VzIHRoaXMgZWxlbWVudCBhcyBhIGZvcm1hbCBwYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJPcGVyYXRpb24tdGVtcGxhdGVQYXJhbWV0ZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGVyYXRpb24tdHlwZSIgbmFtZT0idHlwZSIgdHlwZT0iVHlwZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV90eXBlX29wZXJhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGVyYXRpb24tdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wZXJhdGlvbi10eXBlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcmV0dXJuIHR5cGUgb2YgdGhlIG9wZXJhdGlvbiwgaWYgcHJlc2VudC4gVGhpcyBpbmZvcm1hdGlvbiBpcyBkZXJpdmVkIGZyb20gdGhlIHJldHVybiByZXN1bHQgZm9yIHRoaXMgT3BlcmF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iT3BlcmF0aW9uLXR5cGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGVyYXRpb24tdXBwZXIiIG5hbWU9InVwcGVyIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLXVwcGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLXVwcGVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdXBwZXIgbXVsdGlwbGljaXR5IG9mIHRoZSByZXR1cm4gcGFyYW1ldGVyLCBpZiBwcmVzZW50LiBUaGlzIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgcmV0dXJuIHJlc3VsdCBmb3IgdGhpcyBPcGVyYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wZXJhdGlvbi11cHBlci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iT3BlcmF0aW9uLXVwcGVyLV9kZWZhdWx0VmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iT3BlcmF0aW9uLWdldFJldHVyblJlc3VsdCIgbmFtZT0iZ2V0UmV0dXJuUmVzdWx0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wZXJhdGlvbi1nZXRSZXR1cm5SZXN1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGVyYXRpb24tZ2V0UmV0dXJuUmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIChvbmx5KSByZXR1cm4gcmVzdWx0IHBhcmFtZXRlciBmb3IgdGhpcyBvcGVyYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iT3BlcmF0aW9uLWdldFJldHVyblJlc3VsdC1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUGFyYW1ldGVyIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJPcGVyYXRpb24tZ2V0UmV0dXJuUmVzdWx0LV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJPcGVyYXRpb24tZ2V0UmV0dXJuUmVzdWx0LV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik9wZXJhdGlvbi1zZXRJc09yZGVyZWQiIG5hbWU9InNldElzT3JkZXJlZCI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik9wZXJhdGlvbi1zZXRJc09yZGVyZWQtbmV3SXNPcmRlcmVkIiBuYW1lPSJuZXdJc09yZGVyZWQiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik9wZXJhdGlvbi1zZXRJc1VuaXF1ZSIgbmFtZT0ic2V0SXNVbmlxdWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJPcGVyYXRpb24tc2V0SXNVbmlxdWUtbmV3SXNVbmlxdWUiIG5hbWU9Im5ld0lzVW5pcXVlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJPcGVyYXRpb24tc2V0TG93ZXIiIG5hbWU9InNldExvd2VyIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iT3BlcmF0aW9uLXNldExvd2VyLW5ld0xvd2VyIiBuYW1lPSJuZXdMb3dlciIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iT3BlcmF0aW9uLXNldFR5cGUiIG5hbWU9InNldFR5cGUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJPcGVyYXRpb24tc2V0VHlwZS1uZXdUeXBlIiBuYW1lPSJuZXdUeXBlIiB0eXBlPSJUeXBlIiBlZmZlY3Q9InJlYWQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJPcGVyYXRpb24tc2V0VXBwZXIiIG5hbWU9InNldFVwcGVyIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iT3BlcmF0aW9uLXNldFVwcGVyLW5ld1VwcGVyIiBuYW1lPSJuZXdVcHBlciIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iT3BlcmF0aW9uLWlzQ29uc2lzdGVudFdpdGgiIG5hbWU9ImlzQ29uc2lzdGVudFdpdGgiIGJvZHlDb25kaXRpb249Ik9wZXJhdGlvbi1pc0NvbnNpc3RlbnRXaXRoLXNwZWMiIGlzUXVlcnk9InRydWUiIHByZWNvbmRpdGlvbj0iT3BlcmF0aW9uLWlzQ29uc2lzdGVudFdpdGgtcHJlIiByZWRlZmluZWRPcGVyYXRpb249IlJlZGVmaW5hYmxlRWxlbWVudC1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wZXJhdGlvbi1pc0NvbnNpc3RlbnRXaXRoLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLWlzQ29uc2lzdGVudFdpdGgiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpc0NvbnNpc3RlbnRXaXRoKCkgc3BlY2lmaWVzLCBmb3IgYW55IHR3byBPcGVyYXRpb25zIGluIGEgY29udGV4dCBpbiB3aGljaCByZWRlZmluaXRpb24gaXMgcG9zc2libGUsIHdoZXRoZXIgcmVkZWZpbml0aW9uIHdvdWxkIGJlIGNvbnNpc3RlbnQuIEEgcmVkZWZpbmluZyBvcGVyYXRpb24gaXMgY29uc2lzdGVudCB3aXRoIGEgcmVkZWZpbmVkIG9wZXJhdGlvbiBpZiYjeEQ7Ci1pdCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHBhcmFtZXRlcnMsIGFuZCBmb3IgZWFjaCBwYXJhbWV0ZXIgdGhlIGZvbGxvd2luZyBob2xkczomI3hEOwotJiN4RDsKLS0gRGlyZWN0aW9uLCBvcmRlcmluZyBhbmQgdW5pcXVlbmVzcyBhcmUgdGhlIHNhbWUuJiN4RDsKLS0gVGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgYXJlIGNvdmFyaWFudCwgY29udHJhdmFyaWFudCBvciBpbnZhcmlhbnQuJiN4RDsKLS0gVGhlIG11bHRpcGxpY2l0aWVzIGFyZSBjb21wYXRpYmxlLCBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlciBkaXJlY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik9wZXJhdGlvbi1pc0NvbnNpc3RlbnRXaXRoLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iT3BlcmF0aW9uLWlzQ29uc2lzdGVudFdpdGgiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJPcGVyYXRpb24taXNDb25zaXN0ZW50V2l0aC1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHJlZGVmaW5pbmdFbGVtZW50Lm9jbElzS2luZE9mKE9wZXJhdGlvbikgYW5kJiN4RDsKLWxldCBvcCA6IE9wZXJhdGlvbiA9IHJlZGVmaW5pbmdFbGVtZW50Lm9jbEFzVHlwZShPcGVyYXRpb24pIGluJiN4RDsKLQlzZWxmLm93bmVkUGFyYW1ldGVyLT5zaXplKCkgPSBvcC5vd25lZFBhcmFtZXRlci0+c2l6ZSgpIGFuZCYjeEQ7Ci0JU2VxdWVuY2V7MS4uc2VsZi5vd25lZFBhcmFtZXRlci0+c2l6ZSgpfS0+JiN4RDsKLQkJZm9yQWxsKGkgfCAgJiN4RDsKLQkJICBsZXQgcmVkZWZpbmluZ1BhcmFtIDogUGFyYW1ldGVyID0gb3Aub3duZWRQYXJhbWV0ZXItPmF0KGkpLCYjeEQ7Ci0gICAgICAgICAgICAgICByZWRlZmluZWRQYXJhbSA6IFBhcmFtZXRlciA9IHNlbGYub3duZWRQYXJhbWV0ZXItPmF0KGkpIGluJiN4RDsKLSAgICAgICAgICAgICAgICAgKHJlZGVmaW5pbmdQYXJhbS5pc1VuaXF1ZSA9IHJlZGVmaW5lZFBhcmFtLmlzVW5pcXVlKSBhbmQmI3hEOwotICAgICAgICAgICAgICAgICAocmVkZWZpbmluZ1BhcmFtLmlzT3JkZXJlZCA9IHJlZGVmaW5lZFBhcmFtLiBpc09yZGVyZWQpIGFuZCYjeEQ7Ci0gICAgICAgICAgICAgICAgIChyZWRlZmluaW5nUGFyYW0uZGlyZWN0aW9uID0gcmVkZWZpbmVkUGFyYW0uZGlyZWN0aW9uKSBhbmQmI3hEOwotICAgICAgICAgICAgICAgICAocmVkZWZpbmluZ1BhcmFtLnR5cGUuY29uZm9ybXNUbyhyZWRlZmluZWRQYXJhbS50eXBlKSBvciYjeEQ7Ci0gICAgICAgICAgICAgICAgICAgICByZWRlZmluZWRQYXJhbS50eXBlLmNvbmZvcm1zVG8ocmVkZWZpbmluZ1BhcmFtLnR5cGUpKSBhbmQmI3hEOwotICAgICAgICAgICAgICAgICAocmVkZWZpbmluZ1BhcmFtLmRpcmVjdGlvbiA9IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Omlub3V0IGltcGxpZXMmI3hEOwotICAgICAgICAgICAgICAgICAgICAgICAgIChyZWRlZmluZWRQYXJhbS5jb21wYXRpYmxlV2l0aChyZWRlZmluaW5nUGFyYW0pIGFuZCYjeEQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVkZWZpbmluZ1BhcmFtLmNvbXBhdGlibGVXaXRoKHJlZGVmaW5lZFBhcmFtKSkpIGFuZCYjeEQ7Ci0gICAgICAgICAgICAgICAgIChyZWRlZmluaW5nUGFyYW0uZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6XydpbicgaW1wbGllcyYjeEQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmVkZWZpbmVkUGFyYW0uY29tcGF0aWJsZVdpdGgocmVkZWZpbmluZ1BhcmFtKSkgYW5kJiN4RDsKLSAgICAgICAgICAgICAgICAgKChyZWRlZmluaW5nUGFyYW0uZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6b3V0IG9yJiN4RDsKLSAgICAgICAgICAgICAgICAgICAgICByZWRlZmluaW5nUGFyYW0uZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6cmV0dXJuKSBpbXBsaWVzJiN4RDsKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWRlZmluaW5nUGFyYW0uY29tcGF0aWJsZVdpdGgocmVkZWZpbmVkUGFyYW0pKSYjeEQ7Ci0JCSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPcGVyYXRpb24taXNDb25zaXN0ZW50V2l0aC1wcmUiIG5hbWU9InByZSIgY29uc3RyYWluZWRFbGVtZW50PSJPcGVyYXRpb24taXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wZXJhdGlvbi1pc0NvbnNpc3RlbnRXaXRoLXByZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlZGVmaW5pbmdFbGVtZW50LmlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkKHNlbGYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik9wZXJhdGlvbi1pc0NvbnNpc3RlbnRXaXRoLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJPcGVyYXRpb24taXNDb25zaXN0ZW50V2l0aC1yZWRlZmluaW5nRWxlbWVudCIgbmFtZT0icmVkZWZpbmluZ0VsZW1lbnQiIHR5cGU9IlJlZGVmaW5hYmxlRWxlbWVudCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik9wZXJhdGlvbi1pc09yZGVyZWQuMSIgbmFtZT0iaXNPcmRlcmVkIiBib2R5Q29uZGl0aW9uPSJPcGVyYXRpb24taXNPcmRlcmVkLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGVyYXRpb24taXNPcmRlcmVkLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGVyYXRpb24taXNPcmRlcmVkLjEiPgotICAgICAgICAgIDxib2R5PklmIHRoaXMgb3BlcmF0aW9uIGhhcyBhIHJldHVybiBwYXJhbWV0ZXIsIGlzT3JkZXJlZCBlcXVhbHMgdGhlIHZhbHVlIG9mIGlzT3JkZXJlZCBmb3IgdGhhdCBwYXJhbWV0ZXIuIE90aGVyd2lzZSBpc09yZGVyZWQgaXMgZmFsc2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik9wZXJhdGlvbi1pc09yZGVyZWQuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik9wZXJhdGlvbi1pc09yZGVyZWQuMSBPcGVyYXRpb24taXNPcmRlcmVkIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iT3BlcmF0aW9uLWlzT3JkZXJlZC4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgcmV0dXJuUmVzdWx0KCktPm5vdEVtcHR5KCkgdGhlbiByZXR1cm5SZXN1bHQoKS0+IGV4aXN0cyhpc09yZGVyZWQpIGVsc2UgZmFsc2UgZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik9wZXJhdGlvbi1pc09yZGVyZWQuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJPcGVyYXRpb24taXNVbmlxdWUuMSIgbmFtZT0iaXNVbmlxdWUiIGJvZHlDb25kaXRpb249Ik9wZXJhdGlvbi1pc1VuaXF1ZS4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLWlzVW5pcXVlLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGVyYXRpb24taXNVbmlxdWUuMSI+Ci0gICAgICAgICAgPGJvZHk+SWYgdGhpcyBvcGVyYXRpb24gaGFzIGEgcmV0dXJuIHBhcmFtZXRlciwgaXNVbmlxdWUgZXF1YWxzIHRoZSB2YWx1ZSBvZiBpc1VuaXF1ZSBmb3IgdGhhdCBwYXJhbWV0ZXIuIE90aGVyd2lzZSBpc1VuaXF1ZSBpcyB0cnVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPcGVyYXRpb24taXNVbmlxdWUuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik9wZXJhdGlvbi1pc1VuaXF1ZS4xIE9wZXJhdGlvbi1pc1VuaXF1ZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wZXJhdGlvbi1pc1VuaXF1ZS4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgcmV0dXJuUmVzdWx0KCktPm5vdEVtcHR5KCkgdGhlbiByZXR1cm5SZXN1bHQoKS0+ZXhpc3RzKGlzVW5pcXVlKSBlbHNlIHRydWUgZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik9wZXJhdGlvbi1pc1VuaXF1ZS4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik9wZXJhdGlvbi1sb3dlci4xIiBuYW1lPSJsb3dlciIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiBib2R5Q29uZGl0aW9uPSJPcGVyYXRpb24tbG93ZXIuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wZXJhdGlvbi1sb3dlci4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BlcmF0aW9uLWxvd2VyLjEiPgotICAgICAgICAgIDxib2R5PklmIHRoaXMgb3BlcmF0aW9uIGhhcyBhIHJldHVybiBwYXJhbWV0ZXIsIGxvd2VyIGVxdWFscyB0aGUgdmFsdWUgb2YgbG93ZXIgZm9yIHRoYXQgcGFyYW1ldGVyLiBPdGhlcndpc2UgbG93ZXIgaGFzIG5vIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPcGVyYXRpb24tbG93ZXIuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik9wZXJhdGlvbi1sb3dlci4xIE9wZXJhdGlvbi1sb3dlciI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wZXJhdGlvbi1sb3dlci4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgcmV0dXJuUmVzdWx0KCktPm5vdEVtcHR5KCkgdGhlbiByZXR1cm5SZXN1bHQoKS0+YW55KHRydWUpLmxvd2VyIGVsc2UgbnVsbCBlbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iT3BlcmF0aW9uLWxvd2VyLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iT3BlcmF0aW9uLXJldHVyblJlc3VsdCIgbmFtZT0icmV0dXJuUmVzdWx0IiBib2R5Q29uZGl0aW9uPSJPcGVyYXRpb24tcmV0dXJuUmVzdWx0LXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLXJldHVyblJlc3VsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wZXJhdGlvbi1yZXR1cm5SZXN1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSByZXR1cm5SZXN1bHQoKSByZXR1cm5zIHRoZSBzZXQgY29udGFpbmluZyB0aGUgcmV0dXJuIHBhcmFtZXRlciBvZiB0aGUgT3BlcmF0aW9uIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSwgaXQgcmV0dXJucyBhbiBlbXB0eSBzZXQ8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iT3BlcmF0aW9uLXJldHVyblJlc3VsdC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik9wZXJhdGlvbi1yZXR1cm5SZXN1bHQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJPcGVyYXRpb24tcmV0dXJuUmVzdWx0LXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAob3duZWRQYXJhbWV0ZXItPnNlbGVjdCAoZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6cmV0dXJuKS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iT3BlcmF0aW9uLXJldHVyblJlc3VsdC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUGFyYW1ldGVyIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJPcGVyYXRpb24tcmV0dXJuUmVzdWx0LXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iT3BlcmF0aW9uLXJldHVyblJlc3VsdC1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iT3BlcmF0aW9uLXR5cGUuMSIgbmFtZT0idHlwZSIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiBib2R5Q29uZGl0aW9uPSJPcGVyYXRpb24tdHlwZS4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLXR5cGUuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wZXJhdGlvbi10eXBlLjEiPgotICAgICAgICAgIDxib2R5PklmIHRoaXMgb3BlcmF0aW9uIGhhcyBhIHJldHVybiBwYXJhbWV0ZXIsIHR5cGUgZXF1YWxzIHRoZSB2YWx1ZSBvZiB0eXBlIGZvciB0aGF0IHBhcmFtZXRlci4gT3RoZXJ3aXNlIHR5cGUgaGFzIG5vIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPcGVyYXRpb24tdHlwZS4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iT3BlcmF0aW9uLXR5cGUuMSBPcGVyYXRpb24tdHlwZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wZXJhdGlvbi10eXBlLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiByZXR1cm5SZXN1bHQoKS0+bm90RW1wdHkoKSB0aGVuIHJldHVyblJlc3VsdCgpLT5hbnkodHJ1ZSkudHlwZSBlbHNlIG51bGwgZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik9wZXJhdGlvbi10eXBlLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlR5cGUiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iT3BlcmF0aW9uLXVwcGVyLjEiIG5hbWU9InVwcGVyIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249Ik9wZXJhdGlvbi11cHBlci4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uLXVwcGVyLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGVyYXRpb24tdXBwZXIuMSI+Ci0gICAgICAgICAgPGJvZHk+SWYgdGhpcyBvcGVyYXRpb24gaGFzIGEgcmV0dXJuIHBhcmFtZXRlciwgdXBwZXIgZXF1YWxzIHRoZSB2YWx1ZSBvZiB1cHBlciBmb3IgdGhhdCBwYXJhbWV0ZXIuIE90aGVyd2lzZSB1cHBlciBoYXMgbm8gdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik9wZXJhdGlvbi11cHBlci4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iT3BlcmF0aW9uLXVwcGVyLjEgT3BlcmF0aW9uLXVwcGVyIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iT3BlcmF0aW9uLXVwcGVyLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiByZXR1cm5SZXN1bHQoKS0+bm90RW1wdHkoKSB0aGVuIHJldHVyblJlc3VsdCgpLT5hbnkodHJ1ZSkudXBwZXIgZWxzZSBudWxsIGVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJPcGVyYXRpb24tdXBwZXIuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Ik9wZXJhdGlvblRlbXBsYXRlUGFyYW1ldGVyIiBuYW1lPSJPcGVyYXRpb25UZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BlcmF0aW9uVGVtcGxhdGVQYXJhbWV0ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGVyYXRpb25UZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgIDxib2R5PkFuIE9wZXJhdGlvblRlbXBsYXRlUGFyYW1ldGVyIGV4cG9zZXMgYW4gT3BlcmF0aW9uIGFzIGEgZm9ybWFsIHBhcmFtZXRlciBmb3IgYSB0ZW1wbGF0ZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPcGVyYXRpb25UZW1wbGF0ZVBhcmFtZXRlci1tYXRjaF9kZWZhdWx0X3NpZ25hdHVyZSIgbmFtZT0ibWF0Y2hfZGVmYXVsdF9zaWduYXR1cmUiIGNvbnN0cmFpbmVkRWxlbWVudD0iT3BlcmF0aW9uVGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iT3BlcmF0aW9uVGVtcGxhdGVQYXJhbWV0ZXItbWF0Y2hfZGVmYXVsdF9zaWduYXR1cmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGVyYXRpb25UZW1wbGF0ZVBhcmFtZXRlci1tYXRjaF9kZWZhdWx0X3NpZ25hdHVyZS1fc3BlY2lmaWNhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wZXJhdGlvblRlbXBsYXRlUGFyYW1ldGVyLW1hdGNoX2RlZmF1bHRfc2lnbmF0dXJlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxib2R5PkEgZGVmYXVsdCBmb3IgYW4gT3BlcmF0aW9uVGVtcGxhdGVQYXJhbWV0ZXIgbXVzdCBiZSBhbiBPcGVyYXRpb24gd2l0aCB0aGUgc2FtZSBQYXJhbWV0ZXIgdHlwZXMsIGRpcmVjdGlvbnMgYW5kIG11bHRpcGxpY2l0aWVzIGFzIHRoZSBleHBvc2VkIE9wZXJhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZGVmYXVsdC0+bm90RW1wdHkoKSBpbXBsaWVzIChkZWZhdWx0Lm9jbElzS2luZE9mKE9wZXJhdGlvbikgYW5kIChsZXQgZGVmYXVsdE9wIDogT3BlcmF0aW9uID0gZGVmYXVsdC5vY2xBc1R5cGUoT3BlcmF0aW9uKSBpbiAmI3hEOwotICAgIGRlZmF1bHRPcC5vd25lZFBhcmFtZXRlci0+c2l6ZSgpID0gcGFyYW1ldGVyZWRFbGVtZW50Lm93bmVkUGFyYW1ldGVyLT5zaXplKCkgYW5kJiN4RDsKLSAgICBTZXF1ZW5jZXsxLi4gZGVmYXVsdE9wLm93bmVkUGFyYW1ldGVyLT5zaXplKCl9LT5mb3JBbGwoIGl4IHwgJiN4RDsKLSAgICAgICAgbGV0IHAxOiBQYXJhbWV0ZXIgPSBkZWZhdWx0T3Aub3duZWRQYXJhbWV0ZXItPmF0KGl4KSwgcDIgOiBQYXJhbWV0ZXIgPSBwYXJhbWV0ZXJlZEVsZW1lbnQub3duZWRQYXJhbWV0ZXItPmF0KGl4KSBpbiYjeEQ7Ci0gICAgICAgICAgcDEudHlwZSA9IHAyLnR5cGUgYW5kIHAxLnVwcGVyID0gcDIudXBwZXIgYW5kIHAxLmxvd2VyID0gcDIubG93ZXIgYW5kIHAxLmRpcmVjdGlvbiA9IHAyLmRpcmVjdGlvbiBhbmQgcDEuaXNPcmRlcmVkID0gcDIuaXNPcmRlcmVkIGFuZCBwMS5pc1VuaXF1ZSA9IHAyLmlzVW5pcXVlKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ik9wZXJhdGlvblRlbXBsYXRlUGFyYW1ldGVyLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJUZW1wbGF0ZVBhcmFtZXRlciIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT3BlcmF0aW9uVGVtcGxhdGVQYXJhbWV0ZXItcGFyYW1ldGVyZWRFbGVtZW50IiBuYW1lPSJwYXJhbWV0ZXJlZEVsZW1lbnQiIHR5cGU9Ik9wZXJhdGlvbiIgcmVkZWZpbmVkUHJvcGVydHk9IlRlbXBsYXRlUGFyYW1ldGVyLXBhcmFtZXRlcmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfb3BlcmF0aW9uX3RlbXBsYXRlUGFyYW1ldGVyX3BhcmFtZXRlcmVkRWxlbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGVyYXRpb25UZW1wbGF0ZVBhcmFtZXRlci1wYXJhbWV0ZXJlZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGVyYXRpb25UZW1wbGF0ZVBhcmFtZXRlci1wYXJhbWV0ZXJlZEVsZW1lbnQiPgotICAgICAgICAgIDxib2R5PlRoZSBPcGVyYXRpb24gZXhwb3NlZCBieSB0aGlzIE9wZXJhdGlvblRlbXBsYXRlUGFyYW1ldGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJQYXJhbWV0ZXIiIG5hbWU9IlBhcmFtZXRlciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyIj4KLSAgICAgICAgPGJvZHk+QSBQYXJhbWV0ZXIgaXMgYSBzcGVjaWZpY2F0aW9uIG9mIGFuIGFyZ3VtZW50IHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBpbnRvIG9yIG91dCBvZiBhbiBpbnZvY2F0aW9uIG9mIGEgQmVoYXZpb3JhbEZlYXR1cmUuICBQYXJhbWV0ZXJzIGNhbiBiZSB0cmVhdGVkIGFzIENvbm5lY3RhYmxlRWxlbWVudHMgd2l0aGluIENvbGxhYm9yYXRpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBhcmFtZXRlci1pbl9hbmRfb3V0IiBuYW1lPSJpbl9hbmRfb3V0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBhcmFtZXRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXItaW5fYW5kX291dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlci1pbl9hbmRfb3V0Ij4KLSAgICAgICAgICA8Ym9keT5Pbmx5IGluIGFuZCBpbm91dCBQYXJhbWV0ZXJzIG1heSBoYXZlIGEgZGVsZXRlIGVmZmVjdC4gT25seSBvdXQsIGlub3V0LCBhbmQgcmV0dXJuIFBhcmFtZXRlcnMgbWF5IGhhdmUgYSBjcmVhdGUgZWZmZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQYXJhbWV0ZXItaW5fYW5kX291dC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KGVmZmVjdCA9IFBhcmFtZXRlckVmZmVjdEtpbmQ6OmRlbGV0ZSBpbXBsaWVzIChkaXJlY3Rpb24gPSBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kOjpfJ2luJyBvciBkaXJlY3Rpb24gPSBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kOjppbm91dCkpJiN4RDsKLWFuZCYjeEQ7Ci0oZWZmZWN0ID0gUGFyYW1ldGVyRWZmZWN0S2luZDo6Y3JlYXRlIGltcGxpZXMgKGRpcmVjdGlvbiA9IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Om91dCBvciBkaXJlY3Rpb24gPSBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kOjppbm91dCBvciBkaXJlY3Rpb24gPSBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kOjpyZXR1cm4pKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUGFyYW1ldGVyLW5vdF9leGNlcHRpb24iIG5hbWU9Im5vdF9leGNlcHRpb24iIGNvbnN0cmFpbmVkRWxlbWVudD0iUGFyYW1ldGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlci1ub3RfZXhjZXB0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLW5vdF9leGNlcHRpb24iPgotICAgICAgICAgIDxib2R5PkFuIGlucHV0IFBhcmFtZXRlciBjYW5ub3QgYmUgYW4gZXhjZXB0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQYXJhbWV0ZXItbm90X2V4Y2VwdGlvbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aXNFeGNlcHRpb24gaW1wbGllcyAoZGlyZWN0aW9uICZsdDs+IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Ol8naW4nIGFuZCBkaXJlY3Rpb24gJmx0Oz4gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6aW5vdXQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQYXJhbWV0ZXItY29ubmVjdG9yX2VuZCIgbmFtZT0iY29ubmVjdG9yX2VuZCIgY29uc3RyYWluZWRFbGVtZW50PSJQYXJhbWV0ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyLWNvbm5lY3Rvcl9lbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXItY29ubmVjdG9yX2VuZCI+Ci0gICAgICAgICAgPGJvZHk+QSBQYXJhbWV0ZXIgbWF5IG9ubHkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgQ29ubmVjdG9yIGVuZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSBDb2xsYWJvcmF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQYXJhbWV0ZXItY29ubmVjdG9yX2VuZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZW5kLT5ub3RFbXB0eSgpIGltcGxpZXMgY29sbGFib3JhdGlvbi0+bm90RW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUGFyYW1ldGVyLXJlZW50cmFudF9iZWhhdmlvcnMiIG5hbWU9InJlZW50cmFudF9iZWhhdmlvcnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUGFyYW1ldGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlci1yZWVudHJhbnRfYmVoYXZpb3JzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLXJlZW50cmFudF9iZWhhdmlvcnMiPgotICAgICAgICAgIDxib2R5PlJlZW50cmFudCBiZWhhdmlvcnMgY2Fubm90IGhhdmUgc3RyZWFtIFBhcmFtZXRlcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhcmFtZXRlci1yZWVudHJhbnRfYmVoYXZpb3JzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oaXNTdHJlYW0gYW5kIGJlaGF2aW9yICZsdDs+IG51bGwpIGltcGxpZXMgbm90IGJlaGF2aW9yLmlzUmVlbnRyYW50PC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQYXJhbWV0ZXItc3RyZWFtX2FuZF9leGNlcHRpb24iIG5hbWU9InN0cmVhbV9hbmRfZXhjZXB0aW9uIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBhcmFtZXRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXItc3RyZWFtX2FuZF9leGNlcHRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXItc3RyZWFtX2FuZF9leGNlcHRpb24iPgotICAgICAgICAgIDxib2R5PkEgUGFyYW1ldGVyIGNhbm5vdCBiZSBhIHN0cmVhbSBhbmQgZXhjZXB0aW9uIGF0IHRoZSBzYW1lIHRpbWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhcmFtZXRlci1zdHJlYW1fYW5kX2V4Y2VwdGlvbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bm90IChpc0V4Y2VwdGlvbiBhbmQgaXNTdHJlYW0pPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQYXJhbWV0ZXItb2JqZWN0X2VmZmVjdCIgbmFtZT0ib2JqZWN0X2VmZmVjdCIgY29uc3RyYWluZWRFbGVtZW50PSJQYXJhbWV0ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyLW9iamVjdF9lZmZlY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXItb2JqZWN0X2VmZmVjdCI+Ci0gICAgICAgICAgPGJvZHk+UGFyYW1ldGVycyB0eXBlZCBieSBEYXRhVHlwZXMgY2Fubm90IGhhdmUgYW4gZWZmZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQYXJhbWV0ZXItb2JqZWN0X2VmZmVjdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KHR5cGUub2NsSXNLaW5kT2YoRGF0YVR5cGUpKSBpbXBsaWVzIChlZmZlY3QgPSBudWxsKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJQYXJhbWV0ZXItX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik11bHRpcGxpY2l0eUVsZW1lbnQiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlBhcmFtZXRlci1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iQ29ubmVjdGFibGVFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQYXJhbWV0ZXItZGVmYXVsdCIgbmFtZT0iZGVmYXVsdCIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlci1kZWZhdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLWRlZmF1bHQiPgotICAgICAgICAgIDxib2R5PkEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIHZhbHVlIHRvIGJlIHVzZWQgd2hlbiBubyBhcmd1bWVudCBpcyBzdXBwbGllZCBmb3IgdGhlIFBhcmFtZXRlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYXJhbWV0ZXItZGVmYXVsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBhcmFtZXRlci1kZWZhdWx0VmFsdWUiIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2RlZmF1bHRWYWx1ZV9vd25pbmdQYXJhbWV0ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyLWRlZmF1bHRWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlci1kZWZhdWx0VmFsdWUiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyBhIFZhbHVlU3BlY2lmaWNhdGlvbiB0aGF0IHJlcHJlc2VudHMgYSB2YWx1ZSB0byBiZSB1c2VkIHdoZW4gbm8gYXJndW1lbnQgaXMgc3VwcGxpZWQgZm9yIHRoZSBQYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYXJhbWV0ZXItZGVmYXVsdFZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUGFyYW1ldGVyLWRpcmVjdGlvbiIgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlci1kaXJlY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXItZGlyZWN0aW9uIj4KLSAgICAgICAgICA8Ym9keT5JbmRpY2F0ZXMgd2hldGhlciBhIHBhcmFtZXRlciBpcyBiZWluZyBzZW50IGludG8gb3Igb3V0IG9mIGEgYmVoYXZpb3JhbCBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9IlBhcmFtZXRlci1kaXJlY3Rpb24tX2RlZmF1bHRWYWx1ZSIgdHlwZT0iUGFyYW1ldGVyRGlyZWN0aW9uS2luZCIgaW5zdGFuY2U9IlBhcmFtZXRlckRpcmVjdGlvbktpbmQtaW4iLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQYXJhbWV0ZXItZWZmZWN0IiBuYW1lPSJlZmZlY3QiIHR5cGU9IlBhcmFtZXRlckVmZmVjdEtpbmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyLWVmZmVjdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlci1lZmZlY3QiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB0aGUgZWZmZWN0IHRoYXQgZXhlY3V0aW9ucyBvZiB0aGUgb3duZXIgb2YgdGhlIFBhcmFtZXRlciBoYXZlIG9uIG9iamVjdHMgcGFzc2VkIGluIG9yIG91dCBvZiB0aGUgcGFyYW1ldGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFyYW1ldGVyLWVmZmVjdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBhcmFtZXRlci1pc0V4Y2VwdGlvbiIgbmFtZT0iaXNFeGNlcHRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyLWlzRXhjZXB0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLWlzRXhjZXB0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UZWxscyB3aGV0aGVyIGFuIG91dHB1dCBwYXJhbWV0ZXIgbWF5IGVtaXQgYSB2YWx1ZSB0byB0aGUgZXhjbHVzaW9uIG9mIHRoZSBvdGhlciBvdXRwdXRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IlBhcmFtZXRlci1pc0V4Y2VwdGlvbi1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUGFyYW1ldGVyLWlzU3RyZWFtIiBuYW1lPSJpc1N0cmVhbSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXItaXNTdHJlYW0tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXItaXNTdHJlYW0iPgotICAgICAgICAgIDxib2R5PlRlbGxzIHdoZXRoZXIgYW4gaW5wdXQgcGFyYW1ldGVyIG1heSBhY2NlcHQgdmFsdWVzIHdoaWxlIGl0cyBiZWhhdmlvciBpcyBleGVjdXRpbmcsIG9yIHdoZXRoZXIgYW4gb3V0cHV0IHBhcmFtZXRlciBtYXkgcG9zdCB2YWx1ZXMgd2hpbGUgdGhlIGJlaGF2aW9yIGlzIGV4ZWN1dGluZy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJQYXJhbWV0ZXItaXNTdHJlYW0tX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBhcmFtZXRlci1vcGVyYXRpb24iIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0iT3BlcmF0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9vd25lZFBhcmFtZXRlcl9vd25lckZvcm1hbFBhcmFtLW93bmVyRm9ybWFsUGFyYW0gTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfb3duZWRQYXJhbWV0ZXJfb3BlcmF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlci1vcGVyYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXItb3BlcmF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgT3BlcmF0aW9uIG93bmluZyB0aGlzIHBhcmFtZXRlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhcmFtZXRlci1vcGVyYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQYXJhbWV0ZXItcGFyYW1ldGVyU2V0IiBuYW1lPSJwYXJhbWV0ZXJTZXQiIHR5cGU9IlBhcmFtZXRlclNldCIgYXNzb2NpYXRpb249IkFfcGFyYW1ldGVyU2V0X3BhcmFtZXRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXItcGFyYW1ldGVyU2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLXBhcmFtZXRlclNldCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFBhcmFtZXRlclNldHMgY29udGFpbmluZyB0aGUgcGFyYW1ldGVyLiBTZWUgUGFyYW1ldGVyU2V0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFyYW1ldGVyLXBhcmFtZXRlclNldC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlBhcmFtZXRlci1wYXJhbWV0ZXJTZXQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFyYW1ldGVyLWlzU2V0RGVmYXVsdCIgbmFtZT0iaXNTZXREZWZhdWx0IiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYXJhbWV0ZXItaXNTZXREZWZhdWx0LV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhcmFtZXRlci1zZXRCb29sZWFuRGVmYXVsdFZhbHVlIiBuYW1lPSJzZXRCb29sZWFuRGVmYXVsdFZhbHVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlci1zZXRCb29sZWFuRGVmYXVsdFZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLXNldEJvb2xlYW5EZWZhdWx0VmFsdWUiPgotICAgICAgICAgIDxib2R5PlNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIHRvIHRoZSBzcGVjaWZpZWQgQm9vbGVhbiB2YWx1ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYXJhbWV0ZXItc2V0Qm9vbGVhbkRlZmF1bHRWYWx1ZS12YWx1ZSIgbmFtZT0idmFsdWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlci1zZXRCb29sZWFuRGVmYXVsdFZhbHVlLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLXNldEJvb2xlYW5EZWZhdWx0VmFsdWUtdmFsdWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5ldyBkZWZhdWx0IHZhbHVlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFyYW1ldGVyLXNldERlZmF1bHQiIG5hbWU9InNldERlZmF1bHQiIHZpc2liaWxpdHk9InByb3RlY3RlZCI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhcmFtZXRlci1zZXREZWZhdWx0LW5ld0RlZmF1bHQiIG5hbWU9Im5ld0RlZmF1bHQiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQYXJhbWV0ZXItc2V0SW50ZWdlckRlZmF1bHRWYWx1ZSIgbmFtZT0ic2V0SW50ZWdlckRlZmF1bHRWYWx1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXItc2V0SW50ZWdlckRlZmF1bHRWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlci1zZXRJbnRlZ2VyRGVmYXVsdFZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5TZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciB0byB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFyYW1ldGVyLXNldEludGVnZXJEZWZhdWx0VmFsdWUtdmFsdWUiIG5hbWU9InZhbHVlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXItc2V0SW50ZWdlckRlZmF1bHRWYWx1ZS12YWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlci1zZXRJbnRlZ2VyRGVmYXVsdFZhbHVlLXZhbHVlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuZXcgZGVmYXVsdCB2YWx1ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhcmFtZXRlci1zZXROdWxsRGVmYXVsdFZhbHVlIiBuYW1lPSJzZXROdWxsRGVmYXVsdFZhbHVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlci1zZXROdWxsRGVmYXVsdFZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLXNldE51bGxEZWZhdWx0VmFsdWUiPgotICAgICAgICAgIDxib2R5PlNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIHRvIHRoZSBudWxsIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFyYW1ldGVyLXNldFJlYWxEZWZhdWx0VmFsdWUiIG5hbWU9InNldFJlYWxEZWZhdWx0VmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyLXNldFJlYWxEZWZhdWx0VmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXItc2V0UmVhbERlZmF1bHRWYWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+U2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgdG8gdGhlIHNwZWNpZmllZCByZWFsIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhcmFtZXRlci1zZXRSZWFsRGVmYXVsdFZhbHVlLXZhbHVlIiBuYW1lPSJ2YWx1ZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyLXNldFJlYWxEZWZhdWx0VmFsdWUtdmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXItc2V0UmVhbERlZmF1bHRWYWx1ZS12YWx1ZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmV3IGRlZmF1bHQgdmFsdWUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQYXJhbWV0ZXItc2V0U3RyaW5nRGVmYXVsdFZhbHVlIiBuYW1lPSJzZXRTdHJpbmdEZWZhdWx0VmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyLXNldFN0cmluZ0RlZmF1bHRWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlci1zZXRTdHJpbmdEZWZhdWx0VmFsdWUiPgotICAgICAgICAgIDxib2R5PlNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhcmFtZXRlci1zZXRTdHJpbmdEZWZhdWx0VmFsdWUtdmFsdWUiIG5hbWU9InZhbHVlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXItc2V0U3RyaW5nRGVmYXVsdFZhbHVlLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLXNldFN0cmluZ0RlZmF1bHRWYWx1ZS12YWx1ZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmV3IGRlZmF1bHQgdmFsdWUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhcmFtZXRlci1zZXRVbmxpbWl0ZWROYXR1cmFsRGVmYXVsdFZhbHVlIiBuYW1lPSJzZXRVbmxpbWl0ZWROYXR1cmFsRGVmYXVsdFZhbHVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlci1zZXRVbmxpbWl0ZWROYXR1cmFsRGVmYXVsdFZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLXNldFVubGltaXRlZE5hdHVyYWxEZWZhdWx0VmFsdWUiPgotICAgICAgICAgIDxib2R5PlNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIHRvIHRoZSBzcGVjaWZpZWQgdW5saW1pdGVkIG5hdHVyYWwgdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFyYW1ldGVyLXNldFVubGltaXRlZE5hdHVyYWxEZWZhdWx0VmFsdWUtdmFsdWUiIG5hbWU9InZhbHVlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXItc2V0VW5saW1pdGVkTmF0dXJhbERlZmF1bHRWYWx1ZS12YWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlci1zZXRVbmxpbWl0ZWROYXR1cmFsRGVmYXVsdFZhbHVlLXZhbHVlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuZXcgZGVmYXVsdCB2YWx1ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhcmFtZXRlci11bnNldERlZmF1bHQiIG5hbWU9InVuc2V0RGVmYXVsdCIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIi8+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQYXJhbWV0ZXItZGVmYXVsdC4xIiBuYW1lPSJkZWZhdWx0IiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IlBhcmFtZXRlci1kZWZhdWx0LjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXItZGVmYXVsdC4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyLWRlZmF1bHQuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgUGFyYW1ldGVyOjovZGVmYXVsdDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQYXJhbWV0ZXItZGVmYXVsdC4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUGFyYW1ldGVyLWRlZmF1bHQuMSBQYXJhbWV0ZXItZGVmYXVsdCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhcmFtZXRlci1kZWZhdWx0LjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBzZWxmLnR5cGUgPSBTdHJpbmcgdGhlbiBkZWZhdWx0VmFsdWUuc3RyaW5nVmFsdWUoKSBlbHNlIG51bGwgZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhcmFtZXRlci1kZWZhdWx0LjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhcmFtZXRlci1kZWZhdWx0LjEtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYXJhbWV0ZXItZGVmYXVsdC4xLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlBhcmFtZXRlclNldCIgbmFtZT0iUGFyYW1ldGVyU2V0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXJTZXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXJTZXQiPgotICAgICAgICA8Ym9keT5BIFBhcmFtZXRlclNldCBkZXNpZ25hdGVzIGFsdGVybmF0aXZlIHNldHMgb2YgaW5wdXRzIG9yIG91dHB1dHMgdGhhdCBhIEJlaGF2aW9yIG1heSB1c2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUGFyYW1ldGVyU2V0LXNhbWVfcGFyYW1ldGVyaXplZF9lbnRpdHkiIG5hbWU9InNhbWVfcGFyYW1ldGVyaXplZF9lbnRpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iUGFyYW1ldGVyU2V0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlclNldC1zYW1lX3BhcmFtZXRlcml6ZWRfZW50aXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyU2V0LXNhbWVfcGFyYW1ldGVyaXplZF9lbnRpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBQYXJhbWV0ZXJzIGluIGEgUGFyYW1ldGVyU2V0IG11c3QgYWxsIGJlIGlucHV0cyBvciBhbGwgYmUgb3V0cHV0cyBvZiB0aGUgc2FtZSBwYXJhbWV0ZXJpemVkIGVudGl0eSwgYW5kIHRoZSBQYXJhbWV0ZXJTZXQgaXMgb3duZWQgYnkgdGhhdCBlbnRpdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhcmFtZXRlclNldC1zYW1lX3BhcmFtZXRlcml6ZWRfZW50aXR5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5wYXJhbWV0ZXItPmZvckFsbChwMSwgcDIgfCBzZWxmLm93bmVyID0gcDEub3duZXIgYW5kIHNlbGYub3duZXIgPSBwMi5vd25lciBhbmQgcDEuZGlyZWN0aW9uID0gcDIuZGlyZWN0aW9uKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUGFyYW1ldGVyU2V0LWlucHV0IiBuYW1lPSJpbnB1dCIgY29uc3RyYWluZWRFbGVtZW50PSJQYXJhbWV0ZXJTZXQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyU2V0LWlucHV0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyU2V0LWlucHV0Ij4KLSAgICAgICAgICA8Ym9keT5JZiBhIHBhcmFtZXRlcml6ZWQgZW50aXR5IGhhcyBpbnB1dCBQYXJhbWV0ZXJzIHRoYXQgYXJlIGluIGEgUGFyYW1ldGVyU2V0LCB0aGVuIGFueSBpbnB1dHMgdGhhdCBhcmUgbm90IGluIGEgUGFyYW1ldGVyU2V0IG11c3QgYmUgc3RyZWFtaW5nLiBTYW1lIGZvciBvdXRwdXQgUGFyYW1ldGVycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUGFyYW1ldGVyU2V0LWlucHV0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oKHBhcmFtZXRlci0+ZXhpc3RzKGRpcmVjdGlvbiA9IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Ol8naW4nKSkgaW1wbGllcyAmI3hEOwotICAgIGJlaGF2aW9yYWxGZWF0dXJlLm93bmVkUGFyYW1ldGVyLT5zZWxlY3QocCB8IHAuZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6XydpbicgYW5kIHAucGFyYW1ldGVyU2V0LT5pc0VtcHR5KCkpLT5mb3JBbGwoaXNTdHJlYW0pKSYjeEQ7Ci0gICAgYW5kJiN4RDsKLSgocGFyYW1ldGVyLT5leGlzdHMoZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6b3V0KSkgaW1wbGllcyAmI3hEOwotICAgIGJlaGF2aW9yYWxGZWF0dXJlLm93bmVkUGFyYW1ldGVyLT5zZWxlY3QocCB8IHAuZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6b3V0IGFuZCBwLnBhcmFtZXRlclNldC0+aXNFbXB0eSgpKS0+Zm9yQWxsKGlzU3RyZWFtKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBhcmFtZXRlclNldC10d29fcGFyYW1ldGVyX3NldHMiIG5hbWU9InR3b19wYXJhbWV0ZXJfc2V0cyIgY29uc3RyYWluZWRFbGVtZW50PSJQYXJhbWV0ZXJTZXQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyU2V0LXR3b19wYXJhbWV0ZXJfc2V0cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlclNldC10d29fcGFyYW1ldGVyX3NldHMiPgotICAgICAgICAgIDxib2R5PlR3byBQYXJhbWV0ZXJTZXRzIGNhbm5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgc2V0IG9mIFBhcmFtZXRlcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhcmFtZXRlclNldC10d29fcGFyYW1ldGVyX3NldHMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnBhcmFtZXRlci0+Zm9yQWxsKHBhcmFtZXRlclNldC0+Zm9yQWxsKHMxLCBzMiB8IHMxLT5zaXplKCkgPSBzMi0+c2l6ZSgpIGltcGxpZXMgczEucGFyYW1ldGVyLT5leGlzdHMocCB8IG5vdCBzMi5wYXJhbWV0ZXItPmluY2x1ZGVzKHApKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlBhcmFtZXRlclNldC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTmFtZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQYXJhbWV0ZXJTZXQtY29uZGl0aW9uIiBuYW1lPSJjb25kaXRpb24iIHR5cGU9IkNvbnN0cmFpbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfY29uZGl0aW9uX3BhcmFtZXRlclNldCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXJTZXQtY29uZGl0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyU2V0LWNvbmRpdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+QSBjb25zdHJhaW50IHRoYXQgc2hvdWxkIGJlIHNhdGlzZmllZCBmb3IgdGhlIG93bmVyIG9mIHRoZSBQYXJhbWV0ZXJzIGluIGFuIGlucHV0IFBhcmFtZXRlclNldCB0byBzdGFydCBleGVjdXRpb24gdXNpbmcgdGhlIHZhbHVlcyBwcm92aWRlZCBmb3IgdGhvc2UgUGFyYW1ldGVycywgb3IgdGhlIG93bmVyIG9mIHRoZSBQYXJhbWV0ZXJzIGluIGFuIG91dHB1dCBQYXJhbWV0ZXJTZXQgdG8gZW5kIGV4ZWN1dGlvbiBwcm92aWRpbmcgdGhlIHZhbHVlcyBmb3IgdGhvc2UgUGFyYW1ldGVycywgaWYgYWxsIHByZWNvbmRpdGlvbnMgYW5kIGNvbmRpdGlvbnMgb24gaW5wdXQgUGFyYW1ldGVyU2V0cyB3ZXJlIHNhdGlzZmllZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhcmFtZXRlclNldC1jb25kaXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYXJhbWV0ZXJTZXQtY29uZGl0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBhcmFtZXRlclNldC1wYXJhbWV0ZXIiIG5hbWU9InBhcmFtZXRlciIgdHlwZT0iUGFyYW1ldGVyIiBhc3NvY2lhdGlvbj0iQV9wYXJhbWV0ZXJTZXRfcGFyYW1ldGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlclNldC1wYXJhbWV0ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXJTZXQtcGFyYW1ldGVyIj4KLSAgICAgICAgICA8Ym9keT5QYXJhbWV0ZXJzIGluIHRoZSBQYXJhbWV0ZXJTZXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYXJhbWV0ZXJTZXQtcGFyYW1ldGVyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iUHJvcGVydHkiIG5hbWU9IlByb3BlcnR5Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5Ij4KLSAgICAgICAgPGJvZHk+QSBQcm9wZXJ0eSBpcyBhIFN0cnVjdHVyYWxGZWF0dXJlLiBBIFByb3BlcnR5IHJlbGF0ZWQgYnkgb3duZWRBdHRyaWJ1dGUgdG8gYSBDbGFzc2lmaWVyIChvdGhlciB0aGFuIGFuIGFzc29jaWF0aW9uKSByZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBhbmQgbWlnaHQgYWxzbyByZXByZXNlbnQgYW4gYXNzb2NpYXRpb24gZW5kLiBJdCByZWxhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBDbGFzc2lmaWVyIHRvIGEgdmFsdWUgb3Igc2V0IG9mIHZhbHVlcyBvZiB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlLiBBIFByb3BlcnR5IHJlbGF0ZWQgYnkgbWVtYmVyRW5kIHRvIGFuIEFzc29jaWF0aW9uIHJlcHJlc2VudHMgYW4gZW5kIG9mIHRoZSBBc3NvY2lhdGlvbi4gVGhlIHR5cGUgb2YgdGhlIFByb3BlcnR5IGlzIHRoZSB0eXBlIG9mIHRoZSBlbmQgb2YgdGhlIEFzc29jaWF0aW9uLiBBIFByb3BlcnR5IGhhcyB0aGUgY2FwYWJpbGl0eSBvZiBiZWluZyBhIERlcGxveW1lbnRUYXJnZXQgaW4gYSBEZXBsb3ltZW50IHJlbGF0aW9uc2hpcC4gVGhpcyBlbmFibGVzIG1vZGVsaW5nIHRoZSBkZXBsb3ltZW50IHRvIGhpZXJhcmNoaWNhbCBub2RlcyB0aGF0IGhhdmUgUHJvcGVydGllcyBmdW5jdGlvbmluZyBhcyBpbnRlcm5hbCBwYXJ0cy4gIFByb3BlcnR5IHNwZWNpYWxpemVzIFBhcmFtZXRlcmFibGVFbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhIFByb3BlcnR5IGNhbiBiZSBleHBvc2VkIGFzIGEgZm9ybWFsIHRlbXBsYXRlIHBhcmFtZXRlciwgYW5kIHByb3ZpZGVkIGFzIGFuIGFjdHVhbCBwYXJhbWV0ZXIgaW4gYSBiaW5kaW5nIG9mIGEgdGVtcGxhdGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvcGVydHktc3Vic2V0dGluZ19jb250ZXh0X2NvbmZvcm1zIiBuYW1lPSJzdWJzZXR0aW5nX2NvbnRleHRfY29uZm9ybXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUHJvcGVydHkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktc3Vic2V0dGluZ19jb250ZXh0X2NvbmZvcm1zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc3Vic2V0dGluZ19jb250ZXh0X2NvbmZvcm1zIj4KLSAgICAgICAgICA8Ym9keT5TdWJzZXR0aW5nIG1heSBvbmx5IG9jY3VyIHdoZW4gdGhlIGNvbnRleHQgb2YgdGhlIHN1YnNldHRpbmcgcHJvcGVydHkgY29uZm9ybXMgdG8gdGhlIGNvbnRleHQgb2YgdGhlIHN1YnNldHRlZCBwcm9wZXJ0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHJvcGVydHktc3Vic2V0dGluZ19jb250ZXh0X2NvbmZvcm1zLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zdWJzZXR0ZWRQcm9wZXJ0eS0+bm90RW1wdHkoKSBpbXBsaWVzCi0gIChzdWJzZXR0aW5nQ29udGV4dCgpLT5ub3RFbXB0eSgpIGFuZCBzdWJzZXR0aW5nQ29udGV4dCgpLT5mb3JBbGwgKHNjIHwKLSAgICBzdWJzZXR0ZWRQcm9wZXJ0eS0+Zm9yQWxsKHNwIHwKLSAgICAgIHNwLnN1YnNldHRpbmdDb250ZXh0KCktPmV4aXN0cyhjIHwgc2MuY29uZm9ybXNUbyhjKSkpKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlByb3BlcnR5LWRlcml2ZWRfdW5pb25faXNfcmVhZF9vbmx5IiBuYW1lPSJkZXJpdmVkX3VuaW9uX2lzX3JlYWRfb25seSIgY29uc3RyYWluZWRFbGVtZW50PSJQcm9wZXJ0eSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1kZXJpdmVkX3VuaW9uX2lzX3JlYWRfb25seS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5LWRlcml2ZWRfdW5pb25faXNfcmVhZF9vbmx5Ij4KLSAgICAgICAgICA8Ym9keT5BIGRlcml2ZWQgdW5pb24gaXMgcmVhZCBvbmx5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQcm9wZXJ0eS1kZXJpdmVkX3VuaW9uX2lzX3JlYWRfb25seS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aXNEZXJpdmVkVW5pb24gaW1wbGllcyBpc1JlYWRPbmx5PC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQcm9wZXJ0eS1tdWx0aXBsaWNpdHlfb2ZfY29tcG9zaXRlIiBuYW1lPSJtdWx0aXBsaWNpdHlfb2ZfY29tcG9zaXRlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb3BlcnR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LW11bHRpcGxpY2l0eV9vZl9jb21wb3NpdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1tdWx0aXBsaWNpdHlfb2ZfY29tcG9zaXRlIj4KLSAgICAgICAgICA8Ym9keT5BIG11bHRpcGxpY2l0eSBvbiB0aGUgY29tcG9zaW5nIGVuZCBvZiBhIGNvbXBvc2l0ZSBhZ2dyZWdhdGlvbiBtdXN0IG5vdCBoYXZlIGFuIHVwcGVyIGJvdW5kIGdyZWF0ZXIgdGhhbiAxLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQcm9wZXJ0eS1tdWx0aXBsaWNpdHlfb2ZfY29tcG9zaXRlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pc0NvbXBvc2l0ZSBhbmQgYXNzb2NpYXRpb24gJmx0Oz4gbnVsbCBpbXBsaWVzIG9wcG9zaXRlLnVwcGVyQm91bmQoKSAmbHQ7PSAxPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQcm9wZXJ0eS1yZWRlZmluZWRfcHJvcGVydHlfaW5oZXJpdGVkIiBuYW1lPSJyZWRlZmluZWRfcHJvcGVydHlfaW5oZXJpdGVkIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb3BlcnR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LXJlZGVmaW5lZF9wcm9wZXJ0eV9pbmhlcml0ZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1yZWRlZmluZWRfcHJvcGVydHlfaW5oZXJpdGVkIj4KLSAgICAgICAgICA8Ym9keT5BIHJlZGVmaW5lZCBQcm9wZXJ0eSBtdXN0IGJlIGluaGVyaXRlZCBmcm9tIGEgbW9yZSBnZW5lcmFsIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb3BlcnR5LXJlZGVmaW5lZF9wcm9wZXJ0eV9pbmhlcml0ZWQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihyZWRlZmluZWRQcm9wZXJ0eS0+bm90RW1wdHkoKSkgaW1wbGllcyYjeEQ7Ci0gIChyZWRlZmluaXRpb25Db250ZXh0LT5ub3RFbXB0eSgpIGFuZCYjeEQ7Ci0gICAgICByZWRlZmluZWRQcm9wZXJ0eS0+Zm9yQWxsKHJwfCYjeEQ7Ci0gICAgICAgICgocmVkZWZpbml0aW9uQ29udGV4dC0+Y29sbGVjdChmY3wmI3hEOwotICAgICAgICAgIGZjLmFsbFBhcmVudHMoKSkpLT5hc1NldCgpKS0+Y29sbGVjdChjfCBjLmFsbEZlYXR1cmVzKCkpLT5hc1NldCgpLT5pbmNsdWRlcyhycCkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvcGVydHktc3Vic2V0dGluZ19ydWxlcyIgbmFtZT0ic3Vic2V0dGluZ19ydWxlcyIgY29uc3RyYWluZWRFbGVtZW50PSJQcm9wZXJ0eSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1zdWJzZXR0aW5nX3J1bGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc3Vic2V0dGluZ19ydWxlcyI+Ci0gICAgICAgICAgPGJvZHk+QSBzdWJzZXR0aW5nIFByb3BlcnR5IG1heSBzdHJlbmd0aGVuIHRoZSB0eXBlIG9mIHRoZSBzdWJzZXR0ZWQgUHJvcGVydHksIGFuZCBpdHMgdXBwZXIgYm91bmQgbWF5IGJlIGxlc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb3BlcnR5LXN1YnNldHRpbmdfcnVsZXMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnN1YnNldHRlZFByb3BlcnR5LT5mb3JBbGwoc3AgfAotICBzZWxmLnR5cGUuY29uZm9ybXNUbyhzcC50eXBlKSBhbmQKLSAgICAoKHNlbGYudXBwZXJCb3VuZCgpLT5ub3RFbXB0eSgpIGFuZCBzcC51cHBlckJvdW5kKCktPm5vdEVtcHR5KCkpIGltcGxpZXMKLSAgICAgIHNlbGYudXBwZXJCb3VuZCgpICZsdDs9IHNwLnVwcGVyQm91bmQoKSApKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvcGVydHktYmluZGluZ190b19hdHRyaWJ1dGUiIG5hbWU9ImJpbmRpbmdfdG9fYXR0cmlidXRlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb3BlcnR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LWJpbmRpbmdfdG9fYXR0cmlidXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktYmluZGluZ190b19hdHRyaWJ1dGUiPgotICAgICAgICAgIDxib2R5PkEgYmluZGluZyBvZiBhIFByb3BlcnR5VGVtcGxhdGVQYXJhbWV0ZXIgcmVwcmVzZW50aW5nIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIHRvIGFuIGF0dHJpYnV0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHJvcGVydHktYmluZGluZ190b19hdHRyaWJ1dGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihzZWxmLmlzQXR0cmlidXRlKCkmI3hEOwotYW5kICh0ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi0+bm90RW1wdHkoKSkmI3hEOwotaW1wbGllcyAodGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tPmZvckFsbCh0cyB8JiN4RDsKLSAgICB0cy5mb3JtYWwub2NsSXNLaW5kT2YoUHJvcGVydHkpJiN4RDsKLSAgICBhbmQgdHMuZm9ybWFsLm9jbEFzVHlwZShQcm9wZXJ0eSkuaXNBdHRyaWJ1dGUoKSkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvcGVydHktZGVyaXZlZF91bmlvbl9pc19kZXJpdmVkIiBuYW1lPSJkZXJpdmVkX3VuaW9uX2lzX2Rlcml2ZWQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUHJvcGVydHkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktZGVyaXZlZF91bmlvbl9pc19kZXJpdmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktZGVyaXZlZF91bmlvbl9pc19kZXJpdmVkIj4KLSAgICAgICAgICA8Ym9keT5BIGRlcml2ZWQgdW5pb24gaXMgZGVyaXZlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHJvcGVydHktZGVyaXZlZF91bmlvbl9pc19kZXJpdmVkLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pc0Rlcml2ZWRVbmlvbiBpbXBsaWVzIGlzRGVyaXZlZDwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvcGVydHktZGVwbG95bWVudF90YXJnZXQiIG5hbWU9ImRlcGxveW1lbnRfdGFyZ2V0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb3BlcnR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LWRlcGxveW1lbnRfdGFyZ2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktZGVwbG95bWVudF90YXJnZXQiPgotICAgICAgICAgIDxib2R5PkEgUHJvcGVydHkgY2FuIGJlIGEgRGVwbG95bWVudFRhcmdldCBpZiBpdCBpcyBhIGtpbmQgb2YgTm9kZSBhbmQgZnVuY3Rpb25zIGFzIGEgcGFydCBpbiB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIGFuIGVuY29tcGFzc2luZyBOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQcm9wZXJ0eS1kZXBsb3ltZW50X3RhcmdldC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZGVwbG95bWVudC0+bm90RW1wdHkoKSBpbXBsaWVzIG93bmVyLm9jbElzS2luZE9mKE5vZGUpIGFuZCBOb2RlLmFsbEluc3RhbmNlcygpLT5leGlzdHMobiB8IG4ucGFydC0+ZXhpc3RzKHAgfCBwID0gc2VsZikpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQcm9wZXJ0eS1zdWJzZXR0ZWRfcHJvcGVydHlfbmFtZXMiIG5hbWU9InN1YnNldHRlZF9wcm9wZXJ0eV9uYW1lcyIgY29uc3RyYWluZWRFbGVtZW50PSJQcm9wZXJ0eSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1zdWJzZXR0ZWRfcHJvcGVydHlfbmFtZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1zdWJzZXR0ZWRfcHJvcGVydHlfbmFtZXMiPgotICAgICAgICAgIDxib2R5PkEgUHJvcGVydHkgbWF5IG5vdCBzdWJzZXQgYSBQcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb3BlcnR5LXN1YnNldHRlZF9wcm9wZXJ0eV9uYW1lcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c3Vic2V0dGVkUHJvcGVydHktPmZvckFsbChzcCB8IHNwLm5hbWUgJmx0Oz4gbmFtZSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlByb3BlcnR5LXR5cGVfb2Zfb3Bwb3NpdGVfZW5kIiBuYW1lPSJ0eXBlX29mX29wcG9zaXRlX2VuZCIgY29uc3RyYWluZWRFbGVtZW50PSJQcm9wZXJ0eSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS10eXBlX29mX29wcG9zaXRlX2VuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5LXR5cGVfb2Zfb3Bwb3NpdGVfZW5kIj4KLSAgICAgICAgICA8Ym9keT5JZiBhIFByb3BlcnR5IGlzIGEgY2xhc3NpZmllci1vd25lZCBlbmQgb2YgYSBiaW5hcnkgQXNzb2NpYXRpb24sIGl0cyBvd25lciBtdXN0IGJlIHRoZSB0eXBlIG9mIHRoZSBvcHBvc2l0ZSBlbmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb3BlcnR5LXR5cGVfb2Zfb3Bwb3NpdGVfZW5kLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4ob3Bwb3NpdGUtPm5vdEVtcHR5KCkgYW5kIG93bmluZ0Fzc29jaWF0aW9uLT5pc0VtcHR5KCkpIGltcGxpZXMgY2xhc3NpZmllciA9IG9wcG9zaXRlLnR5cGU8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlByb3BlcnR5LXF1YWxpZmllZF9pc19hc3NvY2lhdGlvbl9lbmQiIG5hbWU9InF1YWxpZmllZF9pc19hc3NvY2lhdGlvbl9lbmQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUHJvcGVydHkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktcXVhbGlmaWVkX2lzX2Fzc29jaWF0aW9uX2VuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5LXF1YWxpZmllZF9pc19hc3NvY2lhdGlvbl9lbmQiPgotICAgICAgICAgIDxib2R5PkFsbCBxdWFsaWZpZWQgUHJvcGVydGllcyBtdXN0IGJlIEFzc29jaWF0aW9uIGVuZHM8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHJvcGVydHktcXVhbGlmaWVkX2lzX2Fzc29jaWF0aW9uX2VuZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cXVhbGlmaWVyLT5ub3RFbXB0eSgpIGltcGxpZXMgYXNzb2NpYXRpb24tPm5vdEVtcHR5KCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUHJvcGVydHktX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkNvbm5lY3RhYmxlRWxlbWVudCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUHJvcGVydHktX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IkRlcGxveW1lbnRUYXJnZXQiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlByb3BlcnR5LV9nZW5lcmFsaXphdGlvbi4yIiBnZW5lcmFsPSJTdHJ1Y3R1cmFsRmVhdHVyZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUHJvcGVydHktZGVmYXVsdCIgbmFtZT0iZGVmYXVsdCIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcm9wZXJ0eS1kZWZhdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUHJvcGVydHktYWdncmVnYXRpb24iIG5hbWU9ImFnZ3JlZ2F0aW9uIiB0eXBlPSJBZ2dyZWdhdGlvbktpbmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktYWdncmVnYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1hZ2dyZWdhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBraW5kIG9mIGFnZ3JlZ2F0aW9uIHRoYXQgYXBwbGllcyB0byB0aGUgUHJvcGVydHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iUHJvcGVydHktYWdncmVnYXRpb24tX2RlZmF1bHRWYWx1ZSIgdHlwZT0iQWdncmVnYXRpb25LaW5kIiBpbnN0YW5jZT0iQWdncmVnYXRpb25LaW5kLW5vbmUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQcm9wZXJ0eS1hc3NvY2lhdGlvbiIgbmFtZT0iYXNzb2NpYXRpb24iIHR5cGU9IkFzc29jaWF0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9tZW1iZXJfbWVtYmVyTmFtZXNwYWNlLW1lbWJlck5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfbWVtYmVyRW5kX2Fzc29jaWF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LWFzc29jaWF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktYXNzb2NpYXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBBc3NvY2lhdGlvbiBvZiB3aGljaCB0aGlzIFByb3BlcnR5IGlzIGEgbWVtYmVyLCBpZiBhbnkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcm9wZXJ0eS1hc3NvY2lhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb3BlcnR5LWFzc29jaWF0aW9uRW5kIiBuYW1lPSJhc3NvY2lhdGlvbkVuZCIgdHlwZT0iUHJvcGVydHkiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9xdWFsaWZpZXJfYXNzb2NpYXRpb25FbmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktYXNzb2NpYXRpb25FbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1hc3NvY2lhdGlvbkVuZCI+Ci0gICAgICAgICAgPGJvZHk+RGVzaWduYXRlcyB0aGUgb3B0aW9uYWwgYXNzb2NpYXRpb24gZW5kIHRoYXQgb3ducyBhIHF1YWxpZmllciBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcm9wZXJ0eS1hc3NvY2lhdGlvbkVuZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb3BlcnR5LWNsYXNzIiBuYW1lPSJjbGFzcyIgdHlwZT0iQ2xhc3MiIHN1YnNldHRlZFByb3BlcnR5PSJBX2F0dHJpYnV0ZV9jbGFzc2lmaWVyLWNsYXNzaWZpZXIgQV9vd25lZEF0dHJpYnV0ZV9zdHJ1Y3R1cmVkQ2xhc3NpZmllci1zdHJ1Y3R1cmVkQ2xhc3NpZmllciBOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIEZlYXR1cmUtZmVhdHVyaW5nQ2xhc3NpZmllciBSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbml0aW9uQ29udGV4dCIgYXNzb2NpYXRpb249IkFfb3duZWRBdHRyaWJ1dGVfY2xhc3MiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktY2xhc3MtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1jbGFzcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIENsYXNzIHRoYXQgb3ducyB0aGlzIFByb3BlcnR5LCBpZiBhbnkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcm9wZXJ0eS1jbGFzcy1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb3BlcnR5LWRhdGF0eXBlIiBuYW1lPSJkYXRhdHlwZSIgdHlwZT0iRGF0YVR5cGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX2F0dHJpYnV0ZV9jbGFzc2lmaWVyLWNsYXNzaWZpZXIgTmFtZWRFbGVtZW50LW5hbWVzcGFjZSBGZWF0dXJlLWZlYXR1cmluZ0NsYXNzaWZpZXIgUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5pdGlvbkNvbnRleHQiIGFzc29jaWF0aW9uPSJBX293bmVkQXR0cmlidXRlX2RhdGF0eXBlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LWRhdGF0eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktZGF0YXR5cGUiPgotICAgICAgICAgIDxib2R5PlRoZSBEYXRhVHlwZSB0aGF0IG93bnMgdGhpcyBQcm9wZXJ0eSwgaWYgYW55LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvcGVydHktZGF0YXR5cGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQcm9wZXJ0eS1kZWZhdWx0VmFsdWUiIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2RlZmF1bHRWYWx1ZV9vd25pbmdQcm9wZXJ0eSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1kZWZhdWx0VmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1kZWZhdWx0VmFsdWUiPgotICAgICAgICAgIDxib2R5PkEgVmFsdWVTcGVjaWZpY2F0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIHRvIGdpdmUgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgUHJvcGVydHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgb3duaW5nIENsYXNzaWZpZXIgaXMgaW5zdGFudGlhdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvcGVydHktZGVmYXVsdFZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUHJvcGVydHktaW50ZXJmYWNlIiBuYW1lPSJpbnRlcmZhY2UiIHR5cGU9IkludGVyZmFjZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfYXR0cmlidXRlX2NsYXNzaWZpZXItY2xhc3NpZmllciBOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIEZlYXR1cmUtZmVhdHVyaW5nQ2xhc3NpZmllciBSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbml0aW9uQ29udGV4dCIgYXNzb2NpYXRpb249IkFfb3duZWRBdHRyaWJ1dGVfaW50ZXJmYWNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LWludGVyZmFjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5LWludGVyZmFjZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyZmFjZSB0aGF0IG93bnMgdGhpcyBQcm9wZXJ0eSwgaWYgYW55LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvcGVydHktaW50ZXJmYWNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUHJvcGVydHktaXNDb21wb3NpdGUiIG5hbWU9ImlzQ29tcG9zaXRlIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktaXNDb21wb3NpdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1pc0NvbXBvc2l0ZSI+Ci0gICAgICAgICAgPGJvZHk+SWYgaXNDb21wb3NpdGUgaXMgdHJ1ZSwgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGUgaXMgYSBjb250YWluZXIgZm9yIHRoZSBvYmplY3Qgb3IgdmFsdWUgY29udGFpbmVkIGluIHRoZSBhdHRyaWJ1dGUuIFRoaXMgaXMgYSBkZXJpdmVkIHZhbHVlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGFnZ3JlZ2F0aW9uIG9mIHRoZSBQcm9wZXJ0eSBpcyBjb21wb3NpdGUgb3Igbm90LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IlByb3BlcnR5LWlzQ29tcG9zaXRlLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQcm9wZXJ0eS1pc0Rlcml2ZWQiIG5hbWU9ImlzRGVyaXZlZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1pc0Rlcml2ZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1pc0Rlcml2ZWQiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB3aGV0aGVyIHRoZSBQcm9wZXJ0eSBpcyBkZXJpdmVkLCBpLmUuLCB3aGV0aGVyIGl0cyB2YWx1ZSBvciB2YWx1ZXMgY2FuIGJlIGNvbXB1dGVkIGZyb20gb3RoZXIgaW5mb3JtYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iUHJvcGVydHktaXNEZXJpdmVkLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQcm9wZXJ0eS1pc0Rlcml2ZWRVbmlvbiIgbmFtZT0iaXNEZXJpdmVkVW5pb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktaXNEZXJpdmVkVW5pb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1pc0Rlcml2ZWRVbmlvbiI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIGRlcml2ZWQgYXMgdGhlIHVuaW9uIG9mIGFsbCBvZiB0aGUgUHJvcGVydGllcyB0aGF0IGFyZSBjb25zdHJhaW5lZCB0byBzdWJzZXQgaXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iUHJvcGVydHktaXNEZXJpdmVkVW5pb24tX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb3BlcnR5LWlzSUQiIG5hbWU9ImlzSUQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktaXNJRC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5LWlzSUQiPgotICAgICAgICAgIDxib2R5PlRydWUgaW5kaWNhdGVzIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRhaW5pbmcgQ2xhc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iUHJvcGVydHktaXNJRC1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUHJvcGVydHktb3Bwb3NpdGUiIG5hbWU9Im9wcG9zaXRlIiB0eXBlPSJQcm9wZXJ0eSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9vcHBvc2l0ZV9wcm9wZXJ0eSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1vcHBvc2l0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5LW9wcG9zaXRlIj4KLSAgICAgICAgICA8Ym9keT5JbiB0aGUgY2FzZSB3aGVyZSB0aGUgUHJvcGVydHkgaXMgb25lIGVuZCBvZiBhIGJpbmFyeSBhc3NvY2lhdGlvbiB0aGlzIGdpdmVzIHRoZSBvdGhlciBlbmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcm9wZXJ0eS1vcHBvc2l0ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb3BlcnR5LW93bmluZ0Fzc29jaWF0aW9uIiBuYW1lPSJvd25pbmdBc3NvY2lhdGlvbiIgdHlwZT0iQXNzb2NpYXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJGZWF0dXJlLWZlYXR1cmluZ0NsYXNzaWZpZXIgTmFtZWRFbGVtZW50LW5hbWVzcGFjZSBQcm9wZXJ0eS1hc3NvY2lhdGlvbiBSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbml0aW9uQ29udGV4dCIgYXNzb2NpYXRpb249IkFfb3duZWRFbmRfb3duaW5nQXNzb2NpYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktb3duaW5nQXNzb2NpYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1vd25pbmdBc3NvY2lhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG93bmluZyBhc3NvY2lhdGlvbiBvZiB0aGlzIHByb3BlcnR5LCBpZiBhbnkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcm9wZXJ0eS1vd25pbmdBc3NvY2lhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb3BlcnR5LXF1YWxpZmllciIgbmFtZT0icXVhbGlmaWVyIiB0eXBlPSJQcm9wZXJ0eSIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3F1YWxpZmllcl9hc3NvY2lhdGlvbkVuZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1xdWFsaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1xdWFsaWZpZXIiPgotICAgICAgICAgIDxib2R5PkFuIG9wdGlvbmFsIGxpc3Qgb2Ygb3JkZXJlZCBxdWFsaWZpZXIgYXR0cmlidXRlcyBmb3IgdGhlIGVuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb3BlcnR5LXF1YWxpZmllci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlByb3BlcnR5LXF1YWxpZmllci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQcm9wZXJ0eS1yZWRlZmluZWRQcm9wZXJ0eSIgbmFtZT0icmVkZWZpbmVkUHJvcGVydHkiIHR5cGU9IlByb3BlcnR5IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5lZFByb3BlcnR5X3Byb3BlcnR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LXJlZGVmaW5lZFByb3BlcnR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktcmVkZWZpbmVkUHJvcGVydHkiPgotICAgICAgICAgIDxib2R5PlRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlZGVmaW5lZCBieSB0aGlzIHByb3BlcnR5LCBpZiBhbnkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcm9wZXJ0eS1yZWRlZmluZWRQcm9wZXJ0eS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlByb3BlcnR5LXJlZGVmaW5lZFByb3BlcnR5LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb3BlcnR5LXN1YnNldHRlZFByb3BlcnR5IiBuYW1lPSJzdWJzZXR0ZWRQcm9wZXJ0eSIgdHlwZT0iUHJvcGVydHkiIGFzc29jaWF0aW9uPSJBX3N1YnNldHRlZFByb3BlcnR5X3Byb3BlcnR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LXN1YnNldHRlZFByb3BlcnR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc3Vic2V0dGVkUHJvcGVydHkiPgotICAgICAgICAgIDxib2R5PlRoZSBwcm9wZXJ0aWVzIG9mIHdoaWNoIHRoaXMgUHJvcGVydHkgaXMgY29uc3RyYWluZWQgdG8gYmUgYSBzdWJzZXQsIGlmIGFueS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb3BlcnR5LXN1YnNldHRlZFByb3BlcnR5LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUHJvcGVydHktc3Vic2V0dGVkUHJvcGVydHktX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUHJvcGVydHktZ2V0RGVmYXVsdCIgbmFtZT0iZ2V0RGVmYXVsdCIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1nZXREZWZhdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktZ2V0RGVmYXVsdCI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHByb3BlcnR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb3BlcnR5LWdldERlZmF1bHQtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb3BlcnR5LWdldERlZmF1bHQtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcm9wZXJ0eS1nZXREZWZhdWx0LXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9wZXJ0eS1nZXRPdGhlckVuZCIgbmFtZT0iZ2V0T3RoZXJFbmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktZ2V0T3RoZXJFbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1nZXRPdGhlckVuZCI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBvdGhlciBlbmQgb2YgdGhlIChiaW5hcnkpIGFzc29jaWF0aW9uIGluIHdoaWNoIHRoaXMgcHJvcGVydHkgaXMgYSBtZW1iZXIgZW5kLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb3BlcnR5LWdldE90aGVyRW5kLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJQcm9wZXJ0eSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvcGVydHktZ2V0T3RoZXJFbmQtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlByb3BlcnR5LWdldE90aGVyRW5kLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb3BlcnR5LWlzU2V0RGVmYXVsdCIgbmFtZT0iaXNTZXREZWZhdWx0IiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9wZXJ0eS1pc1NldERlZmF1bHQtX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUHJvcGVydHktc2V0Qm9vbGVhbkRlZmF1bHRWYWx1ZSIgbmFtZT0ic2V0Qm9vbGVhbkRlZmF1bHRWYWx1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1zZXRCb29sZWFuRGVmYXVsdFZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc2V0Qm9vbGVhbkRlZmF1bHRWYWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+U2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSB0byB0aGUgc3BlY2lmaWVkIEJvb2xlYW4gdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJvcGVydHktc2V0Qm9vbGVhbkRlZmF1bHRWYWx1ZS12YWx1ZSIgbmFtZT0idmFsdWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LXNldEJvb2xlYW5EZWZhdWx0VmFsdWUtdmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1zZXRCb29sZWFuRGVmYXVsdFZhbHVlLXZhbHVlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuZXcgZGVmYXVsdCB2YWx1ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb3BlcnR5LXNldERlZmF1bHQiIG5hbWU9InNldERlZmF1bHQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktc2V0RGVmYXVsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5LXNldERlZmF1bHQiPgotICAgICAgICAgIDxib2R5PlNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBzdHJpbmcgcmVwcmVzZW50YXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJvcGVydHktc2V0RGVmYXVsdC1uZXdEZWZhdWx0IiBuYW1lPSJuZXdEZWZhdWx0IiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1zZXREZWZhdWx0LW5ld0RlZmF1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1zZXREZWZhdWx0LW5ld0RlZmF1bHQiPgotICAgICAgICAgICAgPGJvZHk+QSBzdHJpbmcgcmVwZXNlbnRhdGlvbiBvZiB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb3BlcnR5LXNldEludGVnZXJEZWZhdWx0VmFsdWUiIG5hbWU9InNldEludGVnZXJEZWZhdWx0VmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktc2V0SW50ZWdlckRlZmF1bHRWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5LXNldEludGVnZXJEZWZhdWx0VmFsdWUiPgotICAgICAgICAgIDxib2R5PlNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgdG8gdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb3BlcnR5LXNldEludGVnZXJEZWZhdWx0VmFsdWUtdmFsdWUiIG5hbWU9InZhbHVlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1zZXRJbnRlZ2VyRGVmYXVsdFZhbHVlLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc2V0SW50ZWdlckRlZmF1bHRWYWx1ZS12YWx1ZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmV3IGRlZmF1bHQgdmFsdWUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9wZXJ0eS1zZXRJc0NvbXBvc2l0ZSIgbmFtZT0ic2V0SXNDb21wb3NpdGUiIHZpc2liaWxpdHk9InByb3RlY3RlZCI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb3BlcnR5LXNldElzQ29tcG9zaXRlLW5ld0lzQ29tcG9zaXRlIiBuYW1lPSJuZXdJc0NvbXBvc2l0ZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUHJvcGVydHktc2V0SXNOYXZpZ2FibGUiIG5hbWU9InNldElzTmF2aWdhYmxlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LXNldElzTmF2aWdhYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc2V0SXNOYXZpZ2FibGUiPgotICAgICAgICAgIDxib2R5PlNldHMgdGhlIG5hdmlnYWJpbGl0eSBvZiB0aGlzIHByb3BlcnR5IGFzIGluZGljYXRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9wZXJ0eS1zZXRJc05hdmlnYWJsZS1pc05hdmlnYWJsZSIgbmFtZT0iaXNOYXZpZ2FibGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LXNldElzTmF2aWdhYmxlLWlzTmF2aWdhYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc2V0SXNOYXZpZ2FibGUtaXNOYXZpZ2FibGUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5ldyBuYXZpZ2FiaWxpdHkuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9wZXJ0eS1zZXROdWxsRGVmYXVsdFZhbHVlIiBuYW1lPSJzZXROdWxsRGVmYXVsdFZhbHVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3BlcnR5LXNldE51bGxEZWZhdWx0VmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1zZXROdWxsRGVmYXVsdFZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5TZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHByb3BlcnR5IHRvIHRoZSBudWxsIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUHJvcGVydHktc2V0T3Bwb3NpdGUiIG5hbWU9InNldE9wcG9zaXRlIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9wZXJ0eS1zZXRPcHBvc2l0ZS1uZXdPcHBvc2l0ZSIgbmFtZT0ibmV3T3Bwb3NpdGUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgdHlwZT0iUHJvcGVydHkiIGVmZmVjdD0icmVhZCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb3BlcnR5LXNldFJlYWxEZWZhdWx0VmFsdWUiIG5hbWU9InNldFJlYWxEZWZhdWx0VmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktc2V0UmVhbERlZmF1bHRWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5LXNldFJlYWxEZWZhdWx0VmFsdWUiPgotICAgICAgICAgIDxib2R5PlNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgdG8gdGhlIHNwZWNpZmllZCByZWFsIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb3BlcnR5LXNldFJlYWxEZWZhdWx0VmFsdWUtdmFsdWUiIG5hbWU9InZhbHVlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1zZXRSZWFsRGVmYXVsdFZhbHVlLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc2V0UmVhbERlZmF1bHRWYWx1ZS12YWx1ZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmV3IGRlZmF1bHQgdmFsdWUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9wZXJ0eS1zZXRTdHJpbmdEZWZhdWx0VmFsdWUiIG5hbWU9InNldFN0cmluZ0RlZmF1bHRWYWx1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1zZXRTdHJpbmdEZWZhdWx0VmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1zZXRTdHJpbmdEZWZhdWx0VmFsdWUiPgotICAgICAgICAgIDxib2R5PlNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJvcGVydHktc2V0U3RyaW5nRGVmYXVsdFZhbHVlLXZhbHVlIiBuYW1lPSJ2YWx1ZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktc2V0U3RyaW5nRGVmYXVsdFZhbHVlLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc2V0U3RyaW5nRGVmYXVsdFZhbHVlLXZhbHVlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuZXcgZGVmYXVsdCB2YWx1ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUHJvcGVydHktc2V0VW5saW1pdGVkTmF0dXJhbERlZmF1bHRWYWx1ZSIgbmFtZT0ic2V0VW5saW1pdGVkTmF0dXJhbERlZmF1bHRWYWx1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1zZXRVbmxpbWl0ZWROYXR1cmFsRGVmYXVsdFZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc2V0VW5saW1pdGVkTmF0dXJhbERlZmF1bHRWYWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+U2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSB0byB0aGUgc3BlY2lmaWVkIHVubGltaXRlZCBuYXR1cmFsIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb3BlcnR5LXNldFVubGltaXRlZE5hdHVyYWxEZWZhdWx0VmFsdWUtdmFsdWUiIG5hbWU9InZhbHVlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1zZXRVbmxpbWl0ZWROYXR1cmFsRGVmYXVsdFZhbHVlLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktc2V0VW5saW1pdGVkTmF0dXJhbERlZmF1bHRWYWx1ZS12YWx1ZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmV3IGRlZmF1bHQgdmFsdWUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9wZXJ0eS11bnNldERlZmF1bHQiIG5hbWU9InVuc2V0RGVmYXVsdCIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIi8+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9wZXJ0eS1pc0F0dHJpYnV0ZSIgbmFtZT0iaXNBdHRyaWJ1dGUiIGJvZHlDb25kaXRpb249IlByb3BlcnR5LWlzQXR0cmlidXRlLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktaXNBdHRyaWJ1dGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1pc0F0dHJpYnV0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzQXR0cmlidXRlKCkgaXMgdHJ1ZSBpZiB0aGUgUHJvcGVydHkgaXMgZGVmaW5lZCBhcyBhbiBhdHRyaWJ1dGUgb2Ygc29tZSBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQcm9wZXJ0eS1pc0F0dHJpYnV0ZS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb3BlcnR5LWlzQXR0cmlidXRlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHJvcGVydHktaXNBdHRyaWJ1dGUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChub3QgY2xhc3NpZmllci0+aXNFbXB0eSgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9wZXJ0eS1pc0F0dHJpYnV0ZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9wZXJ0eS1pc0NvbXBhdGlibGVXaXRoIiBuYW1lPSJpc0NvbXBhdGlibGVXaXRoIiBib2R5Q29uZGl0aW9uPSJQcm9wZXJ0eS1pc0NvbXBhdGlibGVXaXRoLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtaXNDb21wYXRpYmxlV2l0aCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1pc0NvbXBhdGlibGVXaXRoLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktaXNDb21wYXRpYmxlV2l0aCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzQ29tcGF0aWJsZVdpdGgoKSBkZXRlcm1pbmVzIGlmIHRoaXMgUHJvcGVydHkgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgUGFyYW1ldGVyYWJsZUVsZW1lbnQuIFRoaXMgUHJvcGVydHkgaXMgY29tcGF0aWJsZSB3aXRoIFBhcmFtZXRlcmFibGVFbGVtZW50IHAgaWYgdGhlIGtpbmQgb2YgdGhpcyBQcm9wZXJ0eSBpcyB0aGVzYW1lIGFzIG9yIGEgc3VidHlwZSBvZiB0aGUga2luZCBvZiBwLiBGdXJ0aGVyLCBpZiBwIGlzIGEgVHlwZWRFbGVtZW50LCB0aGVuIHRoZSB0eXBlIG9mIHRoaXMgUHJvcGVydHkgbXVzdCBiZSBjb25mb3JtYW50IHdpdGggdGhlIHR5cGUgb2YgcC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvcGVydHktaXNDb21wYXRpYmxlV2l0aC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb3BlcnR5LWlzQ29tcGF0aWJsZVdpdGgiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQcm9wZXJ0eS1pc0NvbXBhdGlibGVXaXRoLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc2VsZi5vY2xJc0tpbmRPZihwLm9jbFR5cGUoKSkgYW5kIChwLm9jbElzS2luZE9mKFR5cGVkRWxlbWVudCkgaW1wbGllcyYjeEQ7Ci1zZWxmLnR5cGUuY29uZm9ybXNUbyhwLm9jbEFzVHlwZShUeXBlZEVsZW1lbnQpLnR5cGUpKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJvcGVydHktaXNDb21wYXRpYmxlV2l0aC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJvcGVydHktaXNDb21wYXRpYmxlV2l0aC1wIiBuYW1lPSJwIiB0eXBlPSJQYXJhbWV0ZXJhYmxlRWxlbWVudCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb3BlcnR5LWlzQ29tcG9zaXRlLjEiIG5hbWU9ImlzQ29tcG9zaXRlIiBib2R5Q29uZGl0aW9uPSJQcm9wZXJ0eS1pc0NvbXBvc2l0ZS4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktaXNDb21wb3NpdGUuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3BlcnR5LWlzQ29tcG9zaXRlLjEiPgotICAgICAgICAgIDxib2R5PlRoZSB2YWx1ZSBvZiBpc0NvbXBvc2l0ZSBpcyB0cnVlIG9ubHkgaWYgYWdncmVnYXRpb24gaXMgY29tcG9zaXRlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQcm9wZXJ0eS1pc0NvbXBvc2l0ZS4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUHJvcGVydHktaXNDb21wb3NpdGUuMSBQcm9wZXJ0eS1pc0NvbXBvc2l0ZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb3BlcnR5LWlzQ29tcG9zaXRlLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChhZ2dyZWdhdGlvbiA9IEFnZ3JlZ2F0aW9uS2luZDo6Y29tcG9zaXRlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9wZXJ0eS1pc0NvbXBvc2l0ZS4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb3BlcnR5LWlzQ29uc2lzdGVudFdpdGgiIG5hbWU9ImlzQ29uc2lzdGVudFdpdGgiIGJvZHlDb25kaXRpb249IlByb3BlcnR5LWlzQ29uc2lzdGVudFdpdGgtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcHJlY29uZGl0aW9uPSJQcm9wZXJ0eS1pc0NvbnNpc3RlbnRXaXRoLXByZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJSZWRlZmluYWJsZUVsZW1lbnQtaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1pc0NvbnNpc3RlbnRXaXRoLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzQ29uc2lzdGVudFdpdGgoKSBzcGVjaWZpZXMsIGZvciBhbnkgdHdvIFByb3BlcnRpZXMgaW4gYSBjb250ZXh0IGluIHdoaWNoIHJlZGVmaW5pdGlvbiBpcyBwb3NzaWJsZSwgd2hldGhlciByZWRlZmluaXRpb24gd291bGQgYmUgbG9naWNhbGx5IGNvbnNpc3RlbnQuIEEgcmVkZWZpbmluZyBQcm9wZXJ0eSBpcyBjb25zaXN0ZW50IHdpdGggYSByZWRlZmluZWQgUHJvcGVydHkgaWYgdGhlIHR5cGUgb2YgdGhlIHJlZGVmaW5pbmcgUHJvcGVydHkgY29uZm9ybXMgdG8gdGhlIHR5cGUgb2YgdGhlIHJlZGVmaW5lZCBQcm9wZXJ0eSwgYW5kIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJlZGVmaW5pbmcgUHJvcGVydHkgKGlmIHNwZWNpZmllZCkgaXMgY29udGFpbmVkIGluIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJlZGVmaW5lZCBQcm9wZXJ0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvcGVydHktaXNDb25zaXN0ZW50V2l0aC1wcmUiIG5hbWU9InByZSIgY29uc3RyYWluZWRFbGVtZW50PSJQcm9wZXJ0eS1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHJvcGVydHktaXNDb25zaXN0ZW50V2l0aC1wcmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZWRlZmluaW5nRWxlbWVudC5pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZChzZWxmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvcGVydHktaXNDb25zaXN0ZW50V2l0aC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb3BlcnR5LWlzQ29uc2lzdGVudFdpdGgiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQcm9wZXJ0eS1pc0NvbnNpc3RlbnRXaXRoLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAocmVkZWZpbmluZ0VsZW1lbnQub2NsSXNLaW5kT2YoUHJvcGVydHkpIGFuZCAKLSAgbGV0IHByb3AgOiBQcm9wZXJ0eSA9IHJlZGVmaW5pbmdFbGVtZW50Lm9jbEFzVHlwZShQcm9wZXJ0eSkgaW4gCi0gIChwcm9wLnR5cGUuY29uZm9ybXNUbyhzZWxmLnR5cGUpIGFuZCAKLSAgKChwcm9wLmxvd2VyQm91bmQoKS0+bm90RW1wdHkoKSBhbmQgc2VsZi5sb3dlckJvdW5kKCktPm5vdEVtcHR5KCkpIGltcGxpZXMgcHJvcC5sb3dlckJvdW5kKCkgPj0gc2VsZi5sb3dlckJvdW5kKCkpIGFuZCAKLSAgKChwcm9wLnVwcGVyQm91bmQoKS0+bm90RW1wdHkoKSBhbmQgc2VsZi51cHBlckJvdW5kKCktPm5vdEVtcHR5KCkpIGltcGxpZXMgcHJvcC5sb3dlckJvdW5kKCkgJmx0Oz0gc2VsZi5sb3dlckJvdW5kKCkpIGFuZCAKLSAgKHNlbGYuaXNDb21wb3NpdGUgaW1wbGllcyBwcm9wLmlzQ29tcG9zaXRlKSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb3BlcnR5LWlzQ29uc2lzdGVudFdpdGgtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb3BlcnR5LWlzQ29uc2lzdGVudFdpdGgtcmVkZWZpbmluZ0VsZW1lbnQiIG5hbWU9InJlZGVmaW5pbmdFbGVtZW50IiB0eXBlPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9wZXJ0eS1pc05hdmlnYWJsZSIgbmFtZT0iaXNOYXZpZ2FibGUiIGJvZHlDb25kaXRpb249IlByb3BlcnR5LWlzTmF2aWdhYmxlLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktaXNOYXZpZ2FibGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1pc05hdmlnYWJsZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzTmF2aWdhYmxlKCkgaW5kaWNhdGVzIHdoZXRoZXIgaXQgaXMgcG9zc2libGUgdG8gbmF2aWdhdGUgYWNyb3NzIHRoZSBwcm9wZXJ0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvcGVydHktaXNOYXZpZ2FibGUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJQcm9wZXJ0eS1pc05hdmlnYWJsZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb3BlcnR5LWlzTmF2aWdhYmxlLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobm90IGNsYXNzaWZpZXItPmlzRW1wdHkoKSBvciBhc3NvY2lhdGlvbi5uYXZpZ2FibGVPd25lZEVuZC0+aW5jbHVkZXMoc2VsZikpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb3BlcnR5LWlzTmF2aWdhYmxlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb3BlcnR5LW9wcG9zaXRlLjEiIG5hbWU9Im9wcG9zaXRlIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IlByb3BlcnR5LW9wcG9zaXRlLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9wZXJ0eS1vcHBvc2l0ZS4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvcGVydHktb3Bwb3NpdGUuMSI+Ci0gICAgICAgICAgPGJvZHk+SWYgdGhpcyBwcm9wZXJ0eSBpcyBhIG1lbWJlckVuZCBvZiBhIGJpbmFyeSBhc3NvY2lhdGlvbiwgdGhlbiBvcHBvc2l0ZSBnaXZlcyB0aGUgb3RoZXIgZW5kLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQcm9wZXJ0eS1vcHBvc2l0ZS4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUHJvcGVydHktb3Bwb3NpdGUuMSBQcm9wZXJ0eS1vcHBvc2l0ZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb3BlcnR5LW9wcG9zaXRlLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBhc3NvY2lhdGlvbiAmbHQ7PiBudWxsIGFuZCBhc3NvY2lhdGlvbi5tZW1iZXJFbmQtPnNpemUoKSA9IDIKLXRoZW4KLSAgICBhc3NvY2lhdGlvbi5tZW1iZXJFbmQtPmFueShlIHwgZSAmbHQ7PiBzZWxmKQotZWxzZQotICAgIG51bGwKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9wZXJ0eS1vcHBvc2l0ZS4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQcm9wZXJ0eSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvcGVydHktb3Bwb3NpdGUuMS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9wZXJ0eS1zdWJzZXR0aW5nQ29udGV4dCIgbmFtZT0ic3Vic2V0dGluZ0NvbnRleHQiIGJvZHlDb25kaXRpb249IlByb3BlcnR5LXN1YnNldHRpbmdDb250ZXh0LXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvcGVydHktc3Vic2V0dGluZ0NvbnRleHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9wZXJ0eS1zdWJzZXR0aW5nQ29udGV4dCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IHN1YnNldHRpbmdDb250ZXh0KCkgZ2l2ZXMgdGhlIGNvbnRleHQgZm9yIHN1YnNldHRpbmcgYSBQcm9wZXJ0eS4gSXQgY29uc2lzdHMsIGluIHRoZSBjYXNlIG9mIGFuIGF0dHJpYnV0ZSwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgQ2xhc3NpZmllciwgYW5kIGluIHRoZSBjYXNlIG9mIGFuIGFzc29jaWF0aW9uIGVuZCwgYWxsIG9mIHRoZSBDbGFzc2lmaWVycyBhdCB0aGUgb3RoZXIgZW5kcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvcGVydHktc3Vic2V0dGluZ0NvbnRleHQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJQcm9wZXJ0eS1zdWJzZXR0aW5nQ29udGV4dCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb3BlcnR5LXN1YnNldHRpbmdDb250ZXh0LXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgYXNzb2NpYXRpb24gJmx0Oz4gbnVsbAotdGhlbiBhc3NvY2lhdGlvbi5tZW1iZXJFbmQtPmV4Y2x1ZGluZyhzZWxmKS0+Y29sbGVjdCh0eXBlKS0+YXNTZXQoKQotZWxzZSAKLSAgaWYgY2xhc3NpZmllciZsdDs+bnVsbAotICB0aGVuIGNsYXNzaWZpZXItPmFzU2V0KCkKLSAgZWxzZSBTZXR7fSAKLSAgZW5kaWYKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9wZXJ0eS1zdWJzZXR0aW5nQ29udGV4dC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iVHlwZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvcGVydHktc3Vic2V0dGluZ0NvbnRleHQtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcm9wZXJ0eS1zdWJzZXR0aW5nQ29udGV4dC1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJSZWRlZmluYWJsZUVsZW1lbnQiIG5hbWU9IlJlZGVmaW5hYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVkZWZpbmFibGVFbGVtZW50Ij4KLSAgICAgICAgPGJvZHk+QSBSZWRlZmluYWJsZUVsZW1lbnQgaXMgYW4gZWxlbWVudCB0aGF0LCB3aGVuIGRlZmluZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBDbGFzc2lmaWVyLCBjYW4gYmUgcmVkZWZpbmVkIG1vcmUgc3BlY2lmaWNhbGx5IG9yIGRpZmZlcmVudGx5IGluIHRoZSBjb250ZXh0IG9mIGFub3RoZXIgQ2xhc3NpZmllciB0aGF0IHNwZWNpYWxpemVzIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB0aGUgY29udGV4dCBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25fY29uc2lzdGVudCIgbmFtZT0icmVkZWZpbml0aW9uX2NvbnNpc3RlbnQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVkZWZpbmFibGVFbGVtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25fY29uc2lzdGVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25fY29uc2lzdGVudCI+Ci0gICAgICAgICAgPGJvZHk+QSByZWRlZmluaW5nIGVsZW1lbnQgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggZWFjaCByZWRlZmluZWQgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5pdGlvbl9jb25zaXN0ZW50LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5yZWRlZmluZWRFbGVtZW50LT5mb3JBbGwocmUgfCByZS5pc0NvbnNpc3RlbnRXaXRoKHNlbGYpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LW5vbl9sZWFmX3JlZGVmaW5pdGlvbiIgbmFtZT0ibm9uX2xlYWZfcmVkZWZpbml0aW9uIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZGVmaW5hYmxlRWxlbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWRlZmluYWJsZUVsZW1lbnQtbm9uX2xlYWZfcmVkZWZpbml0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVkZWZpbmFibGVFbGVtZW50LW5vbl9sZWFmX3JlZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+QSBSZWRlZmluYWJsZUVsZW1lbnQgY2FuIG9ubHkgcmVkZWZpbmUgbm9uLWxlYWYgUmVkZWZpbmFibGVFbGVtZW50cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LW5vbl9sZWFmX3JlZGVmaW5pdGlvbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVkZWZpbmVkRWxlbWVudC0+Zm9yQWxsKHJlIHwgbm90IHJlLmlzTGVhZik8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25fY29udGV4dF92YWxpZCIgbmFtZT0icmVkZWZpbml0aW9uX2NvbnRleHRfdmFsaWQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVkZWZpbmFibGVFbGVtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25fY29udGV4dF92YWxpZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25fY29udGV4dF92YWxpZCI+Ci0gICAgICAgICAgPGJvZHk+QXQgbGVhc3Qgb25lIG9mIHRoZSByZWRlZmluaXRpb24gY29udGV4dHMgb2YgdGhlIHJlZGVmaW5pbmcgZWxlbWVudCBtdXN0IGJlIGEgc3BlY2lhbGl6YXRpb24gb2YgYXQgbGVhc3Qgb25lIG9mIHRoZSByZWRlZmluaXRpb24gY29udGV4dHMgZm9yIGVhY2ggcmVkZWZpbmVkIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25fY29udGV4dF92YWxpZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVkZWZpbmVkRWxlbWVudC0+Zm9yQWxsKHJlIHwgc2VsZi5pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZChyZSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTmFtZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZWRlZmluYWJsZUVsZW1lbnQtaXNMZWFmIiBuYW1lPSJpc0xlYWYiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzTGVhZi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZGVmaW5hYmxlRWxlbWVudC1pc0xlYWYiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvIGZ1cnRoZXIgcmVkZWZpbmUgYSBSZWRlZmluYWJsZUVsZW1lbnQuIElmIHRoZSB2YWx1ZSBpcyB0cnVlLCB0aGVuIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBmdXJ0aGVyIHJlZGVmaW5lIHRoZSBSZWRlZmluYWJsZUVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzTGVhZi1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5lZEVsZW1lbnQiIG5hbWU9InJlZGVmaW5lZEVsZW1lbnQiIHR5cGU9IlJlZGVmaW5hYmxlRWxlbWVudCIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBpc0Rlcml2ZWRVbmlvbj0idHJ1ZSIgYXNzb2NpYXRpb249IkFfcmVkZWZpbmVkRWxlbWVudF9yZWRlZmluYWJsZUVsZW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5lZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmVkRWxlbWVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFJlZGVmaW5hYmxlRWxlbWVudCB0aGF0IGlzIGJlaW5nIHJlZGVmaW5lZCBieSB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmVkRWxlbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluZWRFbGVtZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25Db250ZXh0IiBuYW1lPSJyZWRlZmluaXRpb25Db250ZXh0IiB0eXBlPSJDbGFzc2lmaWVyIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGlzRGVyaXZlZFVuaW9uPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluaXRpb25Db250ZXh0X3JlZGVmaW5hYmxlRWxlbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbml0aW9uQ29udGV4dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25Db250ZXh0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgY29udGV4dHMgdGhhdCB0aGlzIGVsZW1lbnQgbWF5IGJlIHJlZGVmaW5lZCBmcm9tLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5pdGlvbkNvbnRleHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbml0aW9uQ29udGV4dC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJSZWRlZmluYWJsZUVsZW1lbnQtaXNDb25zaXN0ZW50V2l0aCIgbmFtZT0iaXNDb25zaXN0ZW50V2l0aCIgYm9keUNvbmRpdGlvbj0iUmVkZWZpbmFibGVFbGVtZW50LWlzQ29uc2lzdGVudFdpdGgtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcHJlY29uZGl0aW9uPSJSZWRlZmluYWJsZUVsZW1lbnQtaXNDb25zaXN0ZW50V2l0aC1wcmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzQ29uc2lzdGVudFdpdGgtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWRlZmluYWJsZUVsZW1lbnQtaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzQ29uc2lzdGVudFdpdGgoKSBzcGVjaWZpZXMsIGZvciBhbnkgdHdvIFJlZGVmaW5hYmxlRWxlbWVudHMgaW4gYSBjb250ZXh0IGluIHdoaWNoIHJlZGVmaW5pdGlvbiBpcyBwb3NzaWJsZSwgd2hldGhlciByZWRlZmluaXRpb24gd291bGQgYmUgbG9naWNhbGx5IGNvbnNpc3RlbnQuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgZmFsc2U7IHRoaXMgb3BlcmF0aW9uIG11c3QgYmUgb3ZlcnJpZGRlbiBmb3Igc3ViY2xhc3NlcyBvZiBSZWRlZmluYWJsZUVsZW1lbnQgdG8gZGVmaW5lIHRoZSBjb25zaXN0ZW5jeSBjb25kaXRpb25zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWRlZmluYWJsZUVsZW1lbnQtaXNDb25zaXN0ZW50V2l0aC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZGVmaW5hYmxlRWxlbWVudC1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzQ29uc2lzdGVudFdpdGgtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChmYWxzZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1pc0NvbnNpc3RlbnRXaXRoLXByZSIgbmFtZT0icHJlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZGVmaW5hYmxlRWxlbWVudC1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzQ29uc2lzdGVudFdpdGgtcHJlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVkZWZpbmluZ0VsZW1lbnQuaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQoc2VsZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzQ29uc2lzdGVudFdpdGgtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1pc0NvbnNpc3RlbnRXaXRoLXJlZGVmaW5pbmdFbGVtZW50IiBuYW1lPSJyZWRlZmluaW5nRWxlbWVudCIgdHlwZT0iUmVkZWZpbmFibGVFbGVtZW50Ii8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkIiBuYW1lPSJpc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZCIgYm9keUNvbmRpdGlvbj0iUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQoKSBzcGVjaWZpZXMgd2hldGhlciB0aGUgcmVkZWZpbml0aW9uIGNvbnRleHRzIG9mIHRoaXMgUmVkZWZpbmFibGVFbGVtZW50IGFyZSBwcm9wZXJseSByZWxhdGVkIHRvIHRoZSByZWRlZmluaXRpb24gY29udGV4dHMgb2YgdGhlIHNwZWNpZmllZCBSZWRlZmluYWJsZUVsZW1lbnQgdG8gYWxsb3cgdGhpcyBlbGVtZW50IHRvIHJlZGVmaW5lIHRoZSBvdGhlci4gQnkgZGVmYXVsdCBhdCBsZWFzdCBvbmUgb2YgdGhlIHJlZGVmaW5pdGlvbiBjb250ZXh0cyBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBhIHNwZWNpYWxpemF0aW9uIG9mIGF0IGxlYXN0IG9uZSBvZiB0aGUgcmVkZWZpbml0aW9uIGNvbnRleHRzIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAocmVkZWZpbml0aW9uQ29udGV4dC0+ZXhpc3RzKGMgfCBjLmFsbFBhcmVudHMoKS0+aW5jbHVkZXNBbGwocmVkZWZpbmVkRWxlbWVudC5yZWRlZmluaXRpb25Db250ZXh0KSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlJlZGVmaW5hYmxlRWxlbWVudC1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLXJlZGVmaW5lZEVsZW1lbnQiIG5hbWU9InJlZGVmaW5lZEVsZW1lbnQiIHR5cGU9IlJlZGVmaW5hYmxlRWxlbWVudCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgbmFtZT0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiPgotICAgICAgICA8Ym9keT5BIFJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUgc3VwcG9ydHMgdGhlIGFkZGl0aW9uIG9mIGZvcm1hbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGluIGEgc3BlY2lhbGl6YXRpb24gb2YgYSB0ZW1wbGF0ZSBjbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtcmVkZWZpbmVzX3BhcmVudHMiIG5hbWU9InJlZGVmaW5lc19wYXJlbnRzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1yZWRlZmluZXNfcGFyZW50cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtcmVkZWZpbmVzX3BhcmVudHMiPgotICAgICAgICAgIDxib2R5PklmIGFueSBvZiB0aGUgcGFyZW50IENsYXNzaWZpZXJzIGFyZSBhIHRlbXBsYXRlLCB0aGVuIHRoZSBleHRlbmRlZFNpZ25hdHVyZSBtdXN0IGluY2x1ZGUgdGhlIHNpZ25hdHVyZSBvZiB0aGF0IENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtcmVkZWZpbmVzX3BhcmVudHMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmNsYXNzaWZpZXIuYWxsUGFyZW50cygpLT5mb3JBbGwoYyB8IGMub3duZWRUZW1wbGF0ZVNpZ25hdHVyZS0+bm90RW1wdHkoKSBpbXBsaWVzIHNlbGYtPmNsb3N1cmUoZXh0ZW5kZWRTaWduYXR1cmUpLT5pbmNsdWRlcyhjLm93bmVkVGVtcGxhdGVTaWduYXR1cmUpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IlRlbXBsYXRlU2lnbmF0dXJlIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWNsYXNzaWZpZXIiIG5hbWU9ImNsYXNzaWZpZXIiIHR5cGU9IkNsYXNzaWZpZXIiIHJlZGVmaW5lZFByb3BlcnR5PSJUZW1wbGF0ZVNpZ25hdHVyZS10ZW1wbGF0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25Db250ZXh0IiBhc3NvY2lhdGlvbj0iQV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlX2NsYXNzaWZpZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1jbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1jbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQ2xhc3NpZmllciB0aGF0IG93bnMgdGhpcyBSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1leHRlbmRlZFNpZ25hdHVyZSIgbmFtZT0iZXh0ZW5kZWRTaWduYXR1cmUiIHR5cGU9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiIHN1YnNldHRlZFByb3BlcnR5PSJSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfZXh0ZW5kZWRTaWduYXR1cmVfcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWV4dGVuZGVkU2lnbmF0dXJlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1leHRlbmRlZFNpZ25hdHVyZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNpZ25hdHVyZXMgZXh0ZW5kZWQgYnkgdGhpcyBSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1leHRlbmRlZFNpZ25hdHVyZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtZXh0ZW5kZWRTaWduYXR1cmUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1pbmhlcml0ZWRQYXJhbWV0ZXIiIG5hbWU9ImluaGVyaXRlZFBhcmFtZXRlciIgdHlwZT0iVGVtcGxhdGVQYXJhbWV0ZXIiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IlRlbXBsYXRlU2lnbmF0dXJlLXBhcmFtZXRlciIgYXNzb2NpYXRpb249IkFfaW5oZXJpdGVkUGFyYW1ldGVyX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1pbmhlcml0ZWRQYXJhbWV0ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWluaGVyaXRlZFBhcmFtZXRlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGZvcm1hbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIG9mIHRoZSBleHRlbmRlZCBzaWduYXR1cmVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1pbmhlcml0ZWRQYXJhbWV0ZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWluaGVyaXRlZFBhcmFtZXRlci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWluaGVyaXRlZFBhcmFtZXRlci4xIiBuYW1lPSJpbmhlcml0ZWRQYXJhbWV0ZXIiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1pbmhlcml0ZWRQYXJhbWV0ZXIuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaW5oZXJpdGVkUGFyYW1ldGVyLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWluaGVyaXRlZFBhcmFtZXRlci4xIj4KLSAgICAgICAgICA8Ym9keT5EZXJpdmF0aW9uIGZvciBSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlOjovaW5oZXJpdGVkUGFyYW1ldGVyPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaW5oZXJpdGVkUGFyYW1ldGVyLjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWluaGVyaXRlZFBhcmFtZXRlci4xIFJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaW5oZXJpdGVkUGFyYW1ldGVyIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1pbmhlcml0ZWRQYXJhbWV0ZXIuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIGV4dGVuZGVkU2lnbmF0dXJlLT5pc0VtcHR5KCkgdGhlbiBTZXR7fSBlbHNlIGV4dGVuZGVkU2lnbmF0dXJlLnBhcmFtZXRlci0+YXNTZXQoKSBlbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1pbmhlcml0ZWRQYXJhbWV0ZXIuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iVGVtcGxhdGVQYXJhbWV0ZXIiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaW5oZXJpdGVkUGFyYW1ldGVyLjEtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWluaGVyaXRlZFBhcmFtZXRlci4xLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWlzQ29uc2lzdGVudFdpdGgiIG5hbWU9ImlzQ29uc2lzdGVudFdpdGgiIGJvZHlDb25kaXRpb249IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaXNDb25zaXN0ZW50V2l0aC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiBwcmVjb25kaXRpb249IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaXNDb25zaXN0ZW50V2l0aC1wcmUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iUmVkZWZpbmFibGVFbGVtZW50LWlzQ29uc2lzdGVudFdpdGgiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1pc0NvbnNpc3RlbnRXaXRoLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNDb25zaXN0ZW50V2l0aCgpIHNwZWNpZmllcywgZm9yIGFueSB0d28gUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZXMgaW4gYSBjb250ZXh0IGluIHdoaWNoIHJlZGVmaW5pdGlvbiBpcyBwb3NzaWJsZSwgd2hldGhlciByZWRlZmluaXRpb24gd291bGQgYmUgbG9naWNhbGx5IGNvbnNpc3RlbnQuIEEgcmVkZWZpbmluZyB0ZW1wbGF0ZSBzaWduYXR1cmUgaXMgYWx3YXlzIGNvbnNpc3RlbnQgd2l0aCBhIHJlZGVmaW5lZCB0ZW1wbGF0ZSBzaWduYXR1cmUsIGFzIHJlZGVmaW5pdGlvbiBvbmx5IGFkZHMgbmV3IGZvcm1hbCBwYXJhbWV0ZXJzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWlzQ29uc2lzdGVudFdpdGgtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWlzQ29uc2lzdGVudFdpdGgiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWlzQ29uc2lzdGVudFdpdGgtc3BlYy1zcGVjIiBuYW1lPSJzcGVjIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHJlZGVmaW5pbmdFbGVtZW50Lm9jbElzS2luZE9mKFJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1pc0NvbnNpc3RlbnRXaXRoLXByZSIgbmFtZT0icHJlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaXNDb25zaXN0ZW50V2l0aC1wcmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZWRlZmluaW5nRWxlbWVudC5pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZChzZWxmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLWlzQ29uc2lzdGVudFdpdGgtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaXNDb25zaXN0ZW50V2l0aC1yZWRlZmluaW5nRWxlbWVudCIgbmFtZT0icmVkZWZpbmluZ0VsZW1lbnQiIHR5cGU9IlJlZGVmaW5hYmxlRWxlbWVudCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iU2xvdCIgbmFtZT0iU2xvdCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2xvdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNsb3QiPgotICAgICAgICA8Ym9keT5BIFNsb3QgZGVzaWduYXRlcyB0aGF0IGFuIGVudGl0eSBtb2RlbGVkIGJ5IGFuIEluc3RhbmNlU3BlY2lmaWNhdGlvbiBoYXMgYSB2YWx1ZSBvciB2YWx1ZXMgZm9yIGEgc3BlY2lmaWMgU3RydWN0dXJhbEZlYXR1cmUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJTbG90LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTbG90LWRlZmluaW5nRmVhdHVyZSIgbmFtZT0iZGVmaW5pbmdGZWF0dXJlIiB0eXBlPSJTdHJ1Y3R1cmFsRmVhdHVyZSIgYXNzb2NpYXRpb249IkFfZGVmaW5pbmdGZWF0dXJlX3Nsb3QiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2xvdC1kZWZpbmluZ0ZlYXR1cmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTbG90LWRlZmluaW5nRmVhdHVyZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFN0cnVjdHVyYWxGZWF0dXJlIHRoYXQgc3BlY2lmaWVzIHRoZSB2YWx1ZXMgdGhhdCBtYXkgYmUgaGVsZCBieSB0aGUgU2xvdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlNsb3Qtb3duaW5nSW5zdGFuY2UiIG5hbWU9Im93bmluZ0luc3RhbmNlIiB0eXBlPSJJbnN0YW5jZVNwZWNpZmljYXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9zbG90X293bmluZ0luc3RhbmNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNsb3Qtb3duaW5nSW5zdGFuY2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTbG90LW93bmluZ0luc3RhbmNlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgSW5zdGFuY2VTcGVjaWZpY2F0aW9uIHRoYXQgb3ducyB0aGlzIFNsb3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTbG90LXZhbHVlIiBuYW1lPSJ2YWx1ZSIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfdmFsdWVfb3duaW5nU2xvdCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTbG90LXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU2xvdC12YWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHZhbHVlIG9yIHZhbHVlcyBoZWxkIGJ5IHRoZSBTbG90LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU2xvdC12YWx1ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlNsb3QtdmFsdWUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJTdHJ1Y3R1cmFsRmVhdHVyZSIgbmFtZT0iU3RydWN0dXJhbEZlYXR1cmUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyYWxGZWF0dXJlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJhbEZlYXR1cmUiPgotICAgICAgICA8Ym9keT5BIFN0cnVjdHVyYWxGZWF0dXJlIGlzIGEgdHlwZWQgZmVhdHVyZSBvZiBhIENsYXNzaWZpZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHN0cnVjdHVyZSBvZiBpbnN0YW5jZXMgb2YgdGhlIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJTdHJ1Y3R1cmFsRmVhdHVyZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTXVsdGlwbGljaXR5RWxlbWVudCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmUtX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IlR5cGVkRWxlbWVudCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmUtX2dlbmVyYWxpemF0aW9uLjIiIGdlbmVyYWw9IkZlYXR1cmUiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0cnVjdHVyYWxGZWF0dXJlLWlzUmVhZE9ubHkiIG5hbWU9ImlzUmVhZE9ubHkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJhbEZlYXR1cmUtaXNSZWFkT25seS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyYWxGZWF0dXJlLWlzUmVhZE9ubHkiPgotICAgICAgICAgIDxib2R5PklmIGlzUmVhZE9ubHkgaXMgdHJ1ZSwgdGhlIFN0cnVjdHVyYWxGZWF0dXJlIG1heSBub3QgYmUgd3JpdHRlbiB0byBhZnRlciBpbml0aWFsaXphdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJTdHJ1Y3R1cmFsRmVhdHVyZS1pc1JlYWRPbmx5LV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9IkFnZ3JlZ2F0aW9uS2luZCIgbmFtZT0iQWdncmVnYXRpb25LaW5kIiB2aXNpYmlsaXR5PSJwcml2YXRlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBZ2dyZWdhdGlvbktpbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBZ2dyZWdhdGlvbktpbmQiPgotICAgICAgICA8Ym9keT5BZ2dyZWdhdGlvbktpbmQgaXMgYW4gRW51bWVyYXRpb24gZm9yIHNwZWNpZnlpbmcgdGhlIGtpbmQgb2YgYWdncmVnYXRpb24gb2YgYSBQcm9wZXJ0eS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJBZ2dyZWdhdGlvbktpbmQtbm9uZSIgbmFtZT0ibm9uZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBZ2dyZWdhdGlvbktpbmQtbm9uZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFnZ3JlZ2F0aW9uS2luZC1ub25lIj4KLSAgICAgICAgICA8Ym9keT5JbmRpY2F0ZXMgdGhhdCB0aGUgUHJvcGVydHkgaGFzIG5vIGFnZ3JlZ2F0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJBZ2dyZWdhdGlvbktpbmQtc2hhcmVkIiBuYW1lPSJzaGFyZWQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWdncmVnYXRpb25LaW5kLXNoYXJlZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFnZ3JlZ2F0aW9uS2luZC1zaGFyZWQiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB0aGF0IHRoZSBQcm9wZXJ0eSBoYXMgc2hhcmVkIGFnZ3JlZ2F0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJBZ2dyZWdhdGlvbktpbmQtY29tcG9zaXRlIiBuYW1lPSJjb21wb3NpdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWdncmVnYXRpb25LaW5kLWNvbXBvc2l0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFnZ3JlZ2F0aW9uS2luZC1jb21wb3NpdGUiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB0aGF0IHRoZSBQcm9wZXJ0eSBpcyBhZ2dyZWdhdGVkIGNvbXBvc2l0ZWx5LCBpLmUuLCB0aGUgY29tcG9zaXRlIG9iamVjdCBoYXMgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBleGlzdGVuY2UgYW5kIHN0b3JhZ2Ugb2YgdGhlIGNvbXBvc2VkIG9iamVjdHMgKHBhcnRzKS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9IkNhbGxDb25jdXJyZW5jeUtpbmQiIG5hbWU9IkNhbGxDb25jdXJyZW5jeUtpbmQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNhbGxDb25jdXJyZW5jeUtpbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDYWxsQ29uY3VycmVuY3lLaW5kIj4KLSAgICAgICAgPGJvZHk+Q2FsbENvbmN1cnJlbmN5S2luZCBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIHRvIHNwZWNpZnkgdGhlIHNlbWFudGljcyBvZiBjb25jdXJyZW50IGNhbGxzIHRvIGEgQmVoYXZpb3JhbEZlYXR1cmUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iQ2FsbENvbmN1cnJlbmN5S2luZC1zZXF1ZW50aWFsIiBuYW1lPSJzZXF1ZW50aWFsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNhbGxDb25jdXJyZW5jeUtpbmQtc2VxdWVudGlhbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNhbGxDb25jdXJyZW5jeUtpbmQtc2VxdWVudGlhbCI+Ci0gICAgICAgICAgPGJvZHk+Tm8gY29uY3VycmVuY3kgbWFuYWdlbWVudCBtZWNoYW5pc20gaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBCZWhhdmlvcmFsRmVhdHVyZSBhbmQsIHRoZXJlZm9yZSwgY29uY3VycmVuY3kgY29uZmxpY3RzIG1heSBvY2N1ci4gSW5zdGFuY2VzIHRoYXQgaW52b2tlIGEgQmVoYXZpb3JhbEZlYXR1cmUgbmVlZCB0byBjb29yZGluYXRlIHNvIHRoYXQgb25seSBvbmUgaW52b2NhdGlvbiB0byBhIHRhcmdldCBvbiBhbnkgQmVoYXZpb3JhbEZlYXR1cmUgb2NjdXJzIGF0IG9uY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkNhbGxDb25jdXJyZW5jeUtpbmQtZ3VhcmRlZCIgbmFtZT0iZ3VhcmRlZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDYWxsQ29uY3VycmVuY3lLaW5kLWd1YXJkZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDYWxsQ29uY3VycmVuY3lLaW5kLWd1YXJkZWQiPgotICAgICAgICAgIDxib2R5Pk11bHRpcGxlIGludm9jYXRpb25zIG9mIGEgQmVoYXZpb3JhbEZlYXR1cmUgdGhhdCBvdmVybGFwIGluIHRpbWUgbWF5IG9jY3VyIHRvIG9uZSBpbnN0YW5jZSwgYnV0IG9ubHkgb25lIGlzIGFsbG93ZWQgdG8gY29tbWVuY2UuIFRoZSBvdGhlcnMgYXJlIGJsb2NrZWQgdW50aWwgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIEJlaGF2aW9yYWxGZWF0dXJlIGlzIGNvbXBsZXRlLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHN5c3RlbSBkZXNpZ25lciB0byBlbnN1cmUgdGhhdCBkZWFkbG9ja3MgZG8gbm90IG9jY3VyIGR1ZSB0byBzaW11bHRhbmVvdXMgYmxvY2tpbmcuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkNhbGxDb25jdXJyZW5jeUtpbmQtY29uY3VycmVudCIgbmFtZT0iY29uY3VycmVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDYWxsQ29uY3VycmVuY3lLaW5kLWNvbmN1cnJlbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDYWxsQ29uY3VycmVuY3lLaW5kLWNvbmN1cnJlbnQiPgotICAgICAgICAgIDxib2R5Pk11bHRpcGxlIGludm9jYXRpb25zIG9mIGEgQmVoYXZpb3JhbEZlYXR1cmUgdGhhdCBvdmVybGFwIGluIHRpbWUgbWF5IG9jY3VyIHRvIG9uZSBpbnN0YW5jZSBhbmQgYWxsIG9mIHRoZW0gbWF5IHByb2NlZWQgY29uY3VycmVudGx5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iUGFyYW1ldGVyRGlyZWN0aW9uS2luZCIgbmFtZT0iUGFyYW1ldGVyRGlyZWN0aW9uS2luZCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyRGlyZWN0aW9uS2luZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlckRpcmVjdGlvbktpbmQiPgotICAgICAgICA8Ym9keT5QYXJhbWV0ZXJEaXJlY3Rpb25LaW5kIGlzIGFuIEVudW1lcmF0aW9uIHRoYXQgZGVmaW5lcyBsaXRlcmFscyB1c2VkIHRvIHNwZWNpZnkgZGlyZWN0aW9uIG9mIHBhcmFtZXRlcnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iUGFyYW1ldGVyRGlyZWN0aW9uS2luZC1pbiIgbmFtZT0iaW4iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyRGlyZWN0aW9uS2luZC1pbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlckRpcmVjdGlvbktpbmQtaW4iPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB0aGF0IFBhcmFtZXRlciB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBieSB0aGUgY2FsbGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kLWlub3V0IiBuYW1lPSJpbm91dCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kLWlub3V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyRGlyZWN0aW9uS2luZC1pbm91dCI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIHRoYXQgUGFyYW1ldGVyIHZhbHVlcyBhcmUgcGFzc2VkIGluIGJ5IHRoZSBjYWxsZXIgYW5kIChwb3NzaWJseSBkaWZmZXJlbnQpIHZhbHVlcyBwYXNzZWQgb3V0IHRvIHRoZSBjYWxsZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IlBhcmFtZXRlckRpcmVjdGlvbktpbmQtb3V0IiBuYW1lPSJvdXQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyRGlyZWN0aW9uS2luZC1vdXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kLW91dCI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIHRoYXQgUGFyYW1ldGVyIHZhbHVlcyBhcmUgcGFzc2VkIG91dCB0byB0aGUgY2FsbGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kLXJldHVybiIgbmFtZT0icmV0dXJuIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlckRpcmVjdGlvbktpbmQtcmV0dXJuLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyRGlyZWN0aW9uS2luZC1yZXR1cm4iPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB0aGF0IFBhcmFtZXRlciB2YWx1ZXMgYXJlIHBhc3NlZCBhcyByZXR1cm4gdmFsdWVzIGJhY2sgdG8gdGhlIGNhbGxlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9IlBhcmFtZXRlckVmZmVjdEtpbmQiIG5hbWU9IlBhcmFtZXRlckVmZmVjdEtpbmQiIHZpc2liaWxpdHk9InByaXZhdGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlckVmZmVjdEtpbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXJFZmZlY3RLaW5kIj4KLSAgICAgICAgPGJvZHk+UGFyYW1ldGVyRWZmZWN0S2luZCBpcyBhbiBFbnVtZXJhdGlvbiB0aGF0IGluZGljYXRlcyB0aGUgZWZmZWN0IG9mIGEgQmVoYXZpb3Igb24gdmFsdWVzIHBhc3NlZCBpbiBvciBvdXQgb2YgaXRzIHBhcmFtZXRlcnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iUGFyYW1ldGVyRWZmZWN0S2luZC1jcmVhdGUiIG5hbWU9ImNyZWF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXJFZmZlY3RLaW5kLWNyZWF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhcmFtZXRlckVmZmVjdEtpbmQtY3JlYXRlIj4KLSAgICAgICAgICA8Ym9keT5JbmRpY2F0ZXMgdGhhdCB0aGUgYmVoYXZpb3IgY3JlYXRlcyB2YWx1ZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IlBhcmFtZXRlckVmZmVjdEtpbmQtcmVhZCIgbmFtZT0icmVhZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXJFZmZlY3RLaW5kLXJlYWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXJFZmZlY3RLaW5kLXJlYWQiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyBvYmplY3RzIHRoYXQgYXJlIHZhbHVlcyBvZiB0aGUgcGFyYW1ldGVyIGhhdmUgdmFsdWVzIG9mIHRoZWlyIHByb3BlcnRpZXMsIG9yIGxpbmtzIGluIHdoaWNoIHRoZXkgcGFydGljaXBhdGUsIG9yIHRoZWlyIGNsYXNzaWZpZXJzIHJldHJpZXZlZCBkdXJpbmcgZXhlY3V0aW9ucyBvZiB0aGUgYmVoYXZpb3IuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IlBhcmFtZXRlckVmZmVjdEtpbmQtdXBkYXRlIiBuYW1lPSJ1cGRhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyRWZmZWN0S2luZC11cGRhdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXJFZmZlY3RLaW5kLXVwZGF0ZSI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIG9iamVjdHMgdGhhdCBhcmUgdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXIgaGF2ZSB2YWx1ZXMgb2YgdGhlaXIgcHJvcGVydGllcywgb3IgbGlua3MgaW4gd2hpY2ggdGhleSBwYXJ0aWNpcGF0ZSwgb3IgdGhlaXIgY2xhc3NpZmljYXRpb24gY2hhbmdlZCBkdXJpbmcgZXhlY3V0aW9ucyBvZiB0aGUgYmVoYXZpb3IuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IlBhcmFtZXRlckVmZmVjdEtpbmQtZGVsZXRlIiBuYW1lPSJkZWxldGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyRWZmZWN0S2luZC1kZWxldGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXJFZmZlY3RLaW5kLWRlbGV0ZSI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIG9iamVjdHMgdGhhdCBhcmUgdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGFmdGVyIGV4ZWN1dGlvbnMgb2YgdGhlIGJlaGF2aW9yIGFyZSBmaW5pc2hlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZGVmaW5pbmdGZWF0dXJlX3Nsb3QiIG5hbWU9IkFfZGVmaW5pbmdGZWF0dXJlX3Nsb3QiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU2xvdC1kZWZpbmluZ0ZlYXR1cmUgQV9kZWZpbmluZ0ZlYXR1cmVfc2xvdC1zbG90Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZGVmaW5pbmdGZWF0dXJlX3Nsb3Qtc2xvdCIgbmFtZT0ic2xvdCIgdHlwZT0iU2xvdCIgYXNzb2NpYXRpb249IkFfZGVmaW5pbmdGZWF0dXJlX3Nsb3QiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZGVmaW5pbmdGZWF0dXJlX3Nsb3Qtc2xvdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfZGVmaW5pbmdGZWF0dXJlX3Nsb3Qtc2xvdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdmFsdWVfb3duaW5nU2xvdCIgbmFtZT0iQV92YWx1ZV9vd25pbmdTbG90IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlNsb3QtdmFsdWUgQV92YWx1ZV9vd25pbmdTbG90LW93bmluZ1Nsb3QiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV92YWx1ZV9vd25pbmdTbG90LW93bmluZ1Nsb3QiIG5hbWU9Im93bmluZ1Nsb3QiIHR5cGU9IlNsb3QiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV92YWx1ZV9vd25pbmdTbG90Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3ZhbHVlX293bmluZ1Nsb3Qtb3duaW5nU2xvdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9leHRlbmRlZFNpZ25hdHVyZV9yZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlIiBuYW1lPSJBX2V4dGVuZGVkU2lnbmF0dXJlX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1leHRlbmRlZFNpZ25hdHVyZSBBX2V4dGVuZGVkU2lnbmF0dXJlX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2V4dGVuZGVkU2lnbmF0dXJlX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgbmFtZT0icmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgdHlwZT0iUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfcmVkZWZpbmVkRWxlbWVudF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9leHRlbmRlZFNpZ25hdHVyZV9yZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2V4dGVuZGVkU2lnbmF0dXJlX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfZXh0ZW5kZWRTaWduYXR1cmVfcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1yZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9pbmhlcml0ZWRQYXJhbWV0ZXJfcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgbmFtZT0iQV9pbmhlcml0ZWRQYXJhbWV0ZXJfcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtaW5oZXJpdGVkUGFyYW1ldGVyIEFfaW5oZXJpdGVkUGFyYW1ldGVyX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2luaGVyaXRlZFBhcmFtZXRlcl9yZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlLXJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiIG5hbWU9InJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiIHR5cGU9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3BhcmFtZXRlcl90ZW1wbGF0ZVNpZ25hdHVyZS10ZW1wbGF0ZVNpZ25hdHVyZSIgYXNzb2NpYXRpb249IkFfaW5oZXJpdGVkUGFyYW1ldGVyX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfaW5oZXJpdGVkUGFyYW1ldGVyX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfaW5oZXJpdGVkUGFyYW1ldGVyX3JlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUtcmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWRlZmluYWJsZUVsZW1lbnQiIG5hbWU9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWRlZmluYWJsZUVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbml0aW9uQ29udGV4dCBBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCIgbmFtZT0icmVkZWZpbmFibGVFbGVtZW50IiB0eXBlPSJSZWRlZmluYWJsZUVsZW1lbnQiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZWRlZmluZWRFbGVtZW50X3JlZGVmaW5hYmxlRWxlbWVudCIgbmFtZT0iQV9yZWRlZmluZWRFbGVtZW50X3JlZGVmaW5hYmxlRWxlbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluZWRFbGVtZW50IEFfcmVkZWZpbmVkRWxlbWVudF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVkZWZpbmVkRWxlbWVudF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50IiBuYW1lPSJyZWRlZmluYWJsZUVsZW1lbnQiIHR5cGU9IlJlZGVmaW5hYmxlRWxlbWVudCIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBpc0Rlcml2ZWRVbmlvbj0idHJ1ZSIgYXNzb2NpYXRpb249IkFfcmVkZWZpbmVkRWxlbWVudF9yZWRlZmluYWJsZUVsZW1lbnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVkZWZpbmVkRWxlbWVudF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9yZWRlZmluZWRFbGVtZW50X3JlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluYWJsZUVsZW1lbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3F1YWxpZmllcl9hc3NvY2lhdGlvbkVuZCIgbmFtZT0iQV9xdWFsaWZpZXJfYXNzb2NpYXRpb25FbmQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUHJvcGVydHktcXVhbGlmaWVyIFByb3BlcnR5LWFzc29jaWF0aW9uRW5kIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVkZWZpbmVkUHJvcGVydHlfcHJvcGVydHkiIG5hbWU9IkFfcmVkZWZpbmVkUHJvcGVydHlfcHJvcGVydHkiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUHJvcGVydHktcmVkZWZpbmVkUHJvcGVydHkgQV9yZWRlZmluZWRQcm9wZXJ0eV9wcm9wZXJ0eS1wcm9wZXJ0eSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlZGVmaW5lZFByb3BlcnR5X3Byb3BlcnR5LXByb3BlcnR5IiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0iUHJvcGVydHkiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5lZEVsZW1lbnRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcmVkZWZpbmVkUHJvcGVydHlfcHJvcGVydHkiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVkZWZpbmVkUHJvcGVydHlfcHJvcGVydHktcHJvcGVydHktX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlZGVmaW5lZFByb3BlcnR5X3Byb3BlcnR5LXByb3BlcnR5LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9kZWZhdWx0VmFsdWVfb3duaW5nUHJvcGVydHkiIG5hbWU9IkFfZGVmYXVsdFZhbHVlX293bmluZ1Byb3BlcnR5IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlByb3BlcnR5LWRlZmF1bHRWYWx1ZSBBX2RlZmF1bHRWYWx1ZV9vd25pbmdQcm9wZXJ0eS1vd25pbmdQcm9wZXJ0eSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2RlZmF1bHRWYWx1ZV9vd25pbmdQcm9wZXJ0eS1vd25pbmdQcm9wZXJ0eSIgbmFtZT0ib3duaW5nUHJvcGVydHkiIHR5cGU9IlByb3BlcnR5IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfZGVmYXVsdFZhbHVlX293bmluZ1Byb3BlcnR5Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2RlZmF1bHRWYWx1ZV9vd25pbmdQcm9wZXJ0eS1vd25pbmdQcm9wZXJ0eS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vcHBvc2l0ZV9wcm9wZXJ0eSIgbmFtZT0iQV9vcHBvc2l0ZV9wcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IlByb3BlcnR5LW9wcG9zaXRlIEFfb3Bwb3NpdGVfcHJvcGVydHktcHJvcGVydHkiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vcHBvc2l0ZV9wcm9wZXJ0eS1wcm9wZXJ0eSIgbmFtZT0icHJvcGVydHkiIHR5cGU9IlByb3BlcnR5IiBhc3NvY2lhdGlvbj0iQV9vcHBvc2l0ZV9wcm9wZXJ0eSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vcHBvc2l0ZV9wcm9wZXJ0eS1wcm9wZXJ0eS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zdWJzZXR0ZWRQcm9wZXJ0eV9wcm9wZXJ0eSIgbmFtZT0iQV9zdWJzZXR0ZWRQcm9wZXJ0eV9wcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJQcm9wZXJ0eS1zdWJzZXR0ZWRQcm9wZXJ0eSBBX3N1YnNldHRlZFByb3BlcnR5X3Byb3BlcnR5LXByb3BlcnR5Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfc3Vic2V0dGVkUHJvcGVydHlfcHJvcGVydHktcHJvcGVydHkiIG5hbWU9InByb3BlcnR5IiB0eXBlPSJQcm9wZXJ0eSIgYXNzb2NpYXRpb249IkFfc3Vic2V0dGVkUHJvcGVydHlfcHJvcGVydHkiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc3Vic2V0dGVkUHJvcGVydHlfcHJvcGVydHktcHJvcGVydHktX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3N1YnNldHRlZFByb3BlcnR5X3Byb3BlcnR5LXByb3BlcnR5LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jb25kaXRpb25fcGFyYW1ldGVyU2V0IiBuYW1lPSJBX2NvbmRpdGlvbl9wYXJhbWV0ZXJTZXQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUGFyYW1ldGVyU2V0LWNvbmRpdGlvbiBBX2NvbmRpdGlvbl9wYXJhbWV0ZXJTZXQtcGFyYW1ldGVyU2V0Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfY29uZGl0aW9uX3BhcmFtZXRlclNldC1wYXJhbWV0ZXJTZXQiIG5hbWU9InBhcmFtZXRlclNldCIgdHlwZT0iUGFyYW1ldGVyU2V0IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfY29uZGl0aW9uX3BhcmFtZXRlclNldCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jb25kaXRpb25fcGFyYW1ldGVyU2V0LXBhcmFtZXRlclNldC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9wYXJhbWV0ZXJTZXRfcGFyYW1ldGVyIiBuYW1lPSJBX3BhcmFtZXRlclNldF9wYXJhbWV0ZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUGFyYW1ldGVyLXBhcmFtZXRlclNldCBQYXJhbWV0ZXJTZXQtcGFyYW1ldGVyIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZGVmYXVsdFZhbHVlX293bmluZ1BhcmFtZXRlciIgbmFtZT0iQV9kZWZhdWx0VmFsdWVfb3duaW5nUGFyYW1ldGVyIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlBhcmFtZXRlci1kZWZhdWx0VmFsdWUgQV9kZWZhdWx0VmFsdWVfb3duaW5nUGFyYW1ldGVyLW93bmluZ1BhcmFtZXRlciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2RlZmF1bHRWYWx1ZV9vd25pbmdQYXJhbWV0ZXItb3duaW5nUGFyYW1ldGVyIiBuYW1lPSJvd25pbmdQYXJhbWV0ZXIiIHR5cGU9IlBhcmFtZXRlciIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2RlZmF1bHRWYWx1ZV9vd25pbmdQYXJhbWV0ZXIiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZGVmYXVsdFZhbHVlX293bmluZ1BhcmFtZXRlci1vd25pbmdQYXJhbWV0ZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdHlwZV9vcGVyYXRpb24iIG5hbWU9IkFfdHlwZV9vcGVyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJPcGVyYXRpb24tdHlwZSBBX3R5cGVfb3BlcmF0aW9uLW9wZXJhdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3R5cGVfb3BlcmF0aW9uLW9wZXJhdGlvbiIgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJPcGVyYXRpb24iIGFzc29jaWF0aW9uPSJBX3R5cGVfb3BlcmF0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3R5cGVfb3BlcmF0aW9uLW9wZXJhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfdHlwZV9vcGVyYXRpb24tb3BlcmF0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vcGVyYXRpb25fdGVtcGxhdGVQYXJhbWV0ZXJfcGFyYW1ldGVyZWRFbGVtZW50IiBuYW1lPSJBX29wZXJhdGlvbl90ZW1wbGF0ZVBhcmFtZXRlcl9wYXJhbWV0ZXJlZEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iT3BlcmF0aW9uLXRlbXBsYXRlUGFyYW1ldGVyIE9wZXJhdGlvblRlbXBsYXRlUGFyYW1ldGVyLXBhcmFtZXRlcmVkRWxlbWVudCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2JvZHlDb25kaXRpb25fYm9keUNvbnRleHQiIG5hbWU9IkFfYm9keUNvbmRpdGlvbl9ib2R5Q29udGV4dCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJPcGVyYXRpb24tYm9keUNvbmRpdGlvbiBBX2JvZHlDb25kaXRpb25fYm9keUNvbnRleHQtYm9keUNvbnRleHQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9ib2R5Q29uZGl0aW9uX2JvZHlDb250ZXh0LWJvZHlDb250ZXh0IiBuYW1lPSJib2R5Q29udGV4dCIgdHlwZT0iT3BlcmF0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQ29uc3RyYWludC1jb250ZXh0IiBhc3NvY2lhdGlvbj0iQV9ib2R5Q29uZGl0aW9uX2JvZHlDb250ZXh0Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2JvZHlDb25kaXRpb25fYm9keUNvbnRleHQtYm9keUNvbnRleHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcG9zdGNvbmRpdGlvbl9wb3N0Q29udGV4dCIgbmFtZT0iQV9wb3N0Y29uZGl0aW9uX3Bvc3RDb250ZXh0IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik9wZXJhdGlvbi1wb3N0Y29uZGl0aW9uIEFfcG9zdGNvbmRpdGlvbl9wb3N0Q29udGV4dC1wb3N0Q29udGV4dCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3Bvc3Rjb25kaXRpb25fcG9zdENvbnRleHQtcG9zdENvbnRleHQiIG5hbWU9InBvc3RDb250ZXh0IiB0eXBlPSJPcGVyYXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJDb25zdHJhaW50LWNvbnRleHQiIGFzc29jaWF0aW9uPSJBX3Bvc3Rjb25kaXRpb25fcG9zdENvbnRleHQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcG9zdGNvbmRpdGlvbl9wb3N0Q29udGV4dC1wb3N0Q29udGV4dC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZWRlZmluZWRPcGVyYXRpb25fb3BlcmF0aW9uIiBuYW1lPSJBX3JlZGVmaW5lZE9wZXJhdGlvbl9vcGVyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iT3BlcmF0aW9uLXJlZGVmaW5lZE9wZXJhdGlvbiBBX3JlZGVmaW5lZE9wZXJhdGlvbl9vcGVyYXRpb24tb3BlcmF0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVkZWZpbmVkT3BlcmF0aW9uX29wZXJhdGlvbi1vcGVyYXRpb24iIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0iT3BlcmF0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9yZWRlZmluZWRFbGVtZW50X3JlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluYWJsZUVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5lZE9wZXJhdGlvbl9vcGVyYXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVkZWZpbmVkT3BlcmF0aW9uX29wZXJhdGlvbi1vcGVyYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlZGVmaW5lZE9wZXJhdGlvbl9vcGVyYXRpb24tb3BlcmF0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yYWlzZWRFeGNlcHRpb25fb3BlcmF0aW9uIiBuYW1lPSJBX3JhaXNlZEV4Y2VwdGlvbl9vcGVyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iT3BlcmF0aW9uLXJhaXNlZEV4Y2VwdGlvbiBBX3JhaXNlZEV4Y2VwdGlvbl9vcGVyYXRpb24tb3BlcmF0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmFpc2VkRXhjZXB0aW9uX29wZXJhdGlvbi1vcGVyYXRpb24iIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0iT3BlcmF0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9yYWlzZWRFeGNlcHRpb25fYmVoYXZpb3JhbEZlYXR1cmUtYmVoYXZpb3JhbEZlYXR1cmUiIGFzc29jaWF0aW9uPSJBX3JhaXNlZEV4Y2VwdGlvbl9vcGVyYXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmFpc2VkRXhjZXB0aW9uX29wZXJhdGlvbi1vcGVyYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JhaXNlZEV4Y2VwdGlvbl9vcGVyYXRpb24tb3BlcmF0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9wcmVjb25kaXRpb25fcHJlQ29udGV4dCIgbmFtZT0iQV9wcmVjb25kaXRpb25fcHJlQ29udGV4dCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJPcGVyYXRpb24tcHJlY29uZGl0aW9uIEFfcHJlY29uZGl0aW9uX3ByZUNvbnRleHQtcHJlQ29udGV4dCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3ByZWNvbmRpdGlvbl9wcmVDb250ZXh0LXByZUNvbnRleHQiIG5hbWU9InByZUNvbnRleHQiIHR5cGU9Ik9wZXJhdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkNvbnN0cmFpbnQtY29udGV4dCIgYXNzb2NpYXRpb249IkFfcHJlY29uZGl0aW9uX3ByZUNvbnRleHQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcHJlY29uZGl0aW9uX3ByZUNvbnRleHQtcHJlQ29udGV4dC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZFBhcmFtZXRlcl9vcGVyYXRpb24iIG5hbWU9IkFfb3duZWRQYXJhbWV0ZXJfb3BlcmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik9wZXJhdGlvbi1vd25lZFBhcmFtZXRlciBQYXJhbWV0ZXItb3BlcmF0aW9uIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW5zdGFuY2VfaW5zdGFuY2VWYWx1ZSIgbmFtZT0iQV9pbnN0YW5jZV9pbnN0YW5jZVZhbHVlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ikluc3RhbmNlVmFsdWUtaW5zdGFuY2UgQV9pbnN0YW5jZV9pbnN0YW5jZVZhbHVlLWluc3RhbmNlVmFsdWUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9pbnN0YW5jZV9pbnN0YW5jZVZhbHVlLWluc3RhbmNlVmFsdWUiIG5hbWU9Imluc3RhbmNlVmFsdWUiIHR5cGU9Ikluc3RhbmNlVmFsdWUiIGFzc29jaWF0aW9uPSJBX2luc3RhbmNlX2luc3RhbmNlVmFsdWUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfaW5zdGFuY2VfaW5zdGFuY2VWYWx1ZS1pbnN0YW5jZVZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9pbnN0YW5jZV9pbnN0YW5jZVZhbHVlLWluc3RhbmNlVmFsdWUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NsYXNzaWZpZXJfaW5zdGFuY2VTcGVjaWZpY2F0aW9uIiBuYW1lPSJBX2NsYXNzaWZpZXJfaW5zdGFuY2VTcGVjaWZpY2F0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbi1jbGFzc2lmaWVyIEFfY2xhc3NpZmllcl9pbnN0YW5jZVNwZWNpZmljYXRpb24taW5zdGFuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfY2xhc3NpZmllcl9pbnN0YW5jZVNwZWNpZmljYXRpb24taW5zdGFuY2VTcGVjaWZpY2F0aW9uIiBuYW1lPSJpbnN0YW5jZVNwZWNpZmljYXRpb24iIHR5cGU9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbiIgYXNzb2NpYXRpb249IkFfY2xhc3NpZmllcl9pbnN0YW5jZVNwZWNpZmljYXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfY2xhc3NpZmllcl9pbnN0YW5jZVNwZWNpZmljYXRpb24taW5zdGFuY2VTcGVjaWZpY2F0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9jbGFzc2lmaWVyX2luc3RhbmNlU3BlY2lmaWNhdGlvbi1pbnN0YW5jZVNwZWNpZmljYXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Nsb3Rfb3duaW5nSW5zdGFuY2UiIG5hbWU9IkFfc2xvdF9vd25pbmdJbnN0YW5jZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnN0YW5jZVNwZWNpZmljYXRpb24tc2xvdCBTbG90LW93bmluZ0luc3RhbmNlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc3BlY2lmaWNhdGlvbl9vd25pbmdJbnN0YW5jZVNwZWMiIG5hbWU9IkFfc3BlY2lmaWNhdGlvbl9vd25pbmdJbnN0YW5jZVNwZWMiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uLXNwZWNpZmljYXRpb24gQV9zcGVjaWZpY2F0aW9uX293bmluZ0luc3RhbmNlU3BlYy1vd25pbmdJbnN0YW5jZVNwZWMiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9zcGVjaWZpY2F0aW9uX293bmluZ0luc3RhbmNlU3BlYy1vd25pbmdJbnN0YW5jZVNwZWMiIG5hbWU9Im93bmluZ0luc3RhbmNlU3BlYyIgdHlwZT0iSW5zdGFuY2VTcGVjaWZpY2F0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfc3BlY2lmaWNhdGlvbl9vd25pbmdJbnN0YW5jZVNwZWMiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc3BlY2lmaWNhdGlvbl9vd25pbmdJbnN0YW5jZVNwZWMtb3duaW5nSW5zdGFuY2VTcGVjLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2dlbmVyYWxpemF0aW9uU2V0X2dlbmVyYWxpemF0aW9uIiBuYW1lPSJBX2dlbmVyYWxpemF0aW9uU2V0X2dlbmVyYWxpemF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkdlbmVyYWxpemF0aW9uLWdlbmVyYWxpemF0aW9uU2V0IEdlbmVyYWxpemF0aW9uU2V0LWdlbmVyYWxpemF0aW9uIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZ2VuZXJhbF9nZW5lcmFsaXphdGlvbiIgbmFtZT0iQV9nZW5lcmFsX2dlbmVyYWxpemF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkdlbmVyYWxpemF0aW9uLWdlbmVyYWwgQV9nZW5lcmFsX2dlbmVyYWxpemF0aW9uLWdlbmVyYWxpemF0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZ2VuZXJhbF9nZW5lcmFsaXphdGlvbi1nZW5lcmFsaXphdGlvbiIgbmFtZT0iZ2VuZXJhbGl6YXRpb24iIHR5cGU9IkdlbmVyYWxpemF0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV90YXJnZXRfZGlyZWN0ZWRSZWxhdGlvbnNoaXAtZGlyZWN0ZWRSZWxhdGlvbnNoaXAiIGFzc29jaWF0aW9uPSJBX2dlbmVyYWxfZ2VuZXJhbGl6YXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZ2VuZXJhbF9nZW5lcmFsaXphdGlvbi1nZW5lcmFsaXphdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfZ2VuZXJhbF9nZW5lcmFsaXphdGlvbi1nZW5lcmFsaXphdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY29uc3RyYWluaW5nQ2xhc3NpZmllcl9jbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiIG5hbWU9IkFfY29uc3RyYWluaW5nQ2xhc3NpZmllcl9jbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWNvbnN0cmFpbmluZ0NsYXNzaWZpZXIgQV9jb25zdHJhaW5pbmdDbGFzc2lmaWVyX2NsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1jbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jb25zdHJhaW5pbmdDbGFzc2lmaWVyX2NsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1jbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiIG5hbWU9ImNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlciIgdHlwZT0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIiBhc3NvY2lhdGlvbj0iQV9jb25zdHJhaW5pbmdDbGFzc2lmaWVyX2NsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jb25zdHJhaW5pbmdDbGFzc2lmaWVyX2NsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1jbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NvbnN0cmFpbmluZ0NsYXNzaWZpZXJfY2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyLWNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY2xhc3NpZmllcl90ZW1wbGF0ZVBhcmFtZXRlcl9wYXJhbWV0ZXJlZEVsZW1lbnQiIG5hbWU9IkFfY2xhc3NpZmllcl90ZW1wbGF0ZVBhcmFtZXRlcl9wYXJhbWV0ZXJlZEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ2xhc3NpZmllci10ZW1wbGF0ZVBhcmFtZXRlciBDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXItcGFyYW1ldGVyZWRFbGVtZW50Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcG93ZXJ0eXBlRXh0ZW50X3Bvd2VydHlwZSIgbmFtZT0iQV9wb3dlcnR5cGVFeHRlbnRfcG93ZXJ0eXBlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNsYXNzaWZpZXItcG93ZXJ0eXBlRXh0ZW50IEdlbmVyYWxpemF0aW9uU2V0LXBvd2VydHlwZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2dlbmVyYWxpemF0aW9uX3NwZWNpZmljIiBuYW1lPSJBX2dlbmVyYWxpemF0aW9uX3NwZWNpZmljIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNsYXNzaWZpZXItZ2VuZXJhbGl6YXRpb24gR2VuZXJhbGl6YXRpb24tc3BlY2lmaWMiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9nZW5lcmFsX2NsYXNzaWZpZXIiIG5hbWU9IkFfZ2VuZXJhbF9jbGFzc2lmaWVyIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBpc0Rlcml2ZWQ9InRydWUiIG1lbWJlckVuZD0iQ2xhc3NpZmllci1nZW5lcmFsIEFfZ2VuZXJhbF9jbGFzc2lmaWVyLWNsYXNzaWZpZXIiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9nZW5lcmFsX2NsYXNzaWZpZXItY2xhc3NpZmllciIgbmFtZT0iY2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfZ2VuZXJhbF9jbGFzc2lmaWVyIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2dlbmVyYWxfY2xhc3NpZmllci1jbGFzc2lmaWVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9nZW5lcmFsX2NsYXNzaWZpZXItY2xhc3NpZmllci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZmVhdHVyZV9mZWF0dXJpbmdDbGFzc2lmaWVyIiBuYW1lPSJBX2ZlYXR1cmVfZmVhdHVyaW5nQ2xhc3NpZmllciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkNsYXNzaWZpZXItZmVhdHVyZSBGZWF0dXJlLWZlYXR1cmluZ0NsYXNzaWZpZXIiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zdWJzdGl0dXRpb25fc3Vic3RpdHV0aW5nQ2xhc3NpZmllciIgbmFtZT0iQV9zdWJzdGl0dXRpb25fc3Vic3RpdHV0aW5nQ2xhc3NpZmllciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGFzc2lmaWVyLXN1YnN0aXR1dGlvbiBTdWJzdGl0dXRpb24tc3Vic3RpdHV0aW5nQ2xhc3NpZmllciIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlcHJlc2VudGF0aW9uX2NsYXNzaWZpZXIiIG5hbWU9IkFfcmVwcmVzZW50YXRpb25fY2xhc3NpZmllciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGFzc2lmaWVyLXJlcHJlc2VudGF0aW9uIEFfcmVwcmVzZW50YXRpb25fY2xhc3NpZmllci1jbGFzc2lmaWVyIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFfcmVwcmVzZW50YXRpb25fY2xhc3NpZmllci1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQV9jb2xsYWJvcmF0aW9uVXNlX2NsYXNzaWZpZXIiLz4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVwcmVzZW50YXRpb25fY2xhc3NpZmllci1jbGFzc2lmaWVyIiBuYW1lPSJjbGFzc2lmaWVyIiB0eXBlPSJDbGFzc2lmaWVyIiByZWRlZmluZWRQcm9wZXJ0eT0iQV9jb2xsYWJvcmF0aW9uVXNlX2NsYXNzaWZpZXItY2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfcmVwcmVzZW50YXRpb25fY2xhc3NpZmllciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXByZXNlbnRhdGlvbl9jbGFzc2lmaWVyLWNsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRUZW1wbGF0ZVNpZ25hdHVyZV9jbGFzc2lmaWVyIiBuYW1lPSJBX293bmVkVGVtcGxhdGVTaWduYXR1cmVfY2xhc3NpZmllciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGFzc2lmaWVyLW93bmVkVGVtcGxhdGVTaWduYXR1cmUgUmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZS1jbGFzc2lmaWVyIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW5oZXJpdGVkTWVtYmVyX2luaGVyaXRpbmdDbGFzc2lmaWVyIiBuYW1lPSJBX2luaGVyaXRlZE1lbWJlcl9pbmhlcml0aW5nQ2xhc3NpZmllciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkNsYXNzaWZpZXItaW5oZXJpdGVkTWVtYmVyIEFfaW5oZXJpdGVkTWVtYmVyX2luaGVyaXRpbmdDbGFzc2lmaWVyLWluaGVyaXRpbmdDbGFzc2lmaWVyIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfaW5oZXJpdGVkTWVtYmVyX2luaGVyaXRpbmdDbGFzc2lmaWVyLWluaGVyaXRpbmdDbGFzc2lmaWVyIiBuYW1lPSJpbmhlcml0aW5nQ2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgc3Vic2V0dGVkUHJvcGVydHk9IkFfbWVtYmVyX21lbWJlck5hbWVzcGFjZS1tZW1iZXJOYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX2luaGVyaXRlZE1lbWJlcl9pbmhlcml0aW5nQ2xhc3NpZmllciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9pbmhlcml0ZWRNZW1iZXJfaW5oZXJpdGluZ0NsYXNzaWZpZXItaW5oZXJpdGluZ0NsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2luaGVyaXRlZE1lbWJlcl9pbmhlcml0aW5nQ2xhc3NpZmllci1pbmhlcml0aW5nQ2xhc3NpZmllci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVkZWZpbmVkQ2xhc3NpZmllcl9jbGFzc2lmaWVyIiBuYW1lPSJBX3JlZGVmaW5lZENsYXNzaWZpZXJfY2xhc3NpZmllciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGFzc2lmaWVyLXJlZGVmaW5lZENsYXNzaWZpZXIgQV9yZWRlZmluZWRDbGFzc2lmaWVyX2NsYXNzaWZpZXItY2xhc3NpZmllciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlZGVmaW5lZENsYXNzaWZpZXJfY2xhc3NpZmllci1jbGFzc2lmaWVyIiBuYW1lPSJjbGFzc2lmaWVyIiB0eXBlPSJDbGFzc2lmaWVyIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9yZWRlZmluZWRFbGVtZW50X3JlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluYWJsZUVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5lZENsYXNzaWZpZXJfY2xhc3NpZmllciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZWRlZmluZWRDbGFzc2lmaWVyX2NsYXNzaWZpZXItY2xhc3NpZmllci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcmVkZWZpbmVkQ2xhc3NpZmllcl9jbGFzc2lmaWVyLWNsYXNzaWZpZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NvbGxhYm9yYXRpb25Vc2VfY2xhc3NpZmllciIgbmFtZT0iQV9jb2xsYWJvcmF0aW9uVXNlX2NsYXNzaWZpZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ2xhc3NpZmllci1jb2xsYWJvcmF0aW9uVXNlIEFfY29sbGFib3JhdGlvblVzZV9jbGFzc2lmaWVyLWNsYXNzaWZpZXIiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jb2xsYWJvcmF0aW9uVXNlX2NsYXNzaWZpZXItY2xhc3NpZmllciIgbmFtZT0iY2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2NvbGxhYm9yYXRpb25Vc2VfY2xhc3NpZmllciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jb2xsYWJvcmF0aW9uVXNlX2NsYXNzaWZpZXItY2xhc3NpZmllci1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9hdHRyaWJ1dGVfY2xhc3NpZmllciIgbmFtZT0iQV9hdHRyaWJ1dGVfY2xhc3NpZmllciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkNsYXNzaWZpZXItYXR0cmlidXRlIEFfYXR0cmlidXRlX2NsYXNzaWZpZXItY2xhc3NpZmllciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2F0dHJpYnV0ZV9jbGFzc2lmaWVyLWNsYXNzaWZpZXIiIG5hbWU9ImNsYXNzaWZpZXIiIHR5cGU9IkNsYXNzaWZpZXIiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIHN1YnNldHRlZFByb3BlcnR5PSJGZWF0dXJlLWZlYXR1cmluZ0NsYXNzaWZpZXIgUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5pdGlvbkNvbnRleHQiIGFzc29jaWF0aW9uPSJBX2F0dHJpYnV0ZV9jbGFzc2lmaWVyIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2F0dHJpYnV0ZV9jbGFzc2lmaWVyLWNsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRVc2VDYXNlX2NsYXNzaWZpZXIiIG5hbWU9IkFfb3duZWRVc2VDYXNlX2NsYXNzaWZpZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ2xhc3NpZmllci1vd25lZFVzZUNhc2UgQV9vd25lZFVzZUNhc2VfY2xhc3NpZmllci1jbGFzc2lmaWVyIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb3duZWRVc2VDYXNlX2NsYXNzaWZpZXItY2xhc3NpZmllciIgbmFtZT0iY2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX293bmVkVXNlQ2FzZV9jbGFzc2lmaWVyIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX293bmVkVXNlQ2FzZV9jbGFzc2lmaWVyLWNsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRQYXJhbWV0ZXJfb3duZXJGb3JtYWxQYXJhbSIgbmFtZT0iQV9vd25lZFBhcmFtZXRlcl9vd25lckZvcm1hbFBhcmFtIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkJlaGF2aW9yYWxGZWF0dXJlLW93bmVkUGFyYW1ldGVyIEFfb3duZWRQYXJhbWV0ZXJfb3duZXJGb3JtYWxQYXJhbS1vd25lckZvcm1hbFBhcmFtIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb3duZWRQYXJhbWV0ZXJfb3duZXJGb3JtYWxQYXJhbS1vd25lckZvcm1hbFBhcmFtIiBuYW1lPSJvd25lckZvcm1hbFBhcmFtIiB0eXBlPSJCZWhhdmlvcmFsRmVhdHVyZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX293bmVkUGFyYW1ldGVyX293bmVyRm9ybWFsUGFyYW0iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfb3duZWRQYXJhbWV0ZXJfb3duZXJGb3JtYWxQYXJhbS1vd25lckZvcm1hbFBhcmFtLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JhaXNlZEV4Y2VwdGlvbl9iZWhhdmlvcmFsRmVhdHVyZSIgbmFtZT0iQV9yYWlzZWRFeGNlcHRpb25fYmVoYXZpb3JhbEZlYXR1cmUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQmVoYXZpb3JhbEZlYXR1cmUtcmFpc2VkRXhjZXB0aW9uIEFfcmFpc2VkRXhjZXB0aW9uX2JlaGF2aW9yYWxGZWF0dXJlLWJlaGF2aW9yYWxGZWF0dXJlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmFpc2VkRXhjZXB0aW9uX2JlaGF2aW9yYWxGZWF0dXJlLWJlaGF2aW9yYWxGZWF0dXJlIiBuYW1lPSJiZWhhdmlvcmFsRmVhdHVyZSIgdHlwZT0iQmVoYXZpb3JhbEZlYXR1cmUiIGFzc29jaWF0aW9uPSJBX3JhaXNlZEV4Y2VwdGlvbl9iZWhhdmlvcmFsRmVhdHVyZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yYWlzZWRFeGNlcHRpb25fYmVoYXZpb3JhbEZlYXR1cmUtYmVoYXZpb3JhbEZlYXR1cmUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JhaXNlZEV4Y2VwdGlvbl9iZWhhdmlvcmFsRmVhdHVyZS1iZWhhdmlvcmFsRmVhdHVyZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRQYXJhbWV0ZXJTZXRfYmVoYXZpb3JhbEZlYXR1cmUiIG5hbWU9IkFfb3duZWRQYXJhbWV0ZXJTZXRfYmVoYXZpb3JhbEZlYXR1cmUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQmVoYXZpb3JhbEZlYXR1cmUtb3duZWRQYXJhbWV0ZXJTZXQgQV9vd25lZFBhcmFtZXRlclNldF9iZWhhdmlvcmFsRmVhdHVyZS1iZWhhdmlvcmFsRmVhdHVyZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX293bmVkUGFyYW1ldGVyU2V0X2JlaGF2aW9yYWxGZWF0dXJlLWJlaGF2aW9yYWxGZWF0dXJlIiBuYW1lPSJiZWhhdmlvcmFsRmVhdHVyZSIgdHlwZT0iQmVoYXZpb3JhbEZlYXR1cmUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9vd25lZFBhcmFtZXRlclNldF9iZWhhdmlvcmFsRmVhdHVyZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vd25lZFBhcmFtZXRlclNldF9iZWhhdmlvcmFsRmVhdHVyZS1iZWhhdmlvcmFsRmVhdHVyZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9tZXRob2Rfc3BlY2lmaWNhdGlvbiIgbmFtZT0iQV9tZXRob2Rfc3BlY2lmaWNhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJCZWhhdmlvcmFsRmVhdHVyZS1tZXRob2QgQmVoYXZpb3Itc3BlY2lmaWNhdGlvbiIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NvbnRyYWN0X3N1YnN0aXR1dGlvbiIgbmFtZT0iQV9jb250cmFjdF9zdWJzdGl0dXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3Vic3RpdHV0aW9uLWNvbnRyYWN0IEFfY29udHJhY3Rfc3Vic3RpdHV0aW9uLXN1YnN0aXR1dGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2NvbnRyYWN0X3N1YnN0aXR1dGlvbi1zdWJzdGl0dXRpb24iIG5hbWU9InN1YnN0aXR1dGlvbiIgdHlwZT0iU3Vic3RpdHV0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9zdXBwbGllcl9zdXBwbGllckRlcGVuZGVuY3ktc3VwcGxpZXJEZXBlbmRlbmN5IiBhc3NvY2lhdGlvbj0iQV9jb250cmFjdF9zdWJzdGl0dXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfY29udHJhY3Rfc3Vic3RpdHV0aW9uLXN1YnN0aXR1dGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfY29udHJhY3Rfc3Vic3RpdHV0aW9uLXN1YnN0aXR1dGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkFueVJlY2VpdmVFdmVudCIgbmFtZT0iQW55UmVjZWl2ZUV2ZW50Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBbnlSZWNlaXZlRXZlbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBbnlSZWNlaXZlRXZlbnQiPgotICAgICAgICA8Ym9keT5BIHRyaWdnZXIgZm9yIGFuIEFueVJlY2VpdmVFdmVudCBpcyB0cmlnZ2VyZWQgYnkgdGhlIHJlY2VpcHQgb2YgYW55IG1lc3NhZ2UgdGhhdCBpcyBub3QgZXhwbGljaXRseSBoYW5kbGVkIGJ5IGFueSByZWxhdGVkIHRyaWdnZXIuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBbnlSZWNlaXZlRXZlbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik1lc3NhZ2VFdmVudCIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJCZWhhdmlvciIgbmFtZT0iQmVoYXZpb3IiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3IiPgotICAgICAgICA8Ym9keT5CZWhhdmlvciBpcyBhIHNwZWNpZmljYXRpb24gb2YgaG93IGl0cyBjb250ZXh0IEJlaGF2aW9yZWRDbGFzc2lmaWVyIGNoYW5nZXMgc3RhdGUgb3ZlciB0aW1lLiBUaGlzIHNwZWNpZmljYXRpb24gbWF5IGJlIGVpdGhlciBhIGRlZmluaXRpb24gb2YgcG9zc2libGUgYmVoYXZpb3IgZXhlY3V0aW9uIG9yIGVtZXJnZW50IGJlaGF2aW9yLCBvciBhIHNlbGVjdGl2ZSBpbGx1c3RyYXRpb24gb2YgYW4gaW50ZXJlc3Rpbmcgc3Vic2V0IG9mIHBvc3NpYmxlIGV4ZWN1dGlvbnMuIFRoZSBsYXR0ZXIgZm9ybSBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgY2FwdHVyaW5nIGV4YW1wbGVzLCBzdWNoIGFzIGEgdHJhY2Ugb2YgYSBwYXJ0aWN1bGFyIGV4ZWN1dGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJCZWhhdmlvci1tb3N0X29uZV9iZWhhdmlvciIgbmFtZT0ibW9zdF9vbmVfYmVoYXZpb3IiIGNvbnN0cmFpbmVkRWxlbWVudD0iQmVoYXZpb3IiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3ItbW9zdF9vbmVfYmVoYXZpb3ItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCZWhhdmlvci1tb3N0X29uZV9iZWhhdmlvciI+Ci0gICAgICAgICAgPGJvZHk+VGhlcmUgbWF5IGJlIGF0IG1vc3Qgb25lIEJlaGF2aW9yIGZvciBhIGdpdmVuIHBhaXJpbmcgb2YgQmVoYXZpb3JlZENsYXNzaWZpZXIgKGFzIG93bmVyIG9mIHRoZSBCZWhhdmlvcikgYW5kIEJlaGF2aW9yYWxGZWF0dXJlIChhcyBzcGVjaWZpY2F0aW9uIG9mIHRoZSBCZWhhdmlvcikuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkJlaGF2aW9yLW1vc3Rfb25lX2JlaGF2aW9yLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zcGVjaWZpY2F0aW9uICZsdDs+IG51bGwgaW1wbGllcyBfJ2NvbnRleHQnLm93bmVkQmVoYXZpb3ItPnNlbGVjdChzcGVjaWZpY2F0aW9uPXNlbGYuc3BlY2lmaWNhdGlvbiktPnNpemUoKSA9IDE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkJlaGF2aW9yLXBhcmFtZXRlcnNfbWF0Y2giIG5hbWU9InBhcmFtZXRlcnNfbWF0Y2giIGNvbnN0cmFpbmVkRWxlbWVudD0iQmVoYXZpb3IiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3ItcGFyYW1ldGVyc19tYXRjaC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yLXBhcmFtZXRlcnNfbWF0Y2giPgotICAgICAgICAgIDxib2R5PklmIGEgQmVoYXZpb3IgaGFzIGEgc3BlY2lmaWNhdGlvbiBCZWhhdmlvcmFsRmVhdHVyZSwgdGhlbiBpdCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkUGFyYW1ldGVycyBhcyBpdHMgc3BlY2lmaWNhdGlvbi4gVGhlIEJlaGF2aW9yIFBhcmFtZXRlcnMgbXVzdCBhbHNvICZxdW90O21hdGNoJnF1b3Q7IHRoZSBCZWhhdmlvcmFsUGFyYW1ldGVyIFBhcmFtZXRlcnMsIGJ1dCB0aGUgZXhhY3QgcmVxdWlyZW1lbnRzIGZvciB0aGlzIG1hdGNoaW5nIGFyZSBub3QgZm9ybWFsaXplZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQmVoYXZpb3ItcGFyYW1ldGVyc19tYXRjaC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c3BlY2lmaWNhdGlvbiAmbHQ7PiBudWxsIGltcGxpZXMgb3duZWRQYXJhbWV0ZXItPnNpemUoKSA9IHNwZWNpZmljYXRpb24ub3duZWRQYXJhbWV0ZXItPnNpemUoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQmVoYXZpb3ItZmVhdHVyZV9vZl9jb250ZXh0X2NsYXNzaWZpZXIiIG5hbWU9ImZlYXR1cmVfb2ZfY29udGV4dF9jbGFzc2lmaWVyIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkJlaGF2aW9yIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yLWZlYXR1cmVfb2ZfY29udGV4dF9jbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3ItZmVhdHVyZV9vZl9jb250ZXh0X2NsYXNzaWZpZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBzcGVjaWZpY2F0aW9uIEJlaGF2aW9yYWxGZWF0dXJlIG11c3QgYmUgYSBmZWF0dXJlIChwb3NzaWJseSBpbmhlcml0ZWQpIG9mIHRoZSBjb250ZXh0IEJlaGF2aW9yZWRDbGFzc2lmaWVyIG9mIHRoZSBCZWhhdmlvci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQmVoYXZpb3ItZmVhdHVyZV9vZl9jb250ZXh0X2NsYXNzaWZpZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pl8nY29udGV4dCcuZmVhdHVyZS0+aW5jbHVkZXMoc3BlY2lmaWNhdGlvbik8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQmVoYXZpb3ItX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkNsYXNzIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJCZWhhdmlvci1jb250ZXh0IiBuYW1lPSJjb250ZXh0IiB0eXBlPSJCZWhhdmlvcmVkQ2xhc3NpZmllciIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5pdGlvbkNvbnRleHQiIGFzc29jaWF0aW9uPSJBX2NvbnRleHRfYmVoYXZpb3IiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3ItY29udGV4dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yLWNvbnRleHQiPgotICAgICAgICAgIDxib2R5PlRoZSBCZWhhdmlvcmVkQ2xhc3NpZmllciB0aGF0IGlzIHRoZSBjb250ZXh0IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBCZWhhdmlvci4gQSBCZWhhdmlvciB0aGF0IGlzIGRpcmVjdGx5IG93bmVkIGFzIGEgbmVzdGVkQ2xhc3NpZmllciBkb2VzIG5vdCBoYXZlIGEgY29udGV4dC4gT3RoZXJ3aXNlLCB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQgb2YgYSBCZWhhdmlvciwgZmluZCB0aGUgZmlyc3QgQmVoYXZpb3JlZENsYXNzaWZpZXIgcmVhY2hlZCBieSBmb2xsb3dpbmcgdGhlIGNoYWluIG9mIG93bmVyIHJlbGF0aW9uc2hpcHMgZnJvbSB0aGUgQmVoYXZpb3IsIGlmIGFueS4gSWYgdGhlcmUgaXMgc3VjaCBhIEJlaGF2aW9yZWRDbGFzc2lmaWVyLCB0aGVuIGl0IGlzIHRoZSBjb250ZXh0LCB1bmxlc3MgaXQgaXMgaXRzZWxmIGEgQmVoYXZpb3Igd2l0aCBhIG5vbi1lbXB0eSBjb250ZXh0LCBpbiB3aGljaCBjYXNlIHRoYXQgaXMgYWxzbyB0aGUgY29udGV4dCBmb3IgdGhlIG9yaWdpbmFsIEJlaGF2aW9yLiBGb3IgZXhhbXBsZSwgZm9sbG93aW5nIHRoaXMgYWxnb3JpdGhtLCB0aGUgY29udGV4dCBvZiBhbiBlbnRyeSBCZWhhdmlvciBpbiBhIFN0YXRlTWFjaGluZSBpcyB0aGUgQmVoYXZpb3JlZENsYXNzaWZpZXIgdGhhdCBvd25zIHRoZSBTdGF0ZU1hY2hpbmUuIFRoZSBmZWF0dXJlcyBvZiB0aGUgY29udGV4dCBCZWhhdmlvcmVkQ2xhc3NpZmllciBhcyB3ZWxsIGFzIHRoZSBFbGVtZW50cyB2aXNpYmxlIHRvIHRoZSBjb250ZXh0IENsYXNzaWZpZXIgYXJlIHZpc2libGUgdG8gdGhlIEJlaGF2aW9yLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmVoYXZpb3ItY29udGV4dC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkJlaGF2aW9yLWlzUmVlbnRyYW50IiBuYW1lPSJpc1JlZW50cmFudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvci1pc1JlZW50cmFudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yLWlzUmVlbnRyYW50Ij4KLSAgICAgICAgICA8Ym9keT5UZWxscyB3aGV0aGVyIHRoZSBCZWhhdmlvciBjYW4gYmUgaW52b2tlZCB3aGlsZSBpdCBpcyBzdGlsbCBleGVjdXRpbmcgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yLWlzUmVlbnRyYW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJCZWhhdmlvci1pc1JlZW50cmFudC1fZGVmYXVsdFZhbHVlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkJlaGF2aW9yLW93bmVkUGFyYW1ldGVyIiBuYW1lPSJvd25lZFBhcmFtZXRlciIgdHlwZT0iUGFyYW1ldGVyIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX293bmVkUGFyYW1ldGVyX2JlaGF2aW9yIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yLW93bmVkUGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3Itb3duZWRQYXJhbWV0ZXIiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgYSBsaXN0IG9mIFBhcmFtZXRlcnMgdG8gdGhlIEJlaGF2aW9yIHdoaWNoIGRlc2NyaWJlcyB0aGUgb3JkZXIgYW5kIHR5cGUgb2YgYXJndW1lbnRzIHRoYXQgY2FuIGJlIGdpdmVuIHdoZW4gdGhlIEJlaGF2aW9yIGlzIGludm9rZWQgYW5kIG9mIHRoZSB2YWx1ZXMgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCB3aGVuIHRoZSBCZWhhdmlvciBjb21wbGV0ZXMgaXRzIGV4ZWN1dGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yLW93bmVkUGFyYW1ldGVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQmVoYXZpb3Itb3duZWRQYXJhbWV0ZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQmVoYXZpb3Itb3duZWRQYXJhbWV0ZXJTZXQiIG5hbWU9Im93bmVkUGFyYW1ldGVyU2V0IiB0eXBlPSJQYXJhbWV0ZXJTZXQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX293bmVkUGFyYW1ldGVyU2V0X2JlaGF2aW9yIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yLW93bmVkUGFyYW1ldGVyU2V0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3Itb3duZWRQYXJhbWV0ZXJTZXQiPgotICAgICAgICAgIDxib2R5PlRoZSBQYXJhbWV0ZXJTZXRzIG93bmVkIGJ5IHRoaXMgQmVoYXZpb3IuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCZWhhdmlvci1vd25lZFBhcmFtZXRlclNldC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkJlaGF2aW9yLW93bmVkUGFyYW1ldGVyU2V0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkJlaGF2aW9yLXBvc3Rjb25kaXRpb24iIG5hbWU9InBvc3Rjb25kaXRpb24iIHR5cGU9IkNvbnN0cmFpbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRSdWxlIiBhc3NvY2lhdGlvbj0iQV9wb3N0Y29uZGl0aW9uX2JlaGF2aW9yIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yLXBvc3Rjb25kaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCZWhhdmlvci1wb3N0Y29uZGl0aW9uIj4KLSAgICAgICAgICA8Ym9keT5BbiBvcHRpb25hbCBzZXQgb2YgQ29uc3RyYWludHMgc3BlY2lmeWluZyB3aGF0IGlzIGZ1bGZpbGxlZCBhZnRlciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBCZWhhdmlvciBpcyBjb21wbGV0ZWQsIGlmIGl0cyBwcmVjb25kaXRpb24gd2FzIGZ1bGZpbGxlZCBiZWZvcmUgaXRzIGludm9jYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCZWhhdmlvci1wb3N0Y29uZGl0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQmVoYXZpb3ItcG9zdGNvbmRpdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJCZWhhdmlvci1wcmVjb25kaXRpb24iIG5hbWU9InByZWNvbmRpdGlvbiIgdHlwZT0iQ29uc3RyYWludCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZFJ1bGUiIGFzc29jaWF0aW9uPSJBX3ByZWNvbmRpdGlvbl9iZWhhdmlvciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvci1wcmVjb25kaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCZWhhdmlvci1wcmVjb25kaXRpb24iPgotICAgICAgICAgIDxib2R5PkFuIG9wdGlvbmFsIHNldCBvZiBDb25zdHJhaW50cyBzcGVjaWZ5aW5nIHdoYXQgbXVzdCBiZSBmdWxmaWxsZWQgYmVmb3JlIHRoZSBCZWhhdmlvciBpcyBpbnZva2VkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmVoYXZpb3ItcHJlY29uZGl0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQmVoYXZpb3ItcHJlY29uZGl0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkJlaGF2aW9yLXNwZWNpZmljYXRpb24iIG5hbWU9InNwZWNpZmljYXRpb24iIHR5cGU9IkJlaGF2aW9yYWxGZWF0dXJlIiBhc3NvY2lhdGlvbj0iQV9tZXRob2Rfc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvci1zcGVjaWZpY2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3Itc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+RGVzaWduYXRlcyBhIEJlaGF2aW9yYWxGZWF0dXJlIHRoYXQgdGhlIEJlaGF2aW9yIGltcGxlbWVudHMuIFRoZSBCZWhhdmlvcmFsRmVhdHVyZSBtdXN0IGJlIG93bmVkIGJ5IHRoZSBCZWhhdmlvcmVkQ2xhc3NpZmllciB0aGF0IG93bnMgdGhlIEJlaGF2aW9yIG9yIGJlIGluaGVyaXRlZCBieSBpdC4gVGhlIFBhcmFtZXRlcnMgb2YgdGhlIEJlaGF2aW9yYWxGZWF0dXJlIGFuZCB0aGUgaW1wbGVtZW50aW5nIEJlaGF2aW9yIG11c3QgbWF0Y2guIEEgQmVoYXZpb3IgZG9lcyBub3QgbmVlZCB0byBoYXZlIGEgc3BlY2lmaWNhdGlvbiwgaW4gd2hpY2ggY2FzZSBpdCBlaXRoZXIgaXMgdGhlIGNsYXNzaWZpZXJCZWhhdmlvciBvZiBhIEJlaGF2aW9yZWRDbGFzc2lmaWVyIG9yIGl0IGNhbiBvbmx5IGJlIGludm9rZWQgYnkgYW5vdGhlciBCZWhhdmlvciBvZiB0aGUgQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yLXNwZWNpZmljYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJCZWhhdmlvci1yZWRlZmluZWRCZWhhdmlvciIgbmFtZT0icmVkZWZpbmVkQmVoYXZpb3IiIHR5cGU9IkJlaGF2aW9yIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQ2xhc3NpZmllci1yZWRlZmluZWRDbGFzc2lmaWVyIiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluZWRCZWhhdmlvcl9iZWhhdmlvciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvci1yZWRlZmluZWRCZWhhdmlvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yLXJlZGVmaW5lZEJlaGF2aW9yIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBCZWhhdmlvciB0aGF0IHRoaXMgQmVoYXZpb3IgcmVkZWZpbmVzLiBBIHN1YnR5cGUgb2YgQmVoYXZpb3IgbWF5IHJlZGVmaW5lIGFueSBvdGhlciBzdWJ0eXBlIG9mIEJlaGF2aW9yLiBJZiB0aGUgQmVoYXZpb3IgaW1wbGVtZW50cyBhIEJlaGF2aW9yYWxGZWF0dXJlLCBpdCByZXBsYWNlcyB0aGUgcmVkZWZpbmVkIEJlaGF2aW9yLiBJZiB0aGUgQmVoYXZpb3IgaXMgYSBjbGFzc2lmaWVyQmVoYXZpb3IsIGl0IGV4dGVuZHMgdGhlIHJlZGVmaW5lZCBCZWhhdmlvci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yLXJlZGVmaW5lZEJlaGF2aW9yLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQmVoYXZpb3ItcmVkZWZpbmVkQmVoYXZpb3ItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmVoYXZpb3ItY29udGV4dC4xIiBuYW1lPSJjb250ZXh0IiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IkJlaGF2aW9yLWNvbnRleHQuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yLWNvbnRleHQuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yLWNvbnRleHQuMSI+Ci0gICAgICAgICAgPGJvZHk+QSBCZWhhdmlvciB0aGF0IGlzIGRpcmVjdGx5IG93bmVkIGFzIGEgbmVzdGVkQ2xhc3NpZmllciBkb2VzIG5vdCBoYXZlIGEgY29udGV4dC4gT3RoZXJ3aXNlLCB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQgb2YgYSBCZWhhdmlvciwgZmluZCB0aGUgZmlyc3QgQmVoYXZpb3JlZENsYXNzaWZpZXIgcmVhY2hlZCBieSBmb2xsb3dpbmcgdGhlIGNoYWluIG9mIG93bmVyIHJlbGF0aW9uc2hpcHMgZnJvbSB0aGUgQmVoYXZpb3IsIGlmIGFueS4gSWYgdGhlcmUgaXMgc3VjaCBhIEJlaGF2aW9yZWRDbGFzc2lmaWVyLCB0aGVuIGl0IGlzIHRoZSBjb250ZXh0LCB1bmxlc3MgaXQgaXMgaXRzZWxmIGEgQmVoYXZpb3Igd2l0aCBhIG5vbi1lbXB0eSBjb250ZXh0LCBpbiB3aGljaCBjYXNlIHRoYXQgaXMgYWxzbyB0aGUgY29udGV4dCBmb3IgdGhlIG9yaWdpbmFsIEJlaGF2aW9yLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJCZWhhdmlvci1jb250ZXh0LjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJCZWhhdmlvci1jb250ZXh0LjEgQmVoYXZpb3ItY29udGV4dCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkJlaGF2aW9yLWNvbnRleHQuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIG5lc3RpbmdDbGFzcyAmbHQ7PiBudWxsIHRoZW4mI3hEOwotICAgIG51bGwmI3hEOwotZWxzZSYjeEQ7Ci0gICAgbGV0IGI6QmVoYXZpb3JlZENsYXNzaWZpZXIgPSBzZWxmLmJlaGF2aW9yZWRDbGFzc2lmaWVyKHNlbGYub3duZXIpIGluJiN4RDsKLSAgICBpZiBiLm9jbElzS2luZE9mKEJlaGF2aW9yKSBhbmQgYi5vY2xBc1R5cGUoQmVoYXZpb3IpLl8nY29udGV4dCcgJmx0Oz4gbnVsbCB0aGVuICYjeEQ7Ci0gICAgICAgIGIub2NsQXNUeXBlKEJlaGF2aW9yKS5fJ2NvbnRleHQnJiN4RDsKLSAgICBlbHNlICYjeEQ7Ci0gICAgICAgIGIgJiN4RDsKLSAgICBlbmRpZiYjeEQ7Ci1lbmRpZiYjeEQ7Ci0gICAgICAgICk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmVoYXZpb3ItY29udGV4dC4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJCZWhhdmlvcmVkQ2xhc3NpZmllciIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmVoYXZpb3ItY29udGV4dC4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQmVoYXZpb3ItY29udGV4dC4xLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCZWhhdmlvci1iZWhhdmlvcmVkQ2xhc3NpZmllciIgbmFtZT0iYmVoYXZpb3JlZENsYXNzaWZpZXIiIGlzUXVlcnk9InRydWUiIHByZWNvbmRpdGlvbj0iQmVoYXZpb3ItYmVoYXZpb3JlZENsYXNzaWZpZXItc3BlYyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvci1iZWhhdmlvcmVkQ2xhc3NpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yLWJlaGF2aW9yZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZmlyc3QgQmVoYXZpb3JlZENsYXNzaWZpZXIgcmVhY2hlZCBieSBmb2xsb3dpbmcgdGhlIGNoYWluIG9mIG93bmVyIHJlbGF0aW9uc2hpcHMgZnJvbSB0aGUgQmVoYXZpb3IsIGlmIGFueS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQmVoYXZpb3ItYmVoYXZpb3JlZENsYXNzaWZpZXItc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJCZWhhdmlvci1iZWhhdmlvcmVkQ2xhc3NpZmllciI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkJlaGF2aW9yLWJlaGF2aW9yZWRDbGFzc2lmaWVyLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5pZiBmcm9tLm9jbElzS2luZE9mKEJlaGF2aW9yZWRDbGFzc2lmaWVyKSB0aGVuJiN4RDsKLSAgICBmcm9tLm9jbEFzVHlwZShCZWhhdmlvcmVkQ2xhc3NpZmllcikmI3hEOwotZWxzZSBpZiBmcm9tLm93bmVyID0gbnVsbCB0aGVuJiN4RDsKLSAgICBudWxsJiN4RDsKLWVsc2UmI3hEOwotICAgIHNlbGYuYmVoYXZpb3JlZENsYXNzaWZpZXIoZnJvbS5vd25lcikmI3hEOwotZW5kaWYmI3hEOwotZW5kaWY8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmVoYXZpb3ItYmVoYXZpb3JlZENsYXNzaWZpZXItZnJvbSIgbmFtZT0iZnJvbSIgdHlwZT0iRWxlbWVudCIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCZWhhdmlvci1iZWhhdmlvcmVkQ2xhc3NpZmllci1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iQmVoYXZpb3JlZENsYXNzaWZpZXIiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yLWJlaGF2aW9yZWRDbGFzc2lmaWVyLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkJlaGF2aW9yLWlucHV0UGFyYW1ldGVycyIgbmFtZT0iaW5wdXRQYXJhbWV0ZXJzIiBib2R5Q29uZGl0aW9uPSJCZWhhdmlvci1pbnB1dFBhcmFtZXRlcnMtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvci1pbnB1dFBhcmFtZXRlcnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCZWhhdmlvci1pbnB1dFBhcmFtZXRlcnMiPgotICAgICAgICAgIDxib2R5PlRoZSBpbiBhbmQgaW5vdXQgb3duZWRQYXJhbWV0ZXJzIG9mIHRoZSBCZWhhdmlvci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQmVoYXZpb3ItaW5wdXRQYXJhbWV0ZXJzLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQmVoYXZpb3ItaW5wdXRQYXJhbWV0ZXJzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQmVoYXZpb3ItaW5wdXRQYXJhbWV0ZXJzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAob3duZWRQYXJhbWV0ZXItPnNlbGVjdChkaXJlY3Rpb249UGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6Xydpbicgb3IgZGlyZWN0aW9uPVBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Omlub3V0KSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQmVoYXZpb3ItaW5wdXRQYXJhbWV0ZXJzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQYXJhbWV0ZXIiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmVoYXZpb3ItaW5wdXRQYXJhbWV0ZXJzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQmVoYXZpb3ItaW5wdXRQYXJhbWV0ZXJzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCZWhhdmlvci1vdXRwdXRQYXJhbWV0ZXJzIiBuYW1lPSJvdXRwdXRQYXJhbWV0ZXJzIiBib2R5Q29uZGl0aW9uPSJCZWhhdmlvci1vdXRwdXRQYXJhbWV0ZXJzLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3Itb3V0cHV0UGFyYW1ldGVycy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yLW91dHB1dFBhcmFtZXRlcnMiPgotICAgICAgICAgIDxib2R5PlRoZSBvdXQsIGlub3V0IGFuZCByZXR1cm4gb3duZWRQYXJhbWV0ZXJzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJCZWhhdmlvci1vdXRwdXRQYXJhbWV0ZXJzLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQmVoYXZpb3Itb3V0cHV0UGFyYW1ldGVycyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkJlaGF2aW9yLW91dHB1dFBhcmFtZXRlcnMtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChvd25lZFBhcmFtZXRlci0+c2VsZWN0KGRpcmVjdGlvbj1QYXJhbWV0ZXJEaXJlY3Rpb25LaW5kOjpvdXQgb3IgZGlyZWN0aW9uPVBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Omlub3V0IG9yIGRpcmVjdGlvbj1QYXJhbWV0ZXJEaXJlY3Rpb25LaW5kOjpyZXR1cm4pKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCZWhhdmlvci1vdXRwdXRQYXJhbWV0ZXJzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQYXJhbWV0ZXIiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmVoYXZpb3Itb3V0cHV0UGFyYW1ldGVycy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkJlaGF2aW9yLW91dHB1dFBhcmFtZXRlcnMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ2FsbEV2ZW50IiBuYW1lPSJDYWxsRXZlbnQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNhbGxFdmVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNhbGxFdmVudCI+Ci0gICAgICAgIDxib2R5PkEgQ2FsbEV2ZW50IG1vZGVscyB0aGUgcmVjZWlwdCBieSBhbiBvYmplY3Qgb2YgYSBtZXNzYWdlIGludm9raW5nIGEgY2FsbCBvZiBhbiBPcGVyYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDYWxsRXZlbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik1lc3NhZ2VFdmVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2FsbEV2ZW50LW9wZXJhdGlvbiIgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJPcGVyYXRpb24iIGFzc29jaWF0aW9uPSJBX29wZXJhdGlvbl9jYWxsRXZlbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2FsbEV2ZW50LW9wZXJhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNhbGxFdmVudC1vcGVyYXRpb24iPgotICAgICAgICAgIDxib2R5PkRlc2lnbmF0ZXMgdGhlIE9wZXJhdGlvbiB3aG9zZSBpbnZvY2F0aW9uIHJhaXNlZCB0aGUgQ2FsRXZlbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNoYW5nZUV2ZW50IiBuYW1lPSJDaGFuZ2VFdmVudCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2hhbmdlRXZlbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDaGFuZ2VFdmVudCI+Ci0gICAgICAgIDxib2R5PkEgQ2hhbmdlRXZlbnQgbW9kZWxzIGEgY2hhbmdlIGluIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiB0aGF0IG1ha2VzIGEgY29uZGl0aW9uIHRydWUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDaGFuZ2VFdmVudC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRXZlbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNoYW5nZUV2ZW50LWNoYW5nZUV4cHJlc3Npb24iIG5hbWU9ImNoYW5nZUV4cHJlc3Npb24iIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9jaGFuZ2VFeHByZXNzaW9uX2NoYW5nZUV2ZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNoYW5nZUV2ZW50LWNoYW5nZUV4cHJlc3Npb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDaGFuZ2VFdmVudC1jaGFuZ2VFeHByZXNzaW9uIj4KLSAgICAgICAgICA8Ym9keT5BIEJvb2xlYW4tdmFsdWVkIFZhbHVlU3BlY2lmaWNhdGlvbiB0aGF0IHdpbGwgcmVzdWx0IGluIGEgQ2hhbmdlRXZlbnQgd2hlbmV2ZXIgaXRzIHZhbHVlIGNoYW5nZXMgZnJvbSBmYWxzZSB0byB0cnVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFdmVudCIgbmFtZT0iRXZlbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXZlbnQiPgotICAgICAgICA8Ym9keT5BbiBFdmVudCBpcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBzb21lIG9jY3VycmVuY2UgdGhhdCBtYXkgcG90ZW50aWFsbHkgdHJpZ2dlciBlZmZlY3RzIGJ5IGFuIG9iamVjdC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkV2ZW50LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJQYWNrYWdlYWJsZUVsZW1lbnQiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRnVuY3Rpb25CZWhhdmlvciIgbmFtZT0iRnVuY3Rpb25CZWhhdmlvciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRnVuY3Rpb25CZWhhdmlvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkZ1bmN0aW9uQmVoYXZpb3IiPgotICAgICAgICA8Ym9keT5BIEZ1bmN0aW9uQmVoYXZpb3IgaXMgYW4gT3BhcXVlQmVoYXZpb3IgdGhhdCBkb2VzIG5vdCBhY2Nlc3Mgb3IgbW9kaWZ5IGFueSBvYmplY3RzIG9yIG90aGVyIGV4dGVybmFsIGRhdGEuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRnVuY3Rpb25CZWhhdmlvci1vbmVfb3V0cHV0X3BhcmFtZXRlciIgbmFtZT0ib25lX291dHB1dF9wYXJhbWV0ZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iRnVuY3Rpb25CZWhhdmlvciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJGdW5jdGlvbkJlaGF2aW9yLW9uZV9vdXRwdXRfcGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRnVuY3Rpb25CZWhhdmlvci1vbmVfb3V0cHV0X3BhcmFtZXRlciI+Ci0gICAgICAgICAgPGJvZHk+QSBGdW5jdGlvbkJlaGF2aW9yIGhhcyBhdCBsZWFzdCBvbmUgb3V0cHV0IFBhcmFtZXRlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRnVuY3Rpb25CZWhhdmlvci1vbmVfb3V0cHV0X3BhcmFtZXRlci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2VsZi5vd25lZFBhcmFtZXRlci0+JiN4RDsKLSAgc2VsZWN0KHAgfCBwLmRpcmVjdGlvbiA9IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Om91dCBvciBwLmRpcmVjdGlvbj0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6aW5vdXQgb3IgcC5kaXJlY3Rpb249IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6OnJldHVybiktPnNpemUoKSA+PSAxPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJGdW5jdGlvbkJlaGF2aW9yLXR5cGVzX29mX3BhcmFtZXRlcnMiIG5hbWU9InR5cGVzX29mX3BhcmFtZXRlcnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iRnVuY3Rpb25CZWhhdmlvciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJGdW5jdGlvbkJlaGF2aW9yLXR5cGVzX29mX3BhcmFtZXRlcnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJGdW5jdGlvbkJlaGF2aW9yLXR5cGVzX29mX3BhcmFtZXRlcnMiPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlcyBvZiB0aGUgb3duZWRQYXJhbWV0ZXJzIGFyZSBhbGwgRGF0YVR5cGVzLCB3aGljaCBtYXkgbm90IG5lc3QgYW55dGhpbmcgYnV0IG90aGVyIERhdGFUeXBlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRnVuY3Rpb25CZWhhdmlvci10eXBlc19vZl9wYXJhbWV0ZXJzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vd25lZFBhcmFtZXRlci0+Zm9yQWxsKHAgfCBwLnR5cGUgJmx0Oz4gbnVsbCBhbmQmI3hEOwotICBwLnR5cGUub2NsSXNUeXBlT2YoRGF0YVR5cGUpIGFuZCBoYXNBbGxEYXRhVHlwZUF0dHJpYnV0ZXMocC50eXBlLm9jbEFzVHlwZShEYXRhVHlwZSkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJGdW5jdGlvbkJlaGF2aW9yLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJPcGFxdWVCZWhhdmlvciIvPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRnVuY3Rpb25CZWhhdmlvci1oYXNBbGxEYXRhVHlwZUF0dHJpYnV0ZXMiIG5hbWU9Imhhc0FsbERhdGFUeXBlQXR0cmlidXRlcyIgYm9keUNvbmRpdGlvbj0iRnVuY3Rpb25CZWhhdmlvci1oYXNBbGxEYXRhVHlwZUF0dHJpYnV0ZXMtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJGdW5jdGlvbkJlaGF2aW9yLWhhc0FsbERhdGFUeXBlQXR0cmlidXRlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkZ1bmN0aW9uQmVoYXZpb3ItaGFzQWxsRGF0YVR5cGVBdHRyaWJ1dGVzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgaGFzQWxsRGF0YVR5cGVBdHRyaWJ1dGVzIHF1ZXJ5IHRlc3RzIHdoZXRoZXIgdGhlIHR5cGVzIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBnaXZlbiBEYXRhVHlwZSBhcmUgYWxsIERhdGFUeXBlcywgYW5kIHNpbWlsYXJseSBmb3IgYWxsIHRob3NlIERhdGFUeXBlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iRnVuY3Rpb25CZWhhdmlvci1oYXNBbGxEYXRhVHlwZUF0dHJpYnV0ZXMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJGdW5jdGlvbkJlaGF2aW9yLWhhc0FsbERhdGFUeXBlQXR0cmlidXRlcyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkZ1bmN0aW9uQmVoYXZpb3ItaGFzQWxsRGF0YVR5cGVBdHRyaWJ1dGVzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoZC5vd25lZEF0dHJpYnV0ZS0+Zm9yQWxsKGEgfCYjeEQ7Ci0gICAgYS50eXBlLm9jbElzS2luZE9mKERhdGFUeXBlKSBhbmQmI3hEOwotICAgICAgaGFzQWxsRGF0YVR5cGVBdHRyaWJ1dGVzKGEudHlwZS5vY2xBc1R5cGUoRGF0YVR5cGUpKSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkZ1bmN0aW9uQmVoYXZpb3ItaGFzQWxsRGF0YVR5cGVBdHRyaWJ1dGVzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJGdW5jdGlvbkJlaGF2aW9yLWhhc0FsbERhdGFUeXBlQXR0cmlidXRlcy1kIiBuYW1lPSJkIiB0eXBlPSJEYXRhVHlwZSIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iTWVzc2FnZUV2ZW50IiBuYW1lPSJNZXNzYWdlRXZlbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2VFdmVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1lc3NhZ2VFdmVudCI+Ci0gICAgICAgIDxib2R5PkEgTWVzc2FnZUV2ZW50IHNwZWNpZmllcyB0aGUgcmVjZWlwdCBieSBhbiBvYmplY3Qgb2YgZWl0aGVyIGFuIE9wZXJhdGlvbiBjYWxsIG9yIGEgU2lnbmFsIGluc3RhbmNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iTWVzc2FnZUV2ZW50LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFdmVudCIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJPcGFxdWVCZWhhdmlvciIgbmFtZT0iT3BhcXVlQmVoYXZpb3IiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wYXF1ZUJlaGF2aW9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BhcXVlQmVoYXZpb3IiPgotICAgICAgICA8Ym9keT5BbiBPcGFxdWVCZWhhdmlvciBpcyBhIEJlaGF2aW9yIHdob3NlIHNwZWNpZmljYXRpb24gaXMgZ2l2ZW4gaW4gYSB0ZXh0dWFsIGxhbmd1YWdlIG90aGVyIHRoYW4gVU1MLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iT3BhcXVlQmVoYXZpb3ItX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkJlaGF2aW9yIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGFxdWVCZWhhdmlvci1ib2R5IiBuYW1lPSJib2R5IiBpc09yZGVyZWQ9InRydWUiIGlzVW5pcXVlPSJmYWxzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVCZWhhdmlvci1ib2R5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BhcXVlQmVoYXZpb3ItYm9keSI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBiZWhhdmlvciBpbiBvbmUgb3IgbW9yZSBsYW5ndWFnZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iT3BhcXVlQmVoYXZpb3ItYm9keS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik9wYXF1ZUJlaGF2aW9yLWJvZHktX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iT3BhcXVlQmVoYXZpb3ItbGFuZ3VhZ2UiIG5hbWU9Imxhbmd1YWdlIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BhcXVlQmVoYXZpb3ItbGFuZ3VhZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGFxdWVCZWhhdmlvci1sYW5ndWFnZSI+Ci0gICAgICAgICAgPGJvZHk+TGFuZ3VhZ2VzIHRoZSBib2R5IHN0cmluZ3MgdXNlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBib2R5IHN0cmluZ3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iT3BhcXVlQmVoYXZpb3ItbGFuZ3VhZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJPcGFxdWVCZWhhdmlvci1sYW5ndWFnZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlNpZ25hbEV2ZW50IiBuYW1lPSJTaWduYWxFdmVudCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2lnbmFsRXZlbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTaWduYWxFdmVudCI+Ci0gICAgICAgIDxib2R5PkEgU2lnbmFsRXZlbnQgcmVwcmVzZW50cyB0aGUgcmVjZWlwdCBvZiBhbiBhc3luY2hyb25vdXMgU2lnbmFsIGluc3RhbmNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU2lnbmFsRXZlbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik1lc3NhZ2VFdmVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU2lnbmFsRXZlbnQtc2lnbmFsIiBuYW1lPSJzaWduYWwiIHR5cGU9IlNpZ25hbCIgYXNzb2NpYXRpb249IkFfc2lnbmFsX3NpZ25hbEV2ZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNpZ25hbEV2ZW50LXNpZ25hbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNpZ25hbEV2ZW50LXNpZ25hbCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNwZWNpZmljIFNpZ25hbCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNpZ25hbEV2ZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJUaW1lRXZlbnQiIG5hbWU9IlRpbWVFdmVudCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGltZUV2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGltZUV2ZW50Ij4KLSAgICAgICAgPGJvZHk+QSBUaW1lRXZlbnQgaXMgYW4gRXZlbnQgdGhhdCBvY2N1cnMgYXQgYSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRpbWVFdmVudC13aGVuX25vbl9uZWdhdGl2ZSIgbmFtZT0id2hlbl9ub25fbmVnYXRpdmUiIGNvbnN0cmFpbmVkRWxlbWVudD0iVGltZUV2ZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRpbWVFdmVudC13aGVuX25vbl9uZWdhdGl2ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRpbWVFdmVudC13aGVuX25vbl9uZWdhdGl2ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFZhbHVlU3BlY2lmaWNhdGlvbiB3aGVuIG11c3QgcmV0dXJuIGEgbm9uLW5lZ2F0aXZlIEludGVnZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRpbWVFdmVudC13aGVuX25vbl9uZWdhdGl2ZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+d2hlbi5pbnRlZ2VyVmFsdWUoKSA+PSAwPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlRpbWVFdmVudC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRXZlbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRpbWVFdmVudC1pc1JlbGF0aXZlIiBuYW1lPSJpc1JlbGF0aXZlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRpbWVFdmVudC1pc1JlbGF0aXZlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGltZUV2ZW50LWlzUmVsYXRpdmUiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB3aGV0aGVyIHRoZSBUaW1lRXZlbnQgaXMgc3BlY2lmaWVkIGFzIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIHRpbWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iVGltZUV2ZW50LWlzUmVsYXRpdmUtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRpbWVFdmVudC13aGVuIiBuYW1lPSJ3aGVuIiB0eXBlPSJUaW1lRXhwcmVzc2lvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV93aGVuX3RpbWVFdmVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUaW1lRXZlbnQtd2hlbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRpbWVFdmVudC13aGVuIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhlIHRpbWUgb2YgdGhlIFRpbWVFdmVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVHJpZ2dlciIgbmFtZT0iVHJpZ2dlciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJpZ2dlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyaWdnZXIiPgotICAgICAgICA8Ym9keT5BIFRyaWdnZXIgc3BlY2lmaWVzIGEgc3BlY2lmaWMgcG9pbnQgIGF0IHdoaWNoIGFuIEV2ZW50IG9jY3VycmVuY2UgbWF5IHRyaWdnZXIgYW4gZWZmZWN0IGluIGEgQmVoYXZpb3IuIEEgVHJpZ2dlciBtYXkgYmUgcXVhbGlmaWVkIGJ5IHRoZSBQb3J0IG9uIHdoaWNoIHRoZSBFdmVudCBvY2N1cnJlZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJUcmlnZ2VyLXRyaWdnZXJfd2l0aF9wb3J0cyIgbmFtZT0idHJpZ2dlcl93aXRoX3BvcnRzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlRyaWdnZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJpZ2dlci10cmlnZ2VyX3dpdGhfcG9ydHMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmlnZ2VyLXRyaWdnZXJfd2l0aF9wb3J0cyI+Ci0gICAgICAgICAgPGJvZHk+SWYgYSBUcmlnZ2VyIHNwZWNpZmllcyBvbmUgb3IgbW9yZSBwb3J0cywgdGhlIGV2ZW50IG9mIHRoZSBUcmlnZ2VyIG11c3QgYmUgYSBNZXNzYWdlRXZlbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRyaWdnZXItdHJpZ2dlcl93aXRoX3BvcnRzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5wb3J0LT5ub3RFbXB0eSgpIGltcGxpZXMgZXZlbnQub2NsSXNLaW5kT2YoTWVzc2FnZUV2ZW50KTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJUcmlnZ2VyLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRyaWdnZXItZXZlbnQiIG5hbWU9ImV2ZW50IiB0eXBlPSJFdmVudCIgYXNzb2NpYXRpb249IkFfZXZlbnRfdHJpZ2dlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmlnZ2VyLWV2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHJpZ2dlci1ldmVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEV2ZW50IHRoYXQgZGV0ZWN0ZWQgYnkgdGhlIFRyaWdnZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUcmlnZ2VyLXBvcnQiIG5hbWU9InBvcnQiIHR5cGU9IlBvcnQiIGFzc29jaWF0aW9uPSJBX3BvcnRfdHJpZ2dlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmlnZ2VyLXBvcnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmlnZ2VyLXBvcnQiPgotICAgICAgICAgIDxib2R5PkEgb3B0aW9uYWwgUG9ydCBvZiB0aHJvdWdoIHdoaWNoIHRoZSBnaXZlbiBlZmZlY3QgaXMgZGV0ZWN0ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJUcmlnZ2VyLXBvcnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJUcmlnZ2VyLXBvcnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2V2ZW50X3RyaWdnZXIiIG5hbWU9IkFfZXZlbnRfdHJpZ2dlciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJUcmlnZ2VyLWV2ZW50IEFfZXZlbnRfdHJpZ2dlci10cmlnZ2VyIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZXZlbnRfdHJpZ2dlci10cmlnZ2VyIiBuYW1lPSJ0cmlnZ2VyIiB0eXBlPSJUcmlnZ2VyIiBhc3NvY2lhdGlvbj0iQV9ldmVudF90cmlnZ2VyIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2V2ZW50X3RyaWdnZXItdHJpZ2dlci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfZXZlbnRfdHJpZ2dlci10cmlnZ2VyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9wb3J0X3RyaWdnZXIiIG5hbWU9IkFfcG9ydF90cmlnZ2VyIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRyaWdnZXItcG9ydCBBX3BvcnRfdHJpZ2dlci10cmlnZ2VyIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcG9ydF90cmlnZ2VyLXRyaWdnZXIiIG5hbWU9InRyaWdnZXIiIHR5cGU9IlRyaWdnZXIiIGFzc29jaWF0aW9uPSJBX3BvcnRfdHJpZ2dlciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9wb3J0X3RyaWdnZXItdHJpZ2dlci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcG9ydF90cmlnZ2VyLXRyaWdnZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3doZW5fdGltZUV2ZW50IiBuYW1lPSJBX3doZW5fdGltZUV2ZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRpbWVFdmVudC13aGVuIEFfd2hlbl90aW1lRXZlbnQtdGltZUV2ZW50Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfd2hlbl90aW1lRXZlbnQtdGltZUV2ZW50IiBuYW1lPSJ0aW1lRXZlbnQiIHR5cGU9IlRpbWVFdmVudCIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX3doZW5fdGltZUV2ZW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3doZW5fdGltZUV2ZW50LXRpbWVFdmVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zaWduYWxfc2lnbmFsRXZlbnQiIG5hbWU9IkFfc2lnbmFsX3NpZ25hbEV2ZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlNpZ25hbEV2ZW50LXNpZ25hbCBBX3NpZ25hbF9zaWduYWxFdmVudC1zaWduYWxFdmVudCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3NpZ25hbF9zaWduYWxFdmVudC1zaWduYWxFdmVudCIgbmFtZT0ic2lnbmFsRXZlbnQiIHR5cGU9IlNpZ25hbEV2ZW50IiBhc3NvY2lhdGlvbj0iQV9zaWduYWxfc2lnbmFsRXZlbnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc2lnbmFsX3NpZ25hbEV2ZW50LXNpZ25hbEV2ZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9zaWduYWxfc2lnbmFsRXZlbnQtc2lnbmFsRXZlbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NoYW5nZUV4cHJlc3Npb25fY2hhbmdlRXZlbnQiIG5hbWU9IkFfY2hhbmdlRXhwcmVzc2lvbl9jaGFuZ2VFdmVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDaGFuZ2VFdmVudC1jaGFuZ2VFeHByZXNzaW9uIEFfY2hhbmdlRXhwcmVzc2lvbl9jaGFuZ2VFdmVudC1jaGFuZ2VFdmVudCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2NoYW5nZUV4cHJlc3Npb25fY2hhbmdlRXZlbnQtY2hhbmdlRXZlbnQiIG5hbWU9ImNoYW5nZUV2ZW50IiB0eXBlPSJDaGFuZ2VFdmVudCIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2NoYW5nZUV4cHJlc3Npb25fY2hhbmdlRXZlbnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfY2hhbmdlRXhwcmVzc2lvbl9jaGFuZ2VFdmVudC1jaGFuZ2VFdmVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vcGVyYXRpb25fY2FsbEV2ZW50IiBuYW1lPSJBX29wZXJhdGlvbl9jYWxsRXZlbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ2FsbEV2ZW50LW9wZXJhdGlvbiBBX29wZXJhdGlvbl9jYWxsRXZlbnQtY2FsbEV2ZW50Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb3BlcmF0aW9uX2NhbGxFdmVudC1jYWxsRXZlbnQiIG5hbWU9ImNhbGxFdmVudCIgdHlwZT0iQ2FsbEV2ZW50IiBhc3NvY2lhdGlvbj0iQV9vcGVyYXRpb25fY2FsbEV2ZW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX29wZXJhdGlvbl9jYWxsRXZlbnQtY2FsbEV2ZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9vcGVyYXRpb25fY2FsbEV2ZW50LWNhbGxFdmVudC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRQYXJhbWV0ZXJTZXRfYmVoYXZpb3IiIG5hbWU9IkFfb3duZWRQYXJhbWV0ZXJTZXRfYmVoYXZpb3IiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQmVoYXZpb3Itb3duZWRQYXJhbWV0ZXJTZXQgQV9vd25lZFBhcmFtZXRlclNldF9iZWhhdmlvci1iZWhhdmlvciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX293bmVkUGFyYW1ldGVyU2V0X2JlaGF2aW9yLWJlaGF2aW9yIiBuYW1lPSJiZWhhdmlvciIgdHlwZT0iQmVoYXZpb3IiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9vd25lZFBhcmFtZXRlclNldF9iZWhhdmlvciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vd25lZFBhcmFtZXRlclNldF9iZWhhdmlvci1iZWhhdmlvci1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jb250ZXh0X2JlaGF2aW9yIiBuYW1lPSJBX2NvbnRleHRfYmVoYXZpb3IiIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJCZWhhdmlvci1jb250ZXh0IEFfY29udGV4dF9iZWhhdmlvci1iZWhhdmlvciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2NvbnRleHRfYmVoYXZpb3ItYmVoYXZpb3IiIG5hbWU9ImJlaGF2aW9yIiB0eXBlPSJCZWhhdmlvciIgc3Vic2V0dGVkUHJvcGVydHk9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9jb250ZXh0X2JlaGF2aW9yIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2NvbnRleHRfYmVoYXZpb3ItYmVoYXZpb3ItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NvbnRleHRfYmVoYXZpb3ItYmVoYXZpb3ItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3ByZWNvbmRpdGlvbl9iZWhhdmlvciIgbmFtZT0iQV9wcmVjb25kaXRpb25fYmVoYXZpb3IiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQmVoYXZpb3ItcHJlY29uZGl0aW9uIEFfcHJlY29uZGl0aW9uX2JlaGF2aW9yLWJlaGF2aW9yIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcHJlY29uZGl0aW9uX2JlaGF2aW9yLWJlaGF2aW9yIiBuYW1lPSJiZWhhdmlvciIgdHlwZT0iQmVoYXZpb3IiIHN1YnNldHRlZFByb3BlcnR5PSJDb25zdHJhaW50LWNvbnRleHQiIGFzc29jaWF0aW9uPSJBX3ByZWNvbmRpdGlvbl9iZWhhdmlvciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9wcmVjb25kaXRpb25fYmVoYXZpb3ItYmVoYXZpb3ItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcG9zdGNvbmRpdGlvbl9iZWhhdmlvciIgbmFtZT0iQV9wb3N0Y29uZGl0aW9uX2JlaGF2aW9yIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkJlaGF2aW9yLXBvc3Rjb25kaXRpb24gQV9wb3N0Y29uZGl0aW9uX2JlaGF2aW9yLWJlaGF2aW9yIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcG9zdGNvbmRpdGlvbl9iZWhhdmlvci1iZWhhdmlvciIgbmFtZT0iYmVoYXZpb3IiIHR5cGU9IkJlaGF2aW9yIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQ29uc3RyYWludC1jb250ZXh0IiBhc3NvY2lhdGlvbj0iQV9wb3N0Y29uZGl0aW9uX2JlaGF2aW9yIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Bvc3Rjb25kaXRpb25fYmVoYXZpb3ItYmVoYXZpb3ItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVkZWZpbmVkQmVoYXZpb3JfYmVoYXZpb3IiIG5hbWU9IkFfcmVkZWZpbmVkQmVoYXZpb3JfYmVoYXZpb3IiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQmVoYXZpb3ItcmVkZWZpbmVkQmVoYXZpb3IgQV9yZWRlZmluZWRCZWhhdmlvcl9iZWhhdmlvci1iZWhhdmlvciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlZGVmaW5lZEJlaGF2aW9yX2JlaGF2aW9yLWJlaGF2aW9yIiBuYW1lPSJiZWhhdmlvciIgdHlwZT0iQmVoYXZpb3IiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5lZENsYXNzaWZpZXJfY2xhc3NpZmllci1jbGFzc2lmaWVyIiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluZWRCZWhhdmlvcl9iZWhhdmlvciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZWRlZmluZWRCZWhhdmlvcl9iZWhhdmlvci1iZWhhdmlvci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcmVkZWZpbmVkQmVoYXZpb3JfYmVoYXZpb3ItYmVoYXZpb3ItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX293bmVkUGFyYW1ldGVyX2JlaGF2aW9yIiBuYW1lPSJBX293bmVkUGFyYW1ldGVyX2JlaGF2aW9yIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkJlaGF2aW9yLW93bmVkUGFyYW1ldGVyIEFfb3duZWRQYXJhbWV0ZXJfYmVoYXZpb3ItYmVoYXZpb3IiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vd25lZFBhcmFtZXRlcl9iZWhhdmlvci1iZWhhdmlvciIgbmFtZT0iYmVoYXZpb3IiIHR5cGU9IkJlaGF2aW9yIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfb3duZWRQYXJhbWV0ZXJfYmVoYXZpb3IiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfb3duZWRQYXJhbWV0ZXJfYmVoYXZpb3ItYmVoYXZpb3ItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkFic3RyYWN0aW9uIiBuYW1lPSJBYnN0cmFjdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWJzdHJhY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBYnN0cmFjdGlvbiI+Ci0gICAgICAgIDxib2R5PkFuIEFic3RyYWN0aW9uIGlzIGEgUmVsYXRpb25zaGlwIHRoYXQgcmVsYXRlcyB0d28gRWxlbWVudHMgb3Igc2V0cyBvZiBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCB0aGUgc2FtZSBjb25jZXB0IGF0IGRpZmZlcmVudCBsZXZlbHMgb2YgYWJzdHJhY3Rpb24gb3IgZnJvbSBkaWZmZXJlbnQgdmlld3BvaW50cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFic3RyYWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJEZXBlbmRlbmN5Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBYnN0cmFjdGlvbi1tYXBwaW5nIiBuYW1lPSJtYXBwaW5nIiB0eXBlPSJPcGFxdWVFeHByZXNzaW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX21hcHBpbmdfYWJzdHJhY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWJzdHJhY3Rpb24tbWFwcGluZy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFic3RyYWN0aW9uLW1hcHBpbmciPgotICAgICAgICAgIDxib2R5PkFuIE9wYXF1ZUV4cHJlc3Npb24gdGhhdCBzdGF0ZXMgdGhlIGFic3RyYWN0aW9uIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBzdXBwbGllcihzKSBhbmQgdGhlIGNsaWVudChzKS4gSW4gc29tZSBjYXNlcywgc3VjaCBhcyBkZXJpdmF0aW9uLCBpdCBpcyB1c3VhbGx5IGZvcm1hbCBhbmQgdW5pZGlyZWN0aW9uYWw7IGluIG90aGVyIGNhc2VzLCBzdWNoIGFzIHRyYWNlLCBpdCBpcyB1c3VhbGx5IGluZm9ybWFsIGFuZCBiaWRpcmVjdGlvbmFsLiBUaGUgbWFwcGluZyBleHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBtYXkgYmUgb21pdHRlZCBpZiB0aGUgcHJlY2lzZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgRWxlbWVudHMgaXMgbm90IHNwZWNpZmllZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFic3RyYWN0aW9uLW1hcHBpbmctX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNvbW1lbnQiIG5hbWU9IkNvbW1lbnQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21tZW50Ij4KLSAgICAgICAgPGJvZHk+QSBDb21tZW50IGlzIGEgdGV4dHVhbCBhbm5vdGF0aW9uIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgc2V0IG9mIEVsZW1lbnRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQ29tbWVudC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29tbWVudC1hbm5vdGF0ZWRFbGVtZW50IiBuYW1lPSJhbm5vdGF0ZWRFbGVtZW50IiB0eXBlPSJFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9hbm5vdGF0ZWRFbGVtZW50X2NvbW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tbWVudC1hbm5vdGF0ZWRFbGVtZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29tbWVudC1hbm5vdGF0ZWRFbGVtZW50Ij4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBFbGVtZW50KHMpIGJlaW5nIGNvbW1lbnRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbW1lbnQtYW5ub3RhdGVkRWxlbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNvbW1lbnQtYW5ub3RhdGVkRWxlbWVudC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb21tZW50LWJvZHkiIG5hbWU9ImJvZHkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tbWVudC1ib2R5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29tbWVudC1ib2R5Ij4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBpcyB0aGUgY29tbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb21tZW50LWJvZHktX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNvbnN0cmFpbnQiIG5hbWU9IkNvbnN0cmFpbnQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbnN0cmFpbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25zdHJhaW50Ij4KLSAgICAgICAgPGJvZHk+QSBDb25zdHJhaW50IGlzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGFuIEVsZW1lbnQgb3Igc2V0IG9mIEVsZW1lbnRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbnN0cmFpbnQtYm9vbGVhbl92YWx1ZSIgbmFtZT0iYm9vbGVhbl92YWx1ZSIgY29uc3RyYWluZWRFbGVtZW50PSJDb25zdHJhaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbnN0cmFpbnQtYm9vbGVhbl92YWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbnN0cmFpbnQtYm9vbGVhbl92YWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFZhbHVlU3BlY2lmaWNhdGlvbiBmb3IgYSBDb25zdHJhaW50IG11c3QgZXZhbHVhdGUgdG8gYSBCb29sZWFuIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb25zdHJhaW50LWJvb2xlYW5fdmFsdWUtX3NwZWNpZmljYXRpb24iIGxhbmd1YWdlPSIiLz4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbnN0cmFpbnQtbm9fc2lkZV9lZmZlY3RzIiBuYW1lPSJub19zaWRlX2VmZmVjdHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ29uc3RyYWludCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25zdHJhaW50LW5vX3NpZGVfZWZmZWN0cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbnN0cmFpbnQtbm9fc2lkZV9lZmZlY3RzIj4KLSAgICAgICAgICA8Ym9keT5FdmFsdWF0aW5nIHRoZSBWYWx1ZVNwZWNpZmljYXRpb24gZm9yIGEgQ29uc3RyYWludCBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ29uc3RyYWludC1ub19zaWRlX2VmZmVjdHMtX3NwZWNpZmljYXRpb24iIGxhbmd1YWdlPSIiLz4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbnN0cmFpbnQtbm90X2FwcGx5X3RvX3NlbGYiIG5hbWU9Im5vdF9hcHBseV90b19zZWxmIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbnN0cmFpbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29uc3RyYWludC1ub3RfYXBwbHlfdG9fc2VsZi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbnN0cmFpbnQtbm90X2FwcGx5X3RvX3NlbGYiPgotICAgICAgICAgIDxib2R5PkEgQ29uc3RyYWludCBjYW5ub3QgYmUgYXBwbGllZCB0byBpdHNlbGYuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbnN0cmFpbnQtbm90X2FwcGx5X3RvX3NlbGYtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5vdCBjb25zdHJhaW5lZEVsZW1lbnQtPmluY2x1ZGVzKHNlbGYpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNvbnN0cmFpbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlBhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29uc3RyYWludC1jb25zdHJhaW5lZEVsZW1lbnQiIG5hbWU9ImNvbnN0cmFpbmVkRWxlbWVudCIgdHlwZT0iRWxlbWVudCIgaXNPcmRlcmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9jb25zdHJhaW5lZEVsZW1lbnRfY29uc3RyYWludCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25zdHJhaW50LWNvbnN0cmFpbmVkRWxlbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbnN0cmFpbnQtY29uc3RyYWluZWRFbGVtZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgb3JkZXJlZCBzZXQgb2YgRWxlbWVudHMgcmVmZXJlbmNlZCBieSB0aGlzIENvbnN0cmFpbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb25zdHJhaW50LWNvbnN0cmFpbmVkRWxlbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNvbnN0cmFpbnQtY29uc3RyYWluZWRFbGVtZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbnN0cmFpbnQtY29udGV4dCIgbmFtZT0iY29udGV4dCIgdHlwZT0iTmFtZXNwYWNlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfb3duZWRSdWxlX2NvbnRleHQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29uc3RyYWludC1jb250ZXh0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29uc3RyYWludC1jb250ZXh0Ij4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhlIE5hbWVzcGFjZSB0aGF0IG93bnMgdGhlIENvbnN0cmFpbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb25zdHJhaW50LWNvbnRleHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb25zdHJhaW50LXNwZWNpZmljYXRpb24iIG5hbWU9InNwZWNpZmljYXRpb24iIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9zcGVjaWZpY2F0aW9uX293bmluZ0NvbnN0cmFpbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8Ym9keT5BIGNvbmRpdGlvbiB0aGF0IG11c3QgYmUgdHJ1ZSB3aGVuIGV2YWx1YXRlZCBpbiBvcmRlciBmb3IgdGhlIENvbnN0cmFpbnQgdG8gYmUgc2F0aXNmaWVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJEZXBlbmRlbmN5IiBuYW1lPSJEZXBlbmRlbmN5Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZXBlbmRlbmN5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVwZW5kZW5jeSI+Ci0gICAgICAgIDxib2R5PkEgRGVwZW5kZW5jeSBpcyBhIFJlbGF0aW9uc2hpcCB0aGF0IHNpZ25pZmllcyB0aGF0IGEgc2luZ2xlIG1vZGVsIEVsZW1lbnQgb3IgYSBzZXQgb2YgbW9kZWwgRWxlbWVudHMgcmVxdWlyZXMgb3RoZXIgbW9kZWwgRWxlbWVudHMgZm9yIHRoZWlyIHNwZWNpZmljYXRpb24gb3IgaW1wbGVtZW50YXRpb24uIFRoaXMgbWVhbnMgdGhhdCB0aGUgY29tcGxldGUgc2VtYW50aWNzIG9mIHRoZSBjbGllbnQgRWxlbWVudChzKSBhcmUgZWl0aGVyIHNlbWFudGljYWxseSBvciBzdHJ1Y3R1cmFsbHkgZGVwZW5kZW50IG9uIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzdXBwbGllciBFbGVtZW50KHMpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRGVwZW5kZW5jeS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkRlcGVuZGVuY3ktX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IlBhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRGVwZW5kZW5jeS1jbGllbnQiIG5hbWU9ImNsaWVudCIgdHlwZT0iTmFtZWRFbGVtZW50IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAtc291cmNlIiBhc3NvY2lhdGlvbj0iQV9jbGllbnREZXBlbmRlbmN5X2NsaWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZXBlbmRlbmN5LWNsaWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRlcGVuZGVuY3ktY2xpZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgRWxlbWVudChzKSBkZXBlbmRlbnQgb24gdGhlIHN1cHBsaWVyIEVsZW1lbnQocykuIEluIHNvbWUgY2FzZXMgKHN1Y2ggYXMgYSB0cmFjZSBBYnN0cmFjdGlvbikgdGhlIGFzc2lnbm1lbnQgb2YgZGlyZWN0aW9uICh0aGF0IGlzLCB0aGUgZGVzaWduYXRpb24gb2YgdGhlIGNsaWVudCBFbGVtZW50KSBpcyBhdCB0aGUgZGlzY3JldGlvbiBvZiB0aGUgbW9kZWxlciBhbmQgaXMgYSBzdGlwdWxhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkRlcGVuZGVuY3ktY2xpZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkRlcGVuZGVuY3ktc3VwcGxpZXIiIG5hbWU9InN1cHBsaWVyIiB0eXBlPSJOYW1lZEVsZW1lbnQiIHN1YnNldHRlZFByb3BlcnR5PSJEaXJlY3RlZFJlbGF0aW9uc2hpcC10YXJnZXQiIGFzc29jaWF0aW9uPSJBX3N1cHBsaWVyX3N1cHBsaWVyRGVwZW5kZW5jeSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZXBlbmRlbmN5LXN1cHBsaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVwZW5kZW5jeS1zdXBwbGllciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEVsZW1lbnQocykgb24gd2hpY2ggdGhlIGNsaWVudCBFbGVtZW50KHMpIGRlcGVuZCBpbiBzb21lIHJlc3BlY3QuIFRoZSBtb2RlbGVyIG1heSBzdGlwdWxhdGUgYSBzZW5zZSBvZiBEZXBlbmRlbmN5IGRpcmVjdGlvbiBzdWl0YWJsZSBmb3IgdGhlaXIgZG9tYWluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRGVwZW5kZW5jeS1zdXBwbGllci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkRpcmVjdGVkUmVsYXRpb25zaGlwIiBuYW1lPSJEaXJlY3RlZFJlbGF0aW9uc2hpcCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEaXJlY3RlZFJlbGF0aW9uc2hpcCI+Ci0gICAgICAgIDxib2R5PkEgRGlyZWN0ZWRSZWxhdGlvbnNoaXAgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgY29sbGVjdGlvbiBvZiBzb3VyY2UgbW9kZWwgRWxlbWVudHMgYW5kIGEgY29sbGVjdGlvbiBvZiB0YXJnZXQgbW9kZWwgRWxlbWVudHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJEaXJlY3RlZFJlbGF0aW9uc2hpcC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iUmVsYXRpb25zaGlwIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJEaXJlY3RlZFJlbGF0aW9uc2hpcC1zb3VyY2UiIG5hbWU9InNvdXJjZSIgdHlwZT0iRWxlbWVudCIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBpc0Rlcml2ZWRVbmlvbj0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IlJlbGF0aW9uc2hpcC1yZWxhdGVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfc291cmNlX2RpcmVjdGVkUmVsYXRpb25zaGlwIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXNvdXJjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXNvdXJjZSI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBzb3VyY2UgRWxlbWVudChzKSBvZiB0aGUgRGlyZWN0ZWRSZWxhdGlvbnNoaXAuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJEaXJlY3RlZFJlbGF0aW9uc2hpcC1zb3VyY2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAtdGFyZ2V0IiBuYW1lPSJ0YXJnZXQiIHR5cGU9IkVsZW1lbnQiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIHN1YnNldHRlZFByb3BlcnR5PSJSZWxhdGlvbnNoaXAtcmVsYXRlZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3RhcmdldF9kaXJlY3RlZFJlbGF0aW9uc2hpcCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEaXJlY3RlZFJlbGF0aW9uc2hpcC10YXJnZXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEaXJlY3RlZFJlbGF0aW9uc2hpcC10YXJnZXQiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB0aGUgdGFyZ2V0IEVsZW1lbnQocykgb2YgdGhlIERpcmVjdGVkUmVsYXRpb25zaGlwLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAtdGFyZ2V0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRWxlbWVudCIgbmFtZT0iRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQiPgotICAgICAgICA8Ym9keT5BbiBFbGVtZW50IGlzIGEgY29uc3RpdHVlbnQgb2YgYSBtb2RlbC4gQXMgc3VjaCwgaXQgaGFzIHRoZSBjYXBhYmlsaXR5IG9mIG93bmluZyBvdGhlciBFbGVtZW50cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJFbGVtZW50LWhhc19vd25lciIgbmFtZT0iaGFzX293bmVyIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkVsZW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1oYXNfb3duZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWhhc19vd25lciI+Ci0gICAgICAgICAgPGJvZHk+RWxlbWVudHMgdGhhdCBtdXN0IGJlIG93bmVkIG11c3QgaGF2ZSBhbiBvd25lci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRWxlbWVudC1oYXNfb3duZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm11c3RCZU93bmVkKCkgaW1wbGllcyBvd25lci0+bm90RW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRWxlbWVudC1ub3Rfb3duX3NlbGYiIG5hbWU9Im5vdF9vd25fc2VsZiIgY29uc3RyYWluZWRFbGVtZW50PSJFbGVtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtbm90X293bl9zZWxmLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1ub3Rfb3duX3NlbGYiPgotICAgICAgICAgIDxib2R5PkFuIGVsZW1lbnQgbWF5IG5vdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IG93biBpdHNlbGYuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkVsZW1lbnQtbm90X293bl9zZWxmLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5ub3QgYWxsT3duZWRFbGVtZW50cygpLT5pbmNsdWRlcyhzZWxmKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFbGVtZW50LV9nZW5lcmFsaXphdGlvbi4wIj4KLSAgICAgICAgPGdlbmVyYWwgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iRWNvcmUubWV0YW1vZGVsLnVtbCNFTW9kZWxFbGVtZW50Ii8+Ci0gICAgICA8L2dlbmVyYWxpemF0aW9uPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRWxlbWVudC1vd25lZENvbW1lbnQiIG5hbWU9Im93bmVkQ29tbWVudCIgdHlwZT0iQ29tbWVudCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9vd25lZENvbW1lbnRfb3duaW5nRWxlbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LW93bmVkQ29tbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtb3duZWRDb21tZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgQ29tbWVudHMgb3duZWQgYnkgdGhpcyBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRWxlbWVudC1vd25lZENvbW1lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFbGVtZW50LW93bmVkQ29tbWVudC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFbGVtZW50LW93bmVkRWxlbWVudCIgbmFtZT0ib3duZWRFbGVtZW50IiB0eXBlPSJFbGVtZW50IiBpc1JlYWRPbmx5PSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBpc0Rlcml2ZWQ9InRydWUiIGlzRGVyaXZlZFVuaW9uPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9vd25lZEVsZW1lbnRfb3duZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1vd25lZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LW93bmVkRWxlbWVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEVsZW1lbnRzIG93bmVkIGJ5IHRoaXMgRWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVsZW1lbnQtb3duZWRFbGVtZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1vd25lZEVsZW1lbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRWxlbWVudC1vd25lciIgbmFtZT0ib3duZXIiIHR5cGU9IkVsZW1lbnQiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIGFzc29jaWF0aW9uPSJBX293bmVkRWxlbWVudF9vd25lciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LW93bmVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1vd25lciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEVsZW1lbnQgdGhhdCBvd25zIHRoaXMgRWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVsZW1lbnQtb3duZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWFkZEtleXdvcmQiIG5hbWU9ImFkZEtleXdvcmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1hZGRLZXl3b3JkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1hZGRLZXl3b3JkIj4KLSAgICAgICAgICA8Ym9keT5BZGRzIHRoZSBzcGVjaWZpZWQga2V5d29yZCB0byB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1hZGRLZXl3b3JkLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWFkZEtleXdvcmQta2V5d29yZCIgbmFtZT0ia2V5d29yZCIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1hZGRLZXl3b3JkLWtleXdvcmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWFkZEtleXdvcmQta2V5d29yZCI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUga2V5d29yZCB0byBhZGQuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtYXBwbHlTdGVyZW90eXBlIiBuYW1lPSJhcHBseVN0ZXJlb3R5cGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1hcHBseVN0ZXJlb3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWFwcGx5U3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGJvZHk+QXBwbGllcyB0aGUgc3BlY2lmaWVkIHN0ZXJlb3R5cGUgdG8gdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtYXBwbHlTdGVyZW90eXBlLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iRWNvcmUubWV0YW1vZGVsLnVtbCNFT2JqZWN0Ii8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtYXBwbHlTdGVyZW90eXBlLXN0ZXJlb3R5cGUiIG5hbWU9InN0ZXJlb3R5cGUiIHR5cGU9IlN0ZXJlb3R5cGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtYXBwbHlTdGVyZW90eXBlLXN0ZXJlb3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWFwcGx5U3RlcmVvdHlwZS1zdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBzdGVyZW90eXBlIHRvIGFwcGx5LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWNyZWF0ZUVBbm5vdGF0aW9uIiBuYW1lPSJjcmVhdGVFQW5ub3RhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWNyZWF0ZUVBbm5vdGF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1jcmVhdGVFQW5ub3RhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhbiBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIHRoaXMgZWxlbWVudCBhcyBpdHMgbW9kZWwgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWNyZWF0ZUVBbm5vdGF0aW9uLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iRWNvcmUubWV0YW1vZGVsLnVtbCNFQW5ub3RhdGlvbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWNyZWF0ZUVBbm5vdGF0aW9uLXNvdXJjZSIgbmFtZT0ic291cmNlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWNyZWF0ZUVBbm5vdGF0aW9uLXNvdXJjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtY3JlYXRlRUFubm90YXRpb24tc291cmNlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBzb3VyY2UgZm9yIHRoZSBuZXcgYW5ub3RhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRWxlbWVudC1kZXN0cm95IiBuYW1lPSJkZXN0cm95Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtZGVzdHJveS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtZGVzdHJveSI+Ci0gICAgICAgICAgPGJvZHk+RGVzdHJveXMgdGhpcyBlbGVtZW50IGJ5IHJlbW92aW5nIGFsbCBjcm9zcyByZWZlcmVuY2VzIHRvL2Zyb20gaXQgYW5kIHJlbW92aW5nIGl0IGZyb20gaXRzIGNvbnRhaW5pbmcgcmVzb3VyY2Ugb3Igb2JqZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRWxlbWVudC1nZXRLZXl3b3JkcyIgbmFtZT0iZ2V0S2V5d29yZHMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRLZXl3b3Jkcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtZ2V0S2V5d29yZHMiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUga2V5d29yZHMgZm9yIHRoaXMgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWdldEtleXdvcmRzLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFbGVtZW50LWdldEtleXdvcmRzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFbGVtZW50LWdldEtleXdvcmRzLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGljYWJsZVN0ZXJlb3R5cGUiIG5hbWU9ImdldEFwcGxpY2FibGVTdGVyZW90eXBlIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGljYWJsZVN0ZXJlb3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldEFwcGxpY2FibGVTdGVyZW90eXBlIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIHN0ZXJlb3R5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZCBuYW1lIHRoYXQgaXMgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQsIG9yIG51bGwgaWYgbm8gc3VjaCBzdGVyZW90eXBlIGlzIGFwcGxpY2FibGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWNhYmxlU3RlcmVvdHlwZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iU3RlcmVvdHlwZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWNhYmxlU3RlcmVvdHlwZS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWNhYmxlU3RlcmVvdHlwZS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWNhYmxlU3RlcmVvdHlwZS1xdWFsaWZpZWROYW1lIiBuYW1lPSJxdWFsaWZpZWROYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldEFwcGxpY2FibGVTdGVyZW90eXBlLXF1YWxpZmllZE5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldEFwcGxpY2FibGVTdGVyZW90eXBlLXF1YWxpZmllZE5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhcHBsaWNhYmxlIHN0ZXJlb3R5cGUgdG8gcmV0cmlldmUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGljYWJsZVN0ZXJlb3R5cGVzIiBuYW1lPSJnZXRBcHBsaWNhYmxlU3RlcmVvdHlwZXMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWNhYmxlU3RlcmVvdHlwZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldEFwcGxpY2FibGVTdGVyZW90eXBlcyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBzdGVyZW90eXBlcyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudCwgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIHJlcXVpcmVkIGFuZC9vciBtYXkgYWxyZWFkeSBiZSBhcHBsaWVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGljYWJsZVN0ZXJlb3R5cGVzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJTdGVyZW90eXBlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFbGVtZW50LWdldEFwcGxpY2FibGVTdGVyZW90eXBlcy1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWNhYmxlU3RlcmVvdHlwZXMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3RlcmVvdHlwZSIgbmFtZT0iZ2V0QXBwbGllZFN0ZXJlb3R5cGUiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3RlcmVvdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgc3RlcmVvdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkIG5hbWUgdGhhdCBpcyBhcHBsaWVkIHRvIHRoaXMgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBzdWNoIHN0ZXJlb3R5cGUgaXMgIGFwcGxpZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3RlcmVvdHlwZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iU3RlcmVvdHlwZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3RlcmVvdHlwZS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3RlcmVvdHlwZS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3RlcmVvdHlwZS1xdWFsaWZpZWROYW1lIiBuYW1lPSJxdWFsaWZpZWROYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldEFwcGxpZWRTdGVyZW90eXBlLXF1YWxpZmllZE5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldEFwcGxpZWRTdGVyZW90eXBlLXF1YWxpZmllZE5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhcHBsaWVkIHN0ZXJlb3R5cGUgdG8gcmV0cmlldmUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN0ZXJlb3R5cGVzIiBuYW1lPSJnZXRBcHBsaWVkU3RlcmVvdHlwZXMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3RlcmVvdHlwZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldEFwcGxpZWRTdGVyZW90eXBlcyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBzdGVyZW90eXBlcyB0aGF0IGFyZSBhcHBsaWVkIHRvIHRoaXMgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWdldEFwcGxpZWRTdGVyZW90eXBlcy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iU3RlcmVvdHlwZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3RlcmVvdHlwZXMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN0ZXJlb3R5cGVzLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGUiIG5hbWU9ImdldEFwcGxpZWRTdWJzdGVyZW90eXBlIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldEFwcGxpZWRTdWJzdGVyZW90eXBlIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIHN1YnN0ZXJlb3R5cGUgb2YgdGhlIHNwZWNpZmllZCBzdGVyZW90eXBlIHdpdGggdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZSB0aGF0IGlzIGFwcGxpZWQgdG8gdGhpcyBlbGVtZW50LCBvciBudWxsIGlmIG5vIHN1Y2ggc3RlcmVvdHlwZSBpcyBhcHBsaWVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGUtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IlN0ZXJlb3R5cGUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGUtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGUtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGUtc3RlcmVvdHlwZSIgbmFtZT0ic3RlcmVvdHlwZSIgdHlwZT0iU3RlcmVvdHlwZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3Vic3RlcmVvdHlwZS1zdGVyZW90eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1nZXRBcHBsaWVkU3Vic3RlcmVvdHlwZS1zdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBzdXBlcnN0ZXJlb3R5cGUgb2YgdGhlIGFwcGxpZWQgc3Vic3RlcmVvdHlwZSB0byByZXRyaWV2ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGUtcXVhbGlmaWVkTmFtZSIgbmFtZT0icXVhbGlmaWVkTmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3Vic3RlcmVvdHlwZS1xdWFsaWZpZWROYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1nZXRBcHBsaWVkU3Vic3RlcmVvdHlwZS1xdWFsaWZpZWROYW1lIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXBwbGllZCBzdWJzdGVyZW90eXBlIHRvIHJldHJpZXZlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWdldEFwcGxpZWRTdWJzdGVyZW90eXBlcyIgbmFtZT0iZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGVzIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1nZXRBcHBsaWVkU3Vic3RlcmVvdHlwZXMiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgc3Vic3RlcmVvdHlwZXMgb2YgdGhlIHNwZWNpZmllZCBzdGVyZW90eXBlIHRoYXQgYXJlIGFwcGxpZWQgdG8gdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGVzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJTdGVyZW90eXBlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFbGVtZW50LWdldEFwcGxpZWRTdWJzdGVyZW90eXBlcy1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1nZXRBcHBsaWVkU3Vic3RlcmVvdHlwZXMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGVzLXN0ZXJlb3R5cGUiIG5hbWU9InN0ZXJlb3R5cGUiIHR5cGU9IlN0ZXJlb3R5cGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtZ2V0QXBwbGllZFN1YnN0ZXJlb3R5cGVzLXN0ZXJlb3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldEFwcGxpZWRTdWJzdGVyZW90eXBlcy1zdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBzdXBlcnN0ZXJlb3R5cGUgb2YgdGhlIGFwcGxpZWQgc3Vic3RlcmVvdHlwZXMgdG8gcmV0cmlldmUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtZ2V0TW9kZWwiIG5hbWU9ImdldE1vZGVsIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtZ2V0TW9kZWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldE1vZGVsIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIG1vZGVsIHRoYXQgb3ducyAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHRoaXMgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWdldE1vZGVsLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJNb2RlbCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRWxlbWVudC1nZXRNb2RlbC1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1nZXRNb2RlbC1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWdldE5lYXJlc3RQYWNrYWdlIiBuYW1lPSJnZXROZWFyZXN0UGFja2FnZSIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldE5lYXJlc3RQYWNrYWdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1nZXROZWFyZXN0UGFja2FnZSI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBuZWFyZXN0IHBhY2thZ2UgdGhhdCBvd25zIChlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgdGhpcyBlbGVtZW50LCBvciB0aGUgZWxlbWVudCBpdHNlbGYgKGlmIGl0IGlzIGEgcGFja2FnZSkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXROZWFyZXN0UGFja2FnZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUGFja2FnZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRWxlbWVudC1nZXROZWFyZXN0UGFja2FnZS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1nZXROZWFyZXN0UGFja2FnZS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWdldFJlbGF0aW9uc2hpcHMiIG5hbWU9ImdldFJlbGF0aW9uc2hpcHMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRSZWxhdGlvbnNoaXBzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1nZXRSZWxhdGlvbnNoaXBzIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4gd2hpY2ggdGhpcyBlbGVtZW50IGlzIGludm9sdmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0UmVsYXRpb25zaGlwcy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUmVsYXRpb25zaGlwIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFbGVtZW50LWdldFJlbGF0aW9uc2hpcHMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVsZW1lbnQtZ2V0UmVsYXRpb25zaGlwcy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWdldFJlbGF0aW9uc2hpcHMuMSIgbmFtZT0iZ2V0UmVsYXRpb25zaGlwcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldFJlbGF0aW9uc2hpcHMuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtZ2V0UmVsYXRpb25zaGlwcy4xIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIHJlbGF0aW9uc2hpcHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGluIHdoaWNoIHRoaXMgZWxlbWVudCBpcyBpbnZvbHZlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWdldFJlbGF0aW9uc2hpcHMuMS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUmVsYXRpb25zaGlwIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFbGVtZW50LWdldFJlbGF0aW9uc2hpcHMuMS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1nZXRSZWxhdGlvbnNoaXBzLjEtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0UmVsYXRpb25zaGlwcy4xLWVDbGFzcyIgbmFtZT0iZUNsYXNzIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldFJlbGF0aW9uc2hpcHMuMS1lQ2xhc3MtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldFJlbGF0aW9uc2hpcHMuMS1lQ2xhc3MiPgotICAgICAgICAgICAgPGJvZHk+VGhlIChtZXRhKXR5cGUgb2YgdGhlIHJlbGF0aW9uc2hpcHMgdG8gcmV0cmlldmUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRUNsYXNzIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRWxlbWVudC1nZXRSZXF1aXJlZFN0ZXJlb3R5cGUiIG5hbWU9ImdldFJlcXVpcmVkU3RlcmVvdHlwZSIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldFJlcXVpcmVkU3RlcmVvdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtZ2V0UmVxdWlyZWRTdGVyZW90eXBlIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIHN0ZXJlb3R5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZCBuYW1lIHRoYXQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBzdWNoIHN0ZXJlb3R5cGUgaXMgcmVxdWlyZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXRSZXF1aXJlZFN0ZXJlb3R5cGUtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IlN0ZXJlb3R5cGUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVsZW1lbnQtZ2V0UmVxdWlyZWRTdGVyZW90eXBlLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFbGVtZW50LWdldFJlcXVpcmVkU3RlcmVvdHlwZS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXRSZXF1aXJlZFN0ZXJlb3R5cGUtcXVhbGlmaWVkTmFtZSIgbmFtZT0icXVhbGlmaWVkTmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRSZXF1aXJlZFN0ZXJlb3R5cGUtcXVhbGlmaWVkTmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtZ2V0UmVxdWlyZWRTdGVyZW90eXBlLXF1YWxpZmllZE5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSByZXF1aXJlZCBzdGVyZW90eXBlIHRvIHJldHJpZXZlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWdldFJlcXVpcmVkU3RlcmVvdHlwZXMiIG5hbWU9ImdldFJlcXVpcmVkU3RlcmVvdHlwZXMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRSZXF1aXJlZFN0ZXJlb3R5cGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1nZXRSZXF1aXJlZFN0ZXJlb3R5cGVzIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIHN0ZXJlb3R5cGVzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXRSZXF1aXJlZFN0ZXJlb3R5cGVzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJTdGVyZW90eXBlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFbGVtZW50LWdldFJlcXVpcmVkU3RlcmVvdHlwZXMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVsZW1lbnQtZ2V0UmVxdWlyZWRTdGVyZW90eXBlcy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWdldFNvdXJjZURpcmVjdGVkUmVsYXRpb25zaGlwcyIgbmFtZT0iZ2V0U291cmNlRGlyZWN0ZWRSZWxhdGlvbnNoaXBzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtZ2V0U291cmNlRGlyZWN0ZWRSZWxhdGlvbnNoaXBzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1nZXRTb3VyY2VEaXJlY3RlZFJlbGF0aW9uc2hpcHMiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgZGlyZWN0ZWQgcmVsYXRpb25zaGlwcyBmb3Igd2hpY2ggdGhpcyBlbGVtZW50IGlzIGEgc291cmNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0U291cmNlRGlyZWN0ZWRSZWxhdGlvbnNoaXBzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJEaXJlY3RlZFJlbGF0aW9uc2hpcCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRWxlbWVudC1nZXRTb3VyY2VEaXJlY3RlZFJlbGF0aW9uc2hpcHMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVsZW1lbnQtZ2V0U291cmNlRGlyZWN0ZWRSZWxhdGlvbnNoaXBzLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtZ2V0U291cmNlRGlyZWN0ZWRSZWxhdGlvbnNoaXBzLjEiIG5hbWU9ImdldFNvdXJjZURpcmVjdGVkUmVsYXRpb25zaGlwcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldFNvdXJjZURpcmVjdGVkUmVsYXRpb25zaGlwcy4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1nZXRTb3VyY2VEaXJlY3RlZFJlbGF0aW9uc2hpcHMuMSI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBkaXJlY3RlZCByZWxhdGlvbnNoaXBzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBmb3Igd2hpY2ggdGhpcyBlbGVtZW50IGlzIGEgc291cmNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0U291cmNlRGlyZWN0ZWRSZWxhdGlvbnNoaXBzLjEtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkRpcmVjdGVkUmVsYXRpb25zaGlwIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFbGVtZW50LWdldFNvdXJjZURpcmVjdGVkUmVsYXRpb25zaGlwcy4xLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFbGVtZW50LWdldFNvdXJjZURpcmVjdGVkUmVsYXRpb25zaGlwcy4xLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWdldFNvdXJjZURpcmVjdGVkUmVsYXRpb25zaGlwcy4xLWVDbGFzcyIgbmFtZT0iZUNsYXNzIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldFNvdXJjZURpcmVjdGVkUmVsYXRpb25zaGlwcy4xLWVDbGFzcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtZ2V0U291cmNlRGlyZWN0ZWRSZWxhdGlvbnNoaXBzLjEtZUNsYXNzIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSAobWV0YSl0eXBlIG9mIHRoZSBkaXJlY3RlZCByZWxhdGlvbnNoaXBzIHRvIHJldHJpZXZlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJFY29yZS5tZXRhbW9kZWwudW1sI0VDbGFzcyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uIiBuYW1lPSJnZXRTdGVyZW90eXBlQXBwbGljYXRpb24iIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRTdGVyZW90eXBlQXBwbGljYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHN0ZXJlb3R5cGUgZm9yIHRoaXMgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBzdWNoIHN0ZXJlb3R5cGUgYXBwbGljYXRpb24gZXhpc3RzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iRWNvcmUubWV0YW1vZGVsLnVtbCNFT2JqZWN0Ii8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFbGVtZW50LWdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbi1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1nZXRTdGVyZW90eXBlQXBwbGljYXRpb24tX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uLXN0ZXJlb3R5cGUiIG5hbWU9InN0ZXJlb3R5cGUiIHR5cGU9IlN0ZXJlb3R5cGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uLXN0ZXJlb3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbi1zdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBzdGVyZW90eXBlIGZvciB3aGljaCB0byByZXRyaWV2ZSBhbiBhcHBsaWNhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRWxlbWVudC1nZXRTdGVyZW90eXBlQXBwbGljYXRpb25zIiBuYW1lPSJnZXRTdGVyZW90eXBlQXBwbGljYXRpb25zIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9ucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9ucyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBzdGVyZW90eXBlIGFwcGxpY2F0aW9ucyBmb3IgdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9ucy1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRU9iamVjdCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRWxlbWVudC1nZXRTdGVyZW90eXBlQXBwbGljYXRpb25zLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFbGVtZW50LWdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbnMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRWxlbWVudC1nZXRUYXJnZXREaXJlY3RlZFJlbGF0aW9uc2hpcHMiIG5hbWU9ImdldFRhcmdldERpcmVjdGVkUmVsYXRpb25zaGlwcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldFRhcmdldERpcmVjdGVkUmVsYXRpb25zaGlwcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtZ2V0VGFyZ2V0RGlyZWN0ZWRSZWxhdGlvbnNoaXBzIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIGRpcmVjdGVkIHJlbGF0aW9uc2hpcHMgZm9yIHdoaWNoIHRoaXMgZWxlbWVudCBpcyBhIHRhcmdldC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWdldFRhcmdldERpcmVjdGVkUmVsYXRpb25zaGlwcy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVsZW1lbnQtZ2V0VGFyZ2V0RGlyZWN0ZWRSZWxhdGlvbnNoaXBzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFbGVtZW50LWdldFRhcmdldERpcmVjdGVkUmVsYXRpb25zaGlwcy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWdldFRhcmdldERpcmVjdGVkUmVsYXRpb25zaGlwcy4xIiBuYW1lPSJnZXRUYXJnZXREaXJlY3RlZFJlbGF0aW9uc2hpcHMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRUYXJnZXREaXJlY3RlZFJlbGF0aW9uc2hpcHMuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtZ2V0VGFyZ2V0RGlyZWN0ZWRSZWxhdGlvbnNoaXBzLjEiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgZGlyZWN0ZWQgcmVsYXRpb25zaGlwcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZm9yIHdoaWNoIHRoaXMgZWxlbWVudCBpcyBhIHRhcmdldC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWdldFRhcmdldERpcmVjdGVkUmVsYXRpb25zaGlwcy4xLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJEaXJlY3RlZFJlbGF0aW9uc2hpcCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRWxlbWVudC1nZXRUYXJnZXREaXJlY3RlZFJlbGF0aW9uc2hpcHMuMS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1nZXRUYXJnZXREaXJlY3RlZFJlbGF0aW9uc2hpcHMuMS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXRUYXJnZXREaXJlY3RlZFJlbGF0aW9uc2hpcHMuMS1lQ2xhc3MiIG5hbWU9ImVDbGFzcyIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1nZXRUYXJnZXREaXJlY3RlZFJlbGF0aW9uc2hpcHMuMS1lQ2xhc3MtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldFRhcmdldERpcmVjdGVkUmVsYXRpb25zaGlwcy4xLWVDbGFzcyI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgKG1ldGEpdHlwZSBvZiB0aGUgZGlyZWN0ZWQgcmVsYXRpb25zaGlwcyB0byByZXRyaWV2ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iRWNvcmUubWV0YW1vZGVsLnVtbCNFQ2xhc3MiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWdldFZhbHVlIiBuYW1lPSJnZXRWYWx1ZSIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldFZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1nZXRWYWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIHNwZWNpZmllZCBzdGVyZW90eXBlIGZvciB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXRWYWx1ZS1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iRWNvcmUubWV0YW1vZGVsLnVtbCNFSmF2YU9iamVjdCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRWxlbWVudC1nZXRWYWx1ZS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRWxlbWVudC1nZXRWYWx1ZS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1nZXRWYWx1ZS1zdGVyZW90eXBlIiBuYW1lPSJzdGVyZW90eXBlIiB0eXBlPSJTdGVyZW90eXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWdldFZhbHVlLXN0ZXJlb3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWdldFZhbHVlLXN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHN0ZXJlb3R5cGUgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSB2YWx1ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtZ2V0VmFsdWUtcHJvcGVydHlOYW1lIiBuYW1lPSJwcm9wZXJ0eU5hbWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtZ2V0VmFsdWUtcHJvcGVydHlOYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1nZXRWYWx1ZS1wcm9wZXJ0eU5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdob3NlIHZhbHVlIHRvIHJldHJpZXZlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWhhc0tleXdvcmQiIG5hbWU9Imhhc0tleXdvcmQiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1oYXNLZXl3b3JkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1oYXNLZXl3b3JkIj4KLSAgICAgICAgICA8Ym9keT5EZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIGtleXdvcmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1oYXNLZXl3b3JkLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWhhc0tleXdvcmQta2V5d29yZCIgbmFtZT0ia2V5d29yZCIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1oYXNLZXl3b3JkLWtleXdvcmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWhhc0tleXdvcmQta2V5d29yZCI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUga2V5d29yZCBpbiBxdWVzdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRWxlbWVudC1oYXNWYWx1ZSIgbmFtZT0iaGFzVmFsdWUiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1oYXNWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtaGFzVmFsdWUiPgotICAgICAgICAgIDxib2R5PkRldGVybWluZXMgd2hldGhlciB0aGlzIGVsZW1lbnQgaGFzIGEgKG5vbi1kZWZhdWx0KSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBzcGVjaWZpZWQgc3RlcmVvdHlwZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWhhc1ZhbHVlLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWhhc1ZhbHVlLXN0ZXJlb3R5cGUiIG5hbWU9InN0ZXJlb3R5cGUiIHR5cGU9IlN0ZXJlb3R5cGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtaGFzVmFsdWUtc3RlcmVvdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtaGFzVmFsdWUtc3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgc3RlcmVvdHlwZSBmb3Igd2hpY2ggdG8gdGVzdCB0aGUgcHJvcGVydHkuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWhhc1ZhbHVlLXByb3BlcnR5TmFtZSIgbmFtZT0icHJvcGVydHlOYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWhhc1ZhbHVlLXByb3BlcnR5TmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtaGFzVmFsdWUtcHJvcGVydHlOYW1lIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiBxdWVzdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRWxlbWVudC1pc1N0ZXJlb3R5cGVBcHBsaWNhYmxlIiBuYW1lPSJpc1N0ZXJlb3R5cGVBcHBsaWNhYmxlIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtaXNTdGVyZW90eXBlQXBwbGljYWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtaXNTdGVyZW90eXBlQXBwbGljYWJsZSI+Ci0gICAgICAgICAgPGJvZHk+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RlcmVvdHlwZSBpcyBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LWlzU3RlcmVvdHlwZUFwcGxpY2FibGUtX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtaXNTdGVyZW90eXBlQXBwbGljYWJsZS1zdGVyZW90eXBlIiBuYW1lPSJzdGVyZW90eXBlIiB0eXBlPSJTdGVyZW90eXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWlzU3RlcmVvdHlwZUFwcGxpY2FibGUtc3RlcmVvdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtaXNTdGVyZW90eXBlQXBwbGljYWJsZS1zdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBzdGVyZW90eXBlIGluIHF1ZXN0aW9uLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWlzU3RlcmVvdHlwZUFwcGxpZWQiIG5hbWU9ImlzU3RlcmVvdHlwZUFwcGxpZWQiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1pc1N0ZXJlb3R5cGVBcHBsaWVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1pc1N0ZXJlb3R5cGVBcHBsaWVkIj4KLSAgICAgICAgICA8Ym9keT5EZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdGVyZW90eXBlIGlzIGFwcGxpZWQgdG8gdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtaXNTdGVyZW90eXBlQXBwbGllZC1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1pc1N0ZXJlb3R5cGVBcHBsaWVkLXN0ZXJlb3R5cGUiIG5hbWU9InN0ZXJlb3R5cGUiIHR5cGU9IlN0ZXJlb3R5cGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtaXNTdGVyZW90eXBlQXBwbGllZC1zdGVyZW90eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1pc1N0ZXJlb3R5cGVBcHBsaWVkLXN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHN0ZXJlb3R5cGUgaW4gcXVlc3Rpb24uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtaXNTdGVyZW90eXBlUmVxdWlyZWQiIG5hbWU9ImlzU3RlcmVvdHlwZVJlcXVpcmVkIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtaXNTdGVyZW90eXBlUmVxdWlyZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWlzU3RlcmVvdHlwZVJlcXVpcmVkIj4KLSAgICAgICAgICA8Ym9keT5EZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdGVyZW90eXBlIGlzIHJlcXVpcmVkIGZvciB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1pc1N0ZXJlb3R5cGVSZXF1aXJlZC1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1pc1N0ZXJlb3R5cGVSZXF1aXJlZC1zdGVyZW90eXBlIiBuYW1lPSJzdGVyZW90eXBlIiB0eXBlPSJTdGVyZW90eXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LWlzU3RlcmVvdHlwZVJlcXVpcmVkLXN0ZXJlb3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LWlzU3RlcmVvdHlwZVJlcXVpcmVkLXN0ZXJlb3R5cGUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHN0ZXJlb3R5cGUgaW4gcXVlc3Rpb24uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtcmVtb3ZlS2V5d29yZCIgbmFtZT0icmVtb3ZlS2V5d29yZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LXJlbW92ZUtleXdvcmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LXJlbW92ZUtleXdvcmQiPgotICAgICAgICAgIDxib2R5PlJlbW92ZXMgdGhlIHNwZWNpZmllZCBrZXl3b3JkIGZyb20gdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtcmVtb3ZlS2V5d29yZC1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1yZW1vdmVLZXl3b3JkLWtleXdvcmQiIG5hbWU9ImtleXdvcmQiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtcmVtb3ZlS2V5d29yZC1rZXl3b3JkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1yZW1vdmVLZXl3b3JkLWtleXdvcmQiPgotICAgICAgICAgICAgPGJvZHk+VGhlIGtleXdvcmQgdG8gcmVtb3ZlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LXNldFZhbHVlIiBuYW1lPSJzZXRWYWx1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50LXNldFZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1zZXRWYWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+U2V0cyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBzcGVjaWZpZWQgc3RlcmVvdHlwZSBmb3IgdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtc2V0VmFsdWUtc3RlcmVvdHlwZSIgbmFtZT0ic3RlcmVvdHlwZSIgdHlwZT0iU3RlcmVvdHlwZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1zZXRWYWx1ZS1zdGVyZW90eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudC1zZXRWYWx1ZS1zdGVyZW90eXBlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBzdGVyZW90eXBlIGZvciB3aGljaCB0byBzZXQgdGhlIHZhbHVlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1zZXRWYWx1ZS1wcm9wZXJ0eU5hbWUiIG5hbWU9InByb3BlcnR5TmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1zZXRWYWx1ZS1wcm9wZXJ0eU5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LXNldFZhbHVlLXByb3BlcnR5TmFtZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2hvc2UgdmFsdWUgdG8gc2V0LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1zZXRWYWx1ZS1uZXdWYWx1ZSIgbmFtZT0ibmV3VmFsdWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtc2V0VmFsdWUtbmV3VmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50LXNldFZhbHVlLW5ld1ZhbHVlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuZXcgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJFY29yZS5tZXRhbW9kZWwudW1sI0VKYXZhT2JqZWN0Ii8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRWxlbWVudC11bmFwcGx5U3RlcmVvdHlwZSIgbmFtZT0idW5hcHBseVN0ZXJlb3R5cGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC11bmFwcGx5U3RlcmVvdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtdW5hcHBseVN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxib2R5PlVuYXBwbGllcyB0aGUgc3BlY2lmaWVkIHN0ZXJlb3R5cGUgZnJvbSB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC11bmFwcGx5U3RlcmVvdHlwZS1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRU9iamVjdCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50LXVuYXBwbHlTdGVyZW90eXBlLXN0ZXJlb3R5cGUiIG5hbWU9InN0ZXJlb3R5cGUiIHR5cGU9IlN0ZXJlb3R5cGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtdW5hcHBseVN0ZXJlb3R5cGUtc3RlcmVvdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtdW5hcHBseVN0ZXJlb3R5cGUtc3RlcmVvdHlwZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgc3RlcmVvdHlwZSB0byB1bmFwcGx5LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbGVtZW50LWFsbE93bmVkRWxlbWVudHMiIG5hbWU9ImFsbE93bmVkRWxlbWVudHMiIGJvZHlDb25kaXRpb249IkVsZW1lbnQtYWxsT3duZWRFbGVtZW50cy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnQtYWxsT3duZWRFbGVtZW50cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtYWxsT3duZWRFbGVtZW50cyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGFsbE93bmVkRWxlbWVudHMoKSBnaXZlcyBhbGwgb2YgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3Qgb3duZWRFbGVtZW50cyBvZiBhbiBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJFbGVtZW50LWFsbE93bmVkRWxlbWVudHMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJFbGVtZW50LWFsbE93bmVkRWxlbWVudHMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFbGVtZW50LWFsbE93bmVkRWxlbWVudHMtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChvd25lZEVsZW1lbnQtPnVuaW9uKG93bmVkRWxlbWVudC0+Y29sbGVjdChlIHwgZS5hbGxPd25lZEVsZW1lbnRzKCkpKS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRWxlbWVudC1hbGxPd25lZEVsZW1lbnRzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJFbGVtZW50IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFbGVtZW50LWFsbE93bmVkRWxlbWVudHMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFbGVtZW50LWFsbE93bmVkRWxlbWVudHMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkVsZW1lbnQtbXVzdEJlT3duZWQiIG5hbWU9Im11c3RCZU93bmVkIiBib2R5Q29uZGl0aW9uPSJFbGVtZW50LW11c3RCZU93bmVkLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudC1tdXN0QmVPd25lZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnQtbXVzdEJlT3duZWQiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBtdXN0QmVPd25lZCgpIGluZGljYXRlcyB3aGV0aGVyIEVsZW1lbnRzIG9mIHRoaXMgdHlwZSBtdXN0IGhhdmUgYW4gb3duZXIuIFN1YmNsYXNzZXMgb2YgRWxlbWVudCB0aGF0IGRvIG5vdCByZXF1aXJlIGFuIG93bmVyIG11c3Qgb3ZlcnJpZGUgdGhpcyBvcGVyYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkVsZW1lbnQtbXVzdEJlT3duZWQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJFbGVtZW50LW11c3RCZU93bmVkIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRWxlbWVudC1tdXN0QmVPd25lZC1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHRydWUpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVsZW1lbnQtbXVzdEJlT3duZWQtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFbGVtZW50SW1wb3J0IiBuYW1lPSJFbGVtZW50SW1wb3J0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50SW1wb3J0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudEltcG9ydCI+Ci0gICAgICAgIDxib2R5PkFuIEVsZW1lbnRJbXBvcnQgaWRlbnRpZmllcyBhIE5hbWVkRWxlbWVudCBpbiBhIE5hbWVzcGFjZSBvdGhlciB0aGFuIHRoZSBvbmUgdGhhdCBvd25zIHRoYXQgTmFtZWRFbGVtZW50IGFuZCBhbGxvd3MgdGhlIE5hbWVkRWxlbWVudCB0byBiZSByZWZlcmVuY2VkIHVzaW5nIGFuIHVucXVhbGlmaWVkIG5hbWUgaW4gdGhlIE5hbWVzcGFjZSBvd25pbmcgdGhlIEVsZW1lbnRJbXBvcnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRWxlbWVudEltcG9ydC1pbXBvcnRlZF9lbGVtZW50X2lzX3B1YmxpYyIgbmFtZT0iaW1wb3J0ZWRfZWxlbWVudF9pc19wdWJsaWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iRWxlbWVudEltcG9ydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50SW1wb3J0LWltcG9ydGVkX2VsZW1lbnRfaXNfcHVibGljLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudEltcG9ydC1pbXBvcnRlZF9lbGVtZW50X2lzX3B1YmxpYyI+Ci0gICAgICAgICAgPGJvZHk+QW4gaW1wb3J0ZWRFbGVtZW50IGhhcyBlaXRoZXIgcHVibGljIHZpc2liaWxpdHkgb3Igbm8gdmlzaWJpbGl0eSBhdCBhbGwuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkVsZW1lbnRJbXBvcnQtaW1wb3J0ZWRfZWxlbWVudF9pc19wdWJsaWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmltcG9ydGVkRWxlbWVudC52aXNpYmlsaXR5ICZsdDs+IG51bGwgaW1wbGllcyBpbXBvcnRlZEVsZW1lbnQudmlzaWJpbGl0eSA9IFZpc2liaWxpdHlLaW5kOjpwdWJsaWM8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkVsZW1lbnRJbXBvcnQtdmlzaWJpbGl0eV9wdWJsaWNfb3JfcHJpdmF0ZSIgbmFtZT0idmlzaWJpbGl0eV9wdWJsaWNfb3JfcHJpdmF0ZSIgY29uc3RyYWluZWRFbGVtZW50PSJFbGVtZW50SW1wb3J0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVsZW1lbnRJbXBvcnQtdmlzaWJpbGl0eV9wdWJsaWNfb3JfcHJpdmF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnRJbXBvcnQtdmlzaWJpbGl0eV9wdWJsaWNfb3JfcHJpdmF0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHZpc2liaWxpdHkgb2YgYW4gRWxlbWVudEltcG9ydCBpcyBlaXRoZXIgcHVibGljIG9yIHByaXZhdGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkVsZW1lbnRJbXBvcnQtdmlzaWJpbGl0eV9wdWJsaWNfb3JfcHJpdmF0ZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dmlzaWJpbGl0eSA9IFZpc2liaWxpdHlLaW5kOjpwdWJsaWMgb3IgdmlzaWJpbGl0eSA9IFZpc2liaWxpdHlLaW5kOjpwcml2YXRlPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkVsZW1lbnRJbXBvcnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkRpcmVjdGVkUmVsYXRpb25zaGlwIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFbGVtZW50SW1wb3J0LWFsaWFzIiBuYW1lPSJhbGlhcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50SW1wb3J0LWFsaWFzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudEltcG9ydC1hbGlhcyI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBuYW1lIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBpbXBvcnRpbmcgTmFtZXNwYWNlIGluIGxpZXUgb2YgdGhlIG5hbWUgb2YgdGhlIGltcG9ydGVkIFBhY2thZ2FibGVFbGVtZW50LiBUaGUgYWxpYXMgbXVzdCBub3QgY2xhc2ggd2l0aCBhbnkgb3RoZXIgbWVtYmVyIGluIHRoZSBpbXBvcnRpbmcgTmFtZXNwYWNlLiBCeSBkZWZhdWx0LCBubyBhbGlhcyBpcyB1c2VkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVsZW1lbnRJbXBvcnQtYWxpYXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFbGVtZW50SW1wb3J0LWltcG9ydGVkRWxlbWVudCIgbmFtZT0iaW1wb3J0ZWRFbGVtZW50IiB0eXBlPSJQYWNrYWdlYWJsZUVsZW1lbnQiIHN1YnNldHRlZFByb3BlcnR5PSJEaXJlY3RlZFJlbGF0aW9uc2hpcC10YXJnZXQiIGFzc29jaWF0aW9uPSJBX2ltcG9ydGVkRWxlbWVudF9pbXBvcnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudEltcG9ydC1pbXBvcnRlZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50SW1wb3J0LWltcG9ydGVkRWxlbWVudCI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBQYWNrYWdlYWJsZUVsZW1lbnQgd2hvc2UgbmFtZSBpcyB0byBiZSBhZGRlZCB0byBhIE5hbWVzcGFjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVsZW1lbnRJbXBvcnQtaW1wb3J0aW5nTmFtZXNwYWNlIiBuYW1lPSJpbXBvcnRpbmdOYW1lc3BhY2UiIHR5cGU9Ik5hbWVzcGFjZSIgc3Vic2V0dGVkUHJvcGVydHk9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXNvdXJjZSBFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9lbGVtZW50SW1wb3J0X2ltcG9ydGluZ05hbWVzcGFjZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50SW1wb3J0LWltcG9ydGluZ05hbWVzcGFjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVsZW1lbnRJbXBvcnQtaW1wb3J0aW5nTmFtZXNwYWNlIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhlIE5hbWVzcGFjZSB0aGF0IGltcG9ydHMgYSBQYWNrYWdlYWJsZUVsZW1lbnQgZnJvbSBhbm90aGVyIE5hbWVzcGFjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkVsZW1lbnRJbXBvcnQtdmlzaWJpbGl0eSIgbmFtZT0idmlzaWJpbGl0eSIgdHlwZT0iVmlzaWJpbGl0eUtpbmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRWxlbWVudEltcG9ydC12aXNpYmlsaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRWxlbWVudEltcG9ydC12aXNpYmlsaXR5Ij4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGltcG9ydGVkIFBhY2thZ2VhYmxlRWxlbWVudCB3aXRoaW4gdGhlIGltcG9ydGluZ05hbWVzcGFjZSwgaS5lLiwgd2hldGhlciB0aGUgIGltcG9ydGVkRWxlbWVudCB3aWxsIGluIHR1cm4gYmUgdmlzaWJsZSB0byBvdGhlciBOYW1lc3BhY2VzLiBJZiB0aGUgRWxlbWVudEltcG9ydCBpcyBwdWJsaWMsIHRoZSBpbXBvcnRlZEVsZW1lbnQgd2lsbCBiZSB2aXNpYmxlIG91dHNpZGUgdGhlIGltcG9ydGluZ05hbWVzcGFjZSB3aGlsZSwgaWYgdGhlIEVsZW1lbnRJbXBvcnQgaXMgcHJpdmF0ZSwgaXQgd2lsbCBub3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iRWxlbWVudEltcG9ydC12aXNpYmlsaXR5LV9kZWZhdWx0VmFsdWUiIHR5cGU9IlZpc2liaWxpdHlLaW5kIiBpbnN0YW5jZT0iVmlzaWJpbGl0eUtpbmQtcHVibGljIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRWxlbWVudEltcG9ydC1nZXROYW1lIiBuYW1lPSJnZXROYW1lIiBib2R5Q29uZGl0aW9uPSJFbGVtZW50SW1wb3J0LWdldE5hbWUtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbGVtZW50SW1wb3J0LWdldE5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbGVtZW50SW1wb3J0LWdldE5hbWUiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBnZXROYW1lKCkgcmV0dXJucyB0aGUgbmFtZSB1bmRlciB3aGljaCB0aGUgaW1wb3J0ZWQgUGFja2FnZWFibGVFbGVtZW50IHdpbGwgYmUga25vd24gaW4gdGhlIGltcG9ydGluZyBuYW1lc3BhY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkVsZW1lbnRJbXBvcnQtZ2V0TmFtZS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkVsZW1lbnRJbXBvcnQtZ2V0TmFtZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkVsZW1lbnRJbXBvcnQtZ2V0TmFtZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIGFsaWFzLT5ub3RFbXB0eSgpIHRoZW4KLSAgYWxpYXMKLWVsc2UKLSAgaW1wb3J0ZWRFbGVtZW50Lm5hbWUKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFbGVtZW50SW1wb3J0LWdldE5hbWUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQiIG5hbWU9Ik11bHRpcGxpY2l0eUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNdWx0aXBsaWNpdHlFbGVtZW50Ij4KLSAgICAgICAgPGJvZHk+QSBtdWx0aXBsaWNpdHkgaXMgYSBkZWZpbml0aW9uIG9mIGFuIGluY2x1c2l2ZSBpbnRlcnZhbCBvZiBub24tbmVnYXRpdmUgaW50ZWdlcnMgYmVnaW5uaW5nIHdpdGggYSBsb3dlciBib3VuZCBhbmQgZW5kaW5nIHdpdGggYSAocG9zc2libHkgaW5maW5pdGUpIHVwcGVyIGJvdW5kLiBBIE11bHRpcGxpY2l0eUVsZW1lbnQgZW1iZWRzIHRoaXMgaW5mb3JtYXRpb24gdG8gc3BlY2lmeSB0aGUgYWxsb3dhYmxlIGNhcmRpbmFsaXRpZXMgZm9yIGFuIGluc3RhbnRpYXRpb24gb2YgdGhlIEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlcl9nZV9sb3dlciIgbmFtZT0idXBwZXJfZ2VfbG93ZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyX2dlX2xvd2VyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlcl9nZV9sb3dlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHVwcGVyIGJvdW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsb3dlciBib3VuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlcl9nZV9sb3dlci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dXBwZXJCb3VuZCgpID49IGxvd2VyQm91bmQoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlcl9nZV8wIiBuYW1lPSJsb3dlcl9nZV8wIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlcl9nZV8wLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlcl9nZV8wIj4KLSAgICAgICAgICA8Ym9keT5UaGUgbG93ZXIgYm91bmQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGxpdGVyYWwuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXJfZ2VfMC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bG93ZXJCb3VuZCgpID49IDA8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtdmFsdWVfc3BlY2lmaWNhdGlvbl9ub19zaWRlX2VmZmVjdHMiIG5hbWU9InZhbHVlX3NwZWNpZmljYXRpb25fbm9fc2lkZV9lZmZlY3RzIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC12YWx1ZV9zcGVjaWZpY2F0aW9uX25vX3NpZGVfZWZmZWN0cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtdmFsdWVfc3BlY2lmaWNhdGlvbl9ub19zaWRlX2VmZmVjdHMiPgotICAgICAgICAgIDxib2R5PklmIGEgbm9uLWxpdGVyYWwgVmFsdWVTcGVjaWZpY2F0aW9uIGlzIHVzZWQgZm9yIGxvd2VyVmFsdWUgb3IgdXBwZXJWYWx1ZSwgdGhlbiBldmFsdWF0aW5nIHRoYXQgc3BlY2lmaWNhdGlvbiBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC12YWx1ZV9zcGVjaWZpY2F0aW9uX25vX3NpZGVfZWZmZWN0cy1fc3BlY2lmaWNhdGlvbiIgbGFuZ3VhZ2U9IiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC12YWx1ZV9zcGVjaWZpY2F0aW9uX2NvbnN0YW50IiBuYW1lPSJ2YWx1ZV9zcGVjaWZpY2F0aW9uX2NvbnN0YW50IiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC12YWx1ZV9zcGVjaWZpY2F0aW9uX2NvbnN0YW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC12YWx1ZV9zcGVjaWZpY2F0aW9uX2NvbnN0YW50Ij4KLSAgICAgICAgICA8Ym9keT5JZiBhIG5vbi1saXRlcmFsIFZhbHVlU3BlY2lmaWNhdGlvbiBpcyB1c2VkIGZvciBsb3dlclZhbHVlIG9yIHVwcGVyVmFsdWUsIHRoZW4gdGhhdCBzcGVjaWZpY2F0aW9uIG11c3QgYmUgYSBjb25zdGFudCBleHByZXNzaW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXZhbHVlX3NwZWNpZmljYXRpb25fY29uc3RhbnQtX3NwZWNpZmljYXRpb24iIGxhbmd1YWdlPSIiLz4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXJfaXNfaW50ZWdlciIgbmFtZT0ibG93ZXJfaXNfaW50ZWdlciIgY29uc3RyYWluZWRFbGVtZW50PSJNdWx0aXBsaWNpdHlFbGVtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXJfaXNfaW50ZWdlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXJfaXNfaW50ZWdlciI+Ci0gICAgICAgICAgPGJvZHk+SWYgaXQgaXMgbm90IGVtcHR5LCB0aGVuIGxvd2VyVmFsdWUgbXVzdCBoYXZlIGFuIEludGVnZXIgdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXJfaXNfaW50ZWdlci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bG93ZXJWYWx1ZSAmbHQ7PiBudWxsIGltcGxpZXMgbG93ZXJWYWx1ZS5pbnRlZ2VyVmFsdWUoKSAmbHQ7PiBudWxsPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyX2lzX3VubGltaXRlZE5hdHVyYWwiIG5hbWU9InVwcGVyX2lzX3VubGltaXRlZE5hdHVyYWwiIGNvbnN0cmFpbmVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyX2lzX3VubGltaXRlZE5hdHVyYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyX2lzX3VubGltaXRlZE5hdHVyYWwiPgotICAgICAgICAgIDxib2R5PklmIGl0IGlzIG5vdCBlbXB0eSwgdGhlbiB1cHBlclZhbHVlIG11c3QgaGF2ZSBhbiBVbmxpbWl0ZWROYXR1cmFsIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyX2lzX3VubGltaXRlZE5hdHVyYWwtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnVwcGVyVmFsdWUgJmx0Oz4gbnVsbCBpbXBsaWVzIHVwcGVyVmFsdWUudW5saW1pdGVkVmFsdWUoKSAmbHQ7PiBudWxsPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtaXNPcmRlcmVkIiBuYW1lPSJpc09yZGVyZWQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc09yZGVyZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNdWx0aXBsaWNpdHlFbGVtZW50LWlzT3JkZXJlZCI+Ci0gICAgICAgICAgPGJvZHk+Rm9yIGEgbXVsdGl2YWx1ZWQgbXVsdGlwbGljaXR5LCB0aGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgdmFsdWVzIGluIGFuIGluc3RhbnRpYXRpb24gb2YgdGhpcyBNdWx0aXBsaWNpdHlFbGVtZW50IGFyZSBzZXF1ZW50aWFsbHkgb3JkZXJlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWlzT3JkZXJlZC1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc1VuaXF1ZSIgbmFtZT0iaXNVbmlxdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc1VuaXF1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtaXNVbmlxdWUiPgotICAgICAgICAgIDxib2R5PkZvciBhIG11bHRpdmFsdWVkIG11bHRpcGxpY2l0eSwgdGhpcyBhdHRyaWJ1dGVzIHNwZWNpZmllcyB3aGV0aGVyIHRoZSB2YWx1ZXMgaW4gYW4gaW5zdGFudGlhdGlvbiBvZiB0aGlzIE11bHRpcGxpY2l0eUVsZW1lbnQgYXJlIHVuaXF1ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWlzVW5pcXVlLV9kZWZhdWx0VmFsdWUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlciIgbmFtZT0ibG93ZXIiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWxvd2VyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBtdWx0aXBsaWNpdHkgaW50ZXJ2YWwuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlci1fZGVmYXVsdFZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXJWYWx1ZSIgbmFtZT0ibG93ZXJWYWx1ZSIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2xvd2VyVmFsdWVfb3duaW5nTG93ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlclZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlclZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbG93ZXIgYm91bmQgZm9yIHRoaXMgbXVsdGlwbGljaXR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlclZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlciIgbmFtZT0idXBwZXIiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHVwcGVyIGJvdW5kIG9mIHRoZSBtdWx0aXBsaWNpdHkgaW50ZXJ2YWwuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlci1fZGVmYXVsdFZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXJWYWx1ZSIgbmFtZT0idXBwZXJWYWx1ZSIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3VwcGVyVmFsdWVfb3duaW5nVXBwZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlclZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlclZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdXBwZXIgYm91bmQgZm9yIHRoaXMgbXVsdGlwbGljaXR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlclZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1zZXRMb3dlciIgbmFtZT0ic2V0TG93ZXIiIHZpc2liaWxpdHk9InByb3RlY3RlZCI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtc2V0TG93ZXItbmV3TG93ZXIiIG5hbWU9Im5ld0xvd2VyIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtc2V0VXBwZXIiIG5hbWU9InNldFVwcGVyIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXNldFVwcGVyLW5ld1VwcGVyIiBuYW1lPSJuZXdVcHBlciIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWNvbXBhdGlibGVXaXRoIiBuYW1lPSJjb21wYXRpYmxlV2l0aCIgYm9keUNvbmRpdGlvbj0iTXVsdGlwbGljaXR5RWxlbWVudC1jb21wYXRpYmxlV2l0aC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtY29tcGF0aWJsZVdpdGgtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNdWx0aXBsaWNpdHlFbGVtZW50LWNvbXBhdGlibGVXaXRoIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb3BlcmF0aW9uIGNvbXBhdGlibGVXaXRoIHRha2VzIGFub3RoZXIgbXVsdGlwbGljaXR5IGFzIGlucHV0LiBJdCByZXR1cm5zIHRydWUgaWYgdGhlIG90aGVyIG11bHRpcGxpY2l0eSBpcyB3aWRlciB0aGFuLCBvciB0aGUgc2FtZSBhcywgc2VsZi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1jb21wYXRpYmxlV2l0aC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtY29tcGF0aWJsZVdpdGgiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWNvbXBhdGlibGVXaXRoLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoKG90aGVyLmxvd2VyQm91bmQoKSAmbHQ7PSBzZWxmLmxvd2VyQm91bmQoKSkgYW5kICgob3RoZXIudXBwZXJCb3VuZCgpID0gKikgb3IgKHNlbGYudXBwZXJCb3VuZCgpICZsdDs9IG90aGVyLnVwcGVyQm91bmQoKSkpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWNvbXBhdGlibGVXaXRoLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWNvbXBhdGlibGVXaXRoLW90aGVyIiBuYW1lPSJvdGhlciIgdHlwZT0iTXVsdGlwbGljaXR5RWxlbWVudCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtaW5jbHVkZXNNdWx0aXBsaWNpdHkiIG5hbWU9ImluY2x1ZGVzTXVsdGlwbGljaXR5IiBib2R5Q29uZGl0aW9uPSJNdWx0aXBsaWNpdHlFbGVtZW50LWluY2x1ZGVzTXVsdGlwbGljaXR5LXNwZWMiIGlzUXVlcnk9InRydWUiIHByZWNvbmRpdGlvbj0iTXVsdGlwbGljaXR5RWxlbWVudC1pbmNsdWRlc011bHRpcGxpY2l0eS1wcmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1pbmNsdWRlc011bHRpcGxpY2l0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtaW5jbHVkZXNNdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpbmNsdWRlc011bHRpcGxpY2l0eSgpIGNoZWNrcyB3aGV0aGVyIHRoaXMgbXVsdGlwbGljaXR5IGluY2x1ZGVzIGFsbCB0aGUgY2FyZGluYWxpdGllcyBhbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgbXVsdGlwbGljaXR5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWluY2x1ZGVzTXVsdGlwbGljaXR5LXByZSIgbmFtZT0icHJlIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtaW5jbHVkZXNNdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWluY2x1ZGVzTXVsdGlwbGljaXR5LXByZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnNlbGYudXBwZXJCb3VuZCgpLT5ub3RFbXB0eSgpIGFuZCBzZWxmLmxvd2VyQm91bmQoKS0+bm90RW1wdHkoKSBhbmQgTS51cHBlckJvdW5kKCktPm5vdEVtcHR5KCkgYW5kIE0ubG93ZXJCb3VuZCgpLT5ub3RFbXB0eSgpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWluY2x1ZGVzTXVsdGlwbGljaXR5LXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC1pbmNsdWRlc011bHRpcGxpY2l0eSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtaW5jbHVkZXNNdWx0aXBsaWNpdHktc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICgoc2VsZi5sb3dlckJvdW5kKCkgJmx0Oz0gTS5sb3dlckJvdW5kKCkpIGFuZCAoc2VsZi51cHBlckJvdW5kKCkgPj0gTS51cHBlckJvdW5kKCkpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWluY2x1ZGVzTXVsdGlwbGljaXR5LXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWluY2x1ZGVzTXVsdGlwbGljaXR5LU0iIG5hbWU9Ik0iIHR5cGU9Ik11bHRpcGxpY2l0eUVsZW1lbnQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWlzIiBuYW1lPSJpcyIgYm9keUNvbmRpdGlvbj0iTXVsdGlwbGljaXR5RWxlbWVudC1pcy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtaXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNdWx0aXBsaWNpdHlFbGVtZW50LWlzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb3BlcmF0aW9uIGlzIGRldGVybWluZXMgaWYgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2VzIGFyZSB0aGUgb25lcyBnaXZlbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1pcy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtaXMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWlzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobG93ZXJib3VuZCA9IHNlbGYubG93ZXJCb3VuZCgpIGFuZCB1cHBlcmJvdW5kID0gc2VsZi51cHBlckJvdW5kKCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtaXMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtaXMtbG93ZXJib3VuZCIgbmFtZT0ibG93ZXJib3VuZCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWlzLXVwcGVyYm91bmQiIG5hbWU9InVwcGVyYm91bmQiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWlzTXVsdGl2YWx1ZWQiIG5hbWU9ImlzTXVsdGl2YWx1ZWQiIGJvZHlDb25kaXRpb249Ik11bHRpcGxpY2l0eUVsZW1lbnQtaXNNdWx0aXZhbHVlZC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiBwcmVjb25kaXRpb249Ik11bHRpcGxpY2l0eUVsZW1lbnQtaXNNdWx0aXZhbHVlZC1wcmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc011bHRpdmFsdWVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc011bHRpdmFsdWVkIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNNdWx0aXZhbHVlZCgpIGNoZWNrcyB3aGV0aGVyIHRoaXMgbXVsdGlwbGljaXR5IGhhcyBhbiB1cHBlciBib3VuZCBncmVhdGVyIHRoYW4gb25lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWlzTXVsdGl2YWx1ZWQtcHJlIiBuYW1lPSJwcmUiIGNvbnN0cmFpbmVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc011bHRpdmFsdWVkIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc011bHRpdmFsdWVkLXByZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnVwcGVyQm91bmQoKS0+bm90RW1wdHkoKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc011bHRpdmFsdWVkLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc011bHRpdmFsdWVkIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc011bHRpdmFsdWVkLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAodXBwZXJCb3VuZCgpID4gMSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1pc011bHRpdmFsdWVkLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXIuMSIgbmFtZT0ibG93ZXIiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlci4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlci4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlci4xIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVyaXZlZCBsb3dlciBhdHRyaWJ1dGUgbXVzdCBlcXVhbCB0aGUgbG93ZXJCb3VuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlci4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlci4xIE11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXIiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWxvd2VyLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChsb3dlckJvdW5kKCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXIuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXIuMS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWxvd2VyQm91bmQiIG5hbWU9Imxvd2VyQm91bmQiIGJvZHlDb25kaXRpb249Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXJCb3VuZC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXJCb3VuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtbG93ZXJCb3VuZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGxvd2VyQm91bmQoKSByZXR1cm5zIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgbXVsdGlwbGljaXR5IGFzIGFuIGludGVnZXIsIHdoaWNoIGlzIHRoZSBpbnRlZ2VyVmFsdWUgb2YgbG93ZXJWYWx1ZSwgaWYgdGhpcyBpcyBnaXZlbiwgYW5kIDEgb3RoZXJ3aXNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWxvd2VyQm91bmQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJNdWx0aXBsaWNpdHlFbGVtZW50LWxvd2VyQm91bmQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LWxvd2VyQm91bmQtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiAobG93ZXJWYWx1ZT1udWxsIG9yIGxvd2VyVmFsdWUuaW50ZWdlclZhbHVlKCk9bnVsbCkgdGhlbiAxIGVsc2UgbG93ZXJWYWx1ZS5pbnRlZ2VyVmFsdWUoKSBlbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC1sb3dlckJvdW5kLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXIuMSIgbmFtZT0idXBwZXIiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlci4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlci4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlci4xIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVyaXZlZCB1cHBlciBhdHRyaWJ1dGUgbXVzdCBlcXVhbCB0aGUgdXBwZXJCb3VuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlci4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTXVsdGlwbGljaXR5RWxlbWVudC11cHBlci4xIE11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXIiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICh1cHBlckJvdW5kKCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXIuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXIuMS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyQm91bmQiIG5hbWU9InVwcGVyQm91bmQiIGJvZHlDb25kaXRpb249Ik11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXJCb3VuZC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXJCb3VuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXJCb3VuZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IHVwcGVyQm91bmQoKSByZXR1cm5zIHRoZSB1cHBlciBib3VuZCBvZiB0aGUgbXVsdGlwbGljaXR5IGZvciBhIGJvdW5kZWQgbXVsdGlwbGljaXR5IGFzIGFuIHVubGltaXRlZCBuYXR1cmFsLCB3aGljaCBpcyB0aGUgdW5saW1pdGVkTmF0dXJhbFZhbHVlIG9mIHVwcGVyVmFsdWUsIGlmIGdpdmVuLCBhbmQgMSwgb3RoZXJ3aXNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyQm91bmQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyQm91bmQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNdWx0aXBsaWNpdHlFbGVtZW50LXVwcGVyQm91bmQtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiAodXBwZXJWYWx1ZT1udWxsIG9yIHVwcGVyVmFsdWUudW5saW1pdGVkVmFsdWUoKT1udWxsKSB0aGVuIDEgZWxzZSB1cHBlclZhbHVlLnVubGltaXRlZFZhbHVlKCkgZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXJCb3VuZC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Ik5hbWVkRWxlbWVudCIgbmFtZT0iTmFtZWRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lZEVsZW1lbnQiPgotICAgICAgICA8Ym9keT5BIE5hbWVkRWxlbWVudCBpcyBhbiBFbGVtZW50IGluIGEgbW9kZWwgdGhhdCBtYXkgaGF2ZSBhIG5hbWUuIFRoZSBuYW1lIG1heSBiZSBnaXZlbiBkaXJlY3RseSBhbmQvb3IgdmlhIHRoZSB1c2Ugb2YgYSBTdHJpbmdFeHByZXNzaW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik5hbWVkRWxlbWVudC12aXNpYmlsaXR5X25lZWRzX293bmVyc2hpcCIgbmFtZT0idmlzaWJpbGl0eV9uZWVkc19vd25lcnNoaXAiIGNvbnN0cmFpbmVkRWxlbWVudD0iTmFtZWRFbGVtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVkRWxlbWVudC12aXNpYmlsaXR5X25lZWRzX293bmVyc2hpcC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC12aXNpYmlsaXR5X25lZWRzX293bmVyc2hpcCI+Ci0gICAgICAgICAgPGJvZHk+SWYgYSBOYW1lZEVsZW1lbnQgaXMgb3duZWQgYnkgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBOYW1lc3BhY2UsIGl0IGRvZXMgbm90IGhhdmUgYSB2aXNpYmlsaXR5LiBPbmUgdGhhdCBpcyBub3Qgb3duZWQgYnkgYW55dGhpbmcgKGFuZCBoZW5jZSBtdXN0IGJlIGEgUGFja2FnZSwgYXMgdGhpcyBpcyB0aGUgb25seSBraW5kIG9mIE5hbWVkRWxlbWVudCB0aGF0IG92ZXJyaWRlcyBtdXN0QmVPd25lZCgpKSBtYXkgaGF2ZSBhIHZpc2liaWxpdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC12aXNpYmlsaXR5X25lZWRzX293bmVyc2hpcC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KG5hbWVzcGFjZSA9IG51bGwgYW5kIG93bmVyICZsdDs+IG51bGwpIGltcGxpZXMgdmlzaWJpbGl0eSA9IG51bGw8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1oYXNfcXVhbGlmaWVkX25hbWUiIG5hbWU9Imhhc19xdWFsaWZpZWRfbmFtZSIgY29uc3RyYWluZWRFbGVtZW50PSJOYW1lZEVsZW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZWRFbGVtZW50LWhhc19xdWFsaWZpZWRfbmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC1oYXNfcXVhbGlmaWVkX25hbWUiPgotICAgICAgICAgIDxib2R5PldoZW4gdGhlcmUgaXMgYSBuYW1lLCBhbmQgYWxsIG9mIHRoZSBjb250YWluaW5nIE5hbWVzcGFjZXMgaGF2ZSBhIG5hbWUsIHRoZSBxdWFsaWZpZWROYW1lIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIG5hbWUgb2YgdGhlIE5hbWVkRWxlbWVudCBhbmQgdGhlIG5hbWVzIG9mIHRoZSBjb250YWluaW5nIE5hbWVzcGFjZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1oYXNfcXVhbGlmaWVkX25hbWUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihuYW1lICZsdDs+IG51bGwgYW5kIGFsbE5hbWVzcGFjZXMoKS0+c2VsZWN0KG5zIHwgbnMubmFtZSA9IG51bGwpLT5pc0VtcHR5KCkpIGltcGxpZXMKLSAgcXVhbGlmaWVkTmFtZSA9IGFsbE5hbWVzcGFjZXMoKS0+aXRlcmF0ZSggbnMgOiBOYW1lc3BhY2U7IGFnZzogU3RyaW5nID0gbmFtZSB8IG5zLm5hbWUuY29uY2F0KHNlbGYuc2VwYXJhdG9yKCkpLmNvbmNhdChhZ2cpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTmFtZWRFbGVtZW50LWhhc19ub19xdWFsaWZpZWRfbmFtZSIgbmFtZT0iaGFzX25vX3F1YWxpZmllZF9uYW1lIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lZEVsZW1lbnQtaGFzX25vX3F1YWxpZmllZF9uYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZWRFbGVtZW50LWhhc19ub19xdWFsaWZpZWRfbmFtZSI+Ci0gICAgICAgICAgPGJvZHk+SWYgdGhlcmUgaXMgbm8gbmFtZSwgb3Igb25lIG9mIHRoZSBjb250YWluaW5nIE5hbWVzcGFjZXMgaGFzIG5vIG5hbWUsIHRoZXJlIGlzIG5vIHF1YWxpZmllZE5hbWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1oYXNfbm9fcXVhbGlmaWVkX25hbWUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5hbWU9bnVsbCBvciBhbGxOYW1lc3BhY2VzKCktPnNlbGVjdCggbnMgfCBucy5uYW1lPW51bGwgKS0+bm90RW1wdHkoKSBpbXBsaWVzIHF1YWxpZmllZE5hbWUgPSBudWxsPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTmFtZWRFbGVtZW50LWNsaWVudERlcGVuZGVuY3kiIG5hbWU9ImNsaWVudERlcGVuZGVuY3kiIHR5cGU9IkRlcGVuZGVuY3kiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfc291cmNlX2RpcmVjdGVkUmVsYXRpb25zaGlwLWRpcmVjdGVkUmVsYXRpb25zaGlwIiBhc3NvY2lhdGlvbj0iQV9jbGllbnRfY2xpZW50RGVwZW5kZW5jeSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lZEVsZW1lbnQtY2xpZW50RGVwZW5kZW5jeS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC1jbGllbnREZXBlbmRlbmN5Ij4KLSAgICAgICAgICA8Ym9keT5JbmRpY2F0ZXMgdGhlIERlcGVuZGVuY2llcyB0aGF0IHJlZmVyZW5jZSB0aGlzIE5hbWVkRWxlbWVudCBhcyBhIGNsaWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1jbGllbnREZXBlbmRlbmN5LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTmFtZWRFbGVtZW50LWNsaWVudERlcGVuZGVuY3ktX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTmFtZWRFbGVtZW50LW5hbWUiIG5hbWU9Im5hbWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZWRFbGVtZW50LW5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lZEVsZW1lbnQtbmFtZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG5hbWUgb2YgdGhlIE5hbWVkRWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtbmFtZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1uYW1lRXhwcmVzc2lvbiIgbmFtZT0ibmFtZUV4cHJlc3Npb24iIHR5cGU9IlN0cmluZ0V4cHJlc3Npb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfbmFtZUV4cHJlc3Npb25fbmFtZWRFbGVtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1uYW1lRXhwcmVzc2lvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC1uYW1lRXhwcmVzc2lvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFN0cmluZ0V4cHJlc3Npb24gdXNlZCB0byBkZWZpbmUgdGhlIG5hbWUgb2YgdGhpcyBOYW1lZEVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtbmFtZUV4cHJlc3Npb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9Ik5hbWVzcGFjZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBpc0Rlcml2ZWRVbmlvbj0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfbWVtYmVyX21lbWJlck5hbWVzcGFjZS1tZW1iZXJOYW1lc3BhY2UgRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfb3duZWRNZW1iZXJfbmFtZXNwYWNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhlIE5hbWVzcGFjZSB0aGF0IG93bnMgdGhlIE5hbWVkRWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJOYW1lZEVsZW1lbnQtcXVhbGlmaWVkTmFtZSIgbmFtZT0icXVhbGlmaWVkTmFtZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1xdWFsaWZpZWROYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZWRFbGVtZW50LXF1YWxpZmllZE5hbWUiPgotICAgICAgICAgIDxib2R5PkEgbmFtZSB0aGF0IGFsbG93cyB0aGUgTmFtZWRFbGVtZW50IHRvIGJlIGlkZW50aWZpZWQgd2l0aGluIGEgaGllcmFyY2h5IG9mIG5lc3RlZCBOYW1lc3BhY2VzLiBJdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBuYW1lcyBvZiB0aGUgY29udGFpbmluZyBOYW1lc3BhY2VzIHN0YXJ0aW5nIGF0IHRoZSByb290IG9mIHRoZSBoaWVyYXJjaHkgYW5kIGVuZGluZyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBOYW1lZEVsZW1lbnQgaXRzZWxmLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1xdWFsaWZpZWROYW1lLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTmFtZWRFbGVtZW50LXZpc2liaWxpdHkiIG5hbWU9InZpc2liaWxpdHkiIHR5cGU9IlZpc2liaWxpdHlLaW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVkRWxlbWVudC12aXNpYmlsaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZWRFbGVtZW50LXZpc2liaWxpdHkiPgotICAgICAgICAgIDxib2R5PkRldGVybWluZXMgd2hldGhlciBhbmQgaG93IHRoZSBOYW1lZEVsZW1lbnQgaXMgdmlzaWJsZSBvdXRzaWRlIGl0cyBvd25pbmcgTmFtZXNwYWNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTmFtZWRFbGVtZW50LXZpc2liaWxpdHktX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJOYW1lZEVsZW1lbnQtY3JlYXRlRGVwZW5kZW5jeSIgbmFtZT0iY3JlYXRlRGVwZW5kZW5jeSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lZEVsZW1lbnQtY3JlYXRlRGVwZW5kZW5jeS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC1jcmVhdGVEZXBlbmRlbmN5Ij4KLSAgICAgICAgICA8Ym9keT5DcmVhdGVzIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoaXMgbmFtZWQgZWxlbWVudCBhbmQgdGhlIHNwZWNpZmllZCBzdXBwbGllciwgb3duZWQgYnkgdGhpcyBuYW1lZCBlbGVtZW50J3MgbmVhcmVzdCBwYWNrYWdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1jcmVhdGVEZXBlbmRlbmN5LV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJEZXBlbmRlbmN5IiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtY3JlYXRlRGVwZW5kZW5jeS1zdXBwbGllciIgbmFtZT0ic3VwcGxpZXIiIHR5cGU9Ik5hbWVkRWxlbWVudCIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZWRFbGVtZW50LWNyZWF0ZURlcGVuZGVuY3ktc3VwcGxpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lZEVsZW1lbnQtY3JlYXRlRGVwZW5kZW5jeS1zdXBwbGllciI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgc3VwcGxpZXIgZm9yIHRoZSBuZXcgZGVwZW5kZW5jeS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTmFtZWRFbGVtZW50LWNyZWF0ZVVzYWdlIiBuYW1lPSJjcmVhdGVVc2FnZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lZEVsZW1lbnQtY3JlYXRlVXNhZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lZEVsZW1lbnQtY3JlYXRlVXNhZ2UiPgotICAgICAgICAgIDxib2R5PkNyZWF0ZXMgYSB1c2FnZSBiZXR3ZWVuIHRoaXMgbmFtZWQgZWxlbWVudCBhbmQgdGhlIHNwZWNpZmllZCBzdXBwbGllciwgb3duZWQgYnkgdGhpcyBuYW1lZCBlbGVtZW50J3MgbmVhcmVzdCBwYWNrYWdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1jcmVhdGVVc2FnZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iVXNhZ2UiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1jcmVhdGVVc2FnZS1zdXBwbGllciIgbmFtZT0ic3VwcGxpZXIiIHR5cGU9Ik5hbWVkRWxlbWVudCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1jcmVhdGVVc2FnZS1zdXBwbGllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC1jcmVhdGVVc2FnZS1zdXBwbGllciI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgc3VwcGxpZXIgZm9yIHRoZSBuZXcgdXNhZ2UuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1nZXRMYWJlbCIgbmFtZT0iZ2V0TGFiZWwiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZWRFbGVtZW50LWdldExhYmVsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZWRFbGVtZW50LWdldExhYmVsIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgYSBsb2NhbGl6ZWQgbGFiZWwgZm9yIHRoaXMgbmFtZWQgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtZ2V0TGFiZWwtX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1nZXRMYWJlbC1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTmFtZWRFbGVtZW50LWdldExhYmVsLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1nZXRMYWJlbC4xIiBuYW1lPSJnZXRMYWJlbCIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lZEVsZW1lbnQtZ2V0TGFiZWwuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC1nZXRMYWJlbC4xIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgYSBsYWJlbCBmb3IgdGhpcyBuYW1lZCBlbGVtZW50LCBsb2NhbGl6ZWQgaWYgaW5kaWNhdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1nZXRMYWJlbC4xLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtZ2V0TGFiZWwuMS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTmFtZWRFbGVtZW50LWdldExhYmVsLjEtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1nZXRMYWJlbC4xLWxvY2FsaXplIiBuYW1lPSJsb2NhbGl6ZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZWRFbGVtZW50LWdldExhYmVsLjEtbG9jYWxpemUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lZEVsZW1lbnQtZ2V0TGFiZWwuMS1sb2NhbGl6ZSI+Ci0gICAgICAgICAgICA8Ym9keT5XaGV0aGVyIHRvIGxvY2FsaXplIHRoZSBsYWJlbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UuMSIgbmFtZT0ibmFtZXNwYWNlIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9Ik5hbWVzcGFjZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZS4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1hbGxOYW1lc3BhY2VzIiBuYW1lPSJhbGxOYW1lc3BhY2VzIiBib2R5Q29uZGl0aW9uPSJOYW1lZEVsZW1lbnQtYWxsTmFtZXNwYWNlcy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1hbGxOYW1lc3BhY2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZWRFbGVtZW50LWFsbE5hbWVzcGFjZXMiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBhbGxOYW1lc3BhY2VzKCkgZ2l2ZXMgdGhlIHNlcXVlbmNlIG9mIE5hbWVzcGFjZXMgaW4gd2hpY2ggdGhlIE5hbWVkRWxlbWVudCBpcyBuZXN0ZWQsIHdvcmtpbmcgb3V0d2FyZHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1hbGxOYW1lc3BhY2VzLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTmFtZWRFbGVtZW50LWFsbE5hbWVzcGFjZXMiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtYWxsTmFtZXNwYWNlcy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKAotaWYgb3duZXIgPSBudWxsCi0gIHRoZW4gT3JkZXJlZFNldHt9Ci1lbHNlCi0gIGxldCBlbmNsb3NpbmdOYW1lc3BhY2UgOiBOYW1lc3BhY2UgPQotICAgIGlmIG93bmVyLm9jbElzS2luZE9mKFRlbXBsYXRlUGFyYW1ldGVyKSBhbmQgb3duZXIub2NsQXNUeXBlKFRlbXBsYXRlUGFyYW1ldGVyKS5zaWduYXR1cmUudGVtcGxhdGUub2NsSXNLaW5kT2YoTmFtZXNwYWNlKQotICAgICAgdGhlbiBvd25lci5vY2xBc1R5cGUoVGVtcGxhdGVQYXJhbWV0ZXIpLnNpZ25hdHVyZS50ZW1wbGF0ZS5vY2xBc1R5cGUoTmFtZXNwYWNlKQotICAgIGVsc2UKLSAgICAgIG5hbWVzcGFjZQotICAgIGVuZGlmCi0gIGluIGVuY2xvc2luZ05hbWVzcGFjZS5hbGxOYW1lc3BhY2VzKCktPnByZXBlbmQoZW5jbG9zaW5nTmFtZXNwYWNlKQotZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1hbGxOYW1lc3BhY2VzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJOYW1lc3BhY2UiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTmFtZWRFbGVtZW50LWFsbE5hbWVzcGFjZXMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtYWxsTmFtZXNwYWNlcy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTmFtZWRFbGVtZW50LWFsbE93bmluZ1BhY2thZ2VzIiBuYW1lPSJhbGxPd25pbmdQYWNrYWdlcyIgYm9keUNvbmRpdGlvbj0iTmFtZWRFbGVtZW50LWFsbE93bmluZ1BhY2thZ2VzLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZWRFbGVtZW50LWFsbE93bmluZ1BhY2thZ2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZWRFbGVtZW50LWFsbE93bmluZ1BhY2thZ2VzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgYWxsT3duaW5nUGFja2FnZXMoKSByZXR1cm5zIHRoZSBzZXQgb2YgYWxsIHRoZSBlbmNsb3NpbmcgTmFtZXNwYWNlcyBvZiB0aGlzIE5hbWVkRWxlbWVudCwgd29ya2luZyBvdXR3YXJkcywgdGhhdCBhcmUgUGFja2FnZXMsIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBmaXJzdCBzdWNoIE5hbWVzcGFjZSB0aGF0IGlzIG5vdCBhIFBhY2thZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1hbGxPd25pbmdQYWNrYWdlcy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC1hbGxPd25pbmdQYWNrYWdlcyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1hbGxPd25pbmdQYWNrYWdlcy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIG5hbWVzcGFjZS5vY2xJc0tpbmRPZihQYWNrYWdlKSYjeEQ7Ci10aGVuJiN4RDsKLSAgbGV0IG93bmluZ1BhY2thZ2UgOiBQYWNrYWdlID0gbmFtZXNwYWNlLm9jbEFzVHlwZShQYWNrYWdlKSBpbiYjeEQ7Ci0gICAgb3duaW5nUGFja2FnZS0+dW5pb24ob3duaW5nUGFja2FnZS5hbGxPd25pbmdQYWNrYWdlcygpKSYjeEQ7Ci1lbHNlJiN4RDsKLSAgbnVsbCYjeEQ7Ci1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZWRFbGVtZW50LWFsbE93bmluZ1BhY2thZ2VzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQYWNrYWdlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtYWxsT3duaW5nUGFja2FnZXMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtYWxsT3duaW5nUGFja2FnZXMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20iIG5hbWU9ImlzRGlzdGluZ3Vpc2hhYmxlRnJvbSIgYm9keUNvbmRpdGlvbj0iTmFtZWRFbGVtZW50LWlzRGlzdGluZ3Vpc2hhYmxlRnJvbS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lZEVsZW1lbnQtaXNEaXN0aW5ndWlzaGFibGVGcm9tIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNEaXN0aW5ndWlzaGFibGVGcm9tKCkgZGV0ZXJtaW5lcyB3aGV0aGVyIHR3byBOYW1lZEVsZW1lbnRzIG1heSBsb2dpY2FsbHkgY28tZXhpc3Qgd2l0aGluIGEgTmFtZXNwYWNlLiBCeSBkZWZhdWx0LCB0d28gbmFtZWQgZWxlbWVudHMgYXJlIGRpc3Rpbmd1aXNoYWJsZSBpZiAoYSkgdGhleSBoYXZlIHR5cGVzIG5laXRoZXIgb2Ygd2hpY2ggaXMgYSBraW5kIG9mIHRoZSBvdGhlciBvciAoYikgdGhleSBoYXZlIGRpZmZlcmVudCBuYW1lcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTmFtZWRFbGVtZW50LWlzRGlzdGluZ3Vpc2hhYmxlRnJvbS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20iPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtaXNEaXN0aW5ndWlzaGFibGVGcm9tLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoKHNlbGYub2NsSXNLaW5kT2Yobi5vY2xUeXBlKCkpIG9yIG4ub2NsSXNLaW5kT2Yoc2VsZi5vY2xUeXBlKCkpKSBpbXBsaWVzCi0gICAgbnMuZ2V0TmFtZXNPZk1lbWJlcihzZWxmKS0+aW50ZXJzZWN0aW9uKG5zLmdldE5hbWVzT2ZNZW1iZXIobikpLT5pc0VtcHR5KCkKLSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZWRFbGVtZW50LWlzRGlzdGluZ3Vpc2hhYmxlRnJvbS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZWRFbGVtZW50LWlzRGlzdGluZ3Vpc2hhYmxlRnJvbS1uIiBuYW1lPSJuIiB0eXBlPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZWRFbGVtZW50LWlzRGlzdGluZ3Vpc2hhYmxlRnJvbS1ucyIgbmFtZT0ibnMiIHR5cGU9Ik5hbWVzcGFjZSIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1xdWFsaWZpZWROYW1lLjEiIG5hbWU9InF1YWxpZmllZE5hbWUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iTmFtZWRFbGVtZW50LXF1YWxpZmllZE5hbWUuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1xdWFsaWZpZWROYW1lLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lZEVsZW1lbnQtcXVhbGlmaWVkTmFtZS4xIj4KLSAgICAgICAgICA8Ym9keT5XaGVuIGEgTmFtZWRFbGVtZW50IGhhcyBhIG5hbWUsIGFuZCBhbGwgb2YgaXRzIGNvbnRhaW5pbmcgTmFtZXNwYWNlcyBoYXZlIGEgbmFtZSwgdGhlIHF1YWxpZmllZE5hbWUgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgbmFtZSBvZiB0aGUgTmFtZWRFbGVtZW50IGFuZCB0aGUgbmFtZXMgb2YgdGhlIGNvbnRhaW5pbmcgTmFtZXNwYWNlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTmFtZWRFbGVtZW50LXF1YWxpZmllZE5hbWUuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC1xdWFsaWZpZWROYW1lLjEgTmFtZWRFbGVtZW50LXF1YWxpZmllZE5hbWUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtcXVhbGlmaWVkTmFtZS4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgc2VsZi5uYW1lICZsdDs+IG51bGwgYW5kIHNlbGYuYWxsTmFtZXNwYWNlcygpLT5zZWxlY3QoIG5zIHwgbnMubmFtZT1udWxsICktPmlzRW1wdHkoKQotdGhlbiAKLSAgICBzZWxmLmFsbE5hbWVzcGFjZXMoKS0+aXRlcmF0ZSggbnMgOiBOYW1lc3BhY2U7IGFnZzogU3RyaW5nID0gc2VsZi5uYW1lIHwgbnMubmFtZS5jb25jYXQoc2VsZi5zZXBhcmF0b3IoKSkuY29uY2F0KGFnZykpCi1lbHNlCi0gICBudWxsCi1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZWRFbGVtZW50LXF1YWxpZmllZE5hbWUuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTmFtZWRFbGVtZW50LXF1YWxpZmllZE5hbWUuMS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJOYW1lZEVsZW1lbnQtc2VwYXJhdG9yIiBuYW1lPSJzZXBhcmF0b3IiIGJvZHlDb25kaXRpb249Ik5hbWVkRWxlbWVudC1zZXBhcmF0b3Itc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lZEVsZW1lbnQtc2VwYXJhdG9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZWRFbGVtZW50LXNlcGFyYXRvciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IHNlcGFyYXRvcigpIGdpdmVzIHRoZSBzdHJpbmcgdGhhdCBpcyB1c2VkIHRvIHNlcGFyYXRlIG5hbWVzIHdoZW4gY29uc3RydWN0aW5nIGEgcXVhbGlmaWVkTmFtZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTmFtZWRFbGVtZW50LXNlcGFyYXRvci1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik5hbWVkRWxlbWVudC1zZXBhcmF0b3IiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJOYW1lZEVsZW1lbnQtc2VwYXJhdG9yLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoJzo6Jyk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZWRFbGVtZW50LXNlcGFyYXRvci1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1jbGllbnREZXBlbmRlbmN5LjEiIG5hbWU9ImNsaWVudERlcGVuZGVuY3kiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iTmFtZWRFbGVtZW50LWNsaWVudERlcGVuZGVuY3kuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1jbGllbnREZXBlbmRlbmN5LjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJOYW1lZEVsZW1lbnQtY2xpZW50RGVwZW5kZW5jeS4xIE5hbWVkRWxlbWVudC1jbGllbnREZXBlbmRlbmN5Ij4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTmFtZWRFbGVtZW50LWNsaWVudERlcGVuZGVuY3kuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKERlcGVuZGVuY3kuYWxsSW5zdGFuY2VzKCktPnNlbGVjdChkIHwgZC5jbGllbnQtPmluY2x1ZGVzKHNlbGYpKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZWRFbGVtZW50LWNsaWVudERlcGVuZGVuY3kuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iRGVwZW5kZW5jeSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTmFtZWRFbGVtZW50LWNsaWVudERlcGVuZGVuY3kuMS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik5hbWVkRWxlbWVudC1jbGllbnREZXBlbmRlbmN5LjEtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iTmFtZXNwYWNlIiBuYW1lPSJOYW1lc3BhY2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVzcGFjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVzcGFjZSI+Ci0gICAgICAgIDxib2R5PkEgTmFtZXNwYWNlIGlzIGFuIEVsZW1lbnQgaW4gYSBtb2RlbCB0aGF0IG93bnMgYW5kL29yIGltcG9ydHMgYSBzZXQgb2YgTmFtZWRFbGVtZW50cyB0aGF0IGNhbiBiZSBpZGVudGlmaWVkIGJ5IG5hbWUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTmFtZXNwYWNlLW1lbWJlcnNfZGlzdGluZ3Vpc2hhYmxlIiBuYW1lPSJtZW1iZXJzX2Rpc3Rpbmd1aXNoYWJsZSIgY29uc3RyYWluZWRFbGVtZW50PSJOYW1lc3BhY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZXNwYWNlLW1lbWJlcnNfZGlzdGluZ3Vpc2hhYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZXNwYWNlLW1lbWJlcnNfZGlzdGluZ3Vpc2hhYmxlIj4KLSAgICAgICAgICA8Ym9keT5BbGwgdGhlIG1lbWJlcnMgb2YgYSBOYW1lc3BhY2UgYXJlIGRpc3Rpbmd1aXNoYWJsZSB3aXRoaW4gaXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik5hbWVzcGFjZS1tZW1iZXJzX2Rpc3Rpbmd1aXNoYWJsZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bWVtYmVyc0FyZURpc3Rpbmd1aXNoYWJsZSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJOYW1lc3BhY2UtY2Fubm90X2ltcG9ydF9zZWxmIiBuYW1lPSJjYW5ub3RfaW1wb3J0X3NlbGYiIGNvbnN0cmFpbmVkRWxlbWVudD0iTmFtZXNwYWNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVzcGFjZS1jYW5ub3RfaW1wb3J0X3NlbGYtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lc3BhY2UtY2Fubm90X2ltcG9ydF9zZWxmIj4KLSAgICAgICAgICA8Ym9keT5BIE5hbWVzcGFjZSBjYW5ub3QgaGF2ZSBhIFBhY2thZ2VJbXBvcnQgdG8gaXRzZWxmLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJOYW1lc3BhY2UtY2Fubm90X2ltcG9ydF9zZWxmLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5wYWNrYWdlSW1wb3J0LmltcG9ydGVkUGFja2FnZS5vY2xBc1R5cGUoTmFtZXNwYWNlKS0+ZXhjbHVkZXMoc2VsZik8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik5hbWVzcGFjZS1jYW5ub3RfaW1wb3J0X293bmVkTWVtYmVycyIgbmFtZT0iY2Fubm90X2ltcG9ydF9vd25lZE1lbWJlcnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTmFtZXNwYWNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVzcGFjZS1jYW5ub3RfaW1wb3J0X293bmVkTWVtYmVycy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVzcGFjZS1jYW5ub3RfaW1wb3J0X293bmVkTWVtYmVycyI+Ci0gICAgICAgICAgPGJvZHk+QSBOYW1lc3BhY2UgY2Fubm90IGhhdmUgYW4gRWxlbWVudEltcG9ydCB0byBvbmUgb2YgaXRzIG93bmVkTWVtYmVycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTmFtZXNwYWNlLWNhbm5vdF9pbXBvcnRfb3duZWRNZW1iZXJzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lbGVtZW50SW1wb3J0LmltcG9ydGVkRWxlbWVudC5vY2xBc1R5cGUoRWxlbWVudCktPmV4Y2x1ZGVzQWxsKG93bmVkTWVtYmVyKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJOYW1lc3BhY2UtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik5hbWVkRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTmFtZXNwYWNlLWVsZW1lbnRJbXBvcnQiIG5hbWU9ImVsZW1lbnRJbXBvcnQiIHR5cGU9IkVsZW1lbnRJbXBvcnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3NvdXJjZV9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCBFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfZWxlbWVudEltcG9ydF9pbXBvcnRpbmdOYW1lc3BhY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZXNwYWNlLWVsZW1lbnRJbXBvcnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lc3BhY2UtZWxlbWVudEltcG9ydCI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgRWxlbWVudEltcG9ydHMgb3duZWQgYnkgdGhlIE5hbWVzcGFjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVzcGFjZS1lbGVtZW50SW1wb3J0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTmFtZXNwYWNlLWVsZW1lbnRJbXBvcnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyIiBuYW1lPSJpbXBvcnRlZE1lbWJlciIgdHlwZT0iUGFja2FnZWFibGVFbGVtZW50IiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2UtbWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9pbXBvcnRlZE1lbWJlcl9uYW1lc3BhY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBQYWNrYWdlYWJsZUVsZW1lbnRzIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhpcyBOYW1lc3BhY2UgYXMgYSByZXN1bHQgb2YgZWl0aGVyIFBhY2thZ2VJbXBvcnRzIG9yIEVsZW1lbnRJbXBvcnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik5hbWVzcGFjZS1tZW1iZXIiIG5hbWU9Im1lbWJlciIgdHlwZT0iTmFtZWRFbGVtZW50IiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGlzRGVyaXZlZFVuaW9uPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9tZW1iZXJfbWVtYmVyTmFtZXNwYWNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVzcGFjZS1tZW1iZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lc3BhY2UtbWVtYmVyIj4KLSAgICAgICAgICA8Ym9keT5BIGNvbGxlY3Rpb24gb2YgTmFtZWRFbGVtZW50cyBpZGVudGlmaWFibGUgd2l0aGluIHRoZSBOYW1lc3BhY2UsIGVpdGhlciBieSBiZWluZyBvd25lZCBvciBieSBiZWluZyBpbnRyb2R1Y2VkIGJ5IGltcG9ydGluZyBvciBpbmhlcml0YW5jZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVzcGFjZS1tZW1iZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJOYW1lc3BhY2UtbWVtYmVyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgbmFtZT0ib3duZWRNZW1iZXIiIHR5cGU9Ik5hbWVkRWxlbWVudCIgaXNSZWFkT25seT0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBpc0Rlcml2ZWRVbmlvbj0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IE5hbWVzcGFjZS1tZW1iZXIiIGFzc29jaWF0aW9uPSJBX293bmVkTWVtYmVyX25hbWVzcGFjZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lc3BhY2Utb3duZWRNZW1iZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lc3BhY2Utb3duZWRNZW1iZXIiPgotICAgICAgICAgIDxib2R5PkEgY29sbGVjdGlvbiBvZiBOYW1lZEVsZW1lbnRzIG93bmVkIGJ5IHRoZSBOYW1lc3BhY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJOYW1lc3BhY2Utb3duZWRNZW1iZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJOYW1lc3BhY2Utb3duZWRNZW1iZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTmFtZXNwYWNlLW93bmVkUnVsZSIgbmFtZT0ib3duZWRSdWxlIiB0eXBlPSJDb25zdHJhaW50IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZFJ1bGVfY29udGV4dCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lc3BhY2Utb3duZWRSdWxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZXNwYWNlLW93bmVkUnVsZSI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIGEgc2V0IG9mIENvbnN0cmFpbnRzIG93bmVkIGJ5IHRoaXMgTmFtZXNwYWNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTmFtZXNwYWNlLW93bmVkUnVsZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik5hbWVzcGFjZS1vd25lZFJ1bGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTmFtZXNwYWNlLXBhY2thZ2VJbXBvcnQiIG5hbWU9InBhY2thZ2VJbXBvcnQiIHR5cGU9IlBhY2thZ2VJbXBvcnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3NvdXJjZV9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCBFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcGFja2FnZUltcG9ydF9pbXBvcnRpbmdOYW1lc3BhY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZXNwYWNlLXBhY2thZ2VJbXBvcnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lc3BhY2UtcGFja2FnZUltcG9ydCI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgUGFja2FnZUltcG9ydHMgb3duZWQgYnkgdGhlIE5hbWVzcGFjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVzcGFjZS1wYWNrYWdlSW1wb3J0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTmFtZXNwYWNlLXBhY2thZ2VJbXBvcnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTmFtZXNwYWNlLWNyZWF0ZUVsZW1lbnRJbXBvcnQiIG5hbWU9ImNyZWF0ZUVsZW1lbnRJbXBvcnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZXNwYWNlLWNyZWF0ZUVsZW1lbnRJbXBvcnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lc3BhY2UtY3JlYXRlRWxlbWVudEltcG9ydCI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhbiBpbXBvcnQgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhpcyBuYW1lc3BhY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHZpc2liaWxpdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZXNwYWNlLWNyZWF0ZUVsZW1lbnRJbXBvcnQtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkVsZW1lbnRJbXBvcnQiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5hbWVzcGFjZS1jcmVhdGVFbGVtZW50SW1wb3J0LWVsZW1lbnQiIG5hbWU9ImVsZW1lbnQiIHR5cGU9IlBhY2thZ2VhYmxlRWxlbWVudCIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZXNwYWNlLWNyZWF0ZUVsZW1lbnRJbXBvcnQtZWxlbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVzcGFjZS1jcmVhdGVFbGVtZW50SW1wb3J0LWVsZW1lbnQiPgotICAgICAgICAgICAgPGJvZHk+VGhlIGVsZW1lbnQgdG8gaW1wb3J0LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZXNwYWNlLWNyZWF0ZUVsZW1lbnRJbXBvcnQtdmlzaWJpbGl0eSIgbmFtZT0idmlzaWJpbGl0eSIgdHlwZT0iVmlzaWJpbGl0eUtpbmQiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVzcGFjZS1jcmVhdGVFbGVtZW50SW1wb3J0LXZpc2liaWxpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lc3BhY2UtY3JlYXRlRWxlbWVudEltcG9ydC12aXNpYmlsaXR5Ij4KLSAgICAgICAgICAgIDxib2R5PlRoZSB2aXNpYmlsaXR5IGZvciB0aGUgbmV3IGVsZW1lbnQgaW1wb3J0LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJOYW1lc3BhY2UtY3JlYXRlUGFja2FnZUltcG9ydCIgbmFtZT0iY3JlYXRlUGFja2FnZUltcG9ydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lc3BhY2UtY3JlYXRlUGFja2FnZUltcG9ydC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVzcGFjZS1jcmVhdGVQYWNrYWdlSW1wb3J0Ij4KLSAgICAgICAgICA8Ym9keT5DcmVhdGVzIGFuIGltcG9ydCBvZiB0aGUgc3BlY2lmaWVkIHBhY2thZ2UgaW50byB0aGlzIG5hbWVzcGFjZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmlzaWJpbGl0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOYW1lc3BhY2UtY3JlYXRlUGFja2FnZUltcG9ydC1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUGFja2FnZUltcG9ydCIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZXNwYWNlLWNyZWF0ZVBhY2thZ2VJbXBvcnQtcGFja2FnZV8iIG5hbWU9InBhY2thZ2VfIiB0eXBlPSJQYWNrYWdlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lc3BhY2UtY3JlYXRlUGFja2FnZUltcG9ydC1wYWNrYWdlXy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVzcGFjZS1jcmVhdGVQYWNrYWdlSW1wb3J0LXBhY2thZ2VfIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBwYWNrYWdlIHRvIGltcG9ydC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5hbWVzcGFjZS1jcmVhdGVQYWNrYWdlSW1wb3J0LXZpc2liaWxpdHkiIG5hbWU9InZpc2liaWxpdHkiIHR5cGU9IlZpc2liaWxpdHlLaW5kIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lc3BhY2UtY3JlYXRlUGFja2FnZUltcG9ydC12aXNpYmlsaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZXNwYWNlLWNyZWF0ZVBhY2thZ2VJbXBvcnQtdmlzaWJpbGl0eSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgdmlzaWJpbGl0eSBmb3IgdGhlIG5ldyBwYWNrYWdlIGltcG9ydC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTmFtZXNwYWNlLWdldEltcG9ydGVkRWxlbWVudHMiIG5hbWU9ImdldEltcG9ydGVkRWxlbWVudHMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZXNwYWNlLWdldEltcG9ydGVkRWxlbWVudHMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lc3BhY2UtZ2V0SW1wb3J0ZWRFbGVtZW50cyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBlbGVtZW50cyBpbXBvcnRlZCBieSB0aGlzIG5hbWVzcGFjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOYW1lc3BhY2UtZ2V0SW1wb3J0ZWRFbGVtZW50cy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUGFja2FnZWFibGVFbGVtZW50IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJOYW1lc3BhY2UtZ2V0SW1wb3J0ZWRFbGVtZW50cy1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTmFtZXNwYWNlLWdldEltcG9ydGVkRWxlbWVudHMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTmFtZXNwYWNlLWdldEltcG9ydGVkUGFja2FnZXMiIG5hbWU9ImdldEltcG9ydGVkUGFja2FnZXMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZXNwYWNlLWdldEltcG9ydGVkUGFja2FnZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lc3BhY2UtZ2V0SW1wb3J0ZWRQYWNrYWdlcyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBwYWNrYWdlcyBpbXBvcnRlZCBieSB0aGlzIG5hbWVzcGFjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOYW1lc3BhY2UtZ2V0SW1wb3J0ZWRQYWNrYWdlcy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUGFja2FnZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTmFtZXNwYWNlLWdldEltcG9ydGVkUGFja2FnZXMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik5hbWVzcGFjZS1nZXRJbXBvcnRlZFBhY2thZ2VzLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik5hbWVzcGFjZS1vd25lZE1lbWJlci4xIiBuYW1lPSJvd25lZE1lbWJlciIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZXNwYWNlLW93bmVkTWVtYmVyLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9Ik5hbWVkRWxlbWVudCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTmFtZXNwYWNlLW93bmVkTWVtYmVyLjEtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJOYW1lc3BhY2Utb3duZWRNZW1iZXIuMS1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTmFtZXNwYWNlLWV4Y2x1ZGVDb2xsaXNpb25zIiBuYW1lPSJleGNsdWRlQ29sbGlzaW9ucyIgYm9keUNvbmRpdGlvbj0iTmFtZXNwYWNlLWV4Y2x1ZGVDb2xsaXNpb25zLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZXNwYWNlLWV4Y2x1ZGVDb2xsaXNpb25zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZXNwYWNlLWV4Y2x1ZGVDb2xsaXNpb25zIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgZXhjbHVkZUNvbGxpc2lvbnMoKSBleGNsdWRlcyBmcm9tIGEgc2V0IG9mIFBhY2thZ2VhYmxlRWxlbWVudHMgYW55IHRoYXQgd291bGQgbm90IGJlIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIGVhY2ggb3RoZXIgaW4gdGhpcyBOYW1lc3BhY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik5hbWVzcGFjZS1leGNsdWRlQ29sbGlzaW9ucy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik5hbWVzcGFjZS1leGNsdWRlQ29sbGlzaW9ucyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik5hbWVzcGFjZS1leGNsdWRlQ29sbGlzaW9ucy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGltcHMtPnJlamVjdChpbXAxICB8IGltcHMtPmV4aXN0cyhpbXAyIHwgbm90IGltcDEuaXNEaXN0aW5ndWlzaGFibGVGcm9tKGltcDIsIHNlbGYpKSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5hbWVzcGFjZS1leGNsdWRlQ29sbGlzaW9ucy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUGFja2FnZWFibGVFbGVtZW50IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJOYW1lc3BhY2UtZXhjbHVkZUNvbGxpc2lvbnMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJOYW1lc3BhY2UtZXhjbHVkZUNvbGxpc2lvbnMtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOYW1lc3BhY2UtZXhjbHVkZUNvbGxpc2lvbnMtaW1wcyIgbmFtZT0iaW1wcyIgdHlwZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVzcGFjZS1leGNsdWRlQ29sbGlzaW9ucy1pbXBzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJOYW1lc3BhY2UtZXhjbHVkZUNvbGxpc2lvbnMtaW1wcy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJOYW1lc3BhY2UtZ2V0TmFtZXNPZk1lbWJlciIgbmFtZT0iZ2V0TmFtZXNPZk1lbWJlciIgYm9keUNvbmRpdGlvbj0iTmFtZXNwYWNlLWdldE5hbWVzT2ZNZW1iZXItc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lc3BhY2UtZ2V0TmFtZXNPZk1lbWJlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVzcGFjZS1nZXROYW1lc09mTWVtYmVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgZ2V0TmFtZXNPZk1lbWJlcigpIGdpdmVzIGEgc2V0IG9mIGFsbCBvZiB0aGUgbmFtZXMgdGhhdCBhIG1lbWJlciB3b3VsZCBoYXZlIGluIGEgTmFtZXNwYWNlLCB0YWtpbmcgaW1wb3J0aW5nIGludG8gYWNjb3VudC4gSW4gZ2VuZXJhbCBhIG1lbWJlciBjYW4gaGF2ZSBtdWx0aXBsZSBuYW1lcyBpbiBhIE5hbWVzcGFjZSBpZiBpdCBpcyBpbXBvcnRlZCBtb3JlIHRoYW4gb25jZSB3aXRoIGRpZmZlcmVudCBhbGlhc2VzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJOYW1lc3BhY2UtZ2V0TmFtZXNPZk1lbWJlci1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik5hbWVzcGFjZS1nZXROYW1lc09mTWVtYmVyIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTmFtZXNwYWNlLWdldE5hbWVzT2ZNZW1iZXItc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBzZWxmLm93bmVkTWVtYmVyIC0+aW5jbHVkZXMoZWxlbWVudCkKLXRoZW4gU2V0e2VsZW1lbnQubmFtZX0KLWVsc2UgbGV0IGVsZW1lbnRJbXBvcnRzIDogU2V0KEVsZW1lbnRJbXBvcnQpID0gc2VsZi5lbGVtZW50SW1wb3J0LT5zZWxlY3QoZWkgfCBlaS5pbXBvcnRlZEVsZW1lbnQgPSBlbGVtZW50KSBpbgotICBpZiBlbGVtZW50SW1wb3J0cy0+bm90RW1wdHkoKQotICB0aGVuCi0gICAgIGVsZW1lbnRJbXBvcnRzLT5jb2xsZWN0KGVsIHwgZWwuZ2V0TmFtZSgpKS0+YXNTZXQoKQotICBlbHNlIAotICAgICBzZWxmLnBhY2thZ2VJbXBvcnQtPnNlbGVjdChwaSB8IHBpLmltcG9ydGVkUGFja2FnZS52aXNpYmxlTWVtYmVycygpLm9jbEFzVHlwZShOYW1lZEVsZW1lbnQpLT5pbmNsdWRlcyhlbGVtZW50KSktPiBjb2xsZWN0KHBpIHwgcGkuaW1wb3J0ZWRQYWNrYWdlLmdldE5hbWVzT2ZNZW1iZXIoZWxlbWVudCkpLT5hc1NldCgpCi0gIGVuZGlmCi1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZXNwYWNlLWdldE5hbWVzT2ZNZW1iZXItcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVzcGFjZS1nZXROYW1lc09mTWVtYmVyLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTmFtZXNwYWNlLWdldE5hbWVzT2ZNZW1iZXItcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOYW1lc3BhY2UtZ2V0TmFtZXNPZk1lbWJlci1lbGVtZW50IiBuYW1lPSJlbGVtZW50IiB0eXBlPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJOYW1lc3BhY2UtaW1wb3J0TWVtYmVycyIgbmFtZT0iaW1wb3J0TWVtYmVycyIgYm9keUNvbmRpdGlvbj0iTmFtZXNwYWNlLWltcG9ydE1lbWJlcnMtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOYW1lc3BhY2UtaW1wb3J0TWVtYmVycy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5hbWVzcGFjZS1pbXBvcnRNZW1iZXJzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaW1wb3J0TWVtYmVycygpIGRlZmluZXMgd2hpY2ggb2YgYSBzZXQgb2YgUGFja2FnZWFibGVFbGVtZW50cyBhcmUgYWN0dWFsbHkgaW1wb3J0ZWQgaW50byB0aGUgTmFtZXNwYWNlLiBUaGlzIGV4Y2x1ZGVzIGhpZGRlbiBvbmVzLCBpLmUuLCB0aG9zZSB3aGljaCBoYXZlIG5hbWVzIHRoYXQgY29uZmxpY3Qgd2l0aCBuYW1lcyBvZiBvd25lZE1lbWJlcnMsIGFuZCBpdCBhbHNvIGV4Y2x1ZGVzIFBhY2thZ2VhYmxlRWxlbWVudHMgdGhhdCB3b3VsZCBoYXZlIHRoZSBpbmRpc3Rpbmd1aXNoYWJsZSBuYW1lcyB3aGVuIGltcG9ydGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJOYW1lc3BhY2UtaW1wb3J0TWVtYmVycy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik5hbWVzcGFjZS1pbXBvcnRNZW1iZXJzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTmFtZXNwYWNlLWltcG9ydE1lbWJlcnMtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChzZWxmLmV4Y2x1ZGVDb2xsaXNpb25zKGltcHMpLT5zZWxlY3QoaW1wIHwgc2VsZi5vd25lZE1lbWJlci0+Zm9yQWxsKG1lbSB8IGltcC5pc0Rpc3Rpbmd1aXNoYWJsZUZyb20obWVtLCBzZWxmKSkpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOYW1lc3BhY2UtaW1wb3J0TWVtYmVycy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUGFja2FnZWFibGVFbGVtZW50IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJOYW1lc3BhY2UtaW1wb3J0TWVtYmVycy1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik5hbWVzcGFjZS1pbXBvcnRNZW1iZXJzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZXNwYWNlLWltcG9ydE1lbWJlcnMtaW1wcyIgbmFtZT0iaW1wcyIgdHlwZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVzcGFjZS1pbXBvcnRNZW1iZXJzLWltcHMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik5hbWVzcGFjZS1pbXBvcnRNZW1iZXJzLWltcHMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyLjEiIG5hbWU9ImltcG9ydGVkTWVtYmVyIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249Ik5hbWVzcGFjZS1pbXBvcnRlZE1lbWJlci4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOYW1lc3BhY2UtaW1wb3J0ZWRNZW1iZXIuMSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGltcG9ydGVkTWVtYmVyIHByb3BlcnR5IGlzIGRlcml2ZWQgYXMgdGhlIFBhY2thZ2VhYmxlRWxlbWVudHMgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGlzIE5hbWVzcGFjZSBhcyBhIHJlc3VsdCBvZiBlaXRoZXIgUGFja2FnZUltcG9ydHMgb3IgRWxlbWVudEltcG9ydHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik5hbWVzcGFjZS1pbXBvcnRlZE1lbWJlci4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyLjEgTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChzZWxmLmltcG9ydE1lbWJlcnMoZWxlbWVudEltcG9ydC5pbXBvcnRlZEVsZW1lbnQtPmFzU2V0KCktPnVuaW9uKHBhY2thZ2VJbXBvcnQuaW1wb3J0ZWRQYWNrYWdlLT5jb2xsZWN0KHAgfCBwLnZpc2libGVNZW1iZXJzKCkpKS0+YXNTZXQoKSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5hbWVzcGFjZS1pbXBvcnRlZE1lbWJlci4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik5hbWVzcGFjZS1pbXBvcnRlZE1lbWJlci4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iTmFtZXNwYWNlLWltcG9ydGVkTWVtYmVyLjEtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik5hbWVzcGFjZS1tZW1iZXJzQXJlRGlzdGluZ3Vpc2hhYmxlIiBuYW1lPSJtZW1iZXJzQXJlRGlzdGluZ3Vpc2hhYmxlIiBib2R5Q29uZGl0aW9uPSJOYW1lc3BhY2UtbWVtYmVyc0FyZURpc3Rpbmd1aXNoYWJsZS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5hbWVzcGFjZS1tZW1iZXJzQXJlRGlzdGluZ3Vpc2hhYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTmFtZXNwYWNlLW1lbWJlcnNBcmVEaXN0aW5ndWlzaGFibGUiPgotICAgICAgICAgIDxib2R5PlRoZSBCb29sZWFuIHF1ZXJ5IG1lbWJlcnNBcmVEaXN0aW5ndWlzaGFibGUoKSBkZXRlcm1pbmVzIHdoZXRoZXIgYWxsIG9mIHRoZSBOYW1lc3BhY2UncyBtZW1iZXJzIGFyZSBkaXN0aW5ndWlzaGFibGUgd2l0aGluIGl0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJOYW1lc3BhY2UtbWVtYmVyc0FyZURpc3Rpbmd1aXNoYWJsZS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik5hbWVzcGFjZS1tZW1iZXJzQXJlRGlzdGluZ3Vpc2hhYmxlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTmFtZXNwYWNlLW1lbWJlcnNBcmVEaXN0aW5ndWlzaGFibGUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChtZW1iZXItPmZvckFsbCggbWVtYiB8Ci0gICBtZW1iZXItPmV4Y2x1ZGluZyhtZW1iKS0+Zm9yQWxsKG90aGVyIHwKLSAgICAgICBtZW1iLmlzRGlzdGluZ3Vpc2hhYmxlRnJvbShvdGhlciwgc2VsZikpKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTmFtZXNwYWNlLW1lbWJlcnNBcmVEaXN0aW5ndWlzaGFibGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJQYWNrYWdlYWJsZUVsZW1lbnQiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZWFibGVFbGVtZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICAgICAgPGJvZHk+QSBQYWNrYWdlYWJsZUVsZW1lbnQgaXMgYSBOYW1lZEVsZW1lbnQgdGhhdCBtYXkgYmUgb3duZWQgZGlyZWN0bHkgYnkgYSBQYWNrYWdlLiBBIFBhY2thZ2VhYmxlRWxlbWVudCBpcyBhbHNvIGFibGUgdG8gc2VydmUgYXMgdGhlIHBhcmFtZXRlcmVkRWxlbWVudCBvZiBhIFRlbXBsYXRlUGFyYW1ldGVyLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBhY2thZ2VhYmxlRWxlbWVudC1uYW1lc3BhY2VfbmVlZHNfdmlzaWJpbGl0eSIgbmFtZT0ibmFtZXNwYWNlX25lZWRzX3Zpc2liaWxpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2VhYmxlRWxlbWVudC1uYW1lc3BhY2VfbmVlZHNfdmlzaWJpbGl0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2VhYmxlRWxlbWVudC1uYW1lc3BhY2VfbmVlZHNfdmlzaWJpbGl0eSI+Ci0gICAgICAgICAgPGJvZHk+QSBQYWNrYWdlYWJsZUVsZW1lbnQgb3duZWQgYnkgYSBOYW1lc3BhY2UgbXVzdCBoYXZlIGEgdmlzaWJpbGl0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUGFja2FnZWFibGVFbGVtZW50LW5hbWVzcGFjZV9uZWVkc192aXNpYmlsaXR5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT52aXNpYmlsaXR5ID0gbnVsbCBpbXBsaWVzIG5hbWVzcGFjZSA9IG51bGw8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUGFja2FnZWFibGVFbGVtZW50LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJQYXJhbWV0ZXJhYmxlRWxlbWVudCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUGFja2FnZWFibGVFbGVtZW50LV9nZW5lcmFsaXphdGlvbi4xIiBnZW5lcmFsPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBhY2thZ2VhYmxlRWxlbWVudC12aXNpYmlsaXR5IiBuYW1lPSJ2aXNpYmlsaXR5IiB0eXBlPSJWaXNpYmlsaXR5S2luZCIgcmVkZWZpbmVkUHJvcGVydHk9Ik5hbWVkRWxlbWVudC12aXNpYmlsaXR5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2VhYmxlRWxlbWVudC12aXNpYmlsaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZWFibGVFbGVtZW50LXZpc2liaWxpdHkiPgotICAgICAgICAgIDxib2R5PkEgUGFja2FnZWFibGVFbGVtZW50IG11c3QgaGF2ZSBhIHZpc2liaWxpdHkgc3BlY2lmaWVkIGlmIGl0IGlzIG93bmVkIGJ5IGEgTmFtZXNwYWNlLiBUaGUgZGVmYXVsdCB2aXNpYmlsaXR5IGlzIHB1YmxpYy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhY2thZ2VhYmxlRWxlbWVudC12aXNpYmlsaXR5LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9IlBhY2thZ2VhYmxlRWxlbWVudC12aXNpYmlsaXR5LV9kZWZhdWx0VmFsdWUiIHR5cGU9IlZpc2liaWxpdHlLaW5kIiBpbnN0YW5jZT0iVmlzaWJpbGl0eUtpbmQtcHVibGljIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJQYWNrYWdlSW1wb3J0IiBuYW1lPSJQYWNrYWdlSW1wb3J0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlSW1wb3J0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZUltcG9ydCI+Ci0gICAgICAgIDxib2R5PkEgUGFja2FnZUltcG9ydCBpcyBhIFJlbGF0aW9uc2hpcCB0aGF0IGltcG9ydHMgYWxsIHRoZSBub24tcHJpdmF0ZSBtZW1iZXJzIG9mIGEgUGFja2FnZSBpbnRvIHRoZSBOYW1lc3BhY2Ugb3duaW5nIHRoZSBQYWNrYWdlSW1wb3J0LCBzbyB0aGF0IHRob3NlIEVsZW1lbnRzIG1heSBiZSByZWZlcnJlZCB0byBieSB0aGVpciB1bnF1YWxpZmllZCBuYW1lcyBpbiB0aGUgaW1wb3J0aW5nTmFtZXNwYWNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBhY2thZ2VJbXBvcnQtcHVibGljX29yX3ByaXZhdGUiIG5hbWU9InB1YmxpY19vcl9wcml2YXRlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBhY2thZ2VJbXBvcnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZUltcG9ydC1wdWJsaWNfb3JfcHJpdmF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2VJbXBvcnQtcHVibGljX29yX3ByaXZhdGUiPgotICAgICAgICAgIDxib2R5PlRoZSB2aXNpYmlsaXR5IG9mIGEgUGFja2FnZUltcG9ydCBpcyBlaXRoZXIgcHVibGljIG9yIHByaXZhdGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhY2thZ2VJbXBvcnQtcHVibGljX29yX3ByaXZhdGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnZpc2liaWxpdHkgPSBWaXNpYmlsaXR5S2luZDo6cHVibGljIG9yIHZpc2liaWxpdHkgPSBWaXNpYmlsaXR5S2luZDo6cHJpdmF0ZTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJQYWNrYWdlSW1wb3J0LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJEaXJlY3RlZFJlbGF0aW9uc2hpcCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUGFja2FnZUltcG9ydC1pbXBvcnRlZFBhY2thZ2UiIG5hbWU9ImltcG9ydGVkUGFja2FnZSIgdHlwZT0iUGFja2FnZSIgc3Vic2V0dGVkUHJvcGVydHk9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXRhcmdldCIgYXNzb2NpYXRpb249IkFfaW1wb3J0ZWRQYWNrYWdlX3BhY2thZ2VJbXBvcnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZUltcG9ydC1pbXBvcnRlZFBhY2thZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlSW1wb3J0LWltcG9ydGVkUGFja2FnZSI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBQYWNrYWdlIHdob3NlIG1lbWJlcnMgYXJlIGltcG9ydGVkIGludG8gYSBOYW1lc3BhY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQYWNrYWdlSW1wb3J0LWltcG9ydGluZ05hbWVzcGFjZSIgbmFtZT0iaW1wb3J0aW5nTmFtZXNwYWNlIiB0eXBlPSJOYW1lc3BhY2UiIHN1YnNldHRlZFByb3BlcnR5PSJEaXJlY3RlZFJlbGF0aW9uc2hpcC1zb3VyY2UgRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfcGFja2FnZUltcG9ydF9pbXBvcnRpbmdOYW1lc3BhY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZUltcG9ydC1pbXBvcnRpbmdOYW1lc3BhY2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlSW1wb3J0LWltcG9ydGluZ05hbWVzcGFjZSI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBOYW1lc3BhY2UgdGhhdCBpbXBvcnRzIHRoZSBtZW1iZXJzIGZyb20gYSBQYWNrYWdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUGFja2FnZUltcG9ydC12aXNpYmlsaXR5IiBuYW1lPSJ2aXNpYmlsaXR5IiB0eXBlPSJWaXNpYmlsaXR5S2luZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlSW1wb3J0LXZpc2liaWxpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlSW1wb3J0LXZpc2liaWxpdHkiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaW1wb3J0ZWQgUGFja2FnZWFibGVFbGVtZW50cyB3aXRoaW4gdGhlIGltcG9ydGluZ05hbWVzcGFjZSwgaS5lLiwgd2hldGhlciBpbXBvcnRlZCBFbGVtZW50cyB3aWxsIGluIHR1cm4gYmUgdmlzaWJsZSB0byBvdGhlciBOYW1lc3BhY2VzLiBJZiB0aGUgUGFja2FnZUltcG9ydCBpcyBwdWJsaWMsIHRoZSBpbXBvcnRlZCBFbGVtZW50cyB3aWxsIGJlIHZpc2libGUgb3V0c2lkZSB0aGUgaW1wb3J0aW5nTmFtZXNwYWNlLCB3aGlsZSwgaWYgdGhlIFBhY2thZ2VJbXBvcnQgaXMgcHJpdmF0ZSwgdGhleSB3aWxsIG5vdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJQYWNrYWdlSW1wb3J0LXZpc2liaWxpdHktX2RlZmF1bHRWYWx1ZSIgdHlwZT0iVmlzaWJpbGl0eUtpbmQiIGluc3RhbmNlPSJWaXNpYmlsaXR5S2luZC1wdWJsaWMiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlBhcmFtZXRlcmFibGVFbGVtZW50IiBuYW1lPSJQYXJhbWV0ZXJhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXJhYmxlRWxlbWVudCI+Ci0gICAgICAgIDxib2R5PkEgUGFyYW1ldGVyYWJsZUVsZW1lbnQgaXMgYW4gRWxlbWVudCB0aGF0IGNhbiBiZSBleHBvc2VkIGFzIGEgZm9ybWFsIFRlbXBsYXRlUGFyYW1ldGVyIGZvciBhIHRlbXBsYXRlLCBvciBzcGVjaWZpZWQgYXMgYW4gYWN0dWFsIHBhcmFtZXRlciBpbiBhIGJpbmRpbmcgb2YgYSB0ZW1wbGF0ZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlBhcmFtZXRlcmFibGVFbGVtZW50LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQYXJhbWV0ZXJhYmxlRWxlbWVudC1vd25pbmdUZW1wbGF0ZVBhcmFtZXRlciIgbmFtZT0ib3duaW5nVGVtcGxhdGVQYXJhbWV0ZXIiIHR5cGU9IlRlbXBsYXRlUGFyYW1ldGVyIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciBQYXJhbWV0ZXJhYmxlRWxlbWVudC10ZW1wbGF0ZVBhcmFtZXRlciIgYXNzb2NpYXRpb249IkFfb3duZWRQYXJhbWV0ZXJlZEVsZW1lbnRfb3duaW5nVGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtb3duaW5nVGVtcGxhdGVQYXJhbWV0ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJhbWV0ZXJhYmxlRWxlbWVudC1vd25pbmdUZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGZvcm1hbCBUZW1wbGF0ZVBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBQYXJhbWV0ZXJhYmxlRWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhcmFtZXRlcmFibGVFbGVtZW50LW93bmluZ1RlbXBsYXRlUGFyYW1ldGVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtdGVtcGxhdGVQYXJhbWV0ZXIiIG5hbWU9InRlbXBsYXRlUGFyYW1ldGVyIiB0eXBlPSJUZW1wbGF0ZVBhcmFtZXRlciIgYXNzb2NpYXRpb249IkFfcGFyYW1ldGVyZWRFbGVtZW50X3RlbXBsYXRlUGFyYW1ldGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhcmFtZXRlcmFibGVFbGVtZW50LXRlbXBsYXRlUGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtdGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBUZW1wbGF0ZVBhcmFtZXRlciB0aGF0IGV4cG9zZXMgdGhpcyBQYXJhbWV0ZXJhYmxlRWxlbWVudCBhcyBhIGZvcm1hbCBwYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYXJhbWV0ZXJhYmxlRWxlbWVudC10ZW1wbGF0ZVBhcmFtZXRlci1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhcmFtZXRlcmFibGVFbGVtZW50LWlzQ29tcGF0aWJsZVdpdGgiIG5hbWU9ImlzQ29tcGF0aWJsZVdpdGgiIGJvZHlDb25kaXRpb249IlBhcmFtZXRlcmFibGVFbGVtZW50LWlzQ29tcGF0aWJsZVdpdGgtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXJhYmxlRWxlbWVudC1pc0NvbXBhdGlibGVXaXRoLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtaXNDb21wYXRpYmxlV2l0aCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzQ29tcGF0aWJsZVdpdGgoKSBkZXRlcm1pbmVzIGlmIHRoaXMgUGFyYW1ldGVyYWJsZUVsZW1lbnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgUGFyYW1ldGVyYWJsZUVsZW1lbnQuIEJ5IGRlZmF1bHQsIHRoaXMgUGFyYW1ldGVyYWJsZUVsZW1lbnQgaXMgY29tcGF0aWJsZSB3aXRoIGFub3RoZXIgUGFyYW1ldGVyYWJsZUVsZW1lbnQgcCBpZiB0aGUga2luZCBvZiB0aGlzIFBhcmFtZXRlcmFibGVFbGVtZW50IGlzIHRoZSBzYW1lIGFzIG9yIGEgc3VidHlwZSBvZiB0aGUga2luZCBvZiBwLiBTdWJjbGFzc2VzIG9mIFBhcmFtZXRlcmFibGVFbGVtZW50IHNob3VsZCBvdmVycmlkZSB0aGlzIG9wZXJhdGlvbiB0byBzcGVjaWZ5IGRpZmZlcmVudCBjb21wYXRpYmlsaXR5IGNvbnN0cmFpbnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQYXJhbWV0ZXJhYmxlRWxlbWVudC1pc0NvbXBhdGlibGVXaXRoLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtaXNDb21wYXRpYmxlV2l0aCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhcmFtZXRlcmFibGVFbGVtZW50LWlzQ29tcGF0aWJsZVdpdGgtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChzZWxmLm9jbElzS2luZE9mKHAub2NsVHlwZSgpKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtaXNDb21wYXRpYmxlV2l0aC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtaXNDb21wYXRpYmxlV2l0aC1wIiBuYW1lPSJwIiB0eXBlPSJQYXJhbWV0ZXJhYmxlRWxlbWVudCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhcmFtZXRlcmFibGVFbGVtZW50LWlzVGVtcGxhdGVQYXJhbWV0ZXIiIG5hbWU9ImlzVGVtcGxhdGVQYXJhbWV0ZXIiIGJvZHlDb25kaXRpb249IlBhcmFtZXRlcmFibGVFbGVtZW50LWlzVGVtcGxhdGVQYXJhbWV0ZXItc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJhbWV0ZXJhYmxlRWxlbWVudC1pc1RlbXBsYXRlUGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtaXNUZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzVGVtcGxhdGVQYXJhbWV0ZXIoKSBkZXRlcm1pbmVzIGlmIHRoaXMgUGFyYW1ldGVyYWJsZUVsZW1lbnQgaXMgZXhwb3NlZCBhcyBhIGZvcm1hbCBUZW1wbGF0ZVBhcmFtZXRlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtaXNUZW1wbGF0ZVBhcmFtZXRlci1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBhcmFtZXRlcmFibGVFbGVtZW50LWlzVGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQYXJhbWV0ZXJhYmxlRWxlbWVudC1pc1RlbXBsYXRlUGFyYW1ldGVyLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAodGVtcGxhdGVQYXJhbWV0ZXItPm5vdEVtcHR5KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhcmFtZXRlcmFibGVFbGVtZW50LWlzVGVtcGxhdGVQYXJhbWV0ZXItcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJSZWFsaXphdGlvbiIgbmFtZT0iUmVhbGl6YXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlYWxpemF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVhbGl6YXRpb24iPgotICAgICAgICA8Ym9keT5SZWFsaXphdGlvbiBpcyBhIHNwZWNpYWxpemVkIEFic3RyYWN0aW9uIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBzZXRzIG9mIG1vZGVsIEVsZW1lbnRzLCBvbmUgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWNhdGlvbiAodGhlIHN1cHBsaWVyKSBhbmQgdGhlIG90aGVyIHJlcHJlc2VudHMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGxhdHRlciAodGhlIGNsaWVudCkuIFJlYWxpemF0aW9uIGNhbiBiZSB1c2VkIHRvIG1vZGVsIHN0ZXB3aXNlIHJlZmluZW1lbnQsIG9wdGltaXphdGlvbnMsIHRyYW5zZm9ybWF0aW9ucywgdGVtcGxhdGVzLCBtb2RlbCBzeW50aGVzaXMsIGZyYW1ld29yayBjb21wb3NpdGlvbiwgZXRjLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUmVhbGl6YXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFic3RyYWN0aW9uIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlJlbGF0aW9uc2hpcCIgbmFtZT0iUmVsYXRpb25zaGlwIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWxhdGlvbnNoaXAtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWxhdGlvbnNoaXAiPgotICAgICAgICA8Ym9keT5SZWxhdGlvbnNoaXAgaXMgYW4gYWJzdHJhY3QgY29uY2VwdCB0aGF0IHNwZWNpZmllcyBzb21lIGtpbmQgb2YgcmVsYXRpb25zaGlwIGJldHdlZW4gRWxlbWVudHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJSZWxhdGlvbnNoaXAtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlbGF0aW9uc2hpcC1yZWxhdGVkRWxlbWVudCIgbmFtZT0icmVsYXRlZEVsZW1lbnQiIHR5cGU9IkVsZW1lbnQiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIGFzc29jaWF0aW9uPSJBX3JlbGF0ZWRFbGVtZW50X3JlbGF0aW9uc2hpcCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWxhdGlvbnNoaXAtcmVsYXRlZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWxhdGlvbnNoaXAtcmVsYXRlZEVsZW1lbnQiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB0aGUgZWxlbWVudHMgcmVsYXRlZCBieSB0aGUgUmVsYXRpb25zaGlwLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUmVsYXRpb25zaGlwLXJlbGF0ZWRFbGVtZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVGVtcGxhdGVhYmxlRWxlbWVudCIgbmFtZT0iVGVtcGxhdGVhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVtcGxhdGVhYmxlRWxlbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlYWJsZUVsZW1lbnQiPgotICAgICAgICA8Ym9keT5BIFRlbXBsYXRlYWJsZUVsZW1lbnQgaXMgYW4gRWxlbWVudCB0aGF0IGNhbiBvcHRpb25hbGx5IGJlIGRlZmluZWQgYXMgYSB0ZW1wbGF0ZSBhbmQgYm91bmQgdG8gb3RoZXIgdGVtcGxhdGVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iVGVtcGxhdGVhYmxlRWxlbWVudC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVGVtcGxhdGVhYmxlRWxlbWVudC1vd25lZFRlbXBsYXRlU2lnbmF0dXJlIiBuYW1lPSJvd25lZFRlbXBsYXRlU2lnbmF0dXJlIiB0eXBlPSJUZW1wbGF0ZVNpZ25hdHVyZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlX3RlbXBsYXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRlbXBsYXRlYWJsZUVsZW1lbnQtb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlYWJsZUVsZW1lbnQtb3duZWRUZW1wbGF0ZVNpZ25hdHVyZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG9wdGlvbmFsIFRlbXBsYXRlU2lnbmF0dXJlIHNwZWNpZnlpbmcgdGhlIGZvcm1hbCBUZW1wbGF0ZVBhcmFtZXRlcnMgZm9yIHRoaXMgVGVtcGxhdGVhYmxlRWxlbWVudC4gSWYgYSBUZW1wbGF0ZWFibGVFbGVtZW50IGhhcyBhIFRlbXBsYXRlU2lnbmF0dXJlLCB0aGVuIGl0IGlzIGEgdGVtcGxhdGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJUZW1wbGF0ZWFibGVFbGVtZW50LW93bmVkVGVtcGxhdGVTaWduYXR1cmUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUZW1wbGF0ZWFibGVFbGVtZW50LXRlbXBsYXRlQmluZGluZyIgbmFtZT0idGVtcGxhdGVCaW5kaW5nIiB0eXBlPSJUZW1wbGF0ZUJpbmRpbmciIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3NvdXJjZV9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCBFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfdGVtcGxhdGVCaW5kaW5nX2JvdW5kRWxlbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZWFibGVFbGVtZW50LXRlbXBsYXRlQmluZGluZy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlYWJsZUVsZW1lbnQtdGVtcGxhdGVCaW5kaW5nIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb3B0aW9uYWwgVGVtcGxhdGVCaW5kaW5ncyBmcm9tIHRoaXMgVGVtcGxhdGVhYmxlRWxlbWVudCB0byBvbmUgb3IgbW9yZSB0ZW1wbGF0ZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJUZW1wbGF0ZWFibGVFbGVtZW50LXRlbXBsYXRlQmluZGluZy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlRlbXBsYXRlYWJsZUVsZW1lbnQtdGVtcGxhdGVCaW5kaW5nLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlRlbXBsYXRlYWJsZUVsZW1lbnQtaXNUZW1wbGF0ZSIgbmFtZT0iaXNUZW1wbGF0ZSIgYm9keUNvbmRpdGlvbj0iVGVtcGxhdGVhYmxlRWxlbWVudC1pc1RlbXBsYXRlLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVtcGxhdGVhYmxlRWxlbWVudC1pc1RlbXBsYXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVhYmxlRWxlbWVudC1pc1RlbXBsYXRlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNUZW1wbGF0ZSgpIHJldHVybnMgd2hldGhlciB0aGlzIFRlbXBsYXRlYWJsZUVsZW1lbnQgaXMgYWN0dWFsbHkgYSB0ZW1wbGF0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iVGVtcGxhdGVhYmxlRWxlbWVudC1pc1RlbXBsYXRlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVGVtcGxhdGVhYmxlRWxlbWVudC1pc1RlbXBsYXRlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVGVtcGxhdGVhYmxlRWxlbWVudC1pc1RlbXBsYXRlLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAob3duZWRUZW1wbGF0ZVNpZ25hdHVyZSAmbHQ7PiBudWxsKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJUZW1wbGF0ZWFibGVFbGVtZW50LWlzVGVtcGxhdGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iVGVtcGxhdGVhYmxlRWxlbWVudC1wYXJhbWV0ZXJhYmxlRWxlbWVudHMiIG5hbWU9InBhcmFtZXRlcmFibGVFbGVtZW50cyIgYm9keUNvbmRpdGlvbj0iVGVtcGxhdGVhYmxlRWxlbWVudC1wYXJhbWV0ZXJhYmxlRWxlbWVudHMtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZWFibGVFbGVtZW50LXBhcmFtZXRlcmFibGVFbGVtZW50cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlYWJsZUVsZW1lbnQtcGFyYW1ldGVyYWJsZUVsZW1lbnRzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgcGFyYW1ldGVyYWJsZUVsZW1lbnRzKCkgcmV0dXJucyB0aGUgc2V0IG9mIFBhcmFtZXRlcmFibGVFbGVtZW50cyB0aGF0IG1heSBiZSB1c2VkIGFzIHRoZSBwYXJhbWV0ZXJlZEVsZW1lbnRzIGZvciBhIFRlbXBsYXRlUGFyYW1ldGVyIG9mIHRoaXMgVGVtcGxhdGVhYmxlRWxlbWVudC4gQnkgZGVmYXVsdCwgdGhpcyBzZXQgaW5jbHVkZXMgYWxsIHRoZSBvd25lZEVsZW1lbnRzLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG9wZXJhdGlvbiBpZiB0aGV5IGNob29zZSB0byByZXN0cmljdCB0aGUgc2V0IG9mIFBhcmFtZXRlcmFibGVFbGVtZW50cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iVGVtcGxhdGVhYmxlRWxlbWVudC1wYXJhbWV0ZXJhYmxlRWxlbWVudHMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJUZW1wbGF0ZWFibGVFbGVtZW50LXBhcmFtZXRlcmFibGVFbGVtZW50cyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRlbXBsYXRlYWJsZUVsZW1lbnQtcGFyYW1ldGVyYWJsZUVsZW1lbnRzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc2VsZi5hbGxPd25lZEVsZW1lbnRzKCktPnNlbGVjdChvY2xJc0tpbmRPZihQYXJhbWV0ZXJhYmxlRWxlbWVudCkpLm9jbEFzVHlwZShQYXJhbWV0ZXJhYmxlRWxlbWVudCktPmFzU2V0KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlRlbXBsYXRlYWJsZUVsZW1lbnQtcGFyYW1ldGVyYWJsZUVsZW1lbnRzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQYXJhbWV0ZXJhYmxlRWxlbWVudCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVGVtcGxhdGVhYmxlRWxlbWVudC1wYXJhbWV0ZXJhYmxlRWxlbWVudHMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJUZW1wbGF0ZWFibGVFbGVtZW50LXBhcmFtZXRlcmFibGVFbGVtZW50cy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJUZW1wbGF0ZUJpbmRpbmciIG5hbWU9IlRlbXBsYXRlQmluZGluZyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVtcGxhdGVCaW5kaW5nLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVCaW5kaW5nIj4KLSAgICAgICAgPGJvZHk+QSBUZW1wbGF0ZUJpbmRpbmcgaXMgYSBEaXJlY3RlZFJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgVGVtcGxhdGVhYmxlRWxlbWVudCBhbmQgYSB0ZW1wbGF0ZS4gQSBUZW1wbGF0ZUJpbmRpbmcgc3BlY2lmaWVzIHRoZSBUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbnMgb2YgYWN0dWFsIHBhcmFtZXRlcnMgZm9yIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBvZiB0aGUgdGVtcGxhdGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVGVtcGxhdGVCaW5kaW5nLXBhcmFtZXRlcl9zdWJzdGl0dXRpb25fZm9ybWFsIiBuYW1lPSJwYXJhbWV0ZXJfc3Vic3RpdHV0aW9uX2Zvcm1hbCIgY29uc3RyYWluZWRFbGVtZW50PSJUZW1wbGF0ZUJpbmRpbmciPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVtcGxhdGVCaW5kaW5nLXBhcmFtZXRlcl9zdWJzdGl0dXRpb25fZm9ybWFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVCaW5kaW5nLXBhcmFtZXRlcl9zdWJzdGl0dXRpb25fZm9ybWFsIj4KLSAgICAgICAgICA8Ym9keT5FYWNoIHBhcmFtZXRlclN1YnN0aXR1dGlvbiBtdXN0IHJlZmVyIHRvIGEgZm9ybWFsIFRlbXBsYXRlUGFyYW1ldGVyIG9mIHRoZSB0YXJnZXQgVGVtcGxhdGVTaWduYXR1cmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRlbXBsYXRlQmluZGluZy1wYXJhbWV0ZXJfc3Vic3RpdHV0aW9uX2Zvcm1hbC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cGFyYW1ldGVyU3Vic3RpdHV0aW9uLT5mb3JBbGwoYiB8IHNpZ25hdHVyZS5wYXJhbWV0ZXItPmluY2x1ZGVzKGIuZm9ybWFsKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRlbXBsYXRlQmluZGluZy1vbmVfcGFyYW1ldGVyX3N1YnN0aXR1dGlvbiIgbmFtZT0ib25lX3BhcmFtZXRlcl9zdWJzdGl0dXRpb24iIGNvbnN0cmFpbmVkRWxlbWVudD0iVGVtcGxhdGVCaW5kaW5nIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRlbXBsYXRlQmluZGluZy1vbmVfcGFyYW1ldGVyX3N1YnN0aXR1dGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlQmluZGluZy1vbmVfcGFyYW1ldGVyX3N1YnN0aXR1dGlvbiI+Ci0gICAgICAgICAgPGJvZHk+QSBUZW1wbGF0ZUJpaW5kaW5nIGNvbnRhaW5zIGF0IG1vc3Qgb25lIFRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uIGZvciBlYWNoIGZvcm1hbCBUZW1wbGF0ZVBhcmFtZXRlciBvZiB0aGUgdGFyZ2V0IFRlbXBsYXRlU2lnbmF0dXJlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUZW1wbGF0ZUJpbmRpbmctb25lX3BhcmFtZXRlcl9zdWJzdGl0dXRpb24tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnNpZ25hdHVyZS5wYXJhbWV0ZXItPmZvckFsbChwIHwgcGFyYW1ldGVyU3Vic3RpdHV0aW9uLT5zZWxlY3QoYiB8IGIuZm9ybWFsID0gcCktPnNpemUoKSAmbHQ7PSAxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJUZW1wbGF0ZUJpbmRpbmctX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkRpcmVjdGVkUmVsYXRpb25zaGlwIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUZW1wbGF0ZUJpbmRpbmctYm91bmRFbGVtZW50IiBuYW1lPSJib3VuZEVsZW1lbnQiIHR5cGU9IlRlbXBsYXRlYWJsZUVsZW1lbnQiIHN1YnNldHRlZFByb3BlcnR5PSJEaXJlY3RlZFJlbGF0aW9uc2hpcC1zb3VyY2UgRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfdGVtcGxhdGVCaW5kaW5nX2JvdW5kRWxlbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZUJpbmRpbmctYm91bmRFbGVtZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVCaW5kaW5nLWJvdW5kRWxlbWVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFRlbXBsYXRlYWJsZUVsZW1lbnQgdGhhdCBpcyBib3VuZCBieSB0aGlzIFRlbXBsYXRlQmluZGluZy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRlbXBsYXRlQmluZGluZy1wYXJhbWV0ZXJTdWJzdGl0dXRpb24iIG5hbWU9InBhcmFtZXRlclN1YnN0aXR1dGlvbiIgdHlwZT0iVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcGFyYW1ldGVyU3Vic3RpdHV0aW9uX3RlbXBsYXRlQmluZGluZyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZUJpbmRpbmctcGFyYW1ldGVyU3Vic3RpdHV0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVCaW5kaW5nLXBhcmFtZXRlclN1YnN0aXR1dGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9ucyBvd25lZCBieSB0aGlzIFRlbXBsYXRlQmluZGluZy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlRlbXBsYXRlQmluZGluZy1wYXJhbWV0ZXJTdWJzdGl0dXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJUZW1wbGF0ZUJpbmRpbmctcGFyYW1ldGVyU3Vic3RpdHV0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRlbXBsYXRlQmluZGluZy1zaWduYXR1cmUiIG5hbWU9InNpZ25hdHVyZSIgdHlwZT0iVGVtcGxhdGVTaWduYXR1cmUiIHN1YnNldHRlZFByb3BlcnR5PSJEaXJlY3RlZFJlbGF0aW9uc2hpcC10YXJnZXQiIGFzc29jaWF0aW9uPSJBX3NpZ25hdHVyZV90ZW1wbGF0ZUJpbmRpbmciPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVtcGxhdGVCaW5kaW5nLXNpZ25hdHVyZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlQmluZGluZy1zaWduYXR1cmUiPgotICAgICAgICAgIDxib2R5PlRoZSBUZW1wbGF0ZVNpZ25hdHVyZSBmb3IgdGhlIHRlbXBsYXRlIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGlzIFRlbXBsYXRlQmluZGluZy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVGVtcGxhdGVQYXJhbWV0ZXIiIG5hbWU9IlRlbXBsYXRlUGFyYW1ldGVyIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlUGFyYW1ldGVyIj4KLSAgICAgICAgPGJvZHk+QSBUZW1wbGF0ZVBhcmFtZXRlciBleHBvc2VzIGEgUGFyYW1ldGVyYWJsZUVsZW1lbnQgYXMgYSBmb3JtYWwgcGFyYW1ldGVyIG9mIGEgdGVtcGxhdGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVGVtcGxhdGVQYXJhbWV0ZXItbXVzdF9iZV9jb21wYXRpYmxlIiBuYW1lPSJtdXN0X2JlX2NvbXBhdGlibGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iVGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVtcGxhdGVQYXJhbWV0ZXItbXVzdF9iZV9jb21wYXRpYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVQYXJhbWV0ZXItbXVzdF9iZV9jb21wYXRpYmxlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZm9ybWFsIFRlbXBsYXRlUGFyYW1ldGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1tdXN0X2JlX2NvbXBhdGlibGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmRlZmF1bHQgJmx0Oz4gbnVsbCBpbXBsaWVzIGRlZmF1bHQuaXNDb21wYXRpYmxlV2l0aChwYXJhbWV0ZXJlZEVsZW1lbnQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlRlbXBsYXRlUGFyYW1ldGVyLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1kZWZhdWx0IiBuYW1lPSJkZWZhdWx0IiB0eXBlPSJQYXJhbWV0ZXJhYmxlRWxlbWVudCIgYXNzb2NpYXRpb249IkFfZGVmYXVsdF90ZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1kZWZhdWx0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVQYXJhbWV0ZXItZGVmYXVsdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFBhcmFtZXRlcmFibGVFbGVtZW50IHRoYXQgaXMgdGhlIGRlZmF1bHQgZm9yIHRoaXMgZm9ybWFsIFRlbXBsYXRlUGFyYW1ldGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVGVtcGxhdGVQYXJhbWV0ZXItZGVmYXVsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRlbXBsYXRlUGFyYW1ldGVyLW93bmVkRGVmYXVsdCIgbmFtZT0ib3duZWREZWZhdWx0IiB0eXBlPSJQYXJhbWV0ZXJhYmxlRWxlbWVudCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IFRlbXBsYXRlUGFyYW1ldGVyLWRlZmF1bHQiIGFzc29jaWF0aW9uPSJBX293bmVkRGVmYXVsdF90ZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1vd25lZERlZmF1bHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUZW1wbGF0ZVBhcmFtZXRlci1vd25lZERlZmF1bHQiPgotICAgICAgICAgIDxib2R5PlRoZSBQYXJhbWV0ZXJhYmxlRWxlbWVudCB0aGF0IGlzIG93bmVkIGJ5IHRoaXMgVGVtcGxhdGVQYXJhbWV0ZXIgZm9yIHRoZSBwdXJwb3NlIG9mIHByb3ZpZGluZyBhIGRlZmF1bHQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1vd25lZERlZmF1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1vd25lZFBhcmFtZXRlcmVkRWxlbWVudCIgbmFtZT0ib3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQiIHR5cGU9IlBhcmFtZXRlcmFibGVFbGVtZW50IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQgVGVtcGxhdGVQYXJhbWV0ZXItcGFyYW1ldGVyZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9vd25lZFBhcmFtZXRlcmVkRWxlbWVudF9vd25pbmdUZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1vd25lZFBhcmFtZXRlcmVkRWxlbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlUGFyYW1ldGVyLW93bmVkUGFyYW1ldGVyZWRFbGVtZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgUGFyYW1ldGVyYWJsZUVsZW1lbnQgdGhhdCBpcyBvd25lZCBieSB0aGlzIFRlbXBsYXRlUGFyYW1ldGVyIGZvciB0aGUgcHVycG9zZSBvZiBleHBvc2luZyBpdCBhcyB0aGUgcGFyYW1ldGVyZWRFbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVGVtcGxhdGVQYXJhbWV0ZXItb3duZWRQYXJhbWV0ZXJlZEVsZW1lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1wYXJhbWV0ZXJlZEVsZW1lbnQiIG5hbWU9InBhcmFtZXRlcmVkRWxlbWVudCIgdHlwZT0iUGFyYW1ldGVyYWJsZUVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3BhcmFtZXRlcmVkRWxlbWVudF90ZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1wYXJhbWV0ZXJlZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUZW1wbGF0ZVBhcmFtZXRlci1wYXJhbWV0ZXJlZEVsZW1lbnQiPgotICAgICAgICAgIDxib2R5PlRoZSBQYXJhbWV0ZXJhYmxlRWxlbWVudCBleHBvc2VkIGJ5IHRoaXMgVGVtcGxhdGVQYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlci1zaWduYXR1cmUiIG5hbWU9InNpZ25hdHVyZSIgdHlwZT0iVGVtcGxhdGVTaWduYXR1cmUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3BhcmFtZXRlcl90ZW1wbGF0ZVNpZ25hdHVyZS10ZW1wbGF0ZVNpZ25hdHVyZSBFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZFBhcmFtZXRlcl9zaWduYXR1cmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVtcGxhdGVQYXJhbWV0ZXItc2lnbmF0dXJlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVQYXJhbWV0ZXItc2lnbmF0dXJlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgVGVtcGxhdGVTaWduYXR1cmUgdGhhdCBvd25zIHRoaXMgVGVtcGxhdGVQYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uIiBuYW1lPSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiI+Ci0gICAgICAgIDxib2R5PkEgVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24gcmVsYXRlcyB0aGUgYWN0dWFsIHBhcmFtZXRlciB0byBhIGZvcm1hbCBUZW1wbGF0ZVBhcmFtZXRlciBhcyBwYXJ0IG9mIGEgdGVtcGxhdGUgYmluZGluZy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1tdXN0X2JlX2NvbXBhdGlibGUiIG5hbWU9Im11c3RfYmVfY29tcGF0aWJsZSIgY29uc3RyYWluZWRFbGVtZW50PSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1tdXN0X2JlX2NvbXBhdGlibGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1tdXN0X2JlX2NvbXBhdGlibGUiPgotICAgICAgICAgIDxib2R5PlRoZSBhY3R1YWwgUGFyYW1ldGVyYWJsZUVsZW1lbnQgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGZvcm1hbCBUZW1wbGF0ZVBhcmFtZXRlciwgZS5nLiwgdGhlIGFjdHVhbCBQYXJhbWV0ZXJhYmxlRWxlbWVudCBmb3IgYSBDbGFzcyBUZW1wbGF0ZVBhcmFtZXRlciBtdXN0IGJlIGEgQ2xhc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLW11c3RfYmVfY29tcGF0aWJsZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+YWN0dWFsLT5mb3JBbGwoYSB8IGEuaXNDb21wYXRpYmxlV2l0aChmb3JtYWwucGFyYW1ldGVyZWRFbGVtZW50KSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLWFjdHVhbCIgbmFtZT0iYWN0dWFsIiB0eXBlPSJQYXJhbWV0ZXJhYmxlRWxlbWVudCIgYXNzb2NpYXRpb249IkFfYWN0dWFsX3RlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLWFjdHVhbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLWFjdHVhbCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFBhcmFtZXRlcmFibGVFbGVtZW50IHRoYXQgaXMgdGhlIGFjdHVhbCBwYXJhbWV0ZXIgZm9yIHRoaXMgVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1mb3JtYWwiIG5hbWU9ImZvcm1hbCIgdHlwZT0iVGVtcGxhdGVQYXJhbWV0ZXIiIGFzc29jaWF0aW9uPSJBX2Zvcm1hbF90ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1mb3JtYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1mb3JtYWwiPgotICAgICAgICAgIDxib2R5PlRoZSBmb3JtYWwgVGVtcGxhdGVQYXJhbWV0ZXIgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLW93bmVkQWN0dWFsIiBuYW1lPSJvd25lZEFjdHVhbCIgdHlwZT0iUGFyYW1ldGVyYWJsZUVsZW1lbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCBUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1hY3R1YWwiIGFzc29jaWF0aW9uPSJBX293bmVkQWN0dWFsX293bmluZ1RlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLW93bmVkQWN0dWFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tb3duZWRBY3R1YWwiPgotICAgICAgICAgIDxib2R5PlRoZSBQYXJhbWV0ZXJhYmxlRWxlbWVudCB0aGF0IGlzIG93bmVkIGJ5IHRoaXMgVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24gYXMgaXRzIGFjdHVhbCBwYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1vd25lZEFjdHVhbC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLXRlbXBsYXRlQmluZGluZyIgbmFtZT0idGVtcGxhdGVCaW5kaW5nIiB0eXBlPSJUZW1wbGF0ZUJpbmRpbmciIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9wYXJhbWV0ZXJTdWJzdGl0dXRpb25fdGVtcGxhdGVCaW5kaW5nIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLXRlbXBsYXRlQmluZGluZy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLXRlbXBsYXRlQmluZGluZyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFRlbXBsYXRlQmluZGluZyB0aGF0IG93bnMgdGhpcyBUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVGVtcGxhdGVTaWduYXR1cmUiIG5hbWU9IlRlbXBsYXRlU2lnbmF0dXJlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlU2lnbmF0dXJlIj4KLSAgICAgICAgPGJvZHk+QSBUZW1wbGF0ZSBTaWduYXR1cmUgYnVuZGxlcyB0aGUgc2V0IG9mIGZvcm1hbCBUZW1wbGF0ZVBhcmFtZXRlcnMgZm9yIGEgdGVtcGxhdGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVGVtcGxhdGVTaWduYXR1cmUtb3duX2VsZW1lbnRzIiBuYW1lPSJvd25fZWxlbWVudHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVGVtcGxhdGVTaWduYXR1cmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVtcGxhdGVTaWduYXR1cmUtb3duX2VsZW1lbnRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVTaWduYXR1cmUtb3duX2VsZW1lbnRzIj4KLSAgICAgICAgICA8Ym9keT5QYXJhbWV0ZXJzIG11c3Qgb3duIHRoZSBQYXJhbWV0ZXJhYmxlRWxlbWVudHMgdGhleSBwYXJhbWV0ZXIgb3IgdGhvc2UgUGFyYW1ldGVyYWJsZUVsZW1lbnRzIG11c3QgYmUgb3duZWQgYnkgdGhlIFRlbXBsYXRlYWJsZUVsZW1lbnQgYmVpbmcgdGVtcGxhdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUZW1wbGF0ZVNpZ25hdHVyZS1vd25fZWxlbWVudHMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnRlbXBsYXRlLm93bmVkRWxlbWVudC0+aW5jbHVkZXNBbGwocGFyYW1ldGVyLnBhcmFtZXRlcmVkRWxlbWVudC0+YXNTZXQoKSAtIHBhcmFtZXRlci5vd25lZFBhcmFtZXRlcmVkRWxlbWVudC0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRlbXBsYXRlU2lnbmF0dXJlLXVuaXF1ZV9wYXJhbWV0ZXJzIiBuYW1lPSJ1bmlxdWVfcGFyYW1ldGVycyIgY29uc3RyYWluZWRFbGVtZW50PSJUZW1wbGF0ZVNpZ25hdHVyZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUZW1wbGF0ZVNpZ25hdHVyZS11bmlxdWVfcGFyYW1ldGVycy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlU2lnbmF0dXJlLXVuaXF1ZV9wYXJhbWV0ZXJzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgbmFtZXMgb2YgdGhlIHBhcmFtZXRlcnMgb2YgYSBUZW1wbGF0ZVNpZ25hdHVyZSBhcmUgdW5pcXVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUZW1wbGF0ZVNpZ25hdHVyZS11bmlxdWVfcGFyYW1ldGVycy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cGFyYW1ldGVyLT5mb3JBbGwoIHAxLCBwMiB8IChwMSAmbHQ7PiBwMiBhbmQgcDEucGFyYW1ldGVyZWRFbGVtZW50Lm9jbElzS2luZE9mKE5hbWVkRWxlbWVudCkgYW5kIHAyLnBhcmFtZXRlcmVkRWxlbWVudC5vY2xJc0tpbmRPZihOYW1lZEVsZW1lbnQpICkgaW1wbGllcyYjeEQ7Ci0gICBwMS5wYXJhbWV0ZXJlZEVsZW1lbnQub2NsQXNUeXBlKE5hbWVkRWxlbWVudCkubmFtZSAmbHQ7PiBwMi5wYXJhbWV0ZXJlZEVsZW1lbnQub2NsQXNUeXBlKE5hbWVkRWxlbWVudCkubmFtZSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iVGVtcGxhdGVTaWduYXR1cmUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRlbXBsYXRlU2lnbmF0dXJlLW93bmVkUGFyYW1ldGVyIiBuYW1lPSJvd25lZFBhcmFtZXRlciIgdHlwZT0iVGVtcGxhdGVQYXJhbWV0ZXIiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IFRlbXBsYXRlU2lnbmF0dXJlLXBhcmFtZXRlciIgYXNzb2NpYXRpb249IkFfb3duZWRQYXJhbWV0ZXJfc2lnbmF0dXJlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRlbXBsYXRlU2lnbmF0dXJlLW93bmVkUGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGVtcGxhdGVTaWduYXR1cmUtb3duZWRQYXJhbWV0ZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBmb3JtYWwgcGFyYW1ldGVycyB0aGF0IGFyZSBvd25lZCBieSB0aGlzIFRlbXBsYXRlU2lnbmF0dXJlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVGVtcGxhdGVTaWduYXR1cmUtb3duZWRQYXJhbWV0ZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJUZW1wbGF0ZVNpZ25hdHVyZS1vd25lZFBhcmFtZXRlci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUZW1wbGF0ZVNpZ25hdHVyZS1wYXJhbWV0ZXIiIG5hbWU9InBhcmFtZXRlciIgdHlwZT0iVGVtcGxhdGVQYXJhbWV0ZXIiIGlzT3JkZXJlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfcGFyYW1ldGVyX3RlbXBsYXRlU2lnbmF0dXJlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRlbXBsYXRlU2lnbmF0dXJlLXBhcmFtZXRlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRlbXBsYXRlU2lnbmF0dXJlLXBhcmFtZXRlciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG9yZGVyZWQgc2V0IG9mIGFsbCBmb3JtYWwgVGVtcGxhdGVQYXJhbWV0ZXJzIGZvciB0aGlzIFRlbXBsYXRlU2lnbmF0dXJlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iVGVtcGxhdGVTaWduYXR1cmUtcGFyYW1ldGVyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRlbXBsYXRlU2lnbmF0dXJlLXRlbXBsYXRlIiBuYW1lPSJ0ZW1wbGF0ZSIgdHlwZT0iVGVtcGxhdGVhYmxlRWxlbWVudCIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX293bmVkVGVtcGxhdGVTaWduYXR1cmVfdGVtcGxhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGVtcGxhdGVTaWduYXR1cmUtdGVtcGxhdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUZW1wbGF0ZVNpZ25hdHVyZS10ZW1wbGF0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFRlbXBsYXRlYWJsZUVsZW1lbnQgdGhhdCBvd25zIHRoaXMgVGVtcGxhdGVTaWduYXR1cmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlR5cGUiIG5hbWU9IlR5cGUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlR5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUeXBlIj4KLSAgICAgICAgPGJvZHk+QSBUeXBlIGNvbnN0cmFpbnMgdGhlIHZhbHVlcyByZXByZXNlbnRlZCBieSBhIFR5cGVkRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlR5cGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlBhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVHlwZS1wYWNrYWdlIiBuYW1lPSJwYWNrYWdlIiB0eXBlPSJQYWNrYWdlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9wYWNrYWdlZEVsZW1lbnRfb3duaW5nUGFja2FnZS1vd25pbmdQYWNrYWdlIE5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX293bmVkVHlwZV9wYWNrYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlR5cGUtcGFja2FnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlR5cGUtcGFja2FnZSI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBvd25pbmcgUGFja2FnZSBvZiB0aGlzIFR5cGUsIGlmIGFueS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlR5cGUtcGFja2FnZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24iIG5hbWU9ImNyZWF0ZUFzc29jaWF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5DcmVhdGVzIGEobikgKGJpbmFyeSkgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGlzIHR5cGUgYW5kIHRoZSBzcGVjaWZpZWQgb3RoZXIgdHlwZSwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hdmlnYWJpbGl0aWVzLCBhZ2dyZWdhdGlvbnMsIG5hbWVzLCBsb3dlciBib3VuZHMsIGFuZCB1cHBlciBib3VuZHMsIGFuZCBvd25lZCBieSB0aGlzIHR5cGUncyBuZWFyZXN0IHBhY2thZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iQXNzb2NpYXRpb24iIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tZW5kMUlzTmF2aWdhYmxlIiBuYW1lPSJlbmQxSXNOYXZpZ2FibGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tZW5kMUlzTmF2aWdhYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1lbmQxSXNOYXZpZ2FibGUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hdmlnYWJpbGl0eSBmb3IgdGhlIGZpcnN0IGVuZCBvZiB0aGUgbmV3IGFzc29jaWF0aW9uLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tZW5kMUFnZ3JlZ2F0aW9uIiBuYW1lPSJlbmQxQWdncmVnYXRpb24iIHR5cGU9IkFnZ3JlZ2F0aW9uS2luZCIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1lbmQxQWdncmVnYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDFBZ2dyZWdhdGlvbiI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgYWdncmVnYXRpb24gZm9yIHRoZSBmaXJzdCBlbmQgb2YgdGhlIG5ldyBhc3NvY2lhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tZW5kMU5hbWUiIG5hbWU9ImVuZDFOYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDFOYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1lbmQxTmFtZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmFtZSBmb3IgdGhlIGZpcnN0IGVuZCBvZiB0aGUgbmV3IGFzc29jaWF0aW9uLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1lbmQxTG93ZXIiIG5hbWU9ImVuZDFMb3dlciIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1lbmQxTG93ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDFMb3dlciI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbG93ZXIgYm91bmQgZm9yIHRoZSBmaXJzdCBlbmQgb2YgdGhlIG5ldyBhc3NvY2lhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDFVcHBlciIgbmFtZT0iZW5kMVVwcGVyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDFVcHBlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tZW5kMVVwcGVyIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSB1cHBlciBib3VuZCBmb3IgdGhlIGZpcnN0IGVuZCBvZiB0aGUgbmV3IGFzc29jaWF0aW9uLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tZW5kMVR5cGUiIG5hbWU9ImVuZDFUeXBlIiB0eXBlPSJUeXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDFUeXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1lbmQxVHlwZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBmb3IgdGhlIGZpcnN0IGVuZCBvZiB0aGUgbmV3IGFzc29jaWF0aW9uLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1lbmQySXNOYXZpZ2FibGUiIG5hbWU9ImVuZDJJc05hdmlnYWJsZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1lbmQySXNOYXZpZ2FibGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDJJc05hdmlnYWJsZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmF2aWdhYmlsaXR5IGZvciB0aGUgc2Vjb25kIGVuZCBvZiB0aGUgbmV3IGFzc29jaWF0aW9uLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tZW5kMkFnZ3JlZ2F0aW9uIiBuYW1lPSJlbmQyQWdncmVnYXRpb24iIHR5cGU9IkFnZ3JlZ2F0aW9uS2luZCIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1lbmQyQWdncmVnYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDJBZ2dyZWdhdGlvbiI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgYWdncmVnYXRpb24gZm9yIHRoZSBzZWNvbmQgZW5kIG9mIHRoZSBuZXcgYXNzb2NpYXRpb24uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDJOYW1lIiBuYW1lPSJlbmQyTmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHlwZS1jcmVhdGVBc3NvY2lhdGlvbi1lbmQyTmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tZW5kMk5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgZm9yIHRoZSBzZWNvbmQgZW5kIG9mIHRoZSBuZXcgYXNzb2NpYXRpb24uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDJMb3dlciIgbmFtZT0iZW5kMkxvd2VyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDJMb3dlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tZW5kMkxvd2VyIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBsb3dlciBib3VuZCBmb3IgdGhlIHNlY29uZCBlbmQgb2YgdGhlIG5ldyBhc3NvY2lhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDJVcHBlciIgbmFtZT0iZW5kMlVwcGVyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUeXBlLWNyZWF0ZUFzc29jaWF0aW9uLWVuZDJVcHBlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlR5cGUtY3JlYXRlQXNzb2NpYXRpb24tZW5kMlVwcGVyIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSB1cHBlciBib3VuZCBmb3IgdGhlIHNlY29uZCBlbmQgb2YgdGhlIG5ldyBhc3NvY2lhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlR5cGUtZ2V0QXNzb2NpYXRpb25zIiBuYW1lPSJnZXRBc3NvY2lhdGlvbnMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHlwZS1nZXRBc3NvY2lhdGlvbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUeXBlLWdldEFzc29jaWF0aW9ucyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBhc3NvY2lhdGlvbnMgaW4gd2hpY2ggdGhpcyB0eXBlIGlzIGludm9sdmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlR5cGUtZ2V0QXNzb2NpYXRpb25zLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJBc3NvY2lhdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVHlwZS1nZXRBc3NvY2lhdGlvbnMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlR5cGUtZ2V0QXNzb2NpYXRpb25zLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlR5cGUtY29uZm9ybXNUbyIgbmFtZT0iY29uZm9ybXNUbyIgYm9keUNvbmRpdGlvbj0iVHlwZS1jb25mb3Jtc1RvLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHlwZS1jb25mb3Jtc1RvLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHlwZS1jb25mb3Jtc1RvIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgY29uZm9ybXNUbygpIGdpdmVzIHRydWUgZm9yIGEgVHlwZSB0aGF0IGNvbmZvcm1zIHRvIGFub3RoZXIuIEJ5IGRlZmF1bHQsIHR3byBUeXBlcyBkbyBub3QgY29uZm9ybSB0byBlYWNoIG90aGVyLiBUaGlzIHF1ZXJ5IGlzIGludGVuZGVkIHRvIGJlIHJlZGVmaW5lZCBmb3Igc3BlY2lmaWMgY29uZm9ybWFuY2Ugc2l0dWF0aW9ucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iVHlwZS1jb25mb3Jtc1RvLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVHlwZS1jb25mb3Jtc1RvIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVHlwZS1jb25mb3Jtc1RvLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoZmFsc2UpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlR5cGUtY29uZm9ybXNUby1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVHlwZS1jb25mb3Jtc1RvLW90aGVyIiBuYW1lPSJvdGhlciIgdHlwZT0iVHlwZSIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVHlwZWRFbGVtZW50IiBuYW1lPSJUeXBlZEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlR5cGVkRWxlbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlR5cGVkRWxlbWVudCI+Ci0gICAgICAgIDxib2R5PkEgVHlwZWRFbGVtZW50IGlzIGEgTmFtZWRFbGVtZW50IHRoYXQgbWF5IGhhdmUgYSBUeXBlIHNwZWNpZmllZCBmb3IgaXQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJUeXBlZEVsZW1lbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik5hbWVkRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVHlwZWRFbGVtZW50LXR5cGUiIG5hbWU9InR5cGUiIHR5cGU9IlR5cGUiIGFzc29jaWF0aW9uPSJBX3R5cGVfdHlwZWRFbGVtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlR5cGVkRWxlbWVudC10eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHlwZWRFbGVtZW50LXR5cGUiPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlIG9mIHRoZSBUeXBlZEVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJUeXBlZEVsZW1lbnQtdHlwZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVXNhZ2UiIG5hbWU9IlVzYWdlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVc2FnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlVzYWdlIj4KLSAgICAgICAgPGJvZHk+QSBVc2FnZSBpcyBhIERlcGVuZGVuY3kgaW4gd2hpY2ggdGhlIGNsaWVudCBFbGVtZW50IHJlcXVpcmVzIHRoZSBzdXBwbGllciBFbGVtZW50IChvciBzZXQgb2YgRWxlbWVudHMpIGZvciBpdHMgZnVsbCBpbXBsZW1lbnRhdGlvbiBvciBvcGVyYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJVc2FnZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRGVwZW5kZW5jeSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJWaXNpYmlsaXR5S2luZCIgbmFtZT0iVmlzaWJpbGl0eUtpbmQiIHZpc2liaWxpdHk9InByaXZhdGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZpc2liaWxpdHlLaW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmlzaWJpbGl0eUtpbmQiPgotICAgICAgICA8Ym9keT5WaXNpYmlsaXR5S2luZCBpcyBhbiBlbnVtZXJhdGlvbiB0eXBlIHRoYXQgZGVmaW5lcyBsaXRlcmFscyB0byBkZXRlcm1pbmUgdGhlIHZpc2liaWxpdHkgb2YgRWxlbWVudHMgaW4gYSBtb2RlbC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJWaXNpYmlsaXR5S2luZC1wdWJsaWMiIG5hbWU9InB1YmxpYyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWaXNpYmlsaXR5S2luZC1wdWJsaWMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWaXNpYmlsaXR5S2luZC1wdWJsaWMiPgotICAgICAgICAgIDxib2R5PkEgTmFtZWQgRWxlbWVudCB3aXRoIHB1YmxpYyB2aXNpYmlsaXR5IGlzIHZpc2libGUgdG8gYWxsIGVsZW1lbnRzIHRoYXQgY2FuIGFjY2VzcyB0aGUgY29udGVudHMgb2YgdGhlIE5hbWVzcGFjZSB0aGF0IG93bnMgaXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IlZpc2liaWxpdHlLaW5kLXByaXZhdGUiIG5hbWU9InByaXZhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVmlzaWJpbGl0eUtpbmQtcHJpdmF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZpc2liaWxpdHlLaW5kLXByaXZhdGUiPgotICAgICAgICAgIDxib2R5PkEgTmFtZWRFbGVtZW50IHdpdGggcHJpdmF0ZSB2aXNpYmlsaXR5IGlzIG9ubHkgdmlzaWJsZSBpbnNpZGUgdGhlIE5hbWVzcGFjZSB0aGF0IG93bnMgaXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IlZpc2liaWxpdHlLaW5kLXByb3RlY3RlZCIgbmFtZT0icHJvdGVjdGVkIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZpc2liaWxpdHlLaW5kLXByb3RlY3RlZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZpc2liaWxpdHlLaW5kLXByb3RlY3RlZCI+Ci0gICAgICAgICAgPGJvZHk+QSBOYW1lZEVsZW1lbnQgd2l0aCBwcm90ZWN0ZWQgdmlzaWJpbGl0eSBpcyB2aXNpYmxlIHRvIEVsZW1lbnRzIHRoYXQgaGF2ZSBhIGdlbmVyYWxpemF0aW9uIHJlbGF0aW9uc2hpcCB0byB0aGUgTmFtZXNwYWNlIHRoYXQgb3ducyBpdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iVmlzaWJpbGl0eUtpbmQtcGFja2FnZSIgbmFtZT0icGFja2FnZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWaXNpYmlsaXR5S2luZC1wYWNrYWdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmlzaWJpbGl0eUtpbmQtcGFja2FnZSI+Ci0gICAgICAgICAgPGJvZHk+QSBOYW1lZEVsZW1lbnQgd2l0aCBwYWNrYWdlIHZpc2liaWxpdHkgaXMgdmlzaWJsZSB0byBhbGwgRWxlbWVudHMgd2l0aGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBQYWNrYWdlIChnaXZlbiB0aGF0IG90aGVyIG93bmluZyBFbGVtZW50cyBoYXZlIHByb3BlciB2aXNpYmlsaXR5KS4gT3V0c2lkZSB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgUGFja2FnZSwgYSBOYW1lZEVsZW1lbnQgbWFya2VkIGFzIGhhdmluZyBwYWNrYWdlIHZpc2liaWxpdHkgaXMgbm90IHZpc2libGUuICBPbmx5IE5hbWVkRWxlbWVudHMgdGhhdCBhcmUgbm90IG93bmVkIGJ5IFBhY2thZ2VzIGNhbiBiZSBtYXJrZWQgYXMgaGF2aW5nIHBhY2thZ2UgdmlzaWJpbGl0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdHlwZV90eXBlZEVsZW1lbnQiIG5hbWU9IkFfdHlwZV90eXBlZEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVHlwZWRFbGVtZW50LXR5cGUgQV90eXBlX3R5cGVkRWxlbWVudC10eXBlZEVsZW1lbnQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV90eXBlX3R5cGVkRWxlbWVudC10eXBlZEVsZW1lbnQiIG5hbWU9InR5cGVkRWxlbWVudCIgdHlwZT0iVHlwZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV90eXBlX3R5cGVkRWxlbWVudCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV90eXBlX3R5cGVkRWxlbWVudC10eXBlZEVsZW1lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3R5cGVfdHlwZWRFbGVtZW50LXR5cGVkRWxlbWVudC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRQYXJhbWV0ZXJfc2lnbmF0dXJlIiBuYW1lPSJBX293bmVkUGFyYW1ldGVyX3NpZ25hdHVyZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJUZW1wbGF0ZVNpZ25hdHVyZS1vd25lZFBhcmFtZXRlciBUZW1wbGF0ZVBhcmFtZXRlci1zaWduYXR1cmUiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9wYXJhbWV0ZXJfdGVtcGxhdGVTaWduYXR1cmUiIG5hbWU9IkFfcGFyYW1ldGVyX3RlbXBsYXRlU2lnbmF0dXJlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRlbXBsYXRlU2lnbmF0dXJlLXBhcmFtZXRlciBBX3BhcmFtZXRlcl90ZW1wbGF0ZVNpZ25hdHVyZS10ZW1wbGF0ZVNpZ25hdHVyZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3BhcmFtZXRlcl90ZW1wbGF0ZVNpZ25hdHVyZS10ZW1wbGF0ZVNpZ25hdHVyZSIgbmFtZT0idGVtcGxhdGVTaWduYXR1cmUiIHR5cGU9IlRlbXBsYXRlU2lnbmF0dXJlIiBhc3NvY2lhdGlvbj0iQV9wYXJhbWV0ZXJfdGVtcGxhdGVTaWduYXR1cmUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcGFyYW1ldGVyX3RlbXBsYXRlU2lnbmF0dXJlLXRlbXBsYXRlU2lnbmF0dXJlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9wYXJhbWV0ZXJfdGVtcGxhdGVTaWduYXR1cmUtdGVtcGxhdGVTaWduYXR1cmUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2FjdHVhbF90ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiIgbmFtZT0iQV9hY3R1YWxfdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tYWN0dWFsIEFfYWN0dWFsX3RlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLXRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfYWN0dWFsX3RlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLXRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uIiBuYW1lPSJ0ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiIgdHlwZT0iVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24iIGFzc29jaWF0aW9uPSJBX2FjdHVhbF90ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9hY3R1YWxfdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2FjdHVhbF90ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi10ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRBY3R1YWxfb3duaW5nVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24iIG5hbWU9IkFfb3duZWRBY3R1YWxfb3duaW5nVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tb3duZWRBY3R1YWwgQV9vd25lZEFjdHVhbF9vd25pbmdUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1vd25pbmdUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBX293bmVkQWN0dWFsX293bmluZ1RlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBX2FjdHVhbF90ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiIvPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vd25lZEFjdHVhbF9vd25pbmdUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1vd25pbmdUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiIgbmFtZT0ib3duaW5nVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24iIHR5cGU9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uIiByZWRlZmluZWRQcm9wZXJ0eT0iQV9hY3R1YWxfdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZEFjdHVhbF9vd25pbmdUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vd25lZEFjdHVhbF9vd25pbmdUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1vd25pbmdUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9mb3JtYWxfdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24iIG5hbWU9IkFfZm9ybWFsX3RlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLWZvcm1hbCBBX2Zvcm1hbF90ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi10ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2Zvcm1hbF90ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbi10ZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiIgbmFtZT0idGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24iIHR5cGU9IlRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uIiBhc3NvY2lhdGlvbj0iQV9mb3JtYWxfdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZm9ybWFsX3RlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLXRlbXBsYXRlUGFyYW1ldGVyU3Vic3RpdHV0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9mb3JtYWxfdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tdGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX293bmVkRGVmYXVsdF90ZW1wbGF0ZVBhcmFtZXRlciIgbmFtZT0iQV9vd25lZERlZmF1bHRfdGVtcGxhdGVQYXJhbWV0ZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVGVtcGxhdGVQYXJhbWV0ZXItb3duZWREZWZhdWx0IEFfb3duZWREZWZhdWx0X3RlbXBsYXRlUGFyYW1ldGVyLXRlbXBsYXRlUGFyYW1ldGVyIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFfb3duZWREZWZhdWx0X3RlbXBsYXRlUGFyYW1ldGVyLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBX2RlZmF1bHRfdGVtcGxhdGVQYXJhbWV0ZXIiLz4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb3duZWREZWZhdWx0X3RlbXBsYXRlUGFyYW1ldGVyLXRlbXBsYXRlUGFyYW1ldGVyIiBuYW1lPSJ0ZW1wbGF0ZVBhcmFtZXRlciIgdHlwZT0iVGVtcGxhdGVQYXJhbWV0ZXIiIHJlZGVmaW5lZFByb3BlcnR5PSJBX2RlZmF1bHRfdGVtcGxhdGVQYXJhbWV0ZXItdGVtcGxhdGVQYXJhbWV0ZXIiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZERlZmF1bHRfdGVtcGxhdGVQYXJhbWV0ZXIiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfb3duZWREZWZhdWx0X3RlbXBsYXRlUGFyYW1ldGVyLXRlbXBsYXRlUGFyYW1ldGVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX293bmVkUGFyYW1ldGVyZWRFbGVtZW50X293bmluZ1RlbXBsYXRlUGFyYW1ldGVyIiBuYW1lPSJBX293bmVkUGFyYW1ldGVyZWRFbGVtZW50X293bmluZ1RlbXBsYXRlUGFyYW1ldGVyIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRlbXBsYXRlUGFyYW1ldGVyLW93bmVkUGFyYW1ldGVyZWRFbGVtZW50IFBhcmFtZXRlcmFibGVFbGVtZW50LW93bmluZ1RlbXBsYXRlUGFyYW1ldGVyIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZGVmYXVsdF90ZW1wbGF0ZVBhcmFtZXRlciIgbmFtZT0iQV9kZWZhdWx0X3RlbXBsYXRlUGFyYW1ldGVyIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRlbXBsYXRlUGFyYW1ldGVyLWRlZmF1bHQgQV9kZWZhdWx0X3RlbXBsYXRlUGFyYW1ldGVyLXRlbXBsYXRlUGFyYW1ldGVyIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZGVmYXVsdF90ZW1wbGF0ZVBhcmFtZXRlci10ZW1wbGF0ZVBhcmFtZXRlciIgbmFtZT0idGVtcGxhdGVQYXJhbWV0ZXIiIHR5cGU9IlRlbXBsYXRlUGFyYW1ldGVyIiBhc3NvY2lhdGlvbj0iQV9kZWZhdWx0X3RlbXBsYXRlUGFyYW1ldGVyIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2RlZmF1bHRfdGVtcGxhdGVQYXJhbWV0ZXItdGVtcGxhdGVQYXJhbWV0ZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2RlZmF1bHRfdGVtcGxhdGVQYXJhbWV0ZXItdGVtcGxhdGVQYXJhbWV0ZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3BhcmFtZXRlcmVkRWxlbWVudF90ZW1wbGF0ZVBhcmFtZXRlciIgbmFtZT0iQV9wYXJhbWV0ZXJlZEVsZW1lbnRfdGVtcGxhdGVQYXJhbWV0ZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVGVtcGxhdGVQYXJhbWV0ZXItcGFyYW1ldGVyZWRFbGVtZW50IFBhcmFtZXRlcmFibGVFbGVtZW50LXRlbXBsYXRlUGFyYW1ldGVyIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc2lnbmF0dXJlX3RlbXBsYXRlQmluZGluZyIgbmFtZT0iQV9zaWduYXR1cmVfdGVtcGxhdGVCaW5kaW5nIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRlbXBsYXRlQmluZGluZy1zaWduYXR1cmUgQV9zaWduYXR1cmVfdGVtcGxhdGVCaW5kaW5nLXRlbXBsYXRlQmluZGluZyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3NpZ25hdHVyZV90ZW1wbGF0ZUJpbmRpbmctdGVtcGxhdGVCaW5kaW5nIiBuYW1lPSJ0ZW1wbGF0ZUJpbmRpbmciIHR5cGU9IlRlbXBsYXRlQmluZGluZyIgc3Vic2V0dGVkUHJvcGVydHk9IkFfdGFyZ2V0X2RpcmVjdGVkUmVsYXRpb25zaGlwLWRpcmVjdGVkUmVsYXRpb25zaGlwIiBhc3NvY2lhdGlvbj0iQV9zaWduYXR1cmVfdGVtcGxhdGVCaW5kaW5nIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3NpZ25hdHVyZV90ZW1wbGF0ZUJpbmRpbmctdGVtcGxhdGVCaW5kaW5nLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9zaWduYXR1cmVfdGVtcGxhdGVCaW5kaW5nLXRlbXBsYXRlQmluZGluZy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcGFyYW1ldGVyU3Vic3RpdHV0aW9uX3RlbXBsYXRlQmluZGluZyIgbmFtZT0iQV9wYXJhbWV0ZXJTdWJzdGl0dXRpb25fdGVtcGxhdGVCaW5kaW5nIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRlbXBsYXRlQmluZGluZy1wYXJhbWV0ZXJTdWJzdGl0dXRpb24gVGVtcGxhdGVQYXJhbWV0ZXJTdWJzdGl0dXRpb24tdGVtcGxhdGVCaW5kaW5nIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdGVtcGxhdGVCaW5kaW5nX2JvdW5kRWxlbWVudCIgbmFtZT0iQV90ZW1wbGF0ZUJpbmRpbmdfYm91bmRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRlbXBsYXRlYWJsZUVsZW1lbnQtdGVtcGxhdGVCaW5kaW5nIFRlbXBsYXRlQmluZGluZy1ib3VuZEVsZW1lbnQiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlX3RlbXBsYXRlIiBuYW1lPSJBX293bmVkVGVtcGxhdGVTaWduYXR1cmVfdGVtcGxhdGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVGVtcGxhdGVhYmxlRWxlbWVudC1vd25lZFRlbXBsYXRlU2lnbmF0dXJlIFRlbXBsYXRlU2lnbmF0dXJlLXRlbXBsYXRlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVsYXRlZEVsZW1lbnRfcmVsYXRpb25zaGlwIiBuYW1lPSJBX3JlbGF0ZWRFbGVtZW50X3JlbGF0aW9uc2hpcCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IlJlbGF0aW9uc2hpcC1yZWxhdGVkRWxlbWVudCBBX3JlbGF0ZWRFbGVtZW50X3JlbGF0aW9uc2hpcC1yZWxhdGlvbnNoaXAiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZWxhdGVkRWxlbWVudF9yZWxhdGlvbnNoaXAtcmVsYXRpb25zaGlwIiBuYW1lPSJyZWxhdGlvbnNoaXAiIHR5cGU9IlJlbGF0aW9uc2hpcCIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBpc0Rlcml2ZWRVbmlvbj0idHJ1ZSIgYXNzb2NpYXRpb249IkFfcmVsYXRlZEVsZW1lbnRfcmVsYXRpb25zaGlwIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JlbGF0ZWRFbGVtZW50X3JlbGF0aW9uc2hpcC1yZWxhdGlvbnNoaXAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlbGF0ZWRFbGVtZW50X3JlbGF0aW9uc2hpcC1yZWxhdGlvbnNoaXAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2ltcG9ydGVkUGFja2FnZV9wYWNrYWdlSW1wb3J0IiBuYW1lPSJBX2ltcG9ydGVkUGFja2FnZV9wYWNrYWdlSW1wb3J0IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlBhY2thZ2VJbXBvcnQtaW1wb3J0ZWRQYWNrYWdlIEFfaW1wb3J0ZWRQYWNrYWdlX3BhY2thZ2VJbXBvcnQtcGFja2FnZUltcG9ydCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2ltcG9ydGVkUGFja2FnZV9wYWNrYWdlSW1wb3J0LXBhY2thZ2VJbXBvcnQiIG5hbWU9InBhY2thZ2VJbXBvcnQiIHR5cGU9IlBhY2thZ2VJbXBvcnQiIHN1YnNldHRlZFByb3BlcnR5PSJBX3RhcmdldF9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCIgYXNzb2NpYXRpb249IkFfaW1wb3J0ZWRQYWNrYWdlX3BhY2thZ2VJbXBvcnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfaW1wb3J0ZWRQYWNrYWdlX3BhY2thZ2VJbXBvcnQtcGFja2FnZUltcG9ydC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfaW1wb3J0ZWRQYWNrYWdlX3BhY2thZ2VJbXBvcnQtcGFja2FnZUltcG9ydC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZWxlbWVudEltcG9ydF9pbXBvcnRpbmdOYW1lc3BhY2UiIG5hbWU9IkFfZWxlbWVudEltcG9ydF9pbXBvcnRpbmdOYW1lc3BhY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iTmFtZXNwYWNlLWVsZW1lbnRJbXBvcnQgRWxlbWVudEltcG9ydC1pbXBvcnRpbmdOYW1lc3BhY2UiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZE1lbWJlcl9uYW1lc3BhY2UiIG5hbWU9IkFfb3duZWRNZW1iZXJfbmFtZXNwYWNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBpc0Rlcml2ZWQ9InRydWUiIG1lbWJlckVuZD0iTmFtZXNwYWNlLW93bmVkTWVtYmVyIE5hbWVkRWxlbWVudC1uYW1lc3BhY2UiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZFJ1bGVfY29udGV4dCIgbmFtZT0iQV9vd25lZFJ1bGVfY29udGV4dCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJOYW1lc3BhY2Utb3duZWRSdWxlIENvbnN0cmFpbnQtY29udGV4dCIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3BhY2thZ2VJbXBvcnRfaW1wb3J0aW5nTmFtZXNwYWNlIiBuYW1lPSJBX3BhY2thZ2VJbXBvcnRfaW1wb3J0aW5nTmFtZXNwYWNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik5hbWVzcGFjZS1wYWNrYWdlSW1wb3J0IFBhY2thZ2VJbXBvcnQtaW1wb3J0aW5nTmFtZXNwYWNlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbWVtYmVyX21lbWJlck5hbWVzcGFjZSIgbmFtZT0iQV9tZW1iZXJfbWVtYmVyTmFtZXNwYWNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBpc0Rlcml2ZWQ9InRydWUiIG1lbWJlckVuZD0iTmFtZXNwYWNlLW1lbWJlciBBX21lbWJlcl9tZW1iZXJOYW1lc3BhY2UtbWVtYmVyTmFtZXNwYWNlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfbWVtYmVyX21lbWJlck5hbWVzcGFjZS1tZW1iZXJOYW1lc3BhY2UiIG5hbWU9Im1lbWJlck5hbWVzcGFjZSIgdHlwZT0iTmFtZXNwYWNlIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGlzRGVyaXZlZFVuaW9uPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9tZW1iZXJfbWVtYmVyTmFtZXNwYWNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX21lbWJlcl9tZW1iZXJOYW1lc3BhY2UtbWVtYmVyTmFtZXNwYWNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9tZW1iZXJfbWVtYmVyTmFtZXNwYWNlLW1lbWJlck5hbWVzcGFjZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW1wb3J0ZWRNZW1iZXJfbmFtZXNwYWNlIiBuYW1lPSJBX2ltcG9ydGVkTWVtYmVyX25hbWVzcGFjZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9Ik5hbWVzcGFjZS1pbXBvcnRlZE1lbWJlciBBX2ltcG9ydGVkTWVtYmVyX25hbWVzcGFjZS1uYW1lc3BhY2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9pbXBvcnRlZE1lbWJlcl9uYW1lc3BhY2UtbmFtZXNwYWNlIiBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9Ik5hbWVzcGFjZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfbWVtYmVyX21lbWJlck5hbWVzcGFjZS1tZW1iZXJOYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX2ltcG9ydGVkTWVtYmVyX25hbWVzcGFjZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9pbXBvcnRlZE1lbWJlcl9uYW1lc3BhY2UtbmFtZXNwYWNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9pbXBvcnRlZE1lbWJlcl9uYW1lc3BhY2UtbmFtZXNwYWNlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9uYW1lRXhwcmVzc2lvbl9uYW1lZEVsZW1lbnQiIG5hbWU9IkFfbmFtZUV4cHJlc3Npb25fbmFtZWRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik5hbWVkRWxlbWVudC1uYW1lRXhwcmVzc2lvbiBBX25hbWVFeHByZXNzaW9uX25hbWVkRWxlbWVudC1uYW1lZEVsZW1lbnQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9uYW1lRXhwcmVzc2lvbl9uYW1lZEVsZW1lbnQtbmFtZWRFbGVtZW50IiBuYW1lPSJuYW1lZEVsZW1lbnQiIHR5cGU9Ik5hbWVkRWxlbWVudCIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX25hbWVFeHByZXNzaW9uX25hbWVkRWxlbWVudCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9uYW1lRXhwcmVzc2lvbl9uYW1lZEVsZW1lbnQtbmFtZWRFbGVtZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NsaWVudERlcGVuZGVuY3lfY2xpZW50IiBuYW1lPSJBX2NsaWVudERlcGVuZGVuY3lfY2xpZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkRlcGVuZGVuY3ktY2xpZW50IEFfY2xpZW50RGVwZW5kZW5jeV9jbGllbnQtY2xpZW50RGVwZW5kZW5jeSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2NsaWVudERlcGVuZGVuY3lfY2xpZW50LWNsaWVudERlcGVuZGVuY3kiIG5hbWU9ImNsaWVudERlcGVuZGVuY3kiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9IkRlcGVuZGVuY3kiIGFzc29jaWF0aW9uPSJBX2NsaWVudERlcGVuZGVuY3lfY2xpZW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2NsaWVudERlcGVuZGVuY3lfY2xpZW50LWNsaWVudERlcGVuZGVuY3ktX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NsaWVudERlcGVuZGVuY3lfY2xpZW50LWNsaWVudERlcGVuZGVuY3ktX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2xvd2VyVmFsdWVfb3duaW5nTG93ZXIiIG5hbWU9IkFfbG93ZXJWYWx1ZV9vd25pbmdMb3dlciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJNdWx0aXBsaWNpdHlFbGVtZW50LWxvd2VyVmFsdWUgQV9sb3dlclZhbHVlX293bmluZ0xvd2VyLW93bmluZ0xvd2VyIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfbG93ZXJWYWx1ZV9vd25pbmdMb3dlci1vd25pbmdMb3dlciIgbmFtZT0ib3duaW5nTG93ZXIiIHR5cGU9Ik11bHRpcGxpY2l0eUVsZW1lbnQiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9sb3dlclZhbHVlX293bmluZ0xvd2VyIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2xvd2VyVmFsdWVfb3duaW5nTG93ZXItb3duaW5nTG93ZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdXBwZXJWYWx1ZV9vd25pbmdVcHBlciIgbmFtZT0iQV91cHBlclZhbHVlX293bmluZ1VwcGVyIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik11bHRpcGxpY2l0eUVsZW1lbnQtdXBwZXJWYWx1ZSBBX3VwcGVyVmFsdWVfb3duaW5nVXBwZXItb3duaW5nVXBwZXIiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV91cHBlclZhbHVlX293bmluZ1VwcGVyLW93bmluZ1VwcGVyIiBuYW1lPSJvd25pbmdVcHBlciIgdHlwZT0iTXVsdGlwbGljaXR5RWxlbWVudCIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX3VwcGVyVmFsdWVfb3duaW5nVXBwZXIiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdXBwZXJWYWx1ZV9vd25pbmdVcHBlci1vd25pbmdVcHBlci1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9pbXBvcnRlZEVsZW1lbnRfaW1wb3J0IiBuYW1lPSJBX2ltcG9ydGVkRWxlbWVudF9pbXBvcnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRWxlbWVudEltcG9ydC1pbXBvcnRlZEVsZW1lbnQgQV9pbXBvcnRlZEVsZW1lbnRfaW1wb3J0LWltcG9ydCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2ltcG9ydGVkRWxlbWVudF9pbXBvcnQtaW1wb3J0IiBuYW1lPSJpbXBvcnQiIHR5cGU9IkVsZW1lbnRJbXBvcnQiIHN1YnNldHRlZFByb3BlcnR5PSJBX3RhcmdldF9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCIgYXNzb2NpYXRpb249IkFfaW1wb3J0ZWRFbGVtZW50X2ltcG9ydCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9pbXBvcnRlZEVsZW1lbnRfaW1wb3J0LWltcG9ydC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfaW1wb3J0ZWRFbGVtZW50X2ltcG9ydC1pbXBvcnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX293bmVkRWxlbWVudF9vd25lciIgbmFtZT0iQV9vd25lZEVsZW1lbnRfb3duZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJFbGVtZW50LW93bmVkRWxlbWVudCBFbGVtZW50LW93bmVyIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRDb21tZW50X293bmluZ0VsZW1lbnQiIG5hbWU9IkFfb3duZWRDb21tZW50X293bmluZ0VsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRWxlbWVudC1vd25lZENvbW1lbnQgQV9vd25lZENvbW1lbnRfb3duaW5nRWxlbWVudC1vd25pbmdFbGVtZW50Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb3duZWRDb21tZW50X293bmluZ0VsZW1lbnQtb3duaW5nRWxlbWVudCIgbmFtZT0ib3duaW5nRWxlbWVudCIgdHlwZT0iRWxlbWVudCIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX293bmVkQ29tbWVudF9vd25pbmdFbGVtZW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX293bmVkQ29tbWVudF9vd25pbmdFbGVtZW50LW93bmluZ0VsZW1lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc291cmNlX2RpcmVjdGVkUmVsYXRpb25zaGlwIiBuYW1lPSJBX3NvdXJjZV9kaXJlY3RlZFJlbGF0aW9uc2hpcCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXNvdXJjZSBBX3NvdXJjZV9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3NvdXJjZV9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCIgbmFtZT0iZGlyZWN0ZWRSZWxhdGlvbnNoaXAiIHR5cGU9IkRpcmVjdGVkUmVsYXRpb25zaGlwIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGlzRGVyaXZlZFVuaW9uPSJ0cnVlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9yZWxhdGVkRWxlbWVudF9yZWxhdGlvbnNoaXAtcmVsYXRpb25zaGlwIiBhc3NvY2lhdGlvbj0iQV9zb3VyY2VfZGlyZWN0ZWRSZWxhdGlvbnNoaXAiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc291cmNlX2RpcmVjdGVkUmVsYXRpb25zaGlwLWRpcmVjdGVkUmVsYXRpb25zaGlwLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9zb3VyY2VfZGlyZWN0ZWRSZWxhdGlvbnNoaXAtZGlyZWN0ZWRSZWxhdGlvbnNoaXAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3RhcmdldF9kaXJlY3RlZFJlbGF0aW9uc2hpcCIgbmFtZT0iQV90YXJnZXRfZGlyZWN0ZWRSZWxhdGlvbnNoaXAiIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJEaXJlY3RlZFJlbGF0aW9uc2hpcC10YXJnZXQgQV90YXJnZXRfZGlyZWN0ZWRSZWxhdGlvbnNoaXAtZGlyZWN0ZWRSZWxhdGlvbnNoaXAiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV90YXJnZXRfZGlyZWN0ZWRSZWxhdGlvbnNoaXAtZGlyZWN0ZWRSZWxhdGlvbnNoaXAiIG5hbWU9ImRpcmVjdGVkUmVsYXRpb25zaGlwIiB0eXBlPSJEaXJlY3RlZFJlbGF0aW9uc2hpcCIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBpc0Rlcml2ZWRVbmlvbj0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfcmVsYXRlZEVsZW1lbnRfcmVsYXRpb25zaGlwLXJlbGF0aW9uc2hpcCIgYXNzb2NpYXRpb249IkFfdGFyZ2V0X2RpcmVjdGVkUmVsYXRpb25zaGlwIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3RhcmdldF9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfdGFyZ2V0X2RpcmVjdGVkUmVsYXRpb25zaGlwLWRpcmVjdGVkUmVsYXRpb25zaGlwLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zdXBwbGllcl9zdXBwbGllckRlcGVuZGVuY3kiIG5hbWU9IkFfc3VwcGxpZXJfc3VwcGxpZXJEZXBlbmRlbmN5IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkRlcGVuZGVuY3ktc3VwcGxpZXIgQV9zdXBwbGllcl9zdXBwbGllckRlcGVuZGVuY3ktc3VwcGxpZXJEZXBlbmRlbmN5Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfc3VwcGxpZXJfc3VwcGxpZXJEZXBlbmRlbmN5LXN1cHBsaWVyRGVwZW5kZW5jeSIgbmFtZT0ic3VwcGxpZXJEZXBlbmRlbmN5IiB0eXBlPSJEZXBlbmRlbmN5IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV90YXJnZXRfZGlyZWN0ZWRSZWxhdGlvbnNoaXAtZGlyZWN0ZWRSZWxhdGlvbnNoaXAiIGFzc29jaWF0aW9uPSJBX3N1cHBsaWVyX3N1cHBsaWVyRGVwZW5kZW5jeSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBX3N1cHBsaWVyX3N1cHBsaWVyRGVwZW5kZW5jeS1zdXBwbGllckRlcGVuZGVuY3ktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBX3N1cHBsaWVyX3N1cHBsaWVyRGVwZW5kZW5jeS1zdXBwbGllckRlcGVuZGVuY3kiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB0aGUgZGVwZW5kZW5jaWVzIHRoYXQgcmVmZXJlbmNlIHRoZSBzdXBwbGllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc3VwcGxpZXJfc3VwcGxpZXJEZXBlbmRlbmN5LXN1cHBsaWVyRGVwZW5kZW5jeS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfc3VwcGxpZXJfc3VwcGxpZXJEZXBlbmRlbmN5LXN1cHBsaWVyRGVwZW5kZW5jeS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY29uc3RyYWluZWRFbGVtZW50X2NvbnN0cmFpbnQiIG5hbWU9IkFfY29uc3RyYWluZWRFbGVtZW50X2NvbnN0cmFpbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ29uc3RyYWludC1jb25zdHJhaW5lZEVsZW1lbnQgQV9jb25zdHJhaW5lZEVsZW1lbnRfY29uc3RyYWludC1jb25zdHJhaW50Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfY29uc3RyYWluZWRFbGVtZW50X2NvbnN0cmFpbnQtY29uc3RyYWludCIgbmFtZT0iY29uc3RyYWludCIgdHlwZT0iQ29uc3RyYWludCIgYXNzb2NpYXRpb249IkFfY29uc3RyYWluZWRFbGVtZW50X2NvbnN0cmFpbnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfY29uc3RyYWluZWRFbGVtZW50X2NvbnN0cmFpbnQtY29uc3RyYWludC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfY29uc3RyYWluZWRFbGVtZW50X2NvbnN0cmFpbnQtY29uc3RyYWludC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc3BlY2lmaWNhdGlvbl9vd25pbmdDb25zdHJhaW50IiBuYW1lPSJBX3NwZWNpZmljYXRpb25fb3duaW5nQ29uc3RyYWludCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDb25zdHJhaW50LXNwZWNpZmljYXRpb24gQV9zcGVjaWZpY2F0aW9uX293bmluZ0NvbnN0cmFpbnQtb3duaW5nQ29uc3RyYWludCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3NwZWNpZmljYXRpb25fb3duaW5nQ29uc3RyYWludC1vd25pbmdDb25zdHJhaW50IiBuYW1lPSJvd25pbmdDb25zdHJhaW50IiB0eXBlPSJDb25zdHJhaW50IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfc3BlY2lmaWNhdGlvbl9vd25pbmdDb25zdHJhaW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3NwZWNpZmljYXRpb25fb3duaW5nQ29uc3RyYWludC1vd25pbmdDb25zdHJhaW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2Fubm90YXRlZEVsZW1lbnRfY29tbWVudCIgbmFtZT0iQV9hbm5vdGF0ZWRFbGVtZW50X2NvbW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ29tbWVudC1hbm5vdGF0ZWRFbGVtZW50IEFfYW5ub3RhdGVkRWxlbWVudF9jb21tZW50LWNvbW1lbnQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9hbm5vdGF0ZWRFbGVtZW50X2NvbW1lbnQtY29tbWVudCIgbmFtZT0iY29tbWVudCIgdHlwZT0iQ29tbWVudCIgYXNzb2NpYXRpb249IkFfYW5ub3RhdGVkRWxlbWVudF9jb21tZW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2Fubm90YXRlZEVsZW1lbnRfY29tbWVudC1jb21tZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9hbm5vdGF0ZWRFbGVtZW50X2NvbW1lbnQtY29tbWVudC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbWFwcGluZ19hYnN0cmFjdGlvbiIgbmFtZT0iQV9tYXBwaW5nX2Fic3RyYWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkFic3RyYWN0aW9uLW1hcHBpbmcgQV9tYXBwaW5nX2Fic3RyYWN0aW9uLWFic3RyYWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfbWFwcGluZ19hYnN0cmFjdGlvbi1hYnN0cmFjdGlvbiIgbmFtZT0iYWJzdHJhY3Rpb24iIHR5cGU9IkFic3RyYWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfbWFwcGluZ19hYnN0cmFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9tYXBwaW5nX2Fic3RyYWN0aW9uLWFic3RyYWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJBcnRpZmFjdCIgbmFtZT0iQXJ0aWZhY3QiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFydGlmYWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXJ0aWZhY3QiPgotICAgICAgICA8Ym9keT5BbiBhcnRpZmFjdCBpcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIHBoeXNpY2FsIHBpZWNlIG9mIGluZm9ybWF0aW9uIHRoYXQgaXMgdXNlZCBvciBwcm9kdWNlZCBieSBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2Nlc3MsIG9yIGJ5IGRlcGxveW1lbnQgYW5kIG9wZXJhdGlvbiBvZiBhIHN5c3RlbS4gRXhhbXBsZXMgb2YgYXJ0aWZhY3RzIGluY2x1ZGUgbW9kZWwgZmlsZXMsIHNvdXJjZSBmaWxlcywgc2NyaXB0cywgYW5kIGJpbmFyeSBleGVjdXRhYmxlIGZpbGVzLCBhIHRhYmxlIGluIGEgZGF0YWJhc2Ugc3lzdGVtLCBhIGRldmVsb3BtZW50IGRlbGl2ZXJhYmxlLCBvciBhIHdvcmQtcHJvY2Vzc2luZyBkb2N1bWVudCwgYSBtYWlsIG1lc3NhZ2UuCi1BbiBhcnRpZmFjdCBpcyB0aGUgc291cmNlIG9mIGEgZGVwbG95bWVudCB0byBhIG5vZGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBcnRpZmFjdC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQ2xhc3NpZmllciIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQXJ0aWZhY3QtX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IkRlcGxveWVkQXJ0aWZhY3QiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFydGlmYWN0LWZpbGVOYW1lIiBuYW1lPSJmaWxlTmFtZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBcnRpZmFjdC1maWxlTmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFydGlmYWN0LWZpbGVOYW1lIj4KLSAgICAgICAgICA8Ym9keT5BIGNvbmNyZXRlIG5hbWUgdGhhdCBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBBcnRpZmFjdCBpbiBhIHBoeXNpY2FsIGNvbnRleHQuIEV4YW1wbGU6IGZpbGUgc3lzdGVtIG5hbWUsIHVuaXZlcnNhbCByZXNvdXJjZSBsb2NhdG9yLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFydGlmYWN0LWZpbGVOYW1lLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQXJ0aWZhY3QtbWFuaWZlc3RhdGlvbiIgbmFtZT0ibWFuaWZlc3RhdGlvbiIgdHlwZT0iTWFuaWZlc3RhdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IE5hbWVkRWxlbWVudC1jbGllbnREZXBlbmRlbmN5IiBhc3NvY2lhdGlvbj0iQV9tYW5pZmVzdGF0aW9uX2FydGlmYWN0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFydGlmYWN0LW1hbmlmZXN0YXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBcnRpZmFjdC1tYW5pZmVzdGF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgc2V0IG9mIG1vZGVsIGVsZW1lbnRzIHRoYXQgYXJlIG1hbmlmZXN0ZWQgaW4gdGhlIEFydGlmYWN0LiBUaGF0IGlzLCB0aGVzZSBtb2RlbCBlbGVtZW50cyBhcmUgdXRpbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdGlvbiAob3IgZ2VuZXJhdGlvbikgb2YgdGhlIGFydGlmYWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQXJ0aWZhY3QtbWFuaWZlc3RhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFydGlmYWN0LW1hbmlmZXN0YXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQXJ0aWZhY3QtbmVzdGVkQXJ0aWZhY3QiIG5hbWU9Im5lc3RlZEFydGlmYWN0IiB0eXBlPSJBcnRpZmFjdCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfbmVzdGVkQXJ0aWZhY3RfYXJ0aWZhY3QiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQXJ0aWZhY3QtbmVzdGVkQXJ0aWZhY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBcnRpZmFjdC1uZXN0ZWRBcnRpZmFjdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEFydGlmYWN0cyB0aGF0IGFyZSBkZWZpbmVkIChuZXN0ZWQpIHdpdGhpbiB0aGUgQXJ0aWZhY3QuIFRoZSBhc3NvY2lhdGlvbiBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZSBvd25lZE1lbWJlciBhc3NvY2lhdGlvbiBmcm9tIE5hbWVzcGFjZSB0byBOYW1lZEVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBcnRpZmFjdC1uZXN0ZWRBcnRpZmFjdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFydGlmYWN0LW5lc3RlZEFydGlmYWN0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFydGlmYWN0LW93bmVkQXR0cmlidXRlIiBuYW1lPSJvd25lZEF0dHJpYnV0ZSIgdHlwZT0iUHJvcGVydHkiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkNsYXNzaWZpZXItYXR0cmlidXRlIE5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfb3duZWRBdHRyaWJ1dGVfYXJ0aWZhY3QiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQXJ0aWZhY3Qtb3duZWRBdHRyaWJ1dGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBcnRpZmFjdC1vd25lZEF0dHJpYnV0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGF0dHJpYnV0ZXMgb3IgYXNzb2NpYXRpb24gZW5kcyBkZWZpbmVkIGZvciB0aGUgQXJ0aWZhY3QuIFRoZSBhc3NvY2lhdGlvbiBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZSBvd25lZE1lbWJlciBhc3NvY2lhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFydGlmYWN0LW93bmVkQXR0cmlidXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQXJ0aWZhY3Qtb3duZWRBdHRyaWJ1dGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQXJ0aWZhY3Qtb3duZWRPcGVyYXRpb24iIG5hbWU9Im93bmVkT3BlcmF0aW9uIiB0eXBlPSJPcGVyYXRpb24iIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50IENsYXNzaWZpZXItZmVhdHVyZSBOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX293bmVkT3BlcmF0aW9uX2FydGlmYWN0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFydGlmYWN0LW93bmVkT3BlcmF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXJ0aWZhY3Qtb3duZWRPcGVyYXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBPcGVyYXRpb25zIGRlZmluZWQgZm9yIHRoZSBBcnRpZmFjdC4gVGhlIGFzc29jaWF0aW9uIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgdGhlIG93bmVkTWVtYmVyIGFzc29jaWF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQXJ0aWZhY3Qtb3duZWRPcGVyYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBcnRpZmFjdC1vd25lZE9wZXJhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJBcnRpZmFjdC1jcmVhdGVPd25lZEF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRlT3duZWRBdHRyaWJ1dGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRBdHRyaWJ1dGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBcnRpZmFjdC1jcmVhdGVPd25lZEF0dHJpYnV0ZSI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCB0eXBlLCBsb3dlciBib3VuZCwgYW5kIHVwcGVyIGJvdW5kIGFzIGFuIG93bmVkIGF0dHJpYnV0ZSBvZiB0aGlzIGFydGlmYWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkQXR0cmlidXRlLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJQcm9wZXJ0eSIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRBdHRyaWJ1dGUtbmFtZSIgbmFtZT0ibmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRBdHRyaWJ1dGUtbmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgZm9yIHRoZSBuZXcgYXR0cmlidXRlLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkQXR0cmlidXRlLXR5cGUiIG5hbWU9InR5cGUiIHR5cGU9IlR5cGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkQXR0cmlidXRlLXR5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBcnRpZmFjdC1jcmVhdGVPd25lZEF0dHJpYnV0ZS10eXBlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSB0eXBlIGZvciB0aGUgbmV3IGF0dHJpYnV0ZSwgb3IgbnVsbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBcnRpZmFjdC1jcmVhdGVPd25lZEF0dHJpYnV0ZS10eXBlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBcnRpZmFjdC1jcmVhdGVPd25lZEF0dHJpYnV0ZS10eXBlLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJBcnRpZmFjdC1jcmVhdGVPd25lZEF0dHJpYnV0ZS1sb3dlciIgbmFtZT0ibG93ZXIiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkQXR0cmlidXRlLWxvd2VyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRBdHRyaWJ1dGUtbG93ZXIiPgotICAgICAgICAgICAgPGJvZHk+VGhlIGxvd2VyIGJvdW5kIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJBcnRpZmFjdC1jcmVhdGVPd25lZEF0dHJpYnV0ZS11cHBlciIgbmFtZT0idXBwZXIiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkQXR0cmlidXRlLXVwcGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdXBwZXIiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHVwcGVyIGJvdW5kIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uIiBuYW1lPSJjcmVhdGVPd25lZE9wZXJhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBcnRpZmFjdC1jcmVhdGVPd25lZE9wZXJhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5DcmVhdGVzIGFuIG9wZXJhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgcGFyYW1ldGVyIG5hbWVzLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCByZXR1cm4gdHlwZSAob3IgbnVsbCkgYXMgYW4gb3duZWQgb3BlcmF0aW9uIG9mIHRoaXMgYXJ0aWZhY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRPcGVyYXRpb24tX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9Ik9wZXJhdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRPcGVyYXRpb24tbmFtZSIgbmFtZT0ibmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRPcGVyYXRpb24tbmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uLW5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgZm9yIHRoZSBuZXcgb3BlcmF0aW9uLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uLW5hbWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uLW5hbWUtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzIiBuYW1lPSJwYXJhbWV0ZXJOYW1lcyIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyTmFtZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBcnRpZmFjdC1jcmVhdGVPd25lZE9wZXJhdGlvbi1wYXJhbWV0ZXJOYW1lcyI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgcGFyYW1ldGVyIG5hbWVzIGZvciAgdGhlIG5ldyBvcGVyYXRpb24sIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyTmFtZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJBcnRpZmFjdC1jcmVhdGVPd25lZE9wZXJhdGlvbi1wYXJhbWV0ZXJUeXBlcyIgbmFtZT0icGFyYW1ldGVyVHlwZXMiIHR5cGU9IlR5cGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlclR5cGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyVHlwZXMiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHBhcmFtZXRlciB0eXBlcyBmb3IgdGhlIG5ldyBvcGVyYXRpb24sIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyVHlwZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlclR5cGVzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJBcnRpZmFjdC1jcmVhdGVPd25lZE9wZXJhdGlvbi1yZXR1cm5UeXBlIiBuYW1lPSJyZXR1cm5UeXBlIiB0eXBlPSJUeXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBcnRpZmFjdC1jcmVhdGVPd25lZE9wZXJhdGlvbi1yZXR1cm5UeXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXJ0aWZhY3QtY3JlYXRlT3duZWRPcGVyYXRpb24tcmV0dXJuVHlwZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgcmV0dXJuIHR5cGUgZm9yIHRoZSBuZXcgb3BlcmF0aW9uLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uLXJldHVyblR5cGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFydGlmYWN0LWNyZWF0ZU93bmVkT3BlcmF0aW9uLXJldHVyblR5cGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJDb21tdW5pY2F0aW9uUGF0aCIgbmFtZT0iQ29tbXVuaWNhdGlvblBhdGgiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbW11bmljYXRpb25QYXRoLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29tbXVuaWNhdGlvblBhdGgiPgotICAgICAgICA8Ym9keT5BIGNvbW11bmljYXRpb24gcGF0aCBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBkZXBsb3ltZW50IHRhcmdldHMsIHRocm91Z2ggd2hpY2ggdGhleSBhcmUgYWJsZSB0byBleGNoYW5nZSBzaWduYWxzIGFuZCBtZXNzYWdlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb21tdW5pY2F0aW9uUGF0aC1hc3NvY2lhdGlvbl9lbmRzIiBuYW1lPSJhc3NvY2lhdGlvbl9lbmRzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbW11bmljYXRpb25QYXRoIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbW11bmljYXRpb25QYXRoLWFzc29jaWF0aW9uX2VuZHMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21tdW5pY2F0aW9uUGF0aC1hc3NvY2lhdGlvbl9lbmRzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgYXNzb2NpYXRpb24gZW5kcyBvZiBhIENvbW11bmljYXRpb25QYXRoIGFyZSB0eXBlZCBieSBEZXBsb3ltZW50VGFyZ2V0cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ29tbXVuaWNhdGlvblBhdGgtYXNzb2NpYXRpb25fZW5kcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZW5kVHlwZS0+Zm9yQWxsIChvY2xJc0tpbmRPZihEZXBsb3ltZW50VGFyZ2V0KSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQ29tbXVuaWNhdGlvblBhdGgtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFzc29jaWF0aW9uIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkRlcGxveWVkQXJ0aWZhY3QiIG5hbWU9IkRlcGxveWVkQXJ0aWZhY3QiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlcGxveWVkQXJ0aWZhY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZXBsb3llZEFydGlmYWN0Ij4KLSAgICAgICAgPGJvZHk+QSBkZXBsb3llZCBhcnRpZmFjdCBpcyBhbiBhcnRpZmFjdCBvciBhcnRpZmFjdCBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGRlcGxveWVkIHRvIGEgZGVwbG95bWVudCB0YXJnZXQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJEZXBsb3llZEFydGlmYWN0LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJOYW1lZEVsZW1lbnQiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRGVwbG95bWVudCIgbmFtZT0iRGVwbG95bWVudCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGVwbG95bWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRlcGxveW1lbnQiPgotICAgICAgICA8Ym9keT5BIGRlcGxveW1lbnQgaXMgdGhlIGFsbG9jYXRpb24gb2YgYW4gYXJ0aWZhY3Qgb3IgYXJ0aWZhY3QgaW5zdGFuY2UgdG8gYSBkZXBsb3ltZW50IHRhcmdldC4KLUEgY29tcG9uZW50IGRlcGxveW1lbnQgaXMgdGhlIGRlcGxveW1lbnQgb2Ygb25lIG9yIG1vcmUgYXJ0aWZhY3RzIG9yIGFydGlmYWN0IGluc3RhbmNlcyB0byBhIGRlcGxveW1lbnQgdGFyZ2V0LCBvcHRpb25hbGx5IHBhcmFtZXRlcml6ZWQgYnkgYSBkZXBsb3ltZW50IHNwZWNpZmljYXRpb24uIEV4YW1wbGVzIGFyZSBleGVjdXRhYmxlcyBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkRlcGxveW1lbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkRlcGVuZGVuY3kiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkRlcGxveW1lbnQtY29uZmlndXJhdGlvbiIgbmFtZT0iY29uZmlndXJhdGlvbiIgdHlwZT0iRGVwbG95bWVudFNwZWNpZmljYXRpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfY29uZmlndXJhdGlvbl9kZXBsb3ltZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlcGxveW1lbnQtY29uZmlndXJhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRlcGxveW1lbnQtY29uZmlndXJhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNwZWNpZmljYXRpb24gb2YgcHJvcGVydGllcyB0aGF0IHBhcmFtZXRlcml6ZSB0aGUgZGVwbG95bWVudCBhbmQgZXhlY3V0aW9uIG9mIG9uZSBvciBtb3JlIEFydGlmYWN0cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkRlcGxveW1lbnQtY29uZmlndXJhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkRlcGxveW1lbnQtY29uZmlndXJhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJEZXBsb3ltZW50LWRlcGxveWVkQXJ0aWZhY3QiIG5hbWU9ImRlcGxveWVkQXJ0aWZhY3QiIHR5cGU9IkRlcGxveWVkQXJ0aWZhY3QiIHN1YnNldHRlZFByb3BlcnR5PSJEZXBlbmRlbmN5LXN1cHBsaWVyIiBhc3NvY2lhdGlvbj0iQV9kZXBsb3llZEFydGlmYWN0X2RlcGxveW1lbnRGb3JBcnRpZmFjdCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZXBsb3ltZW50LWRlcGxveWVkQXJ0aWZhY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZXBsb3ltZW50LWRlcGxveWVkQXJ0aWZhY3QiPgotICAgICAgICAgIDxib2R5PlRoZSBBcnRpZmFjdHMgdGhhdCBhcmUgZGVwbG95ZWQgb250byBhIE5vZGUuIFRoaXMgYXNzb2NpYXRpb24gc3BlY2lhbGl6ZXMgdGhlIHN1cHBsaWVyIGFzc29jaWF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRGVwbG95bWVudC1kZXBsb3llZEFydGlmYWN0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRGVwbG95bWVudC1kZXBsb3llZEFydGlmYWN0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkRlcGxveW1lbnQtbG9jYXRpb24iIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJEZXBsb3ltZW50VGFyZ2V0IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRGVwZW5kZW5jeS1jbGllbnQgRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfZGVwbG95bWVudF9sb2NhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZXBsb3ltZW50LWxvY2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVwbG95bWVudC1sb2NhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIERlcGxveWVkVGFyZ2V0IHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgYSBEZXBsb3ltZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJEZXBsb3ltZW50U3BlY2lmaWNhdGlvbiIgbmFtZT0iRGVwbG95bWVudFNwZWNpZmljYXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVwbG95bWVudFNwZWNpZmljYXRpb24iPgotICAgICAgICA8Ym9keT5BIGRlcGxveW1lbnQgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSBzZXQgb2YgcHJvcGVydGllcyB0aGF0IGRldGVybWluZSBleGVjdXRpb24gcGFyYW1ldGVycyBvZiBhIGNvbXBvbmVudCBhcnRpZmFjdCB0aGF0IGlzIGRlcGxveWVkIG9uIGEgbm9kZS4gQSBkZXBsb3ltZW50IHNwZWNpZmljYXRpb24gY2FuIGJlIGFpbWVkIGF0IGEgc3BlY2lmaWMgdHlwZSBvZiBjb250YWluZXIuIEFuIGFydGlmYWN0IHRoYXQgcmVpZmllcyBvciBpbXBsZW1lbnRzIGRlcGxveW1lbnQgc3BlY2lmaWNhdGlvbiBwcm9wZXJ0aWVzIGlzIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWRlcGxveW1lbnRfdGFyZ2V0IiBuYW1lPSJkZXBsb3ltZW50X3RhcmdldCIgY29uc3RyYWluZWRFbGVtZW50PSJEZXBsb3ltZW50U3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZXBsb3ltZW50U3BlY2lmaWNhdGlvbi1kZXBsb3ltZW50X3RhcmdldC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWRlcGxveW1lbnRfdGFyZ2V0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgRGVwbG95bWVudFRhcmdldCBvZiBhIERlcGxveW1lbnRTcGVjaWZpY2F0aW9uIGlzIGEga2luZCBvZiBFeGVjdXRpb25FbnZpcm9ubWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRGVwbG95bWVudFNwZWNpZmljYXRpb24tZGVwbG95bWVudF90YXJnZXQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmRlcGxveW1lbnQtPmZvckFsbCAobG9jYXRpb24ub2NsSXNLaW5kT2YoRXhlY3V0aW9uRW52aXJvbm1lbnQpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRGVwbG95bWVudFNwZWNpZmljYXRpb24tZGVwbG95ZWRfZWxlbWVudHMiIG5hbWU9ImRlcGxveWVkX2VsZW1lbnRzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWRlcGxveWVkX2VsZW1lbnRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVwbG95bWVudFNwZWNpZmljYXRpb24tZGVwbG95ZWRfZWxlbWVudHMiPgotICAgICAgICAgIDxib2R5PlRoZSBkZXBsb3llZEVsZW1lbnRzIG9mIGEgRGVwbG95bWVudFRhcmdldCB0aGF0IGFyZSBpbnZvbHZlZCBpbiBhIERlcGxveW1lbnQgdGhhdCBoYXMgYW4gYXNzb2NpYXRlZCBEZXBsb3ltZW50LVNwZWNpZmljYXRpb24gaXMgYSBraW5kIG9mIENvbXBvbmVudCAoaS5lLiwgdGhlIGNvbmZpZ3VyZWQgY29tcG9uZW50cykuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWRlcGxveWVkX2VsZW1lbnRzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5kZXBsb3ltZW50LT5mb3JBbGwgKGxvY2F0aW9uLmRlcGxveWVkRWxlbWVudC0+Zm9yQWxsIChvY2xJc0tpbmRPZihDb21wb25lbnQpKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRGVwbG95bWVudFNwZWNpZmljYXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFydGlmYWN0Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJEZXBsb3ltZW50U3BlY2lmaWNhdGlvbi1kZXBsb3ltZW50IiBuYW1lPSJkZXBsb3ltZW50IiB0eXBlPSJEZXBsb3ltZW50IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfY29uZmlndXJhdGlvbl9kZXBsb3ltZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWRlcGxveW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZXBsb3ltZW50U3BlY2lmaWNhdGlvbi1kZXBsb3ltZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVwbG95bWVudCB3aXRoIHdoaWNoIHRoZSBEZXBsb3ltZW50U3BlY2lmaWNhdGlvbiBpcyBhc3NvY2lhdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRGVwbG95bWVudFNwZWNpZmljYXRpb24tZGVwbG95bWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWRlcGxveW1lbnRMb2NhdGlvbiIgbmFtZT0iZGVwbG95bWVudExvY2F0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWRlcGxveW1lbnRMb2NhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWRlcGxveW1lbnRMb2NhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGxvY2F0aW9uIHdoZXJlIGFuIEFydGlmYWN0IGlzIGRlcGxveWVkIG9udG8gYSBOb2RlLiBUaGlzIGlzIHR5cGljYWxseSBhICdkaXJlY3RvcnknIG9yICdtZW1vcnkgYWRkcmVzcy4nPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRGVwbG95bWVudFNwZWNpZmljYXRpb24tZGVwbG95bWVudExvY2F0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRGVwbG95bWVudFNwZWNpZmljYXRpb24tZXhlY3V0aW9uTG9jYXRpb24iIG5hbWU9ImV4ZWN1dGlvbkxvY2F0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWV4ZWN1dGlvbkxvY2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVwbG95bWVudFNwZWNpZmljYXRpb24tZXhlY3V0aW9uTG9jYXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBsb2NhdGlvbiB3aGVyZSBhIGNvbXBvbmVudCBBcnRpZmFjdCBleGVjdXRlcy4gVGhpcyBtYXkgYmUgYSBsb2NhbCBvciByZW1vdGUgbG9jYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRGVwbG95bWVudFNwZWNpZmljYXRpb24tZXhlY3V0aW9uTG9jYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkRlcGxveW1lbnRUYXJnZXQiIG5hbWU9IkRlcGxveW1lbnRUYXJnZXQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlcGxveW1lbnRUYXJnZXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZXBsb3ltZW50VGFyZ2V0Ij4KLSAgICAgICAgPGJvZHk+QSBkZXBsb3ltZW50IHRhcmdldCBpcyB0aGUgbG9jYXRpb24gZm9yIGEgZGVwbG95ZWQgYXJ0aWZhY3QuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJEZXBsb3ltZW50VGFyZ2V0LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkRlcGxveW1lbnRUYXJnZXQtZGVwbG95ZWRFbGVtZW50IiBuYW1lPSJkZXBsb3llZEVsZW1lbnQiIHR5cGU9IlBhY2thZ2VhYmxlRWxlbWVudCIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9kZXBsb3llZEVsZW1lbnRfZGVwbG95bWVudFRhcmdldCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZXBsb3ltZW50VGFyZ2V0LWRlcGxveWVkRWxlbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRlcGxveW1lbnRUYXJnZXQtZGVwbG95ZWRFbGVtZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgc2V0IG9mIGVsZW1lbnRzIHRoYXQgYXJlIG1hbmlmZXN0ZWQgaW4gYW4gQXJ0aWZhY3QgdGhhdCBpcyBpbnZvbHZlZCBpbiBEZXBsb3ltZW50IHRvIGEgRGVwbG95bWVudFRhcmdldC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkRlcGxveW1lbnRUYXJnZXQtZGVwbG95ZWRFbGVtZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRGVwbG95bWVudFRhcmdldC1kZXBsb3llZEVsZW1lbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRGVwbG95bWVudFRhcmdldC1kZXBsb3ltZW50IiBuYW1lPSJkZXBsb3ltZW50IiB0eXBlPSJEZXBsb3ltZW50IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQgTmFtZWRFbGVtZW50LWNsaWVudERlcGVuZGVuY3kiIGFzc29jaWF0aW9uPSJBX2RlcGxveW1lbnRfbG9jYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGVwbG95bWVudFRhcmdldC1kZXBsb3ltZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVwbG95bWVudFRhcmdldC1kZXBsb3ltZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgc2V0IG9mIERlcGxveW1lbnRzIGZvciBhIERlcGxveW1lbnRUYXJnZXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJEZXBsb3ltZW50VGFyZ2V0LWRlcGxveW1lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJEZXBsb3ltZW50VGFyZ2V0LWRlcGxveW1lbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRGVwbG95bWVudFRhcmdldC1kZXBsb3llZEVsZW1lbnQuMSIgbmFtZT0iZGVwbG95ZWRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IkRlcGxveW1lbnRUYXJnZXQtZGVwbG95ZWRFbGVtZW50LjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEZXBsb3ltZW50VGFyZ2V0LWRlcGxveWVkRWxlbWVudC4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVwbG95bWVudFRhcmdldC1kZXBsb3llZEVsZW1lbnQuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgRGVwbG95bWVudFRhcmdldDo6L2RlcGxveWVkRWxlbWVudDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJEZXBsb3ltZW50VGFyZ2V0LWRlcGxveWVkRWxlbWVudC4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iRGVwbG95bWVudFRhcmdldC1kZXBsb3llZEVsZW1lbnQuMSBEZXBsb3ltZW50VGFyZ2V0LWRlcGxveWVkRWxlbWVudCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkRlcGxveW1lbnRUYXJnZXQtZGVwbG95ZWRFbGVtZW50LjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChkZXBsb3ltZW50LmRlcGxveWVkQXJ0aWZhY3QtPnNlbGVjdChvY2xJc0tpbmRPZihBcnRpZmFjdCkpLT5jb2xsZWN0KG9jbEFzVHlwZShBcnRpZmFjdCkubWFuaWZlc3RhdGlvbiktPmNvbGxlY3QodXRpbGl6ZWRFbGVtZW50KS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRGVwbG95bWVudFRhcmdldC1kZXBsb3llZEVsZW1lbnQuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUGFja2FnZWFibGVFbGVtZW50IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJEZXBsb3ltZW50VGFyZ2V0LWRlcGxveWVkRWxlbWVudC4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRGVwbG95bWVudFRhcmdldC1kZXBsb3llZEVsZW1lbnQuMS1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJEZXZpY2UiIG5hbWU9IkRldmljZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGV2aWNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGV2aWNlIj4KLSAgICAgICAgPGJvZHk+QSBkZXZpY2UgaXMgYSBwaHlzaWNhbCBjb21wdXRhdGlvbmFsIHJlc291cmNlIHdpdGggcHJvY2Vzc2luZyBjYXBhYmlsaXR5IHVwb24gd2hpY2ggYXJ0aWZhY3RzIG1heSBiZSBkZXBsb3llZCBmb3IgZXhlY3V0aW9uLiBEZXZpY2VzIG1heSBiZSBjb21wbGV4IChpLmUuLCB0aGV5IG1heSBjb25zaXN0IG9mIG90aGVyIGRldmljZXMpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRGV2aWNlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJOb2RlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkV4ZWN1dGlvbkVudmlyb25tZW50IiBuYW1lPSJFeGVjdXRpb25FbnZpcm9ubWVudCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhlY3V0aW9uRW52aXJvbm1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeGVjdXRpb25FbnZpcm9ubWVudCI+Ci0gICAgICAgIDxib2R5PkFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpcyBhIG5vZGUgdGhhdCBvZmZlcnMgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50IGZvciBzcGVjaWZpYyB0eXBlcyBvZiBjb21wb25lbnRzIHRoYXQgYXJlIGRlcGxveWVkIG9uIGl0IGluIHRoZSBmb3JtIG9mIGV4ZWN1dGFibGUgYXJ0aWZhY3RzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRXhlY3V0aW9uRW52aXJvbm1lbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik5vZGUiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iTWFuaWZlc3RhdGlvbiIgbmFtZT0iTWFuaWZlc3RhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWFuaWZlc3RhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1hbmlmZXN0YXRpb24iPgotICAgICAgICA8Ym9keT5BIG1hbmlmZXN0YXRpb24gaXMgdGhlIGNvbmNyZXRlIHBoeXNpY2FsIHJlbmRlcmluZyBvZiBvbmUgb3IgbW9yZSBtb2RlbCBlbGVtZW50cyBieSBhbiBhcnRpZmFjdC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ik1hbmlmZXN0YXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFic3RyYWN0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJNYW5pZmVzdGF0aW9uLXV0aWxpemVkRWxlbWVudCIgbmFtZT0idXRpbGl6ZWRFbGVtZW50IiB0eXBlPSJQYWNrYWdlYWJsZUVsZW1lbnQiIHN1YnNldHRlZFByb3BlcnR5PSJEZXBlbmRlbmN5LXN1cHBsaWVyIiBhc3NvY2lhdGlvbj0iQV91dGlsaXplZEVsZW1lbnRfbWFuaWZlc3RhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNYW5pZmVzdGF0aW9uLXV0aWxpemVkRWxlbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1hbmlmZXN0YXRpb24tdXRpbGl6ZWRFbGVtZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbW9kZWwgZWxlbWVudCB0aGF0IGlzIHV0aWxpemVkIGluIHRoZSBtYW5pZmVzdGF0aW9uIGluIGFuIEFydGlmYWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJOb2RlIiBuYW1lPSJOb2RlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOb2RlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTm9kZSI+Ci0gICAgICAgIDxib2R5PkEgTm9kZSBpcyBjb21wdXRhdGlvbmFsIHJlc291cmNlIHVwb24gd2hpY2ggYXJ0aWZhY3RzIG1heSBiZSBkZXBsb3llZCBmb3IgZXhlY3V0aW9uLiBOb2RlcyBjYW4gYmUgaW50ZXJjb25uZWN0ZWQgdGhyb3VnaCBjb21tdW5pY2F0aW9uIHBhdGhzIHRvIGRlZmluZSBuZXR3b3JrIHN0cnVjdHVyZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTm9kZS1pbnRlcm5hbF9zdHJ1Y3R1cmUiIG5hbWU9ImludGVybmFsX3N0cnVjdHVyZSIgY29uc3RyYWluZWRFbGVtZW50PSJOb2RlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5vZGUtaW50ZXJuYWxfc3RydWN0dXJlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTm9kZS1pbnRlcm5hbF9zdHJ1Y3R1cmUiPgotICAgICAgICAgIDxib2R5PlRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYSBOb2RlIChpZiBkZWZpbmVkKSBjb25zaXN0cyBzb2xlbHkgb2YgcGFydHMgb2YgdHlwZSBOb2RlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJOb2RlLWludGVybmFsX3N0cnVjdHVyZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cGFydC0+Zm9yQWxsKG9jbElzS2luZE9mKE5vZGUpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJOb2RlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJDbGFzcyIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iTm9kZS1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iRGVwbG95bWVudFRhcmdldCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTm9kZS1uZXN0ZWROb2RlIiBuYW1lPSJuZXN0ZWROb2RlIiB0eXBlPSJOb2RlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9uZXN0ZWROb2RlX25vZGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTm9kZS1uZXN0ZWROb2RlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTm9kZS1uZXN0ZWROb2RlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgTm9kZXMgdGhhdCBhcmUgZGVmaW5lZCAobmVzdGVkKSB3aXRoaW4gdGhlIE5vZGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJOb2RlLW5lc3RlZE5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJOb2RlLW5lc3RlZE5vZGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aCIgbmFtZT0iY3JlYXRlQ29tbXVuaWNhdGlvblBhdGgiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5vZGUtY3JlYXRlQ29tbXVuaWNhdGlvblBhdGgiPgotICAgICAgICAgIDxib2R5PkNyZWF0ZXMgYSAoYmluYXJ5KSBjb21tdW5pY2F0aW9uIHBhdGggYmV0d2VlbiB0aGlzIG5vZGUgYW5kIHRoZSBzcGVjaWZpZWQgb3RoZXIgbm9kZSwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hdmlnYWJpbGl0aWVzLCBhZ2dyZWdhdGlvbnMsIG5hbWVzLCBsb3dlciBib3VuZHMsIGFuZCB1cHBlciBib3VuZHMsIGFuZCBvd25lZCBieSB0aGlzIG5vZGUncyBuZWFyZXN0IHBhY2thZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iQ29tbXVuaWNhdGlvblBhdGgiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5vZGUtY3JlYXRlQ29tbXVuaWNhdGlvblBhdGgtZW5kMUlzTmF2aWdhYmxlIiBuYW1lPSJlbmQxSXNOYXZpZ2FibGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5vZGUtY3JlYXRlQ29tbXVuaWNhdGlvblBhdGgtZW5kMUlzTmF2aWdhYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQxSXNOYXZpZ2FibGUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hdmlnYWJpbGl0eSBmb3IgdGhlIGZpcnN0IGVuZCBvZiB0aGUgbmV3IGNvbW11bmljYXRpb24gcGF0aC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDFBZ2dyZWdhdGlvbiIgbmFtZT0iZW5kMUFnZ3JlZ2F0aW9uIiB0eXBlPSJBZ2dyZWdhdGlvbktpbmQiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5vZGUtY3JlYXRlQ29tbXVuaWNhdGlvblBhdGgtZW5kMUFnZ3JlZ2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQxQWdncmVnYXRpb24iPgotICAgICAgICAgICAgPGJvZHk+VGhlIGFnZ3JlZ2F0aW9uIGZvciB0aGUgZmlyc3QgZW5kIG9mIHRoZSBuZXcgY29tbXVuaWNhdGlvbiBwYXRoLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQxTmFtZSIgbmFtZT0iZW5kMU5hbWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5vZGUtY3JlYXRlQ29tbXVuaWNhdGlvblBhdGgtZW5kMU5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDFOYW1lIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuYW1lIGZvciB0aGUgZmlyc3QgZW5kIG9mIHRoZSBuZXcgY29tbXVuaWNhdGlvbiBwYXRoLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQxTG93ZXIiIG5hbWU9ImVuZDFMb3dlciIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQxTG93ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDFMb3dlciI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbG93ZXIgYm91bmQgZm9yIHRoZSBmaXJzdCBlbmQgb2YgdGhlIG5ldyBjb21tdW5pY2F0aW9uIHBhdGguPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQxVXBwZXIiIG5hbWU9ImVuZDFVcHBlciIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQxVXBwZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDFVcHBlciI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgdXBwZXIgYm91bmQgZm9yIHRoZSBmaXJzdCBlbmQgb2YgdGhlIG5ldyBjb21tdW5pY2F0aW9uIHBhdGguPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQxTm9kZSIgbmFtZT0iZW5kMU5vZGUiIHR5cGU9Ik5vZGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5vZGUtY3JlYXRlQ29tbXVuaWNhdGlvblBhdGgtZW5kMU5vZGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDFOb2RlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSB0eXBlIGZvciB0aGUgZmlyc3QgZW5kIG9mIHRoZSBuZXcgY29tbXVuaWNhdGlvbiBwYXRoLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQySXNOYXZpZ2FibGUiIG5hbWU9ImVuZDJJc05hdmlnYWJsZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQySXNOYXZpZ2FibGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDJJc05hdmlnYWJsZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmF2aWdhYmlsaXR5IGZvciB0aGUgc2Vjb25kIGVuZCBvZiB0aGUgbmV3IGNvbW11bmljYXRpb24gcGF0aC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDJBZ2dyZWdhdGlvbiIgbmFtZT0iZW5kMkFnZ3JlZ2F0aW9uIiB0eXBlPSJBZ2dyZWdhdGlvbktpbmQiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik5vZGUtY3JlYXRlQ29tbXVuaWNhdGlvblBhdGgtZW5kMkFnZ3JlZ2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQyQWdncmVnYXRpb24iPgotICAgICAgICAgICAgPGJvZHk+VGhlIGFnZ3JlZ2F0aW9uIGZvciB0aGUgc2Vjb25kIGVuZCBvZiB0aGUgbmV3IGNvbW11bmljYXRpb24gcGF0aC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5vZGUtY3JlYXRlQ29tbXVuaWNhdGlvblBhdGgtZW5kMk5hbWUiIG5hbWU9ImVuZDJOYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDJOYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQyTmFtZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmFtZSBmb3IgdGhlIHNlY29uZCBlbmQgb2YgdGhlIG5ldyBjb21tdW5pY2F0aW9uIHBhdGguPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDJMb3dlciIgbmFtZT0iZW5kMkxvd2VyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDJMb3dlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5vZGUtY3JlYXRlQ29tbXVuaWNhdGlvblBhdGgtZW5kMkxvd2VyIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBsb3dlciBib3VuZCBmb3IgdGhlIHNlY29uZCBlbmQgb2YgdGhlIG5ldyBjb21tdW5pY2F0aW9uIHBhdGguPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQyVXBwZXIiIG5hbWU9ImVuZDJVcHBlciIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTm9kZS1jcmVhdGVDb21tdW5pY2F0aW9uUGF0aC1lbmQyVXBwZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJOb2RlLWNyZWF0ZUNvbW11bmljYXRpb25QYXRoLWVuZDJVcHBlciI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgdXBwZXIgYm91bmQgZm9yIHRoZSBzZWNvbmQgZW5kIG9mIHRoZSBuZXcgY29tbXVuaWNhdGlvbiBwYXRoLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTm9kZS1nZXRDb21tdW5pY2F0aW9uUGF0aHMiIG5hbWU9ImdldENvbW11bmljYXRpb25QYXRocyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJOb2RlLWdldENvbW11bmljYXRpb25QYXRocy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik5vZGUtZ2V0Q29tbXVuaWNhdGlvblBhdGhzIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIGNvbW11bmljYXRpb24gcGF0aHMgaW4gd2hpY2ggdGhpcyBub2RlIGlzIGludm9sdmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik5vZGUtZ2V0Q29tbXVuaWNhdGlvblBhdGhzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJDb21tdW5pY2F0aW9uUGF0aCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTm9kZS1nZXRDb21tdW5pY2F0aW9uUGF0aHMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik5vZGUtZ2V0Q29tbXVuaWNhdGlvblBhdGhzLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9uZXN0ZWROb2RlX25vZGUiIG5hbWU9IkFfbmVzdGVkTm9kZV9ub2RlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik5vZGUtbmVzdGVkTm9kZSBBX25lc3RlZE5vZGVfbm9kZS1ub2RlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfbmVzdGVkTm9kZV9ub2RlLW5vZGUiIG5hbWU9Im5vZGUiIHR5cGU9Ik5vZGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9uZXN0ZWROb2RlX25vZGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbmVzdGVkTm9kZV9ub2RlLW5vZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdXRpbGl6ZWRFbGVtZW50X21hbmlmZXN0YXRpb24iIG5hbWU9IkFfdXRpbGl6ZWRFbGVtZW50X21hbmlmZXN0YXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iTWFuaWZlc3RhdGlvbi11dGlsaXplZEVsZW1lbnQgQV91dGlsaXplZEVsZW1lbnRfbWFuaWZlc3RhdGlvbi1tYW5pZmVzdGF0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdXRpbGl6ZWRFbGVtZW50X21hbmlmZXN0YXRpb24tbWFuaWZlc3RhdGlvbiIgbmFtZT0ibWFuaWZlc3RhdGlvbiIgdHlwZT0iTWFuaWZlc3RhdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfc3VwcGxpZXJfc3VwcGxpZXJEZXBlbmRlbmN5LXN1cHBsaWVyRGVwZW5kZW5jeSIgYXNzb2NpYXRpb249IkFfdXRpbGl6ZWRFbGVtZW50X21hbmlmZXN0YXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdXRpbGl6ZWRFbGVtZW50X21hbmlmZXN0YXRpb24tbWFuaWZlc3RhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfdXRpbGl6ZWRFbGVtZW50X21hbmlmZXN0YXRpb24tbWFuaWZlc3RhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZGVwbG95ZWRFbGVtZW50X2RlcGxveW1lbnRUYXJnZXQiIG5hbWU9IkFfZGVwbG95ZWRFbGVtZW50X2RlcGxveW1lbnRUYXJnZXQiIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJEZXBsb3ltZW50VGFyZ2V0LWRlcGxveWVkRWxlbWVudCBBX2RlcGxveWVkRWxlbWVudF9kZXBsb3ltZW50VGFyZ2V0LWRlcGxveW1lbnRUYXJnZXQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9kZXBsb3llZEVsZW1lbnRfZGVwbG95bWVudFRhcmdldC1kZXBsb3ltZW50VGFyZ2V0IiBuYW1lPSJkZXBsb3ltZW50VGFyZ2V0IiB0eXBlPSJEZXBsb3ltZW50VGFyZ2V0IiBhc3NvY2lhdGlvbj0iQV9kZXBsb3llZEVsZW1lbnRfZGVwbG95bWVudFRhcmdldCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9kZXBsb3llZEVsZW1lbnRfZGVwbG95bWVudFRhcmdldC1kZXBsb3ltZW50VGFyZ2V0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9kZXBsb3llZEVsZW1lbnRfZGVwbG95bWVudFRhcmdldC1kZXBsb3ltZW50VGFyZ2V0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9kZXBsb3ltZW50X2xvY2F0aW9uIiBuYW1lPSJBX2RlcGxveW1lbnRfbG9jYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRGVwbG95bWVudFRhcmdldC1kZXBsb3ltZW50IERlcGxveW1lbnQtbG9jYXRpb24iLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9kZXBsb3llZEFydGlmYWN0X2RlcGxveW1lbnRGb3JBcnRpZmFjdCIgbmFtZT0iQV9kZXBsb3llZEFydGlmYWN0X2RlcGxveW1lbnRGb3JBcnRpZmFjdCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJEZXBsb3ltZW50LWRlcGxveWVkQXJ0aWZhY3QgQV9kZXBsb3llZEFydGlmYWN0X2RlcGxveW1lbnRGb3JBcnRpZmFjdC1kZXBsb3ltZW50Rm9yQXJ0aWZhY3QiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9kZXBsb3llZEFydGlmYWN0X2RlcGxveW1lbnRGb3JBcnRpZmFjdC1kZXBsb3ltZW50Rm9yQXJ0aWZhY3QiIG5hbWU9ImRlcGxveW1lbnRGb3JBcnRpZmFjdCIgdHlwZT0iRGVwbG95bWVudCIgc3Vic2V0dGVkUHJvcGVydHk9IkFfc3VwcGxpZXJfc3VwcGxpZXJEZXBlbmRlbmN5LXN1cHBsaWVyRGVwZW5kZW5jeSIgYXNzb2NpYXRpb249IkFfZGVwbG95ZWRBcnRpZmFjdF9kZXBsb3ltZW50Rm9yQXJ0aWZhY3QiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZGVwbG95ZWRBcnRpZmFjdF9kZXBsb3ltZW50Rm9yQXJ0aWZhY3QtZGVwbG95bWVudEZvckFydGlmYWN0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9kZXBsb3llZEFydGlmYWN0X2RlcGxveW1lbnRGb3JBcnRpZmFjdC1kZXBsb3ltZW50Rm9yQXJ0aWZhY3QtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NvbmZpZ3VyYXRpb25fZGVwbG95bWVudCIgbmFtZT0iQV9jb25maWd1cmF0aW9uX2RlcGxveW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRGVwbG95bWVudC1jb25maWd1cmF0aW9uIERlcGxveW1lbnRTcGVjaWZpY2F0aW9uLWRlcGxveW1lbnQiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZEF0dHJpYnV0ZV9hcnRpZmFjdCIgbmFtZT0iQV9vd25lZEF0dHJpYnV0ZV9hcnRpZmFjdCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBcnRpZmFjdC1vd25lZEF0dHJpYnV0ZSBBX293bmVkQXR0cmlidXRlX2FydGlmYWN0LWFydGlmYWN0Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb3duZWRBdHRyaWJ1dGVfYXJ0aWZhY3QtYXJ0aWZhY3QiIG5hbWU9ImFydGlmYWN0IiB0eXBlPSJBcnRpZmFjdCIgc3Vic2V0dGVkUHJvcGVydHk9IkFfYXR0cmlidXRlX2NsYXNzaWZpZXItY2xhc3NpZmllciBOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9vd25lZEF0dHJpYnV0ZV9hcnRpZmFjdCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vd25lZEF0dHJpYnV0ZV9hcnRpZmFjdC1hcnRpZmFjdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZE9wZXJhdGlvbl9hcnRpZmFjdCIgbmFtZT0iQV9vd25lZE9wZXJhdGlvbl9hcnRpZmFjdCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBcnRpZmFjdC1vd25lZE9wZXJhdGlvbiBBX293bmVkT3BlcmF0aW9uX2FydGlmYWN0LWFydGlmYWN0Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb3duZWRPcGVyYXRpb25fYXJ0aWZhY3QtYXJ0aWZhY3QiIG5hbWU9ImFydGlmYWN0IiB0eXBlPSJBcnRpZmFjdCIgc3Vic2V0dGVkUHJvcGVydHk9IkZlYXR1cmUtZmVhdHVyaW5nQ2xhc3NpZmllciBOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIFJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25Db250ZXh0IiBhc3NvY2lhdGlvbj0iQV9vd25lZE9wZXJhdGlvbl9hcnRpZmFjdCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vd25lZE9wZXJhdGlvbl9hcnRpZmFjdC1hcnRpZmFjdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9uZXN0ZWRBcnRpZmFjdF9hcnRpZmFjdCIgbmFtZT0iQV9uZXN0ZWRBcnRpZmFjdF9hcnRpZmFjdCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBcnRpZmFjdC1uZXN0ZWRBcnRpZmFjdCBBX25lc3RlZEFydGlmYWN0X2FydGlmYWN0LWFydGlmYWN0Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfbmVzdGVkQXJ0aWZhY3RfYXJ0aWZhY3QtYXJ0aWZhY3QiIG5hbWU9ImFydGlmYWN0IiB0eXBlPSJBcnRpZmFjdCIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX25lc3RlZEFydGlmYWN0X2FydGlmYWN0Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX25lc3RlZEFydGlmYWN0X2FydGlmYWN0LWFydGlmYWN0LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX21hbmlmZXN0YXRpb25fYXJ0aWZhY3QiIG5hbWU9IkFfbWFuaWZlc3RhdGlvbl9hcnRpZmFjdCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBcnRpZmFjdC1tYW5pZmVzdGF0aW9uIEFfbWFuaWZlc3RhdGlvbl9hcnRpZmFjdC1hcnRpZmFjdCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX21hbmlmZXN0YXRpb25fYXJ0aWZhY3QtYXJ0aWZhY3QiIG5hbWU9ImFydGlmYWN0IiB0eXBlPSJBcnRpZmFjdCIgc3Vic2V0dGVkUHJvcGVydHk9IkRlcGVuZGVuY3ktY2xpZW50IEVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX21hbmlmZXN0YXRpb25fYXJ0aWZhY3QiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iSW5mb3JtYXRpb25GbG93IiBuYW1lPSJJbmZvcm1hdGlvbkZsb3ciPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkluZm9ybWF0aW9uRmxvdyI+Ci0gICAgICAgIDxib2R5PkluZm9ybWF0aW9uRmxvd3MgZGVzY3JpYmUgY2lyY3VsYXRpb24gb2YgaW5mb3JtYXRpb24gdGhyb3VnaCBhIHN5c3RlbSBpbiBhIGdlbmVyYWwgbWFubmVyLiBUaGV5IGRvIG5vdCBzcGVjaWZ5IHRoZSBuYXR1cmUgb2YgdGhlIGluZm9ybWF0aW9uLCBtZWNoYW5pc21zIGJ5IHdoaWNoIGl0IGlzIGNvbnZleWVkLCBzZXF1ZW5jZXMgb2YgZXhjaGFuZ2Ugb3IgYW55IGNvbnRyb2wgY29uZGl0aW9ucy4gRHVyaW5nIG1vcmUgZGV0YWlsZWQgbW9kZWxpbmcsIHJlcHJlc2VudGF0aW9uIGFuZCByZWFsaXphdGlvbiBsaW5rcyBtYXkgYmUgYWRkZWQgdG8gc3BlY2lmeSB3aGljaCBtb2RlbCBlbGVtZW50cyBpbXBsZW1lbnQgYW4gSW5mb3JtYXRpb25GbG93IGFuZCB0byBzaG93IGhvdyBpbmZvcm1hdGlvbiBpcyBjb252ZXllZC4gIEluZm9ybWF0aW9uRmxvd3MgcmVxdWlyZSBzb21lIGtpbmQgb2Yg4oCcaW5mb3JtYXRpb24gY2hhbm5lbOKAnSBmb3IgdW5pZGlyZWN0aW9uYWwgdHJhbnNtaXNzaW9uIG9mIGluZm9ybWF0aW9uIGl0ZW1zIGZyb20gc291cmNlcyB0byB0YXJnZXRzLsKgIFRoZXkgc3BlY2lmeSB0aGUgaW5mb3JtYXRpb24gY2hhbm5lbOKAmXMgcmVhbGl6YXRpb25zLCBpZiBhbnksIGFuZCBpZGVudGlmeSB0aGUgaW5mb3JtYXRpb24gdGhhdCBmbG93cyBhbG9uZyB0aGVtLsKgIEluZm9ybWF0aW9uIG1vdmluZyBhbG9uZyB0aGUgaW5mb3JtYXRpb24gY2hhbm5lbCBtYXkgYmUgcmVwcmVzZW50ZWQgYnkgYWJzdHJhY3QgSW5mb3JtYXRpb25JdGVtcyBhbmQgYnkgY29uY3JldGUgQ2xhc3NpZmllcnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LW11c3RfY29uZm9ybSIgbmFtZT0ibXVzdF9jb25mb3JtIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkluZm9ybWF0aW9uRmxvdyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbmZvcm1hdGlvbkZsb3ctbXVzdF9jb25mb3JtLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5mb3JtYXRpb25GbG93LW11c3RfY29uZm9ybSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNvdXJjZXMgYW5kIHRhcmdldHMgb2YgdGhlIGluZm9ybWF0aW9uIGZsb3cgbXVzdCBjb25mb3JtIHRvIHRoZSBzb3VyY2VzIGFuZCB0YXJnZXRzIG9yIGNvbnZlcnNlbHkgdGhlIHRhcmdldHMgYW5kIHNvdXJjZXMgb2YgdGhlIHJlYWxpemF0aW9uIHJlbGF0aW9uc2hpcHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1tdXN0X2NvbmZvcm0tX3NwZWNpZmljYXRpb24iIGxhbmd1YWdlPSIiLz4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1zb3VyY2VzX2FuZF90YXJnZXRzX2tpbmQiIG5hbWU9InNvdXJjZXNfYW5kX3RhcmdldHNfa2luZCIgY29uc3RyYWluZWRFbGVtZW50PSJJbmZvcm1hdGlvbkZsb3ciPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5mb3JtYXRpb25GbG93LXNvdXJjZXNfYW5kX3RhcmdldHNfa2luZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkluZm9ybWF0aW9uRmxvdy1zb3VyY2VzX2FuZF90YXJnZXRzX2tpbmQiPgotICAgICAgICAgIDxib2R5PlRoZSBzb3VyY2VzIGFuZCB0YXJnZXRzIG9mIHRoZSBpbmZvcm1hdGlvbiBmbG93IGNhbiBvbmx5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGtpbmQ6IEFjdG9yLCBOb2RlLCBVc2VDYXNlLCBBcnRpZmFjdCwgQ2xhc3MsIENvbXBvbmVudCwgUG9ydCwgUHJvcGVydHksIEludGVyZmFjZSwgUGFja2FnZSwgQWN0aXZpdHlOb2RlLCBBY3Rpdml0eVBhcnRpdGlvbiwmI3hEOwotQmVoYXZpb3IgYW5kIEluc3RhbmNlU3BlY2lmaWNhdGlvbiBleGNlcHQgd2hlbiBpdHMgY2xhc3NpZmllciBpcyBhIHJlbGF0aW9uc2hpcCAoaS5lLiBpdCByZXByZXNlbnRzIGEgbGluaykuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1zb3VyY2VzX2FuZF90YXJnZXRzX2tpbmQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihzZWxmLmluZm9ybWF0aW9uU291cmNlLT5mb3JBbGwoIHNpcyB8JiN4RDsKLSAgb2NsSXNLaW5kT2YoQWN0b3IpIG9yIG9jbElzS2luZE9mKE5vZGUpIG9yIG9jbElzS2luZE9mKFVzZUNhc2UpIG9yIG9jbElzS2luZE9mKEFydGlmYWN0KSBvciAmI3hEOwotICBvY2xJc0tpbmRPZihDbGFzcykgb3Igb2NsSXNLaW5kT2YoQ29tcG9uZW50KSBvciBvY2xJc0tpbmRPZihQb3J0KSBvciBvY2xJc0tpbmRPZihQcm9wZXJ0eSkgb3IgJiN4RDsKLSAgb2NsSXNLaW5kT2YoSW50ZXJmYWNlKSBvciBvY2xJc0tpbmRPZihQYWNrYWdlKSBvciBvY2xJc0tpbmRPZihBY3Rpdml0eU5vZGUpIG9yIG9jbElzS2luZE9mKEFjdGl2aXR5UGFydGl0aW9uKSBvciAmI3hEOwotICAob2NsSXNLaW5kT2YoSW5zdGFuY2VTcGVjaWZpY2F0aW9uKSBhbmQgbm90IHNpcy5vY2xBc1R5cGUoSW5zdGFuY2VTcGVjaWZpY2F0aW9uKS5jbGFzc2lmaWVyLT5leGlzdHMob2NsSXNLaW5kT2YoUmVsYXRpb25zaGlwKSkpKSkgJiN4RDsKLSYjeEQ7Ci1hbmQmI3hEOwotJiN4RDsKLShzZWxmLmluZm9ybWF0aW9uVGFyZ2V0LT5mb3JBbGwoIHNpdCB8ICYjeEQ7Ci0gIG9jbElzS2luZE9mKEFjdG9yKSBvciBvY2xJc0tpbmRPZihOb2RlKSBvciBvY2xJc0tpbmRPZihVc2VDYXNlKSBvciBvY2xJc0tpbmRPZihBcnRpZmFjdCkgb3IgJiN4RDsKLSAgb2NsSXNLaW5kT2YoQ2xhc3MpIG9yIG9jbElzS2luZE9mKENvbXBvbmVudCkgb3Igb2NsSXNLaW5kT2YoUG9ydCkgb3Igb2NsSXNLaW5kT2YoUHJvcGVydHkpIG9yICYjeEQ7Ci0gIG9jbElzS2luZE9mKEludGVyZmFjZSkgb3Igb2NsSXNLaW5kT2YoUGFja2FnZSkgb3Igb2NsSXNLaW5kT2YoQWN0aXZpdHlOb2RlKSBvciBvY2xJc0tpbmRPZihBY3Rpdml0eVBhcnRpdGlvbikgb3IgJiN4RDsKLShvY2xJc0tpbmRPZihJbnN0YW5jZVNwZWNpZmljYXRpb24pIGFuZCBub3Qgc2l0Lm9jbEFzVHlwZShJbnN0YW5jZVNwZWNpZmljYXRpb24pLmNsYXNzaWZpZXItPmV4aXN0cyhvY2xJc0tpbmRPZihSZWxhdGlvbnNoaXApKSkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LWNvbnZleV9jbGFzc2lmaWVycyIgbmFtZT0iY29udmV5X2NsYXNzaWZpZXJzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkluZm9ybWF0aW9uRmxvdyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbmZvcm1hdGlvbkZsb3ctY29udmV5X2NsYXNzaWZpZXJzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5mb3JtYXRpb25GbG93LWNvbnZleV9jbGFzc2lmaWVycyI+Ci0gICAgICAgICAgPGJvZHk+QW4gaW5mb3JtYXRpb24gZmxvdyBjYW4gb25seSBjb252ZXkgY2xhc3NpZmllcnMgdGhhdCBhcmUgYWxsb3dlZCB0byByZXByZXNlbnQgYW4gaW5mb3JtYXRpb24gaXRlbS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LWNvbnZleV9jbGFzc2lmaWVycy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2VsZi5jb252ZXllZC0+Zm9yQWxsKG9jbElzS2luZE9mKENsYXNzKSBvciBvY2xJc0tpbmRPZihJbnRlcmZhY2UpJiN4RDsKLSAgb3Igb2NsSXNLaW5kT2YoSW5mb3JtYXRpb25JdGVtKSBvciBvY2xJc0tpbmRPZihTaWduYWwpIG9yIG9jbElzS2luZE9mKENvbXBvbmVudCkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbmZvcm1hdGlvbkZsb3ctY29udmV5ZWQiIG5hbWU9ImNvbnZleWVkIiB0eXBlPSJDbGFzc2lmaWVyIiBhc3NvY2lhdGlvbj0iQV9jb252ZXllZF9jb252ZXlpbmdGbG93Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1jb252ZXllZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkluZm9ybWF0aW9uRmxvdy1jb252ZXllZCI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBpbmZvcm1hdGlvbiBpdGVtcyB0aGF0IG1heSBjaXJjdWxhdGUgb24gdGhpcyBpbmZvcm1hdGlvbiBmbG93LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LWNvbnZleWVkLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvblNvdXJjZSIgbmFtZT0iaW5mb3JtYXRpb25Tb3VyY2UiIHR5cGU9Ik5hbWVkRWxlbWVudCIgc3Vic2V0dGVkUHJvcGVydHk9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXNvdXJjZSIgYXNzb2NpYXRpb249IkFfaW5mb3JtYXRpb25Tb3VyY2VfaW5mb3JtYXRpb25GbG93Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvblNvdXJjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkluZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvblNvdXJjZSI+Ci0gICAgICAgICAgPGJvZHk+RGVmaW5lcyBmcm9tIHdoaWNoIHNvdXJjZSB0aGUgY29udmV5ZWQgSW5mb3JtYXRpb25JdGVtcyBhcmUgaW5pdGlhdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uU291cmNlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvblRhcmdldCIgbmFtZT0iaW5mb3JtYXRpb25UYXJnZXQiIHR5cGU9Ik5hbWVkRWxlbWVudCIgc3Vic2V0dGVkUHJvcGVydHk9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXRhcmdldCIgYXNzb2NpYXRpb249IkFfaW5mb3JtYXRpb25UYXJnZXRfaW5mb3JtYXRpb25GbG93Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvblRhcmdldC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkluZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvblRhcmdldCI+Ci0gICAgICAgICAgPGJvZHk+RGVmaW5lcyB0byB3aGljaCB0YXJnZXQgdGhlIGNvbnZleWVkIEluZm9ybWF0aW9uSXRlbXMgYXJlIGRpcmVjdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uVGFyZ2V0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1yZWFsaXphdGlvbiIgbmFtZT0icmVhbGl6YXRpb24iIHR5cGU9IlJlbGF0aW9uc2hpcCIgYXNzb2NpYXRpb249IkFfcmVhbGl6YXRpb25fYWJzdHJhY3Rpb25fZmxvdyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbmZvcm1hdGlvbkZsb3ctcmVhbGl6YXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbmZvcm1hdGlvbkZsb3ctcmVhbGl6YXRpb24iPgotICAgICAgICAgIDxib2R5PkRldGVybWluZXMgd2hpY2ggUmVsYXRpb25zaGlwIHdpbGwgcmVhbGl6ZSB0aGUgc3BlY2lmaWVkIGZsb3cuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbmZvcm1hdGlvbkZsb3ctcmVhbGl6YXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJJbmZvcm1hdGlvbkZsb3ctcmVhbGl6YXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LXJlYWxpemluZ0FjdGl2aXR5RWRnZSIgbmFtZT0icmVhbGl6aW5nQWN0aXZpdHlFZGdlIiB0eXBlPSJBY3Rpdml0eUVkZ2UiIGFzc29jaWF0aW9uPSJBX3JlYWxpemluZ0FjdGl2aXR5RWRnZV9pbmZvcm1hdGlvbkZsb3ciPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5mb3JtYXRpb25GbG93LXJlYWxpemluZ0FjdGl2aXR5RWRnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkluZm9ybWF0aW9uRmxvdy1yZWFsaXppbmdBY3Rpdml0eUVkZ2UiPgotICAgICAgICAgIDxib2R5PkRldGVybWluZXMgd2hpY2ggQWN0aXZpdHlFZGdlcyB3aWxsIHJlYWxpemUgdGhlIHNwZWNpZmllZCBmbG93LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LXJlYWxpemluZ0FjdGl2aXR5RWRnZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1yZWFsaXppbmdBY3Rpdml0eUVkZ2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LXJlYWxpemluZ0Nvbm5lY3RvciIgbmFtZT0icmVhbGl6aW5nQ29ubmVjdG9yIiB0eXBlPSJDb25uZWN0b3IiIGFzc29jaWF0aW9uPSJBX3JlYWxpemluZ0Nvbm5lY3Rvcl9pbmZvcm1hdGlvbkZsb3ciPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5mb3JtYXRpb25GbG93LXJlYWxpemluZ0Nvbm5lY3Rvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkluZm9ybWF0aW9uRmxvdy1yZWFsaXppbmdDb25uZWN0b3IiPgotICAgICAgICAgIDxib2R5PkRldGVybWluZXMgd2hpY2ggQ29ubmVjdG9ycyB3aWxsIHJlYWxpemUgdGhlIHNwZWNpZmllZCBmbG93LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LXJlYWxpemluZ0Nvbm5lY3Rvci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1yZWFsaXppbmdDb25uZWN0b3ItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LXJlYWxpemluZ01lc3NhZ2UiIG5hbWU9InJlYWxpemluZ01lc3NhZ2UiIHR5cGU9Ik1lc3NhZ2UiIGFzc29jaWF0aW9uPSJBX3JlYWxpemluZ01lc3NhZ2VfaW5mb3JtYXRpb25GbG93Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1yZWFsaXppbmdNZXNzYWdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5mb3JtYXRpb25GbG93LXJlYWxpemluZ01lc3NhZ2UiPgotICAgICAgICAgIDxib2R5PkRldGVybWluZXMgd2hpY2ggTWVzc2FnZXMgd2lsbCByZWFsaXplIHRoZSBzcGVjaWZpZWQgZmxvdy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkluZm9ybWF0aW9uRmxvdy1yZWFsaXppbmdNZXNzYWdlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW5mb3JtYXRpb25GbG93LXJlYWxpemluZ01lc3NhZ2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJJbmZvcm1hdGlvbkl0ZW0iIG5hbWU9IkluZm9ybWF0aW9uSXRlbSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5mb3JtYXRpb25JdGVtLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5mb3JtYXRpb25JdGVtIj4KLSAgICAgICAgPGJvZHk+SW5mb3JtYXRpb25JdGVtcyByZXByZXNlbnQgbWFueSBraW5kcyBvZiBpbmZvcm1hdGlvbiB0aGF0IGNhbiBmbG93IGZyb20gc291cmNlcyB0byB0YXJnZXRzIGluIHZlcnkgYWJzdHJhY3Qgd2F5cy7CoCBUaGV5IHJlcHJlc2VudCB0aGUga2luZHMgb2YgaW5mb3JtYXRpb24gdGhhdCBtYXkgbW92ZSB3aXRoaW4gYSBzeXN0ZW0sIGJ1dCBkbyBub3QgZWxhYm9yYXRlIGRldGFpbHMgb2YgdGhlIHRyYW5zZmVycmVkIGluZm9ybWF0aW9uLsKgIERldGFpbHMgb2YgdHJhbnNmZXJyZWQgaW5mb3JtYXRpb24gYXJlIHRoZSBwcm92aW5jZSBvZiBvdGhlciBDbGFzc2lmaWVycyB0aGF0IG1heSB1bHRpbWF0ZWx5IGRlZmluZSBJbmZvcm1hdGlvbkl0ZW1zLsKgIENvbnNlcXVlbnRseSwgSW5mb3JtYXRpb25JdGVtcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGFuZCBkbyBub3QgdGhlbXNlbHZlcyBoYXZlIGZlYXR1cmVzLCBnZW5lcmFsaXphdGlvbnMsIG9yIGFzc29jaWF0aW9ucy7CoEFuIGltcG9ydGFudCB1c2Ugb2YgSW5mb3JtYXRpb25JdGVtcyBpcyB0byByZXByZXNlbnQgaW5mb3JtYXRpb24gZHVyaW5nIGVhcmx5IGRlc2lnbiBzdGFnZXMsIHBvc3NpYmx5IGJlZm9yZSB0aGUgZGV0YWlsZWQgbW9kZWxpbmcgZGVjaXNpb25zIHRoYXQgd2lsbCB1bHRpbWF0ZWx5IGRlZmluZSB0aGVtIGhhdmUgYmVlbiBtYWRlLiBBbm90aGVyIHB1cnBvc2Ugb2YgSW5mb3JtYXRpb25JdGVtcyBpcyB0byBhYnN0cmFjdCBwb3J0aW9ucyBvZiBjb21wbGV4IG1vZGVscyBpbiBsZXNzIHByZWNpc2UsIGJ1dCBwZXJoYXBzIG1vcmUgZ2VuZXJhbCBhbmQgY29tbXVuaWNhYmxlLCB3YXlzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkluZm9ybWF0aW9uSXRlbS1zb3VyY2VzX2FuZF90YXJnZXRzIiBuYW1lPSJzb3VyY2VzX2FuZF90YXJnZXRzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkluZm9ybWF0aW9uSXRlbSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbmZvcm1hdGlvbkl0ZW0tc291cmNlc19hbmRfdGFyZ2V0cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkluZm9ybWF0aW9uSXRlbS1zb3VyY2VzX2FuZF90YXJnZXRzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgc291cmNlcyBhbmQgdGFyZ2V0cyBvZiBhbiBpbmZvcm1hdGlvbiBpdGVtIChpdHMgcmVsYXRlZCBpbmZvcm1hdGlvbiBmbG93cykgbXVzdCBkZXNpZ25hdGUgc3Vic2V0cyBvZiB0aGUgc291cmNlcyBhbmQgdGFyZ2V0cyBvZiB0aGUgcmVwcmVzZW50YXRpb24gaW5mb3JtYXRpb24gaXRlbSwgaWYgYW55LiBUaGUgQ2xhc3NpZmllcnMgdGhhdCBjYW4gcmVhbGl6ZSBhbiBpbmZvcm1hdGlvbiBpdGVtIGNhbiBvbmx5IGJlIG9mIHRoZSBmb2xsb3dpbmcga2luZDogQ2xhc3MsIEludGVyZmFjZSwgSW5mb3JtYXRpb25JdGVtLCBTaWduYWwsIENvbXBvbmVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW5mb3JtYXRpb25JdGVtLXNvdXJjZXNfYW5kX3RhcmdldHMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihzZWxmLnJlcHJlc2VudGVkLT5zZWxlY3Qob2NsSXNLaW5kT2YoSW5mb3JtYXRpb25JdGVtKSktPmZvckFsbChwIHwmI3hEOwotICBwLmNvbnZleWluZ0Zsb3cuc291cmNlLT5mb3JBbGwocSB8IHNlbGYuY29udmV5aW5nRmxvdy5zb3VyY2UtPmluY2x1ZGVzKHEpKSBhbmQmI3hEOwotICAgIHAuY29udmV5aW5nRmxvdy50YXJnZXQtPmZvckFsbChxIHwgc2VsZi5jb252ZXlpbmdGbG93LnRhcmdldC0+aW5jbHVkZXMocSkpKSkgYW5kJiN4RDsKLSAgICAgIChzZWxmLnJlcHJlc2VudGVkLT5mb3JBbGwob2NsSXNLaW5kT2YoQ2xhc3MpIG9yIG9jbElzS2luZE9mKEludGVyZmFjZSkgb3ImI3hEOwotICAgICAgICBvY2xJc0tpbmRPZihJbmZvcm1hdGlvbkl0ZW0pIG9yIG9jbElzS2luZE9mKFNpZ25hbCkgb3Igb2NsSXNLaW5kT2YoQ29tcG9uZW50KSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJJbmZvcm1hdGlvbkl0ZW0taGFzX25vIiBuYW1lPSJoYXNfbm8iIGNvbnN0cmFpbmVkRWxlbWVudD0iSW5mb3JtYXRpb25JdGVtIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkluZm9ybWF0aW9uSXRlbS1oYXNfbm8tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbmZvcm1hdGlvbkl0ZW0taGFzX25vIj4KLSAgICAgICAgICA8Ym9keT5BbiBpbmZvcm1hdGlvbkl0ZW0gaGFzIG5vIGZlYXR1cmUsIG5vIGdlbmVyYWxpemF0aW9uLCBhbmQgbm8gYXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbmZvcm1hdGlvbkl0ZW0taGFzX25vLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zZWxmLmdlbmVyYWxpemF0aW9uLT5pc0VtcHR5KCkgYW5kIHNlbGYuZmVhdHVyZS0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJJbmZvcm1hdGlvbkl0ZW0tbm90X2luc3RhbnRpYWJsZSIgbmFtZT0ibm90X2luc3RhbnRpYWJsZSIgY29uc3RyYWluZWRFbGVtZW50PSJJbmZvcm1hdGlvbkl0ZW0iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5mb3JtYXRpb25JdGVtLW5vdF9pbnN0YW50aWFibGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbmZvcm1hdGlvbkl0ZW0tbm90X2luc3RhbnRpYWJsZSI+Ci0gICAgICAgICAgPGJvZHk+SXQgaXMgbm90IGluc3RhbnRpYWJsZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW5mb3JtYXRpb25JdGVtLW5vdF9pbnN0YW50aWFibGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlzQWJzdHJhY3Q8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iSW5mb3JtYXRpb25JdGVtLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJDbGFzc2lmaWVyIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbmZvcm1hdGlvbkl0ZW0tcmVwcmVzZW50ZWQiIG5hbWU9InJlcHJlc2VudGVkIiB0eXBlPSJDbGFzc2lmaWVyIiBhc3NvY2lhdGlvbj0iQV9yZXByZXNlbnRlZF9yZXByZXNlbnRhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbmZvcm1hdGlvbkl0ZW0tcmVwcmVzZW50ZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbmZvcm1hdGlvbkl0ZW0tcmVwcmVzZW50ZWQiPgotICAgICAgICAgIDxib2R5PkRldGVybWluZXMgdGhlIGNsYXNzaWZpZXJzIHRoYXQgd2lsbCBzcGVjaWZ5IHRoZSBzdHJ1Y3R1cmUgYW5kIG5hdHVyZSBvZiB0aGUgaW5mb3JtYXRpb24uIEFuIGluZm9ybWF0aW9uIGl0ZW0gcmVwcmVzZW50cyBhbGwgaXRzIHJlcHJlc2VudGVkIGNsYXNzaWZpZXJzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW5mb3JtYXRpb25JdGVtLXJlcHJlc2VudGVkLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW5mb3JtYXRpb25JdGVtLXJlcHJlc2VudGVkLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXByZXNlbnRlZF9yZXByZXNlbnRhdGlvbiIgbmFtZT0iQV9yZXByZXNlbnRlZF9yZXByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbmZvcm1hdGlvbkl0ZW0tcmVwcmVzZW50ZWQgQV9yZXByZXNlbnRlZF9yZXByZXNlbnRhdGlvbi1yZXByZXNlbnRhdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlcHJlc2VudGVkX3JlcHJlc2VudGF0aW9uLXJlcHJlc2VudGF0aW9uIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgdHlwZT0iSW5mb3JtYXRpb25JdGVtIiBhc3NvY2lhdGlvbj0iQV9yZXByZXNlbnRlZF9yZXByZXNlbnRhdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXByZXNlbnRlZF9yZXByZXNlbnRhdGlvbi1yZXByZXNlbnRhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcmVwcmVzZW50ZWRfcmVwcmVzZW50YXRpb24tcmVwcmVzZW50YXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NvbnZleWVkX2NvbnZleWluZ0Zsb3ciIG5hbWU9IkFfY29udmV5ZWRfY29udmV5aW5nRmxvdyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbmZvcm1hdGlvbkZsb3ctY29udmV5ZWQgQV9jb252ZXllZF9jb252ZXlpbmdGbG93LWNvbnZleWluZ0Zsb3ciPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jb252ZXllZF9jb252ZXlpbmdGbG93LWNvbnZleWluZ0Zsb3ciIG5hbWU9ImNvbnZleWluZ0Zsb3ciIHR5cGU9IkluZm9ybWF0aW9uRmxvdyIgYXNzb2NpYXRpb249IkFfY29udmV5ZWRfY29udmV5aW5nRmxvdyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jb252ZXllZF9jb252ZXlpbmdGbG93LWNvbnZleWluZ0Zsb3ctX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NvbnZleWVkX2NvbnZleWluZ0Zsb3ctY29udmV5aW5nRmxvdy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVhbGl6aW5nQWN0aXZpdHlFZGdlX2luZm9ybWF0aW9uRmxvdyIgbmFtZT0iQV9yZWFsaXppbmdBY3Rpdml0eUVkZ2VfaW5mb3JtYXRpb25GbG93IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkluZm9ybWF0aW9uRmxvdy1yZWFsaXppbmdBY3Rpdml0eUVkZ2UgQV9yZWFsaXppbmdBY3Rpdml0eUVkZ2VfaW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uRmxvdyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlYWxpemluZ0FjdGl2aXR5RWRnZV9pbmZvcm1hdGlvbkZsb3ctaW5mb3JtYXRpb25GbG93IiBuYW1lPSJpbmZvcm1hdGlvbkZsb3ciIHR5cGU9IkluZm9ybWF0aW9uRmxvdyIgYXNzb2NpYXRpb249IkFfcmVhbGl6aW5nQWN0aXZpdHlFZGdlX2luZm9ybWF0aW9uRmxvdyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZWFsaXppbmdBY3Rpdml0eUVkZ2VfaW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uRmxvdy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcmVhbGl6aW5nQWN0aXZpdHlFZGdlX2luZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvbkZsb3ctX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlYWxpemluZ01lc3NhZ2VfaW5mb3JtYXRpb25GbG93IiBuYW1lPSJBX3JlYWxpemluZ01lc3NhZ2VfaW5mb3JtYXRpb25GbG93IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkluZm9ybWF0aW9uRmxvdy1yZWFsaXppbmdNZXNzYWdlIEFfcmVhbGl6aW5nTWVzc2FnZV9pbmZvcm1hdGlvbkZsb3ctaW5mb3JtYXRpb25GbG93Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVhbGl6aW5nTWVzc2FnZV9pbmZvcm1hdGlvbkZsb3ctaW5mb3JtYXRpb25GbG93IiBuYW1lPSJpbmZvcm1hdGlvbkZsb3ciIHR5cGU9IkluZm9ybWF0aW9uRmxvdyIgYXNzb2NpYXRpb249IkFfcmVhbGl6aW5nTWVzc2FnZV9pbmZvcm1hdGlvbkZsb3ciPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVhbGl6aW5nTWVzc2FnZV9pbmZvcm1hdGlvbkZsb3ctaW5mb3JtYXRpb25GbG93LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9yZWFsaXppbmdNZXNzYWdlX2luZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvbkZsb3ctX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2luZm9ybWF0aW9uU291cmNlX2luZm9ybWF0aW9uRmxvdyIgbmFtZT0iQV9pbmZvcm1hdGlvblNvdXJjZV9pbmZvcm1hdGlvbkZsb3ciIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iSW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uU291cmNlIEFfaW5mb3JtYXRpb25Tb3VyY2VfaW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uRmxvdyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2luZm9ybWF0aW9uU291cmNlX2luZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvbkZsb3ciIG5hbWU9ImluZm9ybWF0aW9uRmxvdyIgdHlwZT0iSW5mb3JtYXRpb25GbG93IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9zb3VyY2VfZGlyZWN0ZWRSZWxhdGlvbnNoaXAtZGlyZWN0ZWRSZWxhdGlvbnNoaXAiIGFzc29jaWF0aW9uPSJBX2luZm9ybWF0aW9uU291cmNlX2luZm9ybWF0aW9uRmxvdyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9pbmZvcm1hdGlvblNvdXJjZV9pbmZvcm1hdGlvbkZsb3ctaW5mb3JtYXRpb25GbG93LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9pbmZvcm1hdGlvblNvdXJjZV9pbmZvcm1hdGlvbkZsb3ctaW5mb3JtYXRpb25GbG93LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZWFsaXphdGlvbl9hYnN0cmFjdGlvbl9mbG93IiBuYW1lPSJBX3JlYWxpemF0aW9uX2Fic3RyYWN0aW9uX2Zsb3ciIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iSW5mb3JtYXRpb25GbG93LXJlYWxpemF0aW9uIEFfcmVhbGl6YXRpb25fYWJzdHJhY3Rpb25fZmxvdy1hYnN0cmFjdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlYWxpemF0aW9uX2Fic3RyYWN0aW9uX2Zsb3ctYWJzdHJhY3Rpb24iIG5hbWU9ImFic3RyYWN0aW9uIiB0eXBlPSJJbmZvcm1hdGlvbkZsb3ciIGFzc29jaWF0aW9uPSJBX3JlYWxpemF0aW9uX2Fic3RyYWN0aW9uX2Zsb3ciPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVhbGl6YXRpb25fYWJzdHJhY3Rpb25fZmxvdy1hYnN0cmFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcmVhbGl6YXRpb25fYWJzdHJhY3Rpb25fZmxvdy1hYnN0cmFjdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVhbGl6aW5nQ29ubmVjdG9yX2luZm9ybWF0aW9uRmxvdyIgbmFtZT0iQV9yZWFsaXppbmdDb25uZWN0b3JfaW5mb3JtYXRpb25GbG93IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkluZm9ybWF0aW9uRmxvdy1yZWFsaXppbmdDb25uZWN0b3IgQV9yZWFsaXppbmdDb25uZWN0b3JfaW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uRmxvdyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlYWxpemluZ0Nvbm5lY3Rvcl9pbmZvcm1hdGlvbkZsb3ctaW5mb3JtYXRpb25GbG93IiBuYW1lPSJpbmZvcm1hdGlvbkZsb3ciIHR5cGU9IkluZm9ybWF0aW9uRmxvdyIgYXNzb2NpYXRpb249IkFfcmVhbGl6aW5nQ29ubmVjdG9yX2luZm9ybWF0aW9uRmxvdyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZWFsaXppbmdDb25uZWN0b3JfaW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uRmxvdy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcmVhbGl6aW5nQ29ubmVjdG9yX2luZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvbkZsb3ctX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2luZm9ybWF0aW9uVGFyZ2V0X2luZm9ybWF0aW9uRmxvdyIgbmFtZT0iQV9pbmZvcm1hdGlvblRhcmdldF9pbmZvcm1hdGlvbkZsb3ciIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iSW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uVGFyZ2V0IEFfaW5mb3JtYXRpb25UYXJnZXRfaW5mb3JtYXRpb25GbG93LWluZm9ybWF0aW9uRmxvdyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2luZm9ybWF0aW9uVGFyZ2V0X2luZm9ybWF0aW9uRmxvdy1pbmZvcm1hdGlvbkZsb3ciIG5hbWU9ImluZm9ybWF0aW9uRmxvdyIgdHlwZT0iSW5mb3JtYXRpb25GbG93IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV90YXJnZXRfZGlyZWN0ZWRSZWxhdGlvbnNoaXAtZGlyZWN0ZWRSZWxhdGlvbnNoaXAiIGFzc29jaWF0aW9uPSJBX2luZm9ybWF0aW9uVGFyZ2V0X2luZm9ybWF0aW9uRmxvdyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9pbmZvcm1hdGlvblRhcmdldF9pbmZvcm1hdGlvbkZsb3ctaW5mb3JtYXRpb25GbG93LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9pbmZvcm1hdGlvblRhcmdldF9pbmZvcm1hdGlvbkZsb3ctaW5mb3JtYXRpb25GbG93LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgbmFtZT0iQWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24iPgotICAgICAgICA8Ym9keT5BbiBBY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uIGlzIGEga2luZCBvZiBFeGVjdXRpb25TcGVjaWZpY2F0aW9uIHJlcHJlc2VudGluZyB0aGUgZXhlY3V0aW9uIG9mIGFuIEFjdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uLWFjdGlvbl9yZWZlcmVuY2VkIiBuYW1lPSJhY3Rpb25fcmVmZXJlbmNlZCIgY29uc3RyYWluZWRFbGVtZW50PSJBY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24tYWN0aW9uX3JlZmVyZW5jZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uLWFjdGlvbl9yZWZlcmVuY2VkIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQWN0aW9uIHJlZmVyZW5jZWQgYnkgdGhlIEFjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24gbXVzdCBiZSBvd25lZCBieSB0aGUgSW50ZXJhY3Rpb24gb3duaW5nIHRoYXQgQWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1hY3Rpb25fcmVmZXJlbmNlZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KGVuY2xvc2luZ0ludGVyYWN0aW9uLT5ub3RFbXB0eSgpIG9yIGVuY2xvc2luZ09wZXJhbmQuY29tYmluZWRGcmFnbWVudC0+bm90RW1wdHkoKSkgYW5kJiN4RDsKLWxldCBwYXJlbnRJbnRlcmFjdGlvbiA6IFNldChJbnRlcmFjdGlvbikgPSBlbmNsb3NpbmdJbnRlcmFjdGlvbi5vY2xBc1R5cGUoSW50ZXJhY3Rpb24pLT5hc1NldCgpLT51bmlvbigmI3hEOwotZW5jbG9zaW5nT3BlcmFuZC5jb21iaW5lZEZyYWdtZW50LT5jbG9zdXJlKGVuY2xvc2luZ09wZXJhbmQuY29tYmluZWRGcmFnbWVudCktPiYjeEQ7Ci1jb2xsZWN0KGVuY2xvc2luZ0ludGVyYWN0aW9uKS5vY2xBc1R5cGUoSW50ZXJhY3Rpb24pLT5hc1NldCgpKSBpbiYjeEQ7Ci0ocGFyZW50SW50ZXJhY3Rpb24tPnNpemUoKSA9IDEpIGFuZCBzZWxmLmFjdGlvbi5pbnRlcmFjdGlvbi0+YXNTZXQoKSA9IHBhcmVudEludGVyYWN0aW9uPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkV4ZWN1dGlvblNwZWNpZmljYXRpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24tYWN0aW9uIiBuYW1lPSJhY3Rpb24iIHR5cGU9IkFjdGlvbiIgYXNzb2NpYXRpb249IkFfYWN0aW9uX2FjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1hY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uLWFjdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+QWN0aW9uIHdob3NlIGV4ZWN1dGlvbiBpcyBvY2N1cnJpbmcuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkJlaGF2aW9yRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgbmFtZT0iQmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvckV4ZWN1dGlvblNwZWNpZmljYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCZWhhdmlvckV4ZWN1dGlvblNwZWNpZmljYXRpb24iPgotICAgICAgICA8Ym9keT5BIEJlaGF2aW9yRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiBpcyBhIGtpbmQgb2YgRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiByZXByZXNlbnRpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhIEJlaGF2aW9yLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJFeGVjdXRpb25TcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJCZWhhdmlvckV4ZWN1dGlvblNwZWNpZmljYXRpb24tYmVoYXZpb3IiIG5hbWU9ImJlaGF2aW9yIiB0eXBlPSJCZWhhdmlvciIgYXNzb2NpYXRpb249IkFfYmVoYXZpb3JfYmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1iZWhhdmlvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1iZWhhdmlvciI+Ci0gICAgICAgICAgPGJvZHk+QmVoYXZpb3Igd2hvc2UgZXhlY3V0aW9uIGlzIG9jY3VycmluZy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1iZWhhdmlvci1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ29tYmluZWRGcmFnbWVudCIgbmFtZT0iQ29tYmluZWRGcmFnbWVudCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tYmluZWRGcmFnbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbWJpbmVkRnJhZ21lbnQiPgotICAgICAgICA8Ym9keT5BIENvbWJpbmVkRnJhZ21lbnQgZGVmaW5lcyBhbiBleHByZXNzaW9uIG9mIEludGVyYWN0aW9uRnJhZ21lbnRzLiBBIENvbWJpbmVkRnJhZ21lbnQgaXMgZGVmaW5lZCBieSBhbiBpbnRlcmFjdGlvbiBvcGVyYXRvciBhbmQgY29ycmVzcG9uZGluZyBJbnRlcmFjdGlvbk9wZXJhbmRzLiBUaHJvdWdoIHRoZSB1c2Ugb2YgQ29tYmluZWRGcmFnbWVudHMgdGhlIHVzZXIgd2lsbCBiZSBhYmxlIHRvIGRlc2NyaWJlIGEgbnVtYmVyIG9mIHRyYWNlcyBpbiBhIGNvbXBhY3QgYW5kIGNvbmNpc2UgbWFubmVyLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbWJpbmVkRnJhZ21lbnQtYnJlYWsiIG5hbWU9ImJyZWFrIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbWJpbmVkRnJhZ21lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tYmluZWRGcmFnbWVudC1icmVhay1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbWJpbmVkRnJhZ21lbnQtYnJlYWsiPgotICAgICAgICAgIDxib2R5PklmIHRoZSBpbnRlcmFjdGlvbk9wZXJhdG9yIGlzIGJyZWFrLCB0aGUgY29ycmVzcG9uZGluZyBJbnRlcmFjdGlvbk9wZXJhbmQgbXVzdCBjb3ZlciBhbGwgTGlmZWxpbmVzIGNvdmVyZWQgYnkgdGhlIGVuY2xvc2luZyBJbnRlcmFjdGlvbkZyYWdtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb21iaW5lZEZyYWdtZW50LWJyZWFrLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pbnRlcmFjdGlvbk9wZXJhdG9yPUludGVyYWN0aW9uT3BlcmF0b3JLaW5kOjpicmVhayAgaW1wbGllcyAgICYjeEQ7Ci1lbmNsb3NpbmdJbnRlcmFjdGlvbi5vY2xBc1R5cGUoSW50ZXJhY3Rpb25GcmFnbWVudCktPmFzU2V0KCktPnVuaW9uKCYjeEQ7Ci0gICBlbmNsb3NpbmdPcGVyYW5kLm9jbEFzVHlwZShJbnRlcmFjdGlvbkZyYWdtZW50KS0+YXNTZXQoKSkuY292ZXJlZC0+YXNTZXQoKSA9IHNlbGYuY292ZXJlZC0+YXNTZXQoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29tYmluZWRGcmFnbWVudC1jb25zaWRlcl9hbmRfaWdub3JlIiBuYW1lPSJjb25zaWRlcl9hbmRfaWdub3JlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbWJpbmVkRnJhZ21lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tYmluZWRGcmFnbWVudC1jb25zaWRlcl9hbmRfaWdub3JlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29tYmluZWRGcmFnbWVudC1jb25zaWRlcl9hbmRfaWdub3JlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgaW50ZXJhY3Rpb24gb3BlcmF0b3JzICdjb25zaWRlcicgYW5kICdpZ25vcmUnIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHRoZSBDb25zaWRlcklnbm9yZUZyYWdtZW50IHN1YnR5cGUgb2YgQ29tYmluZWRGcmFnbWVudDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb21iaW5lZEZyYWdtZW50LWNvbnNpZGVyX2FuZF9pZ25vcmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PigoaW50ZXJhY3Rpb25PcGVyYXRvciA9IEludGVyYWN0aW9uT3BlcmF0b3JLaW5kOjpjb25zaWRlcikgb3IgKGludGVyYWN0aW9uT3BlcmF0b3IgPSAgSW50ZXJhY3Rpb25PcGVyYXRvcktpbmQ6Omlnbm9yZSkpIGltcGxpZXMgb2NsSXNLaW5kT2YoQ29uc2lkZXJJZ25vcmVGcmFnbWVudCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbWJpbmVkRnJhZ21lbnQtb3B0X2xvb3BfYnJlYWtfbmVnIiBuYW1lPSJvcHRfbG9vcF9icmVha19uZWciIGNvbnN0cmFpbmVkRWxlbWVudD0iQ29tYmluZWRGcmFnbWVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb21iaW5lZEZyYWdtZW50LW9wdF9sb29wX2JyZWFrX25lZy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbWJpbmVkRnJhZ21lbnQtb3B0X2xvb3BfYnJlYWtfbmVnIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgaW50ZXJhY3Rpb25PcGVyYXRvciBpcyBvcHQsIGxvb3AsIGJyZWFrLCBhc3NlcnQgb3IgbmVnLCB0aGVyZSBtdXN0IGJlIGV4YWN0bHkgb25lIG9wZXJhbmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbWJpbmVkRnJhZ21lbnQtb3B0X2xvb3BfYnJlYWtfbmVnLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oaW50ZXJhY3Rpb25PcGVyYXRvciA9ICBJbnRlcmFjdGlvbk9wZXJhdG9yS2luZDo6b3B0IG9yIGludGVyYWN0aW9uT3BlcmF0b3IgPSBJbnRlcmFjdGlvbk9wZXJhdG9yS2luZDo6bG9vcCBvciYjeEQ7Ci1pbnRlcmFjdGlvbk9wZXJhdG9yID0gSW50ZXJhY3Rpb25PcGVyYXRvcktpbmQ6OmJyZWFrIG9yIGludGVyYWN0aW9uT3BlcmF0b3IgPSBJbnRlcmFjdGlvbk9wZXJhdG9yS2luZDo6YXNzZXJ0IG9yJiN4RDsKLWludGVyYWN0aW9uT3BlcmF0b3IgPSBJbnRlcmFjdGlvbk9wZXJhdG9yS2luZDo6bmVnKSYjeEQ7Ci1pbXBsaWVzIG9wZXJhbmQtPnNpemUoKT0xPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNvbWJpbmVkRnJhZ21lbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkludGVyYWN0aW9uRnJhZ21lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbWJpbmVkRnJhZ21lbnQtY2ZyYWdtZW50R2F0ZSIgbmFtZT0iY2ZyYWdtZW50R2F0ZSIgdHlwZT0iR2F0ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9jZnJhZ21lbnRHYXRlX2NvbWJpbmVkRnJhZ21lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tYmluZWRGcmFnbWVudC1jZnJhZ21lbnRHYXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29tYmluZWRGcmFnbWVudC1jZnJhZ21lbnRHYXRlIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhlIGdhdGVzIHRoYXQgZm9ybSB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhpcyBDb21iaW5lZEZyYWdtZW50IGFuZCBpdHMgc3Vycm91bmRpbmdzPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb21iaW5lZEZyYWdtZW50LWNmcmFnbWVudEdhdGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb21iaW5lZEZyYWdtZW50LWNmcmFnbWVudEdhdGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29tYmluZWRGcmFnbWVudC1pbnRlcmFjdGlvbk9wZXJhdG9yIiBuYW1lPSJpbnRlcmFjdGlvbk9wZXJhdG9yIiB0eXBlPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb21iaW5lZEZyYWdtZW50LWludGVyYWN0aW9uT3BlcmF0b3ItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21iaW5lZEZyYWdtZW50LWludGVyYWN0aW9uT3BlcmF0b3IiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB0aGUgb3BlcmF0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHNlbWFudGljcyBvZiB0aGlzIGNvbWJpbmF0aW9uIG9mIEludGVyYWN0aW9uRnJhZ21lbnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9IkNvbWJpbmVkRnJhZ21lbnQtaW50ZXJhY3Rpb25PcGVyYXRvci1fZGVmYXVsdFZhbHVlIiB0eXBlPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZCIgaW5zdGFuY2U9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLXNlcSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbWJpbmVkRnJhZ21lbnQtb3BlcmFuZCIgbmFtZT0ib3BlcmFuZCIgdHlwZT0iSW50ZXJhY3Rpb25PcGVyYW5kIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfb3BlcmFuZF9jb21iaW5lZEZyYWdtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbWJpbmVkRnJhZ21lbnQtb3BlcmFuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbWJpbmVkRnJhZ21lbnQtb3BlcmFuZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNldCBvZiBvcGVyYW5kcyBvZiB0aGUgY29tYmluZWQgZnJhZ21lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb21iaW5lZEZyYWdtZW50LW9wZXJhbmQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJDb25zaWRlcklnbm9yZUZyYWdtZW50IiBuYW1lPSJDb25zaWRlcklnbm9yZUZyYWdtZW50Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25zaWRlcklnbm9yZUZyYWdtZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29uc2lkZXJJZ25vcmVGcmFnbWVudCI+Ci0gICAgICAgIDxib2R5PkEgQ29uc2lkZXJJZ25vcmVGcmFnbWVudCBpcyBhIGtpbmQgb2YgQ29tYmluZWRGcmFnbWVudCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBjb25zaWRlciBhbmQgaWdub3JlIGNhc2VzLCB3aGljaCByZXF1aXJlIGxpc3RzIG9mIHBlcnRpbmVudCBNZXNzYWdlcyB0byBiZSBzcGVjaWZpZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29uc2lkZXJJZ25vcmVGcmFnbWVudC1jb25zaWRlcl9vcl9pZ25vcmUiIG5hbWU9ImNvbnNpZGVyX29yX2lnbm9yZSIgY29uc3RyYWluZWRFbGVtZW50PSJDb25zaWRlcklnbm9yZUZyYWdtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbnNpZGVySWdub3JlRnJhZ21lbnQtY29uc2lkZXJfb3JfaWdub3JlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29uc2lkZXJJZ25vcmVGcmFnbWVudC1jb25zaWRlcl9vcl9pZ25vcmUiPgotICAgICAgICAgIDxib2R5PlRoZSBpbnRlcmFjdGlvbiBvcGVyYXRvciBvZiBhIENvbnNpZGVySWdub3JlRnJhZ21lbnQgbXVzdCBiZSBlaXRoZXIgJ2NvbnNpZGVyJyBvciAnaWdub3JlJy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ29uc2lkZXJJZ25vcmVGcmFnbWVudC1jb25zaWRlcl9vcl9pZ25vcmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihpbnRlcmFjdGlvbk9wZXJhdG9yID0gIEludGVyYWN0aW9uT3BlcmF0b3JLaW5kOjpjb25zaWRlcikgb3IgKGludGVyYWN0aW9uT3BlcmF0b3IgPSAgSW50ZXJhY3Rpb25PcGVyYXRvcktpbmQ6Omlnbm9yZSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbnNpZGVySWdub3JlRnJhZ21lbnQtdHlwZSIgbmFtZT0idHlwZSIgY29uc3RyYWluZWRFbGVtZW50PSJDb25zaWRlcklnbm9yZUZyYWdtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbnNpZGVySWdub3JlRnJhZ21lbnQtdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbnNpZGVySWdub3JlRnJhZ21lbnQtdHlwZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE5hbWVkRWxlbWVudHMgbXVzdCBiZSBvZiBhIHR5cGUgb2YgZWxlbWVudCB0aGF0IGNhbiBiZSBhIHNpZ25hdHVyZSBmb3IgYSBtZXNzYWdlIChpLmUuLiwgYW4gT3BlcmF0aW9uLCBvciBhIFNpZ25hbCkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbnNpZGVySWdub3JlRnJhZ21lbnQtdHlwZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bWVzc2FnZS0+Zm9yQWxsKG0gfCBtLm9jbElzS2luZE9mKE9wZXJhdGlvbikgb3IgbS5vY2xJc0tpbmRPZihTaWduYWwpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDb25zaWRlcklnbm9yZUZyYWdtZW50LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJDb21iaW5lZEZyYWdtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb25zaWRlcklnbm9yZUZyYWdtZW50LW1lc3NhZ2UiIG5hbWU9Im1lc3NhZ2UiIHR5cGU9Ik5hbWVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfbWVzc2FnZV9jb25zaWRlcklnbm9yZUZyYWdtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbnNpZGVySWdub3JlRnJhZ21lbnQtbWVzc2FnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbnNpZGVySWdub3JlRnJhZ21lbnQtbWVzc2FnZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNldCBvZiBtZXNzYWdlcyB0aGF0IGFwcGx5IHRvIHRoaXMgZnJhZ21lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb25zaWRlcklnbm9yZUZyYWdtZW50LW1lc3NhZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb25zaWRlcklnbm9yZUZyYWdtZW50LW1lc3NhZ2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJDb250aW51YXRpb24iIG5hbWU9IkNvbnRpbnVhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29udGludWF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29udGludWF0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBDb250aW51YXRpb24gaXMgYSBzeW50YWN0aWMgd2F5IHRvIGRlZmluZSBjb250aW51YXRpb25zIG9mIGRpZmZlcmVudCBicmFuY2hlcyBvZiBhbiBhbHRlcm5hdGl2ZSBDb21iaW5lZEZyYWdtZW50LiBDb250aW51YXRpb25zIGFyZSBpbnR1aXRpdmVseSBzaW1pbGFyIHRvIGxhYmVscyByZXByZXNlbnRpbmcgaW50ZXJtZWRpYXRlIHBvaW50cyBpbiBhIGZsb3cgb2YgY29udHJvbC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb250aW51YXRpb24tZmlyc3Rfb3JfbGFzdF9pbnRlcmFjdGlvbl9mcmFnbWVudCIgbmFtZT0iZmlyc3Rfb3JfbGFzdF9pbnRlcmFjdGlvbl9mcmFnbWVudCIgY29uc3RyYWluZWRFbGVtZW50PSJDb250aW51YXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29udGludWF0aW9uLWZpcnN0X29yX2xhc3RfaW50ZXJhY3Rpb25fZnJhZ21lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb250aW51YXRpb24tZmlyc3Rfb3JfbGFzdF9pbnRlcmFjdGlvbl9mcmFnbWVudCI+Ci0gICAgICAgICAgPGJvZHk+Q29udGludWF0aW9ucyBhbHdheXMgb2NjdXIgYXMgdGhlIHZlcnkgZmlyc3QgSW50ZXJhY3Rpb25GcmFnbWVudCBvciB0aGUgdmVyeSBsYXN0IEludGVyYWN0aW9uRnJhZ21lbnQgb2YgdGhlIGVuY2xvc2luZyBJbnRlcmFjdGlvbk9wZXJhbmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbnRpbnVhdGlvbi1maXJzdF9vcl9sYXN0X2ludGVyYWN0aW9uX2ZyYWdtZW50LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4gZW5jbG9zaW5nT3BlcmFuZC0+bm90RW1wdHkoKSBhbmQgJiN4RDsKLSBsZXQgcGVlckZyYWdtZW50cyA6IE9yZGVyZWRTZXQoSW50ZXJhY3Rpb25GcmFnbWVudCkgPSAgZW5jbG9zaW5nT3BlcmFuZC5mcmFnbWVudCBpbiAmI3hEOwotICAgKCBwZWVyRnJhZ21lbnRzLT5ub3RFbXB0eSgpIGFuZCAmI3hEOwotICAgKChwZWVyRnJhZ21lbnRzLT5maXJzdCgpID0gc2VsZikgb3IgIChwZWVyRnJhZ21lbnRzLT5sYXN0KCkgPSBzZWxmKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb250aW51YXRpb24tc2FtZV9uYW1lIiBuYW1lPSJzYW1lX25hbWUiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ29udGludWF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbnRpbnVhdGlvbi1zYW1lX25hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb250aW51YXRpb24tc2FtZV9uYW1lIj4KLSAgICAgICAgICA8Ym9keT5BY3Jvc3MgYWxsIEludGVyYWN0aW9uIGluc3RhbmNlcyBoYXZpbmcgdGhlIHNhbWUgY29udGV4dCB2YWx1ZSwgZXZlcnkgTGlmZWxpbmUgaW5zdGFuY2UgY292ZXJlZCBieSBhIENvbnRpbnVhdGlvbiAoc2VsZikgbXVzdCBiZSBjb21tb24gd2l0aCBvbmUgY292ZXJlZCBMaWZlbGluZSBpbnN0YW5jZSBvZiBhbGwgb3RoZXIgQ29udGludWF0aW9uIGluc3RhbmNlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgc2VsZiwgYW5kIGV2ZXJ5IExpZmVsaW5lIGluc3RhbmNlIGNvdmVyZWQgYnkgYSBDb250aW51YXRpb24gaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHNlbGYgbXVzdCBiZSBjb21tb24gd2l0aCBvbmUgY292ZXJlZCBMaWZlbGluZSBpbnN0YW5jZSBvZiBzZWxmLiBMaWZlbGluZSBpbnN0YW5jZXMgYXJlIGNvbW1vbiBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgc2VsZWN0b3IgYW5kIHJlcHJlc2VudHMgYXNzb2NpYXRpb25FbmQgdmFsdWVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb250aW51YXRpb24tc2FtZV9uYW1lLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lbmNsb3NpbmdPcGVyYW5kLmNvbWJpbmVkRnJhZ21lbnQtPm5vdEVtcHR5KCkgYW5kJiN4RDsKLWxldCBwYXJlbnRJbnRlcmFjdGlvbiA6IFNldChJbnRlcmFjdGlvbikgPSAmI3hEOwotZW5jbG9zaW5nT3BlcmFuZC5jb21iaW5lZEZyYWdtZW50LT5jbG9zdXJlKGVuY2xvc2luZ09wZXJhbmQuY29tYmluZWRGcmFnbWVudCktPiYjeEQ7Ci1jb2xsZWN0KGVuY2xvc2luZ0ludGVyYWN0aW9uKS5vY2xBc1R5cGUoSW50ZXJhY3Rpb24pLT5hc1NldCgpJiN4RDsKLWluICYjeEQ7Ci0ocGFyZW50SW50ZXJhY3Rpb24tPnNpemUoKSA9IDEpICYjeEQ7Ci1hbmQgbGV0IHBlZXJJbnRlcmFjdGlvbnMgOiBTZXQoSW50ZXJhY3Rpb24pID0mI3hEOwotIChwYXJlbnRJbnRlcmFjdGlvbi0+dW5pb24ocGFyZW50SW50ZXJhY3Rpb24tPmNvbGxlY3QoXydjb250ZXh0JyktPmNvbGxlY3QoYmVoYXZpb3IpLT4mI3hEOwotIHNlbGVjdChvY2xJc0tpbmRPZihJbnRlcmFjdGlvbikpLm9jbEFzVHlwZShJbnRlcmFjdGlvbiktPmFzU2V0KCkpLT5hc1NldCgpKSBpbiYjeEQ7Ci0gKHBlZXJJbnRlcmFjdGlvbnMtPm5vdEVtcHR5KCkpIGFuZCAmI3hEOwotICBsZXQgY29tYmluZWRGcmFnbWVudHMxIDogU2V0KENvbWJpbmVkRnJhZ21lbnQpID0gcGVlckludGVyYWN0aW9ucy5mcmFnbWVudC0+JiN4RDsKLSBzZWxlY3Qob2NsSXNLaW5kT2YoQ29tYmluZWRGcmFnbWVudCkpLm9jbEFzVHlwZShDb21iaW5lZEZyYWdtZW50KS0+YXNTZXQoKSBpbiYjeEQ7Ci0gICBjb21iaW5lZEZyYWdtZW50czEtPm5vdEVtcHR5KCkgYW5kICBjb21iaW5lZEZyYWdtZW50czEtPmNsb3N1cmUob3BlcmFuZC5mcmFnbWVudC0+JiN4RDsKLSAgIHNlbGVjdChvY2xJc0tpbmRPZihDb21iaW5lZEZyYWdtZW50KSkub2NsQXNUeXBlKENvbWJpbmVkRnJhZ21lbnQpKS0+YXNTZXQoKS5vcGVyYW5kLmZyYWdtZW50LT4mI3hEOwotICAgc2VsZWN0KG9jbElzS2luZE9mKENvbnRpbnVhdGlvbikpLm9jbEFzVHlwZShDb250aW51YXRpb24pLT5hc1NldCgpLT4mI3hEOwotICAgZm9yQWxsKGMgOiBDb250aW51YXRpb24gfCAgKGMubmFtZSA9IHNlbGYubmFtZSkgaW1wbGllcyAmI3hEOwotICAoYy5jb3ZlcmVkLT5hc1NldCgpLT5mb3JBbGwoY2wgOiBMaWZlbGluZSB8IC0tICBjbCBtdXN0IGJlIGNvbW1vbiB0byBvbmUgbGlmZWxpbmUgY292ZXJlZCBieSBzZWxmJiN4RDsKLSAgc2VsZi5jb3ZlcmVkLT5hc1NldCgpLT4mI3hEOwotICBzZWxlY3QocmVwcmVzZW50cyA9IGNsLnJlcHJlc2VudHMgYW5kIHNlbGVjdG9yID0gY2wuc2VsZWN0b3IpLT5hc1NldCgpLT5zaXplKCk9MSkpJiN4RDsKLSAgIGFuZCYjeEQ7Ci0gKHNlbGYuY292ZXJlZC0+YXNTZXQoKS0+Zm9yQWxsKGNsIDogTGlmZWxpbmUgfCAtLSAgY2wgbXVzdCBiZSBjb21tb24gdG8gb25lIGxpZmVsaW5lIGNvdmVyZWQgYnkgYyYjeEQ7Ci0gYy5jb3ZlcmVkLT5hc1NldCgpLT4mI3hEOwotICBzZWxlY3QocmVwcmVzZW50cyA9IGNsLnJlcHJlc2VudHMgYW5kIHNlbGVjdG9yID0gY2wuc2VsZWN0b3IpLT5hc1NldCgpLT5zaXplKCk9MSkpJiN4RDsKLSAgKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29udGludWF0aW9uLWdsb2JhbCIgbmFtZT0iZ2xvYmFsIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbnRpbnVhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb250aW51YXRpb24tZ2xvYmFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29udGludWF0aW9uLWdsb2JhbCI+Ci0gICAgICAgICAgPGJvZHk+Q29udGludWF0aW9ucyBhcmUgYWx3YXlzIGdsb2JhbCBpbiB0aGUgZW5jbG9zaW5nIEludGVyYWN0aW9uRnJhZ21lbnQgZS5nLiwgaXQgYWx3YXlzIGNvdmVycyBhbGwgTGlmZWxpbmVzIGNvdmVyZWQgYnkgdGhlIGVuY2xvc2luZyBJbnRlcmFjdGlvbk9wZXJhdG9yLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb250aW51YXRpb24tZ2xvYmFsLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lbmNsb3NpbmdPcGVyYW5kLT5ub3RFbXB0eSgpIGFuZCYjeEQ7Ci0gIGxldCBvcGVyYW5kTGlmZWxpbmVzIDogU2V0KExpZmVsaW5lKSA9ICBlbmNsb3NpbmdPcGVyYW5kLmNvdmVyZWQgaW4gJiN4RDsKLSAgICAob3BlcmFuZExpZmVsaW5lcy0+bm90RW1wdHkoKSBhbmQgJiN4RDsKLSAgICBvcGVyYW5kTGlmZWxpbmVzLT5mb3JBbGwob2wgOkxpZmVsaW5lIHxzZWxmLmNvdmVyZWQtPmluY2x1ZGVzKG9sKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNvbnRpbnVhdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iSW50ZXJhY3Rpb25GcmFnbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29udGludWF0aW9uLXNldHRpbmciIG5hbWU9InNldHRpbmciPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29udGludWF0aW9uLXNldHRpbmctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb250aW51YXRpb24tc2V0dGluZyI+Ci0gICAgICAgICAgPGJvZHk+VHJ1ZTogd2hlbiB0aGUgQ29udGludWF0aW9uIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGVuY2xvc2luZyBJbnRlcmFjdGlvbkZyYWdtZW50IGFuZCBGYWxzZSB3aGVuIGl0IGlzIGluIHRoZSBiZWdpbm5pbmcuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iQ29udGludWF0aW9uLXNldHRpbmctX2RlZmF1bHRWYWx1ZSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkRlc3RydWN0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iIG5hbWU9IkRlc3RydWN0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlc3RydWN0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZXN0cnVjdGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBEZXN0cnVjdGlvbk9jY3VyZW5jZVNwZWNpZmljYXRpb24gbW9kZWxzIHRoZSBkZXN0cnVjdGlvbiBvZiBhbiBvYmplY3QuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRGVzdHJ1Y3Rpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1ub19vY2N1cnJlbmNlX3NwZWNpZmljYXRpb25zX2JlbG93IiBuYW1lPSJub19vY2N1cnJlbmNlX3NwZWNpZmljYXRpb25zX2JlbG93IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkRlc3RydWN0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGVzdHJ1Y3Rpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1ub19vY2N1cnJlbmNlX3NwZWNpZmljYXRpb25zX2JlbG93LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVzdHJ1Y3Rpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1ub19vY2N1cnJlbmNlX3NwZWNpZmljYXRpb25zX2JlbG93Ij4KLSAgICAgICAgICA8Ym9keT5ObyBvdGhlciBPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbnMgb24gYSBnaXZlbiBMaWZlbGluZSBpbiBhbiBJbnRlcmFjdGlvbk9wZXJhbmQgbWF5IGFwcGVhciBiZWxvdyBhIERlc3RydWN0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkRlc3RydWN0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tbm9fb2NjdXJyZW5jZV9zcGVjaWZpY2F0aW9uc19iZWxvdy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bGV0IG8gOiBJbnRlcmFjdGlvbk9wZXJhbmQgPSBlbmNsb3NpbmdPcGVyYW5kIGluIG8tPm5vdEVtcHR5KCkgYW5kICYjeEQ7Ci1sZXQgcGVlckV2ZW50cyA6IE9yZGVyZWRTZXQoT2NjdXJyZW5jZVNwZWNpZmljYXRpb24pID0gY292ZXJlZC5ldmVudHMtPnNlbGVjdChlbmNsb3NpbmdPcGVyYW5kID0gbykmI3hEOwotaW4gcGVlckV2ZW50cy0+bGFzdCgpID0gc2VsZjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJEZXN0cnVjdGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRXhlY3V0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iIG5hbWU9IkV4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeGVjdXRpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPGJvZHk+QW4gRXhlY3V0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gcmVwcmVzZW50cyBtb21lbnRzIGluIHRpbWUgYXQgd2hpY2ggQWN0aW9ucyBvciBCZWhhdmlvcnMgc3RhcnQgb3IgZmluaXNoLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRXhlY3V0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFeGVjdXRpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1leGVjdXRpb24iIG5hbWU9ImV4ZWN1dGlvbiIgdHlwZT0iRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgYXNzb2NpYXRpb249IkFfZXhlY3V0aW9uX2V4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLWV4ZWN1dGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLWV4ZWN1dGlvbiI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgZXhlY3V0aW9uIHNwZWNpZmljYXRpb24gZGVzY3JpYmluZyB0aGUgZXhlY3V0aW9uIHRoYXQgaXMgc3RhcnRlZCBvciBmaW5pc2hlZCBhdCB0aGlzIGV4ZWN1dGlvbiBldmVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgbmFtZT0iRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4ZWN1dGlvblNwZWNpZmljYXRpb24iPgotICAgICAgICA8Ym9keT5BbiBFeGVjdXRpb25TcGVjaWZpY2F0aW9uIGlzIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZXhlY3V0aW9uIG9mIGEgdW5pdCBvZiBCZWhhdmlvciBvciBBY3Rpb24gd2l0aGluIHRoZSBMaWZlbGluZS4gVGhlIGR1cmF0aW9uIG9mIGFuIEV4ZWN1dGlvblNwZWNpZmljYXRpb24gaXMgcmVwcmVzZW50ZWQgYnkgdHdvIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9ucywgdGhlIHN0YXJ0IE9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIGFuZCB0aGUgZmluaXNoIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkV4ZWN1dGlvblNwZWNpZmljYXRpb24tc2FtZV9saWZlbGluZSIgbmFtZT0ic2FtZV9saWZlbGluZSIgY29uc3RyYWluZWRFbGVtZW50PSJFeGVjdXRpb25TcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4ZWN1dGlvblNwZWNpZmljYXRpb24tc2FtZV9saWZlbGluZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4ZWN1dGlvblNwZWNpZmljYXRpb24tc2FtZV9saWZlbGluZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHN0YXJ0RXZlbnQgYW5kIHRoZSBmaW5pc2hFdmVudCBtdXN0IGJlIG9uIHRoZSBzYW1lIExpZmVsaW5lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFeGVjdXRpb25TcGVjaWZpY2F0aW9uLXNhbWVfbGlmZWxpbmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnN0YXJ0LmNvdmVyZWQgPSBmaW5pc2guY292ZXJlZDwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFeGVjdXRpb25TcGVjaWZpY2F0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJJbnRlcmFjdGlvbkZyYWdtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFeGVjdXRpb25TcGVjaWZpY2F0aW9uLWZpbmlzaCIgbmFtZT0iZmluaXNoIiB0eXBlPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiIgYXNzb2NpYXRpb249IkFfZmluaXNoX2V4ZWN1dGlvblNwZWNpZmljYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1maW5pc2gtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeGVjdXRpb25TcGVjaWZpY2F0aW9uLWZpbmlzaCI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gdGhhdCBkZXNpZ25hdGVzIHRoZSBmaW5pc2ggb2YgdGhlIEFjdGlvbiBvciBCZWhhdmlvci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4ZWN1dGlvblNwZWNpZmljYXRpb24tc3RhcnQiIG5hbWU9InN0YXJ0IiB0eXBlPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiIgYXNzb2NpYXRpb249IkFfc3RhcnRfZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeGVjdXRpb25TcGVjaWZpY2F0aW9uLXN0YXJ0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1zdGFydCI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gdGhhdCBkZXNpZ25hdGVzIHRoZSBzdGFydCBvZiB0aGUgQWN0aW9uIG9yIEJlaGF2aW9yLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJHYXRlIiBuYW1lPSJHYXRlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJHYXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2F0ZSI+Ci0gICAgICAgIDxib2R5PkEgR2F0ZSBpcyBhIE1lc3NhZ2VFbmQgd2hpY2ggc2VydmVzIGFzIGEgY29ubmVjdGlvbiBwb2ludCBmb3IgcmVsYXRpbmcgYSBNZXNzYWdlIHdoaWNoIGhhcyBhIE1lc3NhZ2VFbmQgKHNlbmRFdmVudCAvIHJlY2VpdmVFdmVudCkgb3V0c2lkZSBhbiBJbnRlcmFjdGlvbkZyYWdtZW50IHdpdGggYW5vdGhlciBNZXNzYWdlIHdoaWNoIGhhcyBhIE1lc3NhZ2VFbmQgKHJlY2VpdmVFdmVudCAvIHNlbmRFdmVudCkgIGluc2lkZSB0aGF0IEludGVyYWN0aW9uRnJhZ21lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iR2F0ZS1hY3R1YWxfZ2F0ZV9tYXRjaGVkIiBuYW1lPSJhY3R1YWxfZ2F0ZV9tYXRjaGVkIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkdhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2F0ZS1hY3R1YWxfZ2F0ZV9tYXRjaGVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2F0ZS1hY3R1YWxfZ2F0ZV9tYXRjaGVkIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGlzIEdhdGUgaXMgYW4gYWN0dWFsR2F0ZSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgb25lIG1hdGNoaW5nIGZvcm1hbEdhdGUgd2l0aGluIHRoZSByZWZlcnJlZCBJbnRlcmFjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iR2F0ZS1hY3R1YWxfZ2F0ZV9tYXRjaGVkLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pbnRlcmFjdGlvblVzZS0+bm90RW1wdHkoKSBpbXBsaWVzIGludGVyYWN0aW9uVXNlLnJlZmVyc1RvLmZvcm1hbEdhdGUtPnNlbGVjdChtYXRjaGVzKHNlbGYpKS0+c2l6ZSgpPTE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkdhdGUtaW5zaWRlX2NmX21hdGNoZWQiIG5hbWU9Imluc2lkZV9jZl9tYXRjaGVkIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkdhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2F0ZS1pbnNpZGVfY2ZfbWF0Y2hlZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkdhdGUtaW5zaWRlX2NmX21hdGNoZWQiPgotICAgICAgICAgIDxib2R5PklmIHRoaXMgR2F0ZSBpcyBpbnNpZGUgYSBDb21iaW5lZEZyYWdtZW50LCBpdCBtdXN0IGhhdmUgZXhhY3RseSBvbmUgbWF0Y2hpbmcgR2F0ZSB3aGljaCBpcyBvdXRzaWRlIG9mIHRoYXQgQ29tYmluZWRGcmFnbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iR2F0ZS1pbnNpZGVfY2ZfbWF0Y2hlZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aXNJbnNpZGVDRigpIGltcGxpZXMgY29tYmluZWRGcmFnbWVudC5jZnJhZ21lbnRHYXRlLT5zZWxlY3QoaXNPdXRzaWRlQ0YoKSBhbmQgbWF0Y2hlcyhzZWxmKSktPnNpemUoKT0xPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJHYXRlLW91dHNpZGVfY2ZfbWF0Y2hlZCIgbmFtZT0ib3V0c2lkZV9jZl9tYXRjaGVkIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkdhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2F0ZS1vdXRzaWRlX2NmX21hdGNoZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJHYXRlLW91dHNpZGVfY2ZfbWF0Y2hlZCI+Ci0gICAgICAgICAgPGJvZHk+SWYgdGhpcyBHYXRlIGlzIG91dHNpZGUgYW4gJ2FsdCcgQ29tYmluZWRGcmFnbWVudCwgIGZvciBldmVyeSBJbnRlcmFjdGlvbk9wZXJhdG9yIGluc2lkZSB0aGF0IENvbWJpbmVkRnJhZ21lbnQgdGhlcmUgbXVzdCBiZSBleGFjdGx5IG9uZSBtYXRjaGluZyBHYXRlIGluc2lkZSB0aGUgQ29tYmluZGVkRnJhZ21lbnQgd2l0aCBpdHMgb3Bwb3NpbmcgZW5kIGVuY2xvc2VkIGJ5IHRoYXQgSW50ZXJhY3Rpb25PcGVyYXRvci4gSWYgdGhpcyBHYXRlIGlzIG91dHNpZGUgQ29tYmluZWRGcmFnbWVudCB3aXRoIG9wZXJhdG9yIG90aGVyIHRoYW4gJ2FsdCcsICAgdGhlcmUgbXVzdCBiZSBleGFjdGx5IG9uZSBtYXRjaGluZyBHYXRlIGluc2lkZSB0aGF0IENvbWJpbmVkRnJhZ21lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkdhdGUtb3V0c2lkZV9jZl9tYXRjaGVkLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pc091dHNpZGVDRigpIGltcGxpZXMmI3hEOwotIGlmIHNlbGYuY29tYmluZWRGcmFnbWVudC5pbnRlcmFjdGlvbk9wZXJhdG9yLT5hc09yZGVyZWRTZXQoKS0+Zmlyc3QoKSA9IEludGVyYWN0aW9uT3BlcmF0b3JLaW5kOjphbHQmI3hEOwotIHRoZW4gc2VsZi5jb21iaW5lZEZyYWdtZW50Lm9wZXJhbmQtPmZvckFsbChvcCA6IEludGVyYWN0aW9uT3BlcmFuZCB8JiN4RDsKLSBzZWxmLmNvbWJpbmVkRnJhZ21lbnQuY2ZyYWdtZW50R2F0ZS0+c2VsZWN0KGlzSW5zaWRlQ0YoKSBhbmQgJiN4RDsKLSBvcHBvc2l0ZUVuZCgpLmVuY2xvc2luZ0ZyYWdtZW50KCktPmluY2x1ZGVzKHNlbGYuY29tYmluZWRGcmFnbWVudCkgYW5kIG1hdGNoZXMoc2VsZikpLT5zaXplKCk9MSkmI3hEOwotIGVsc2UgIHNlbGYuY29tYmluZWRGcmFnbWVudC5jZnJhZ21lbnRHYXRlLT5zZWxlY3QoaXNJbnNpZGVDRigpIGFuZCBtYXRjaGVzKHNlbGYpKS0+c2l6ZSgpPTEmI3hEOwotIGVuZGlmPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJHYXRlLWZvcm1hbF9nYXRlX2Rpc3Rpbmd1aXNoYWJsZSIgbmFtZT0iZm9ybWFsX2dhdGVfZGlzdGluZ3Vpc2hhYmxlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkdhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2F0ZS1mb3JtYWxfZ2F0ZV9kaXN0aW5ndWlzaGFibGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJHYXRlLWZvcm1hbF9nYXRlX2Rpc3Rpbmd1aXNoYWJsZSI+Ci0gICAgICAgICAgPGJvZHk+aXNGb3JtYWwoKSBpbXBsaWVzIHRoYXQgbm8gb3RoZXIgZm9ybWFsR2F0ZSBvZiB0aGUgcGFyZW50IEludGVyYWN0aW9uIHJldHVybnMgdGhlIHNhbWUgZ2V0TmFtZSgpIGFzIHJldHVybmVkIGZvciBzZWxmPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkdhdGUtZm9ybWFsX2dhdGVfZGlzdGluZ3Vpc2hhYmxlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pc0Zvcm1hbCgpIGltcGxpZXMgaW50ZXJhY3Rpb24uZm9ybWFsR2F0ZS0+c2VsZWN0KGdldE5hbWUoKSA9IHNlbGYuZ2V0TmFtZSgpKS0+c2l6ZSgpPTE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkdhdGUtYWN0dWFsX2dhdGVfZGlzdGluZ3Vpc2hhYmxlIiBuYW1lPSJhY3R1YWxfZ2F0ZV9kaXN0aW5ndWlzaGFibGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iR2F0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJHYXRlLWFjdHVhbF9nYXRlX2Rpc3Rpbmd1aXNoYWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkdhdGUtYWN0dWFsX2dhdGVfZGlzdGluZ3Vpc2hhYmxlIj4KLSAgICAgICAgICA8Ym9keT5pc0FjdHVhbCgpIGltcGxpZXMgdGhhdCBubyBvdGhlciBhY3R1YWxHYXRlIG9mIHRoZSBwYXJlbnQgSW50ZXJhY3Rpb25Vc2UgcmV0dXJucyB0aGUgc2FtZSBnZXROYW1lKCkgYXMgcmV0dXJuZWQgZm9yIHNlbGY8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iR2F0ZS1hY3R1YWxfZ2F0ZV9kaXN0aW5ndWlzaGFibGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmlzQWN0dWFsKCkgaW1wbGllcyBpbnRlcmFjdGlvblVzZS5hY3R1YWxHYXRlLT5zZWxlY3QoZ2V0TmFtZSgpID0gc2VsZi5nZXROYW1lKCkpLT5zaXplKCk9MTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iR2F0ZS1vdXRzaWRlX2NmX2dhdGVfZGlzdGluZ3Vpc2hhYmxlIiBuYW1lPSJvdXRzaWRlX2NmX2dhdGVfZGlzdGluZ3Vpc2hhYmxlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkdhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2F0ZS1vdXRzaWRlX2NmX2dhdGVfZGlzdGluZ3Vpc2hhYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2F0ZS1vdXRzaWRlX2NmX2dhdGVfZGlzdGluZ3Vpc2hhYmxlIj4KLSAgICAgICAgICA8Ym9keT5pc091dHNpZGVDRigpIGltcGxpZXMgdGhhdCBubyBvdGhlciBvdXRzaWRlIGNmcmFnbWVudEdhdGUgb2YgdGhlIHBhcmVudCBDb21iaW5lZEZyYWdtZW50IHJldHVybnMgdGhlIHNhbWUgZ2V0TmFtZSgpIGFzIHJldHVybmVkIGZvciBzZWxmPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkdhdGUtb3V0c2lkZV9jZl9nYXRlX2Rpc3Rpbmd1aXNoYWJsZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aXNPdXRzaWRlQ0YoKSBpbXBsaWVzIGNvbWJpbmVkRnJhZ21lbnQuY2ZyYWdtZW50R2F0ZS0+c2VsZWN0KGdldE5hbWUoKSA9IHNlbGYuZ2V0TmFtZSgpKS0+c2l6ZSgpPTE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkdhdGUtaW5zaWRlX2NmX2dhdGVfZGlzdGluZ3Vpc2hhYmxlIiBuYW1lPSJpbnNpZGVfY2ZfZ2F0ZV9kaXN0aW5ndWlzaGFibGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iR2F0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJHYXRlLWluc2lkZV9jZl9nYXRlX2Rpc3Rpbmd1aXNoYWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkdhdGUtaW5zaWRlX2NmX2dhdGVfZGlzdGluZ3Vpc2hhYmxlIj4KLSAgICAgICAgICA8Ym9keT5pc0luc2lkZUNGKCkgaW1wbGllcyB0aGF0IG5vIG90aGVyIGluc2lkZSBjZnJhZ21lbnRHYXRlIGF0dGFjaGVkIHRvIGEgbWVzc2FnZSB3aXRoIGl0cyBvdGhlciBlbmQgaW4gdGhlIHNhbWUgSW50ZXJhY3Rpb25PcGVyYXRvciBhcyBzZWxmLCByZXR1cm5zIHRoZSBzYW1lIGdldE5hbWUoKSBhcyByZXR1cm5lZCBmb3Igc2VsZjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJHYXRlLWluc2lkZV9jZl9nYXRlX2Rpc3Rpbmd1aXNoYWJsZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+aXNJbnNpZGVDRigpIGltcGxpZXMmI3hEOwotbGV0IHNlbGZPcGVyYW5kIDogSW50ZXJhY3Rpb25PcGVyYW5kID0gc2VsZi5nZXRPcGVyYW5kKCkgaW4mI3hEOwotICBjb21iaW5lZEZyYWdtZW50LmNmcmFnbWVudEdhdGUtPnNlbGVjdChpc0luc2lkZUNGKCkgYW5kIGdldE5hbWUoKSA9IHNlbGYuZ2V0TmFtZSgpKS0+c2VsZWN0KGdldE9wZXJhbmQoKSA9IHNlbGZPcGVyYW5kKS0+c2l6ZSgpPTE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iR2F0ZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTWVzc2FnZUVuZCIvPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iR2F0ZS1pc091dHNpZGVDRiIgbmFtZT0iaXNPdXRzaWRlQ0YiIGJvZHlDb25kaXRpb249IkdhdGUtaXNPdXRzaWRlQ0Ytc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJHYXRlLWlzT3V0c2lkZUNGLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2F0ZS1pc091dHNpZGVDRiI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBxdWVyeSByZXR1cm5zIHRydWUgaWYgdGhpcyBHYXRlIGlzIGF0dGFjaGVkIHRvIHRoZSBib3VuZGFyeSBvZiBhIENvbWJpbmVkRnJhZ21lbnQsIGFuZCBpdHMgb3RoZXIgZW5kIChpZiBwcmVzZW50KSAgaXMgb3V0c2lkZSBvZiB0aGUgc2FtZSBDb21iaW5lZEZyYWdtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJHYXRlLWlzT3V0c2lkZUNGLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iR2F0ZS1pc091dHNpZGVDRiI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkdhdGUtaXNPdXRzaWRlQ0Ytc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChzZWxmLm9wcG9zaXRlRW5kKCktPiBub3RFbXB0eSgpIGFuZCBjb21iaW5lZEZyYWdtZW50LT5ub3RFbXB0eSgpIGltcGxpZXMmI3hEOwotbGV0IG9wcEVuZCA6IE1lc3NhZ2VFbmQgPSBzZWxmLm9wcG9zaXRlRW5kKCktPmFzT3JkZXJlZFNldCgpLT5maXJzdCgpIGluJiN4RDsKLWlmIG9wcEVuZC5vY2xJc0tpbmRPZihNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24pICYjeEQ7Ci10aGVuIGxldCBvcHBNT1MgOiBNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gPSBvcHBFbmQub2NsQXNUeXBlKE1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbikmI3hEOwotaW4gIHNlbGYuY29tYmluZWRGcmFnbWVudC5lbmNsb3NpbmdJbnRlcmFjdGlvbi5vY2xBc1R5cGUoSW50ZXJhY3Rpb25GcmFnbWVudCktPmFzU2V0KCktPiYjeEQ7Ci0gICAgIHVuaW9uKHNlbGYuY29tYmluZWRGcmFnbWVudC5lbmNsb3NpbmdPcGVyYW5kLm9jbEFzVHlwZShJbnRlcmFjdGlvbkZyYWdtZW50KS0+YXNTZXQoKSkgPSYjeEQ7Ci0gICAgIG9wcE1PUy5lbmNsb3NpbmdJbnRlcmFjdGlvbi5vY2xBc1R5cGUoSW50ZXJhY3Rpb25GcmFnbWVudCktPmFzU2V0KCktPiYjeEQ7Ci0gICAgIHVuaW9uKG9wcE1PUy5lbmNsb3NpbmdPcGVyYW5kLm9jbEFzVHlwZShJbnRlcmFjdGlvbkZyYWdtZW50KS0+YXNTZXQoKSkmI3hEOwotZWxzZSBsZXQgb3BwR2F0ZSA6IEdhdGUgPSBvcHBFbmQub2NsQXNUeXBlKEdhdGUpICYjeEQ7Ci1pbiBzZWxmLmNvbWJpbmVkRnJhZ21lbnQuZW5jbG9zaW5nSW50ZXJhY3Rpb24ub2NsQXNUeXBlKEludGVyYWN0aW9uRnJhZ21lbnQpLT5hc1NldCgpLT4mI3hEOwotICAgICB1bmlvbihzZWxmLmNvbWJpbmVkRnJhZ21lbnQuZW5jbG9zaW5nT3BlcmFuZC5vY2xBc1R5cGUoSW50ZXJhY3Rpb25GcmFnbWVudCktPmFzU2V0KCkpID0mI3hEOwotICAgICBvcHBHYXRlLmNvbWJpbmVkRnJhZ21lbnQuZW5jbG9zaW5nSW50ZXJhY3Rpb24ub2NsQXNUeXBlKEludGVyYWN0aW9uRnJhZ21lbnQpLT5hc1NldCgpLT4mI3hEOwotICAgICB1bmlvbihvcHBHYXRlLmNvbWJpbmVkRnJhZ21lbnQuZW5jbG9zaW5nT3BlcmFuZC5vY2xBc1R5cGUoSW50ZXJhY3Rpb25GcmFnbWVudCktPmFzU2V0KCkpJiN4RDsKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJHYXRlLWlzT3V0c2lkZUNGLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkdhdGUtaXNJbnNpZGVDRiIgbmFtZT0iaXNJbnNpZGVDRiIgYm9keUNvbmRpdGlvbj0iR2F0ZS1pc0luc2lkZUNGLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2F0ZS1pc0luc2lkZUNGLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2F0ZS1pc0luc2lkZUNGIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIHF1ZXJ5IHJldHVybnMgdHJ1ZSBpZiB0aGlzIEdhdGUgaXMgYXR0YWNoZWQgdG8gdGhlIGJvdW5kYXJ5IG9mIGEgQ29tYmluZWRGcmFnbWVudCwgYW5kIGl0cyBvdGhlciBlbmQgKGlmIHByZXNlbnQpIGlzIGluc2lkZSBvZiBhbiBJbnRlcmFjdGlvbk9wZXJhdG9yIG9mIHRoZSBzYW1lIENvbWJpbmVkRnJhZ21lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkdhdGUtaXNJbnNpZGVDRi1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkdhdGUtaXNJbnNpZGVDRiI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkdhdGUtaXNJbnNpZGVDRi1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHNlbGYub3Bwb3NpdGVFbmQoKS0+IG5vdEVtcHR5KCkgYW5kIGNvbWJpbmVkRnJhZ21lbnQtPm5vdEVtcHR5KCkgaW1wbGllcyYjeEQ7Ci1sZXQgb3BwRW5kIDogTWVzc2FnZUVuZCA9IHNlbGYub3Bwb3NpdGVFbmQoKS0+YXNPcmRlcmVkU2V0KCktPmZpcnN0KCkgaW4mI3hEOwotaWYgb3BwRW5kLm9jbElzS2luZE9mKE1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbikmI3hEOwotdGhlbiBsZXQgb3BwTU9TIDogTWVzc2FnZU9jY3VycmVuY2VTcGVjaWZpY2F0aW9uJiN4RDsKLT0gb3BwRW5kLm9jbEFzVHlwZShNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24pJiN4RDsKLWluIGNvbWJpbmVkRnJhZ21lbnQgPSBvcHBNT1MuZW5jbG9zaW5nT3BlcmFuZC5jb21iaW5lZEZyYWdtZW50JiN4RDsKLWVsc2UgbGV0IG9wcEdhdGUgOiBHYXRlID0gb3BwRW5kLm9jbEFzVHlwZShHYXRlKSYjeEQ7Ci1pbiBjb21iaW5lZEZyYWdtZW50ID0gb3BwR2F0ZS5jb21iaW5lZEZyYWdtZW50LmVuY2xvc2luZ09wZXJhbmQuY29tYmluZWRGcmFnbWVudCYjeEQ7Ci1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iR2F0ZS1pc0luc2lkZUNGLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkdhdGUtaXNBY3R1YWwiIG5hbWU9ImlzQWN0dWFsIiBib2R5Q29uZGl0aW9uPSJHYXRlLWlzQWN0dWFsLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2F0ZS1pc0FjdHVhbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkdhdGUtaXNBY3R1YWwiPgotICAgICAgICAgIDxib2R5PlRoaXMgcXVlcnkgcmV0dXJucyB0cnVlIHZhbHVlIGlmIHRoaXMgR2F0ZSBpcyBhbiBhY3R1YWxHYXRlIG9mIGFuIEludGVyYWN0aW9uVXNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJHYXRlLWlzQWN0dWFsLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iR2F0ZS1pc0FjdHVhbCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkdhdGUtaXNBY3R1YWwtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpbnRlcmFjdGlvblVzZS0+bm90RW1wdHkoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iR2F0ZS1pc0FjdHVhbC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJHYXRlLWlzRm9ybWFsIiBuYW1lPSJpc0Zvcm1hbCIgYm9keUNvbmRpdGlvbj0iR2F0ZS1pc0Zvcm1hbC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkdhdGUtaXNGb3JtYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJHYXRlLWlzRm9ybWFsIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIHF1ZXJ5IHJldHVybnMgdHJ1ZSBpZiB0aGlzIEdhdGUgaXMgYSBmb3JtYWxHYXRlIG9mIGFuIEludGVyYWN0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJHYXRlLWlzRm9ybWFsLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iR2F0ZS1pc0Zvcm1hbCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkdhdGUtaXNGb3JtYWwtc3BlYy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkdhdGUtaXNGb3JtYWwtc3BlYyI+Ci0gICAgICAgICAgICA8Ym9keT4mbHQ7cD5pbnRlcmFjdGlvbi0mYW1wO2d0O25vdEVtcHR5KCkmbHQ7L3A+PC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJHYXRlLWlzRm9ybWFsLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaW50ZXJhY3Rpb24tPm5vdEVtcHR5KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkdhdGUtaXNGb3JtYWwtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iR2F0ZS1nZXROYW1lIiBuYW1lPSJnZXROYW1lIiBib2R5Q29uZGl0aW9uPSJHYXRlLWdldE5hbWUtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJHYXRlLWdldE5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJHYXRlLWdldE5hbWUiPgotICAgICAgICAgIDxib2R5PlRoaXMgcXVlcnkgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZ2F0ZSwgZWl0aGVyIHRoZSBleHBsaWNpdCBuYW1lICgubmFtZSkgb3IgdGhlIGNvbnN0cnVjdGVkIG5hbWUgKCdvdXRfJnF1b3Q7IG9yICdpbl8nIGNvbmNhdGVuYXRlZCBpbiBmcm9udCBvZiAubWVzc2FnZS5uYW1lKSBpZiB0aGUgZXhwbGljaXQgbmFtZSBpcyBub3QgcHJlc2VudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iR2F0ZS1nZXROYW1lLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iR2F0ZS1nZXROYW1lIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iR2F0ZS1nZXROYW1lLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgbmFtZS0+bm90RW1wdHkoKSB0aGVuIG5hbWUtPmFzT3JkZXJlZFNldCgpLT5maXJzdCgpJiN4RDsKLWVsc2UgIGlmIGlzQWN0dWFsKCkgb3IgaXNPdXRzaWRlQ0YoKSAmI3hEOwotICB0aGVuIGlmIGlzU2VuZCgpICYjeEQ7Ci0gICAgdGhlbiAnb3V0XycuY29uY2F0KHNlbGYubWVzc2FnZS5uYW1lLT5hc09yZGVyZWRTZXQoKS0+Zmlyc3QoKSkmI3hEOwotICAgIGVsc2UgJ2luXycuY29uY2F0KHNlbGYubWVzc2FnZS5uYW1lLT5hc09yZGVyZWRTZXQoKS0+Zmlyc3QoKSkmI3hEOwotICAgIGVuZGlmJiN4RDsKLSAgZWxzZSBpZiBpc1NlbmQoKSYjeEQ7Ci0gICAgdGhlbiAnaW5fJy5jb25jYXQoc2VsZi5tZXNzYWdlLm5hbWUtPmFzT3JkZXJlZFNldCgpLT5maXJzdCgpKSYjeEQ7Ci0gICAgZWxzZSAnb3V0XycuY29uY2F0KHNlbGYubWVzc2FnZS5uYW1lLT5hc09yZGVyZWRTZXQoKS0+Zmlyc3QoKSkmI3hEOwotICAgIGVuZGlmJiN4RDsKLSAgZW5kaWYmI3hEOwotZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkdhdGUtZ2V0TmFtZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkdhdGUtbWF0Y2hlcyIgbmFtZT0ibWF0Y2hlcyIgYm9keUNvbmRpdGlvbj0iR2F0ZS1tYXRjaGVzLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2F0ZS1tYXRjaGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2F0ZS1tYXRjaGVzIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIHF1ZXJ5IHJldHVybnMgdHJ1ZSBpZiB0aGUgbmFtZSBvZiB0aGlzIEdhdGUgbWF0Y2hlcyB0aGUgbmFtZSBvZiB0aGUgaW4gcGFyYW1ldGVyIEdhdGUsIGFuZCB0aGUgbWVzc2FnZXMgZm9yIHRoZSB0d28gR2F0ZXMgY29ycmVzcG9uZC4gVGhlIE1lc3NhZ2UgZm9yIG9uZSBHYXRlIChzYXkgQSkgY29ycmVzcG9uZHMgdG8gdGhlIE1lc3NhZ2UgZm9yIGFub3RoZXIgR2F0ZSAoc2F5IEIpIGlmIChBIGFuZCBCIGhhdmUgdGhlIHNhbWUgbmFtZSB2YWx1ZSkgYW5kIChpZiBBIGlzIGEgc2VuZEV2ZW50IHRoZW4gQiBpcyBhIHJlY2VpdmVFdmVudCkgYW5kIChpZiBBIGlzIGEgcmVjZWl2ZUV2ZW50IHRoZW4gQiBpcyBhIHNlbmRFdmVudCkgYW5kIChBIGFuZCBCIGhhdmUgdGhlIHNhbWUgbWVzc2FnZVNvcnQgdmFsdWUpIGFuZCAoQSBhbmQgQiBoYXZlIHRoZSBzYW1lIHNpZ25hdHVyZSB2YWx1ZSkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkdhdGUtbWF0Y2hlcy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkdhdGUtbWF0Y2hlcyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkdhdGUtbWF0Y2hlcy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHNlbGYuZ2V0TmFtZSgpID0gZ2F0ZVRvTWF0Y2guZ2V0TmFtZSgpIGFuZCAmI3hEOwotc2VsZi5tZXNzYWdlLm1lc3NhZ2VTb3J0ID0gZ2F0ZVRvTWF0Y2gubWVzc2FnZS5tZXNzYWdlU29ydCBhbmQmI3hEOwotc2VsZi5tZXNzYWdlLm5hbWUgPSBnYXRlVG9NYXRjaC5tZXNzYWdlLm5hbWUgYW5kJiN4RDsKLXNlbGYubWVzc2FnZS5zZW5kRXZlbnQtPmluY2x1ZGVzKHNlbGYpIGltcGxpZXMgZ2F0ZVRvTWF0Y2gubWVzc2FnZS5yZWNlaXZlRXZlbnQtPmluY2x1ZGVzKGdhdGVUb01hdGNoKSAgYW5kJiN4RDsKLXNlbGYubWVzc2FnZS5yZWNlaXZlRXZlbnQtPmluY2x1ZGVzKHNlbGYpIGltcGxpZXMgZ2F0ZVRvTWF0Y2gubWVzc2FnZS5zZW5kRXZlbnQtPmluY2x1ZGVzKGdhdGVUb01hdGNoKSBhbmQmI3hEOwotc2VsZi5tZXNzYWdlLnNpZ25hdHVyZSA9IGdhdGVUb01hdGNoLm1lc3NhZ2Uuc2lnbmF0dXJlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJHYXRlLW1hdGNoZXMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkdhdGUtbWF0Y2hlcy1nYXRlVG9NYXRjaCIgbmFtZT0iZ2F0ZVRvTWF0Y2giIHR5cGU9IkdhdGUiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJHYXRlLWlzRGlzdGluZ3Vpc2hhYmxlRnJvbSIgbmFtZT0iaXNEaXN0aW5ndWlzaGFibGVGcm9tIiBib2R5Q29uZGl0aW9uPSJHYXRlLWlzRGlzdGluZ3Vpc2hhYmxlRnJvbS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249Ik5hbWVkRWxlbWVudC1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2F0ZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJHYXRlLWlzRGlzdGluZ3Vpc2hhYmxlRnJvbSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzRGlzdGluZ3Vpc2hhYmxlRnJvbSgpIHNwZWNpZmllcyB0aGF0IHR3byBHYXRlcyBtYXkgY29leGlzdCBpbiB0aGUgc2FtZSBOYW1lc3BhY2UsIHdpdGhvdXQgYW4gZXhwbGljaXQgbmFtZSBwcm9wZXJ0eS4gVGhlIGFzc29jaWF0aW9uIGVuZCBmb3JtYWxHYXRlIHN1YnNldHMgb3duZWRFbGVtZW50LCBhbmQgc2luY2UgdGhlIEdhdGUgbmFtZSBhdHRyaWJ1dGUmI3hEOwotaXMgb3B0aW9uYWwsIGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSB0d28gZm9ybWFsIGdhdGVzIHdpdGhvdXQgYW4gZXhwbGljaXQgbmFtZSwgYnV0IGhhdmluZyBkZXJpdmVkIG5hbWVzIHdoaWNoIGFyZSBkaXN0aW5jdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iR2F0ZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJHYXRlLWlzRGlzdGluZ3Vpc2hhYmxlRnJvbSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkdhdGUtaXNEaXN0aW5ndWlzaGFibGVGcm9tLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAodHJ1ZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iR2F0ZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkdhdGUtaXNEaXN0aW5ndWlzaGFibGVGcm9tLW4iIG5hbWU9Im4iIHR5cGU9Ik5hbWVkRWxlbWVudCIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJHYXRlLWlzRGlzdGluZ3Vpc2hhYmxlRnJvbS1ucyIgbmFtZT0ibnMiIHR5cGU9Ik5hbWVzcGFjZSIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkdhdGUtZ2V0T3BlcmFuZCIgbmFtZT0iZ2V0T3BlcmFuZCIgYm9keUNvbmRpdGlvbj0iR2F0ZS1nZXRPcGVyYW5kLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2F0ZS1nZXRPcGVyYW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2F0ZS1nZXRPcGVyYW5kIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgR2F0ZSBpcyBhbiBpbnNpZGUgQ29tYmluZWQgRnJhZ21lbnQgR2F0ZSwgdGhpcyBvcGVyYXRpb24gcmV0dXJucyB0aGUgSW50ZXJhY3Rpb25PcGVyYW5kIHRoYXQgdGhlIG9wcG9zaXRlIGVuZCBvZiB0aGlzIEdhdGUgaXMgaW5jbHVkZWQgd2l0aGluLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJHYXRlLWdldE9wZXJhbmQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJHYXRlLWdldE9wZXJhbmQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJHYXRlLWdldE9wZXJhbmQtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBpc0luc2lkZUNGKCkgdGhlbiYjeEQ7Ci0gIGxldCBvcHBFbmQgOiBNZXNzYWdlRW5kID0gc2VsZi5vcHBvc2l0ZUVuZCgpLT5hc09yZGVyZWRTZXQoKS0+Zmlyc3QoKSBpbiYjeEQ7Ci0gICAgaWYgb3BwRW5kLm9jbElzS2luZE9mKE1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbikmI3hEOwotICAgIHRoZW4gbGV0IG9wcE1PUyA6IE1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiA9IG9wcEVuZC5vY2xBc1R5cGUoTWVzc2FnZU9jY3VycmVuY2VTcGVjaWZpY2F0aW9uKSYjeEQ7Ci0gICAgICAgIGluIG9wcE1PUy5lbmNsb3NpbmdPcGVyYW5kLT5hc09yZGVyZWRTZXQoKS0+Zmlyc3QoKSYjeEQ7Ci0gICAgZWxzZSBsZXQgb3BwR2F0ZSA6IEdhdGUgPSBvcHBFbmQub2NsQXNUeXBlKEdhdGUpJiN4RDsKLSAgICAgICAgaW4gb3BwR2F0ZS5jb21iaW5lZEZyYWdtZW50LmVuY2xvc2luZ09wZXJhbmQtPmFzT3JkZXJlZFNldCgpLT5maXJzdCgpJiN4RDsKLSAgICBlbmRpZiYjeEQ7Ci0gIGVsc2UgbnVsbCYjeEQ7Ci1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iR2F0ZS1nZXRPcGVyYW5kLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJJbnRlcmFjdGlvbk9wZXJhbmQiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJHZW5lcmFsT3JkZXJpbmciIG5hbWU9IkdlbmVyYWxPcmRlcmluZyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2VuZXJhbE9yZGVyaW5nLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2VuZXJhbE9yZGVyaW5nIj4KLSAgICAgICAgPGJvZHk+QSBHZW5lcmFsT3JkZXJpbmcgcmVwcmVzZW50cyBhIGJpbmFyeSByZWxhdGlvbiBiZXR3ZWVuIHR3byBPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbnMsIHRvIGRlc2NyaWJlIHRoYXQgb25lIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIG11c3Qgb2NjdXIgYmVmb3JlIHRoZSBvdGhlciBpbiBhIHZhbGlkIHRyYWNlLiBUaGlzIG1lY2hhbmlzbSBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkZWZpbmUgcGFydGlhbCBvcmRlcnMgb2YgT2NjdXJyZW5jZVNwZWNpZmljYXRpb25zIHRoYXQgbWF5IG90aGVyd2lzZSBub3QgaGF2ZSBhIHNwZWNpZmllZCBvcmRlci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJHZW5lcmFsT3JkZXJpbmctaXJyZWZsZXhpdmVfdHJhbnNpdGl2ZV9jbG9zdXJlIiBuYW1lPSJpcnJlZmxleGl2ZV90cmFuc2l0aXZlX2Nsb3N1cmUiIGNvbnN0cmFpbmVkRWxlbWVudD0iR2VuZXJhbE9yZGVyaW5nIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkdlbmVyYWxPcmRlcmluZy1pcnJlZmxleGl2ZV90cmFuc2l0aXZlX2Nsb3N1cmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJHZW5lcmFsT3JkZXJpbmctaXJyZWZsZXhpdmVfdHJhbnNpdGl2ZV9jbG9zdXJlIj4KLSAgICAgICAgICA8Ym9keT5BbiBvY2N1cnJlbmNlIHNwZWNpZmljYXRpb24gbXVzdCBub3QgYmUgb3JkZXJlZCByZWxhdGl2ZSB0byBpdHNlbGYgdGhyb3VnaCBhIHNlcmllcyBvZiBnZW5lcmFsIG9yZGVyaW5ncy4gKEluIG90aGVyIHdvcmRzLCB0aGUgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIHRoZSBnZW5lcmFsIG9yZGVyaW5ncyBpcyBpcnJlZmxleGl2ZS4pPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkdlbmVyYWxPcmRlcmluZy1pcnJlZmxleGl2ZV90cmFuc2l0aXZlX2Nsb3N1cmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmFmdGVyLT5jbG9zdXJlKHRvQWZ0ZXIuYWZ0ZXIpLT5leGNsdWRlcyhiZWZvcmUpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkdlbmVyYWxPcmRlcmluZy1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTmFtZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJHZW5lcmFsT3JkZXJpbmctYWZ0ZXIiIG5hbWU9ImFmdGVyIiB0eXBlPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiIgYXNzb2NpYXRpb249IkFfdG9CZWZvcmVfYWZ0ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iR2VuZXJhbE9yZGVyaW5nLWFmdGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2VuZXJhbE9yZGVyaW5nLWFmdGVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gcmVmZXJlbmNlZCBjb21lcyBhZnRlciB0aGUgT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gcmVmZXJlbmNlZCBieSBiZWZvcmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJHZW5lcmFsT3JkZXJpbmctYmVmb3JlIiBuYW1lPSJiZWZvcmUiIHR5cGU9Ik9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIiBhc3NvY2lhdGlvbj0iQV9iZWZvcmVfdG9BZnRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJHZW5lcmFsT3JkZXJpbmctYmVmb3JlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iR2VuZXJhbE9yZGVyaW5nLWJlZm9yZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIHJlZmVyZW5jZWQgY29tZXMgYmVmb3JlIHRoZSBPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiByZWZlcmVuY2VkIGJ5IGFmdGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJJbnRlcmFjdGlvbiIgbmFtZT0iSW50ZXJhY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb24iPgotICAgICAgICA8Ym9keT5BbiBJbnRlcmFjdGlvbiBpcyBhIHVuaXQgb2YgQmVoYXZpb3IgdGhhdCBmb2N1c2VzIG9uIHRoZSBvYnNlcnZhYmxlIGV4Y2hhbmdlIG9mIGluZm9ybWF0aW9uIGJldHdlZW4gY29ubmVjdGFibGUgZWxlbWVudHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW50ZXJhY3Rpb24tbm90X2NvbnRhaW5lZCIgbmFtZT0ibm90X2NvbnRhaW5lZCIgY29uc3RyYWluZWRFbGVtZW50PSJJbnRlcmFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbi1ub3RfY29udGFpbmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb24tbm90X2NvbnRhaW5lZCI+Ci0gICAgICAgICAgPGJvZHk+QW4gSW50ZXJhY3Rpb24gaW5zdGFuY2UgbXVzdCBub3QgYmUgY29udGFpbmVkIHdpdGhpbiBhbm90aGVyIEludGVyYWN0aW9uIGluc3RhbmNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbnRlcmFjdGlvbi1ub3RfY29udGFpbmVkLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lbmNsb3NpbmdJbnRlcmFjdGlvbi0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkludGVyYWN0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJJbnRlcmFjdGlvbkZyYWdtZW50Ii8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJJbnRlcmFjdGlvbi1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iQmVoYXZpb3IiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVyYWN0aW9uLWFjdGlvbiIgbmFtZT0iYWN0aW9uIiB0eXBlPSJBY3Rpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfYWN0aW9uX2ludGVyYWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uLWFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uLWFjdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+QWN0aW9ucyBvd25lZCBieSB0aGUgSW50ZXJhY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnRlcmFjdGlvbi1hY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJJbnRlcmFjdGlvbi1hY3Rpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW50ZXJhY3Rpb24tZm9ybWFsR2F0ZSIgbmFtZT0iZm9ybWFsR2F0ZSIgdHlwZT0iR2F0ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfZm9ybWFsR2F0ZV9pbnRlcmFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbi1mb3JtYWxHYXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb24tZm9ybWFsR2F0ZSI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBnYXRlcyB0aGF0IGZvcm0gdGhlIG1lc3NhZ2UgaW50ZXJmYWNlIGJldHdlZW4gdGhpcyBJbnRlcmFjdGlvbiBhbmQgYW55IEludGVyYWN0aW9uVXNlcyB3aGljaCByZWZlcmVuY2UgaXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnRlcmFjdGlvbi1mb3JtYWxHYXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW50ZXJhY3Rpb24tZm9ybWFsR2F0ZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnRlcmFjdGlvbi1mcmFnbWVudCIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9IkludGVyYWN0aW9uRnJhZ21lbnQiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfZnJhZ21lbnRfZW5jbG9zaW5nSW50ZXJhY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb24tZnJhZ21lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbi1mcmFnbWVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG9yZGVyZWQgc2V0IG9mIGZyYWdtZW50cyBpbiB0aGUgSW50ZXJhY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnRlcmFjdGlvbi1mcmFnbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkludGVyYWN0aW9uLWZyYWdtZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVyYWN0aW9uLWxpZmVsaW5lIiBuYW1lPSJsaWZlbGluZSIgdHlwZT0iTGlmZWxpbmUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX2xpZmVsaW5lX2ludGVyYWN0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uLWxpZmVsaW5lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb24tbGlmZWxpbmUiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB0aGUgcGFydGljaXBhbnRzIGluIHRoaXMgSW50ZXJhY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnRlcmFjdGlvbi1saWZlbGluZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkludGVyYWN0aW9uLWxpZmVsaW5lLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVyYWN0aW9uLW1lc3NhZ2UiIG5hbWU9Im1lc3NhZ2UiIHR5cGU9Ik1lc3NhZ2UiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX21lc3NhZ2VfaW50ZXJhY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb24tbWVzc2FnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uLW1lc3NhZ2UiPgotICAgICAgICAgIDxib2R5PlRoZSBNZXNzYWdlcyBjb250YWluZWQgaW4gdGhpcyBJbnRlcmFjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyYWN0aW9uLW1lc3NhZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJJbnRlcmFjdGlvbi1tZXNzYWdlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iSW50ZXJhY3Rpb25Db25zdHJhaW50IiBuYW1lPSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uQ29uc3RyYWludCI+Ci0gICAgICAgIDxib2R5PkFuIEludGVyYWN0aW9uQ29uc3RyYWludCBpcyBhIEJvb2xlYW4gZXhwcmVzc2lvbiB0aGF0IGd1YXJkcyBhbiBvcGVyYW5kIGluIGEgQ29tYmluZWRGcmFnbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQtbWluaW50X21heGludCIgbmFtZT0ibWluaW50X21heGludCIgY29uc3RyYWluZWRFbGVtZW50PSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25Db25zdHJhaW50LW1pbmludF9tYXhpbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQtbWluaW50X21heGludCI+Ci0gICAgICAgICAgPGJvZHk+TWluaW50L21heGludCBjYW4gb25seSBiZSBwcmVzZW50IGlmIHRoZSBJbnRlcmFjdGlvbkNvbnN0cmFpbnQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGVyYW5kIG9mIGEgbG9vcCBDb21iaW5lZEZyYWdtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQtbWluaW50X21heGludC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bWF4aW50LT5ub3RFbXB0eSgpIG9yIG1pbmludC0+bm90RW1wdHkoKSBpbXBsaWVzJiN4RDsKLWludGVyYWN0aW9uT3BlcmFuZC5jb21iaW5lZEZyYWdtZW50LmludGVyYWN0aW9uT3BlcmF0b3IgPSYjeEQ7Ci1JbnRlcmFjdGlvbk9wZXJhdG9yS2luZDo6bG9vcDwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW50ZXJhY3Rpb25Db25zdHJhaW50LW1pbmludF9ub25fbmVnYXRpdmUiIG5hbWU9Im1pbmludF9ub25fbmVnYXRpdmUiIGNvbnN0cmFpbmVkRWxlbWVudD0iSW50ZXJhY3Rpb25Db25zdHJhaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1taW5pbnRfbm9uX25lZ2F0aXZlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb25Db25zdHJhaW50LW1pbmludF9ub25fbmVnYXRpdmUiPgotICAgICAgICAgIDxib2R5PklmIG1pbmludCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQtbWluaW50X25vbl9uZWdhdGl2ZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bWluaW50LT5ub3RFbXB0eSgpIGltcGxpZXMgJiN4RDsKLW1pbmludC0+YXNTZXF1ZW5jZSgpLT5maXJzdCgpLmludGVnZXJWYWx1ZSgpID49IDA8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1tYXhpbnRfcG9zaXRpdmUiIG5hbWU9Im1heGludF9wb3NpdGl2ZSIgY29uc3RyYWluZWRFbGVtZW50PSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25Db25zdHJhaW50LW1heGludF9wb3NpdGl2ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1tYXhpbnRfcG9zaXRpdmUiPgotICAgICAgICAgIDxib2R5PklmIG1heGludCBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhIHBvc2l0aXZlIGludGVnZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1tYXhpbnRfcG9zaXRpdmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm1heGludC0+bm90RW1wdHkoKSBpbXBsaWVzICYjeEQ7Ci1tYXhpbnQtPmFzU2VxdWVuY2UoKS0+Zmlyc3QoKS5pbnRlZ2VyVmFsdWUoKSA+IDA8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1keW5hbWljX3ZhcmlhYmxlcyIgbmFtZT0iZHluYW1pY192YXJpYWJsZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iSW50ZXJhY3Rpb25Db25zdHJhaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1keW5hbWljX3ZhcmlhYmxlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1keW5hbWljX3ZhcmlhYmxlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGR5bmFtaWMgdmFyaWFibGVzIHRoYXQgdGFrZSBwYXJ0IGluIHRoZSBjb25zdHJhaW50IG11c3QgYmUgb3duZWQgYnkgdGhlIENvbm5lY3RhYmxlRWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb3ZlcmVkIExpZmVsaW5lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQtZHluYW1pY192YXJpYWJsZXMtX3NwZWNpZmljYXRpb24iIGxhbmd1YWdlPSIiLz4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1nbG9iYWxfZGF0YSIgbmFtZT0iZ2xvYmFsX2RhdGEiIGNvbnN0cmFpbmVkRWxlbWVudD0iSW50ZXJhY3Rpb25Db25zdHJhaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1nbG9iYWxfZGF0YS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1nbG9iYWxfZGF0YSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGNvbnN0cmFpbnQgbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBnbG9iYWwgZGF0YSBvciB3cml0ZS1vbmNlIGRhdGEuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1nbG9iYWxfZGF0YS1fc3BlY2lmaWNhdGlvbiIgbGFuZ3VhZ2U9IiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW50ZXJhY3Rpb25Db25zdHJhaW50LW1heGludF9ncmVhdGVyX2VxdWFsX21pbmludCIgbmFtZT0ibWF4aW50X2dyZWF0ZXJfZXF1YWxfbWluaW50IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkludGVyYWN0aW9uQ29uc3RyYWludCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQtbWF4aW50X2dyZWF0ZXJfZXF1YWxfbWluaW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb25Db25zdHJhaW50LW1heGludF9ncmVhdGVyX2VxdWFsX21pbmludCI+Ci0gICAgICAgICAgPGJvZHk+SWYgbWF4aW50IGlzIHNwZWNpZmllZCwgdGhlbiBtaW5pbnQgbXVzdCBiZSBzcGVjaWZpZWQgYW5kIHRoZSBldmFsdWF0aW9uIG9mIG1heGludCBtdXN0IGJlID49IHRoZSBldmFsdWF0aW9uIG9mIG1pbmludC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW50ZXJhY3Rpb25Db25zdHJhaW50LW1heGludF9ncmVhdGVyX2VxdWFsX21pbmludC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bWF4aW50LT5ub3RFbXB0eSgpIGltcGxpZXMgKG1pbmludC0+bm90RW1wdHkoKSBhbmQgJiN4RDsKLW1heGludC0+YXNTZXF1ZW5jZSgpLT5maXJzdCgpLmludGVnZXJWYWx1ZSgpID49JiN4RDsKLW1pbmludC0+YXNTZXF1ZW5jZSgpLT5maXJzdCgpLmludGVnZXJWYWx1ZSgpICk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iSW50ZXJhY3Rpb25Db25zdHJhaW50LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJDb25zdHJhaW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQtbWF4aW50IiBuYW1lPSJtYXhpbnQiIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9tYXhpbnRfaW50ZXJhY3Rpb25Db25zdHJhaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1tYXhpbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQtbWF4aW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBvZiBhIGxvb3A8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1tYXhpbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQtbWluaW50IiBuYW1lPSJtaW5pbnQiIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9taW5pbnRfaW50ZXJhY3Rpb25Db25zdHJhaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1taW5pbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQtbWluaW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbWluaW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBvZiBhIGxvb3A8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1taW5pbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkludGVyYWN0aW9uRnJhZ21lbnQiIG5hbWU9IkludGVyYWN0aW9uRnJhZ21lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uRnJhZ21lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbkZyYWdtZW50Ij4KLSAgICAgICAgPGJvZHk+SW50ZXJhY3Rpb25GcmFnbWVudCBpcyBhbiBhYnN0cmFjdCBub3Rpb24gb2YgdGhlIG1vc3QgZ2VuZXJhbCBpbnRlcmFjdGlvbiB1bml0LiBBbiBJbnRlcmFjdGlvbkZyYWdtZW50IGlzIGEgcGllY2Ugb2YgYW4gSW50ZXJhY3Rpb24uIEVhY2ggSW50ZXJhY3Rpb25GcmFnbWVudCBpcyBjb25jZXB0dWFsbHkgbGlrZSBhbiBJbnRlcmFjdGlvbiBieSBpdHNlbGYuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJJbnRlcmFjdGlvbkZyYWdtZW50LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVyYWN0aW9uRnJhZ21lbnQtY292ZXJlZCIgbmFtZT0iY292ZXJlZCIgdHlwZT0iTGlmZWxpbmUiIGFzc29jaWF0aW9uPSJBX2NvdmVyZWRfY292ZXJlZEJ5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uRnJhZ21lbnQtY292ZXJlZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uRnJhZ21lbnQtY292ZXJlZCI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgTGlmZWxpbmVzIHRoYXQgdGhlIEludGVyYWN0aW9uRnJhZ21lbnQgaW52b2x2ZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnRlcmFjdGlvbkZyYWdtZW50LWNvdmVyZWQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJJbnRlcmFjdGlvbkZyYWdtZW50LWNvdmVyZWQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW50ZXJhY3Rpb25GcmFnbWVudC1lbmNsb3NpbmdJbnRlcmFjdGlvbiIgbmFtZT0iZW5jbG9zaW5nSW50ZXJhY3Rpb24iIHR5cGU9IkludGVyYWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfZnJhZ21lbnRfZW5jbG9zaW5nSW50ZXJhY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25GcmFnbWVudC1lbmNsb3NpbmdJbnRlcmFjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uRnJhZ21lbnQtZW5jbG9zaW5nSW50ZXJhY3Rpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBJbnRlcmFjdGlvbiBlbmNsb3NpbmcgdGhpcyBJbnRlcmFjdGlvbkZyYWdtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJhY3Rpb25GcmFnbWVudC1lbmNsb3NpbmdJbnRlcmFjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVyYWN0aW9uRnJhZ21lbnQtZW5jbG9zaW5nT3BlcmFuZCIgbmFtZT0iZW5jbG9zaW5nT3BlcmFuZCIgdHlwZT0iSW50ZXJhY3Rpb25PcGVyYW5kIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfZnJhZ21lbnRfZW5jbG9zaW5nT3BlcmFuZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbkZyYWdtZW50LWVuY2xvc2luZ09wZXJhbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbkZyYWdtZW50LWVuY2xvc2luZ09wZXJhbmQiPgotICAgICAgICAgIDxib2R5PlRoZSBvcGVyYW5kIGVuY2xvc2luZyB0aGlzIEludGVyYWN0aW9uRnJhZ21lbnQgKHRoZXkgbWF5IG5lc3QgcmVjdXJzaXZlbHkpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJhY3Rpb25GcmFnbWVudC1lbmNsb3NpbmdPcGVyYW5kLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW50ZXJhY3Rpb25GcmFnbWVudC1nZW5lcmFsT3JkZXJpbmciIG5hbWU9ImdlbmVyYWxPcmRlcmluZyIgdHlwZT0iR2VuZXJhbE9yZGVyaW5nIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2dlbmVyYWxPcmRlcmluZ19pbnRlcmFjdGlvbkZyYWdtZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uRnJhZ21lbnQtZ2VuZXJhbE9yZGVyaW5nLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb25GcmFnbWVudC1nZW5lcmFsT3JkZXJpbmciPgotICAgICAgICAgIDxib2R5PlRoZSBnZW5lcmFsIG9yZGVyaW5nIHJlbGF0aW9uc2hpcHMgY29udGFpbmVkIGluIHRoaXMgZnJhZ21lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnRlcmFjdGlvbkZyYWdtZW50LWdlbmVyYWxPcmRlcmluZy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkludGVyYWN0aW9uRnJhZ21lbnQtZ2VuZXJhbE9yZGVyaW5nLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iSW50ZXJhY3Rpb25PcGVyYW5kIiBuYW1lPSJJbnRlcmFjdGlvbk9wZXJhbmQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmFuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmFuZCI+Ci0gICAgICAgIDxib2R5PkFuIEludGVyYWN0aW9uT3BlcmFuZCBpcyBjb250YWluZWQgaW4gYSBDb21iaW5lZEZyYWdtZW50LiBBbiBJbnRlcmFjdGlvbk9wZXJhbmQgcmVwcmVzZW50cyBvbmUgb3BlcmFuZCBvZiB0aGUgZXhwcmVzc2lvbiBnaXZlbiBieSB0aGUgZW5jbG9zaW5nIENvbWJpbmVkRnJhZ21lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW50ZXJhY3Rpb25PcGVyYW5kLWd1YXJkX2NvbnRhaW5fcmVmZXJlbmNlcyIgbmFtZT0iZ3VhcmRfY29udGFpbl9yZWZlcmVuY2VzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmFuZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhbmQtZ3VhcmRfY29udGFpbl9yZWZlcmVuY2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb25PcGVyYW5kLWd1YXJkX2NvbnRhaW5fcmVmZXJlbmNlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGd1YXJkIG11c3QgY29udGFpbiBvbmx5IHJlZmVyZW5jZXMgdG8gdmFsdWVzIGxvY2FsIHRvIHRoZSBMaWZlbGluZSBvbiB3aGljaCBpdCByZXNpZGVzLCBvciB2YWx1ZXMgZ2xvYmFsIHRvIHRoZSB3aG9sZSBJbnRlcmFjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW50ZXJhY3Rpb25PcGVyYW5kLWd1YXJkX2NvbnRhaW5fcmVmZXJlbmNlcy1fc3BlY2lmaWNhdGlvbiIgbGFuZ3VhZ2U9IiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW50ZXJhY3Rpb25PcGVyYW5kLWd1YXJkX2RpcmVjdGx5X3ByaW9yIiBuYW1lPSJndWFyZF9kaXJlY3RseV9wcmlvciIgY29uc3RyYWluZWRFbGVtZW50PSJJbnRlcmFjdGlvbk9wZXJhbmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25PcGVyYW5kLWd1YXJkX2RpcmVjdGx5X3ByaW9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb25PcGVyYW5kLWd1YXJkX2RpcmVjdGx5X3ByaW9yIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZ3VhcmQgbXVzdCBiZSBwbGFjZWQgZGlyZWN0bHkgcHJpb3IgdG8gKGFib3ZlKSB0aGUgT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gdGhhdCB3aWxsIGJlY29tZSB0aGUgZmlyc3QgT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gd2l0aGluIHRoaXMgSW50ZXJhY3Rpb25PcGVyYW5kLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhbmQtZ3VhcmRfZGlyZWN0bHlfcHJpb3ItX3NwZWNpZmljYXRpb24iIGxhbmd1YWdlPSIiLz4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iSW50ZXJhY3Rpb25PcGVyYW5kLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJJbnRlcmFjdGlvbkZyYWdtZW50Ii8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhbmQtX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9Ik5hbWVzcGFjZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW50ZXJhY3Rpb25PcGVyYW5kLWZyYWdtZW50IiBuYW1lPSJmcmFnbWVudCIgdHlwZT0iSW50ZXJhY3Rpb25GcmFnbWVudCIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9mcmFnbWVudF9lbmNsb3NpbmdPcGVyYW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmFuZC1mcmFnbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmFuZC1mcmFnbWVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGZyYWdtZW50cyBvZiB0aGUgb3BlcmFuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmFuZC1mcmFnbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmFuZC1mcmFnbWVudC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhbmQtZ3VhcmQiIG5hbWU9Imd1YXJkIiB0eXBlPSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfZ3VhcmRfaW50ZXJhY3Rpb25PcGVyYW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmFuZC1ndWFyZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmFuZC1ndWFyZCI+Ci0gICAgICAgICAgPGJvZHk+Q29uc3RyYWludCBvZiB0aGUgb3BlcmFuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmFuZC1ndWFyZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UiIG5hbWU9IkludGVyYWN0aW9uVXNlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvblVzZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uVXNlIj4KLSAgICAgICAgPGJvZHk+QW4gSW50ZXJhY3Rpb25Vc2UgcmVmZXJzIHRvIGFuIEludGVyYWN0aW9uLiBUaGUgSW50ZXJhY3Rpb25Vc2UgaXMgYSBzaG9ydGhhbmQgZm9yIGNvcHlpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWZlcmVuY2VkIEludGVyYWN0aW9uIHdoZXJlIHRoZSBJbnRlcmFjdGlvblVzZSBpcy4gVG8gYmUgYWNjdXJhdGUgdGhlIGNvcHlpbmcgbXVzdCB0YWtlIGludG8gYWNjb3VudCBzdWJzdGl0dXRpbmcgcGFyYW1ldGVycyB3aXRoIGFyZ3VtZW50cyBhbmQgY29ubmVjdCB0aGUgZm9ybWFsIEdhdGVzIHdpdGggdGhlIGFjdHVhbCBvbmVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLWdhdGVzX21hdGNoIiBuYW1lPSJnYXRlc19tYXRjaCIgY29uc3RyYWluZWRFbGVtZW50PSJJbnRlcmFjdGlvblVzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvblVzZS1nYXRlc19tYXRjaC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uVXNlLWdhdGVzX21hdGNoIj4KLSAgICAgICAgICA8Ym9keT5BY3R1YWwgR2F0ZXMgb2YgdGhlIEludGVyYWN0aW9uVXNlIG11c3QgbWF0Y2ggRm9ybWFsIEdhdGVzIG9mIHRoZSByZWZlcnJlZCBJbnRlcmFjdGlvbi4gR2F0ZXMgbWF0Y2ggd2hlbiB0aGVpciBuYW1lcyBhcmUgZXF1YWwgYW5kIHRoZWlyIG1lc3NhZ2VzIGNvcnJlc3BvbmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLWdhdGVzX21hdGNoLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5hY3R1YWxHYXRlLT5ub3RFbXB0eSgpIGltcGxpZXMgJiN4RDsKLXJlZmVyc1RvLmZvcm1hbEdhdGUtPmZvckFsbCggZmcgOiBHYXRlIHwgc2VsZi5hY3R1YWxHYXRlLT5zZWxlY3QobWF0Y2hlcyhmZykpLT5zaXplKCk9MSkgYW5kJiN4RDsKLXNlbGYuYWN0dWFsR2F0ZS0+Zm9yQWxsKGFnIDogR2F0ZSB8IHJlZmVyc1RvLmZvcm1hbEdhdGUtPnNlbGVjdChtYXRjaGVzKGFnKSktPnNpemUoKT0xKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtYXJndW1lbnRzX2FyZV9jb25zdGFudHMiIG5hbWU9ImFyZ3VtZW50c19hcmVfY29uc3RhbnRzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkludGVyYWN0aW9uVXNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLWFyZ3VtZW50c19hcmVfY29uc3RhbnRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb25Vc2UtYXJndW1lbnRzX2FyZV9jb25zdGFudHMiPgotICAgICAgICAgIDxib2R5PlRoZSBhcmd1bWVudHMgbXVzdCBvbmx5IGJlIGNvbnN0YW50cywgcGFyYW1ldGVycyBvZiB0aGUgZW5jbG9zaW5nIEludGVyYWN0aW9uIG9yIGF0dHJpYnV0ZXMgb2YgdGhlIGNsYXNzaWZpZXIgb3duaW5nIHRoZSBlbmNsb3NpbmcgSW50ZXJhY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLWFyZ3VtZW50c19hcmVfY29uc3RhbnRzLV9zcGVjaWZpY2F0aW9uIiBsYW5ndWFnZT0iIi8+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJJbnRlcmFjdGlvblVzZS1yZXR1cm5WYWx1ZVJlY2lwaWVudF9jb3ZlcmFnZSIgbmFtZT0icmV0dXJuVmFsdWVSZWNpcGllbnRfY292ZXJhZ2UiIGNvbnN0cmFpbmVkRWxlbWVudD0iSW50ZXJhY3Rpb25Vc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtcmV0dXJuVmFsdWVSZWNpcGllbnRfY292ZXJhZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvblVzZS1yZXR1cm5WYWx1ZVJlY2lwaWVudF9jb3ZlcmFnZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHJldHVyblZhbHVlUmVjaXBpZW50IG11c3QgYmUgYSBQcm9wZXJ0eSBvZiBhIENvbm5lY3RhYmxlRWxlbWVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IGEgTGlmZWxpbmUgY292ZXJlZCBieSB0aGlzIEludGVyYWN0aW9uVXNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbnRlcmFjdGlvblVzZS1yZXR1cm5WYWx1ZVJlY2lwaWVudF9jb3ZlcmFnZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmV0dXJuVmFsdWVSZWNpcGllbnQtPmFzU2V0KCktPm5vdEVtcHR5KCkgaW1wbGllcyYjeEQ7Ci1sZXQgY292Q0UgOiBTZXQoQ29ubmVjdGFibGVFbGVtZW50KSA9IGNvdmVyZWQucmVwcmVzZW50cy0+YXNTZXQoKSBpbiAmI3hEOwotY292Q0UtPm5vdEVtcHR5KCkgYW5kIGxldCBjbGFzc2VzOlNldChDbGFzc2lmaWVyKSA9IGNvdkNFLnR5cGUub2NsSXNLaW5kT2YoQ2xhc3NpZmllcikub2NsQXNUeXBlKENsYXNzaWZpZXIpLT5hc1NldCgpIGluICYjeEQ7Ci1sZXQgYWxsUHJvcHMgOiBTZXQoUHJvcGVydHkpID0gY2xhc3Nlcy5hdHRyaWJ1dGUtPnVuaW9uKGNsYXNzZXMuYWxsUGFyZW50cygpLmF0dHJpYnV0ZSktPmFzU2V0KCkgaW4gJiN4RDsKLWFsbFByb3BzLT5pbmNsdWRlcyhyZXR1cm5WYWx1ZVJlY2lwaWVudCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLWFyZ3VtZW50c19jb3JyZXNwb25kX3RvX3BhcmFtZXRlcnMiIG5hbWU9ImFyZ3VtZW50c19jb3JyZXNwb25kX3RvX3BhcmFtZXRlcnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iSW50ZXJhY3Rpb25Vc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtYXJndW1lbnRzX2NvcnJlc3BvbmRfdG9fcGFyYW1ldGVycy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uVXNlLWFyZ3VtZW50c19jb3JyZXNwb25kX3RvX3BhcmFtZXRlcnMiPgotICAgICAgICAgIDxib2R5PlRoZSBhcmd1bWVudHMgb2YgdGhlIEludGVyYWN0aW9uVXNlIG11c3QgY29ycmVzcG9uZCB0byBwYXJhbWV0ZXJzIG9mIHRoZSByZWZlcnJlZCBJbnRlcmFjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtYXJndW1lbnRzX2NvcnJlc3BvbmRfdG9fcGFyYW1ldGVycy1fc3BlY2lmaWNhdGlvbiIgbGFuZ3VhZ2U9IiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtcmV0dXJuVmFsdWVfdHlwZV9yZWNpcGllbnRfY29ycmVzcG9uZGVuY2UiIG5hbWU9InJldHVyblZhbHVlX3R5cGVfcmVjaXBpZW50X2NvcnJlc3BvbmRlbmNlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkludGVyYWN0aW9uVXNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLXJldHVyblZhbHVlX3R5cGVfcmVjaXBpZW50X2NvcnJlc3BvbmRlbmNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb25Vc2UtcmV0dXJuVmFsdWVfdHlwZV9yZWNpcGllbnRfY29ycmVzcG9uZGVuY2UiPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlIG9mIHRoZSByZXR1cm5WYWx1ZSBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHR5cGUgb2YgdGhlIHJldHVyblZhbHVlUmVjaXBpZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbnRlcmFjdGlvblVzZS1yZXR1cm5WYWx1ZV90eXBlX3JlY2lwaWVudF9jb3JyZXNwb25kZW5jZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmV0dXJuVmFsdWUudHlwZS0+YXNTZXF1ZW5jZSgpLT5ub3RFbXB0eSgpIGltcGxpZXMgcmV0dXJuVmFsdWUudHlwZS0+YXNTZXF1ZW5jZSgpLT5maXJzdCgpID0gcmV0dXJuVmFsdWVSZWNpcGllbnQudHlwZS0+YXNTZXF1ZW5jZSgpLT5maXJzdCgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJJbnRlcmFjdGlvblVzZS1hbGxfbGlmZWxpbmVzIiBuYW1lPSJhbGxfbGlmZWxpbmVzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkludGVyYWN0aW9uVXNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLWFsbF9saWZlbGluZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvblVzZS1hbGxfbGlmZWxpbmVzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgSW50ZXJhY3Rpb25Vc2UgbXVzdCBjb3ZlciBhbGwgTGlmZWxpbmVzIG9mIHRoZSBlbmNsb3NpbmcgSW50ZXJhY3Rpb24gdGhhdCBhcmUgY29tbW9uIHdpdGggdGhlIGxpZmVsaW5lcyBjb3ZlcmVkIGJ5IHRoZSByZWZlcnJlZCBJbnRlcmFjdGlvbi4gTGlmZWxpbmVzIGFyZSBjb21tb24gaWYgdGhleSBoYXZlIHRoZSBzYW1lIHNlbGVjdG9yIGFuZCByZXByZXNlbnRzIGFzc29jaWF0aW9uRW5kIHZhbHVlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtYWxsX2xpZmVsaW5lcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bGV0IHBhcmVudEludGVyYWN0aW9uIDogU2V0KEludGVyYWN0aW9uKSA9IGVuY2xvc2luZ0ludGVyYWN0aW9uLT5hc1NldCgpLT4mI3hEOwotdW5pb24oZW5jbG9zaW5nT3BlcmFuZC5jb21iaW5lZEZyYWdtZW50LT5jbG9zdXJlKGVuY2xvc2luZ09wZXJhbmQuY29tYmluZWRGcmFnbWVudCktPiYjeEQ7Ci1jb2xsZWN0KGVuY2xvc2luZ0ludGVyYWN0aW9uKS5vY2xBc1R5cGUoSW50ZXJhY3Rpb24pLT5hc1NldCgpKSBpbiYjeEQ7Ci1wYXJlbnRJbnRlcmFjdGlvbi0+c2l6ZSgpPTEgYW5kIGxldCByZWZJbnRlcmFjdGlvbiA6IEludGVyYWN0aW9uID0gcmVmZXJzVG8gaW4mI3hEOwotcGFyZW50SW50ZXJhY3Rpb24uY292ZXJlZC0+IGZvckFsbChpbnRMaWZlbGluZSA6IExpZmVsaW5lIHwgcmVmSW50ZXJhY3Rpb24uY292ZXJlZC0+JiN4RDsKLWZvckFsbCggcmVmTGlmZWxpbmUgOiBMaWZlbGluZSB8IHJlZkxpZmVsaW5lLnJlcHJlc2VudHMgPSBpbnRMaWZlbGluZS5yZXByZXNlbnRzIGFuZCAmI3hEOwotKCYjeEQ7Ci0oIHJlZkxpZmVsaW5lLnNlbGVjdG9yLm9jbElzS2luZE9mKExpdGVyYWxTdHJpbmcpIGltcGxpZXMmI3hEOwotICBpbnRMaWZlbGluZS5zZWxlY3Rvci5vY2xJc0tpbmRPZihMaXRlcmFsU3RyaW5nKSBhbmQgJiN4RDsKLSAgcmVmTGlmZWxpbmUuc2VsZWN0b3Iub2NsQXNUeXBlKExpdGVyYWxTdHJpbmcpLnZhbHVlID0gaW50TGlmZWxpbmUuc2VsZWN0b3Iub2NsQXNUeXBlKExpdGVyYWxTdHJpbmcpLnZhbHVlICkgYW5kJiN4RDsKLSggcmVmTGlmZWxpbmUuc2VsZWN0b3Iub2NsSXNLaW5kT2YoTGl0ZXJhbEludGVnZXIpIGltcGxpZXMmI3hEOwotICBpbnRMaWZlbGluZS5zZWxlY3Rvci5vY2xJc0tpbmRPZihMaXRlcmFsSW50ZWdlcikgYW5kICYjeEQ7Ci0gIHJlZkxpZmVsaW5lLnNlbGVjdG9yLm9jbEFzVHlwZShMaXRlcmFsSW50ZWdlcikudmFsdWUgPSBpbnRMaWZlbGluZS5zZWxlY3Rvci5vY2xBc1R5cGUoTGl0ZXJhbEludGVnZXIpLnZhbHVlICkmI3hEOwotKSYjeEQ7Ci0gaW1wbGllcyBzZWxmLmNvdmVyZWQtPmFzU2V0KCktPmluY2x1ZGVzKGludExpZmVsaW5lKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJJbnRlcmFjdGlvbkZyYWdtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnRlcmFjdGlvblVzZS1hY3R1YWxHYXRlIiBuYW1lPSJhY3R1YWxHYXRlIiB0eXBlPSJHYXRlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2FjdHVhbEdhdGVfaW50ZXJhY3Rpb25Vc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtYWN0dWFsR2F0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uVXNlLWFjdHVhbEdhdGUiPgotICAgICAgICAgIDxib2R5PlRoZSBhY3R1YWwgZ2F0ZXMgb2YgdGhlIEludGVyYWN0aW9uVXNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtYWN0dWFsR2F0ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLWFjdHVhbEdhdGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtYXJndW1lbnQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb24iIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9hcmd1bWVudF9pbnRlcmFjdGlvblVzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvblVzZS1hcmd1bWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uVXNlLWFyZ3VtZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgYWN0dWFsIGFyZ3VtZW50cyBvZiB0aGUgSW50ZXJhY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnRlcmFjdGlvblVzZS1hcmd1bWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLWFyZ3VtZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLXJlZmVyc1RvIiBuYW1lPSJyZWZlcnNUbyIgdHlwZT0iSW50ZXJhY3Rpb24iIGFzc29jaWF0aW9uPSJBX3JlZmVyc1RvX2ludGVyYWN0aW9uVXNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLXJlZmVyc1RvLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJhY3Rpb25Vc2UtcmVmZXJzVG8iPgotICAgICAgICAgIDxib2R5PlJlZmVycyB0byB0aGUgSW50ZXJhY3Rpb24gdGhhdCBkZWZpbmVzIGl0cyBtZWFuaW5nLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtcmV0dXJuVmFsdWUiIG5hbWU9InJldHVyblZhbHVlIiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcmV0dXJuVmFsdWVfaW50ZXJhY3Rpb25Vc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtcmV0dXJuVmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvblVzZS1yZXR1cm5WYWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHZhbHVlIG9mIHRoZSBleGVjdXRlZCBJbnRlcmFjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyYWN0aW9uVXNlLXJldHVyblZhbHVlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtcmV0dXJuVmFsdWVSZWNpcGllbnQiIG5hbWU9InJldHVyblZhbHVlUmVjaXBpZW50IiB0eXBlPSJQcm9wZXJ0eSIgYXNzb2NpYXRpb249IkFfcmV0dXJuVmFsdWVSZWNpcGllbnRfaW50ZXJhY3Rpb25Vc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtcmV0dXJuVmFsdWVSZWNpcGllbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvblVzZS1yZXR1cm5WYWx1ZVJlY2lwaWVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHJlY2lwaWVudCBvZiB0aGUgcmV0dXJuIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJhY3Rpb25Vc2UtcmV0dXJuVmFsdWVSZWNpcGllbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkxpZmVsaW5lIiBuYW1lPSJMaWZlbGluZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlmZWxpbmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaWZlbGluZSI+Ci0gICAgICAgIDxib2R5PkEgTGlmZWxpbmUgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHBhcnRpY2lwYW50IGluIHRoZSBJbnRlcmFjdGlvbi4gV2hpbGUgcGFydHMgYW5kIHN0cnVjdHVyYWwgZmVhdHVyZXMgbWF5IGhhdmUgbXVsdGlwbGljaXR5IGdyZWF0ZXIgdGhhbiAxLCBMaWZlbGluZXMgcmVwcmVzZW50IG9ubHkgb25lIGludGVyYWN0aW5nIGVudGl0eS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaWZlbGluZS1zZWxlY3Rvcl9zcGVjaWZpZWQiIG5hbWU9InNlbGVjdG9yX3NwZWNpZmllZCIgY29uc3RyYWluZWRFbGVtZW50PSJMaWZlbGluZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaWZlbGluZS1zZWxlY3Rvcl9zcGVjaWZpZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaWZlbGluZS1zZWxlY3Rvcl9zcGVjaWZpZWQiPgotICAgICAgICAgIDxib2R5PlRoZSBzZWxlY3RvciBmb3IgYSBMaWZlbGluZSBtdXN0IG9ubHkgYmUgc3BlY2lmaWVkIGlmIHRoZSByZWZlcmVuY2VkIFBhcnQgaXMgbXVsdGl2YWx1ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkxpZmVsaW5lLXNlbGVjdG9yX3NwZWNpZmllZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+IHNlbGYuc2VsZWN0b3ItPm5vdEVtcHR5KCkgPSAoc2VsZi5yZXByZXNlbnRzLm9jbElzS2luZE9mKE11bHRpcGxpY2l0eUVsZW1lbnQpIGFuZCBzZWxmLnJlcHJlc2VudHMub2NsQXNUeXBlKE11bHRpcGxpY2l0eUVsZW1lbnQpLmlzTXVsdGl2YWx1ZWQoKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkxpZmVsaW5lLWludGVyYWN0aW9uX3VzZXNfc2hhcmVfbGlmZWxpbmUiIG5hbWU9ImludGVyYWN0aW9uX3VzZXNfc2hhcmVfbGlmZWxpbmUiIGNvbnN0cmFpbmVkRWxlbWVudD0iTGlmZWxpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlmZWxpbmUtaW50ZXJhY3Rpb25fdXNlc19zaGFyZV9saWZlbGluZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpZmVsaW5lLWludGVyYWN0aW9uX3VzZXNfc2hhcmVfbGlmZWxpbmUiPgotICAgICAgICAgIDxib2R5PklmIGEgbGlmZWxpbmUgaXMgaW4gYW4gSW50ZXJhY3Rpb24gcmVmZXJyZWQgdG8gYnkgYW4gSW50ZXJhY3Rpb25Vc2UgaW4gYW4gZW5jbG9zaW5nIEludGVyYWN0aW9uLCAgYW5kIHRoYXQgbGlmZWxpbmUgaXMgY29tbW9uIHdpdGggYW5vdGhlciBsaWZlbGluZSBpbiBhbiBJbnRlcmFjdGlvbiByZWZlcnJlZCB0byBieSBhbm90aGVyIEludGVyYWN0b25Vc2Ugd2l0aGluIHRoYXQgc2FtZSBlbmNsb3NpbmcgSW50ZXJhY3Rpb24sIGl0IG11c3QgYmUgY29tbW9uIHRvIGEgbGlmZWxpbmUgd2l0aGluIHRoYXQgZW5jbG9zaW5nIEludGVyYWN0aW9uLiBCeSBjb21tb24gTGlmZWxpbmVzIHdlIG1lYW4gTGlmZWxpbmVzIHdpdGggdGhlIHNhbWUgc2VsZWN0b3IgYW5kIHJlcHJlc2VudHMgYXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaWZlbGluZS1pbnRlcmFjdGlvbl91c2VzX3NoYXJlX2xpZmVsaW5lLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5sZXQgaW50VXNlcyA6IFNldChJbnRlcmFjdGlvblVzZSkgPSBpbnRlcmFjdGlvbi5pbnRlcmFjdGlvblVzZSAgaW4gJiN4RDsKLWludFVzZXMtPmZvckFsbCYjeEQ7Ci0oIGl1c2UgOiBJbnRlcmFjdGlvblVzZSB8ICYjeEQ7Ci1sZXQgdXNpbmdJbnRlcmFjdGlvbiA6IFNldChJbnRlcmFjdGlvbikgID0gaXVzZS5lbmNsb3NpbmdJbnRlcmFjdGlvbi0+YXNTZXQoKSYjeEQ7Ci0tPnVuaW9uKCYjeEQ7Ci1pdXNlLmVuY2xvc2luZ09wZXJhbmQuY29tYmluZWRGcmFnbWVudC0+YXNTZXQoKS0+Y2xvc3VyZShlbmNsb3NpbmdPcGVyYW5kLmNvbWJpbmVkRnJhZ21lbnQpLmVuY2xvc2luZ0ludGVyYWN0aW9uLT5hc1NldCgpJiN4RDsKLSAgICAgICAgICAgICAgICkgJiN4RDsKLWluJiN4RDsKLWxldCBwZWVyVXNlcyA6IFNldChJbnRlcmFjdGlvblVzZSkgPSB1c2luZ0ludGVyYWN0aW9uLmZyYWdtZW50LT5zZWxlY3Qob2NsSXNLaW5kT2YoSW50ZXJhY3Rpb25Vc2UpKS5vY2xBc1R5cGUoSW50ZXJhY3Rpb25Vc2UpLT5hc1NldCgpJiN4RDsKLS0+dW5pb24oJiN4RDsKLXVzaW5nSW50ZXJhY3Rpb24uZnJhZ21lbnQtPnNlbGVjdChvY2xJc0tpbmRPZihDb21iaW5lZEZyYWdtZW50KSkub2NsQXNUeXBlKENvbWJpbmVkRnJhZ21lbnQpLT5hc1NldCgpJiN4RDsKLS0+Y2xvc3VyZShvcGVyYW5kLmZyYWdtZW50LT5zZWxlY3Qob2NsSXNLaW5kT2YoQ29tYmluZWRGcmFnbWVudCkpLm9jbEFzVHlwZShDb21iaW5lZEZyYWdtZW50KSkub3BlcmFuZC5mcmFnbWVudC0+JiN4RDsKLXNlbGVjdChvY2xJc0tpbmRPZihJbnRlcmFjdGlvblVzZSkpLm9jbEFzVHlwZShJbnRlcmFjdGlvblVzZSktPmFzU2V0KCkmI3hEOwotICAgICAgICAgICAgICAgKS0+ZXhjbHVkaW5nKGl1c2UpJiN4RDsKLSBpbiYjeEQ7Ci1wZWVyVXNlcy0+Zm9yQWxsKCBwZWVyVXNlIDogSW50ZXJhY3Rpb25Vc2UgfCYjeEQ7Ci0gcGVlclVzZS5yZWZlcnNUby5saWZlbGluZS0+Zm9yQWxsKCBsIDogTGlmZWxpbmUgfCAobC5yZXByZXNlbnRzID0gc2VsZi5yZXByZXNlbnRzIGFuZCAmI3hEOwotICggc2VsZi5zZWxlY3Rvci5vY2xJc0tpbmRPZihMaXRlcmFsU3RyaW5nKSBpbXBsaWVzJiN4RDsKLSAgbC5zZWxlY3Rvci5vY2xJc0tpbmRPZihMaXRlcmFsU3RyaW5nKSBhbmQgJiN4RDsKLSAgc2VsZi5zZWxlY3Rvci5vY2xBc1R5cGUoTGl0ZXJhbFN0cmluZykudmFsdWUgPSBsLnNlbGVjdG9yLm9jbEFzVHlwZShMaXRlcmFsU3RyaW5nKS52YWx1ZSApJiN4RDsKLSAgYW5kICYjeEQ7Ci0oIHNlbGYuc2VsZWN0b3Iub2NsSXNLaW5kT2YoTGl0ZXJhbEludGVnZXIpIGltcGxpZXMmI3hEOwotICBsLnNlbGVjdG9yLm9jbElzS2luZE9mKExpdGVyYWxJbnRlZ2VyKSBhbmQgJiN4RDsKLSAgc2VsZi5zZWxlY3Rvci5vY2xBc1R5cGUoTGl0ZXJhbEludGVnZXIpLnZhbHVlID0gbC5zZWxlY3Rvci5vY2xBc1R5cGUoTGl0ZXJhbEludGVnZXIpLnZhbHVlICkmI3hEOwotKSAgJiN4RDsKLWltcGxpZXMmI3hEOwotIHVzaW5nSW50ZXJhY3Rpb24ubGlmZWxpbmUtPmV4aXN0cyhyZXByZXNlbnRzID0gc2VsZi5yZXByZXNlbnRzIGFuZCYjeEQ7Ci0gKCBzZWxmLnNlbGVjdG9yLm9jbElzS2luZE9mKExpdGVyYWxTdHJpbmcpIGltcGxpZXMmI3hEOwotICBsLnNlbGVjdG9yLm9jbElzS2luZE9mKExpdGVyYWxTdHJpbmcpIGFuZCAmI3hEOwotICBzZWxmLnNlbGVjdG9yLm9jbEFzVHlwZShMaXRlcmFsU3RyaW5nKS52YWx1ZSA9IGwuc2VsZWN0b3Iub2NsQXNUeXBlKExpdGVyYWxTdHJpbmcpLnZhbHVlICkmI3hEOwotYW5kICYjeEQ7Ci0oIHNlbGYuc2VsZWN0b3Iub2NsSXNLaW5kT2YoTGl0ZXJhbEludGVnZXIpIGltcGxpZXMmI3hEOwotICBsLnNlbGVjdG9yLm9jbElzS2luZE9mKExpdGVyYWxJbnRlZ2VyKSBhbmQgJiN4RDsKLSAgc2VsZi5zZWxlY3Rvci5vY2xBc1R5cGUoTGl0ZXJhbEludGVnZXIpLnZhbHVlID0gbC5zZWxlY3Rvci5vY2xBc1R5cGUoTGl0ZXJhbEludGVnZXIpLnZhbHVlICkmI3hEOwotKSYjeEQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApJiN4RDsKLSAgICAgICAgICAgICAgICAgICAgKSYjeEQ7Ci0pPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaWZlbGluZS1zYW1lX2NsYXNzaWZpZXIiIG5hbWU9InNhbWVfY2xhc3NpZmllciIgY29uc3RyYWluZWRFbGVtZW50PSJMaWZlbGluZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaWZlbGluZS1zYW1lX2NsYXNzaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaWZlbGluZS1zYW1lX2NsYXNzaWZpZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBjbGFzc2lmaWVyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgQ29ubmVjdGFibGVFbGVtZW50IG11c3QgYmUgdGhlIHNhbWUgY2xhc3NpZmllciwgb3IgYW4gYW5jZXN0b3IsIG9mIHRoZSBjbGFzc2lmaWVyIHRoYXQgY29udGFpbnMgdGhlIGludGVyYWN0aW9uIGVuY2xvc2luZyB0aGlzIGxpZmVsaW5lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaWZlbGluZS1zYW1lX2NsYXNzaWZpZXItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlcHJlc2VudHMubmFtZXNwYWNlLT5jbG9zdXJlKG5hbWVzcGFjZSktPmluY2x1ZGVzKGludGVyYWN0aW9uLl8nY29udGV4dCcpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaWZlbGluZS1zZWxlY3Rvcl9pbnRfb3Jfc3RyaW5nIiBuYW1lPSJzZWxlY3Rvcl9pbnRfb3Jfc3RyaW5nIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkxpZmVsaW5lIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpZmVsaW5lLXNlbGVjdG9yX2ludF9vcl9zdHJpbmctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaWZlbGluZS1zZWxlY3Rvcl9pbnRfb3Jfc3RyaW5nIj4KLSAgICAgICAgICA8Ym9keT5UaGUgc2VsZWN0b3IgdmFsdWUsIGlmIHByZXNlbnQsIG11c3QgYmUgYSBMaXRlcmFsU3RyaW5nIG9yIGEgTGl0ZXJhbEludGVnZXI8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTGlmZWxpbmUtc2VsZWN0b3JfaW50X29yX3N0cmluZy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2VsZi5zZWxlY3Rvci0+bm90RW1wdHkoKSBpbXBsaWVzICYjeEQ7Ci1zZWxmLnNlbGVjdG9yLm9jbElzS2luZE9mKExpdGVyYWxJbnRlZ2VyKSBvciAmI3hEOwotc2VsZi5zZWxlY3Rvci5vY2xJc0tpbmRPZihMaXRlcmFsU3RyaW5nKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJMaWZlbGluZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTmFtZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMaWZlbGluZS1jb3ZlcmVkQnkiIG5hbWU9ImNvdmVyZWRCeSIgdHlwZT0iSW50ZXJhY3Rpb25GcmFnbWVudCIgYXNzb2NpYXRpb249IkFfY292ZXJlZF9jb3ZlcmVkQnkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlmZWxpbmUtY292ZXJlZEJ5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlmZWxpbmUtY292ZXJlZEJ5Ij4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBJbnRlcmFjdGlvbkZyYWdtZW50cyBpbiB3aGljaCB0aGlzIExpZmVsaW5lIHRha2VzIHBhcnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJMaWZlbGluZS1jb3ZlcmVkQnktX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJMaWZlbGluZS1jb3ZlcmVkQnktX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTGlmZWxpbmUtZGVjb21wb3NlZEFzIiBuYW1lPSJkZWNvbXBvc2VkQXMiIHR5cGU9IlBhcnREZWNvbXBvc2l0aW9uIiBhc3NvY2lhdGlvbj0iQV9kZWNvbXBvc2VkQXNfbGlmZWxpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlmZWxpbmUtZGVjb21wb3NlZEFzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlmZWxpbmUtZGVjb21wb3NlZEFzIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBJbnRlcmFjdGlvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGRlY29tcG9zaXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJMaWZlbGluZS1kZWNvbXBvc2VkQXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMaWZlbGluZS1pbnRlcmFjdGlvbiIgbmFtZT0iaW50ZXJhY3Rpb24iIHR5cGU9IkludGVyYWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfbGlmZWxpbmVfaW50ZXJhY3Rpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlmZWxpbmUtaW50ZXJhY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaWZlbGluZS1pbnRlcmFjdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgSW50ZXJhY3Rpb24gZW5jbG9zaW5nIHRoaXMgTGlmZWxpbmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMaWZlbGluZS1yZXByZXNlbnRzIiBuYW1lPSJyZXByZXNlbnRzIiB0eXBlPSJDb25uZWN0YWJsZUVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3JlcHJlc2VudHNfbGlmZWxpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlmZWxpbmUtcmVwcmVzZW50cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpZmVsaW5lLXJlcHJlc2VudHMiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIENvbm5lY3RhYmxlRWxlbWVudCB3aXRoaW4gdGhlIGNsYXNzaWZpZXIgdGhhdCBjb250YWlucyB0aGUgZW5jbG9zaW5nIGludGVyYWN0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTGlmZWxpbmUtcmVwcmVzZW50cy1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkxpZmVsaW5lLXNlbGVjdG9yIiBuYW1lPSJzZWxlY3RvciIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3NlbGVjdG9yX2xpZmVsaW5lIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpZmVsaW5lLXNlbGVjdG9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGlmZWxpbmUtc2VsZWN0b3IiPgotICAgICAgICAgIDxib2R5PklmIHRoZSByZWZlcmVuY2VkIENvbm5lY3RhYmxlRWxlbWVudCBpcyBtdWx0aXZhbHVlZCwgdGhlbiB0aGlzIHNwZWNpZmllcyB0aGUgc3BlY2lmaWMgaW5kaXZpZHVhbCBwYXJ0IHdpdGhpbiB0aGF0IHNldC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkxpZmVsaW5lLXNlbGVjdG9yLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJNZXNzYWdlIiBuYW1lPSJNZXNzYWdlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNZXNzYWdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZSI+Ci0gICAgICAgIDxib2R5PkEgTWVzc2FnZSBkZWZpbmVzIGEgcGFydGljdWxhciBjb21tdW5pY2F0aW9uIGJldHdlZW4gTGlmZWxpbmVzIG9mIGFuIEludGVyYWN0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik1lc3NhZ2Utc2VuZGluZ19yZWNlaXZpbmdfbWVzc2FnZV9ldmVudCIgbmFtZT0ic2VuZGluZ19yZWNlaXZpbmdfbWVzc2FnZV9ldmVudCIgY29uc3RyYWluZWRFbGVtZW50PSJNZXNzYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2Utc2VuZGluZ19yZWNlaXZpbmdfbWVzc2FnZV9ldmVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1lc3NhZ2Utc2VuZGluZ19yZWNlaXZpbmdfbWVzc2FnZV9ldmVudCI+Ci0gICAgICAgICAgPGJvZHk+SWYgdGhlIHNlbmRFdmVudCBhbmQgdGhlIHJlY2VpdmVFdmVudCBvZiB0aGUgc2FtZSBNZXNzYWdlIGFyZSBvbiB0aGUgc2FtZSBMaWZlbGluZSwgdGhlIHNlbmRFdmVudCBtdXN0IGJlIG9yZGVyZWQgYmVmb3JlIHRoZSByZWNlaXZlRXZlbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik1lc3NhZ2Utc2VuZGluZ19yZWNlaXZpbmdfbWVzc2FnZV9ldmVudC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVjZWl2ZUV2ZW50Lm9jbElzS2luZE9mKE1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbikmI3hEOwotaW1wbGllcyYjeEQ7Ci1sZXQgZiA6ICBMaWZlbGluZSA9IHNlbmRFdmVudC0+c2VsZWN0KG9jbElzS2luZE9mKE1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbikpLm9jbEFzVHlwZShNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24pLT5hc09yZGVyZWRTZXQoKS0+Zmlyc3QoKS5jb3ZlcmVkIGluJiN4RDsKLWYgPSByZWNlaXZlRXZlbnQtPnNlbGVjdChvY2xJc0tpbmRPZihNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24pKS5vY2xBc1R5cGUoTWVzc2FnZU9jY3VycmVuY2VTcGVjaWZpY2F0aW9uKS0+YXNPcmRlcmVkU2V0KCktPmZpcnN0KCkuY292ZXJlZCAgaW1wbGllcyYjeEQ7Ci1mLmV2ZW50cy0+aW5kZXhPZihzZW5kRXZlbnQub2NsQXNUeXBlKE1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiktPmFzT3JkZXJlZFNldCgpLT5maXJzdCgpICkgJmx0OyAmI3hEOwotZi5ldmVudHMtPmluZGV4T2YocmVjZWl2ZUV2ZW50Lm9jbEFzVHlwZShNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24pLT5hc09yZGVyZWRTZXQoKS0+Zmlyc3QoKSApPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNZXNzYWdlLWFyZ3VtZW50cyIgbmFtZT0iYXJndW1lbnRzIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik1lc3NhZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZS1hcmd1bWVudHMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlLWFyZ3VtZW50cyI+Ci0gICAgICAgICAgPGJvZHk+QXJndW1lbnRzIG9mIGEgTWVzc2FnZSBtdXN0IG9ubHkgYmU6IGkpIGF0dHJpYnV0ZXMgb2YgdGhlIHNlbmRpbmcgbGlmZWxpbmUsIGlpKSBjb25zdGFudHMsIGlpaSkgc3ltYm9saWMgdmFsdWVzICh3aGljaCBhcmUgd2lsZGNhcmQgdmFsdWVzIHJlcHJlc2VudGluZyBhbnkgbGVnYWwgdmFsdWUpLCBpdikgZXhwbGljaXQgcGFyYW1ldGVycyBvZiB0aGUgZW5jbG9zaW5nIEludGVyYWN0aW9uLCB2KSBhdHRyaWJ1dGVzIG9mIHRoZSBjbGFzcyBvd25pbmcgdGhlIEludGVyYWN0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNZXNzYWdlLWFyZ3VtZW50cy1fc3BlY2lmaWNhdGlvbiIgbGFuZ3VhZ2U9IiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVzc2FnZS1jYW5ub3RfY3Jvc3NfYm91bmRhcmllcyIgbmFtZT0iY2Fubm90X2Nyb3NzX2JvdW5kYXJpZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTWVzc2FnZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNZXNzYWdlLWNhbm5vdF9jcm9zc19ib3VuZGFyaWVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1jYW5ub3RfY3Jvc3NfYm91bmRhcmllcyI+Ci0gICAgICAgICAgPGJvZHk+TWVzc2FnZXMgY2Fubm90IGNyb3NzIGJvdW5kYXJpZXMgb2YgQ29tYmluZWRGcmFnbWVudHMgb3IgdGhlaXIgb3BlcmFuZHMuICBUaGlzIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgYm90aCBNZXNzYWdlRW5kcyBhcmUgZW5jbG9zZWQgd2l0aGluIHRoZSBzYW1lIEludGVyYWN0aW9uRnJhZ21lbnQgKGkuZS4sIGFuIEludGVyYWN0aW9uT3BlcmFuZCBvciBhbiBJbnRlcmFjdGlvbikuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik1lc3NhZ2UtY2Fubm90X2Nyb3NzX2JvdW5kYXJpZXMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnNlbmRFdmVudC0+bm90RW1wdHkoKSBhbmQgcmVjZWl2ZUV2ZW50LT5ub3RFbXB0eSgpIGltcGxpZXMmI3hEOwotbGV0IHNlbmRFbmNsb3NpbmdGcmFnIDogU2V0KEludGVyYWN0aW9uRnJhZ21lbnQpID0gJiN4RDsKLXNlbmRFdmVudC0+YXNPcmRlcmVkU2V0KCktPmZpcnN0KCkuZW5jbG9zaW5nRnJhZ21lbnQoKSYjeEQ7Ci1pbiAmI3hEOwotbGV0IHJlY2VpdmVFbmNsb3NpbmdGcmFnIDogU2V0KEludGVyYWN0aW9uRnJhZ21lbnQpID0gJiN4RDsKLXJlY2VpdmVFdmVudC0+YXNPcmRlcmVkU2V0KCktPmZpcnN0KCkuZW5jbG9zaW5nRnJhZ21lbnQoKSYjeEQ7Ci1pbiAgc2VuZEVuY2xvc2luZ0ZyYWcgPSByZWNlaXZlRW5jbG9zaW5nRnJhZzwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVzc2FnZS1zaWduYXR1cmVfaXNfc2lnbmFsIiBuYW1lPSJzaWduYXR1cmVfaXNfc2lnbmFsIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik1lc3NhZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZS1zaWduYXR1cmVfaXNfc2lnbmFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1zaWduYXR1cmVfaXNfc2lnbmFsIj4KLSAgICAgICAgICA8Ym9keT5JbiB0aGUgY2FzZSB3aGVuIHRoZSBNZXNzYWdlIHNpZ25hdHVyZSBpcyBhIFNpZ25hbCwgdGhlIGFyZ3VtZW50cyBvZiB0aGUgTWVzc2FnZSBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIFNpZ25hbC4gQSBNZXNzYWdlIEFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIGEgU2lnbmFsIEF0dHJpYnV0ZSBpZiB0aGUgQXJndW1lbnQgaXMgb2YgdGhlIHNhbWUgQ2xhc3Mgb3IgYSBzcGVjaWFsaXphdGlvbiBvZiB0aGF0IG9mIHRoZSBBdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik1lc3NhZ2Utc2lnbmF0dXJlX2lzX3NpZ25hbC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KG1lc3NhZ2VTb3J0ID0gTWVzc2FnZVNvcnQ6OmFzeW5jaFNpZ25hbCApIGFuZCBzaWduYXR1cmUub2NsSXNLaW5kT2YoU2lnbmFsKSBpbXBsaWVzJiN4RDsKLSAgIGxldCBzaWduYWxBdHRyaWJ1dGVzIDogT3JkZXJlZFNldChQcm9wZXJ0eSkgPSBzaWduYXR1cmUub2NsQXNUeXBlKFNpZ25hbCkuaW5oZXJpdGVkTWVtYmVyKCktPiYjeEQ7Ci0gICAgICAgICAgICAgc2VsZWN0KG46TmFtZWRFbGVtZW50IHwgbi5vY2xJc1R5cGVPZihQcm9wZXJ0eSkpLT5jb2xsZWN0KG9jbEFzVHlwZShQcm9wZXJ0eSkpLT5hc09yZGVyZWRTZXQoKSYjeEQ7Ci0gICBpbiBzaWduYWxBdHRyaWJ1dGVzLT5zaXplKCkgPSBzZWxmLmFyZ3VtZW50LT5zaXplKCkmI3hEOwotICAgYW5kIHNlbGYuYXJndW1lbnQtPmZvckFsbCggbzogVmFsdWVTcGVjaWZpY2F0aW9uIHwmI3hEOwotICAgICAgICAgIG5vdCAoby5vY2xJc0tpbmRPZihFeHByZXNzaW9uKSYjeEQ7Ci0gICAgICAgICAgYW5kIG8ub2NsQXNUeXBlKEV4cHJlc3Npb24pLnN5bWJvbC0+c2l6ZSgpPTAmI3hEOwotICAgICAgICAgIGFuZCBvLm9jbEFzVHlwZShFeHByZXNzaW9uKS5vcGVyYW5kLT5pc0VtcHR5KCkgKSBpbXBsaWVzJiN4RDsKLSAgICAgICAgICAgICAgbGV0IHAgOiBQcm9wZXJ0eSA9IHNpZ25hbEF0dHJpYnV0ZXMtPmF0KHNlbGYuYXJndW1lbnQtPmluZGV4T2YobykpJiN4RDsKLSAgICAgICAgICAgICAgaW4gby50eXBlLm9jbEFzVHlwZShDbGFzc2lmaWVyKS5jb25mb3Jtc1RvKHAudHlwZS5vY2xBc1R5cGUoQ2xhc3NpZmllcikpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVzc2FnZS1vY2N1cnJlbmNlX3NwZWNpZmljYXRpb25zIiBuYW1lPSJvY2N1cnJlbmNlX3NwZWNpZmljYXRpb25zIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik1lc3NhZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZS1vY2N1cnJlbmNlX3NwZWNpZmljYXRpb25zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1vY2N1cnJlbmNlX3NwZWNpZmljYXRpb25zIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgTWVzc2FnZUVuZHMgYXJlIGJvdGggT2NjdXJyZW5jZVNwZWNpZmljYXRpb25zLCB0aGVuIHRoZSBjb25uZWN0b3IgbXVzdCBnbyBiZXR3ZWVuIHRoZSBQYXJ0cyByZXByZXNlbnRlZCBieSB0aGUgTGlmZWxpbmVzIG9mIHRoZSB0d28gTWVzc2FnZUVuZHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik1lc3NhZ2Utb2NjdXJyZW5jZV9zcGVjaWZpY2F0aW9ucy1fc3BlY2lmaWNhdGlvbiIgbGFuZ3VhZ2U9IiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVzc2FnZS1zaWduYXR1cmVfcmVmZXJfdG8iIG5hbWU9InNpZ25hdHVyZV9yZWZlcl90byIgY29uc3RyYWluZWRFbGVtZW50PSJNZXNzYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2Utc2lnbmF0dXJlX3JlZmVyX3RvLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1zaWduYXR1cmVfcmVmZXJfdG8iPgotICAgICAgICAgIDxib2R5PlRoZSBzaWduYXR1cmUgbXVzdCBlaXRoZXIgcmVmZXIgYW4gT3BlcmF0aW9uIChpbiB3aGljaCBjYXNlIG1lc3NhZ2VTb3J0IGlzIGVpdGhlciBzeW5jaENhbGwgb3IgYXN5bmNoQ2FsbCBvciByZXBseSkgb3IgYSBTaWduYWwgKGluIHdoaWNoIGNhc2UgbWVzc2FnZVNvcnQgaXMgYXN5bmNoU2lnbmFsKS4gVGhlIG5hbWUgb2YgdGhlIE5hbWVkRWxlbWVudCByZWZlcmVuY2VkIGJ5IHNpZ25hdHVyZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIE1lc3NhZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik1lc3NhZ2Utc2lnbmF0dXJlX3JlZmVyX3RvLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zaWduYXR1cmUtPm5vdEVtcHR5KCkgaW1wbGllcyAmI3hEOwotKChzaWduYXR1cmUub2NsSXNLaW5kT2YoT3BlcmF0aW9uKSBhbmQgJiN4RDsKLShtZXNzYWdlU29ydCA9IE1lc3NhZ2VTb3J0Ojphc3luY2hDYWxsIG9yIG1lc3NhZ2VTb3J0ID0gTWVzc2FnZVNvcnQ6OnN5bmNoQ2FsbCBvciBtZXNzYWdlU29ydCA9IE1lc3NhZ2VTb3J0OjpyZXBseSkgJiN4RDsKLSkgb3IgKHNpZ25hdHVyZS5vY2xJc0tpbmRPZihTaWduYWwpICBhbmQgbWVzc2FnZVNvcnQgPSBNZXNzYWdlU29ydDo6YXN5bmNoU2lnbmFsICkmI3hEOwotICkgYW5kIG5hbWUgPSBzaWduYXR1cmUubmFtZTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVzc2FnZS1zaWduYXR1cmVfaXNfb3BlcmF0aW9uX3JlcXVlc3QiIG5hbWU9InNpZ25hdHVyZV9pc19vcGVyYXRpb25fcmVxdWVzdCIgY29uc3RyYWluZWRFbGVtZW50PSJNZXNzYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2Utc2lnbmF0dXJlX2lzX29wZXJhdGlvbl9yZXF1ZXN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1zaWduYXR1cmVfaXNfb3BlcmF0aW9uX3JlcXVlc3QiPgotICAgICAgICAgIDxib2R5PkluIHRoZSBjYXNlIHdoZW4gYSBNZXNzYWdlIHdpdGggbWVzc2FnZVNvcnQgc3luY2hDYWxsIG9yIGFzeW5jaENhbGwgaGFzIGEgbm9uIGVtcHR5IE9wZXJhdGlvbiBzaWduYXR1cmUsIHRoZSBhcmd1bWVudHMgb2YgdGhlIE1lc3NhZ2UgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBpbiBhbmQgaW5vdXQgcGFyYW1ldGVycyBvZiB0aGUgT3BlcmF0aW9uLiBBIFBhcmFtZXRlciBjb3JyZXNwb25kcyB0byBhbiBBcmd1bWVudCBpZiB0aGUgQXJndW1lbnQgaXMgb2YgdGhlIHNhbWUgQ2xhc3Mgb3IgYSBzcGVjaWFsaXphdGlvbiBvZiB0aGF0IG9mIHRoZSBQYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik1lc3NhZ2Utc2lnbmF0dXJlX2lzX29wZXJhdGlvbl9yZXF1ZXN0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4obWVzc2FnZVNvcnQgPSBNZXNzYWdlU29ydDo6YXN5bmNoQ2FsbCBvciBtZXNzYWdlU29ydCA9IE1lc3NhZ2VTb3J0OjpzeW5jaENhbGwpIGFuZCBzaWduYXR1cmUub2NsSXNLaW5kT2YoT3BlcmF0aW9uKSAgaW1wbGllcyAmI3hEOwotIGxldCByZXF1ZXN0UGFybXMgOiBPcmRlcmVkU2V0KFBhcmFtZXRlcikgPSBzaWduYXR1cmUub2NsQXNUeXBlKE9wZXJhdGlvbikub3duZWRQYXJhbWV0ZXItPiYjeEQ7Ci0gc2VsZWN0KGRpcmVjdGlvbiA9IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Omlub3V0IG9yIGRpcmVjdGlvbiA9IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6Ol8naW4nICApJiN4RDsKLWluIHJlcXVlc3RQYXJtcy0+c2l6ZSgpID0gc2VsZi5hcmd1bWVudC0+c2l6ZSgpIGFuZCYjeEQ7Ci1zZWxmLmFyZ3VtZW50LT5mb3JBbGwoIG86IFZhbHVlU3BlY2lmaWNhdGlvbiB8ICYjeEQ7Ci1ub3QgKG8ub2NsSXNLaW5kT2YoRXhwcmVzc2lvbikgYW5kIG8ub2NsQXNUeXBlKEV4cHJlc3Npb24pLnN5bWJvbC0+c2l6ZSgpPTAgYW5kIG8ub2NsQXNUeXBlKEV4cHJlc3Npb24pLm9wZXJhbmQtPmlzRW1wdHkoKSApIGltcGxpZXMgJiN4RDsKLWxldCBwIDogUGFyYW1ldGVyID0gcmVxdWVzdFBhcm1zLT5hdChzZWxmLmFyZ3VtZW50LT5pbmRleE9mKG8pKSBpbiYjeEQ7Ci1vLnR5cGUub2NsQXNUeXBlKENsYXNzaWZpZXIpLmNvbmZvcm1zVG8ocC50eXBlLm9jbEFzVHlwZShDbGFzc2lmaWVyKSkmI3hEOwotKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVzc2FnZS1zaWduYXR1cmVfaXNfb3BlcmF0aW9uX3JlcGx5IiBuYW1lPSJzaWduYXR1cmVfaXNfb3BlcmF0aW9uX3JlcGx5IiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik1lc3NhZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZS1zaWduYXR1cmVfaXNfb3BlcmF0aW9uX3JlcGx5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1zaWduYXR1cmVfaXNfb3BlcmF0aW9uX3JlcGx5Ij4KLSAgICAgICAgICA8Ym9keT5JbiB0aGUgY2FzZSB3aGVuIGEgTWVzc2FnZSB3aXRoIG1lc3NhZ2VTb3J0IHJlcGx5IGhhcyBhIG5vbiBlbXB0eSBPcGVyYXRpb24gc2lnbmF0dXJlLCB0aGUgYXJndW1lbnRzIG9mIHRoZSBNZXNzYWdlIG11c3QgY29ycmVzcG9uZCB0byB0aGUgb3V0LCBpbm91dCwgYW5kIHJldHVybiBwYXJhbWV0ZXJzIG9mIHRoZSBPcGVyYXRpb24uIEEgUGFyYW1ldGVyIGNvcnJlc3BvbmRzIHRvIGFuIEFyZ3VtZW50IGlmIHRoZSBBcmd1bWVudCBpcyBvZiB0aGUgc2FtZSBDbGFzcyBvciBhIHNwZWNpYWxpemF0aW9uIG9mIHRoYXQgb2YgdGhlIFBhcmFtZXRlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTWVzc2FnZS1zaWduYXR1cmVfaXNfb3BlcmF0aW9uX3JlcGx5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4obWVzc2FnZVNvcnQgPSBNZXNzYWdlU29ydDo6cmVwbHkpIGFuZCBzaWduYXR1cmUub2NsSXNLaW5kT2YoT3BlcmF0aW9uKSBpbXBsaWVzICYjeEQ7Ci0gbGV0IHJlcGx5UGFybXMgOiBPcmRlcmVkU2V0KFBhcmFtZXRlcikgPSBzaWduYXR1cmUub2NsQXNUeXBlKE9wZXJhdGlvbikub3duZWRQYXJhbWV0ZXItPiYjeEQ7Ci1zZWxlY3QoZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6aW5vdXQgb3IgZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6b3V0IG9yIGRpcmVjdGlvbiA9IFBhcmFtZXRlckRpcmVjdGlvbktpbmQ6OnJldHVybikmI3hEOwotaW4gcmVwbHlQYXJtcy0+c2l6ZSgpID0gc2VsZi5hcmd1bWVudC0+c2l6ZSgpIGFuZCYjeEQ7Ci1zZWxmLmFyZ3VtZW50LT5mb3JBbGwoIG86IFZhbHVlU3BlY2lmaWNhdGlvbiB8IG8ub2NsSXNLaW5kT2YoRXhwcmVzc2lvbikgYW5kIGxldCBlIDogRXhwcmVzc2lvbiA9IG8ub2NsQXNUeXBlKEV4cHJlc3Npb24pIGluJiN4RDsKLWUub3BlcmFuZC0+bm90RW1wdHkoKSAgaW1wbGllcyAmI3hEOwotbGV0IHAgOiBQYXJhbWV0ZXIgPSByZXBseVBhcm1zLT5hdChzZWxmLmFyZ3VtZW50LT5pbmRleE9mKG8pKSBpbiYjeEQ7Ci1lLm9wZXJhbmQtPmFzU2VxdWVuY2UoKS0+Zmlyc3QoKS50eXBlLm9jbEFzVHlwZShDbGFzc2lmaWVyKS5jb25mb3Jtc1RvKHAudHlwZS5vY2xBc1R5cGUoQ2xhc3NpZmllcikpJiN4RDsKLSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iTWVzc2FnZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTmFtZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJNZXNzYWdlLWFyZ3VtZW50IiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfYXJndW1lbnRfbWVzc2FnZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNZXNzYWdlLWFyZ3VtZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1hcmd1bWVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGFyZ3VtZW50cyBvZiB0aGUgTWVzc2FnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik1lc3NhZ2UtYXJndW1lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJNZXNzYWdlLWFyZ3VtZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik1lc3NhZ2UtY29ubmVjdG9yIiBuYW1lPSJjb25uZWN0b3IiIHR5cGU9IkNvbm5lY3RvciIgYXNzb2NpYXRpb249IkFfY29ubmVjdG9yX21lc3NhZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZS1jb25uZWN0b3ItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlLWNvbm5lY3RvciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIENvbm5lY3RvciBvbiB3aGljaCB0aGlzIE1lc3NhZ2UgaXMgc2VudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik1lc3NhZ2UtY29ubmVjdG9yLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTWVzc2FnZS1pbnRlcmFjdGlvbiIgbmFtZT0iaW50ZXJhY3Rpb24iIHR5cGU9IkludGVyYWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfbWVzc2FnZV9pbnRlcmFjdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNZXNzYWdlLWludGVyYWN0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1pbnRlcmFjdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGVuY2xvc2luZyBJbnRlcmFjdGlvbiBvd25pbmcgdGhlIE1lc3NhZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJNZXNzYWdlLW1lc3NhZ2VLaW5kIiBuYW1lPSJtZXNzYWdlS2luZCIgdHlwZT0iTWVzc2FnZUtpbmQiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNZXNzYWdlLW1lc3NhZ2VLaW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1tZXNzYWdlS2luZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRlcml2ZWQga2luZCBvZiB0aGUgTWVzc2FnZSAoY29tcGxldGUsIGxvc3QsIGZvdW5kLCBvciB1bmtub3duKS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJNZXNzYWdlLW1lc3NhZ2VLaW5kLV9kZWZhdWx0VmFsdWUiIGluc3RhbmNlPSJNZXNzYWdlS2luZC11bmtub3duIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTWVzc2FnZS1tZXNzYWdlU29ydCIgbmFtZT0ibWVzc2FnZVNvcnQiIHR5cGU9Ik1lc3NhZ2VTb3J0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2UtbWVzc2FnZVNvcnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlLW1lc3NhZ2VTb3J0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgc29ydCBvZiBjb21tdW5pY2F0aW9uIHJlZmxlY3RlZCBieSB0aGUgTWVzc2FnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5zdGFuY2VWYWx1ZSIgeG1pOmlkPSJNZXNzYWdlLW1lc3NhZ2VTb3J0LV9kZWZhdWx0VmFsdWUiIHR5cGU9Ik1lc3NhZ2VTb3J0IiBpbnN0YW5jZT0iTWVzc2FnZVNvcnQtc3luY2hDYWxsIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTWVzc2FnZS1yZWNlaXZlRXZlbnQiIG5hbWU9InJlY2VpdmVFdmVudCIgdHlwZT0iTWVzc2FnZUVuZCIgc3Vic2V0dGVkUHJvcGVydHk9IkFfbWVzc2FnZV9tZXNzYWdlRW5kLW1lc3NhZ2VFbmQiIGFzc29jaWF0aW9uPSJBX3JlY2VpdmVFdmVudF9lbmRNZXNzYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2UtcmVjZWl2ZUV2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1yZWNlaXZlRXZlbnQiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIFJlY2VpdmluZyBvZiB0aGUgTWVzc2FnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik1lc3NhZ2UtcmVjZWl2ZUV2ZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTWVzc2FnZS1zZW5kRXZlbnQiIG5hbWU9InNlbmRFdmVudCIgdHlwZT0iTWVzc2FnZUVuZCIgc3Vic2V0dGVkUHJvcGVydHk9IkFfbWVzc2FnZV9tZXNzYWdlRW5kLW1lc3NhZ2VFbmQiIGFzc29jaWF0aW9uPSJBX3NlbmRFdmVudF9lbmRNZXNzYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2Utc2VuZEV2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1zZW5kRXZlbnQiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIFNlbmRpbmcgb2YgdGhlIE1lc3NhZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJNZXNzYWdlLXNlbmRFdmVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik1lc3NhZ2Utc2lnbmF0dXJlIiBuYW1lPSJzaWduYXR1cmUiIHR5cGU9Ik5hbWVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfc2lnbmF0dXJlX21lc3NhZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZS1zaWduYXR1cmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlLXNpZ25hdHVyZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNpZ25hdHVyZSBvZiB0aGUgTWVzc2FnZSBpcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBpdHMgY29udGVudC4gSXQgcmVmZXJzIGVpdGhlciBhbiBPcGVyYXRpb24gb3IgYSBTaWduYWwuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJNZXNzYWdlLXNpZ25hdHVyZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik1lc3NhZ2UtbWVzc2FnZUtpbmQuMSIgbmFtZT0ibWVzc2FnZUtpbmQiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iTWVzc2FnZS1tZXNzYWdlS2luZC4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZS1tZXNzYWdlS2luZC4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1tZXNzYWdlS2luZC4xIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIHF1ZXJ5IHJldHVybnMgdGhlIE1lc3NhZ2VLaW5kIHZhbHVlIGZvciB0aGlzIE1lc3NhZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik1lc3NhZ2UtbWVzc2FnZUtpbmQuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik1lc3NhZ2UtbWVzc2FnZUtpbmQuMSBNZXNzYWdlLW1lc3NhZ2VLaW5kIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTWVzc2FnZS1tZXNzYWdlS2luZC4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobWVzc2FnZUtpbmQpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik1lc3NhZ2UtbWVzc2FnZUtpbmQuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iTWVzc2FnZUtpbmQiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTWVzc2FnZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20iIG5hbWU9ImlzRGlzdGluZ3Vpc2hhYmxlRnJvbSIgYm9keUNvbmRpdGlvbj0iTWVzc2FnZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJOYW1lZEVsZW1lbnQtaXNEaXN0aW5ndWlzaGFibGVGcm9tIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2UtaXNEaXN0aW5ndWlzaGFibGVGcm9tLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20iPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpc0Rpc3Rpbmd1aXNoYWJsZUZyb20oKSBzcGVjaWZpZXMgdGhhdCBhbnkgdHdvIE1lc3NhZ2VzIG1heSBjb2V4aXN0IGluIHRoZSBzYW1lIE5hbWVzcGFjZSwgcmVnYXJkbGVzcyBvZiB0aGVpciBuYW1lcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVzc2FnZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJNZXNzYWdlLWlzRGlzdGluZ3Vpc2hhYmxlRnJvbSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik1lc3NhZ2UtaXNEaXN0aW5ndWlzaGFibGVGcm9tLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAodHJ1ZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTWVzc2FnZS1pc0Rpc3Rpbmd1aXNoYWJsZUZyb20tcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik1lc3NhZ2UtaXNEaXN0aW5ndWlzaGFibGVGcm9tLW4iIG5hbWU9Im4iIHR5cGU9Ik5hbWVkRWxlbWVudCIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJNZXNzYWdlLWlzRGlzdGluZ3Vpc2hhYmxlRnJvbS1ucyIgbmFtZT0ibnMiIHR5cGU9Ik5hbWVzcGFjZSIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iTWVzc2FnZUVuZCIgbmFtZT0iTWVzc2FnZUVuZCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZUVuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1lc3NhZ2VFbmQiPgotICAgICAgICA8Ym9keT5NZXNzYWdlRW5kIGlzIGFuIGFic3RyYWN0IHNwZWNpYWxpemF0aW9uIG9mIE5hbWVkRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgd2hhdCBjYW4gb2NjdXIgYXQgdGhlIGVuZCBvZiBhIE1lc3NhZ2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJNZXNzYWdlRW5kLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik1lc3NhZ2VFbmQtbWVzc2FnZSIgbmFtZT0ibWVzc2FnZSIgdHlwZT0iTWVzc2FnZSIgYXNzb2NpYXRpb249IkFfbWVzc2FnZV9tZXNzYWdlRW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2VFbmQtbWVzc2FnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1lc3NhZ2VFbmQtbWVzc2FnZSI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyBhIE1lc3NhZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJNZXNzYWdlRW5kLW1lc3NhZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJNZXNzYWdlRW5kLW9wcG9zaXRlRW5kIiBuYW1lPSJvcHBvc2l0ZUVuZCIgYm9keUNvbmRpdGlvbj0iTWVzc2FnZUVuZC1vcHBvc2l0ZUVuZC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiBwcmVjb25kaXRpb249Ik1lc3NhZ2VFbmQtb3Bwb3NpdGVFbmQtcHJlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2VFbmQtb3Bwb3NpdGVFbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlRW5kLW9wcG9zaXRlRW5kIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIHF1ZXJ5IHJldHVybnMgYSBzZXQgaW5jbHVkaW5nIHRoZSBNZXNzYWdlRW5kIChpZiBleGlzdHMpIGF0IHRoZSBvcHBvc2l0ZSBlbmQgb2YgdGhlIE1lc3NhZ2UgZm9yIHRoaXMgTWVzc2FnZUVuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVzc2FnZUVuZC1vcHBvc2l0ZUVuZC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik1lc3NhZ2VFbmQtb3Bwb3NpdGVFbmQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNZXNzYWdlRW5kLW9wcG9zaXRlRW5kLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobWVzc2FnZS0+YXNTZXQoKS5tZXNzYWdlRW5kLT5hc1NldCgpLT5leGNsdWRpbmcoc2VsZikpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNZXNzYWdlRW5kLW9wcG9zaXRlRW5kLXByZSIgbmFtZT0icHJlIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik1lc3NhZ2VFbmQtb3Bwb3NpdGVFbmQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNZXNzYWdlRW5kLW9wcG9zaXRlRW5kLXByZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5Pm1lc3NhZ2UtPm5vdEVtcHR5KCk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTWVzc2FnZUVuZC1vcHBvc2l0ZUVuZC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iTWVzc2FnZUVuZCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTWVzc2FnZUVuZC1vcHBvc2l0ZUVuZC1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik1lc3NhZ2VFbmQtb3Bwb3NpdGVFbmQtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik1lc3NhZ2VFbmQtaXNTZW5kIiBuYW1lPSJpc1NlbmQiIGJvZHlDb25kaXRpb249Ik1lc3NhZ2VFbmQtaXNTZW5kLXNwZWMiIGlzUXVlcnk9InRydWUiIHByZWNvbmRpdGlvbj0iTWVzc2FnZUVuZC1pc1NlbmQtcHJlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2VFbmQtaXNTZW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZUVuZC1pc1NlbmQiPgotICAgICAgICAgIDxib2R5PlRoaXMgcXVlcnkgcmV0dXJucyB2YWx1ZSB0cnVlIGlmIHRoaXMgTWVzc2FnZUVuZCBpcyBhIHNlbmRFdmVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVzc2FnZUVuZC1pc1NlbmQtcHJlIiBuYW1lPSJwcmUiIGNvbnN0cmFpbmVkRWxlbWVudD0iTWVzc2FnZUVuZC1pc1NlbmQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNZXNzYWdlRW5kLWlzU2VuZC1wcmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5tZXNzYWdlLT5ub3RFbXB0eSgpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNZXNzYWdlRW5kLWlzU2VuZC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik1lc3NhZ2VFbmQtaXNTZW5kIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTWVzc2FnZUVuZC1pc1NlbmQtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChtZXNzYWdlLnNlbmRFdmVudC0+YXNTZXQoKS0+aW5jbHVkZXMoc2VsZikpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik1lc3NhZ2VFbmQtaXNTZW5kLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik1lc3NhZ2VFbmQtaXNSZWNlaXZlIiBuYW1lPSJpc1JlY2VpdmUiIGJvZHlDb25kaXRpb249Ik1lc3NhZ2VFbmQtaXNSZWNlaXZlLXNwZWMiIGlzUXVlcnk9InRydWUiIHByZWNvbmRpdGlvbj0iTWVzc2FnZUVuZC1pc1JlY2VpdmUtcHJlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2VFbmQtaXNSZWNlaXZlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZUVuZC1pc1JlY2VpdmUiPgotICAgICAgICAgIDxib2R5PlRoaXMgcXVlcnkgcmV0dXJucyB2YWx1ZSB0cnVlIGlmIHRoaXMgTWVzc2FnZUVuZCBpcyBhIHJlY2VpdmVFdmVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTWVzc2FnZUVuZC1pc1JlY2VpdmUtcHJlIiBuYW1lPSJwcmUiIGNvbnN0cmFpbmVkRWxlbWVudD0iTWVzc2FnZUVuZC1pc1JlY2VpdmUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNZXNzYWdlRW5kLWlzUmVjZWl2ZS1wcmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlRW5kLWlzUmVjZWl2ZS1wcmUiPgotICAgICAgICAgICAgPGJvZHk+Jmx0O3A+bWVzc2FnZS0mYW1wO2d0O25vdEVtcHR5KCkmbHQ7L3A+PC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJNZXNzYWdlRW5kLWlzUmVjZWl2ZS1wcmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5tZXNzYWdlLT5ub3RFbXB0eSgpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJNZXNzYWdlRW5kLWlzUmVjZWl2ZS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik1lc3NhZ2VFbmQtaXNSZWNlaXZlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTWVzc2FnZUVuZC1pc1JlY2VpdmUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChtZXNzYWdlLnJlY2VpdmVFdmVudC0+YXNTZXQoKS0+aW5jbHVkZXMoc2VsZikpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik1lc3NhZ2VFbmQtaXNSZWNlaXZlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik1lc3NhZ2VFbmQtZW5jbG9zaW5nRnJhZ21lbnQiIG5hbWU9ImVuY2xvc2luZ0ZyYWdtZW50IiBib2R5Q29uZGl0aW9uPSJNZXNzYWdlRW5kLWVuY2xvc2luZ0ZyYWdtZW50LXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZUVuZC1lbmNsb3NpbmdGcmFnbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1lc3NhZ2VFbmQtZW5jbG9zaW5nRnJhZ21lbnQiPgotICAgICAgICAgIDxib2R5PlRoaXMgcXVlcnkgcmV0dXJucyBhIHNldCBpbmNsdWRpbmcgdGhlIGVuY2xvc2luZyBJbnRlcmFjdGlvbkZyYWdtZW50IHRoaXMgTWVzc2FnZUVuZCBpcyBlbmNsb3NlZCB3aXRoaW4uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik1lc3NhZ2VFbmQtZW5jbG9zaW5nRnJhZ21lbnQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJNZXNzYWdlRW5kLWVuY2xvc2luZ0ZyYWdtZW50Ij4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTWVzc2FnZUVuZC1lbmNsb3NpbmdGcmFnbWVudC1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIHNlbGYtPnNlbGVjdChvY2xJc0tpbmRPZihHYXRlKSktPm5vdEVtcHR5KCkgJiN4RDsKLXRoZW4gLS0gaXQgaXMgYSBHYXRlJiN4RDsKLWxldCBlbmRHYXRlIDogR2F0ZSA9ICYjeEQ7Ci0gIHNlbGYtPnNlbGVjdChvY2xJc0tpbmRPZihHYXRlKSkub2NsQXNUeXBlKEdhdGUpLT5hc09yZGVyZWRTZXQoKS0+Zmlyc3QoKSYjeEQ7Ci0gIGluJiN4RDsKLSAgaWYgZW5kR2F0ZS5pc091dHNpZGVDRigpICYjeEQ7Ci0gIHRoZW4gZW5kR2F0ZS5jb21iaW5lZEZyYWdtZW50LmVuY2xvc2luZ0ludGVyYWN0aW9uLm9jbEFzVHlwZShJbnRlcmFjdGlvbkZyYWdtZW50KS0+YXNTZXQoKS0+JiN4RDsKLSAgICAgdW5pb24oZW5kR2F0ZS5jb21iaW5lZEZyYWdtZW50LmVuY2xvc2luZ09wZXJhbmQub2NsQXNUeXBlKEludGVyYWN0aW9uRnJhZ21lbnQpLT5hc1NldCgpKSYjeEQ7Ci0gIGVsc2UgaWYgZW5kR2F0ZS5pc0luc2lkZUNGKCkgJiN4RDsKLSAgICB0aGVuIGVuZEdhdGUuY29tYmluZWRGcmFnbWVudC5vY2xBc1R5cGUoSW50ZXJhY3Rpb25GcmFnbWVudCktPmFzU2V0KCkmI3hEOwotICAgIGVsc2UgaWYgZW5kR2F0ZS5pc0Zvcm1hbCgpICYjeEQ7Ci0gICAgICB0aGVuIGVuZEdhdGUuaW50ZXJhY3Rpb24ub2NsQXNUeXBlKEludGVyYWN0aW9uRnJhZ21lbnQpLT5hc1NldCgpJiN4RDsKLSAgICAgIGVsc2UgaWYgZW5kR2F0ZS5pc0FjdHVhbCgpICYjeEQ7Ci0gICAgICAgIHRoZW4gZW5kR2F0ZS5pbnRlcmFjdGlvblVzZS5lbmNsb3NpbmdJbnRlcmFjdGlvbi5vY2xBc1R5cGUoSW50ZXJhY3Rpb25GcmFnbWVudCktPmFzU2V0KCktPiYjeEQ7Ci0gICAgIHVuaW9uKGVuZEdhdGUuaW50ZXJhY3Rpb25Vc2UuZW5jbG9zaW5nT3BlcmFuZC5vY2xBc1R5cGUoSW50ZXJhY3Rpb25GcmFnbWVudCktPmFzU2V0KCkpJiN4RDsKLSAgICAgICAgZWxzZSBudWxsJiN4RDsKLSAgICAgICAgZW5kaWYmI3hEOwotICAgICAgZW5kaWYmI3hEOwotICAgIGVuZGlmJiN4RDsKLSAgZW5kaWYmI3hEOwotZWxzZSAtLSBpdCBpcyBhIE1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiYjeEQ7Ci1sZXQgZW5kTU9TIDogTWVzc2FnZU9jY3VycmVuY2VTcGVjaWZpY2F0aW9uICA9ICYjeEQ7Ci0gIHNlbGYtPnNlbGVjdChvY2xJc0tpbmRPZihNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24pKS5vY2xBc1R5cGUoTWVzc2FnZU9jY3VycmVuY2VTcGVjaWZpY2F0aW9uKS0+YXNPcmRlcmVkU2V0KCktPmZpcnN0KCkgJiN4RDsKLSAgaW4mI3hEOwotICBpZiBlbmRNT1MuZW5jbG9zaW5nSW50ZXJhY3Rpb24tPm5vdEVtcHR5KCkgJiN4RDsKLSAgdGhlbiBlbmRNT1MuZW5jbG9zaW5nSW50ZXJhY3Rpb24ub2NsQXNUeXBlKEludGVyYWN0aW9uRnJhZ21lbnQpLT5hc1NldCgpJiN4RDsKLSAgZWxzZSBlbmRNT1MuZW5jbG9zaW5nT3BlcmFuZC5vY2xBc1R5cGUoSW50ZXJhY3Rpb25GcmFnbWVudCktPmFzU2V0KCkmI3hEOwotICBlbmRpZiYjeEQ7Ci1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTWVzc2FnZUVuZC1lbmNsb3NpbmdGcmFnbWVudC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iSW50ZXJhY3Rpb25GcmFnbWVudCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTWVzc2FnZUVuZC1lbmNsb3NpbmdGcmFnbWVudC1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Ik1lc3NhZ2VFbmQtZW5jbG9zaW5nRnJhZ21lbnQtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iTWVzc2FnZU9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIiBuYW1lPSJNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgTWVzc2FnZU9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIHNwZWNpZmllcyB0aGUgb2NjdXJyZW5jZSBvZiBNZXNzYWdlIGV2ZW50cywgc3VjaCBhcyBzZW5kaW5nIGFuZCByZWNlaXZpbmcgb2YgU2lnbmFscyBvciBpbnZva2luZyBvciByZWNlaXZpbmcgb2YgT3BlcmF0aW9uIGNhbGxzLiBBIE1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiBpcyBhIGtpbmQgb2YgTWVzc2FnZUVuZC4gTWVzc2FnZXMgYXJlIGdlbmVyYXRlZCBlaXRoZXIgYnkgc3luY2hyb25vdXMgT3BlcmF0aW9uIGNhbGxzIG9yIGFzeW5jaHJvbm91cyBTaWduYWwgc2VuZHMuIFRoZXkgYXJlIHJlY2VpdmVkIGJ5IHRoZSBleGVjdXRpb24gb2YgY29ycmVzcG9uZGluZyBBY2NlcHRFdmVudEFjdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJNZXNzYWdlT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik1lc3NhZ2VFbmQiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Ik1lc3NhZ2VPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iIG5hbWU9Ik9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPGJvZHk+QW4gT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gaXMgdGhlIGJhc2ljIHNlbWFudGljIHVuaXQgb2YgSW50ZXJhY3Rpb25zLiBUaGUgc2VxdWVuY2VzIG9mIG9jY3VycmVuY2VzIHNwZWNpZmllZCBieSB0aGVtIGFyZSB0aGUgbWVhbmluZ3Mgb2YgSW50ZXJhY3Rpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkludGVyYWN0aW9uRnJhZ21lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLWNvdmVyZWQiIG5hbWU9ImNvdmVyZWQiIHR5cGU9IkxpZmVsaW5lIiByZWRlZmluZWRQcm9wZXJ0eT0iSW50ZXJhY3Rpb25GcmFnbWVudC1jb3ZlcmVkIiBhc3NvY2lhdGlvbj0iQV9jb3ZlcmVkX2V2ZW50cyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1jb3ZlcmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tY292ZXJlZCI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgTGlmZWxpbmUgb24gd2hpY2ggdGhlIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIGFwcGVhcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi10b0FmdGVyIiBuYW1lPSJ0b0FmdGVyIiB0eXBlPSJHZW5lcmFsT3JkZXJpbmciIGFzc29jaWF0aW9uPSJBX2JlZm9yZV90b0FmdGVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLXRvQWZ0ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi10b0FmdGVyIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBHZW5lcmFsT3JkZXJpbmdzIHRoYXQgc3BlY2lmeSBFdmVudE9jdXJyZW5jZXMgdGhhdCBtdXN0IG9jY3VyIGFmdGVyIHRoaXMgT2NjdXJyZW5jZVNwZWNpZmljYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi10b0FmdGVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tdG9BZnRlci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi10b0JlZm9yZSIgbmFtZT0idG9CZWZvcmUiIHR5cGU9IkdlbmVyYWxPcmRlcmluZyIgYXNzb2NpYXRpb249IkFfdG9CZWZvcmVfYWZ0ZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tdG9CZWZvcmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi10b0JlZm9yZSI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgR2VuZXJhbE9yZGVyaW5ncyB0aGF0IHNwZWNpZnkgRXZlbnRPY3VycmVuY2VzIHRoYXQgbXVzdCBvY2N1ciBiZWZvcmUgdGhpcyBPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLXRvQmVmb3JlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tdG9CZWZvcmUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tZ2V0Q292ZXJlZCIgbmFtZT0iZ2V0Q292ZXJlZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1nZXRDb3ZlcmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tZ2V0Q292ZXJlZCI+Ci0gICAgICAgICAgPGJvZHk+UmV0dXJucyB0aGUgTGlmZWxpbmUgb24gd2hpY2ggdGhlIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIGFwcGVhcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tZ2V0Q292ZXJlZC1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iTGlmZWxpbmUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLWdldENvdmVyZWQtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1zZXRDb3ZlcmVkIiBuYW1lPSJzZXRDb3ZlcmVkIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLXNldENvdmVyZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1zZXRDb3ZlcmVkIj4KLSAgICAgICAgICA8Ym9keT5TZXRzIHRoZSBMaWZlbGluZSBvbiB3aGljaCB0aGUgT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gYXBwZWFycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1zZXRDb3ZlcmVkLXZhbHVlIiBuYW1lPSJ2YWx1ZSIgdHlwZT0iTGlmZWxpbmUiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlBhcnREZWNvbXBvc2l0aW9uIiBuYW1lPSJQYXJ0RGVjb21wb3NpdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFydERlY29tcG9zaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJ0RGVjb21wb3NpdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgUGFydERlY29tcG9zaXRpb24gaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW50ZXJuYWwgSW50ZXJhY3Rpb25zIG9mIG9uZSBMaWZlbGluZSByZWxhdGl2ZSB0byBhbiBJbnRlcmFjdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQYXJ0RGVjb21wb3NpdGlvbi1jb21tdXRhdGl2aXR5X29mX2RlY29tcG9zaXRpb24iIG5hbWU9ImNvbW11dGF0aXZpdHlfb2ZfZGVjb21wb3NpdGlvbiIgY29uc3RyYWluZWRFbGVtZW50PSJQYXJ0RGVjb21wb3NpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJ0RGVjb21wb3NpdGlvbi1jb21tdXRhdGl2aXR5X29mX2RlY29tcG9zaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJ0RGVjb21wb3NpdGlvbi1jb21tdXRhdGl2aXR5X29mX2RlY29tcG9zaXRpb24iPgotICAgICAgICAgIDxib2R5PkFzc3VtZSB0aGF0IHdpdGhpbiBJbnRlcmFjdGlvbiBYLCBMaWZlbGluZSBMIGlzIG9mIGNsYXNzIEMgYW5kIGRlY29tcG9zZWQgdG8gRC4gQXNzdW1lIGFsc28gdGhhdCB0aGVyZSBpcyB3aXRoaW4gWCBhbiBJbnRlcmFjdGlvblVzZSAoc2F5KSBVIHRoYXQgY292ZXJzIEwuIEFjY29yZGluZyB0byB0aGUgY29uc3RyYWludCBhYm92ZSBVIHdpbGwgaGF2ZSBhIGNvdW50ZXJwYXJ0IENVIHdpdGhpbiBELiBXaXRoaW4gdGhlIEludGVyYWN0aW9uIHJlZmVyZW5jZWQgYnkgVSwgTCBzaG91bGQgYWxzbyBiZSBkZWNvbXBvc2VkLCBhbmQgdGhlIGRlY29tcG9zaXRpb24gc2hvdWxkIHJlZmVyZW5jZSBDVS4gKFRoaXMgcnVsZSBpcyBjYWxsZWQgY29tbXV0YXRpdml0eSBvZiBkZWNvbXBvc2l0aW9uLik8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUGFydERlY29tcG9zaXRpb24tY29tbXV0YXRpdml0eV9vZl9kZWNvbXBvc2l0aW9uLV9zcGVjaWZpY2F0aW9uIiBsYW5ndWFnZT0iIi8+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQYXJ0RGVjb21wb3NpdGlvbi1hc3N1bWUiIG5hbWU9ImFzc3VtZSIgY29uc3RyYWluZWRFbGVtZW50PSJQYXJ0RGVjb21wb3NpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJ0RGVjb21wb3NpdGlvbi1hc3N1bWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYXJ0RGVjb21wb3NpdGlvbi1hc3N1bWUiPgotICAgICAgICAgIDxib2R5PkFzc3VtZSB0aGF0IHdpdGhpbiBJbnRlcmFjdGlvbiBYLCBMaWZlbGluZSBMIGlzIG9mIGNsYXNzIEMgYW5kIGRlY29tcG9zZWQgdG8gRC4gV2l0aGluIFggdGhlcmUgaXMgYSBzZXF1ZW5jZSBvZiBjb25zdHJ1Y3RzIGFsb25nIEwgKHN1Y2ggY29uc3RydWN0cyBhcmUgQ29tYmluZWRGcmFnbWVudHMsIEludGVyYWN0aW9uVXNlIGFuZCAocGxhaW4pIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9ucykuIFRoZW4gYSBjb3JyZXNwb25kaW5nIHNlcXVlbmNlIG9mIGNvbnN0cnVjdHMgbXVzdCBhcHBlYXIgd2l0aGluIEQsIG1hdGNoZWQgb25lLXRvLW9uZSBpbiB0aGUgc2FtZSBvcmRlci4gaSkgQ29tYmluZWRGcmFnbWVudCBjb3ZlcmluZyBMIGFyZSBtYXRjaGVkIHdpdGggYW4gZXh0cmEtZ2xvYmFsIENvbWJpbmVkRnJhZ21lbnQgaW4gRC4gaWkpIEFuIEludGVyYWN0aW9uVXNlIGNvdmVyaW5nIEwgaXMgbWF0Y2hlZCB3aXRoIGEgZ2xvYmFsIChpLmUuLCBjb3ZlcmluZyBhbGwgTGlmZWxpbmVzKSBJbnRlcmFjdGlvblVzZSBpbiBELiBpaWkpIEEgcGxhaW4gT2NjdXJyZW5jZVNwZWNpZmljYXRpb24gb24gTCBpcyBjb25zaWRlcmVkIGFuIGFjdHVhbEdhdGUgdGhhdCBtdXN0IGJlIG1hdGNoZWQgYnkgYSBmb3JtYWxHYXRlIG9mIEQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhcnREZWNvbXBvc2l0aW9uLWFzc3VtZS1fc3BlY2lmaWNhdGlvbiIgbGFuZ3VhZ2U9IiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUGFydERlY29tcG9zaXRpb24tcGFydHNfb2ZfaW50ZXJuYWxfc3RydWN0dXJlcyIgbmFtZT0icGFydHNfb2ZfaW50ZXJuYWxfc3RydWN0dXJlcyIgY29uc3RyYWluZWRFbGVtZW50PSJQYXJ0RGVjb21wb3NpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYXJ0RGVjb21wb3NpdGlvbi1wYXJ0c19vZl9pbnRlcm5hbF9zdHJ1Y3R1cmVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFydERlY29tcG9zaXRpb24tcGFydHNfb2ZfaW50ZXJuYWxfc3RydWN0dXJlcyI+Ci0gICAgICAgICAgPGJvZHk+UGFydERlY29tcG9zaXRpb25zIGFwcGx5IG9ubHkgdG8gUGFydHMgdGhhdCBhcmUgUGFydHMgb2YgSW50ZXJuYWwgU3RydWN0dXJlcyBub3QgdG8gUGFydHMgb2YgQ29sbGFib3JhdGlvbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhcnREZWNvbXBvc2l0aW9uLXBhcnRzX29mX2ludGVybmFsX3N0cnVjdHVyZXMtX3NwZWNpZmljYXRpb24iIGxhbmd1YWdlPSIiLz4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUGFydERlY29tcG9zaXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkludGVyYWN0aW9uVXNlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlN0YXRlSW52YXJpYW50IiBuYW1lPSJTdGF0ZUludmFyaWFudCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGVJbnZhcmlhbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZUludmFyaWFudCI+Ci0gICAgICAgIDxib2R5PkEgU3RhdGVJbnZhcmlhbnQgaXMgYSBydW50aW1lIGNvbnN0cmFpbnQgb24gdGhlIHBhcnRpY2lwYW50cyBvZiB0aGUgSW50ZXJhY3Rpb24uIEl0IG1heSBiZSB1c2VkIHRvIHNwZWNpZnkgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBraW5kcyBvZiBDb25zdHJhaW50cywgc3VjaCBhcyB2YWx1ZXMgb2YgQXR0cmlidXRlcyBvciBWYXJpYWJsZXMsIGludGVybmFsIG9yIGV4dGVybmFsIFN0YXRlcywgYW5kIHNvIG9uLiBBIFN0YXRlSW52YXJpYW50IGlzIGFuIEludGVyYWN0aW9uRnJhZ21lbnQgYW5kIGl0IGlzIHBsYWNlZCBvbiBhIExpZmVsaW5lLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU3RhdGVJbnZhcmlhbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkludGVyYWN0aW9uRnJhZ21lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0YXRlSW52YXJpYW50LWNvdmVyZWQiIG5hbWU9ImNvdmVyZWQiIHR5cGU9IkxpZmVsaW5lIiByZWRlZmluZWRQcm9wZXJ0eT0iSW50ZXJhY3Rpb25GcmFnbWVudC1jb3ZlcmVkIiBhc3NvY2lhdGlvbj0iQV9jb3ZlcmVkX3N0YXRlSW52YXJpYW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlSW52YXJpYW50LWNvdmVyZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZUludmFyaWFudC1jb3ZlcmVkIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBMaWZlbGluZSBvbiB3aGljaCB0aGUgU3RhdGVJbnZhcmlhbnQgYXBwZWFycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0YXRlSW52YXJpYW50LWludmFyaWFudCIgbmFtZT0iaW52YXJpYW50IiB0eXBlPSJDb25zdHJhaW50IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2ludmFyaWFudF9zdGF0ZUludmFyaWFudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZUludmFyaWFudC1pbnZhcmlhbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZUludmFyaWFudC1pbnZhcmlhbnQiPgotICAgICAgICAgIDxib2R5PkEgQ29uc3RyYWludCB0aGF0IHNob3VsZCBob2xkIGF0IHJ1bnRpbWUgZm9yIHRoaXMgU3RhdGVJbnZhcmlhbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kIiBuYW1lPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25PcGVyYXRvcktpbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZCI+Ci0gICAgICAgIDxib2R5PkludGVyYWN0aW9uT3BlcmF0b3JLaW5kIGlzIGFuIGVudW1lcmF0aW9uIGRlc2lnbmF0aW5nIHRoZSBkaWZmZXJlbnQga2luZHMgb2Ygb3BlcmF0b3JzIG9mIENvbWJpbmVkRnJhZ21lbnRzLiBUaGUgSW50ZXJhY3Rpb25PcGVyYW5kIGRlZmluZXMgdGhlIHR5cGUgb2Ygb3BlcmF0b3Igb2YgYSBDb21iaW5lZEZyYWdtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLXNlcSIgbmFtZT0ic2VxIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLXNlcS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLXNlcSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyYWN0aW9uT3BlcmF0b3JLaW5kIHNlcSBkZXNpZ25hdGVzIHRoYXQgdGhlIENvbWJpbmVkRnJhZ21lbnQgcmVwcmVzZW50cyBhIHdlYWsgc2VxdWVuY2luZyBiZXR3ZWVuIHRoZSBiZWhhdmlvcnMgb2YgdGhlIG9wZXJhbmRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1hbHQiIG5hbWU9ImFsdCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1hbHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1hbHQiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnRlcmFjdGlvbk9wZXJhdG9yS2luZCBhbHQgZGVzaWduYXRlcyB0aGF0IHRoZSBDb21iaW5lZEZyYWdtZW50IHJlcHJlc2VudHMgYSBjaG9pY2Ugb2YgYmVoYXZpb3IuIEF0IG1vc3Qgb25lIG9mIHRoZSBvcGVyYW5kcyB3aWxsIGJlIGNob3Nlbi4gVGhlIGNob3NlbiBvcGVyYW5kIG11c3QgaGF2ZSBhbiBleHBsaWNpdCBvciBpbXBsaWNpdCBndWFyZCBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHRydWUgYXQgdGhpcyBwb2ludCBpbiB0aGUgaW50ZXJhY3Rpb24uIEFuIGltcGxpY2l0IHRydWUgZ3VhcmQgaXMgaW1wbGllZCBpZiB0aGUgb3BlcmFuZCBoYXMgbm8gZ3VhcmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLW9wdCIgbmFtZT0ib3B0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLW9wdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLW9wdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyYWN0aW9uT3BlcmF0b3JLaW5kIG9wdCBkZXNpZ25hdGVzIHRoYXQgdGhlIENvbWJpbmVkRnJhZ21lbnQgcmVwcmVzZW50cyBhIGNob2ljZSBvZiBiZWhhdmlvciB3aGVyZSBlaXRoZXIgdGhlIChzb2xlKSBvcGVyYW5kIGhhcHBlbnMgb3Igbm90aGluZyBoYXBwZW5zLiBBbiBvcHRpb24gaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gYW4gYWx0ZXJuYXRpdmUgQ29tYmluZWRGcmFnbWVudCB3aGVyZSB0aGVyZSBpcyBvbmUgb3BlcmFuZCB3aXRoIG5vbi1lbXB0eSBjb250ZW50IGFuZCB0aGUgc2Vjb25kIG9wZXJhbmQgaXMgZW1wdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLWJyZWFrIiBuYW1lPSJicmVhayI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1icmVhay1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLWJyZWFrIj4KLSAgICAgICAgICA8Ym9keT5UaGUgSW50ZXJhY3Rpb25PcGVyYXRvcktpbmQgYnJlYWsgZGVzaWduYXRlcyB0aGF0IHRoZSBDb21iaW5lZEZyYWdtZW50IHJlcHJlc2VudHMgYSBicmVha2luZyBzY2VuYXJpbyBpbiB0aGUgc2Vuc2UgdGhhdCB0aGUgb3BlcmFuZCBpcyBhIHNjZW5hcmlvIHRoYXQgaXMgcGVyZm9ybWVkIGluc3RlYWQgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgZW5jbG9zaW5nIEludGVyYWN0aW9uRnJhZ21lbnQuIEEgYnJlYWsgb3BlcmF0b3Igd2l0aCBhIGd1YXJkIGlzIGNob3NlbiB3aGVuIHRoZSBndWFyZCBpcyB0cnVlIGFuZCB0aGUgcmVzdCBvZiB0aGUgZW5jbG9zaW5nIEludGVyYWN0aW9uIEZyYWdtZW50IGlzIGlnbm9yZWQuIFdoZW4gdGhlIGd1YXJkIG9mIHRoZSBicmVhayBvcGVyYW5kIGlzIGZhbHNlLCB0aGUgYnJlYWsgb3BlcmFuZCBpcyBpZ25vcmVkIGFuZCB0aGUgcmVzdCBvZiB0aGUgZW5jbG9zaW5nIEludGVyYWN0aW9uRnJhZ21lbnQgaXMgY2hvc2VuLiBUaGUgY2hvaWNlIGJldHdlZW4gYSBicmVhayBvcGVyYW5kIHdpdGhvdXQgYSBndWFyZCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGVuY2xvc2luZyBJbnRlcmFjdGlvbkZyYWdtZW50IGlzIGRvbmUgbm9uLWRldGVybWluaXN0aWNhbGx5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1wYXIiIG5hbWU9InBhciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1wYXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1wYXIiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnRlcmFjdGlvbk9wZXJhdG9yS2luZCBwYXIgZGVzaWduYXRlcyB0aGF0IHRoZSBDb21iaW5lZEZyYWdtZW50IHJlcHJlc2VudHMgYSBwYXJhbGxlbCBtZXJnZSBiZXR3ZWVuIHRoZSBiZWhhdmlvcnMgb2YgdGhlIG9wZXJhbmRzLiBUaGUgT2NjdXJyZW5jZVNwZWNpZmljYXRpb25zIG9mIHRoZSBkaWZmZXJlbnQgb3BlcmFuZHMgY2FuIGJlIGludGVybGVhdmVkIGluIGFueSB3YXkgYXMgbG9uZyBhcyB0aGUgb3JkZXJpbmcgaW1wb3NlZCBieSBlYWNoIG9wZXJhbmQgYXMgc3VjaCBpcyBwcmVzZXJ2ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLXN0cmljdCIgbmFtZT0ic3RyaWN0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLXN0cmljdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLXN0cmljdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyYWN0aW9uT3BlcmF0b3JLaW5kIHN0cmljdCBkZXNpZ25hdGVzIHRoYXQgdGhlIENvbWJpbmVkRnJhZ21lbnQgcmVwcmVzZW50cyBhIHN0cmljdCBzZXF1ZW5jaW5nIGJldHdlZW4gdGhlIGJlaGF2aW9ycyBvZiB0aGUgb3BlcmFuZHMuIFRoZSBzZW1hbnRpY3Mgb2Ygc3RyaWN0IHNlcXVlbmNpbmcgZGVmaW5lcyBhIHN0cmljdCBvcmRlcmluZyBvZiB0aGUgb3BlcmFuZHMgb24gdGhlIGZpcnN0IGxldmVsIHdpdGhpbiB0aGUgQ29tYmluZWRGcmFnbWVudCB3aXRoIGludGVyYWN0aW9uT3BlcmF0b3Igc3RyaWN0LiBUaGVyZWZvcmUgT2NjdXJyZW5jZVNwZWNpZmljYXRpb25zIHdpdGhpbiBjb250YWluZWQgQ29tYmluZWRGcmFnbWVudCB3aWxsIG5vdCBkaXJlY3RseSBiZSBjb21wYXJlZCB3aXRoIG90aGVyIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9ucyBvZiB0aGUgZW5jbG9zaW5nIENvbWJpbmVkRnJhZ21lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLWxvb3AiIG5hbWU9Imxvb3AiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25PcGVyYXRvcktpbmQtbG9vcC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLWxvb3AiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnRlcmFjdGlvbk9wZXJhdG9yS2luZCBsb29wIGRlc2lnbmF0ZXMgdGhhdCB0aGUgQ29tYmluZWRGcmFnbWVudCByZXByZXNlbnRzIGEgbG9vcC4gVGhlIGxvb3Agb3BlcmFuZCB3aWxsIGJlIHJlcGVhdGVkIGEgbnVtYmVyIG9mIHRpbWVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1jcml0aWNhbCIgbmFtZT0iY3JpdGljYWwiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJhY3Rpb25PcGVyYXRvcktpbmQtY3JpdGljYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1jcml0aWNhbCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyYWN0aW9uT3BlcmF0b3JLaW5kIGNyaXRpY2FsIGRlc2lnbmF0ZXMgdGhhdCB0aGUgQ29tYmluZWRGcmFnbWVudCByZXByZXNlbnRzIGEgY3JpdGljYWwgcmVnaW9uLiBBIGNyaXRpY2FsIHJlZ2lvbiBtZWFucyB0aGF0IHRoZSB0cmFjZXMgb2YgdGhlIHJlZ2lvbiBjYW5ub3QgYmUgaW50ZXJsZWF2ZWQgYnkgb3RoZXIgT2NjdXJyZW5jZVNwZWNpZmljYXRpb25zIChvbiB0aG9zZSBMaWZlbGluZXMgY292ZXJlZCBieSB0aGUgcmVnaW9uKS4gVGhpcyBtZWFucyB0aGF0IHRoZSByZWdpb24gaXMgdHJlYXRlZCBhdG9taWNhbGx5IGJ5IHRoZSBlbmNsb3NpbmcgZnJhZ21lbnQgd2hlbiBkZXRlcm1pbmluZyB0aGUgc2V0IG9mIHZhbGlkIHRyYWNlcy4gRXZlbiB0aG91Z2ggZW5jbG9zaW5nIENvbWJpbmVkRnJhZ21lbnRzIG1heSBpbXBseSB0aGF0IHNvbWUgT2NjdXJyZW5jZVNwZWNpZmljYXRpb25zIG1heSBpbnRlcmxlYXZlIGludG8gdGhlIHJlZ2lvbiwgc3VjaCBhcyB3aXRoIHBhci1vcGVyYXRvciwgdGhpcyBpcyBwcmV2ZW50ZWQgYnkgZGVmaW5pbmcgYSByZWdpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLW5lZyIgbmFtZT0ibmVnIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLW5lZy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLW5lZyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyYWN0aW9uT3BlcmF0b3JLaW5kIG5lZyBkZXNpZ25hdGVzIHRoYXQgdGhlIENvbWJpbmVkRnJhZ21lbnQgcmVwcmVzZW50cyB0cmFjZXMgdGhhdCBhcmUgZGVmaW5lZCB0byBiZSBpbnZhbGlkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1hc3NlcnQiIG5hbWU9ImFzc2VydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1hc3NlcnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1hc3NlcnQiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnRlcmFjdGlvbk9wZXJhdG9yS2luZCBhc3NlcnQgZGVzaWduYXRlcyB0aGF0IHRoZSBDb21iaW5lZEZyYWdtZW50IHJlcHJlc2VudHMgYW4gYXNzZXJ0aW9uLiBUaGUgc2VxdWVuY2VzIG9mIHRoZSBvcGVyYW5kIG9mIHRoZSBhc3NlcnRpb24gYXJlIHRoZSBvbmx5IHZhbGlkIGNvbnRpbnVhdGlvbnMuIEFsbCBvdGhlciBjb250aW51YXRpb25zIHJlc3VsdCBpbiBhbiBpbnZhbGlkIHRyYWNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1pZ25vcmUiIG5hbWU9Imlnbm9yZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1pZ25vcmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1pZ25vcmUiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnRlcmFjdGlvbk9wZXJhdG9yS2luZCBpZ25vcmUgZGVzaWduYXRlcyB0aGF0IHRoZXJlIGFyZSBzb21lIG1lc3NhZ2UgdHlwZXMgdGhhdCBhcmUgbm90IHNob3duIHdpdGhpbiB0aGlzIGNvbWJpbmVkIGZyYWdtZW50LiBUaGVzZSBtZXNzYWdlIHR5cGVzIGNhbiBiZSBjb25zaWRlcmVkIGluc2lnbmlmaWNhbnQgYW5kIGFyZSBpbXBsaWNpdGx5IGlnbm9yZWQgaWYgdGhleSBhcHBlYXIgaW4gYSBjb3JyZXNwb25kaW5nIGV4ZWN1dGlvbi4gQWx0ZXJuYXRpdmVseSwgb25lIGNhbiB1bmRlcnN0YW5kIGlnbm9yZSB0byBtZWFuIHRoYXQgdGhlIG1lc3NhZ2UgdHlwZXMgdGhhdCBhcmUgaWdub3JlZCBjYW4gYXBwZWFyIGFueXdoZXJlIGluIHRoZSB0cmFjZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLWNvbnNpZGVyIiBuYW1lPSJjb25zaWRlciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmFjdGlvbk9wZXJhdG9yS2luZC1jb25zaWRlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyYWN0aW9uT3BlcmF0b3JLaW5kLWNvbnNpZGVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgSW50ZXJhY3Rpb25PcGVyYXRvcktpbmQgY29uc2lkZXIgZGVzaWduYXRlcyB3aGljaCBtZXNzYWdlcyBzaG91bGQgYmUgY29uc2lkZXJlZCB3aXRoaW4gdGhpcyBjb21iaW5lZCBmcmFnbWVudC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGRlZmluaW5nIGV2ZXJ5IG90aGVyIG1lc3NhZ2UgdG8gYmUgaWdub3JlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Ik1lc3NhZ2VLaW5kIiBuYW1lPSJNZXNzYWdlS2luZCIgdmlzaWJpbGl0eT0icHJpdmF0ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZUtpbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlS2luZCI+Ci0gICAgICAgIDxib2R5PlRoaXMgaXMgYW4gZW51bWVyYXRlZCB0eXBlIHRoYXQgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBNZXNzYWdlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Ik1lc3NhZ2VLaW5kLWNvbXBsZXRlIiBuYW1lPSJjb21wbGV0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNZXNzYWdlS2luZC1jb21wbGV0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1lc3NhZ2VLaW5kLWNvbXBsZXRlIj4KLSAgICAgICAgICA8Ym9keT5zZW5kRXZlbnQgYW5kIHJlY2VpdmVFdmVudCBhcmUgcHJlc2VudDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJNZXNzYWdlS2luZC1sb3N0IiBuYW1lPSJsb3N0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2VLaW5kLWxvc3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlS2luZC1sb3N0Ij4KLSAgICAgICAgICA8Ym9keT5zZW5kRXZlbnQgcHJlc2VudCBhbmQgcmVjZWl2ZUV2ZW50IGFic2VudDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJNZXNzYWdlS2luZC1mb3VuZCIgbmFtZT0iZm91bmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZUtpbmQtZm91bmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlS2luZC1mb3VuZCI+Ci0gICAgICAgICAgPGJvZHk+c2VuZEV2ZW50IGFic2VudCBhbmQgcmVjZWl2ZUV2ZW50IHByZXNlbnQ8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iTWVzc2FnZUtpbmQtdW5rbm93biIgbmFtZT0idW5rbm93biI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNZXNzYWdlS2luZC11bmtub3duLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWVzc2FnZUtpbmQtdW5rbm93biI+Ci0gICAgICAgICAgPGJvZHk+c2VuZEV2ZW50IGFuZCByZWNlaXZlRXZlbnQgYWJzZW50IChzaG91bGQgbm90IGFwcGVhcik8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9Ik1lc3NhZ2VTb3J0IiBuYW1lPSJNZXNzYWdlU29ydCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZVNvcnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlU29ydCI+Ci0gICAgICAgIDxib2R5PlRoaXMgaXMgYW4gZW51bWVyYXRlZCB0eXBlIHRoYXQgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb21tdW5pY2F0aW9uIGFjdGlvbiB0aGF0IHdhcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBNZXNzYWdlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Ik1lc3NhZ2VTb3J0LXN5bmNoQ2FsbCIgbmFtZT0ic3luY2hDYWxsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2VTb3J0LXN5bmNoQ2FsbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1lc3NhZ2VTb3J0LXN5bmNoQ2FsbCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG1lc3NhZ2Ugd2FzIGdlbmVyYXRlZCBieSBhIHN5bmNocm9ub3VzIGNhbGwgdG8gYW4gb3BlcmF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJNZXNzYWdlU29ydC1hc3luY2hDYWxsIiBuYW1lPSJhc3luY2hDYWxsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2VTb3J0LWFzeW5jaENhbGwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlU29ydC1hc3luY2hDYWxsIj4KLSAgICAgICAgICA8Ym9keT5UaGUgbWVzc2FnZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIGFzeW5jaHJvbm91cyBjYWxsIHRvIGFuIG9wZXJhdGlvbjsgaS5lLiwgYSBDYWxsQWN0aW9uIHdpdGggaXNTeW5jaHJvbm91cyA9IGZhbHNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJNZXNzYWdlU29ydC1hc3luY2hTaWduYWwiIG5hbWU9ImFzeW5jaFNpZ25hbCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNZXNzYWdlU29ydC1hc3luY2hTaWduYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlU29ydC1hc3luY2hTaWduYWwiPgotICAgICAgICAgIDxib2R5PlRoZSBtZXNzYWdlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gYXN5bmNocm9ub3VzIHNlbmQgYWN0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJNZXNzYWdlU29ydC1jcmVhdGVNZXNzYWdlIiBuYW1lPSJjcmVhdGVNZXNzYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1lc3NhZ2VTb3J0LWNyZWF0ZU1lc3NhZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlU29ydC1jcmVhdGVNZXNzYWdlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgbWVzc2FnZSBkZXNpZ25hdGluZyB0aGUgY3JlYXRpb24gb2YgYW5vdGhlciBsaWZlbGluZSBvYmplY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Ik1lc3NhZ2VTb3J0LWRlbGV0ZU1lc3NhZ2UiIG5hbWU9ImRlbGV0ZU1lc3NhZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZVNvcnQtZGVsZXRlTWVzc2FnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1lc3NhZ2VTb3J0LWRlbGV0ZU1lc3NhZ2UiPgotICAgICAgICAgIDxib2R5PlRoZSBtZXNzYWdlIGRlc2lnbmF0aW5nIHRoZSB0ZXJtaW5hdGlvbiBvZiBhbm90aGVyIGxpZmVsaW5lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJNZXNzYWdlU29ydC1yZXBseSIgbmFtZT0icmVwbHkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWVzc2FnZVNvcnQtcmVwbHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNZXNzYWdlU29ydC1yZXBseSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG1lc3NhZ2UgaXMgYSByZXBseSBtZXNzYWdlIHRvIGFuIG9wZXJhdGlvbiBjYWxsLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9pbnZhcmlhbnRfc3RhdGVJbnZhcmlhbnQiIG5hbWU9IkFfaW52YXJpYW50X3N0YXRlSW52YXJpYW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlN0YXRlSW52YXJpYW50LWludmFyaWFudCBBX2ludmFyaWFudF9zdGF0ZUludmFyaWFudC1zdGF0ZUludmFyaWFudCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2ludmFyaWFudF9zdGF0ZUludmFyaWFudC1zdGF0ZUludmFyaWFudCIgbmFtZT0ic3RhdGVJbnZhcmlhbnQiIHR5cGU9IlN0YXRlSW52YXJpYW50IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfaW52YXJpYW50X3N0YXRlSW52YXJpYW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2ludmFyaWFudF9zdGF0ZUludmFyaWFudC1zdGF0ZUludmFyaWFudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jb3ZlcmVkX3N0YXRlSW52YXJpYW50IiBuYW1lPSJBX2NvdmVyZWRfc3RhdGVJbnZhcmlhbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RhdGVJbnZhcmlhbnQtY292ZXJlZCBBX2NvdmVyZWRfc3RhdGVJbnZhcmlhbnQtc3RhdGVJbnZhcmlhbnQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jb3ZlcmVkX3N0YXRlSW52YXJpYW50LXN0YXRlSW52YXJpYW50IiBuYW1lPSJzdGF0ZUludmFyaWFudCIgdHlwZT0iU3RhdGVJbnZhcmlhbnQiIHN1YnNldHRlZFByb3BlcnR5PSJMaWZlbGluZS1jb3ZlcmVkQnkiIGFzc29jaWF0aW9uPSJBX2NvdmVyZWRfc3RhdGVJbnZhcmlhbnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfY292ZXJlZF9zdGF0ZUludmFyaWFudC1zdGF0ZUludmFyaWFudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfY292ZXJlZF9zdGF0ZUludmFyaWFudC1zdGF0ZUludmFyaWFudC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY292ZXJlZF9ldmVudHMiIG5hbWU9IkFfY292ZXJlZF9ldmVudHMiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tY292ZXJlZCBBX2NvdmVyZWRfZXZlbnRzLWV2ZW50cyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2NvdmVyZWRfZXZlbnRzLWV2ZW50cyIgbmFtZT0iZXZlbnRzIiB0eXBlPSJPY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiIgaXNPcmRlcmVkPSJ0cnVlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTGlmZWxpbmUtY292ZXJlZEJ5IiBhc3NvY2lhdGlvbj0iQV9jb3ZlcmVkX2V2ZW50cyI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jb3ZlcmVkX2V2ZW50cy1ldmVudHMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NvdmVyZWRfZXZlbnRzLWV2ZW50cy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdG9CZWZvcmVfYWZ0ZXIiIG5hbWU9IkFfdG9CZWZvcmVfYWZ0ZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tdG9CZWZvcmUgR2VuZXJhbE9yZGVyaW5nLWFmdGVyIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbWVzc2FnZV9tZXNzYWdlRW5kIiBuYW1lPSJBX21lc3NhZ2VfbWVzc2FnZUVuZCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJNZXNzYWdlRW5kLW1lc3NhZ2UgQV9tZXNzYWdlX21lc3NhZ2VFbmQtbWVzc2FnZUVuZCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX21lc3NhZ2VfbWVzc2FnZUVuZC1tZXNzYWdlRW5kIiBuYW1lPSJtZXNzYWdlRW5kIiB0eXBlPSJNZXNzYWdlRW5kIiBhc3NvY2lhdGlvbj0iQV9tZXNzYWdlX21lc3NhZ2VFbmQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbWVzc2FnZV9tZXNzYWdlRW5kLW1lc3NhZ2VFbmQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX21lc3NhZ2VfbWVzc2FnZUVuZC1tZXNzYWdlRW5kLV91cHBlclZhbHVlIiB2YWx1ZT0iMiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zaWduYXR1cmVfbWVzc2FnZSIgbmFtZT0iQV9zaWduYXR1cmVfbWVzc2FnZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJNZXNzYWdlLXNpZ25hdHVyZSBBX3NpZ25hdHVyZV9tZXNzYWdlLW1lc3NhZ2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9zaWduYXR1cmVfbWVzc2FnZS1tZXNzYWdlIiBuYW1lPSJtZXNzYWdlIiB0eXBlPSJNZXNzYWdlIiBhc3NvY2lhdGlvbj0iQV9zaWduYXR1cmVfbWVzc2FnZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9zaWduYXR1cmVfbWVzc2FnZS1tZXNzYWdlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9zaWduYXR1cmVfbWVzc2FnZS1tZXNzYWdlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jb25uZWN0b3JfbWVzc2FnZSIgbmFtZT0iQV9jb25uZWN0b3JfbWVzc2FnZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJNZXNzYWdlLWNvbm5lY3RvciBBX2Nvbm5lY3Rvcl9tZXNzYWdlLW1lc3NhZ2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jb25uZWN0b3JfbWVzc2FnZS1tZXNzYWdlIiBuYW1lPSJtZXNzYWdlIiB0eXBlPSJNZXNzYWdlIiBhc3NvY2lhdGlvbj0iQV9jb25uZWN0b3JfbWVzc2FnZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jb25uZWN0b3JfbWVzc2FnZS1tZXNzYWdlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9jb25uZWN0b3JfbWVzc2FnZS1tZXNzYWdlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZWNlaXZlRXZlbnRfZW5kTWVzc2FnZSIgbmFtZT0iQV9yZWNlaXZlRXZlbnRfZW5kTWVzc2FnZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJNZXNzYWdlLXJlY2VpdmVFdmVudCBBX3JlY2VpdmVFdmVudF9lbmRNZXNzYWdlLWVuZE1lc3NhZ2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZWNlaXZlRXZlbnRfZW5kTWVzc2FnZS1lbmRNZXNzYWdlIiBuYW1lPSJlbmRNZXNzYWdlIiB0eXBlPSJNZXNzYWdlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTWVzc2FnZUVuZC1tZXNzYWdlIiBhc3NvY2lhdGlvbj0iQV9yZWNlaXZlRXZlbnRfZW5kTWVzc2FnZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZWNlaXZlRXZlbnRfZW5kTWVzc2FnZS1lbmRNZXNzYWdlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3NlbmRFdmVudF9lbmRNZXNzYWdlIiBuYW1lPSJBX3NlbmRFdmVudF9lbmRNZXNzYWdlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik1lc3NhZ2Utc2VuZEV2ZW50IEFfc2VuZEV2ZW50X2VuZE1lc3NhZ2UtZW5kTWVzc2FnZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3NlbmRFdmVudF9lbmRNZXNzYWdlLWVuZE1lc3NhZ2UiIG5hbWU9ImVuZE1lc3NhZ2UiIHR5cGU9Ik1lc3NhZ2UiIHN1YnNldHRlZFByb3BlcnR5PSJNZXNzYWdlRW5kLW1lc3NhZ2UiIGFzc29jaWF0aW9uPSJBX3NlbmRFdmVudF9lbmRNZXNzYWdlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3NlbmRFdmVudF9lbmRNZXNzYWdlLWVuZE1lc3NhZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfYXJndW1lbnRfbWVzc2FnZSIgbmFtZT0iQV9hcmd1bWVudF9tZXNzYWdlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik1lc3NhZ2UtYXJndW1lbnQgQV9hcmd1bWVudF9tZXNzYWdlLW1lc3NhZ2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9hcmd1bWVudF9tZXNzYWdlLW1lc3NhZ2UiIG5hbWU9Im1lc3NhZ2UiIHR5cGU9Ik1lc3NhZ2UiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9hcmd1bWVudF9tZXNzYWdlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2FyZ3VtZW50X21lc3NhZ2UtbWVzc2FnZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zZWxlY3Rvcl9saWZlbGluZSIgbmFtZT0iQV9zZWxlY3Rvcl9saWZlbGluZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJMaWZlbGluZS1zZWxlY3RvciBBX3NlbGVjdG9yX2xpZmVsaW5lLWxpZmVsaW5lIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfc2VsZWN0b3JfbGlmZWxpbmUtbGlmZWxpbmUiIG5hbWU9ImxpZmVsaW5lIiB0eXBlPSJMaWZlbGluZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX3NlbGVjdG9yX2xpZmVsaW5lIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3NlbGVjdG9yX2xpZmVsaW5lLWxpZmVsaW5lLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2RlY29tcG9zZWRBc19saWZlbGluZSIgbmFtZT0iQV9kZWNvbXBvc2VkQXNfbGlmZWxpbmUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iTGlmZWxpbmUtZGVjb21wb3NlZEFzIEFfZGVjb21wb3NlZEFzX2xpZmVsaW5lLWxpZmVsaW5lIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZGVjb21wb3NlZEFzX2xpZmVsaW5lLWxpZmVsaW5lIiBuYW1lPSJsaWZlbGluZSIgdHlwZT0iTGlmZWxpbmUiIGFzc29jaWF0aW9uPSJBX2RlY29tcG9zZWRBc19saWZlbGluZSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlcHJlc2VudHNfbGlmZWxpbmUiIG5hbWU9IkFfcmVwcmVzZW50c19saWZlbGluZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJMaWZlbGluZS1yZXByZXNlbnRzIEFfcmVwcmVzZW50c19saWZlbGluZS1saWZlbGluZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQV9yZXByZXNlbnRzX2xpZmVsaW5lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQV9yZXByZXNlbnRzX2xpZmVsaW5lIj4KLSAgICAgICAgPGJvZHk+SWYgYSBQYXJ0IGhhcyBtdWx0aXBsaWNpdHksIG11bHRpcGxlIGxpZmVsaW5lcyBtaWdodCBiZSB1c2VkIHRvIHNob3cgaXQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlcHJlc2VudHNfbGlmZWxpbmUtbGlmZWxpbmUiIG5hbWU9ImxpZmVsaW5lIiB0eXBlPSJMaWZlbGluZSIgYXNzb2NpYXRpb249IkFfcmVwcmVzZW50c19saWZlbGluZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZXByZXNlbnRzX2xpZmVsaW5lLWxpZmVsaW5lLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9yZXByZXNlbnRzX2xpZmVsaW5lLWxpZmVsaW5lLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXR1cm5WYWx1ZVJlY2lwaWVudF9pbnRlcmFjdGlvblVzZSIgbmFtZT0iQV9yZXR1cm5WYWx1ZVJlY2lwaWVudF9pbnRlcmFjdGlvblVzZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmFjdGlvblVzZS1yZXR1cm5WYWx1ZVJlY2lwaWVudCBBX3JldHVyblZhbHVlUmVjaXBpZW50X2ludGVyYWN0aW9uVXNlLWludGVyYWN0aW9uVXNlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmV0dXJuVmFsdWVSZWNpcGllbnRfaW50ZXJhY3Rpb25Vc2UtaW50ZXJhY3Rpb25Vc2UiIG5hbWU9ImludGVyYWN0aW9uVXNlIiB0eXBlPSJJbnRlcmFjdGlvblVzZSIgYXNzb2NpYXRpb249IkFfcmV0dXJuVmFsdWVSZWNpcGllbnRfaW50ZXJhY3Rpb25Vc2UiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmV0dXJuVmFsdWVSZWNpcGllbnRfaW50ZXJhY3Rpb25Vc2UtaW50ZXJhY3Rpb25Vc2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JldHVyblZhbHVlUmVjaXBpZW50X2ludGVyYWN0aW9uVXNlLWludGVyYWN0aW9uVXNlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZWZlcnNUb19pbnRlcmFjdGlvblVzZSIgbmFtZT0iQV9yZWZlcnNUb19pbnRlcmFjdGlvblVzZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmFjdGlvblVzZS1yZWZlcnNUbyBBX3JlZmVyc1RvX2ludGVyYWN0aW9uVXNlLWludGVyYWN0aW9uVXNlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVmZXJzVG9faW50ZXJhY3Rpb25Vc2UtaW50ZXJhY3Rpb25Vc2UiIG5hbWU9ImludGVyYWN0aW9uVXNlIiB0eXBlPSJJbnRlcmFjdGlvblVzZSIgYXNzb2NpYXRpb249IkFfcmVmZXJzVG9faW50ZXJhY3Rpb25Vc2UiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVmZXJzVG9faW50ZXJhY3Rpb25Vc2UtaW50ZXJhY3Rpb25Vc2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlZmVyc1RvX2ludGVyYWN0aW9uVXNlLWludGVyYWN0aW9uVXNlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXR1cm5WYWx1ZV9pbnRlcmFjdGlvblVzZSIgbmFtZT0iQV9yZXR1cm5WYWx1ZV9pbnRlcmFjdGlvblVzZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmFjdGlvblVzZS1yZXR1cm5WYWx1ZSBBX3JldHVyblZhbHVlX2ludGVyYWN0aW9uVXNlLWludGVyYWN0aW9uVXNlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmV0dXJuVmFsdWVfaW50ZXJhY3Rpb25Vc2UtaW50ZXJhY3Rpb25Vc2UiIG5hbWU9ImludGVyYWN0aW9uVXNlIiB0eXBlPSJJbnRlcmFjdGlvblVzZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX3JldHVyblZhbHVlX2ludGVyYWN0aW9uVXNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JldHVyblZhbHVlX2ludGVyYWN0aW9uVXNlLWludGVyYWN0aW9uVXNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2FyZ3VtZW50X2ludGVyYWN0aW9uVXNlIiBuYW1lPSJBX2FyZ3VtZW50X2ludGVyYWN0aW9uVXNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkludGVyYWN0aW9uVXNlLWFyZ3VtZW50IEFfYXJndW1lbnRfaW50ZXJhY3Rpb25Vc2UtaW50ZXJhY3Rpb25Vc2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9hcmd1bWVudF9pbnRlcmFjdGlvblVzZS1pbnRlcmFjdGlvblVzZSIgbmFtZT0iaW50ZXJhY3Rpb25Vc2UiIHR5cGU9IkludGVyYWN0aW9uVXNlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfYXJndW1lbnRfaW50ZXJhY3Rpb25Vc2UiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfYXJndW1lbnRfaW50ZXJhY3Rpb25Vc2UtaW50ZXJhY3Rpb25Vc2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfYWN0dWFsR2F0ZV9pbnRlcmFjdGlvblVzZSIgbmFtZT0iQV9hY3R1YWxHYXRlX2ludGVyYWN0aW9uVXNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkludGVyYWN0aW9uVXNlLWFjdHVhbEdhdGUgQV9hY3R1YWxHYXRlX2ludGVyYWN0aW9uVXNlLWludGVyYWN0aW9uVXNlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfYWN0dWFsR2F0ZV9pbnRlcmFjdGlvblVzZS1pbnRlcmFjdGlvblVzZSIgbmFtZT0iaW50ZXJhY3Rpb25Vc2UiIHR5cGU9IkludGVyYWN0aW9uVXNlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfYWN0dWFsR2F0ZV9pbnRlcmFjdGlvblVzZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9hY3R1YWxHYXRlX2ludGVyYWN0aW9uVXNlLWludGVyYWN0aW9uVXNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2ZyYWdtZW50X2VuY2xvc2luZ09wZXJhbmQiIG5hbWU9IkFfZnJhZ21lbnRfZW5jbG9zaW5nT3BlcmFuZCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmFjdGlvbk9wZXJhbmQtZnJhZ21lbnQgSW50ZXJhY3Rpb25GcmFnbWVudC1lbmNsb3NpbmdPcGVyYW5kIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZ3VhcmRfaW50ZXJhY3Rpb25PcGVyYW5kIiBuYW1lPSJBX2d1YXJkX2ludGVyYWN0aW9uT3BlcmFuZCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmFjdGlvbk9wZXJhbmQtZ3VhcmQgQV9ndWFyZF9pbnRlcmFjdGlvbk9wZXJhbmQtaW50ZXJhY3Rpb25PcGVyYW5kIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZ3VhcmRfaW50ZXJhY3Rpb25PcGVyYW5kLWludGVyYWN0aW9uT3BlcmFuZCIgbmFtZT0iaW50ZXJhY3Rpb25PcGVyYW5kIiB0eXBlPSJJbnRlcmFjdGlvbk9wZXJhbmQiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9ndWFyZF9pbnRlcmFjdGlvbk9wZXJhbmQiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9nZW5lcmFsT3JkZXJpbmdfaW50ZXJhY3Rpb25GcmFnbWVudCIgbmFtZT0iQV9nZW5lcmFsT3JkZXJpbmdfaW50ZXJhY3Rpb25GcmFnbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmFjdGlvbkZyYWdtZW50LWdlbmVyYWxPcmRlcmluZyBBX2dlbmVyYWxPcmRlcmluZ19pbnRlcmFjdGlvbkZyYWdtZW50LWludGVyYWN0aW9uRnJhZ21lbnQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9nZW5lcmFsT3JkZXJpbmdfaW50ZXJhY3Rpb25GcmFnbWVudC1pbnRlcmFjdGlvbkZyYWdtZW50IiBuYW1lPSJpbnRlcmFjdGlvbkZyYWdtZW50IiB0eXBlPSJJbnRlcmFjdGlvbkZyYWdtZW50IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfZ2VuZXJhbE9yZGVyaW5nX2ludGVyYWN0aW9uRnJhZ21lbnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZ2VuZXJhbE9yZGVyaW5nX2ludGVyYWN0aW9uRnJhZ21lbnQtaW50ZXJhY3Rpb25GcmFnbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jb3ZlcmVkX2NvdmVyZWRCeSIgbmFtZT0iQV9jb3ZlcmVkX2NvdmVyZWRCeSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmFjdGlvbkZyYWdtZW50LWNvdmVyZWQgTGlmZWxpbmUtY292ZXJlZEJ5Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBX2NvdmVyZWRfY292ZXJlZEJ5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQV9jb3ZlcmVkX2NvdmVyZWRCeSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gc2hvd3MgdGhlIGxpZmVsaW5lcyB0aGF0IG1ha2UgdXAgYW4gaW50ZXJhY3Rpb24uIEEgbGlmZWxpbmUgbWF5IGJlIHBhcnQgb2YgbW9yZSB0aGFuIG9uZSBpbnRlcmFjdGlvbiB1c2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbWluaW50X2ludGVyYWN0aW9uQ29uc3RyYWludCIgbmFtZT0iQV9taW5pbnRfaW50ZXJhY3Rpb25Db25zdHJhaW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1taW5pbnQgQV9taW5pbnRfaW50ZXJhY3Rpb25Db25zdHJhaW50LWludGVyYWN0aW9uQ29uc3RyYWludCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX21pbmludF9pbnRlcmFjdGlvbkNvbnN0cmFpbnQtaW50ZXJhY3Rpb25Db25zdHJhaW50IiBuYW1lPSJpbnRlcmFjdGlvbkNvbnN0cmFpbnQiIHR5cGU9IkludGVyYWN0aW9uQ29uc3RyYWludCIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX21pbmludF9pbnRlcmFjdGlvbkNvbnN0cmFpbnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbWluaW50X2ludGVyYWN0aW9uQ29uc3RyYWludC1pbnRlcmFjdGlvbkNvbnN0cmFpbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbWF4aW50X2ludGVyYWN0aW9uQ29uc3RyYWludCIgbmFtZT0iQV9tYXhpbnRfaW50ZXJhY3Rpb25Db25zdHJhaW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkludGVyYWN0aW9uQ29uc3RyYWludC1tYXhpbnQgQV9tYXhpbnRfaW50ZXJhY3Rpb25Db25zdHJhaW50LWludGVyYWN0aW9uQ29uc3RyYWludCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX21heGludF9pbnRlcmFjdGlvbkNvbnN0cmFpbnQtaW50ZXJhY3Rpb25Db25zdHJhaW50IiBuYW1lPSJpbnRlcmFjdGlvbkNvbnN0cmFpbnQiIHR5cGU9IkludGVyYWN0aW9uQ29uc3RyYWludCIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX21heGludF9pbnRlcmFjdGlvbkNvbnN0cmFpbnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbWF4aW50X2ludGVyYWN0aW9uQ29uc3RyYWludC1pbnRlcmFjdGlvbkNvbnN0cmFpbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfYWN0aW9uX2ludGVyYWN0aW9uIiBuYW1lPSJBX2FjdGlvbl9pbnRlcmFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmFjdGlvbi1hY3Rpb24gQV9hY3Rpb25faW50ZXJhY3Rpb24taW50ZXJhY3Rpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9hY3Rpb25faW50ZXJhY3Rpb24taW50ZXJhY3Rpb24iIG5hbWU9ImludGVyYWN0aW9uIiB0eXBlPSJJbnRlcmFjdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2FjdGlvbl9pbnRlcmFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9hY3Rpb25faW50ZXJhY3Rpb24taW50ZXJhY3Rpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZm9ybWFsR2F0ZV9pbnRlcmFjdGlvbiIgbmFtZT0iQV9mb3JtYWxHYXRlX2ludGVyYWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkludGVyYWN0aW9uLWZvcm1hbEdhdGUgQV9mb3JtYWxHYXRlX2ludGVyYWN0aW9uLWludGVyYWN0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZm9ybWFsR2F0ZV9pbnRlcmFjdGlvbi1pbnRlcmFjdGlvbiIgbmFtZT0iaW50ZXJhY3Rpb24iIHR5cGU9IkludGVyYWN0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfZm9ybWFsR2F0ZV9pbnRlcmFjdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9mb3JtYWxHYXRlX2ludGVyYWN0aW9uLWludGVyYWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2xpZmVsaW5lX2ludGVyYWN0aW9uIiBuYW1lPSJBX2xpZmVsaW5lX2ludGVyYWN0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkludGVyYWN0aW9uLWxpZmVsaW5lIExpZmVsaW5lLWludGVyYWN0aW9uIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZnJhZ21lbnRfZW5jbG9zaW5nSW50ZXJhY3Rpb24iIG5hbWU9IkFfZnJhZ21lbnRfZW5jbG9zaW5nSW50ZXJhY3Rpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iSW50ZXJhY3Rpb24tZnJhZ21lbnQgSW50ZXJhY3Rpb25GcmFnbWVudC1lbmNsb3NpbmdJbnRlcmFjdGlvbiIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX21lc3NhZ2VfaW50ZXJhY3Rpb24iIG5hbWU9IkFfbWVzc2FnZV9pbnRlcmFjdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmFjdGlvbi1tZXNzYWdlIE1lc3NhZ2UtaW50ZXJhY3Rpb24iLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9iZWZvcmVfdG9BZnRlciIgbmFtZT0iQV9iZWZvcmVfdG9BZnRlciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJHZW5lcmFsT3JkZXJpbmctYmVmb3JlIE9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLXRvQWZ0ZXIiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9maW5pc2hfZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgbmFtZT0iQV9maW5pc2hfZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFeGVjdXRpb25TcGVjaWZpY2F0aW9uLWZpbmlzaCBBX2ZpbmlzaF9leGVjdXRpb25TcGVjaWZpY2F0aW9uLWV4ZWN1dGlvblNwZWNpZmljYXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFfZmluaXNoX2V4ZWN1dGlvblNwZWNpZmljYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBX2ZpbmlzaF9leGVjdXRpb25TcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPGJvZHk+VGhlIGV2ZW50IHNob3dzIHRoZSB0aW1lIHBvaW50IGF0IHdoaWNoIHRoZSBhY3Rpb24gY29tcGxldGVzIGV4ZWN1dGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZmluaXNoX2V4ZWN1dGlvblNwZWNpZmljYXRpb24tZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgbmFtZT0iZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgdHlwZT0iRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgYXNzb2NpYXRpb249IkFfZmluaXNoX2V4ZWN1dGlvblNwZWNpZmljYXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZmluaXNoX2V4ZWN1dGlvblNwZWNpZmljYXRpb24tZXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfZmluaXNoX2V4ZWN1dGlvblNwZWNpZmljYXRpb24tZXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc3RhcnRfZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgbmFtZT0iQV9zdGFydF9leGVjdXRpb25TcGVjaWZpY2F0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkV4ZWN1dGlvblNwZWNpZmljYXRpb24tc3RhcnQgQV9zdGFydF9leGVjdXRpb25TcGVjaWZpY2F0aW9uLWV4ZWN1dGlvblNwZWNpZmljYXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFfc3RhcnRfZXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFfc3RhcnRfZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxib2R5PlRoZSBldmVudCBzaG93cyB0aGUgdGltZSBwb2ludCBhdCB3aGljaCB0aGUgYWN0aW9uIGJlZ2lucyBleGVjdXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3N0YXJ0X2V4ZWN1dGlvblNwZWNpZmljYXRpb24tZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgbmFtZT0iZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgdHlwZT0iRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgYXNzb2NpYXRpb249IkFfc3RhcnRfZXhlY3V0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9zdGFydF9leGVjdXRpb25TcGVjaWZpY2F0aW9uLWV4ZWN1dGlvblNwZWNpZmljYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3N0YXJ0X2V4ZWN1dGlvblNwZWNpZmljYXRpb24tZXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZXhlY3V0aW9uX2V4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIiBuYW1lPSJBX2V4ZWN1dGlvbl9leGVjdXRpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFeGVjdXRpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1leGVjdXRpb24gQV9leGVjdXRpb25fZXhlY3V0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tZXhlY3V0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9leGVjdXRpb25fZXhlY3V0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24tZXhlY3V0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iIG5hbWU9ImV4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIiB0eXBlPSJFeGVjdXRpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiIgYXNzb2NpYXRpb249IkFfZXhlY3V0aW9uX2V4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2V4ZWN1dGlvbl9leGVjdXRpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1leGVjdXRpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfZXhlY3V0aW9uX2V4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLWV4ZWN1dGlvbk9jY3VycmVuY2VTcGVjaWZpY2F0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iMiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9tZXNzYWdlX2NvbnNpZGVySWdub3JlRnJhZ21lbnQiIG5hbWU9IkFfbWVzc2FnZV9jb25zaWRlcklnbm9yZUZyYWdtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNvbnNpZGVySWdub3JlRnJhZ21lbnQtbWVzc2FnZSBBX21lc3NhZ2VfY29uc2lkZXJJZ25vcmVGcmFnbWVudC1jb25zaWRlcklnbm9yZUZyYWdtZW50Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfbWVzc2FnZV9jb25zaWRlcklnbm9yZUZyYWdtZW50LWNvbnNpZGVySWdub3JlRnJhZ21lbnQiIG5hbWU9ImNvbnNpZGVySWdub3JlRnJhZ21lbnQiIHR5cGU9IkNvbnNpZGVySWdub3JlRnJhZ21lbnQiIGFzc29jaWF0aW9uPSJBX21lc3NhZ2VfY29uc2lkZXJJZ25vcmVGcmFnbWVudCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9tZXNzYWdlX2NvbnNpZGVySWdub3JlRnJhZ21lbnQtY29uc2lkZXJJZ25vcmVGcmFnbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfbWVzc2FnZV9jb25zaWRlcklnbm9yZUZyYWdtZW50LWNvbnNpZGVySWdub3JlRnJhZ21lbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NmcmFnbWVudEdhdGVfY29tYmluZWRGcmFnbWVudCIgbmFtZT0iQV9jZnJhZ21lbnRHYXRlX2NvbWJpbmVkRnJhZ21lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ29tYmluZWRGcmFnbWVudC1jZnJhZ21lbnRHYXRlIEFfY2ZyYWdtZW50R2F0ZV9jb21iaW5lZEZyYWdtZW50LWNvbWJpbmVkRnJhZ21lbnQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jZnJhZ21lbnRHYXRlX2NvbWJpbmVkRnJhZ21lbnQtY29tYmluZWRGcmFnbWVudCIgbmFtZT0iY29tYmluZWRGcmFnbWVudCIgdHlwZT0iQ29tYmluZWRGcmFnbWVudCIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2NmcmFnbWVudEdhdGVfY29tYmluZWRGcmFnbWVudCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jZnJhZ21lbnRHYXRlX2NvbWJpbmVkRnJhZ21lbnQtY29tYmluZWRGcmFnbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vcGVyYW5kX2NvbWJpbmVkRnJhZ21lbnQiIG5hbWU9IkFfb3BlcmFuZF9jb21iaW5lZEZyYWdtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNvbWJpbmVkRnJhZ21lbnQtb3BlcmFuZCBBX29wZXJhbmRfY29tYmluZWRGcmFnbWVudC1jb21iaW5lZEZyYWdtZW50Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb3BlcmFuZF9jb21iaW5lZEZyYWdtZW50LWNvbWJpbmVkRnJhZ21lbnQiIG5hbWU9ImNvbWJpbmVkRnJhZ21lbnQiIHR5cGU9IkNvbWJpbmVkRnJhZ21lbnQiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9vcGVyYW5kX2NvbWJpbmVkRnJhZ21lbnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfb3BlcmFuZF9jb21iaW5lZEZyYWdtZW50LWNvbWJpbmVkRnJhZ21lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfYmVoYXZpb3JfYmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uIiBuYW1lPSJBX2JlaGF2aW9yX2JlaGF2aW9yRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJCZWhhdmlvckV4ZWN1dGlvblNwZWNpZmljYXRpb24tYmVoYXZpb3IgQV9iZWhhdmlvcl9iZWhhdmlvckV4ZWN1dGlvblNwZWNpZmljYXRpb24tYmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfYmVoYXZpb3JfYmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uLWJlaGF2aW9yRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgbmFtZT0iYmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uIiB0eXBlPSJCZWhhdmlvckV4ZWN1dGlvblNwZWNpZmljYXRpb24iIGFzc29jaWF0aW9uPSJBX2JlaGF2aW9yX2JlaGF2aW9yRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9iZWhhdmlvcl9iZWhhdmlvckV4ZWN1dGlvblNwZWNpZmljYXRpb24tYmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9iZWhhdmlvcl9iZWhhdmlvckV4ZWN1dGlvblNwZWNpZmljYXRpb24tYmVoYXZpb3JFeGVjdXRpb25TcGVjaWZpY2F0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9hY3Rpb25fYWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgbmFtZT0iQV9hY3Rpb25fYWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uLWFjdGlvbiBBX2FjdGlvbl9hY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uLWFjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9hY3Rpb25fYWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1hY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uIiBuYW1lPSJhY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uIiB0eXBlPSJBY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uIiBhc3NvY2lhdGlvbj0iQV9hY3Rpb25fYWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9hY3Rpb25fYWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1hY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9hY3Rpb25fYWN0aW9uRXhlY3V0aW9uU3BlY2lmaWNhdGlvbi1hY3Rpb25FeGVjdXRpb25TcGVjaWZpY2F0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRXh0ZW5zaW9uIiBuYW1lPSJFeHRlbnNpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4dGVuc2lvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4dGVuc2lvbiI+Ci0gICAgICAgIDxib2R5PkFuIGV4dGVuc2lvbiBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb3BlcnRpZXMgb2YgYSBtZXRhY2xhc3MgYXJlIGV4dGVuZGVkIHRocm91Z2ggYSBzdGVyZW90eXBlLCBhbmQgZ2l2ZXMgdGhlIGFiaWxpdHkgdG8gZmxleGlibHkgYWRkIChhbmQgbGF0ZXIgcmVtb3ZlKSBzdGVyZW90eXBlcyB0byBjbGFzc2VzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkV4dGVuc2lvbi1ub25fb3duZWRfZW5kIiBuYW1lPSJub25fb3duZWRfZW5kIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkV4dGVuc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHRlbnNpb24tbm9uX293bmVkX2VuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4dGVuc2lvbi1ub25fb3duZWRfZW5kIj4KLSAgICAgICAgICA8Ym9keT5UaGUgbm9uLW93bmVkIGVuZCBvZiBhbiBFeHRlbnNpb24gaXMgdHlwZWQgYnkgYSBDbGFzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRXh0ZW5zaW9uLW5vbl9vd25lZF9lbmQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm1ldGFjbGFzc0VuZCgpLT5ub3RFbXB0eSgpIGFuZCBtZXRhY2xhc3NFbmQoKS50eXBlLm9jbElzS2luZE9mKENsYXNzKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRXh0ZW5zaW9uLWlzX2JpbmFyeSIgbmFtZT0iaXNfYmluYXJ5IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkV4dGVuc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHRlbnNpb24taXNfYmluYXJ5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5zaW9uLWlzX2JpbmFyeSI+Ci0gICAgICAgICAgPGJvZHk+QW4gRXh0ZW5zaW9uIGlzIGJpbmFyeSwgaS5lLiwgaXQgaGFzIG9ubHkgdHdvIG1lbWJlckVuZHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkV4dGVuc2lvbi1pc19iaW5hcnktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm1lbWJlckVuZC0+c2l6ZSgpID0gMjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFeHRlbnNpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFzc29jaWF0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFeHRlbnNpb24taXNSZXF1aXJlZCIgbmFtZT0iaXNSZXF1aXJlZCIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4dGVuc2lvbi1pc1JlcXVpcmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5zaW9uLWlzUmVxdWlyZWQiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB3aGV0aGVyIGFuIGluc3RhbmNlIG9mIHRoZSBleHRlbmRpbmcgc3RlcmVvdHlwZSBtdXN0IGJlIGNyZWF0ZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5kZWQgY2xhc3MgaXMgY3JlYXRlZC4gVGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBkZXJpdmVkIGZyb20gdGhlIHZhbHVlIG9mIHRoZSBsb3dlciBwcm9wZXJ0eSBvZiB0aGUgRXh0ZW5zaW9uRW5kIHJlZmVyZW5jZWQgYnkgRXh0ZW5zaW9uOjpvd25lZEVuZDsgYSBsb3dlciB2YWx1ZSBvZiAxIG1lYW5zIHRoYXQgaXNSZXF1aXJlZCBpcyB0cnVlLCBidXQgb3RoZXJ3aXNlIGl0IGlzIGZhbHNlLiBTaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBFeHRlbnNpb25FbmQ6Omxvd2VyIGlzIDAsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGlzUmVxdWlyZWQgaXMgZmFsc2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4dGVuc2lvbi1tZXRhY2xhc3MiIG5hbWU9Im1ldGFjbGFzcyIgdHlwZT0iQ2xhc3MiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZXh0ZW5zaW9uX21ldGFjbGFzcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHRlbnNpb24tbWV0YWNsYXNzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5zaW9uLW1ldGFjbGFzcyI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgQ2xhc3MgdGhhdCBpcyBleHRlbmRlZCB0aHJvdWdoIGFuIEV4dGVuc2lvbi4gVGhlIHByb3BlcnR5IGlzIGRlcml2ZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgbWVtYmVyRW5kIHRoYXQgaXMgbm90IHRoZSBvd25lZEVuZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4dGVuc2lvbi1vd25lZEVuZCIgbmFtZT0ib3duZWRFbmQiIHR5cGU9IkV4dGVuc2lvbkVuZCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgcmVkZWZpbmVkUHJvcGVydHk9IkFzc29jaWF0aW9uLW93bmVkRW5kIiBhc3NvY2lhdGlvbj0iQV9vd25lZEVuZF9leHRlbnNpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXh0ZW5zaW9uLW93bmVkRW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5zaW9uLW93bmVkRW5kIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBlbmQgb2YgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIHR5cGVkIGJ5IGEgU3RlcmVvdHlwZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkV4dGVuc2lvbi1nZXRTdGVyZW90eXBlIiBuYW1lPSJnZXRTdGVyZW90eXBlIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4dGVuc2lvbi1nZXRTdGVyZW90eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5zaW9uLWdldFN0ZXJlb3R5cGUiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgc3RlcmVvdHlwZSB0aGF0IGV4dGVuZHMgYSBtZXRhY2xhc3MgdGhyb3VnaCB0aGlzIGV4dGVuc2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFeHRlbnNpb24tZ2V0U3RlcmVvdHlwZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iU3RlcmVvdHlwZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRXh0ZW5zaW9uLWdldFN0ZXJlb3R5cGUtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkV4dGVuc2lvbi1nZXRTdGVyZW90eXBlLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkV4dGVuc2lvbi1nZXRTdGVyZW90eXBlRW5kIiBuYW1lPSJnZXRTdGVyZW90eXBlRW5kIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4dGVuc2lvbi1nZXRTdGVyZW90eXBlRW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5zaW9uLWdldFN0ZXJlb3R5cGVFbmQiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgZXh0ZW5zaW9uIGVuZCB0aGF0IGlzIHR5cGVkIGJ5IGEgc3RlcmVvdHlwZSAoYXMgb3Bwb3NlZCB0byBhIG1ldGFjbGFzcykuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRXh0ZW5zaW9uLWdldFN0ZXJlb3R5cGVFbmQtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IlByb3BlcnR5IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFeHRlbnNpb24tZ2V0U3RlcmVvdHlwZUVuZC1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRXh0ZW5zaW9uLWdldFN0ZXJlb3R5cGVFbmQtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRXh0ZW5zaW9uLWlzUmVxdWlyZWQuMSIgbmFtZT0iaXNSZXF1aXJlZCIgYm9keUNvbmRpdGlvbj0iRXh0ZW5zaW9uLWlzUmVxdWlyZWQuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4dGVuc2lvbi1pc1JlcXVpcmVkLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHRlbnNpb24taXNSZXF1aXJlZC4xIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNSZXF1aXJlZCgpIGlzIHRydWUgaWYgdGhlIG93bmVkIGVuZCBoYXMgYSBtdWx0aXBsaWNpdHkgd2l0aCB0aGUgbG93ZXIgYm91bmQgb2YgMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iRXh0ZW5zaW9uLWlzUmVxdWlyZWQuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkV4dGVuc2lvbi1pc1JlcXVpcmVkLjEgRXh0ZW5zaW9uLWlzUmVxdWlyZWQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFeHRlbnNpb24taXNSZXF1aXJlZC4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAob3duZWRFbmQubG93ZXJCb3VuZCgpID0gMSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRXh0ZW5zaW9uLWlzUmVxdWlyZWQuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFeHRlbnNpb24tbWV0YWNsYXNzLjEiIG5hbWU9Im1ldGFjbGFzcyIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiBib2R5Q29uZGl0aW9uPSJFeHRlbnNpb24tbWV0YWNsYXNzLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHRlbnNpb24tbWV0YWNsYXNzLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHRlbnNpb24tbWV0YWNsYXNzLjEiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBtZXRhY2xhc3MoKSByZXR1cm5zIHRoZSBtZXRhY2xhc3MgdGhhdCBpcyBiZWluZyBleHRlbmRlZCAoYXMgb3Bwb3NlZCB0byB0aGUgZXh0ZW5kaW5nIHN0ZXJlb3R5cGUpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJFeHRlbnNpb24tbWV0YWNsYXNzLjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJFeHRlbnNpb24tbWV0YWNsYXNzLjEgRXh0ZW5zaW9uLW1ldGFjbGFzcyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkV4dGVuc2lvbi1tZXRhY2xhc3MuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKG1ldGFjbGFzc0VuZCgpLnR5cGUub2NsQXNUeXBlKENsYXNzKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRXh0ZW5zaW9uLW1ldGFjbGFzcy4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJDbGFzcyIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFeHRlbnNpb24tbWV0YWNsYXNzRW5kIiBuYW1lPSJtZXRhY2xhc3NFbmQiIGJvZHlDb25kaXRpb249IkV4dGVuc2lvbi1tZXRhY2xhc3NFbmQtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHRlbnNpb24tbWV0YWNsYXNzRW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5zaW9uLW1ldGFjbGFzc0VuZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IG1ldGFjbGFzc0VuZCgpIHJldHVybnMgdGhlIFByb3BlcnR5IHRoYXQgaXMgdHlwZWQgYnkgYSBtZXRhY2xhc3MgKGFzIG9wcG9zZWQgdG8gYSBzdGVyZW90eXBlKS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iRXh0ZW5zaW9uLW1ldGFjbGFzc0VuZC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkV4dGVuc2lvbi1tZXRhY2xhc3NFbmQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFeHRlbnNpb24tbWV0YWNsYXNzRW5kLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobWVtYmVyRW5kLT5yZWplY3QocCB8IG93bmVkRW5kLT5pbmNsdWRlcyhwLm9jbEFzVHlwZShFeHRlbnNpb25FbmQpKSktPmFueSh0cnVlKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRXh0ZW5zaW9uLW1ldGFjbGFzc0VuZC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUHJvcGVydHkiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFeHRlbnNpb25FbmQiIG5hbWU9IkV4dGVuc2lvbkVuZCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXh0ZW5zaW9uRW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5zaW9uRW5kIj4KLSAgICAgICAgPGJvZHk+QW4gZXh0ZW5zaW9uIGVuZCBpcyB1c2VkIHRvIHRpZSBhbiBleHRlbnNpb24gdG8gYSBzdGVyZW90eXBlIHdoZW4gZXh0ZW5kaW5nIGEgbWV0YWNsYXNzLgotVGhlIGRlZmF1bHQgbXVsdGlwbGljaXR5IG9mIGFuIGV4dGVuc2lvbiBlbmQgaXMgMC4uMS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJFeHRlbnNpb25FbmQtbXVsdGlwbGljaXR5IiBuYW1lPSJtdWx0aXBsaWNpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iRXh0ZW5zaW9uRW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4dGVuc2lvbkVuZC1tdWx0aXBsaWNpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHRlbnNpb25FbmQtbXVsdGlwbGljaXR5Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgbXVsdGlwbGljaXR5IG9mIEV4dGVuc2lvbkVuZCBpcyAwLi4xIG9yIDEuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkV4dGVuc2lvbkVuZC1tdWx0aXBsaWNpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pihsb3dlckJvdW5kKCkgPSAwIG9yIGxvd2VyQm91bmQoKSA9IDEpIGFuZCB1cHBlckJvdW5kKCkgPSAxPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJFeHRlbnNpb25FbmQtYWdncmVnYXRpb24iIG5hbWU9ImFnZ3JlZ2F0aW9uIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkV4dGVuc2lvbkVuZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHRlbnNpb25FbmQtYWdncmVnYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHRlbnNpb25FbmQtYWdncmVnYXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBhZ2dyZWdhdGlvbiBvZiBhbiBFeHRlbnNpb25FbmQgaXMgY29tcG9zaXRlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFeHRlbnNpb25FbmQtYWdncmVnYXRpb24tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnNlbGYuYWdncmVnYXRpb24gPSBBZ2dyZWdhdGlvbktpbmQ6OmNvbXBvc2l0ZTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFeHRlbnNpb25FbmQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlByb3BlcnR5Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFeHRlbnNpb25FbmQtbG93ZXIiIG5hbWU9Imxvd2VyIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXh0ZW5zaW9uRW5kLWxvd2VyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5zaW9uRW5kLWxvd2VyIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIHJlZGVmaW5pdGlvbiBjaGFuZ2VzIHRoZSBkZWZhdWx0IG11bHRpcGxpY2l0eSBvZiBhc3NvY2lhdGlvbiBlbmRzLCBzaW5jZSBtb2RlbCBlbGVtZW50cyBhcmUgdXN1YWxseSBleHRlbmRlZCBieSAwIG9yIDEgaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvbiBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFeHRlbnNpb25FbmQtbG93ZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFeHRlbnNpb25FbmQtdHlwZSIgbmFtZT0idHlwZSIgdHlwZT0iU3RlcmVvdHlwZSIgcmVkZWZpbmVkUHJvcGVydHk9IlR5cGVkRWxlbWVudC10eXBlIiBhc3NvY2lhdGlvbj0iQV90eXBlX2V4dGVuc2lvbkVuZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHRlbnNpb25FbmQtdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4dGVuc2lvbkVuZC10eXBlIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSB0eXBlIG9mIHRoZSBFeHRlbnNpb25FbmQuIE5vdGUgdGhhdCB0aGlzIGFzc29jaWF0aW9uIHJlc3RyaWN0cyB0aGUgcG9zc2libGUgdHlwZXMgb2YgYW4gRXh0ZW5zaW9uRW5kIHRvIG9ubHkgYmUgU3RlcmVvdHlwZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFeHRlbnNpb25FbmQtZ2V0TG93ZXIiIG5hbWU9ImdldExvd2VyIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJFeHRlbnNpb25FbmQtZ2V0TG93ZXItX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRXh0ZW5zaW9uRW5kLXNldExvd2VyIiBuYW1lPSJzZXRMb3dlciI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkV4dGVuc2lvbkVuZC1zZXRMb3dlci1uZXdMb3dlciIgbmFtZT0ibmV3TG93ZXIiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkV4dGVuc2lvbkVuZC1sb3dlckJvdW5kIiBuYW1lPSJsb3dlckJvdW5kIiBib2R5Q29uZGl0aW9uPSJFeHRlbnNpb25FbmQtbG93ZXJCb3VuZC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4dGVuc2lvbkVuZC1sb3dlckJvdW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5zaW9uRW5kLWxvd2VyQm91bmQiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBsb3dlckJvdW5kKCkgcmV0dXJucyB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIG11bHRpcGxpY2l0eSBhcyBhbiBJbnRlZ2VyLiBUaGlzIGlzIGEgcmVkZWZpbml0aW9uIG9mIHRoZSBkZWZhdWx0IGxvd2VyIGJvdW5kLCB3aGljaCBub3JtYWxseSwgZm9yIE11bHRpcGxpY2l0eUVsZW1lbnRzLCBldmFsdWF0ZXMgdG8gMSBpZiBlbXB0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iRXh0ZW5zaW9uRW5kLWxvd2VyQm91bmQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJFeHRlbnNpb25FbmQtbG93ZXJCb3VuZCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkV4dGVuc2lvbkVuZC1sb3dlckJvdW5kLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgbG93ZXJWYWx1ZT1udWxsIHRoZW4gMCBlbHNlIGxvd2VyVmFsdWUuaW50ZWdlclZhbHVlKCkgZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkV4dGVuc2lvbkVuZC1sb3dlckJvdW5kLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRXh0ZW5zaW9uRW5kLWxvd2VyQm91bmQtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJJbWFnZSIgbmFtZT0iSW1hZ2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkltYWdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW1hZ2UiPgotICAgICAgICA8Ym9keT5QaHlzaWNhbCBkZWZpbml0aW9uIG9mIGEgZ3JhcGhpY2FsIGltYWdlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iSW1hZ2UtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkltYWdlLWNvbnRlbnQiIG5hbWU9ImNvbnRlbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW1hZ2UtY29udGVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkltYWdlLWNvbnRlbnQiPgotICAgICAgICAgIDxib2R5PlRoaXMgY29udGFpbnMgdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlIGltYWdlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0LiBUaGUgdmFsdWUgY291bGQgcmVwcmVzZW50IGEgYml0bWFwLCBpbWFnZSBzdWNoIGFzIGEgR0lGIGZpbGUsIG9yIGRyYXdpbmcgJ2luc3RydWN0aW9ucycgdXNpbmcgYSBzdGFuZGFyZCBzdWNoIGFzIFNjYWxhYmxlIFZlY3RvciBHcmFwaGljIChTVkcpICh3aGljaCBpcyBYTUwgYmFzZWQpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkltYWdlLWNvbnRlbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbWFnZS1mb3JtYXQiIG5hbWU9ImZvcm1hdCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbWFnZS1mb3JtYXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbWFnZS1mb3JtYXQiPgotICAgICAgICAgIDxib2R5PlRoaXMgaW5kaWNhdGVzIHRoZSBmb3JtYXQgb2YgdGhlIGNvbnRlbnQsIHdoaWNoIGlzIGhvdyB0aGUgc3RyaW5nIGNvbnRlbnQgc2hvdWxkIGJlIGludGVycHJldGVkLiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgcmVzZXJ2ZWQ6IFNWRywgR0lGLCBQTkcsIEpQRywgV01GLCBFTUYsIEJNUC4gSW4gYWRkaXRpb24gdGhlIHByZWZpeCAnTUlNRTogJyBpcyBhbHNvIHJlc2VydmVkLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBleHByZXNzIHRoZSByZXNlcnZlZCB2YWx1ZXMgYWJvdmUsIGZvciBleGFtcGxlICZxdW90O1NWRyZxdW90OyBjb3VsZCBpbnN0ZWFkIGJlIGV4cHJlc3NlZCBhcyAmcXVvdDtNSU1FOiBpbWFnZS9zdmcreG1sJnF1b3Q7LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkltYWdlLWZvcm1hdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkltYWdlLWxvY2F0aW9uIiBuYW1lPSJsb2NhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbWFnZS1sb2NhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkltYWdlLWxvY2F0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGNvbnRhaW5zIGEgbG9jYXRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBhIHRvb2wgdG8gbG9jYXRlIHRoZSBpbWFnZSBhcyBhbiBhbHRlcm5hdGl2ZSB0byBlbWJlZGRpbmcgaXQgaW4gdGhlIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW1hZ2UtbG9jYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Ik1vZGVsIiBuYW1lPSJNb2RlbCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTW9kZWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNb2RlbCI+Ci0gICAgICAgIDxib2R5PkEgbW9kZWwgY2FwdHVyZXMgYSB2aWV3IG9mIGEgcGh5c2ljYWwgc3lzdGVtLiBJdCBpcyBhbiBhYnN0cmFjdGlvbiBvZiB0aGUgcGh5c2ljYWwgc3lzdGVtLCB3aXRoIGEgY2VydGFpbiBwdXJwb3NlLiBUaGlzIHB1cnBvc2UgZGV0ZXJtaW5lcyB3aGF0IGlzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhbmQgd2hhdCBpcyBpcnJlbGV2YW50LiBUaHVzIHRoZSBtb2RlbCBjb21wbGV0ZWx5IGRlc2NyaWJlcyB0aG9zZSBhc3BlY3RzIG9mIHRoZSBwaHlzaWNhbCBzeXN0ZW0gdGhhdCBhcmUgcmVsZXZhbnQgdG8gdGhlIHB1cnBvc2Ugb2YgdGhlIG1vZGVsLCBhdCB0aGUgYXBwcm9wcmlhdGUgbGV2ZWwgb2YgZGV0YWlsLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iTW9kZWwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlBhY2thZ2UiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik1vZGVsLXZpZXdwb2ludCIgbmFtZT0idmlld3BvaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1vZGVsLXZpZXdwb2ludC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1vZGVsLXZpZXdwb2ludCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG5hbWUgb2YgdGhlIHZpZXdwb2ludCB0aGF0IGlzIGV4cHJlc3NlZCBieSBhIG1vZGVsICh0aGlzIG5hbWUgbWF5IHJlZmVyIHRvIGEgcHJvZmlsZSBkZWZpbml0aW9uKS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJNb2RlbC12aWV3cG9pbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJNb2RlbC1pc01ldGFtb2RlbCIgbmFtZT0iaXNNZXRhbW9kZWwiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTW9kZWwtaXNNZXRhbW9kZWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNb2RlbC1pc01ldGFtb2RlbCI+Ci0gICAgICAgICAgPGJvZHk+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgbW9kZWwgaXMgYSBtZXRhbW9kZWwuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTW9kZWwtaXNNZXRhbW9kZWwtX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJQYWNrYWdlIiBuYW1lPSJQYWNrYWdlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZSI+Ci0gICAgICAgIDxib2R5PkEgcGFja2FnZSBjYW4gaGF2ZSBvbmUgb3IgbW9yZSBwcm9maWxlIGFwcGxpY2F0aW9ucyB0byBpbmRpY2F0ZSB3aGljaCBwcm9maWxlcyBoYXZlIGJlZW4gYXBwbGllZC4gQmVjYXVzZSBhIHByb2ZpbGUgaXMgYSBwYWNrYWdlLCBpdCBpcyBwb3NzaWJsZSB0byBhcHBseSBhIHByb2ZpbGUgbm90IG9ubHkgdG8gcGFja2FnZXMsIGJ1dCBhbHNvIHRvIHByb2ZpbGVzLgotUGFja2FnZSBzcGVjaWFsaXplcyBUZW1wbGF0ZWFibGVFbGVtZW50IGFuZCBQYWNrYWdlYWJsZUVsZW1lbnQgc3BlY2lhbGl6ZXMgUGFyYW1ldGVyYWJsZUVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGEgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGFuZCBhIFBhY2thZ2VhYmxlRWxlbWVudCBhcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4KLUEgcGFja2FnZSBpcyB1c2VkIHRvIGdyb3VwIGVsZW1lbnRzLCBhbmQgcHJvdmlkZXMgYSBuYW1lc3BhY2UgZm9yIHRoZSBncm91cGVkIGVsZW1lbnRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBhY2thZ2UtZWxlbWVudHNfcHVibGljX29yX3ByaXZhdGUiIG5hbWU9ImVsZW1lbnRzX3B1YmxpY19vcl9wcml2YXRlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBhY2thZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1lbGVtZW50c19wdWJsaWNfb3JfcHJpdmF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtZWxlbWVudHNfcHVibGljX29yX3ByaXZhdGUiPgotICAgICAgICAgIDxib2R5PklmIGFuIGVsZW1lbnQgdGhhdCBpcyBvd25lZCBieSBhIHBhY2thZ2UgaGFzIHZpc2liaWxpdHksIGl0IGlzIHB1YmxpYyBvciBwcml2YXRlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQYWNrYWdlLWVsZW1lbnRzX3B1YmxpY19vcl9wcml2YXRlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5wYWNrYWdlZEVsZW1lbnQtPmZvckFsbChlIHwgZS52aXNpYmlsaXR5Jmx0Oz4gbnVsbCBpbXBsaWVzIGUudmlzaWJpbGl0eSA9IFZpc2liaWxpdHlLaW5kOjpwdWJsaWMgb3IgZS52aXNpYmlsaXR5ID0gVmlzaWJpbGl0eUtpbmQ6OnByaXZhdGUpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlBhY2thZ2UtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlBhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUGFja2FnZS1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iVGVtcGxhdGVhYmxlRWxlbWVudCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUGFja2FnZS1fZ2VuZXJhbGl6YXRpb24uMiIgZ2VuZXJhbD0iTmFtZXNwYWNlIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQYWNrYWdlLVVSSSIgbmFtZT0iVVJJIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtVVJJLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1VUkkiPgotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwYWNrYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1hbnkgcHVycG9zZXMuIEEgVVJJIGlzIHRoZSB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmljYXRpb24gb2YgdGhlIHBhY2thZ2UgZm9sbG93aW5nIHRoZSBJRVRGIFVSSSBzcGVjaWZpY2F0aW9uLCBSRkMgMjM5NiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCBhbmQgaXQgbXVzdCBjb21wbHkgd2l0aCB0aG9zZSBzeW50YXggcnVsZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFja2FnZS1VUkktX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQYWNrYWdlLW5lc3RlZFBhY2thZ2UiIG5hbWU9Im5lc3RlZFBhY2thZ2UiIHR5cGU9IlBhY2thZ2UiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGlzRGVyaXZlZD0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IlBhY2thZ2UtcGFja2FnZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9uZXN0ZWRQYWNrYWdlX25lc3RpbmdQYWNrYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtbmVzdGVkUGFja2FnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtbmVzdGVkUGFja2FnZSI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgcGFja2FnZWQgZWxlbWVudHMgdGhhdCBhcmUgUGFja2FnZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYWNrYWdlLW5lc3RlZFBhY2thZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYWNrYWdlLW5lc3RlZFBhY2thZ2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUGFja2FnZS1uZXN0aW5nUGFja2FnZSIgbmFtZT0ibmVzdGluZ1BhY2thZ2UiIHR5cGU9IlBhY2thZ2UiIHN1YnNldHRlZFByb3BlcnR5PSJBX3BhY2thZ2VkRWxlbWVudF9vd25pbmdQYWNrYWdlLW93bmluZ1BhY2thZ2UgTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfbmVzdGVkUGFja2FnZV9uZXN0aW5nUGFja2FnZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLW5lc3RpbmdQYWNrYWdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1uZXN0aW5nUGFja2FnZSI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgUGFja2FnZSB0aGF0IG93bnMgdGhpcyBQYWNrYWdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFja2FnZS1uZXN0aW5nUGFja2FnZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBhY2thZ2Utb3duZWRTdGVyZW90eXBlIiBuYW1lPSJvd25lZFN0ZXJlb3R5cGUiIHR5cGU9IlN0ZXJlb3R5cGUiIGlzUmVhZE9ubHk9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGlzRGVyaXZlZD0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IlBhY2thZ2UtcGFja2FnZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9vd25lZFN0ZXJlb3R5cGVfb3duaW5nUGFja2FnZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLW93bmVkU3RlcmVvdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2Utb3duZWRTdGVyZW90eXBlIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBTdGVyZW90eXBlcyB0aGF0IGFyZSBvd25lZCBieSB0aGUgUGFja2FnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhY2thZ2Utb3duZWRTdGVyZW90eXBlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUGFja2FnZS1vd25lZFN0ZXJlb3R5cGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUGFja2FnZS1vd25lZFR5cGUiIG5hbWU9Im93bmVkVHlwZSIgdHlwZT0iVHlwZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iUGFja2FnZS1wYWNrYWdlZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX293bmVkVHlwZV9wYWNrYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2Utb3duZWRUeXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1vd25lZFR5cGUiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIHBhY2thZ2VkIGVsZW1lbnRzIHRoYXQgYXJlIFR5cGVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFja2FnZS1vd25lZFR5cGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYWNrYWdlLW93bmVkVHlwZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQYWNrYWdlLXBhY2thZ2VNZXJnZSIgbmFtZT0icGFja2FnZU1lcmdlIiB0eXBlPSJQYWNrYWdlTWVyZ2UiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3NvdXJjZV9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCBFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcGFja2FnZU1lcmdlX3JlY2VpdmluZ1BhY2thZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1wYWNrYWdlTWVyZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLXBhY2thZ2VNZXJnZSI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgUGFja2FnZU1lcmdlcyB0aGF0IGFyZSBvd25lZCBieSB0aGlzIFBhY2thZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYWNrYWdlLXBhY2thZ2VNZXJnZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlBhY2thZ2UtcGFja2FnZU1lcmdlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBhY2thZ2UtcGFja2FnZWRFbGVtZW50IiBuYW1lPSJwYWNrYWdlZEVsZW1lbnQiIHR5cGU9IlBhY2thZ2VhYmxlRWxlbWVudCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfcGFja2FnZWRFbGVtZW50X293bmluZ1BhY2thZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1wYWNrYWdlZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLXBhY2thZ2VkRWxlbWVudCI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBwYWNrYWdlYWJsZSBlbGVtZW50cyB0aGF0IGFyZSBvd25lZCBieSB0aGlzIFBhY2thZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYWNrYWdlLXBhY2thZ2VkRWxlbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlBhY2thZ2UtcGFja2FnZWRFbGVtZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBhY2thZ2UtcHJvZmlsZUFwcGxpY2F0aW9uIiBuYW1lPSJwcm9maWxlQXBwbGljYXRpb24iIHR5cGU9IlByb2ZpbGVBcHBsaWNhdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfc291cmNlX2RpcmVjdGVkUmVsYXRpb25zaGlwLWRpcmVjdGVkUmVsYXRpb25zaGlwIEVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9wcm9maWxlQXBwbGljYXRpb25fYXBwbHlpbmdQYWNrYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtcHJvZmlsZUFwcGxpY2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1wcm9maWxlQXBwbGljYXRpb24iPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIFByb2ZpbGVBcHBsaWNhdGlvbnMgdGhhdCBpbmRpY2F0ZSB3aGljaCBwcm9maWxlcyBoYXZlIGJlZW4gYXBwbGllZCB0byB0aGUgUGFja2FnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhY2thZ2UtcHJvZmlsZUFwcGxpY2F0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUGFja2FnZS1wcm9maWxlQXBwbGljYXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFja2FnZS1hcHBseVByb2ZpbGUiIG5hbWU9ImFwcGx5UHJvZmlsZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLWFwcGx5UHJvZmlsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtYXBwbHlQcm9maWxlIj4KLSAgICAgICAgICA8Ym9keT5BcHBsaWVzIHRoZSBjdXJyZW50IGRlZmluaXRpb24gb2YgdGhlIHNwZWNpZmllZCBwcm9maWxlIHRvIHRoaXMgcGFja2FnZSBhbmQgYXV0b21hdGljYWxseSBhcHBsaWVzIHJlcXVpcmVkIHN0ZXJlb3R5cGVzIGluIHRoZSBwcm9maWxlIHRvIGVsZW1lbnRzIHdpdGhpbiB0aGlzIHBhY2thZ2UncyBuYW1lc3BhY2UgaGllYXJhcmNoeS4gSWYgYSBkaWZmZXJlbnQgZGVmaW5pdGlvbiBpcyBhbHJlYWR5IGFwcGxpZWQsIGF1dG9tYXRpY2FsbHkgbWlncmF0ZXMgYW55IGFzc29jaWF0ZWQgc3RlcmVvdHlwZSB2YWx1ZXMgb24gYSAmcXVvdDtiZXN0IGVmZm9ydCZxdW90OyBiYXNpcyAobWF0Y2hpbmcgY2xhc3NpZmllcnMgYW5kIHN0cnVjdHVyYWwgZmVhdHVyZXMgYnkgbmFtZSkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1hcHBseVByb2ZpbGUtX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJFY29yZS5tZXRhbW9kZWwudW1sI0VPYmplY3QiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhY2thZ2UtYXBwbHlQcm9maWxlLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYWNrYWdlLWFwcGx5UHJvZmlsZS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1hcHBseVByb2ZpbGUtcHJvZmlsZSIgbmFtZT0icHJvZmlsZSIgdHlwZT0iUHJvZmlsZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1hcHBseVByb2ZpbGUtcHJvZmlsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtYXBwbHlQcm9maWxlLXByb2ZpbGUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHByb2ZpbGUgdG8gYXBwbHkuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhY2thZ2UtY3JlYXRlT3duZWRDbGFzcyIgbmFtZT0iY3JlYXRlT3duZWRDbGFzcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLWNyZWF0ZU93bmVkQ2xhc3MtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWNyZWF0ZU93bmVkQ2xhc3MiPgotICAgICAgICAgIDxib2R5PkNyZWF0ZXMgYShuKSAoYWJzdHJhY3QpIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFzIGFuIG93bmVkIHR5cGUgb2YgdGhpcyBwYWNrYWdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtY3JlYXRlT3duZWRDbGFzcy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iQ2xhc3MiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtY3JlYXRlT3duZWRDbGFzcy1uYW1lIiBuYW1lPSJuYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLWNyZWF0ZU93bmVkQ2xhc3MtbmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtY3JlYXRlT3duZWRDbGFzcy1uYW1lIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuYW1lIGZvciB0aGUgbmV3IGNsYXNzLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1jcmVhdGVPd25lZENsYXNzLWlzQWJzdHJhY3QiIG5hbWU9ImlzQWJzdHJhY3QiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtY3JlYXRlT3duZWRDbGFzcy1pc0Fic3RyYWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1jcmVhdGVPd25lZENsYXNzLWlzQWJzdHJhY3QiPgotICAgICAgICAgICAgPGJvZHk+V2hldGhlciB0aGUgbmV3IGNsYXNzIHNob3VsZCBiZSBhYnN0cmFjdC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhY2thZ2UtY3JlYXRlT3duZWRFbnVtZXJhdGlvbiIgbmFtZT0iY3JlYXRlT3duZWRFbnVtZXJhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLWNyZWF0ZU93bmVkRW51bWVyYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWNyZWF0ZU93bmVkRW51bWVyYXRpb24iPgotICAgICAgICAgIDxib2R5PkNyZWF0ZXMgYSBlbnVtZXJhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhcyBhbiBvd25lZCB0eXBlIG9mIHRoaXMgcGFja2FnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLWNyZWF0ZU93bmVkRW51bWVyYXRpb24tX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkVudW1lcmF0aW9uIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLWNyZWF0ZU93bmVkRW51bWVyYXRpb24tbmFtZSIgbmFtZT0ibmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1jcmVhdGVPd25lZEVudW1lcmF0aW9uLW5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWNyZWF0ZU93bmVkRW51bWVyYXRpb24tbmFtZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmFtZSBmb3IgdGhlIG5ldyBlbnVtZXJhdGlvbiwgb3IgbnVsbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFja2FnZS1jcmVhdGVPd25lZEludGVyZmFjZSIgbmFtZT0iY3JlYXRlT3duZWRJbnRlcmZhY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1jcmVhdGVPd25lZEludGVyZmFjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtY3JlYXRlT3duZWRJbnRlcmZhY2UiPgotICAgICAgICAgIDxib2R5PkNyZWF0ZXMgYW4gaW50ZXJmYWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFzIGFuIG93bmVkIHR5cGUgb2YgdGhpcyBwYWNrYWdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtY3JlYXRlT3duZWRJbnRlcmZhY2UtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkludGVyZmFjZSIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1jcmVhdGVPd25lZEludGVyZmFjZS1uYW1lIiBuYW1lPSJuYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLWNyZWF0ZU93bmVkSW50ZXJmYWNlLW5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWNyZWF0ZU93bmVkSW50ZXJmYWNlLW5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgZm9yIHRoZSBuZXcgaW50ZXJmYWNlLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQYWNrYWdlLWNyZWF0ZU93bmVkUHJpbWl0aXZlVHlwZSIgbmFtZT0iY3JlYXRlT3duZWRQcmltaXRpdmVUeXBlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtY3JlYXRlT3duZWRQcmltaXRpdmVUeXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1jcmVhdGVPd25lZFByaW1pdGl2ZVR5cGUiPgotICAgICAgICAgIDxib2R5PkNyZWF0ZXMgYSBwcmltaXRpdmUgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhcyBhbiBvd25lZCB0eXBlIG9mIHRoaXMgcGFja2FnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLWNyZWF0ZU93bmVkUHJpbWl0aXZlVHlwZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUHJpbWl0aXZlVHlwZSIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1jcmVhdGVPd25lZFByaW1pdGl2ZVR5cGUtbmFtZSIgbmFtZT0ibmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1jcmVhdGVPd25lZFByaW1pdGl2ZVR5cGUtbmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtY3JlYXRlT3duZWRQcmltaXRpdmVUeXBlLW5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgZm9yIHRoZSBuZXcgcHJpbWl0aXZlIHR5cGUsIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhY2thZ2UtY3JlYXRlT3duZWRTdGVyZW90eXBlIiBuYW1lPSJjcmVhdGVPd25lZFN0ZXJlb3R5cGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1jcmVhdGVPd25lZFN0ZXJlb3R5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWNyZWF0ZU93bmVkU3RlcmVvdHlwZSI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhKG4pIChhYnN0cmFjdCkgc3RlcmVvdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhcyBhbiBvd25lZCBzdGVyZW90eXBlIG9mIHRoaXMgcHJvZmlsZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLWNyZWF0ZU93bmVkU3RlcmVvdHlwZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iU3RlcmVvdHlwZSIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1jcmVhdGVPd25lZFN0ZXJlb3R5cGUtbmFtZSIgbmFtZT0ibmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1jcmVhdGVPd25lZFN0ZXJlb3R5cGUtbmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtY3JlYXRlT3duZWRTdGVyZW90eXBlLW5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgZm9yIHRoZSBuZXcgc3RlcmVvdHlwZSwgb3IgbnVsbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtY3JlYXRlT3duZWRTdGVyZW90eXBlLWlzQWJzdHJhY3QiIG5hbWU9ImlzQWJzdHJhY3QiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtY3JlYXRlT3duZWRTdGVyZW90eXBlLWlzQWJzdHJhY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWNyZWF0ZU93bmVkU3RlcmVvdHlwZS1pc0Fic3RyYWN0Ij4KLSAgICAgICAgICAgIDxib2R5PldoZXRoZXIgdGhlIG5ldyBzdGVyZW90eXBlIHNob3VsZCBiZSBhYnN0cmFjdC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhY2thZ2UtZ2V0QWxsQXBwbGllZFByb2ZpbGVzIiBuYW1lPSJnZXRBbGxBcHBsaWVkUHJvZmlsZXMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1nZXRBbGxBcHBsaWVkUHJvZmlsZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWdldEFsbEFwcGxpZWRQcm9maWxlcyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIGFsbCB0aGUgcHJvZmlsZXMgdGhhdCBhcmUgYXBwbGllZCB0byB0aGlzIHBhY2thZ2UsIGluY2x1ZGluZyBwcm9maWxlcyBhcHBsaWVkIHRvIGl0cyBuZXN0aW5nIHBhY2thZ2UocykuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1nZXRBbGxBcHBsaWVkUHJvZmlsZXMtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IlByb2ZpbGUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhY2thZ2UtZ2V0QWxsQXBwbGllZFByb2ZpbGVzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYWNrYWdlLWdldEFsbEFwcGxpZWRQcm9maWxlcy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQYWNrYWdlLWdldEFsbFByb2ZpbGVBcHBsaWNhdGlvbnMiIG5hbWU9ImdldEFsbFByb2ZpbGVBcHBsaWNhdGlvbnMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1nZXRBbGxQcm9maWxlQXBwbGljYXRpb25zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1nZXRBbGxQcm9maWxlQXBwbGljYXRpb25zIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgYWxsIHRoZSBwcm9maWxlIGFwcGxpY2F0aW9ucyBmb3IgdGhpcyBwYWNrYWdlLCBpbmNsdWRpbmcgcHJvZmlsZSBhcHBsaWNhdGlvbnMgZm9yIGl0cyBuZXN0aW5nIHBhY2thZ2UocykuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1nZXRBbGxQcm9maWxlQXBwbGljYXRpb25zLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJQcm9maWxlQXBwbGljYXRpb24iIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhY2thZ2UtZ2V0QWxsUHJvZmlsZUFwcGxpY2F0aW9ucy1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUGFja2FnZS1nZXRBbGxQcm9maWxlQXBwbGljYXRpb25zLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhY2thZ2UtZ2V0QXBwbGllZFByb2ZpbGUiIG5hbWU9ImdldEFwcGxpZWRQcm9maWxlIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtZ2V0QXBwbGllZFByb2ZpbGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWdldEFwcGxpZWRQcm9maWxlIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIHByb2ZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZCBuYW1lIHRoYXQgaXMgYXBwbGllZCB0byB0aGlzIHBhY2thZ2UsIG9yIG51bGwgaWYgbm8gc3VjaCBwcm9maWxlIGlzIGFwcGxpZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUHJvZmlsZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZS1xdWFsaWZpZWROYW1lIiBuYW1lPSJxdWFsaWZpZWROYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLWdldEFwcGxpZWRQcm9maWxlLXF1YWxpZmllZE5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWdldEFwcGxpZWRQcm9maWxlLXF1YWxpZmllZE5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhcHBsaWVkIHByb2ZpbGUgdG8gcmV0cmlldmUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhY2thZ2UtZ2V0QXBwbGllZFByb2ZpbGUuMSIgbmFtZT0iZ2V0QXBwbGllZFByb2ZpbGUiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZS4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZS4xIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIHByb2ZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZCBuYW1lIHRoYXQgaXMgYXBwbGllZCB0byB0aGlzIHBhY2thZ2Ugb3IgYW55IG9mIGl0cyBuZXN0aW5nIHBhY2thZ2VzIChpZiBpbmRpY2F0ZWQpLCBvciBudWxsIGlmIG5vIHN1Y2ggcHJvZmlsZSBpcyBhcHBsaWVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtZ2V0QXBwbGllZFByb2ZpbGUuMS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUHJvZmlsZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZS4xLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYWNrYWdlLWdldEFwcGxpZWRQcm9maWxlLjEtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtZ2V0QXBwbGllZFByb2ZpbGUuMS1xdWFsaWZpZWROYW1lIiBuYW1lPSJxdWFsaWZpZWROYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLWdldEFwcGxpZWRQcm9maWxlLjEtcXVhbGlmaWVkTmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtZ2V0QXBwbGllZFByb2ZpbGUuMS1xdWFsaWZpZWROYW1lIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXBwbGllZCBwcm9maWxlIHRvIHJldHJpZXZlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZS4xLXJlY3Vyc2UiIG5hbWU9InJlY3Vyc2UiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtZ2V0QXBwbGllZFByb2ZpbGUuMS1yZWN1cnNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZS4xLXJlY3Vyc2UiPgotICAgICAgICAgICAgPGJvZHk+V2hldGhlciB0byBsb29rIGluIG5lc3RpbmcgcGFja2FnZXMuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQYWNrYWdlLWdldEFwcGxpZWRQcm9maWxlcyIgbmFtZT0iZ2V0QXBwbGllZFByb2ZpbGVzIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtZ2V0QXBwbGllZFByb2ZpbGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZXMiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgcHJvZmlsZXMgdGhhdCBhcmUgYXBwbGllZCB0byB0aGlzIHBhY2thZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1nZXRBcHBsaWVkUHJvZmlsZXMtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IlByb2ZpbGUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhY2thZ2UtZ2V0QXBwbGllZFByb2ZpbGVzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYWNrYWdlLWdldEFwcGxpZWRQcm9maWxlcy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQYWNrYWdlLWdldFByb2ZpbGVBcHBsaWNhdGlvbiIgbmFtZT0iZ2V0UHJvZmlsZUFwcGxpY2F0aW9uIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtZ2V0UHJvZmlsZUFwcGxpY2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1nZXRQcm9maWxlQXBwbGljYXRpb24iPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgYXBwbGljYXRpb24gb2YgdGhlIHNwZWNpZmllZCBwcm9maWxlIHRvIHRoaXMgcGFja2FnZSwgb3IgbnVsbCBpZiBubyBzdWNoIHByb2ZpbGUgaXMgYXBwbGllZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLWdldFByb2ZpbGVBcHBsaWNhdGlvbi1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUHJvZmlsZUFwcGxpY2F0aW9uIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYWNrYWdlLWdldFByb2ZpbGVBcHBsaWNhdGlvbi1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUGFja2FnZS1nZXRQcm9maWxlQXBwbGljYXRpb24tX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtZ2V0UHJvZmlsZUFwcGxpY2F0aW9uLXByb2ZpbGUiIG5hbWU9InByb2ZpbGUiIHR5cGU9IlByb2ZpbGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtZ2V0UHJvZmlsZUFwcGxpY2F0aW9uLXByb2ZpbGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWdldFByb2ZpbGVBcHBsaWNhdGlvbi1wcm9maWxlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBwcm9maWxlIHdob3NlIGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQYWNrYWdlLWdldFByb2ZpbGVBcHBsaWNhdGlvbi4xIiBuYW1lPSJnZXRQcm9maWxlQXBwbGljYXRpb24iIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1nZXRQcm9maWxlQXBwbGljYXRpb24uMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtZ2V0UHJvZmlsZUFwcGxpY2F0aW9uLjEiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgYXBwbGljYXRpb24gb2YgdGhlIHNwZWNpZmllZCBwcm9maWxlIHRvIHRoaXMgcGFja2FnZSBvciBhbnkgb2YgaXRzIG5lc3RpbmcgcGFja2FnZXMgKGlmIGluZGljYXRlZCksIG9yIG51bGwgaWYgbm8gc3VjaCBwcm9maWxlIGlzIGFwcGxpZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1nZXRQcm9maWxlQXBwbGljYXRpb24uMS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUHJvZmlsZUFwcGxpY2F0aW9uIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYWNrYWdlLWdldFByb2ZpbGVBcHBsaWNhdGlvbi4xLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYWNrYWdlLWdldFByb2ZpbGVBcHBsaWNhdGlvbi4xLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLWdldFByb2ZpbGVBcHBsaWNhdGlvbi4xLXByb2ZpbGUiIG5hbWU9InByb2ZpbGUiIHR5cGU9IlByb2ZpbGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtZ2V0UHJvZmlsZUFwcGxpY2F0aW9uLjEtcHJvZmlsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtZ2V0UHJvZmlsZUFwcGxpY2F0aW9uLjEtcHJvZmlsZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgcHJvZmlsZSB3aG9zZSBhcHBsaWNhdGlvbiB0byByZXRyaWV2ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtZ2V0UHJvZmlsZUFwcGxpY2F0aW9uLjEtcmVjdXJzZSIgbmFtZT0icmVjdXJzZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1nZXRQcm9maWxlQXBwbGljYXRpb24uMS1yZWN1cnNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1nZXRQcm9maWxlQXBwbGljYXRpb24uMS1yZWN1cnNlIj4KLSAgICAgICAgICAgIDxib2R5PldoZXRoZXIgdG8gbG9vayBpbiBuZXN0aW5nIHBhY2thZ2VzLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFja2FnZS1pc01vZGVsTGlicmFyeSIgbmFtZT0iaXNNb2RlbExpYnJhcnkiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1pc01vZGVsTGlicmFyeS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtaXNNb2RlbExpYnJhcnkiPgotICAgICAgICAgIDxib2R5PkRldGVybWluZXMgd2hldGhlciB0aGlzIHBhY2thZ2UgaXMgYSBtb2RlbCBsaWJyYXJ5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtaXNNb2RlbExpYnJhcnktX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFja2FnZS1pc1Byb2ZpbGVBcHBsaWVkIiBuYW1lPSJpc1Byb2ZpbGVBcHBsaWVkIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtaXNQcm9maWxlQXBwbGllZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtaXNQcm9maWxlQXBwbGllZCI+Ci0gICAgICAgICAgPGJvZHk+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcHJvZmlsZSBpcyBhcHBsaWVkIHRvIHRoaXMgcGFja2FnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLWlzUHJvZmlsZUFwcGxpZWQtX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtaXNQcm9maWxlQXBwbGllZC1wcm9maWxlIiBuYW1lPSJwcm9maWxlIiB0eXBlPSJQcm9maWxlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLWlzUHJvZmlsZUFwcGxpZWQtcHJvZmlsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtaXNQcm9maWxlQXBwbGllZC1wcm9maWxlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBwcm9maWxlIGluIHF1ZXN0aW9uLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQYWNrYWdlLXVuYXBwbHlQcm9maWxlIiBuYW1lPSJ1bmFwcGx5UHJvZmlsZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLXVuYXBwbHlQcm9maWxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS11bmFwcGx5UHJvZmlsZSI+Ci0gICAgICAgICAgPGJvZHk+VW5hcHBsaWVzIHRoZSBzcGVjaWZpZWQgcHJvZmlsZSBmcm9tIHRoaXMgcGFja2FnZSBhbmQgYXV0b21hdGljYWxseSB1bmFwcGxpZXMgc3RlcmVvdHlwZXMgaW4gdGhlIHByb2ZpbGUgZnJvbSBlbGVtZW50cyB3aXRoaW4gdGhpcyBwYWNrYWdlJ3MgbmFtZXNwYWNlIGhpZWFyYXJjaHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS11bmFwcGx5UHJvZmlsZS1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRU9iamVjdCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFja2FnZS11bmFwcGx5UHJvZmlsZS1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUGFja2FnZS11bmFwcGx5UHJvZmlsZS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS11bmFwcGx5UHJvZmlsZS1wcm9maWxlIiBuYW1lPSJwcm9maWxlIiB0eXBlPSJQcm9maWxlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLXVuYXBwbHlQcm9maWxlLXByb2ZpbGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLXVuYXBwbHlQcm9maWxlLXByb2ZpbGUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHByb2ZpbGUgdG8gdW5hcHBseS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFja2FnZS1hcHBseVByb2ZpbGVzIiBuYW1lPSJhcHBseVByb2ZpbGVzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtYXBwbHlQcm9maWxlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtYXBwbHlQcm9maWxlcyI+Ci0gICAgICAgICAgPGJvZHk+QXBwbGllcyB0aGUgY3VycmVudCBkZWZpbml0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIHByb2ZpbGVzIHRvIHRoaXMgcGFja2FnZSBhbmQgYXV0b21hdGljYWxseSBhcHBsaWVzIHJlcXVpcmVkIHN0ZXJlb3R5cGVzIGluIHRoZSBwcm9maWxlcyB0byBlbGVtZW50cyB3aXRoaW4gdGhpcyBwYWNrYWdlJ3MgbmFtZXNwYWNlIGhpZWFyYXJjaHkuIElmIGRpZmZlcmVudCBkZWZpbml0aW9ucyBhcmUgYWxyZWFkeSBhcHBsaWVkLCBhdXRvbWF0aWNhbGx5IG1pZ3JhdGVzIGFueSBhc3NvY2lhdGVkIHN0ZXJlb3R5cGUgdmFsdWVzIG9uIGEgJnF1b3Q7YmVzdCBlZmZvcnQmcXVvdDsgYmFzaXMgKG1hdGNoaW5nIGNsYXNzaWZpZXJzIGFuZCBzdHJ1Y3R1cmFsIGZlYXR1cmVzIGJ5IG5hbWUpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtYXBwbHlQcm9maWxlcy1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRU9iamVjdCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFja2FnZS1hcHBseVByb2ZpbGVzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYWNrYWdlLWFwcGx5UHJvZmlsZXMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtYXBwbHlQcm9maWxlcy1wcm9maWxlcyIgbmFtZT0icHJvZmlsZXMiIHR5cGU9IlByb2ZpbGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtYXBwbHlQcm9maWxlcy1wcm9maWxlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtYXBwbHlQcm9maWxlcy1wcm9maWxlcyI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgcHJvZmlsZXMgdG8gYXBwbHkuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUGFja2FnZS1hcHBseVByb2ZpbGVzLXByb2ZpbGVzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhY2thZ2UtYWxsQXBwbGljYWJsZVN0ZXJlb3R5cGVzIiBuYW1lPSJhbGxBcHBsaWNhYmxlU3RlcmVvdHlwZXMiIGJvZHlDb25kaXRpb249IlBhY2thZ2UtYWxsQXBwbGljYWJsZVN0ZXJlb3R5cGVzLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS1hbGxBcHBsaWNhYmxlU3RlcmVvdHlwZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLWFsbEFwcGxpY2FibGVTdGVyZW90eXBlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGFsbEFwcGxpY2FibGVTdGVyZW90eXBlcygpIHJldHVybnMgYWxsIHRoZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IG93bmVkIHN0ZXJlb3R5cGVzLCBpbmNsdWRpbmcgc3RlcmVvdHlwZXMgY29udGFpbmVkIGluIHN1Yi1wcm9maWxlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUGFja2FnZS1hbGxBcHBsaWNhYmxlU3RlcmVvdHlwZXMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJQYWNrYWdlLWFsbEFwcGxpY2FibGVTdGVyZW90eXBlcyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhY2thZ2UtYWxsQXBwbGljYWJsZVN0ZXJlb3R5cGVzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobGV0IG93bmVkUGFja2FnZXMgOiBCYWcoUGFja2FnZSkgPSBvd25lZE1lbWJlci0+c2VsZWN0KG9jbElzS2luZE9mKFBhY2thZ2UpKS0+Y29sbGVjdChvY2xBc1R5cGUoUGFja2FnZSkpIGluJiN4RDsKLSBvd25lZFN0ZXJlb3R5cGUtPnVuaW9uKG93bmVkUGFja2FnZXMuYWxsQXBwbGljYWJsZVN0ZXJlb3R5cGVzKCkpLT5mbGF0dGVuKCktPmFzU2V0KCkmI3hEOwotKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLWFsbEFwcGxpY2FibGVTdGVyZW90eXBlcy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iU3RlcmVvdHlwZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFja2FnZS1hbGxBcHBsaWNhYmxlU3RlcmVvdHlwZXMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYWNrYWdlLWFsbEFwcGxpY2FibGVTdGVyZW90eXBlcy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFja2FnZS1jb250YWluaW5nUHJvZmlsZSIgbmFtZT0iY29udGFpbmluZ1Byb2ZpbGUiIGJvZHlDb25kaXRpb249IlBhY2thZ2UtY29udGFpbmluZ1Byb2ZpbGUtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLWNvbnRhaW5pbmdQcm9maWxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1jb250YWluaW5nUHJvZmlsZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGNvbnRhaW5pbmdQcm9maWxlKCkgcmV0dXJucyB0aGUgY2xvc2VzdCBwcm9maWxlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgY29udGFpbmluZyB0aGlzIHBhY2thZ2UgKG9yIHRoaXMgcGFja2FnZSBpdHNlbGYsIGlmIGl0IGlzIGEgcHJvZmlsZSkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBhY2thZ2UtY29udGFpbmluZ1Byb2ZpbGUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJQYWNrYWdlLWNvbnRhaW5pbmdQcm9maWxlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUGFja2FnZS1jb250YWluaW5nUHJvZmlsZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIHNlbGYub2NsSXNLaW5kT2YoUHJvZmlsZSkgdGhlbiAmI3hEOwotCXNlbGYub2NsQXNUeXBlKFByb2ZpbGUpJiN4RDsKLWVsc2UmI3hEOwotCXNlbGYubmFtZXNwYWNlLm9jbEFzVHlwZShQYWNrYWdlKS5jb250YWluaW5nUHJvZmlsZSgpJiN4RDsKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLWNvbnRhaW5pbmdQcm9maWxlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQcm9maWxlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYWNrYWdlLWNvbnRhaW5pbmdQcm9maWxlLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhY2thZ2UtbWFrZXNWaXNpYmxlIiBuYW1lPSJtYWtlc1Zpc2libGUiIGJvZHlDb25kaXRpb249IlBhY2thZ2UtbWFrZXNWaXNpYmxlLXNwZWMiIGlzUXVlcnk9InRydWUiIHByZWNvbmRpdGlvbj0iUGFja2FnZS1tYWtlc1Zpc2libGUtcHJlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2UtbWFrZXNWaXNpYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1tYWtlc1Zpc2libGUiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBtYWtlc1Zpc2libGUoKSBkZWZpbmVzIHdoZXRoZXIgYSBQYWNrYWdlIG1ha2VzIGFuIGVsZW1lbnQgdmlzaWJsZSBvdXRzaWRlIGl0c2VsZi4gRWxlbWVudHMgd2l0aCBubyB2aXNpYmlsaXR5IGFuZCBlbGVtZW50cyB3aXRoIHB1YmxpYyB2aXNpYmlsaXR5IGFyZSBtYWRlIHZpc2libGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBhY2thZ2UtbWFrZXNWaXNpYmxlLXByZSIgbmFtZT0icHJlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBhY2thZ2UtbWFrZXNWaXNpYmxlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUGFja2FnZS1tYWtlc1Zpc2libGUtcHJlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+bWVtYmVyLT5pbmNsdWRlcyhlbCk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBhY2thZ2UtbWFrZXNWaXNpYmxlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUGFja2FnZS1tYWtlc1Zpc2libGUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQYWNrYWdlLW1ha2VzVmlzaWJsZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKG93bmVkTWVtYmVyLT5pbmNsdWRlcyhlbCkgb3IKLShlbGVtZW50SW1wb3J0LT5zZWxlY3QoZWl8ZWkuaW1wb3J0ZWRFbGVtZW50ID0gVmlzaWJpbGl0eUtpbmQ6OnB1YmxpYyktPmNvbGxlY3QoaW1wb3J0ZWRFbGVtZW50Lm9jbEFzVHlwZShOYW1lZEVsZW1lbnQpKS0+aW5jbHVkZXMoZWwpKSBvcgotKHBhY2thZ2VJbXBvcnQtPnNlbGVjdCh2aXNpYmlsaXR5ID0gVmlzaWJpbGl0eUtpbmQ6OnB1YmxpYyktPmNvbGxlY3QoaW1wb3J0ZWRQYWNrYWdlLm1lbWJlci0+aW5jbHVkZXMoZWwpKS0+bm90RW1wdHkoKSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtbWFrZXNWaXNpYmxlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLW1ha2VzVmlzaWJsZS1lbCIgbmFtZT0iZWwiIHR5cGU9Ik5hbWVkRWxlbWVudCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhY2thZ2UtbXVzdEJlT3duZWQiIG5hbWU9Im11c3RCZU93bmVkIiBib2R5Q29uZGl0aW9uPSJQYWNrYWdlLW11c3RCZU93bmVkLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iRWxlbWVudC1tdXN0QmVPd25lZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLW11c3RCZU93bmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1tdXN0QmVPd25lZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IG11c3RCZU93bmVkKCkgaW5kaWNhdGVzIHdoZXRoZXIgZWxlbWVudHMgb2YgdGhpcyB0eXBlIG11c3QgaGF2ZSBhbiBvd25lci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUGFja2FnZS1tdXN0QmVPd25lZC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBhY2thZ2UtbXVzdEJlT3duZWQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQYWNrYWdlLW11c3RCZU93bmVkLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoZmFsc2UpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtbXVzdEJlT3duZWQtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFja2FnZS1uZXN0ZWRQYWNrYWdlLjEiIG5hbWU9Im5lc3RlZFBhY2thZ2UiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iUGFja2FnZS1uZXN0ZWRQYWNrYWdlLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLW5lc3RlZFBhY2thZ2UuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtbmVzdGVkUGFja2FnZS4xIj4KLSAgICAgICAgICA8Ym9keT5EZXJpdmF0aW9uIGZvciBQYWNrYWdlOjovbmVzdGVkUGFja2FnZTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQYWNrYWdlLW5lc3RlZFBhY2thZ2UuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBhY2thZ2UtbmVzdGVkUGFja2FnZS4xIFBhY2thZ2UtbmVzdGVkUGFja2FnZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhY2thZ2UtbmVzdGVkUGFja2FnZS4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAocGFja2FnZWRFbGVtZW50LT5zZWxlY3Qob2NsSXNLaW5kT2YoUGFja2FnZSkpLT5jb2xsZWN0KG9jbEFzVHlwZShQYWNrYWdlKSktPmFzU2V0KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBhY2thZ2UtbmVzdGVkUGFja2FnZS4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQYWNrYWdlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYWNrYWdlLW5lc3RlZFBhY2thZ2UuMS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlBhY2thZ2UtbmVzdGVkUGFja2FnZS4xLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQYWNrYWdlLW93bmVkU3RlcmVvdHlwZS4xIiBuYW1lPSJvd25lZFN0ZXJlb3R5cGUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iUGFja2FnZS1vd25lZFN0ZXJlb3R5cGUuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2Utb3duZWRTdGVyZW90eXBlLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlLW93bmVkU3RlcmVvdHlwZS4xIj4KLSAgICAgICAgICA8Ym9keT5EZXJpdmF0aW9uIGZvciBQYWNrYWdlOjovb3duZWRTdGVyZW90eXBlPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBhY2thZ2Utb3duZWRTdGVyZW90eXBlLjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJQYWNrYWdlLW93bmVkU3RlcmVvdHlwZS4xIFBhY2thZ2Utb3duZWRTdGVyZW90eXBlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUGFja2FnZS1vd25lZFN0ZXJlb3R5cGUuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHBhY2thZ2VkRWxlbWVudC0+c2VsZWN0KG9jbElzS2luZE9mKFN0ZXJlb3R5cGUpKS0+Y29sbGVjdChvY2xBc1R5cGUoU3RlcmVvdHlwZSkpLT5hc1NldCgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLW93bmVkU3RlcmVvdHlwZS4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJTdGVyZW90eXBlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYWNrYWdlLW93bmVkU3RlcmVvdHlwZS4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUGFja2FnZS1vd25lZFN0ZXJlb3R5cGUuMS1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUGFja2FnZS1vd25lZFR5cGUuMSIgbmFtZT0ib3duZWRUeXBlIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IlBhY2thZ2Utb3duZWRUeXBlLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlLW93bmVkVHlwZS4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZS1vd25lZFR5cGUuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgUGFja2FnZTo6L293bmVkVHlwZTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQYWNrYWdlLW93bmVkVHlwZS4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUGFja2FnZS1vd25lZFR5cGUuMSBQYWNrYWdlLW93bmVkVHlwZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBhY2thZ2Utb3duZWRUeXBlLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChwYWNrYWdlZEVsZW1lbnQtPnNlbGVjdChvY2xJc0tpbmRPZihUeXBlKSktPmNvbGxlY3Qob2NsQXNUeXBlKFR5cGUpKS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUGFja2FnZS1vd25lZFR5cGUuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iVHlwZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUGFja2FnZS1vd25lZFR5cGUuMS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlBhY2thZ2Utb3duZWRUeXBlLjEtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlBhY2thZ2UtdmlzaWJsZU1lbWJlcnMiIG5hbWU9InZpc2libGVNZW1iZXJzIiBib2R5Q29uZGl0aW9uPSJQYWNrYWdlLXZpc2libGVNZW1iZXJzLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUGFja2FnZS12aXNpYmxlTWVtYmVycy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBhY2thZ2UtdmlzaWJsZU1lbWJlcnMiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSB2aXNpYmxlTWVtYmVycygpIGRlZmluZXMgd2hpY2ggbWVtYmVycyBvZiBhIFBhY2thZ2UgY2FuIGJlIGFjY2Vzc2VkIG91dHNpZGUgaXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBhY2thZ2UtdmlzaWJsZU1lbWJlcnMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJQYWNrYWdlLXZpc2libGVNZW1iZXJzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUGFja2FnZS12aXNpYmxlTWVtYmVycy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKG1lbWJlci0+c2VsZWN0KCBtIHwgbS5vY2xJc0tpbmRPZihQYWNrYWdlYWJsZUVsZW1lbnQpIGFuZCBzZWxmLm1ha2VzVmlzaWJsZShtKSktPmNvbGxlY3Qob2NsQXNUeXBlKFBhY2thZ2VhYmxlRWxlbWVudCkpLT5hc1NldCgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQYWNrYWdlLXZpc2libGVNZW1iZXJzLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhY2thZ2UtdmlzaWJsZU1lbWJlcnMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQYWNrYWdlLXZpc2libGVNZW1iZXJzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlBhY2thZ2VNZXJnZSIgbmFtZT0iUGFja2FnZU1lcmdlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQYWNrYWdlTWVyZ2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQYWNrYWdlTWVyZ2UiPgotICAgICAgICA8Ym9keT5BIHBhY2thZ2UgbWVyZ2UgZGVmaW5lcyBob3cgdGhlIGNvbnRlbnRzIG9mIG9uZSBwYWNrYWdlIGFyZSBleHRlbmRlZCBieSB0aGUgY29udGVudHMgb2YgYW5vdGhlciBwYWNrYWdlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUGFja2FnZU1lcmdlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJEaXJlY3RlZFJlbGF0aW9uc2hpcCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUGFja2FnZU1lcmdlLW1lcmdlZFBhY2thZ2UiIG5hbWU9Im1lcmdlZFBhY2thZ2UiIHR5cGU9IlBhY2thZ2UiIHN1YnNldHRlZFByb3BlcnR5PSJEaXJlY3RlZFJlbGF0aW9uc2hpcC10YXJnZXQiIGFzc29jaWF0aW9uPSJBX21lcmdlZFBhY2thZ2VfcGFja2FnZU1lcmdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2VNZXJnZS1tZXJnZWRQYWNrYWdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZU1lcmdlLW1lcmdlZFBhY2thZ2UiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIFBhY2thZ2UgdGhhdCBpcyB0byBiZSBtZXJnZWQgd2l0aCB0aGUgcmVjZWl2aW5nIHBhY2thZ2Ugb2YgdGhlIFBhY2thZ2VNZXJnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBhY2thZ2VNZXJnZS1yZWNlaXZpbmdQYWNrYWdlIiBuYW1lPSJyZWNlaXZpbmdQYWNrYWdlIiB0eXBlPSJQYWNrYWdlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAtc291cmNlIEVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX3BhY2thZ2VNZXJnZV9yZWNlaXZpbmdQYWNrYWdlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBhY2thZ2VNZXJnZS1yZWNlaXZpbmdQYWNrYWdlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUGFja2FnZU1lcmdlLXJlY2VpdmluZ1BhY2thZ2UiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIFBhY2thZ2UgdGhhdCBpcyBiZWluZyBleHRlbmRlZCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgbWVyZ2VkIHBhY2thZ2Ugb2YgdGhlIFBhY2thZ2VNZXJnZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iUHJvZmlsZSIgbmFtZT0iUHJvZmlsZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb2ZpbGUiPgotICAgICAgICA8Ym9keT5BIHByb2ZpbGUgZGVmaW5lcyBsaW1pdGVkIGV4dGVuc2lvbnMgdG8gYSByZWZlcmVuY2UgbWV0YW1vZGVsIHdpdGggdGhlIHB1cnBvc2Ugb2YgYWRhcHRpbmcgdGhlIG1ldGFtb2RlbCB0byBhIHNwZWNpZmljIHBsYXRmb3JtIG9yIGRvbWFpbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQcm9maWxlLW1ldGFjbGFzc19yZWZlcmVuY2Vfbm90X3NwZWNpYWxpemVkIiBuYW1lPSJtZXRhY2xhc3NfcmVmZXJlbmNlX25vdF9zcGVjaWFsaXplZCIgY29uc3RyYWluZWRFbGVtZW50PSJQcm9maWxlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb2ZpbGUtbWV0YWNsYXNzX3JlZmVyZW5jZV9ub3Rfc3BlY2lhbGl6ZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9maWxlLW1ldGFjbGFzc19yZWZlcmVuY2Vfbm90X3NwZWNpYWxpemVkIj4KLSAgICAgICAgICA8Ym9keT5BbiBlbGVtZW50IGltcG9ydGVkIGFzIGEgbWV0YWNsYXNzUmVmZXJlbmNlIGlzIG5vdCBzcGVjaWFsaXplZCBvciBnZW5lcmFsaXplZCBpbiBhIFByb2ZpbGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb2ZpbGUtbWV0YWNsYXNzX3JlZmVyZW5jZV9ub3Rfc3BlY2lhbGl6ZWQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm1ldGFjbGFzc1JlZmVyZW5jZS5pbXBvcnRlZEVsZW1lbnQtPiYjeEQ7Ci0Jc2VsZWN0KGMgfCBjLm9jbElzS2luZE9mKENsYXNzaWZpZXIpIGFuZCYjeEQ7Ci0JCShjLm9jbEFzVHlwZShDbGFzc2lmaWVyKS5hbGxQYXJlbnRzKCktPmNvbGxlY3QobmFtZXNwYWNlKS0+aW5jbHVkZXMoc2VsZikpKS0+aXNFbXB0eSgpJiN4RDsKLWFuZCAmI3hEOwotcGFja2FnZWRFbGVtZW50LT4mI3hEOwotICAgIHNlbGVjdChvY2xJc0tpbmRPZihDbGFzc2lmaWVyKSktPmNvbGxlY3Qob2NsQXNUeXBlKENsYXNzaWZpZXIpLmFsbFBhcmVudHMoKSktPiYjeEQ7Ci0gICAgICAgaW50ZXJzZWN0aW9uKG1ldGFjbGFzc1JlZmVyZW5jZS5pbXBvcnRlZEVsZW1lbnQtPnNlbGVjdChvY2xJc0tpbmRPZihDbGFzc2lmaWVyKSktPmNvbGxlY3Qob2NsQXNUeXBlKENsYXNzaWZpZXIpKSktPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvZmlsZS1yZWZlcmVuY2VzX3NhbWVfbWV0YW1vZGVsIiBuYW1lPSJyZWZlcmVuY2VzX3NhbWVfbWV0YW1vZGVsIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb2ZpbGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZS1yZWZlcmVuY2VzX3NhbWVfbWV0YW1vZGVsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvZmlsZS1yZWZlcmVuY2VzX3NhbWVfbWV0YW1vZGVsIj4KLSAgICAgICAgICA8Ym9keT5BbGwgZWxlbWVudHMgaW1wb3J0ZWQgZWl0aGVyIGFzIG1ldGFjbGFzc1JlZmVyZW5jZXMgb3IgdGhyb3VnaCBtZXRhbW9kZWxSZWZlcmVuY2VzIGFyZSBtZW1iZXJzIG9mIHRoZSBzYW1lIGJhc2UgcmVmZXJlbmNlIG1ldGFtb2RlbC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHJvZmlsZS1yZWZlcmVuY2VzX3NhbWVfbWV0YW1vZGVsLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5tZXRhbW9kZWxSZWZlcmVuY2UuaW1wb3J0ZWRQYWNrYWdlLmVsZW1lbnRJbXBvcnQuaW1wb3J0ZWRFbGVtZW50LmFsbE93bmluZ1BhY2thZ2VzKCktPiYjeEQ7Ci0gIHVuaW9uKG1ldGFjbGFzc1JlZmVyZW5jZS5pbXBvcnRlZEVsZW1lbnQuYWxsT3duaW5nUGFja2FnZXMoKSApLT5ub3RFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlByb2ZpbGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlBhY2thZ2UiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb2ZpbGUtbWV0YWNsYXNzUmVmZXJlbmNlIiBuYW1lPSJtZXRhY2xhc3NSZWZlcmVuY2UiIHR5cGU9IkVsZW1lbnRJbXBvcnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2UtZWxlbWVudEltcG9ydCIgYXNzb2NpYXRpb249IkFfbWV0YWNsYXNzUmVmZXJlbmNlX3Byb2ZpbGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZS1tZXRhY2xhc3NSZWZlcmVuY2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9maWxlLW1ldGFjbGFzc1JlZmVyZW5jZSI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyBhIG1ldGFjbGFzcyB0aGF0IG1heSBiZSBleHRlbmRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb2ZpbGUtbWV0YWNsYXNzUmVmZXJlbmNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUHJvZmlsZS1tZXRhY2xhc3NSZWZlcmVuY2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUHJvZmlsZS1tZXRhbW9kZWxSZWZlcmVuY2UiIG5hbWU9Im1ldGFtb2RlbFJlZmVyZW5jZSIgdHlwZT0iUGFja2FnZUltcG9ydCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1wYWNrYWdlSW1wb3J0IiBhc3NvY2lhdGlvbj0iQV9tZXRhbW9kZWxSZWZlcmVuY2VfcHJvZmlsZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9maWxlLW1ldGFtb2RlbFJlZmVyZW5jZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb2ZpbGUtbWV0YW1vZGVsUmVmZXJlbmNlIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIGEgcGFja2FnZSBjb250YWluaW5nIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBtZXRhY2xhc3NlcyB0aGF0IG1heSBiZSBleHRlbmRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb2ZpbGUtbWV0YW1vZGVsUmVmZXJlbmNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUHJvZmlsZS1tZXRhbW9kZWxSZWZlcmVuY2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUHJvZmlsZS1jcmVhdGUiIG5hbWU9ImNyZWF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9maWxlLWNyZWF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb2ZpbGUtY3JlYXRlIj4KLSAgICAgICAgICA8Ym9keT5DcmVhdGVzIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mICh0aGUgRWNvcmUgcmVwcmVzZW50YXRpb24gb2YpIHRoZSBzcGVjaWZpZWQgY2xhc3NpZmllciBkZWZpbmVkIGluIHRoaXMgcHJvZmlsZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9maWxlLWNyZWF0ZS1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRU9iamVjdCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9maWxlLWNyZWF0ZS1jbGFzc2lmaWVyIiBuYW1lPSJjbGFzc2lmaWVyIiB0eXBlPSJDbGFzc2lmaWVyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9maWxlLWNyZWF0ZS1jbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvZmlsZS1jcmVhdGUtY2xhc3NpZmllciI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgY2xhc3NpZmllciBvZiB3aGljaCB0byBjcmVhdGUgYW4gaW5zdGFuY2UuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb2ZpbGUtZGVmaW5lIiBuYW1lPSJkZWZpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZS1kZWZpbmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9maWxlLWRlZmluZSI+Ci0gICAgICAgICAgPGJvZHk+RGVmaW5lcyB0aGlzIHByb2ZpbGUgYnkgKHJlKWNyZWF0aW5nIEVjb3JlIHJlcHJlc2VudGF0aW9ucyBvZiBpdHMgY3VycmVudCBjb250ZW50cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9maWxlLWRlZmluZS1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRVBhY2thZ2UiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb2ZpbGUtZGVmaW5lLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcm9maWxlLWRlZmluZS1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9maWxlLWRlZmluZS4xIiBuYW1lPSJkZWZpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZS1kZWZpbmUuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb2ZpbGUtZGVmaW5lLjEiPgotICAgICAgICAgIDxib2R5PkRlZmluZXMgdGhpcyBwcm9maWxlIGJ5IChyZSljcmVhdGluZyBFY29yZSByZXByZXNlbnRhdGlvbnMgb2YgaXRzIGN1cnJlbnQgY29udGVudHMsIHVzaW5nIHRoZSBzcGVjaWZpZWQgb3B0aW9ucywgZGlhZ25vc3RpY3MsIGFuZCBjb250ZXh0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb2ZpbGUtZGVmaW5lLjEtX293bmVkUGFyYW1ldGVyLjAiIG5hbWU9IiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRVBhY2thZ2UiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJvZmlsZS1kZWZpbmUuMS1vcHRpb25zIiBuYW1lPSJvcHRpb25zIiB0eXBlPSJQcm9maWxlLUVNYXBfRVN0cmluZ19FU3RyaW5nIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZS1kZWZpbmUuMS1vcHRpb25zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvZmlsZS1kZWZpbmUuMS1vcHRpb25zIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBvcHRpb25zIHRvIHVzZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb2ZpbGUtZGVmaW5lLjEtZGlhZ25vc3RpY3MiIG5hbWU9ImRpYWdub3N0aWNzIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZS1kZWZpbmUuMS1kaWFnbm9zdGljcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb2ZpbGUtZGVmaW5lLjEtZGlhZ25vc3RpY3MiPgotICAgICAgICAgICAgPGJvZHk+VGhlIGNoYWluIG9mIGRpYWdub3N0aWNzIHRvIHdoaWNoIHByb2JsZW1zIGFyZSB0byBiZSBhcHBlbmRlZC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJFY29yZS5tZXRhbW9kZWwudW1sI0VEaWFnbm9zdGljQ2hhaW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJvZmlsZS1kZWZpbmUuMS1jb250ZXh0IiBuYW1lPSJjb250ZXh0IiB0eXBlPSJQcm9maWxlLUVNYXBfRUphdmFPYmplY3RfRUphdmFPYmplY3QiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9maWxlLWRlZmluZS4xLWNvbnRleHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9maWxlLWRlZmluZS4xLWNvbnRleHQiPgotICAgICAgICAgICAgPGJvZHk+VGhlIGNhY2hlIG9mIGNvbnRleHQtc3BlY2lmaWMgaW5mb3JtYXRpb24uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb2ZpbGUtZ2V0RGVmaW5pdGlvbiIgbmFtZT0iZ2V0RGVmaW5pdGlvbiIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9maWxlLWdldERlZmluaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9maWxlLWdldERlZmluaXRpb24iPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgY3VycmVudCBkZWZpbml0aW9uIChFY29yZSByZXByZXNlbnRhdGlvbikgb2YgdGhpcyBwcm9maWxlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb2ZpbGUtZ2V0RGVmaW5pdGlvbi1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRVBhY2thZ2UiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb2ZpbGUtZ2V0RGVmaW5pdGlvbi1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUHJvZmlsZS1nZXREZWZpbml0aW9uLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb2ZpbGUtZ2V0RGVmaW5pdGlvbi4xIiBuYW1lPSJnZXREZWZpbml0aW9uIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb2ZpbGUtZ2V0RGVmaW5pdGlvbi4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvZmlsZS1nZXREZWZpbml0aW9uLjEiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUgY3VycmVudCBkZWZpbml0aW9uIChFY29yZSByZXByZXNlbnRhdGlvbikgb2YgdGhlIHNwZWNpZmllZCBuYW1lZCBlbGVtZW50IGluIHRoaXMgcHJvZmlsZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9maWxlLWdldERlZmluaXRpb24uMS1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRU5hbWVkRWxlbWVudCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvZmlsZS1nZXREZWZpbml0aW9uLjEtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlByb2ZpbGUtZ2V0RGVmaW5pdGlvbi4xLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9maWxlLWdldERlZmluaXRpb24uMS1uYW1lZEVsZW1lbnQiIG5hbWU9Im5hbWVkRWxlbWVudCIgdHlwZT0iTmFtZWRFbGVtZW50IiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9maWxlLWdldERlZmluaXRpb24uMS1uYW1lZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9maWxlLWdldERlZmluaXRpb24uMS1uYW1lZEVsZW1lbnQiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWVkIGVsZW1lbnQgd2hvc2UgZGVmaW5pdGlvbiB0byByZXRyaWV2ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUHJvZmlsZS1nZXRPd25lZEV4dGVuc2lvbnMiIG5hbWU9ImdldE93bmVkRXh0ZW5zaW9ucyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9maWxlLWdldE93bmVkRXh0ZW5zaW9ucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb2ZpbGUtZ2V0T3duZWRFeHRlbnNpb25zIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIGV4dGVuc2lvbnMgb3duZWQgYnkgdGhpcyBwcm9maWxlLCBleGNsdWRpbmcgbm9uLXJlcXVpcmVkIGV4dGVuc2lvbnMgaWYgaW5kaWNhdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb2ZpbGUtZ2V0T3duZWRFeHRlbnNpb25zLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJFeHRlbnNpb24iIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb2ZpbGUtZ2V0T3duZWRFeHRlbnNpb25zLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcm9maWxlLWdldE93bmVkRXh0ZW5zaW9ucy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJvZmlsZS1nZXRPd25lZEV4dGVuc2lvbnMtcmVxdWlyZWRPbmx5IiBuYW1lPSJyZXF1aXJlZE9ubHkiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb2ZpbGUtZ2V0T3duZWRFeHRlbnNpb25zLXJlcXVpcmVkT25seS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb2ZpbGUtZ2V0T3duZWRFeHRlbnNpb25zLXJlcXVpcmVkT25seSI+Ci0gICAgICAgICAgICA8Ym9keT5XaGV0aGVyIHRvIHJldHJpZXZlIG9ubHkgcmVxdWlyZWQgZXh0ZW5zaW9ucy48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb2ZpbGUtZ2V0UmVmZXJlbmNlZE1ldGFjbGFzc2VzIiBuYW1lPSJnZXRSZWZlcmVuY2VkTWV0YWNsYXNzZXMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZS1nZXRSZWZlcmVuY2VkTWV0YWNsYXNzZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9maWxlLWdldFJlZmVyZW5jZWRNZXRhY2xhc3NlcyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBtZXRhY2xhc3NlcyByZWZlcmVuY2VkIGJ5IHRoaXMgcHJvZmlsZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9maWxlLWdldFJlZmVyZW5jZWRNZXRhY2xhc3Nlcy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iQ2xhc3MiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb2ZpbGUtZ2V0UmVmZXJlbmNlZE1ldGFjbGFzc2VzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcm9maWxlLWdldFJlZmVyZW5jZWRNZXRhY2xhc3Nlcy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQcm9maWxlLWdldFJlZmVyZW5jZWRNZXRhbW9kZWxzIiBuYW1lPSJnZXRSZWZlcmVuY2VkTWV0YW1vZGVscyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9maWxlLWdldFJlZmVyZW5jZWRNZXRhbW9kZWxzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvZmlsZS1nZXRSZWZlcmVuY2VkTWV0YW1vZGVscyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBtZXRhbW9kZWxzIHJlZmVyZW5jZWQgYnkgdGhpcyBwcm9maWxlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb2ZpbGUtZ2V0UmVmZXJlbmNlZE1ldGFtb2RlbHMtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9Ik1vZGVsIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcm9maWxlLWdldFJlZmVyZW5jZWRNZXRhbW9kZWxzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcm9maWxlLWdldFJlZmVyZW5jZWRNZXRhbW9kZWxzLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb2ZpbGUtaXNEZWZpbmVkIiBuYW1lPSJpc0RlZmluZWQiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZS1pc0RlZmluZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9maWxlLWlzRGVmaW5lZCI+Ci0gICAgICAgICAgPGJvZHk+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgcHJvZmlsZSBpcyBkZWZpbmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb2ZpbGUtaXNEZWZpbmVkLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxuZXN0ZWRDbGFzc2lmaWVyIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJQcm9maWxlLUVNYXBfRUphdmFPYmplY3RfRUphdmFPYmplY3QiIG5hbWU9IkVNYXBfRUphdmFPYmplY3RfRUphdmFPYmplY3QiPgotICAgICAgICA8dGVtcGxhdGVCaW5kaW5nIHhtaTppZD0iUHJvZmlsZS1FTWFwX0VKYXZhT2JqZWN0X0VKYXZhT2JqZWN0LV90ZW1wbGF0ZUJpbmRpbmcuMCI+Ci0gICAgICAgICAgPHBhcmFtZXRlclN1YnN0aXR1dGlvbiB4bWk6aWQ9IlByb2ZpbGUtRU1hcF9FSmF2YU9iamVjdF9FSmF2YU9iamVjdC1fdGVtcGxhdGVCaW5kaW5nLjAtX3BhcmFtZXRlclN1YnN0aXR1dGlvbi4wIj4KLSAgICAgICAgICAgIDxhY3R1YWwgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJFY29yZS5tZXRhbW9kZWwudW1sI0VKYXZhT2JqZWN0Ii8+Ci0gICAgICAgICAgICA8Zm9ybWFsIHhtaTp0eXBlPSJ1bWw6Q2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIiBocmVmPSJFY29yZS5tZXRhbW9kZWwudW1sI0VNYXAtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjAiLz4KLSAgICAgICAgICA8L3BhcmFtZXRlclN1YnN0aXR1dGlvbj4KLSAgICAgICAgICA8cGFyYW1ldGVyU3Vic3RpdHV0aW9uIHhtaTppZD0iUHJvZmlsZS1FTWFwX0VKYXZhT2JqZWN0X0VKYXZhT2JqZWN0LV90ZW1wbGF0ZUJpbmRpbmcuMC1fcGFyYW1ldGVyU3Vic3RpdHV0aW9uLjEiPgotICAgICAgICAgICAgPGFjdHVhbCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRUphdmFPYmplY3QiLz4KLSAgICAgICAgICAgIDxmb3JtYWwgeG1pOnR5cGU9InVtbDpDbGFzc2lmaWVyVGVtcGxhdGVQYXJhbWV0ZXIiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRU1hcC1fb3duZWRUZW1wbGF0ZVNpZ25hdHVyZS1fb3duZWRQYXJhbWV0ZXIuMSIvPgotICAgICAgICAgIDwvcGFyYW1ldGVyU3Vic3RpdHV0aW9uPgotICAgICAgICAgIDxzaWduYXR1cmUgeG1pOnR5cGU9InVtbDpSZWRlZmluYWJsZVRlbXBsYXRlU2lnbmF0dXJlIiBocmVmPSJFY29yZS5tZXRhbW9kZWwudW1sI0VNYXAtX293bmVkVGVtcGxhdGVTaWduYXR1cmUiLz4KLSAgICAgICAgPC90ZW1wbGF0ZUJpbmRpbmc+Ci0gICAgICA8L25lc3RlZENsYXNzaWZpZXI+Ci0gICAgICA8bmVzdGVkQ2xhc3NpZmllciB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iUHJvZmlsZS1FTWFwX0VTdHJpbmdfRVN0cmluZyIgbmFtZT0iRU1hcF9FU3RyaW5nX0VTdHJpbmciPgotICAgICAgICA8dGVtcGxhdGVCaW5kaW5nIHhtaTppZD0iUHJvZmlsZS1FTWFwX0VTdHJpbmdfRVN0cmluZy1fdGVtcGxhdGVCaW5kaW5nLjAiPgotICAgICAgICAgIDxwYXJhbWV0ZXJTdWJzdGl0dXRpb24geG1pOmlkPSJQcm9maWxlLUVNYXBfRVN0cmluZ19FU3RyaW5nLV90ZW1wbGF0ZUJpbmRpbmcuMC1fcGFyYW1ldGVyU3Vic3RpdHV0aW9uLjAiPgotICAgICAgICAgICAgPGFjdHVhbCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRVN0cmluZyIvPgotICAgICAgICAgICAgPGZvcm1hbCB4bWk6dHlwZT0idW1sOkNsYXNzaWZpZXJUZW1wbGF0ZVBhcmFtZXRlciIgaHJlZj0iRWNvcmUubWV0YW1vZGVsLnVtbCNFTWFwLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlLV9vd25lZFBhcmFtZXRlci4wIi8+Ci0gICAgICAgICAgPC9wYXJhbWV0ZXJTdWJzdGl0dXRpb24+Ci0gICAgICAgICAgPHBhcmFtZXRlclN1YnN0aXR1dGlvbiB4bWk6aWQ9IlByb2ZpbGUtRU1hcF9FU3RyaW5nX0VTdHJpbmctX3RlbXBsYXRlQmluZGluZy4wLV9wYXJhbWV0ZXJTdWJzdGl0dXRpb24uMSI+Ci0gICAgICAgICAgICA8YWN0dWFsIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iRWNvcmUubWV0YW1vZGVsLnVtbCNFU3RyaW5nIi8+Ci0gICAgICAgICAgICA8Zm9ybWFsIHhtaTp0eXBlPSJ1bWw6Q2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIiBocmVmPSJFY29yZS5tZXRhbW9kZWwudW1sI0VNYXAtX293bmVkVGVtcGxhdGVTaWduYXR1cmUtX293bmVkUGFyYW1ldGVyLjEiLz4KLSAgICAgICAgICA8L3BhcmFtZXRlclN1YnN0aXR1dGlvbj4KLSAgICAgICAgICA8c2lnbmF0dXJlIHhtaTp0eXBlPSJ1bWw6UmVkZWZpbmFibGVUZW1wbGF0ZVNpZ25hdHVyZSIgaHJlZj0iRWNvcmUubWV0YW1vZGVsLnVtbCNFTWFwLV9vd25lZFRlbXBsYXRlU2lnbmF0dXJlIi8+Ci0gICAgICAgIDwvdGVtcGxhdGVCaW5kaW5nPgotICAgICAgPC9uZXN0ZWRDbGFzc2lmaWVyPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJQcm9maWxlQXBwbGljYXRpb24iIG5hbWU9IlByb2ZpbGVBcHBsaWNhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZUFwcGxpY2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvZmlsZUFwcGxpY2F0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBwcm9maWxlIGFwcGxpY2F0aW9uIGlzIHVzZWQgdG8gc2hvdyB3aGljaCBwcm9maWxlcyBoYXZlIGJlZW4gYXBwbGllZCB0byBhIHBhY2thZ2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJQcm9maWxlQXBwbGljYXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkRpcmVjdGVkUmVsYXRpb25zaGlwIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQcm9maWxlQXBwbGljYXRpb24tYXBwbGllZFByb2ZpbGUiIG5hbWU9ImFwcGxpZWRQcm9maWxlIiB0eXBlPSJQcm9maWxlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAtdGFyZ2V0IiBhc3NvY2lhdGlvbj0iQV9hcHBsaWVkUHJvZmlsZV9wcm9maWxlQXBwbGljYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZUFwcGxpY2F0aW9uLWFwcGxpZWRQcm9maWxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvZmlsZUFwcGxpY2F0aW9uLWFwcGxpZWRQcm9maWxlIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBQcm9maWxlcyB0aGF0IGFyZSBhcHBsaWVkIHRvIGEgUGFja2FnZSB0aHJvdWdoIHRoaXMgUHJvZmlsZUFwcGxpY2F0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUHJvZmlsZUFwcGxpY2F0aW9uLWFwcGx5aW5nUGFja2FnZSIgbmFtZT0iYXBwbHlpbmdQYWNrYWdlIiB0eXBlPSJQYWNrYWdlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAtc291cmNlIEVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX3Byb2ZpbGVBcHBsaWNhdGlvbl9hcHBseWluZ1BhY2thZ2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZUFwcGxpY2F0aW9uLWFwcGx5aW5nUGFja2FnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb2ZpbGVBcHBsaWNhdGlvbi1hcHBseWluZ1BhY2thZ2UiPgotICAgICAgICAgIDxib2R5PlRoZSBwYWNrYWdlIHRoYXQgb3ducyB0aGUgcHJvZmlsZSBhcHBsaWNhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb2ZpbGVBcHBsaWNhdGlvbi1pc1N0cmljdCIgbmFtZT0iaXNTdHJpY3QiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZUFwcGxpY2F0aW9uLWlzU3RyaWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvZmlsZUFwcGxpY2F0aW9uLWlzU3RyaWN0Ij4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhhdCB0aGUgUHJvZmlsZSBmaWx0ZXJpbmcgcnVsZXMgZm9yIHRoZSBtZXRhY2xhc3NlcyBvZiB0aGUgcmVmZXJlbmNlZCBtZXRhbW9kZWwgc2hhbGwgYmUgc3RyaWN0bHkgYXBwbGllZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJQcm9maWxlQXBwbGljYXRpb24taXNTdHJpY3QtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb2ZpbGVBcHBsaWNhdGlvbi1nZXRBcHBsaWVkRGVmaW5pdGlvbiIgbmFtZT0iZ2V0QXBwbGllZERlZmluaXRpb24iIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvZmlsZUFwcGxpY2F0aW9uLWdldEFwcGxpZWREZWZpbml0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvZmlsZUFwcGxpY2F0aW9uLWdldEFwcGxpZWREZWZpbml0aW9uIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIGRlZmluaXRpb24gKEVjb3JlIHJlcHJlc2VudGF0aW9uKSBvZiB0aGUgcHJvZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9maWxlIGFwcGxpY2F0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlByb2ZpbGVBcHBsaWNhdGlvbi1nZXRBcHBsaWVkRGVmaW5pdGlvbi1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRVBhY2thZ2UiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb2ZpbGVBcHBsaWNhdGlvbi1nZXRBcHBsaWVkRGVmaW5pdGlvbi1fb3duZWRQYXJhbWV0ZXIuMC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUHJvZmlsZUFwcGxpY2F0aW9uLWdldEFwcGxpZWREZWZpbml0aW9uLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlByb2ZpbGVBcHBsaWNhdGlvbi1nZXRBcHBsaWVkRGVmaW5pdGlvbi4xIiBuYW1lPSJnZXRBcHBsaWVkRGVmaW5pdGlvbiIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9maWxlQXBwbGljYXRpb24tZ2V0QXBwbGllZERlZmluaXRpb24uMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb2ZpbGVBcHBsaWNhdGlvbi1nZXRBcHBsaWVkRGVmaW5pdGlvbi4xIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIGRlZmluaXRpb24gKEVjb3JlIHJlcHJlc2VudGF0aW9uKSBvZiB0aGUgc3BlY2lmaWVkIG5hbWVkIGVsZW1lbnQgaW4gdGhlIHByb2ZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvZmlsZSBhcHBsaWNhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9maWxlQXBwbGljYXRpb24tZ2V0QXBwbGllZERlZmluaXRpb24uMS1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkVjb3JlLm1ldGFtb2RlbC51bWwjRU5hbWVkRWxlbWVudCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvZmlsZUFwcGxpY2F0aW9uLWdldEFwcGxpZWREZWZpbml0aW9uLjEtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlByb2ZpbGVBcHBsaWNhdGlvbi1nZXRBcHBsaWVkRGVmaW5pdGlvbi4xLV9vd25lZFBhcmFtZXRlci4wLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQcm9maWxlQXBwbGljYXRpb24tZ2V0QXBwbGllZERlZmluaXRpb24uMS1uYW1lZEVsZW1lbnQiIG5hbWU9Im5hbWVkRWxlbWVudCIgdHlwZT0iTmFtZWRFbGVtZW50IiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9maWxlQXBwbGljYXRpb24tZ2V0QXBwbGllZERlZmluaXRpb24uMS1uYW1lZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm9maWxlQXBwbGljYXRpb24tZ2V0QXBwbGllZERlZmluaXRpb24uMS1uYW1lZEVsZW1lbnQiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWVkIGVsZW1lbnQgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBhcHBsaWVkIGRlZmluaXRpb24uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iU3RlcmVvdHlwZSIgbmFtZT0iU3RlcmVvdHlwZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RlcmVvdHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0ZXJlb3R5cGUiPgotICAgICAgICA8Ym9keT5BIHN0ZXJlb3R5cGUgZGVmaW5lcyBob3cgYW4gZXhpc3RpbmcgbWV0YWNsYXNzIG1heSBiZSBleHRlbmRlZCwgYW5kIGVuYWJsZXMgdGhlIHVzZSBvZiBwbGF0Zm9ybSBvciBkb21haW4gc3BlY2lmaWMgdGVybWlub2xvZ3kgb3Igbm90YXRpb24gaW4gcGxhY2Ugb2YsIG9yIGluIGFkZGl0aW9uIHRvLCB0aGUgb25lcyB1c2VkIGZvciB0aGUgZXh0ZW5kZWQgbWV0YWNsYXNzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0ZXJlb3R5cGUtYmluYXJ5QXNzb2NpYXRpb25zT25seSIgbmFtZT0iYmluYXJ5QXNzb2NpYXRpb25zT25seSIgY29uc3RyYWluZWRFbGVtZW50PSJTdGVyZW90eXBlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0ZXJlb3R5cGUtYmluYXJ5QXNzb2NpYXRpb25zT25seS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0ZXJlb3R5cGUtYmluYXJ5QXNzb2NpYXRpb25zT25seSI+Ci0gICAgICAgICAgPGJvZHk+U3RlcmVvdHlwZXMgbWF5IG9ubHkgcGFydGljaXBhdGUgaW4gYmluYXJ5IGFzc29jaWF0aW9ucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RlcmVvdHlwZS1iaW5hcnlBc3NvY2lhdGlvbnNPbmx5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vd25lZEF0dHJpYnV0ZS5hc3NvY2lhdGlvbi0+Zm9yQWxsKG1lbWJlckVuZC0+c2l6ZSgpPTIpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGVyZW90eXBlLWdlbmVyYWxpemUiIG5hbWU9ImdlbmVyYWxpemUiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RlcmVvdHlwZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLWdlbmVyYWxpemUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGVyZW90eXBlLWdlbmVyYWxpemUiPgotICAgICAgICAgIDxib2R5PkEgU3RlcmVvdHlwZSBtYXkgb25seSBnZW5lcmFsaXplIG9yIHNwZWNpYWxpemUgYW5vdGhlciBTdGVyZW90eXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGVyZW90eXBlLWdlbmVyYWxpemUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmFsbFBhcmVudHMoKS0+Zm9yQWxsKG9jbElzS2luZE9mKFN0ZXJlb3R5cGUpKSAmI3hEOwotYW5kIENsYXNzaWZpZXIuYWxsSW5zdGFuY2VzKCktPmZvckFsbChjIHwgYy5hbGxQYXJlbnRzKCktPmV4aXN0cyhvY2xJc0tpbmRPZihTdGVyZW90eXBlKSkgaW1wbGllcyBjLm9jbElzS2luZE9mKFN0ZXJlb3R5cGUpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RlcmVvdHlwZS1uYW1lX25vdF9jbGFzaCIgbmFtZT0ibmFtZV9ub3RfY2xhc2giIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RlcmVvdHlwZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLW5hbWVfbm90X2NsYXNoLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1uYW1lX25vdF9jbGFzaCI+Ci0gICAgICAgICAgPGJvZHk+U3RlcmVvdHlwZSBuYW1lcyBzaG91bGQgbm90IGNsYXNoIHdpdGgga2V5d29yZCBuYW1lcyBmb3IgdGhlIGV4dGVuZGVkIG1vZGVsIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0ZXJlb3R5cGUtbmFtZV9ub3RfY2xhc2gtX3NwZWNpZmljYXRpb24iIGxhbmd1YWdlPSIiLz4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0ZXJlb3R5cGUtYXNzb2NpYXRpb25FbmRPd25lcnNoaXAiIG5hbWU9ImFzc29jaWF0aW9uRW5kT3duZXJzaGlwIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0ZXJlb3R5cGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RlcmVvdHlwZS1hc3NvY2lhdGlvbkVuZE93bmVyc2hpcC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0ZXJlb3R5cGUtYXNzb2NpYXRpb25FbmRPd25lcnNoaXAiPgotICAgICAgICAgIDxib2R5PldoZXJlIGEgc3RlcmVvdHlwZeKAmXMgcHJvcGVydHkgaXMgYW4gYXNzb2NpYXRpb24gZW5kIGZvciBhbiBhc3NvY2lhdGlvbiBvdGhlciB0aGFuIGEga2luZCBvZiBleHRlbnNpb24sIGFuZCB0aGUgb3RoZXIgZW5kIGlzIG5vdCBhIHN0ZXJlb3R5cGUsIHRoZSBvdGhlciBlbmQgbXVzdCBiZSBvd25lZCBieSB0aGUgYXNzb2NpYXRpb24gaXRzZWxmLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGVyZW90eXBlLWFzc29jaWF0aW9uRW5kT3duZXJzaGlwLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vd25lZEF0dHJpYnV0ZSYjeEQ7Ci0tPnNlbGVjdChhc3NvY2lhdGlvbi0+bm90RW1wdHkoKSBhbmQgbm90IGFzc29jaWF0aW9uLm9jbElzS2luZE9mKEV4dGVuc2lvbikgYW5kIG5vdCB0eXBlLm9jbElzS2luZE9mKFN0ZXJlb3R5cGUpKSYjeEQ7Ci0tPmZvckFsbChvcHBvc2l0ZS5vd25lciA9IGFzc29jaWF0aW9uKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RlcmVvdHlwZS1iYXNlX3Byb3BlcnR5X3VwcGVyX2JvdW5kIiBuYW1lPSJiYXNlX3Byb3BlcnR5X3VwcGVyX2JvdW5kIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0ZXJlb3R5cGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RlcmVvdHlwZS1iYXNlX3Byb3BlcnR5X3VwcGVyX2JvdW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1iYXNlX3Byb3BlcnR5X3VwcGVyX2JvdW5kIj4KLSAgICAgICAgICA8Ym9keT5UaGUgdXBwZXIgYm91bmQgb2YgYmFzZS1wcm9wZXJ0aWVzIGlzIGV4YWN0bHkgMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RlcmVvdHlwZS1iYXNlX3Byb3BlcnR5X3VwcGVyX2JvdW5kLV9zcGVjaWZpY2F0aW9uIiBsYW5ndWFnZT0iIi8+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGVyZW90eXBlLWJhc2VfcHJvcGVydHlfbXVsdGlwbGljaXR5X3NpbmdsZV9leHRlbnNpb24iIG5hbWU9ImJhc2VfcHJvcGVydHlfbXVsdGlwbGljaXR5X3NpbmdsZV9leHRlbnNpb24iIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RlcmVvdHlwZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLWJhc2VfcHJvcGVydHlfbXVsdGlwbGljaXR5X3NpbmdsZV9leHRlbnNpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGVyZW90eXBlLWJhc2VfcHJvcGVydHlfbXVsdGlwbGljaXR5X3NpbmdsZV9leHRlbnNpb24iPgotICAgICAgICAgIDxib2R5PklmIGEgU3RlcmVvdHlwZSBleHRlbmRzIG9ubHkgb25lIG1ldGFjbGFzcywgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgY29ycmVzcG9uZGluZyBiYXNlLXByb3BlcnR5IHNoYWxsIGJlIDEuLjEuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0ZXJlb3R5cGUtYmFzZV9wcm9wZXJ0eV9tdWx0aXBsaWNpdHlfc2luZ2xlX2V4dGVuc2lvbi1fc3BlY2lmaWNhdGlvbiIvPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RlcmVvdHlwZS1iYXNlX3Byb3BlcnR5X211bHRpcGxpY2l0eV9tdWx0aXBsZV9leHRlbnNpb24iIG5hbWU9ImJhc2VfcHJvcGVydHlfbXVsdGlwbGljaXR5X211bHRpcGxlX2V4dGVuc2lvbiIgY29uc3RyYWluZWRFbGVtZW50PSJTdGVyZW90eXBlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0ZXJlb3R5cGUtYmFzZV9wcm9wZXJ0eV9tdWx0aXBsaWNpdHlfbXVsdGlwbGVfZXh0ZW5zaW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1iYXNlX3Byb3BlcnR5X211bHRpcGxpY2l0eV9tdWx0aXBsZV9leHRlbnNpb24iPgotICAgICAgICAgIDxib2R5PklmIGEgU3RlcmVvdHlwZSBleHRlbmRzIG1vcmUgdGhhbiBvbmUgbWV0YWNsYXNzLCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UtcHJvcGVydGllcyBzaGFsbCBiZSBbMC4uMV0uIEF0IGFueSBwb2ludCBpbiB0aW1lLCBvbmx5IG9uZSBvZiB0aGVzZSBiYXNlLXByb3BlcnRpZXMgY2FuIGNvbnRhaW4gYSBtZXRhY2xhc3MgaW5zdGFuY2UgZHVyaW5nIHJ1bnRpbWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0ZXJlb3R5cGUtYmFzZV9wcm9wZXJ0eV9tdWx0aXBsaWNpdHlfbXVsdGlwbGVfZXh0ZW5zaW9uLV9zcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlN0ZXJlb3R5cGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkNsYXNzIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdGVyZW90eXBlLWljb24iIG5hbWU9Imljb24iIHR5cGU9IkltYWdlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2ljb25fc3RlcmVvdHlwZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLWljb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGVyZW90eXBlLWljb24iPgotICAgICAgICAgIDxib2R5PlN0ZXJlb3R5cGUgY2FuIGNoYW5nZSB0aGUgZ3JhcGhpY2FsIGFwcGVhcmFuY2Ugb2YgdGhlIGV4dGVuZGVkIG1vZGVsIGVsZW1lbnQgYnkgdXNpbmcgYXR0YWNoZWQgaWNvbnMuIFdoZW4gdGhpcyBhc3NvY2lhdGlvbiBpcyBub3QgbnVsbCwgaXQgcmVmZXJlbmNlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGljb24gY29udGVudCB0byBiZSBkaXNwbGF5ZWQgd2l0aGluIGRpYWdyYW1zIHByZXNlbnRpbmcgdGhlIGV4dGVuZGVkIG1vZGVsIGVsZW1lbnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RlcmVvdHlwZS1pY29uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RlcmVvdHlwZS1pY29uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0ZXJlb3R5cGUtcHJvZmlsZSIgbmFtZT0icHJvZmlsZSIgdHlwZT0iUHJvZmlsZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9wcm9maWxlX3N0ZXJlb3R5cGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RlcmVvdHlwZS1wcm9maWxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1wcm9maWxlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcHJvZmlsZSB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgY29udGFpbnMgdGhpcyBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iU3RlcmVvdHlwZS1jcmVhdGVFeHRlbnNpb24iIG5hbWU9ImNyZWF0ZUV4dGVuc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLWNyZWF0ZUV4dGVuc2lvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0ZXJlb3R5cGUtY3JlYXRlRXh0ZW5zaW9uIj4KLSAgICAgICAgICA8Ym9keT5DcmVhdGVzIGEobikgKHJlcXVpcmVkKSBleHRlbnNpb24gb2YgdGhlIHNwZWNpZmllZCBtZXRhY2xhc3Mgd2l0aCB0aGlzIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RlcmVvdHlwZS1jcmVhdGVFeHRlbnNpb24tX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkV4dGVuc2lvbiIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RlcmVvdHlwZS1jcmVhdGVFeHRlbnNpb24tbWV0YWNsYXNzIiBuYW1lPSJtZXRhY2xhc3MiIHR5cGU9IkNsYXNzIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLWNyZWF0ZUV4dGVuc2lvbi1tZXRhY2xhc3MtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGVyZW90eXBlLWNyZWF0ZUV4dGVuc2lvbi1tZXRhY2xhc3MiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG1ldGFjbGFzcyBmb3IgdGhlIG5ldyBleHRlbnNpb24uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGVyZW90eXBlLWNyZWF0ZUV4dGVuc2lvbi1pc1JlcXVpcmVkIiBuYW1lPSJpc1JlcXVpcmVkIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLWNyZWF0ZUV4dGVuc2lvbi1pc1JlcXVpcmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1jcmVhdGVFeHRlbnNpb24taXNSZXF1aXJlZCI+Ci0gICAgICAgICAgICA8Ym9keT5XaGV0aGVyIHRoZSBuZXcgZXh0ZW5zaW9uIHNob3VsZCBiZSByZXF1aXJlZC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlN0ZXJlb3R5cGUtY3JlYXRlSWNvbiIgbmFtZT0iY3JlYXRlSWNvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLWNyZWF0ZUljb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGVyZW90eXBlLWNyZWF0ZUljb24iPgotICAgICAgICAgIDxib2R5PkNyZWF0ZXMgYW4gaWNvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gZm9yIHRoaXMgc3RlcmVvdHlwZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGVyZW90eXBlLWNyZWF0ZUljb24tX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkltYWdlIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGVyZW90eXBlLWNyZWF0ZUljb24tbG9jYXRpb24iIG5hbWU9ImxvY2F0aW9uIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLWNyZWF0ZUljb24tbG9jYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGVyZW90eXBlLWNyZWF0ZUljb24tbG9jYXRpb24iPgotICAgICAgICAgICAgPGJvZHk+VGhlIGxvY2F0aW9uIGZvciB0aGUgbmV3IGljb24uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlN0ZXJlb3R5cGUtY3JlYXRlSWNvbi4xIiBuYW1lPSJjcmVhdGVJY29uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0ZXJlb3R5cGUtY3JlYXRlSWNvbi4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1jcmVhdGVJY29uLjEiPgotICAgICAgICAgIDxib2R5PkNyZWF0ZXMgYW4gaWNvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZm9ybWF0IGFuZCBjb250ZW50IGZvciB0aGlzIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RlcmVvdHlwZS1jcmVhdGVJY29uLjEtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkltYWdlIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGVyZW90eXBlLWNyZWF0ZUljb24uMS1mb3JtYXQiIG5hbWU9ImZvcm1hdCIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RlcmVvdHlwZS1jcmVhdGVJY29uLjEtZm9ybWF0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1jcmVhdGVJY29uLjEtZm9ybWF0Ij4KLSAgICAgICAgICAgIDxib2R5PlRoZSBmb3JtYXQgZm9yIHRoZSBuZXcgaWNvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0ZXJlb3R5cGUtY3JlYXRlSWNvbi4xLWNvbnRlbnQiIG5hbWU9ImNvbnRlbnQiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0ZXJlb3R5cGUtY3JlYXRlSWNvbi4xLWNvbnRlbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGVyZW90eXBlLWNyZWF0ZUljb24uMS1jb250ZW50Ij4KLSAgICAgICAgICAgIDxib2R5PlRoZSBjb250ZW50IGZvciB0aGUgbmV3IGljb24uPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlN0ZXJlb3R5cGUtZ2V0QWxsRXh0ZW5kZWRNZXRhY2xhc3NlcyIgbmFtZT0iZ2V0QWxsRXh0ZW5kZWRNZXRhY2xhc3NlcyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLWdldEFsbEV4dGVuZGVkTWV0YWNsYXNzZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGVyZW90eXBlLWdldEFsbEV4dGVuZGVkTWV0YWNsYXNzZXMiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyBhbGwgdGhlIG1ldGFjbGFzc2VzIGV4dGVuZGVkIGJ5IHRoaXMgc3RlcmVvdHlwZSwgaW5jbHVkaW5nIHRoZSBtZXRhY2xhc3NlcyBleHRlbmRlZCBieSBpdHMgc3VwZXJzdGVyZW90eXBlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGVyZW90eXBlLWdldEFsbEV4dGVuZGVkTWV0YWNsYXNzZXMtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkNsYXNzIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdGVyZW90eXBlLWdldEFsbEV4dGVuZGVkTWV0YWNsYXNzZXMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0ZXJlb3R5cGUtZ2V0QWxsRXh0ZW5kZWRNZXRhY2xhc3Nlcy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGVyZW90eXBlLWdldERlZmluaXRpb24iIG5hbWU9ImdldERlZmluaXRpb24iIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RlcmVvdHlwZS1nZXREZWZpbml0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1nZXREZWZpbml0aW9uIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGVmaW5pdGlvbiAoRWNvcmUgcmVwcmVzZW50YXRpb24pIG9mIHRoaXMgc3RlcmVvdHlwZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGVyZW90eXBlLWdldERlZmluaXRpb24tX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJFY29yZS5tZXRhbW9kZWwudW1sI0VDbGFzcyIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RlcmVvdHlwZS1nZXREZWZpbml0aW9uLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJTdGVyZW90eXBlLWdldERlZmluaXRpb24tX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iU3RlcmVvdHlwZS1nZXRFeHRlbmRlZE1ldGFjbGFzc2VzIiBuYW1lPSJnZXRFeHRlbmRlZE1ldGFjbGFzc2VzIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0ZXJlb3R5cGUtZ2V0RXh0ZW5kZWRNZXRhY2xhc3Nlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0ZXJlb3R5cGUtZ2V0RXh0ZW5kZWRNZXRhY2xhc3NlcyI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBtZXRhY2xhc3NlcyBleHRlbmRlZCBieSB0aGlzIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RlcmVvdHlwZS1nZXRFeHRlbmRlZE1ldGFjbGFzc2VzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJDbGFzcyIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RlcmVvdHlwZS1nZXRFeHRlbmRlZE1ldGFjbGFzc2VzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJTdGVyZW90eXBlLWdldEV4dGVuZGVkTWV0YWNsYXNzZXMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iU3RlcmVvdHlwZS1nZXRLZXl3b3JkIiBuYW1lPSJnZXRLZXl3b3JkIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0ZXJlb3R5cGUtZ2V0S2V5d29yZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0ZXJlb3R5cGUtZ2V0S2V5d29yZCI+Ci0gICAgICAgICAgPGJvZHk+UmV0cmlldmVzIHRoZSBsb2NhbGl6ZWQga2V5d29yZCBmb3IgdGhpcyBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0ZXJlb3R5cGUtZ2V0S2V5d29yZC1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlN0ZXJlb3R5cGUtZ2V0S2V5d29yZC4xIiBuYW1lPSJnZXRLZXl3b3JkIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0ZXJlb3R5cGUtZ2V0S2V5d29yZC4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1nZXRLZXl3b3JkLjEiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyB0aGUga2V5d29yZCBmb3IgdGhpcyBzdGVyZW90eXBlLCBsb2NhbGl6ZWQgaWYgaW5kaWNhdGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0ZXJlb3R5cGUtZ2V0S2V5d29yZC4xLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0ZXJlb3R5cGUtZ2V0S2V5d29yZC4xLWxvY2FsaXplIiBuYW1lPSJsb2NhbGl6ZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RlcmVvdHlwZS1nZXRLZXl3b3JkLjEtbG9jYWxpemUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGVyZW90eXBlLWdldEtleXdvcmQuMS1sb2NhbGl6ZSI+Ci0gICAgICAgICAgICA8Ym9keT5XaGV0aGVyIHRvIGxvY2FsaXplIHRoZSBrZXl3b3JkLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iU3RlcmVvdHlwZS1jb250YWluaW5nUHJvZmlsZSIgbmFtZT0iY29udGFpbmluZ1Byb2ZpbGUiIGJvZHlDb25kaXRpb249IlN0ZXJlb3R5cGUtY29udGFpbmluZ1Byb2ZpbGUtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGVyZW90eXBlLWNvbnRhaW5pbmdQcm9maWxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1jb250YWluaW5nUHJvZmlsZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGNvbnRhaW5pbmdQcm9maWxlIHJldHVybnMgdGhlIGNsb3Nlc3QgcHJvZmlsZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGNvbnRhaW5pbmcgdGhpcyBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGVyZW90eXBlLWNvbnRhaW5pbmdQcm9maWxlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RlcmVvdHlwZS1jb250YWluaW5nUHJvZmlsZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0ZXJlb3R5cGUtY29udGFpbmluZ1Byb2ZpbGUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChzZWxmLm5hbWVzcGFjZS5vY2xBc1R5cGUoUGFja2FnZSkuY29udGFpbmluZ1Byb2ZpbGUoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RlcmVvdHlwZS1jb250YWluaW5nUHJvZmlsZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUHJvZmlsZSIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGVyZW90eXBlLXByb2ZpbGUuMSIgbmFtZT0icHJvZmlsZSIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiBib2R5Q29uZGl0aW9uPSJTdGVyZW90eXBlLXByb2ZpbGUuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0ZXJlb3R5cGUtcHJvZmlsZS4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RlcmVvdHlwZS1wcm9maWxlLjEiPgotICAgICAgICAgIDxib2R5PkEgc3RlcmVvdHlwZSBtdXN0IGJlIGNvbnRhaW5lZCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgaW4gYSBwcm9maWxlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGVyZW90eXBlLXByb2ZpbGUuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0ZXJlb3R5cGUtcHJvZmlsZS4xIFN0ZXJlb3R5cGUtcHJvZmlsZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0ZXJlb3R5cGUtcHJvZmlsZS4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc2VsZi5jb250YWluaW5nUHJvZmlsZSgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGVyZW90eXBlLXByb2ZpbGUuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUHJvZmlsZSIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcHJvZmlsZV9zdGVyZW90eXBlIiBuYW1lPSJBX3Byb2ZpbGVfc3RlcmVvdHlwZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IlN0ZXJlb3R5cGUtcHJvZmlsZSBBX3Byb2ZpbGVfc3RlcmVvdHlwZS1zdGVyZW90eXBlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcHJvZmlsZV9zdGVyZW90eXBlLXN0ZXJlb3R5cGUiIG5hbWU9InN0ZXJlb3R5cGUiIHR5cGU9IlN0ZXJlb3R5cGUiIGFzc29jaWF0aW9uPSJBX3Byb2ZpbGVfc3RlcmVvdHlwZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9wcm9maWxlX3N0ZXJlb3R5cGUtc3RlcmVvdHlwZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcHJvZmlsZV9zdGVyZW90eXBlLXN0ZXJlb3R5cGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2ljb25fc3RlcmVvdHlwZSIgbmFtZT0iQV9pY29uX3N0ZXJlb3R5cGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RlcmVvdHlwZS1pY29uIEFfaWNvbl9zdGVyZW90eXBlLXN0ZXJlb3R5cGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9pY29uX3N0ZXJlb3R5cGUtc3RlcmVvdHlwZSIgbmFtZT0ic3RlcmVvdHlwZSIgdHlwZT0iU3RlcmVvdHlwZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2ljb25fc3RlcmVvdHlwZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9pY29uX3N0ZXJlb3R5cGUtc3RlcmVvdHlwZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9hcHBsaWVkUHJvZmlsZV9wcm9maWxlQXBwbGljYXRpb24iIG5hbWU9IkFfYXBwbGllZFByb2ZpbGVfcHJvZmlsZUFwcGxpY2F0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlByb2ZpbGVBcHBsaWNhdGlvbi1hcHBsaWVkUHJvZmlsZSBBX2FwcGxpZWRQcm9maWxlX3Byb2ZpbGVBcHBsaWNhdGlvbi1wcm9maWxlQXBwbGljYXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9hcHBsaWVkUHJvZmlsZV9wcm9maWxlQXBwbGljYXRpb24tcHJvZmlsZUFwcGxpY2F0aW9uIiBuYW1lPSJwcm9maWxlQXBwbGljYXRpb24iIHR5cGU9IlByb2ZpbGVBcHBsaWNhdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfdGFyZ2V0X2RpcmVjdGVkUmVsYXRpb25zaGlwLWRpcmVjdGVkUmVsYXRpb25zaGlwIiBhc3NvY2lhdGlvbj0iQV9hcHBsaWVkUHJvZmlsZV9wcm9maWxlQXBwbGljYXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfYXBwbGllZFByb2ZpbGVfcHJvZmlsZUFwcGxpY2F0aW9uLXByb2ZpbGVBcHBsaWNhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfYXBwbGllZFByb2ZpbGVfcHJvZmlsZUFwcGxpY2F0aW9uLXByb2ZpbGVBcHBsaWNhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbWV0YWNsYXNzUmVmZXJlbmNlX3Byb2ZpbGUiIG5hbWU9IkFfbWV0YWNsYXNzUmVmZXJlbmNlX3Byb2ZpbGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUHJvZmlsZS1tZXRhY2xhc3NSZWZlcmVuY2UgQV9tZXRhY2xhc3NSZWZlcmVuY2VfcHJvZmlsZS1wcm9maWxlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfbWV0YWNsYXNzUmVmZXJlbmNlX3Byb2ZpbGUtcHJvZmlsZSIgbmFtZT0icHJvZmlsZSIgdHlwZT0iUHJvZmlsZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnRJbXBvcnQtaW1wb3J0aW5nTmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9tZXRhY2xhc3NSZWZlcmVuY2VfcHJvZmlsZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9tZXRhY2xhc3NSZWZlcmVuY2VfcHJvZmlsZS1wcm9maWxlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX21ldGFtb2RlbFJlZmVyZW5jZV9wcm9maWxlIiBuYW1lPSJBX21ldGFtb2RlbFJlZmVyZW5jZV9wcm9maWxlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlByb2ZpbGUtbWV0YW1vZGVsUmVmZXJlbmNlIEFfbWV0YW1vZGVsUmVmZXJlbmNlX3Byb2ZpbGUtcHJvZmlsZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX21ldGFtb2RlbFJlZmVyZW5jZV9wcm9maWxlLXByb2ZpbGUiIG5hbWU9InByb2ZpbGUiIHR5cGU9IlByb2ZpbGUiIHN1YnNldHRlZFByb3BlcnR5PSJQYWNrYWdlSW1wb3J0LWltcG9ydGluZ05hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfbWV0YW1vZGVsUmVmZXJlbmNlX3Byb2ZpbGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbWV0YW1vZGVsUmVmZXJlbmNlX3Byb2ZpbGUtcHJvZmlsZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9tZXJnZWRQYWNrYWdlX3BhY2thZ2VNZXJnZSIgbmFtZT0iQV9tZXJnZWRQYWNrYWdlX3BhY2thZ2VNZXJnZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJQYWNrYWdlTWVyZ2UtbWVyZ2VkUGFja2FnZSBBX21lcmdlZFBhY2thZ2VfcGFja2FnZU1lcmdlLXBhY2thZ2VNZXJnZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX21lcmdlZFBhY2thZ2VfcGFja2FnZU1lcmdlLXBhY2thZ2VNZXJnZSIgbmFtZT0icGFja2FnZU1lcmdlIiB0eXBlPSJQYWNrYWdlTWVyZ2UiIHN1YnNldHRlZFByb3BlcnR5PSJBX3RhcmdldF9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCIgYXNzb2NpYXRpb249IkFfbWVyZ2VkUGFja2FnZV9wYWNrYWdlTWVyZ2UiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbWVyZ2VkUGFja2FnZV9wYWNrYWdlTWVyZ2UtcGFja2FnZU1lcmdlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9tZXJnZWRQYWNrYWdlX3BhY2thZ2VNZXJnZS1wYWNrYWdlTWVyZ2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3BhY2thZ2VkRWxlbWVudF9vd25pbmdQYWNrYWdlIiBuYW1lPSJBX3BhY2thZ2VkRWxlbWVudF9vd25pbmdQYWNrYWdlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlBhY2thZ2UtcGFja2FnZWRFbGVtZW50IEFfcGFja2FnZWRFbGVtZW50X293bmluZ1BhY2thZ2Utb3duaW5nUGFja2FnZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3BhY2thZ2VkRWxlbWVudF9vd25pbmdQYWNrYWdlLW93bmluZ1BhY2thZ2UiIG5hbWU9Im93bmluZ1BhY2thZ2UiIHR5cGU9IlBhY2thZ2UiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9wYWNrYWdlZEVsZW1lbnRfb3duaW5nUGFja2FnZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9wYWNrYWdlZEVsZW1lbnRfb3duaW5nUGFja2FnZS1vd25pbmdQYWNrYWdlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3BhY2thZ2VNZXJnZV9yZWNlaXZpbmdQYWNrYWdlIiBuYW1lPSJBX3BhY2thZ2VNZXJnZV9yZWNlaXZpbmdQYWNrYWdlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlBhY2thZ2UtcGFja2FnZU1lcmdlIFBhY2thZ2VNZXJnZS1yZWNlaXZpbmdQYWNrYWdlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbmVzdGVkUGFja2FnZV9uZXN0aW5nUGFja2FnZSIgbmFtZT0iQV9uZXN0ZWRQYWNrYWdlX25lc3RpbmdQYWNrYWdlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlBhY2thZ2UtbmVzdGVkUGFja2FnZSBQYWNrYWdlLW5lc3RpbmdQYWNrYWdlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcHJvZmlsZUFwcGxpY2F0aW9uX2FwcGx5aW5nUGFja2FnZSIgbmFtZT0iQV9wcm9maWxlQXBwbGljYXRpb25fYXBwbHlpbmdQYWNrYWdlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlBhY2thZ2UtcHJvZmlsZUFwcGxpY2F0aW9uIFByb2ZpbGVBcHBsaWNhdGlvbi1hcHBseWluZ1BhY2thZ2UiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZFR5cGVfcGFja2FnZSIgbmFtZT0iQV9vd25lZFR5cGVfcGFja2FnZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJQYWNrYWdlLW93bmVkVHlwZSBUeXBlLXBhY2thZ2UiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZFN0ZXJlb3R5cGVfb3duaW5nUGFja2FnZSIgbmFtZT0iQV9vd25lZFN0ZXJlb3R5cGVfb3duaW5nUGFja2FnZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IlBhY2thZ2Utb3duZWRTdGVyZW90eXBlIEFfb3duZWRTdGVyZW90eXBlX293bmluZ1BhY2thZ2Utb3duaW5nUGFja2FnZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBX293bmVkU3RlcmVvdHlwZV9vd25pbmdQYWNrYWdlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBX3BhY2thZ2VkRWxlbWVudF9vd25pbmdQYWNrYWdlIi8+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX293bmVkU3RlcmVvdHlwZV9vd25pbmdQYWNrYWdlLW93bmluZ1BhY2thZ2UiIG5hbWU9Im93bmluZ1BhY2thZ2UiIHR5cGU9IlBhY2thZ2UiIHJlZGVmaW5lZFByb3BlcnR5PSJBX3BhY2thZ2VkRWxlbWVudF9vd25pbmdQYWNrYWdlLW93bmluZ1BhY2thZ2UiIGFzc29jaWF0aW9uPSJBX293bmVkU3RlcmVvdHlwZV9vd25pbmdQYWNrYWdlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfdHlwZV9leHRlbnNpb25FbmQiIG5hbWU9IkFfdHlwZV9leHRlbnNpb25FbmQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRXh0ZW5zaW9uRW5kLXR5cGUgQV90eXBlX2V4dGVuc2lvbkVuZC1leHRlbnNpb25FbmQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV90eXBlX2V4dGVuc2lvbkVuZC1leHRlbnNpb25FbmQiIG5hbWU9ImV4dGVuc2lvbkVuZCIgdHlwZT0iRXh0ZW5zaW9uRW5kIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV90eXBlX3R5cGVkRWxlbWVudC10eXBlZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3R5cGVfZXh0ZW5zaW9uRW5kIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3R5cGVfZXh0ZW5zaW9uRW5kLWV4dGVuc2lvbkVuZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfdHlwZV9leHRlbnNpb25FbmQtZXh0ZW5zaW9uRW5kLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZEVuZF9leHRlbnNpb24iIG5hbWU9IkFfb3duZWRFbmRfZXh0ZW5zaW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkV4dGVuc2lvbi1vd25lZEVuZCBBX293bmVkRW5kX2V4dGVuc2lvbi1leHRlbnNpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vd25lZEVuZF9leHRlbnNpb24tZXh0ZW5zaW9uIiBuYW1lPSJleHRlbnNpb24iIHR5cGU9IkV4dGVuc2lvbiIgc3Vic2V0dGVkUHJvcGVydHk9IlByb3BlcnR5LW93bmluZ0Fzc29jaWF0aW9uIiBhc3NvY2lhdGlvbj0iQV9vd25lZEVuZF9leHRlbnNpb24iLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQmVoYXZpb3JlZENsYXNzaWZpZXIiIG5hbWU9IkJlaGF2aW9yZWRDbGFzc2lmaWVyIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkJlaGF2aW9yZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgPGJvZHk+QSBCZWhhdmlvcmVkQ2xhc3NpZmllciBtYXkgaGF2ZSBJbnRlcmZhY2VSZWFsaXphdGlvbnMsIGFuZCBvd25zIGEgc2V0IG9mIEJlaGF2aW9ycyBvbmUgb2Ygd2hpY2ggbWF5IHNwZWNpZnkgdGhlIGJlaGF2aW9yIG9mIHRoZSBCZWhhdmlvcmVkQ2xhc3NpZmllciBpdHNlbGYuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItY2xhc3NfYmVoYXZpb3IiIG5hbWU9ImNsYXNzX2JlaGF2aW9yIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkJlaGF2aW9yZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yZWRDbGFzc2lmaWVyLWNsYXNzX2JlaGF2aW9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JlZENsYXNzaWZpZXItY2xhc3NfYmVoYXZpb3IiPgotICAgICAgICAgIDxib2R5PklmIGEgYmVoYXZpb3IgaXMgY2xhc3NpZmllciBiZWhhdmlvciwgaXQgZG9lcyBub3QgaGF2ZSBhIHNwZWNpZmljYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkJlaGF2aW9yZWRDbGFzc2lmaWVyLWNsYXNzX2JlaGF2aW9yLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5jbGFzc2lmaWVyQmVoYXZpb3ItPm5vdEVtcHR5KCkgaW1wbGllcyBjbGFzc2lmaWVyQmVoYXZpb3Iuc3BlY2lmaWNhdGlvbi0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkJlaGF2aW9yZWRDbGFzc2lmaWVyLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJDbGFzc2lmaWVyIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1jbGFzc2lmaWVyQmVoYXZpb3IiIG5hbWU9ImNsYXNzaWZpZXJCZWhhdmlvciIgdHlwZT0iQmVoYXZpb3IiIHN1YnNldHRlZFByb3BlcnR5PSJCZWhhdmlvcmVkQ2xhc3NpZmllci1vd25lZEJlaGF2aW9yIiBhc3NvY2lhdGlvbj0iQV9jbGFzc2lmaWVyQmVoYXZpb3JfYmVoYXZpb3JlZENsYXNzaWZpZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItY2xhc3NpZmllckJlaGF2aW9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JlZENsYXNzaWZpZXItY2xhc3NpZmllckJlaGF2aW9yIj4KLSAgICAgICAgICA8Ym9keT5BIEJlaGF2aW9yIHRoYXQgc3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiB0aGUgQmVoYXZpb3JlZENsYXNzaWZpZXIgaXRzZWxmLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItY2xhc3NpZmllckJlaGF2aW9yLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItaW50ZXJmYWNlUmVhbGl6YXRpb24iIG5hbWU9ImludGVyZmFjZVJlYWxpemF0aW9uIiB0eXBlPSJJbnRlcmZhY2VSZWFsaXphdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IE5hbWVkRWxlbWVudC1jbGllbnREZXBlbmRlbmN5IiBhc3NvY2lhdGlvbj0iQV9pbnRlcmZhY2VSZWFsaXphdGlvbl9pbXBsZW1lbnRpbmdDbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkJlaGF2aW9yZWRDbGFzc2lmaWVyLWludGVyZmFjZVJlYWxpemF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JlZENsYXNzaWZpZXItaW50ZXJmYWNlUmVhbGl6YXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBzZXQgb2YgSW50ZXJmYWNlUmVhbGl6YXRpb25zIG93bmVkIGJ5IHRoZSBCZWhhdmlvcmVkQ2xhc3NpZmllci4gSW50ZXJmYWNlIHJlYWxpemF0aW9ucyByZWZlcmVuY2UgdGhlIEludGVyZmFjZXMgb2Ygd2hpY2ggdGhlIEJlaGF2aW9yZWRDbGFzc2lmaWVyIGlzIGFuIGltcGxlbWVudGF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItaW50ZXJmYWNlUmVhbGl6YXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1pbnRlcmZhY2VSZWFsaXphdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1vd25lZEJlaGF2aW9yIiBuYW1lPSJvd25lZEJlaGF2aW9yIiB0eXBlPSJCZWhhdmlvciIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfb3duZWRCZWhhdmlvcl9iZWhhdmlvcmVkQ2xhc3NpZmllciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1vd25lZEJlaGF2aW9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JlZENsYXNzaWZpZXItb3duZWRCZWhhdmlvciI+Ci0gICAgICAgICAgPGJvZHk+QmVoYXZpb3JzIG93bmVkIGJ5IGEgQmVoYXZpb3JlZENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1vd25lZEJlaGF2aW9yLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItb3duZWRCZWhhdmlvci1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1nZXRBbGxJbXBsZW1lbnRlZEludGVyZmFjZXMiIG5hbWU9ImdldEFsbEltcGxlbWVudGVkSW50ZXJmYWNlcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1nZXRBbGxJbXBsZW1lbnRlZEludGVyZmFjZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCZWhhdmlvcmVkQ2xhc3NpZmllci1nZXRBbGxJbXBsZW1lbnRlZEludGVyZmFjZXMiPgotICAgICAgICAgIDxib2R5PlJldHJpZXZlcyBhbGwgdGhlIGludGVyZmFjZXMgb24gd2hpY2ggdGhpcyBiZWhhdmlvcmVkIGNsYXNzaWZpZXIgb3IgYW55IG9mIGl0cyBwYXJlbnRzIGhhcyBhbiBpbnRlcmZhY2UgcmVhbGl6YXRpb24gZGVwZW5kZW5jeS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1nZXRBbGxJbXBsZW1lbnRlZEludGVyZmFjZXMtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IkludGVyZmFjZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItZ2V0QWxsSW1wbGVtZW50ZWRJbnRlcmZhY2VzLV9vd25lZFBhcmFtZXRlci4wLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1nZXRBbGxJbXBsZW1lbnRlZEludGVyZmFjZXMtX293bmVkUGFyYW1ldGVyLjAtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItZ2V0SW1wbGVtZW50ZWRJbnRlcmZhY2VzIiBuYW1lPSJnZXRJbXBsZW1lbnRlZEludGVyZmFjZXMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItZ2V0SW1wbGVtZW50ZWRJbnRlcmZhY2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQmVoYXZpb3JlZENsYXNzaWZpZXItZ2V0SW1wbGVtZW50ZWRJbnRlcmZhY2VzIj4KLSAgICAgICAgICA8Ym9keT5SZXRyaWV2ZXMgdGhlIGludGVyZmFjZXMgb24gd2hpY2ggdGhpcyBiZWhhdmlvcmVkIGNsYXNzaWZpZXIgaGFzIGFuIGludGVyZmFjZSByZWFsaXphdGlvbiBkZXBlbmRlbmN5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkJlaGF2aW9yZWRDbGFzc2lmaWVyLWdldEltcGxlbWVudGVkSW50ZXJmYWNlcy1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iSW50ZXJmYWNlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1nZXRJbXBsZW1lbnRlZEludGVyZmFjZXMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkJlaGF2aW9yZWRDbGFzc2lmaWVyLWdldEltcGxlbWVudGVkSW50ZXJmYWNlcy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkRhdGFUeXBlIiBuYW1lPSJEYXRhVHlwZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGF0YVR5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEYXRhVHlwZSI+Ci0gICAgICAgIDxib2R5PkEgRGF0YVR5cGUgaXMgYSB0eXBlIHdob3NlIGluc3RhbmNlcyBhcmUgaWRlbnRpZmllZCBvbmx5IGJ5IHRoZWlyIHZhbHVlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRGF0YVR5cGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkNsYXNzaWZpZXIiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkRhdGFUeXBlLW93bmVkQXR0cmlidXRlIiBuYW1lPSJvd25lZEF0dHJpYnV0ZSIgdHlwZT0iUHJvcGVydHkiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkNsYXNzaWZpZXItYXR0cmlidXRlIE5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfb3duZWRBdHRyaWJ1dGVfZGF0YXR5cGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGF0YVR5cGUtb3duZWRBdHRyaWJ1dGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEYXRhVHlwZS1vd25lZEF0dHJpYnV0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGF0dHJpYnV0ZXMgb3duZWQgYnkgdGhlIERhdGFUeXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRGF0YVR5cGUtb3duZWRBdHRyaWJ1dGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJEYXRhVHlwZS1vd25lZEF0dHJpYnV0ZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJEYXRhVHlwZS1vd25lZE9wZXJhdGlvbiIgbmFtZT0ib3duZWRPcGVyYXRpb24iIHR5cGU9Ik9wZXJhdGlvbiIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9yZWRlZmluaXRpb25Db250ZXh0X3JlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluYWJsZUVsZW1lbnQgQ2xhc3NpZmllci1mZWF0dXJlIE5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfb3duZWRPcGVyYXRpb25fZGF0YXR5cGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGF0YVR5cGUtb3duZWRPcGVyYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEYXRhVHlwZS1vd25lZE9wZXJhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE9wZXJhdGlvbnMgb3duZWQgYnkgdGhlIERhdGFUeXBlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRGF0YVR5cGUtb3duZWRPcGVyYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJEYXRhVHlwZS1vd25lZE9wZXJhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZEF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRlT3duZWRBdHRyaWJ1dGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRBdHRyaWJ1dGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEYXRhVHlwZS1jcmVhdGVPd25lZEF0dHJpYnV0ZSI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCB0eXBlLCBsb3dlciBib3VuZCwgYW5kIHVwcGVyIGJvdW5kIGFzIGFuIG93bmVkIGF0dHJpYnV0ZSBvZiB0aGlzIGRhdGEgdHlwZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUHJvcGVydHkiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkRhdGFUeXBlLWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUiIG5hbWU9Im5hbWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRhdGFUeXBlLWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEYXRhVHlwZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS1uYW1lIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuYW1lIGZvciB0aGUgbmV3IGF0dHJpYnV0ZSwgb3IgbnVsbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS1uYW1lLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS1uYW1lLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS10eXBlIiBuYW1lPSJ0eXBlIiB0eXBlPSJUeXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS10eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGF0YVR5cGUtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdHlwZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUsIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdHlwZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdHlwZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRBdHRyaWJ1dGUtbG93ZXIiIG5hbWU9Imxvd2VyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS1sb3dlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRhdGFUeXBlLWNyZWF0ZU93bmVkQXR0cmlidXRlLWxvd2VyIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBsb3dlciBib3VuZCBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdXBwZXIiIG5hbWU9InVwcGVyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS11cHBlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRhdGFUeXBlLWNyZWF0ZU93bmVkQXR0cmlidXRlLXVwcGVyIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSB1cHBlciBib3VuZCBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbiIgbmFtZT0iY3JlYXRlT3duZWRPcGVyYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRPcGVyYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhbiBvcGVyYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIHBhcmFtZXRlciBuYW1lcywgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcmV0dXJuIHR5cGUgKG9yIG51bGwpIGFzIGFuIG93bmVkIG9wZXJhdGlvbiBvZiB0aGlzIGRhdGEgdHlwZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iT3BlcmF0aW9uIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1uYW1lIiBuYW1lPSJuYW1lIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1uYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGF0YVR5cGUtY3JlYXRlT3duZWRPcGVyYXRpb24tbmFtZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmFtZSBmb3IgdGhlIG5ldyBvcGVyYXRpb24sIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRPcGVyYXRpb24tbmFtZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRPcGVyYXRpb24tbmFtZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyTmFtZXMiIG5hbWU9InBhcmFtZXRlck5hbWVzIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1wYXJhbWV0ZXJOYW1lcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRhdGFUeXBlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBwYXJhbWV0ZXIgbmFtZXMgZm9yIHRoZSBuZXcgb3BlcmF0aW9uLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkRhdGFUeXBlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1wYXJhbWV0ZXJOYW1lcy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyVHlwZXMiIG5hbWU9InBhcmFtZXRlclR5cGVzIiB0eXBlPSJUeXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1wYXJhbWV0ZXJUeXBlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRhdGFUeXBlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlclR5cGVzIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBwYXJhbWV0ZXIgdHlwZXMgZm9yIHRoZSBuZXcgb3BlcmF0aW9uLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkRhdGFUeXBlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlclR5cGVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1wYXJhbWV0ZXJUeXBlcy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRPcGVyYXRpb24tcmV0dXJuVHlwZSIgbmFtZT0icmV0dXJuVHlwZSIgdHlwZT0iVHlwZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGF0YVR5cGUtY3JlYXRlT3duZWRPcGVyYXRpb24tcmV0dXJuVHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRhdGFUeXBlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXJldHVyblR5cGUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHJldHVybiB0eXBlIGZvciB0aGUgbmV3IG9wZXJhdGlvbiwgb3IgbnVsbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1yZXR1cm5UeXBlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJEYXRhVHlwZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1yZXR1cm5UeXBlLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRW51bWVyYXRpb24iIG5hbWU9IkVudW1lcmF0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbnVtZXJhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVudW1lcmF0aW9uIj4KLSAgICAgICAgPGJvZHk+QW4gRW51bWVyYXRpb24gaXMgYSBEYXRhVHlwZSB3aG9zZSB2YWx1ZXMgYXJlIGVudW1lcmF0ZWQgaW4gdGhlIG1vZGVsIGFzIEVudW1lcmF0aW9uTGl0ZXJhbHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRW51bWVyYXRpb24taW1tdXRhYmxlIiBuYW1lPSJpbW11dGFibGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iRW51bWVyYXRpb24iPgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRW51bWVyYXRpb24taW1tdXRhYmxlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vd25lZEF0dHJpYnV0ZS0+Zm9yQWxsKGlzUmVhZE9ubHkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkVudW1lcmF0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJEYXRhVHlwZSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRW51bWVyYXRpb24tb3duZWRMaXRlcmFsIiBuYW1lPSJvd25lZExpdGVyYWwiIHR5cGU9IkVudW1lcmF0aW9uTGl0ZXJhbCIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZExpdGVyYWxfZW51bWVyYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRW51bWVyYXRpb24tb3duZWRMaXRlcmFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRW51bWVyYXRpb24tb3duZWRMaXRlcmFsIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb3JkZXJlZCBzZXQgb2YgbGl0ZXJhbHMgb3duZWQgYnkgdGhpcyBFbnVtZXJhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVudW1lcmF0aW9uLW93bmVkTGl0ZXJhbC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVudW1lcmF0aW9uLW93bmVkTGl0ZXJhbC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkVudW1lcmF0aW9uTGl0ZXJhbCIgbmFtZT0iRW51bWVyYXRpb25MaXRlcmFsIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbnVtZXJhdGlvbkxpdGVyYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbnVtZXJhdGlvbkxpdGVyYWwiPgotICAgICAgICA8Ym9keT5BbiBFbnVtZXJhdGlvbkxpdGVyYWwgaXMgYSB1c2VyLWRlZmluZWQgZGF0YSB2YWx1ZSBmb3IgYW4gRW51bWVyYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFbnVtZXJhdGlvbkxpdGVyYWwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ikluc3RhbmNlU3BlY2lmaWNhdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRW51bWVyYXRpb25MaXRlcmFsLWNsYXNzaWZpZXIiIG5hbWU9ImNsYXNzaWZpZXIiIHR5cGU9IkVudW1lcmF0aW9uIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIHJlZGVmaW5lZFByb3BlcnR5PSJJbnN0YW5jZVNwZWNpZmljYXRpb24tY2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfY2xhc3NpZmllcl9lbnVtZXJhdGlvbkxpdGVyYWwiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRW51bWVyYXRpb25MaXRlcmFsLWNsYXNzaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbnVtZXJhdGlvbkxpdGVyYWwtY2xhc3NpZmllciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGNsYXNzaWZpZXIgb2YgdGhpcyBFbnVtZXJhdGlvbkxpdGVyYWwgZGVyaXZlZCB0byBiZSBlcXVhbCB0byBpdHMgRW51bWVyYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFbnVtZXJhdGlvbkxpdGVyYWwtZW51bWVyYXRpb24iIG5hbWU9ImVudW1lcmF0aW9uIiB0eXBlPSJFbnVtZXJhdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX293bmVkTGl0ZXJhbF9lbnVtZXJhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbnVtZXJhdGlvbkxpdGVyYWwtZW51bWVyYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbnVtZXJhdGlvbkxpdGVyYWwtZW51bWVyYXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBFbnVtZXJhdGlvbiB0aGF0IHRoaXMgRW51bWVyYXRpb25MaXRlcmFsIGlzIGEgbWVtYmVyIG9mLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRW51bWVyYXRpb25MaXRlcmFsLWdldENsYXNzaWZpZXJzIiBuYW1lPSJnZXRDbGFzc2lmaWVycyIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRW51bWVyYXRpb25MaXRlcmFsLWdldENsYXNzaWZpZXJzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJDbGFzc2lmaWVyIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFbnVtZXJhdGlvbkxpdGVyYWwtZ2V0Q2xhc3NpZmllcnMtX293bmVkUGFyYW1ldGVyLjAtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVudW1lcmF0aW9uTGl0ZXJhbC1nZXRDbGFzc2lmaWVycy1fb3duZWRQYXJhbWV0ZXIuMC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJFbnVtZXJhdGlvbkxpdGVyYWwtY2xhc3NpZmllci4xIiBuYW1lPSJjbGFzc2lmaWVyIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IkVudW1lcmF0aW9uTGl0ZXJhbC1jbGFzc2lmaWVyLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbnVtZXJhdGlvbkxpdGVyYWwtY2xhc3NpZmllci4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRW51bWVyYXRpb25MaXRlcmFsLWNsYXNzaWZpZXIuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBvZiBFbnVtZXJhdGlvbjo6L2NsYXNzaWZpZXI8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iRW51bWVyYXRpb25MaXRlcmFsLWNsYXNzaWZpZXIuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkVudW1lcmF0aW9uTGl0ZXJhbC1jbGFzc2lmaWVyLjEgRW51bWVyYXRpb25MaXRlcmFsLWNsYXNzaWZpZXIiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFbnVtZXJhdGlvbkxpdGVyYWwtY2xhc3NpZmllci4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoZW51bWVyYXRpb24pPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVudW1lcmF0aW9uTGl0ZXJhbC1jbGFzc2lmaWVyLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkVudW1lcmF0aW9uIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iSW50ZXJmYWNlIiBuYW1lPSJJbnRlcmZhY2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyZmFjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyZmFjZSI+Ci0gICAgICAgIDxib2R5PkludGVyZmFjZXMgZGVjbGFyZSBjb2hlcmVudCBzZXJ2aWNlcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBieSBCZWhhdmlvcmVkQ2xhc3NpZmllcnMgdGhhdCBpbXBsZW1lbnQgdGhlIEludGVyZmFjZXMgdmlhIEludGVyZmFjZVJlYWxpemF0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJJbnRlcmZhY2UtdmlzaWJpbGl0eSIgbmFtZT0idmlzaWJpbGl0eSIgY29uc3RyYWluZWRFbGVtZW50PSJJbnRlcmZhY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJmYWNlLXZpc2liaWxpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmZhY2UtdmlzaWJpbGl0eSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHZpc2liaWxpdHkgb2YgYWxsIEZlYXR1cmVzIG93bmVkIGJ5IGFuIEludGVyZmFjZSBtdXN0IGJlIHB1YmxpYy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iSW50ZXJmYWNlLXZpc2liaWxpdHktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmZlYXR1cmUtPmZvckFsbCh2aXNpYmlsaXR5ID0gVmlzaWJpbGl0eUtpbmQ6OnB1YmxpYyk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iSW50ZXJmYWNlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJDbGFzc2lmaWVyIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnRlcmZhY2UtbmVzdGVkQ2xhc3NpZmllciIgbmFtZT0ibmVzdGVkQ2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9yZWRlZmluaXRpb25Db250ZXh0X3JlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluYWJsZUVsZW1lbnQgTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9uZXN0ZWRDbGFzc2lmaWVyX2ludGVyZmFjZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmZhY2UtbmVzdGVkQ2xhc3NpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyZmFjZS1uZXN0ZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIGFsbCB0aGUgQ2xhc3NpZmllcnMgdGhhdCBhcmUgZGVmaW5lZCAobmVzdGVkKSB3aXRoaW4gdGhlIEludGVyZmFjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyZmFjZS1uZXN0ZWRDbGFzc2lmaWVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW50ZXJmYWNlLW5lc3RlZENsYXNzaWZpZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW50ZXJmYWNlLW93bmVkQXR0cmlidXRlIiBuYW1lPSJvd25lZEF0dHJpYnV0ZSIgdHlwZT0iUHJvcGVydHkiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkNsYXNzaWZpZXItYXR0cmlidXRlIE5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfb3duZWRBdHRyaWJ1dGVfaW50ZXJmYWNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyZmFjZS1vd25lZEF0dHJpYnV0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyZmFjZS1vd25lZEF0dHJpYnV0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGF0dHJpYnV0ZXMgKGkuZS4sIHRoZSBQcm9wZXJ0aWVzKSBvd25lZCBieSB0aGUgSW50ZXJmYWNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJmYWNlLW93bmVkQXR0cmlidXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW50ZXJmYWNlLW93bmVkQXR0cmlidXRlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVyZmFjZS1vd25lZE9wZXJhdGlvbiIgbmFtZT0ib3duZWRPcGVyYXRpb24iIHR5cGU9Ik9wZXJhdGlvbiIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9yZWRlZmluaXRpb25Db250ZXh0X3JlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluYWJsZUVsZW1lbnQgQ2xhc3NpZmllci1mZWF0dXJlIE5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfb3duZWRPcGVyYXRpb25faW50ZXJmYWNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyZmFjZS1vd25lZE9wZXJhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyZmFjZS1vd25lZE9wZXJhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIE9wZXJhdGlvbnMgb3duZWQgYnkgdGhlIEludGVyZmFjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyZmFjZS1vd25lZE9wZXJhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkludGVyZmFjZS1vd25lZE9wZXJhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnRlcmZhY2Utb3duZWRSZWNlcHRpb24iIG5hbWU9Im93bmVkUmVjZXB0aW9uIiB0eXBlPSJSZWNlcHRpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJDbGFzc2lmaWVyLWZlYXR1cmUgTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZFJlY2VwdGlvbl9pbnRlcmZhY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJmYWNlLW93bmVkUmVjZXB0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlLW93bmVkUmVjZXB0aW9uIj4KLSAgICAgICAgICA8Ym9keT5SZWNlcHRpb25zIHRoYXQgb2JqZWN0cyBwcm92aWRpbmcgdGhpcyBJbnRlcmZhY2UgYXJlIHdpbGxpbmcgdG8gYWNjZXB0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJmYWNlLW93bmVkUmVjZXB0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW50ZXJmYWNlLW93bmVkUmVjZXB0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVyZmFjZS1wcm90b2NvbCIgbmFtZT0icHJvdG9jb2wiIHR5cGU9IlByb3RvY29sU3RhdGVNYWNoaW5lIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9wcm90b2NvbF9pbnRlcmZhY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJmYWNlLXByb3RvY29sLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlLXByb3RvY29sIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIGEgUHJvdG9jb2xTdGF0ZU1hY2hpbmUgc3BlY2lmeWluZyB0aGUgbGVnYWwgc2VxdWVuY2VzIG9mIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBCZWhhdmlvcmFsRmVhdHVyZXMgZGVzY3JpYmVkIGluIHRoZSBJbnRlcmZhY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJJbnRlcmZhY2UtcHJvdG9jb2wtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnRlcmZhY2UtcmVkZWZpbmVkSW50ZXJmYWNlIiBuYW1lPSJyZWRlZmluZWRJbnRlcmZhY2UiIHR5cGU9IkludGVyZmFjZSIgc3Vic2V0dGVkUHJvcGVydHk9IkNsYXNzaWZpZXItcmVkZWZpbmVkQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfcmVkZWZpbmVkSW50ZXJmYWNlX2ludGVyZmFjZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmZhY2UtcmVkZWZpbmVkSW50ZXJmYWNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlLXJlZGVmaW5lZEludGVyZmFjZSI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyBhbGwgdGhlIEludGVyZmFjZXMgcmVkZWZpbmVkIGJ5IHRoaXMgSW50ZXJmYWNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJmYWNlLXJlZGVmaW5lZEludGVyZmFjZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkludGVyZmFjZS1yZWRlZmluZWRJbnRlcmZhY2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlIiBuYW1lPSJjcmVhdGVPd25lZEF0dHJpYnV0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmZhY2UtY3JlYXRlT3duZWRBdHRyaWJ1dGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmZhY2UtY3JlYXRlT3duZWRBdHRyaWJ1dGUiPgotICAgICAgICAgIDxib2R5PkNyZWF0ZXMgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgdHlwZSwgbG93ZXIgYm91bmQsIGFuZCB1cHBlciBib3VuZCBhcyBhbiBvd25lZCBhdHRyaWJ1dGUgb2YgdGhpcyBpbnRlcmZhY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJQcm9wZXJ0eSIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUiIG5hbWU9Im5hbWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyZmFjZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS1uYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgZm9yIHRoZSBuZXcgYXR0cmlidXRlLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyZmFjZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS1uYW1lLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJJbnRlcmZhY2UtY3JlYXRlT3duZWRBdHRyaWJ1dGUtbmFtZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLXR5cGUiIG5hbWU9InR5cGUiIHR5cGU9IlR5cGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyZmFjZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS10eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLXR5cGUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHR5cGUgZm9yIHRoZSBuZXcgYXR0cmlidXRlLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyZmFjZS1jcmVhdGVPd25lZEF0dHJpYnV0ZS10eXBlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJJbnRlcmZhY2UtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdHlwZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLWxvd2VyIiBuYW1lPSJsb3dlciIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLWxvd2VyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLWxvd2VyIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBsb3dlciBib3VuZCBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLXVwcGVyIiBuYW1lPSJ1cHBlciIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLXVwcGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkQXR0cmlidXRlLXVwcGVyIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSB1cHBlciBib3VuZCBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJJbnRlcmZhY2UtY3JlYXRlT3duZWRPcGVyYXRpb24iIG5hbWU9ImNyZWF0ZU93bmVkT3BlcmF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyZmFjZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyZmFjZS1jcmVhdGVPd25lZE9wZXJhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhbiBvcGVyYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIHBhcmFtZXRlciBuYW1lcywgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcmV0dXJuIHR5cGUgKG9yIG51bGwpIGFzIGFuIG93bmVkIG9wZXJhdGlvbiBvZiB0aGlzIGludGVyZmFjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJJbnRlcmZhY2UtY3JlYXRlT3duZWRPcGVyYXRpb24tX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9Ik9wZXJhdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLW5hbWUiIG5hbWU9Im5hbWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyZmFjZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1uYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLW5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgZm9yIHRoZSBuZXcgb3BlcmF0aW9uLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyZmFjZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1uYW1lLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJJbnRlcmZhY2UtY3JlYXRlT3duZWRPcGVyYXRpb24tbmFtZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzIiBuYW1lPSJwYXJhbWV0ZXJOYW1lcyIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBwYXJhbWV0ZXIgbmFtZXMgZm9yIHRoZSBuZXcgb3BlcmF0aW9uLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkludGVyZmFjZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1wYXJhbWV0ZXJOYW1lcy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJJbnRlcmZhY2UtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyVHlwZXMiIG5hbWU9InBhcmFtZXRlclR5cGVzIiB0eXBlPSJUeXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmZhY2UtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyVHlwZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcmZhY2UtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyVHlwZXMiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHBhcmFtZXRlciB0eXBlcyBmb3IgdGhlIG5ldyBvcGVyYXRpb24sIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlclR5cGVzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJJbnRlcmZhY2UtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyVHlwZXMtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkludGVyZmFjZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1yZXR1cm5UeXBlIiBuYW1lPSJyZXR1cm5UeXBlIiB0eXBlPSJUeXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmZhY2UtY3JlYXRlT3duZWRPcGVyYXRpb24tcmV0dXJuVHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyZmFjZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1yZXR1cm5UeXBlIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSByZXR1cm4gdHlwZSBmb3IgdGhlIG5ldyBvcGVyYXRpb24sIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iSW50ZXJmYWNlLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXJldHVyblR5cGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkludGVyZmFjZS1jcmVhdGVPd25lZE9wZXJhdGlvbi1yZXR1cm5UeXBlLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iSW50ZXJmYWNlUmVhbGl6YXRpb24iIG5hbWU9IkludGVyZmFjZVJlYWxpemF0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmZhY2VSZWFsaXphdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVyZmFjZVJlYWxpemF0aW9uIj4KLSAgICAgICAgPGJvZHk+QW4gSW50ZXJmYWNlUmVhbGl6YXRpb24gaXMgYSBzcGVjaWFsaXplZCByZWFsaXphdGlvbiByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIEJlaGF2aW9yZWRDbGFzc2lmaWVyIGFuZCBhbiBJbnRlcmZhY2UuIFRoaXMgcmVsYXRpb25zaGlwIHNpZ25pZmllcyB0aGF0IHRoZSByZWFsaXppbmcgQmVoYXZpb3JlZENsYXNzaWZpZXIgY29uZm9ybXMgdG8gdGhlIGNvbnRyYWN0IHNwZWNpZmllZCBieSB0aGUgSW50ZXJmYWNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iSW50ZXJmYWNlUmVhbGl6YXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlJlYWxpemF0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnRlcmZhY2VSZWFsaXphdGlvbi1jb250cmFjdCIgbmFtZT0iY29udHJhY3QiIHR5cGU9IkludGVyZmFjZSIgc3Vic2V0dGVkUHJvcGVydHk9IkRlcGVuZGVuY3ktc3VwcGxpZXIiIGFzc29jaWF0aW9uPSJBX2NvbnRyYWN0X2ludGVyZmFjZVJlYWxpemF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVyZmFjZVJlYWxpemF0aW9uLWNvbnRyYWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlUmVhbGl6YXRpb24tY29udHJhY3QiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIEludGVyZmFjZSBzcGVjaWZ5aW5nIHRoZSBjb25mb3JtYW5jZSBjb250cmFjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVyZmFjZVJlYWxpemF0aW9uLWltcGxlbWVudGluZ0NsYXNzaWZpZXIiIG5hbWU9ImltcGxlbWVudGluZ0NsYXNzaWZpZXIiIHR5cGU9IkJlaGF2aW9yZWRDbGFzc2lmaWVyIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRGVwZW5kZW5jeS1jbGllbnQgRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfaW50ZXJmYWNlUmVhbGl6YXRpb25faW1wbGVtZW50aW5nQ2xhc3NpZmllciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcmZhY2VSZWFsaXphdGlvbi1pbXBsZW1lbnRpbmdDbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW50ZXJmYWNlUmVhbGl6YXRpb24taW1wbGVtZW50aW5nQ2xhc3NpZmllciI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJlbmNlcyB0aGUgQmVoYXZpb3JlZENsYXNzaWZpZXIgdGhhdCBvd25zIHRoaXMgSW50ZXJmYWNlUmVhbGl6YXRpb24sIGkuZS4sIHRoZSBCZWhhdmlvcmVkQ2xhc3NpZmllciB0aGF0IHJlYWxpemVzIHRoZSBJbnRlcmZhY2UgdG8gd2hpY2ggaXQgcmVmZXJzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJQcmltaXRpdmVUeXBlIiBuYW1lPSJQcmltaXRpdmVUeXBlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcmltaXRpdmVUeXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJpbWl0aXZlVHlwZSI+Ci0gICAgICAgIDxib2R5PkEgUHJpbWl0aXZlVHlwZSBkZWZpbmVzIGEgcHJlZGVmaW5lZCBEYXRhVHlwZSwgd2l0aG91dCBhbnkgc3Vic3RydWN0dXJlLiBBIFByaW1pdGl2ZVR5cGUgbWF5IGhhdmUgYW4gYWxnZWJyYSBhbmQgb3BlcmF0aW9ucyBkZWZpbmVkIG91dHNpZGUgb2YgVU1MLCBmb3IgZXhhbXBsZSwgbWF0aGVtYXRpY2FsbHkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJQcmltaXRpdmVUeXBlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJEYXRhVHlwZSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJSZWNlcHRpb24iIG5hbWU9IlJlY2VwdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVjZXB0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVjZXB0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBSZWNlcHRpb24gaXMgYSBkZWNsYXJhdGlvbiBzdGF0aW5nIHRoYXQgYSBDbGFzc2lmaWVyIGlzIHByZXBhcmVkIHRvIHJlYWN0IHRvIHRoZSByZWNlaXB0IG9mIGEgU2lnbmFsLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlY2VwdGlvbi1zYW1lX25hbWVfYXNfc2lnbmFsIiBuYW1lPSJzYW1lX25hbWVfYXNfc2lnbmFsIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlY2VwdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWNlcHRpb24tc2FtZV9uYW1lX2FzX3NpZ25hbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlY2VwdGlvbi1zYW1lX25hbWVfYXNfc2lnbmFsIj4KLSAgICAgICAgICA8Ym9keT5BIFJlY2VwdGlvbiBoYXMgdGhlIHNhbWUgbmFtZSBhcyBpdHMgc2lnbmFsPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlY2VwdGlvbi1zYW1lX25hbWVfYXNfc2lnbmFsLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5uYW1lID0gc2lnbmFsLm5hbWU8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlY2VwdGlvbi1zYW1lX3N0cnVjdHVyZV9hc19zaWduYWwiIG5hbWU9InNhbWVfc3RydWN0dXJlX2FzX3NpZ25hbCIgY29uc3RyYWluZWRFbGVtZW50PSJSZWNlcHRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVjZXB0aW9uLXNhbWVfc3RydWN0dXJlX2FzX3NpZ25hbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlY2VwdGlvbi1zYW1lX3N0cnVjdHVyZV9hc19zaWduYWwiPgotICAgICAgICAgIDxib2R5PkEgUmVjZXB0aW9uJ3MgcGFyYW1ldGVycyBtYXRjaCB0aGUgb3duZWRBdHRyaWJ1dGVzIG9mIGl0cyBzaWduYWwgYnkgbmFtZSwgdHlwZSwgYW5kIG11bHRpcGxpY2l0eTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWNlcHRpb24tc2FtZV9zdHJ1Y3R1cmVfYXNfc2lnbmFsLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zaWduYWwub3duZWRBdHRyaWJ1dGUtPnNpemUoKSA9IG93bmVkUGFyYW1ldGVyLT5zaXplKCkgYW5kJiN4RDsKLVNlcXVlbmNlezEuLnNpZ25hbC5vd25lZEF0dHJpYnV0ZS0+c2l6ZSgpfS0+Zm9yQWxsKCBpIHwgJiN4RDsKLSAgICBvd25lZFBhcmFtZXRlci0+YXQoaSkuZGlyZWN0aW9uID0gUGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6XydpbicgYW5kICYjeEQ7Ci0gICAgb3duZWRQYXJhbWV0ZXItPmF0KGkpLm5hbWUgPSBzaWduYWwub3duZWRBdHRyaWJ1dGUtPmF0KGkpLm5hbWUgYW5kJiN4RDsKLSAgICBvd25lZFBhcmFtZXRlci0+YXQoaSkudHlwZSA9IHNpZ25hbC5vd25lZEF0dHJpYnV0ZS0+YXQoaSkudHlwZSBhbmQmI3hEOwotICAgIG93bmVkUGFyYW1ldGVyLT5hdChpKS5sb3dlckJvdW5kKCkgPSBzaWduYWwub3duZWRBdHRyaWJ1dGUtPmF0KGkpLmxvd2VyQm91bmQoKSBhbmQmI3hEOwotICAgIG93bmVkUGFyYW1ldGVyLT5hdChpKS51cHBlckJvdW5kKCkgPSBzaWduYWwub3duZWRBdHRyaWJ1dGUtPmF0KGkpLnVwcGVyQm91bmQoKSYjeEQ7Ci0pPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlJlY2VwdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQmVoYXZpb3JhbEZlYXR1cmUiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlY2VwdGlvbi1zaWduYWwiIG5hbWU9InNpZ25hbCIgdHlwZT0iU2lnbmFsIiBhc3NvY2lhdGlvbj0iQV9zaWduYWxfcmVjZXB0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlY2VwdGlvbi1zaWduYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWNlcHRpb24tc2lnbmFsIj4KLSAgICAgICAgICA8Ym9keT5UaGUgU2lnbmFsIHRoYXQgdGhpcyBSZWNlcHRpb24gaGFuZGxlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iU2lnbmFsIiBuYW1lPSJTaWduYWwiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNpZ25hbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNpZ25hbCI+Ci0gICAgICAgIDxib2R5PkEgU2lnbmFsIGlzIGEgc3BlY2lmaWNhdGlvbiBvZiBhIGtpbmQgb2YgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG9iamVjdHMgaW4gd2hpY2ggYSByZWFjdGlvbiBpcyBhc3luY2hyb25vdXNseSB0cmlnZ2VyZWQgaW4gdGhlIHJlY2VpdmVyIHdpdGhvdXQgYSByZXBseS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlNpZ25hbC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQ2xhc3NpZmllciIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU2lnbmFsLW93bmVkQXR0cmlidXRlIiBuYW1lPSJvd25lZEF0dHJpYnV0ZSIgdHlwZT0iUHJvcGVydHkiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkNsYXNzaWZpZXItYXR0cmlidXRlIE5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfb3duZWRBdHRyaWJ1dGVfb3duaW5nU2lnbmFsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNpZ25hbC1vd25lZEF0dHJpYnV0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNpZ25hbC1vd25lZEF0dHJpYnV0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGF0dHJpYnV0ZXMgb3duZWQgYnkgdGhlIFNpZ25hbC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlNpZ25hbC1vd25lZEF0dHJpYnV0ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlNpZ25hbC1vd25lZEF0dHJpYnV0ZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0ZU93bmVkQXR0cmlidXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNpZ25hbC1jcmVhdGVPd25lZEF0dHJpYnV0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNpZ25hbC1jcmVhdGVPd25lZEF0dHJpYnV0ZSI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCB0eXBlLCBsb3dlciBib3VuZCwgYW5kIHVwcGVyIGJvdW5kIGFzIGFuIG93bmVkIGF0dHJpYnV0ZSBvZiB0aGlzIHNpZ25hbC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtX293bmVkUGFyYW1ldGVyLjAiIHR5cGU9IlByb3BlcnR5IiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtbmFtZSIgbmFtZT0ibmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2lnbmFsLWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtbmFtZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUsIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU2lnbmFsLWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlNpZ25hbC1jcmVhdGVPd25lZEF0dHJpYnV0ZS1uYW1lLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdHlwZSIgbmFtZT0idHlwZSIgdHlwZT0iVHlwZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2lnbmFsLWNyZWF0ZU93bmVkQXR0cmlidXRlLXR5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdHlwZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUsIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU2lnbmFsLWNyZWF0ZU93bmVkQXR0cmlidXRlLXR5cGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlNpZ25hbC1jcmVhdGVPd25lZEF0dHJpYnV0ZS10eXBlLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtbG93ZXIiIG5hbWU9Imxvd2VyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtbG93ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtbG93ZXIiPgotICAgICAgICAgICAgPGJvZHk+VGhlIGxvd2VyIGJvdW5kIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdXBwZXIiIG5hbWU9InVwcGVyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdXBwZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTaWduYWwtY3JlYXRlT3duZWRBdHRyaWJ1dGUtdXBwZXIiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHVwcGVyIGJvdW5kIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZEF0dHJpYnV0ZV9vd25pbmdTaWduYWwiIG5hbWU9IkFfb3duZWRBdHRyaWJ1dGVfb3duaW5nU2lnbmFsIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlNpZ25hbC1vd25lZEF0dHJpYnV0ZSBBX293bmVkQXR0cmlidXRlX293bmluZ1NpZ25hbC1vd25pbmdTaWduYWwiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vd25lZEF0dHJpYnV0ZV9vd25pbmdTaWduYWwtb3duaW5nU2lnbmFsIiBuYW1lPSJvd25pbmdTaWduYWwiIHR5cGU9IlNpZ25hbCIgc3Vic2V0dGVkUHJvcGVydHk9IkFfYXR0cmlidXRlX2NsYXNzaWZpZXItY2xhc3NpZmllciBOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9vd25lZEF0dHJpYnV0ZV9vd25pbmdTaWduYWwiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfb3duZWRBdHRyaWJ1dGVfb3duaW5nU2lnbmFsLW93bmluZ1NpZ25hbC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zaWduYWxfcmVjZXB0aW9uIiBuYW1lPSJBX3NpZ25hbF9yZWNlcHRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVjZXB0aW9uLXNpZ25hbCBBX3NpZ25hbF9yZWNlcHRpb24tcmVjZXB0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfc2lnbmFsX3JlY2VwdGlvbi1yZWNlcHRpb24iIG5hbWU9InJlY2VwdGlvbiIgdHlwZT0iUmVjZXB0aW9uIiBhc3NvY2lhdGlvbj0iQV9zaWduYWxfcmVjZXB0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3NpZ25hbF9yZWNlcHRpb24tcmVjZXB0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9zaWduYWxfcmVjZXB0aW9uLXJlY2VwdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY29udHJhY3RfaW50ZXJmYWNlUmVhbGl6YXRpb24iIG5hbWU9IkFfY29udHJhY3RfaW50ZXJmYWNlUmVhbGl6YXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iSW50ZXJmYWNlUmVhbGl6YXRpb24tY29udHJhY3QgQV9jb250cmFjdF9pbnRlcmZhY2VSZWFsaXphdGlvbi1pbnRlcmZhY2VSZWFsaXphdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2NvbnRyYWN0X2ludGVyZmFjZVJlYWxpemF0aW9uLWludGVyZmFjZVJlYWxpemF0aW9uIiBuYW1lPSJpbnRlcmZhY2VSZWFsaXphdGlvbiIgdHlwZT0iSW50ZXJmYWNlUmVhbGl6YXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX3N1cHBsaWVyX3N1cHBsaWVyRGVwZW5kZW5jeS1zdXBwbGllckRlcGVuZGVuY3kiIGFzc29jaWF0aW9uPSJBX2NvbnRyYWN0X2ludGVyZmFjZVJlYWxpemF0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2NvbnRyYWN0X2ludGVyZmFjZVJlYWxpemF0aW9uLWludGVyZmFjZVJlYWxpemF0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9jb250cmFjdF9pbnRlcmZhY2VSZWFsaXphdGlvbi1pbnRlcmZhY2VSZWFsaXphdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcHJvdG9jb2xfaW50ZXJmYWNlIiBuYW1lPSJBX3Byb3RvY29sX2ludGVyZmFjZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmZhY2UtcHJvdG9jb2wgQV9wcm90b2NvbF9pbnRlcmZhY2UtaW50ZXJmYWNlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcHJvdG9jb2xfaW50ZXJmYWNlLWludGVyZmFjZSIgbmFtZT0iaW50ZXJmYWNlIiB0eXBlPSJJbnRlcmZhY2UiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9wcm90b2NvbF9pbnRlcmZhY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQV9wcm90b2NvbF9pbnRlcmZhY2UtaW50ZXJmYWNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQV9wcm90b2NvbF9pbnRlcmZhY2UtaW50ZXJmYWNlIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSBpbiB3aGljaCB0aGUgcHJvdG9jb2wgc3RhdGUgbWFjaGluZSBpcyBkZWZpbmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9wcm90b2NvbF9pbnRlcmZhY2UtaW50ZXJmYWNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX293bmVkUmVjZXB0aW9uX2ludGVyZmFjZSIgbmFtZT0iQV9vd25lZFJlY2VwdGlvbl9pbnRlcmZhY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iSW50ZXJmYWNlLW93bmVkUmVjZXB0aW9uIEFfb3duZWRSZWNlcHRpb25faW50ZXJmYWNlLWludGVyZmFjZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX293bmVkUmVjZXB0aW9uX2ludGVyZmFjZS1pbnRlcmZhY2UiIG5hbWU9ImludGVyZmFjZSIgdHlwZT0iSW50ZXJmYWNlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRmVhdHVyZS1mZWF0dXJpbmdDbGFzc2lmaWVyIE5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX293bmVkUmVjZXB0aW9uX2ludGVyZmFjZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vd25lZFJlY2VwdGlvbl9pbnRlcmZhY2UtaW50ZXJmYWNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlZGVmaW5lZEludGVyZmFjZV9pbnRlcmZhY2UiIG5hbWU9IkFfcmVkZWZpbmVkSW50ZXJmYWNlX2ludGVyZmFjZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcmZhY2UtcmVkZWZpbmVkSW50ZXJmYWNlIEFfcmVkZWZpbmVkSW50ZXJmYWNlX2ludGVyZmFjZS1pbnRlcmZhY2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZWRlZmluZWRJbnRlcmZhY2VfaW50ZXJmYWNlLWludGVyZmFjZSIgbmFtZT0iaW50ZXJmYWNlIiB0eXBlPSJJbnRlcmZhY2UiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5lZENsYXNzaWZpZXJfY2xhc3NpZmllci1jbGFzc2lmaWVyIiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluZWRJbnRlcmZhY2VfaW50ZXJmYWNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JlZGVmaW5lZEludGVyZmFjZV9pbnRlcmZhY2UtaW50ZXJmYWNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9yZWRlZmluZWRJbnRlcmZhY2VfaW50ZXJmYWNlLWludGVyZmFjZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbmVzdGVkQ2xhc3NpZmllcl9pbnRlcmZhY2UiIG5hbWU9IkFfbmVzdGVkQ2xhc3NpZmllcl9pbnRlcmZhY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iSW50ZXJmYWNlLW5lc3RlZENsYXNzaWZpZXIgQV9uZXN0ZWRDbGFzc2lmaWVyX2ludGVyZmFjZS1pbnRlcmZhY2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9uZXN0ZWRDbGFzc2lmaWVyX2ludGVyZmFjZS1pbnRlcmZhY2UiIG5hbWU9ImludGVyZmFjZSIgdHlwZT0iSW50ZXJmYWNlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSBSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbml0aW9uQ29udGV4dCIgYXNzb2NpYXRpb249IkFfbmVzdGVkQ2xhc3NpZmllcl9pbnRlcmZhY2UiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbmVzdGVkQ2xhc3NpZmllcl9pbnRlcmZhY2UtaW50ZXJmYWNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX293bmVkT3BlcmF0aW9uX2ludGVyZmFjZSIgbmFtZT0iQV9vd25lZE9wZXJhdGlvbl9pbnRlcmZhY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iSW50ZXJmYWNlLW93bmVkT3BlcmF0aW9uIE9wZXJhdGlvbi1pbnRlcmZhY2UiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZEF0dHJpYnV0ZV9pbnRlcmZhY2UiIG5hbWU9IkFfb3duZWRBdHRyaWJ1dGVfaW50ZXJmYWNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkludGVyZmFjZS1vd25lZEF0dHJpYnV0ZSBQcm9wZXJ0eS1pbnRlcmZhY2UiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jbGFzc2lmaWVyX2VudW1lcmF0aW9uTGl0ZXJhbCIgbmFtZT0iQV9jbGFzc2lmaWVyX2VudW1lcmF0aW9uTGl0ZXJhbCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkVudW1lcmF0aW9uTGl0ZXJhbC1jbGFzc2lmaWVyIEFfY2xhc3NpZmllcl9lbnVtZXJhdGlvbkxpdGVyYWwtZW51bWVyYXRpb25MaXRlcmFsIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFfY2xhc3NpZmllcl9lbnVtZXJhdGlvbkxpdGVyYWwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFfY2xhc3NpZmllcl9pbnN0YW5jZVNwZWNpZmljYXRpb24iLz4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfY2xhc3NpZmllcl9lbnVtZXJhdGlvbkxpdGVyYWwtZW51bWVyYXRpb25MaXRlcmFsIiBuYW1lPSJlbnVtZXJhdGlvbkxpdGVyYWwiIHR5cGU9IkVudW1lcmF0aW9uTGl0ZXJhbCIgcmVkZWZpbmVkUHJvcGVydHk9IkFfY2xhc3NpZmllcl9pbnN0YW5jZVNwZWNpZmljYXRpb24taW5zdGFuY2VTcGVjaWZpY2F0aW9uIiBhc3NvY2lhdGlvbj0iQV9jbGFzc2lmaWVyX2VudW1lcmF0aW9uTGl0ZXJhbCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jbGFzc2lmaWVyX2VudW1lcmF0aW9uTGl0ZXJhbC1lbnVtZXJhdGlvbkxpdGVyYWwtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NsYXNzaWZpZXJfZW51bWVyYXRpb25MaXRlcmFsLWVudW1lcmF0aW9uTGl0ZXJhbC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRMaXRlcmFsX2VudW1lcmF0aW9uIiBuYW1lPSJBX293bmVkTGl0ZXJhbF9lbnVtZXJhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFbnVtZXJhdGlvbi1vd25lZExpdGVyYWwgRW51bWVyYXRpb25MaXRlcmFsLWVudW1lcmF0aW9uIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRBdHRyaWJ1dGVfZGF0YXR5cGUiIG5hbWU9IkFfb3duZWRBdHRyaWJ1dGVfZGF0YXR5cGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRGF0YVR5cGUtb3duZWRBdHRyaWJ1dGUgUHJvcGVydHktZGF0YXR5cGUiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZE9wZXJhdGlvbl9kYXRhdHlwZSIgbmFtZT0iQV9vd25lZE9wZXJhdGlvbl9kYXRhdHlwZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJEYXRhVHlwZS1vd25lZE9wZXJhdGlvbiBPcGVyYXRpb24tZGF0YXR5cGUiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZEJlaGF2aW9yX2JlaGF2aW9yZWRDbGFzc2lmaWVyIiBuYW1lPSJBX293bmVkQmVoYXZpb3JfYmVoYXZpb3JlZENsYXNzaWZpZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItb3duZWRCZWhhdmlvciBBX293bmVkQmVoYXZpb3JfYmVoYXZpb3JlZENsYXNzaWZpZXItYmVoYXZpb3JlZENsYXNzaWZpZXIiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vd25lZEJlaGF2aW9yX2JlaGF2aW9yZWRDbGFzc2lmaWVyLWJlaGF2aW9yZWRDbGFzc2lmaWVyIiBuYW1lPSJiZWhhdmlvcmVkQ2xhc3NpZmllciIgdHlwZT0iQmVoYXZpb3JlZENsYXNzaWZpZXIiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9vd25lZEJlaGF2aW9yX2JlaGF2aW9yZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX293bmVkQmVoYXZpb3JfYmVoYXZpb3JlZENsYXNzaWZpZXItYmVoYXZpb3JlZENsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY2xhc3NpZmllckJlaGF2aW9yX2JlaGF2aW9yZWRDbGFzc2lmaWVyIiBuYW1lPSJBX2NsYXNzaWZpZXJCZWhhdmlvcl9iZWhhdmlvcmVkQ2xhc3NpZmllciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJCZWhhdmlvcmVkQ2xhc3NpZmllci1jbGFzc2lmaWVyQmVoYXZpb3IgQV9jbGFzc2lmaWVyQmVoYXZpb3JfYmVoYXZpb3JlZENsYXNzaWZpZXItYmVoYXZpb3JlZENsYXNzaWZpZXIiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQV9jbGFzc2lmaWVyQmVoYXZpb3JfYmVoYXZpb3JlZENsYXNzaWZpZXItX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFfb3duZWRCZWhhdmlvcl9iZWhhdmlvcmVkQ2xhc3NpZmllciIvPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jbGFzc2lmaWVyQmVoYXZpb3JfYmVoYXZpb3JlZENsYXNzaWZpZXItYmVoYXZpb3JlZENsYXNzaWZpZXIiIG5hbWU9ImJlaGF2aW9yZWRDbGFzc2lmaWVyIiB0eXBlPSJCZWhhdmlvcmVkQ2xhc3NpZmllciIgcmVkZWZpbmVkUHJvcGVydHk9IkFfb3duZWRCZWhhdmlvcl9iZWhhdmlvcmVkQ2xhc3NpZmllci1iZWhhdmlvcmVkQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfY2xhc3NpZmllckJlaGF2aW9yX2JlaGF2aW9yZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2NsYXNzaWZpZXJCZWhhdmlvcl9iZWhhdmlvcmVkQ2xhc3NpZmllci1iZWhhdmlvcmVkQ2xhc3NpZmllci1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9pbnRlcmZhY2VSZWFsaXphdGlvbl9pbXBsZW1lbnRpbmdDbGFzc2lmaWVyIiBuYW1lPSJBX2ludGVyZmFjZVJlYWxpemF0aW9uX2ltcGxlbWVudGluZ0NsYXNzaWZpZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQmVoYXZpb3JlZENsYXNzaWZpZXItaW50ZXJmYWNlUmVhbGl6YXRpb24gSW50ZXJmYWNlUmVhbGl6YXRpb24taW1wbGVtZW50aW5nQ2xhc3NpZmllciIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiIG5hbWU9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlIj4KLSAgICAgICAgPGJvZHk+QSBDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UgcmVwcmVzZW50cyBhIHVzYWdlIChhcyBwYXJ0IG9mIGEgc3VibWFjaGluZSBTdGF0ZSkgb2YgYW4gZW50cnkvZXhpdCBwb2ludCBQc2V1ZG9zdGF0ZSBkZWZpbmVkIGluIHRoZSBTdGF0ZU1hY2hpbmUgcmVmZXJlbmNlZCBieSB0aGUgc3VibWFjaGluZSBTdGF0ZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZXhpdF9wc2V1ZG9zdGF0ZXMiIG5hbWU9ImV4aXRfcHNldWRvc3RhdGVzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZXhpdF9wc2V1ZG9zdGF0ZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZXhpdF9wc2V1ZG9zdGF0ZXMiPgotICAgICAgICAgIDxib2R5PlRoZSBleGl0IFBzZXVkb3N0YXRlcyBtdXN0IGJlIFBzZXVkb3N0YXRlcyB3aXRoIGtpbmQgZXhpdFBvaW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZXhpdF9wc2V1ZG9zdGF0ZXMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmV4aXQtPmZvckFsbChraW5kID0gUHNldWRvc3RhdGVLaW5kOjpleGl0UG9pbnQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZW50cnlfcHNldWRvc3RhdGVzIiBuYW1lPSJlbnRyeV9wc2V1ZG9zdGF0ZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1lbnRyeV9wc2V1ZG9zdGF0ZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZW50cnlfcHNldWRvc3RhdGVzIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZW50cnkgUHNldWRvc3RhdGVzIG11c3QgYmUgUHNldWRvc3RhdGVzIHdpdGgga2luZCBlbnRyeVBvaW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZW50cnlfcHNldWRvc3RhdGVzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lbnRyeS0+Zm9yQWxsKGtpbmQgPSBQc2V1ZG9zdGF0ZUtpbmQ6OmVudHJ5UG9pbnQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iVmVydGV4Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZW50cnkiIG5hbWU9ImVudHJ5IiB0eXBlPSJQc2V1ZG9zdGF0ZSIgYXNzb2NpYXRpb249IkFfZW50cnlfY29ubmVjdGlvblBvaW50UmVmZXJlbmNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1lbnRyeS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1lbnRyeSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGVudHJ5UG9pbnQgUHNldWRvc3RhdGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjb25uZWN0aW9uIHBvaW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlLWVudHJ5LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlLWVudHJ5LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1leGl0IiBuYW1lPSJleGl0IiB0eXBlPSJQc2V1ZG9zdGF0ZSIgYXNzb2NpYXRpb249IkFfZXhpdF9jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlLWV4aXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZXhpdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGV4aXRQb2ludHMga2luZCBQc2V1ZG9zdGF0ZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIGNvbm5lY3Rpb24gcG9pbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtZXhpdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1leGl0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1zdGF0ZSIgbmFtZT0ic3RhdGUiIHR5cGU9IlN0YXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfY29ubmVjdGlvbl9zdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2Utc3RhdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2Utc3RhdGUiPgotICAgICAgICAgIDxib2R5PlRoZSBTdGF0ZSBpbiB3aGljaCB0aGUgQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlIGlzIGRlZmluZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2Utc3RhdGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkZpbmFsU3RhdGUiIG5hbWU9IkZpbmFsU3RhdGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkZpbmFsU3RhdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJGaW5hbFN0YXRlIj4KLSAgICAgICAgPGJvZHk+QSBzcGVjaWFsIGtpbmQgb2YgU3RhdGUsIHdoaWNoLCB3aGVuIGVudGVyZWQsIHNpZ25pZmllcyB0aGF0IHRoZSBlbmNsb3NpbmcgUmVnaW9uIGhhcyBjb21wbGV0ZWQuIElmIHRoZSBlbmNsb3NpbmcgUmVnaW9uIGlzIGRpcmVjdGx5IGNvbnRhaW5lZCBpbiBhIFN0YXRlTWFjaGluZSBhbmQgYWxsIG90aGVyIFJlZ2lvbnMgaW4gdGhhdCBTdGF0ZU1hY2hpbmUgYWxzbyBhcmUgY29tcGxldGVkLCB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlIGVudGlyZSBTdGF0ZU1hY2hpbmUgYmVoYXZpb3IgaXMgY29tcGxldGVkLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkZpbmFsU3RhdGUtbm9fZXhpdF9iZWhhdmlvciIgbmFtZT0ibm9fZXhpdF9iZWhhdmlvciIgY29uc3RyYWluZWRFbGVtZW50PSJGaW5hbFN0YXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkZpbmFsU3RhdGUtbm9fZXhpdF9iZWhhdmlvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkZpbmFsU3RhdGUtbm9fZXhpdF9iZWhhdmlvciI+Ci0gICAgICAgICAgPGJvZHk+QSBGaW5hbFN0YXRlIGhhcyBubyBleGl0IEJlaGF2aW9yLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJGaW5hbFN0YXRlLW5vX2V4aXRfYmVoYXZpb3ItX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmV4aXQtPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRmluYWxTdGF0ZS1ub19vdXRnb2luZ190cmFuc2l0aW9ucyIgbmFtZT0ibm9fb3V0Z29pbmdfdHJhbnNpdGlvbnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iRmluYWxTdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJGaW5hbFN0YXRlLW5vX291dGdvaW5nX3RyYW5zaXRpb25zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRmluYWxTdGF0ZS1ub19vdXRnb2luZ190cmFuc2l0aW9ucyI+Ci0gICAgICAgICAgPGJvZHk+QSBGaW5hbFN0YXRlIGNhbm5vdCBoYXZlIGFueSBvdXRnb2luZyBUcmFuc2l0aW9ucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRmluYWxTdGF0ZS1ub19vdXRnb2luZ190cmFuc2l0aW9ucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b3V0Z29pbmctPnNpemUoKSA9IDA8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkZpbmFsU3RhdGUtbm9fcmVnaW9ucyIgbmFtZT0ibm9fcmVnaW9ucyIgY29uc3RyYWluZWRFbGVtZW50PSJGaW5hbFN0YXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkZpbmFsU3RhdGUtbm9fcmVnaW9ucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkZpbmFsU3RhdGUtbm9fcmVnaW9ucyI+Ci0gICAgICAgICAgPGJvZHk+QSBGaW5hbFN0YXRlIGNhbm5vdCBoYXZlIFJlZ2lvbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkZpbmFsU3RhdGUtbm9fcmVnaW9ucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVnaW9uLT5zaXplKCkgPSAwPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJGaW5hbFN0YXRlLWNhbm5vdF9yZWZlcmVuY2Vfc3VibWFjaGluZSIgbmFtZT0iY2Fubm90X3JlZmVyZW5jZV9zdWJtYWNoaW5lIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkZpbmFsU3RhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRmluYWxTdGF0ZS1jYW5ub3RfcmVmZXJlbmNlX3N1Ym1hY2hpbmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJGaW5hbFN0YXRlLWNhbm5vdF9yZWZlcmVuY2Vfc3VibWFjaGluZSI+Ci0gICAgICAgICAgPGJvZHk+QSBGaW5hbFN0YXRlIGNhbm5vdCByZWZlcmVuY2UgYSBzdWJtYWNoaW5lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJGaW5hbFN0YXRlLWNhbm5vdF9yZWZlcmVuY2Vfc3VibWFjaGluZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c3VibWFjaGluZS0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJGaW5hbFN0YXRlLW5vX2VudHJ5X2JlaGF2aW9yIiBuYW1lPSJub19lbnRyeV9iZWhhdmlvciIgY29uc3RyYWluZWRFbGVtZW50PSJGaW5hbFN0YXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkZpbmFsU3RhdGUtbm9fZW50cnlfYmVoYXZpb3ItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJGaW5hbFN0YXRlLW5vX2VudHJ5X2JlaGF2aW9yIj4KLSAgICAgICAgICA8Ym9keT5BIEZpbmFsU3RhdGUgaGFzIG5vIGVudHJ5IEJlaGF2aW9yLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJGaW5hbFN0YXRlLW5vX2VudHJ5X2JlaGF2aW9yLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lbnRyeS0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJGaW5hbFN0YXRlLW5vX3N0YXRlX2JlaGF2aW9yIiBuYW1lPSJub19zdGF0ZV9iZWhhdmlvciIgY29uc3RyYWluZWRFbGVtZW50PSJGaW5hbFN0YXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkZpbmFsU3RhdGUtbm9fc3RhdGVfYmVoYXZpb3ItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJGaW5hbFN0YXRlLW5vX3N0YXRlX2JlaGF2aW9yIj4KLSAgICAgICAgICA8Ym9keT5BIEZpbmFsU3RhdGUgaGFzIG5vIHN0YXRlIChkb0FjdGl2aXR5KSBCZWhhdmlvci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRmluYWxTdGF0ZS1ub19zdGF0ZV9iZWhhdmlvci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZG9BY3Rpdml0eS0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkZpbmFsU3RhdGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlN0YXRlIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlByb3RvY29sQ29uZm9ybWFuY2UiIG5hbWU9IlByb3RvY29sQ29uZm9ybWFuY2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3RvY29sQ29uZm9ybWFuY2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm90b2NvbENvbmZvcm1hbmNlIj4KLSAgICAgICAgPGJvZHk+QSBQcm90b2NvbFN0YXRlTWFjaGluZSBjYW4gYmUgcmVkZWZpbmVkIGludG8gYSBtb3JlIHNwZWNpZmljIFByb3RvY29sU3RhdGVNYWNoaW5lIG9yIGludG8gYmVoYXZpb3JhbCBTdGF0ZU1hY2hpbmUuIFByb3RvY29sQ29uZm9ybWFuY2UgZGVjbGFyZXMgdGhhdCB0aGUgc3BlY2lmaWMgUHJvdG9jb2xTdGF0ZU1hY2hpbmUgc3BlY2lmaWVzIGEgcHJvdG9jb2wgdGhhdCBjb25mb3JtcyB0byB0aGUgZ2VuZXJhbCBQcm90b2NvbFN0YXRlTWFjaGluZSBvciB0aGF0IHRoZSBzcGVjaWZpYyBiZWhhdmlvcmFsIFN0YXRlTWFjaGluZSBhYmlkZXMgYnkgdGhlIHByb3RvY29sIG9mIHRoZSBnZW5lcmFsIFByb3RvY29sU3RhdGVNYWNoaW5lLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUHJvdG9jb2xDb25mb3JtYW5jZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb3RvY29sQ29uZm9ybWFuY2UtZ2VuZXJhbE1hY2hpbmUiIG5hbWU9ImdlbmVyYWxNYWNoaW5lIiB0eXBlPSJQcm90b2NvbFN0YXRlTWFjaGluZSIgc3Vic2V0dGVkUHJvcGVydHk9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXRhcmdldCIgYXNzb2NpYXRpb249IkFfZ2VuZXJhbE1hY2hpbmVfcHJvdG9jb2xDb25mb3JtYW5jZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm90b2NvbENvbmZvcm1hbmNlLWdlbmVyYWxNYWNoaW5lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvdG9jb2xDb25mb3JtYW5jZS1nZW5lcmFsTWFjaGluZSI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBQcm90b2NvbFN0YXRlTWFjaGluZSB0byB3aGljaCB0aGUgc3BlY2lmaWMgUHJvdG9jb2xTdGF0ZU1hY2hpbmUgY29uZm9ybXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQcm90b2NvbENvbmZvcm1hbmNlLXNwZWNpZmljTWFjaGluZSIgbmFtZT0ic3BlY2lmaWNNYWNoaW5lIiB0eXBlPSJQcm90b2NvbFN0YXRlTWFjaGluZSIgc3Vic2V0dGVkUHJvcGVydHk9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXNvdXJjZSBFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9jb25mb3JtYW5jZV9zcGVjaWZpY01hY2hpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvdG9jb2xDb25mb3JtYW5jZS1zcGVjaWZpY01hY2hpbmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm90b2NvbENvbmZvcm1hbmNlLXNwZWNpZmljTWFjaGluZSI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBQcm90b2NvbFN0YXRlTWFjaGluZSB3aGljaCBjb25mb3JtcyB0byB0aGUgZ2VuZXJhbCBQcm90b2NvbFN0YXRlTWFjaGluZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUiIG5hbWU9IlByb3RvY29sU3RhdGVNYWNoaW5lIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm90b2NvbFN0YXRlTWFjaGluZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3RvY29sU3RhdGVNYWNoaW5lIj4KLSAgICAgICAgPGJvZHk+QSBQcm90b2NvbFN0YXRlTWFjaGluZSBpcyBhbHdheXMgZGVmaW5lZCBpbiB0aGUgY29udGV4dCBvZiBhIENsYXNzaWZpZXIuIEl0IHNwZWNpZmllcyB3aGljaCBCZWhhdmlvcmFsRmVhdHVyZXMgb2YgdGhlIENsYXNzaWZpZXIgY2FuIGJlIGNhbGxlZCBpbiB3aGljaCBTdGF0ZSBhbmQgdW5kZXIgd2hpY2ggY29uZGl0aW9ucywgdGh1cyBzcGVjaWZ5aW5nIHRoZSBhbGxvd2VkIGludm9jYXRpb24gc2VxdWVuY2VzIG9uIHRoZSBDbGFzc2lmaWVyJ3MgQmVoYXZpb3JhbEZlYXR1cmVzLiBBIFByb3RvY29sU3RhdGVNYWNoaW5lIHNwZWNpZmllcyB0aGUgcG9zc2libGUgYW5kIHBlcm1pdHRlZCBUcmFuc2l0aW9ucyBvbiB0aGUgaW5zdGFuY2VzIG9mIGl0cyBjb250ZXh0IENsYXNzaWZpZXIsIHRvZ2V0aGVyIHdpdGggdGhlIEJlaGF2aW9yYWxGZWF0dXJlcyB0aGF0IGNhcnJ5IHRoZSBUcmFuc2l0aW9ucy4gSW4gdGhpcyBtYW5uZXIsIGFuIGluc3RhbmNlIGxpZmVjeWNsZSBjYW4gYmUgc3BlY2lmaWVkIGZvciBhIENsYXNzaWZpZXIsIGJ5IGRlZmluaW5nIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgQmVoYXZpb3JhbEZlYXR1cmVzIGNhbiBiZSBhY3RpdmF0ZWQgYW5kIHRoZSBTdGF0ZXMgdGhyb3VnaCB3aGljaCBhbiBpbnN0YW5jZSBwcm9ncmVzc2VzIGR1cmluZyBpdHMgZXhpc3RlbmNlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlByb3RvY29sU3RhdGVNYWNoaW5lLWNsYXNzaWZpZXJfY29udGV4dCIgbmFtZT0iY2xhc3NpZmllcl9jb250ZXh0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb3RvY29sU3RhdGVNYWNoaW5lIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3RvY29sU3RhdGVNYWNoaW5lLWNsYXNzaWZpZXJfY29udGV4dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3RvY29sU3RhdGVNYWNoaW5lLWNsYXNzaWZpZXJfY29udGV4dCI+Ci0gICAgICAgICAgPGJvZHk+QSBQcm90b2NvbFN0YXRlTWFjaGluZSBtdXN0IG9ubHkgaGF2ZSBhIENsYXNzaWZpZXIgY29udGV4dCwgbm90IGEgQmVoYXZpb3JhbEZlYXR1cmUgY29udGV4dC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUtY2xhc3NpZmllcl9jb250ZXh0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5fJ2NvbnRleHQnICZsdDs+IG51bGwgYW5kIHNwZWNpZmljYXRpb24gPSBudWxsPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQcm90b2NvbFN0YXRlTWFjaGluZS1kZWVwX29yX3NoYWxsb3dfaGlzdG9yeSIgbmFtZT0iZGVlcF9vcl9zaGFsbG93X2hpc3RvcnkiIGNvbnN0cmFpbmVkRWxlbWVudD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUtZGVlcF9vcl9zaGFsbG93X2hpc3RvcnktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm90b2NvbFN0YXRlTWFjaGluZS1kZWVwX29yX3NoYWxsb3dfaGlzdG9yeSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdG9jb2xTdGF0ZU1hY2hpbmVzIGNhbm5vdCBoYXZlIGRlZXAgb3Igc2hhbGxvdyBoaXN0b3J5IFBzZXVkb3N0YXRlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUtZGVlcF9vcl9zaGFsbG93X2hpc3RvcnktX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnJlZ2lvbi0+Zm9yQWxsIChyIHwgci5zdWJ2ZXJ0ZXgtPmZvckFsbCAodiB8IHYub2NsSXNLaW5kT2YoUHNldWRvc3RhdGUpIGltcGxpZXMKLSgodi5vY2xBc1R5cGUoUHNldWRvc3RhdGUpLmtpbmQgJmx0Oz4gIFBzZXVkb3N0YXRlS2luZDo6ZGVlcEhpc3RvcnkpIGFuZCAodi5vY2xBc1R5cGUoUHNldWRvc3RhdGUpLmtpbmQgJmx0Oz4gUHNldWRvc3RhdGVLaW5kOjpzaGFsbG93SGlzdG9yeSkpKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlByb3RvY29sU3RhdGVNYWNoaW5lLWVudHJ5X2V4aXRfZG8iIG5hbWU9ImVudHJ5X2V4aXRfZG8iIGNvbnN0cmFpbmVkRWxlbWVudD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUtZW50cnlfZXhpdF9kby1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlByb3RvY29sU3RhdGVNYWNoaW5lLWVudHJ5X2V4aXRfZG8iPgotICAgICAgICAgIDxib2R5PlRoZSBzdGF0ZXMgb2YgYSBQcm90b2NvbFN0YXRlTWFjaGluZSBjYW5ub3QgaGF2ZSBlbnRyeSwgZXhpdCwgb3IgZG8gYWN0aXZpdHkgQmVoYXZpb3JzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQcm90b2NvbFN0YXRlTWFjaGluZS1lbnRyeV9leGl0X2RvLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5yZWdpb24tPmZvckFsbChyIHwgci5zdWJ2ZXJ0ZXgtPmZvckFsbCh2IHwgdi5vY2xJc0tpbmRPZihTdGF0ZSkgaW1wbGllcwotKHYub2NsQXNUeXBlKFN0YXRlKS5lbnRyeS0+aXNFbXB0eSgpIGFuZCB2Lm9jbEFzVHlwZShTdGF0ZSkuZXhpdC0+aXNFbXB0eSgpIGFuZCB2Lm9jbEFzVHlwZShTdGF0ZSkuZG9BY3Rpdml0eS0+aXNFbXB0eSgpKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQcm90b2NvbFN0YXRlTWFjaGluZS1wcm90b2NvbF90cmFuc2l0aW9ucyIgbmFtZT0icHJvdG9jb2xfdHJhbnNpdGlvbnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUtcHJvdG9jb2xfdHJhbnNpdGlvbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm90b2NvbFN0YXRlTWFjaGluZS1wcm90b2NvbF90cmFuc2l0aW9ucyI+Ci0gICAgICAgICAgPGJvZHk+QWxsIFRyYW5zaXRpb25zIG9mIGEgUHJvdG9jb2xTdGF0ZU1hY2hpbmUgbXVzdCBiZSBQcm90b2NvbFRyYW5zaXRpb25zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQcm90b2NvbFN0YXRlTWFjaGluZS1wcm90b2NvbF90cmFuc2l0aW9ucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cmVnaW9uLT5mb3JBbGwociB8IHIudHJhbnNpdGlvbi0+Zm9yQWxsKHQgfCB0Lm9jbElzVHlwZU9mKFByb3RvY29sVHJhbnNpdGlvbikpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJQcm90b2NvbFN0YXRlTWFjaGluZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iU3RhdGVNYWNoaW5lIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQcm90b2NvbFN0YXRlTWFjaGluZS1jb25mb3JtYW5jZSIgbmFtZT0iY29uZm9ybWFuY2UiIHR5cGU9IlByb3RvY29sQ29uZm9ybWFuY2UiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3NvdXJjZV9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCBFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfY29uZm9ybWFuY2Vfc3BlY2lmaWNNYWNoaW5lIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3RvY29sU3RhdGVNYWNoaW5lLWNvbmZvcm1hbmNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUtY29uZm9ybWFuY2UiPgotICAgICAgICAgIDxib2R5PkNvbmZvcm1hbmNlIGJldHdlZW4gUHJvdG9jb2xTdGF0ZU1hY2hpbmU8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlByb3RvY29sU3RhdGVNYWNoaW5lLWNvbmZvcm1hbmNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUtY29uZm9ybWFuY2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJQcm90b2NvbFRyYW5zaXRpb24iIG5hbWU9IlByb3RvY29sVHJhbnNpdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvdG9jb2xUcmFuc2l0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBQcm90b2NvbFRyYW5zaXRpb24gc3BlY2lmaWVzIGEgbGVnYWwgVHJhbnNpdGlvbiBmb3IgYW4gT3BlcmF0aW9uLiBUcmFuc2l0aW9ucyBvZiBQcm90b2NvbFN0YXRlTWFjaGluZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiBhIHByZS1jb25kaXRpb24gKGd1YXJkKSwgYSBUcmlnZ2VyLCBhbmQgYSBwb3N0LWNvbmRpdGlvbi4gRXZlcnkgUHJvdG9jb2xUcmFuc2l0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhdCBtb3N0IG9uZSBCZWhhdmlvcmFsRmVhdHVyZSBiZWxvbmdpbmcgdG8gdGhlIGNvbnRleHQgQ2xhc3NpZmllciBvZiB0aGUgUHJvdG9jb2xTdGF0ZU1hY2hpbmUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXJlZmVyc190b19vcGVyYXRpb24iIG5hbWU9InJlZmVyc190b19vcGVyYXRpb24iIGNvbnN0cmFpbmVkRWxlbWVudD0iUHJvdG9jb2xUcmFuc2l0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3RvY29sVHJhbnNpdGlvbi1yZWZlcnNfdG9fb3BlcmF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvdG9jb2xUcmFuc2l0aW9uLXJlZmVyc190b19vcGVyYXRpb24iPgotICAgICAgICAgIDxib2R5PklmIGEgUHJvdG9jb2xUcmFuc2l0aW9uIHJlZmVycyB0byBhbiBPcGVyYXRpb24gKGkuZS4sIGhhcyBhIENhbGxFdmVudCB0cmlnZ2VyIGNvcnJlc3BvbmRpbmcgdG8gYW4gT3BlcmF0aW9uKSwgdGhlbiB0aGF0IE9wZXJhdGlvbiBzaG91bGQgYXBwbHkgdG8gdGhlIGNvbnRleHQgQ2xhc3NpZmllciBvZiB0aGUgU3RhdGVNYWNoaW5lIG9mIHRoZSBQcm90b2NvbFRyYW5zaXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb3RvY29sVHJhbnNpdGlvbi1yZWZlcnNfdG9fb3BlcmF0aW9uLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pZiAocmVmZXJyZWQoKS0+bm90RW1wdHkoKSBhbmQgY29udGFpbmluZ1N0YXRlTWFjaGluZSgpLl8nY29udGV4dCctPm5vdEVtcHR5KCkpIHRoZW4gJiN4RDsKLSAgICBjb250YWluaW5nU3RhdGVNYWNoaW5lKCkuXydjb250ZXh0Jy5vY2xBc1R5cGUoQmVoYXZpb3JlZENsYXNzaWZpZXIpLmFsbEZlYXR1cmVzKCktPmluY2x1ZGVzQWxsKHJlZmVycmVkKCkpJiN4RDsKLWVsc2UgdHJ1ZSBlbmRpZjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLWFzc29jaWF0ZWRfYWN0aW9ucyIgbmFtZT0iYXNzb2NpYXRlZF9hY3Rpb25zIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb3RvY29sVHJhbnNpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm90b2NvbFRyYW5zaXRpb24tYXNzb2NpYXRlZF9hY3Rpb25zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvdG9jb2xUcmFuc2l0aW9uLWFzc29jaWF0ZWRfYWN0aW9ucyI+Ci0gICAgICAgICAgPGJvZHk+QSBQcm90b2NvbFRyYW5zaXRpb24gbmV2ZXIgaGFzIGFzc29jaWF0ZWQgQmVoYXZpb3JzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQcm90b2NvbFRyYW5zaXRpb24tYXNzb2NpYXRlZF9hY3Rpb25zLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5lZmZlY3QgPSBudWxsPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQcm90b2NvbFRyYW5zaXRpb24tYmVsb25nc190b19wc20iIG5hbWU9ImJlbG9uZ3NfdG9fcHNtIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlByb3RvY29sVHJhbnNpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm90b2NvbFRyYW5zaXRpb24tYmVsb25nc190b19wc20tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm90b2NvbFRyYW5zaXRpb24tYmVsb25nc190b19wc20iPgotICAgICAgICAgIDxib2R5PkEgUHJvdG9jb2xUcmFuc2l0aW9uIGFsd2F5cyBiZWxvbmdzIHRvIGEgUHJvdG9jb2xTdGF0ZU1hY2hpbmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlByb3RvY29sVHJhbnNpdGlvbi1iZWxvbmdzX3RvX3BzbS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+Y29udGFpbmVyLmJlbG9uZ3NUb1BTTSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlByb3RvY29sVHJhbnNpdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iVHJhbnNpdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXBvc3RDb25kaXRpb24iIG5hbWU9InBvc3RDb25kaXRpb24iIHR5cGU9IkNvbnN0cmFpbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRSdWxlIiBhc3NvY2lhdGlvbj0iQV9wb3N0Q29uZGl0aW9uX293bmluZ1RyYW5zaXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXBvc3RDb25kaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm90b2NvbFRyYW5zaXRpb24tcG9zdENvbmRpdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBwb3N0IGNvbmRpdGlvbiBvZiB0aGUgVHJhbnNpdGlvbiB3aGljaCBpcyB0aGUgQ29uZGl0aW9uIHRoYXQgc2hvdWxkIGJlIG9idGFpbmVkIG9uY2UgdGhlIFRyYW5zaXRpb24gaXMgdHJpZ2dlcmVkLiBUaGlzIHBvc3QgY29uZGl0aW9uIGlzIHBhcnQgb2YgdGhlIHBvc3QgY29uZGl0aW9uIG9mIHRoZSBPcGVyYXRpb24gY29ubmVjdGVkIHRvIHRoZSBUcmFuc2l0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXBvc3RDb25kaXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQcm90b2NvbFRyYW5zaXRpb24tcHJlQ29uZGl0aW9uIiBuYW1lPSJwcmVDb25kaXRpb24iIHR5cGU9IkNvbnN0cmFpbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJUcmFuc2l0aW9uLWd1YXJkIiBhc3NvY2lhdGlvbj0iQV9wcmVDb25kaXRpb25fcHJvdG9jb2xUcmFuc2l0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlByb3RvY29sVHJhbnNpdGlvbi1wcmVDb25kaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm90b2NvbFRyYW5zaXRpb24tcHJlQ29uZGl0aW9uIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhlIHByZWNvbmRpdGlvbiBvZiB0aGUgVHJhbnNpdGlvbi4gSXQgc3BlY2lmaWVzIHRoZSBDb25kaXRpb24gdGhhdCBzaG91bGQgYmUgdmVyaWZpZWQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIFRyYW5zaXRpb24uIFRoaXMgZ3VhcmQgY29uZGl0aW9uIGFkZGVkIHRvIHRoZSBzb3VyY2UgU3RhdGUgd2lsbCBiZSBldmFsdWF0ZWQgYXMgcGFydCBvZiB0aGUgcHJlY29uZGl0aW9uIG9mIHRoZSBPcGVyYXRpb24gcmVmZXJyZWQgYnkgdGhlIFRyYW5zaXRpb24gaWYgYW55LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXByZUNvbmRpdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlByb3RvY29sVHJhbnNpdGlvbi1yZWZlcnJlZCIgbmFtZT0icmVmZXJyZWQiIHR5cGU9Ik9wZXJhdGlvbiIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9yZWZlcnJlZF9wcm90b2NvbFRyYW5zaXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXJlZmVycmVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvdG9jb2xUcmFuc2l0aW9uLXJlZmVycmVkIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlZmVycyB0byB0aGUgYXNzb2NpYXRlZCBPcGVyYXRpb24uIEl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgT3BlcmF0aW9uIG9mIHRoZSBDYWxsRXZlbnQgVHJpZ2dlciB3aGVuIGFwcGxpY2FibGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQcm90b2NvbFRyYW5zaXRpb24tcmVmZXJyZWQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcm90b2NvbFRyYW5zaXRpb24tcmVmZXJyZWQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXJlZmVycmVkLjEiIG5hbWU9InJlZmVycmVkIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IlByb3RvY29sVHJhbnNpdGlvbi1yZWZlcnJlZC4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXJlZmVycmVkLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQcm90b2NvbFRyYW5zaXRpb24tcmVmZXJyZWQuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgUHJvdG9jb2xUcmFuc2l0aW9uOjovcmVmZXJyZWQ8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXJlZmVycmVkLjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJQcm90b2NvbFRyYW5zaXRpb24tcmVmZXJyZWQuMSBQcm90b2NvbFRyYW5zaXRpb24tcmVmZXJyZWQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQcm90b2NvbFRyYW5zaXRpb24tcmVmZXJyZWQuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHRyaWdnZXItPmNvbGxlY3QoZXZlbnQpLT5zZWxlY3Qob2NsSXNLaW5kT2YoQ2FsbEV2ZW50KSktPmNvbGxlY3Qob2NsQXNUeXBlKENhbGxFdmVudCkub3BlcmF0aW9uKS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXJlZmVycmVkLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9Ik9wZXJhdGlvbiIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHJvdG9jb2xUcmFuc2l0aW9uLXJlZmVycmVkLjEtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQcm90b2NvbFRyYW5zaXRpb24tcmVmZXJyZWQuMS1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJQc2V1ZG9zdGF0ZSIgbmFtZT0iUHNldWRvc3RhdGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBzZXVkb3N0YXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHNldWRvc3RhdGUiPgotICAgICAgICA8Ym9keT5BIFBzZXVkb3N0YXRlIGlzIGFuIGFic3RyYWN0aW9uIHRoYXQgZW5jb21wYXNzZXMgZGlmZmVyZW50IHR5cGVzIG9mIHRyYW5zaWVudCBWZXJ0aWNlcyBpbiB0aGUgU3RhdGVNYWNoaW5lIGdyYXBoLiBBIFN0YXRlTWFjaGluZSBpbnN0YW5jZSBuZXZlciBjb21lcyB0byByZXN0IGluIGEgUHNldWRvc3RhdGUsIGluc3RlYWQsIGl0IHdpbGwgZXhpdCBhbmQgZW50ZXIgdGhlIFBzZXVkb3N0YXRlIHdpdGhpbiBhIHNpbmdsZSBydW4tdG8tY29tcGxldGlvbiBzdGVwLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBzZXVkb3N0YXRlLXRyYW5zaXRpb25zX291dGdvaW5nIiBuYW1lPSJ0cmFuc2l0aW9uc19vdXRnb2luZyIgY29uc3RyYWluZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQc2V1ZG9zdGF0ZS10cmFuc2l0aW9uc19vdXRnb2luZy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBzZXVkb3N0YXRlLXRyYW5zaXRpb25zX291dGdvaW5nIj4KLSAgICAgICAgICA8Ym9keT5BbGwgdHJhbnNpdGlvbnMgb3V0Z29pbmcgYSBmb3JrIHZlcnRleCBtdXN0IHRhcmdldCBzdGF0ZXMgaW4gZGlmZmVyZW50IHJlZ2lvbnMgb2YgYW4gb3J0aG9nb25hbCBzdGF0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHNldWRvc3RhdGUtdHJhbnNpdGlvbnNfb3V0Z29pbmctX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihraW5kID0gUHNldWRvc3RhdGVLaW5kOjpmb3JrKSBpbXBsaWVzJiN4RDsKLSYjeEQ7Ci0tLSBmb3IgYW55IHBhaXIgb2Ygb3V0Z29pbmcgdHJhbnNpdGlvbnMgdGhlcmUgZXhpc3RzIGFuIG9ydGhvZ29uYWwgc3RhdGUgd2hpY2ggY29udGFpbnMgdGhlIHRhcmdldHMgb2YgdGhlc2UgdHJhbnNpdGlvbnMgJiN4RDsKLS0tIHN1Y2ggdGhhdCB0aGVzZSB0YXJnZXRzIGJlbG9uZyB0byBkaWZmZXJlbnQgcmVnaW9ucyBvZiB0aGF0IG9ydGhvZ29uYWwgc3RhdGUgJiN4RDsKLSYjeEQ7Ci1vdXRnb2luZy0+Zm9yQWxsKHQxOlRyYW5zaXRpb24sIHQyOlRyYW5zaXRpb24gfCBsZXQgY29udFN0YXRlOlN0YXRlID0gY29udGFpbmluZ1N0YXRlTWFjaGluZSgpLkxDQVN0YXRlKHQxLnRhcmdldCwgdDIudGFyZ2V0KSBpbiYjeEQ7Ci0JKChjb250U3RhdGUgJmx0Oz4gbnVsbCkgYW5kIChjb250U3RhdGUucmVnaW9uJiN4RDsKLQkJLT5leGlzdHMocjE6UmVnaW9uLCByMjogUmVnaW9uIHwgKHIxICZsdDs+IHIyKSBhbmQgdDEudGFyZ2V0LmlzQ29udGFpbmVkSW5SZWdpb24ocjEpIGFuZCB0Mi50YXJnZXQuaXNDb250YWluZWRJblJlZ2lvbihyMikpKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1jaG9pY2VfdmVydGV4IiBuYW1lPSJjaG9pY2VfdmVydGV4IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBzZXVkb3N0YXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBzZXVkb3N0YXRlLWNob2ljZV92ZXJ0ZXgtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZS1jaG9pY2VfdmVydGV4Ij4KLSAgICAgICAgICA8Ym9keT5JbiBhIGNvbXBsZXRlIHN0YXRlbWFjaGluZSwgYSBjaG9pY2UgVmVydGV4IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgaW5jb21pbmcgYW5kIG9uZSBvdXRnb2luZyBUcmFuc2l0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1jaG9pY2VfdmVydGV4LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oa2luZCA9IFBzZXVkb3N0YXRlS2luZDo6Y2hvaWNlKSBpbXBsaWVzIChpbmNvbWluZy0+c2l6ZSgpID49IDEgYW5kIG91dGdvaW5nLT5zaXplKCkgPj0gMSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBzZXVkb3N0YXRlLW91dGdvaW5nX2Zyb21faW5pdGlhbCIgbmFtZT0ib3V0Z29pbmdfZnJvbV9pbml0aWFsIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBzZXVkb3N0YXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBzZXVkb3N0YXRlLW91dGdvaW5nX2Zyb21faW5pdGlhbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBzZXVkb3N0YXRlLW91dGdvaW5nX2Zyb21faW5pdGlhbCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG91dGdvaW5nIFRyYW5zaXRpb24gZnJvbSBhbiBpbml0aWFsIHZlcnRleCBtYXkgaGF2ZSBhIGJlaGF2aW9yLCBidXQgbm90IGEgdHJpZ2dlciBvciBhIGd1YXJkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1vdXRnb2luZ19mcm9tX2luaXRpYWwtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihraW5kID0gUHNldWRvc3RhdGVLaW5kOjppbml0aWFsKSBpbXBsaWVzIChvdXRnb2luZy5ndWFyZCA9IG51bGwgYW5kIG91dGdvaW5nLnRyaWdnZXItPmlzRW1wdHkoKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBzZXVkb3N0YXRlLWpvaW5fdmVydGV4IiBuYW1lPSJqb2luX3ZlcnRleCIgY29uc3RyYWluZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1qb2luX3ZlcnRleC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBzZXVkb3N0YXRlLWpvaW5fdmVydGV4Ij4KLSAgICAgICAgICA8Ym9keT5JbiBhIGNvbXBsZXRlIFN0YXRlTWFjaGluZSwgYSBqb2luIFZlcnRleCBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGluY29taW5nIFRyYW5zaXRpb25zIGFuZCBleGFjdGx5IG9uZSBvdXRnb2luZyBUcmFuc2l0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1qb2luX3ZlcnRleC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KGtpbmQgPSBQc2V1ZG9zdGF0ZUtpbmQ6OmpvaW4pIGltcGxpZXMgKG91dGdvaW5nLT5zaXplKCkgPSAxIGFuZCBpbmNvbWluZy0+c2l6ZSgpID49IDIpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1qdW5jdGlvbl92ZXJ0ZXgiIG5hbWU9Imp1bmN0aW9uX3ZlcnRleCIgY29uc3RyYWluZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1qdW5jdGlvbl92ZXJ0ZXgtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZS1qdW5jdGlvbl92ZXJ0ZXgiPgotICAgICAgICAgIDxib2R5PkluIGEgY29tcGxldGUgU3RhdGVNYWNoaW5lLCBhIGp1bmN0aW9uIFZlcnRleCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGluY29taW5nIGFuZCBvbmUgb3V0Z29pbmcgVHJhbnNpdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHNldWRvc3RhdGUtanVuY3Rpb25fdmVydGV4LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oa2luZCA9IFBzZXVkb3N0YXRlS2luZDo6anVuY3Rpb24pIGltcGxpZXMgKGluY29taW5nLT5zaXplKCkgPj0gMSBhbmQgb3V0Z29pbmctPnNpemUoKSA+PSAxKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHNldWRvc3RhdGUtaGlzdG9yeV92ZXJ0aWNlcyIgbmFtZT0iaGlzdG9yeV92ZXJ0aWNlcyIgY29uc3RyYWluZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1oaXN0b3J5X3ZlcnRpY2VzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHNldWRvc3RhdGUtaGlzdG9yeV92ZXJ0aWNlcyI+Ci0gICAgICAgICAgPGJvZHk+SGlzdG9yeSBWZXJ0aWNlcyBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBvdXRnb2luZyBUcmFuc2l0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1oaXN0b3J5X3ZlcnRpY2VzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oKGtpbmQgPSBQc2V1ZG9zdGF0ZUtpbmQ6OmRlZXBIaXN0b3J5KSBvciAoa2luZCA9IFBzZXVkb3N0YXRlS2luZDo6c2hhbGxvd0hpc3RvcnkpKSBpbXBsaWVzIChvdXRnb2luZy0+c2l6ZSgpICZsdDs9IDEpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1pbml0aWFsX3ZlcnRleCIgbmFtZT0iaW5pdGlhbF92ZXJ0ZXgiIGNvbnN0cmFpbmVkRWxlbWVudD0iUHNldWRvc3RhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHNldWRvc3RhdGUtaW5pdGlhbF92ZXJ0ZXgtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZS1pbml0aWFsX3ZlcnRleCI+Ci0gICAgICAgICAgPGJvZHk+QW4gaW5pdGlhbCBWZXJ0ZXggY2FuIGhhdmUgYXQgbW9zdCBvbmUgb3V0Z29pbmcgVHJhbnNpdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHNldWRvc3RhdGUtaW5pdGlhbF92ZXJ0ZXgtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihraW5kID0gUHNldWRvc3RhdGVLaW5kOjppbml0aWFsKSBpbXBsaWVzIChvdXRnb2luZy0+c2l6ZSgpICZsdDs9IDEpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1mb3JrX3ZlcnRleCIgbmFtZT0iZm9ya192ZXJ0ZXgiIGNvbnN0cmFpbmVkRWxlbWVudD0iUHNldWRvc3RhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHNldWRvc3RhdGUtZm9ya192ZXJ0ZXgtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZS1mb3JrX3ZlcnRleCI+Ci0gICAgICAgICAgPGJvZHk+SW4gYSBjb21wbGV0ZSBTdGF0ZU1hY2hpbmUsIGEgZm9yayBWZXJ0ZXggbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBvdXRnb2luZyBUcmFuc2l0aW9ucyBhbmQgZXhhY3RseSBvbmUgaW5jb21pbmcgVHJhbnNpdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUHNldWRvc3RhdGUtZm9ya192ZXJ0ZXgtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihraW5kID0gUHNldWRvc3RhdGVLaW5kOjpmb3JrKSBpbXBsaWVzIChpbmNvbWluZy0+c2l6ZSgpID0gMSBhbmQgb3V0Z29pbmctPnNpemUoKSA+PSAyKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUHNldWRvc3RhdGUtdHJhbnNpdGlvbnNfaW5jb21pbmciIG5hbWU9InRyYW5zaXRpb25zX2luY29taW5nIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBzZXVkb3N0YXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBzZXVkb3N0YXRlLXRyYW5zaXRpb25zX2luY29taW5nLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHNldWRvc3RhdGUtdHJhbnNpdGlvbnNfaW5jb21pbmciPgotICAgICAgICAgIDxib2R5PkFsbCBUcmFuc2l0aW9ucyBpbmNvbWluZyBhIGpvaW4gVmVydGV4IG11c3Qgb3JpZ2luYXRlIGluIGRpZmZlcmVudCBSZWdpb25zIG9mIGFuIG9ydGhvZ29uYWwgU3RhdGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBzZXVkb3N0YXRlLXRyYW5zaXRpb25zX2luY29taW5nLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oa2luZCA9IFBzZXVkb3N0YXRlS2luZDo6am9pbikgaW1wbGllcwotCi0tLSBmb3IgYW55IHBhaXIgb2YgaW5jb21pbmcgdHJhbnNpdGlvbnMgdGhlcmUgZXhpc3RzIGFuIG9ydGhvZ29uYWwgc3RhdGUgd2hpY2ggY29udGFpbnMgdGhlIHNvdXJjZSB2ZXRpY2VzIG9mIHRoZXNlIHRyYW5zaXRpb25zIAotLS0gc3VjaCB0aGF0IHRoZXNlIHNvdXJjZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gZGlmZmVyZW50IHJlZ2lvbnMgb2YgdGhhdCBvcnRob2dvbmFsIHN0YXRlIAotCi1pbmNvbWluZy0+Zm9yQWxsKHQxOlRyYW5zaXRpb24sIHQyOlRyYW5zaXRpb24gfCBsZXQgY29udFN0YXRlOlN0YXRlID0gY29udGFpbmluZ1N0YXRlTWFjaGluZSgpLkxDQVN0YXRlKHQxLnNvdXJjZSwgdDIuc291cmNlKSBpbgotCSgoY29udFN0YXRlICZsdDs+IG51bGwpIGFuZCAoY29udFN0YXRlLnJlZ2lvbgotCQktPmV4aXN0cyhyMTpSZWdpb24sIHIyOiBSZWdpb24gfCAocjEgJmx0Oz4gcjIpIGFuZCB0MS5zb3VyY2UuaXNDb250YWluZWRJblJlZ2lvbihyMSkgYW5kIHQyLnNvdXJjZS5pc0NvbnRhaW5lZEluUmVnaW9uKHIyKSkpKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUHNldWRvc3RhdGUtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlZlcnRleCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUHNldWRvc3RhdGUta2luZCIgbmFtZT0ia2luZCIgdHlwZT0iUHNldWRvc3RhdGVLaW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBzZXVkb3N0YXRlLWtpbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZS1raW5kIj4KLSAgICAgICAgICA8Ym9keT5EZXRlcm1pbmVzIHRoZSBwcmVjaXNlIHR5cGUgb2YgdGhlIFBzZXVkb3N0YXRlIGFuZCBjYW4gYmUgb25lIG9mOiBlbnRyeVBvaW50LCBleGl0UG9pbnQsIGluaXRpYWwsIGRlZXBIaXN0b3J5LCBzaGFsbG93SGlzdG9yeSwgam9pbiwgZm9yaywganVuY3Rpb24sIHRlcm1pbmF0ZSBvciBjaG9pY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkluc3RhbmNlVmFsdWUiIHhtaTppZD0iUHNldWRvc3RhdGUta2luZC1fZGVmYXVsdFZhbHVlIiB0eXBlPSJQc2V1ZG9zdGF0ZUtpbmQiIGluc3RhbmNlPSJQc2V1ZG9zdGF0ZUtpbmQtaW5pdGlhbCIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBzZXVkb3N0YXRlLXN0YXRlIiBuYW1lPSJzdGF0ZSIgdHlwZT0iU3RhdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9jb25uZWN0aW9uUG9pbnRfc3RhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHNldWRvc3RhdGUtc3RhdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZS1zdGF0ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFN0YXRlIHRoYXQgb3ducyB0aGlzIFBzZXVkb3N0YXRlIGFuZCBpbiB3aGljaCBpdCBhcHBlYXJzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUHNldWRvc3RhdGUtc3RhdGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1zdGF0ZU1hY2hpbmUiIG5hbWU9InN0YXRlTWFjaGluZSIgdHlwZT0iU3RhdGVNYWNoaW5lIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfY29ubmVjdGlvblBvaW50X3N0YXRlTWFjaGluZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1zdGF0ZU1hY2hpbmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZS1zdGF0ZU1hY2hpbmUiPgotICAgICAgICAgIDxib2R5PlRoZSBTdGF0ZU1hY2hpbmUgaW4gd2hpY2ggdGhpcyBQc2V1ZG9zdGF0ZSBpcyBkZWZpbmVkLiBUaGlzIG9ubHkgYXBwbGllcyB0byBQc2V1ZG9zdGF0ZXMgb2YgdGhlIGtpbmQgZW50cnlQb2ludCBvciBleGl0UG9pbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQc2V1ZG9zdGF0ZS1zdGF0ZU1hY2hpbmUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlJlZ2lvbiIgbmFtZT0iUmVnaW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWdpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWdpb24iPgotICAgICAgICA8Ym9keT5BIFJlZ2lvbiBpcyBhIHRvcC1sZXZlbCBwYXJ0IG9mIGEgU3RhdGVNYWNoaW5lIG9yIGEgY29tcG9zaXRlIFN0YXRlLCB0aGF0IHNlcnZlcyBhcyBhIGNvbnRhaW5lciBmb3IgdGhlIFZlcnRpY2VzIGFuZCBUcmFuc2l0aW9ucyBvZiB0aGUgU3RhdGVNYWNoaW5lLiBBIFN0YXRlTWFjaGluZSBvciBjb21wb3NpdGUgU3RhdGUgbWF5IGNvbnRhaW4gbXVsdGlwbGUgUmVnaW9ucyByZXByZXNlbnRpbmcgYmVoYXZpb3JzIHRoYXQgbWF5IG9jY3VyIGluIHBhcmFsbGVsLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlZ2lvbi1kZWVwX2hpc3RvcnlfdmVydGV4IiBuYW1lPSJkZWVwX2hpc3RvcnlfdmVydGV4IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZ2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWdpb24tZGVlcF9oaXN0b3J5X3ZlcnRleC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZ2lvbi1kZWVwX2hpc3RvcnlfdmVydGV4Ij4KLSAgICAgICAgICA8Ym9keT5BIFJlZ2lvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBkZWVwIGhpc3RvcnkgVmVydGV4LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWdpb24tZGVlcF9oaXN0b3J5X3ZlcnRleC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2VsZi5zdWJ2ZXJ0ZXgtPnNlbGVjdCAob2NsSXNLaW5kT2YoUHNldWRvc3RhdGUpKS0+Y29sbGVjdChvY2xBc1R5cGUoUHNldWRvc3RhdGUpKS0+Ci0gICBzZWxlY3Qoa2luZCA9IFBzZXVkb3N0YXRlS2luZDo6ZGVlcEhpc3RvcnkpLT5zaXplKCkgJmx0Oz0gMTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVnaW9uLXNoYWxsb3dfaGlzdG9yeV92ZXJ0ZXgiIG5hbWU9InNoYWxsb3dfaGlzdG9yeV92ZXJ0ZXgiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVnaW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlZ2lvbi1zaGFsbG93X2hpc3RvcnlfdmVydGV4LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVnaW9uLXNoYWxsb3dfaGlzdG9yeV92ZXJ0ZXgiPgotICAgICAgICAgIDxib2R5PkEgUmVnaW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIHNoYWxsb3cgaGlzdG9yeSBWZXJ0ZXguPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlJlZ2lvbi1zaGFsbG93X2hpc3RvcnlfdmVydGV4LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zdWJ2ZXJ0ZXgtPnNlbGVjdChvY2xJc0tpbmRPZihQc2V1ZG9zdGF0ZSkpLT5jb2xsZWN0KG9jbEFzVHlwZShQc2V1ZG9zdGF0ZSkpLT4KLSAgc2VsZWN0KGtpbmQgPSBQc2V1ZG9zdGF0ZUtpbmQ6OnNoYWxsb3dIaXN0b3J5KS0+c2l6ZSgpICZsdDs9IDE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlZ2lvbi1vd25lZCIgbmFtZT0ib3duZWQiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVnaW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlZ2lvbi1vd25lZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZ2lvbi1vd25lZCI+Ci0gICAgICAgICAgPGJvZHk+SWYgYSBSZWdpb24gaXMgb3duZWQgYnkgYSBTdGF0ZU1hY2hpbmUsIHRoZW4gaXQgY2Fubm90IGFsc28gYmUgb3duZWQgYnkgYSBTdGF0ZSBhbmQgdmljZSB2ZXJzYS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVnaW9uLW93bmVkLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oc3RhdGVNYWNoaW5lICZsdDs+IG51bGwgaW1wbGllcyBzdGF0ZSA9IG51bGwpIGFuZCAoc3RhdGUgJmx0Oz4gbnVsbCBpbXBsaWVzIHN0YXRlTWFjaGluZSA9IG51bGwpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWdpb24taW5pdGlhbF92ZXJ0ZXgiIG5hbWU9ImluaXRpYWxfdmVydGV4IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZ2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWdpb24taW5pdGlhbF92ZXJ0ZXgtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWdpb24taW5pdGlhbF92ZXJ0ZXgiPgotICAgICAgICAgIDxib2R5PkEgUmVnaW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGluaXRpYWwgVmVydGV4LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWdpb24taW5pdGlhbF92ZXJ0ZXgtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnNlbGYuc3VidmVydGV4LT5zZWxlY3QgKG9jbElzS2luZE9mKFBzZXVkb3N0YXRlKSktPmNvbGxlY3Qob2NsQXNUeXBlKFBzZXVkb3N0YXRlKSktPgotICBzZWxlY3Qoa2luZCA9IFBzZXVkb3N0YXRlS2luZDo6aW5pdGlhbCktPnNpemUoKSAmbHQ7PSAxPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlJlZ2lvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJSZWdpb24tX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IlJlZGVmaW5hYmxlRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVnaW9uLWV4dGVuZGVkUmVnaW9uIiBuYW1lPSJleHRlbmRlZFJlZ2lvbiIgdHlwZT0iUmVnaW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2V4dGVuZGVkUmVnaW9uX3JlZ2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWdpb24tZXh0ZW5kZWRSZWdpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWdpb24tZXh0ZW5kZWRSZWdpb24iPgotICAgICAgICAgIDxib2R5PlRoZSByZWdpb24gb2Ygd2hpY2ggdGhpcyByZWdpb24gaXMgYW4gZXh0ZW5zaW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUmVnaW9uLWV4dGVuZGVkUmVnaW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUmVnaW9uLXJlZGVmaW5pdGlvbkNvbnRleHQiIG5hbWU9InJlZGVmaW5pdGlvbkNvbnRleHQiIHR5cGU9IkNsYXNzaWZpZXIiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgcmVkZWZpbmVkUHJvcGVydHk9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluaXRpb25Db250ZXh0IiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluaXRpb25Db250ZXh0X3JlZ2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWdpb24tcmVkZWZpbml0aW9uQ29udGV4dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZ2lvbi1yZWRlZmluaXRpb25Db250ZXh0Ij4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBDbGFzc2lmaWVyIGluIHdoaWNoIGNvbnRleHQgdGhpcyBlbGVtZW50IG1heSBiZSByZWRlZmluZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZWdpb24tc3RhdGUiIG5hbWU9InN0YXRlIiB0eXBlPSJTdGF0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX3JlZ2lvbl9zdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWdpb24tc3RhdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWdpb24tc3RhdGUiPgotICAgICAgICAgIDxib2R5PlRoZSBTdGF0ZSB0aGF0IG93bnMgdGhlIFJlZ2lvbi4gSWYgYSBSZWdpb24gaXMgb3duZWQgYnkgYSBTdGF0ZSwgdGhlbiBpdCBjYW5ub3QgYWxzbyBiZSBvd25lZCBieSBhIFN0YXRlTWFjaGluZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlJlZ2lvbi1zdGF0ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlZ2lvbi1zdGF0ZU1hY2hpbmUiIG5hbWU9InN0YXRlTWFjaGluZSIgdHlwZT0iU3RhdGVNYWNoaW5lIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfcmVnaW9uX3N0YXRlTWFjaGluZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWdpb24tc3RhdGVNYWNoaW5lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVnaW9uLXN0YXRlTWFjaGluZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFN0YXRlTWFjaGluZSB0aGF0IG93bnMgdGhlIFJlZ2lvbi4gSWYgYSBSZWdpb24gaXMgb3duZWQgYnkgYSBTdGF0ZU1hY2hpbmUsIHRoZW4gaXQgY2Fubm90IGFsc28gYmUgb3duZWQgYnkgYSBTdGF0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlJlZ2lvbi1zdGF0ZU1hY2hpbmUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZWdpb24tc3VidmVydGV4IiBuYW1lPSJzdWJ2ZXJ0ZXgiIHR5cGU9IlZlcnRleCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfc3VidmVydGV4X2NvbnRhaW5lciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWdpb24tc3VidmVydGV4LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUmVnaW9uLXN1YnZlcnRleCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNldCBvZiBWZXJ0aWNlcyB0aGF0IGFyZSBvd25lZCBieSB0aGlzIFJlZ2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlJlZ2lvbi1zdWJ2ZXJ0ZXgtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJSZWdpb24tc3VidmVydGV4LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlZ2lvbi10cmFuc2l0aW9uIiBuYW1lPSJ0cmFuc2l0aW9uIiB0eXBlPSJUcmFuc2l0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV90cmFuc2l0aW9uX2NvbnRhaW5lciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWdpb24tdHJhbnNpdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZ2lvbi10cmFuc2l0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgc2V0IG9mIFRyYW5zaXRpb25zIG93bmVkIGJ5IHRoZSBSZWdpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJSZWdpb24tdHJhbnNpdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlJlZ2lvbi10cmFuc2l0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlJlZ2lvbi1iZWxvbmdzVG9QU00iIG5hbWU9ImJlbG9uZ3NUb1BTTSIgYm9keUNvbmRpdGlvbj0iUmVnaW9uLWJlbG9uZ3NUb1BTTS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlZ2lvbi1iZWxvbmdzVG9QU00tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWdpb24tYmVsb25nc1RvUFNNIj4KLSAgICAgICAgICA8Ym9keT5UaGUgb3BlcmF0aW9uIGJlbG9uZ3NUb1BTTSAoKSBjaGVja3MgaWYgdGhlIFJlZ2lvbiBiZWxvbmdzIHRvIGEgUHJvdG9jb2xTdGF0ZU1hY2hpbmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlZ2lvbi1iZWxvbmdzVG9QU00tc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJSZWdpb24tYmVsb25nc1RvUFNNIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVnaW9uLWJlbG9uZ3NUb1BTTS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmICBzdGF0ZU1hY2hpbmUgJmx0Oz4gbnVsbCAKLXRoZW4KLSAgc3RhdGVNYWNoaW5lLm9jbElzS2luZE9mKFByb3RvY29sU3RhdGVNYWNoaW5lKQotZWxzZSAKLSAgc3RhdGUgJmx0Oz4gbnVsbCAgaW1wbGllcyAgc3RhdGUuY29udGFpbmVyLmJlbG9uZ3NUb1BTTSgpCi1lbmRpZiApPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlJlZ2lvbi1iZWxvbmdzVG9QU00tcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUmVnaW9uLWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUiIG5hbWU9ImNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUiIGJvZHlDb25kaXRpb249IlJlZ2lvbi1jb250YWluaW5nU3RhdGVNYWNoaW5lLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVnaW9uLWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWdpb24tY29udGFpbmluZ1N0YXRlTWFjaGluZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG9wZXJhdGlvbiBjb250YWluaW5nU3RhdGVNYWNoaW5lKCkgcmV0dXJucyB0aGUgU3RhdGVNYWNoaW5lIGluIHdoaWNoIHRoaXMgUmVnaW9uIGlzIGRlZmluZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlZ2lvbi1jb250YWluaW5nU3RhdGVNYWNoaW5lLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iUmVnaW9uLWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWdpb24tY29udGFpbmluZ1N0YXRlTWFjaGluZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIHN0YXRlTWFjaGluZSA9IG51bGwgCi10aGVuCi0gIHN0YXRlLmNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUoKQotZWxzZQotICBzdGF0ZU1hY2hpbmUKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJSZWdpb24tY29udGFpbmluZ1N0YXRlTWFjaGluZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iU3RhdGVNYWNoaW5lIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlJlZ2lvbi1pc0NvbnNpc3RlbnRXaXRoIiBuYW1lPSJpc0NvbnNpc3RlbnRXaXRoIiBib2R5Q29uZGl0aW9uPSJSZWdpb24taXNDb25zaXN0ZW50V2l0aC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiBwcmVjb25kaXRpb249IlJlZ2lvbi1pc0NvbnNpc3RlbnRXaXRoLXByZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJSZWRlZmluYWJsZUVsZW1lbnQtaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWdpb24taXNDb25zaXN0ZW50V2l0aC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZ2lvbi1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNDb25zaXN0ZW50V2l0aCgpIHNwZWNpZmllcyB0aGF0IGEgcmVkZWZpbmluZyBSZWdpb24gaXMgY29uc2lzdGVudCB3aXRoIGEgcmVkZWZpbmVkIFJlZ2lvbiBwcm92aWRlZCB0aGF0IHRoZSByZWRlZmluaW5nIFJlZ2lvbiBpcyBhbiBleHRlbnNpb24gb2YgdGhlIFJlZGVmaW5lZCByZWdpb24sIGkuZS4sIGl0cyBWZXJ0aWNlcyBhbmQgVHJhbnNpdGlvbnMgY29uZm9ybSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzogKDEpIHRoZXkgYXJlIGVxdWFsIHRvIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhlIHJlZGVmaW5lZCBSZWdpb24gb3IsICgyKSB0aGV5IGNvbnNpc3RlbnRseSByZWRlZmluZSBhIFN0YXRlIG9yIFRyYW5zaXRpb24gb2YgdGhlIHJlZGVmaW5lZCByZWdpb24sIG9yICgzKSB0aGV5IGFkZCBuZXcgU3RhdGVzIG9yIFRyYW5zaXRpb25zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWdpb24taXNDb25zaXN0ZW50V2l0aC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZ2lvbi1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVnaW9uLWlzQ29uc2lzdGVudFdpdGgtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICgtLSB0aGUgZm9sbG93aW5nIGlzIG1lcmVseSBhIGRlZmF1bHQgYm9keTsgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgc3BlY2lmaWMgZm9ybSBvZiB0aGlzIGNvbnN0cmFpbnQgd2lsbCBiZSBzcGVjaWZpZWQgYnkgcHJvZmlsZXMmI3hEOwotdHJ1ZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlJlZ2lvbi1pc0NvbnNpc3RlbnRXaXRoLXByZSIgbmFtZT0icHJlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZ2lvbi1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUmVnaW9uLWlzQ29uc2lzdGVudFdpdGgtcHJlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVkZWZpbmluZ0VsZW1lbnQuaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQoc2VsZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUmVnaW9uLWlzQ29uc2lzdGVudFdpdGgtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlJlZ2lvbi1pc0NvbnNpc3RlbnRXaXRoLXJlZGVmaW5pbmdFbGVtZW50IiBuYW1lPSJyZWRlZmluaW5nRWxlbWVudCIgdHlwZT0iUmVkZWZpbmFibGVFbGVtZW50Ii8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUmVnaW9uLWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkIiBuYW1lPSJpc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZCIgYm9keUNvbmRpdGlvbj0iUmVnaW9uLWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlJlZ2lvbi1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZ2lvbi1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkKCkgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlZGVmaW5pdGlvbiBjb250ZXh0cyBvZiBhIFJlZ2lvbiBhcmUgcHJvcGVybHkgcmVsYXRlZCB0byB0aGUgcmVkZWZpbml0aW9uIGNvbnRleHRzIG9mIHRoZSBzcGVjaWZpZWQgUmVnaW9uIHRvIGFsbG93IHRoaXMgZWxlbWVudCB0byByZWRlZmluZSB0aGUgb3RoZXIuIFRoZSBjb250YWluaW5nIFN0YXRlTWFjaGluZSBvciBTdGF0ZSBvZiBhIHJlZGVmaW5pbmcgUmVnaW9uIG11c3QgUmVkZWZpbmUgdGhlIGNvbnRhaW5pbmcgU3RhdGVNYWNoaW5lIG9yIFN0YXRlIG9mIHRoZSByZWRlZmluZWQgUmVnaW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJSZWdpb24taXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJSZWdpb24taXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWdpb24taXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiByZWRlZmluZWRFbGVtZW50Lm9jbElzS2luZE9mKFJlZ2lvbikgdGhlbiYjeEQ7Ci0gIGxldCByZWRlZmluZWRSZWdpb24gOiBSZWdpb24gPSByZWRlZmluZWRFbGVtZW50Lm9jbEFzVHlwZShSZWdpb24pIGluJiN4RDsKLSAgICBpZiBzdGF0ZU1hY2hpbmUtPmlzRW1wdHkoKSB0aGVuJiN4RDsKLSAgICAtLSB0aGUgUmVnaW9uIGlzIG93bmVkIGJ5IGEgU3RhdGUmI3hEOwotICAgICAgKHN0YXRlLnJlZGVmaW5lZFN0YXRlLT5ub3RFbXB0eSgpIGFuZCBzdGF0ZS5yZWRlZmluZWRTdGF0ZS5yZWdpb24tPmluY2x1ZGVzKHJlZGVmaW5lZFJlZ2lvbikpJiN4RDsKLSAgICBlbHNlIC0tIHRoZSByZWdpb24gaXMgb3duZWQgYnkgYSBTdGF0ZU1hY2hpbmUmI3hEOwotICAgICAgKHN0YXRlTWFjaGluZS5leHRlbmRlZFN0YXRlTWFjaGluZS0+bm90RW1wdHkoKSBhbmQmI3hEOwotICAgICAgICBzdGF0ZU1hY2hpbmUuZXh0ZW5kZWRTdGF0ZU1hY2hpbmUtPmV4aXN0cyhzbSA6IFN0YXRlTWFjaGluZSB8JiN4RDsKLSAgICAgICAgICBzbS5yZWdpb24tPmluY2x1ZGVzKHJlZGVmaW5lZFJlZ2lvbikpKSYjeEQ7Ci0gICAgZW5kaWYmI3hEOwotZWxzZSYjeEQ7Ci0gIGZhbHNlJiN4RDsKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJSZWdpb24taXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlJlZ2lvbi1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZC1yZWRlZmluZWRFbGVtZW50IiBuYW1lPSJyZWRlZmluZWRFbGVtZW50IiB0eXBlPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJSZWdpb24tcmVkZWZpbml0aW9uQ29udGV4dC4xIiBuYW1lPSJyZWRlZmluaXRpb25Db250ZXh0IiBib2R5Q29uZGl0aW9uPSJSZWdpb24tcmVkZWZpbml0aW9uQ29udGV4dC4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVnaW9uLXJlZGVmaW5pdGlvbkNvbnRleHQuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlZ2lvbi1yZWRlZmluaXRpb25Db250ZXh0LjEiPgotICAgICAgICAgIDxib2R5PlRoZSByZWRlZmluaXRpb24gY29udGV4dCBvZiBhIFJlZ2lvbiBpcyB0aGUgbmVhcmVzdCBjb250YWluaW5nIFN0YXRlTWFjaGluZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVnaW9uLXJlZGVmaW5pdGlvbkNvbnRleHQuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlZ2lvbi1yZWRlZmluaXRpb25Db250ZXh0LjEgUmVnaW9uLXJlZGVmaW5pdGlvbkNvbnRleHQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWdpb24tcmVkZWZpbml0aW9uQ29udGV4dC4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobGV0IHNtIDogU3RhdGVNYWNoaW5lID0gY29udGFpbmluZ1N0YXRlTWFjaGluZSgpIGluCi1pZiBzbS5fJ2NvbnRleHQnID0gbnVsbCBvciBzbS5nZW5lcmFsLT5ub3RFbXB0eSgpIHRoZW4KLSAgc20KLWVsc2UKLSAgc20uXydjb250ZXh0JwotZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlJlZ2lvbi1yZWRlZmluaXRpb25Db250ZXh0LjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkNsYXNzaWZpZXIiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJTdGF0ZSIgbmFtZT0iU3RhdGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGUiPgotICAgICAgICA8Ym9keT5BIFN0YXRlIG1vZGVscyBhIHNpdHVhdGlvbiBkdXJpbmcgd2hpY2ggc29tZSAodXN1YWxseSBpbXBsaWNpdCkgaW52YXJpYW50IGNvbmRpdGlvbiBob2xkcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGF0ZS1lbnRyeV9vcl9leGl0IiBuYW1lPSJlbnRyeV9vcl9leGl0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0YXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlLWVudHJ5X29yX2V4aXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZS1lbnRyeV9vcl9leGl0Ij4KLSAgICAgICAgICA8Ym9keT5Pbmx5IGVudHJ5IG9yIGV4aXQgUHNldWRvc3RhdGVzIGNhbiBzZXJ2ZSBhcyBjb25uZWN0aW9uIHBvaW50cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGUtZW50cnlfb3JfZXhpdC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+Y29ubmVjdGlvblBvaW50LT5mb3JBbGwoa2luZCA9IFBzZXVkb3N0YXRlS2luZDo6ZW50cnlQb2ludCBvciBraW5kID0gUHNldWRvc3RhdGVLaW5kOjpleGl0UG9pbnQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGF0ZS1zdWJtYWNoaW5lX3N0YXRlcyIgbmFtZT0ic3VibWFjaGluZV9zdGF0ZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGUtc3VibWFjaGluZV9zdGF0ZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZS1zdWJtYWNoaW5lX3N0YXRlcyI+Ci0gICAgICAgICAgPGJvZHk+T25seSBzdWJtYWNoaW5lIFN0YXRlcyBjYW4gaGF2ZSBjb25uZWN0aW9uIHBvaW50IHJlZmVyZW5jZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0YXRlLXN1Ym1hY2hpbmVfc3RhdGVzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pc1N1Ym1hY2hpbmVTdGF0ZSBpbXBsaWVzIGNvbm5lY3Rpb24tPm5vdEVtcHR5KCApPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGF0ZS1jb21wb3NpdGVfc3RhdGVzIiBuYW1lPSJjb21wb3NpdGVfc3RhdGVzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0YXRlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlLWNvbXBvc2l0ZV9zdGF0ZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZS1jb21wb3NpdGVfc3RhdGVzIj4KLSAgICAgICAgICA8Ym9keT5Pbmx5IGNvbXBvc2l0ZSBTdGF0ZXMgY2FuIGhhdmUgZW50cnkgb3IgZXhpdCBQc2V1ZG9zdGF0ZXMgZGVmaW5lZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGUtY29tcG9zaXRlX3N0YXRlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+Y29ubmVjdGlvblBvaW50LT5ub3RFbXB0eSgpIGltcGxpZXMgaXNDb21wb3NpdGU8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0YXRlLWRlc3RpbmF0aW9uc19vcl9zb3VyY2VzX29mX3RyYW5zaXRpb25zIiBuYW1lPSJkZXN0aW5hdGlvbnNfb3Jfc291cmNlc19vZl90cmFuc2l0aW9ucyIgY29uc3RyYWluZWRFbGVtZW50PSJTdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1kZXN0aW5hdGlvbnNfb3Jfc291cmNlc19vZl90cmFuc2l0aW9ucy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLWRlc3RpbmF0aW9uc19vcl9zb3VyY2VzX29mX3RyYW5zaXRpb25zIj4KLSAgICAgICAgICA8Ym9keT5UaGUgY29ubmVjdGlvbiBwb2ludCByZWZlcmVuY2VzIHVzZWQgYXMgZGVzdGluYXRpb25zL3NvdXJjZXMgb2YgVHJhbnNpdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgc3VibWFjaGluZSBTdGF0ZSBtdXN0IGJlIGRlZmluZWQgYXMgZW50cnkvZXhpdCBwb2ludHMgaW4gdGhlIHN1Ym1hY2hpbmUgU3RhdGVNYWNoaW5lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGF0ZS1kZXN0aW5hdGlvbnNfb3Jfc291cmNlc19vZl90cmFuc2l0aW9ucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2VsZi5pc1N1Ym1hY2hpbmVTdGF0ZSBpbXBsaWVzIChzZWxmLmNvbm5lY3Rpb24tPmZvckFsbCAoY3AgfCYjeEQ7Ci0gIGNwLmVudHJ5LT5mb3JBbGwgKHBzIHwgcHMuc3RhdGVNYWNoaW5lID0gc2VsZi5zdWJtYWNoaW5lKSBhbmQmI3hEOwotICBjcC5leGl0LT5mb3JBbGwgKHBzIHwgcHMuc3RhdGVNYWNoaW5lID0gc2VsZi5zdWJtYWNoaW5lKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGF0ZS1zdWJtYWNoaW5lX29yX3JlZ2lvbnMiIG5hbWU9InN1Ym1hY2hpbmVfb3JfcmVnaW9ucyIgY29uc3RyYWluZWRFbGVtZW50PSJTdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1zdWJtYWNoaW5lX29yX3JlZ2lvbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZS1zdWJtYWNoaW5lX29yX3JlZ2lvbnMiPgotICAgICAgICAgIDxib2R5PkEgU3RhdGUgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSBib3RoIGEgc3VibWFjaGluZSBhbmQgUmVnaW9ucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGUtc3VibWFjaGluZV9vcl9yZWdpb25zLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pc0NvbXBvc2l0ZSBpbXBsaWVzIG5vdCBpc1N1Ym1hY2hpbmVTdGF0ZTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJTdGF0ZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iUmVkZWZpbmFibGVFbGVtZW50Ii8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJTdGF0ZS1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iTmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJTdGF0ZS1fZ2VuZXJhbGl6YXRpb24uMiIgZ2VuZXJhbD0iVmVydGV4Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdGF0ZS1jb25uZWN0aW9uIiBuYW1lPSJjb25uZWN0aW9uIiB0eXBlPSJDb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX2Nvbm5lY3Rpb25fc3RhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGUtY29ubmVjdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLWNvbm5lY3Rpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBlbnRyeSBhbmQgZXhpdCBjb25uZWN0aW9uIHBvaW50cyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhpcyAoc3VibWFjaGluZSkgU3RhdGUsIGkuZS4sIGFzIHRhcmdldHMgYW5kIHNvdXJjZXMsIHJlc3BlY3RpdmVseSwgaW4gdGhlIFJlZ2lvbiB3aXRoIHRoZSBzdWJtYWNoaW5lIFN0YXRlLiBBIGNvbm5lY3Rpb24gcG9pbnQgcmVmZXJlbmNlIHJlZmVyZW5jZXMgdGhlIGNvcnJlc3BvbmRpbmcgZGVmaW5pdGlvbiBvZiBhIGNvbm5lY3Rpb24gcG9pbnQgUHNldWRvc3RhdGUgaW4gdGhlIFN0YXRlTWFjaGluZSByZWZlcmVuY2VkIGJ5IHRoZSBzdWJtYWNoaW5lIFN0YXRlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RhdGUtY29ubmVjdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0YXRlLWNvbm5lY3Rpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RhdGUtY29ubmVjdGlvblBvaW50IiBuYW1lPSJjb25uZWN0aW9uUG9pbnQiIHR5cGU9IlBzZXVkb3N0YXRlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9jb25uZWN0aW9uUG9pbnRfc3RhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGUtY29ubmVjdGlvblBvaW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGUtY29ubmVjdGlvblBvaW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgZW50cnkgYW5kIGV4aXQgUHNldWRvc3RhdGVzIG9mIGEgY29tcG9zaXRlIFN0YXRlLiBUaGVzZSBjYW4gb25seSBiZSBlbnRyeSBvciBleGl0IFBzZXVkb3N0YXRlcywgYW5kIHRoZXkgbXVzdCBoYXZlIGRpZmZlcmVudCBuYW1lcy4gVGhleSBjYW4gb25seSBiZSBkZWZpbmVkIGZvciBjb21wb3NpdGUgU3RhdGVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RhdGUtY29ubmVjdGlvblBvaW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RhdGUtY29ubmVjdGlvblBvaW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0YXRlLWRlZmVycmFibGVUcmlnZ2VyIiBuYW1lPSJkZWZlcnJhYmxlVHJpZ2dlciIgdHlwZT0iVHJpZ2dlciIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9kZWZlcnJhYmxlVHJpZ2dlcl9zdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1kZWZlcnJhYmxlVHJpZ2dlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLWRlZmVycmFibGVUcmlnZ2VyIj4KLSAgICAgICAgICA8Ym9keT5BIGxpc3Qgb2YgVHJpZ2dlcnMgdGhhdCBhcmUgY2FuZGlkYXRlcyB0byBiZSByZXRhaW5lZCBieSB0aGUgU3RhdGVNYWNoaW5lIGlmIHRoZXkgdHJpZ2dlciBubyBUcmFuc2l0aW9ucyBvdXQgb2YgdGhlIFN0YXRlIChub3QgY29uc3VtZWQpLiBBIGRlZmVycmVkIFRyaWdnZXIgaXMgcmV0YWluZWQgdW50aWwgdGhlIFN0YXRlTWFjaGluZSByZWFjaGVzIGEgU3RhdGUgY29uZmlndXJhdGlvbiB3aGVyZSBpdCBpcyBubyBsb25nZXIgZGVmZXJyZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdGF0ZS1kZWZlcnJhYmxlVHJpZ2dlci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0YXRlLWRlZmVycmFibGVUcmlnZ2VyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0YXRlLWRvQWN0aXZpdHkiIG5hbWU9ImRvQWN0aXZpdHkiIHR5cGU9IkJlaGF2aW9yIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2RvQWN0aXZpdHlfc3RhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGUtZG9BY3Rpdml0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLWRvQWN0aXZpdHkiPgotICAgICAgICAgIDxib2R5PkFuIG9wdGlvbmFsIEJlaGF2aW9yIHRoYXQgaXMgZXhlY3V0ZWQgd2hpbGUgYmVpbmcgaW4gdGhlIFN0YXRlLiBUaGUgZXhlY3V0aW9uIHN0YXJ0cyB3aGVuIHRoaXMgU3RhdGUgaXMgZW50ZXJlZCwgYW5kIGNlYXNlcyBlaXRoZXIgYnkgaXRzZWxmIHdoZW4gZG9uZSwgb3Igd2hlbiB0aGUgU3RhdGUgaXMgZXhpdGVkLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdGF0ZS1kb0FjdGl2aXR5LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RhdGUtZW50cnkiIG5hbWU9ImVudHJ5IiB0eXBlPSJCZWhhdmlvciIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9lbnRyeV9zdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1lbnRyeS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLWVudHJ5Ij4KLSAgICAgICAgICA8Ym9keT5BbiBvcHRpb25hbCBCZWhhdmlvciB0aGF0IGlzIGV4ZWN1dGVkIHdoZW5ldmVyIHRoaXMgU3RhdGUgaXMgZW50ZXJlZCByZWdhcmRsZXNzIG9mIHRoZSBUcmFuc2l0aW9uIHRha2VuIHRvIHJlYWNoIHRoZSBTdGF0ZS4gSWYgZGVmaW5lZCwgZW50cnkgQmVoYXZpb3JzIGFyZSBhbHdheXMgZXhlY3V0ZWQgdG8gY29tcGxldGlvbiBwcmlvciB0byBhbnkgaW50ZXJuYWwgQmVoYXZpb3Igb3IgVHJhbnNpdGlvbnMgcGVyZm9ybWVkIHdpdGhpbiB0aGUgU3RhdGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdGF0ZS1lbnRyeS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0YXRlLWV4aXQiIG5hbWU9ImV4aXQiIHR5cGU9IkJlaGF2aW9yIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2V4aXRfc3RhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGUtZXhpdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLWV4aXQiPgotICAgICAgICAgIDxib2R5PkFuIG9wdGlvbmFsIEJlaGF2aW9yIHRoYXQgaXMgZXhlY3V0ZWQgd2hlbmV2ZXIgdGhpcyBTdGF0ZSBpcyBleGl0ZWQgcmVnYXJkbGVzcyBvZiB3aGljaCBUcmFuc2l0aW9uIHdhcyB0YWtlbiBvdXQgb2YgdGhlIFN0YXRlLiBJZiBkZWZpbmVkLCBleGl0IEJlaGF2aW9ycyBhcmUgYWx3YXlzIGV4ZWN1dGVkIHRvIGNvbXBsZXRpb24gb25seSBhZnRlciBhbGwgaW50ZXJuYWwgYW5kIHRyYW5zaXRpb24gQmVoYXZpb3JzIGhhdmUgY29tcGxldGVkIGV4ZWN1dGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0YXRlLWV4aXQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdGF0ZS1pc0NvbXBvc2l0ZSIgbmFtZT0iaXNDb21wb3NpdGUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1pc0NvbXBvc2l0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLWlzQ29tcG9zaXRlIj4KLSAgICAgICAgICA8Ym9keT5BIHN0YXRlIHdpdGggaXNDb21wb3NpdGU9dHJ1ZSBpcyBzYWlkIHRvIGJlIGEgY29tcG9zaXRlIFN0YXRlLiBBIGNvbXBvc2l0ZSBTdGF0ZSBpcyBhIFN0YXRlIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIFJlZ2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RhdGUtaXNPcnRob2dvbmFsIiBuYW1lPSJpc09ydGhvZ29uYWwiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1pc09ydGhvZ29uYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZS1pc09ydGhvZ29uYWwiPgotICAgICAgICAgIDxib2R5PkEgU3RhdGUgd2l0aCBpc09ydGhvZ29uYWw9dHJ1ZSBpcyBzYWlkIHRvIGJlIGFuIG9ydGhvZ29uYWwgY29tcG9zaXRlIFN0YXRlIEFuIG9ydGhvZ29uYWwgY29tcG9zaXRlIFN0YXRlIGNvbnRhaW5zIHR3byBvciBtb3JlIFJlZ2lvbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0YXRlLWlzU2ltcGxlIiBuYW1lPSJpc1NpbXBsZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlLWlzU2ltcGxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGUtaXNTaW1wbGUiPgotICAgICAgICAgIDxib2R5PkEgU3RhdGUgd2l0aCBpc1NpbXBsZT10cnVlIGlzIHNhaWQgdG8gYmUgYSBzaW1wbGUgU3RhdGUgQSBzaW1wbGUgU3RhdGUgZG9lcyBub3QgaGF2ZSBhbnkgUmVnaW9ucyBhbmQgaXQgZG9lcyBub3QgcmVmZXIgdG8gYW55IHN1Ym1hY2hpbmUgU3RhdGVNYWNoaW5lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IlN0YXRlLWlzU2ltcGxlLV9kZWZhdWx0VmFsdWUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RhdGUtaXNTdWJtYWNoaW5lU3RhdGUiIG5hbWU9ImlzU3VibWFjaGluZVN0YXRlIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGUtaXNTdWJtYWNoaW5lU3RhdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZS1pc1N1Ym1hY2hpbmVTdGF0ZSI+Ci0gICAgICAgICAgPGJvZHk+QSBTdGF0ZSB3aXRoIGlzU3VibWFjaGluZVN0YXRlPXRydWUgaXMgc2FpZCB0byBiZSBhIHN1Ym1hY2hpbmUgU3RhdGUgU3VjaCBhIFN0YXRlIHJlZmVycyB0byBhbm90aGVyIFN0YXRlTWFjaGluZShzdWJtYWNoaW5lKS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RhdGUtcmVkZWZpbmVkU3RhdGUiIG5hbWU9InJlZGVmaW5lZFN0YXRlIiB0eXBlPSJTdGF0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluZWRTdGF0ZV9zdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1yZWRlZmluZWRTdGF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLXJlZGVmaW5lZFN0YXRlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgU3RhdGUgb2Ygd2hpY2ggdGhpcyBTdGF0ZSBpcyBhIHJlZGVmaW5pdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0YXRlLXJlZGVmaW5lZFN0YXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RhdGUtcmVkZWZpbml0aW9uQ29udGV4dCIgbmFtZT0icmVkZWZpbml0aW9uQ29udGV4dCIgdHlwZT0iQ2xhc3NpZmllciIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiByZWRlZmluZWRQcm9wZXJ0eT0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5pdGlvbkNvbnRleHQiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfc3RhdGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGUtcmVkZWZpbml0aW9uQ29udGV4dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLXJlZGVmaW5pdGlvbkNvbnRleHQiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIENsYXNzaWZpZXIgaW4gd2hpY2ggY29udGV4dCB0aGlzIGVsZW1lbnQgbWF5IGJlIHJlZGVmaW5lZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0YXRlLXJlZ2lvbiIgbmFtZT0icmVnaW9uIiB0eXBlPSJSZWdpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX3JlZ2lvbl9zdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1yZWdpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZS1yZWdpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBSZWdpb25zIG93bmVkIGRpcmVjdGx5IGJ5IHRoZSBTdGF0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0YXRlLXJlZ2lvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0YXRlLXJlZ2lvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdGF0ZS1zdGF0ZUludmFyaWFudCIgbmFtZT0ic3RhdGVJbnZhcmlhbnQiIHR5cGU9IkNvbnN0cmFpbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRSdWxlIiBhc3NvY2lhdGlvbj0iQV9zdGF0ZUludmFyaWFudF9vd25pbmdTdGF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1zdGF0ZUludmFyaWFudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLXN0YXRlSW52YXJpYW50Ij4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgY29uZGl0aW9ucyB0aGF0IGFyZSBhbHdheXMgdHJ1ZSB3aGVuIHRoaXMgU3RhdGUgaXMgdGhlIGN1cnJlbnQgU3RhdGUuIEluIFByb3RvY29sU3RhdGVNYWNoaW5lcyBzdGF0ZSBpbnZhcmlhbnRzIGFyZSBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgdG8gdGhlIHByZWNvbmRpdGlvbnMgb2YgdGhlIG91dGdvaW5nIFRyYW5zaXRpb25zLCBhbmQgdG8gdGhlIHBvc3Rjb25kaXRpb24gb2YgdGhlIGluY29taW5nIFRyYW5zaXRpb25zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RhdGUtc3RhdGVJbnZhcmlhbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdGF0ZS1zdWJtYWNoaW5lIiBuYW1lPSJzdWJtYWNoaW5lIiB0eXBlPSJTdGF0ZU1hY2hpbmUiIGFzc29jaWF0aW9uPSJBX3N1Ym1hY2hpbmVTdGF0ZV9zdWJtYWNoaW5lIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlLXN1Ym1hY2hpbmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZS1zdWJtYWNoaW5lIj4KLSAgICAgICAgICA8Ym9keT5UaGUgU3RhdGVNYWNoaW5lIHRoYXQgaXMgdG8gYmUgaW5zZXJ0ZWQgaW4gcGxhY2Ugb2YgdGhlIChzdWJtYWNoaW5lKSBTdGF0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0YXRlLXN1Ym1hY2hpbmUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGF0ZS1jb250YWluaW5nU3RhdGVNYWNoaW5lIiBuYW1lPSJjb250YWluaW5nU3RhdGVNYWNoaW5lIiBib2R5Q29uZGl0aW9uPSJTdGF0ZS1jb250YWluaW5nU3RhdGVNYWNoaW5lLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iVmVydGV4LWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGUtY29udGFpbmluZ1N0YXRlTWFjaGluZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlLWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBjb250YWluaW5nU3RhdGVNYWNoaW5lKCkgcmV0dXJucyB0aGUgU3RhdGVNYWNoaW5lIHRoYXQgY29udGFpbnMgdGhlIFN0YXRlIGVpdGhlciBkaXJlY3RseSBvciB0cmFuc2l0aXZlbHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0YXRlLWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJTdGF0ZS1jb250YWluaW5nU3RhdGVNYWNoaW5lIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGUtY29udGFpbmluZ1N0YXRlTWFjaGluZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGNvbnRhaW5lci5jb250YWluaW5nU3RhdGVNYWNoaW5lKCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0YXRlLWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlN0YXRlTWFjaGluZSIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGF0ZS1pc0NvbXBvc2l0ZS4xIiBuYW1lPSJpc0NvbXBvc2l0ZSIgYm9keUNvbmRpdGlvbj0iU3RhdGUtaXNDb21wb3NpdGUuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlLWlzQ29tcG9zaXRlLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZS1pc0NvbXBvc2l0ZS4xIj4KLSAgICAgICAgICA8Ym9keT5BIGNvbXBvc2l0ZSBTdGF0ZSBpcyBhIFN0YXRlIHdpdGggYXQgbGVhc3Qgb25lIFJlZ2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGUtaXNDb21wb3NpdGUuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0YXRlLWlzQ29tcG9zaXRlLjEgU3RhdGUtaXNDb21wb3NpdGUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGF0ZS1pc0NvbXBvc2l0ZS4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAocmVnaW9uLT5ub3RFbXB0eSgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGF0ZS1pc0NvbXBvc2l0ZS4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlN0YXRlLWlzQ29uc2lzdGVudFdpdGgiIG5hbWU9ImlzQ29uc2lzdGVudFdpdGgiIGJvZHlDb25kaXRpb249IlN0YXRlLWlzQ29uc2lzdGVudFdpdGgtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcHJlY29uZGl0aW9uPSJTdGF0ZS1pc0NvbnNpc3RlbnRXaXRoLXByZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJSZWRlZmluYWJsZUVsZW1lbnQtaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1pc0NvbnNpc3RlbnRXaXRoLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGUtaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzQ29uc2lzdGVudFdpdGgoKSBzcGVjaWZpZXMgdGhhdCBhIHJlZGVmaW5pbmcgU3RhdGUgaXMgY29uc2lzdGVudCB3aXRoIGEgcmVkZWZpbmVkIFN0YXRlIHByb3ZpZGVkIHRoYXQgdGhlIHJlZGVmaW5pbmcgU3RhdGUgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSByZWRlZmluZWQgU3RhdGUgQSBzaW1wbGUgU3RhdGUgY2FuIGJlIHJlZGVmaW5lZCAoZXh0ZW5kZWQpIHRvIGJlY29tZSBhIGNvbXBvc2l0ZSBTdGF0ZSAoYnkgYWRkaW5nIG9uZSBvciBtb3JlIFJlZ2lvbnMpIGFuZCBhIGNvbXBvc2l0ZSBTdGF0ZSBjYW4gYmUgcmVkZWZpbmVkIChleHRlbmRlZCkgYnkgYWRkaW5nIFJlZ2lvbnMgYW5kIGJ5IGFkZGluZyBWZXJ0aWNlcywgU3RhdGVzLCBhbmQgVHJhbnNpdGlvbnMgdG8gaW5oZXJpdGVkIFJlZ2lvbnMuIEFsbCBTdGF0ZXMgbWF5IGFkZCBvciByZXBsYWNlIGVudHJ5LCBleGl0LCBhbmQgJ2RvQWN0aXZpdHknIEJlaGF2aW9ycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGUtaXNDb25zaXN0ZW50V2l0aC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0YXRlLWlzQ29uc2lzdGVudFdpdGgiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGF0ZS1pc0NvbnNpc3RlbnRXaXRoLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoLS0gdGhlIGZvbGxvd2luZyBpcyBtZXJlbHkgYSBkZWZhdWx0IGJvZHk7IGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHNwZWNpZmljIGZvcm0gb2YgdGhpcyBjb25zdHJhaW50IHdpbGwgYmUgc3BlY2lmaWVkIGJ5IHByb2ZpbGVzJiN4RDsKLXRydWUpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGF0ZS1pc0NvbnNpc3RlbnRXaXRoLXByZSIgbmFtZT0icHJlIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0YXRlLWlzQ29uc2lzdGVudFdpdGgiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGF0ZS1pc0NvbnNpc3RlbnRXaXRoLXByZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlZGVmaW5pbmdFbGVtZW50LmlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkKHNlbGYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0YXRlLWlzQ29uc2lzdGVudFdpdGgtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0YXRlLWlzQ29uc2lzdGVudFdpdGgtcmVkZWZpbmluZ0VsZW1lbnQiIG5hbWU9InJlZGVmaW5pbmdFbGVtZW50IiB0eXBlPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGF0ZS1pc09ydGhvZ29uYWwuMSIgbmFtZT0iaXNPcnRob2dvbmFsIiBib2R5Q29uZGl0aW9uPSJTdGF0ZS1pc09ydGhvZ29uYWwuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlLWlzT3J0aG9nb25hbC4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGUtaXNPcnRob2dvbmFsLjEiPgotICAgICAgICAgIDxib2R5PkFuIG9ydGhvZ29uYWwgU3RhdGUgaXMgYSBjb21wb3NpdGUgc3RhdGUgd2l0aCBhdCBsZWFzdCAyIHJlZ2lvbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0YXRlLWlzT3J0aG9nb25hbC4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhdGUtaXNPcnRob2dvbmFsLjEgU3RhdGUtaXNPcnRob2dvbmFsIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGUtaXNPcnRob2dvbmFsLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChyZWdpb24tPnNpemUgKCkgPiAxKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGF0ZS1pc09ydGhvZ29uYWwuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGF0ZS1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZCIgbmFtZT0iaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQiIGJvZHlDb25kaXRpb249IlN0YXRlLWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iUmVkZWZpbmFibGVFbGVtZW50LWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlLWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGUtaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZCgpIHNwZWNpZmllcyB3aGV0aGVyIHRoZSByZWRlZmluaXRpb24gY29udGV4dHMgb2YgYSBTdGF0ZSBhcmUgcHJvcGVybHkgcmVsYXRlZCB0byB0aGUgcmVkZWZpbml0aW9uIGNvbnRleHRzIG9mIHRoZSBzcGVjaWZpZWQgU3RhdGUgdG8gYWxsb3cgdGhpcyBlbGVtZW50IHRvIHJlZGVmaW5lIHRoZSBvdGhlci4gVGhpcyBtZWFucyB0aGF0IHRoZSBjb250YWluaW5nIFJlZ2lvbiBvZiBhIHJlZGVmaW5pbmcgU3RhdGUgbXVzdCByZWRlZmluZSB0aGUgY29udGFpbmluZyBSZWdpb24gb2YgdGhlIHJlZGVmaW5lZCBTdGF0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGUtaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJTdGF0ZS1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0YXRlLWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgcmVkZWZpbmVkRWxlbWVudC5vY2xJc0tpbmRPZihTdGF0ZSkgdGhlbiYjeEQ7Ci0gIGxldCByZWRlZmluZWRTdGF0ZSA6IFN0YXRlID0gcmVkZWZpbmVkRWxlbWVudC5vY2xBc1R5cGUoU3RhdGUpIGluJiN4RDsKLSAgICBjb250YWluZXIucmVkZWZpbmVkRWxlbWVudC5vY2xBc1R5cGUoUmVnaW9uKS0+ZXhpc3RzKHI6UmVnaW9uIHwmI3hEOwotICAgICAgci5zdWJ2ZXJ0ZXgtPmluY2x1ZGVzKHJlZGVmaW5lZFN0YXRlKSkmI3hEOwotZWxzZSYjeEQ7Ci0gIGZhbHNlJiN4RDsKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGF0ZS1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RhdGUtaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQtcmVkZWZpbmVkRWxlbWVudCIgbmFtZT0icmVkZWZpbmVkRWxlbWVudCIgdHlwZT0iUmVkZWZpbmFibGVFbGVtZW50Ii8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iU3RhdGUtaXNTaW1wbGUuMSIgbmFtZT0iaXNTaW1wbGUiIGJvZHlDb25kaXRpb249IlN0YXRlLWlzU2ltcGxlLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZS1pc1NpbXBsZS4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGUtaXNTaW1wbGUuMSI+Ci0gICAgICAgICAgPGJvZHk+QSBzaW1wbGUgU3RhdGUgaXMgYSBTdGF0ZSB3aXRob3V0IGFueSByZWdpb25zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdGF0ZS1pc1NpbXBsZS4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhdGUtaXNTaW1wbGUuMSBTdGF0ZS1pc1NpbXBsZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0YXRlLWlzU2ltcGxlLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICgocmVnaW9uLT5pc0VtcHR5KCkpIGFuZCBub3QgaXNTdWJtYWNoaW5lU3RhdGUoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RhdGUtaXNTaW1wbGUuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGF0ZS1pc1N1Ym1hY2hpbmVTdGF0ZS4xIiBuYW1lPSJpc1N1Ym1hY2hpbmVTdGF0ZSIgYm9keUNvbmRpdGlvbj0iU3RhdGUtaXNTdWJtYWNoaW5lU3RhdGUuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlLWlzU3VibWFjaGluZVN0YXRlLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZS1pc1N1Ym1hY2hpbmVTdGF0ZS4xIj4KLSAgICAgICAgICA8Ym9keT5Pbmx5IHN1Ym1hY2hpbmUgU3RhdGUgcmVmZXJlbmNlcyBhbm90aGVyIFN0YXRlTWFjaGluZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGUtaXNTdWJtYWNoaW5lU3RhdGUuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0YXRlLWlzU3VibWFjaGluZVN0YXRlLjEgU3RhdGUtaXNTdWJtYWNoaW5lU3RhdGUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGF0ZS1pc1N1Ym1hY2hpbmVTdGF0ZS4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc3VibWFjaGluZSAmbHQ7PiBudWxsKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGF0ZS1pc1N1Ym1hY2hpbmVTdGF0ZS4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlN0YXRlLXJlZGVmaW5pdGlvbkNvbnRleHQuMSIgbmFtZT0icmVkZWZpbml0aW9uQ29udGV4dCIgYm9keUNvbmRpdGlvbj0iU3RhdGUtcmVkZWZpbml0aW9uQ29udGV4dC4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGUtcmVkZWZpbml0aW9uQ29udGV4dC4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGUtcmVkZWZpbml0aW9uQ29udGV4dC4xIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcmVkZWZpbml0aW9uIGNvbnRleHQgb2YgYSBTdGF0ZSBpcyB0aGUgbmVhcmVzdCBjb250YWluaW5nIFN0YXRlTWFjaGluZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGUtcmVkZWZpbml0aW9uQ29udGV4dC4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhdGUtcmVkZWZpbml0aW9uQ29udGV4dC4xIFN0YXRlLXJlZGVmaW5pdGlvbkNvbnRleHQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGF0ZS1yZWRlZmluaXRpb25Db250ZXh0LjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChsZXQgc20gOiBTdGF0ZU1hY2hpbmUgPSBjb250YWluaW5nU3RhdGVNYWNoaW5lKCkgaW4KLWlmIHNtLl8nY29udGV4dCcgPSBudWxsIG9yIHNtLmdlbmVyYWwtPm5vdEVtcHR5KCkgdGhlbgotICBzbQotZWxzZQotICBzbS5fJ2NvbnRleHQnCi1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RhdGUtcmVkZWZpbml0aW9uQ29udGV4dC4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJDbGFzc2lmaWVyIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iU3RhdGVNYWNoaW5lIiBuYW1lPSJTdGF0ZU1hY2hpbmUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlTWFjaGluZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlTWFjaGluZSI+Ci0gICAgICAgIDxib2R5PlN0YXRlTWFjaGluZXMgY2FuIGJlIHVzZWQgdG8gZXhwcmVzcyBldmVudC1kcml2ZW4gYmVoYXZpb3JzIG9mIHBhcnRzIG9mIGEgc3lzdGVtLiBCZWhhdmlvciBpcyBtb2RlbGVkIGFzIGEgdHJhdmVyc2FsIG9mIGEgZ3JhcGggb2YgVmVydGljZXMgaW50ZXJjb25uZWN0ZWQgYnkgb25lIG9yIG1vcmUgam9pbmVkIFRyYW5zaXRpb24gYXJjcyB0aGF0IGFyZSB0cmlnZ2VyZWQgYnkgdGhlIGRpc3BhdGNoaW5nIG9mIHN1Y2Nlc3NpdmUgRXZlbnQgb2NjdXJyZW5jZXMuIER1cmluZyB0aGlzIHRyYXZlcnNhbCwgdGhlIFN0YXRlTWFjaGluZSBtYXkgZXhlY3V0ZSBhIHNlcXVlbmNlIG9mIEJlaGF2aW9ycyBhc3NvY2lhdGVkIHdpdGggdmFyaW91cyBlbGVtZW50cyBvZiB0aGUgU3RhdGVNYWNoaW5lLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0YXRlTWFjaGluZS1jb25uZWN0aW9uX3BvaW50cyIgbmFtZT0iY29ubmVjdGlvbl9wb2ludHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhdGVNYWNoaW5lIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlTWFjaGluZS1jb25uZWN0aW9uX3BvaW50cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlTWFjaGluZS1jb25uZWN0aW9uX3BvaW50cyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGNvbm5lY3Rpb24gcG9pbnRzIG9mIGEgU3RhdGVNYWNoaW5lIGFyZSBQc2V1ZG9zdGF0ZXMgb2Yga2luZCBlbnRyeSBwb2ludCBvciBleGl0IHBvaW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtY29ubmVjdGlvbl9wb2ludHMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmNvbm5lY3Rpb25Qb2ludC0+Zm9yQWxsIChraW5kID0gUHNldWRvc3RhdGVLaW5kOjplbnRyeVBvaW50IG9yIGtpbmQgPSBQc2V1ZG9zdGF0ZUtpbmQ6OmV4aXRQb2ludCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0YXRlTWFjaGluZS1jbGFzc2lmaWVyX2NvbnRleHQiIG5hbWU9ImNsYXNzaWZpZXJfY29udGV4dCIgY29uc3RyYWluZWRFbGVtZW50PSJTdGF0ZU1hY2hpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGVNYWNoaW5lLWNsYXNzaWZpZXJfY29udGV4dC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlTWFjaGluZS1jbGFzc2lmaWVyX2NvbnRleHQiPgotICAgICAgICAgIDxib2R5PlRoZSBDbGFzc2lmaWVyIGNvbnRleHQgb2YgYSBTdGF0ZU1hY2hpbmUgY2Fubm90IGJlIGFuIEludGVyZmFjZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGVNYWNoaW5lLWNsYXNzaWZpZXJfY29udGV4dC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+Xydjb250ZXh0JyAmbHQ7PiBudWxsIGltcGxpZXMgbm90IF8nY29udGV4dCcub2NsSXNLaW5kT2YoSW50ZXJmYWNlKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGVNYWNoaW5lLW1ldGhvZCIgbmFtZT0ibWV0aG9kIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0YXRlTWFjaGluZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtbWV0aG9kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGVNYWNoaW5lLW1ldGhvZCI+Ci0gICAgICAgICAgPGJvZHk+QSBTdGF0ZU1hY2hpbmUgYXMgdGhlIG1ldGhvZCBmb3IgYSBCZWhhdmlvcmFsRmVhdHVyZSBjYW5ub3QgaGF2ZSBlbnRyeS9leGl0IGNvbm5lY3Rpb24gcG9pbnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtbWV0aG9kLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5zcGVjaWZpY2F0aW9uICZsdDs+IG51bGwgaW1wbGllcyBjb25uZWN0aW9uUG9pbnQtPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGVNYWNoaW5lLWNvbnRleHRfY2xhc3NpZmllciIgbmFtZT0iY29udGV4dF9jbGFzc2lmaWVyIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0YXRlTWFjaGluZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtY29udGV4dF9jbGFzc2lmaWVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGVNYWNoaW5lLWNvbnRleHRfY2xhc3NpZmllciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGNvbnRleHQgQ2xhc3NpZmllciBvZiB0aGUgbWV0aG9kIFN0YXRlTWFjaGluZSBvZiBhIEJlaGF2aW9yYWxGZWF0dXJlIG11c3QgYmUgdGhlIENsYXNzaWZpZXIgdGhhdCBvd25zIHRoZSBCZWhhdmlvcmFsRmVhdHVyZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGVNYWNoaW5lLWNvbnRleHRfY2xhc3NpZmllci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c3BlY2lmaWNhdGlvbiAmbHQ7PiBudWxsIGltcGxpZXMgKCBfJ2NvbnRleHQnICZsdDs+IG51bGwgYW5kIHNwZWNpZmljYXRpb24uZmVhdHVyaW5nQ2xhc3NpZmllci0+ZXhpc3RzKGMgfCBjID0gXydjb250ZXh0JykpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlN0YXRlTWFjaGluZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQmVoYXZpb3IiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0YXRlTWFjaGluZS1jb25uZWN0aW9uUG9pbnQiIG5hbWU9ImNvbm5lY3Rpb25Qb2ludCIgdHlwZT0iUHNldWRvc3RhdGUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX2Nvbm5lY3Rpb25Qb2ludF9zdGF0ZU1hY2hpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGVNYWNoaW5lLWNvbm5lY3Rpb25Qb2ludC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlTWFjaGluZS1jb25uZWN0aW9uUG9pbnQiPgotICAgICAgICAgIDxib2R5PlRoZSBjb25uZWN0aW9uIHBvaW50cyBkZWZpbmVkIGZvciB0aGlzIFN0YXRlTWFjaGluZS4gVGhleSByZXByZXNlbnQgdGhlIGludGVyZmFjZSBvZiB0aGUgU3RhdGVNYWNoaW5lIHdoZW4gdXNlZCBhcyBwYXJ0IG9mIHN1Ym1hY2hpbmUgU3RhdGU8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0YXRlTWFjaGluZS1jb25uZWN0aW9uUG9pbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtY29ubmVjdGlvblBvaW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0YXRlTWFjaGluZS1leHRlbmRlZFN0YXRlTWFjaGluZSIgbmFtZT0iZXh0ZW5kZWRTdGF0ZU1hY2hpbmUiIHR5cGU9IlN0YXRlTWFjaGluZSIgcmVkZWZpbmVkUHJvcGVydHk9IkJlaGF2aW9yLXJlZGVmaW5lZEJlaGF2aW9yIiBhc3NvY2lhdGlvbj0iQV9leHRlbmRlZFN0YXRlTWFjaGluZV9zdGF0ZU1hY2hpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGVNYWNoaW5lLWV4dGVuZGVkU3RhdGVNYWNoaW5lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGVNYWNoaW5lLWV4dGVuZGVkU3RhdGVNYWNoaW5lIj4KLSAgICAgICAgICA8Ym9keT5UaGUgU3RhdGVNYWNoaW5lcyBvZiB3aGljaCB0aGlzIGlzIGFuIGV4dGVuc2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0YXRlTWFjaGluZS1leHRlbmRlZFN0YXRlTWFjaGluZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0YXRlTWFjaGluZS1leHRlbmRlZFN0YXRlTWFjaGluZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtcmVnaW9uIiBuYW1lPSJyZWdpb24iIHR5cGU9IlJlZ2lvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfcmVnaW9uX3N0YXRlTWFjaGluZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtcmVnaW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RhdGVNYWNoaW5lLXJlZ2lvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFJlZ2lvbnMgb3duZWQgZGlyZWN0bHkgYnkgdGhlIFN0YXRlTWFjaGluZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0YXRlTWFjaGluZS1yZWdpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RhdGVNYWNoaW5lLXN1Ym1hY2hpbmVTdGF0ZSIgbmFtZT0ic3VibWFjaGluZVN0YXRlIiB0eXBlPSJTdGF0ZSIgYXNzb2NpYXRpb249IkFfc3VibWFjaGluZVN0YXRlX3N1Ym1hY2hpbmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGVNYWNoaW5lLXN1Ym1hY2hpbmVTdGF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlTWFjaGluZS1zdWJtYWNoaW5lU3RhdGUiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIHN1Ym1hY2hpbmUocykgaW4gY2FzZSBvZiBhIHN1Ym1hY2hpbmUgU3RhdGUuIE11bHRpcGxlIG1hY2hpbmVzIGFyZSByZWZlcmVuY2VkIGluIGNhc2Ugb2YgYSBjb25jdXJyZW50IFN0YXRlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RhdGVNYWNoaW5lLXN1Ym1hY2hpbmVTdGF0ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0YXRlTWFjaGluZS1zdWJtYWNoaW5lU3RhdGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iU3RhdGVNYWNoaW5lLUxDQSIgbmFtZT0iTENBIiBib2R5Q29uZGl0aW9uPSJTdGF0ZU1hY2hpbmUtTENBLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RhdGVNYWNoaW5lLUxDQS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlTWFjaGluZS1MQ0EiPgotICAgICAgICAgIDxib2R5PlRoZSBvcGVyYXRpb24gTENBKHMxLHMyKSByZXR1cm5zIHRoZSBSZWdpb24gdGhhdCBpcyB0aGUgbGVhc3QgY29tbW9uIGFuY2VzdG9yIG9mIFZlcnRpY2VzIHMxIGFuZCBzMiwgYmFzZWQgb24gdGhlIFN0YXRlTWFjaGluZSBjb250YWlubWVudCBoaWVyYXJjaHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0YXRlTWFjaGluZS1MQ0Etc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJTdGF0ZU1hY2hpbmUtTENBIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGVNYWNoaW5lLUxDQS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIGFuY2VzdG9yKHMxLCBzMikgdGhlbiAmI3hEOwotICAgIHMyLmNvbnRhaW5lciYjeEQ7Ci1lbHNlJiN4RDsKLQlpZiBhbmNlc3RvcihzMiwgczEpIHRoZW4mI3hEOwotCSAgICBzMS5jb250YWluZXIgJiN4RDsKLQllbHNlICYjeEQ7Ci0JICAgIExDQShzMS5jb250YWluZXIuc3RhdGUsIHMyLmNvbnRhaW5lci5zdGF0ZSkmI3hEOwotCWVuZGlmJiN4RDsKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtTENBLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJSZWdpb24iIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0YXRlTWFjaGluZS1MQ0EtczEiIG5hbWU9InMxIiB0eXBlPSJWZXJ0ZXgiLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RhdGVNYWNoaW5lLUxDQS1zMiIgbmFtZT0iczIiIHR5cGU9IlZlcnRleCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlN0YXRlTWFjaGluZS1hbmNlc3RvciIgbmFtZT0iYW5jZXN0b3IiIGJvZHlDb25kaXRpb249IlN0YXRlTWFjaGluZS1hbmNlc3Rvci1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0YXRlTWFjaGluZS1hbmNlc3Rvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlTWFjaGluZS1hbmNlc3RvciI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGFuY2VzdG9yKHMxLCBzMikgY2hlY2tzIHdoZXRoZXIgVmVydGV4IHMyIGlzIGFuIGFuY2VzdG9yIG9mIFZlcnRleCBzMS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGVNYWNoaW5lLWFuY2VzdG9yLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhdGVNYWNoaW5lLWFuY2VzdG9yIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGVNYWNoaW5lLWFuY2VzdG9yLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgKHMyID0gczEpIHRoZW4gJiN4RDsKLQl0cnVlICYjeEQ7Ci1lbHNlICYjeEQ7Ci0JaWYgczEuY29udGFpbmVyLnN0YXRlTWFjaGluZS0+bm90RW1wdHkoKSB0aGVuICYjeEQ7Ci0JICAgIHRydWUmI3hEOwotCWVsc2UgJiN4RDsKLQkgICAgaWYgczIuY29udGFpbmVyLnN0YXRlTWFjaGluZS0+bm90RW1wdHkoKSB0aGVuICYjeEQ7Ci0JICAgICAgICBmYWxzZSYjeEQ7Ci0JICAgIGVsc2UmI3hEOwotCSAgICAgICAgYW5jZXN0b3IoczEsIHMyLmNvbnRhaW5lci5zdGF0ZSkmI3hEOwotCSAgICAgZW5kaWYmI3hEOwotCSBlbmRpZiYjeEQ7Ci1lbmRpZiAgKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtYW5jZXN0b3ItcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0YXRlTWFjaGluZS1hbmNlc3Rvci1zMSIgbmFtZT0iczEiIHR5cGU9IlZlcnRleCIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtYW5jZXN0b3ItczIiIG5hbWU9InMyIiB0eXBlPSJWZXJ0ZXgiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGF0ZU1hY2hpbmUtaXNDb25zaXN0ZW50V2l0aCIgbmFtZT0iaXNDb25zaXN0ZW50V2l0aCIgYm9keUNvbmRpdGlvbj0iU3RhdGVNYWNoaW5lLWlzQ29uc2lzdGVudFdpdGgtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJSZWRlZmluYWJsZUVsZW1lbnQtaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtaXNDb25zaXN0ZW50V2l0aC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0YXRlTWFjaGluZS1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNDb25zaXN0ZW50V2l0aCgpIHNwZWNpZmllcyB0aGF0IGEgcmVkZWZpbmluZyBTdGF0ZU1hY2hpbmUgaXMgY29uc2lzdGVudCB3aXRoIGEgcmVkZWZpbmVkIFN0YXRlTWFjaGluZSBwcm92aWRlZCB0aGF0IHRoZSByZWRlZmluaW5nIFN0YXRlTWFjaGluZSBpcyBhbiBleHRlbnNpb24gb2YgdGhlIHJlZGVmaW5lZCBTdGF0ZU1hY2hpbmUgOiBSZWdpb25zIGFyZSBpbmhlcml0ZWQgYW5kIFJlZ2lvbnMgY2FuIGJlIGFkZGVkLCBpbmhlcml0ZWQgUmVnaW9ucyBjYW4gYmUgcmVkZWZpbmVkLiBJbiBjYXNlIG9mIG11bHRpcGxlIHJlZGVmaW5pbmcgU3RhdGVNYWNoaW5lLCBleHRlbnNpb24gaW1wbGllcyB0aGF0IHRoZSByZWRlZmluaW5nIFN0YXRlTWFjaGluZSBnZXRzIG9ydGhvZ29uYWwgUmVnaW9ucyBmb3IgZWFjaCBvZiB0aGUgcmVkZWZpbmVkIFN0YXRlTWFjaGluZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGVNYWNoaW5lLWlzQ29uc2lzdGVudFdpdGgtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJTdGF0ZU1hY2hpbmUtaXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0YXRlTWFjaGluZS1pc0NvbnNpc3RlbnRXaXRoLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoLS0gdGhlIGZvbGxvd2luZyBpcyBtZXJlbHkgYSBkZWZhdWx0IGJvZHk7IGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHNwZWNpZmljIGZvcm0gb2YgdGhpcyBjb25zdHJhaW50IHdpbGwgYmUgc3BlY2lmaWVkIGJ5IHByb2ZpbGVzJiN4RDsKLXRydWUpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0YXRlTWFjaGluZS1pc0NvbnNpc3RlbnRXaXRoLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtaXNDb25zaXN0ZW50V2l0aC1yZWRlZmluaW5nRWxlbWVudCIgbmFtZT0icmVkZWZpbmluZ0VsZW1lbnQiIHR5cGU9IlJlZGVmaW5hYmxlRWxlbWVudCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlN0YXRlTWFjaGluZS1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZCIgbmFtZT0iaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQiIGJvZHlDb25kaXRpb249IlN0YXRlTWFjaGluZS1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IlJlZGVmaW5hYmxlRWxlbWVudC1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZU1hY2hpbmUtaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZCgpIHNwZWNpZmllcyB3aGV0aGVyIHRoZSByZWRlZmluaXRpb24gY29udGV4dCBvZiBhIFN0YXRlTWFjaGluZSBpcyBwcm9wZXJseSByZWxhdGVkIHRvIHRoZSByZWRlZmluaXRpb24gY29udGV4dHMgb2YgdGhlIHNwZWNpZmllZCBTdGF0ZU1hY2hpbmUgdG8gYWxsb3cgdGhpcyBlbGVtZW50IHRvIHJlZGVmaW5lIHRoZSBvdGhlci4gVGhlIGNvbnRleHQgQ2xhc3NpZmllciBvZiBhIHJlZGVmaW5pbmcgU3RhdGVNYWNoaW5lIG11c3QgcmVkZWZpbmUgdGhlIGNvbnRleHQgQ2xhc3NpZmllciBvZiB0aGUgcmVkZWZpbmVkIFN0YXRlTWFjaGluZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGVNYWNoaW5lLWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhdGVNYWNoaW5lLWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGVNYWNoaW5lLWlzUmVkZWZpbml0aW9uQ29udGV4dFZhbGlkLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgcmVkZWZpbmVkRWxlbWVudC5vY2xJc0tpbmRPZihTdGF0ZU1hY2hpbmUpIHRoZW4mI3hEOwotICBsZXQgcmVkZWZpbmVkU3RhdGVNYWNoaW5lIDogU3RhdGVNYWNoaW5lID0gcmVkZWZpbmVkRWxlbWVudC5vY2xBc1R5cGUoU3RhdGVNYWNoaW5lKSBpbiYjeEQ7Ci0gICAgc2VsZi5fJ2NvbnRleHQnKCkub2NsQXNUeXBlKEJlaGF2aW9yZWRDbGFzc2lmaWVyKS5yZWRlZmluZWRDbGFzc2lmaWVyLT4mI3hEOwotICAgICAgaW5jbHVkZXMocmVkZWZpbmVkU3RhdGVNYWNoaW5lLl8nY29udGV4dCcoKSkmI3hEOwotZWxzZSYjeEQ7Ci0gIGZhbHNlJiN4RDsKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0YXRlTWFjaGluZS1pc1JlZGVmaW5pdGlvbkNvbnRleHRWYWxpZC1yZWRlZmluZWRFbGVtZW50IiBuYW1lPSJyZWRlZmluZWRFbGVtZW50IiB0eXBlPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdGF0ZU1hY2hpbmUtTENBU3RhdGUiIG5hbWU9IkxDQVN0YXRlIiBib2R5Q29uZGl0aW9uPSJTdGF0ZU1hY2hpbmUtTENBU3RhdGUtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdGF0ZU1hY2hpbmUtTENBU3RhdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdGF0ZU1hY2hpbmUtTENBU3RhdGUiPgotICAgICAgICAgIDxib2R5PlRoaXMgdXRpbGl0eSBmdW5jaXRvbiBpcyBsaWtlIHRoZSBMQ0EsIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIG5lYXJlc3QgY29tcG9zaXRlIFN0YXRlIHRoYXQgY29udGFpbnMgYm90aCBpbnB1dCBWZXJ0aWNlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RhdGVNYWNoaW5lLUxDQVN0YXRlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RhdGVNYWNoaW5lLUxDQVN0YXRlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RhdGVNYWNoaW5lLUxDQVN0YXRlLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgdjIub2NsSXNUeXBlT2YoU3RhdGUpIGFuZCBhbmNlc3Rvcih2MSwgdjIpIHRoZW4mI3hEOwotCXYyLm9jbEFzVHlwZShTdGF0ZSkmI3hEOwotZWxzZSBpZiB2MS5vY2xJc1R5cGVPZihTdGF0ZSkgYW5kIGFuY2VzdG9yKHYyLCB2MSkgdGhlbiYjeEQ7Ci0JdjEub2NsQXNUeXBlKFN0YXRlKSYjeEQ7Ci1lbHNlIGlmICh2MS5jb250YWluZXIuc3RhdGUtPmlzRW1wdHkoKSBvciB2Mi5jb250YWluZXIuc3RhdGUtPmlzRW1wdHkoKSkgdGhlbiAmI3hEOwotCW51bGwub2NsQXNUeXBlKFN0YXRlKSYjeEQ7Ci1lbHNlIExDQVN0YXRlKHYxLmNvbnRhaW5lci5zdGF0ZSwgdjIuY29udGFpbmVyLnN0YXRlKSYjeEQ7Ci1lbmRpZiBlbmRpZiBlbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RhdGVNYWNoaW5lLUxDQVN0YXRlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJTdGF0ZSIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RhdGVNYWNoaW5lLUxDQVN0YXRlLXYxIiBuYW1lPSJ2MSIgdHlwZT0iVmVydGV4Ii8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0YXRlTWFjaGluZS1MQ0FTdGF0ZS12MiIgbmFtZT0idjIiIHR5cGU9IlZlcnRleCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVHJhbnNpdGlvbiIgbmFtZT0iVHJhbnNpdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJhbnNpdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyYW5zaXRpb24iPgotICAgICAgICA8Ym9keT5BIFRyYW5zaXRpb24gcmVwcmVzZW50cyBhbiBhcmMgYmV0d2VlbiBleGFjdGx5IG9uZSBzb3VyY2UgVmVydGV4IGFuZCBleGFjdGx5IG9uZSBUYXJnZXQgdmVydGV4ICh0aGUgc291cmNlIGFuZCB0YXJnZXRzIG1heSBiZSB0aGUgc2FtZSBWZXJ0ZXgpLiBJdCBtYXkgZm9ybSBwYXJ0IG9mIGEgY29tcG91bmQgdHJhbnNpdGlvbiwgd2hpY2ggdGFrZXMgdGhlIFN0YXRlTWFjaGluZSBmcm9tIG9uZSBzdGVhZHkgU3RhdGUgY29uZmlndXJhdGlvbiB0byBhbm90aGVyLCByZXByZXNlbnRpbmcgdGhlIGZ1bGwgcmVzcG9uc2Ugb2YgdGhlIFN0YXRlTWFjaGluZSB0byBhbiBvY2N1cnJlbmNlIG9mIGFuIEV2ZW50IHRoYXQgdHJpZ2dlcmVkIGl0LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRyYW5zaXRpb24tc3RhdGVfaXNfZXh0ZXJuYWwiIG5hbWU9InN0YXRlX2lzX2V4dGVybmFsIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlRyYW5zaXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJhbnNpdGlvbi1zdGF0ZV9pc19leHRlcm5hbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyYW5zaXRpb24tc3RhdGVfaXNfZXh0ZXJuYWwiPgotICAgICAgICAgIDxib2R5PkEgVHJhbnNpdGlvbiB3aXRoIGtpbmQgZXh0ZXJuYWwgY2FuIHNvdXJjZSBhbnkgVmVydGV4IGV4Y2VwdCBlbnRyeSBwb2ludHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRyYW5zaXRpb24tc3RhdGVfaXNfZXh0ZXJuYWwtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihraW5kID0gVHJhbnNpdGlvbktpbmQ6OmV4dGVybmFsKSBpbXBsaWVzJiN4RDsKLQlub3QgKHNvdXJjZS5vY2xJc0tpbmRPZihQc2V1ZG9zdGF0ZSkgYW5kIHNvdXJjZS5vY2xBc1R5cGUoUHNldWRvc3RhdGUpLmtpbmQgPSBQc2V1ZG9zdGF0ZUtpbmQ6OmVudHJ5UG9pbnQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJUcmFuc2l0aW9uLWpvaW5fc2VnbWVudF9ndWFyZHMiIG5hbWU9ImpvaW5fc2VnbWVudF9ndWFyZHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVHJhbnNpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmFuc2l0aW9uLWpvaW5fc2VnbWVudF9ndWFyZHMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmFuc2l0aW9uLWpvaW5fc2VnbWVudF9ndWFyZHMiPgotICAgICAgICAgIDxib2R5PkEgam9pbiBzZWdtZW50IG11c3Qgbm90IGhhdmUgR3VhcmRzIG9yIFRyaWdnZXJzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUcmFuc2l0aW9uLWpvaW5fc2VnbWVudF9ndWFyZHMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pih0YXJnZXQub2NsSXNLaW5kT2YoUHNldWRvc3RhdGUpIGFuZCB0YXJnZXQub2NsQXNUeXBlKFBzZXVkb3N0YXRlKS5raW5kID0gUHNldWRvc3RhdGVLaW5kOjpqb2luKSBpbXBsaWVzIChndWFyZCA9IG51bGwgYW5kIHRyaWdnZXItPmlzRW1wdHkoKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRyYW5zaXRpb24tc3RhdGVfaXNfaW50ZXJuYWwiIG5hbWU9InN0YXRlX2lzX2ludGVybmFsIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlRyYW5zaXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJhbnNpdGlvbi1zdGF0ZV9pc19pbnRlcm5hbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyYW5zaXRpb24tc3RhdGVfaXNfaW50ZXJuYWwiPgotICAgICAgICAgIDxib2R5PkEgVHJhbnNpdGlvbiB3aXRoIGtpbmQgaW50ZXJuYWwgbXVzdCBoYXZlIGEgU3RhdGUgYXMgaXRzIHNvdXJjZSwgYW5kIGl0cyBzb3VyY2UgYW5kIHRhcmdldCBtdXN0IGJlIGVxdWFsLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUcmFuc2l0aW9uLXN0YXRlX2lzX2ludGVybmFsLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oa2luZCA9IFRyYW5zaXRpb25LaW5kOjppbnRlcm5hbCkgaW1wbGllcyYjeEQ7Ci0JCShzb3VyY2Uub2NsSXNLaW5kT2YgKFN0YXRlKSBhbmQgc291cmNlID0gdGFyZ2V0KTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVHJhbnNpdGlvbi1vdXRnb2luZ19wc2V1ZG9zdGF0ZXMiIG5hbWU9Im91dGdvaW5nX3BzZXVkb3N0YXRlcyIgY29uc3RyYWluZWRFbGVtZW50PSJUcmFuc2l0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRyYW5zaXRpb24tb3V0Z29pbmdfcHNldWRvc3RhdGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHJhbnNpdGlvbi1vdXRnb2luZ19wc2V1ZG9zdGF0ZXMiPgotICAgICAgICAgIDxib2R5PlRyYW5zaXRpb25zIG91dGdvaW5nIFBzZXVkb3N0YXRlcyBtYXkgbm90IGhhdmUgYSBUcmlnZ2VyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUcmFuc2l0aW9uLW91dGdvaW5nX3BzZXVkb3N0YXRlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c291cmNlLm9jbElzS2luZE9mKFBzZXVkb3N0YXRlKSBhbmQgKHNvdXJjZS5vY2xBc1R5cGUoUHNldWRvc3RhdGUpLmtpbmQgJmx0Oz4gUHNldWRvc3RhdGVLaW5kOjppbml0aWFsKSBpbXBsaWVzIHRyaWdnZXItPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVHJhbnNpdGlvbi1qb2luX3NlZ21lbnRfc3RhdGUiIG5hbWU9ImpvaW5fc2VnbWVudF9zdGF0ZSIgY29uc3RyYWluZWRFbGVtZW50PSJUcmFuc2l0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRyYW5zaXRpb24tam9pbl9zZWdtZW50X3N0YXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHJhbnNpdGlvbi1qb2luX3NlZ21lbnRfc3RhdGUiPgotICAgICAgICAgIDxib2R5PkEgam9pbiBzZWdtZW50IG11c3QgYWx3YXlzIG9yaWdpbmF0ZSBmcm9tIGEgU3RhdGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRyYW5zaXRpb24tam9pbl9zZWdtZW50X3N0YXRlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4odGFyZ2V0Lm9jbElzS2luZE9mKFBzZXVkb3N0YXRlKSBhbmQgdGFyZ2V0Lm9jbEFzVHlwZShQc2V1ZG9zdGF0ZSkua2luZCA9IFBzZXVkb3N0YXRlS2luZDo6am9pbikgaW1wbGllcyAoc291cmNlLm9jbElzS2luZE9mKFN0YXRlKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRyYW5zaXRpb24tZm9ya19zZWdtZW50X3N0YXRlIiBuYW1lPSJmb3JrX3NlZ21lbnRfc3RhdGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iVHJhbnNpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmFuc2l0aW9uLWZvcmtfc2VnbWVudF9zdGF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyYW5zaXRpb24tZm9ya19zZWdtZW50X3N0YXRlIj4KLSAgICAgICAgICA8Ym9keT5BIGZvcmsgc2VnbWVudCBtdXN0IGFsd2F5cyB0YXJnZXQgYSBTdGF0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVHJhbnNpdGlvbi1mb3JrX3NlZ21lbnRfc3RhdGUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pihzb3VyY2Uub2NsSXNLaW5kT2YoUHNldWRvc3RhdGUpIGFuZCAgc291cmNlLm9jbEFzVHlwZShQc2V1ZG9zdGF0ZSkua2luZCA9IFBzZXVkb3N0YXRlS2luZDo6Zm9yaykgaW1wbGllcyAodGFyZ2V0Lm9jbElzS2luZE9mKFN0YXRlKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRyYW5zaXRpb24tc3RhdGVfaXNfbG9jYWwiIG5hbWU9InN0YXRlX2lzX2xvY2FsIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlRyYW5zaXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJhbnNpdGlvbi1zdGF0ZV9pc19sb2NhbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyYW5zaXRpb24tc3RhdGVfaXNfbG9jYWwiPgotICAgICAgICAgIDxib2R5PkEgVHJhbnNpdGlvbiB3aXRoIGtpbmQgbG9jYWwgbXVzdCBoYXZlIGEgY29tcG9zaXRlIFN0YXRlIG9yIGFuIGVudHJ5IHBvaW50IGFzIGl0cyBzb3VyY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRyYW5zaXRpb24tc3RhdGVfaXNfbG9jYWwtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PihraW5kID0gVHJhbnNpdGlvbktpbmQ6OmxvY2FsKSBpbXBsaWVzJiN4RDsKLQkJKChzb3VyY2Uub2NsSXNLaW5kT2YgKFN0YXRlKSBhbmQgc291cmNlLm9jbEFzVHlwZShTdGF0ZSkuaXNDb21wb3NpdGUpIG9yJiN4RDsKLQkJKHNvdXJjZS5vY2xJc0tpbmRPZiAoUHNldWRvc3RhdGUpIGFuZCBzb3VyY2Uub2NsQXNUeXBlKFBzZXVkb3N0YXRlKS5raW5kID0gUHNldWRvc3RhdGVLaW5kOjplbnRyeVBvaW50KSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRyYW5zaXRpb24taW5pdGlhbF90cmFuc2l0aW9uIiBuYW1lPSJpbml0aWFsX3RyYW5zaXRpb24iIGNvbnN0cmFpbmVkRWxlbWVudD0iVHJhbnNpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmFuc2l0aW9uLWluaXRpYWxfdHJhbnNpdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyYW5zaXRpb24taW5pdGlhbF90cmFuc2l0aW9uIj4KLSAgICAgICAgICA8Ym9keT5BbiBpbml0aWFsIFRyYW5zaXRpb24gYXQgdGhlIHRvcG1vc3QgbGV2ZWwgUmVnaW9uIG9mIGEgU3RhdGVNYWNoaW5lIHRoYXQgaGFzIG5vIFRyaWdnZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRyYW5zaXRpb24taW5pdGlhbF90cmFuc2l0aW9uLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oc291cmNlLm9jbElzS2luZE9mKFBzZXVkb3N0YXRlKSBhbmQgY29udGFpbmVyLnN0YXRlTWFjaGluZS0+bm90RW1wdHkoKSkgaW1wbGllcwotCXRyaWdnZXItPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVHJhbnNpdGlvbi1mb3JrX3NlZ21lbnRfZ3VhcmRzIiBuYW1lPSJmb3JrX3NlZ21lbnRfZ3VhcmRzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlRyYW5zaXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJhbnNpdGlvbi1mb3JrX3NlZ21lbnRfZ3VhcmRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHJhbnNpdGlvbi1mb3JrX3NlZ21lbnRfZ3VhcmRzIj4KLSAgICAgICAgICA8Ym9keT5BIGZvcmsgc2VnbWVudCBtdXN0IG5vdCBoYXZlIEd1YXJkcyBvciBUcmlnZ2Vycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVHJhbnNpdGlvbi1mb3JrX3NlZ21lbnRfZ3VhcmRzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT4oc291cmNlLm9jbElzS2luZE9mKFBzZXVkb3N0YXRlKSBhbmQgc291cmNlLm9jbEFzVHlwZShQc2V1ZG9zdGF0ZSkua2luZCA9IFBzZXVkb3N0YXRlS2luZDo6Zm9yaykgaW1wbGllcyAoZ3VhcmQgPSBudWxsIGFuZCB0cmlnZ2VyLT5pc0VtcHR5KCkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlRyYW5zaXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9Ik5hbWVzcGFjZSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iVHJhbnNpdGlvbi1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iUmVkZWZpbmFibGVFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUcmFuc2l0aW9uLWNvbnRhaW5lciIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJSZWdpb24iIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV90cmFuc2l0aW9uX2NvbnRhaW5lciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmFuc2l0aW9uLWNvbnRhaW5lci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyYW5zaXRpb24tY29udGFpbmVyIj4KLSAgICAgICAgICA8Ym9keT5EZXNpZ25hdGVzIHRoZSBSZWdpb24gdGhhdCBvd25zIHRoaXMgVHJhbnNpdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRyYW5zaXRpb24tZWZmZWN0IiBuYW1lPSJlZmZlY3QiIHR5cGU9IkJlaGF2aW9yIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2VmZmVjdF90cmFuc2l0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRyYW5zaXRpb24tZWZmZWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHJhbnNpdGlvbi1lZmZlY3QiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyBhbiBvcHRpb25hbCBiZWhhdmlvciB0byBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgVHJhbnNpdGlvbiBmaXJlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlRyYW5zaXRpb24tZWZmZWN0LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVHJhbnNpdGlvbi1ndWFyZCIgbmFtZT0iZ3VhcmQiIHR5cGU9IkNvbnN0cmFpbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRSdWxlIiBhc3NvY2lhdGlvbj0iQV9ndWFyZF90cmFuc2l0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRyYW5zaXRpb24tZ3VhcmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmFuc2l0aW9uLWd1YXJkIj4KLSAgICAgICAgICA8Ym9keT5BIGd1YXJkIGlzIGEgQ29uc3RyYWludCB0aGF0IHByb3ZpZGVzIGEgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciB0aGUgZmlyaW5nIG9mIHRoZSBUcmFuc2l0aW9uLiBUaGUgZ3VhcmQgaXMgZXZhbHVhdGVkIHdoZW4gYW4gRXZlbnQgb2NjdXJyZW5jZSBpcyBkaXNwYXRjaGVkIGJ5IHRoZSBTdGF0ZU1hY2hpbmUuIElmIHRoZSBndWFyZCBpcyB0cnVlIGF0IHRoYXQgdGltZSwgdGhlIFRyYW5zaXRpb24gbWF5IGJlIGVuYWJsZWQsIG90aGVyd2lzZSwgaXQgaXMgZGlzYWJsZWQuIEd1YXJkcyBzaG91bGQgYmUgcHVyZSBleHByZXNzaW9ucyB3aXRob3V0IHNpZGUgZWZmZWN0cy4gR3VhcmQgZXhwcmVzc2lvbnMgd2l0aCBzaWRlIGVmZmVjdHMgYXJlIGlsbCBmb3JtZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJUcmFuc2l0aW9uLWd1YXJkLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVHJhbnNpdGlvbi1raW5kIiBuYW1lPSJraW5kIiB0eXBlPSJUcmFuc2l0aW9uS2luZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmFuc2l0aW9uLWtpbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmFuc2l0aW9uLWtpbmQiPgotICAgICAgICAgIDxib2R5PkluZGljYXRlcyB0aGUgcHJlY2lzZSB0eXBlIG9mIHRoZSBUcmFuc2l0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpJbnN0YW5jZVZhbHVlIiB4bWk6aWQ9IlRyYW5zaXRpb24ta2luZC1fZGVmYXVsdFZhbHVlIiB0eXBlPSJUcmFuc2l0aW9uS2luZCIgaW5zdGFuY2U9IlRyYW5zaXRpb25LaW5kLWV4dGVybmFsIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVHJhbnNpdGlvbi1yZWRlZmluZWRUcmFuc2l0aW9uIiBuYW1lPSJyZWRlZmluZWRUcmFuc2l0aW9uIiB0eXBlPSJUcmFuc2l0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5lZFRyYW5zaXRpb25fdHJhbnNpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmFuc2l0aW9uLXJlZGVmaW5lZFRyYW5zaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmFuc2l0aW9uLXJlZGVmaW5lZFRyYW5zaXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBUcmFuc2l0aW9uIHRoYXQgaXMgcmVkZWZpbmVkIGJ5IHRoaXMgVHJhbnNpdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlRyYW5zaXRpb24tcmVkZWZpbmVkVHJhbnNpdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRyYW5zaXRpb24tcmVkZWZpbml0aW9uQ29udGV4dCIgbmFtZT0icmVkZWZpbml0aW9uQ29udGV4dCIgdHlwZT0iQ2xhc3NpZmllciIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiByZWRlZmluZWRQcm9wZXJ0eT0iUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5pdGlvbkNvbnRleHQiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfdHJhbnNpdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmFuc2l0aW9uLXJlZGVmaW5pdGlvbkNvbnRleHQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmFuc2l0aW9uLXJlZGVmaW5pdGlvbkNvbnRleHQiPgotICAgICAgICAgIDxib2R5PlJlZmVyZW5jZXMgdGhlIENsYXNzaWZpZXIgaW4gd2hpY2ggY29udGV4dCB0aGlzIGVsZW1lbnQgbWF5IGJlIHJlZGVmaW5lZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRyYW5zaXRpb24tc291cmNlIiBuYW1lPSJzb3VyY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iVmVydGV4IiBhc3NvY2lhdGlvbj0iQV9vdXRnb2luZ19zb3VyY2VfdmVydGV4Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRyYW5zaXRpb24tc291cmNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHJhbnNpdGlvbi1zb3VyY2UiPgotICAgICAgICAgIDxib2R5PkRlc2lnbmF0ZXMgdGhlIG9yaWdpbmF0aW5nIFZlcnRleCAoU3RhdGUgb3IgUHNldWRvc3RhdGUpIG9mIHRoZSBUcmFuc2l0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVHJhbnNpdGlvbi1zb3VyY2UtX2xvd2VyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iVHJhbnNpdGlvbi1zb3VyY2UtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVHJhbnNpdGlvbi10YXJnZXQiIG5hbWU9InRhcmdldCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJWZXJ0ZXgiIGFzc29jaWF0aW9uPSJBX2luY29taW5nX3RhcmdldF92ZXJ0ZXgiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJhbnNpdGlvbi10YXJnZXQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmFuc2l0aW9uLXRhcmdldCI+Ci0gICAgICAgICAgPGJvZHk+RGVzaWduYXRlcyB0aGUgdGFyZ2V0IFZlcnRleCB0aGF0IGlzIHJlYWNoZWQgd2hlbiB0aGUgVHJhbnNpdGlvbiBpcyB0YWtlbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlRyYW5zaXRpb24tdGFyZ2V0LV9sb3dlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlRyYW5zaXRpb24tdGFyZ2V0LV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRyYW5zaXRpb24tdHJpZ2dlciIgbmFtZT0idHJpZ2dlciIgdHlwZT0iVHJpZ2dlciIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV90cmlnZ2VyX3RyYW5zaXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJhbnNpdGlvbi10cmlnZ2VyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHJhbnNpdGlvbi10cmlnZ2VyIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhlIFRyaWdnZXJzIHRoYXQgbWF5IGZpcmUgdGhlIHRyYW5zaXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJUcmFuc2l0aW9uLXRyaWdnZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJUcmFuc2l0aW9uLXRyaWdnZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iVHJhbnNpdGlvbi1jb250YWluaW5nU3RhdGVNYWNoaW5lIiBuYW1lPSJjb250YWluaW5nU3RhdGVNYWNoaW5lIiBib2R5Q29uZGl0aW9uPSJUcmFuc2l0aW9uLWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmFuc2l0aW9uLWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmFuc2l0aW9uLWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBjb250YWluaW5nU3RhdGVNYWNoaW5lKCkgcmV0dXJucyB0aGUgU3RhdGVNYWNoaW5lIHRoYXQgY29udGFpbnMgdGhlIFRyYW5zaXRpb24gZWl0aGVyIGRpcmVjdGx5IG9yIHRyYW5zaXRpdmVseS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iVHJhbnNpdGlvbi1jb250YWluaW5nU3RhdGVNYWNoaW5lLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVHJhbnNpdGlvbi1jb250YWluaW5nU3RhdGVNYWNoaW5lIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVHJhbnNpdGlvbi1jb250YWluaW5nU3RhdGVNYWNoaW5lLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoY29udGFpbmVyLmNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVHJhbnNpdGlvbi1jb250YWluaW5nU3RhdGVNYWNoaW5lLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJTdGF0ZU1hY2hpbmUiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iVHJhbnNpdGlvbi1pc0NvbnNpc3RlbnRXaXRoIiBuYW1lPSJpc0NvbnNpc3RlbnRXaXRoIiBib2R5Q29uZGl0aW9uPSJUcmFuc2l0aW9uLWlzQ29uc2lzdGVudFdpdGgtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcHJlY29uZGl0aW9uPSJUcmFuc2l0aW9uLWlzQ29uc2lzdGVudFdpdGgtcHJlIiByZWRlZmluZWRPcGVyYXRpb249IlJlZGVmaW5hYmxlRWxlbWVudC1pc0NvbnNpc3RlbnRXaXRoIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRyYW5zaXRpb24taXNDb25zaXN0ZW50V2l0aC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyYW5zaXRpb24taXNDb25zaXN0ZW50V2l0aCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzQ29uc2lzdGVudFdpdGgoKSBzcGVjaWZpZXMgdGhhdCBhIHJlZGVmaW5pbmcgVHJhbnNpdGlvbiBpcyBjb25zaXN0ZW50IHdpdGggYSByZWRlZmluZWQgVHJhbnNpdGlvbiBwcm92aWRlZCB0aGF0IHRoZSByZWRlZmluaW5nIFRyYW5zaXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgcmVsYXRpb24gdG8gdGhlIHJlZGVmaW5lZCBUcmFuc2l0aW9uOiBBIHJlZGVmaW5pbmcgVHJhbnNpdGlvbiByZWRlZmluZXMgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcmVkZWZpbmVkIFRyYW5zaXRpb24gZXhjZXB0IHRoZSBzb3VyY2UgU3RhdGUgYW5kIHRoZSBUcmlnZ2VyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJUcmFuc2l0aW9uLWlzQ29uc2lzdGVudFdpdGgtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJUcmFuc2l0aW9uLWlzQ29uc2lzdGVudFdpdGgiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUcmFuc2l0aW9uLWlzQ29uc2lzdGVudFdpdGgtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICgtLSB0aGUgZm9sbG93aW5nIGlzIG1lcmVseSBhIGRlZmF1bHQgYm9keTsgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgc3BlY2lmaWMgZm9ybSBvZiB0aGlzIGNvbnN0cmFpbnQgd2lsbCBiZSBzcGVjaWZpZWQgYnkgcHJvZmlsZXMmI3hEOwotdHJ1ZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRyYW5zaXRpb24taXNDb25zaXN0ZW50V2l0aC1wcmUiIG5hbWU9InByZSIgY29uc3RyYWluZWRFbGVtZW50PSJUcmFuc2l0aW9uLWlzQ29uc2lzdGVudFdpdGgiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUcmFuc2l0aW9uLWlzQ29uc2lzdGVudFdpdGgtcHJlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVkZWZpbmluZ0VsZW1lbnQuaXNSZWRlZmluaXRpb25Db250ZXh0VmFsaWQoc2VsZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVHJhbnNpdGlvbi1pc0NvbnNpc3RlbnRXaXRoLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJUcmFuc2l0aW9uLWlzQ29uc2lzdGVudFdpdGgtcmVkZWZpbmluZ0VsZW1lbnQiIG5hbWU9InJlZGVmaW5pbmdFbGVtZW50IiB0eXBlPSJSZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJUcmFuc2l0aW9uLXJlZGVmaW5pdGlvbkNvbnRleHQuMSIgbmFtZT0icmVkZWZpbml0aW9uQ29udGV4dCIgYm9keUNvbmRpdGlvbj0iVHJhbnNpdGlvbi1yZWRlZmluaXRpb25Db250ZXh0LjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmFuc2l0aW9uLXJlZGVmaW5pdGlvbkNvbnRleHQuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyYW5zaXRpb24tcmVkZWZpbml0aW9uQ29udGV4dC4xIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcmVkZWZpbml0aW9uIGNvbnRleHQgb2YgYSBUcmFuc2l0aW9uIGlzIHRoZSBuZWFyZXN0IGNvbnRhaW5pbmcgU3RhdGVNYWNoaW5lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJUcmFuc2l0aW9uLXJlZGVmaW5pdGlvbkNvbnRleHQuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlRyYW5zaXRpb24tcmVkZWZpbml0aW9uQ29udGV4dC4xIFRyYW5zaXRpb24tcmVkZWZpbml0aW9uQ29udGV4dCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRyYW5zaXRpb24tcmVkZWZpbml0aW9uQ29udGV4dC4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobGV0IHNtIDogU3RhdGVNYWNoaW5lID0gY29udGFpbmluZ1N0YXRlTWFjaGluZSgpIGluCi1pZiBzbS5fJ2NvbnRleHQnID0gbnVsbCBvciBzbS5nZW5lcmFsLT5ub3RFbXB0eSgpIHRoZW4KLSAgc20KLWVsc2UKLSAgc20uXydjb250ZXh0JwotZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlRyYW5zaXRpb24tcmVkZWZpbml0aW9uQ29udGV4dC4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJDbGFzc2lmaWVyIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVmVydGV4IiBuYW1lPSJWZXJ0ZXgiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZlcnRleC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZlcnRleCI+Ci0gICAgICAgIDxib2R5PkEgVmVydGV4IGlzIGFuIGFic3RyYWN0aW9uIG9mIGEgbm9kZSBpbiBhIFN0YXRlTWFjaGluZSBncmFwaC4gSXQgY2FuIGJlIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb2YgYW55IG51bWJlciBvZiBUcmFuc2l0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlZlcnRleC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTmFtZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJWZXJ0ZXgtY29udGFpbmVyIiBuYW1lPSJjb250YWluZXIiIHR5cGU9IlJlZ2lvbiIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX3N1YnZlcnRleF9jb250YWluZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVmVydGV4LWNvbnRhaW5lci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZlcnRleC1jb250YWluZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBSZWdpb24gdGhhdCBjb250YWlucyB0aGlzIFZlcnRleC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlZlcnRleC1jb250YWluZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJWZXJ0ZXgtaW5jb21pbmciIG5hbWU9ImluY29taW5nIiB0eXBlPSJUcmFuc2l0aW9uIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX3RhcmdldF92ZXJ0ZXhfaW5jb21pbmciPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVmVydGV4LWluY29taW5nLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmVydGV4LWluY29taW5nIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgdGhlIFRyYW5zaXRpb25zIGVudGVyaW5nIHRoaXMgVmVydGV4LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVmVydGV4LWluY29taW5nLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iVmVydGV4LWluY29taW5nLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlZlcnRleC1vdXRnb2luZyIgbmFtZT0ib3V0Z29pbmciIHR5cGU9IlRyYW5zaXRpb24iIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfc291cmNlX3ZlcnRleF9vdXRnb2luZyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWZXJ0ZXgtb3V0Z29pbmctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWZXJ0ZXgtb3V0Z29pbmciPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB0aGUgVHJhbnNpdGlvbnMgZGVwYXJ0aW5nIGZyb20gdGhpcyBWZXJ0ZXguPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJWZXJ0ZXgtb3V0Z29pbmctX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJWZXJ0ZXgtb3V0Z29pbmctX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iVmVydGV4LWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUiIG5hbWU9ImNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUiIGJvZHlDb25kaXRpb249IlZlcnRleC1jb250YWluaW5nU3RhdGVNYWNoaW5lLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVmVydGV4LWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWZXJ0ZXgtY29udGFpbmluZ1N0YXRlTWFjaGluZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIG9wZXJhdGlvbiBjb250YWluaW5nU3RhdGVNYWNoaW5lKCkgcmV0dXJucyB0aGUgU3RhdGVNYWNoaW5lIGluIHdoaWNoIHRoaXMgVmVydGV4IGlzIGRlZmluZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlZlcnRleC1jb250YWluaW5nU3RhdGVNYWNoaW5lLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVmVydGV4LWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJWZXJ0ZXgtY29udGFpbmluZ1N0YXRlTWFjaGluZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIGNvbnRhaW5lciAmbHQ7PiBudWxsCi10aGVuCi0tLSB0aGUgY29udGFpbmVyIGlzIGEgcmVnaW9uCi0gICBjb250YWluZXIuY29udGFpbmluZ1N0YXRlTWFjaGluZSgpCi1lbHNlIAotICAgaWYgKHNlbGYub2NsSXNLaW5kT2YoUHNldWRvc3RhdGUpKSBhbmQgKChzZWxmLm9jbEFzVHlwZShQc2V1ZG9zdGF0ZSkua2luZCA9IFBzZXVkb3N0YXRlS2luZDo6ZW50cnlQb2ludCkgb3IgKHNlbGYub2NsQXNUeXBlKFBzZXVkb3N0YXRlKS5raW5kID0gUHNldWRvc3RhdGVLaW5kOjpleGl0UG9pbnQpKSB0aGVuCi0gICAgICBzZWxmLm9jbEFzVHlwZShQc2V1ZG9zdGF0ZSkuc3RhdGVNYWNoaW5lCi0gICBlbHNlIAotICAgICAgaWYgKHNlbGYub2NsSXNLaW5kT2YoQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlKSkgdGhlbgotICAgICAgICAgIHNlbGYub2NsQXNUeXBlKENvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZSkuc3RhdGUuY29udGFpbmluZ1N0YXRlTWFjaGluZSgpIC0tIG5vIG90aGVyIHZhbGlkIGNhc2VzIHBvc3NpYmxlCi0gICAgICBlbHNlIAotICAgICAgICAgIG51bGwKLSAgICAgIGVuZGlmCi0gICBlbmRpZgotZW5kaWYKLSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVmVydGV4LWNvbnRhaW5pbmdTdGF0ZU1hY2hpbmUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlN0YXRlTWFjaGluZSIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJWZXJ0ZXgtaW5jb21pbmcuMSIgbmFtZT0iaW5jb21pbmciIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iVmVydGV4LWluY29taW5nLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWZXJ0ZXgtaW5jb21pbmcuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZlcnRleC1pbmNvbWluZy4xIj4KLSAgICAgICAgICA8Ym9keT5EZXJpdmF0aW9uIGZvciBWZXJ0ZXg6Oi9pbmNvbWluZy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iVmVydGV4LWluY29taW5nLjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJWZXJ0ZXgtaW5jb21pbmcuMSBWZXJ0ZXgtaW5jb21pbmciPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJWZXJ0ZXgtaW5jb21pbmcuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKFRyYW5zaXRpb24uYWxsSW5zdGFuY2VzKCktPnNlbGVjdCh0YXJnZXQ9c2VsZikpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlZlcnRleC1pbmNvbWluZy4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJUcmFuc2l0aW9uIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJWZXJ0ZXgtaW5jb21pbmcuMS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlZlcnRleC1pbmNvbWluZy4xLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJWZXJ0ZXgtb3V0Z29pbmcuMSIgbmFtZT0ib3V0Z29pbmciIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iVmVydGV4LW91dGdvaW5nLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWZXJ0ZXgtb3V0Z29pbmcuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZlcnRleC1vdXRnb2luZy4xIj4KLSAgICAgICAgICA8Ym9keT5EZXJpdmF0aW9uIGZvciBWZXJ0ZXg6Oi9vdXRnb2luZzwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJWZXJ0ZXgtb3V0Z29pbmcuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlZlcnRleC1vdXRnb2luZy4xIFZlcnRleC1vdXRnb2luZyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlZlcnRleC1vdXRnb2luZy4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoVHJhbnNpdGlvbi5hbGxJbnN0YW5jZXMoKS0+c2VsZWN0KHNvdXJjZT1zZWxmKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVmVydGV4LW91dGdvaW5nLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlRyYW5zaXRpb24iIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlZlcnRleC1vdXRnb2luZy4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iVmVydGV4LW91dGdvaW5nLjEtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlZlcnRleC1pc0NvbnRhaW5lZEluU3RhdGUiIG5hbWU9ImlzQ29udGFpbmVkSW5TdGF0ZSIgYm9keUNvbmRpdGlvbj0iVmVydGV4LWlzQ29udGFpbmVkSW5TdGF0ZS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZlcnRleC1pc0NvbnRhaW5lZEluU3RhdGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWZXJ0ZXgtaXNDb250YWluZWRJblN0YXRlIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIHV0aWxpdHkgb3BlcmF0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgVmVydGV4IGlzIGNvbnRhaW5lZCBpbiB0aGUgU3RhdGUgcyAoaW5wdXQgYXJndW1lbnQpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJWZXJ0ZXgtaXNDb250YWluZWRJblN0YXRlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVmVydGV4LWlzQ29udGFpbmVkSW5TdGF0ZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlZlcnRleC1pc0NvbnRhaW5lZEluU3RhdGUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBub3Qgcy5pc0NvbXBvc2l0ZSgpIG9yIGNvbnRhaW5lci0+aXNFbXB0eSgpIHRoZW4mI3hEOwotCWZhbHNlJiN4RDsKLWVsc2UmI3hEOwotCWlmIGNvbnRhaW5lci5zdGF0ZSA9IHMgdGhlbiAmI3hEOwotCQl0cnVlJiN4RDsKLQllbHNlJiN4RDsKLQkJY29udGFpbmVyLnN0YXRlLmlzQ29udGFpbmVkSW5TdGF0ZShzKSYjeEQ7Ci0JZW5kaWYmI3hEOwotZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlZlcnRleC1pc0NvbnRhaW5lZEluU3RhdGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlZlcnRleC1pc0NvbnRhaW5lZEluU3RhdGUtcyIgbmFtZT0icyIgdHlwZT0iU3RhdGUiLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJWZXJ0ZXgtaXNDb250YWluZWRJblJlZ2lvbiIgbmFtZT0iaXNDb250YWluZWRJblJlZ2lvbiIgYm9keUNvbmRpdGlvbj0iVmVydGV4LWlzQ29udGFpbmVkSW5SZWdpb24tc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWZXJ0ZXgtaXNDb250YWluZWRJblJlZ2lvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZlcnRleC1pc0NvbnRhaW5lZEluUmVnaW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIHV0aWxpdHkgcXVlcnkgcmV0dXJucyB0cnVlIGlmIHRoZSBWZXJ0ZXggaXMgY29udGFpbmVkIGluIHRoZSBSZWdpb24gciAoaW5wdXQgYXJndW1lbnQpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJWZXJ0ZXgtaXNDb250YWluZWRJblJlZ2lvbi1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlZlcnRleC1pc0NvbnRhaW5lZEluUmVnaW9uIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVmVydGV4LWlzQ29udGFpbmVkSW5SZWdpb24tc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiAoY29udGFpbmVyID0gcikgdGhlbiYjeEQ7Ci0JdHJ1ZSYjeEQ7Ci1lbHNlJiN4RDsKLQlpZiAoci5zdGF0ZS0+aXNFbXB0eSgpKSB0aGVuJiN4RDsKLQkJZmFsc2UmI3hEOwotCWVsc2UmI3hEOwotCQljb250YWluZXIuc3RhdGUuaXNDb250YWluZWRJblJlZ2lvbihyKSYjeEQ7Ci0JZW5kaWYmI3hEOwotZW5kaWYpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlZlcnRleC1pc0NvbnRhaW5lZEluUmVnaW9uLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJWZXJ0ZXgtaXNDb250YWluZWRJblJlZ2lvbi1yIiBuYW1lPSJyIiB0eXBlPSJSZWdpb24iLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkVudW1lcmF0aW9uIiB4bWk6aWQ9IlBzZXVkb3N0YXRlS2luZCIgbmFtZT0iUHNldWRvc3RhdGVLaW5kIiB2aXNpYmlsaXR5PSJwcml2YXRlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQc2V1ZG9zdGF0ZUtpbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZUtpbmQiPgotICAgICAgICA8Ym9keT5Qc2V1ZG9zdGF0ZUtpbmQgaXMgYW4gRW51bWVyYXRpb24gdHlwZSB0aGF0IGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB2YXJpb3VzIGtpbmRzIG9mIFBzZXVkb3N0YXRlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJQc2V1ZG9zdGF0ZUtpbmQtaW5pdGlhbCIgbmFtZT0iaW5pdGlhbCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQc2V1ZG9zdGF0ZUtpbmQtaW5pdGlhbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBzZXVkb3N0YXRlS2luZC1pbml0aWFsIj4KLSAgICAgICAgICA8Ym9keT5BbiBpbml0aWFsIHBzZXVkb3N0YXRlIHJlcHJlc2VudHMgYSBkZWZhdWx0IHZlcnRleCB0aGF0IGlzIHRoZSBzb3VyY2UgZm9yIGEgc2luZ2xlIHRyYW5zaXRpb24gdG8gdGhlIGRlZmF1bHQgc3RhdGUgb2YgYSBjb21wb3NpdGUgc3RhdGUuIFRoZXJlIGNhbiBiZSBhdCBtb3N0IG9uZSBpbml0aWFsIHZlcnRleCBpbiBhIHJlZ2lvbi4gVGhlIG91dGdvaW5nIHRyYW5zaXRpb24gZnJvbSB0aGUgaW5pdGlhbCB2ZXJ0ZXggbWF5IGhhdmUgYSBiZWhhdmlvciwgYnV0IG5vdCBhIHRyaWdnZXIgb3IgZ3VhcmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IlBzZXVkb3N0YXRlS2luZC1kZWVwSGlzdG9yeSIgbmFtZT0iZGVlcEhpc3RvcnkiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHNldWRvc3RhdGVLaW5kLWRlZXBIaXN0b3J5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHNldWRvc3RhdGVLaW5kLWRlZXBIaXN0b3J5Ij4KLSAgICAgICAgICA8Ym9keT5EZWVwSGlzdG9yeSByZXByZXNlbnRzIHRoZSBtb3N0IHJlY2VudCBhY3RpdmUgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcG9zaXRlIHN0YXRlIHRoYXQgZGlyZWN0bHkgY29udGFpbnMgdGhpcyBwc2V1ZG9zdGF0ZTsgZS5nLiB0aGUgc3RhdGUgY29uZmlndXJhdGlvbiB0aGF0IHdhcyBhY3RpdmUgd2hlbiB0aGUgY29tcG9zaXRlIHN0YXRlIHdhcyBsYXN0IGV4aXRlZC4gQSBjb21wb3NpdGUgc3RhdGUgY2FuIGhhdmUgYXQgbW9zdCBvbmUgZGVlcCBoaXN0b3J5IHZlcnRleC4gQXQgbW9zdCBvbmUgdHJhbnNpdGlvbiBtYXkgb3JpZ2luYXRlIGZyb20gdGhlIGhpc3RvcnkgY29ubmVjdG9yIHRvIHRoZSBkZWZhdWx0IGRlZXAgaGlzdG9yeSBzdGF0ZS4gVGhpcyB0cmFuc2l0aW9uIGlzIHRha2VuIGluIGNhc2UgdGhlIGNvbXBvc2l0ZSBzdGF0ZSBoYWQgbmV2ZXIgYmVlbiBhY3RpdmUgYmVmb3JlLiBFbnRyeSBhY3Rpb25zIG9mIHN0YXRlcyBlbnRlcmVkIG9uIHRoZSBwYXRoIHRvIHRoZSBzdGF0ZSByZXByZXNlbnRlZCBieSBhIGRlZXAgaGlzdG9yeSBhcmUgcGVyZm9ybWVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJQc2V1ZG9zdGF0ZUtpbmQtc2hhbGxvd0hpc3RvcnkiIG5hbWU9InNoYWxsb3dIaXN0b3J5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBzZXVkb3N0YXRlS2luZC1zaGFsbG93SGlzdG9yeS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBzZXVkb3N0YXRlS2luZC1zaGFsbG93SGlzdG9yeSI+Ci0gICAgICAgICAgPGJvZHk+U2hhbGxvd0hpc3RvcnkgcmVwcmVzZW50cyB0aGUgbW9zdCByZWNlbnQgYWN0aXZlIHN1YnN0YXRlIG9mIGl0cyBjb250YWluaW5nIHN0YXRlIChidXQgbm90IHRoZSBzdWJzdGF0ZXMgb2YgdGhhdCBzdWJzdGF0ZSkuIEEgY29tcG9zaXRlIHN0YXRlIGNhbiBoYXZlIGF0IG1vc3Qgb25lIHNoYWxsb3cgaGlzdG9yeSB2ZXJ0ZXguIEEgdHJhbnNpdGlvbiBjb21pbmcgaW50byB0aGUgc2hhbGxvdyBoaXN0b3J5IHZlcnRleCBpcyBlcXVpdmFsZW50IHRvIGEgdHJhbnNpdGlvbiBjb21pbmcgaW50byB0aGUgbW9zdCByZWNlbnQgYWN0aXZlIHN1YnN0YXRlIG9mIGEgc3RhdGUuIEF0IG1vc3Qgb25lIHRyYW5zaXRpb24gbWF5IG9yaWdpbmF0ZSBmcm9tIHRoZSBoaXN0b3J5IGNvbm5lY3RvciB0byB0aGUgZGVmYXVsdCBzaGFsbG93IGhpc3Rvcnkgc3RhdGUuIFRoaXMgdHJhbnNpdGlvbiBpcyB0YWtlbiBpbiBjYXNlIHRoZSBjb21wb3NpdGUgc3RhdGUgaGFkIG5ldmVyIGJlZW4gYWN0aXZlIGJlZm9yZS4gRW50cnkgYWN0aW9ucyBvZiBzdGF0ZXMgZW50ZXJlZCBvbiB0aGUgcGF0aCB0byB0aGUgc3RhdGUgcmVwcmVzZW50ZWQgYnkgYSBzaGFsbG93IGhpc3RvcnkgYXJlIHBlcmZvcm1lZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iUHNldWRvc3RhdGVLaW5kLWpvaW4iIG5hbWU9ImpvaW4iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUHNldWRvc3RhdGVLaW5kLWpvaW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZUtpbmQtam9pbiI+Ci0gICAgICAgICAgPGJvZHk+Sm9pbiB2ZXJ0aWNlcyBzZXJ2ZSB0byBtZXJnZSBzZXZlcmFsIHRyYW5zaXRpb25zIGVtYW5hdGluZyBmcm9tIHNvdXJjZSB2ZXJ0aWNlcyBpbiBkaWZmZXJlbnQgb3J0aG9nb25hbCByZWdpb25zLiBUaGUgdHJhbnNpdGlvbnMgZW50ZXJpbmcgYSBqb2luIHZlcnRleCBjYW5ub3QgaGF2ZSBndWFyZHMgb3IgdHJpZ2dlcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IlBzZXVkb3N0YXRlS2luZC1mb3JrIiBuYW1lPSJmb3JrIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBzZXVkb3N0YXRlS2luZC1mb3JrLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHNldWRvc3RhdGVLaW5kLWZvcmsiPgotICAgICAgICAgIDxib2R5PkZvcmsgdmVydGljZXMgc2VydmUgdG8gc3BsaXQgYW4gaW5jb21pbmcgdHJhbnNpdGlvbiBpbnRvIHR3byBvciBtb3JlIHRyYW5zaXRpb25zIHRlcm1pbmF0aW5nIG9uIG9ydGhvZ29uYWwgdGFyZ2V0IHZlcnRpY2VzIChpLmUuIHZlcnRpY2VzIGluIGRpZmZlcmVudCByZWdpb25zIG9mIGEgY29tcG9zaXRlIHN0YXRlKS4gVGhlIHNlZ21lbnRzIG91dGdvaW5nIGZyb20gYSBmb3JrIHZlcnRleCBtdXN0IG5vdCBoYXZlIGd1YXJkcyBvciB0cmlnZ2Vycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iUHNldWRvc3RhdGVLaW5kLWp1bmN0aW9uIiBuYW1lPSJqdW5jdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQc2V1ZG9zdGF0ZUtpbmQtanVuY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZUtpbmQtanVuY3Rpb24iPgotICAgICAgICAgIDxib2R5Pkp1bmN0aW9uIHZlcnRpY2VzIGFyZSBzZW1hbnRpYy1mcmVlIHZlcnRpY2VzIHRoYXQgYXJlIHVzZWQgdG8gY2hhaW4gdG9nZXRoZXIgbXVsdGlwbGUgdHJhbnNpdGlvbnMuIFRoZXkgYXJlIHVzZWQgdG8gY29uc3RydWN0IGNvbXBvdW5kIHRyYW5zaXRpb24gcGF0aHMgYmV0d2VlbiBzdGF0ZXMuIEZvciBleGFtcGxlLCBhIGp1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbnZlcmdlIG11bHRpcGxlIGluY29taW5nIHRyYW5zaXRpb25zIGludG8gYSBzaW5nbGUgb3V0Z29pbmcgdHJhbnNpdGlvbiByZXByZXNlbnRpbmcgYSBzaGFyZWQgdHJhbnNpdGlvbiBwYXRoICh0aGlzIGlzIGtub3duIGFzIGFuIG1lcmdlKS4gQ29udmVyc2VseSwgdGhleSBjYW4gYmUgdXNlZCB0byBzcGxpdCBhbiBpbmNvbWluZyB0cmFuc2l0aW9uIGludG8gbXVsdGlwbGUgb3V0Z29pbmcgdHJhbnNpdGlvbiBzZWdtZW50cyB3aXRoIGRpZmZlcmVudCBndWFyZCBjb25kaXRpb25zLiBUaGlzIHJlYWxpemVzIGEgc3RhdGljIGNvbmRpdGlvbmFsIGJyYW5jaC4gKEluIHRoZSBsYXR0ZXIgY2FzZSwgb3V0Z29pbmcgdHJhbnNpdGlvbnMgd2hvc2UgZ3VhcmQgY29uZGl0aW9ucyBldmFsdWF0ZSB0byBmYWxzZSBhcmUgZGlzYWJsZWQuIEEgcHJlZGVmaW5lZCBndWFyZCBkZW5vdGVkICdlbHNlJyBtYXkgYmUgZGVmaW5lZCBmb3IgYXQgbW9zdCBvbmUgb3V0Z29pbmcgdHJhbnNpdGlvbi4gVGhpcyB0cmFuc2l0aW9uIGlzIGVuYWJsZWQgaWYgYWxsIHRoZSBndWFyZHMgbGFiZWxpbmcgdGhlIG90aGVyIHRyYW5zaXRpb25zIGFyZSBmYWxzZS4pIFN0YXRpYyBjb25kaXRpb25hbCBicmFuY2hlcyBhcmUgZGlzdGluY3QgZnJvbSBkeW5hbWljIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHRoYXQgYXJlIHJlYWxpemVkIGJ5IGNob2ljZSB2ZXJ0aWNlcyAoZGVzY3JpYmVkIGJlbG93KS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iUHNldWRvc3RhdGVLaW5kLWNob2ljZSIgbmFtZT0iY2hvaWNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBzZXVkb3N0YXRlS2luZC1jaG9pY2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZUtpbmQtY2hvaWNlIj4KLSAgICAgICAgICA8Ym9keT5DaG9pY2UgdmVydGljZXMgd2hpY2gsIHdoZW4gcmVhY2hlZCwgcmVzdWx0IGluIHRoZSBkeW5hbWljIGV2YWx1YXRpb24gb2YgdGhlIGd1YXJkcyBvZiB0aGUgdHJpZ2dlcnMgb2YgaXRzIG91dGdvaW5nIHRyYW5zaXRpb25zLiBUaGlzIHJlYWxpemVzIGEgZHluYW1pYyBjb25kaXRpb25hbCBicmFuY2guIEl0IGFsbG93cyBzcGxpdHRpbmcgb2YgdHJhbnNpdGlvbnMgaW50byBtdWx0aXBsZSBvdXRnb2luZyBwYXRocyBzdWNoIHRoYXQgdGhlIGRlY2lzaW9uIG9uIHdoaWNoIHBhdGggdG8gdGFrZSBtYXkgYmUgYSBmdW5jdGlvbiBvZiB0aGUgcmVzdWx0cyBvZiBwcmlvciBhY3Rpb25zIHBlcmZvcm1lZCBpbiB0aGUgc2FtZSBydW4tdG9jb21wbGV0aW9uIHN0ZXAuIElmIG1vcmUgdGhhbiBvbmUgb2YgdGhlIGd1YXJkcyBldmFsdWF0ZXMgdG8gdHJ1ZSwgYW4gYXJiaXRyYXJ5IG9uZSBpcyBzZWxlY3RlZC4gSWYgbm9uZSBvZiB0aGUgZ3VhcmRzIGV2YWx1YXRlcyB0byB0cnVlLCB0aGVuIHRoZSBtb2RlbCBpcyBjb25zaWRlcmVkIGlsbC1mb3JtZWQuIChUbyBhdm9pZCB0aGlzLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWZpbmUgb25lIG91dGdvaW5nIHRyYW5zaXRpb24gd2l0aCB0aGUgcHJlZGVmaW5lZCBlbHNlIGd1YXJkIGZvciBldmVyeSBjaG9pY2UgdmVydGV4LikgQ2hvaWNlIHZlcnRpY2VzIHNob3VsZCBiZSBkaXN0aW5ndWlzaGVkIGZyb20gc3RhdGljIGJyYW5jaCBwb2ludHMgdGhhdCBhcmUgYmFzZWQgb24ganVuY3Rpb24gcG9pbnRzIChkZXNjcmliZWQgYWJvdmUpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJQc2V1ZG9zdGF0ZUtpbmQtZW50cnlQb2ludCIgbmFtZT0iZW50cnlQb2ludCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQc2V1ZG9zdGF0ZUtpbmQtZW50cnlQb2ludC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBzZXVkb3N0YXRlS2luZC1lbnRyeVBvaW50Ij4KLSAgICAgICAgICA8Ym9keT5BbiBlbnRyeSBwb2ludCBwc2V1ZG9zdGF0ZSBpcyBhbiBlbnRyeSBwb2ludCBvZiBhIHN0YXRlIG1hY2hpbmUgb3IgY29tcG9zaXRlIHN0YXRlLiBJbiBlYWNoIHJlZ2lvbiBvZiB0aGUgc3RhdGUgbWFjaGluZSBvciBjb21wb3NpdGUgc3RhdGUgaXQgaGFzIGEgc2luZ2xlIHRyYW5zaXRpb24gdG8gYSB2ZXJ0ZXggd2l0aGluIHRoZSBzYW1lIHJlZ2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iUHNldWRvc3RhdGVLaW5kLWV4aXRQb2ludCIgbmFtZT0iZXhpdFBvaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBzZXVkb3N0YXRlS2luZC1leGl0UG9pbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQc2V1ZG9zdGF0ZUtpbmQtZXhpdFBvaW50Ij4KLSAgICAgICAgICA8Ym9keT5BbiBleGl0IHBvaW50IHBzZXVkb3N0YXRlIGlzIGFuIGV4aXQgcG9pbnQgb2YgYSBzdGF0ZSBtYWNoaW5lIG9yIGNvbXBvc2l0ZSBzdGF0ZS4gRW50ZXJpbmcgYW4gZXhpdCBwb2ludCB3aXRoaW4gYW55IHJlZ2lvbiBvZiB0aGUgY29tcG9zaXRlIHN0YXRlIG9yIHN0YXRlIG1hY2hpbmUgcmVmZXJlbmNlZCBieSBhIHN1Ym1hY2hpbmUgc3RhdGUgaW1wbGllcyB0aGUgZXhpdCBvZiB0aGlzIGNvbXBvc2l0ZSBzdGF0ZSBvciBzdWJtYWNoaW5lIHN0YXRlIGFuZCB0aGUgdHJpZ2dlcmluZyBvZiB0aGUgdHJhbnNpdGlvbiB0aGF0IGhhcyB0aGlzIGV4aXQgcG9pbnQgYXMgc291cmNlIGluIHRoZSBzdGF0ZSBtYWNoaW5lIGVuY2xvc2luZyB0aGUgc3VibWFjaGluZSBvciBjb21wb3NpdGUgc3RhdGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IlBzZXVkb3N0YXRlS2luZC10ZXJtaW5hdGUiIG5hbWU9InRlcm1pbmF0ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQc2V1ZG9zdGF0ZUtpbmQtdGVybWluYXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHNldWRvc3RhdGVLaW5kLXRlcm1pbmF0ZSI+Ci0gICAgICAgICAgPGJvZHk+RW50ZXJpbmcgYSB0ZXJtaW5hdGUgcHNldWRvc3RhdGUgaW1wbGllcyB0aGF0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBzdGF0ZSBtYWNoaW5lIGJ5IG1lYW5zIG9mIGl0cyBjb250ZXh0IG9iamVjdCBpcyB0ZXJtaW5hdGVkLiBUaGUgc3RhdGUgbWFjaGluZSBkb2VzIG5vdCBleGl0IGFueSBzdGF0ZXMgbm9yIGRvZXMgaXQgcGVyZm9ybSBhbnkgZXhpdCBhY3Rpb25zIG90aGVyIHRoYW4gdGhvc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2l0aW9uIGxlYWRpbmcgdG8gdGhlIHRlcm1pbmF0ZSBwc2V1ZG9zdGF0ZS4gRW50ZXJpbmcgYSB0ZXJtaW5hdGUgcHNldWRvc3RhdGUgaXMgZXF1aXZhbGVudCB0byBpbnZva2luZyBhIERlc3Ryb3lPYmplY3RBY3Rpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJUcmFuc2l0aW9uS2luZCIgbmFtZT0iVHJhbnNpdGlvbktpbmQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRyYW5zaXRpb25LaW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHJhbnNpdGlvbktpbmQiPgotICAgICAgICA8Ym9keT5UcmFuc2l0aW9uS2luZCBpcyBhbiBFbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgdmFyaW91cyBraW5kcyBvZiBUcmFuc2l0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJUcmFuc2l0aW9uS2luZC1pbnRlcm5hbCIgbmFtZT0iaW50ZXJuYWwiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJhbnNpdGlvbktpbmQtaW50ZXJuYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmFuc2l0aW9uS2luZC1pbnRlcm5hbCI+Ci0gICAgICAgICAgPGJvZHk+SW1wbGllcyB0aGF0IHRoZSBUcmFuc2l0aW9uLCBpZiB0cmlnZ2VyZWQsIG9jY3VycyB3aXRob3V0IGV4aXRpbmcgb3IgZW50ZXJpbmcgdGhlIHNvdXJjZSBTdGF0ZSAoaS5lLiwgaXQgZG9lcyBub3QgY2F1c2UgYSBzdGF0ZSBjaGFuZ2UpLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGVudHJ5IG9yIGV4aXQgY29uZGl0aW9uIG9mIHRoZSBzb3VyY2UgU3RhdGUgd2lsbCBub3QgYmUgaW52b2tlZC4gQW4gaW50ZXJuYWwgVHJhbnNpdGlvbiBjYW4gYmUgdGFrZW4gZXZlbiBpZiB0aGUgU2F0ZU1hY2hpbmUgaXMgaW4gb25lIG9yIG1vcmUgUmVnaW9ucyBuZXN0ZWQgd2l0aGluIHRoZSBhc3NvY2lhdGVkIFN0YXRlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJUcmFuc2l0aW9uS2luZC1sb2NhbCIgbmFtZT0ibG9jYWwiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHJhbnNpdGlvbktpbmQtbG9jYWwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUcmFuc2l0aW9uS2luZC1sb2NhbCI+Ci0gICAgICAgICAgPGJvZHk+SW1wbGllcyB0aGF0IHRoZSBUcmFuc2l0aW9uLCBpZiB0cmlnZ2VyZWQsIHdpbGwgbm90IGV4aXQgdGhlIGNvbXBvc2l0ZSAoc291cmNlKSBTdGF0ZSwgYnV0IGl0IHdpbGwgZXhpdCBhbmQgcmUtZW50ZXIgYW55IHN0YXRlIHdpdGhpbiB0aGUgY29tcG9zaXRlIFN0YXRlIHRoYXQgaXMgaW4gdGhlIGN1cnJlbnQgc3RhdGUgY29uZmlndXJhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iVHJhbnNpdGlvbktpbmQtZXh0ZXJuYWwiIG5hbWU9ImV4dGVybmFsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRyYW5zaXRpb25LaW5kLWV4dGVybmFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVHJhbnNpdGlvbktpbmQtZXh0ZXJuYWwiPgotICAgICAgICAgIDxib2R5PkltcGxpZXMgdGhhdCB0aGUgVHJhbnNpdGlvbiwgaWYgdHJpZ2dlcmVkLCB3aWxsIGV4aXQgdGhlIGNvbXBvc2l0ZSAoc291cmNlKSBTdGF0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfaW5jb21pbmdfdGFyZ2V0X3ZlcnRleCIgbmFtZT0iQV9pbmNvbWluZ190YXJnZXRfdmVydGV4IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRyYW5zaXRpb24tdGFyZ2V0IEFfaW5jb21pbmdfdGFyZ2V0X3ZlcnRleC1pbmNvbWluZyI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2luY29taW5nX3RhcmdldF92ZXJ0ZXgtaW5jb21pbmciIG5hbWU9ImluY29taW5nIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJUcmFuc2l0aW9uIiBhc3NvY2lhdGlvbj0iQV9pbmNvbWluZ190YXJnZXRfdmVydGV4Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2luY29taW5nX3RhcmdldF92ZXJ0ZXgtaW5jb21pbmctX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2luY29taW5nX3RhcmdldF92ZXJ0ZXgtaW5jb21pbmctX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX291dGdvaW5nX3NvdXJjZV92ZXJ0ZXgiIG5hbWU9IkFfb3V0Z29pbmdfc291cmNlX3ZlcnRleCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJUcmFuc2l0aW9uLXNvdXJjZSBBX291dGdvaW5nX3NvdXJjZV92ZXJ0ZXgtb3V0Z29pbmciPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vdXRnb2luZ19zb3VyY2VfdmVydGV4LW91dGdvaW5nIiBuYW1lPSJvdXRnb2luZyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iVHJhbnNpdGlvbiIgYXNzb2NpYXRpb249IkFfb3V0Z29pbmdfc291cmNlX3ZlcnRleCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vdXRnb2luZ19zb3VyY2VfdmVydGV4LW91dGdvaW5nLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9vdXRnb2luZ19zb3VyY2VfdmVydGV4LW91dGdvaW5nLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV90cmlnZ2VyX3RyYW5zaXRpb24iIG5hbWU9IkFfdHJpZ2dlcl90cmFuc2l0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRyYW5zaXRpb24tdHJpZ2dlciBBX3RyaWdnZXJfdHJhbnNpdGlvbi10cmFuc2l0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdHJpZ2dlcl90cmFuc2l0aW9uLXRyYW5zaXRpb24iIG5hbWU9InRyYW5zaXRpb24iIHR5cGU9IlRyYW5zaXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV90cmlnZ2VyX3RyYW5zaXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdHJpZ2dlcl90cmFuc2l0aW9uLXRyYW5zaXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZ3VhcmRfdHJhbnNpdGlvbiIgbmFtZT0iQV9ndWFyZF90cmFuc2l0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRyYW5zaXRpb24tZ3VhcmQgQV9ndWFyZF90cmFuc2l0aW9uLXRyYW5zaXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9ndWFyZF90cmFuc2l0aW9uLXRyYW5zaXRpb24iIG5hbWU9InRyYW5zaXRpb24iIHR5cGU9IlRyYW5zaXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJDb25zdHJhaW50LWNvbnRleHQiIGFzc29jaWF0aW9uPSJBX2d1YXJkX3RyYW5zaXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZ3VhcmRfdHJhbnNpdGlvbi10cmFuc2l0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlZGVmaW5lZFRyYW5zaXRpb25fdHJhbnNpdGlvbiIgbmFtZT0iQV9yZWRlZmluZWRUcmFuc2l0aW9uX3RyYW5zaXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVHJhbnNpdGlvbi1yZWRlZmluZWRUcmFuc2l0aW9uIEFfcmVkZWZpbmVkVHJhbnNpdGlvbl90cmFuc2l0aW9uLXRyYW5zaXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZWRlZmluZWRUcmFuc2l0aW9uX3RyYW5zaXRpb24tdHJhbnNpdGlvbiIgbmFtZT0idHJhbnNpdGlvbiIgdHlwZT0iVHJhbnNpdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfcmVkZWZpbmVkRWxlbWVudF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluZWRUcmFuc2l0aW9uX3RyYW5zaXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVkZWZpbmVkVHJhbnNpdGlvbl90cmFuc2l0aW9uLXRyYW5zaXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlZGVmaW5lZFRyYW5zaXRpb25fdHJhbnNpdGlvbi10cmFuc2l0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZWRlZmluaXRpb25Db250ZXh0X3RyYW5zaXRpb24iIG5hbWU9IkFfcmVkZWZpbml0aW9uQ29udGV4dF90cmFuc2l0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBpc0Rlcml2ZWQ9InRydWUiIG1lbWJlckVuZD0iVHJhbnNpdGlvbi1yZWRlZmluaXRpb25Db250ZXh0IEFfcmVkZWZpbml0aW9uQ29udGV4dF90cmFuc2l0aW9uLXRyYW5zaXRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQV9yZWRlZmluaXRpb25Db250ZXh0X3RyYW5zaXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWRlZmluYWJsZUVsZW1lbnQiLz4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVkZWZpbml0aW9uQ29udGV4dF90cmFuc2l0aW9uLXRyYW5zaXRpb24iIG5hbWU9InRyYW5zaXRpb24iIHR5cGU9IlRyYW5zaXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcmVkZWZpbml0aW9uQ29udGV4dF90cmFuc2l0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfdHJhbnNpdGlvbi10cmFuc2l0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9yZWRlZmluaXRpb25Db250ZXh0X3RyYW5zaXRpb24tdHJhbnNpdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZWZmZWN0X3RyYW5zaXRpb24iIG5hbWU9IkFfZWZmZWN0X3RyYW5zaXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVHJhbnNpdGlvbi1lZmZlY3QgQV9lZmZlY3RfdHJhbnNpdGlvbi10cmFuc2l0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZWZmZWN0X3RyYW5zaXRpb24tdHJhbnNpdGlvbiIgbmFtZT0idHJhbnNpdGlvbiIgdHlwZT0iVHJhbnNpdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2VmZmVjdF90cmFuc2l0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2VmZmVjdF90cmFuc2l0aW9uLXRyYW5zaXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc3VibWFjaGluZVN0YXRlX3N1Ym1hY2hpbmUiIG5hbWU9IkFfc3VibWFjaGluZVN0YXRlX3N1Ym1hY2hpbmUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RhdGVNYWNoaW5lLXN1Ym1hY2hpbmVTdGF0ZSBTdGF0ZS1zdWJtYWNoaW5lIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY29ubmVjdGlvblBvaW50X3N0YXRlTWFjaGluZSIgbmFtZT0iQV9jb25uZWN0aW9uUG9pbnRfc3RhdGVNYWNoaW5lIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlN0YXRlTWFjaGluZS1jb25uZWN0aW9uUG9pbnQgUHNldWRvc3RhdGUtc3RhdGVNYWNoaW5lIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVnaW9uX3N0YXRlTWFjaGluZSIgbmFtZT0iQV9yZWdpb25fc3RhdGVNYWNoaW5lIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlN0YXRlTWFjaGluZS1yZWdpb24gUmVnaW9uLXN0YXRlTWFjaGluZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2V4dGVuZGVkU3RhdGVNYWNoaW5lX3N0YXRlTWFjaGluZSIgbmFtZT0iQV9leHRlbmRlZFN0YXRlTWFjaGluZV9zdGF0ZU1hY2hpbmUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RhdGVNYWNoaW5lLWV4dGVuZGVkU3RhdGVNYWNoaW5lIEFfZXh0ZW5kZWRTdGF0ZU1hY2hpbmVfc3RhdGVNYWNoaW5lLXN0YXRlTWFjaGluZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2V4dGVuZGVkU3RhdGVNYWNoaW5lX3N0YXRlTWFjaGluZS1zdGF0ZU1hY2hpbmUiIG5hbWU9InN0YXRlTWFjaGluZSIgdHlwZT0iU3RhdGVNYWNoaW5lIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9yZWRlZmluZWRCZWhhdmlvcl9iZWhhdmlvci1iZWhhdmlvciIgYXNzb2NpYXRpb249IkFfZXh0ZW5kZWRTdGF0ZU1hY2hpbmVfc3RhdGVNYWNoaW5lIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2V4dGVuZGVkU3RhdGVNYWNoaW5lX3N0YXRlTWFjaGluZS1zdGF0ZU1hY2hpbmUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2V4dGVuZGVkU3RhdGVNYWNoaW5lX3N0YXRlTWFjaGluZS1zdGF0ZU1hY2hpbmUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfc3RhdGUiIG5hbWU9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9zdGF0ZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IlN0YXRlLXJlZGVmaW5pdGlvbkNvbnRleHQgQV9yZWRlZmluaXRpb25Db250ZXh0X3N0YXRlLXN0YXRlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9zdGF0ZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQV9yZWRlZmluaXRpb25Db250ZXh0X3JlZGVmaW5hYmxlRWxlbWVudCIvPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZWRlZmluaXRpb25Db250ZXh0X3N0YXRlLXN0YXRlIiBuYW1lPSJzdGF0ZSIgdHlwZT0iU3RhdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcmVkZWZpbml0aW9uQ29udGV4dF9zdGF0ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9yZWRlZmluaXRpb25Db250ZXh0X3N0YXRlLXN0YXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9yZWRlZmluaXRpb25Db250ZXh0X3N0YXRlLXN0YXRlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZWdpb25fc3RhdGUiIG5hbWU9IkFfcmVnaW9uX3N0YXRlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlN0YXRlLXJlZ2lvbiBSZWdpb24tc3RhdGUiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zdGF0ZUludmFyaWFudF9vd25pbmdTdGF0ZSIgbmFtZT0iQV9zdGF0ZUludmFyaWFudF9vd25pbmdTdGF0ZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTdGF0ZS1zdGF0ZUludmFyaWFudCBBX3N0YXRlSW52YXJpYW50X293bmluZ1N0YXRlLW93bmluZ1N0YXRlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfc3RhdGVJbnZhcmlhbnRfb3duaW5nU3RhdGUtb3duaW5nU3RhdGUiIG5hbWU9Im93bmluZ1N0YXRlIiB0eXBlPSJTdGF0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkNvbnN0cmFpbnQtY29udGV4dCIgYXNzb2NpYXRpb249IkFfc3RhdGVJbnZhcmlhbnRfb3duaW5nU3RhdGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfc3RhdGVJbnZhcmlhbnRfb3duaW5nU3RhdGUtb3duaW5nU3RhdGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVkZWZpbmVkU3RhdGVfc3RhdGUiIG5hbWU9IkFfcmVkZWZpbmVkU3RhdGVfc3RhdGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RhdGUtcmVkZWZpbmVkU3RhdGUgQV9yZWRlZmluZWRTdGF0ZV9zdGF0ZS1zdGF0ZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlZGVmaW5lZFN0YXRlX3N0YXRlLXN0YXRlIiBuYW1lPSJzdGF0ZSIgdHlwZT0iU3RhdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5lZEVsZW1lbnRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcmVkZWZpbmVkU3RhdGVfc3RhdGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVkZWZpbmVkU3RhdGVfc3RhdGUtc3RhdGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlZGVmaW5lZFN0YXRlX3N0YXRlLXN0YXRlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9kZWZlcnJhYmxlVHJpZ2dlcl9zdGF0ZSIgbmFtZT0iQV9kZWZlcnJhYmxlVHJpZ2dlcl9zdGF0ZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTdGF0ZS1kZWZlcnJhYmxlVHJpZ2dlciBBX2RlZmVycmFibGVUcmlnZ2VyX3N0YXRlLXN0YXRlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZGVmZXJyYWJsZVRyaWdnZXJfc3RhdGUtc3RhdGUiIG5hbWU9InN0YXRlIiB0eXBlPSJTdGF0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2RlZmVycmFibGVUcmlnZ2VyX3N0YXRlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2RlZmVycmFibGVUcmlnZ2VyX3N0YXRlLXN0YXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2Nvbm5lY3Rpb25fc3RhdGUiIG5hbWU9IkFfY29ubmVjdGlvbl9zdGF0ZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTdGF0ZS1jb25uZWN0aW9uIENvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1zdGF0ZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2VudHJ5X3N0YXRlIiBuYW1lPSJBX2VudHJ5X3N0YXRlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlN0YXRlLWVudHJ5IEFfZW50cnlfc3RhdGUtc3RhdGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lbnRyeV9zdGF0ZS1zdGF0ZSIgbmFtZT0ic3RhdGUiIHR5cGU9IlN0YXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfZW50cnlfc3RhdGUiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZW50cnlfc3RhdGUtc3RhdGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfY29ubmVjdGlvblBvaW50X3N0YXRlIiBuYW1lPSJBX2Nvbm5lY3Rpb25Qb2ludF9zdGF0ZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJTdGF0ZS1jb25uZWN0aW9uUG9pbnQgUHNldWRvc3RhdGUtc3RhdGUiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9kb0FjdGl2aXR5X3N0YXRlIiBuYW1lPSJBX2RvQWN0aXZpdHlfc3RhdGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RhdGUtZG9BY3Rpdml0eSBBX2RvQWN0aXZpdHlfc3RhdGUtc3RhdGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9kb0FjdGl2aXR5X3N0YXRlLXN0YXRlIiBuYW1lPSJzdGF0ZSIgdHlwZT0iU3RhdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9kb0FjdGl2aXR5X3N0YXRlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2RvQWN0aXZpdHlfc3RhdGUtc3RhdGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZXhpdF9zdGF0ZSIgbmFtZT0iQV9leGl0X3N0YXRlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlN0YXRlLWV4aXQgQV9leGl0X3N0YXRlLXN0YXRlIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZXhpdF9zdGF0ZS1zdGF0ZSIgbmFtZT0ic3RhdGUiIHR5cGU9IlN0YXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfZXhpdF9zdGF0ZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9leGl0X3N0YXRlLXN0YXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2V4dGVuZGVkUmVnaW9uX3JlZ2lvbiIgbmFtZT0iQV9leHRlbmRlZFJlZ2lvbl9yZWdpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVnaW9uLWV4dGVuZGVkUmVnaW9uIEFfZXh0ZW5kZWRSZWdpb25fcmVnaW9uLXJlZ2lvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2V4dGVuZGVkUmVnaW9uX3JlZ2lvbi1yZWdpb24iIG5hbWU9InJlZ2lvbiIgdHlwZT0iUmVnaW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9yZWRlZmluZWRFbGVtZW50X3JlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluYWJsZUVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2V4dGVuZGVkUmVnaW9uX3JlZ2lvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9leHRlbmRlZFJlZ2lvbl9yZWdpb24tcmVnaW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9leHRlbmRlZFJlZ2lvbl9yZWdpb24tcmVnaW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9zdWJ2ZXJ0ZXhfY29udGFpbmVyIiBuYW1lPSJBX3N1YnZlcnRleF9jb250YWluZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUmVnaW9uLXN1YnZlcnRleCBWZXJ0ZXgtY29udGFpbmVyIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWdpb24iIG5hbWU9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWdpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJSZWdpb24tcmVkZWZpbml0aW9uQ29udGV4dCBBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVnaW9uLXJlZ2lvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVnaW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVnaW9uLXJlZ2lvbiIgbmFtZT0icmVnaW9uIiB0eXBlPSJSZWdpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWdpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWdpb24tcmVnaW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9yZWRlZmluaXRpb25Db250ZXh0X3JlZ2lvbi1yZWdpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3RyYW5zaXRpb25fY29udGFpbmVyIiBuYW1lPSJBX3RyYW5zaXRpb25fY29udGFpbmVyIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlJlZ2lvbi10cmFuc2l0aW9uIFRyYW5zaXRpb24tY29udGFpbmVyIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVmZXJyZWRfcHJvdG9jb2xUcmFuc2l0aW9uIiBuYW1lPSJBX3JlZmVycmVkX3Byb3RvY29sVHJhbnNpdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IlByb3RvY29sVHJhbnNpdGlvbi1yZWZlcnJlZCBBX3JlZmVycmVkX3Byb3RvY29sVHJhbnNpdGlvbi1wcm90b2NvbFRyYW5zaXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZWZlcnJlZF9wcm90b2NvbFRyYW5zaXRpb24tcHJvdG9jb2xUcmFuc2l0aW9uIiBuYW1lPSJwcm90b2NvbFRyYW5zaXRpb24iIHR5cGU9IlByb3RvY29sVHJhbnNpdGlvbiIgYXNzb2NpYXRpb249IkFfcmVmZXJyZWRfcHJvdG9jb2xUcmFuc2l0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JlZmVycmVkX3Byb3RvY29sVHJhbnNpdGlvbi1wcm90b2NvbFRyYW5zaXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlZmVycmVkX3Byb3RvY29sVHJhbnNpdGlvbi1wcm90b2NvbFRyYW5zaXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3ByZUNvbmRpdGlvbl9wcm90b2NvbFRyYW5zaXRpb24iIG5hbWU9IkFfcHJlQ29uZGl0aW9uX3Byb3RvY29sVHJhbnNpdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJQcm90b2NvbFRyYW5zaXRpb24tcHJlQ29uZGl0aW9uIEFfcHJlQ29uZGl0aW9uX3Byb3RvY29sVHJhbnNpdGlvbi1wcm90b2NvbFRyYW5zaXRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQV9wcmVDb25kaXRpb25fcHJvdG9jb2xUcmFuc2l0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBX2d1YXJkX3RyYW5zaXRpb24iLz4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcHJlQ29uZGl0aW9uX3Byb3RvY29sVHJhbnNpdGlvbi1wcm90b2NvbFRyYW5zaXRpb24iIG5hbWU9InByb3RvY29sVHJhbnNpdGlvbiIgdHlwZT0iUHJvdG9jb2xUcmFuc2l0aW9uIiByZWRlZmluZWRQcm9wZXJ0eT0iQV9ndWFyZF90cmFuc2l0aW9uLXRyYW5zaXRpb24iIGFzc29jaWF0aW9uPSJBX3ByZUNvbmRpdGlvbl9wcm90b2NvbFRyYW5zaXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcHJlQ29uZGl0aW9uX3Byb3RvY29sVHJhbnNpdGlvbi1wcm90b2NvbFRyYW5zaXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcG9zdENvbmRpdGlvbl9vd25pbmdUcmFuc2l0aW9uIiBuYW1lPSJBX3Bvc3RDb25kaXRpb25fb3duaW5nVHJhbnNpdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJQcm90b2NvbFRyYW5zaXRpb24tcG9zdENvbmRpdGlvbiBBX3Bvc3RDb25kaXRpb25fb3duaW5nVHJhbnNpdGlvbi1vd25pbmdUcmFuc2l0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcG9zdENvbmRpdGlvbl9vd25pbmdUcmFuc2l0aW9uLW93bmluZ1RyYW5zaXRpb24iIG5hbWU9Im93bmluZ1RyYW5zaXRpb24iIHR5cGU9IlByb3RvY29sVHJhbnNpdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkNvbnN0cmFpbnQtY29udGV4dCIgYXNzb2NpYXRpb249IkFfcG9zdENvbmRpdGlvbl9vd25pbmdUcmFuc2l0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Bvc3RDb25kaXRpb25fb3duaW5nVHJhbnNpdGlvbi1vd25pbmdUcmFuc2l0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2NvbmZvcm1hbmNlX3NwZWNpZmljTWFjaGluZSIgbmFtZT0iQV9jb25mb3JtYW5jZV9zcGVjaWZpY01hY2hpbmUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUtY29uZm9ybWFuY2UgUHJvdG9jb2xDb25mb3JtYW5jZS1zcGVjaWZpY01hY2hpbmUiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9nZW5lcmFsTWFjaGluZV9wcm90b2NvbENvbmZvcm1hbmNlIiBuYW1lPSJBX2dlbmVyYWxNYWNoaW5lX3Byb3RvY29sQ29uZm9ybWFuY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iUHJvdG9jb2xDb25mb3JtYW5jZS1nZW5lcmFsTWFjaGluZSBBX2dlbmVyYWxNYWNoaW5lX3Byb3RvY29sQ29uZm9ybWFuY2UtcHJvdG9jb2xDb25mb3JtYW5jZSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2dlbmVyYWxNYWNoaW5lX3Byb3RvY29sQ29uZm9ybWFuY2UtcHJvdG9jb2xDb25mb3JtYW5jZSIgbmFtZT0icHJvdG9jb2xDb25mb3JtYW5jZSIgdHlwZT0iUHJvdG9jb2xDb25mb3JtYW5jZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfdGFyZ2V0X2RpcmVjdGVkUmVsYXRpb25zaGlwLWRpcmVjdGVkUmVsYXRpb25zaGlwIiBhc3NvY2lhdGlvbj0iQV9nZW5lcmFsTWFjaGluZV9wcm90b2NvbENvbmZvcm1hbmNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2dlbmVyYWxNYWNoaW5lX3Byb3RvY29sQ29uZm9ybWFuY2UtcHJvdG9jb2xDb25mb3JtYW5jZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfZ2VuZXJhbE1hY2hpbmVfcHJvdG9jb2xDb25mb3JtYW5jZS1wcm90b2NvbENvbmZvcm1hbmNlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9lbnRyeV9jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiIG5hbWU9IkFfZW50cnlfY29ubmVjdGlvblBvaW50UmVmZXJlbmNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1lbnRyeSBBX2VudHJ5X2Nvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lbnRyeV9jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtY29ubmVjdGlvblBvaW50UmVmZXJlbmNlIiBuYW1lPSJjb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiIHR5cGU9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZSIgYXNzb2NpYXRpb249IkFfZW50cnlfY29ubmVjdGlvblBvaW50UmVmZXJlbmNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2VudHJ5X2Nvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZXhpdF9jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiIG5hbWU9IkFfZXhpdF9jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlLWV4aXQgQV9leGl0X2Nvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9leGl0X2Nvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UiIG5hbWU9ImNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZSIgdHlwZT0iQ29ubmVjdGlvblBvaW50UmVmZXJlbmNlIiBhc3NvY2lhdGlvbj0iQV9leGl0X2Nvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9leGl0X2Nvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZS1jb25uZWN0aW9uUG9pbnRSZWZlcmVuY2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkFzc29jaWF0aW9uIiBuYW1lPSJBc3NvY2lhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQXNzb2NpYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBc3NvY2lhdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgbGluayBpcyBhIHR1cGxlIG9mIHZhbHVlcyB0aGF0IHJlZmVyIHRvIHR5cGVkIG9iamVjdHMuICBBbiBBc3NvY2lhdGlvbiBjbGFzc2lmaWVzIGEgc2V0IG9mIGxpbmtzLCBlYWNoIG9mIHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBBc3NvY2lhdGlvbi4gIEVhY2ggdmFsdWUgaW4gdGhlIGxpbmsgcmVmZXJzIHRvIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVuZCBvZiB0aGUgQXNzb2NpYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQXNzb2NpYXRpb24tc3BlY2lhbGl6ZWRfZW5kX251bWJlciIgbmFtZT0ic3BlY2lhbGl6ZWRfZW5kX251bWJlciIgY29uc3RyYWluZWRFbGVtZW50PSJBc3NvY2lhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBc3NvY2lhdGlvbi1zcGVjaWFsaXplZF9lbmRfbnVtYmVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXNzb2NpYXRpb24tc3BlY2lhbGl6ZWRfZW5kX251bWJlciI+Ci0gICAgICAgICAgPGJvZHk+QW4gQXNzb2NpYXRpb24gc3BlY2lhbGl6aW5nIGFub3RoZXIgQXNzb2NpYXRpb24gaGFzIHRoZSBzYW1lIG51bWJlciBvZiBlbmRzIGFzIHRoZSBvdGhlciBBc3NvY2lhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQXNzb2NpYXRpb24tc3BlY2lhbGl6ZWRfZW5kX251bWJlci1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cGFyZW50cygpLT5zZWxlY3Qob2NsSXNLaW5kT2YoQXNzb2NpYXRpb24pKS5vY2xBc1R5cGUoQXNzb2NpYXRpb24pLT5mb3JBbGwocCB8IHAubWVtYmVyRW5kLT5zaXplKCkgPSBzZWxmLm1lbWJlckVuZC0+c2l6ZSgpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQXNzb2NpYXRpb24tc3BlY2lhbGl6ZWRfZW5kX3R5cGVzIiBuYW1lPSJzcGVjaWFsaXplZF9lbmRfdHlwZXMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQXNzb2NpYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQXNzb2NpYXRpb24tc3BlY2lhbGl6ZWRfZW5kX3R5cGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXNzb2NpYXRpb24tc3BlY2lhbGl6ZWRfZW5kX3R5cGVzIj4KLSAgICAgICAgICA8Ym9keT5XaGVuIGFuIEFzc29jaWF0aW9uIHNwZWNpYWxpemVzIGFub3RoZXIgQXNzb2NpYXRpb24sIGV2ZXJ5IGVuZCBvZiB0aGUgc3BlY2lmaWMgQXNzb2NpYXRpb24gY29ycmVzcG9uZHMgdG8gYW4gZW5kIG9mIHRoZSBnZW5lcmFsIEFzc29jaWF0aW9uLCBhbmQgdGhlIHNwZWNpZmljIGVuZCByZWFjaGVzIHRoZSBzYW1lIHR5cGUgb3IgYSBzdWJ0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGdlbmVyYWwgZW5kLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBc3NvY2lhdGlvbi1zcGVjaWFsaXplZF9lbmRfdHlwZXMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PlNlcXVlbmNlezEuLm1lbWJlckVuZC0+c2l6ZSgpfS0+JiN4RDsKLQlmb3JBbGwoaSB8IGdlbmVyYWwtPnNlbGVjdChvY2xJc0tpbmRPZihBc3NvY2lhdGlvbikpLm9jbEFzVHlwZShBc3NvY2lhdGlvbiktPiYjeEQ7Ci0JCWZvckFsbChnYSB8IHNlbGYubWVtYmVyRW5kLT5hdChpKS50eXBlLmNvbmZvcm1zVG8oZ2EubWVtYmVyRW5kLT5hdChpKS50eXBlKSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBc3NvY2lhdGlvbi1iaW5hcnlfYXNzb2NpYXRpb25zIiBuYW1lPSJiaW5hcnlfYXNzb2NpYXRpb25zIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFzc29jaWF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFzc29jaWF0aW9uLWJpbmFyeV9hc3NvY2lhdGlvbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBc3NvY2lhdGlvbi1iaW5hcnlfYXNzb2NpYXRpb25zIj4KLSAgICAgICAgICA8Ym9keT5Pbmx5IGJpbmFyeSBBc3NvY2lhdGlvbnMgY2FuIGJlIGFnZ3JlZ2F0aW9ucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQXNzb2NpYXRpb24tYmluYXJ5X2Fzc29jaWF0aW9ucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bWVtYmVyRW5kLT5leGlzdHMoYWdncmVnYXRpb24gJmx0Oz4gQWdncmVnYXRpb25LaW5kOjpub25lKSBpbXBsaWVzIChtZW1iZXJFbmQtPnNpemUoKSA9IDIgYW5kIG1lbWJlckVuZC0+ZXhpc3RzKGFnZ3JlZ2F0aW9uID0gQWdncmVnYXRpb25LaW5kOjpub25lKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFzc29jaWF0aW9uLWFzc29jaWF0aW9uX2VuZHMiIG5hbWU9ImFzc29jaWF0aW9uX2VuZHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQXNzb2NpYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQXNzb2NpYXRpb24tYXNzb2NpYXRpb25fZW5kcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFzc29jaWF0aW9uLWFzc29jaWF0aW9uX2VuZHMiPgotICAgICAgICAgIDxib2R5PkVuZHMgb2YgQXNzb2NpYXRpb25zIHdpdGggbW9yZSB0aGFuIHR3byBlbmRzIG11c3QgYmUgb3duZWQgYnkgdGhlIEFzc29jaWF0aW9uIGl0c2VsZi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQXNzb2NpYXRpb24tYXNzb2NpYXRpb25fZW5kcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bWVtYmVyRW5kLT5zaXplKCkgPiAyIGltcGxpZXMgb3duZWRFbmQtPmluY2x1ZGVzQWxsKG1lbWJlckVuZCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFzc29jaWF0aW9uLWVuZHNfbXVzdF9iZV90eXBlZCIgbmFtZT0iZW5kc19tdXN0X2JlX3R5cGVkIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFzc29jaWF0aW9uIj4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFzc29jaWF0aW9uLWVuZHNfbXVzdF9iZV90eXBlZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bWVtYmVyRW5kLT5mb3JBbGwodHlwZS0+bm90RW1wdHkoKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQXNzb2NpYXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlJlbGF0aW9uc2hpcCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQXNzb2NpYXRpb24tX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IkNsYXNzaWZpZXIiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkFzc29jaWF0aW9uLWVuZFR5cGUiIG5hbWU9ImVuZFR5cGUiIHR5cGU9IlR5cGUiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9IlJlbGF0aW9uc2hpcC1yZWxhdGVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfZW5kVHlwZV9hc3NvY2lhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBc3NvY2lhdGlvbi1lbmRUeXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXNzb2NpYXRpb24tZW5kVHlwZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIENsYXNzaWZpZXJzIHRoYXQgYXJlIHVzZWQgYXMgdHlwZXMgb2YgdGhlIGVuZHMgb2YgdGhlIEFzc29jaWF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQXNzb2NpYXRpb24tZW5kVHlwZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBc3NvY2lhdGlvbi1pc0Rlcml2ZWQiIG5hbWU9ImlzRGVyaXZlZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBc3NvY2lhdGlvbi1pc0Rlcml2ZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBc3NvY2lhdGlvbi1pc0Rlcml2ZWQiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB3aGV0aGVyIHRoZSBBc3NvY2lhdGlvbiBpcyBkZXJpdmVkIGZyb20gb3RoZXIgbW9kZWwgZWxlbWVudHMgc3VjaCBhcyBvdGhlciBBc3NvY2lhdGlvbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iQXNzb2NpYXRpb24taXNEZXJpdmVkLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBc3NvY2lhdGlvbi1tZW1iZXJFbmQiIG5hbWU9Im1lbWJlckVuZCIgdHlwZT0iUHJvcGVydHkiIGlzT3JkZXJlZD0idHJ1ZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVzcGFjZS1tZW1iZXIiIGFzc29jaWF0aW9uPSJBX21lbWJlckVuZF9hc3NvY2lhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBc3NvY2lhdGlvbi1tZW1iZXJFbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBc3NvY2lhdGlvbi1tZW1iZXJFbmQiPgotICAgICAgICAgIDxib2R5PkVhY2ggZW5kIHJlcHJlc2VudHMgcGFydGljaXBhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhlIENsYXNzaWZpZXIgY29ubmVjdGVkIHRvIHRoZSBlbmQgaW4gbGlua3Mgb2YgdGhlIEFzc29jaWF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQXNzb2NpYXRpb24tbWVtYmVyRW5kLV9sb3dlclZhbHVlIiB2YWx1ZT0iMiIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFzc29jaWF0aW9uLW1lbWJlckVuZC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBc3NvY2lhdGlvbi1uYXZpZ2FibGVPd25lZEVuZCIgbmFtZT0ibmF2aWdhYmxlT3duZWRFbmQiIHR5cGU9IlByb3BlcnR5IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQXNzb2NpYXRpb24tb3duZWRFbmQiIGFzc29jaWF0aW9uPSJBX25hdmlnYWJsZU93bmVkRW5kX2Fzc29jaWF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFzc29jaWF0aW9uLW5hdmlnYWJsZU93bmVkRW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXNzb2NpYXRpb24tbmF2aWdhYmxlT3duZWRFbmQiPgotICAgICAgICAgIDxib2R5PlRoZSBuYXZpZ2FibGUgZW5kcyB0aGF0IGFyZSBvd25lZCBieSB0aGUgQXNzb2NpYXRpb24gaXRzZWxmLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQXNzb2NpYXRpb24tbmF2aWdhYmxlT3duZWRFbmQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBc3NvY2lhdGlvbi1uYXZpZ2FibGVPd25lZEVuZC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJBc3NvY2lhdGlvbi1vd25lZEVuZCIgbmFtZT0ib3duZWRFbmQiIHR5cGU9IlByb3BlcnR5IiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCBBc3NvY2lhdGlvbi1tZW1iZXJFbmQgQ2xhc3NpZmllci1mZWF0dXJlIE5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfb3duZWRFbmRfb3duaW5nQXNzb2NpYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQXNzb2NpYXRpb24tb3duZWRFbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBc3NvY2lhdGlvbi1vd25lZEVuZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGVuZHMgdGhhdCBhcmUgb3duZWQgYnkgdGhlIEFzc29jaWF0aW9uIGl0c2VsZi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFzc29jaWF0aW9uLW93bmVkRW5kLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQXNzb2NpYXRpb24tb3duZWRFbmQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQXNzb2NpYXRpb24taXNCaW5hcnkiIG5hbWU9ImlzQmluYXJ5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFzc29jaWF0aW9uLWlzQmluYXJ5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXNzb2NpYXRpb24taXNCaW5hcnkiPgotICAgICAgICAgIDxib2R5PkRldGVybWluZXMgd2hldGhlciB0aGlzIGFzc29jaWF0aW9uIGlzIGEgYmluYXJ5IGFzc29jaWF0aW9uLCBpLmUuIHdoZXRoZXIgaXQgaGFzIGV4YWN0bHkgdHdvIG1lbWJlciBlbmRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkFzc29jaWF0aW9uLWlzQmluYXJ5LV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkFzc29jaWF0aW9uLWVuZFR5cGUuMSIgbmFtZT0iZW5kVHlwZSIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiBib2R5Q29uZGl0aW9uPSJBc3NvY2lhdGlvbi1lbmRUeXBlLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBc3NvY2lhdGlvbi1lbmRUeXBlLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBc3NvY2lhdGlvbi1lbmRUeXBlLjEiPgotICAgICAgICAgIDxib2R5PmVuZFR5cGUgaXMgZGVyaXZlZCBmcm9tIHRoZSB0eXBlcyBvZiB0aGUgbWVtYmVyIGVuZHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkFzc29jaWF0aW9uLWVuZFR5cGUuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFzc29jaWF0aW9uLWVuZFR5cGUuMSBBc3NvY2lhdGlvbi1lbmRUeXBlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQXNzb2NpYXRpb24tZW5kVHlwZS4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobWVtYmVyRW5kLT5jb2xsZWN0KHR5cGUpLT5hc1NldCgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJBc3NvY2lhdGlvbi1lbmRUeXBlLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlR5cGUiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFzc29jaWF0aW9uLWVuZFR5cGUuMS1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJBc3NvY2lhdGlvbkNsYXNzIiBuYW1lPSJBc3NvY2lhdGlvbkNsYXNzIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBc3NvY2lhdGlvbkNsYXNzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXNzb2NpYXRpb25DbGFzcyI+Ci0gICAgICAgIDxib2R5PkEgbW9kZWwgZWxlbWVudCB0aGF0IGhhcyBib3RoIEFzc29jaWF0aW9uIGFuZCBDbGFzcyBwcm9wZXJ0aWVzLiBBbiBBc3NvY2lhdGlvbkNsYXNzIGNhbiBiZSBzZWVuIGFzIGFuIEFzc29jaWF0aW9uIHRoYXQgYWxzbyBoYXMgQ2xhc3MgcHJvcGVydGllcywgb3IgYXMgYSBDbGFzcyB0aGF0IGFsc28gaGFzIEFzc29jaWF0aW9uIHByb3BlcnRpZXMuIEl0IG5vdCBvbmx5IGNvbm5lY3RzIGEgc2V0IG9mIENsYXNzaWZpZXJzIGJ1dCBhbHNvIGRlZmluZXMgYSBzZXQgb2YgRmVhdHVyZXMgdGhhdCBiZWxvbmcgdG8gdGhlIEFzc29jaWF0aW9uIGl0c2VsZiBhbmQgbm90IHRvIGFueSBvZiB0aGUgYXNzb2NpYXRlZCBDbGFzc2lmaWVycy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBc3NvY2lhdGlvbkNsYXNzLWNhbm5vdF9iZV9kZWZpbmVkIiBuYW1lPSJjYW5ub3RfYmVfZGVmaW5lZCIgY29uc3RyYWluZWRFbGVtZW50PSJBc3NvY2lhdGlvbkNsYXNzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFzc29jaWF0aW9uQ2xhc3MtY2Fubm90X2JlX2RlZmluZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBc3NvY2lhdGlvbkNsYXNzLWNhbm5vdF9iZV9kZWZpbmVkIj4KLSAgICAgICAgICA8Ym9keT5BbiBBc3NvY2lhdGlvbkNsYXNzIGNhbm5vdCBiZSBkZWZpbmVkIGJldHdlZW4gaXRzZWxmIGFuZCBzb21ldGhpbmcgZWxzZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQXNzb2NpYXRpb25DbGFzcy1jYW5ub3RfYmVfZGVmaW5lZC1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2VsZi5lbmRUeXBlKCktPmV4Y2x1ZGVzKHNlbGYpIGFuZCBzZWxmLmVuZFR5cGUoKS0+Y29sbGVjdChldHxldC5vY2xBc1R5cGUoQ2xhc3NpZmllcikuYWxsUGFyZW50cygpKS0+ZmxhdHRlbigpLT5leGNsdWRlcyhzZWxmKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQXNzb2NpYXRpb25DbGFzcy1kaXNqb2ludF9hdHRyaWJ1dGVzX2VuZHMiIG5hbWU9ImRpc2pvaW50X2F0dHJpYnV0ZXNfZW5kcyIgY29uc3RyYWluZWRFbGVtZW50PSJBc3NvY2lhdGlvbkNsYXNzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFzc29jaWF0aW9uQ2xhc3MtZGlzam9pbnRfYXR0cmlidXRlc19lbmRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQXNzb2NpYXRpb25DbGFzcy1kaXNqb2ludF9hdHRyaWJ1dGVzX2VuZHMiPgotICAgICAgICAgIDxib2R5PlRoZSBvd25lZCBhdHRyaWJ1dGVzIGFuZCBvd25lZCBlbmRzIG9mIGFuIEFzc29jaWF0aW9uQ2xhc3MgYXJlIGRpc2pvaW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBc3NvY2lhdGlvbkNsYXNzLWRpc2pvaW50X2F0dHJpYnV0ZXNfZW5kcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b3duZWRBdHRyaWJ1dGUtPmludGVyc2VjdGlvbihvd25lZEVuZCktPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJBc3NvY2lhdGlvbkNsYXNzLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJDbGFzcyIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQXNzb2NpYXRpb25DbGFzcy1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iQXNzb2NpYXRpb24iLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ2xhc3MiIG5hbWU9IkNsYXNzIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzIj4KLSAgICAgICAgPGJvZHk+QSBDbGFzcyBjbGFzc2lmaWVzIGEgc2V0IG9mIG9iamVjdHMgYW5kIHNwZWNpZmllcyB0aGUgZmVhdHVyZXMgdGhhdCBjaGFyYWN0ZXJpemUgdGhlIHN0cnVjdHVyZSBhbmQgYmVoYXZpb3Igb2YgdGhvc2Ugb2JqZWN0cy4gIEEgQ2xhc3MgbWF5IGhhdmUgYW4gaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBQb3J0cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzcy1wYXNzaXZlX2NsYXNzIiBuYW1lPSJwYXNzaXZlX2NsYXNzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzLXBhc3NpdmVfY2xhc3MtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzcy1wYXNzaXZlX2NsYXNzIj4KLSAgICAgICAgICA8Ym9keT5Pbmx5IGFuIGFjdGl2ZSBDbGFzcyBtYXkgb3duIFJlY2VwdGlvbnMgYW5kIGhhdmUgYSBjbGFzc2lmaWVyQmVoYXZpb3IuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzLXBhc3NpdmVfY2xhc3MtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5vdCBpc0FjdGl2ZSBpbXBsaWVzIChvd25lZFJlY2VwdGlvbi0+aXNFbXB0eSgpIGFuZCBjbGFzc2lmaWVyQmVoYXZpb3IgPSBudWxsKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDbGFzcy1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQmVoYXZpb3JlZENsYXNzaWZpZXIiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNsYXNzLV9nZW5lcmFsaXphdGlvbi4xIiBnZW5lcmFsPSJFbmNhcHN1bGF0ZWRDbGFzc2lmaWVyIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGFzcy1leHRlbnNpb24iIG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iRXh0ZW5zaW9uIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX2V4dGVuc2lvbl9tZXRhY2xhc3MiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3MtZXh0ZW5zaW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3MtZXh0ZW5zaW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIHByb3BlcnR5IGlzIHVzZWQgd2hlbiB0aGUgQ2xhc3MgaXMgYWN0aW5nIGFzIGEgbWV0YWNsYXNzLiBJdCByZWZlcmVuY2VzIHRoZSBFeHRlbnNpb25zIHRoYXQgc3BlY2lmeSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgb2YgdGhlIG1ldGFjbGFzcy4gVGhlIHByb3BlcnR5IGlzIGRlcml2ZWQgZnJvbSB0aGUgRXh0ZW5zaW9ucyB3aG9zZSBtZW1iZXJFbmRzIGFyZSB0eXBlZCBieSB0aGUgQ2xhc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzcy1leHRlbnNpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzcy1leHRlbnNpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2xhc3MtaXNBYnN0cmFjdCIgbmFtZT0iaXNBYnN0cmFjdCIgcmVkZWZpbmVkUHJvcGVydHk9IkNsYXNzaWZpZXItaXNBYnN0cmFjdCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzcy1pc0Fic3RyYWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3MtaXNBYnN0cmFjdCI+Ci0gICAgICAgICAgPGJvZHk+SWYgdHJ1ZSwgdGhlIENsYXNzIGRvZXMgbm90IHByb3ZpZGUgYSBjb21wbGV0ZSBkZWNsYXJhdGlvbiBhbmQgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gQW4gYWJzdHJhY3QgQ2xhc3MgaXMgdHlwaWNhbGx5IHVzZWQgYXMgYSB0YXJnZXQgb2YgQXNzb2NpYXRpb25zIG9yIEdlbmVyYWxpemF0aW9ucy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJDbGFzcy1pc0Fic3RyYWN0LV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGFzcy1pc0FjdGl2ZSIgbmFtZT0iaXNBY3RpdmUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3MtaXNBY3RpdmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzcy1pc0FjdGl2ZSI+Ci0gICAgICAgICAgPGJvZHk+RGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhpcyBDbGFzcyBpcyBhY3RpdmUgb3Igbm90LiBJZiB0cnVlLCB0aGVuIHRoZSBvd25pbmcgQ2xhc3MgaXMgcmVmZXJyZWQgdG8gYXMgYW4gYWN0aXZlIENsYXNzLiBJZiBmYWxzZSwgdGhlbiBzdWNoIGEgQ2xhc3MgaXMgcmVmZXJyZWQgdG8gYXMgYSBwYXNzaXZlIENsYXNzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IkNsYXNzLWlzQWN0aXZlLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDbGFzcy1uZXN0ZWRDbGFzc2lmaWVyIiBuYW1lPSJuZXN0ZWRDbGFzc2lmaWVyIiB0eXBlPSJDbGFzc2lmaWVyIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCBOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX25lc3RlZENsYXNzaWZpZXJfbmVzdGluZ0NsYXNzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzLW5lc3RlZENsYXNzaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzcy1uZXN0ZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQ2xhc3NpZmllcnMgb3duZWQgYnkgdGhlIENsYXNzIHRoYXQgYXJlIG5vdCBvd25lZEJlaGF2aW9ycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzLW5lc3RlZENsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzcy1uZXN0ZWRDbGFzc2lmaWVyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXNzLW93bmVkQXR0cmlidXRlIiBuYW1lPSJvd25lZEF0dHJpYnV0ZSIgdHlwZT0iUHJvcGVydHkiIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgcmVkZWZpbmVkUHJvcGVydHk9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLW93bmVkQXR0cmlidXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQ2xhc3NpZmllci1hdHRyaWJ1dGUgTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZEF0dHJpYnV0ZV9jbGFzcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzcy1vd25lZEF0dHJpYnV0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzLW93bmVkQXR0cmlidXRlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgYXR0cmlidXRlcyAoaS5lLiwgdGhlIFByb3BlcnRpZXMpIG93bmVkIGJ5IHRoZSBDbGFzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzLW93bmVkQXR0cmlidXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3Mtb3duZWRBdHRyaWJ1dGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2xhc3Mtb3duZWRPcGVyYXRpb24iIG5hbWU9Im93bmVkT3BlcmF0aW9uIiB0eXBlPSJPcGVyYXRpb24iIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfcmVkZWZpbml0aW9uQ29udGV4dF9yZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbmFibGVFbGVtZW50IENsYXNzaWZpZXItZmVhdHVyZSBOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX293bmVkT3BlcmF0aW9uX2NsYXNzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzLW93bmVkT3BlcmF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3Mtb3duZWRPcGVyYXRpb24iPgotICAgICAgICAgIDxib2R5PlRoZSBPcGVyYXRpb25zIG93bmVkIGJ5IHRoZSBDbGFzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzLW93bmVkT3BlcmF0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3Mtb3duZWRPcGVyYXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ2xhc3Mtb3duZWRSZWNlcHRpb24iIG5hbWU9Im93bmVkUmVjZXB0aW9uIiB0eXBlPSJSZWNlcHRpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJDbGFzc2lmaWVyLWZlYXR1cmUgTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZFJlY2VwdGlvbl9jbGFzcyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzcy1vd25lZFJlY2VwdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzLW93bmVkUmVjZXB0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgUmVjZXB0aW9ucyBvd25lZCBieSB0aGUgQ2xhc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzcy1vd25lZFJlY2VwdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzLW93bmVkUmVjZXB0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNsYXNzLXN1cGVyQ2xhc3MiIG5hbWU9InN1cGVyQ2xhc3MiIHR5cGU9IkNsYXNzIiBpc0Rlcml2ZWQ9InRydWUiIHJlZGVmaW5lZFByb3BlcnR5PSJDbGFzc2lmaWVyLWdlbmVyYWwiIGFzc29jaWF0aW9uPSJBX3N1cGVyQ2xhc3NfY2xhc3MiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3Mtc3VwZXJDbGFzcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzLXN1cGVyQ2xhc3MiPgotICAgICAgICAgIDxib2R5PlRoZSBzdXBlcmNsYXNzZXMgb2YgYSBDbGFzcywgZGVyaXZlZCBmcm9tIGl0cyBHZW5lcmFsaXphdGlvbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzcy1zdXBlckNsYXNzLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3Mtc3VwZXJDbGFzcy1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDbGFzcy1jcmVhdGVPd25lZE9wZXJhdGlvbiIgbmFtZT0iY3JlYXRlT3duZWRPcGVyYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2xhc3MtY3JlYXRlT3duZWRPcGVyYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzcy1jcmVhdGVPd25lZE9wZXJhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhbiBvcGVyYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIHBhcmFtZXRlciBuYW1lcywgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcmV0dXJuIHR5cGUgKG9yIG51bGwpIGFzIGFuIG93bmVkIG9wZXJhdGlvbiBvZiB0aGlzIGNsYXNzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzLWNyZWF0ZU93bmVkT3BlcmF0aW9uLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJPcGVyYXRpb24iIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzLWNyZWF0ZU93bmVkT3BlcmF0aW9uLW5hbWUiIG5hbWU9Im5hbWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzLWNyZWF0ZU93bmVkT3BlcmF0aW9uLW5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzcy1jcmVhdGVPd25lZE9wZXJhdGlvbi1uYW1lIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuYW1lIGZvciB0aGUgbmV3IG9wZXJhdGlvbiwgb3IgbnVsbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzcy1jcmVhdGVPd25lZE9wZXJhdGlvbi1uYW1lLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzcy1jcmVhdGVPd25lZE9wZXJhdGlvbi1uYW1lLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzcy1jcmVhdGVPd25lZE9wZXJhdGlvbi1wYXJhbWV0ZXJOYW1lcyIgbmFtZT0icGFyYW1ldGVyTmFtZXMiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3MtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyTmFtZXMiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHBhcmFtZXRlciBuYW1lcyBmb3IgdGhlIG5ldyBvcGVyYXRpb24sIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3MtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyTmFtZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlck5hbWVzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzcy1jcmVhdGVPd25lZE9wZXJhdGlvbi1wYXJhbWV0ZXJUeXBlcyIgbmFtZT0icGFyYW1ldGVyVHlwZXMiIHR5cGU9IlR5cGUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlclR5cGVzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3MtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyVHlwZXMiPgotICAgICAgICAgICAgPGJvZHk+VGhlIHBhcmFtZXRlciB0eXBlcyBmb3IgdGhlIG5ldyBvcGVyYXRpb24sIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3MtY3JlYXRlT3duZWRPcGVyYXRpb24tcGFyYW1ldGVyVHlwZXMtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXBhcmFtZXRlclR5cGVzLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzcy1jcmVhdGVPd25lZE9wZXJhdGlvbi1yZXR1cm5UeXBlIiBuYW1lPSJyZXR1cm5UeXBlIiB0eXBlPSJUeXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzcy1jcmVhdGVPd25lZE9wZXJhdGlvbi1yZXR1cm5UeXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3MtY3JlYXRlT3duZWRPcGVyYXRpb24tcmV0dXJuVHlwZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgcmV0dXJuIHR5cGUgZm9yIHRoZSBuZXcgb3BlcmF0aW9uLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXJldHVyblR5cGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNsYXNzLWNyZWF0ZU93bmVkT3BlcmF0aW9uLXJldHVyblR5cGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ2xhc3MtaXNNZXRhY2xhc3MiIG5hbWU9ImlzTWV0YWNsYXNzIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNsYXNzLWlzTWV0YWNsYXNzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ2xhc3MtaXNNZXRhY2xhc3MiPgotICAgICAgICAgIDxib2R5PkRldGVybWluZXMgd2hldGhlciB0aGlzIGNsYXNzIGlzIGEgbWV0YWNsYXNzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzLWlzTWV0YWNsYXNzLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNsYXNzLWV4dGVuc2lvbi4xIiBuYW1lPSJleHRlbnNpb24iIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iQ2xhc3MtZXh0ZW5zaW9uLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzcy1leHRlbnNpb24uMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNsYXNzLWV4dGVuc2lvbi4xIj4KLSAgICAgICAgICA8Ym9keT5EZXJpdmF0aW9uIGZvciBDbGFzczo6L2V4dGVuc2lvbiA6IEV4dGVuc2lvbjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDbGFzcy1leHRlbnNpb24uMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzLWV4dGVuc2lvbi4xIENsYXNzLWV4dGVuc2lvbiI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNsYXNzLWV4dGVuc2lvbi4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoRXh0ZW5zaW9uLmFsbEluc3RhbmNlcygpLT5zZWxlY3QoZXh0IHwgJiN4RDsKLSAgbGV0IGVuZFR5cGVzIDogU2VxdWVuY2UoQ2xhc3NpZmllcikgPSBleHQubWVtYmVyRW5kLT5jb2xsZWN0KHR5cGUub2NsQXNUeXBlKENsYXNzaWZpZXIpKSBpbiYjeEQ7Ci0gIGVuZFR5cGVzLT5pbmNsdWRlcyhzZWxmKSBvciBlbmRUeXBlcy5hbGxQYXJlbnRzKCktPmluY2x1ZGVzKHNlbGYpICkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNsYXNzLWV4dGVuc2lvbi4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJFeHRlbnNpb24iIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzLWV4dGVuc2lvbi4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ2xhc3MtZXh0ZW5zaW9uLjEtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNsYXNzLXN1cGVyQ2xhc3MuMSIgbmFtZT0ic3VwZXJDbGFzcyIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiBib2R5Q29uZGl0aW9uPSJDbGFzcy1zdXBlckNsYXNzLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDbGFzcy1zdXBlckNsYXNzLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDbGFzcy1zdXBlckNsYXNzLjEiPgotICAgICAgICAgIDxib2R5PkRlcml2YXRpb24gZm9yIENsYXNzOjovc3VwZXJDbGFzcyA6IENsYXNzPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNsYXNzLXN1cGVyQ2xhc3MuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNsYXNzLXN1cGVyQ2xhc3MuMSBDbGFzcy1zdXBlckNsYXNzIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ2xhc3Mtc3VwZXJDbGFzcy4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc2VsZi5nZW5lcmFsKCktPnNlbGVjdChvY2xJc0tpbmRPZihDbGFzcykpLT5jb2xsZWN0KG9jbEFzVHlwZShDbGFzcykpLT5hc1NldCgpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDbGFzcy1zdXBlckNsYXNzLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkNsYXNzIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzcy1zdXBlckNsYXNzLjEtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDbGFzcy1zdXBlckNsYXNzLjEtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ29sbGFib3JhdGlvbiIgbmFtZT0iQ29sbGFib3JhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29sbGFib3JhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbGxhYm9yYXRpb24iPgotICAgICAgICA8Ym9keT5BIENvbGxhYm9yYXRpb24gZGVzY3JpYmVzIGEgc3RydWN0dXJlIG9mIGNvbGxhYm9yYXRpbmcgZWxlbWVudHMgKHJvbGVzKSwgZWFjaCBwZXJmb3JtaW5nIGEgc3BlY2lhbGl6ZWQgZnVuY3Rpb24sIHdoaWNoIGNvbGxlY3RpdmVseSBhY2NvbXBsaXNoIHNvbWUgZGVzaXJlZCBmdW5jdGlvbmFsaXR5LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQ29sbGFib3JhdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iU3RydWN0dXJlZENsYXNzaWZpZXIiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNvbGxhYm9yYXRpb24tX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IkJlaGF2aW9yZWRDbGFzc2lmaWVyIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb2xsYWJvcmF0aW9uLWNvbGxhYm9yYXRpb25Sb2xlIiBuYW1lPSJjb2xsYWJvcmF0aW9uUm9sZSIgdHlwZT0iQ29ubmVjdGFibGVFbGVtZW50IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iU3RydWN0dXJlZENsYXNzaWZpZXItcm9sZSIgYXNzb2NpYXRpb249IkFfY29sbGFib3JhdGlvblJvbGVfY29sbGFib3JhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb2xsYWJvcmF0aW9uLWNvbGxhYm9yYXRpb25Sb2xlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29sbGFib3JhdGlvbi1jb2xsYWJvcmF0aW9uUm9sZSI+Ci0gICAgICAgICAgPGJvZHk+UmVwcmVzZW50cyB0aGUgcGFydGljaXBhbnRzIGluIHRoZSBDb2xsYWJvcmF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ29sbGFib3JhdGlvbi1jb2xsYWJvcmF0aW9uUm9sZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNvbGxhYm9yYXRpb24tY29sbGFib3JhdGlvblJvbGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJDb2xsYWJvcmF0aW9uVXNlIiBuYW1lPSJDb2xsYWJvcmF0aW9uVXNlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb2xsYWJvcmF0aW9uVXNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29sbGFib3JhdGlvblVzZSI+Ci0gICAgICAgIDxib2R5PkEgQ29sbGFib3JhdGlvblVzZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGFwcGxpY2F0aW9uIG9mIGEgcGF0dGVybiBzcGVjaWZpZWQgYnkgYSBDb2xsYWJvcmF0aW9uIHRvIGEgc3BlY2lmaWMgc2l0dWF0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbGxhYm9yYXRpb25Vc2UtY2xpZW50X2VsZW1lbnRzIiBuYW1lPSJjbGllbnRfZWxlbWVudHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ29sbGFib3JhdGlvblVzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb2xsYWJvcmF0aW9uVXNlLWNsaWVudF9lbGVtZW50cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbGxhYm9yYXRpb25Vc2UtY2xpZW50X2VsZW1lbnRzIj4KLSAgICAgICAgICA8Ym9keT5BbGwgdGhlIGNsaWVudCBlbGVtZW50cyBvZiBhIHJvbGVCaW5kaW5nIGFyZSBpbiBvbmUgQ2xhc3NpZmllciBhbmQgYWxsIHN1cHBsaWVyIGVsZW1lbnRzIG9mIGEgcm9sZUJpbmRpbmcgYXJlIGluIG9uZSBDb2xsYWJvcmF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb2xsYWJvcmF0aW9uVXNlLWNsaWVudF9lbGVtZW50cy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+cm9sZUJpbmRpbmctPmNvbGxlY3QoY2xpZW50KS0+Zm9yQWxsKG5lMSwgbmUyIHwmI3hEOwotICBuZTEub2NsSXNLaW5kT2YoQ29ubmVjdGFibGVFbGVtZW50KSBhbmQgbmUyLm9jbElzS2luZE9mKENvbm5lY3RhYmxlRWxlbWVudCkgYW5kJiN4RDsKLSAgICBsZXQgY2UxIDogQ29ubmVjdGFibGVFbGVtZW50ID0gbmUxLm9jbEFzVHlwZShDb25uZWN0YWJsZUVsZW1lbnQpLCBjZTIgOiBDb25uZWN0YWJsZUVsZW1lbnQgPSBuZTIub2NsQXNUeXBlKENvbm5lY3RhYmxlRWxlbWVudCkgaW4mI3hEOwotICAgICAgY2UxLnN0cnVjdHVyZWRDbGFzc2lmaWVyID0gY2UyLnN0cnVjdHVyZWRDbGFzc2lmaWVyKSYjeEQ7Ci1hbmQmI3hEOwotICByb2xlQmluZGluZy0+Y29sbGVjdChzdXBwbGllciktPmZvckFsbChuZTEsIG5lMiB8JiN4RDsKLSAgbmUxLm9jbElzS2luZE9mKENvbm5lY3RhYmxlRWxlbWVudCkgYW5kIG5lMi5vY2xJc0tpbmRPZihDb25uZWN0YWJsZUVsZW1lbnQpIGFuZCYjeEQ7Ci0gICAgbGV0IGNlMSA6IENvbm5lY3RhYmxlRWxlbWVudCA9IG5lMS5vY2xBc1R5cGUoQ29ubmVjdGFibGVFbGVtZW50KSwgY2UyIDogQ29ubmVjdGFibGVFbGVtZW50ID0gbmUyLm9jbEFzVHlwZShDb25uZWN0YWJsZUVsZW1lbnQpIGluJiN4RDsKLSAgICAgIGNlMS5jb2xsYWJvcmF0aW9uID0gY2UyLmNvbGxhYm9yYXRpb24pPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb2xsYWJvcmF0aW9uVXNlLWV2ZXJ5X3JvbGUiIG5hbWU9ImV2ZXJ5X3JvbGUiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ29sbGFib3JhdGlvblVzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb2xsYWJvcmF0aW9uVXNlLWV2ZXJ5X3JvbGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb2xsYWJvcmF0aW9uVXNlLWV2ZXJ5X3JvbGUiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IGNvbGxhYm9yYXRpb25Sb2xlIGluIHRoZSBDb2xsYWJvcmF0aW9uIGlzIGJvdW5kIHdpdGhpbiB0aGUgQ29sbGFib3JhdGlvblVzZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ29sbGFib3JhdGlvblVzZS1ldmVyeV9yb2xlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT50eXBlLmNvbGxhYm9yYXRpb25Sb2xlLT5mb3JBbGwocm9sZSB8IHJvbGVCaW5kaW5nLT5leGlzdHMocmIgfCByYi5zdXBwbGllci0+aW5jbHVkZXMocm9sZSkpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29sbGFib3JhdGlvblVzZS1jb25uZWN0b3JzIiBuYW1lPSJjb25uZWN0b3JzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbGxhYm9yYXRpb25Vc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29sbGFib3JhdGlvblVzZS1jb25uZWN0b3JzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29sbGFib3JhdGlvblVzZS1jb25uZWN0b3JzIj4KLSAgICAgICAgICA8Ym9keT5Db25uZWN0b3JzIGluIGEgQ29sbGFib3JhdGlvbiB0eXBpbmcgYSBDb2xsYWJvcmF0aW9uVXNlIG11c3QgaGF2ZSBjb3JyZXNwb25kaW5nIENvbm5lY3RvcnMgYmV0d2VlbiBlbGVtZW50cyBib3VuZCBpbiB0aGUgY29udGV4dCBDbGFzc2lmaWVyLCBhbmQgdGhlc2UgY29ycmVzcG9uZGluZyBDb25uZWN0b3JzIG11c3QgaGF2ZSB0aGUgc2FtZSBvciBtb3JlIGdlbmVyYWwgdHlwZSB0aGFuIHRoZSBDb2xsYWJvcmF0aW9uIENvbm5lY3RvcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbGxhYm9yYXRpb25Vc2UtY29ubmVjdG9ycy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dHlwZS5vd25lZENvbm5lY3Rvci0+Zm9yQWxsKGNvbm5lY3RvciB8JiN4RDsKLSAgbGV0IHJvbGVzQ29ubmVjdGVkSW5Db2xsYWIgOiBTZXQoQ29ubmVjdGFibGVFbGVtZW50KSA9IGNvbm5lY3Rvci5lbmQucm9sZS0+YXNTZXQoKSwmI3hEOwotICAgICAgICByZWxldmFudEJpbmRpbmdzIDogU2V0KERlcGVuZGVuY3kpID0gcm9sZUJpbmRpbmctPnNlbGVjdChyYiB8IHJiLnN1cHBsaWVyLT5pbnRlcnNlY3Rpb24ocm9sZXNDb25uZWN0ZWRJbkNvbGxhYiktPm5vdEVtcHR5KCkpLCYjeEQ7Ci0gICAgICAgIGJvdW5kUm9sZXMgOiBTZXQoQ29ubmVjdGFibGVFbGVtZW50KSA9IHJlbGV2YW50QmluZGluZ3MtPmNvbGxlY3QoY2xpZW50Lm9jbEFzVHlwZShDb25uZWN0YWJsZUVsZW1lbnQpKS0+YXNTZXQoKSwmI3hEOwotICAgICAgICBjb250ZXh0Q2xhc3NpZmllciA6IFN0cnVjdHVyZWRDbGFzc2lmaWVyID0gYm91bmRSb2xlcy0+YW55KHRydWUpLnN0cnVjdHVyZWRDbGFzc2lmaWVyLT5hbnkodHJ1ZSkgaW4mI3hEOwotICAgICAgICAgIGNvbnRleHRDbGFzc2lmaWVyLm93bmVkQ29ubmVjdG9yLT5leGlzdHMoIGNvcnJlc3BvbmRpbmdDb25uZWN0b3IgfCAmI3hEOwotICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nQ29ubmVjdG9yLmVuZC5yb2xlLT5mb3JBbGwoIHJvbGUgfCBib3VuZFJvbGVzLT5pbmNsdWRlcyhyb2xlKSApJiN4RDsKLSAgICAgICAgICAgICAgYW5kIChjb25uZWN0b3IudHlwZS0+bm90RW1wdHkoKSBhbmQgY29ycmVzcG9uZGluZ0Nvbm5lY3Rvci50eXBlLT5ub3RFbXB0eSgpKSBpbXBsaWVzIGNvbm5lY3Rvci50eXBlLT5mb3JBbGwoY29uZm9ybXNUbyhjb3JyZXNwb25kaW5nQ29ubmVjdG9yLnR5cGUpKSApJiN4RDsKLSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQ29sbGFib3JhdGlvblVzZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTmFtZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb2xsYWJvcmF0aW9uVXNlLXJvbGVCaW5kaW5nIiBuYW1lPSJyb2xlQmluZGluZyIgdHlwZT0iRGVwZW5kZW5jeSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9yb2xlQmluZGluZ19jb2xsYWJvcmF0aW9uVXNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbGxhYm9yYXRpb25Vc2Utcm9sZUJpbmRpbmctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb2xsYWJvcmF0aW9uVXNlLXJvbGVCaW5kaW5nIj4KLSAgICAgICAgICA8Ym9keT5BIG1hcHBpbmcgYmV0d2VlbiBmZWF0dXJlcyBvZiB0aGUgQ29sbGFib3JhdGlvbiBhbmQgZmVhdHVyZXMgb2YgdGhlIG93bmluZyBDbGFzc2lmaWVyLiBUaGlzIG1hcHBpbmcgaW5kaWNhdGVzIHdoaWNoIENvbm5lY3RhYmxlRWxlbWVudCBvZiB0aGUgQ2xhc3NpZmllciBwbGF5cyB3aGljaCByb2xlKHMpIGluIHRoZSBDb2xsYWJvcmF0aW9uLiBBIENvbm5lY3RhYmxlRWxlbWVudCBtYXkgYmUgYm91bmQgdG8gbXVsdGlwbGUgcm9sZXMgaW4gdGhlIHNhbWUgQ29sbGFib3JhdGlvblVzZSAodGhhdCBpcywgaXQgbWF5IHBsYXkgbXVsdGlwbGUgcm9sZXMpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ29sbGFib3JhdGlvblVzZS1yb2xlQmluZGluZy1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNvbGxhYm9yYXRpb25Vc2Utcm9sZUJpbmRpbmctX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29sbGFib3JhdGlvblVzZS10eXBlIiBuYW1lPSJ0eXBlIiB0eXBlPSJDb2xsYWJvcmF0aW9uIiBhc3NvY2lhdGlvbj0iQV90eXBlX2NvbGxhYm9yYXRpb25Vc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29sbGFib3JhdGlvblVzZS10eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29sbGFib3JhdGlvblVzZS10eXBlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQ29sbGFib3JhdGlvbiB3aGljaCBpcyB1c2VkIGluIHRoaXMgQ29sbGFib3JhdGlvblVzZS4gVGhlIENvbGxhYm9yYXRpb24gZGVmaW5lcyB0aGUgY29vcGVyYXRpb24gYmV0d2VlbiBpdHMgcm9sZXMgd2hpY2ggYXJlIG1hcHBlZCB0byBDb25uZWN0YWJsZUVsZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBDbGFzc2lmaWVyIG93bmluZyB0aGUgQ29sbGFib3JhdGlvblVzZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ29tcG9uZW50IiBuYW1lPSJDb21wb25lbnQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbXBvbmVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbXBvbmVudCI+Ci0gICAgICAgIDxib2R5PkEgQ29tcG9uZW50IHJlcHJlc2VudHMgYSBtb2R1bGFyIHBhcnQgb2YgYSBzeXN0ZW0gdGhhdCBlbmNhcHN1bGF0ZXMgaXRzIGNvbnRlbnRzIGFuZCB3aG9zZSBtYW5pZmVzdGF0aW9uIGlzIHJlcGxhY2VhYmxlIHdpdGhpbiBpdHMgZW52aXJvbm1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29tcG9uZW50LW5vX25lc3RlZF9jbGFzc2lmaWVycyIgbmFtZT0ibm9fbmVzdGVkX2NsYXNzaWZpZXJzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbXBvbmVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb21wb25lbnQtbm9fbmVzdGVkX2NsYXNzaWZpZXJzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29tcG9uZW50LW5vX25lc3RlZF9jbGFzc2lmaWVycyI+Ci0gICAgICAgICAgPGJvZHk+QSBDb21wb25lbnQgY2Fubm90IG5lc3QgQ2xhc3NpZmllcnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbXBvbmVudC1ub19uZXN0ZWRfY2xhc3NpZmllcnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5lc3RlZENsYXNzaWZpZXItPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29tcG9uZW50LW5vX3BhY2thZ2VkX2VsZW1lbnRzIiBuYW1lPSJub19wYWNrYWdlZF9lbGVtZW50cyIgY29uc3RyYWluZWRFbGVtZW50PSJDb21wb25lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tcG9uZW50LW5vX3BhY2thZ2VkX2VsZW1lbnRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29tcG9uZW50LW5vX3BhY2thZ2VkX2VsZW1lbnRzIj4KLSAgICAgICAgICA8Ym9keT5BIENvbXBvbmVudCBuZXN0ZWQgaW4gYSBDbGFzcyBjYW5ub3QgaGF2ZSBhbnkgcGFja2FnZWQgZWxlbWVudHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbXBvbmVudC1ub19wYWNrYWdlZF9lbGVtZW50cy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bmVzdGluZ0NsYXNzICZsdDs+IG51bGwgaW1wbGllcyBwYWNrYWdlZEVsZW1lbnQtPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDb21wb25lbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkNsYXNzIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb21wb25lbnQtaXNJbmRpcmVjdGx5SW5zdGFudGlhdGVkIiBuYW1lPSJpc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tcG9uZW50LWlzSW5kaXJlY3RseUluc3RhbnRpYXRlZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbXBvbmVudC1pc0luZGlyZWN0bHlJbnN0YW50aWF0ZWQiPgotICAgICAgICAgIDxib2R5PklmIHRydWUsIHRoZSBDb21wb25lbnQgaXMgZGVmaW5lZCBhdCBkZXNpZ24tdGltZSwgYnV0IGF0IHJ1bi10aW1lIChvciBleGVjdXRpb24tdGltZSkgYW4gb2JqZWN0IHNwZWNpZmllZCBieSB0aGUgQ29tcG9uZW50IGRvZXMgbm90IGV4aXN0LCB0aGF0IGlzLCB0aGUgQ29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBpbmRpcmVjdGx5LCB0aHJvdWdoIHRoZSBpbnN0YW50aWF0aW9uIG9mIGl0cyByZWFsaXppbmcgQ2xhc3NpZmllcnMgb3IgcGFydHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iQ29tcG9uZW50LWlzSW5kaXJlY3RseUluc3RhbnRpYXRlZC1fZGVmYXVsdFZhbHVlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbXBvbmVudC1wYWNrYWdlZEVsZW1lbnQiIG5hbWU9InBhY2thZ2VkRWxlbWVudCIgdHlwZT0iUGFja2FnZWFibGVFbGVtZW50IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9wYWNrYWdlZEVsZW1lbnRfY29tcG9uZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbXBvbmVudC1wYWNrYWdlZEVsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21wb25lbnQtcGFja2FnZWRFbGVtZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgc2V0IG9mIFBhY2thZ2VhYmxlRWxlbWVudHMgdGhhdCBhIENvbXBvbmVudCBvd25zLiBJbiB0aGUgbmFtZXNwYWNlIG9mIGEgQ29tcG9uZW50LCBhbGwgbW9kZWwgZWxlbWVudHMgdGhhdCBhcmUgaW52b2x2ZWQgaW4gb3IgcmVsYXRlZCB0byBpdHMgZGVmaW5pdGlvbiBtYXkgYmUgb3duZWQgb3IgaW1wb3J0ZWQgZXhwbGljaXRseS4gVGhlc2UgbWF5IGluY2x1ZGUgZS5nLiwgQ2xhc3NlcywgSW50ZXJmYWNlcywgQ29tcG9uZW50cywgUGFja2FnZXMsIFVzZUNhc2VzLCBEZXBlbmRlbmNpZXMgKGUuZy4sIG1hcHBpbmdzKSwgYW5kIEFydGlmYWN0cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbXBvbmVudC1wYWNrYWdlZEVsZW1lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb21wb25lbnQtcGFja2FnZWRFbGVtZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbXBvbmVudC1wcm92aWRlZCIgbmFtZT0icHJvdmlkZWQiIHR5cGU9IkludGVyZmFjZSIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9wcm92aWRlZF9jb21wb25lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tcG9uZW50LXByb3ZpZGVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29tcG9uZW50LXByb3ZpZGVkIj4KLSAgICAgICAgICA8Ym9keT5UaGUgSW50ZXJmYWNlcyB0aGF0IHRoZSBDb21wb25lbnQgZXhwb3NlcyB0byBpdHMgZW52aXJvbm1lbnQuIFRoZXNlIEludGVyZmFjZXMgbWF5IGJlIFJlYWxpemVkIGJ5IHRoZSBDb21wb25lbnQgb3IgYW55IG9mIGl0cyByZWFsaXppbmdDbGFzc2lmaWVycywgb3IgdGhleSBtYXkgYmUgdGhlIEludGVyZmFjZXMgdGhhdCBhcmUgcHJvdmlkZWQgYnkgaXRzIHB1YmxpYyBQb3J0cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbXBvbmVudC1wcm92aWRlZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNvbXBvbmVudC1wcm92aWRlZC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb21wb25lbnQtcmVhbGl6YXRpb24iIG5hbWU9InJlYWxpemF0aW9uIiB0eXBlPSJDb21wb25lbnRSZWFsaXphdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfc3VwcGxpZXJfc3VwcGxpZXJEZXBlbmRlbmN5LXN1cHBsaWVyRGVwZW5kZW5jeSBFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfcmVhbGl6YXRpb25fYWJzdHJhY3Rpb25fY29tcG9uZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbXBvbmVudC1yZWFsaXphdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbXBvbmVudC1yZWFsaXphdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNldCBvZiBSZWFsaXphdGlvbnMgb3duZWQgYnkgdGhlIENvbXBvbmVudC4gUmVhbGl6YXRpb25zIHJlZmVyZW5jZSB0aGUgQ2xhc3NpZmllcnMgb2Ygd2hpY2ggdGhlIENvbXBvbmVudCBpcyBhbiBhYnN0cmFjdGlvbjsgaS5lLiwgdGhhdCByZWFsaXplIGl0cyBiZWhhdmlvci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbXBvbmVudC1yZWFsaXphdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNvbXBvbmVudC1yZWFsaXphdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb21wb25lbnQtcmVxdWlyZWQiIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJJbnRlcmZhY2UiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfcmVxdWlyZWRfY29tcG9uZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbXBvbmVudC1yZXF1aXJlZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbXBvbmVudC1yZXF1aXJlZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyZmFjZXMgdGhhdCB0aGUgQ29tcG9uZW50IHJlcXVpcmVzIGZyb20gb3RoZXIgQ29tcG9uZW50cyBpbiBpdHMgZW52aXJvbm1lbnQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBvZmZlciBpdHMgZnVsbCBzZXQgb2YgcHJvdmlkZWQgZnVuY3Rpb25hbGl0eS4gVGhlc2UgSW50ZXJmYWNlcyBtYXkgYmUgdXNlZCBieSB0aGUgQ29tcG9uZW50IG9yIGFueSBvZiBpdHMgcmVhbGl6aW5nQ2xhc3NpZmllcnMsIG9yIHRoZXkgbWF5IGJlIHRoZSBJbnRlcmZhY2VzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IGl0cyBwdWJsaWMgUG9ydHMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb21wb25lbnQtcmVxdWlyZWQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb21wb25lbnQtcmVxdWlyZWQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ29tcG9uZW50LWNyZWF0ZU93bmVkQ2xhc3MiIG5hbWU9ImNyZWF0ZU93bmVkQ2xhc3MiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tcG9uZW50LWNyZWF0ZU93bmVkQ2xhc3MtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21wb25lbnQtY3JlYXRlT3duZWRDbGFzcyI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhKG4pIChhYnN0cmFjdCkgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYXMgYSBwYWNrYWdlZCBlbGVtZW50IG9mIHRoaXMgY29tcG9uZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNvbXBvbmVudC1jcmVhdGVPd25lZENsYXNzLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJDbGFzcyIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ29tcG9uZW50LWNyZWF0ZU93bmVkQ2xhc3MtbmFtZSIgbmFtZT0ibmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tcG9uZW50LWNyZWF0ZU93bmVkQ2xhc3MtbmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbXBvbmVudC1jcmVhdGVPd25lZENsYXNzLW5hbWUiPgotICAgICAgICAgICAgPGJvZHk+VGhlIG5hbWUgZm9yIHRoZSBuZXcgY2xhc3MsIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDb21wb25lbnQtY3JlYXRlT3duZWRDbGFzcy1pc0Fic3RyYWN0IiBuYW1lPSJpc0Fic3RyYWN0IiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb21wb25lbnQtY3JlYXRlT3duZWRDbGFzcy1pc0Fic3RyYWN0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29tcG9uZW50LWNyZWF0ZU93bmVkQ2xhc3MtaXNBYnN0cmFjdCI+Ci0gICAgICAgICAgICA8Ym9keT5XaGV0aGVyIHRoZSBuZXcgY2xhc3Mgc2hvdWxkIGJlIGFic3RyYWN0LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ29tcG9uZW50LWNyZWF0ZU93bmVkRW51bWVyYXRpb24iIG5hbWU9ImNyZWF0ZU93bmVkRW51bWVyYXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tcG9uZW50LWNyZWF0ZU93bmVkRW51bWVyYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21wb25lbnQtY3JlYXRlT3duZWRFbnVtZXJhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhIGVudW1lcmF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFzIGEgcGFja2FnZWQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDb21wb25lbnQtY3JlYXRlT3duZWRFbnVtZXJhdGlvbi1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iRW51bWVyYXRpb24iIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNvbXBvbmVudC1jcmVhdGVPd25lZEVudW1lcmF0aW9uLW5hbWUiIG5hbWU9Im5hbWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbXBvbmVudC1jcmVhdGVPd25lZEVudW1lcmF0aW9uLW5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21wb25lbnQtY3JlYXRlT3duZWRFbnVtZXJhdGlvbi1uYW1lIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuYW1lIGZvciB0aGUgbmV3IGVudW1lcmF0aW9uLCBvciBudWxsLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDb21wb25lbnQtY3JlYXRlT3duZWRJbnRlcmZhY2UiIG5hbWU9ImNyZWF0ZU93bmVkSW50ZXJmYWNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbXBvbmVudC1jcmVhdGVPd25lZEludGVyZmFjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbXBvbmVudC1jcmVhdGVPd25lZEludGVyZmFjZSI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhbiBpbnRlcmZhY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYXMgYSBwYWNrYWdlZCBlbGVtZW50IG9mIHRoaXMgY29tcG9uZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNvbXBvbmVudC1jcmVhdGVPd25lZEludGVyZmFjZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iSW50ZXJmYWNlIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDb21wb25lbnQtY3JlYXRlT3duZWRJbnRlcmZhY2UtbmFtZSIgbmFtZT0ibmFtZSIgZWZmZWN0PSJyZWFkIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tcG9uZW50LWNyZWF0ZU93bmVkSW50ZXJmYWNlLW5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21wb25lbnQtY3JlYXRlT3duZWRJbnRlcmZhY2UtbmFtZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmFtZSBmb3IgdGhlIG5ldyBpbnRlcmZhY2UsIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNvbXBvbmVudC1jcmVhdGVPd25lZFByaW1pdGl2ZVR5cGUiIG5hbWU9ImNyZWF0ZU93bmVkUHJpbWl0aXZlVHlwZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb21wb25lbnQtY3JlYXRlT3duZWRQcmltaXRpdmVUeXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29tcG9uZW50LWNyZWF0ZU93bmVkUHJpbWl0aXZlVHlwZSI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhIHByaW1pdGl2ZSB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFzIGEgcGFja2FnZWQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDb21wb25lbnQtY3JlYXRlT3duZWRQcmltaXRpdmVUeXBlLV9vd25lZFBhcmFtZXRlci4wIiB0eXBlPSJQcmltaXRpdmVUeXBlIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDb21wb25lbnQtY3JlYXRlT3duZWRQcmltaXRpdmVUeXBlLW5hbWUiIG5hbWU9Im5hbWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbXBvbmVudC1jcmVhdGVPd25lZFByaW1pdGl2ZVR5cGUtbmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbXBvbmVudC1jcmVhdGVPd25lZFByaW1pdGl2ZVR5cGUtbmFtZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgbmFtZSBmb3IgdGhlIG5ldyBwcmltaXRpdmUgdHlwZSwgb3IgbnVsbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ29tcG9uZW50LXByb3ZpZGVkLjEiIG5hbWU9InByb3ZpZGVkIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IkNvbXBvbmVudC1wcm92aWRlZC4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tcG9uZW50LXByb3ZpZGVkLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21wb25lbnQtcHJvdmlkZWQuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgQ29tcG9uZW50OjovcHJvdmlkZWQ8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29tcG9uZW50LXByb3ZpZGVkLjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDb21wb25lbnQtcHJvdmlkZWQuMSBDb21wb25lbnQtcHJvdmlkZWQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb21wb25lbnQtcHJvdmlkZWQuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGxldCAJcmlzIDogU2V0KEludGVyZmFjZSkgPSBhbGxSZWFsaXplZEludGVyZmFjZXMoKSwmI3hEOwotICAgICAgICByZWFsaXppbmdDbGFzc2lmaWVycyA6IFNldChDbGFzc2lmaWVyKSA9ICBzZWxmLnJlYWxpemF0aW9uLnJlYWxpemluZ0NsYXNzaWZpZXItPnVuaW9uKHNlbGYuYWxsUGFyZW50cygpLT5jb2xsZWN0KHJlYWxpemF0aW9uLnJlYWxpemluZ0NsYXNzaWZpZXIpKS0+YXNTZXQoKSwmI3hEOwotICAgICAgICBhbGxSZWFsaXppbmdDbGFzc2lmaWVycyA6IFNldChDbGFzc2lmaWVyKSA9IHJlYWxpemluZ0NsYXNzaWZpZXJzLT51bmlvbihyZWFsaXppbmdDbGFzc2lmaWVycy5hbGxQYXJlbnRzKCkpLT5hc1NldCgpLCYjeEQ7Ci0gICAgICAgIHJlYWxpemluZ0NsYXNzaWZpZXJJbnRlcmZhY2VzIDogU2V0KEludGVyZmFjZSkgPSBhbGxSZWFsaXppbmdDbGFzc2lmaWVycy0+aXRlcmF0ZShjOyByY2kgOiBTZXQoSW50ZXJmYWNlKSA9IFNldHt9IHwgcmNpLT51bmlvbihjLmFsbFJlYWxpemVkSW50ZXJmYWNlcygpKSksJiN4RDsKLSAgICAgICAgcG9ydHMgOiBTZXQoUG9ydCkgPSBzZWxmLm93bmVkUG9ydC0+dW5pb24oYWxsUGFyZW50cygpLT5jb2xsZWN0KG93bmVkUG9ydCkpLT5hc1NldCgpLCYjeEQ7Ci0gICAgICAgIHByb3ZpZGVkQnlQb3J0cyA6IFNldChJbnRlcmZhY2UpID0gcG9ydHMucHJvdmlkZWQtPmFzU2V0KCkmI3hEOwotaW4gICAgIHJpcy0+dW5pb24ocmVhbGl6aW5nQ2xhc3NpZmllckludGVyZmFjZXMpIC0+dW5pb24ocHJvdmlkZWRCeVBvcnRzKS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ29tcG9uZW50LXByb3ZpZGVkLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkludGVyZmFjZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ29tcG9uZW50LXByb3ZpZGVkLjEtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb21wb25lbnQtcHJvdmlkZWQuMS1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iQ29tcG9uZW50LXJlcXVpcmVkLjEiIG5hbWU9InJlcXVpcmVkIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IkNvbXBvbmVudC1yZXF1aXJlZC4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tcG9uZW50LXJlcXVpcmVkLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21wb25lbnQtcmVxdWlyZWQuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgQ29tcG9uZW50OjovcmVxdWlyZWQ8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29tcG9uZW50LXJlcXVpcmVkLjEtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJDb21wb25lbnQtcmVxdWlyZWQuMSBDb21wb25lbnQtcmVxdWlyZWQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb21wb25lbnQtcmVxdWlyZWQuMS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGxldCAJdWlzIDogU2V0KEludGVyZmFjZSkgPSBhbGxVc2VkSW50ZXJmYWNlcygpLCYjeEQ7Ci0gICAgICAgIHJlYWxpemluZ0NsYXNzaWZpZXJzIDogU2V0KENsYXNzaWZpZXIpID0gc2VsZi5yZWFsaXphdGlvbi5yZWFsaXppbmdDbGFzc2lmaWVyLT51bmlvbihzZWxmLmFsbFBhcmVudHMoKS0+Y29sbGVjdChyZWFsaXphdGlvbi5yZWFsaXppbmdDbGFzc2lmaWVyKSktPmFzU2V0KCksJiN4RDsKLSAgICAgICAgYWxsUmVhbGl6aW5nQ2xhc3NpZmllcnMgOiBTZXQoQ2xhc3NpZmllcikgPSByZWFsaXppbmdDbGFzc2lmaWVycy0+dW5pb24ocmVhbGl6aW5nQ2xhc3NpZmllcnMuYWxsUGFyZW50cygpKS0+YXNTZXQoKSwmI3hEOwotICAgICAgICByZWFsaXppbmdDbGFzc2lmaWVySW50ZXJmYWNlcyA6IFNldChJbnRlcmZhY2UpID0gYWxsUmVhbGl6aW5nQ2xhc3NpZmllcnMtPml0ZXJhdGUoYzsgcmNpIDogU2V0KEludGVyZmFjZSkgPSBTZXR7fSB8IHJjaS0+dW5pb24oYy5hbGxVc2VkSW50ZXJmYWNlcygpKSksJiN4RDsKLSAgICAgICAgcG9ydHMgOiBTZXQoUG9ydCkgPSBzZWxmLm93bmVkUG9ydC0+dW5pb24oYWxsUGFyZW50cygpLT5jb2xsZWN0KG93bmVkUG9ydCkpLT5hc1NldCgpLCYjeEQ7Ci0gICAgICAgIHVzZWRCeVBvcnRzIDogU2V0KEludGVyZmFjZSkgPSBwb3J0cy5yZXF1aXJlZC0+YXNTZXQoKSYjeEQ7Ci1pbgkgICAgdWlzLT51bmlvbihyZWFsaXppbmdDbGFzc2lmaWVySW50ZXJmYWNlcyktPnVuaW9uKHVzZWRCeVBvcnRzKS0+YXNTZXQoKSYjeEQ7Ci0pPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkNvbXBvbmVudC1yZXF1aXJlZC4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJJbnRlcmZhY2UiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbXBvbmVudC1yZXF1aXJlZC4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ29tcG9uZW50LXJlcXVpcmVkLjEtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ29tcG9uZW50UmVhbGl6YXRpb24iIG5hbWU9IkNvbXBvbmVudFJlYWxpemF0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb21wb25lbnRSZWFsaXphdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbXBvbmVudFJlYWxpemF0aW9uIj4KLSAgICAgICAgPGJvZHk+UmVhbGl6YXRpb24gaXMgc3BlY2lhbGl6ZWQgdG8gKG9wdGlvbmFsbHkpIGRlZmluZSB0aGUgQ2xhc3NpZmllcnMgdGhhdCByZWFsaXplIHRoZSBjb250cmFjdCBvZmZlcmVkIGJ5IGEgQ29tcG9uZW50IGluIHRlcm1zIG9mIGl0cyBwcm92aWRlZCBhbmQgcmVxdWlyZWQgSW50ZXJmYWNlcy4gVGhlIENvbXBvbmVudCBmb3JtcyBhbiBhYnN0cmFjdGlvbiBmcm9tIHRoZXNlIHZhcmlvdXMgQ2xhc3NpZmllcnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDb21wb25lbnRSZWFsaXphdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iUmVhbGl6YXRpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbXBvbmVudFJlYWxpemF0aW9uLWFic3RyYWN0aW9uIiBuYW1lPSJhYnN0cmFjdGlvbiIgdHlwZT0iQ29tcG9uZW50IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRGVwZW5kZW5jeS1zdXBwbGllciBFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9yZWFsaXphdGlvbl9hYnN0cmFjdGlvbl9jb21wb25lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29tcG9uZW50UmVhbGl6YXRpb24tYWJzdHJhY3Rpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21wb25lbnRSZWFsaXphdGlvbi1hYnN0cmFjdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIENvbXBvbmVudCB0aGF0IG93bnMgdGhpcyBDb21wb25lbnRSZWFsaXphdGlvbiBhbmQgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYnkgaXRzIHJlYWxpemluZyBDbGFzc2lmaWVycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbXBvbmVudFJlYWxpemF0aW9uLWFic3RyYWN0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29tcG9uZW50UmVhbGl6YXRpb24tcmVhbGl6aW5nQ2xhc3NpZmllciIgbmFtZT0icmVhbGl6aW5nQ2xhc3NpZmllciIgdHlwZT0iQ2xhc3NpZmllciIgc3Vic2V0dGVkUHJvcGVydHk9IkRlcGVuZGVuY3ktY2xpZW50IiBhc3NvY2lhdGlvbj0iQV9yZWFsaXppbmdDbGFzc2lmaWVyX2NvbXBvbmVudFJlYWxpemF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbXBvbmVudFJlYWxpemF0aW9uLXJlYWxpemluZ0NsYXNzaWZpZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb21wb25lbnRSZWFsaXphdGlvbi1yZWFsaXppbmdDbGFzc2lmaWVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQ2xhc3NpZmllcnMgdGhhdCBhcmUgaW52b2x2ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wb25lbnQgdGhhdCBvd25zIHRoaXMgUmVhbGl6YXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb21wb25lbnRSZWFsaXphdGlvbi1yZWFsaXppbmdDbGFzc2lmaWVyLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQ29ubmVjdGFibGVFbGVtZW50IiBuYW1lPSJDb25uZWN0YWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3RhYmxlRWxlbWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3RhYmxlRWxlbWVudCI+Ci0gICAgICAgIDxib2R5PkNvbm5lY3RhYmxlRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBtZXRhY2xhc3MgcmVwcmVzZW50aW5nIGEgc2V0IG9mIGluc3RhbmNlcyB0aGF0IHBsYXkgcm9sZXMgb2YgYSBTdHJ1Y3R1cmVkQ2xhc3NpZmllci4gQ29ubmVjdGFibGVFbGVtZW50cyBtYXkgYmUgam9pbmVkIGJ5IGF0dGFjaGVkIENvbm5lY3RvcnMgYW5kIHNwZWNpZnkgY29uZmlndXJhdGlvbnMgb2YgbGlua2VkIGluc3RhbmNlcyB0byBiZSBjcmVhdGVkIHdpdGhpbiBhbiBpbnN0YW5jZSBvZiB0aGUgY29udGFpbmluZyBTdHJ1Y3R1cmVkQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNvbm5lY3RhYmxlRWxlbWVudC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iVHlwZWRFbGVtZW50Ii8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDb25uZWN0YWJsZUVsZW1lbnQtX2dlbmVyYWxpemF0aW9uLjEiIGdlbmVyYWw9IlBhcmFtZXRlcmFibGVFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb25uZWN0YWJsZUVsZW1lbnQtZW5kIiBuYW1lPSJlbmQiIHR5cGU9IkNvbm5lY3RvckVuZCIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9yb2xlX2VuZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0YWJsZUVsZW1lbnQtZW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29ubmVjdGFibGVFbGVtZW50LWVuZCI+Ci0gICAgICAgICAgPGJvZHk+QSBzZXQgb2YgQ29ubmVjdG9yRW5kcyB0aGF0IGF0dGFjaCB0byB0aGlzIENvbm5lY3RhYmxlRWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbm5lY3RhYmxlRWxlbWVudC1lbmQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb25uZWN0YWJsZUVsZW1lbnQtZW5kLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbm5lY3RhYmxlRWxlbWVudC10ZW1wbGF0ZVBhcmFtZXRlciIgbmFtZT0idGVtcGxhdGVQYXJhbWV0ZXIiIHR5cGU9IkNvbm5lY3RhYmxlRWxlbWVudFRlbXBsYXRlUGFyYW1ldGVyIiByZWRlZmluZWRQcm9wZXJ0eT0iUGFyYW1ldGVyYWJsZUVsZW1lbnQtdGVtcGxhdGVQYXJhbWV0ZXIiIGFzc29jaWF0aW9uPSJBX2Nvbm5lY3RhYmxlRWxlbWVudF90ZW1wbGF0ZVBhcmFtZXRlcl9wYXJhbWV0ZXJlZEVsZW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29ubmVjdGFibGVFbGVtZW50LXRlbXBsYXRlUGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29ubmVjdGFibGVFbGVtZW50LXRlbXBsYXRlUGFyYW1ldGVyIj4KLSAgICAgICAgICA8Ym9keT5UaGUgQ29ubmVjdGFibGVFbGVtZW50VGVtcGxhdGVQYXJhbWV0ZXIgZm9yIHRoaXMgQ29ubmVjdGFibGVFbGVtZW50IHBhcmFtZXRlci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbm5lY3RhYmxlRWxlbWVudC10ZW1wbGF0ZVBhcmFtZXRlci1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNvbm5lY3RhYmxlRWxlbWVudC1lbmQuMSIgbmFtZT0iZW5kIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IkNvbm5lY3RhYmxlRWxlbWVudC1lbmQuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3RhYmxlRWxlbWVudC1lbmQuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3RhYmxlRWxlbWVudC1lbmQuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgQ29ubmVjdGFibGVFbGVtZW50OjovZW5kIDogQ29ubmVjdG9yRW5kPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbm5lY3RhYmxlRWxlbWVudC1lbmQuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbm5lY3RhYmxlRWxlbWVudC1lbmQuMSBDb25uZWN0YWJsZUVsZW1lbnQtZW5kIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ29ubmVjdGFibGVFbGVtZW50LWVuZC4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoQ29ubmVjdG9yRW5kLmFsbEluc3RhbmNlcygpLT5zZWxlY3Qocm9sZSA9IHNlbGYpKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDb25uZWN0YWJsZUVsZW1lbnQtZW5kLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkNvbm5lY3RvckVuZCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ29ubmVjdGFibGVFbGVtZW50LWVuZC4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQ29ubmVjdGFibGVFbGVtZW50LWVuZC4xLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNvbm5lY3RhYmxlRWxlbWVudFRlbXBsYXRlUGFyYW1ldGVyIiBuYW1lPSJDb25uZWN0YWJsZUVsZW1lbnRUZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29ubmVjdGFibGVFbGVtZW50VGVtcGxhdGVQYXJhbWV0ZXItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0YWJsZUVsZW1lbnRUZW1wbGF0ZVBhcmFtZXRlciI+Ci0gICAgICAgIDxib2R5PkEgQ29ubmVjdGFibGVFbGVtZW50VGVtcGxhdGVQYXJhbWV0ZXIgZXhwb3NlcyBhIENvbm5lY3RhYmxlRWxlbWVudCBhcyBhIGZvcm1hbCBwYXJhbWV0ZXIgZm9yIGEgdGVtcGxhdGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJDb25uZWN0YWJsZUVsZW1lbnRUZW1wbGF0ZVBhcmFtZXRlci1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iVGVtcGxhdGVQYXJhbWV0ZXIiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbm5lY3RhYmxlRWxlbWVudFRlbXBsYXRlUGFyYW1ldGVyLXBhcmFtZXRlcmVkRWxlbWVudCIgbmFtZT0icGFyYW1ldGVyZWRFbGVtZW50IiB0eXBlPSJDb25uZWN0YWJsZUVsZW1lbnQiIHJlZGVmaW5lZFByb3BlcnR5PSJUZW1wbGF0ZVBhcmFtZXRlci1wYXJhbWV0ZXJlZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2Nvbm5lY3RhYmxlRWxlbWVudF90ZW1wbGF0ZVBhcmFtZXRlcl9wYXJhbWV0ZXJlZEVsZW1lbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29ubmVjdGFibGVFbGVtZW50VGVtcGxhdGVQYXJhbWV0ZXItcGFyYW1ldGVyZWRFbGVtZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29ubmVjdGFibGVFbGVtZW50VGVtcGxhdGVQYXJhbWV0ZXItcGFyYW1ldGVyZWRFbGVtZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgQ29ubmVjdGFibGVFbGVtZW50IGZvciB0aGlzIENvbm5lY3RhYmxlRWxlbWVudFRlbXBsYXRlUGFyYW1ldGVyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJDb25uZWN0b3IiIG5hbWU9IkNvbm5lY3RvciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29ubmVjdG9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29ubmVjdG9yIj4KLSAgICAgICAgPGJvZHk+QSBDb25uZWN0b3Igc3BlY2lmaWVzIGxpbmtzIHRoYXQgZW5hYmxlcyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdHdvIG9yIG1vcmUgaW5zdGFuY2VzLiBJbiBjb250cmFzdCB0byBBc3NvY2lhdGlvbnMsIHdoaWNoIHNwZWNpZnkgbGlua3MgYmV0d2VlbiBhbnkgaW5zdGFuY2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ2xhc3NpZmllcnMsIENvbm5lY3RvcnMgc3BlY2lmeSBsaW5rcyBiZXR3ZWVuIGluc3RhbmNlcyBwbGF5aW5nIHRoZSBjb25uZWN0ZWQgcGFydHMgb25seS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb25uZWN0b3ItdHlwZXMiIG5hbWU9InR5cGVzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbm5lY3RvciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0b3ItdHlwZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0b3ItdHlwZXMiPgotICAgICAgICAgIDxib2R5PlRoZSB0eXBlcyBvZiB0aGUgQ29ubmVjdGFibGVFbGVtZW50cyB0aGF0IHRoZSBlbmRzIG9mIGEgQ29ubmVjdG9yIGFyZSBhdHRhY2hlZCB0byBtdXN0IGNvbmZvcm0gdG8gdGhlIHR5cGVzIG9mIHRoZSBlbmRzIG9mIHRoZSBBc3NvY2lhdGlvbiB0aGF0IHR5cGVzIHRoZSBDb25uZWN0b3IsIGlmIGFueS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ29ubmVjdG9yLXR5cGVzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT50eXBlJmx0Oz5udWxsIGltcGxpZXMgJiN4RDsKLSAgbGV0IG5vT2ZFbmRzIDogSW50ZWdlciA9IGVuZC0+c2l6ZSgpIGluICYjeEQ7Ci0gICh0eXBlLm1lbWJlckVuZC0+c2l6ZSgpID0gbm9PZkVuZHMpIGFuZCBTZXF1ZW5jZXsxLi5ub09mRW5kc30tPmZvckFsbChpIHwgZW5kLT5hdChpKS5yb2xlLnR5cGUuY29uZm9ybXNUbyh0eXBlLm1lbWJlckVuZC0+YXQoaSkudHlwZSkpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb25uZWN0b3Itcm9sZXMiIG5hbWU9InJvbGVzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbm5lY3RvciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0b3Itcm9sZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0b3Itcm9sZXMiPgotICAgICAgICAgIDxib2R5PlRoZSBDb25uZWN0YWJsZUVsZW1lbnRzIGF0dGFjaGVkIGFzIHJvbGVzIHRvIGVhY2ggQ29ubmVjdG9yRW5kIG93bmVkIGJ5IGEgQ29ubmVjdG9yIG11c3QgYmUgb3duZWQgb3IgaW5oZXJpdGVkIHJvbGVzIG9mIHRoZSBDbGFzc2lmaWVyIHRoYXQgb3duZWQgdGhlIENvbm5lY3Rvciwgb3IgdGhleSBtdXN0IGJlIFBvcnRzIG9mIHN1Y2ggcm9sZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbm5lY3Rvci1yb2xlcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c3RydWN0dXJlZENsYXNzaWZpZXIgJmx0Oz4gbnVsbCYjeEQ7Ci1hbmQmI3hEOwotICBlbmQtPmZvckFsbCggZSB8IHN0cnVjdHVyZWRDbGFzc2lmaWVyLmFsbFJvbGVzKCktPmluY2x1ZGVzKGUucm9sZSkmI3hEOwotb3ImI3hEOwotICBlLnJvbGUub2NsSXNLaW5kT2YoUG9ydCkgYW5kIHN0cnVjdHVyZWRDbGFzc2lmaWVyLmFsbFJvbGVzKCktPmluY2x1ZGVzKGUucGFydFdpdGhQb3J0KSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQ29ubmVjdG9yLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJGZWF0dXJlIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb25uZWN0b3ItY29udHJhY3QiIG5hbWU9ImNvbnRyYWN0IiB0eXBlPSJCZWhhdmlvciIgYXNzb2NpYXRpb249IkFfY29udHJhY3RfY29ubmVjdG9yIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3Rvci1jb250cmFjdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3Rvci1jb250cmFjdCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNldCBvZiBCZWhhdmlvcnMgdGhhdCBzcGVjaWZ5IHRoZSB2YWxpZCBpbnRlcmFjdGlvbiBwYXR0ZXJucyBhY3Jvc3MgdGhlIENvbm5lY3Rvci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbm5lY3Rvci1jb250cmFjdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNvbm5lY3Rvci1jb250cmFjdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb25uZWN0b3ItZW5kIiBuYW1lPSJlbmQiIHR5cGU9IkNvbm5lY3RvckVuZCIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lZEVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2VuZF9jb25uZWN0b3IiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29ubmVjdG9yLWVuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3Rvci1lbmQiPgotICAgICAgICAgIDxib2R5PkEgQ29ubmVjdG9yIGhhcyBhdCBsZWFzdCB0d28gQ29ubmVjdG9yRW5kcywgZWFjaCByZXByZXNlbnRpbmcgdGhlIHBhcnRpY2lwYXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoZSBDbGFzc2lmaWVycyB0eXBpbmcgdGhlIENvbm5lY3RhYmxlRWxlbWVudHMgYXR0YWNoZWQgdG8gdGhlIGVuZC4gVGhlIHNldCBvZiBDb25uZWN0b3JFbmRzIGlzIG9yZGVyZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb25uZWN0b3ItZW5kLV9sb3dlclZhbHVlIiB2YWx1ZT0iMiIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkNvbm5lY3Rvci1lbmQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29ubmVjdG9yLWtpbmQiIG5hbWU9ImtpbmQiIHR5cGU9IkNvbm5lY3RvcktpbmQiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0b3Ita2luZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3Rvci1raW5kIj4KLSAgICAgICAgICA8Ym9keT5JbmRpY2F0ZXMgdGhlIGtpbmQgb2YgQ29ubmVjdG9yLiBUaGlzIGlzIGRlcml2ZWQ6IGEgQ29ubmVjdG9yIHdpdGggb25lIG9yIG1vcmUgZW5kcyBjb25uZWN0ZWQgdG8gYSBQb3J0IHdoaWNoIGlzIG5vdCBvbiBhIFBhcnQgYW5kIHdoaWNoIGlzIG5vdCBhIGJlaGF2aW9yIHBvcnQgaXMgYSBkZWxlZ2F0aW9uOyBvdGhlcndpc2UgaXQgaXMgYW4gYXNzZW1ibHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb25uZWN0b3ItcmVkZWZpbmVkQ29ubmVjdG9yIiBuYW1lPSJyZWRlZmluZWRDb25uZWN0b3IiIHR5cGU9IkNvbm5lY3RvciIgc3Vic2V0dGVkUHJvcGVydHk9IlJlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluZWRDb25uZWN0b3JfY29ubmVjdG9yIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3Rvci1yZWRlZmluZWRDb25uZWN0b3ItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0b3ItcmVkZWZpbmVkQ29ubmVjdG9yIj4KLSAgICAgICAgICA8Ym9keT5BIENvbm5lY3RvciBtYXkgYmUgcmVkZWZpbmVkIHdoZW4gaXRzIGNvbnRhaW5pbmcgQ2xhc3NpZmllciBpcyBzcGVjaWFsaXplZC4gVGhlIHJlZGVmaW5pbmcgQ29ubmVjdG9yIG1heSBoYXZlIGEgdHlwZSB0aGF0IHNwZWNpYWxpemVzIHRoZSB0eXBlIG9mIHRoZSByZWRlZmluZWQgQ29ubmVjdG9yLiBUaGUgdHlwZXMgb2YgdGhlIENvbm5lY3RvckVuZHMgb2YgdGhlIHJlZGVmaW5pbmcgQ29ubmVjdG9yIG1heSBzcGVjaWFsaXplIHRoZSB0eXBlcyBvZiB0aGUgQ29ubmVjdG9yRW5kcyBvZiB0aGUgcmVkZWZpbmVkIENvbm5lY3Rvci4gVGhlIHByb3BlcnRpZXMgb2YgdGhlIENvbm5lY3RvckVuZHMgb2YgdGhlIHJlZGVmaW5pbmcgQ29ubmVjdG9yIG1heSBiZSByZXBsYWNlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbm5lY3Rvci1yZWRlZmluZWRDb25uZWN0b3ItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb25uZWN0b3ItcmVkZWZpbmVkQ29ubmVjdG9yLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNvbm5lY3Rvci10eXBlIiBuYW1lPSJ0eXBlIiB0eXBlPSJBc3NvY2lhdGlvbiIgYXNzb2NpYXRpb249IkFfdHlwZV9jb25uZWN0b3IiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29ubmVjdG9yLXR5cGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0b3ItdHlwZSI+Ci0gICAgICAgICAgPGJvZHk+QW4gb3B0aW9uYWwgQXNzb2NpYXRpb24gdGhhdCBjbGFzc2lmaWVzIGxpbmtzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBDb25uZWN0b3IuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb25uZWN0b3ItdHlwZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkNvbm5lY3Rvci1raW5kLjEiIG5hbWU9ImtpbmQiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iQ29ubmVjdG9yLWtpbmQuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3Rvci1raW5kLjEtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0b3Ita2luZC4xIj4KLSAgICAgICAgICA8Ym9keT5EZXJpdmF0aW9uIGZvciBDb25uZWN0b3I6Oi9raW5kIDogQ29ubmVjdG9yS2luZDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb25uZWN0b3Ita2luZC4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ29ubmVjdG9yLWtpbmQuMSBDb25uZWN0b3Ita2luZCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbm5lY3Rvci1raW5kLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBlbmQtPmV4aXN0cygmI3hEOwotCQlyb2xlLm9jbElzS2luZE9mKFBvcnQpICYjeEQ7Ci0JCWFuZCBwYXJ0V2l0aFBvcnQtPmlzRW1wdHkoKSYjeEQ7Ci0JCWFuZCBub3Qgcm9sZS5vY2xBc1R5cGUoUG9ydCkuaXNCZWhhdmlvcikmI3hEOwotdGhlbiBDb25uZWN0b3JLaW5kOjpkZWxlZ2F0aW9uICYjeEQ7Ci1lbHNlIENvbm5lY3RvcktpbmQ6OmFzc2VtYmx5ICYjeEQ7Ci1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iQ29ubmVjdG9yLWtpbmQuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iQ29ubmVjdG9yS2luZCIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkNvbm5lY3RvckVuZCIgbmFtZT0iQ29ubmVjdG9yRW5kIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0b3JFbmQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0b3JFbmQiPgotICAgICAgICA8Ym9keT5BIENvbm5lY3RvckVuZCBpcyBhbiBlbmRwb2ludCBvZiBhIENvbm5lY3Rvciwgd2hpY2ggYXR0YWNoZXMgdGhlIENvbm5lY3RvciB0byBhIENvbm5lY3RhYmxlRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJDb25uZWN0b3JFbmQtcm9sZV9hbmRfcGFydF93aXRoX3BvcnQiIG5hbWU9InJvbGVfYW5kX3BhcnRfd2l0aF9wb3J0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbm5lY3RvckVuZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0b3JFbmQtcm9sZV9hbmRfcGFydF93aXRoX3BvcnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0b3JFbmQtcm9sZV9hbmRfcGFydF93aXRoX3BvcnQiPgotICAgICAgICAgIDxib2R5PklmIGEgQ29ubmVjdG9yRW5kIHJlZmVyZW5jZXMgYSBwYXJ0V2l0aFBvcnQsIHRoZW4gdGhlIHJvbGUgbXVzdCBiZSBhIFBvcnQgdGhhdCBpcyBkZWZpbmVkIG9yIGluaGVyaXRlZCBieSB0aGUgdHlwZSBvZiB0aGUgcGFydFdpdGhQb3J0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDb25uZWN0b3JFbmQtcm9sZV9hbmRfcGFydF93aXRoX3BvcnQtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PnBhcnRXaXRoUG9ydC0+bm90RW1wdHkoKSBpbXBsaWVzICYjeEQ7Ci0gIChyb2xlLm9jbElzS2luZE9mKFBvcnQpIGFuZCBwYXJ0V2l0aFBvcnQudHlwZS5vY2xBc1R5cGUoTmFtZXNwYWNlKS5tZW1iZXItPmluY2x1ZGVzKHJvbGUpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQ29ubmVjdG9yRW5kLXBhcnRfd2l0aF9wb3J0X2VtcHR5IiBuYW1lPSJwYXJ0X3dpdGhfcG9ydF9lbXB0eSIgY29uc3RyYWluZWRFbGVtZW50PSJDb25uZWN0b3JFbmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29ubmVjdG9yRW5kLXBhcnRfd2l0aF9wb3J0X2VtcHR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29ubmVjdG9yRW5kLXBhcnRfd2l0aF9wb3J0X2VtcHR5Ij4KLSAgICAgICAgICA8Ym9keT5JZiBhIENvbm5lY3RvckVuZCBpcyBhdHRhY2hlZCB0byBhIFBvcnQgb2YgdGhlIGNvbnRhaW5pbmcgQ2xhc3NpZmllciwgcGFydFdpdGhQb3J0IHdpbGwgYmUgZW1wdHkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbm5lY3RvckVuZC1wYXJ0X3dpdGhfcG9ydF9lbXB0eS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+KHJvbGUub2NsSXNLaW5kT2YoUG9ydCkgYW5kIHJvbGUub3duZXIgPSBjb25uZWN0b3Iub3duZXIpIGltcGxpZXMgcGFydFdpdGhQb3J0LT5pc0VtcHR5KCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbm5lY3RvckVuZC1tdWx0aXBsaWNpdHkiIG5hbWU9Im11bHRpcGxpY2l0eSIgY29uc3RyYWluZWRFbGVtZW50PSJDb25uZWN0b3JFbmQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ29ubmVjdG9yRW5kLW11bHRpcGxpY2l0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3RvckVuZC1tdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIENvbm5lY3RvckVuZCBtYXkgbm90IGJlIG1vcmUgZ2VuZXJhbCB0aGFuIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZW5kIG9mIHRoZSBBc3NvY2lhdGlvbiB0eXBpbmcgdGhlIG93bmluZyBDb25uZWN0b3IsIGlmIGFueS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ29ubmVjdG9yRW5kLW11bHRpcGxpY2l0eS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+c2VsZi5jb21wYXRpYmxlV2l0aChkZWZpbmluZ0VuZCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbm5lY3RvckVuZC1zZWxmX3BhcnRfd2l0aF9wb3J0IiBuYW1lPSJzZWxmX3BhcnRfd2l0aF9wb3J0IiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNvbm5lY3RvckVuZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0b3JFbmQtc2VsZl9wYXJ0X3dpdGhfcG9ydC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3RvckVuZC1zZWxmX3BhcnRfd2l0aF9wb3J0Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgUHJvcGVydHkgaGVsZCBpbiBzZWxmLnBhcnRXaXRoUG9ydCBtdXN0IG5vdCBiZSBhIFBvcnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNvbm5lY3RvckVuZC1zZWxmX3BhcnRfd2l0aF9wb3J0LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5wYXJ0V2l0aFBvcnQtPm5vdEVtcHR5KCkgaW1wbGllcyBub3QgcGFydFdpdGhQb3J0Lm9jbElzS2luZE9mKFBvcnQpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkNvbm5lY3RvckVuZC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iTXVsdGlwbGljaXR5RWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29ubmVjdG9yRW5kLWRlZmluaW5nRW5kIiBuYW1lPSJkZWZpbmluZ0VuZCIgdHlwZT0iUHJvcGVydHkiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZGVmaW5pbmdFbmRfY29ubmVjdG9yRW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3RvckVuZC1kZWZpbmluZ0VuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3RvckVuZC1kZWZpbmluZ0VuZCI+Ci0gICAgICAgICAgPGJvZHk+QSBkZXJpdmVkIHByb3BlcnR5IHJlZmVyZW5jaW5nIHRoZSBjb3JyZXNwb25kaW5nIGVuZCBvbiB0aGUgQXNzb2NpYXRpb24gd2hpY2ggdHlwZXMgdGhlIENvbm5lY3RvciBvd2luZyB0aGlzIENvbm5lY3RvckVuZCwgaWYgYW55LiBJdCBpcyBkZXJpdmVkIGJ5IHNlbGVjdGluZyB0aGUgZW5kIGF0IHRoZSBzYW1lIHBsYWNlIGluIHRoZSBvcmRlcmluZyBvZiBBc3NvY2lhdGlvbiBlbmRzIGFzIHRoaXMgQ29ubmVjdG9yRW5kLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ29ubmVjdG9yRW5kLWRlZmluaW5nRW5kLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ29ubmVjdG9yRW5kLXBhcnRXaXRoUG9ydCIgbmFtZT0icGFydFdpdGhQb3J0IiB0eXBlPSJQcm9wZXJ0eSIgYXNzb2NpYXRpb249IkFfcGFydFdpdGhQb3J0X2Nvbm5lY3RvckVuZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0b3JFbmQtcGFydFdpdGhQb3J0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29ubmVjdG9yRW5kLXBhcnRXaXRoUG9ydCI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIHRoZSByb2xlIG9mIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYSBDbGFzc2lmaWVyIHdpdGggdGhlIFBvcnQgdG8gd2hpY2ggdGhlIENvbm5lY3RvckVuZCBpcyBhdHRhY2hlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbm5lY3RvckVuZC1wYXJ0V2l0aFBvcnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJDb25uZWN0b3JFbmQtcm9sZSIgbmFtZT0icm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJDb25uZWN0YWJsZUVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX2VuZF9yb2xlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3RvckVuZC1yb2xlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29ubmVjdG9yRW5kLXJvbGUiPgotICAgICAgICAgIDxib2R5PlRoZSBDb25uZWN0YWJsZUVsZW1lbnQgYXR0YWNoZWQgYXQgdGhpcyBDb25uZWN0b3JFbmQuIFdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRhaW5pbmcgQ2xhc3NpZmllciBpcyBjcmVhdGVkLCBhIGxpbmsgbWF5IChkZXBlbmRpbmcgb24gdGhlIG11bHRpcGxpY2l0aWVzKSBiZSBjcmVhdGVkIHRvIGFuIGluc3RhbmNlIG9mIHRoZSBDbGFzc2lmaWVyIHRoYXQgdHlwZXMgdGhpcyBDb25uZWN0YWJsZUVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb25uZWN0b3JFbmQtcm9sZS1fbG93ZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJDb25uZWN0b3JFbmQtcm9sZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJDb25uZWN0b3JFbmQtZGVmaW5pbmdFbmQuMSIgbmFtZT0iZGVmaW5pbmdFbmQiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iQ29ubmVjdG9yRW5kLWRlZmluaW5nRW5kLjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0b3JFbmQtZGVmaW5pbmdFbmQuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3RvckVuZC1kZWZpbmluZ0VuZC4xIj4KLSAgICAgICAgICA8Ym9keT5EZXJpdmF0aW9uIGZvciBDb25uZWN0b3JFbmQ6Oi9kZWZpbmluZ0VuZCA6IFByb3BlcnR5PC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNvbm5lY3RvckVuZC1kZWZpbmluZ0VuZC4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ29ubmVjdG9yRW5kLWRlZmluaW5nRW5kLjEgQ29ubmVjdG9yRW5kLWRlZmluaW5nRW5kIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iQ29ubmVjdG9yRW5kLWRlZmluaW5nRW5kLjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBjb25uZWN0b3IudHlwZSA9IG51bGwgJiN4RDsKLXRoZW4mI3hEOwotICBudWxsICYjeEQ7Ci1lbHNlJiN4RDsKLSAgbGV0IGluZGV4IDogSW50ZWdlciA9IGNvbm5lY3Rvci5lbmQtPmluZGV4T2Yoc2VsZikgaW4mI3hEOwotICAgIGNvbm5lY3Rvci50eXBlLm1lbWJlckVuZC0+YXQoaW5kZXgpJiN4RDsKLWVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJDb25uZWN0b3JFbmQtZGVmaW5pbmdFbmQuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUHJvcGVydHkiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbm5lY3RvckVuZC1kZWZpbmluZ0VuZC4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllciIgbmFtZT0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllciIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkVuY2Fwc3VsYXRlZENsYXNzaWZpZXIiPgotICAgICAgICA8Ym9keT5BbiBFbmNhcHN1bGF0ZWRDbGFzc2lmaWVyIG1heSBvd24gUG9ydHMgdG8gc3BlY2lmeSB0eXBlZCBpbnRlcmFjdGlvbiBwb2ludHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFbmNhcHN1bGF0ZWRDbGFzc2lmaWVyLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllciIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllci1vd25lZFBvcnQiIG5hbWU9Im93bmVkUG9ydCIgdHlwZT0iUG9ydCIgaXNSZWFkT25seT0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iU3RydWN0dXJlZENsYXNzaWZpZXItb3duZWRBdHRyaWJ1dGUiIGFzc29jaWF0aW9uPSJBX293bmVkUG9ydF9lbmNhcHN1bGF0ZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkVuY2Fwc3VsYXRlZENsYXNzaWZpZXItb3duZWRQb3J0LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllci1vd25lZFBvcnQiPgotICAgICAgICAgIDxib2R5PlRoZSBQb3J0cyBvd25lZCBieSB0aGUgRW5jYXBzdWxhdGVkQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkVuY2Fwc3VsYXRlZENsYXNzaWZpZXItb3duZWRQb3J0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllci1vd25lZFBvcnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllci1vd25lZFBvcnQuMSIgbmFtZT0ib3duZWRQb3J0IiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IkVuY2Fwc3VsYXRlZENsYXNzaWZpZXItb3duZWRQb3J0LjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbmNhcHN1bGF0ZWRDbGFzc2lmaWVyLW93bmVkUG9ydC4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllci1vd25lZFBvcnQuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgRW5jYXBzdWxhdGVkQ2xhc3NpZmllcjo6L293bmVkUG9ydCA6IFBvcnQ8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllci1vd25lZFBvcnQuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkVuY2Fwc3VsYXRlZENsYXNzaWZpZXItb3duZWRQb3J0LjEgRW5jYXBzdWxhdGVkQ2xhc3NpZmllci1vd25lZFBvcnQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFbmNhcHN1bGF0ZWRDbGFzc2lmaWVyLW93bmVkUG9ydC4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAob3duZWRBdHRyaWJ1dGUtPnNlbGVjdChvY2xJc0tpbmRPZihQb3J0KSktPmNvbGxlY3Qob2NsQXNUeXBlKFBvcnQpKS0+YXNPcmRlcmVkU2V0KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkVuY2Fwc3VsYXRlZENsYXNzaWZpZXItb3duZWRQb3J0LjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlBvcnQiIGlzT3JkZXJlZD0idHJ1ZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllci1vd25lZFBvcnQuMS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkVuY2Fwc3VsYXRlZENsYXNzaWZpZXItb3duZWRQb3J0LjEtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iUG9ydCIgbmFtZT0iUG9ydCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUG9ydC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBvcnQiPgotICAgICAgICA8Ym9keT5BIFBvcnQgaXMgYSBwcm9wZXJ0eSBvZiBhbiBFbmNhcHN1bGF0ZWRDbGFzc2lmaWVyIHRoYXQgc3BlY2lmaWVzIGEgZGlzdGluY3QgaW50ZXJhY3Rpb24gcG9pbnQgYmV0d2VlbiB0aGF0IEVuY2Fwc3VsYXRlZENsYXNzaWZpZXIgYW5kIGl0cyBlbnZpcm9ubWVudCBvciBiZXR3ZWVuIHRoZSAoYmVoYXZpb3Igb2YgdGhlKSBFbmNhcHN1bGF0ZWRDbGFzc2lmaWVyIGFuZCBpdHMgaW50ZXJuYWwgcGFydHMuIFBvcnRzIGFyZSBjb25uZWN0ZWQgdG8gUHJvcGVydGllcyBvZiB0aGUgRW5jYXBzdWxhdGVkQ2xhc3NpZmllciBieSBDb25uZWN0b3JzIHRocm91Z2ggd2hpY2ggcmVxdWVzdHMgY2FuIGJlIG1hZGUgdG8gaW52b2tlIEJlaGF2aW9yYWxGZWF0dXJlcy4gQSBQb3J0IG1heSBzcGVjaWZ5IHRoZSBzZXJ2aWNlcyBhbiBFbmNhcHN1bGF0ZWRDbGFzc2lmaWVyIHByb3ZpZGVzIChvZmZlcnMpIHRvIGl0cyBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHRoZSBzZXJ2aWNlcyB0aGF0IGFuIEVuY2Fwc3VsYXRlZENsYXNzaWZpZXIgZXhwZWN0cyAocmVxdWlyZXMpIG9mIGl0cyBlbnZpcm9ubWVudC4gIEEgUG9ydCBtYXkgaGF2ZSBhbiBhc3NvY2lhdGVkIFByb3RvY29sU3RhdGVNYWNoaW5lLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBvcnQtcG9ydF9hZ2dyZWdhdGlvbiIgbmFtZT0icG9ydF9hZ2dyZWdhdGlvbiIgY29uc3RyYWluZWRFbGVtZW50PSJQb3J0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBvcnQtcG9ydF9hZ2dyZWdhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBvcnQtcG9ydF9hZ2dyZWdhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+UG9ydC5hZ2dyZWdhdGlvbiBtdXN0IGJlIGNvbXBvc2l0ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUG9ydC1wb3J0X2FnZ3JlZ2F0aW9uLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5hZ2dyZWdhdGlvbiA9IEFnZ3JlZ2F0aW9uS2luZDo6Y29tcG9zaXRlPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQb3J0LWRlZmF1bHRfdmFsdWUiIG5hbWU9ImRlZmF1bHRfdmFsdWUiIGNvbnN0cmFpbmVkRWxlbWVudD0iUG9ydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQb3J0LWRlZmF1bHRfdmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQb3J0LWRlZmF1bHRfdmFsdWUiPgotICAgICAgICAgIDxib2R5PkEgZGVmYXVsdFZhbHVlIGZvciBwb3J0IGNhbm5vdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGUgdHlwZSBvZiB0aGUgUG9ydCBpcyBhbiBJbnRlcmZhY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBvcnQtZGVmYXVsdF92YWx1ZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+dHlwZS5vY2xJc0tpbmRPZihJbnRlcmZhY2UpIGltcGxpZXMgZGVmYXVsdFZhbHVlLT5pc0VtcHR5KCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBvcnQtZW5jYXBzdWxhdGVkX293bmVyIiBuYW1lPSJlbmNhcHN1bGF0ZWRfb3duZXIiIGNvbnN0cmFpbmVkRWxlbWVudD0iUG9ydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQb3J0LWVuY2Fwc3VsYXRlZF9vd25lci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBvcnQtZW5jYXBzdWxhdGVkX293bmVyIj4KLSAgICAgICAgICA8Ym9keT5BbGwgUG9ydHMgYXJlIG93bmVkIGJ5IGFuIEVuY2Fwc3VsYXRlZENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBvcnQtZW5jYXBzdWxhdGVkX293bmVyLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5vd25lciA9IGVuY2Fwc3VsYXRlZENsYXNzaWZpZXI8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iUG9ydC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iUHJvcGVydHkiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBvcnQtaXNCZWhhdmlvciIgbmFtZT0iaXNCZWhhdmlvciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQb3J0LWlzQmVoYXZpb3ItX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQb3J0LWlzQmVoYXZpb3IiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB3aGV0aGVyIHJlcXVlc3RzIGFycml2aW5nIGF0IHRoaXMgUG9ydCBhcmUgc2VudCB0byB0aGUgY2xhc3NpZmllciBiZWhhdmlvciBvZiB0aGlzIEVuY2Fwc3VsYXRlZENsYXNzaWZpZXIuIFN1Y2ggYSBQb3J0IGlzIHJlZmVycmVkIHRvIGFzIGEgYmVoYXZpb3IgUG9ydC4gQW55IGludm9jYXRpb24gb2YgYSBCZWhhdmlvcmFsRmVhdHVyZSB0YXJnZXRlZCBhdCBhIGJlaGF2aW9yIFBvcnQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBpbnN0YW5jZSBvZiB0aGUgb3duaW5nIEVuY2Fwc3VsYXRlZENsYXNzaWZpZXIgaXRzZWxmLCByYXRoZXIgdGhhbiBieSBhbnkgaW5zdGFuY2VzIHRoYXQgaXQgbWF5IGNvbnRhaW4uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iUG9ydC1pc0JlaGF2aW9yLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQb3J0LWlzQ29uanVnYXRlZCIgbmFtZT0iaXNDb25qdWdhdGVkIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBvcnQtaXNDb25qdWdhdGVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUG9ydC1pc0Nvbmp1Z2F0ZWQiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB0aGUgd2F5IHRoYXQgdGhlIHByb3ZpZGVkIGFuZCByZXF1aXJlZCBJbnRlcmZhY2VzIGFyZSBkZXJpdmVkIGZyb20gdGhlIFBvcnTigJlzIFR5cGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iUG9ydC1pc0Nvbmp1Z2F0ZWQtX2RlZmF1bHRWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBvcnQtaXNTZXJ2aWNlIiBuYW1lPSJpc1NlcnZpY2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUG9ydC1pc1NlcnZpY2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQb3J0LWlzU2VydmljZSI+Ci0gICAgICAgICAgPGJvZHk+SWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgdGhpcyBQb3J0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgcHVibGlzaGVkIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRW5jYXBzdWxhdGVkQ2xhc3NpZmllci4gIElmIGZhbHNlLCB0aGlzIFBvcnQgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIEVuY2Fwc3VsYXRlZENsYXNzaWZpZXIgYnV0IGlzIG5vdCBwYXJ0IG9mIHRoZSBlc3NlbnRpYWwgZXh0ZXJuYWxseS12aXNpYmxlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIEVuY2Fwc3VsYXRlZENsYXNzaWZpZXIgYW5kIGNhbiwgdGhlcmVmb3JlLCBiZSBhbHRlcmVkIG9yIGRlbGV0ZWQgYWxvbmcgd2l0aCB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVuY2Fwc3VsYXRlZENsYXNzaWZpZXIgYW5kIG90aGVyIHByb3BlcnRpZXMgdGhhdCBhcmUgY29uc2lkZXJlZCBwYXJ0IG9mIGl0cyBpbXBsZW1lbnRhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJQb3J0LWlzU2VydmljZS1fZGVmYXVsdFZhbHVlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBvcnQtcHJvdG9jb2wiIG5hbWU9InByb3RvY29sIiB0eXBlPSJQcm90b2NvbFN0YXRlTWFjaGluZSIgYXNzb2NpYXRpb249IkFfcHJvdG9jb2xfcG9ydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQb3J0LXByb3RvY29sLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUG9ydC1wcm90b2NvbCI+Ci0gICAgICAgICAgPGJvZHk+QW4gb3B0aW9uYWwgUHJvdG9jb2xTdGF0ZU1hY2hpbmUgd2hpY2ggZGVzY3JpYmVzIHZhbGlkIGludGVyYWN0aW9ucyBhdCB0aGlzIGludGVyYWN0aW9uIHBvaW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUG9ydC1wcm90b2NvbC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlBvcnQtcHJvdmlkZWQiIG5hbWU9InByb3ZpZGVkIiB0eXBlPSJJbnRlcmZhY2UiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfcHJvdmlkZWRfcG9ydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQb3J0LXByb3ZpZGVkLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUG9ydC1wcm92aWRlZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVyZmFjZXMgc3BlY2lmeWluZyB0aGUgc2V0IG9mIE9wZXJhdGlvbnMgYW5kIFJlY2VwdGlvbnMgdGhhdCB0aGUgRW5jYXBzdWxhdGVkQ2NsYXNzaWZpZXIgb2ZmZXJzIHRvIGl0cyBlbnZpcm9ubWVudCB2aWEgdGhpcyBQb3J0LCBhbmQgd2hpY2ggaXQgd2lsbCBoYW5kbGUgZWl0aGVyIGRpcmVjdGx5IG9yIGJ5IGZvcndhcmRpbmcgaXQgdG8gYSBwYXJ0IG9mIGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuIFRoaXMgYXNzb2NpYXRpb24gaXMgZGVyaXZlZCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIGlzQ29uanVnYXRlZC4gSWYgaXNDb25qdWdhdGVkIGlzIGZhbHNlLCBwcm92aWRlZCBpcyBkZXJpdmVkIGFzIHRoZSB1bmlvbiBvZiB0aGUgc2V0cyBvZiBJbnRlcmZhY2VzIHJlYWxpemVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBwb3J0IGFuZCBpdHMgc3VwZXJ0eXBlcywgb3IgZGlyZWN0bHkgZnJvbSB0aGUgdHlwZSBvZiB0aGUgUG9ydCBpZiB0aGUgUG9ydCBpcyB0eXBlZCBieSBhbiBJbnRlcmZhY2UuIElmIGlzQ29uanVnYXRlZCBpcyB0cnVlLCBpdCBpcyBkZXJpdmVkIGFzIHRoZSB1bmlvbiBvZiB0aGUgc2V0cyBvZiBJbnRlcmZhY2VzIHVzZWQgYnkgdGhlIHR5cGUgb2YgdGhlIFBvcnQgYW5kIGl0cyBzdXBlcnR5cGVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUG9ydC1wcm92aWRlZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlBvcnQtcHJvdmlkZWQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUG9ydC1yZWRlZmluZWRQb3J0IiBuYW1lPSJyZWRlZmluZWRQb3J0IiB0eXBlPSJQb3J0IiBzdWJzZXR0ZWRQcm9wZXJ0eT0iUHJvcGVydHktcmVkZWZpbmVkUHJvcGVydHkiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5lZFBvcnRfcG9ydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQb3J0LXJlZGVmaW5lZFBvcnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQb3J0LXJlZGVmaW5lZFBvcnQiPgotICAgICAgICAgIDxib2R5PkEgUG9ydCBtYXkgYmUgcmVkZWZpbmVkIHdoZW4gaXRzIGNvbnRhaW5pbmcgRW5jYXBzdWxhdGVkQ2xhc3NpZmllciBpcyBzcGVjaWFsaXplZC4gVGhlIHJlZGVmaW5pbmcgUG9ydCBtYXkgaGF2ZSBhZGRpdGlvbmFsIEludGVyZmFjZXMgdG8gdGhvc2UgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWRlZmluZWQgUG9ydCBvciBpdCBtYXkgcmVwbGFjZSBhbiBJbnRlcmZhY2UgYnkgb25lIG9mIGl0cyBzdWJ0eXBlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBvcnQtcmVkZWZpbmVkUG9ydC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlBvcnQtcmVkZWZpbmVkUG9ydC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJQb3J0LXJlcXVpcmVkIiBuYW1lPSJyZXF1aXJlZCIgdHlwZT0iSW50ZXJmYWNlIiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX3JlcXVpcmVkX3BvcnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUG9ydC1yZXF1aXJlZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBvcnQtcmVxdWlyZWQiPgotICAgICAgICAgIDxib2R5PlRoZSBJbnRlcmZhY2VzIHNwZWNpZnlpbmcgdGhlIHNldCBvZiBPcGVyYXRpb25zIGFuZCBSZWNlcHRpb25zIHRoYXQgdGhlIEVuY2Fwc3VsYXRlZENhc3NpZmllciBleHBlY3RzIGl0cyBlbnZpcm9ubWVudCB0byBoYW5kbGUgdmlhIHRoaXMgcG9ydC4gVGhpcyBhc3NvY2lhdGlvbiBpcyBkZXJpdmVkIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgaXNDb25qdWdhdGVkLiBJZiBpc0Nvbmp1Z2F0ZWQgaXMgZmFsc2UsIHJlcXVpcmVkIGlzIGRlcml2ZWQgYXMgdGhlIHVuaW9uIG9mIHRoZSBzZXRzIG9mIEludGVyZmFjZXMgdXNlZCBieSB0aGUgdHlwZSBvZiB0aGUgUG9ydCBhbmQgaXRzIHN1cGVydHlwZXMuIElmIGlzQ29uanVnYXRlZCBpcyB0cnVlLCBpdCBpcyBkZXJpdmVkIGFzIHRoZSB1bmlvbiBvZiB0aGUgc2V0cyBvZiBJbnRlcmZhY2VzIHJlYWxpemVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBQb3J0IGFuZCBpdHMgc3VwZXJ0eXBlcywgb3IgZGlyZWN0bHkgZnJvbSB0aGUgdHlwZSBvZiB0aGUgUG9ydCBpZiB0aGUgUG9ydCBpcyB0eXBlZCBieSBhbiBJbnRlcmZhY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQb3J0LXJlcXVpcmVkLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUG9ydC1yZXF1aXJlZC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQb3J0LXByb3ZpZGVkLjEiIG5hbWU9InByb3ZpZGVkIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IlBvcnQtcHJvdmlkZWQuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBvcnQtcHJvdmlkZWQuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBvcnQtcHJvdmlkZWQuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgUG9ydDo6L3Byb3ZpZGVkPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBvcnQtcHJvdmlkZWQuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBvcnQtcHJvdmlkZWQuMSBQb3J0LXByb3ZpZGVkIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUG9ydC1wcm92aWRlZC4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgaXNDb25qdWdhdGVkIHRoZW4gYmFzaWNSZXF1aXJlZCgpIGVsc2UgYmFzaWNQcm92aWRlZCgpIGVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQb3J0LXByb3ZpZGVkLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkludGVyZmFjZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUG9ydC1wcm92aWRlZC4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUG9ydC1wcm92aWRlZC4xLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQb3J0LXJlcXVpcmVkLjEiIG5hbWU9InJlcXVpcmVkIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249IlBvcnQtcmVxdWlyZWQuMS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBvcnQtcmVxdWlyZWQuMS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBvcnQtcmVxdWlyZWQuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgUG9ydDo6L3JlcXVpcmVkPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBvcnQtcmVxdWlyZWQuMS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBvcnQtcmVxdWlyZWQuMSBQb3J0LXJlcXVpcmVkIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iUG9ydC1yZXF1aXJlZC4xLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoaWYgaXNDb25qdWdhdGVkIHRoZW4gYmFzaWNQcm92aWRlZCgpIGVsc2UgYmFzaWNSZXF1aXJlZCgpIGVuZGlmKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJQb3J0LXJlcXVpcmVkLjEtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkludGVyZmFjZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iUG9ydC1yZXF1aXJlZC4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iUG9ydC1yZXF1aXJlZC4xLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJQb3J0LWJhc2ljUHJvdmlkZWQiIG5hbWU9ImJhc2ljUHJvdmlkZWQiIGJvZHlDb25kaXRpb249IlBvcnQtYmFzaWNQcm92aWRlZC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlBvcnQtYmFzaWNQcm92aWRlZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlBvcnQtYmFzaWNQcm92aWRlZCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHVuaW9uIG9mIHRoZSBzZXRzIG9mIEludGVyZmFjZXMgcmVhbGl6ZWQgYnkgdGhlIHR5cGUgb2YgdGhlIFBvcnQgYW5kIGl0cyBzdXBlcnR5cGVzLCBvciBkaXJlY3RseSB0aGUgdHlwZSBvZiB0aGUgUG9ydCBpZiB0aGUgUG9ydCBpcyB0eXBlZCBieSBhbiBJbnRlcmZhY2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlBvcnQtYmFzaWNQcm92aWRlZC1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlBvcnQtYmFzaWNQcm92aWRlZCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlBvcnQtYmFzaWNQcm92aWRlZC1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIHR5cGUub2NsSXNLaW5kT2YoSW50ZXJmYWNlKSAmI3hEOwotdGhlbiB0eXBlLm9jbEFzVHlwZShJbnRlcmZhY2UpLT5hc1NldCgpICYjeEQ7Ci1lbHNlIHR5cGUub2NsQXNUeXBlKENsYXNzaWZpZXIpLmFsbFJlYWxpemVkSW50ZXJmYWNlcygpICYjeEQ7Ci1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iUG9ydC1iYXNpY1Byb3ZpZGVkLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJJbnRlcmZhY2UiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBvcnQtYmFzaWNQcm92aWRlZC1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlBvcnQtYmFzaWNQcm92aWRlZC1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iUG9ydC1iYXNpY1JlcXVpcmVkIiBuYW1lPSJiYXNpY1JlcXVpcmVkIiBib2R5Q29uZGl0aW9uPSJQb3J0LWJhc2ljUmVxdWlyZWQtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQb3J0LWJhc2ljUmVxdWlyZWQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJQb3J0LWJhc2ljUmVxdWlyZWQiPgotICAgICAgICAgIDxib2R5PlRoZSB1bmlvbiBvZiB0aGUgc2V0cyBvZiBJbnRlcmZhY2VzIHVzZWQgYnkgdGhlIHR5cGUgb2YgdGhlIFBvcnQgYW5kIGl0cyBzdXBlcnR5cGVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJQb3J0LWJhc2ljUmVxdWlyZWQtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJQb3J0LWJhc2ljUmVxdWlyZWQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJQb3J0LWJhc2ljUmVxdWlyZWQtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICggdHlwZS5vY2xBc1R5cGUoQ2xhc3NpZmllcikuYWxsVXNlZEludGVyZmFjZXMoKSApPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlBvcnQtYmFzaWNSZXF1aXJlZC1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iSW50ZXJmYWNlIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQb3J0LWJhc2ljUmVxdWlyZWQtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJQb3J0LWJhc2ljUmVxdWlyZWQtcmVzdWx0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXIiIG5hbWU9IlN0cnVjdHVyZWRDbGFzc2lmaWVyIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgPGJvZHk+U3RydWN0dXJlZENsYXNzaWZpZXJzIG1heSBjb250YWluIGFuIGludGVybmFsIHN0cnVjdHVyZSBvZiBjb25uZWN0ZWQgZWxlbWVudHMgZWFjaCBvZiB3aGljaCBwbGF5cyBhIHJvbGUgaW4gdGhlIG92ZXJhbGwgQmVoYXZpb3IgbW9kZWxlZCBieSB0aGUgU3RydWN0dXJlZENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQ2xhc3NpZmllciIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItb3duZWRBdHRyaWJ1dGUiIG5hbWU9Im93bmVkQXR0cmlidXRlIiB0eXBlPSJQcm9wZXJ0eSIgaXNPcmRlcmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQ2xhc3NpZmllci1hdHRyaWJ1dGUgTmFtZXNwYWNlLW93bmVkTWVtYmVyIFN0cnVjdHVyZWRDbGFzc2lmaWVyLXJvbGUiIGFzc29jaWF0aW9uPSJBX293bmVkQXR0cmlidXRlX3N0cnVjdHVyZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLW93bmVkQXR0cmlidXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJlZENsYXNzaWZpZXItb3duZWRBdHRyaWJ1dGUiPgotICAgICAgICAgIDxib2R5PlRoZSBQcm9wZXJ0aWVzIG93bmVkIGJ5IHRoZSBTdHJ1Y3R1cmVkQ2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLW93bmVkQXR0cmlidXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItb3duZWRBdHRyaWJ1dGUtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItb3duZWRDb25uZWN0b3IiIG5hbWU9Im93bmVkQ29ubmVjdG9yIiB0eXBlPSJDb25uZWN0b3IiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5pdGlvbkNvbnRleHRfcmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5hYmxlRWxlbWVudCBDbGFzc2lmaWVyLWZlYXR1cmUgTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZENvbm5lY3Rvcl9zdHJ1Y3R1cmVkQ2xhc3NpZmllciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1vd25lZENvbm5lY3Rvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLW93bmVkQ29ubmVjdG9yIj4KLSAgICAgICAgICA8Ym9keT5UaGUgY29ubmVjdG9ycyBvd25lZCBieSB0aGUgU3RydWN0dXJlZENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1vd25lZENvbm5lY3Rvci1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLW93bmVkQ29ubmVjdG9yLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLXBhcnQiIG5hbWU9InBhcnQiIHR5cGU9IlByb3BlcnR5IiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX3BhcnRfc3RydWN0dXJlZENsYXNzaWZpZXIiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLXBhcnQiPgotICAgICAgICAgIDxib2R5PlRoZSBQcm9wZXJ0aWVzIHNwZWNpZnlpbmcgaW5zdGFuY2VzIHRoYXQgdGhlIFN0cnVjdHVyZWRDbGFzc2lmaWVyIG93bnMgYnkgY29tcG9zaXRpb24uIFRoaXMgY29sbGVjdGlvbiBpcyBkZXJpdmVkLCBzZWxlY3RpbmcgdGhvc2Ugb3duZWQgUHJvcGVydGllcyB3aGVyZSBpc0NvbXBvc2l0ZSBpcyB0cnVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLXBhcnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItcm9sZSIgbmFtZT0icm9sZSIgdHlwZT0iQ29ubmVjdGFibGVFbGVtZW50IiBpc1JlYWRPbmx5PSJ0cnVlIiBpc0Rlcml2ZWQ9InRydWUiIGlzRGVyaXZlZFVuaW9uPSJ0cnVlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZXNwYWNlLW1lbWJlciIgYXNzb2NpYXRpb249IkFfcm9sZV9zdHJ1Y3R1cmVkQ2xhc3NpZmllciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1yb2xlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJlZENsYXNzaWZpZXItcm9sZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHJvbGVzIHRoYXQgaW5zdGFuY2VzIG1heSBwbGF5IGluIHRoaXMgU3RydWN0dXJlZENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1yb2xlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItcm9sZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1jcmVhdGVPd25lZEF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRlT3duZWRBdHRyaWJ1dGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItY3JlYXRlT3duZWRBdHRyaWJ1dGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1jcmVhdGVPd25lZEF0dHJpYnV0ZSI+Ci0gICAgICAgICAgPGJvZHk+Q3JlYXRlcyBhIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCB0eXBlLCBsb3dlciBib3VuZCwgYW5kIHVwcGVyIGJvdW5kIGFzIGFuIG93bmVkIGF0dHJpYnV0ZSBvZiB0aGlzIHN0cnVjdHVyZWQgY2xhc3NpZmllci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1jcmVhdGVPd25lZEF0dHJpYnV0ZS1fb3duZWRQYXJhbWV0ZXIuMCIgdHlwZT0iUHJvcGVydHkiIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUiIG5hbWU9Im5hbWUiIGVmZmVjdD0icmVhZCI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLWNyZWF0ZU93bmVkQXR0cmlidXRlLW5hbWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1jcmVhdGVPd25lZEF0dHJpYnV0ZS1uYW1lIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBuYW1lIGZvciB0aGUgbmV3IGF0dHJpYnV0ZSwgb3IgbnVsbC48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1jcmVhdGVPd25lZEF0dHJpYnV0ZS1uYW1lLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1jcmVhdGVPd25lZEF0dHJpYnV0ZS1uYW1lLV91cHBlclZhbHVlIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1jcmVhdGVPd25lZEF0dHJpYnV0ZS10eXBlIiBuYW1lPSJ0eXBlIiB0eXBlPSJUeXBlIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1jcmVhdGVPd25lZEF0dHJpYnV0ZS10eXBlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJlZENsYXNzaWZpZXItY3JlYXRlT3duZWRBdHRyaWJ1dGUtdHlwZSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGUgdHlwZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUsIG9yIG51bGwuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItY3JlYXRlT3duZWRBdHRyaWJ1dGUtdHlwZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItY3JlYXRlT3duZWRBdHRyaWJ1dGUtdHlwZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItY3JlYXRlT3duZWRBdHRyaWJ1dGUtbG93ZXIiIG5hbWU9Imxvd2VyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1jcmVhdGVPd25lZEF0dHJpYnV0ZS1sb3dlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLWNyZWF0ZU93bmVkQXR0cmlidXRlLWxvd2VyIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSBsb3dlciBib3VuZCBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItY3JlYXRlT3duZWRBdHRyaWJ1dGUtdXBwZXIiIG5hbWU9InVwcGVyIiBlZmZlY3Q9InJlYWQiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1jcmVhdGVPd25lZEF0dHJpYnV0ZS11cHBlci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLWNyZWF0ZU93bmVkQXR0cmlidXRlLXVwcGVyIj4KLSAgICAgICAgICAgIDxib2R5PlRoZSB1cHBlciBib3VuZCBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1wYXJ0LjEiIG5hbWU9InBhcnQiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgYm9keUNvbmRpdGlvbj0iU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC4xLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC4xIj4KLSAgICAgICAgICA8Ym9keT5EZXJpdmF0aW9uIGZvciBTdHJ1Y3R1cmVkQ2xhc3NpZmllcjo6L3BhcnQ8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC4xIFN0cnVjdHVyZWRDbGFzc2lmaWVyLXBhcnQiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1wYXJ0LjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChvd25lZEF0dHJpYnV0ZS0+c2VsZWN0KGlzQ29tcG9zaXRlKS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC4xLXJlc3VsdCIgbmFtZT0icmVzdWx0IiB0eXBlPSJQcm9wZXJ0eSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItcGFydC4xLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1hbGxSb2xlcyIgbmFtZT0iYWxsUm9sZXMiIGJvZHlDb25kaXRpb249IlN0cnVjdHVyZWRDbGFzc2lmaWVyLWFsbFJvbGVzLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItYWxsUm9sZXMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1hbGxSb2xlcyI+Ci0gICAgICAgICAgPGJvZHk+QWxsIGZlYXR1cmVzIG9mIHR5cGUgQ29ubmVjdGFibGVFbGVtZW50LCBlcXVpdmFsZW50IHRvIGFsbCBkaXJlY3QgYW5kIGluaGVyaXRlZCByb2xlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItYWxsUm9sZXMtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1hbGxSb2xlcyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLWFsbFJvbGVzLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoYWxsRmVhdHVyZXMoKS0+c2VsZWN0KG9jbElzS2luZE9mKENvbm5lY3RhYmxlRWxlbWVudCkpLT5jb2xsZWN0KG9jbEFzVHlwZShDb25uZWN0YWJsZUVsZW1lbnQpKS0+YXNTZXQoKSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItYWxsUm9sZXMtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IkNvbm5lY3RhYmxlRWxlbWVudCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RydWN0dXJlZENsYXNzaWZpZXItYWxsUm9sZXMtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1hbGxSb2xlcy1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJDb25uZWN0b3JLaW5kIiBuYW1lPSJDb25uZWN0b3JLaW5kIiB2aXNpYmlsaXR5PSJwcml2YXRlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJDb25uZWN0b3JLaW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQ29ubmVjdG9yS2luZCI+Ci0gICAgICAgIDxib2R5PkNvbm5lY3RvcktpbmQgaXMgYW4gZW51bWVyYXRpb24gdGhhdCBkZWZpbmVzIHdoZXRoZXIgYSBDb25uZWN0b3IgaXMgYW4gYXNzZW1ibHkgb3IgYSBkZWxlZ2F0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9IkNvbm5lY3RvcktpbmQtYXNzZW1ibHkiIG5hbWU9ImFzc2VtYmx5Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3RvcktpbmQtYXNzZW1ibHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJDb25uZWN0b3JLaW5kLWFzc2VtYmx5Ij4KLSAgICAgICAgICA8Ym9keT5JbmRpY2F0ZXMgdGhhdCB0aGUgQ29ubmVjdG9yIGlzIGFuIGFzc2VtYmx5IENvbm5lY3Rvci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iQ29ubmVjdG9yS2luZC1kZWxlZ2F0aW9uIiBuYW1lPSJkZWxlZ2F0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNvbm5lY3RvcktpbmQtZGVsZWdhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNvbm5lY3RvcktpbmQtZGVsZWdhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+SW5kaWNhdGVzIHRoYXQgdGhlIENvbm5lY3RvciBpcyBhIGRlbGVnYXRpb24gQ29ubmVjdG9yLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9wYXJ0X3N0cnVjdHVyZWRDbGFzc2lmaWVyIiBuYW1lPSJBX3BhcnRfc3RydWN0dXJlZENsYXNzaWZpZXIiIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllci1wYXJ0IEFfcGFydF9zdHJ1Y3R1cmVkQ2xhc3NpZmllci1zdHJ1Y3R1cmVkQ2xhc3NpZmllciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3BhcnRfc3RydWN0dXJlZENsYXNzaWZpZXItc3RydWN0dXJlZENsYXNzaWZpZXIiIG5hbWU9InN0cnVjdHVyZWRDbGFzc2lmaWVyIiB0eXBlPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfcGFydF9zdHJ1Y3R1cmVkQ2xhc3NpZmllciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9wYXJ0X3N0cnVjdHVyZWRDbGFzc2lmaWVyLXN0cnVjdHVyZWRDbGFzc2lmaWVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX293bmVkQ29ubmVjdG9yX3N0cnVjdHVyZWRDbGFzc2lmaWVyIiBuYW1lPSJBX293bmVkQ29ubmVjdG9yX3N0cnVjdHVyZWRDbGFzc2lmaWVyIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLW93bmVkQ29ubmVjdG9yIEFfb3duZWRDb25uZWN0b3Jfc3RydWN0dXJlZENsYXNzaWZpZXItc3RydWN0dXJlZENsYXNzaWZpZXIiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vd25lZENvbm5lY3Rvcl9zdHJ1Y3R1cmVkQ2xhc3NpZmllci1zdHJ1Y3R1cmVkQ2xhc3NpZmllciIgbmFtZT0ic3RydWN0dXJlZENsYXNzaWZpZXIiIHR5cGU9IlN0cnVjdHVyZWRDbGFzc2lmaWVyIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRmVhdHVyZS1mZWF0dXJpbmdDbGFzc2lmaWVyIE5hbWVkRWxlbWVudC1uYW1lc3BhY2UgUmVkZWZpbmFibGVFbGVtZW50LXJlZGVmaW5pdGlvbkNvbnRleHQiIGFzc29jaWF0aW9uPSJBX293bmVkQ29ubmVjdG9yX3N0cnVjdHVyZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX293bmVkQ29ubmVjdG9yX3N0cnVjdHVyZWRDbGFzc2lmaWVyLXN0cnVjdHVyZWRDbGFzc2lmaWVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX293bmVkQXR0cmlidXRlX3N0cnVjdHVyZWRDbGFzc2lmaWVyIiBuYW1lPSJBX293bmVkQXR0cmlidXRlX3N0cnVjdHVyZWRDbGFzc2lmaWVyIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlN0cnVjdHVyZWRDbGFzc2lmaWVyLW93bmVkQXR0cmlidXRlIEFfb3duZWRBdHRyaWJ1dGVfc3RydWN0dXJlZENsYXNzaWZpZXItc3RydWN0dXJlZENsYXNzaWZpZXIiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQV9vd25lZEF0dHJpYnV0ZV9zdHJ1Y3R1cmVkQ2xhc3NpZmllci1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQV9yb2xlX3N0cnVjdHVyZWRDbGFzc2lmaWVyIi8+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX293bmVkQXR0cmlidXRlX3N0cnVjdHVyZWRDbGFzc2lmaWVyLXN0cnVjdHVyZWRDbGFzc2lmaWVyIiBuYW1lPSJzdHJ1Y3R1cmVkQ2xhc3NpZmllciIgdHlwZT0iU3RydWN0dXJlZENsYXNzaWZpZXIiIHJlZGVmaW5lZFByb3BlcnR5PSJBX3JvbGVfc3RydWN0dXJlZENsYXNzaWZpZXItc3RydWN0dXJlZENsYXNzaWZpZXIiIHN1YnNldHRlZFByb3BlcnR5PSJBX2F0dHJpYnV0ZV9jbGFzc2lmaWVyLWNsYXNzaWZpZXIgTmFtZWRFbGVtZW50LW5hbWVzcGFjZSIgYXNzb2NpYXRpb249IkFfb3duZWRBdHRyaWJ1dGVfc3RydWN0dXJlZENsYXNzaWZpZXIiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfb3duZWRBdHRyaWJ1dGVfc3RydWN0dXJlZENsYXNzaWZpZXItc3RydWN0dXJlZENsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcm9sZV9zdHJ1Y3R1cmVkQ2xhc3NpZmllciIgbmFtZT0iQV9yb2xlX3N0cnVjdHVyZWRDbGFzc2lmaWVyIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBpc0Rlcml2ZWQ9InRydWUiIG1lbWJlckVuZD0iU3RydWN0dXJlZENsYXNzaWZpZXItcm9sZSBBX3JvbGVfc3RydWN0dXJlZENsYXNzaWZpZXItc3RydWN0dXJlZENsYXNzaWZpZXIiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yb2xlX3N0cnVjdHVyZWRDbGFzc2lmaWVyLXN0cnVjdHVyZWRDbGFzc2lmaWVyIiBuYW1lPSJzdHJ1Y3R1cmVkQ2xhc3NpZmllciIgdHlwZT0iU3RydWN0dXJlZENsYXNzaWZpZXIiIGlzUmVhZE9ubHk9InRydWUiIGlzRGVyaXZlZD0idHJ1ZSIgaXNEZXJpdmVkVW5pb249InRydWUiIHN1YnNldHRlZFByb3BlcnR5PSJBX21lbWJlcl9tZW1iZXJOYW1lc3BhY2UtbWVtYmVyTmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9yb2xlX3N0cnVjdHVyZWRDbGFzc2lmaWVyIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JvbGVfc3RydWN0dXJlZENsYXNzaWZpZXItc3RydWN0dXJlZENsYXNzaWZpZXItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JvbGVfc3RydWN0dXJlZENsYXNzaWZpZXItc3RydWN0dXJlZENsYXNzaWZpZXItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Byb3RvY29sX3BvcnQiIG5hbWU9IkFfcHJvdG9jb2xfcG9ydCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJQb3J0LXByb3RvY29sIEFfcHJvdG9jb2xfcG9ydC1wb3J0Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcHJvdG9jb2xfcG9ydC1wb3J0IiBuYW1lPSJwb3J0IiB0eXBlPSJQb3J0IiBhc3NvY2lhdGlvbj0iQV9wcm90b2NvbF9wb3J0Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Byb3RvY29sX3BvcnQtcG9ydC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcHJvdG9jb2xfcG9ydC1wb3J0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZXF1aXJlZF9wb3J0IiBuYW1lPSJBX3JlcXVpcmVkX3BvcnQiIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJQb3J0LXJlcXVpcmVkIEFfcmVxdWlyZWRfcG9ydC1wb3J0Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVxdWlyZWRfcG9ydC1wb3J0IiBuYW1lPSJwb3J0IiB0eXBlPSJQb3J0IiBhc3NvY2lhdGlvbj0iQV9yZXF1aXJlZF9wb3J0Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JlcXVpcmVkX3BvcnQtcG9ydC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcmVxdWlyZWRfcG9ydC1wb3J0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZWRlZmluZWRQb3J0X3BvcnQiIG5hbWU9IkFfcmVkZWZpbmVkUG9ydF9wb3J0IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlBvcnQtcmVkZWZpbmVkUG9ydCBBX3JlZGVmaW5lZFBvcnRfcG9ydC1wb3J0Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVkZWZpbmVkUG9ydF9wb3J0LXBvcnQiIG5hbWU9InBvcnQiIHR5cGU9IlBvcnQiIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlZGVmaW5lZFByb3BlcnR5X3Byb3BlcnR5LXByb3BlcnR5IiBhc3NvY2lhdGlvbj0iQV9yZWRlZmluZWRQb3J0X3BvcnQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVkZWZpbmVkUG9ydF9wb3J0LXBvcnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlZGVmaW5lZFBvcnRfcG9ydC1wb3J0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9wcm92aWRlZF9wb3J0IiBuYW1lPSJBX3Byb3ZpZGVkX3BvcnQiIHZpc2liaWxpdHk9InByaXZhdGUiIGlzRGVyaXZlZD0idHJ1ZSIgbWVtYmVyRW5kPSJQb3J0LXByb3ZpZGVkIEFfcHJvdmlkZWRfcG9ydC1wb3J0Ij4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcHJvdmlkZWRfcG9ydC1wb3J0IiBuYW1lPSJwb3J0IiB0eXBlPSJQb3J0IiBhc3NvY2lhdGlvbj0iQV9wcm92aWRlZF9wb3J0Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Byb3ZpZGVkX3BvcnQtcG9ydC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcHJvdmlkZWRfcG9ydC1wb3J0LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vd25lZFBvcnRfZW5jYXBzdWxhdGVkQ2xhc3NpZmllciIgbmFtZT0iQV9vd25lZFBvcnRfZW5jYXBzdWxhdGVkQ2xhc3NpZmllciIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkVuY2Fwc3VsYXRlZENsYXNzaWZpZXItb3duZWRQb3J0IEFfb3duZWRQb3J0X2VuY2Fwc3VsYXRlZENsYXNzaWZpZXItZW5jYXBzdWxhdGVkQ2xhc3NpZmllciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX293bmVkUG9ydF9lbmNhcHN1bGF0ZWRDbGFzc2lmaWVyLWVuY2Fwc3VsYXRlZENsYXNzaWZpZXIiIG5hbWU9ImVuY2Fwc3VsYXRlZENsYXNzaWZpZXIiIHR5cGU9IkVuY2Fwc3VsYXRlZENsYXNzaWZpZXIiIHN1YnNldHRlZFByb3BlcnR5PSJBX293bmVkQXR0cmlidXRlX3N0cnVjdHVyZWRDbGFzc2lmaWVyLXN0cnVjdHVyZWRDbGFzc2lmaWVyIiBhc3NvY2lhdGlvbj0iQV9vd25lZFBvcnRfZW5jYXBzdWxhdGVkQ2xhc3NpZmllciI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vd25lZFBvcnRfZW5jYXBzdWxhdGVkQ2xhc3NpZmllci1lbmNhcHN1bGF0ZWRDbGFzc2lmaWVyLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3BhcnRXaXRoUG9ydF9jb25uZWN0b3JFbmQiIG5hbWU9IkFfcGFydFdpdGhQb3J0X2Nvbm5lY3RvckVuZCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDb25uZWN0b3JFbmQtcGFydFdpdGhQb3J0IEFfcGFydFdpdGhQb3J0X2Nvbm5lY3RvckVuZC1jb25uZWN0b3JFbmQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9wYXJ0V2l0aFBvcnRfY29ubmVjdG9yRW5kLWNvbm5lY3RvckVuZCIgbmFtZT0iY29ubmVjdG9yRW5kIiB0eXBlPSJDb25uZWN0b3JFbmQiIGFzc29jaWF0aW9uPSJBX3BhcnRXaXRoUG9ydF9jb25uZWN0b3JFbmQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcGFydFdpdGhQb3J0X2Nvbm5lY3RvckVuZC1jb25uZWN0b3JFbmQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3BhcnRXaXRoUG9ydF9jb25uZWN0b3JFbmQtY29ubmVjdG9yRW5kLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9kZWZpbmluZ0VuZF9jb25uZWN0b3JFbmQiIG5hbWU9IkFfZGVmaW5pbmdFbmRfY29ubmVjdG9yRW5kIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBpc0Rlcml2ZWQ9InRydWUiIG1lbWJlckVuZD0iQ29ubmVjdG9yRW5kLWRlZmluaW5nRW5kIEFfZGVmaW5pbmdFbmRfY29ubmVjdG9yRW5kLWNvbm5lY3RvckVuZCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2RlZmluaW5nRW5kX2Nvbm5lY3RvckVuZC1jb25uZWN0b3JFbmQiIG5hbWU9ImNvbm5lY3RvckVuZCIgdHlwZT0iQ29ubmVjdG9yRW5kIiBhc3NvY2lhdGlvbj0iQV9kZWZpbmluZ0VuZF9jb25uZWN0b3JFbmQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZGVmaW5pbmdFbmRfY29ubmVjdG9yRW5kLWNvbm5lY3RvckVuZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfZGVmaW5pbmdFbmRfY29ubmVjdG9yRW5kLWNvbm5lY3RvckVuZC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZW5kX2Nvbm5lY3RvciIgbmFtZT0iQV9lbmRfY29ubmVjdG9yIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNvbm5lY3Rvci1lbmQgQV9lbmRfY29ubmVjdG9yLWNvbm5lY3RvciI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2VuZF9jb25uZWN0b3ItY29ubmVjdG9yIiBuYW1lPSJjb25uZWN0b3IiIHR5cGU9IkNvbm5lY3RvciIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2VuZF9jb25uZWN0b3IiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9yZWRlZmluZWRDb25uZWN0b3JfY29ubmVjdG9yIiBuYW1lPSJBX3JlZGVmaW5lZENvbm5lY3Rvcl9jb25uZWN0b3IiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ29ubmVjdG9yLXJlZGVmaW5lZENvbm5lY3RvciBBX3JlZGVmaW5lZENvbm5lY3Rvcl9jb25uZWN0b3ItY29ubmVjdG9yIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVkZWZpbmVkQ29ubmVjdG9yX2Nvbm5lY3Rvci1jb25uZWN0b3IiIG5hbWU9ImNvbm5lY3RvciIgdHlwZT0iQ29ubmVjdG9yIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9yZWRlZmluZWRFbGVtZW50X3JlZGVmaW5hYmxlRWxlbWVudC1yZWRlZmluYWJsZUVsZW1lbnQiIGFzc29jaWF0aW9uPSJBX3JlZGVmaW5lZENvbm5lY3Rvcl9jb25uZWN0b3IiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVkZWZpbmVkQ29ubmVjdG9yX2Nvbm5lY3Rvci1jb25uZWN0b3ItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlZGVmaW5lZENvbm5lY3Rvcl9jb25uZWN0b3ItY29ubmVjdG9yLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jb250cmFjdF9jb25uZWN0b3IiIG5hbWU9IkFfY29udHJhY3RfY29ubmVjdG9yIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNvbm5lY3Rvci1jb250cmFjdCBBX2NvbnRyYWN0X2Nvbm5lY3Rvci1jb25uZWN0b3IiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9jb250cmFjdF9jb25uZWN0b3ItY29ubmVjdG9yIiBuYW1lPSJjb25uZWN0b3IiIHR5cGU9IkNvbm5lY3RvciIgYXNzb2NpYXRpb249IkFfY29udHJhY3RfY29ubmVjdG9yIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2NvbnRyYWN0X2Nvbm5lY3Rvci1jb25uZWN0b3ItX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NvbnRyYWN0X2Nvbm5lY3Rvci1jb25uZWN0b3ItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3R5cGVfY29ubmVjdG9yIiBuYW1lPSJBX3R5cGVfY29ubmVjdG9yIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNvbm5lY3Rvci10eXBlIEFfdHlwZV9jb25uZWN0b3ItY29ubmVjdG9yIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfdHlwZV9jb25uZWN0b3ItY29ubmVjdG9yIiBuYW1lPSJjb25uZWN0b3IiIHR5cGU9IkNvbm5lY3RvciIgYXNzb2NpYXRpb249IkFfdHlwZV9jb25uZWN0b3IiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfdHlwZV9jb25uZWN0b3ItY29ubmVjdG9yLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV90eXBlX2Nvbm5lY3Rvci1jb25uZWN0b3ItX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2Nvbm5lY3RhYmxlRWxlbWVudF90ZW1wbGF0ZVBhcmFtZXRlcl9wYXJhbWV0ZXJlZEVsZW1lbnQiIG5hbWU9IkFfY29ubmVjdGFibGVFbGVtZW50X3RlbXBsYXRlUGFyYW1ldGVyX3BhcmFtZXRlcmVkRWxlbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDb25uZWN0YWJsZUVsZW1lbnQtdGVtcGxhdGVQYXJhbWV0ZXIgQ29ubmVjdGFibGVFbGVtZW50VGVtcGxhdGVQYXJhbWV0ZXItcGFyYW1ldGVyZWRFbGVtZW50Ii8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZW5kX3JvbGUiIG5hbWU9IkFfZW5kX3JvbGUiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ29ubmVjdG9yRW5kLXJvbGUgQV9lbmRfcm9sZS1lbmQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lbmRfcm9sZS1lbmQiIG5hbWU9ImVuZCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iQ29ubmVjdG9yRW5kIiBhc3NvY2lhdGlvbj0iQV9lbmRfcm9sZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9lbmRfcm9sZS1lbmQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2VuZF9yb2xlLWVuZC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVhbGl6aW5nQ2xhc3NpZmllcl9jb21wb25lbnRSZWFsaXphdGlvbiIgbmFtZT0iQV9yZWFsaXppbmdDbGFzc2lmaWVyX2NvbXBvbmVudFJlYWxpemF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNvbXBvbmVudFJlYWxpemF0aW9uLXJlYWxpemluZ0NsYXNzaWZpZXIgQV9yZWFsaXppbmdDbGFzc2lmaWVyX2NvbXBvbmVudFJlYWxpemF0aW9uLWNvbXBvbmVudFJlYWxpemF0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVhbGl6aW5nQ2xhc3NpZmllcl9jb21wb25lbnRSZWFsaXphdGlvbi1jb21wb25lbnRSZWFsaXphdGlvbiIgbmFtZT0iY29tcG9uZW50UmVhbGl6YXRpb24iIHR5cGU9IkNvbXBvbmVudFJlYWxpemF0aW9uIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LWNsaWVudERlcGVuZGVuY3kiIGFzc29jaWF0aW9uPSJBX3JlYWxpemluZ0NsYXNzaWZpZXJfY29tcG9uZW50UmVhbGl6YXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVhbGl6aW5nQ2xhc3NpZmllcl9jb21wb25lbnRSZWFsaXphdGlvbi1jb21wb25lbnRSZWFsaXphdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcmVhbGl6aW5nQ2xhc3NpZmllcl9jb21wb25lbnRSZWFsaXphdGlvbi1jb21wb25lbnRSZWFsaXphdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcmVxdWlyZWRfY29tcG9uZW50IiBuYW1lPSJBX3JlcXVpcmVkX2NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkNvbXBvbmVudC1yZXF1aXJlZCBBX3JlcXVpcmVkX2NvbXBvbmVudC1jb21wb25lbnQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yZXF1aXJlZF9jb21wb25lbnQtY29tcG9uZW50IiBuYW1lPSJjb21wb25lbnQiIHR5cGU9IkNvbXBvbmVudCIgYXNzb2NpYXRpb249IkFfcmVxdWlyZWRfY29tcG9uZW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JlcXVpcmVkX2NvbXBvbmVudC1jb21wb25lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3JlcXVpcmVkX2NvbXBvbmVudC1jb21wb25lbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3BhY2thZ2VkRWxlbWVudF9jb21wb25lbnQiIG5hbWU9IkFfcGFja2FnZWRFbGVtZW50X2NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDb21wb25lbnQtcGFja2FnZWRFbGVtZW50IEFfcGFja2FnZWRFbGVtZW50X2NvbXBvbmVudC1jb21wb25lbnQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9wYWNrYWdlZEVsZW1lbnRfY29tcG9uZW50LWNvbXBvbmVudCIgbmFtZT0iY29tcG9uZW50IiB0eXBlPSJDb21wb25lbnQiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9wYWNrYWdlZEVsZW1lbnRfY29tcG9uZW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3BhY2thZ2VkRWxlbWVudF9jb21wb25lbnQtY29tcG9uZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3JlYWxpemF0aW9uX2Fic3RyYWN0aW9uX2NvbXBvbmVudCIgbmFtZT0iQV9yZWFsaXphdGlvbl9hYnN0cmFjdGlvbl9jb21wb25lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ29tcG9uZW50LXJlYWxpemF0aW9uIENvbXBvbmVudFJlYWxpemF0aW9uLWFic3RyYWN0aW9uIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcHJvdmlkZWRfY29tcG9uZW50IiBuYW1lPSJBX3Byb3ZpZGVkX2NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkNvbXBvbmVudC1wcm92aWRlZCBBX3Byb3ZpZGVkX2NvbXBvbmVudC1jb21wb25lbnQiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9wcm92aWRlZF9jb21wb25lbnQtY29tcG9uZW50IiBuYW1lPSJjb21wb25lbnQiIHR5cGU9IkNvbXBvbmVudCIgYXNzb2NpYXRpb249IkFfcHJvdmlkZWRfY29tcG9uZW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3Byb3ZpZGVkX2NvbXBvbmVudC1jb21wb25lbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3Byb3ZpZGVkX2NvbXBvbmVudC1jb21wb25lbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3R5cGVfY29sbGFib3JhdGlvblVzZSIgbmFtZT0iQV90eXBlX2NvbGxhYm9yYXRpb25Vc2UiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ29sbGFib3JhdGlvblVzZS10eXBlIEFfdHlwZV9jb2xsYWJvcmF0aW9uVXNlLWNvbGxhYm9yYXRpb25Vc2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV90eXBlX2NvbGxhYm9yYXRpb25Vc2UtY29sbGFib3JhdGlvblVzZSIgbmFtZT0iY29sbGFib3JhdGlvblVzZSIgdHlwZT0iQ29sbGFib3JhdGlvblVzZSIgYXNzb2NpYXRpb249IkFfdHlwZV9jb2xsYWJvcmF0aW9uVXNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3R5cGVfY29sbGFib3JhdGlvblVzZS1jb2xsYWJvcmF0aW9uVXNlLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV90eXBlX2NvbGxhYm9yYXRpb25Vc2UtY29sbGFib3JhdGlvblVzZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfcm9sZUJpbmRpbmdfY29sbGFib3JhdGlvblVzZSIgbmFtZT0iQV9yb2xlQmluZGluZ19jb2xsYWJvcmF0aW9uVXNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNvbGxhYm9yYXRpb25Vc2Utcm9sZUJpbmRpbmcgQV9yb2xlQmluZGluZ19jb2xsYWJvcmF0aW9uVXNlLWNvbGxhYm9yYXRpb25Vc2UiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9yb2xlQmluZGluZ19jb2xsYWJvcmF0aW9uVXNlLWNvbGxhYm9yYXRpb25Vc2UiIG5hbWU9ImNvbGxhYm9yYXRpb25Vc2UiIHR5cGU9IkNvbGxhYm9yYXRpb25Vc2UiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9yb2xlQmluZGluZ19jb2xsYWJvcmF0aW9uVXNlIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3JvbGVCaW5kaW5nX2NvbGxhYm9yYXRpb25Vc2UtY29sbGFib3JhdGlvblVzZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jb2xsYWJvcmF0aW9uUm9sZV9jb2xsYWJvcmF0aW9uIiBuYW1lPSJBX2NvbGxhYm9yYXRpb25Sb2xlX2NvbGxhYm9yYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ29sbGFib3JhdGlvbi1jb2xsYWJvcmF0aW9uUm9sZSBBX2NvbGxhYm9yYXRpb25Sb2xlX2NvbGxhYm9yYXRpb24tY29sbGFib3JhdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2NvbGxhYm9yYXRpb25Sb2xlX2NvbGxhYm9yYXRpb24tY29sbGFib3JhdGlvbiIgbmFtZT0iY29sbGFib3JhdGlvbiIgdHlwZT0iQ29sbGFib3JhdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkFfcm9sZV9zdHJ1Y3R1cmVkQ2xhc3NpZmllci1zdHJ1Y3R1cmVkQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkFfY29sbGFib3JhdGlvblJvbGVfY29sbGFib3JhdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jb2xsYWJvcmF0aW9uUm9sZV9jb2xsYWJvcmF0aW9uLWNvbGxhYm9yYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2NvbGxhYm9yYXRpb25Sb2xlX2NvbGxhYm9yYXRpb24tY29sbGFib3JhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRPcGVyYXRpb25fY2xhc3MiIG5hbWU9IkFfb3duZWRPcGVyYXRpb25fY2xhc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ2xhc3Mtb3duZWRPcGVyYXRpb24gT3BlcmF0aW9uLWNsYXNzIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc3VwZXJDbGFzc19jbGFzcyIgbmFtZT0iQV9zdXBlckNsYXNzX2NsYXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBpc0Rlcml2ZWQ9InRydWUiIG1lbWJlckVuZD0iQ2xhc3Mtc3VwZXJDbGFzcyBBX3N1cGVyQ2xhc3NfY2xhc3MtY2xhc3MiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9zdXBlckNsYXNzX2NsYXNzLWNsYXNzIiBuYW1lPSJjbGFzcyIgdHlwZT0iQ2xhc3MiIHN1YnNldHRlZFByb3BlcnR5PSJBX2dlbmVyYWxfY2xhc3NpZmllci1jbGFzc2lmaWVyIiBhc3NvY2lhdGlvbj0iQV9zdXBlckNsYXNzX2NsYXNzIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3N1cGVyQ2xhc3NfY2xhc3MtY2xhc3MtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX3N1cGVyQ2xhc3NfY2xhc3MtY2xhc3MtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2V4dGVuc2lvbl9tZXRhY2xhc3MiIG5hbWU9IkFfZXh0ZW5zaW9uX21ldGFjbGFzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgaXNEZXJpdmVkPSJ0cnVlIiBtZW1iZXJFbmQ9IkNsYXNzLWV4dGVuc2lvbiBFeHRlbnNpb24tbWV0YWNsYXNzIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRBdHRyaWJ1dGVfY2xhc3MiIG5hbWU9IkFfb3duZWRBdHRyaWJ1dGVfY2xhc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQ2xhc3Mtb3duZWRBdHRyaWJ1dGUgUHJvcGVydHktY2xhc3MiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9uZXN0ZWRDbGFzc2lmaWVyX25lc3RpbmdDbGFzcyIgbmFtZT0iQV9uZXN0ZWRDbGFzc2lmaWVyX25lc3RpbmdDbGFzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJDbGFzcy1uZXN0ZWRDbGFzc2lmaWVyIEFfbmVzdGVkQ2xhc3NpZmllcl9uZXN0aW5nQ2xhc3MtbmVzdGluZ0NsYXNzIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfbmVzdGVkQ2xhc3NpZmllcl9uZXN0aW5nQ2xhc3MtbmVzdGluZ0NsYXNzIiBuYW1lPSJuZXN0aW5nQ2xhc3MiIHR5cGU9IkNsYXNzIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iTmFtZWRFbGVtZW50LW5hbWVzcGFjZSBSZWRlZmluYWJsZUVsZW1lbnQtcmVkZWZpbml0aW9uQ29udGV4dCIgYXNzb2NpYXRpb249IkFfbmVzdGVkQ2xhc3NpZmllcl9uZXN0aW5nQ2xhc3MiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbmVzdGVkQ2xhc3NpZmllcl9uZXN0aW5nQ2xhc3MtbmVzdGluZ0NsYXNzLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX293bmVkUmVjZXB0aW9uX2NsYXNzIiBuYW1lPSJBX293bmVkUmVjZXB0aW9uX2NsYXNzIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkNsYXNzLW93bmVkUmVjZXB0aW9uIEFfb3duZWRSZWNlcHRpb25fY2xhc3MtY2xhc3MiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vd25lZFJlY2VwdGlvbl9jbGFzcy1jbGFzcyIgbmFtZT0iY2xhc3MiIHR5cGU9IkNsYXNzIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRmVhdHVyZS1mZWF0dXJpbmdDbGFzc2lmaWVyIE5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX293bmVkUmVjZXB0aW9uX2NsYXNzIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX293bmVkUmVjZXB0aW9uX2NsYXNzLWNsYXNzLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX21lbWJlckVuZF9hc3NvY2lhdGlvbiIgbmFtZT0iQV9tZW1iZXJFbmRfYXNzb2NpYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQXNzb2NpYXRpb24tbWVtYmVyRW5kIFByb3BlcnR5LWFzc29jaWF0aW9uIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZW5kVHlwZV9hc3NvY2lhdGlvbiIgbmFtZT0iQV9lbmRUeXBlX2Fzc29jaWF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBpc0Rlcml2ZWQ9InRydWUiIG1lbWJlckVuZD0iQXNzb2NpYXRpb24tZW5kVHlwZSBBX2VuZFR5cGVfYXNzb2NpYXRpb24tYXNzb2NpYXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9lbmRUeXBlX2Fzc29jaWF0aW9uLWFzc29jaWF0aW9uIiBuYW1lPSJhc3NvY2lhdGlvbiIgdHlwZT0iQXNzb2NpYXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJBX3JlbGF0ZWRFbGVtZW50X3JlbGF0aW9uc2hpcC1yZWxhdGlvbnNoaXAiIGFzc29jaWF0aW9uPSJBX2VuZFR5cGVfYXNzb2NpYXRpb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZW5kVHlwZV9hc3NvY2lhdGlvbi1hc3NvY2lhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfZW5kVHlwZV9hc3NvY2lhdGlvbi1hc3NvY2lhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb3duZWRFbmRfb3duaW5nQXNzb2NpYXRpb24iIG5hbWU9IkFfb3duZWRFbmRfb3duaW5nQXNzb2NpYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iQXNzb2NpYXRpb24tb3duZWRFbmQgUHJvcGVydHktb3duaW5nQXNzb2NpYXRpb24iLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9uYXZpZ2FibGVPd25lZEVuZF9hc3NvY2lhdGlvbiIgbmFtZT0iQV9uYXZpZ2FibGVPd25lZEVuZF9hc3NvY2lhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJBc3NvY2lhdGlvbi1uYXZpZ2FibGVPd25lZEVuZCBBX25hdmlnYWJsZU93bmVkRW5kX2Fzc29jaWF0aW9uLWFzc29jaWF0aW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfbmF2aWdhYmxlT3duZWRFbmRfYXNzb2NpYXRpb24tYXNzb2NpYXRpb24iIG5hbWU9ImFzc29jaWF0aW9uIiB0eXBlPSJBc3NvY2lhdGlvbiIgc3Vic2V0dGVkUHJvcGVydHk9IlByb3BlcnR5LW93bmluZ0Fzc29jaWF0aW9uIiBhc3NvY2lhdGlvbj0iQV9uYXZpZ2FibGVPd25lZEVuZF9hc3NvY2lhdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9uYXZpZ2FibGVPd25lZEVuZF9hc3NvY2lhdGlvbi1hc3NvY2lhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iQWN0b3IiIG5hbWU9IkFjdG9yIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rvci1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkFjdG9yIj4KLSAgICAgICAgPGJvZHk+QW4gQWN0b3Igc3BlY2lmaWVzIGEgcm9sZSBwbGF5ZWQgYnkgYSB1c2VyIG9yIGFueSBvdGhlciBzeXN0ZW0gdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgc3ViamVjdC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJBY3Rvci1hc3NvY2lhdGlvbnMiIG5hbWU9ImFzc29jaWF0aW9ucyIgY29uc3RyYWluZWRFbGVtZW50PSJBY3RvciI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJBY3Rvci1hc3NvY2lhdGlvbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJBY3Rvci1hc3NvY2lhdGlvbnMiPgotICAgICAgICAgIDxib2R5PkFuIEFjdG9yIGNhbiBvbmx5IGhhdmUgQXNzb2NpYXRpb25zIHRvIFVzZUNhc2VzLCBDb21wb25lbnRzLCBhbmQgQ2xhc3Nlcy4gRnVydGhlcm1vcmUgdGhlc2UgQXNzb2NpYXRpb25zIG11c3QgYmUgYmluYXJ5LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJBY3Rvci1hc3NvY2lhdGlvbnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PkFzc29jaWF0aW9uLmFsbEluc3RhbmNlcygpLT5mb3JBbGwoIGEgfAotICBhLm1lbWJlckVuZC0+Y29sbGVjdCh0eXBlKS0+aW5jbHVkZXMoc2VsZikgaW1wbGllcwotICAoCi0gICAgYS5tZW1iZXJFbmQtPnNpemUoKSA9IDIgYW5kCi0gICAgbGV0IGFjdG9yRW5kIDogUHJvcGVydHkgPSBhLm1lbWJlckVuZC0+YW55KHR5cGUgPSBzZWxmKSBpbgotICAgICAgYWN0b3JFbmQub3Bwb3NpdGUuY2xhc3Mub2NsSXNLaW5kT2YoVXNlQ2FzZSkgb3IKLSAgICAgICggYWN0b3JFbmQub3Bwb3NpdGUuY2xhc3Mub2NsSXNLaW5kT2YoQ2xhc3MpIGFuZCBub3QKLSAgICAgICAgIGFjdG9yRW5kLm9wcG9zaXRlLmNsYXNzLm9jbElzS2luZE9mKEJlaGF2aW9yKSkKLSAgICAgICkKLSAgKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iQWN0b3ItbXVzdF9oYXZlX25hbWUiIG5hbWU9Im11c3RfaGF2ZV9uYW1lIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkFjdG9yIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkFjdG9yLW11c3RfaGF2ZV9uYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iQWN0b3ItbXVzdF9oYXZlX25hbWUiPgotICAgICAgICAgIDxib2R5PkFuIEFjdG9yIG11c3QgaGF2ZSBhIG5hbWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkFjdG9yLW11c3RfaGF2ZV9uYW1lLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5uYW1lLT5ub3RFbXB0eSgpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFjdG9yLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJCZWhhdmlvcmVkQ2xhc3NpZmllciIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJFeHRlbmQiIG5hbWU9IkV4dGVuZCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXh0ZW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5kIj4KLSAgICAgICAgPGJvZHk+QSByZWxhdGlvbnNoaXAgZnJvbSBhbiBleHRlbmRpbmcgVXNlQ2FzZSB0byBhbiBleHRlbmRlZCBVc2VDYXNlIHRoYXQgc3BlY2lmaWVzIGhvdyBhbmQgd2hlbiB0aGUgYmVoYXZpb3IgZGVmaW5lZCBpbiB0aGUgZXh0ZW5kaW5nIFVzZUNhc2UgY2FuIGJlIGluc2VydGVkIGludG8gdGhlIGJlaGF2aW9yIGRlZmluZWQgaW4gdGhlIGV4dGVuZGVkIFVzZUNhc2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRXh0ZW5kLWV4dGVuc2lvbl9wb2ludHMiIG5hbWU9ImV4dGVuc2lvbl9wb2ludHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iRXh0ZW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4dGVuZC1leHRlbnNpb25fcG9pbnRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5kLWV4dGVuc2lvbl9wb2ludHMiPgotICAgICAgICAgIDxib2R5PlRoZSBFeHRlbnNpb25Qb2ludHMgcmVmZXJlbmNlZCBieSB0aGUgRXh0ZW5kIHJlbGF0aW9uc2hpcCBtdXN0IGJlbG9uZyB0byB0aGUgVXNlQ2FzZSB0aGF0IGlzIGJlaW5nIGV4dGVuZGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFeHRlbmQtZXh0ZW5zaW9uX3BvaW50cy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZXh0ZW5zaW9uTG9jYXRpb24tPmZvckFsbCAoeHAgfCBleHRlbmRlZENhc2UuZXh0ZW5zaW9uUG9pbnQtPmluY2x1ZGVzKHhwKSk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRXh0ZW5kLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkV4dGVuZC1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iRGlyZWN0ZWRSZWxhdGlvbnNoaXAiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4dGVuZC1jb25kaXRpb24iIG5hbWU9ImNvbmRpdGlvbiIgdHlwZT0iQ29uc3RyYWludCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9jb25kaXRpb25fZXh0ZW5kIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4dGVuZC1jb25kaXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHRlbmQtY29uZGl0aW9uIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcmVuY2VzIHRoZSBjb25kaXRpb24gdGhhdCBtdXN0IGhvbGQgd2hlbiB0aGUgZmlyc3QgRXh0ZW5zaW9uUG9pbnQgaXMgcmVhY2hlZCBmb3IgdGhlIGV4dGVuc2lvbiB0byB0YWtlIHBsYWNlLiBJZiBubyBjb25zdHJhaW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRXh0ZW5kIHJlbGF0aW9uc2hpcCwgdGhlIGV4dGVuc2lvbiBpcyB1bmNvbmRpdGlvbmFsLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iRXh0ZW5kLWNvbmRpdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4dGVuZC1leHRlbmRlZENhc2UiIG5hbWU9ImV4dGVuZGVkQ2FzZSIgdHlwZT0iVXNlQ2FzZSIgc3Vic2V0dGVkUHJvcGVydHk9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXRhcmdldCIgYXNzb2NpYXRpb249IkFfZXh0ZW5kZWRDYXNlX2V4dGVuZCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHRlbmQtZXh0ZW5kZWRDYXNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXh0ZW5kLWV4dGVuZGVkQ2FzZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFVzZUNhc2UgdGhhdCBpcyBiZWluZyBleHRlbmRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4dGVuZC1leHRlbnNpb24iIG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iVXNlQ2FzZSIgc3Vic2V0dGVkUHJvcGVydHk9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXNvdXJjZSBOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9leHRlbmRfZXh0ZW5zaW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4dGVuZC1leHRlbnNpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHRlbmQtZXh0ZW5zaW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgVXNlQ2FzZSB0aGF0IHJlcHJlc2VudHMgdGhlIGV4dGVuc2lvbiBhbmQgb3ducyB0aGUgRXh0ZW5kIHJlbGF0aW9uc2hpcC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkV4dGVuZC1leHRlbnNpb25Mb2NhdGlvbiIgbmFtZT0iZXh0ZW5zaW9uTG9jYXRpb24iIHR5cGU9IkV4dGVuc2lvblBvaW50IiBpc09yZGVyZWQ9InRydWUiIGFzc29jaWF0aW9uPSJBX2V4dGVuc2lvbkxvY2F0aW9uX2V4dGVuc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHRlbmQtZXh0ZW5zaW9uTG9jYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHRlbmQtZXh0ZW5zaW9uTG9jYXRpb24iPgotICAgICAgICAgIDxib2R5PkFuIG9yZGVyZWQgbGlzdCBvZiBFeHRlbnNpb25Qb2ludHMgYmVsb25naW5nIHRvIHRoZSBleHRlbmRlZCBVc2VDYXNlLCBzcGVjaWZ5aW5nIHdoZXJlIHRoZSByZXNwZWN0aXZlIGJlaGF2aW9yYWwgZnJhZ21lbnRzIG9mIHRoZSBleHRlbmRpbmcgVXNlQ2FzZSBhcmUgdG8gYmUgaW5zZXJ0ZWQuIFRoZSBmaXJzdCBmcmFnbWVudCBpbiB0aGUgZXh0ZW5kaW5nIFVzZUNhc2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdCBleHRlbnNpb24gcG9pbnQgaW4gdGhlIGxpc3QsIHRoZSBzZWNvbmQgZnJhZ21lbnQgd2l0aCB0aGUgc2Vjb25kIHBvaW50LCBhbmQgc28gb24uIE5vdGUgdGhhdCwgaW4gbW9zdCBwcmFjdGljYWwgY2FzZXMsIHRoZSBleHRlbmRpbmcgVXNlQ2FzZSBoYXMganVzdCBhIHNpbmdsZSBiZWhhdmlvciBmcmFnbWVudCwgc28gdGhhdCB0aGUgbGlzdCBvZiBFeHRlbnNpb25Qb2ludHMgaXMgdHJpdmlhbC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkV4dGVuZC1leHRlbnNpb25Mb2NhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkV4dGVuc2lvblBvaW50IiBuYW1lPSJFeHRlbnNpb25Qb2ludCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXh0ZW5zaW9uUG9pbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHRlbnNpb25Qb2ludCI+Ci0gICAgICAgIDxib2R5PkFuIEV4dGVuc2lvblBvaW50IGlkZW50aWZpZXMgYSBwb2ludCBpbiB0aGUgYmVoYXZpb3Igb2YgYSBVc2VDYXNlIHdoZXJlIHRoYXQgYmVoYXZpb3IgY2FuIGJlIGV4dGVuZGVkIGJ5IHRoZSBiZWhhdmlvciBvZiBzb21lIG90aGVyIChleHRlbmRpbmcpIFVzZUNhc2UsIGFzIHNwZWNpZmllZCBieSBhbiBFeHRlbmQgcmVsYXRpb25zaGlwLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkV4dGVuc2lvblBvaW50LW11c3RfaGF2ZV9uYW1lIiBuYW1lPSJtdXN0X2hhdmVfbmFtZSIgY29uc3RyYWluZWRFbGVtZW50PSJFeHRlbnNpb25Qb2ludCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHRlbnNpb25Qb2ludC1tdXN0X2hhdmVfbmFtZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4dGVuc2lvblBvaW50LW11c3RfaGF2ZV9uYW1lIj4KLSAgICAgICAgICA8Ym9keT5BbiBFeHRlbnNpb25Qb2ludCBtdXN0IGhhdmUgYSBuYW1lLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJFeHRlbnNpb25Qb2ludC1tdXN0X2hhdmVfbmFtZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+bmFtZS0+bm90RW1wdHkgKCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRXh0ZW5zaW9uUG9pbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlJlZGVmaW5hYmxlRWxlbWVudCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRXh0ZW5zaW9uUG9pbnQtdXNlQ2FzZSIgbmFtZT0idXNlQ2FzZSIgdHlwZT0iVXNlQ2FzZSIgc3Vic2V0dGVkUHJvcGVydHk9Ik5hbWVkRWxlbWVudC1uYW1lc3BhY2UiIGFzc29jaWF0aW9uPSJBX2V4dGVuc2lvblBvaW50X3VzZUNhc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXh0ZW5zaW9uUG9pbnQtdXNlQ2FzZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4dGVuc2lvblBvaW50LXVzZUNhc2UiPgotICAgICAgICAgIDxib2R5PlRoZSBVc2VDYXNlIHRoYXQgb3ducyB0aGlzIEV4dGVuc2lvblBvaW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJJbmNsdWRlIiBuYW1lPSJJbmNsdWRlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbmNsdWRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5jbHVkZSI+Ci0gICAgICAgIDxib2R5PkFuIEluY2x1ZGUgcmVsYXRpb25zaGlwIHNwZWNpZmllcyB0aGF0IGEgVXNlQ2FzZSBjb250YWlucyB0aGUgYmVoYXZpb3IgZGVmaW5lZCBpbiBhbm90aGVyIFVzZUNhc2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJJbmNsdWRlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJEaXJlY3RlZFJlbGF0aW9uc2hpcCIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iSW5jbHVkZS1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iTmFtZWRFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbmNsdWRlLWFkZGl0aW9uIiBuYW1lPSJhZGRpdGlvbiIgdHlwZT0iVXNlQ2FzZSIgc3Vic2V0dGVkUHJvcGVydHk9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXRhcmdldCIgYXNzb2NpYXRpb249IkFfYWRkaXRpb25faW5jbHVkZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbmNsdWRlLWFkZGl0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5jbHVkZS1hZGRpdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFVzZUNhc2UgdGhhdCBpcyB0byBiZSBpbmNsdWRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkluY2x1ZGUtaW5jbHVkaW5nQ2FzZSIgbmFtZT0iaW5jbHVkaW5nQ2FzZSIgdHlwZT0iVXNlQ2FzZSIgc3Vic2V0dGVkUHJvcGVydHk9IkRpcmVjdGVkUmVsYXRpb25zaGlwLXNvdXJjZSBOYW1lZEVsZW1lbnQtbmFtZXNwYWNlIiBhc3NvY2lhdGlvbj0iQV9pbmNsdWRlX2luY2x1ZGluZ0Nhc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW5jbHVkZS1pbmNsdWRpbmdDYXNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5jbHVkZS1pbmNsdWRpbmdDYXNlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgVXNlQ2FzZSB3aGljaCBpbmNsdWRlcyB0aGUgYWRkaXRpb24gYW5kIG93bnMgdGhlIEluY2x1ZGUgcmVsYXRpb25zaGlwLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJVc2VDYXNlIiBuYW1lPSJVc2VDYXNlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVc2VDYXNlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVXNlQ2FzZSI+Ci0gICAgICAgIDxib2R5PkEgVXNlQ2FzZSBzcGVjaWZpZXMgYSBzZXQgb2YgYWN0aW9ucyBwZXJmb3JtZWQgYnkgaXRzIHN1YmplY3RzLCB3aGljaCB5aWVsZHMgYW4gb2JzZXJ2YWJsZSByZXN1bHQgdGhhdCBpcyBvZiB2YWx1ZSBmb3Igb25lIG9yIG1vcmUgQWN0b3JzIG9yIG90aGVyIHN0YWtlaG9sZGVycyBvZiBlYWNoIHN1YmplY3QuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVXNlQ2FzZS1iaW5hcnlfYXNzb2NpYXRpb25zIiBuYW1lPSJiaW5hcnlfYXNzb2NpYXRpb25zIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlVzZUNhc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVXNlQ2FzZS1iaW5hcnlfYXNzb2NpYXRpb25zLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVXNlQ2FzZS1iaW5hcnlfYXNzb2NpYXRpb25zIj4KLSAgICAgICAgICA8Ym9keT5Vc2VDYXNlcyBjYW4gb25seSBiZSBpbnZvbHZlZCBpbiBiaW5hcnkgQXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJVc2VDYXNlLWJpbmFyeV9hc3NvY2lhdGlvbnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PkFzc29jaWF0aW9uLmFsbEluc3RhbmNlcygpLT5mb3JBbGwoYSB8IGEubWVtYmVyRW5kLnR5cGUtPmluY2x1ZGVzKHNlbGYpIGltcGxpZXMgYS5tZW1iZXJFbmQtPnNpemUoKSA9IDIpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJVc2VDYXNlLW5vX2Fzc29jaWF0aW9uX3RvX3VzZV9jYXNlIiBuYW1lPSJub19hc3NvY2lhdGlvbl90b191c2VfY2FzZSIgY29uc3RyYWluZWRFbGVtZW50PSJVc2VDYXNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlVzZUNhc2Utbm9fYXNzb2NpYXRpb25fdG9fdXNlX2Nhc2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJVc2VDYXNlLW5vX2Fzc29jaWF0aW9uX3RvX3VzZV9jYXNlIj4KLSAgICAgICAgICA8Ym9keT5Vc2VDYXNlcyBjYW5ub3QgaGF2ZSBBc3NvY2lhdGlvbnMgdG8gVXNlQ2FzZXMgc3BlY2lmeWluZyB0aGUgc2FtZSBzdWJqZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJVc2VDYXNlLW5vX2Fzc29jaWF0aW9uX3RvX3VzZV9jYXNlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5Bc3NvY2lhdGlvbi5hbGxJbnN0YW5jZXMoKS0+Zm9yQWxsKGEgfCBhLm1lbWJlckVuZC50eXBlLT5pbmNsdWRlcyhzZWxmKSBpbXBsaWVzICYjeEQ7Ci0gICAoJiN4RDsKLSAgIGxldCB1c2VjYXNlczogU2V0KFVzZUNhc2UpID0gYS5tZW1iZXJFbmQudHlwZS0+c2VsZWN0KG9jbElzS2luZE9mKFVzZUNhc2UpKS0+Y29sbGVjdChvY2xBc1R5cGUoVXNlQ2FzZSkpLT5hc1NldCgpIGluJiN4RDsKLSAgIHVzZWNhc2VzLT5zaXplKCkgPiAxIGltcGxpZXMgdXNlY2FzZXMtPmNvbGxlY3Qoc3ViamVjdCktPnNpemUoKSA+IDEmI3hEOwotICAgKSYjeEQ7Ci0pPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJVc2VDYXNlLWNhbm5vdF9pbmNsdWRlX3NlbGYiIG5hbWU9ImNhbm5vdF9pbmNsdWRlX3NlbGYiIGNvbnN0cmFpbmVkRWxlbWVudD0iVXNlQ2FzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVc2VDYXNlLWNhbm5vdF9pbmNsdWRlX3NlbGYtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJVc2VDYXNlLWNhbm5vdF9pbmNsdWRlX3NlbGYiPgotICAgICAgICAgIDxib2R5PkEgVXNlQ2FzZSBjYW5ub3QgaW5jbHVkZSBVc2VDYXNlcyB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5jbHVkZSBpdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVXNlQ2FzZS1jYW5ub3RfaW5jbHVkZV9zZWxmLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5ub3QgYWxsSW5jbHVkZWRVc2VDYXNlcygpLT5pbmNsdWRlcyhzZWxmKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVXNlQ2FzZS1tdXN0X2hhdmVfbmFtZSIgbmFtZT0ibXVzdF9oYXZlX25hbWUiIGNvbnN0cmFpbmVkRWxlbWVudD0iVXNlQ2FzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVc2VDYXNlLW11c3RfaGF2ZV9uYW1lLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVXNlQ2FzZS1tdXN0X2hhdmVfbmFtZSI+Ci0gICAgICAgICAgPGJvZHk+QSBVc2VDYXNlIG11c3QgaGF2ZSBhIG5hbWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlVzZUNhc2UtbXVzdF9oYXZlX25hbWUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5Pm5hbWUgLT4gbm90RW1wdHkgKCk8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iVXNlQ2FzZS1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQmVoYXZpb3JlZENsYXNzaWZpZXIiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlVzZUNhc2UtZXh0ZW5kIiBuYW1lPSJleHRlbmQiIHR5cGU9IkV4dGVuZCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkFfc291cmNlX2RpcmVjdGVkUmVsYXRpb25zaGlwLWRpcmVjdGVkUmVsYXRpb25zaGlwIE5hbWVzcGFjZS1vd25lZE1lbWJlciIgYXNzb2NpYXRpb249IkFfZXh0ZW5kX2V4dGVuc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVc2VDYXNlLWV4dGVuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlVzZUNhc2UtZXh0ZW5kIj4KLSAgICAgICAgICA8Ym9keT5UaGUgRXh0ZW5kIHJlbGF0aW9uc2hpcHMgb3duZWQgYnkgdGhpcyBVc2VDYXNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVXNlQ2FzZS1leHRlbmQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJVc2VDYXNlLWV4dGVuZC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJVc2VDYXNlLWV4dGVuc2lvblBvaW50IiBuYW1lPSJleHRlbnNpb25Qb2ludCIgdHlwZT0iRXh0ZW5zaW9uUG9pbnQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJOYW1lc3BhY2Utb3duZWRNZW1iZXIiIGFzc29jaWF0aW9uPSJBX2V4dGVuc2lvblBvaW50X3VzZUNhc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVXNlQ2FzZS1leHRlbnNpb25Qb2ludC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlVzZUNhc2UtZXh0ZW5zaW9uUG9pbnQiPgotICAgICAgICAgIDxib2R5PlRoZSBFeHRlbnNpb25Qb2ludHMgb3duZWQgYnkgdGhpcyBVc2VDYXNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVXNlQ2FzZS1leHRlbnNpb25Qb2ludC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlVzZUNhc2UtZXh0ZW5zaW9uUG9pbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVXNlQ2FzZS1pbmNsdWRlIiBuYW1lPSJpbmNsdWRlIiB0eXBlPSJJbmNsdWRlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV9zb3VyY2VfZGlyZWN0ZWRSZWxhdGlvbnNoaXAtZGlyZWN0ZWRSZWxhdGlvbnNoaXAgTmFtZXNwYWNlLW93bmVkTWVtYmVyIiBhc3NvY2lhdGlvbj0iQV9pbmNsdWRlX2luY2x1ZGluZ0Nhc2UiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVXNlQ2FzZS1pbmNsdWRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVXNlQ2FzZS1pbmNsdWRlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgSW5jbHVkZSByZWxhdGlvbnNoaXBzIG93bmVkIGJ5IHRoaXMgVXNlQ2FzZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlVzZUNhc2UtaW5jbHVkZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlVzZUNhc2UtaW5jbHVkZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJVc2VDYXNlLXN1YmplY3QiIG5hbWU9InN1YmplY3QiIHR5cGU9IkNsYXNzaWZpZXIiIGFzc29jaWF0aW9uPSJBX3N1YmplY3RfdXNlQ2FzZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJVc2VDYXNlLXN1YmplY3QtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJVc2VDYXNlLXN1YmplY3QiPgotICAgICAgICAgIDxib2R5PlRoZSBzdWJqZWN0cyB0byB3aGljaCB0aGlzIFVzZUNhc2UgYXBwbGllcy4gRWFjaCBzdWJqZWN0IG9yIGl0cyBwYXJ0cyByZWFsaXplIGFsbCB0aGUgVXNlQ2FzZXMgdGhhdCBhcHBseSB0byBpdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlVzZUNhc2Utc3ViamVjdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IlVzZUNhc2Utc3ViamVjdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJVc2VDYXNlLWFsbEluY2x1ZGVkVXNlQ2FzZXMiIG5hbWU9ImFsbEluY2x1ZGVkVXNlQ2FzZXMiIGJvZHlDb25kaXRpb249IlVzZUNhc2UtYWxsSW5jbHVkZWRVc2VDYXNlcy1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlVzZUNhc2UtYWxsSW5jbHVkZWRVc2VDYXNlcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlVzZUNhc2UtYWxsSW5jbHVkZWRVc2VDYXNlcyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGFsbEluY2x1ZGVkVXNlQ2FzZXMoKSByZXR1cm5zIHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIFVzZUNhc2VzIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBpbmNsdWRlZCBieSB0aGlzIFVzZUNhc2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlVzZUNhc2UtYWxsSW5jbHVkZWRVc2VDYXNlcy1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlVzZUNhc2UtYWxsSW5jbHVkZWRVc2VDYXNlcyI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlVzZUNhc2UtYWxsSW5jbHVkZWRVc2VDYXNlcy1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHNlbGYuaW5jbHVkZS5hZGRpdGlvbi0+dW5pb24oc2VsZi5pbmNsdWRlLmFkZGl0aW9uLT5jb2xsZWN0KHVjIHwgdWMuYWxsSW5jbHVkZWRVc2VDYXNlcygpKSktPmFzU2V0KCkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlVzZUNhc2UtYWxsSW5jbHVkZWRVc2VDYXNlcy1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iVXNlQ2FzZSIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVXNlQ2FzZS1hbGxJbmNsdWRlZFVzZUNhc2VzLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iVXNlQ2FzZS1hbGxJbmNsdWRlZFVzZUNhc2VzLXJlc3VsdC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZXh0ZW5zaW9uUG9pbnRfdXNlQ2FzZSIgbmFtZT0iQV9leHRlbnNpb25Qb2ludF91c2VDYXNlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlVzZUNhc2UtZXh0ZW5zaW9uUG9pbnQgRXh0ZW5zaW9uUG9pbnQtdXNlQ2FzZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2luY2x1ZGVfaW5jbHVkaW5nQ2FzZSIgbmFtZT0iQV9pbmNsdWRlX2luY2x1ZGluZ0Nhc2UiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVXNlQ2FzZS1pbmNsdWRlIEluY2x1ZGUtaW5jbHVkaW5nQ2FzZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3N1YmplY3RfdXNlQ2FzZSIgbmFtZT0iQV9zdWJqZWN0X3VzZUNhc2UiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iVXNlQ2FzZS1zdWJqZWN0IENsYXNzaWZpZXItdXNlQ2FzZSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2V4dGVuZF9leHRlbnNpb24iIG5hbWU9IkFfZXh0ZW5kX2V4dGVuc2lvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJVc2VDYXNlLWV4dGVuZCBFeHRlbmQtZXh0ZW5zaW9uIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfYWRkaXRpb25faW5jbHVkZSIgbmFtZT0iQV9hZGRpdGlvbl9pbmNsdWRlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkluY2x1ZGUtYWRkaXRpb24gQV9hZGRpdGlvbl9pbmNsdWRlLWluY2x1ZGUiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9hZGRpdGlvbl9pbmNsdWRlLWluY2x1ZGUiIG5hbWU9ImluY2x1ZGUiIHR5cGU9IkluY2x1ZGUiIHN1YnNldHRlZFByb3BlcnR5PSJBX3RhcmdldF9kaXJlY3RlZFJlbGF0aW9uc2hpcC1kaXJlY3RlZFJlbGF0aW9uc2hpcCIgYXNzb2NpYXRpb249IkFfYWRkaXRpb25faW5jbHVkZSI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9hZGRpdGlvbl9pbmNsdWRlLWluY2x1ZGUtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2FkZGl0aW9uX2luY2x1ZGUtaW5jbHVkZS1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfZXh0ZW5zaW9uTG9jYXRpb25fZXh0ZW5zaW9uIiBuYW1lPSJBX2V4dGVuc2lvbkxvY2F0aW9uX2V4dGVuc2lvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJFeHRlbmQtZXh0ZW5zaW9uTG9jYXRpb24gQV9leHRlbnNpb25Mb2NhdGlvbl9leHRlbnNpb24tZXh0ZW5zaW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZXh0ZW5zaW9uTG9jYXRpb25fZXh0ZW5zaW9uLWV4dGVuc2lvbiIgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJFeHRlbmQiIGFzc29jaWF0aW9uPSJBX2V4dGVuc2lvbkxvY2F0aW9uX2V4dGVuc2lvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9leHRlbnNpb25Mb2NhdGlvbl9leHRlbnNpb24tZXh0ZW5zaW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9leHRlbnNpb25Mb2NhdGlvbl9leHRlbnNpb24tZXh0ZW5zaW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9jb25kaXRpb25fZXh0ZW5kIiBuYW1lPSJBX2NvbmRpdGlvbl9leHRlbmQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRXh0ZW5kLWNvbmRpdGlvbiBBX2NvbmRpdGlvbl9leHRlbmQtZXh0ZW5kIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfY29uZGl0aW9uX2V4dGVuZC1leHRlbmQiIG5hbWU9ImV4dGVuZCIgdHlwZT0iRXh0ZW5kIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iRWxlbWVudC1vd25lciIgYXNzb2NpYXRpb249IkFfY29uZGl0aW9uX2V4dGVuZCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9jb25kaXRpb25fZXh0ZW5kLWV4dGVuZC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9leHRlbmRlZENhc2VfZXh0ZW5kIiBuYW1lPSJBX2V4dGVuZGVkQ2FzZV9leHRlbmQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRXh0ZW5kLWV4dGVuZGVkQ2FzZSBBX2V4dGVuZGVkQ2FzZV9leHRlbmQtZXh0ZW5kIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfZXh0ZW5kZWRDYXNlX2V4dGVuZC1leHRlbmQiIG5hbWU9ImV4dGVuZCIgdHlwZT0iRXh0ZW5kIiBzdWJzZXR0ZWRQcm9wZXJ0eT0iQV90YXJnZXRfZGlyZWN0ZWRSZWxhdGlvbnNoaXAtZGlyZWN0ZWRSZWxhdGlvbnNoaXAiIGFzc29jaWF0aW9uPSJBX2V4dGVuZGVkQ2FzZV9leHRlbmQiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZXh0ZW5kZWRDYXNlX2V4dGVuZC1leHRlbmQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2V4dGVuZGVkQ2FzZV9leHRlbmQtZXh0ZW5kLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iRHVyYXRpb24iIG5hbWU9IkR1cmF0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEdXJhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkR1cmF0aW9uIj4KLSAgICAgICAgPGJvZHk+QSBEdXJhdGlvbiBpcyBhIFZhbHVlU3BlY2lmaWNhdGlvbiB0aGF0IHNwZWNpZmllcyB0aGUgdGVtcG9yYWwgZGlzdGFuY2UgYmV0d2VlbiB0d28gdGltZSBpbnN0YW50cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJEdXJhdGlvbi1ub19leHByX3JlcXVpcmVzX29ic2VydmF0aW9uIiBuYW1lPSJub19leHByX3JlcXVpcmVzX29ic2VydmF0aW9uIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkR1cmF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkR1cmF0aW9uLW5vX2V4cHJfcmVxdWlyZXNfb2JzZXJ2YXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEdXJhdGlvbi1ub19leHByX3JlcXVpcmVzX29ic2VydmF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5JZiBhIER1cmF0aW9uIGhhcyBubyBleHByLCB0aGVuIGl0IG11c3QgaGF2ZSBhIHNpbmdsZSBvYnNlcnZhdGlvbiB0aGF0IGlzIGEgRHVyYXRpb25PYnNlcnZhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iRHVyYXRpb24tbm9fZXhwcl9yZXF1aXJlc19vYnNlcnZhdGlvbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+ZXhwciA9IG51bGwgaW1wbGllcyAob2JzZXJ2YXRpb24tPnNpemUoKSA9IDEgYW5kIG9ic2VydmF0aW9uLT5mb3JBbGwob2NsSXNLaW5kT2YoRHVyYXRpb25PYnNlcnZhdGlvbikpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJEdXJhdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iVmFsdWVTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJEdXJhdGlvbi1leHByIiBuYW1lPSJleHByIiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfZXhwcl9kdXJhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEdXJhdGlvbi1leHByLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRHVyYXRpb24tZXhwciI+Ci0gICAgICAgICAgPGJvZHk+QSBWYWx1ZVNwZWNpZmljYXRpb24gdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIHRoZSBEdXJhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkR1cmF0aW9uLWV4cHItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJEdXJhdGlvbi1vYnNlcnZhdGlvbiIgbmFtZT0ib2JzZXJ2YXRpb24iIHR5cGU9Ik9ic2VydmF0aW9uIiBhc3NvY2lhdGlvbj0iQV9vYnNlcnZhdGlvbl9kdXJhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEdXJhdGlvbi1vYnNlcnZhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkR1cmF0aW9uLW9ic2VydmF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcnMgdG8gdGhlIE9ic2VydmF0aW9ucyB0aGF0IGFyZSBpbnZvbHZlZCBpbiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIER1cmF0aW9uIHZhbHVlPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJEdXJhdGlvbi1vYnNlcnZhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkR1cmF0aW9uLW9ic2VydmF0aW9uLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkR1cmF0aW9uLXN0cmluZ1ZhbHVlIiBuYW1lPSJzdHJpbmdWYWx1ZSIgdmlzaWJpbGl0eT0icHJvdGVjdGVkIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iRHVyYXRpb24tc3RyaW5nVmFsdWUtX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkR1cmF0aW9uQ29uc3RyYWludCIgbmFtZT0iRHVyYXRpb25Db25zdHJhaW50Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEdXJhdGlvbkNvbnN0cmFpbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEdXJhdGlvbkNvbnN0cmFpbnQiPgotICAgICAgICA8Ym9keT5BIER1cmF0aW9uQ29uc3RyYWludCBpcyBhIENvbnN0cmFpbnQgdGhhdCByZWZlcnMgdG8gYSBEdXJhdGlvbkludGVydmFsLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkR1cmF0aW9uQ29uc3RyYWludC1maXJzdF9ldmVudF9tdWx0aXBsaWNpdHkiIG5hbWU9ImZpcnN0X2V2ZW50X211bHRpcGxpY2l0eSIgY29uc3RyYWluZWRFbGVtZW50PSJEdXJhdGlvbkNvbnN0cmFpbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRHVyYXRpb25Db25zdHJhaW50LWZpcnN0X2V2ZW50X211bHRpcGxpY2l0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkR1cmF0aW9uQ29uc3RyYWludC1maXJzdF9ldmVudF9tdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgZmlyc3RFdmVudCBtdXN0IGJlIDIgaWYgdGhlIG11bHRpcGxpY2l0eSBvZiBjb25zdHJhaW5lZEVsZW1lbnQgaXMgMi4gT3RoZXJ3aXNlIHRoZSBtdWx0aXBsaWNpdHkgb2YgZmlyc3RFdmVudCBpcyAwLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJEdXJhdGlvbkNvbnN0cmFpbnQtZmlyc3RfZXZlbnRfbXVsdGlwbGljaXR5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pZiAoY29uc3RyYWluZWRFbGVtZW50LT5zaXplKCkgPSAyKSYjeEQ7Ci0gIHRoZW4gKGZpcnN0RXZlbnQtPnNpemUoKSA9IDIpIGVsc2UgKGZpcnN0RXZlbnQtPnNpemUoKSA9IDApICYjeEQ7Ci1lbmRpZjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRHVyYXRpb25Db25zdHJhaW50LWhhc19vbmVfb3JfdHdvX2NvbnN0cmFpbmVkRWxlbWVudHMiIG5hbWU9Imhhc19vbmVfb3JfdHdvX2NvbnN0cmFpbmVkRWxlbWVudHMiIGNvbnN0cmFpbmVkRWxlbWVudD0iRHVyYXRpb25Db25zdHJhaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkR1cmF0aW9uQ29uc3RyYWludC1oYXNfb25lX29yX3R3b19jb25zdHJhaW5lZEVsZW1lbnRzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRHVyYXRpb25Db25zdHJhaW50LWhhc19vbmVfb3JfdHdvX2NvbnN0cmFpbmVkRWxlbWVudHMiPgotICAgICAgICAgIDxib2R5PkEgRHVyYXRpb25Db25zdHJhaW50IGhhcyBlaXRoZXIgb25lIG9yIHR3byBjb25zdHJhaW5lZEVsZW1lbnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJEdXJhdGlvbkNvbnN0cmFpbnQtaGFzX29uZV9vcl90d29fY29uc3RyYWluZWRFbGVtZW50cy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+Y29uc3RyYWluZWRFbGVtZW50LT5zaXplKCkgPSAxIG9yIGNvbnN0cmFpbmVkRWxlbWVudC0+c2l6ZSgpPTI8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRHVyYXRpb25Db25zdHJhaW50LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJJbnRlcnZhbENvbnN0cmFpbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkR1cmF0aW9uQ29uc3RyYWludC1maXJzdEV2ZW50IiBuYW1lPSJmaXJzdEV2ZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkR1cmF0aW9uQ29uc3RyYWludC1maXJzdEV2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRHVyYXRpb25Db25zdHJhaW50LWZpcnN0RXZlbnQiPgotICAgICAgICAgIDxib2R5PlRoZSB2YWx1ZSBvZiBmaXJzdEV2ZW50W2ldIGlzIHJlbGF0ZWQgdG8gY29uc3RyYWluZWRFbGVtZW50W2ldICh3aGVyZSBpIGlzIDEgb3IgMikuIElmIGZpcnN0RXZlbnRbaV0gaXMgdHJ1ZSwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBvYnNlcnZhdGlvbiBldmVudCBpcyB0aGUgZmlyc3QgdGltZSBpbnN0YW50IHRoZSBleGVjdXRpb24gZW50ZXJzIGNvbnN0cmFpbmVkRWxlbWVudFtpXS4gSWYgZmlyc3RFdmVudFtpXSBpcyBmYWxzZSwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBvYnNlcnZhdGlvbiBldmVudCBpcyB0aGUgbGFzdCB0aW1lIGluc3RhbnQgdGhlIGV4ZWN1dGlvbiBpcyB3aXRoaW4gY29uc3RyYWluZWRFbGVtZW50W2ldLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJEdXJhdGlvbkNvbnN0cmFpbnQtZmlyc3RFdmVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkR1cmF0aW9uQ29uc3RyYWludC1maXJzdEV2ZW50LV91cHBlclZhbHVlIiB2YWx1ZT0iMiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkR1cmF0aW9uQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uIiBuYW1lPSJzcGVjaWZpY2F0aW9uIiB0eXBlPSJEdXJhdGlvbkludGVydmFsIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiByZWRlZmluZWRQcm9wZXJ0eT0iSW50ZXJ2YWxDb25zdHJhaW50LXNwZWNpZmljYXRpb24gQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uIiBhc3NvY2lhdGlvbj0iQV9zcGVjaWZpY2F0aW9uX2R1cmF0aW9uQ29uc3RyYWludCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEdXJhdGlvbkNvbnN0cmFpbnQtc3BlY2lmaWNhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkR1cmF0aW9uQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgRHVyYXRpb25JbnRlcnZhbCBjb25zdHJhaW5pbmcgdGhlIGR1cmF0aW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJEdXJhdGlvbkludGVydmFsIiBuYW1lPSJEdXJhdGlvbkludGVydmFsIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEdXJhdGlvbkludGVydmFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRHVyYXRpb25JbnRlcnZhbCI+Ci0gICAgICAgIDxib2R5PkEgRHVyYXRpb25JbnRlcnZhbCBkZWZpbmVzIHRoZSByYW5nZSBiZXR3ZWVuIHR3byBEdXJhdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJEdXJhdGlvbkludGVydmFsLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJJbnRlcnZhbCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRHVyYXRpb25JbnRlcnZhbC1tYXgiIG5hbWU9Im1heCIgdHlwZT0iRHVyYXRpb24iIHJlZGVmaW5lZFByb3BlcnR5PSJJbnRlcnZhbC1tYXgiIGFzc29jaWF0aW9uPSJBX21heF9kdXJhdGlvbkludGVydmFsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkR1cmF0aW9uSW50ZXJ2YWwtbWF4LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRHVyYXRpb25JbnRlcnZhbC1tYXgiPgotICAgICAgICAgIDxib2R5PlJlZmVycyB0byB0aGUgRHVyYXRpb24gZGVub3RpbmcgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHJhbmdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRHVyYXRpb25JbnRlcnZhbC1taW4iIG5hbWU9Im1pbiIgdHlwZT0iRHVyYXRpb24iIHJlZGVmaW5lZFByb3BlcnR5PSJJbnRlcnZhbC1taW4iIGFzc29jaWF0aW9uPSJBX21pbl9kdXJhdGlvbkludGVydmFsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkR1cmF0aW9uSW50ZXJ2YWwtbWluLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRHVyYXRpb25JbnRlcnZhbC1taW4iPgotICAgICAgICAgIDxib2R5PlJlZmVycyB0byB0aGUgRHVyYXRpb24gZGVub3RpbmcgdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHJhbmdlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJEdXJhdGlvbk9ic2VydmF0aW9uIiBuYW1lPSJEdXJhdGlvbk9ic2VydmF0aW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEdXJhdGlvbk9ic2VydmF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRHVyYXRpb25PYnNlcnZhdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgRHVyYXRpb25PYnNlcnZhdGlvbiBpcyBhIHJlZmVyZW5jZSB0byBhIGR1cmF0aW9uIGR1cmluZyBhbiBleGVjdXRpb24uIEl0IHBvaW50cyBvdXQgdGhlIE5hbWVkRWxlbWVudChzKSBpbiB0aGUgbW9kZWwgdG8gb2JzZXJ2ZSBhbmQgd2hldGhlciB0aGUgb2JzZXJ2YXRpb25zIGFyZSB3aGVuIHRoaXMgTmFtZWRFbGVtZW50IGlzIGVudGVyZWQgb3Igd2hlbiBpdCBpcyBleGl0ZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iRHVyYXRpb25PYnNlcnZhdGlvbi1maXJzdF9ldmVudF9tdWx0aXBsaWNpdHkiIG5hbWU9ImZpcnN0X2V2ZW50X211bHRpcGxpY2l0eSIgY29uc3RyYWluZWRFbGVtZW50PSJEdXJhdGlvbk9ic2VydmF0aW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkR1cmF0aW9uT2JzZXJ2YXRpb24tZmlyc3RfZXZlbnRfbXVsdGlwbGljaXR5LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRHVyYXRpb25PYnNlcnZhdGlvbi1maXJzdF9ldmVudF9tdWx0aXBsaWNpdHkiPgotICAgICAgICAgIDxib2R5PlRoZSBtdWx0aXBsaWNpdHkgb2YgZmlyc3RFdmVudCBtdXN0IGJlIDIgaWYgdGhlIG11bHRpcGxpY2l0eSBvZiBldmVudCBpcyAyLiBPdGhlcndpc2UgdGhlIG11bHRpcGxpY2l0eSBvZiBmaXJzdEV2ZW50IGlzIDAuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkR1cmF0aW9uT2JzZXJ2YXRpb24tZmlyc3RfZXZlbnRfbXVsdGlwbGljaXR5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pZiAoZXZlbnQtPnNpemUoKSA9IDIpJiN4RDsKLSAgdGhlbiAoZmlyc3RFdmVudC0+c2l6ZSgpID0gMikgZWxzZSAoZmlyc3RFdmVudC0+c2l6ZSgpID0gMCkmI3hEOwotZW5kaWY8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iRHVyYXRpb25PYnNlcnZhdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iT2JzZXJ2YXRpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkR1cmF0aW9uT2JzZXJ2YXRpb24tZXZlbnQiIG5hbWU9ImV2ZW50IiB0eXBlPSJOYW1lZEVsZW1lbnQiIGlzT3JkZXJlZD0idHJ1ZSIgYXNzb2NpYXRpb249IkFfZXZlbnRfZHVyYXRpb25PYnNlcnZhdGlvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEdXJhdGlvbk9ic2VydmF0aW9uLWV2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRHVyYXRpb25PYnNlcnZhdGlvbi1ldmVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIER1cmF0aW9uT2JzZXJ2YXRpb24gaXMgZGV0ZXJtaW5lZCBhcyB0aGUgZHVyYXRpb24gYmV0d2VlbiB0aGUgZW50ZXJpbmcgb3IgZXhpdGluZyBvZiBhIHNpbmdsZSBldmVudCBFbGVtZW50IGR1cmluZyBleGVjdXRpb24sIG9yIHRoZSBlbnRlcmluZy9leGl0aW5nIG9mIG9uZSBldmVudCBFbGVtZW50IGFuZCB0aGUgZW50ZXJpbmcvZXhpdGluZyBvZiBhIHNlY29uZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkR1cmF0aW9uT2JzZXJ2YXRpb24tZXZlbnQtX3VwcGVyVmFsdWUiIHZhbHVlPSIyIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRHVyYXRpb25PYnNlcnZhdGlvbi1maXJzdEV2ZW50IiBuYW1lPSJmaXJzdEV2ZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkR1cmF0aW9uT2JzZXJ2YXRpb24tZmlyc3RFdmVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkR1cmF0aW9uT2JzZXJ2YXRpb24tZmlyc3RFdmVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHZhbHVlIG9mIGZpcnN0RXZlbnRbaV0gaXMgcmVsYXRlZCB0byBldmVudFtpXSAod2hlcmUgaSBpcyAxIG9yIDIpLiBJZiBmaXJzdEV2ZW50W2ldIGlzIHRydWUsIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgb2JzZXJ2YXRpb24gZXZlbnQgaXMgdGhlIGZpcnN0IHRpbWUgaW5zdGFudCB0aGUgZXhlY3V0aW9uIGVudGVycyBldmVudFtpXS4gSWYgZmlyc3RFdmVudFtpXSBpcyBmYWxzZSwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBvYnNlcnZhdGlvbiBldmVudCBpcyB0aGUgdGltZSBpbnN0YW50IHRoZSBleGVjdXRpb24gZXhpdHMgZXZlbnRbaV0uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkR1cmF0aW9uT2JzZXJ2YXRpb24tZmlyc3RFdmVudC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkR1cmF0aW9uT2JzZXJ2YXRpb24tZmlyc3RFdmVudC1fdXBwZXJWYWx1ZSIgdmFsdWU9IjIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkV4cHJlc3Npb24iIG5hbWU9IkV4cHJlc3Npb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkV4cHJlc3Npb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFeHByZXNzaW9uIj4KLSAgICAgICAgPGJvZHk+QW4gRXhwcmVzc2lvbiByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBleHByZXNzaW9uIHRyZWUsIHdoaWNoIG1heSBiZSBub24tdGVybWluYWwgb3IgdGVybWluYWwuIEl0IGRlZmluZXMgYSBzeW1ib2wsIGFuZCBoYXMgYSBwb3NzaWJseSBlbXB0eSBzZXF1ZW5jZSBvZiBvcGVyYW5kcyB0aGF0IGFyZSBWYWx1ZVNwZWNpZmljYXRpb25zLiBJdCBkZW5vdGVzIGEgKHBvc3NpYmx5IGVtcHR5KSBzZXQgb2YgdmFsdWVzIHdoZW4gZXZhbHVhdGVkIGluIGEgY29udGV4dC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkV4cHJlc3Npb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlZhbHVlU3BlY2lmaWNhdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRXhwcmVzc2lvbi1vcGVyYW5kIiBuYW1lPSJvcGVyYW5kIiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb24iIGlzT3JkZXJlZD0idHJ1ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9vcGVyYW5kX2V4cHJlc3Npb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhwcmVzc2lvbi1vcGVyYW5kLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRXhwcmVzc2lvbi1vcGVyYW5kIj4KLSAgICAgICAgICA8Ym9keT5TcGVjaWZpZXMgYSBzZXF1ZW5jZSBvZiBvcGVyYW5kIFZhbHVlU3BlY2lmaWNhdGlvbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFeHByZXNzaW9uLW9wZXJhbmQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJFeHByZXNzaW9uLW9wZXJhbmQtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRXhwcmVzc2lvbi1zeW1ib2wiIG5hbWU9InN5bWJvbCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFeHByZXNzaW9uLXN5bWJvbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4cHJlc3Npb24tc3ltYm9sIj4KLSAgICAgICAgICA8Ym9keT5UaGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUgaW4gdGhlIGV4cHJlc3Npb24gdHJlZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJFeHByZXNzaW9uLXN5bWJvbC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iSW50ZXJ2YWwiIG5hbWU9IkludGVydmFsIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcnZhbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVydmFsIj4KLSAgICAgICAgPGJvZHk+QW4gSW50ZXJ2YWwgZGVmaW5lcyB0aGUgcmFuZ2UgYmV0d2VlbiB0d28gVmFsdWVTcGVjaWZpY2F0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkludGVydmFsLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJWYWx1ZVNwZWNpZmljYXRpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVydmFsLW1heCIgbmFtZT0ibWF4IiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb24iIGFzc29jaWF0aW9uPSJBX21heF9pbnRlcnZhbCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcnZhbC1tYXgtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcnZhbC1tYXgiPgotICAgICAgICAgIDxib2R5PlJlZmVycyB0byB0aGUgVmFsdWVTcGVjaWZpY2F0aW9uIGRlbm90aW5nIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSByYW5nZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVydmFsLW1pbiIgbmFtZT0ibWluIiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb24iIGFzc29jaWF0aW9uPSJBX21pbl9pbnRlcnZhbCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbnRlcnZhbC1taW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcnZhbC1taW4iPgotICAgICAgICAgIDxib2R5PlJlZmVycyB0byB0aGUgVmFsdWVTcGVjaWZpY2F0aW9uIGRlbm90aW5nIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSByYW5nZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iSW50ZXJ2YWxDb25zdHJhaW50IiBuYW1lPSJJbnRlcnZhbENvbnN0cmFpbnQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkludGVydmFsQ29uc3RyYWludC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkludGVydmFsQ29uc3RyYWludCI+Ci0gICAgICAgIDxib2R5PkFuIEludGVydmFsQ29uc3RyYWludCBpcyBhIENvbnN0cmFpbnQgdGhhdCBpcyBzcGVjaWZpZWQgYnkgYW4gSW50ZXJ2YWwuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJJbnRlcnZhbENvbnN0cmFpbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkNvbnN0cmFpbnQiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkludGVydmFsQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uIiBuYW1lPSJzcGVjaWZpY2F0aW9uIiB0eXBlPSJJbnRlcnZhbCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgcmVkZWZpbmVkUHJvcGVydHk9IkNvbnN0cmFpbnQtc3BlY2lmaWNhdGlvbiIgYXNzb2NpYXRpb249IkFfc3BlY2lmaWNhdGlvbl9pbnRlcnZhbENvbnN0cmFpbnQiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW50ZXJ2YWxDb25zdHJhaW50LXNwZWNpZmljYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbnRlcnZhbENvbnN0cmFpbnQtc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIEludGVydmFsIHRoYXQgc3BlY2lmaWVzIHRoZSBjb25kaXRpb24gb2YgdGhlIEludGVydmFsQ29uc3RyYWludC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iTGl0ZXJhbEJvb2xlYW4iIG5hbWU9IkxpdGVyYWxCb29sZWFuIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaXRlcmFsQm9vbGVhbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpdGVyYWxCb29sZWFuIj4KLSAgICAgICAgPGJvZHk+QSBMaXRlcmFsQm9vbGVhbiBpcyBhIHNwZWNpZmljYXRpb24gb2YgYSBCb29sZWFuIHZhbHVlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iTGl0ZXJhbEJvb2xlYW4tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkxpdGVyYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMaXRlcmFsQm9vbGVhbi12YWx1ZSIgbmFtZT0idmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGl0ZXJhbEJvb2xlYW4tdmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaXRlcmFsQm9vbGVhbi12YWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNwZWNpZmllZCBCb29sZWFuIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9IkxpdGVyYWxCb29sZWFuLXZhbHVlLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJMaXRlcmFsQm9vbGVhbi1zdHJpbmdWYWx1ZSIgbmFtZT0ic3RyaW5nVmFsdWUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkxpdGVyYWxCb29sZWFuLXN0cmluZ1ZhbHVlLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTGl0ZXJhbEJvb2xlYW4tYm9vbGVhblZhbHVlIiBuYW1lPSJib29sZWFuVmFsdWUiIGJvZHlDb25kaXRpb249IkxpdGVyYWxCb29sZWFuLWJvb2xlYW5WYWx1ZS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IlZhbHVlU3BlY2lmaWNhdGlvbi1ib29sZWFuVmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGl0ZXJhbEJvb2xlYW4tYm9vbGVhblZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGl0ZXJhbEJvb2xlYW4tYm9vbGVhblZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgYm9vbGVhblZhbHVlKCkgZ2l2ZXMgdGhlIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaXRlcmFsQm9vbGVhbi1ib29sZWFuVmFsdWUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJMaXRlcmFsQm9vbGVhbi1ib29sZWFuVmFsdWUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaXRlcmFsQm9vbGVhbi1ib29sZWFuVmFsdWUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICh2YWx1ZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTGl0ZXJhbEJvb2xlYW4tYm9vbGVhblZhbHVlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkxpdGVyYWxCb29sZWFuLWlzQ29tcHV0YWJsZSIgbmFtZT0iaXNDb21wdXRhYmxlIiBib2R5Q29uZGl0aW9uPSJMaXRlcmFsQm9vbGVhbi1pc0NvbXB1dGFibGUtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJWYWx1ZVNwZWNpZmljYXRpb24taXNDb21wdXRhYmxlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxCb29sZWFuLWlzQ29tcHV0YWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpdGVyYWxCb29sZWFuLWlzQ29tcHV0YWJsZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzQ29tcHV0YWJsZSgpIGlzIHJlZGVmaW5lZCB0byBiZSB0cnVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaXRlcmFsQm9vbGVhbi1pc0NvbXB1dGFibGUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJMaXRlcmFsQm9vbGVhbi1pc0NvbXB1dGFibGUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaXRlcmFsQm9vbGVhbi1pc0NvbXB1dGFibGUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICh0cnVlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJMaXRlcmFsQm9vbGVhbi1pc0NvbXB1dGFibGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJMaXRlcmFsSW50ZWdlciIgbmFtZT0iTGl0ZXJhbEludGVnZXIiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxJbnRlZ2VyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGl0ZXJhbEludGVnZXIiPgotICAgICAgICA8Ym9keT5BIExpdGVyYWxJbnRlZ2VyIGlzIGEgc3BlY2lmaWNhdGlvbiBvZiBhbiBJbnRlZ2VyIHZhbHVlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iTGl0ZXJhbEludGVnZXItX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkxpdGVyYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMaXRlcmFsSW50ZWdlci12YWx1ZSIgbmFtZT0idmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGl0ZXJhbEludGVnZXItdmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaXRlcmFsSW50ZWdlci12YWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNwZWNpZmllZCBJbnRlZ2VyIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkxpdGVyYWxJbnRlZ2VyLXZhbHVlLV9kZWZhdWx0VmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJMaXRlcmFsSW50ZWdlci1zdHJpbmdWYWx1ZSIgbmFtZT0ic3RyaW5nVmFsdWUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkxpdGVyYWxJbnRlZ2VyLXN0cmluZ1ZhbHVlLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTGl0ZXJhbEludGVnZXItaW50ZWdlclZhbHVlIiBuYW1lPSJpbnRlZ2VyVmFsdWUiIGJvZHlDb25kaXRpb249IkxpdGVyYWxJbnRlZ2VyLWludGVnZXJWYWx1ZS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IlZhbHVlU3BlY2lmaWNhdGlvbi1pbnRlZ2VyVmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGl0ZXJhbEludGVnZXItaW50ZWdlclZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGl0ZXJhbEludGVnZXItaW50ZWdlclZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaW50ZWdlclZhbHVlKCkgZ2l2ZXMgdGhlIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaXRlcmFsSW50ZWdlci1pbnRlZ2VyVmFsdWUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJMaXRlcmFsSW50ZWdlci1pbnRlZ2VyVmFsdWUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaXRlcmFsSW50ZWdlci1pbnRlZ2VyVmFsdWUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICh2YWx1ZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTGl0ZXJhbEludGVnZXItaW50ZWdlclZhbHVlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkxpdGVyYWxJbnRlZ2VyLWlzQ29tcHV0YWJsZSIgbmFtZT0iaXNDb21wdXRhYmxlIiBib2R5Q29uZGl0aW9uPSJMaXRlcmFsSW50ZWdlci1pc0NvbXB1dGFibGUtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJWYWx1ZVNwZWNpZmljYXRpb24taXNDb21wdXRhYmxlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxJbnRlZ2VyLWlzQ29tcHV0YWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpdGVyYWxJbnRlZ2VyLWlzQ29tcHV0YWJsZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzQ29tcHV0YWJsZSgpIGlzIHJlZGVmaW5lZCB0byBiZSB0cnVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaXRlcmFsSW50ZWdlci1pc0NvbXB1dGFibGUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJMaXRlcmFsSW50ZWdlci1pc0NvbXB1dGFibGUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaXRlcmFsSW50ZWdlci1pc0NvbXB1dGFibGUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICh0cnVlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJMaXRlcmFsSW50ZWdlci1pc0NvbXB1dGFibGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJMaXRlcmFsTnVsbCIgbmFtZT0iTGl0ZXJhbE51bGwiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxOdWxsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGl0ZXJhbE51bGwiPgotICAgICAgICA8Ym9keT5BIExpdGVyYWxOdWxsIHNwZWNpZmllcyB0aGUgbGFjayBvZiBhIHZhbHVlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iTGl0ZXJhbE51bGwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkxpdGVyYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJMaXRlcmFsTnVsbC1pc0NvbXB1dGFibGUiIG5hbWU9ImlzQ29tcHV0YWJsZSIgYm9keUNvbmRpdGlvbj0iTGl0ZXJhbE51bGwtaXNDb21wdXRhYmxlLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iVmFsdWVTcGVjaWZpY2F0aW9uLWlzQ29tcHV0YWJsZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaXRlcmFsTnVsbC1pc0NvbXB1dGFibGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaXRlcmFsTnVsbC1pc0NvbXB1dGFibGUiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpc0NvbXB1dGFibGUoKSBpcyByZWRlZmluZWQgdG8gYmUgdHJ1ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTGl0ZXJhbE51bGwtaXNDb21wdXRhYmxlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTGl0ZXJhbE51bGwtaXNDb21wdXRhYmxlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTGl0ZXJhbE51bGwtaXNDb21wdXRhYmxlLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAodHJ1ZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTGl0ZXJhbE51bGwtaXNDb21wdXRhYmxlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkxpdGVyYWxOdWxsLWlzTnVsbCIgbmFtZT0iaXNOdWxsIiBib2R5Q29uZGl0aW9uPSJMaXRlcmFsTnVsbC1pc051bGwtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJWYWx1ZVNwZWNpZmljYXRpb24taXNOdWxsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxOdWxsLWlzTnVsbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpdGVyYWxOdWxsLWlzTnVsbCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzTnVsbCgpIHJldHVybnMgdHJ1ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iTGl0ZXJhbE51bGwtaXNOdWxsLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTGl0ZXJhbE51bGwtaXNOdWxsIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTGl0ZXJhbE51bGwtaXNOdWxsLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAodHJ1ZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iTGl0ZXJhbE51bGwtaXNOdWxsLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iTGl0ZXJhbFJlYWwiIG5hbWU9IkxpdGVyYWxSZWFsIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaXRlcmFsUmVhbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpdGVyYWxSZWFsIj4KLSAgICAgICAgPGJvZHk+QSBMaXRlcmFsUmVhbCBpcyBhIHNwZWNpZmljYXRpb24gb2YgYSBSZWFsIHZhbHVlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iTGl0ZXJhbFJlYWwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkxpdGVyYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMaXRlcmFsUmVhbC12YWx1ZSIgbmFtZT0idmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGl0ZXJhbFJlYWwtdmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaXRlcmFsUmVhbC12YWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNwZWNpZmllZCBSZWFsIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJMaXRlcmFsUmVhbC1zdHJpbmdWYWx1ZSIgbmFtZT0ic3RyaW5nVmFsdWUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkxpdGVyYWxSZWFsLXN0cmluZ1ZhbHVlLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTGl0ZXJhbFJlYWwtaXNDb21wdXRhYmxlIiBuYW1lPSJpc0NvbXB1dGFibGUiIGJvZHlDb25kaXRpb249IkxpdGVyYWxSZWFsLWlzQ29tcHV0YWJsZS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IlZhbHVlU3BlY2lmaWNhdGlvbi1pc0NvbXB1dGFibGUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGl0ZXJhbFJlYWwtaXNDb21wdXRhYmxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGl0ZXJhbFJlYWwtaXNDb21wdXRhYmxlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNDb21wdXRhYmxlKCkgaXMgcmVkZWZpbmVkIHRvIGJlIHRydWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkxpdGVyYWxSZWFsLWlzQ29tcHV0YWJsZS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkxpdGVyYWxSZWFsLWlzQ29tcHV0YWJsZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkxpdGVyYWxSZWFsLWlzQ29tcHV0YWJsZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHRydWUpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkxpdGVyYWxSZWFsLWlzQ29tcHV0YWJsZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJMaXRlcmFsUmVhbC1yZWFsVmFsdWUiIG5hbWU9InJlYWxWYWx1ZSIgYm9keUNvbmRpdGlvbj0iTGl0ZXJhbFJlYWwtcmVhbFZhbHVlLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iVmFsdWVTcGVjaWZpY2F0aW9uLXJlYWxWYWx1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaXRlcmFsUmVhbC1yZWFsVmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaXRlcmFsUmVhbC1yZWFsVmFsdWUiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSByZWFsVmFsdWUoKSBnaXZlcyB0aGUgdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkxpdGVyYWxSZWFsLXJlYWxWYWx1ZS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkxpdGVyYWxSZWFsLXJlYWxWYWx1ZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkxpdGVyYWxSZWFsLXJlYWxWYWx1ZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHZhbHVlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJMaXRlcmFsUmVhbC1yZWFsVmFsdWUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJMaXRlcmFsU3BlY2lmaWNhdGlvbiIgbmFtZT0iTGl0ZXJhbFNwZWNpZmljYXRpb24iIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxTcGVjaWZpY2F0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGl0ZXJhbFNwZWNpZmljYXRpb24iPgotICAgICAgICA8Ym9keT5BIExpdGVyYWxTcGVjaWZpY2F0aW9uIGlkZW50aWZpZXMgYSBsaXRlcmFsIGNvbnN0YW50IGJlaW5nIG1vZGVsZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJMaXRlcmFsU3BlY2lmaWNhdGlvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iVmFsdWVTcGVjaWZpY2F0aW9uIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IkxpdGVyYWxTdHJpbmciIG5hbWU9IkxpdGVyYWxTdHJpbmciPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaXRlcmFsU3RyaW5nIj4KLSAgICAgICAgPGJvZHk+QSBMaXRlcmFsU3RyaW5nIGlzIGEgc3BlY2lmaWNhdGlvbiBvZiBhIFN0cmluZyB2YWx1ZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkxpdGVyYWxTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJMaXRlcmFsU3RyaW5nLXZhbHVlIiBuYW1lPSJ2YWx1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaXRlcmFsU3RyaW5nLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGl0ZXJhbFN0cmluZy12YWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHNwZWNpZmllZCBTdHJpbmcgdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iTGl0ZXJhbFN0cmluZy12YWx1ZS1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctaW50ZWdlclZhbHVlIiBuYW1lPSJpbnRlZ2VyVmFsdWUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctaW50ZWdlclZhbHVlLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctdW5saW1pdGVkVmFsdWUiIG5hbWU9InVubGltaXRlZFZhbHVlIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJMaXRlcmFsU3RyaW5nLXVubGltaXRlZFZhbHVlLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctaXNDb21wdXRhYmxlIiBuYW1lPSJpc0NvbXB1dGFibGUiIGJvZHlDb25kaXRpb249IkxpdGVyYWxTdHJpbmctaXNDb21wdXRhYmxlLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iVmFsdWVTcGVjaWZpY2F0aW9uLWlzQ29tcHV0YWJsZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaXRlcmFsU3RyaW5nLWlzQ29tcHV0YWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpdGVyYWxTdHJpbmctaXNDb21wdXRhYmxlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNDb21wdXRhYmxlKCkgaXMgcmVkZWZpbmVkIHRvIGJlIHRydWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctaXNDb21wdXRhYmxlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTGl0ZXJhbFN0cmluZy1pc0NvbXB1dGFibGUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaXRlcmFsU3RyaW5nLWlzQ29tcHV0YWJsZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHRydWUpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctaXNDb21wdXRhYmxlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctc3RyaW5nVmFsdWUiIG5hbWU9InN0cmluZ1ZhbHVlIiBib2R5Q29uZGl0aW9uPSJMaXRlcmFsU3RyaW5nLXN0cmluZ1ZhbHVlLXNwZWMiIGlzUXVlcnk9InRydWUiIHJlZGVmaW5lZE9wZXJhdGlvbj0iVmFsdWVTcGVjaWZpY2F0aW9uLXN0cmluZ1ZhbHVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctc3RyaW5nVmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJMaXRlcmFsU3RyaW5nLXN0cmluZ1ZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgc3RyaW5nVmFsdWUoKSBnaXZlcyB0aGUgdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkxpdGVyYWxTdHJpbmctc3RyaW5nVmFsdWUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJMaXRlcmFsU3RyaW5nLXN0cmluZ1ZhbHVlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iTGl0ZXJhbFN0cmluZy1zdHJpbmdWYWx1ZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHZhbHVlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJMaXRlcmFsU3RyaW5nLXN0cmluZ1ZhbHVlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgbmFtZT0iTGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiPgotICAgICAgICA8Ym9keT5BIExpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIGlzIGEgc3BlY2lmaWNhdGlvbiBvZiBhbiBVbmxpbWl0ZWROYXR1cmFsIG51bWJlci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJMaXRlcmFsU3BlY2lmaWNhdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTGl0ZXJhbFVubGltaXRlZE5hdHVyYWwtdmFsdWUiIG5hbWU9InZhbHVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTGl0ZXJhbFVubGltaXRlZE5hdHVyYWwtdmFsdWUiPgotICAgICAgICAgIDxib2R5PlRoZSBzcGVjaWZpZWQgVW5saW1pdGVkTmF0dXJhbCB2YWx1ZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC12YWx1ZS1fZGVmYXVsdFZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTGl0ZXJhbFVubGltaXRlZE5hdHVyYWwtc3RyaW5nVmFsdWUiIG5hbWU9InN0cmluZ1ZhbHVlIiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC1zdHJpbmdWYWx1ZS1fb3duZWRQYXJhbWV0ZXIuMCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsLWlzQ29tcHV0YWJsZSIgbmFtZT0iaXNDb21wdXRhYmxlIiBib2R5Q29uZGl0aW9uPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC1pc0NvbXB1dGFibGUtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJWYWx1ZVNwZWNpZmljYXRpb24taXNDb21wdXRhYmxlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsLWlzQ29tcHV0YWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsLWlzQ29tcHV0YWJsZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzQ29tcHV0YWJsZSgpIGlzIHJlZGVmaW5lZCB0byBiZSB0cnVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC1pc0NvbXB1dGFibGUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC1pc0NvbXB1dGFibGUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC1pc0NvbXB1dGFibGUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9ICh0cnVlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC1pc0NvbXB1dGFibGUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iTGl0ZXJhbFVubGltaXRlZE5hdHVyYWwtdW5saW1pdGVkVmFsdWUiIG5hbWU9InVubGltaXRlZFZhbHVlIiBib2R5Q29uZGl0aW9uPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC11bmxpbWl0ZWRWYWx1ZS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIiByZWRlZmluZWRPcGVyYXRpb249IlZhbHVlU3BlY2lmaWNhdGlvbi11bmxpbWl0ZWRWYWx1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC11bmxpbWl0ZWRWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsLXVubGltaXRlZFZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgdW5saW1pdGVkVmFsdWUoKSBnaXZlcyB0aGUgdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsLXVubGltaXRlZFZhbHVlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iTGl0ZXJhbFVubGltaXRlZE5hdHVyYWwtdW5saW1pdGVkVmFsdWUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC11bmxpbWl0ZWRWYWx1ZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKHZhbHVlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJMaXRlcmFsVW5saW1pdGVkTmF0dXJhbC11bmxpbWl0ZWRWYWx1ZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Ik9ic2VydmF0aW9uIiBuYW1lPSJPYnNlcnZhdGlvbiIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT2JzZXJ2YXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPYnNlcnZhdGlvbiI+Ci0gICAgICAgIDxib2R5Pk9ic2VydmF0aW9uIHNwZWNpZmllcyBhIHZhbHVlIGRldGVybWluZWQgYnkgb2JzZXJ2aW5nIGFuIGV2ZW50IG9yIGV2ZW50cyB0aGF0IG9jY3VyIHJlbGF0aXZlIHRvIG90aGVyIG1vZGVsIEVsZW1lbnRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iT2JzZXJ2YXRpb24tX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IlBhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uIiBuYW1lPSJPcGFxdWVFeHByZXNzaW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BhcXVlRXhwcmVzc2lvbiI+Ci0gICAgICAgIDxib2R5PkFuIE9wYXF1ZUV4cHJlc3Npb24gaXMgYSBWYWx1ZVNwZWNpZmljYXRpb24gdGhhdCBzcGVjaWZpZXMgdGhlIGNvbXB1dGF0aW9uIG9mIGEgY29sbGVjdGlvbiBvZiB2YWx1ZXMgZWl0aGVyIGluIHRlcm1zIG9mIGEgVU1MIEJlaGF2aW9yIG9yIGJhc2VkIG9uIGEgdGV4dHVhbCBzdGF0ZW1lbnQgaW4gYSBsYW5ndWFnZSBvdGhlciB0aGFuIFVNTDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tbGFuZ3VhZ2VfYm9keV9zaXplIiBuYW1lPSJsYW5ndWFnZV9ib2R5X3NpemUiIGNvbnN0cmFpbmVkRWxlbWVudD0iT3BhcXVlRXhwcmVzc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWxhbmd1YWdlX2JvZHlfc2l6ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wYXF1ZUV4cHJlc3Npb24tbGFuZ3VhZ2VfYm9keV9zaXplIj4KLSAgICAgICAgICA8Ym9keT5JZiB0aGUgbGFuZ3VhZ2UgYXR0cmlidXRlIGlzIG5vdCBlbXB0eSwgdGhlbiB0aGUgc2l6ZSBvZiB0aGUgYm9keSBhbmQgbGFuZ3VhZ2UgYXJyYXlzIG11c3QgYmUgdGhlIHNhbWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tbGFuZ3VhZ2VfYm9keV9zaXplLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5sYW5ndWFnZS0+bm90RW1wdHkoKSBpbXBsaWVzIChfJ2JvZHknLT5zaXplKCkgPSBsYW5ndWFnZS0+c2l6ZSgpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1vbmVfcmV0dXJuX3Jlc3VsdF9wYXJhbWV0ZXIiIG5hbWU9Im9uZV9yZXR1cm5fcmVzdWx0X3BhcmFtZXRlciIgY29uc3RyYWluZWRFbGVtZW50PSJPcGFxdWVFeHByZXNzaW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tb25lX3JldHVybl9yZXN1bHRfcGFyYW1ldGVyLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BhcXVlRXhwcmVzc2lvbi1vbmVfcmV0dXJuX3Jlc3VsdF9wYXJhbWV0ZXIiPgotICAgICAgICAgIDxib2R5PlRoZSBiZWhhdmlvciBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcmV0dXJuIHJlc3VsdCBwYXJhbWV0ZXIuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tb25lX3JldHVybl9yZXN1bHRfcGFyYW1ldGVyLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5iZWhhdmlvciAmbHQ7PiBudWxsIGltcGxpZXMmI3hEOwotICAgYmVoYXZpb3Iub3duZWRQYXJhbWV0ZXItPnNlbGVjdChkaXJlY3Rpb249UGFyYW1ldGVyRGlyZWN0aW9uS2luZDo6cmV0dXJuKS0+c2l6ZSgpID0gMTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1vbmx5X3JldHVybl9yZXN1bHRfcGFyYW1ldGVycyIgbmFtZT0ib25seV9yZXR1cm5fcmVzdWx0X3BhcmFtZXRlcnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iT3BhcXVlRXhwcmVzc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLW9ubHlfcmV0dXJuX3Jlc3VsdF9wYXJhbWV0ZXJzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BhcXVlRXhwcmVzc2lvbi1vbmx5X3JldHVybl9yZXN1bHRfcGFyYW1ldGVycyI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGJlaGF2aW9yIG1heSBvbmx5IGhhdmUgcmV0dXJuIHJlc3VsdCBwYXJhbWV0ZXJzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLW9ubHlfcmV0dXJuX3Jlc3VsdF9wYXJhbWV0ZXJzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5iZWhhdmlvciAmbHQ7PiBudWxsIGltcGxpZXMgYmVoYXZpb3Iub3duZWRQYXJhbWV0ZXItPnNlbGVjdChkaXJlY3Rpb24mbHQ7PlBhcmFtZXRlckRpcmVjdGlvbktpbmQ6OnJldHVybiktPmlzRW1wdHkoKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJWYWx1ZVNwZWNpZmljYXRpb24iLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tYmVoYXZpb3IiIG5hbWU9ImJlaGF2aW9yIiB0eXBlPSJCZWhhdmlvciIgYXNzb2NpYXRpb249IkFfYmVoYXZpb3Jfb3BhcXVlRXhwcmVzc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWJlaGF2aW9yLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BhcXVlRXhwcmVzc2lvbi1iZWhhdmlvciI+Ci0gICAgICAgICAgPGJvZHk+U3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiB0aGUgT3BhcXVlRXhwcmVzc2lvbiBhcyBhIFVNTCBCZWhhdmlvci48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tYmVoYXZpb3ItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWJvZHkiIG5hbWU9ImJvZHkiIGlzT3JkZXJlZD0idHJ1ZSIgaXNVbmlxdWU9ImZhbHNlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tYm9keS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wYXF1ZUV4cHJlc3Npb24tYm9keSI+Ci0gICAgICAgICAgPGJvZHk+QSB0ZXh0dWFsIGRlZmluaXRpb24gb2YgdGhlIGJlaGF2aW9yIG9mIHRoZSBPcGFxdWVFeHByZXNzaW9uLCBwb3NzaWJseSBpbiBtdWx0aXBsZSBsYW5ndWFnZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1ib2R5LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1ib2R5LV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tbGFuZ3VhZ2UiIG5hbWU9Imxhbmd1YWdlIiBpc09yZGVyZWQ9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1sYW5ndWFnZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wYXF1ZUV4cHJlc3Npb24tbGFuZ3VhZ2UiPgotICAgICAgICAgIDxib2R5PlNwZWNpZmllcyB0aGUgbGFuZ3VhZ2VzIHVzZWQgdG8gZXhwcmVzcyB0aGUgdGV4dHVhbCBib2RpZXMgb2YgdGhlIE9wYXF1ZUV4cHJlc3Npb24uICBMYW5ndWFnZXMgYXJlIG1hdGNoZWQgdG8gYm9keSBTdHJpbmdzIGJ5IG9yZGVyLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGJvZHkgZGVwZW5kcyBvbiB0aGUgbGFuZ3VhZ2VzLiBJZiB0aGUgbGFuZ3VhZ2VzIGFyZSB1bnNwZWNpZmllZCwgdGhleSBtYXkgYmUgaW1wbGljaXQgZnJvbSB0aGUgZXhwcmVzc2lvbiBib2R5IG9yIHRoZSBjb250ZXh0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tbGFuZ3VhZ2UtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWxhbmd1YWdlLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tcmVzdWx0IiBuYW1lPSJyZXN1bHQiIHR5cGU9IlBhcmFtZXRlciIgaXNSZWFkT25seT0idHJ1ZSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iQV9yZXN1bHRfb3BhcXVlRXhwcmVzc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLXJlc3VsdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wYXF1ZUV4cHJlc3Npb24tcmVzdWx0Ij4KLSAgICAgICAgICA8Ym9keT5JZiBhbiBPcGFxdWVFeHByZXNzaW9uIGlzIHNwZWNpZmllZCB1c2luZyBhIFVNTCBCZWhhdmlvciwgdGhlbiB0aGlzIHJlZmVycyB0byB0aGUgc2luZ2xlIHJlcXVpcmVkIHJldHVybiBQYXJhbWV0ZXIgb2YgdGhhdCBCZWhhdmlvci4gV2hlbiB0aGUgQmVoYXZpb3IgY29tcGxldGVzIGV4ZWN1dGlvbiwgdGhlIHZhbHVlcyBvbiB0aGlzIFBhcmFtZXRlciBnaXZlIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgT3BhcXVlRXhwcmVzc2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1zdHJpbmdWYWx1ZSIgbmFtZT0ic3RyaW5nVmFsdWUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tc3RyaW5nVmFsdWUtX293bmVkUGFyYW1ldGVyLjAiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWlzSW50ZWdyYWwiIG5hbWU9ImlzSW50ZWdyYWwiIGJvZHlDb25kaXRpb249Ik9wYXF1ZUV4cHJlc3Npb24taXNJbnRlZ3JhbC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24taXNJbnRlZ3JhbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik9wYXF1ZUV4cHJlc3Npb24taXNJbnRlZ3JhbCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGlzSW50ZWdyYWwoKSB0ZWxscyB3aGV0aGVyIGFuIGV4cHJlc3Npb24gaXMgaW50ZW5kZWQgdG8gcHJvZHVjZSBhbiBJbnRlZ2VyLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWlzSW50ZWdyYWwtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJPcGFxdWVFeHByZXNzaW9uLWlzSW50ZWdyYWwiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWlzSW50ZWdyYWwtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChmYWxzZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1pc0ludGVncmFsLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24taXNOb25OZWdhdGl2ZSIgbmFtZT0iaXNOb25OZWdhdGl2ZSIgYm9keUNvbmRpdGlvbj0iT3BhcXVlRXhwcmVzc2lvbi1pc05vbk5lZ2F0aXZlLXNwZWMiIGlzUXVlcnk9InRydWUiIHByZWNvbmRpdGlvbj0iT3BhcXVlRXhwcmVzc2lvbi1pc05vbk5lZ2F0aXZlLXByZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWlzTm9uTmVnYXRpdmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGFxdWVFeHByZXNzaW9uLWlzTm9uTmVnYXRpdmUiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpc05vbk5lZ2F0aXZlKCkgdGVsbHMgd2hldGhlciBhbiBpbnRlZ2VyIGV4cHJlc3Npb24gaGFzIGEgbm9uLW5lZ2F0aXZlIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWlzTm9uTmVnYXRpdmUtcHJlIiBuYW1lPSJwcmUiIGNvbnN0cmFpbmVkRWxlbWVudD0iT3BhcXVlRXhwcmVzc2lvbi1pc05vbk5lZ2F0aXZlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1pc05vbk5lZ2F0aXZlLXByZS1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnNlbGYuaXNJbnRlZ3JhbCgpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWlzTm9uTmVnYXRpdmUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJPcGFxdWVFeHByZXNzaW9uLWlzTm9uTmVnYXRpdmUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWlzTm9uTmVnYXRpdmUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChmYWxzZSk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1pc05vbk5lZ2F0aXZlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24taXNQb3NpdGl2ZSIgbmFtZT0iaXNQb3NpdGl2ZSIgYm9keUNvbmRpdGlvbj0iT3BhcXVlRXhwcmVzc2lvbi1pc1Bvc2l0aXZlLXNwZWMiIGlzUXVlcnk9InRydWUiIHByZWNvbmRpdGlvbj0iT3BhcXVlRXhwcmVzc2lvbi1pc1Bvc2l0aXZlLXByZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWlzUG9zaXRpdmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJPcGFxdWVFeHByZXNzaW9uLWlzUG9zaXRpdmUiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpc1Bvc2l0aXZlKCkgdGVsbHMgd2hldGhlciBhbiBpbnRlZ2VyIGV4cHJlc3Npb24gaGFzIGEgcG9zaXRpdmUgdmFsdWUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24taXNQb3NpdGl2ZS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik9wYXF1ZUV4cHJlc3Npb24taXNQb3NpdGl2ZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24taXNQb3NpdGl2ZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGZhbHNlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1pc1Bvc2l0aXZlLXByZSIgbmFtZT0icHJlIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik9wYXF1ZUV4cHJlc3Npb24taXNQb3NpdGl2ZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24taXNQb3NpdGl2ZS1wcmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5zZWxmLmlzSW50ZWdyYWwoKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLWlzUG9zaXRpdmUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1yZXN1bHQuMSIgbmFtZT0icmVzdWx0IiB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiIGJvZHlDb25kaXRpb249Ik9wYXF1ZUV4cHJlc3Npb24tcmVzdWx0LjEtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLXJlc3VsdC4xLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BhcXVlRXhwcmVzc2lvbi1yZXN1bHQuMSI+Ci0gICAgICAgICAgPGJvZHk+RGVyaXZhdGlvbiBmb3IgT3BhcXVlRXhwcmVzc2lvbjo6L3Jlc3VsdDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLXJlc3VsdC4xLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iT3BhcXVlRXhwcmVzc2lvbi1yZXN1bHQuMSBPcGFxdWVFeHByZXNzaW9uLXJlc3VsdCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ik9wYXF1ZUV4cHJlc3Npb24tcmVzdWx0LjEtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChpZiBiZWhhdmlvciA9IG51bGwgdGhlbiYjeEQ7Ci0JbnVsbCYjeEQ7Ci1lbHNlJiN4RDsKLQliZWhhdmlvci5vd25lZFBhcmFtZXRlci0+Zmlyc3QoKSYjeEQ7Ci1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1yZXN1bHQuMS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgdHlwZT0iUGFyYW1ldGVyIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLXJlc3VsdC4xLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi1yZXN1bHQuMS1yZXN1bHQtX3VwcGVyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi12YWx1ZSIgbmFtZT0idmFsdWUiIGJvZHlDb25kaXRpb249Ik9wYXF1ZUV4cHJlc3Npb24tdmFsdWUtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcHJlY29uZGl0aW9uPSJPcGFxdWVFeHByZXNzaW9uLXZhbHVlLXByZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLXZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iT3BhcXVlRXhwcmVzc2lvbi12YWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IHZhbHVlKCkgZ2l2ZXMgYW4gaW50ZWdlciB2YWx1ZSBmb3IgYW4gZXhwcmVzc2lvbiBpbnRlbmRlZCB0byBwcm9kdWNlIG9uZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi12YWx1ZS1wcmUiIG5hbWU9InByZSIgY29uc3RyYWluZWRFbGVtZW50PSJPcGFxdWVFeHByZXNzaW9uLXZhbHVlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi12YWx1ZS1wcmUtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5zZWxmLmlzSW50ZWdyYWwoKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi12YWx1ZS1zcGVjIiBuYW1lPSJzcGVjIiBjb25zdHJhaW5lZEVsZW1lbnQ9Ik9wYXF1ZUV4cHJlc3Npb24tdmFsdWUiPgotICAgICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJPcGFxdWVFeHByZXNzaW9uLXZhbHVlLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoMCk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iT3BhcXVlRXhwcmVzc2lvbi12YWx1ZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlN0cmluZ0V4cHJlc3Npb24iIG5hbWU9IlN0cmluZ0V4cHJlc3Npb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cmluZ0V4cHJlc3Npb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJpbmdFeHByZXNzaW9uIj4KLSAgICAgICAgPGJvZHk+QSBTdHJpbmdFeHByZXNzaW9uIGlzIGFuIEV4cHJlc3Npb24gdGhhdCBzcGVjaWZpZXMgYSBTdHJpbmcgdmFsdWUgdGhhdCBpcyBkZXJpdmVkIGJ5IGNvbmNhdGVuYXRpbmcgYSBzZXF1ZW5jZSBvZiBvcGVyYW5kcyB3aXRoIFN0cmluZyB2YWx1ZXMgb3IgYSBzZXF1ZW5jZSBvZiBzdWJFeHByZXNzaW9ucywgc29tZSBvZiB3aGljaCBtaWdodCBiZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0cmluZ0V4cHJlc3Npb24tb3BlcmFuZHMiIG5hbWU9Im9wZXJhbmRzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlN0cmluZ0V4cHJlc3Npb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RyaW5nRXhwcmVzc2lvbi1vcGVyYW5kcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cmluZ0V4cHJlc3Npb24tb3BlcmFuZHMiPgotICAgICAgICAgIDxib2R5PkFsbCB0aGUgb3BlcmFuZHMgb2YgYSBTdHJpbmdFeHByZXNzaW9uIG11c3QgYmUgTGl0ZXJhbFN0cmluZ3M8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RyaW5nRXhwcmVzc2lvbi1vcGVyYW5kcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgPGJvZHk+b3BlcmFuZC0+Zm9yQWxsIChvY2xJc0tpbmRPZiAoTGl0ZXJhbFN0cmluZykpPC9ib2R5PgotICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICA8L293bmVkUnVsZT4KLSAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTdHJpbmdFeHByZXNzaW9uLXN1YmV4cHJlc3Npb25zIiBuYW1lPSJzdWJleHByZXNzaW9ucyIgY29uc3RyYWluZWRFbGVtZW50PSJTdHJpbmdFeHByZXNzaW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cmluZ0V4cHJlc3Npb24tc3ViZXhwcmVzc2lvbnMtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdHJpbmdFeHByZXNzaW9uLXN1YmV4cHJlc3Npb25zIj4KLSAgICAgICAgICA8Ym9keT5JZiBhIFN0cmluZ0V4cHJlc3Npb24gaGFzIHN1Yi1leHByZXNzaW9ucywgaXQgY2Fubm90IGhhdmUgb3BlcmFuZHMgYW5kIHZpY2UgdmVyc2EgKHRoaXMgYXZvaWRzIHRoZSBwcm9ibGVtIG9mIGhhdmluZyB0byBkZWZpbmUgYSBjb2xsYXRpbmcgc2VxdWVuY2UgYmV0d2VlbiBvcGVyYW5kcyBhbmQgc3ViZXhwcmVzc2lvbnMpLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTdHJpbmdFeHByZXNzaW9uLXN1YmV4cHJlc3Npb25zLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5pZiBzdWJFeHByZXNzaW9uLT5ub3RFbXB0eSgpIHRoZW4gb3BlcmFuZC0+aXNFbXB0eSgpIGVsc2Ugb3BlcmFuZC0+bm90RW1wdHkoKSBlbmRpZjwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJTdHJpbmdFeHByZXNzaW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJUZW1wbGF0ZWFibGVFbGVtZW50Ii8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJTdHJpbmdFeHByZXNzaW9uLV9nZW5lcmFsaXphdGlvbi4xIiBnZW5lcmFsPSJFeHByZXNzaW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdHJpbmdFeHByZXNzaW9uLW93bmluZ0V4cHJlc3Npb24iIG5hbWU9Im93bmluZ0V4cHJlc3Npb24iIHR5cGU9IlN0cmluZ0V4cHJlc3Npb24iIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9zdWJFeHByZXNzaW9uX293bmluZ0V4cHJlc3Npb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RyaW5nRXhwcmVzc2lvbi1vd25pbmdFeHByZXNzaW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3RyaW5nRXhwcmVzc2lvbi1vd25pbmdFeHByZXNzaW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGUgU3RyaW5nRXhwcmVzc2lvbiBvZiB3aGljaCB0aGlzIFN0cmluZ0V4cHJlc3Npb24gaXMgYSBzdWJFeHByZXNzaW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iU3RyaW5nRXhwcmVzc2lvbi1vd25pbmdFeHByZXNzaW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3RyaW5nRXhwcmVzc2lvbi1zdWJFeHByZXNzaW9uIiBuYW1lPSJzdWJFeHByZXNzaW9uIiB0eXBlPSJTdHJpbmdFeHByZXNzaW9uIiBpc09yZGVyZWQ9InRydWUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfc3ViRXhwcmVzc2lvbl9vd25pbmdFeHByZXNzaW9uIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN0cmluZ0V4cHJlc3Npb24tc3ViRXhwcmVzc2lvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cmluZ0V4cHJlc3Npb24tc3ViRXhwcmVzc2lvbiI+Ci0gICAgICAgICAgPGJvZHk+VGhlIFN0cmluZ0V4cHJlc3Npb25zIHRoYXQgY29uc3RpdHV0ZSB0aGlzIFN0cmluZ0V4cHJlc3Npb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJTdHJpbmdFeHByZXNzaW9uLXN1YkV4cHJlc3Npb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJTdHJpbmdFeHByZXNzaW9uLXN1YkV4cHJlc3Npb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iU3RyaW5nRXhwcmVzc2lvbi1zdHJpbmdWYWx1ZSIgbmFtZT0ic3RyaW5nVmFsdWUiIGJvZHlDb25kaXRpb249IlN0cmluZ0V4cHJlc3Npb24tc3RyaW5nVmFsdWUtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJWYWx1ZVNwZWNpZmljYXRpb24tc3RyaW5nVmFsdWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3RyaW5nRXhwcmVzc2lvbi1zdHJpbmdWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlN0cmluZ0V4cHJlc3Npb24tc3RyaW5nVmFsdWUiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBzdHJpbmdWYWx1ZSgpIHJldHVybnMgdGhlIFN0cmluZyByZXN1bHRpbmcgZnJvbSBjb25jYXRlbmF0aW5nLCBpbiBvcmRlciwgYWxsIHRoZSBjb21wb25lbnQgU3RyaW5nIHZhbHVlcyBvZiBhbGwgdGhlIG9wZXJhbmRzIG9yIHN1YkV4cHJlc3Npb25zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIFN0cmluZ0V4cHJlc3Npb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlN0cmluZ0V4cHJlc3Npb24tc3RyaW5nVmFsdWUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJTdHJpbmdFeHByZXNzaW9uLXN0cmluZ1ZhbHVlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iU3RyaW5nRXhwcmVzc2lvbi1zdHJpbmdWYWx1ZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGlmIHN1YkV4cHJlc3Npb24tPm5vdEVtcHR5KCkKLXRoZW4gc3ViRXhwcmVzc2lvbi0+aXRlcmF0ZShzZTsgc3RyaW5nVmFsdWU6IFN0cmluZyA9ICcnIHwgc3RyaW5nVmFsdWUuY29uY2F0KHNlLnN0cmluZ1ZhbHVlKCkpKQotZWxzZSBvcGVyYW5kLT5pdGVyYXRlKG9wOyBzdHJpbmdWYWx1ZTogU3RyaW5nID0gJycgfCBzdHJpbmdWYWx1ZS5jb25jYXQob3Auc3RyaW5nVmFsdWUoKSkpCi1lbmRpZik8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iU3RyaW5nRXhwcmVzc2lvbi1zdHJpbmdWYWx1ZS1yZXN1bHQiIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1N0cmluZyIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVGltZUNvbnN0cmFpbnQiIG5hbWU9IlRpbWVDb25zdHJhaW50Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUaW1lQ29uc3RyYWludC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRpbWVDb25zdHJhaW50Ij4KLSAgICAgICAgPGJvZHk+QSBUaW1lQ29uc3RyYWludCBpcyBhIENvbnN0cmFpbnQgdGhhdCByZWZlcnMgdG8gYSBUaW1lSW50ZXJ2YWwuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRSdWxlIHhtaTppZD0iVGltZUNvbnN0cmFpbnQtaGFzX29uZV9jb25zdHJhaW5lZEVsZW1lbnQiIG5hbWU9Imhhc19vbmVfY29uc3RyYWluZWRFbGVtZW50IiBjb25zdHJhaW5lZEVsZW1lbnQ9IlRpbWVDb25zdHJhaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRpbWVDb25zdHJhaW50LWhhc19vbmVfY29uc3RyYWluZWRFbGVtZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGltZUNvbnN0cmFpbnQtaGFzX29uZV9jb25zdHJhaW5lZEVsZW1lbnQiPgotICAgICAgICAgIDxib2R5PkEgVGltZUNvbnN0cmFpbnQgaGFzIG9uZSBjb25zdHJhaW5lZEVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRpbWVDb25zdHJhaW50LWhhc19vbmVfY29uc3RyYWluZWRFbGVtZW50LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICA8Ym9keT5jb25zdHJhaW5lZEVsZW1lbnQtPnNpemUoKSA9IDE8L2JvZHk+Ci0gICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgIDwvb3duZWRSdWxlPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iVGltZUNvbnN0cmFpbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkludGVydmFsQ29uc3RyYWludCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVGltZUNvbnN0cmFpbnQtZmlyc3RFdmVudCIgbmFtZT0iZmlyc3RFdmVudCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUaW1lQ29uc3RyYWludC1maXJzdEV2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGltZUNvbnN0cmFpbnQtZmlyc3RFdmVudCI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHZhbHVlIG9mIGZpcnN0RXZlbnQgaXMgcmVsYXRlZCB0byB0aGUgY29uc3RyYWluZWRFbGVtZW50LiBJZiBmaXJzdEV2ZW50IGlzIHRydWUsIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgb2JzZXJ2YXRpb24gZXZlbnQgaXMgdGhlIGZpcnN0IHRpbWUgaW5zdGFudCB0aGUgZXhlY3V0aW9uIGVudGVycyB0aGUgY29uc3RyYWluZWRFbGVtZW50LiBJZiBmaXJzdEV2ZW50IGlzIGZhbHNlLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIG9ic2VydmF0aW9uIGV2ZW50IGlzIHRoZSBsYXN0IHRpbWUgaW5zdGFudCB0aGUgZXhlY3V0aW9uIGlzIHdpdGhpbiB0aGUgY29uc3RyYWluZWRFbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJUaW1lQ29uc3RyYWludC1maXJzdEV2ZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJUaW1lQ29uc3RyYWludC1maXJzdEV2ZW50LV9kZWZhdWx0VmFsdWUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVGltZUNvbnN0cmFpbnQtc3BlY2lmaWNhdGlvbiIgbmFtZT0ic3BlY2lmaWNhdGlvbiIgdHlwZT0iVGltZUludGVydmFsIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiByZWRlZmluZWRQcm9wZXJ0eT0iSW50ZXJ2YWxDb25zdHJhaW50LXNwZWNpZmljYXRpb24gQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uIiBhc3NvY2lhdGlvbj0iQV9zcGVjaWZpY2F0aW9uX3RpbWVDb25zdHJhaW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRpbWVDb25zdHJhaW50LXNwZWNpZmljYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUaW1lQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICA8Ym9keT5UaGVUaW1lSW50ZXJ2YWwgY29uc3RyYWluaW5nIHRoZSBkdXJhdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVGltZUV4cHJlc3Npb24iIG5hbWU9IlRpbWVFeHByZXNzaW9uIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUaW1lRXhwcmVzc2lvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRpbWVFeHByZXNzaW9uIj4KLSAgICAgICAgPGJvZHk+QSBUaW1lRXhwcmVzc2lvbiBpcyBhIFZhbHVlU3BlY2lmaWNhdGlvbiB0aGF0IHJlcHJlc2VudHMgYSB0aW1lIHZhbHVlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlRpbWVFeHByZXNzaW9uLW5vX2V4cHJfcmVxdWlyZXNfb2JzZXJ2YXRpb24iIG5hbWU9Im5vX2V4cHJfcmVxdWlyZXNfb2JzZXJ2YXRpb24iIGNvbnN0cmFpbmVkRWxlbWVudD0iVGltZUV4cHJlc3Npb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGltZUV4cHJlc3Npb24tbm9fZXhwcl9yZXF1aXJlc19vYnNlcnZhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRpbWVFeHByZXNzaW9uLW5vX2V4cHJfcmVxdWlyZXNfb2JzZXJ2YXRpb24iPgotICAgICAgICAgIDxib2R5PklmIGEgVGltZUV4cHJlc3Npb24gaGFzIG5vIGV4cHIsIHRoZW4gaXQgbXVzdCBoYXZlIGEgc2luZ2xlIG9ic2VydmF0aW9uIHRoYXQgaXMgYSBUaW1lT2JzZXJ2YXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlRpbWVFeHByZXNzaW9uLW5vX2V4cHJfcmVxdWlyZXNfb2JzZXJ2YXRpb24tX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgIDxib2R5PmV4cHIgPSBudWxsIGltcGxpZXMgKG9ic2VydmF0aW9uLT5zaXplKCkgPSAxIGFuZCBvYnNlcnZhdGlvbi0+Zm9yQWxsKG9jbElzS2luZE9mKFRpbWVPYnNlcnZhdGlvbikpKTwvYm9keT4KLSAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJUaW1lRXhwcmVzc2lvbi1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iVmFsdWVTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUaW1lRXhwcmVzc2lvbi1leHByIiBuYW1lPSJleHByIiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb24iIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVkRWxlbWVudCIgYXNzb2NpYXRpb249IkFfZXhwcl90aW1lRXhwcmVzc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUaW1lRXhwcmVzc2lvbi1leHByLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGltZUV4cHJlc3Npb24tZXhwciI+Ci0gICAgICAgICAgPGJvZHk+QSBWYWx1ZVNwZWNpZmljYXRpb24gdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHZhbHVlIG9mIHRoZSBUaW1lRXhwcmVzc2lvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlRpbWVFeHByZXNzaW9uLWV4cHItX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUaW1lRXhwcmVzc2lvbi1vYnNlcnZhdGlvbiIgbmFtZT0ib2JzZXJ2YXRpb24iIHR5cGU9Ik9ic2VydmF0aW9uIiBhc3NvY2lhdGlvbj0iQV9vYnNlcnZhdGlvbl90aW1lRXhwcmVzc2lvbiI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUaW1lRXhwcmVzc2lvbi1vYnNlcnZhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRpbWVFeHByZXNzaW9uLW9ic2VydmF0aW9uIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcnMgdG8gdGhlIE9ic2VydmF0aW9ucyB0aGF0IGFyZSBpbnZvbHZlZCBpbiB0aGUgY29tcHV0YXRpb24gb2YgdGhlIFRpbWVFeHByZXNzaW9uIHZhbHVlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVGltZUV4cHJlc3Npb24tb2JzZXJ2YXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJUaW1lRXhwcmVzc2lvbi1vYnNlcnZhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJUaW1lRXhwcmVzc2lvbi1zdHJpbmdWYWx1ZSIgbmFtZT0ic3RyaW5nVmFsdWUiIHZpc2liaWxpdHk9InByb3RlY3RlZCIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlRpbWVFeHByZXNzaW9uLXN0cmluZ1ZhbHVlLV9vd25lZFBhcmFtZXRlci4wIiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJUaW1lSW50ZXJ2YWwiIG5hbWU9IlRpbWVJbnRlcnZhbCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGltZUludGVydmFsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGltZUludGVydmFsIj4KLSAgICAgICAgPGJvZHk+QSBUaW1lSW50ZXJ2YWwgZGVmaW5lcyB0aGUgcmFuZ2UgYmV0d2VlbiB0d28gVGltZUV4cHJlc3Npb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iVGltZUludGVydmFsLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJJbnRlcnZhbCIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVGltZUludGVydmFsLW1heCIgbmFtZT0ibWF4IiB0eXBlPSJUaW1lRXhwcmVzc2lvbiIgcmVkZWZpbmVkUHJvcGVydHk9IkludGVydmFsLW1heCIgYXNzb2NpYXRpb249IkFfbWF4X3RpbWVJbnRlcnZhbCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUaW1lSW50ZXJ2YWwtbWF4LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGltZUludGVydmFsLW1heCI+Ci0gICAgICAgICAgPGJvZHk+UmVmZXJzIHRvIHRoZSBUaW1lRXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUaW1lSW50ZXJ2YWwtbWluIiBuYW1lPSJtaW4iIHR5cGU9IlRpbWVFeHByZXNzaW9uIiByZWRlZmluZWRQcm9wZXJ0eT0iSW50ZXJ2YWwtbWluIiBhc3NvY2lhdGlvbj0iQV9taW5fdGltZUludGVydmFsIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRpbWVJbnRlcnZhbC1taW4tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJUaW1lSW50ZXJ2YWwtbWluIj4KLSAgICAgICAgICA8Ym9keT5SZWZlcnMgdG8gdGhlIFRpbWVFeHByZXNzaW9uIGRlbm90aW5nIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSByYW5nZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iVGltZU9ic2VydmF0aW9uIiBuYW1lPSJUaW1lT2JzZXJ2YXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRpbWVPYnNlcnZhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRpbWVPYnNlcnZhdGlvbiI+Ci0gICAgICAgIDxib2R5PkEgVGltZU9ic2VydmF0aW9uIGlzIGEgcmVmZXJlbmNlIHRvIGEgdGltZSBpbnN0YW50IGR1cmluZyBhbiBleGVjdXRpb24uIEl0IHBvaW50cyBvdXQgdGhlIE5hbWVkRWxlbWVudCBpbiB0aGUgbW9kZWwgdG8gb2JzZXJ2ZSBhbmQgd2hldGhlciB0aGUgb2JzZXJ2YXRpb24gaXMgd2hlbiB0aGlzIE5hbWVkRWxlbWVudCBpcyBlbnRlcmVkIG9yIHdoZW4gaXQgaXMgZXhpdGVkLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iVGltZU9ic2VydmF0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJPYnNlcnZhdGlvbiIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iVGltZU9ic2VydmF0aW9uLWV2ZW50IiBuYW1lPSJldmVudCIgdHlwZT0iTmFtZWRFbGVtZW50IiBhc3NvY2lhdGlvbj0iQV9ldmVudF90aW1lT2JzZXJ2YXRpb24iPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVGltZU9ic2VydmF0aW9uLWV2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGltZU9ic2VydmF0aW9uLWV2ZW50Ij4KLSAgICAgICAgICA8Ym9keT5UaGUgVGltZU9ic2VydmF0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGVudGVyaW5nIG9yIGV4aXRpbmcgb2YgdGhlIGV2ZW50IEVsZW1lbnQgZHVyaW5nIGV4ZWN1dGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlRpbWVPYnNlcnZhdGlvbi1maXJzdEV2ZW50IiBuYW1lPSJmaXJzdEV2ZW50Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlRpbWVPYnNlcnZhdGlvbi1maXJzdEV2ZW50LV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVGltZU9ic2VydmF0aW9uLWZpcnN0RXZlbnQiPgotICAgICAgICAgIDxib2R5PlRoZSB2YWx1ZSBvZiBmaXJzdEV2ZW50IGlzIHJlbGF0ZWQgdG8gdGhlIGV2ZW50LiBJZiBmaXJzdEV2ZW50IGlzIHRydWUsIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgb2JzZXJ2YXRpb24gZXZlbnQgaXMgdGhlIGZpcnN0IHRpbWUgaW5zdGFudCB0aGUgZXhlY3V0aW9uIGVudGVycyB0aGUgZXZlbnQgRWxlbWVudC4gSWYgZmlyc3RFdmVudCBpcyBmYWxzZSwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBvYnNlcnZhdGlvbiBldmVudCBpcyB0aGUgdGltZSBpbnN0YW50IHRoZSBleGVjdXRpb24gZXhpdHMgdGhlIGV2ZW50IEVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iVGltZU9ic2VydmF0aW9uLWZpcnN0RXZlbnQtX2RlZmF1bHRWYWx1ZSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbiIgbmFtZT0iVmFsdWVTcGVjaWZpY2F0aW9uIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb24iPgotICAgICAgICA8Ym9keT5BIFZhbHVlU3BlY2lmaWNhdGlvbiBpcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIChwb3NzaWJseSBlbXB0eSkgc2V0IG9mIHZhbHVlcy4gQSBWYWx1ZVNwZWNpZmljYXRpb24gaXMgYSBQYXJhbWV0ZXJhYmxlRWxlbWVudCB0aGF0IG1heSBiZSBleHBvc2VkIGFzIGEgZm9ybWFsIFRlbXBsYXRlUGFyYW1ldGVyIGFuZCBwcm92aWRlZCBhcyB0aGUgYWN0dWFsIHBhcmFtZXRlciBpbiB0aGUgYmluZGluZyBvZiBhIHRlbXBsYXRlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJUeXBlZEVsZW1lbnQiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1fZ2VuZXJhbGl6YXRpb24uMSIgZ2VuZXJhbD0iUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24tYm9vbGVhblZhbHVlIiBuYW1lPSJib29sZWFuVmFsdWUiIGJvZHlDb25kaXRpb249IlZhbHVlU3BlY2lmaWNhdGlvbi1ib29sZWFuVmFsdWUtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24tYm9vbGVhblZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmFsdWVTcGVjaWZpY2F0aW9uLWJvb2xlYW5WYWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGJvb2xlYW5WYWx1ZSgpIGdpdmVzIGEgc2luZ2xlIEJvb2xlYW4gdmFsdWUgd2hlbiBvbmUgY2FuIGJlIGNvbXB1dGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24tYm9vbGVhblZhbHVlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVmFsdWVTcGVjaWZpY2F0aW9uLWJvb2xlYW5WYWx1ZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1ib29sZWFuVmFsdWUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChudWxsKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24tYm9vbGVhblZhbHVlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLWJvb2xlYW5WYWx1ZS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24taW50ZWdlclZhbHVlIiBuYW1lPSJpbnRlZ2VyVmFsdWUiIGJvZHlDb25kaXRpb249IlZhbHVlU3BlY2lmaWNhdGlvbi1pbnRlZ2VyVmFsdWUtc3BlYyIgaXNRdWVyeT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24taW50ZWdlclZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmFsdWVTcGVjaWZpY2F0aW9uLWludGVnZXJWYWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IGludGVnZXJWYWx1ZSgpIGdpdmVzIGEgc2luZ2xlIEludGVnZXIgdmFsdWUgd2hlbiBvbmUgY2FuIGJlIGNvbXB1dGVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24taW50ZWdlclZhbHVlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVmFsdWVTcGVjaWZpY2F0aW9uLWludGVnZXJWYWx1ZSI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1pbnRlZ2VyVmFsdWUtc3BlYy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgICAgIDxib2R5PnJlc3VsdCA9IChudWxsKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24taW50ZWdlclZhbHVlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLWludGVnZXJWYWx1ZS1yZXN1bHQtX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24taXNDb21wYXRpYmxlV2l0aCIgbmFtZT0iaXNDb21wYXRpYmxlV2l0aCIgYm9keUNvbmRpdGlvbj0iVmFsdWVTcGVjaWZpY2F0aW9uLWlzQ29tcGF0aWJsZVdpdGgtc3BlYyIgaXNRdWVyeT0idHJ1ZSIgcmVkZWZpbmVkT3BlcmF0aW9uPSJQYXJhbWV0ZXJhYmxlRWxlbWVudC1pc0NvbXBhdGlibGVXaXRoIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1pc0NvbXBhdGlibGVXaXRoLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmFsdWVTcGVjaWZpY2F0aW9uLWlzQ29tcGF0aWJsZVdpdGgiPgotICAgICAgICAgIDxib2R5PlRoZSBxdWVyeSBpc0NvbXBhdGlibGVXaXRoKCkgZGV0ZXJtaW5lcyBpZiB0aGlzIFZhbHVlU3BlY2lmaWNhdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHNwZWNpZmllZCBQYXJhbWV0ZXJhYmxlRWxlbWVudC4gVGhpcyBWYWx1ZVNwZWNpZmljYXRpb24gaXMgY29tcGF0aWJsZSB3aXRoIFBhcmFtZXRlcmFibGVFbGVtZW50IHAgaWYgdGhlIGtpbmQgb2YgdGhpcyBWYWx1ZVNwZWNpZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgb3IgYSBzdWJ0eXBlIG9mIHRoZSBraW5kIG9mIHAuIEZ1cnRoZXIsIGlmIHAgaXMgYSBUeXBlZEVsZW1lbnQsIHRoZW4gdGhlIHR5cGUgb2YgdGhpcyBWYWx1ZVNwZWNpZmljYXRpb24gbXVzdCBiZSBjb25mb3JtYW50IHdpdGggdGhlIHR5cGUgb2YgcC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLWlzQ29tcGF0aWJsZVdpdGgtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb24taXNDb21wYXRpYmxlV2l0aCI+Ci0gICAgICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1pc0NvbXBhdGlibGVXaXRoLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAoc2VsZi5vY2xJc0tpbmRPZihwLm9jbFR5cGUoKSkgYW5kIChwLm9jbElzS2luZE9mKFR5cGVkRWxlbWVudCkgaW1wbGllcyAmI3hEOwotc2VsZi50eXBlLmNvbmZvcm1zVG8ocC5vY2xBc1R5cGUoVHlwZWRFbGVtZW50KS50eXBlKSkpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1pc0NvbXBhdGlibGVXaXRoLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24taXNDb21wYXRpYmxlV2l0aC1wIiBuYW1lPSJwIiB0eXBlPSJQYXJhbWV0ZXJhYmxlRWxlbWVudCIvPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1pc0NvbXB1dGFibGUiIG5hbWU9ImlzQ29tcHV0YWJsZSIgYm9keUNvbmRpdGlvbj0iVmFsdWVTcGVjaWZpY2F0aW9uLWlzQ29tcHV0YWJsZS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1pc0NvbXB1dGFibGUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb24taXNDb21wdXRhYmxlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNDb21wdXRhYmxlKCkgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdmFsdWUgc3BlY2lmaWNhdGlvbiBjYW4gYmUgY29tcHV0ZWQgaW4gYSBtb2RlbC4gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIGZ1bGx5IGRlZmluZWQgaW4gT0NMLiBBIGNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24gaXMgZXhwZWN0ZWQgdG8gZGVsaXZlciB0cnVlIGZvciB0aGlzIG9wZXJhdGlvbiBmb3IgYWxsIFZhbHVlU3BlY2lmaWNhdGlvbnMgdGhhdCBpdCBjYW4gY29tcHV0ZSwgYW5kIHRvIGNvbXB1dGUgYWxsIG9mIHRob3NlIGZvciB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIHRydWUuIEEgY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBpcyBleHBlY3RlZCB0byBiZSBhYmxlIHRvIGNvbXB1dGUgYXQgbGVhc3QgdGhlIHZhbHVlIG9mIGFsbCBMaXRlcmFsU3BlY2lmaWNhdGlvbnMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1pc0NvbXB1dGFibGUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb24taXNDb21wdXRhYmxlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLWlzQ29tcHV0YWJsZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGZhbHNlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24taXNDb21wdXRhYmxlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1pc051bGwiIG5hbWU9ImlzTnVsbCIgYm9keUNvbmRpdGlvbj0iVmFsdWVTcGVjaWZpY2F0aW9uLWlzTnVsbC1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1pc051bGwtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb24taXNOdWxsIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgaXNOdWxsKCkgcmV0dXJucyB0cnVlIHdoZW4gaXQgY2FuIGJlIGNvbXB1dGVkIHRoYXQgdGhlIHZhbHVlIGlzIG51bGwuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1pc051bGwtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb24taXNOdWxsIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLWlzTnVsbC1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKGZhbHNlKTwvYm9keT4KLSAgICAgICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgICAgIDwvb3duZWRSdWxlPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24taXNOdWxsLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1yZWFsVmFsdWUiIG5hbWU9InJlYWxWYWx1ZSIgYm9keUNvbmRpdGlvbj0iVmFsdWVTcGVjaWZpY2F0aW9uLXJlYWxWYWx1ZS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1yZWFsVmFsdWUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb24tcmVhbFZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgcmVhbFZhbHVlKCkgZ2l2ZXMgYSBzaW5nbGUgUmVhbCB2YWx1ZSB3aGVuIG9uZSBjYW4gYmUgY29tcHV0ZWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPG93bmVkUnVsZSB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1yZWFsVmFsdWUtc3BlYyIgbmFtZT0ic3BlYyIgY29uc3RyYWluZWRFbGVtZW50PSJWYWx1ZVNwZWNpZmljYXRpb24tcmVhbFZhbHVlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLXJlYWxWYWx1ZS1zcGVjLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICAgICAgPGJvZHk+cmVzdWx0ID0gKG51bGwpPC9ib2R5PgotICAgICAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICAgICAgPC9vd25lZFJ1bGU+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1yZWFsVmFsdWUtcmVzdWx0IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24tcmVhbFZhbHVlLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1zdHJpbmdWYWx1ZSIgbmFtZT0ic3RyaW5nVmFsdWUiIGJvZHlDb25kaXRpb249IlZhbHVlU3BlY2lmaWNhdGlvbi1zdHJpbmdWYWx1ZS1zcGVjIiBpc1F1ZXJ5PSJ0cnVlIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1zdHJpbmdWYWx1ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlZhbHVlU3BlY2lmaWNhdGlvbi1zdHJpbmdWYWx1ZSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIHF1ZXJ5IHN0cmluZ1ZhbHVlKCkgZ2l2ZXMgYSBzaW5nbGUgU3RyaW5nIHZhbHVlIHdoZW4gb25lIGNhbiBiZSBjb21wdXRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLXN0cmluZ1ZhbHVlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVmFsdWVTcGVjaWZpY2F0aW9uLXN0cmluZ1ZhbHVlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLXN0cmluZ1ZhbHVlLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobnVsbCk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLXN0cmluZ1ZhbHVlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJWYWx1ZVNwZWNpZmljYXRpb24tc3RyaW5nVmFsdWUtcmVzdWx0LV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLXVubGltaXRlZFZhbHVlIiBuYW1lPSJ1bmxpbWl0ZWRWYWx1ZSIgYm9keUNvbmRpdGlvbj0iVmFsdWVTcGVjaWZpY2F0aW9uLXVubGltaXRlZFZhbHVlLXNwZWMiIGlzUXVlcnk9InRydWUiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLXVubGltaXRlZFZhbHVlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iVmFsdWVTcGVjaWZpY2F0aW9uLXVubGltaXRlZFZhbHVlIj4KLSAgICAgICAgICA8Ym9keT5UaGUgcXVlcnkgdW5saW1pdGVkVmFsdWUoKSBnaXZlcyBhIHNpbmdsZSBVbmxpbWl0ZWROYXR1cmFsIHZhbHVlIHdoZW4gb25lIGNhbiBiZSBjb21wdXRlZC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8b3duZWRSdWxlIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLXVubGltaXRlZFZhbHVlLXNwZWMiIG5hbWU9InNwZWMiIGNvbnN0cmFpbmVkRWxlbWVudD0iVmFsdWVTcGVjaWZpY2F0aW9uLXVubGltaXRlZFZhbHVlIj4KLSAgICAgICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLXVubGltaXRlZFZhbHVlLXNwZWMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgICAgICA8Ym9keT5yZXN1bHQgPSAobnVsbCk8L2JvZHk+Ci0gICAgICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgICAgICA8L293bmVkUnVsZT4KLSAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLXVubGltaXRlZFZhbHVlLXJlc3VsdCIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjVW5saW1pdGVkTmF0dXJhbCIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVmFsdWVTcGVjaWZpY2F0aW9uLXVubGltaXRlZFZhbHVlLXJlc3VsdC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgPC9vd25lZE9wZXJhdGlvbj4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9ldmVudF90aW1lT2JzZXJ2YXRpb24iIG5hbWU9IkFfZXZlbnRfdGltZU9ic2VydmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRpbWVPYnNlcnZhdGlvbi1ldmVudCBBX2V2ZW50X3RpbWVPYnNlcnZhdGlvbi10aW1lT2JzZXJ2YXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9ldmVudF90aW1lT2JzZXJ2YXRpb24tdGltZU9ic2VydmF0aW9uIiBuYW1lPSJ0aW1lT2JzZXJ2YXRpb24iIHR5cGU9IlRpbWVPYnNlcnZhdGlvbiIgYXNzb2NpYXRpb249IkFfZXZlbnRfdGltZU9ic2VydmF0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2V2ZW50X3RpbWVPYnNlcnZhdGlvbi10aW1lT2JzZXJ2YXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2V2ZW50X3RpbWVPYnNlcnZhdGlvbi10aW1lT2JzZXJ2YXRpb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX21heF90aW1lSW50ZXJ2YWwiIG5hbWU9IkFfbWF4X3RpbWVJbnRlcnZhbCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJUaW1lSW50ZXJ2YWwtbWF4IEFfbWF4X3RpbWVJbnRlcnZhbC10aW1lSW50ZXJ2YWwiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQV9tYXhfdGltZUludGVydmFsLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBX21heF9pbnRlcnZhbCIvPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9tYXhfdGltZUludGVydmFsLXRpbWVJbnRlcnZhbCIgbmFtZT0idGltZUludGVydmFsIiB0eXBlPSJUaW1lSW50ZXJ2YWwiIHJlZGVmaW5lZFByb3BlcnR5PSJBX21heF9pbnRlcnZhbC1pbnRlcnZhbCIgYXNzb2NpYXRpb249IkFfbWF4X3RpbWVJbnRlcnZhbCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9tYXhfdGltZUludGVydmFsLXRpbWVJbnRlcnZhbC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfbWF4X3RpbWVJbnRlcnZhbC10aW1lSW50ZXJ2YWwtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX21pbl90aW1lSW50ZXJ2YWwiIG5hbWU9IkFfbWluX3RpbWVJbnRlcnZhbCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJUaW1lSW50ZXJ2YWwtbWluIEFfbWluX3RpbWVJbnRlcnZhbC10aW1lSW50ZXJ2YWwiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQV9taW5fdGltZUludGVydmFsLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJBX21pbl9pbnRlcnZhbCIvPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9taW5fdGltZUludGVydmFsLXRpbWVJbnRlcnZhbCIgbmFtZT0idGltZUludGVydmFsIiB0eXBlPSJUaW1lSW50ZXJ2YWwiIHJlZGVmaW5lZFByb3BlcnR5PSJBX21pbl9pbnRlcnZhbC1pbnRlcnZhbCIgYXNzb2NpYXRpb249IkFfbWluX3RpbWVJbnRlcnZhbCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9taW5fdGltZUludGVydmFsLXRpbWVJbnRlcnZhbC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfbWluX3RpbWVJbnRlcnZhbC10aW1lSW50ZXJ2YWwtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX2V4cHJfdGltZUV4cHJlc3Npb24iIG5hbWU9IkFfZXhwcl90aW1lRXhwcmVzc2lvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJUaW1lRXhwcmVzc2lvbi1leHByIEFfZXhwcl90aW1lRXhwcmVzc2lvbi10aW1lRXhwcmVzc2lvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2V4cHJfdGltZUV4cHJlc3Npb24tdGltZUV4cHJlc3Npb24iIG5hbWU9InRpbWVFeHByZXNzaW9uIiB0eXBlPSJUaW1lRXhwcmVzc2lvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX2V4cHJfdGltZUV4cHJlc3Npb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfZXhwcl90aW1lRXhwcmVzc2lvbi10aW1lRXhwcmVzc2lvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9vYnNlcnZhdGlvbl90aW1lRXhwcmVzc2lvbiIgbmFtZT0iQV9vYnNlcnZhdGlvbl90aW1lRXhwcmVzc2lvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJUaW1lRXhwcmVzc2lvbi1vYnNlcnZhdGlvbiBBX29ic2VydmF0aW9uX3RpbWVFeHByZXNzaW9uLXRpbWVFeHByZXNzaW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfb2JzZXJ2YXRpb25fdGltZUV4cHJlc3Npb24tdGltZUV4cHJlc3Npb24iIG5hbWU9InRpbWVFeHByZXNzaW9uIiB0eXBlPSJUaW1lRXhwcmVzc2lvbiIgYXNzb2NpYXRpb249IkFfb2JzZXJ2YXRpb25fdGltZUV4cHJlc3Npb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfb2JzZXJ2YXRpb25fdGltZUV4cHJlc3Npb24tdGltZUV4cHJlc3Npb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc3BlY2lmaWNhdGlvbl90aW1lQ29uc3RyYWludCIgbmFtZT0iQV9zcGVjaWZpY2F0aW9uX3RpbWVDb25zdHJhaW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IlRpbWVDb25zdHJhaW50LXNwZWNpZmljYXRpb24gQV9zcGVjaWZpY2F0aW9uX3RpbWVDb25zdHJhaW50LXRpbWVDb25zdHJhaW50Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFfc3BlY2lmaWNhdGlvbl90aW1lQ29uc3RyYWludC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQV9zcGVjaWZpY2F0aW9uX2ludGVydmFsQ29uc3RyYWludCIvPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9zcGVjaWZpY2F0aW9uX3RpbWVDb25zdHJhaW50LXRpbWVDb25zdHJhaW50IiBuYW1lPSJ0aW1lQ29uc3RyYWludCIgdHlwZT0iVGltZUNvbnN0cmFpbnQiIHJlZGVmaW5lZFByb3BlcnR5PSJBX3NwZWNpZmljYXRpb25faW50ZXJ2YWxDb25zdHJhaW50LWludGVydmFsQ29uc3RyYWludCIgYXNzb2NpYXRpb249IkFfc3BlY2lmaWNhdGlvbl90aW1lQ29uc3RyYWludCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9zcGVjaWZpY2F0aW9uX3RpbWVDb25zdHJhaW50LXRpbWVDb25zdHJhaW50LV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3N1YkV4cHJlc3Npb25fb3duaW5nRXhwcmVzc2lvbiIgbmFtZT0iQV9zdWJFeHByZXNzaW9uX293bmluZ0V4cHJlc3Npb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iU3RyaW5nRXhwcmVzc2lvbi1zdWJFeHByZXNzaW9uIFN0cmluZ0V4cHJlc3Npb24tb3duaW5nRXhwcmVzc2lvbiIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3Jlc3VsdF9vcGFxdWVFeHByZXNzaW9uIiBuYW1lPSJBX3Jlc3VsdF9vcGFxdWVFeHByZXNzaW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBpc0Rlcml2ZWQ9InRydWUiIG1lbWJlckVuZD0iT3BhcXVlRXhwcmVzc2lvbi1yZXN1bHQgQV9yZXN1bHRfb3BhcXVlRXhwcmVzc2lvbi1vcGFxdWVFeHByZXNzaW9uIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9IkFfcmVzdWx0X29wYXF1ZUV4cHJlc3Npb24tb3BhcXVlRXhwcmVzc2lvbiIgbmFtZT0ib3BhcXVlRXhwcmVzc2lvbiIgdHlwZT0iT3BhcXVlRXhwcmVzc2lvbiIgYXNzb2NpYXRpb249IkFfcmVzdWx0X29wYXF1ZUV4cHJlc3Npb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfcmVzdWx0X29wYXF1ZUV4cHJlc3Npb24tb3BhcXVlRXhwcmVzc2lvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfcmVzdWx0X29wYXF1ZUV4cHJlc3Npb24tb3BhcXVlRXhwcmVzc2lvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfYmVoYXZpb3Jfb3BhcXVlRXhwcmVzc2lvbiIgbmFtZT0iQV9iZWhhdmlvcl9vcGFxdWVFeHByZXNzaW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9Ik9wYXF1ZUV4cHJlc3Npb24tYmVoYXZpb3IgQV9iZWhhdmlvcl9vcGFxdWVFeHByZXNzaW9uLW9wYXF1ZUV4cHJlc3Npb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9iZWhhdmlvcl9vcGFxdWVFeHByZXNzaW9uLW9wYXF1ZUV4cHJlc3Npb24iIG5hbWU9Im9wYXF1ZUV4cHJlc3Npb24iIHR5cGU9Ik9wYXF1ZUV4cHJlc3Npb24iIGFzc29jaWF0aW9uPSJBX2JlaGF2aW9yX29wYXF1ZUV4cHJlc3Npb24iPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfYmVoYXZpb3Jfb3BhcXVlRXhwcmVzc2lvbi1vcGFxdWVFeHByZXNzaW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9iZWhhdmlvcl9vcGFxdWVFeHByZXNzaW9uLW9wYXF1ZUV4cHJlc3Npb24tX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX3NwZWNpZmljYXRpb25faW50ZXJ2YWxDb25zdHJhaW50IiBuYW1lPSJBX3NwZWNpZmljYXRpb25faW50ZXJ2YWxDb25zdHJhaW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkludGVydmFsQ29uc3RyYWludC1zcGVjaWZpY2F0aW9uIEFfc3BlY2lmaWNhdGlvbl9pbnRlcnZhbENvbnN0cmFpbnQtaW50ZXJ2YWxDb25zdHJhaW50Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFfc3BlY2lmaWNhdGlvbl9pbnRlcnZhbENvbnN0cmFpbnQtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFfc3BlY2lmaWNhdGlvbl9vd25pbmdDb25zdHJhaW50Ii8+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX3NwZWNpZmljYXRpb25faW50ZXJ2YWxDb25zdHJhaW50LWludGVydmFsQ29uc3RyYWludCIgbmFtZT0iaW50ZXJ2YWxDb25zdHJhaW50IiB0eXBlPSJJbnRlcnZhbENvbnN0cmFpbnQiIHJlZGVmaW5lZFByb3BlcnR5PSJBX3NwZWNpZmljYXRpb25fb3duaW5nQ29uc3RyYWludC1vd25pbmdDb25zdHJhaW50IiBhc3NvY2lhdGlvbj0iQV9zcGVjaWZpY2F0aW9uX2ludGVydmFsQ29uc3RyYWludCI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9zcGVjaWZpY2F0aW9uX2ludGVydmFsQ29uc3RyYWludC1pbnRlcnZhbENvbnN0cmFpbnQtX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbWF4X2ludGVydmFsIiBuYW1lPSJBX21heF9pbnRlcnZhbCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgbWVtYmVyRW5kPSJJbnRlcnZhbC1tYXggQV9tYXhfaW50ZXJ2YWwtaW50ZXJ2YWwiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9tYXhfaW50ZXJ2YWwtaW50ZXJ2YWwiIG5hbWU9ImludGVydmFsIiB0eXBlPSJJbnRlcnZhbCIgYXNzb2NpYXRpb249IkFfbWF4X2ludGVydmFsIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX21heF9pbnRlcnZhbC1pbnRlcnZhbC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfbWF4X2ludGVydmFsLWludGVydmFsLV91cHBlclZhbHVlIiB2YWx1ZT0iKiIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9taW5faW50ZXJ2YWwiIG5hbWU9IkFfbWluX2ludGVydmFsIiB2aXNpYmlsaXR5PSJwcml2YXRlIiBtZW1iZXJFbmQ9IkludGVydmFsLW1pbiBBX21pbl9pbnRlcnZhbC1pbnRlcnZhbCI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX21pbl9pbnRlcnZhbC1pbnRlcnZhbCIgbmFtZT0iaW50ZXJ2YWwiIHR5cGU9IkludGVydmFsIiBhc3NvY2lhdGlvbj0iQV9taW5faW50ZXJ2YWwiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbWluX2ludGVydmFsLWludGVydmFsLV9sb3dlclZhbHVlIi8+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iQV9taW5faW50ZXJ2YWwtaW50ZXJ2YWwtX3VwcGVyVmFsdWUiIHZhbHVlPSIqIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJBX29wZXJhbmRfZXhwcmVzc2lvbiIgbmFtZT0iQV9vcGVyYW5kX2V4cHJlc3Npb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRXhwcmVzc2lvbi1vcGVyYW5kIEFfb3BlcmFuZF9leHByZXNzaW9uLWV4cHJlc3Npb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9vcGVyYW5kX2V4cHJlc3Npb24tZXhwcmVzc2lvbiIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iRXhwcmVzc2lvbiIgc3Vic2V0dGVkUHJvcGVydHk9IkVsZW1lbnQtb3duZXIiIGFzc29jaWF0aW9uPSJBX29wZXJhbmRfZXhwcmVzc2lvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9vcGVyYW5kX2V4cHJlc3Npb24tZXhwcmVzc2lvbi1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9ldmVudF9kdXJhdGlvbk9ic2VydmF0aW9uIiBuYW1lPSJBX2V2ZW50X2R1cmF0aW9uT2JzZXJ2YXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRHVyYXRpb25PYnNlcnZhdGlvbi1ldmVudCBBX2V2ZW50X2R1cmF0aW9uT2JzZXJ2YXRpb24tZHVyYXRpb25PYnNlcnZhdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX2V2ZW50X2R1cmF0aW9uT2JzZXJ2YXRpb24tZHVyYXRpb25PYnNlcnZhdGlvbiIgbmFtZT0iZHVyYXRpb25PYnNlcnZhdGlvbiIgdHlwZT0iRHVyYXRpb25PYnNlcnZhdGlvbiIgYXNzb2NpYXRpb249IkFfZXZlbnRfZHVyYXRpb25PYnNlcnZhdGlvbiI+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQV9ldmVudF9kdXJhdGlvbk9ic2VydmF0aW9uLWR1cmF0aW9uT2JzZXJ2YXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJBX2V2ZW50X2R1cmF0aW9uT2JzZXJ2YXRpb24tZHVyYXRpb25PYnNlcnZhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbWF4X2R1cmF0aW9uSW50ZXJ2YWwiIG5hbWU9IkFfbWF4X2R1cmF0aW9uSW50ZXJ2YWwiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRHVyYXRpb25JbnRlcnZhbC1tYXggQV9tYXhfZHVyYXRpb25JbnRlcnZhbC1kdXJhdGlvbkludGVydmFsIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFfbWF4X2R1cmF0aW9uSW50ZXJ2YWwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFfbWF4X2ludGVydmFsIi8+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX21heF9kdXJhdGlvbkludGVydmFsLWR1cmF0aW9uSW50ZXJ2YWwiIG5hbWU9ImR1cmF0aW9uSW50ZXJ2YWwiIHR5cGU9IkR1cmF0aW9uSW50ZXJ2YWwiIHJlZGVmaW5lZFByb3BlcnR5PSJBX21heF9pbnRlcnZhbC1pbnRlcnZhbCIgYXNzb2NpYXRpb249IkFfbWF4X2R1cmF0aW9uSW50ZXJ2YWwiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbWF4X2R1cmF0aW9uSW50ZXJ2YWwtZHVyYXRpb25JbnRlcnZhbC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfbWF4X2R1cmF0aW9uSW50ZXJ2YWwtZHVyYXRpb25JbnRlcnZhbC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfbWluX2R1cmF0aW9uSW50ZXJ2YWwiIG5hbWU9IkFfbWluX2R1cmF0aW9uSW50ZXJ2YWwiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRHVyYXRpb25JbnRlcnZhbC1taW4gQV9taW5fZHVyYXRpb25JbnRlcnZhbC1kdXJhdGlvbkludGVydmFsIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkFfbWluX2R1cmF0aW9uSW50ZXJ2YWwtX2dlbmVyYWxpemF0aW9uLjAiIGdlbmVyYWw9IkFfbWluX2ludGVydmFsIi8+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX21pbl9kdXJhdGlvbkludGVydmFsLWR1cmF0aW9uSW50ZXJ2YWwiIG5hbWU9ImR1cmF0aW9uSW50ZXJ2YWwiIHR5cGU9IkR1cmF0aW9uSW50ZXJ2YWwiIHJlZGVmaW5lZFByb3BlcnR5PSJBX21pbl9pbnRlcnZhbC1pbnRlcnZhbCIgYXNzb2NpYXRpb249IkFfbWluX2R1cmF0aW9uSW50ZXJ2YWwiPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFfbWluX2R1cmF0aW9uSW50ZXJ2YWwtZHVyYXRpb25JbnRlcnZhbC1fbG93ZXJWYWx1ZSIvPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkFfbWluX2R1cmF0aW9uSW50ZXJ2YWwtZHVyYXRpb25JbnRlcnZhbC1fdXBwZXJWYWx1ZSIgdmFsdWU9IioiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfc3BlY2lmaWNhdGlvbl9kdXJhdGlvbkNvbnN0cmFpbnQiIG5hbWU9IkFfc3BlY2lmaWNhdGlvbl9kdXJhdGlvbkNvbnN0cmFpbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRHVyYXRpb25Db25zdHJhaW50LXNwZWNpZmljYXRpb24gQV9zcGVjaWZpY2F0aW9uX2R1cmF0aW9uQ29uc3RyYWludC1kdXJhdGlvbkNvbnN0cmFpbnQiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iQV9zcGVjaWZpY2F0aW9uX2R1cmF0aW9uQ29uc3RyYWludC1fZ2VuZXJhbGl6YXRpb24uMCIgZ2VuZXJhbD0iQV9zcGVjaWZpY2F0aW9uX2ludGVydmFsQ29uc3RyYWludCIvPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9zcGVjaWZpY2F0aW9uX2R1cmF0aW9uQ29uc3RyYWludC1kdXJhdGlvbkNvbnN0cmFpbnQiIG5hbWU9ImR1cmF0aW9uQ29uc3RyYWludCIgdHlwZT0iRHVyYXRpb25Db25zdHJhaW50IiByZWRlZmluZWRQcm9wZXJ0eT0iQV9zcGVjaWZpY2F0aW9uX2ludGVydmFsQ29uc3RyYWludC1pbnRlcnZhbENvbnN0cmFpbnQiIGFzc29jaWF0aW9uPSJBX3NwZWNpZmljYXRpb25fZHVyYXRpb25Db25zdHJhaW50Ij4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX3NwZWNpZmljYXRpb25fZHVyYXRpb25Db25zdHJhaW50LWR1cmF0aW9uQ29uc3RyYWludC1fbG93ZXJWYWx1ZSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iQV9leHByX2R1cmF0aW9uIiBuYW1lPSJBX2V4cHJfZHVyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRHVyYXRpb24tZXhwciBBX2V4cHJfZHVyYXRpb24tZHVyYXRpb24iPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iQV9leHByX2R1cmF0aW9uLWR1cmF0aW9uIiBuYW1lPSJkdXJhdGlvbiIgdHlwZT0iRHVyYXRpb24iIHN1YnNldHRlZFByb3BlcnR5PSJFbGVtZW50LW93bmVyIiBhc3NvY2lhdGlvbj0iQV9leHByX2R1cmF0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX2V4cHJfZHVyYXRpb24tZHVyYXRpb24tX2xvd2VyVmFsdWUiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9IkFfb2JzZXJ2YXRpb25fZHVyYXRpb24iIG5hbWU9IkFfb2JzZXJ2YXRpb25fZHVyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIG1lbWJlckVuZD0iRHVyYXRpb24tb2JzZXJ2YXRpb24gQV9vYnNlcnZhdGlvbl9kdXJhdGlvbi1kdXJhdGlvbiI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJBX29ic2VydmF0aW9uX2R1cmF0aW9uLWR1cmF0aW9uIiBuYW1lPSJkdXJhdGlvbiIgdHlwZT0iRHVyYXRpb24iIGFzc29jaWF0aW9uPSJBX29ic2VydmF0aW9uX2R1cmF0aW9uIj4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBX29ic2VydmF0aW9uX2R1cmF0aW9uLWR1cmF0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfcHJvZmlsZUFwcGxpY2F0aW9uLjAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9wcm9maWxlQXBwbGljYXRpb24uMC1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfejFPRmNIanFFZHk4UzRDcjhSY19OQSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfMCIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfcHJvZmlsZUFwcGxpY2F0aW9uLjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9wcm9maWxlQXBwbGljYXRpb24uMS1faHR0cDJGMkZ3d3cuZWNsaXBzZS5vcmcyRnVtbDIyRjIuMC4wMkZVTUwiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTC9Qcm9maWxlL1N0YW5kYXJkIy8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9Ii4uL3Byb2ZpbGVzL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gIDwvdW1sOk1vZGVsPgotICA8c3RhbmRhcmQ6TWV0YW1vZGVsIHhtaTppZD0iX3E4UFA4QXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfTW9kZWw9Il8wIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThQM0FBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThRZUVBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iVmFyaWFibGVBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOFFlRVF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJXcml0ZUxpbmtBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOFJGSUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJXcml0ZVN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThSRklReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iV3JpdGVWYXJpYWJsZUFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4UnNNQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFjY2VwdENhbGxBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOFJzTVF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJBY2NlcHRFdmVudEFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4U1RRQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4UzZVQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFjdGlvbklucHV0UGluIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThTNlVReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4VGhZQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFkZFZhcmlhYmxlVmFsdWVBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOFRoWVF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJCcm9hZGNhc3RTaWduYWxBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOFVJY0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJDYWxsQWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThVSWNReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQ2FsbEJlaGF2aW9yQWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThVdmdBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQ2FsbE9wZXJhdGlvbkFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4VXZnUXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNsYXVzZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4VldrQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNsZWFyQXNzb2NpYXRpb25BY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOFY5b0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJDbGVhclN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThWOW9ReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQ2xlYXJWYXJpYWJsZUFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4VjlvZ3lCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNvbmRpdGlvbmFsTm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4V2tzQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNyZWF0ZUxpbmtBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOFhMd0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJDcmVhdGVMaW5rT2JqZWN0QWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThYTHdReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQ3JlYXRlT2JqZWN0QWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThYeTBBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRGVzdHJveUxpbmtBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOFh5MFF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJEZXN0cm95T2JqZWN0QWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThZWjRBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRXhwYW5zaW9uTm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4WVo0UXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkV4cGFuc2lvblJlZ2lvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4WkE4QXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IklucHV0UGluIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThaQThReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iSW52b2NhdGlvbkFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4Wm9BQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkxpbmtBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOFpvQVF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJMaW5rRW5kQ3JlYXRpb25EYXRhIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThhUEVBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iTGlua0VuZERhdGEiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGEySUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJMaW5rRW5kRGVzdHJ1Y3Rpb25EYXRhIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThhMklReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iTG9vcE5vZGUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGJkTUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJPcGFxdWVBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGNFUUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJPdXRwdXRQaW4iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGNFUVF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJQaW4iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGNFUWd5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJRdWFsaWZpZXJWYWx1ZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4Y3JVQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJhaXNlRXhjZXB0aW9uQWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThjclVReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iUmVhZEV4dGVudEFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4ZFNZQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJlYWRJc0NsYXNzaWZpZWRPYmplY3RBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGRTWVF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJSZWFkTGlua0FjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4ZDVjQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJlYWRMaW5rT2JqZWN0RW5kQWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThlZ2dBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iUmVhZExpbmtPYmplY3RFbmRRdWFsaWZpZXJBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGVnZ1F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJSZWFkU2VsZkFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4ZkhrQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4ZkhrUXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJlYWRWYXJpYWJsZUFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4ZnVvQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJlY2xhc3NpZnlPYmplY3RBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGdWc0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJSZWR1Y2VBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGdWc1F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJSZW1vdmVTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThnOHdBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iUmVtb3ZlVmFyaWFibGVWYWx1ZUFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4Zzh3UXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJlcGx5QWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThoajBBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iU2VuZE9iamVjdEFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4aGowUXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlNlbmRTaWduYWxBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGlLNEF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJTZXF1ZW5jZU5vZGUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGlLNFF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJTdGFydENsYXNzaWZpZXJCZWhhdmlvckFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4aXg4QXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGpaQUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4alpBUXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGtBRUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJUZXN0SWRlbnRpdHlBY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOGtuSUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJVbm1hcnNoYWxsQWN0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThsT01BeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iVmFsdWVQaW4iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOHBmb0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJBY3Rpdml0eSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4cUdzQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFjdGl2aXR5RWRnZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4clUwQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFjdGl2aXR5RmluYWxOb2RlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcThyVTBReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQWN0aXZpdHlHcm91cCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4cjc0QXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFjdGl2aXR5Tm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4dEtBQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4dHhFQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFjdGl2aXR5UGFydGl0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTh1WUlBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQ2VudHJhbEJ1ZmZlck5vZGUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOHVZSVF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJDb250cm9sRmxvdyIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4dV9NQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNvbnRyb2xOb2RlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTh1X01ReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRGF0YVN0b3JlTm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4dm1RQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkRlY2lzaW9uTm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4d05VQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkV4Y2VwdGlvbkhhbmRsZXIiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOHcwWUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJFeGVjdXRhYmxlTm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4dzBZUXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkZpbmFsTm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4eGJjQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkZsb3dGaW5hbE5vZGUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOHhiY1F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJGb3JrTm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4eUNnQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkluaXRpYWxOb2RlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTh5Q2dReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iSW50ZXJydXB0aWJsZUFjdGl2aXR5UmVnaW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTh5cGtBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iSm9pbk5vZGUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOHpRb0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJNZXJnZU5vZGUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOHpRb1F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJPYmplY3RGbG93Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTgwZXdBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iT2JqZWN0Tm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E4MUYwQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlZhcmlhYmxlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTgyN0FBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iU3Vic3RpdHV0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTgzaUVBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQmVoYXZpb3JhbEZlYXR1cmUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xODVYUUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJDbGFzc2lmaWVyIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTlESVFBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQ2xhc3NpZmllclRlbXBsYXRlUGFyYW1ldGVyIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTlEdlVBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRmVhdHVyZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5RVdZQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkdlbmVyYWxpemF0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTlFOWNBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iR2VuZXJhbGl6YXRpb25TZXQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOUZrZ0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJJbnN0YW5jZVNwZWNpZmljYXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOUdMa0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJJbnN0YW5jZVZhbHVlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTlHTGtReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iT3BlcmF0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTlJbjBBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iT3BlcmF0aW9uVGVtcGxhdGVQYXJhbWV0ZXIiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOUpPNEF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJQYXJhbWV0ZXIiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOUxFRUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJQYXJhbWV0ZXJTZXQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOUxySUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJQcm9wZXJ0eSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5UFZnQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJlZGVmaW5hYmxlRWxlbWVudCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5UWpvQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJlZGVmaW5hYmxlVGVtcGxhdGVTaWduYXR1cmUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOVJLc0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJTbG90Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTlSeHdBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iU3RydWN0dXJhbEZlYXR1cmUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOVdETUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJBbnlSZWNlaXZlRXZlbnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOVdETVF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJCZWhhdmlvciIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5WDRZQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNhbGxFdmVudCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5WWZjQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNoYW5nZUV2ZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTlZZmNReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRXZlbnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOVpHZ0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJGdW5jdGlvbkJlaGF2aW9yIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTladGtBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iTWVzc2FnZUV2ZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTladGtReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iT3BhcXVlQmVoYXZpb3IiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOWFVb0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJTaWduYWxFdmVudCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5YVVvUXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlRpbWVFdmVudCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5YTdzQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlRyaWdnZXIiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOWN3NEF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJBYnN0cmFjdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5Y3c0UXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNvbW1lbnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOWRYOEF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJDb25zdHJhaW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTlkX0FBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRGVwZW5kZW5jeSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5ZW1FQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkRpcmVjdGVkUmVsYXRpb25zaGlwIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTllbUVReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRWxlbWVudCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5a3NzQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkVsZW1lbnRJbXBvcnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOWxUd0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJNdWx0aXBsaWNpdHlFbGVtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTlvWEVBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iTmFtZWRFbGVtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTlxelVBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iTmFtZXNwYWNlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTl0UGtBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTl0Mm9BeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iUGFja2FnZUltcG9ydCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5dWRzQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlBhcmFtZXRlcmFibGVFbGVtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTl2RXdBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iUmVhbGl6YXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOXZyMEF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJSZWxhdGlvbnNoaXAiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOXZyMFF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJUZW1wbGF0ZWFibGVFbGVtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTl3UzRBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iVGVtcGxhdGVCaW5kaW5nIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTl3NThBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iVGVtcGxhdGVQYXJhbWV0ZXIiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOXhoQUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJUZW1wbGF0ZVBhcmFtZXRlclN1YnN0aXR1dGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5eUlFQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlRlbXBsYXRlU2lnbmF0dXJlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTl5dklBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iVHlwZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5ejlRQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlR5cGVkRWxlbWVudCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5MGtVQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlVzYWdlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTk0T3NBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQXJ0aWZhY3QiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOTZENEF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJDb21tdW5pY2F0aW9uUGF0aCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5NkQ0UXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkRlcGxveWVkQXJ0aWZhY3QiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOTZENGd5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJEZXBsb3ltZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTk2cThBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRGVwbG95bWVudFNwZWNpZmljYXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOTc1RUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJEZXBsb3ltZW50VGFyZ2V0Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTk4Z0lBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRGV2aWNlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTk4Z0lReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRXhlY3V0aW9uRW52aXJvbm1lbnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xOTlITUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJNYW5pZmVzdGF0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcTk5SE1ReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iTm9kZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3E5X2pjQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkluZm9ybWF0aW9uRmxvdyIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtQXhrQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkluZm9ybWF0aW9uSXRlbSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtQ213QXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFjdGlvbkV4ZWN1dGlvblNwZWNpZmljYXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLUROMEF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJCZWhhdmlvckV4ZWN1dGlvblNwZWNpZmljYXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLUROMFF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJDb21iaW5lZEZyYWdtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1FYjhBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQ29uc2lkZXJJZ25vcmVGcmFnbWVudCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtRWI4UXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNvbnRpbnVhdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtRkRBQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkRlc3RydWN0aW9uT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLUZxRUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJFeGVjdXRpb25PY2N1cnJlbmNlU3BlY2lmaWNhdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtR1JJQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkV4ZWN1dGlvblNwZWNpZmljYXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLUdSSVF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJHYXRlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1JdFlBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iR2VuZXJhbE9yZGVyaW5nIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1KVWNBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iSW50ZXJhY3Rpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLUtpa0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJJbnRlcmFjdGlvbkNvbnN0cmFpbnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLUxKb0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJJbnRlcmFjdGlvbkZyYWdtZW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1NWHdBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iSW50ZXJhY3Rpb25PcGVyYW5kIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1NLTBBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iSW50ZXJhY3Rpb25Vc2UiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLU9NOEF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJMaWZlbGluZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtUGJFQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9Ik1lc3NhZ2UiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLVIzVUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJNZXNzYWdlRW5kIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1URmNBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iTWVzc2FnZU9jY3VycmVuY2VTcGVjaWZpY2F0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1Uc2dBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iT2NjdXJyZW5jZVNwZWNpZmljYXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLVVUa0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJQYXJ0RGVjb21wb3NpdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtVTZvQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlN0YXRlSW52YXJpYW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1iQlFBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRXh0ZW5zaW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1jMmNBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRXh0ZW5zaW9uRW5kIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1lRWtBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iSW1hZ2UiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLWVyb0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJNb2RlbCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtZXJvUXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlBhY2thZ2UiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLW1uY0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJQYWNrYWdlTWVyZ2UiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLW1uY1F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJQcm9maWxlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1wcXdBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iUHJvZmlsZUFwcGxpY2F0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS1xNDRBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iU3RlcmVvdHlwZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtdktVQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkJlaGF2aW9yZWRDbGFzc2lmaWVyIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS13X2dBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRGF0YVR5cGUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLXkwc0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJFbnVtZXJhdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtemJ3QXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkVudW1lcmF0aW9uTGl0ZXJhbCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtMEMwQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkludGVyZmFjZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtMmZFQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkludGVyZmFjZVJlYWxpemF0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS0zR0lBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iUHJpbWl0aXZlVHlwZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtM0dJUXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJlY2VwdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtM3RNQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlNpZ25hbCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtNndnQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNvbm5lY3Rpb25Qb2ludFJlZmVyZW5jZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3EtNy1vQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkZpbmFsU3RhdGUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLThsc0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJQcm90b2NvbENvbmZvcm1hbmNlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcS05TXdBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iUHJvdG9jb2xTdGF0ZU1hY2hpbmUiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLTl6MEF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJQcm90b2NvbFRyYW5zaXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xLV9wQUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJQc2V1ZG9zdGF0ZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfQmVNQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlJlZ2lvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfRDZjQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlN0YXRlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV9JeThBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iU3RhdGVNYWNoaW5lIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV9MUE1BeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iVHJhbnNpdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfT1NnQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlZlcnRleCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfVm5RQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFzc29jaWF0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV9ZRGdBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQXNzb2NpYXRpb25DbGFzcyIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfWXFrQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNsYXNzIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV9idDRBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQ29sbGFib3JhdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfY1U4QXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNvbGxhYm9yYXRpb25Vc2UiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xX2RqRUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJDb21wb25lbnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xX2ZfVUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJDb21wb25lbnRSZWFsaXphdGlvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfZ21ZQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNvbm5lY3RhYmxlRWxlbWVudCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfaDBnQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkNvbm5lY3RhYmxlRWxlbWVudFRlbXBsYXRlUGFyYW1ldGVyIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV9pYmtBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQ29ubmVjdG9yIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV9qcHNBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iQ29ubmVjdG9yRW5kIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV9sZTRBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRW5jYXBzdWxhdGVkQ2xhc3NpZmllciIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfbUY4QXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlBvcnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xX3BKUUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJTdHJ1Y3R1cmVkQ2xhc3NpZmllciIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3Ffd2VBQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkFjdG9yIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV94RkVBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRXh0ZW5kIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV95VE1BeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRXh0ZW5zaW9uUG9pbnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xX3k2UUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJJbmNsdWRlIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV96aFVBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iVXNlQ2FzZSIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfMTlrQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkR1cmF0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV8zTHNBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRHVyYXRpb25Db25zdHJhaW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV80WjBBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iRHVyYXRpb25JbnRlcnZhbCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfNUE0QXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkR1cmF0aW9uT2JzZXJ2YXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xXzVuOEF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJFeHByZXNzaW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV82UEFBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iSW50ZXJ2YWwiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xXzYyRUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJJbnRlcnZhbENvbnN0cmFpbnQiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xXzdkSUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJMaXRlcmFsQm9vbGVhbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfOEVNQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkxpdGVyYWxJbnRlZ2VyIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV85U1VBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iTGl0ZXJhbE51bGwiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9xXzk1WUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJMaXRlcmFsUmVhbCIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3FfX0hnQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkxpdGVyYWxTcGVjaWZpY2F0aW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfcV9fSGdReUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iTGl0ZXJhbFN0cmluZyIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3JBQVZvQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfckFCandBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iT2JzZXJ2YXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9yQUJqd1F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJPcGFxdWVFeHByZXNzaW9uIi8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfckFFbkVBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iU3RyaW5nRXhwcmVzc2lvbiIvPgotICA8c3RhbmRhcmQ6TWV0YWNsYXNzIHhtaTppZD0iX3JBRjFNQXlCRWVhdDEtRHl3WkdwMkEiIGJhc2VfQ2xhc3M9IlRpbWVDb25zdHJhaW50Ii8+Ci0gIDxzdGFuZGFyZDpNZXRhY2xhc3MgeG1pOmlkPSJfckFIRFVBeUJFZWF0MS1EeXdaR3AyQSIgYmFzZV9DbGFzcz0iVGltZUV4cHJlc3Npb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9yQUhxWUF5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJUaW1lSW50ZXJ2YWwiLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9yQUlSY0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJUaW1lT2JzZXJ2YXRpb24iLz4KLSAgPHN0YW5kYXJkOk1ldGFjbGFzcyB4bWk6aWQ9Il9yQUk0Z0F5QkVlYXQxLUR5d1pHcDJBIiBiYXNlX0NsYXNzPSJWYWx1ZVNwZWNpZmljYXRpb24iLz4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL3Byb2ZpbGVzL1N0YW5kYXJkLnByb2ZpbGUudW1sIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvQzIvcmVzb3VyY2VzL21vZGVsL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvcHJvZmlsZXMvU3RhbmRhcmQucHJvZmlsZS51bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmN2ZlNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvQzIvcmVzb3VyY2VzL21vZGVsL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvcHJvZmlsZXMvU3RhbmRhcmQucHJvZmlsZS51bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx1bWw6UHJvZmlsZSB4bWk6dmVyc2lvbj0iMjAxMzEwMDEiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL3NwZWMvWE1JLzIwMTMxMDAxIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1MIiB4bWk6aWQ9Il8wIiBuYW1lPSJTdGFuZGFyZFByb2ZpbGUiIFVSST0iaHR0cDovL3d3dy5vbWcub3JnL3NwZWMvVU1MLzIwMTMxMDAxL1N0YW5kYXJkUHJvZmlsZSIgbWV0YW1vZGVsUmVmZXJlbmNlPSJfcGFja2FnZUltcG9ydC4wIj4KLSAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9xdTE1c0lDUkVlT0IzckhTbzFCM293IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfcXUxNXNZQ1JFZU9CM3JIU28xQjNvdyIgc291cmNlPSJTdGFuZGFyZFByb2ZpbGUiIHJlZmVyZW5jZXM9IkFic3RyYWN0aW9uX0Rlcml2ZS1leHRlbnNpb25fRGVyaXZlIEFic3RyYWN0aW9uX0Rlcml2ZSBBYnN0cmFjdGlvbl9SZWZpbmUtZXh0ZW5zaW9uX1JlZmluZSBBYnN0cmFjdGlvbl9SZWZpbmUgQWJzdHJhY3Rpb25fVHJhY2UtZXh0ZW5zaW9uX1RyYWNlIEFic3RyYWN0aW9uX1RyYWNlIEFydGlmYWN0X0RvY3VtZW50LWV4dGVuc2lvbl9Eb2N1bWVudCBBcnRpZmFjdF9Eb2N1bWVudCBBcnRpZmFjdF9FeGVjdXRhYmxlLWV4dGVuc2lvbl9FeGVjdXRhYmxlIEFydGlmYWN0X0V4ZWN1dGFibGUgQXJ0aWZhY3RfRmlsZS1leHRlbnNpb25fRmlsZSBBcnRpZmFjdF9GaWxlIEFydGlmYWN0X0xpYnJhcnktZXh0ZW5zaW9uX0xpYnJhcnkgQXJ0aWZhY3RfTGlicmFyeSBBcnRpZmFjdF9TY3JpcHQtZXh0ZW5zaW9uX1NjcmlwdCBBcnRpZmFjdF9TY3JpcHQgQXJ0aWZhY3RfU291cmNlLWV4dGVuc2lvbl9Tb3VyY2UgQXJ0aWZhY3RfU291cmNlIEJlaGF2aW9yYWxGZWF0dXJlX0NyZWF0ZS1leHRlbnNpb25fQ3JlYXRlIEJlaGF2aW9yYWxGZWF0dXJlX0NyZWF0ZSBCZWhhdmlvcmFsRmVhdHVyZV9EZXN0cm95LWV4dGVuc2lvbl9EZXN0cm95IEJlaGF2aW9yYWxGZWF0dXJlX0Rlc3Ryb3kgQ2xhc3NfQXV4aWxpYXJ5LWV4dGVuc2lvbl9BdXhpbGlhcnkgQ2xhc3NfQXV4aWxpYXJ5IENsYXNzX0ZvY3VzLWV4dGVuc2lvbl9Gb2N1cyBDbGFzc19Gb2N1cyBDbGFzc19JbXBsZW1lbnRhdGlvbkNsYXNzLWV4dGVuc2lvbl9JbXBsZW1lbnRhdGlvbkNsYXNzIENsYXNzX0ltcGxlbWVudGF0aW9uQ2xhc3MgQ2xhc3NfTWV0YWNsYXNzLWV4dGVuc2lvbl9NZXRhY2xhc3MgQ2xhc3NfTWV0YWNsYXNzIENsYXNzX1R5cGUtZXh0ZW5zaW9uX1R5cGUgQ2xhc3NfVHlwZSBDbGFzc19VdGlsaXR5LWV4dGVuc2lvbl9VdGlsaXR5IENsYXNzX1V0aWxpdHkgQ2xhc3NpZmllcl9SZWFsaXphdGlvbi1leHRlbnNpb25fUmVhbGl6YXRpb24gQ2xhc3NpZmllcl9SZWFsaXphdGlvbiBDbGFzc2lmaWVyX1NwZWNpZmljYXRpb24tZXh0ZW5zaW9uX1NwZWNpZmljYXRpb24gQ2xhc3NpZmllcl9TcGVjaWZpY2F0aW9uIENvbXBvbmVudF9FbnRpdHktZXh0ZW5zaW9uX0VudGl0eSBDb21wb25lbnRfRW50aXR5IENvbXBvbmVudF9JbXBsZW1lbnQtZXh0ZW5zaW9uX0ltcGxlbWVudCBDb21wb25lbnRfSW1wbGVtZW50IENvbXBvbmVudF9Qcm9jZXNzLWV4dGVuc2lvbl9Qcm9jZXNzIENvbXBvbmVudF9Qcm9jZXNzIENvbXBvbmVudF9TZXJ2aWNlLWV4dGVuc2lvbl9TZXJ2aWNlIENvbXBvbmVudF9TZXJ2aWNlIENvbXBvbmVudF9TdWJzeXN0ZW0tZXh0ZW5zaW9uX1N1YnN5c3RlbSBDb21wb25lbnRfU3Vic3lzdGVtIFBhY2thZ2VfRnJhbWV3b3JrLWV4dGVuc2lvbl9GcmFtZXdvcmsgUGFja2FnZV9GcmFtZXdvcmsgUGFja2FnZV9Nb2RlbExpYnJhcnktZXh0ZW5zaW9uX01vZGVsTGlicmFyeSBQYWNrYWdlX01vZGVsTGlicmFyeSBVc2FnZV9DYWxsLWV4dGVuc2lvbl9DYWxsIFVzYWdlX0NhbGwgVXNhZ2VfQ3JlYXRlLWV4dGVuc2lvbl9DcmVhdGUgVXNhZ2VfQ3JlYXRlIFVzYWdlX0luc3RhbnRpYXRlLWV4dGVuc2lvbl9JbnN0YW50aWF0ZSBVc2FnZV9JbnN0YW50aWF0ZSBVc2FnZV9SZXNwb25zaWJpbGl0eS1leHRlbnNpb25fUmVzcG9uc2liaWxpdHkgVXNhZ2VfUmVzcG9uc2liaWxpdHkgVXNhZ2VfU2VuZC1leHRlbnNpb25fU2VuZCBVc2FnZV9TZW5kIEF1eGlsaWFyeS1iYXNlX0NsYXNzIEF1eGlsaWFyeSBDYWxsLWJhc2VfVXNhZ2UgQ2FsbCBDcmVhdGUtYmFzZV9CZWhhdmlvcmFsRmVhdHVyZSBDcmVhdGUtYmFzZV9Vc2FnZSBDcmVhdGUgRGVyaXZlLWJhc2VfQWJzdHJhY3Rpb24gRGVyaXZlIERlc3Ryb3ktYmFzZV9CZWhhdmlvcmFsRmVhdHVyZSBEZXN0cm95IERvY3VtZW50LWJhc2VfQXJ0aWZhY3QgRG9jdW1lbnQgRW50aXR5LWJhc2VfQ29tcG9uZW50IEVudGl0eSBFeGVjdXRhYmxlLWJhc2VfQXJ0aWZhY3QgRXhlY3V0YWJsZSBGaWxlLWJhc2VfQXJ0aWZhY3QgRmlsZSBGb2N1cy1iYXNlX0NsYXNzIEZvY3VzIEZyYW1ld29yay1iYXNlX1BhY2thZ2UgRnJhbWV3b3JrIEltcGxlbWVudC1iYXNlX0NvbXBvbmVudCBJbXBsZW1lbnQgSW1wbGVtZW50YXRpb25DbGFzcy1iYXNlX0NsYXNzIEltcGxlbWVudGF0aW9uQ2xhc3MgSW5zdGFudGlhdGUtYmFzZV9Vc2FnZSBJbnN0YW50aWF0ZSBMaWJyYXJ5LWJhc2VfQXJ0aWZhY3QgTGlicmFyeSBNZXRhY2xhc3MtYmFzZV9DbGFzcyBNZXRhY2xhc3MgTW9kZWxMaWJyYXJ5LWJhc2VfUGFja2FnZSBNb2RlbExpYnJhcnkgUHJvY2Vzcy1iYXNlX0NvbXBvbmVudCBQcm9jZXNzIFJlYWxpemF0aW9uLWJhc2VfQ2xhc3NpZmllciBSZWFsaXphdGlvbiBSZWZpbmUtYmFzZV9BYnN0cmFjdGlvbiBSZWZpbmUgUmVzcG9uc2liaWxpdHktYmFzZV9Vc2FnZSBSZXNwb25zaWJpbGl0eSBTY3JpcHQtYmFzZV9BcnRpZmFjdCBTY3JpcHQgU2VuZC1iYXNlX1VzYWdlIFNlbmQgU2VydmljZS1iYXNlX0NvbXBvbmVudCBTZXJ2aWNlIFNvdXJjZS1iYXNlX0FydGlmYWN0IFNvdXJjZSBTcGVjaWZpY2F0aW9uLWJhc2VfQ2xhc3NpZmllciBTcGVjaWZpY2F0aW9uIFN1YnN5c3RlbS1iYXNlX0NvbXBvbmVudCBTdWJzeXN0ZW0gVHJhY2UtYmFzZV9BYnN0cmFjdGlvbiBUcmFjZSBUeXBlLWJhc2VfQ2xhc3MgVHlwZSBVdGlsaXR5LWJhc2VfQ2xhc3MgVXRpbGl0eSBDb21wb25lbnRfQnVpbGRDb21wb25lbnQtZXh0ZW5zaW9uX0J1aWxkQ29tcG9uZW50IENvbXBvbmVudF9CdWlsZENvbXBvbmVudCBNb2RlbF9NZXRhbW9kZWwtZXh0ZW5zaW9uX01ldGFtb2RlbCBNb2RlbF9NZXRhbW9kZWwgTW9kZWxfU3lzdGVtTW9kZWwtZXh0ZW5zaW9uX1N5c3RlbU1vZGVsIE1vZGVsX1N5c3RlbU1vZGVsIEJ1aWxkQ29tcG9uZW50LWJhc2VfQ29tcG9uZW50IEJ1aWxkQ29tcG9uZW50IE1ldGFtb2RlbC1iYXNlX01vZGVsIE1ldGFtb2RlbCBTeXN0ZW1Nb2RlbC1iYXNlX01vZGVsIFN5c3RlbU1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIHhtaTppZD0iX3F1MTVzb0NSRWVPQjNySFNvMUIzb3ciIGtleT0iVVJJIiB2YWx1ZT0iaHR0cDovL3d3dy5vbWcub3JnL3NwZWMvVU1MLzIwMTMxMDAxL1N0YW5kYXJkUHJvZmlsZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfcGFja2FnZUltcG9ydC4wIj4KLSAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9Ii4uL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjXzAiLz4KLSAgPC9wYWNrYWdlSW1wb3J0PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkFic3RyYWN0aW9uX0Rlcml2ZSIgbmFtZT0iQWJzdHJhY3Rpb25fRGVyaXZlIiBtZW1iZXJFbmQ9IkFic3RyYWN0aW9uX0Rlcml2ZS1leHRlbnNpb25fRGVyaXZlIERlcml2ZS1iYXNlX0Fic3RyYWN0aW9uIj4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iQWJzdHJhY3Rpb25fRGVyaXZlLWV4dGVuc2lvbl9EZXJpdmUiIG5hbWU9ImV4dGVuc2lvbl9EZXJpdmUiIHR5cGU9IkRlcml2ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFic3RyYWN0aW9uX0Rlcml2ZSI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFic3RyYWN0aW9uX0Rlcml2ZS1leHRlbnNpb25fRGVyaXZlLV9sb3dlclZhbHVlIi8+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iQWJzdHJhY3Rpb25fUmVmaW5lIiBuYW1lPSJBYnN0cmFjdGlvbl9SZWZpbmUiIG1lbWJlckVuZD0iQWJzdHJhY3Rpb25fUmVmaW5lLWV4dGVuc2lvbl9SZWZpbmUgUmVmaW5lLWJhc2VfQWJzdHJhY3Rpb24iPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJBYnN0cmFjdGlvbl9SZWZpbmUtZXh0ZW5zaW9uX1JlZmluZSIgbmFtZT0iZXh0ZW5zaW9uX1JlZmluZSIgdHlwZT0iUmVmaW5lIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQWJzdHJhY3Rpb25fUmVmaW5lIj4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQWJzdHJhY3Rpb25fUmVmaW5lLWV4dGVuc2lvbl9SZWZpbmUtX2xvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJBYnN0cmFjdGlvbl9UcmFjZSIgbmFtZT0iQWJzdHJhY3Rpb25fVHJhY2UiIG1lbWJlckVuZD0iQWJzdHJhY3Rpb25fVHJhY2UtZXh0ZW5zaW9uX1RyYWNlIFRyYWNlLWJhc2VfQWJzdHJhY3Rpb24iPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJBYnN0cmFjdGlvbl9UcmFjZS1leHRlbnNpb25fVHJhY2UiIG5hbWU9ImV4dGVuc2lvbl9UcmFjZSIgdHlwZT0iVHJhY2UiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJBYnN0cmFjdGlvbl9UcmFjZSI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFic3RyYWN0aW9uX1RyYWNlLWV4dGVuc2lvbl9UcmFjZS1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkFydGlmYWN0X0RvY3VtZW50IiBuYW1lPSJBcnRpZmFjdF9Eb2N1bWVudCIgbWVtYmVyRW5kPSJBcnRpZmFjdF9Eb2N1bWVudC1leHRlbnNpb25fRG9jdW1lbnQgRG9jdW1lbnQtYmFzZV9BcnRpZmFjdCI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkFydGlmYWN0X0RvY3VtZW50LWV4dGVuc2lvbl9Eb2N1bWVudCIgbmFtZT0iZXh0ZW5zaW9uX0RvY3VtZW50IiB0eXBlPSJEb2N1bWVudCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFydGlmYWN0X0RvY3VtZW50Ij4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQXJ0aWZhY3RfRG9jdW1lbnQtZXh0ZW5zaW9uX0RvY3VtZW50LV9sb3dlclZhbHVlIi8+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iQXJ0aWZhY3RfRXhlY3V0YWJsZSIgbmFtZT0iQXJ0aWZhY3RfRXhlY3V0YWJsZSIgbWVtYmVyRW5kPSJBcnRpZmFjdF9FeGVjdXRhYmxlLWV4dGVuc2lvbl9FeGVjdXRhYmxlIEV4ZWN1dGFibGUtYmFzZV9BcnRpZmFjdCI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkFydGlmYWN0X0V4ZWN1dGFibGUtZXh0ZW5zaW9uX0V4ZWN1dGFibGUiIG5hbWU9ImV4dGVuc2lvbl9FeGVjdXRhYmxlIiB0eXBlPSJFeGVjdXRhYmxlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQXJ0aWZhY3RfRXhlY3V0YWJsZSI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkFydGlmYWN0X0V4ZWN1dGFibGUtZXh0ZW5zaW9uX0V4ZWN1dGFibGUtX2xvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJBcnRpZmFjdF9GaWxlIiBuYW1lPSJBcnRpZmFjdF9GaWxlIiBtZW1iZXJFbmQ9IkFydGlmYWN0X0ZpbGUtZXh0ZW5zaW9uX0ZpbGUgRmlsZS1iYXNlX0FydGlmYWN0Ij4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iQXJ0aWZhY3RfRmlsZS1leHRlbnNpb25fRmlsZSIgbmFtZT0iZXh0ZW5zaW9uX0ZpbGUiIHR5cGU9IkZpbGUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJBcnRpZmFjdF9GaWxlIj4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQXJ0aWZhY3RfRmlsZS1leHRlbnNpb25fRmlsZS1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkFydGlmYWN0X0xpYnJhcnkiIG5hbWU9IkFydGlmYWN0X0xpYnJhcnkiIG1lbWJlckVuZD0iQXJ0aWZhY3RfTGlicmFyeS1leHRlbnNpb25fTGlicmFyeSBMaWJyYXJ5LWJhc2VfQXJ0aWZhY3QiPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJBcnRpZmFjdF9MaWJyYXJ5LWV4dGVuc2lvbl9MaWJyYXJ5IiBuYW1lPSJleHRlbnNpb25fTGlicmFyeSIgdHlwZT0iTGlicmFyeSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkFydGlmYWN0X0xpYnJhcnkiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBcnRpZmFjdF9MaWJyYXJ5LWV4dGVuc2lvbl9MaWJyYXJ5LV9sb3dlclZhbHVlIi8+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iQXJ0aWZhY3RfU2NyaXB0IiBuYW1lPSJBcnRpZmFjdF9TY3JpcHQiIG1lbWJlckVuZD0iQXJ0aWZhY3RfU2NyaXB0LWV4dGVuc2lvbl9TY3JpcHQgU2NyaXB0LWJhc2VfQXJ0aWZhY3QiPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJBcnRpZmFjdF9TY3JpcHQtZXh0ZW5zaW9uX1NjcmlwdCIgbmFtZT0iZXh0ZW5zaW9uX1NjcmlwdCIgdHlwZT0iU2NyaXB0IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQXJ0aWZhY3RfU2NyaXB0Ij4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQXJ0aWZhY3RfU2NyaXB0LWV4dGVuc2lvbl9TY3JpcHQtX2xvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJBcnRpZmFjdF9Tb3VyY2UiIG5hbWU9IkFydGlmYWN0X1NvdXJjZSIgbWVtYmVyRW5kPSJBcnRpZmFjdF9Tb3VyY2UtZXh0ZW5zaW9uX1NvdXJjZSBTb3VyY2UtYmFzZV9BcnRpZmFjdCI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkFydGlmYWN0X1NvdXJjZS1leHRlbnNpb25fU291cmNlIiBuYW1lPSJleHRlbnNpb25fU291cmNlIiB0eXBlPSJTb3VyY2UiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJBcnRpZmFjdF9Tb3VyY2UiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJBcnRpZmFjdF9Tb3VyY2UtZXh0ZW5zaW9uX1NvdXJjZS1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlX0NyZWF0ZSIgbmFtZT0iQmVoYXZpb3JhbEZlYXR1cmVfQ3JlYXRlIiBtZW1iZXJFbmQ9IkJlaGF2aW9yYWxGZWF0dXJlX0NyZWF0ZS1leHRlbnNpb25fQ3JlYXRlIENyZWF0ZS1iYXNlX0JlaGF2aW9yYWxGZWF0dXJlIj4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmVfQ3JlYXRlLWV4dGVuc2lvbl9DcmVhdGUiIG5hbWU9ImV4dGVuc2lvbl9DcmVhdGUiIHR5cGU9IkNyZWF0ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkJlaGF2aW9yYWxGZWF0dXJlX0NyZWF0ZSI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlX0NyZWF0ZS1leHRlbnNpb25fQ3JlYXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iQmVoYXZpb3JhbEZlYXR1cmVfRGVzdHJveSIgbmFtZT0iQmVoYXZpb3JhbEZlYXR1cmVfRGVzdHJveSIgbWVtYmVyRW5kPSJCZWhhdmlvcmFsRmVhdHVyZV9EZXN0cm95LWV4dGVuc2lvbl9EZXN0cm95IERlc3Ryb3ktYmFzZV9CZWhhdmlvcmFsRmVhdHVyZSI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlX0Rlc3Ryb3ktZXh0ZW5zaW9uX0Rlc3Ryb3kiIG5hbWU9ImV4dGVuc2lvbl9EZXN0cm95IiB0eXBlPSJEZXN0cm95IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQmVoYXZpb3JhbEZlYXR1cmVfRGVzdHJveSI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkJlaGF2aW9yYWxGZWF0dXJlX0Rlc3Ryb3ktZXh0ZW5zaW9uX0Rlc3Ryb3ktX2xvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJDbGFzc19BdXhpbGlhcnkiIG5hbWU9IkNsYXNzX0F1eGlsaWFyeSIgbWVtYmVyRW5kPSJDbGFzc19BdXhpbGlhcnktZXh0ZW5zaW9uX0F1eGlsaWFyeSBBdXhpbGlhcnktYmFzZV9DbGFzcyI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkNsYXNzX0F1eGlsaWFyeS1leHRlbnNpb25fQXV4aWxpYXJ5IiBuYW1lPSJleHRlbnNpb25fQXV4aWxpYXJ5IiB0eXBlPSJBdXhpbGlhcnkiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJDbGFzc19BdXhpbGlhcnkiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc19BdXhpbGlhcnktZXh0ZW5zaW9uX0F1eGlsaWFyeS1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkNsYXNzX0ZvY3VzIiBuYW1lPSJDbGFzc19Gb2N1cyIgbWVtYmVyRW5kPSJDbGFzc19Gb2N1cy1leHRlbnNpb25fRm9jdXMgRm9jdXMtYmFzZV9DbGFzcyI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkNsYXNzX0ZvY3VzLWV4dGVuc2lvbl9Gb2N1cyIgbmFtZT0iZXh0ZW5zaW9uX0ZvY3VzIiB0eXBlPSJGb2N1cyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkNsYXNzX0ZvY3VzIj4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ2xhc3NfRm9jdXMtZXh0ZW5zaW9uX0ZvY3VzLV9sb3dlclZhbHVlIi8+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iQ2xhc3NfSW1wbGVtZW50YXRpb25DbGFzcyIgbmFtZT0iQ2xhc3NfSW1wbGVtZW50YXRpb25DbGFzcyIgbWVtYmVyRW5kPSJDbGFzc19JbXBsZW1lbnRhdGlvbkNsYXNzLWV4dGVuc2lvbl9JbXBsZW1lbnRhdGlvbkNsYXNzIEltcGxlbWVudGF0aW9uQ2xhc3MtYmFzZV9DbGFzcyI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkNsYXNzX0ltcGxlbWVudGF0aW9uQ2xhc3MtZXh0ZW5zaW9uX0ltcGxlbWVudGF0aW9uQ2xhc3MiIG5hbWU9ImV4dGVuc2lvbl9JbXBsZW1lbnRhdGlvbkNsYXNzIiB0eXBlPSJJbXBsZW1lbnRhdGlvbkNsYXNzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQ2xhc3NfSW1wbGVtZW50YXRpb25DbGFzcyI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzX0ltcGxlbWVudGF0aW9uQ2xhc3MtZXh0ZW5zaW9uX0ltcGxlbWVudGF0aW9uQ2xhc3MtX2xvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJDbGFzc19NZXRhY2xhc3MiIG5hbWU9IkNsYXNzX01ldGFjbGFzcyIgbWVtYmVyRW5kPSJDbGFzc19NZXRhY2xhc3MtZXh0ZW5zaW9uX01ldGFjbGFzcyBNZXRhY2xhc3MtYmFzZV9DbGFzcyI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkNsYXNzX01ldGFjbGFzcy1leHRlbnNpb25fTWV0YWNsYXNzIiBuYW1lPSJleHRlbnNpb25fTWV0YWNsYXNzIiB0eXBlPSJNZXRhY2xhc3MiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJDbGFzc19NZXRhY2xhc3MiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc19NZXRhY2xhc3MtZXh0ZW5zaW9uX01ldGFjbGFzcy1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkNsYXNzX1R5cGUiIG5hbWU9IkNsYXNzX1R5cGUiIG1lbWJlckVuZD0iQ2xhc3NfVHlwZS1leHRlbnNpb25fVHlwZSBUeXBlLWJhc2VfQ2xhc3MiPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJDbGFzc19UeXBlLWV4dGVuc2lvbl9UeXBlIiBuYW1lPSJleHRlbnNpb25fVHlwZSIgdHlwZT0iVHlwZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkNsYXNzX1R5cGUiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDbGFzc19UeXBlLWV4dGVuc2lvbl9UeXBlLV9sb3dlclZhbHVlIi8+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iQ2xhc3NfVXRpbGl0eSIgbmFtZT0iQ2xhc3NfVXRpbGl0eSIgbWVtYmVyRW5kPSJDbGFzc19VdGlsaXR5LWV4dGVuc2lvbl9VdGlsaXR5IFV0aWxpdHktYmFzZV9DbGFzcyI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkNsYXNzX1V0aWxpdHktZXh0ZW5zaW9uX1V0aWxpdHkiIG5hbWU9ImV4dGVuc2lvbl9VdGlsaXR5IiB0eXBlPSJVdGlsaXR5IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQ2xhc3NfVXRpbGl0eSI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzX1V0aWxpdHktZXh0ZW5zaW9uX1V0aWxpdHktX2xvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJDbGFzc2lmaWVyX1JlYWxpemF0aW9uIiBuYW1lPSJDbGFzc2lmaWVyX1JlYWxpemF0aW9uIiBtZW1iZXJFbmQ9IkNsYXNzaWZpZXJfUmVhbGl6YXRpb24tZXh0ZW5zaW9uX1JlYWxpemF0aW9uIFJlYWxpemF0aW9uLWJhc2VfQ2xhc3NpZmllciI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkNsYXNzaWZpZXJfUmVhbGl6YXRpb24tZXh0ZW5zaW9uX1JlYWxpemF0aW9uIiBuYW1lPSJleHRlbnNpb25fUmVhbGl6YXRpb24iIHR5cGU9IlJlYWxpemF0aW9uIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQ2xhc3NpZmllcl9SZWFsaXphdGlvbiI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXJfUmVhbGl6YXRpb24tZXh0ZW5zaW9uX1JlYWxpemF0aW9uLV9sb3dlclZhbHVlIi8+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iQ2xhc3NpZmllcl9TcGVjaWZpY2F0aW9uIiBuYW1lPSJDbGFzc2lmaWVyX1NwZWNpZmljYXRpb24iIG1lbWJlckVuZD0iQ2xhc3NpZmllcl9TcGVjaWZpY2F0aW9uLWV4dGVuc2lvbl9TcGVjaWZpY2F0aW9uIFNwZWNpZmljYXRpb24tYmFzZV9DbGFzc2lmaWVyIj4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iQ2xhc3NpZmllcl9TcGVjaWZpY2F0aW9uLWV4dGVuc2lvbl9TcGVjaWZpY2F0aW9uIiBuYW1lPSJleHRlbnNpb25fU3BlY2lmaWNhdGlvbiIgdHlwZT0iU3BlY2lmaWNhdGlvbiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IkNsYXNzaWZpZXJfU3BlY2lmaWNhdGlvbiI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNsYXNzaWZpZXJfU3BlY2lmaWNhdGlvbi1leHRlbnNpb25fU3BlY2lmaWNhdGlvbi1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkNvbXBvbmVudF9FbnRpdHkiIG5hbWU9IkNvbXBvbmVudF9FbnRpdHkiIG1lbWJlckVuZD0iQ29tcG9uZW50X0VudGl0eS1leHRlbnNpb25fRW50aXR5IEVudGl0eS1iYXNlX0NvbXBvbmVudCI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkNvbXBvbmVudF9FbnRpdHktZXh0ZW5zaW9uX0VudGl0eSIgbmFtZT0iZXh0ZW5zaW9uX0VudGl0eSIgdHlwZT0iRW50aXR5IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQ29tcG9uZW50X0VudGl0eSI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbXBvbmVudF9FbnRpdHktZXh0ZW5zaW9uX0VudGl0eS1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkNvbXBvbmVudF9JbXBsZW1lbnQiIG5hbWU9IkNvbXBvbmVudF9JbXBsZW1lbnQiIG1lbWJlckVuZD0iQ29tcG9uZW50X0ltcGxlbWVudC1leHRlbnNpb25fSW1wbGVtZW50IEltcGxlbWVudC1iYXNlX0NvbXBvbmVudCI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkNvbXBvbmVudF9JbXBsZW1lbnQtZXh0ZW5zaW9uX0ltcGxlbWVudCIgbmFtZT0iZXh0ZW5zaW9uX0ltcGxlbWVudCIgdHlwZT0iSW1wbGVtZW50IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQ29tcG9uZW50X0ltcGxlbWVudCI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbXBvbmVudF9JbXBsZW1lbnQtZXh0ZW5zaW9uX0ltcGxlbWVudC1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkNvbXBvbmVudF9Qcm9jZXNzIiBuYW1lPSJDb21wb25lbnRfUHJvY2VzcyIgbWVtYmVyRW5kPSJDb21wb25lbnRfUHJvY2Vzcy1leHRlbnNpb25fUHJvY2VzcyBQcm9jZXNzLWJhc2VfQ29tcG9uZW50Ij4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iQ29tcG9uZW50X1Byb2Nlc3MtZXh0ZW5zaW9uX1Byb2Nlc3MiIG5hbWU9ImV4dGVuc2lvbl9Qcm9jZXNzIiB0eXBlPSJQcm9jZXNzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQ29tcG9uZW50X1Byb2Nlc3MiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb21wb25lbnRfUHJvY2Vzcy1leHRlbnNpb25fUHJvY2Vzcy1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkNvbXBvbmVudF9TZXJ2aWNlIiBuYW1lPSJDb21wb25lbnRfU2VydmljZSIgbWVtYmVyRW5kPSJDb21wb25lbnRfU2VydmljZS1leHRlbnNpb25fU2VydmljZSBTZXJ2aWNlLWJhc2VfQ29tcG9uZW50Ij4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iQ29tcG9uZW50X1NlcnZpY2UtZXh0ZW5zaW9uX1NlcnZpY2UiIG5hbWU9ImV4dGVuc2lvbl9TZXJ2aWNlIiB0eXBlPSJTZXJ2aWNlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQ29tcG9uZW50X1NlcnZpY2UiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDb21wb25lbnRfU2VydmljZS1leHRlbnNpb25fU2VydmljZS1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkNvbXBvbmVudF9TdWJzeXN0ZW0iIG5hbWU9IkNvbXBvbmVudF9TdWJzeXN0ZW0iIG1lbWJlckVuZD0iQ29tcG9uZW50X1N1YnN5c3RlbS1leHRlbnNpb25fU3Vic3lzdGVtIFN1YnN5c3RlbS1iYXNlX0NvbXBvbmVudCI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IkNvbXBvbmVudF9TdWJzeXN0ZW0tZXh0ZW5zaW9uX1N1YnN5c3RlbSIgbmFtZT0iZXh0ZW5zaW9uX1N1YnN5c3RlbSIgdHlwZT0iU3Vic3lzdGVtIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQ29tcG9uZW50X1N1YnN5c3RlbSI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IkNvbXBvbmVudF9TdWJzeXN0ZW0tZXh0ZW5zaW9uX1N1YnN5c3RlbS1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IlBhY2thZ2VfRnJhbWV3b3JrIiBuYW1lPSJQYWNrYWdlX0ZyYW1ld29yayIgbWVtYmVyRW5kPSJQYWNrYWdlX0ZyYW1ld29yay1leHRlbnNpb25fRnJhbWV3b3JrIEZyYW1ld29yay1iYXNlX1BhY2thZ2UiPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJQYWNrYWdlX0ZyYW1ld29yay1leHRlbnNpb25fRnJhbWV3b3JrIiBuYW1lPSJleHRlbnNpb25fRnJhbWV3b3JrIiB0eXBlPSJGcmFtZXdvcmsiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJQYWNrYWdlX0ZyYW1ld29yayI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlBhY2thZ2VfRnJhbWV3b3JrLWV4dGVuc2lvbl9GcmFtZXdvcmstX2xvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJQYWNrYWdlX01vZGVsTGlicmFyeSIgbmFtZT0iUGFja2FnZV9Nb2RlbExpYnJhcnkiIG1lbWJlckVuZD0iUGFja2FnZV9Nb2RlbExpYnJhcnktZXh0ZW5zaW9uX01vZGVsTGlicmFyeSBNb2RlbExpYnJhcnktYmFzZV9QYWNrYWdlIj4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iUGFja2FnZV9Nb2RlbExpYnJhcnktZXh0ZW5zaW9uX01vZGVsTGlicmFyeSIgbmFtZT0iZXh0ZW5zaW9uX01vZGVsTGlicmFyeSIgdHlwZT0iTW9kZWxMaWJyYXJ5IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iUGFja2FnZV9Nb2RlbExpYnJhcnkiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJQYWNrYWdlX01vZGVsTGlicmFyeS1leHRlbnNpb25fTW9kZWxMaWJyYXJ5LV9sb3dlclZhbHVlIi8+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iVXNhZ2VfQ2FsbCIgbmFtZT0iVXNhZ2VfQ2FsbCIgbWVtYmVyRW5kPSJVc2FnZV9DYWxsLWV4dGVuc2lvbl9DYWxsIENhbGwtYmFzZV9Vc2FnZSI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IlVzYWdlX0NhbGwtZXh0ZW5zaW9uX0NhbGwiIG5hbWU9ImV4dGVuc2lvbl9DYWxsIiB0eXBlPSJDYWxsIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iVXNhZ2VfQ2FsbCI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9IlVzYWdlX0NhbGwtZXh0ZW5zaW9uX0NhbGwtX2xvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJVc2FnZV9DcmVhdGUiIG5hbWU9IlVzYWdlX0NyZWF0ZSIgbWVtYmVyRW5kPSJVc2FnZV9DcmVhdGUtZXh0ZW5zaW9uX0NyZWF0ZSBDcmVhdGUtYmFzZV9Vc2FnZSI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IlVzYWdlX0NyZWF0ZS1leHRlbnNpb25fQ3JlYXRlIiBuYW1lPSJleHRlbnNpb25fQ3JlYXRlIiB0eXBlPSJDcmVhdGUiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJVc2FnZV9DcmVhdGUiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJVc2FnZV9DcmVhdGUtZXh0ZW5zaW9uX0NyZWF0ZS1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IlVzYWdlX0luc3RhbnRpYXRlIiBuYW1lPSJVc2FnZV9JbnN0YW50aWF0ZSIgbWVtYmVyRW5kPSJVc2FnZV9JbnN0YW50aWF0ZS1leHRlbnNpb25fSW5zdGFudGlhdGUgSW5zdGFudGlhdGUtYmFzZV9Vc2FnZSI+Ci0gICAgPG93bmVkRW5kIHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uRW5kIiB4bWk6aWQ9IlVzYWdlX0luc3RhbnRpYXRlLWV4dGVuc2lvbl9JbnN0YW50aWF0ZSIgbmFtZT0iZXh0ZW5zaW9uX0luc3RhbnRpYXRlIiB0eXBlPSJJbnN0YW50aWF0ZSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249IlVzYWdlX0luc3RhbnRpYXRlIj4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVXNhZ2VfSW5zdGFudGlhdGUtZXh0ZW5zaW9uX0luc3RhbnRpYXRlLV9sb3dlclZhbHVlIi8+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iVXNhZ2VfUmVzcG9uc2liaWxpdHkiIG5hbWU9IlVzYWdlX1Jlc3BvbnNpYmlsaXR5IiBtZW1iZXJFbmQ9IlVzYWdlX1Jlc3BvbnNpYmlsaXR5LWV4dGVuc2lvbl9SZXNwb25zaWJpbGl0eSBSZXNwb25zaWJpbGl0eS1iYXNlX1VzYWdlIj4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iVXNhZ2VfUmVzcG9uc2liaWxpdHktZXh0ZW5zaW9uX1Jlc3BvbnNpYmlsaXR5IiBuYW1lPSJleHRlbnNpb25fUmVzcG9uc2liaWxpdHkiIHR5cGU9IlJlc3BvbnNpYmlsaXR5IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iVXNhZ2VfUmVzcG9uc2liaWxpdHkiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJVc2FnZV9SZXNwb25zaWJpbGl0eS1leHRlbnNpb25fUmVzcG9uc2liaWxpdHktX2xvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbiIgeG1pOmlkPSJVc2FnZV9TZW5kIiBuYW1lPSJVc2FnZV9TZW5kIiBtZW1iZXJFbmQ9IlVzYWdlX1NlbmQtZXh0ZW5zaW9uX1NlbmQgU2VuZC1iYXNlX1VzYWdlIj4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iVXNhZ2VfU2VuZC1leHRlbnNpb25fU2VuZCIgbmFtZT0iZXh0ZW5zaW9uX1NlbmQiIHR5cGU9IlNlbmQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJVc2FnZV9TZW5kIj4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iVXNhZ2VfU2VuZC1leHRlbnNpb25fU2VuZC1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJBdXhpbGlhcnkiIG5hbWU9IkF1eGlsaWFyeSI+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkF1eGlsaWFyeS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkF1eGlsaWFyeSI+Ci0gICAgICA8Ym9keT5BIGNsYXNzIHRoYXQgc3VwcG9ydHMgYW5vdGhlciBtb3JlIGNlbnRyYWwgb3IgZnVuZGFtZW50YWwgY2xhc3MsIHR5cGljYWxseSBieSBpbXBsZW1lbnRpbmcgc2Vjb25kYXJ5IGxvZ2ljIG9yIGNvbnRyb2wgZmxvdy4gQXV4aWxpYXJ5IGNsYXNzZXMgYXJlIHR5cGljYWxseSB1c2VkIHRvZ2V0aGVyIHdpdGggRm9jdXMgY2xhc3NlcywgYW5kIGFyZSBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWNvbmRhcnkgYnVzaW5lc3MgbG9naWMgb3IgY29udHJvbCBmbG93IG9mIGNvbXBvbmVudHMgZHVyaW5nIGRlc2lnbi4gU2VlIGFsc286IMKrRm9jdXPCuy48L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQXV4aWxpYXJ5LWJhc2VfQ2xhc3MiIG5hbWU9ImJhc2VfQ2xhc3MiIGFzc29jaWF0aW9uPSJDbGFzc19BdXhpbGlhcnkiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNDbGFzcyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJDYWxsIiBuYW1lPSJDYWxsIj4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQ2FsbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNhbGwiPgotICAgICAgPGJvZHk+QSB1c2FnZSBkZXBlbmRlbmN5IHdob3NlIHNvdXJjZSBpcyBhbiBvcGVyYXRpb24gYW5kIHdob3NlIHRhcmdldCBpcyBhbiBvcGVyYXRpb24uIFRoZSByZWxhdGlvbnNoaXAgbWF5IGFsc28gYmUgc3Vic3VtZWQgdG8gdGhlIGNsYXNzIGNvbnRhaW5pbmcgYW4gb3BlcmF0aW9uLCB3aXRoIHRoZSBtZWFuaW5nIHRoYXQgdGhlcmUgZXhpc3RzIGFuIG9wZXJhdGlvbiBpbiB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlIGRlcGVuZGVuY3kgYXBwbGllcy4gQSBjYWxsIGRlcGVuZGVuY3kgc3BlY2lmaWVzIHRoYXQgdGhlIHNvdXJjZSBvcGVyYXRpb24gb3IgYW4gb3BlcmF0aW9uIGluIHRoZSBzb3VyY2UgY2xhc3MgaW52b2tlcyB0aGUgdGFyZ2V0IG9wZXJhdGlvbiBvciBhbiBvcGVyYXRpb24gaW4gdGhlIHRhcmdldCBjbGFzcy4gQSBjYWxsIGRlcGVuZGVuY3kgbWF5IGNvbm5lY3QgYSBzb3VyY2Ugb3BlcmF0aW9uIHRvIGFueSB0YXJnZXQgb3BlcmF0aW9uIHRoYXQgaXMgd2l0aGluIHNjb3BlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBvcGVyYXRpb25zIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3NpZmllciBhbmQgb3BlcmF0aW9ucyBvZiBvdGhlciB2aXNpYmxlIGNsYXNzaWZpZXJzLjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRSdWxlIHhtaTppZD0iQ2FsbC1jbGllbnRfYW5kX3N1cHBsaWVyX2FyZV9vcGVyYXRpb25zIiBuYW1lPSJjbGllbnRfYW5kX3N1cHBsaWVyX2FyZV9vcGVyYXRpb25zIiBjb25zdHJhaW5lZEVsZW1lbnQ9IkNhbGwiPgotICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkNhbGwtY2xpZW50X2FuZF9zdXBwbGllcl9hcmVfb3BlcmF0aW9ucy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICA8Ym9keT5zZWxmLmJhc2VfVXNhZ2UuY2xpZW50LT5mb3JBbGwob2NsSXNLaW5kT2YoT3BlcmF0aW9uKSkgYW5kIHNlbGYuYmFzZV9Vc2FnZS5zdXBwbGllci0+Zm9yQWxsKG9jbElzS2luZE9mKE9wZXJhdGlvbikpPC9ib2R5PgotICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgIDwvb3duZWRSdWxlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkNhbGwtYmFzZV9Vc2FnZSIgbmFtZT0iYmFzZV9Vc2FnZSIgYXNzb2NpYXRpb249IlVzYWdlX0NhbGwiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNVc2FnZSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJDcmVhdGUiIG5hbWU9IkNyZWF0ZSI+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkNyZWF0ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkNyZWF0ZSI+Ci0gICAgICA8Ym9keT5XaGVuIGFwcGxpZWQgdG8gYSBVc2FnZSwgZGVub3RlcyB0aGF0IHRoZSBjbGllbnQgY2xhc3NpZmllciBjcmVhdGVzIGluc3RhbmNlcyBvZiB0aGUgc3VwcGxpZXIgY2xhc3NpZmllci4gV2hlbiBhcHBsaWVkIHRvIGEgQmVoYXZpb3JhbEZlYXR1cmUsIHNwZWNpZmllcyB0aGF0IHRoZSBkZXNpZ25hdGVkIGZlYXR1cmUgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3NpZmllciB0byB3aGljaCB0aGUgZmVhdHVyZSBpcyBhdHRhY2hlZC48L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkUnVsZSB4bWk6aWQ9IkNyZWF0ZS1jbGllbnRfYW5kX3N1cHBsaWVyX2FyZV9jbGFzc2lmaWVycyIgbmFtZT0iY2xpZW50X2FuZF9zdXBwbGllcl9hcmVfY2xhc3NpZmllcnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iQ3JlYXRlIj4KLSAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJDcmVhdGUtY2xpZW50X2FuZF9zdXBwbGllcl9hcmVfY2xhc3NpZmllcnMtX3NwZWNpZmljYXRpb24iPgotICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgPGJvZHk+c2VsZi5iYXNlX1VzYWdlLT5ub3RFbXB0eSgpIGltcGxpZXMgKHNlbGYuYmFzZV9Vc2FnZS5jbGllbnQtPmZvckFsbChvY2xJc0tpbmRPZihDbGFzc2lmaWVyKSkgYW5kIHNlbGYuYmFzZV9Vc2FnZS5zdXBwbGllci0+Zm9yQWxsKG9jbElzS2luZE9mKENsYXNzaWZpZXIpKSk8L2JvZHk+Ci0gICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgPC9vd25lZFJ1bGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ3JlYXRlLWJhc2VfQmVoYXZpb3JhbEZlYXR1cmUiIG5hbWU9ImJhc2VfQmVoYXZpb3JhbEZlYXR1cmUiIGFzc29jaWF0aW9uPSJCZWhhdmlvcmFsRmVhdHVyZV9DcmVhdGUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNCZWhhdmlvcmFsRmVhdHVyZSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDcmVhdGUtYmFzZV9CZWhhdmlvcmFsRmVhdHVyZS1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iQ3JlYXRlLWJhc2VfVXNhZ2UiIG5hbWU9ImJhc2VfVXNhZ2UiIGFzc29jaWF0aW9uPSJVc2FnZV9DcmVhdGUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNVc2FnZSIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJDcmVhdGUtYmFzZV9Vc2FnZS1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJEZXJpdmUiIG5hbWU9IkRlcml2ZSI+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlcml2ZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRlcml2ZSI+Ci0gICAgICA8Ym9keT5TcGVjaWZpZXMgYSBkZXJpdmF0aW9uIHJlbGF0aW9uc2hpcCBhbW9uZyBtb2RlbCBlbGVtZW50cyB0aGF0IGFyZSB1c3VhbGx5LCBidXQgbm90IG5lY2Vzc2FyaWx5LCBvZiB0aGUgc2FtZSB0eXBlLiBBIGRlcml2ZWQgZGVwZW5kZW5jeSBzcGVjaWZpZXMgdGhhdCB0aGUgY2xpZW50IG1heSBiZSBjb21wdXRlZCBmcm9tIHRoZSBzdXBwbGllci4gVGhlIG1hcHBpbmcgc3BlY2lmaWVzIHRoZSBjb21wdXRhdGlvbi4gVGhlIGNsaWVudCBtYXkgYmUgaW1wbGVtZW50ZWQgZm9yIGRlc2lnbiByZWFzb25zLCBzdWNoIGFzIGVmZmljaWVuY3ksIGV2ZW4gdGhvdWdoIGl0IGlzIGxvZ2ljYWxseSByZWR1bmRhbnQuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkRlcml2ZS1jb21wdXRhdGlvbiIgbmFtZT0iY29tcHV0YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRGVyaXZlLWNvbXB1dGF0aW9uLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRGVyaXZlLWNvbXB1dGF0aW9uIj4KLSAgICAgICAgPGJvZHk+VGhlIHNwZWNpZmljYXRpb24gZm9yIGNvbXB1dGluZyB0aGUgZGVyaXZlZCBjbGllbnQgZWxlbWVudCBmcm9tIHRoZSBkZXJpdmF0aW9uIHN1cHBsaWVyIGVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI1ZhbHVlU3BlY2lmaWNhdGlvbiIvPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJEZXJpdmUtY29tcHV0YXRpb24tX2xvd2VyVmFsdWUiIHZhbHVlPSIxIi8+Ci0gICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9IkRlcml2ZS1jb21wdXRhdGlvbi1fdXBwZXJWYWx1ZSIgdmFsdWU9IjEiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkRlcml2ZS1iYXNlX0Fic3RyYWN0aW9uIiBuYW1lPSJiYXNlX0Fic3RyYWN0aW9uIiBhc3NvY2lhdGlvbj0iQWJzdHJhY3Rpb25fRGVyaXZlIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9Ii4uL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjQWJzdHJhY3Rpb24iLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iRGVzdHJveSIgbmFtZT0iRGVzdHJveSI+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IkRlc3Ryb3ktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJEZXN0cm95Ij4KLSAgICAgIDxib2R5PlNwZWNpZmllcyB0aGF0IHRoZSBkZXNpZ25hdGVkIGZlYXR1cmUgZGVzdHJveXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzaWZpZXIgdG8gd2hpY2ggdGhlIGZlYXR1cmUgaXMgYXR0YWNoZWQuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkRlc3Ryb3ktYmFzZV9CZWhhdmlvcmFsRmVhdHVyZSIgbmFtZT0iYmFzZV9CZWhhdmlvcmFsRmVhdHVyZSIgYXNzb2NpYXRpb249IkJlaGF2aW9yYWxGZWF0dXJlX0Rlc3Ryb3kiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNCZWhhdmlvcmFsRmVhdHVyZSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJEb2N1bWVudCIgbmFtZT0iRG9jdW1lbnQiPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJEb2N1bWVudC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkRvY3VtZW50Ij4KLSAgICAgIDxib2R5PkEgaHVtYW4tcmVhZGFibGUgZmlsZS4gU3ViY2xhc3Mgb2YgwqtGaWxlwrsuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9IkRvY3VtZW50LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJGaWxlIi8+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRG9jdW1lbnQtYmFzZV9BcnRpZmFjdCIgbmFtZT0iYmFzZV9BcnRpZmFjdCIgcmVkZWZpbmVkUHJvcGVydHk9IkZpbGUtYmFzZV9BcnRpZmFjdCIgYXNzb2NpYXRpb249IkFydGlmYWN0X0RvY3VtZW50Ij4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9Ii4uL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjQXJ0aWZhY3QiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iRW50aXR5IiBuYW1lPSJFbnRpdHkiPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJFbnRpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJFbnRpdHkiPgotICAgICAgPGJvZHk+QSBwZXJzaXN0ZW50IGluZm9ybWF0aW9uIGNvbXBvbmVudCByZXByZXNlbnRpbmcgYSBidXNpbmVzcyBjb25jZXB0LjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJFbnRpdHktYmFzZV9Db21wb25lbnQiIG5hbWU9ImJhc2VfQ29tcG9uZW50IiBhc3NvY2lhdGlvbj0iQ29tcG9uZW50X0VudGl0eSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0NvbXBvbmVudCIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJFeGVjdXRhYmxlIiBuYW1lPSJFeGVjdXRhYmxlIj4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRXhlY3V0YWJsZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkV4ZWN1dGFibGUiPgotICAgICAgPGJvZHk+QSBwcm9ncmFtIGZpbGUgdGhhdCBjYW4gYmUgZXhlY3V0ZWQgb24gYSBjb21wdXRlciBzeXN0ZW0uIFN1YmNsYXNzIG9mIMKrRmlsZcK7LjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJFeGVjdXRhYmxlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJGaWxlIi8+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iRXhlY3V0YWJsZS1iYXNlX0FydGlmYWN0IiBuYW1lPSJiYXNlX0FydGlmYWN0IiByZWRlZmluZWRQcm9wZXJ0eT0iRmlsZS1iYXNlX0FydGlmYWN0IiBhc3NvY2lhdGlvbj0iQXJ0aWZhY3RfRXhlY3V0YWJsZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0FydGlmYWN0Ii8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9IkZpbGUiIG5hbWU9IkZpbGUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJGaWxlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRmlsZSI+Ci0gICAgICA8Ym9keT5BIHBoeXNpY2FsIGZpbGUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHN5c3RlbSBkZXZlbG9wZWQuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkZpbGUtYmFzZV9BcnRpZmFjdCIgbmFtZT0iYmFzZV9BcnRpZmFjdCIgYXNzb2NpYXRpb249IkFydGlmYWN0X0ZpbGUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNBcnRpZmFjdCIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJGb2N1cyIgbmFtZT0iRm9jdXMiPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJGb2N1cy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkZvY3VzIj4KLSAgICAgIDxib2R5PkEgY2xhc3MgdGhhdCBkZWZpbmVzIHRoZSBjb3JlIGxvZ2ljIG9yIGNvbnRyb2wgZmxvdyBmb3Igb25lIG9yIG1vcmUgYXV4aWxpYXJ5IGNsYXNzZXMgdGhhdCBzdXBwb3J0IGl0LiBGb2N1cyBjbGFzc2VzIGFyZSB0eXBpY2FsbHkgdXNlZCB0b2dldGhlciB3aXRoIG9uZSBvciBtb3JlIEF1eGlsaWFyeSBjbGFzc2VzLCBhbmQgYXJlIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNwZWNpZnlpbmcgdGhlIGNvcmUgYnVzaW5lc3MgbG9naWMgb3IgY29udHJvbCBmbG93IG9mIGNvbXBvbmVudHMgZHVyaW5nIGRlc2lnbi4gU2VlIGFsc286IMKrQXV4aWxpYXJ5wrsuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkZvY3VzLWJhc2VfQ2xhc3MiIG5hbWU9ImJhc2VfQ2xhc3MiIGFzc29jaWF0aW9uPSJDbGFzc19Gb2N1cyI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0NsYXNzIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9IkZyYW1ld29yayIgbmFtZT0iRnJhbWV3b3JrIj4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iRnJhbWV3b3JrLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iRnJhbWV3b3JrIj4KLSAgICAgIDxib2R5PkEgcGFja2FnZSB0aGF0IGNvbnRhaW5zIG1vZGVsIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHJldXNhYmxlIGFyY2hpdGVjdHVyZSBmb3IgYWxsIG9yIHBhcnQgb2YgYSBzeXN0ZW0uIEZyYW1ld29ya3MgdHlwaWNhbGx5IGluY2x1ZGUgY2xhc3NlcywgcGF0dGVybnMsIG9yIHRlbXBsYXRlcy4gV2hlbiBmcmFtZXdvcmtzIGFyZSBzcGVjaWFsaXplZCBmb3IgYW4gYXBwbGljYXRpb24gZG9tYWluIHRoZXkgYXJlIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBhcHBsaWNhdGlvbiBmcmFtZXdvcmtzLjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJGcmFtZXdvcmstYmFzZV9QYWNrYWdlIiBuYW1lPSJiYXNlX1BhY2thZ2UiIGFzc29jaWF0aW9uPSJQYWNrYWdlX0ZyYW1ld29yayI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI1BhY2thZ2UiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iSW1wbGVtZW50IiBuYW1lPSJJbXBsZW1lbnQiPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJJbXBsZW1lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJJbXBsZW1lbnQiPgotICAgICAgPGJvZHk+QSBjb21wb25lbnQgZGVmaW5pdGlvbiB0aGF0IGlzIG5vdCBpbnRlbmRlZCB0byBoYXZlIGEgc3BlY2lmaWNhdGlvbiBpdHNlbGYuIFJhdGhlciwgaXQgaXMgYW4gaW1wbGVtZW50YXRpb24gZm9yIGEgc2VwYXJhdGUgwqtTcGVjaWZpY2F0aW9uwrsgdG8gd2hpY2ggaXQgaGFzIGEgRGVwZW5kZW5jeS48L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkUnVsZSB4bWk6aWQ9IkltcGxlbWVudC1pbXBsZW1lbnRzX3NwZWNpZmljYXRpb24iIG5hbWU9ImltcGxlbWVudHNfc3BlY2lmaWNhdGlvbiIgY29uc3RyYWluZWRFbGVtZW50PSJJbXBsZW1lbnQiPgotICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IkltcGxlbWVudC1pbXBsZW1lbnRzX3NwZWNpZmljYXRpb24tX3NwZWNpZmljYXRpb24iPgotICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgPGJvZHk+c2VsZi5iYXNlX0NvbXBvbmVudC5jbGllbnREZXBlbmRlbmN5LnN1cHBsaWVyLT5zZWxlY3Qob2NsSXNLaW5kT2YoQ2xhc3NpZmllcikpLm9jbEFzVHlwZShDbGFzc2lmaWVyKS5leHRlbnNpb25fU3BlY2lmaWNhaXRvbi0+bm90RW1wdHkoKTwvYm9keT4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICA8L293bmVkUnVsZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbXBsZW1lbnQtYmFzZV9Db21wb25lbnQiIG5hbWU9ImJhc2VfQ29tcG9uZW50IiBhc3NvY2lhdGlvbj0iQ29tcG9uZW50X0ltcGxlbWVudCI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0NvbXBvbmVudCIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJJbXBsZW1lbnRhdGlvbkNsYXNzIiBuYW1lPSJJbXBsZW1lbnRhdGlvbkNsYXNzIj4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iSW1wbGVtZW50YXRpb25DbGFzcy1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkltcGxlbWVudGF0aW9uQ2xhc3MiPgotICAgICAgPGJvZHk+VGhlIGltcGxlbWVudGF0aW9uIG9mIGEgY2xhc3MgaW4gc29tZSBwcm9ncmFtbWluZyBsYW5ndWFnZSAoZS5nLiwgQysrLCBTbWFsbHRhbGssIEphdmEpIGluIHdoaWNoIGFuIGluc3RhbmNlIG1heSBub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGNsYXNzLiBUaGlzIGlzIGluIGNvbnRyYXN0IHRvIENsYXNzLCBmb3Igd2hpY2ggYW4gaW5zdGFuY2UgbWF5IGhhdmUgbXVsdGlwbGUgY2xhc3NlcyBhdCBvbmUgdGltZSBhbmQgbWF5IGdhaW4gb3IgbG9zZSBjbGFzc2VzIG92ZXIgdGltZSwgYW5kIGFuIG9iamVjdCBtYXkgZHluYW1pY2FsbHkgaGF2ZSBtdWx0aXBsZSBjbGFzc2VzLiBBbiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBpcyBzYWlkIHRvIHJlYWxpemUgYSBDbGFzc2lmaWVyIGlmIGl0IHByb3ZpZGVzIGFsbCBvZiB0aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGZvciB0aGUgQ2xhc3NpZmllciB3aXRoIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHNwZWNpZmllZCBmb3IgdGhlIENsYXNzaWZpZXIncyBvcGVyYXRpb25zLiBBbiBJbXBsZW1lbnRhdGlvbiBDbGFzcyBtYXkgcmVhbGl6ZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgVHlwZXMuIFRoZSBwaHlzaWNhbCBhdHRyaWJ1dGVzIGFuZCBhc3NvY2lhdGlvbnMgb2YgdGhlIEltcGxlbWVudGF0aW9uIGNsYXNzIGRvIG5vdCBoYXZlIHRvIGJlIHRoZSBzYW1lIGFzIHRob3NlIG9mIGFueSBDbGFzc2lmaWVyIGl0IHJlYWxpemVzIGFuZCB0aGUgSW1wbGVtZW50YXRpb24gQ2xhc3MgbWF5IHByb3ZpZGUgbWV0aG9kcyBmb3IgaXRzIG9wZXJhdGlvbnMgaW4gdGVybXMgb2YgaXRzIHBoeXNpY2FsIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucy4gU2VlIGFsc286IMKrVHlwZcK7LjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRSdWxlIHhtaTppZD0iSW1wbGVtZW50YXRpb25DbGFzcy1jYW5ub3RfYmVfcmVhbGl6YXRpb24iIG5hbWU9ImNhbm5vdF9iZV9yZWFsaXphdGlvbiIgY29uc3RyYWluZWRFbGVtZW50PSJJbXBsZW1lbnRhdGlvbkNsYXNzIj4KLSAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJJbXBsZW1lbnRhdGlvbkNsYXNzLWNhbm5vdF9iZV9yZWFsaXphdGlvbi1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICA8Ym9keT5zZWxmLmJhc2VfQ2xhc3MuZXh0ZW5zaW9uX1JlYWxpemF0aW9uLT5pc0VtcHR5KCk8L2JvZHk+Ci0gICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgPC9vd25lZFJ1bGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iSW1wbGVtZW50YXRpb25DbGFzcy1iYXNlX0NsYXNzIiBuYW1lPSJiYXNlX0NsYXNzIiBhc3NvY2lhdGlvbj0iQ2xhc3NfSW1wbGVtZW50YXRpb25DbGFzcyI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0NsYXNzIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Ikluc3RhbnRpYXRlIiBuYW1lPSJJbnN0YW50aWF0ZSI+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ikluc3RhbnRpYXRlLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iSW5zdGFudGlhdGUiPgotICAgICAgPGJvZHk+QSB1c2FnZSBkZXBlbmRlbmN5IGFtb25nIGNsYXNzaWZpZXJzIGluZGljYXRpbmcgdGhhdCBvcGVyYXRpb25zIG9uIHRoZSBjbGllbnQgY3JlYXRlIGluc3RhbmNlcyBvZiB0aGUgc3VwcGxpZXIuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJJbnN0YW50aWF0ZS1jbGllbnRfYW5kX3N1cHBsaWVyX2FyZV9jbGFzc2lmaWVycyIgbmFtZT0iY2xpZW50X2FuZF9zdXBwbGllcl9hcmVfY2xhc3NpZmllcnMiIGNvbnN0cmFpbmVkRWxlbWVudD0iSW5zdGFudGlhdGUiPgotICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Ikluc3RhbnRpYXRlLWNsaWVudF9hbmRfc3VwcGxpZXJfYXJlX2NsYXNzaWZpZXJzLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgIDxib2R5PnNlbGYuYmFzZV9Vc2FnZS5jbGllbnQtPmZvckFsbChvY2xJc0tpbmRPZihDbGFzc2lmaWVyKSkgYW5kIHNlbGYuYmFzZV9Vc2FnZS5zdXBwbGllci0+Zm9yQWxsKG9jbElzS2luZE9mKENsYXNzaWZpZXIpKTwvYm9keT4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICA8L293bmVkUnVsZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJJbnN0YW50aWF0ZS1iYXNlX1VzYWdlIiBuYW1lPSJiYXNlX1VzYWdlIiBhc3NvY2lhdGlvbj0iVXNhZ2VfSW5zdGFudGlhdGUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNVc2FnZSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJMaWJyYXJ5IiBuYW1lPSJMaWJyYXJ5Ij4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTGlicmFyeS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IkxpYnJhcnkiPgotICAgICAgPGJvZHk+QSBzdGF0aWMgb3IgZHluYW1pYyBsaWJyYXJ5IGZpbGUuIFN1YmNsYXNzIG9mIMKrRmlsZcK7LjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJMaWJyYXJ5LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJGaWxlIi8+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTGlicmFyeS1iYXNlX0FydGlmYWN0IiBuYW1lPSJiYXNlX0FydGlmYWN0IiByZWRlZmluZWRQcm9wZXJ0eT0iRmlsZS1iYXNlX0FydGlmYWN0IiBhc3NvY2lhdGlvbj0iQXJ0aWZhY3RfTGlicmFyeSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0FydGlmYWN0Ii8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9Ik1ldGFjbGFzcyIgbmFtZT0iTWV0YWNsYXNzIj4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iTWV0YWNsYXNzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iTWV0YWNsYXNzIj4KLSAgICAgIDxib2R5PkEgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSBhbHNvIGNsYXNzZXMuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Ik1ldGFjbGFzcy1iYXNlX0NsYXNzIiBuYW1lPSJiYXNlX0NsYXNzIiBhc3NvY2lhdGlvbj0iQ2xhc3NfTWV0YWNsYXNzIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9Ii4uL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjQ2xhc3MiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iTW9kZWxMaWJyYXJ5IiBuYW1lPSJNb2RlbExpYnJhcnkiPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJNb2RlbExpYnJhcnktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJNb2RlbExpYnJhcnkiPgotICAgICAgPGJvZHk+QSBwYWNrYWdlIHRoYXQgY29udGFpbnMgbW9kZWwgZWxlbWVudHMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgcmV1c2VkIGJ5IG90aGVyIHBhY2thZ2VzLiBJdCBpcyBhbmFsb2dvdXMgdG8gYSBjbGFzcyBsaWJyYXJ5IGluIHNvbWUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiBUaGUgbW9kZWwgbGlicmFyeSBtYXkgbm90IGluY2x1ZGUgaW5zdGFuY2VzIG9mIHRoZSBtZXRhbW9kZWwgZXh0ZW5zaW9uIG1ldGFjbGFzc2VzIHNwZWNpZmllZCBpbiBDbGF1c2UgMTIuMywgc3VjaCBhcyBQcm9maWxlcyBhbmQgU3RlcmVvdHlwZXMuIEhvd2V2ZXIgaXQgbWF5IGluY2x1ZGUgUHJvZmlsZUFwcGxpY2F0aW9ucyBhbmQgU3RlcmVvdHlwZSBhcHBsaWNhdGlvbnMsIGFuZCBhIG1vZGVsIGxpYnJhcnkgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGFuIGFwcGxpZWQgUHJvZmlsZS48L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iTW9kZWxMaWJyYXJ5LWJhc2VfUGFja2FnZSIgbmFtZT0iYmFzZV9QYWNrYWdlIiBhc3NvY2lhdGlvbj0iUGFja2FnZV9Nb2RlbExpYnJhcnkiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNQYWNrYWdlIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9IlByb2Nlc3MiIG5hbWU9IlByb2Nlc3MiPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJQcm9jZXNzLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iUHJvY2VzcyI+Ci0gICAgICA8Ym9keT5BIHRyYW5zYWN0aW9uIGJhc2VkIGNvbXBvbmVudC48L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iUHJvY2Vzcy1iYXNlX0NvbXBvbmVudCIgbmFtZT0iYmFzZV9Db21wb25lbnQiIGFzc29jaWF0aW9uPSJDb21wb25lbnRfUHJvY2VzcyI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0NvbXBvbmVudCIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJSZWFsaXphdGlvbiIgbmFtZT0iUmVhbGl6YXRpb24iPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWFsaXphdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlJlYWxpemF0aW9uIj4KLSAgICAgIDxib2R5PkEgY2xhc3NpZmllciB0aGF0IHNwZWNpZmllcyBhIGRvbWFpbiBvZiBvYmplY3RzIGFuZCB0aGF0IGFsc28gZGVmaW5lcyB0aGUgcGh5c2ljYWwgaW1wbGVtZW50YXRpb24gb2YgdGhvc2Ugb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGEgQ29tcG9uZW50IHN0ZXJlb3R5cGVkIGJ5IMKrUmVhbGl6YXRpb27CuyB3aWxsIG9ubHkgaGF2ZSByZWFsaXppbmcgQ2xhc3NpZmllcnMgdGhhdCBpbXBsZW1lbnQgYmVoYXZpb3Igc3BlY2lmaWVkIGJ5IGEgc2VwYXJhdGUgwqtTcGVjaWZpY2F0aW9uwrsgQ29tcG9uZW50LiBTZWUgwqtTcGVjaWZpY2F0aW9uwrsuIFRoaXMgZGlmZmVycyBmcm9tIMKrSW1wbGVtZW50YXRpb25DbGFzc8K7IGJlY2F1c2UgYW4gwqtJbXBsZW1lbnRhdGlvbkNsYXNzwrsgaXMgYSByZWFsaXphdGlvbiBvZiBhIENsYXNzIHRoYXQgY2FuIGhhdmUgZmVhdHVyZXMgc3VjaCBhcyBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzIHRoYXQgYXJlIHVzZWZ1bCB0byBzeXN0ZW0gZGVzaWduZXJzLjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRSdWxlIHhtaTppZD0iUmVhbGl6YXRpb24tY2Fubm90X2JlX2ltcGxlbWVudGF0aW9uQ2xhc3MiIG5hbWU9ImNhbm5vdF9iZV9pbXBsZW1lbnRhdGlvbkNsYXNzIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlJlYWxpemF0aW9uIj4KLSAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJSZWFsaXphdGlvbi1jYW5ub3RfYmVfaW1wbGVtZW50YXRpb25DbGFzcy1fc3BlY2lmaWNhdGlvbiI+Ci0gICAgICAgIDxsYW5ndWFnZT5PQ0w8L2xhbmd1YWdlPgotICAgICAgICA8Ym9keT5zZWxmLmJhc2VfQ2xhc3NpZmllci5leHRlbnNpb25fSW1wbGVtZW50YXRpb25DbGFzcy0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgIDwvb3duZWRSdWxlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlYWxpemF0aW9uLWJhc2VfQ2xhc3NpZmllciIgbmFtZT0iYmFzZV9DbGFzc2lmaWVyIiBhc3NvY2lhdGlvbj0iQ2xhc3NpZmllcl9SZWFsaXphdGlvbiI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0NsYXNzaWZpZXIiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iUmVmaW5lIiBuYW1lPSJSZWZpbmUiPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJSZWZpbmUtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZWZpbmUiPgotICAgICAgPGJvZHk+U3BlY2lmaWVzIGEgcmVmaW5lbWVudCByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbCBlbGVtZW50cyBhdCBkaWZmZXJlbnQgc2VtYW50aWMgbGV2ZWxzLCBzdWNoIGFzIGFuYWx5c2lzIGFuZCBkZXNpZ24uIFRoZSBtYXBwaW5nIHNwZWNpZmllcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHR3byBlbGVtZW50cyBvciBzZXRzIG9mIGVsZW1lbnRzLiBUaGUgbWFwcGluZyBtYXkgb3IgbWF5IG5vdCBiZSBjb21wdXRhYmxlLCBhbmQgaXQgbWF5IGJlIHVuaWRpcmVjdGlvbmFsIG9yIGJpZGlyZWN0aW9uYWwuIFJlZmluZW1lbnQgY2FuIGJlIHVzZWQgdG8gbW9kZWwgdHJhbnNmb3JtYXRpb25zIGZyb20gYW5hbHlzaXMgdG8gZGVzaWduIGFuZCBvdGhlciBzdWNoIGNoYW5nZXMuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlJlZmluZS1iYXNlX0Fic3RyYWN0aW9uIiBuYW1lPSJiYXNlX0Fic3RyYWN0aW9uIiBhc3NvY2lhdGlvbj0iQWJzdHJhY3Rpb25fUmVmaW5lIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9Ii4uL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjQWJzdHJhY3Rpb24iLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iUmVzcG9uc2liaWxpdHkiIG5hbWU9IlJlc3BvbnNpYmlsaXR5Ij4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iUmVzcG9uc2liaWxpdHktX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJSZXNwb25zaWJpbGl0eSI+Ci0gICAgICA8Ym9keT5BIGNvbnRyYWN0IG9yIGFuIG9ibGlnYXRpb24gb2YgYW4gZWxlbWVudCBpbiBpdHMgcmVsYXRpb25zaGlwIHRvIG90aGVyIGVsZW1lbnRzLjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJSZXNwb25zaWJpbGl0eS1iYXNlX1VzYWdlIiBuYW1lPSJiYXNlX1VzYWdlIiBhc3NvY2lhdGlvbj0iVXNhZ2VfUmVzcG9uc2liaWxpdHkiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNVc2FnZSIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJTY3JpcHQiIG5hbWU9IlNjcmlwdCI+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNjcmlwdC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNjcmlwdCI+Ci0gICAgICA8Ym9keT5BIHNjcmlwdCBmaWxlIHRoYXQgY2FuIGJlIGludGVycHJldGVkIGJ5IGEgY29tcHV0ZXIgc3lzdGVtLiBTdWJjbGFzcyBvZiDCq0ZpbGXCuy48L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU2NyaXB0LV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJGaWxlIi8+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU2NyaXB0LWJhc2VfQXJ0aWZhY3QiIG5hbWU9ImJhc2VfQXJ0aWZhY3QiIHJlZGVmaW5lZFByb3BlcnR5PSJGaWxlLWJhc2VfQXJ0aWZhY3QiIGFzc29jaWF0aW9uPSJBcnRpZmFjdF9TY3JpcHQiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNBcnRpZmFjdCIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJTZW5kIiBuYW1lPSJTZW5kIj4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU2VuZC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNlbmQiPgotICAgICAgPGJvZHk+QSBVc2FnZSB3aG9zZSBjbGllbnQgaXMgYW4gT3BlcmF0aW9uIGFuZCB3aG9zZSBzdXBwbGllciBpcyBhIFNpZ25hbCwgc3BlY2lmeWluZyB0aGF0IHRoZSBPcGVyYXRpb24gc2VuZHMgdGhlIFNpZ25hbC48L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkUnVsZSB4bWk6aWQ9IlNlbmQtY2xpZW50X29wZXJhdGlvbl9zZW5kc19zdXBwbGllcl9zaWduYWwiIG5hbWU9ImNsaWVudF9vcGVyYXRpb25fc2VuZHNfc3VwcGxpZXJfc2lnbmFsIiBjb25zdHJhaW5lZEVsZW1lbnQ9IlNlbmQiPgotICAgICAgPHNwZWNpZmljYXRpb24geG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9IlNlbmQtY2xpZW50X29wZXJhdGlvbl9zZW5kc19zdXBwbGllcl9zaWduYWwtX3NwZWNpZmljYXRpb24iPgotICAgICAgICA8bGFuZ3VhZ2U+T0NMPC9sYW5ndWFnZT4KLSAgICAgICAgPGJvZHk+c2VsZi5iYXNlX1VzYWdlLmNsaWVudC0+Zm9yQWxsKG9jbElzS2luZE9mKE9wZXJhdGlvbikpIGFuZCBzZWxmLmJhc2VfVXNhZ2Uuc3VwcGxpZXItPmZvckFsbChvY2xJc0tpbmRPZihTaWduYWwpKTwvYm9keT4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgICA8L293bmVkUnVsZT4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTZW5kLWJhc2VfVXNhZ2UiIG5hbWU9ImJhc2VfVXNhZ2UiIGFzc29jaWF0aW9uPSJVc2FnZV9TZW5kIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9Ii4uL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjVXNhZ2UiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iU2VydmljZSIgbmFtZT0iU2VydmljZSI+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNlcnZpY2UtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTZXJ2aWNlIj4KLSAgICAgIDxib2R5PkEgc3RhdGVsZXNzLCBmdW5jdGlvbmFsIGNvbXBvbmVudC48L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU2VydmljZS1iYXNlX0NvbXBvbmVudCIgbmFtZT0iYmFzZV9Db21wb25lbnQiIGFzc29jaWF0aW9uPSJDb21wb25lbnRfU2VydmljZSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0NvbXBvbmVudCIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJTb3VyY2UiIG5hbWU9IlNvdXJjZSI+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlNvdXJjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNvdXJjZSI+Ci0gICAgICA8Ym9keT5BIHNvdXJjZSBmaWxlIHRoYXQgY2FuIGJlIGNvbXBpbGVkIGludG8gYW4gZXhlY3V0YWJsZSBmaWxlLiBTdWJjbGFzcyBvZiDCq0ZpbGXCuy48L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iU291cmNlLV9nZW5lcmFsaXphdGlvbi4wIiBnZW5lcmFsPSJGaWxlIi8+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU291cmNlLWJhc2VfQXJ0aWZhY3QiIG5hbWU9ImJhc2VfQXJ0aWZhY3QiIHJlZGVmaW5lZFByb3BlcnR5PSJGaWxlLWJhc2VfQXJ0aWZhY3QiIGFzc29jaWF0aW9uPSJBcnRpZmFjdF9Tb3VyY2UiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNBcnRpZmFjdCIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJTcGVjaWZpY2F0aW9uIiBuYW1lPSJTcGVjaWZpY2F0aW9uIj4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iU3BlY2lmaWNhdGlvbi1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlNwZWNpZmljYXRpb24iPgotICAgICAgPGJvZHk+QSBjbGFzc2lmaWVyIHRoYXQgc3BlY2lmaWVzIGEgZG9tYWluIG9mIG9iamVjdHMgd2l0aG91dCBkZWZpbmluZyB0aGUgcGh5c2ljYWwgaW1wbGVtZW50YXRpb24gb2YgdGhvc2Ugb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGEgQ29tcG9uZW50IHN0ZXJlb3R5cGVkIGJ5IMKrU3BlY2lmaWNhdGlvbsK7IHdpbGwgb25seSBoYXZlIHByb3ZpZGVkIGFuZCByZXF1aXJlZCBpbnRlcmZhY2VzLCBhbmQgaXMgbm90IGludGVuZGVkIHRvIGhhdmUgYW55IHJlYWxpemluZ0NsYXNzaWZpZXJzIGFzIHBhcnQgb2YgaXRzIGRlZmluaXRpb24uIFRoaXMgZGlmZmVycyBmcm9tIMKrVHlwZcK7IGJlY2F1c2UgYSDCq1R5cGXCuyBjYW4gaGF2ZSBmZWF0dXJlcyBzdWNoIGFzIGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgdGhhdCBhcmUgdXNlZnVsIHRvIGFuYWx5c3RzIG1vZGVsaW5nIHN5c3RlbXMuIEFsc28gc2VlOiDCq1JlYWxpemF0aW9uwrsuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJTcGVjaWZpY2F0aW9uLWNhbm5vdF9iZV90eXBlIiBuYW1lPSJjYW5ub3RfYmVfdHlwZSIgY29uc3RyYWluZWRFbGVtZW50PSJTcGVjaWZpY2F0aW9uIj4KLSAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJTcGVjaWZpY2F0aW9uLWNhbm5vdF9iZV90eXBlLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgIDxib2R5PnNlbGYuYmFzZV9DbGFzc2lmaWVyLmV4dGVuc2lvbl9UeXBlLT5pc0VtcHR5KCk8L2JvZHk+Ci0gICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICAgPC9vd25lZFJ1bGU+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3BlY2lmaWNhdGlvbi1iYXNlX0NsYXNzaWZpZXIiIG5hbWU9ImJhc2VfQ2xhc3NpZmllciIgYXNzb2NpYXRpb249IkNsYXNzaWZpZXJfU3BlY2lmaWNhdGlvbiI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0NsYXNzaWZpZXIiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iU3Vic3lzdGVtIiBuYW1lPSJTdWJzeXN0ZW0iPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJTdWJzeXN0ZW0tX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJTdWJzeXN0ZW0iPgotICAgICAgPGJvZHk+QSB1bml0IG9mIGhpZXJhcmNoaWNhbCBkZWNvbXBvc2l0aW9uIGZvciBsYXJnZSBzeXN0ZW1zLiBBIHN1YnN5c3RlbSBpcyBjb21tb25seSBpbnN0YW50aWF0ZWQgaW5kaXJlY3RseS4gRGVmaW5pdGlvbnMgb2Ygc3Vic3lzdGVtcyB2YXJ5IHdpZGVseSBhbW9uZyBkb21haW5zIGFuZCBtZXRob2RzLCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBkb21haW4gYW5kIG1ldGhvZCBwcm9maWxlcyB3aWxsIHNwZWNpYWxpemUgdGhpcyBjb25zdHJ1Y3QuIEEgc3Vic3lzdGVtIG1heSBiZSBkZWZpbmVkIHRvIGhhdmUgc3BlY2lmaWNhdGlvbiBhbmQgcmVhbGl6YXRpb24gZWxlbWVudHMuIFNlZSBhbHNvOiDCq1NwZWNpZmljYXRpb27CuyBhbmQgwqtSZWFsaXphdGlvbsK7LjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJTdWJzeXN0ZW0tYmFzZV9Db21wb25lbnQiIG5hbWU9ImJhc2VfQ29tcG9uZW50IiBhc3NvY2lhdGlvbj0iQ29tcG9uZW50X1N1YnN5c3RlbSI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0NvbXBvbmVudCIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJUcmFjZSIgbmFtZT0iVHJhY2UiPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJUcmFjZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlRyYWNlIj4KLSAgICAgIDxib2R5PlNwZWNpZmllcyBhIHRyYWNlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsIGVsZW1lbnRzIG9yIHNldHMgb2YgbW9kZWwgZWxlbWVudHMgdGhhdCByZXByZXNlbnQgdGhlIHNhbWUgY29uY2VwdCBpbiBkaWZmZXJlbnQgbW9kZWxzLiBUcmFjZXMgYXJlIG1haW5seSB1c2VkIGZvciB0cmFja2luZyByZXF1aXJlbWVudHMgYW5kIGNoYW5nZXMgYWNyb3NzIG1vZGVscy4gQXMgbW9kZWwgY2hhbmdlcyBjYW4gb2NjdXIgaW4gYm90aCBkaXJlY3Rpb25zLCB0aGUgZGlyZWN0aW9uYWxpdHkgb2YgdGhlIGRlcGVuZGVuY3kgY2FuIG9mdGVuIGJlIGlnbm9yZWQuIFRoZSBtYXBwaW5nIHNwZWNpZmllcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHR3bywgYnV0IGl0IGlzIHJhcmVseSBjb21wdXRhYmxlIGFuZCBpcyB1c3VhbGx5IGluZm9ybWFsLjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJUcmFjZS1iYXNlX0Fic3RyYWN0aW9uIiBuYW1lPSJiYXNlX0Fic3RyYWN0aW9uIiBhc3NvY2lhdGlvbj0iQWJzdHJhY3Rpb25fVHJhY2UiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNBYnN0cmFjdGlvbiIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJUeXBlIiBuYW1lPSJUeXBlIj4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVHlwZS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlR5cGUiPgotICAgICAgPGJvZHk+QSBjbGFzcyB0aGF0IHNwZWNpZmllcyBhIGRvbWFpbiBvZiBvYmplY3RzIHRvZ2V0aGVyIHdpdGggdGhlIG9wZXJhdGlvbnMgYXBwbGljYWJsZSB0byB0aGUgb2JqZWN0cywgd2l0aG91dCBkZWZpbmluZyB0aGUgcGh5c2ljYWwgaW1wbGVtZW50YXRpb24gb2YgdGhvc2Ugb2JqZWN0cy4gSG93ZXZlciwgaXQgbWF5IGhhdmUgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zLiBCZWhhdmlvcmFsIHNwZWNpZmljYXRpb25zIGZvciB0eXBlIG9wZXJhdGlvbnMgbWF5IGJlIGV4cHJlc3NlZCB1c2luZywgZm9yIGV4YW1wbGUsIGFjdGl2aXR5IGRpYWdyYW1zLiBBbiBvYmplY3QgbWF5IGhhdmUgYXQgbW9zdCBvbmUgaW1wbGVtZW50YXRpb24gY2xhc3MsIGhvd2V2ZXIgaXQgbWF5IGNvbmZvcm0gdG8gbXVsdGlwbGUgZGlmZmVyZW50IHR5cGVzLiBTZWUgYWxzbzogwqtJbXBsZW1lbnRhdGlvbkNsYXNzwrsuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJUeXBlLWNhbm5vdF9iZV9zcGVjaWZpY2F0aW9uIiBuYW1lPSJjYW5ub3RfYmVfc3BlY2lmaWNhdGlvbiIgY29uc3RyYWluZWRFbGVtZW50PSJUeXBlIj4KLSAgICAgIDxzcGVjaWZpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJUeXBlLWNhbm5vdF9iZV9zcGVjaWZpY2F0aW9uLV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgIDxib2R5PnNlbGYuYmFzZV9DbGFzcy5leHRlbnNpb25fU3BlY2lmaWNhdGlvbi0+aXNFbXB0eSgpPC9ib2R5PgotICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgIDwvb3duZWRSdWxlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlR5cGUtYmFzZV9DbGFzcyIgbmFtZT0iYmFzZV9DbGFzcyIgYXNzb2NpYXRpb249IkNsYXNzX1R5cGUiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNDbGFzcyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJVdGlsaXR5IiBuYW1lPSJVdGlsaXR5Ij4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iVXRpbGl0eS1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9IlV0aWxpdHkiPgotICAgICAgPGJvZHk+QSBjbGFzcyB0aGF0IGhhcyBubyBpbnN0YW5jZXMsIGJ1dCByYXRoZXIgZGVub3RlcyBhIG5hbWVkIGNvbGxlY3Rpb24gb2YgYXR0cmlidXRlcyBhbmQgb3BlcmF0aW9ucywgYWxsIG9mIHdoaWNoIGFyZSBzdGF0aWMuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZFJ1bGUgeG1pOmlkPSJVdGlsaXR5LWlzX3V0aWxpdHkiIG5hbWU9ImlzX3V0aWxpdHkiIGNvbnN0cmFpbmVkRWxlbWVudD0iVXRpbGl0eSI+Ci0gICAgICA8c3BlY2lmaWNhdGlvbiB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iVXRpbGl0eS1pc191dGlsaXR5LV9zcGVjaWZpY2F0aW9uIj4KLSAgICAgICAgPGxhbmd1YWdlPk9DTDwvbGFuZ3VhZ2U+Ci0gICAgICAgIDxib2R5PnNlbGYuYmFzZV9DbGFzcy5mZWF0dXJlLT5mb3JBbGwoaXNTdGF0aWMpPC9ib2R5PgotICAgICAgPC9zcGVjaWZpY2F0aW9uPgotICAgIDwvb3duZWRSdWxlPgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IlV0aWxpdHktYmFzZV9DbGFzcyIgbmFtZT0iYmFzZV9DbGFzcyIgYXNzb2NpYXRpb249IkNsYXNzX1V0aWxpdHkiPgotICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iLi4vbWV0YW1vZGVscy9VTUwubWV0YW1vZGVsLnVtbCNDbGFzcyIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9IkNvbXBvbmVudF9CdWlsZENvbXBvbmVudCIgbmFtZT0iQ29tcG9uZW50X0J1aWxkQ29tcG9uZW50IiBtZW1iZXJFbmQ9IkNvbXBvbmVudF9CdWlsZENvbXBvbmVudC1leHRlbnNpb25fQnVpbGRDb21wb25lbnQgQnVpbGRDb21wb25lbnQtYmFzZV9Db21wb25lbnQiPgotICAgIDxvd25lZEVuZCB4bWk6dHlwZT0idW1sOkV4dGVuc2lvbkVuZCIgeG1pOmlkPSJDb21wb25lbnRfQnVpbGRDb21wb25lbnQtZXh0ZW5zaW9uX0J1aWxkQ29tcG9uZW50IiBuYW1lPSJleHRlbnNpb25fQnVpbGRDb21wb25lbnQiIHR5cGU9IkJ1aWxkQ29tcG9uZW50IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iQ29tcG9uZW50X0J1aWxkQ29tcG9uZW50Ij4KLSAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iQ29tcG9uZW50X0J1aWxkQ29tcG9uZW50LWV4dGVuc2lvbl9CdWlsZENvbXBvbmVudC1fbG93ZXJWYWx1ZSIvPgotICAgIDwvb3duZWRFbmQ+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RXh0ZW5zaW9uIiB4bWk6aWQ9Ik1vZGVsX01ldGFtb2RlbCIgbmFtZT0iTW9kZWxfTWV0YW1vZGVsIiBtZW1iZXJFbmQ9Ik1vZGVsX01ldGFtb2RlbC1leHRlbnNpb25fTWV0YW1vZGVsIE1ldGFtb2RlbC1iYXNlX01vZGVsIj4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iTW9kZWxfTWV0YW1vZGVsLWV4dGVuc2lvbl9NZXRhbW9kZWwiIG5hbWU9ImV4dGVuc2lvbl9NZXRhbW9kZWwiIHR5cGU9Ik1ldGFtb2RlbCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Ik1vZGVsX01ldGFtb2RlbCI+Ci0gICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Ik1vZGVsX01ldGFtb2RlbC1leHRlbnNpb25fTWV0YW1vZGVsLV9sb3dlclZhbHVlIi8+Ci0gICAgPC9vd25lZEVuZD4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb24iIHhtaTppZD0iTW9kZWxfU3lzdGVtTW9kZWwiIG5hbWU9Ik1vZGVsX1N5c3RlbU1vZGVsIiBtZW1iZXJFbmQ9Ik1vZGVsX1N5c3RlbU1vZGVsLWV4dGVuc2lvbl9TeXN0ZW1Nb2RlbCBTeXN0ZW1Nb2RlbC1iYXNlX01vZGVsIj4KLSAgICA8b3duZWRFbmQgeG1pOnR5cGU9InVtbDpFeHRlbnNpb25FbmQiIHhtaTppZD0iTW9kZWxfU3lzdGVtTW9kZWwtZXh0ZW5zaW9uX1N5c3RlbU1vZGVsIiBuYW1lPSJleHRlbnNpb25fU3lzdGVtTW9kZWwiIHR5cGU9IlN5c3RlbU1vZGVsIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iTW9kZWxfU3lzdGVtTW9kZWwiPgotICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJNb2RlbF9TeXN0ZW1Nb2RlbC1leHRlbnNpb25fU3lzdGVtTW9kZWwtX2xvd2VyVmFsdWUiLz4KLSAgICA8L293bmVkRW5kPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIHhtaTppZD0iQnVpbGRDb21wb25lbnQiIG5hbWU9IkJ1aWxkQ29tcG9uZW50Ij4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iQnVpbGRDb21wb25lbnQtX293bmVkQ29tbWVudC4wIiBhbm5vdGF0ZWRFbGVtZW50PSJCdWlsZENvbXBvbmVudCI+Ci0gICAgICA8Ym9keT5BIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgZGVmaW5lZCBmb3IgdGhlIHB1cnBvc2Ugb2Ygc3lzdGVtIGxldmVsIGRldmVsb3BtZW50IGFjdGl2aXRpZXMsIHN1Y2ggYXMgY29tcGlsYXRpb24gYW5kIHZlcnNpb25pbmcuPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9IkJ1aWxkQ29tcG9uZW50LWJhc2VfQ29tcG9uZW50IiBuYW1lPSJiYXNlX0NvbXBvbmVudCIgYXNzb2NpYXRpb249IkNvbXBvbmVudF9CdWlsZENvbXBvbmVudCI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI0NvbXBvbmVudCIvPgotICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gIDwvcGFja2FnZWRFbGVtZW50PgotICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgeG1pOmlkPSJNZXRhbW9kZWwiIG5hbWU9Ik1ldGFtb2RlbCI+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Ik1ldGFtb2RlbC1fb3duZWRDb21tZW50LjAiIGFubm90YXRlZEVsZW1lbnQ9Ik1ldGFtb2RlbCI+Ci0gICAgICA8Ym9keT5BIG1vZGVsIHRoYXQgc3BlY2lmaWVzIHRoZSBtb2RlbGluZyBjb25jZXB0cyBvZiBzb21lIG1vZGVsaW5nIGxhbmd1YWdlIChlLmcuLCBhIE1PRiBtb2RlbCkuIFNlZSDCq01ldGFjbGFzc8K7LjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJNZXRhbW9kZWwtYmFzZV9Nb2RlbCIgbmFtZT0iYmFzZV9Nb2RlbCIgYXNzb2NpYXRpb249Ik1vZGVsX01ldGFtb2RlbCI+Ci0gICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSIuLi9tZXRhbW9kZWxzL1VNTC5tZXRhbW9kZWwudW1sI01vZGVsIi8+Ci0gICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiB4bWk6aWQ9IlN5c3RlbU1vZGVsIiBuYW1lPSJTeXN0ZW1Nb2RlbCI+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9IlN5c3RlbU1vZGVsLV9vd25lZENvbW1lbnQuMCIgYW5ub3RhdGVkRWxlbWVudD0iU3lzdGVtTW9kZWwiPgotICAgICAgPGJvZHk+QSBTeXN0ZW1Nb2RlbCBpcyBhIHN0ZXJlb3R5cGVkIG1vZGVsIHRoYXQgY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIG1vZGVscyBvZiB0aGUgc2FtZSBzeXN0ZW0uIEEgU3lzdGVtTW9kZWwgYWxzbyBjb250YWlucyBhbGwgcmVsYXRpb25zaGlwcyBhbmQgY29uc3RyYWludHMgYmV0d2VlbiBtb2RlbCBlbGVtZW50cyBjb250YWluZWQgaW4gZGlmZmVyZW50IG1vZGVscy48L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iU3lzdGVtTW9kZWwtYmFzZV9Nb2RlbCIgbmFtZT0iYmFzZV9Nb2RlbCIgYXNzb2NpYXRpb249Ik1vZGVsX1N5c3RlbU1vZGVsIj4KLSAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9Ii4uL21ldGFtb2RlbHMvVU1MLm1ldGFtb2RlbC51bWwjTW9kZWwiLz4KLSAgICA8L293bmVkQXR0cmlidXRlPgotICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9wcm9maWxlQXBwbGljYXRpb24uMCI+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il82cnlyWUw1TUVlQ1VnOV8wMXpqN09nIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI196MU9GY0hqcUVkeThTNENyOFJjX05BIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjXzAiLz4KLSAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci08L3VtbDpQcm9maWxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvQzIvcmVzb3VyY2VzL21vZGVsL3Jlc291cmNlL0ZNVUV4cG9ydC9GTUklMjBFeHBvcnQlMjBEZXYvRk1VX0V4YW1wbGVzLnVtbCBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2RlbC9yZXNvdXJjZS9GTVVFeHBvcnQvRk1JJTIwRXhwb3J0JTIwRGV2L0ZNVV9FeGFtcGxlcy51bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyY2IzNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvQzIvcmVzb3VyY2VzL21vZGVsL3Jlc291cmNlL0ZNVUV4cG9ydC9GTUklMjBFeHBvcnQlMjBEZXYvRk1VX0V4YW1wbGVzLnVtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIwMTMxMDAxIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9zcGVjL1hNSS8yMDEzMTAwMSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOmZtaXByb2ZpbGU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGFweXJ1cy9GTUlQcm9maWxlLzEuMC4wIiB4bWxuczpzdGFuZGFyZD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTC9Qcm9maWxlL1N0YW5kYXJkIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwiPgotICA8dW1sOk1vZGVsIHhtaTppZD0iX3E4RE9jTVhQRWVXd3hfcHVIRHpGWXciIG5hbWU9IkZNVSBFeGFtcGxlcyI+Ci0gICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfckVVWm9NWFBFZVd3eF9wdUhEekZZdyI+Ci0gICAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI18wIi8+Ci0gICAgPC9wYWNrYWdlSW1wb3J0PgotICAgIDxwYWNrYWdlSW1wb3J0IHhtaTppZD0iX1p2akwwT3hURWVXUDZlTl82WmNnbXciPgotICAgICAgPGltcG9ydGVkUGFja2FnZSB4bWk6dHlwZT0idW1sOk1vZGVsIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZ1bWwuc3RhbmRhcmRsaWJyYXJ5L3Jlc291cmNlcy9mVU1MX0xpYnJhcnkudW1sI18wIi8+Ci0gICAgPC9wYWNrYWdlSW1wb3J0PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il83U0FvSU94T0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJFREYiPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3IiBuYW1lPSJDMSIgY2xhc3NpZmllckJlaGF2aW9yPSJfYm5SQVVNWFFFZVd3eF9wdUhEekZZdyIgaXNBY3RpdmU9InRydWUiPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfUlVrQmNNWFFFZVd3eF9wdUhEekZZdyIgbmFtZT0idmFsdmUiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9WczhXOE1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEJlaGF2aW9yIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIHhtaTppZD0iX2JuUkFVTVhRRWVXd3hfcHVIRHpGWXciIG5hbWU9IkMxIENsYXNzaWZpZXJCZWhhdmlvciIgbm9kZT0iX3hyQWtVTVhRRWVXd3hfcHVIRHpGWXcgX3g2Sk1nTVhRRWVXd3hfcHVIRHpGWXcgX3lJR3dBTVhRRWVXd3hfcHVIRHpGWXcgX013RVFvTVhTRWVXd3hfcHVIRHpGWXcgX2JlLWZvTVhURWVXd3hfcHVIRHpGWXcgX2hjbGJvTVhWRWVXd3hfcHVIRHpGWXcgX2lhNXpJTVhYRWVXd3hfcHVIRHpGWXcgX3hGOVNVTVhYRWVXd3hfcHVIRHpGWXciIGdyb3VwPSJfYmUtZm9NWFRFZVd3eF9wdUhEekZZdyBfaWE1eklNWFhFZVd3eF9wdUhEekZZdyBfeEY5U1VNWFhFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9zUlQ3d01YUUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgIDxib2R5Pm1vZGVsIEMxJiN4RDsKLSAgZGlzY3JldGUgb3V0cHV0IEJvb2xlYW4gdmFsdmUoc3RhcnQgPSBmYWxzZSwgZml4ZWQgPSBmYWxzZSk7JiN4RDsKLWVxdWF0aW9uJiN4RDsKLSAgd2hlbiB0aW1lID49IDAuNSB0aGVuJiN4RDsKLSAgICB2YWx2ZSA9IHRydWU7JiN4RDsKLSAgZWxzZXdoZW4gdGltZSA+PSAzLjIgdGhlbiYjeEQ7Ci0gICAgdmFsdmUgPSBmYWxzZTsmI3hEOwotICBlbHNld2hlbiB0aW1lID49IDUuMiB0aGVuJiN4RDsKLSAgICB2YWx2ZSA9IHRydWU7JiN4RDsKLSAgZW5kIHdoZW47JiN4RDsKLWVuZCBDMTs8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfV09YUHNNWFZFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfeHJBa1VNWFFFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfTXdFUW9NWFNFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX2M2SnlRTVhWRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX2JlLWZvTVhURWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX3hyQWtVTVhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9kY0hQME1YVkVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il94NkpNZ01YUUVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9iZS1mb01YVEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfUHpna3dNWFlFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfaWE1eklNWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfeDZKTWdNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX1FZdl8wTVhZRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX3lJR3dBTVhRRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX2lhNXpJTVhYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9ReVluME1YWUVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il94RjlTVU1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il95SUd3QU1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfUlMxQ2NNWFlFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfaGNsYm9NWFZFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfeEY5U1VNWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxzdHJ1Y3R1cmVkTm9kZSB4bWk6aWQ9Il9iZS1mb01YVEVlV3d4X3B1SER6Rll3IiBuYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMSIgaW5jb21pbmc9Il9jNkp5UU1YVkVlV3d4X3B1SER6Rll3IiBvdXRnb2luZz0iX2RjSFAwTVhWRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il91cEFFZ01YVEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9Kci1fSU1YVEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9sMG0yc01YVEVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX3VwUnhVTVhURWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdXBTWVlNWFRFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfczVpNUVNWFRFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfSnI4aTRNWFRFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfanpSUkVNWFRFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9zNXZ0WU1YVEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3M1dnRZY1hURWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIHhtaTppZD0iX0pyelk4TVhURWVXd3hfcHVIRHpGWXciIG5hbWU9InNldCBWYWx2ZSIgc3RydWN0dXJhbEZlYXR1cmU9Il9SVWtCY01YUUVlV3d4X3B1SER6Rll3IiBpc1JlcGxhY2VBbGw9InRydWUiPgotICAgICAgICAgICAgICA8b2JqZWN0IHhtaTppZD0iX0pyOGk0TVhURWVXd3hfcHVIRHpGWXciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9zNWk1RU1YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTppZD0iX0pyOXhBTVhURWVXd3hfcHVIRHpGWXciIG5hbWU9InJlc3VsdCIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTppZD0iX0pyLV9JTVhURWVXd3hfcHVIRHpGWXciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iX3VwQUVnTVhURWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgICA8L3ZhbHVlPgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpSZWFkU2VsZkFjdGlvbiIgeG1pOmlkPSJfanpRQzhNWFRFZVd3eF9wdUhEekZZdyIgbmFtZT0idGhpcyI+Ci0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfanpSUkVNWFRFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX3M1aTVFTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9Il9iblJBVU1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiIgeG1pOmlkPSJfbDBjZW9NWFRFZVd3eF9wdUhEekZZdyIgbmFtZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfbDBtMnNNWFRFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX3VwQUVnTVhURWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX21YZTZRTVhURWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfbVhlVE1NWFRFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9tWFdYWU1YVEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgPC9zdHJ1Y3R1cmVkTm9kZT4KLSAgICAgICAgICA8c3RydWN0dXJlZE5vZGUgeG1pOmlkPSJfaWE1eklNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTIiIGluY29taW5nPSJfUHpna3dNWFlFZVd3eF9wdUhEekZZdyIgb3V0Z29pbmc9Il9RWXZfME1YWUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfRkhyVU1NWFlFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfbUpFRzhNWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfcndsSkVNWFhFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9GSUoxVU1YWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0ZJSjFVY1hZRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX0hGbzFzTVhZRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX21KSEtRTVhYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX3VJUUxFTVhYRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfSEdDZVVNWFlFZVd3eF9wdUhEekZZdyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9IR0NlVWNYWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9lZGdlPgotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiB4bWk6aWQ9Il9tSV9PY01YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJzZXQgVmFsdmUiIHN0cnVjdHVyYWxGZWF0dXJlPSJfUlVrQmNNWFFFZVd3eF9wdUhEekZZdyIgaXNSZXBsYWNlQWxsPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPG9iamVjdCB4bWk6aWQ9Il9tSkVHOE1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJvYmplY3QiIGluY29taW5nPSJfRkhyVU1NWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6aWQ9Il9tSkZWRU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHQiIHR5cGU9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDx2YWx1ZSB4bWk6aWQ9Il9tSkhLUU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJ2YWx1ZSIgaW5jb21pbmc9Il9IRm8xc01YWUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICAgICAgPC92YWx1ZT4KLSAgICAgICAgICAgIDwvbm9kZT4KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIHhtaTppZD0iX3J3a2lBTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InNlbGYiPgotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTppZD0iX3J3bEpFTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il9GSHJVTU1YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJfYm5SQVVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIHhtaTppZD0iX3VJUGtBTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9ImZhbHNlIj4KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6aWQ9Il91SVFMRU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfSEZvMXNNWFlFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfdWpKLVlNWFhFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il91akpYVU1YWEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8L3Jlc3VsdD4KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX3VqSXdRTVhYRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgICA8L3ZhbHVlPgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDwvc3RydWN0dXJlZE5vZGU+Ci0gICAgICAgICAgPHN0cnVjdHVyZWROb2RlIHhtaTppZD0iX3hGOVNVTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzIiBpbmNvbWluZz0iX1F5WW4wTVhZRWVXd3hfcHVIRHpGWXciIG91dGdvaW5nPSJfUlMxQ2NNWFlFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX0tsWTZFTVhZRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX3kyUGtNTVhYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iXzRteFlZTVhYRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfS2x4VWtNWFlFZVd3eF9wdUhEekZZdyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9LbHhVa2NYWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9lZGdlPgotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9NU25RNE1YWUVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il95MlNBY01YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il82MUpVY01YWEVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX01URFZ3TVhZRWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfTVREVndjWFlFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgeG1pOmlkPSJfeTJNZzRNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0ic2V0IFZhbHZlIiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX1JVa0JjTVhRRWVXd3hfcHVIRHpGWXciIGlzUmVwbGFjZUFsbD0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDxvYmplY3QgeG1pOmlkPSJfeTJQa01NWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0ib2JqZWN0IiBpbmNvbWluZz0iX0tsWTZFTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfeTJReVVNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8dmFsdWUgeG1pOmlkPSJfeTJTQWNNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0idmFsdWUiIGluY29taW5nPSJfTVNuUTRNWFlFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlJlYWRTZWxmQWN0aW9uIiB4bWk6aWQ9Il80bXJSd01YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJzZWxmIj4KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6aWQ9Il80bXhZWU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfS2xZNkVNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iX2JuUkFVTVhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgIDwvbm9kZT4KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiB4bWk6aWQ9Il82MUl0WU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6aWQ9Il82MUpVY01YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfTVNuUTRNWFlFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfN016bWdjWFhFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il83TXptZ01YWEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8L3Jlc3VsdD4KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXzdNeV9jTVhYRWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICAgICAgPC92YWx1ZT4KLSAgICAgICAgICAgIDwvbm9kZT4KLSAgICAgICAgICA8L3N0cnVjdHVyZWROb2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIHhtaTppZD0iX3hyQWtVTVhRRWVXd3hfcHVIRHpGWXciIG5hbWU9ImF0IDAuNSIgaW5jb21pbmc9Il9XT1hQc01YVkVlV3d4X3B1SER6Rll3IiBvdXRnb2luZz0iX2M2SnlRTVhWRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPHRyaWdnZXIgeG1pOmlkPSJfZERIZDBNWFJFZVd3eF9wdUhEekZZdyIgZXZlbnQ9Il9GT0ZpWU1YUkVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIHhtaTppZD0iX3g2Sk1nTVhRRWVXd3hfcHVIRHpGWXciIG5hbWU9ImF0IDMuMiIgaW5jb21pbmc9Il9kY0hQME1YVkVlV3d4X3B1SER6Rll3IiBvdXRnb2luZz0iX1B6Z2t3TVhZRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPHRyaWdnZXIgeG1pOmlkPSJfbDNlUFlNWFJFZVd3eF9wdUhEekZZdyIgZXZlbnQ9Il9MRzdsRU1YUkVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIHhtaTppZD0iX3lJR3dBTVhRRWVXd3hfcHVIRHpGWXciIG5hbWU9ImF0IDUuMiIgaW5jb21pbmc9Il9RWXZfME1YWUVlV3d4X3B1SER6Rll3IiBvdXRnb2luZz0iX1F5WW4wTVhZRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPHRyaWdnZXIgeG1pOmlkPSJfcWVkb29NWFJFZVd3eF9wdUhEekZZdyIgZXZlbnQ9Il9MV21Zd01YUkVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6SW5pdGlhbE5vZGUiIHhtaTppZD0iX013RVFvTVhTRWVXd3hfcHVIRHpGWXciIG5hbWU9IkluaXRpYWxOb2RlMSIgb3V0Z29pbmc9Il9XT1hQc01YVkVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY3Rpdml0eUZpbmFsTm9kZSIgeG1pOmlkPSJfaGNsYm9NWFZFZVd3eF9wdUhEekZZdyIgbmFtZT0iQWN0aXZpdHlGaW5hbE5vZGUxIiBpbmNvbWluZz0iX1JTMUNjTVhZRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPC9vd25lZEJlaGF2aW9yPgotICAgICAgICA8b3duZWRCZWhhdmlvciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiB4bWk6aWQ9Il9DbE5wWU1YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJDMV9GYWN0b3J5IiBub2RlPSJfQ2xPM2djWFdFZVd3eF9wdUhEekZZdyBfQ291UVlNWFdFZVd3eF9wdUhEekZZdyBfQ291M2NzWFdFZVd3eF9wdUhEekZZdyBfQ293c29jWFdFZVd3eF9wdUhEekZZdyBfQ294VHNjWFdFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iX0NsTzNnTVhXRWVXd3hfcHVIRHpGWXciIG5hbWU9InJlc3VsdCIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9Db3dGa3NYV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJjcmVhdGVPYmplY3RBY3Rpb24gdG8gY2FsbENvbnN0cnVjdG9yIiB0YXJnZXQ9Il9Db3ZlZ01YV0VlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9Db3UzY01YV0VlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9DbzhTME1YV0VlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9DbzhTMGNYV0VlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX0Nvd3NvTVhXRWVXd3hfcHVIRHpGWXciIG5hbWU9ImNhbGxDb25zdHJ1Y3RvciB0byByZXR1cm5QYXJhbU5vZGUiIHRhcmdldD0iX0NsTzNnY1hXRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX0NveFRzY1hXRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0NvOFMwc1hXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NvOFMwOFhXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9lZGdlPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfQ294VHNzWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0iZm9yayB0byBzdGFydGJlaGF2aW9yIGlucHV0IHBpbiIgdGFyZ2V0PSJfQ293c29zWFdFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfQ294VHNjWFdFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfQ284NTRNWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQ284NTRjWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9Db3hUczhYV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJjYWxsQ29uc3RydWN0b3IgdG8gc3RhcnRCZWhhdmlvciIgdGFyZ2V0PSJfQ294VHNjWFdFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfQ293RmtNWFdFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfQ284NTRzWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQ284NTQ4WFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY3Rpdml0eVBhcmFtZXRlck5vZGUiIHhtaTppZD0iX0NsTzNnY1hXRWVXd3hfcHVIRHpGWXciIG5hbWU9InJlc3VsdFBhcmFtZXRlck5vZGUiIGluY29taW5nPSJfQ293c29NWFdFZVd3eF9wdUhEekZZdyIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciIHBhcmFtZXRlcj0iX0NsTzNnTVhXRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQ2xQZWtNWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpDcmVhdGVPYmplY3RBY3Rpb24iIHhtaTppZD0iX0NvdVFZTVhXRWVXd3hfcHVIRHpGWXciIG5hbWU9ImNyZWF0ZU9iamVjdCIgY2xhc3NpZmllcj0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6aWQ9Il9Db3UzY01YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfQ293RmtzWFdFZVd3eF9wdUhEekZZdyIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Db3UzY2NYV0VlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6Q2FsbE9wZXJhdGlvbkFjdGlvbiIgeG1pOmlkPSJfQ291M2NzWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0iY2FsbENvbnN0cnVjdG9yIiBvcGVyYXRpb249Il9Db2x0Z01YV0VlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfQ293RmtNWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0NveFRzOFhXRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQ293RmtjWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvcmVzdWx0PgotICAgICAgICAgICAgPHRhcmdldCB4bWk6aWQ9Il9Db3ZlZ01YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJ0YXJnZXQiIGluY29taW5nPSJfQ293RmtzWFdFZVd3eF9wdUhEekZZdyIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Db3ZlZ2NYV0VlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC90YXJnZXQ+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6U3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbiIgeG1pOmlkPSJfQ293c29jWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0ic3RhcnQgY2xhc3NpZmllciBiZWhhdmlvciI+Ci0gICAgICAgICAgICA8b2JqZWN0IHhtaTppZD0iX0Nvd3Nvc1hXRWVXd3hfcHVIRHpGWXciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9Db3hUc3NYV0VlV3d4X3B1SER6Rll3IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NveFRzTVhXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L29iamVjdD4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpGb3JrTm9kZSIgeG1pOmlkPSJfQ294VHNjWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0iZm9ya0luc3RhbmNpYXRlZE9iamVjdCIgaW5jb21pbmc9Il9Db3hUczhYV0VlV3d4X3B1SER6Rll3IiBvdXRnb2luZz0iX0Nvd3NvTVhXRWVXd3hfcHVIRHpGWXcgX0NveFRzc1hXRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPC9vd25lZEJlaGF2aW9yPgotICAgICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJfQ29sdGdNWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0iQzEiPgotICAgICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Il9Db3FtQU1YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXR1cm4iIHR5cGU9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3IiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfQnNEbUVNWFJFZVd3eF9wdUhEekZZdyIgbmFtZT0iRXZlbnRzIEMxIj4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlRpbWVFdmVudCIgeG1pOmlkPSJfRk9GaVlNWFJFZVd3eF9wdUhEekZZdyIgbmFtZT0iYXQgMC41Ij4KLSAgICAgICAgICA8d2hlbiB4bWk6aWQ9Il9KT1NvY01YUkVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgIDxleHByIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFJlYWwiIHhtaTppZD0iX0pPU29jY1hSRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIwLjUiLz4KLSAgICAgICAgICA8L3doZW4+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6VGltZUV2ZW50IiB4bWk6aWQ9Il9MRzdsRU1YUkVlV3d4X3B1SER6Rll3IiBuYW1lPSJhdCAzLjIiPgotICAgICAgICAgIDx3aGVuIHhtaTppZD0iX0xHN2xFY1hSRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPGV4cHIgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfTEc3bEVzWFJFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjMuMiIvPgotICAgICAgICAgIDwvd2hlbj4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpUaW1lRXZlbnQiIHhtaTppZD0iX0xXbVl3TVhSRWVXd3hfcHVIRHpGWXciIG5hbWU9ImF0IDUuMiI+Ci0gICAgICAgICAgPHdoZW4geG1pOmlkPSJfTFdtWXdjWFJFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICA8ZXhwciB4bWk6dHlwZT0idW1sOkxpdGVyYWxSZWFsIiB4bWk6aWQ9Il9MV21Zd3NYUkVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iNS4yIi8+Ci0gICAgICAgICAgPC93aGVuPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9WOU1DRU1hREVlV2ZGZG52MjZFZnVnIiBuYW1lPSJDMiIgY2xhc3NpZmllckJlaGF2aW9yPSJfQnhVSk1NYUVFZVdmRmRudjI2RWZ1ZyIgaXNBY3RpdmU9InRydWUiPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfYXVBRnNNYURFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iYWJvcnQiIHZpc2liaWxpdHk9InB1YmxpYyI+Ci0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9sVHlfc01hREVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il93UTJqSU1hREVlV2ZGZG52MjZFZnVnIiBuYW1lPSJTaXplIiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfalJwQ0FKYkpFZWFGZnM4V3FITGRmdyIgdmFsdWU9IjEwMCIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRCZWhhdmlvciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiB4bWk6aWQ9Il9CeFVKTU1hRUVlV2ZGZG52MjZFZnVnIiBuYW1lPSJDMiBDbGFzc2lmaWVyIEJlaGF2aW9yIiBub2RlPSJfdE5JZUFNYUVFZVdmRmRudjI2RWZ1ZyBfOW5tc1lNYUVFZVdmRmRudjI2RWZ1ZyBfSVRDN1lNYUZFZVdmRmRudjI2RWZ1ZyBfS2lZZ3dNYUZFZVdmRmRudjI2RWZ1ZyBfTGFUblFNYUZFZVdmRmRudjI2RWZ1ZyBfS3JLejRNYUdFZVdmRmRudjI2RWZ1ZyIgZ3JvdXA9Il9LaVlnd01hRkVlV2ZGZG52MjZFZnVnIF9MYVRuUU1hRkVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX05tS1FRTWFFRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgPGJvZHk+bW9kZWwgQzImI3hEOwotICBkaXNjcmV0ZSBvdXRwdXQgQm9vbGVhbiBhYm9ydChzdGFydCA9IGZhbHNlLCBmaXhlZCA9IGZhbHNlKTsmI3hEOwotICBkaXNjcmV0ZSBvdXRwdXQgUmVhbCBzaXplKHN0YXJ0ID0gMS4wLCBmaXhlZCA9IGZhbHNlKTsmI3hEOwotZXF1YXRpb24mI3hEOwotICB3aGVuIHRpbWUgPj0gMS45IHRoZW4mI3hEOwotICAgIGFib3J0ID0gdHJ1ZTsmI3hEOwotICBlbmQgd2hlbjsmI3hEOwotICB3aGVuIHRpbWUgPj0gNi41IHRoZW4mI3hEOwotICAgIHNpemUgPSAwLjU7JiN4RDsKLSAgZW5kIHdoZW47JiN4RDsKLWVuZCBDMjs8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfTXR1aGdNYUdFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfdE5JZUFNYUVFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfSVRDN1lNYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX05MTDVrTWFHRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX0tpWWd3TWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX3ROSWVBTWFFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9OeGJhTU1hR0VlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il85bm1zWU1hRUVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il9LaVlnd01hRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfT0tXUWdNYUdFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfTGFUblFNYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfOW5tc1lNYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX09uaDd3TWFHRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX0tyS3o0TWFHRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX0xhVG5RTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8c3RydWN0dXJlZE5vZGUgeG1pOmlkPSJfS2lZZ3dNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTEiIGluY29taW5nPSJfTkxMNWtNYUdFZVdmRmRudjI2RWZ1ZyIgb3V0Z29pbmc9Il9OeGJhTU1hR0VlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfMFA0NW9NYUZFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfWkV5YVFNYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfUTR5Q0lNYUZFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8wUUwwa01hRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzBRTDBrY2FGRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iXzBvQ1Q0TWFGRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX1pFM1N3TWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX1N0dUtnTWFGRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfMG9WTzBNYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8wb1ZPMGNhRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9lZGdlPgotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpSZWFkU2VsZkFjdGlvbiIgeG1pOmlkPSJfUTRtYjhNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0ic2VsZiI+Ci0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfUTR5Q0lNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iXzBQNDVvTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9Il9CeFVKTU1hRUVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiIgeG1pOmlkPSJfU3RydVFNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfU3R1S2dNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iXzBvQ1Q0TWFGRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1RmZ013TWFGRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfVGZmbHNNYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9UZmF0TU1hRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIHhtaTppZD0iX1pFcDNZTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InNldCBBYm9ydCIgc3RydWN0dXJhbEZlYXR1cmU9Il9hdUFGc01hREVlV2ZGZG52MjZFZnVnIiBpc1JlcGxhY2VBbGw9InRydWUiPgotICAgICAgICAgICAgICA8b2JqZWN0IHhtaTppZD0iX1pFeWFRTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il8wUDQ1b01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTppZD0iX1pFMDJnTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTppZD0iX1pFM1N3TWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iXzBvQ1Q0TWFGRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgICA8L3ZhbHVlPgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDwvc3RydWN0dXJlZE5vZGU+Ci0gICAgICAgICAgPHN0cnVjdHVyZWROb2RlIHhtaTppZD0iX0xhVG5RTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyIiBpbmNvbWluZz0iX09LV1FnTWFHRWVXZkZkbnYyNkVmdWciIG91dGdvaW5nPSJfT25oN3dNYUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iXzAtSzc4TWFGRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX3A0WTZVTWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX2ZVVDNrTWFGRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfMC1kUDBNYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8wLWQyNE1hRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9lZGdlPgotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il8xYkxCQU1hRkVlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il9wNGdQRU1hRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il9oQ1FuSU1hRkVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXzFiZktFTWFGRWVXZkZkbnYyNkVmdWciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMWJmS0VjYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIHhtaTppZD0iX2ZVU3BjTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InNlbGYiPgotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTppZD0iX2ZVVDNrTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il8wLUs3OE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJfQnhVSk1NYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIHhtaTppZD0iX2hDUFpBTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9IjUwIj4KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6aWQ9Il9oQ1FuSU1hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfMWJMQkFNYUZFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQlpzSVlNNVFFZVdhUnBvZFIxUzZXQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oMEZGb01hRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8L3Jlc3VsdD4KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3FOTzdJSmJKRWVhRmZzOFdxSExkZnciIHZhbHVlPSI1MCIvPgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiB4bWk6aWQ9Il9wNFZQOE1hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJzZXQgU2l6ZSIgc3RydWN0dXJhbEZlYXR1cmU9Il93UTJqSU1hREVlV2ZGZG52MjZFZnVnIiBpc1JlcGxhY2VBbGw9InRydWUiPgotICAgICAgICAgICAgICA8b2JqZWN0IHhtaTppZD0iX3A0WTZVTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il8wLUs3OE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTppZD0iX3A0YXZnTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTppZD0iX3A0Z1BFTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iXzFiTEJBTWFGRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICAgICAgICA8L3ZhbHVlPgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDwvc3RydWN0dXJlZE5vZGU+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgeG1pOmlkPSJfdE5JZUFNYUVFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iYXQgMS45IiBpbmNvbWluZz0iX010dWhnTWFHRWVXZkZkbnYyNkVmdWciIG91dGdvaW5nPSJfTkxMNWtNYUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICA8dHJpZ2dlciB4bWk6aWQ9Il95RzdlZ01hRUVlV2ZGZG52MjZFZnVnIiBldmVudD0iX1hocHBBTWFFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgeG1pOmlkPSJfOW5tc1lNYUVFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iYXQgNi41IiBpbmNvbWluZz0iX054YmFNTWFHRWVXZkZkbnYyNkVmdWciIG91dGdvaW5nPSJfT0tXUWdNYUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICA8dHJpZ2dlciB4bWk6aWQ9Il85bm1zWWNhRUVlV2ZGZG52MjZFZnVnIiBldmVudD0iX2lZNDRVTWFFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpJbml0aWFsTm9kZSIgeG1pOmlkPSJfSVRDN1lNYUZFZVdmRmRudjI2RWZ1ZyIgb3V0Z29pbmc9Il9NdHVoZ01hR0VlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY3Rpdml0eUZpbmFsTm9kZSIgeG1pOmlkPSJfS3JLejRNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iQWN0aXZpdHlGaW5hbE5vZGUxIiBpbmNvbWluZz0iX09uaDd3TWFHRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgPC9vd25lZEJlaGF2aW9yPgotICAgICAgICA8b3duZWRCZWhhdmlvciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiB4bWk6aWQ9Il9XLWFISU1hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJDMl9GYWN0b3J5IiBub2RlPSJfZlllSllNYUdFZVdmRmRudjI2RWZ1ZyBfZlloTXNNYUdFZVdmRmRudjI2RWZ1ZyBfZlloendNYUdFZVdmRmRudjI2RWZ1ZyBfZllpYTBjYUdFZVdmRmRudjI2RWZ1ZyBfZllqQjRzYUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iX1ctYXVNTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9mWWh6eGNhR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJjcmVhdGVPYmplY3RBY3Rpb24gdG8gY2FsbENvbnN0cnVjdG9yIiB0YXJnZXQ9Il9mWWh6d2NhR0VlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il9mWWhNc2NhR0VlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9mWWtRQU1hR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mWWszRU1hR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX2ZZaWEwTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9ImNhbGxDb25zdHJ1Y3RvciB0byByZXR1cm5QYXJhbU5vZGUiIHRhcmdldD0iX2ZZZUpZTWFHRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX2ZZakI0c2FHRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX2ZZazNFY2FHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2ZZazNFc2FHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9lZGdlPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfZllqbzhNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iZm9yayB0byBzdGFydGJlaGF2aW9yIGlucHV0IHBpbiIgdGFyZ2V0PSJfZllqQjRNYUdFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfZllqQjRzYUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfZllrM0U4YUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZllrM0ZNYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9mWWpvOGNhR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJjYWxsQ29uc3RydWN0b3IgdG8gc3RhcnRCZWhhdmlvciIgdGFyZ2V0PSJfZllqQjRzYUdFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfZlloenc4YUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfZllrM0ZjYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZllrM0ZzYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY3Rpdml0eVBhcmFtZXRlck5vZGUiIHhtaTppZD0iX2ZZZUpZTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdFBhcmFtZXRlck5vZGUiIGluY29taW5nPSJfZllpYTBNYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciIHBhcmFtZXRlcj0iX1ctYXVNTWFHRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZllnbG9NYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpDcmVhdGVPYmplY3RBY3Rpb24iIHhtaTppZD0iX2ZZaE1zTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9ImNyZWF0ZU9iamVjdCIgY2xhc3NpZmllcj0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6aWQ9Il9mWWhNc2NhR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfZlloenhjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mWWhNc3NhR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6Q2FsbE9wZXJhdGlvbkFjdGlvbiIgeG1pOmlkPSJfZlloendNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iY2FsbENvbnN0cnVjdG9yIiBvcGVyYXRpb249Il9YQldHWU1hR0VlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfZlloenc4YUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX2ZZam84Y2FHRWVXZkZkbnYyNkVmdWciIHR5cGU9Il9WOU1DRU1hREVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZlloenhNYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvcmVzdWx0PgotICAgICAgICAgICAgPHRhcmdldCB4bWk6aWQ9Il9mWWh6d2NhR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJ0YXJnZXQiIGluY29taW5nPSJfZlloenhjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mWWh6d3NhR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC90YXJnZXQ+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6U3RhcnRPYmplY3RCZWhhdmlvckFjdGlvbiIgeG1pOmlkPSJfZllpYTBjYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0ic3RhcnQgY2xhc3NpZmllciBiZWhhdmlvciI+Ci0gICAgICAgICAgICA8b2JqZWN0IHhtaTppZD0iX2ZZakI0TWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9mWWpvOE1hR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2ZZakI0Y2FHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L29iamVjdD4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpGb3JrTm9kZSIgeG1pOmlkPSJfZllqQjRzYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iZm9ya0luc3RhbmNpYXRlZE9iamVjdCIgaW5jb21pbmc9Il9mWWpvOGNhR0VlV2ZGZG52MjZFZnVnIiBvdXRnb2luZz0iX2ZZaWEwTWFHRWVXZkZkbnYyNkVmdWcgX2ZZam84TWFHRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgPC9vd25lZEJlaGF2aW9yPgotICAgICAgICA8b3duZWRPcGVyYXRpb24geG1pOmlkPSJfWEJXR1lNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iQzIiPgotICAgICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Il9YQmJsOE1hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJyZXR1cm4iIHR5cGU9Il9WOU1DRU1hREVlV2ZGZG52MjZFZnVnIiBkaXJlY3Rpb249InJldHVybiIvPgotICAgICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfVEk5eGdNYUVFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iRXZlbnRzIEMyIj4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlRpbWVFdmVudCIgeG1pOmlkPSJfWGhwcEFNYUVFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iYXQgMS45Ij4KLSAgICAgICAgICA8d2hlbiB4bWk6aWQ9Il9YaHBwQWNhRUVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgIDxleHByIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFJlYWwiIHhtaTppZD0iX1hocHBBc2FFRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxLjkiLz4KLSAgICAgICAgICA8L3doZW4+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6VGltZUV2ZW50IiB4bWk6aWQ9Il9pWTQ0VU1hRUVlV2ZGZG52MjZFZnVnIiBuYW1lPSJhdCA2LjUiPgotICAgICAgICAgIDx3aGVuIHhtaTppZD0iX2lZNDRVY2FFRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgPGV4cHIgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfaVk0NFVzYUVFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjYuNSIvPgotICAgICAgICAgIDwvd2hlbj4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfLUpHeEVPeE9FZVdQNmVOXzZaY2dtdyIgbmFtZT0iQmFzaWMiPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9hS3k2TU94UEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJBIiBjbGFzc2lmaWVyQmVoYXZpb3I9Il9NY3pmTU94YUVlV1A2ZU5fNlpjZ213IiBpc0FjdGl2ZT0idHJ1ZSI+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9lRzNISU94UEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ4Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2hmMV9zT3hRRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il9mUHpGSU94UEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ5Ij4KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX1BCUHlVQ1FIRWVhQ3RacEQwQVRmQ3ciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQmVoYXZpb3IgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgeG1pOmlkPSJfMVRtek1PeFNFZVdQNmVOXzZaY2dtdyIgbmFtZT0iY29tcGFyZV9pbXBsIiBzcGVjaWZpY2F0aW9uPSJfUVF2MmNPeFFFZVdQNmVOXzZaY2dtdyIgbm9kZT0iX1R1cUFZT3hURWVXUDZlTl82WmNnbXcgX2I3TkxFT3hURWVXUDZlTl82WmNnbXcgX3NvaUVBT3hURWVXUDZlTl82WmNnbXcgX0JGbWxJT3hVRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Il9MTmhzME94VEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ2Ij4KLSAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTppZD0iX0x4UUU4T3hURWVXUDZlTl82WmNnbXciIG5hbWU9InJlc3VsdCIgZGlyZWN0aW9uPSJyZXR1cm4iPgotICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX0tyekRVT3hVRWVXUDZlTl82WmNnbXciIHRhcmdldD0iX2I3djlvT3hURWVXUDZlTl82WmNnbXciIHNvdXJjZT0iX1R1cUFZT3hURWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0tyLXBnT3hVRWVXUDZlTl82WmNnbXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0tyLXBnZXhVRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9lZGdlPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfTE9XV3dPeFVFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfYjc3ajBPeFRFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJfc29qU0lPeFRFZVdQNmVOXzZaY2dtdyI+Ci0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfTE9ndTBPeFVFZVdQNmVOXzZaY2dtdyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfTE9oVjRPeFVFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9MbGhnb094VUVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il9CRm1sSU94VUVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il9iNy1uSU94VEVlV1A2ZU5fNlpjZ213Ij4KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9MbHVVOE94VUVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9MbHVVOGV4VUVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfVHVxQVlPeFRFZVdQNmVOXzZaY2dtdyIgbmFtZT0idiIgb3V0Z29pbmc9Il9LcnpEVU94VUVlV1A2ZU5fNlpjZ213IiBwYXJhbWV0ZXI9Il9MTmhzME94VEVlV1A2ZU5fNlpjZ213Ij4KLSAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1R1dVIwT3hURWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6Q2FsbEJlaGF2aW9yQWN0aW9uIiB4bWk6aWQ9Il9iN05MRU94VEVlV1A2ZU5fNlpjZ213IiBuYW1lPSI+Ij4KLSAgICAgICAgICAgIDxhcmd1bWVudCB4bWk6aWQ9Il9iN3Y5b094VEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ4IiBpbmNvbWluZz0iX0tyekRVT3hVRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfYjcyclVPeFRFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfYjcxZE1PeFRFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvYXJndW1lbnQ+Ci0gICAgICAgICAgICA8YXJndW1lbnQgeG1pOmlkPSJfYjc3ajBPeFRFZVdQNmVOXzZaY2dtdyIgbmFtZT0ieSIgaW5jb21pbmc9Il9MT1dXd094VUVlV1A2ZU5fNlpjZ213Ij4KLSAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2I3LUFFZXhURWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2I3LUFFT3hURWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L2FyZ3VtZW50PgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6aWQ9Il9iNy1uSU94VEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfTGxoZ29PeFVFZVdQNmVOXzZaY2dtdyI+Ci0gICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9iOEFjVWV4VEVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9iOEFjVU94VEVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgICA8YmVoYXZpb3IgeG1pOnR5cGU9InVtbDpGdW5jdGlvbkJlaGF2aW9yIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZ1bWwuc3RhbmRhcmRsaWJyYXJ5L3Jlc291cmNlcy9mVU1MX0xpYnJhcnkudW1sI1ByaW1pdGl2ZUJlaGF2aW9ycy1JbnRlZ2VyRnVuY3Rpb25zLWd0Ii8+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiB4bWk6aWQ9Il9zb2lFQU94VEVlV1A2ZU5fNlpjZ213IiBuYW1lPSIyIj4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfc29qU0lPeFRFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0xPV1d3T3hVRWVXUDZlTl82WmNnbXciLz4KLSAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8yT3Bwc094VEVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDwvbm9kZT4KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfQkZtbElPeFVFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVzdWx0IiBpbmNvbWluZz0iX0xsaGdvT3hVRWVXUDZlTl82WmNnbXciIHBhcmFtZXRlcj0iX0x4UUU4T3hURWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQkZvYVVPeFVFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgIDwvb3duZWRCZWhhdmlvcj4KLSAgICAgICAgPG93bmVkQmVoYXZpb3IgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgeG1pOmlkPSJfTWN6Zk1PeGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0iQ2xhc3NpZmllciBCZWhhdmlvciIgbm9kZT0iXzE1YThZT3hhRWVXUDZlTl82WmNnbXcgXzV5ZHFnT3hhRWVXUDZlTl82WmNnbXcgXzltWW9FT3hhRWVXUDZlTl82WmNnbXcgX01yb3Y4T3hiRWVXUDZlTl82WmNnbXcgX3dCRU1jT3hiRWVXUDZlTl82WmNnbXcgX21hVFFFT3huRWVXUDZlTl82WmNnbXcgX3l5UjVZT3huRWVXUDZlTl82WmNnbXcgXzJmdkNrT3huRWVXUDZlTl82WmNnbXcgX0xHejBRT3hvRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfSFRwWGtPeGJFZVdQNmVOXzZaY2dtdyIgYW5ub3RhdGVkRWxlbWVudD0iXzltWW9FT3hhRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgPGJvZHk+UmVhZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24mI3hEOwotTGVjdHVyZSBkZSBsYSB2YWxldXIgZCdlbnRyw6llIHg8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9ac25TOE94YkVlV1A2ZU5fNlpjZ213IiBhbm5vdGF0ZWRFbGVtZW50PSJfTXJvdjhPeGJFZVdQNmVOXzZaY2dtdyI+Ci0gICAgICAgICAgICA8Ym9keT5DYWxsT3BlcmF0aW9uQWN0aW9uJiN4RDsKLUFwcGVsIMOgIGwnb3DDqXJhdGlvbiBjb21wYXJlPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfSVQxejBPeGNFZVdQNmVOXzZaY2dtdyIgYW5ub3RhdGVkRWxlbWVudD0iX3dCRU1jT3hiRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgPGJvZHk+QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiYjeEQ7Ci1FY3JpdHVyZSBkdSByw6lzdWx0YXQgc3VyIGxhIHNvcnRpZSB5PC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfZFRxU0lPeGJFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfOW1qbk1PeGFFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJfNXlkcWdPeGFFZVdQNmVOXzZaY2dtdyI+Ci0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfZFQyZllPeGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZFQyZllleGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9lem5wQU94YkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il9Ncl9WUU94YkVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il85bWsxVU94YUVlV1A2ZU5fNlpjZ213Ij4KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9lejNnb094YkVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9lejNnb2V4YkVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX2lubmZFT3hiRWVXUDZlTl82WmNnbXciIHRhcmdldD0iX01yOWdFT3hiRWVXUDZlTl82WmNnbXciIHNvdXJjZT0iXzV5ZHFnT3hhRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX2luMFRZT3hiRWVXUDZlTl82WmNnbXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2luMFRZZXhiRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9lZGdlPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfbHpRN3NPeGJFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfNXlkcWdPeGFFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJfMTVkX3NPeGFFZVdQNmVOXzZaY2dtdyI+Ci0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfbHpsRXdPeGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfbHpsRXdleGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il83TzRJc094YkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il93QkhQd094YkVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il81eWRxZ094YUVlV1A2ZU5fNlpjZ213Ij4KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il83UE1Sd094YkVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il83UE1Sd2V4YkVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iXzh2VFpvT3hiRWVXUDZlTl82WmNnbXciIHRhcmdldD0iX3dCSkU4T3hiRWVXUDZlTl82WmNnbXciIHNvdXJjZT0iX01zRG1zT3hiRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXzh2bHRnT3hiRWVXUDZlTl82WmNnbXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzh2bHRnZXhiRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9lZGdlPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX3BCcmlBT3huRWVXUDZlTl82WmNnbXciIHRhcmdldD0iXzE1YThZT3hhRWVXUDZlTl82WmNnbXciIHNvdXJjZT0iX21hVFFFT3huRWVXUDZlTl82WmNnbXciLz4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il8wNk1vSU94bkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il9tYVRRRU94bkVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il95eVI1WU94bkVlV1A2ZU5fNlpjZ213Ii8+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfX200TlFPeG5FZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfMmZ2Q2tPeG5FZVdQNmVOXzZaY2dtdyIgc291cmNlPSJfbWFUUUVPeG5FZVdQNmVOXzZaY2dtdyIvPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX0NfZWd3T3hvRWVXUDZlTl82WmNnbXciIHRhcmdldD0iX3dCRU1jT3hiRWVXUDZlTl82WmNnbXciIHNvdXJjZT0iXzJmdkNrT3huRWVXUDZlTl82WmNnbXciLz4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9PS0sza094b0VlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il9MR3owUU94b0VlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il93QkVNY094YkVlV1A2ZU5fNlpjZ213Ii8+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpSZWFkU2VsZkFjdGlvbiIgeG1pOmlkPSJfMTVhOFlPeGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0ic2VsZiIgaW5jb21pbmc9Il9wQnJpQU94bkVlV1A2ZU5fNlpjZ213Ij4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfMTVkX3NPeGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX2x6UTdzT3hiRWVXUDZlTl82WmNnbXciIHR5cGU9Il9NY3pmTU94YUVlV1A2ZU5fNlpjZ213Ii8+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6Rm9ya05vZGUiIHhtaTppZD0iXzV5ZHFnT3hhRWVXUDZlTl82WmNnbXciIG5hbWU9IkZvcmtOb2RlMSIgaW5jb21pbmc9Il9selE3c094YkVlV1A2ZU5fNlpjZ213IiBvdXRnb2luZz0iX2RUcVNJT3hiRWVXUDZlTl82WmNnbXcgX2lubmZFT3hiRWVXUDZlTl82WmNnbXcgXzdPNElzT3hiRWVXUDZlTl82WmNnbXciLz4KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgeG1pOmlkPSJfOW1Zb0VPeGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVhZCB4IiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX2VHM0hJT3hQRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgPG9iamVjdCB4bWk6aWQ9Il85bWpuTU94YUVlV1A2ZU5fNlpjZ213IiBuYW1lPSJvYmplY3QiIGluY29taW5nPSJfZFRxU0lPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iX2FLeTZNT3hQRWVXUDZlTl82WmNnbXciLz4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfOW1rMVVPeGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0ieCIgb3V0Z29pbmc9Il9lem5wQU94YkVlV1A2ZU5fNlpjZ213Ij4KLSAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzltblJrZXhhRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzltblJrT3hhRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L3Jlc3VsdD4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpDYWxsT3BlcmF0aW9uQWN0aW9uIiB4bWk6aWQ9Il9Ncm92OE94YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJjYWxsIGNvbXBhcmUiIG9wZXJhdGlvbj0iX1FRdjJjT3hRRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgPGFyZ3VtZW50IHhtaTppZD0iX01yX1ZRT3hiRWVXUDZlTl82WmNnbXciIG5hbWU9InYiIGluY29taW5nPSJfZXpucEFPeGJFZVdQNmVOXzZaY2dtdyI+Ci0gICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Nc0J4Z094YkVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Nc0JLY094YkVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9hcmd1bWVudD4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfTXNEbXNPeGJFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iXzh2VFpvT3hiRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfTXNHQzhleGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfTXNHQzhPeGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvcmVzdWx0PgotICAgICAgICAgICAgPHRhcmdldCB4bWk6aWQ9Il9NcjlnRU94YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ0YXJnZXQiIGluY29taW5nPSJfaW5uZkVPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iX2FLeTZNT3hQRWVXUDZlTl82WmNnbXciLz4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiB4bWk6aWQ9Il93QkVNY094YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJzZXRZIiBpbmNvbWluZz0iX0NfZWd3T3hvRWVXUDZlTl82WmNnbXciIG91dGdvaW5nPSJfT0tLM2tPeG9FZVdQNmVOXzZaY2dtdyIgc3RydWN0dXJhbEZlYXR1cmU9Il9mUHpGSU94UEVlV1A2ZU5fNlpjZ213IiBpc1JlcGxhY2VBbGw9InRydWUiPgotICAgICAgICAgICAgPG9iamVjdCB4bWk6aWQ9Il93QkhQd094YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJvYmplY3QiIGluY29taW5nPSJfN080SXNPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iX2FLeTZNT3hQRWVXUDZlTl82WmNnbXciLz4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfd0JIMjBPeGJFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfYUt5Nk1PeFBFZVdQNmVOXzZaY2dtdyIvPgotICAgICAgICAgICAgPHZhbHVlIHhtaTppZD0iX3dCSkU4T3hiRWVXUDZlTl82WmNnbXciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iXzh2VFpvT3hiRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIHhtaTppZD0iX21hVFFFT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IkNoYW5nZSBvbiB4IiBpbmNvbWluZz0iXzA2TW9JT3huRWVXUDZlTl82WmNnbXciIG91dGdvaW5nPSJfcEJyaUFPeG5FZVdQNmVOXzZaY2dtdyBfX200TlFPeG5FZVdQNmVOXzZaY2dtdyI+Ci0gICAgICAgICAgICA8dHJpZ2dlciB4bWk6aWQ9Il91TkN6b094bkVlV1A2ZU5fNlpjZ213IiBldmVudD0iX1pBZjlZT3huRWVXUDZlTl82WmNnbXciLz4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpJbml0aWFsTm9kZSIgeG1pOmlkPSJfeXlSNVlPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSW5pdGlhbE5vZGUxIiBvdXRnb2luZz0iXzA2TW9JT3huRWVXUDZlTl82WmNnbXciLz4KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiB4bWk6aWQ9Il8yZnZDa094bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJBZnRlciAwLjUiIGluY29taW5nPSJfX200TlFPeG5FZVdQNmVOXzZaY2dtdyIgb3V0Z29pbmc9Il9DX2Vnd094b0VlV1A2ZU5fNlpjZ213Ij4KLSAgICAgICAgICAgIDx0cmlnZ2VyIHhtaTppZD0iXzZ0MzI4T3huRWVXUDZlTl82WmNnbXciIGV2ZW50PSJfZTA3YUlPeG5FZVdQNmVOXzZaY2dtdyIvPgotICAgICAgICAgIDwvbm9kZT4KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5RmluYWxOb2RlIiB4bWk6aWQ9Il9MR3owUU94b0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJBY3Rpdml0eUZpbmFsTm9kZTEiIGluY29taW5nPSJfT0tLM2tPeG9FZVdQNmVOXzZaY2dtdyIvPgotICAgICAgICA8L293bmVkQmVoYXZpb3I+Ci0gICAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6aWQ9Il9RUXYyY094UUVlV1A2ZU5fNlpjZ213IiBuYW1lPSJjb21wYXJlIiBtZXRob2Q9Il8xVG16TU94U0VlV1A2ZU5fNlpjZ213Ij4KLSAgICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOmlkPSJfVFNfZmNPeFFFZVdQNmVOXzZaY2dtdyIgbmFtZT0idiI+Ci0gICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgICA8L293bmVkUGFyYW1ldGVyPgotICAgICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6aWQ9Il9jblJ1UU94UUVlV1A2ZU5fNlpjZ213IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4KLSAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+Ci0gICAgICAgIDwvb3duZWRPcGVyYXRpb24+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il9YRjdIRU94bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJFdmVudHMiPgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2hhbmdlRXZlbnQiIHhtaTppZD0iX1pBZjlZT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IkNoYW5nZSBvbiB4Ij4KLSAgICAgICAgICA8Y2hhbmdlRXhwcmVzc2lvbiB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2J2X3BnT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IngiIHZhbHVlPSJ4Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6VGltZUV2ZW50IiB4bWk6aWQ9Il9lMDdhSU94bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJBZnRlciAwLjUiIGlzUmVsYXRpdmU9InRydWUiPgotICAgICAgICAgIDx3aGVuIHhtaTppZD0iX2lab1A4T3huRWVXUDZlTl82WmNnbXciPgotICAgICAgICAgICAgPGV4cHIgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfaVpvUDhleG5FZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjAuNSIvPgotICAgICAgICAgIDwvd2hlbj4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfWm9XbTBDWnJFZWFORHRVYTN3QUdNdyIgbmFtZT0iQ2hhbmdlIGV2ZW50cyI+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfRlNkeUlDWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0iRXhhbXBsZSAxIj4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9KbEJ6Z0NaekVlYU5EdFVhM3dBR013IiBuYW1lPSJBIiBjbGFzc2lmaWVyQmVoYXZpb3I9Il9KbEJ6b2laekVlYU5EdFVhM3dBR013IiBpc0FjdGl2ZT0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX0psQnpnU1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9ImluQm9vbGVhbiI+Ci0gICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfUE92WWtDWjBFZWFfMmNQQ3B4a3hadyIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3Uxa1IwQ1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9ImluSW50ZWdlciI+Ci0gICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMlNIaThDWnpFZWFORHRVYTN3QUdNdyIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ZLWUVNQ1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9ImluUmVhbCI+Ci0gICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfLVlsVHdDWnpFZWFORHRVYTN3QUdNdyIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ZkbkpRQ1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9ImluU3RyaW5nIj4KLSAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjU3RyaW5nIi8+Ci0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfTWExR2dDWjBFZWFfMmNQQ3B4a3hadyIgdmFsdWU9IiIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX0psQnpneVp6RWVhTkR0VWEzd0FHTXciIG5hbWU9Im91dEJvb2xlYW4iPgotICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0psQnpoQ1p6RWVhTkR0VWEzd0FHTXciLz4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDxvd25lZEJlaGF2aW9yIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIHhtaTppZD0iX0psQnpvaVp6RWVhTkR0VWEzd0FHTXciIG5hbWU9IkNsYXNzaWZpZXIgQmVoYXZpb3IiIG5vZGU9Il9KbEJ6dlNaekVlYU5EdFVhM3dBR013IF9KbEJ6dnlaekVlYU5EdFVhM3dBR013IF9KbEJ6d0NaekVlYU5EdFVhM3dBR013IF9KbEJ6elNaekVlYU5EdFVhM3dBR013IF9KbEJ6MFNaekVlYU5EdFVhM3dBR013IF9VYWJaVUNaX0VlYTdFWXhyem5fN2xBIF8yMmFVMENjTkVlYW9NdFFpZmktUHBBIF85UnljMENjTkVlYW9NdFFpZmktUHBBIF9mYkp1MENjT0VlYW9NdFFpZmktUHBBIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfSmxCem95WnpFZWFORHRVYTN3QUdNdyIgYW5ub3RhdGVkRWxlbWVudD0iX0psQnp3Q1p6RWVhTkR0VWEzd0FHTXciPgotICAgICAgICAgICAgICA8Ym9keT5SZWFkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiYjeEQ7Ci1SZWFkaW5nIGlucHV0IHZhbHVlIG9uIGluQm9vbGVhbjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9KbEJ6cFNaekVlYU5EdFVhM3dBR013IiBhbm5vdGF0ZWRFbGVtZW50PSJfSmxCenpTWnpFZWFORHRVYTN3QUdNdyI+Ci0gICAgICAgICAgICAgIDxib2R5PkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24mI3hEOwotV3JpdGluZyBvdXRwdXQgdmFsdWUgb24gb3V0Qm9vbGVhbjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9KbEJ6cGlaekVlYU5EdFVhM3dBR013IiB0YXJnZXQ9Il9KbEJ6d1NaekVlYU5EdFVhM3dBR013IiBzb3VyY2U9Il9KbEJ6dnlaekVlYU5EdFVhM3dBR013Ij4KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0psQnpweVp6RWVhTkR0VWEzd0FHTXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfSmxCenFDWnpFZWFORHRVYTN3QUdNdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfSmxCenJ5WnpFZWFORHRVYTN3QUdNdyIgdGFyZ2V0PSJfSmxCenZ5WnpFZWFORHRVYTN3QUdNdyIgc291cmNlPSJfSmxCenZpWnpFZWFORHRVYTN3QUdNdyI+Ci0gICAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9KbEJ6c0NaekVlYU5EdFVhM3dBR013IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0psQnpzU1p6RWVhTkR0VWEzd0FHTXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iXzREM19BQ1owRWVhXzJjUENweGt4WnciIHRhcmdldD0iX0psQnp6aVp6RWVhTkR0VWEzd0FHTXciIHNvdXJjZT0iX0psQnp2eVp6RWVhTkR0VWEzd0FHTXciPgotICAgICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfNEVqN2dDWjBFZWFfMmNQQ3B4a3hadyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il80RWtpa0NaMEVlYV8yY1BDcHhreFp3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9lZGdlPgotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il81X0JkRUNaMEVlYV8yY1BDcHhreFp3IiB0YXJnZXQ9Il9KbEJ6MENaekVlYU5EdFVhM3dBR013IiBzb3VyY2U9Il9KbEJ6d2laekVlYU5EdFVhM3dBR013Ij4KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXzVfakJnQ1owRWVhXzJjUENweGt4WnciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNV9qb2tDWjBFZWFfMmNQQ3B4a3hadyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX0tHcldnQ2NNRWVhb010UWlmaS1QcEEiIHRhcmdldD0iXzlSeWMwQ2NORWVhb010UWlmaS1QcEEiIHNvdXJjZT0iX1VhYlpVQ1pfRWVhN0VZeHJ6bl83bEEiLz4KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX0s4VnpNQ2NNRWVhb010UWlmaS1QcEEiIHRhcmdldD0iXzlSeWMwQ2NORWVhb010UWlmaS1QcEEiIHNvdXJjZT0iX0psQnowU1p6RWVhTkR0VWEzd0FHTXciLz4KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX0wtMXlBQ2NNRWVhb010UWlmaS1QcEEiIHRhcmdldD0iX0psQnp2U1p6RWVhTkR0VWEzd0FHTXciIHNvdXJjZT0iXzlSeWMwQ2NORWVhb010UWlmaS1QcEEiLz4KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX0M5TzhzQ2NPRWVhb010UWlmaS1QcEEiIHRhcmdldD0iXzlSeWMwQ2NORWVhb010UWlmaS1QcEEiIHNvdXJjZT0iXzIyYVUwQ2NORWVhb010UWlmaS1QcEEiLz4KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX2xqaXBZQ2NPRWVhb010UWlmaS1QcEEiIHRhcmdldD0iXzlSeWMwQ2NORWVhb010UWlmaS1QcEEiIHNvdXJjZT0iX2ZiSnUwQ2NPRWVhb010UWlmaS1QcEEiLz4KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIHhtaTppZD0iX0psQnp2U1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9InNlbGYiIGluY29taW5nPSJfTC0xeUFDY01FZWFvTXRRaWZpLVBwQSI+Ci0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfSmxCenZpWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0psQnpyeVp6RWVhTkR0VWEzd0FHTXciIHR5cGU9Il9KbEJ6b2laekVlYU5EdFVhM3dBR013Ii8+Ci0gICAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkZvcmtOb2RlIiB4bWk6aWQ9Il9KbEJ6dnlaekVlYU5EdFVhM3dBR013IiBuYW1lPSJGb3JrTm9kZTEiIGluY29taW5nPSJfSmxCenJ5WnpFZWFORHRVYTN3QUdNdyIgb3V0Z29pbmc9Il9KbEJ6cGlaekVlYU5EdFVhM3dBR013IF80RDNfQUNaMEVlYV8yY1BDcHhreFp3Ii8+Ci0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgeG1pOmlkPSJfSmxCendDWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0icmVhZCBpbkJvb2xlYW4iIHN0cnVjdHVyYWxGZWF0dXJlPSJfSmxCemdTWnpFZWFORHRVYTN3QUdNdyI+Ci0gICAgICAgICAgICAgIDxvYmplY3QgeG1pOmlkPSJfSmxCendTWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0ib2JqZWN0IiBpbmNvbWluZz0iX0psQnpwaVp6RWVhTkR0VWEzd0FHTXciIHR5cGU9Il9KbEJ6Z0NaekVlYU5EdFVhM3dBR013Ii8+Ci0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOmlkPSJfSmxCendpWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0ieCIgb3V0Z29pbmc9Il81X0JkRUNaMEVlYV8yY1BDcHhreFp3Ij4KLSAgICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS51bWwyLnVtbC5yZXNvdXJjZXMvbGlicmFyaWVzL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4KLSAgICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9KbEJ6d3laekVlYU5EdFVhM3dBR013IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0psQnp4Q1p6RWVhTkR0VWEzd0FHTXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDwvcmVzdWx0PgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiB4bWk6aWQ9Il9KbEJ6elNaekVlYU5EdFVhM3dBR013IiBuYW1lPSJzZXQgb3V0Qm9vbGVhbiIgc3RydWN0dXJhbEZlYXR1cmU9Il9KbEJ6Z3laekVlYU5EdFVhM3dBR013IiBpc1JlcGxhY2VBbGw9InRydWUiPgotICAgICAgICAgICAgICA8b2JqZWN0IHhtaTppZD0iX0psQnp6aVp6RWVhTkR0VWEzd0FHTXciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il80RDNfQUNaMEVlYV8yY1BDcHhreFp3IiB0eXBlPSJfSmxCemdDWnpFZWFORHRVYTN3QUdNdyIvPgotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTppZD0iX0psQnp6eVp6RWVhTkR0VWEzd0FHTXciIG5hbWU9InJlc3VsdCIgdHlwZT0iX0psQnpnQ1p6RWVhTkR0VWEzd0FHTXciLz4KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTppZD0iX0psQnowQ1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iXzVfQmRFQ1owRWVhXzJjUENweGt4WnciPgotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9saWJyYXJpZXMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgICA8L3ZhbHVlPgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgeG1pOmlkPSJfSmxCejBTWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0iQ2hhbmdlIG9uIGluQm9vbGVhbiIgb3V0Z29pbmc9Il9LOFZ6TUNjTUVlYW9NdFFpZmktUHBBIj4KLSAgICAgICAgICAgICAgPHRyaWdnZXIgeG1pOmlkPSJfSmxCejBpWnpFZWFORHRVYTN3QUdNdyIgZXZlbnQ9Il9qdE9FWUNaekVlYU5EdFVhM3dBR013Ii8+Ci0gICAgICAgICAgICA8L25vZGU+Ci0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiB4bWk6aWQ9Il9VYWJaVUNaX0VlYTdFWXhyem5fN2xBIiBuYW1lPSJDaGFuZ2Ugb24gaW5SZWFsIiBvdXRnb2luZz0iX0tHcldnQ2NNRWVhb010UWlmaS1QcEEiPgotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTppZD0iX0lXYjlZQ2NMRWVhb010UWlmaS1QcEEiIG5hbWU9InJlc3VsdCI+Ci0gICAgICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfSVdwXzBDY0xFZWFvTXRRaWZpLVBwQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgICAgIDx0cmlnZ2VyIHhtaTppZD0iX1VhYlpVU1pfRWVhN0VZeHJ6bl83bEEiIGV2ZW50PSJfRHQtcUlDWl9FZWE3RVl4cnpuXzdsQSIvPgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgeG1pOmlkPSJfMjJhVTBDY05FZWFvTXRRaWZpLVBwQSIgbmFtZT0iQ2hhbmdlIG9uIGluSW50ZWdlciIgb3V0Z29pbmc9Il9DOU84c0NjT0VlYW9NdFFpZmktUHBBIj4KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6aWQ9Il8yMmFVMFNjTkVlYW9NdFFpZmktUHBBIiBuYW1lPSJyZXN1bHQiPgotICAgICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzIyYVUwaWNORWVhb010UWlmaS1QcEEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDwvcmVzdWx0PgotICAgICAgICAgICAgICA8dHJpZ2dlciB4bWk6aWQ9Il8yMmFVMHljTkVlYW9NdFFpZmktUHBBIiBldmVudD0iX2lIMU04Q2NORWVhb010UWlmaS1QcEEiLz4KLSAgICAgICAgICAgIDwvbm9kZT4KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6TWVyZ2VOb2RlIiB4bWk6aWQ9Il85UnljMENjTkVlYW9NdFFpZmktUHBBIiBuYW1lPSJNZXJnZU5vZGUxIiBpbmNvbWluZz0iX0tHcldnQ2NNRWVhb010UWlmaS1QcEEgX0s4VnpNQ2NNRWVhb010UWlmaS1QcEEgX0M5TzhzQ2NPRWVhb010UWlmaS1QcEEgX2xqaXBZQ2NPRWVhb010UWlmaS1QcEEiIG91dGdvaW5nPSJfTC0xeUFDY01FZWFvTXRRaWZpLVBwQSIvPgotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgeG1pOmlkPSJfZmJKdTBDY09FZWFvTXRRaWZpLVBwQSIgbmFtZT0iQ2hhbmdlIG9uIGluU3RyaW5nIiBvdXRnb2luZz0iX2xqaXBZQ2NPRWVhb010UWlmaS1QcEEiPgotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTppZD0iX2ZiSnUwU2NPRWVhb010UWlmaS1QcEEiIG5hbWU9InJlc3VsdCI+Ci0gICAgICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZmJKdTBpY09FZWFvTXRRaWZpLVBwQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgICAgIDx0cmlnZ2VyIHhtaTppZD0iX2ZiSnUweWNPRWVhb010UWlmaS1QcEEiIGV2ZW50PSJfWTB2YmdDY09FZWFvTXRRaWZpLVBwQSIvPgotICAgICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDwvb3duZWRCZWhhdmlvcj4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il9MNTFIc0NaekVlYU5EdFVhM3dBR013IiBuYW1lPSJFdmVudHMiPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDaGFuZ2VFdmVudCIgeG1pOmlkPSJfanRPRVlDWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0iQ2hhbmdlIG9uIGluQm9vbGVhbiI+Ci0gICAgICAgICAgICA8Y2hhbmdlRXhwcmVzc2lvbiB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2p0T0VZU1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9ImluQm9vbGVhbiIgdmFsdWU9ImluQm9vbGVhbiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDaGFuZ2VFdmVudCIgeG1pOmlkPSJfRHQtcUlDWl9FZWE3RVl4cnpuXzdsQSIgbmFtZT0iQ2hhbmdlIG9uIGluUmVhbCI+Ci0gICAgICAgICAgICA8Y2hhbmdlRXhwcmVzc2lvbiB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0R0X1JNQ1pfRWVhN0VZeHJ6bl83bEEiIG5hbWU9ImluUmVhbCIgdmFsdWU9ImluUmVhbCIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDaGFuZ2VFdmVudCIgeG1pOmlkPSJfaUgxTThDY05FZWFvTXRRaWZpLVBwQSIgbmFtZT0iQ2hhbmdlIG9uIGluSW50ZWdlciI+Ci0gICAgICAgICAgICA8Y2hhbmdlRXhwcmVzc2lvbiB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2lIMU04U2NORWVhb010UWlmaS1QcEEiIG5hbWU9ImluSW50ZWdlciIgdmFsdWU9ImluSW50ZWdlciIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDaGFuZ2VFdmVudCIgeG1pOmlkPSJfWTB2YmdDY09FZWFvTXRRaWZpLVBwQSIgbmFtZT0iQ2hhbmdlIG9uIGluU3RyaW5nIj4KLSAgICAgICAgICAgIDxjaGFuZ2VFeHByZXNzaW9uIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWTB2YmdTY09FZWFvTXRRaWZpLVBwQSIgbmFtZT0iaW5TdHJpbmciIHZhbHVlPSJpblN0cmluZyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il9WUzJZTUNsMkVlYXE0TFVCZF9ZOXNBIiBuYW1lPSJFdmVudHMiLz4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0NtTDV3TVhXRWVXd3hfcHVIRHpGWXciPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9DbVFMTU1YV0VlV3d4X3B1SER6Rll3IiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwvUHJvZmlsZS9TdGFuZGFyZCMvIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL3Byb2ZpbGVzL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6aWQ9Il9XX01LUU1hR0VlV2ZGZG52MjZFZnVnIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfV19PbWdNYUdFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1ML1Byb2ZpbGUvU3RhbmRhcmQjLyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9wcm9maWxlcy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfMCIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfTHZKZHdCd1hFZWEwR01odlE0eEZuQSIvPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfY2JGNWNDTWtFZWEyT2F2QlBORnNqUSIvPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfVWhTRnNDWnpFZWFORHRVYTN3QUdNdyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX1VoVkpBQ1p6RWVhTkR0VWEzd0FHTXciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXB5cnVzL0ZNSVByb2ZpbGUvMS4wLjAjLyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkucHJvZmlsZS9tb2RlbC9GTUkucHJvZmlsZS51bWwjX19LaTNvS3ZGRWVTWHFLcWxIengxZ0EiLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgPC91bWw6TW9kZWw+Ci0gIDxzdGFuZGFyZDpDcmVhdGUgeG1pOmlkPSJfQ290Q1FNWFdFZVd3eF9wdUhEekZZdyIgYmFzZV9CZWhhdmlvcmFsRmVhdHVyZT0iX0NvbHRnTVhXRWVXd3hfcHVIRHpGWXciLz4KLSAgPHN0YW5kYXJkOkNyZWF0ZSB4bWk6aWQ9Il9YQmMwRU1hR0VlV2ZGZG52MjZFZnVnIiBiYXNlX0JlaGF2aW9yYWxGZWF0dXJlPSJfWEJXR1lNYUdFZVdmRmRudjI2RWZ1ZyIvPgotICA8Zm1pcHJvZmlsZTpDU19GTVUgeG1pOmlkPSJfOFZ0SWtNNDRFZVc1VzRHSXFKcHlGQSIgYmFzZV9DbGFzcz0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciIGNhbk5vdFVzZU1lbW9yeU1hbmFnZW1lbnRGdW5jdGlvbnM9InRydWUiIGNhbkhhbmRsZVZhcmlhYmxlQ29tbXVuaWNhdGlvblN0ZXBTaXplPSJ0cnVlIi8+Ci0gIDxmbWlwcm9maWxlOkNTX0ZNVSB4bWk6aWQ9Il8tNDFNb000NEVlVzVXNEdJcUpweUZBIiBiYXNlX0NsYXNzPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPgotICA8Zm1pcHJvZmlsZTpQb3J0IHhtaTppZD0iX0lGU1ZJTTQ1RWVXNVc0R0lxSnB5RkEiIGJhc2VfUHJvcGVydHk9Il9SVWtCY01YUUVlV3d4X3B1SER6Rll3IiBkZXNjcmlwdGlvbj0iIiB2YXJpYWJpbGl0eT0iZGlzY3JldGUiIHZhbHVlUmVmZXJlbmNlPSIxIiBkaXJlY3Rpb249Im91dCIvPgotICA8Zm1pcHJvZmlsZTpQb3J0IHhtaTppZD0iX1RaYVV3TTQ1RWVXNVc0R0lxSnB5RkEiIGJhc2VfUHJvcGVydHk9Il9hdUFGc01hREVlV2ZGZG52MjZFZnVnIiB2YXJpYWJpbGl0eT0iZGlzY3JldGUiIGRpcmVjdGlvbj0ib3V0Ii8+Ci0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfV1lZQVFNNDVFZVc1VzRHSXFKcHlGQSIgYmFzZV9Qcm9wZXJ0eT0iX3dRMmpJTWFERWVXZkZkbnYyNkVmdWciIHZhcmlhYmlsaXR5PSJkaXNjcmV0ZSIgdmFsdWVSZWZlcmVuY2U9IjEiIGRpcmVjdGlvbj0ib3V0Ii8+Ci0gIDxmbWlwcm9maWxlOkNTX0ZNVSB4bWk6aWQ9Il9iM0FrWU94UEVlV1A2ZU5fNlpjZ213IiBiYXNlX0NsYXNzPSJfYUt5Nk1PeFBFZVdQNmVOXzZaY2dtdyIvPgotICA8Zm1pcHJvZmlsZTpQb3J0IHhtaTppZD0iXzdERS0wT3hQRWVXUDZlTl82WmNnbXciIGJhc2VfUHJvcGVydHk9Il9lRzNISU94UEVlV1A2ZU5fNlpjZ213Ii8+Ci0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfOUFKSWNPeFBFZVdQNmVOXzZaY2dtdyIgYmFzZV9Qcm9wZXJ0eT0iX2ZQekZJT3hQRWVXUDZlTl82WmNnbXciIHZhbHVlUmVmZXJlbmNlPSIxIiBkaXJlY3Rpb249Im91dCIvPgotICA8Zm1pcHJvZmlsZTpQb3J0IHhtaTppZD0iX3N0X2hVQ1p6RWVhTkR0VWEzd0FHTXciIGJhc2VfUHJvcGVydHk9Il9KbEJ6Z1NaekVlYU5EdFVhM3dBR013Ii8+Ci0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfdTFtdUVDWnpFZWFORHRVYTN3QUdNdyIgYmFzZV9Qcm9wZXJ0eT0iX3Uxa1IwQ1p6RWVhTkR0VWEzd0FHTXciIHZhbHVlUmVmZXJlbmNlPSIxIi8+Ci0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfdktaU1VDWnpFZWFORHRVYTN3QUdNdyIgYmFzZV9Qcm9wZXJ0eT0iX3ZLWUVNQ1p6RWVhTkR0VWEzd0FHTXciIHZhbHVlUmVmZXJlbmNlPSIyIi8+Ci0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfdmRvWFlDWnpFZWFORHRVYTN3QUdNdyIgYmFzZV9Qcm9wZXJ0eT0iX3ZkbkpRQ1p6RWVhTkR0VWEzd0FHTXciIHZhbHVlUmVmZXJlbmNlPSIzIi8+Ci0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfYzJrZ01DWjBFZWFfMmNQQ3B4a3hadyIgYmFzZV9Qcm9wZXJ0eT0iX0psQnpneVp6RWVhTkR0VWEzd0FHTXciIHZhbHVlUmVmZXJlbmNlPSI0IiBkaXJlY3Rpb249Im91dCIvPgotICA8Zm1pcHJvZmlsZTpDU19GTVUgeG1pOmlkPSJfUUhnLU1DWjFFZWFfMmNQQ3B4a3hadyIgYmFzZV9DbGFzcz0iX0psQnpnQ1p6RWVhTkR0VWEzd0FHTXciLz4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2thLnByb3BlcnRpZXMgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9DMi9yZXNvdXJjZXMvbW9rYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQzODI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L0MyL3Jlc291cmNlcy9tb2thLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNUaHUgT2N0IDI3IDEwOjI0OjExIENFU1QgMjAxNgotdXJpLm1hcD1wYXRobWFwXDovL1BBUFlSVVNfRk1JX1BST0ZJTEUvXD1tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5wcm9maWxlL21vZGVsLyxwYXRobWFwXDovL1VNTF9MSUJSQVJJRVMvXD1tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL2xpYnJhcmllcy8scGF0aG1hcFw6Ly9VTUxfUFJPRklMRVMvXD1tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UudW1sMi51bWwucmVzb3VyY2VzL3Byb2ZpbGVzLyxwYXRobWFwXDovL1VNTF9NRVRBTU9ERUxTL1w9bW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9tZXRhbW9kZWxzLyxwYXRobWFwXDovL1BBUFlSVVNfZlVNTF9MSUJSQVJZL1w9bW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mdW1sLnN0YW5kYXJkbGlicmFyeS9yZXNvdXJjZXMvLHBhdGhtYXBcOi8vUEFQWVJVU19BQ1RJT05MQU5HVUFHRV9QUk9GSUxFL1w9bW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnBhcHlydXMudW1sLmFsZi5saWJyYXJpZXMvcmVzb3VyY2VzL2FjdGlvbi1sYW5ndWFnZS1wcm9maWxlLwotcHJvZmlsZS5tYXA9aHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvcGFweXJ1cy9GTUlQcm9maWxlLzEuMC4wXD1tb2RlbC9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5wcm9maWxlL21vZGVsL0ZNSS5wcm9maWxlLnVtbFwjX19LaTNvS3ZGRWVTWHFLcWxIengxZ0EsaHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwvUHJvZmlsZS9TdGFuZGFyZFw9bW9kZWwvcGx1Z2luL29yZy5lY2xpcHNlLnVtbDIudW1sLnJlc291cmNlcy9wcm9maWxlcy9TdGFuZGFyZC5wcm9maWxlLnVtbFwjXzAKLWZtdS5pZD1fVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZwotbW9kZWwucGF0aD1tb2RlbC9yZXNvdXJjZS9GTVVFeHBvcnQvRk1JJTIwRXhwb3J0JTIwRGV2L0ZNVV9FeGFtcGxlcy51bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2J1aWxkX0MyX2ZtdV9saW51eC1kZWJ1Zy5sYXVuY2ggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9idWlsZF9DMl9mbXVfbGludXgtZGVidWcubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njc5M2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2J1aWxkX0MyX2ZtdV9saW51eC1kZWJ1Zy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5Qcm9ncmFtTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHtwcm9qZWN0fSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MQVVOQ0hfQ09ORklHVVJBVElPTl9CVUlMRF9TQ09QRSIgdmFsdWU9IiR7cHJvamVjdH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2J1aWxkX0MyX2ZtdV9saW51eC5zaH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfVE9PTF9BUkdVTUVOVFMiIHZhbHVlPSJEZWJ1ZyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3R9Ii8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9idWlsZF9DMl9mbXVfbGludXguc2ggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9idWlsZF9DMl9mbXVfbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGViMzY2ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvYnVpbGRfQzJfZm11X2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyEvYmluL3NoCi0KLUNPTkZJR1VSQVRJT049JDEgI3Nob3VsZCBiZSBEZWJ1ZyBvciBSZWxlYXNlCi0KLUZNVV9OQU1FPSJDMkxpbnV4NjQiCi0KLQotcm0gQzIvYmluYXJpZXMvbGludXg2NC8qLnNvCi1ybSAkRk1VX05BTUUuZm11Ci0gCi1jcCAuLi8kQ09ORklHVVJBVElPTi9saWJmbXV3cmFwcGVyLnNvIEMyL2JpbmFyaWVzL2xpbnV4NjQvJEZNVV9OQU1FLnNvCi0KLWNkIEMyCi0KLSMzMiBiaXRzCi0jbXYgcmVzb3VyY2VzL2xpbnV4Lmd0ay54ODYvcmNwIHJlc291cmNlcwotI3JtZGlyIHJlc291cmNlcy9saW51eC5ndGsueDg2Ci0KLXJtIC1yZiByZXNvdXJjZXMvcmNwL2pyZQotCi0jMzIgYml0cwotI2NwIC1SIH4vUHJvZy9qcmVfMS44LjBfY29tcGFjdDJfeDg2IHJlc291cmNlcy9yY3AvanJlCi0KLSM2NGJpdHMKLSNjcCAtUiB+L1Byb2cvanJlXzEuOC4wX2NvbXBhY3QyX3g4Nl82NCByZXNvdXJjZXMvcmNwL2pyZQotCi1ybSByZXNvdXJjZXMvbG9ncy56aXAKLXppcCAuLi8kRk1VX05BTUUuZm11ICAtciAqCi1jZCAuLgotCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9idWlsZF9mbXVfbGludXguc2ggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9idWlsZF9mbXVfbGludXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwYjBlNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvYnVpbGRfZm11X2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyEvYmluL3NoCi0KLUNPTkZJR1VSQVRJT049JDEgI3Nob3VsZCBiZSBEZWJ1ZyBvciBSZWxlYXNlCi0KLUZNVV9OQU1FPSJBQ2hhbmdlRXZlbnQiCi0KLQotcm0gZm11X2J1aWxkL2JpbmFyaWVzL2xpbnV4NjQvKi5zbwotcm0gKi5mbXUKLSAKLWNwIC4uLyRDT05GSUdVUkFUSU9OL2xpYmZtdXdyYXBwZXIuc28gZm11X2J1aWxkL2JpbmFyaWVzL2xpbnV4NjQvJEZNVV9OQU1FLnNvCi0KLWNkIGZtdV9idWlsZAotCi0jMzIgYml0cwotI212IHJlc291cmNlcy9saW51eC5ndGsueDg2L3JjcCByZXNvdXJjZXMKLSNybWRpciByZXNvdXJjZXMvbGludXguZ3RrLng4NgotCi1ybSAtcmYgcmVzb3VyY2VzL3JjcC9qcmUKLQotIzMyIGJpdHMKLSNjcCAtUiB+L1Byb2cvanJlXzEuOC4wX2NvbXBhY3QyX3g4NiByZXNvdXJjZXMvcmNwL2pyZQotCi0jNjRiaXRzCi0jY3AgLVIgfi9Qcm9nL2pyZV8xLjguMF9jb21wYWN0Ml94ODZfNjQgcmVzb3VyY2VzL3JjcC9qcmUKLQotcm0gcmVzb3VyY2VzL2xvZ3MuemlwCi16aXAgLi4vJEZNVV9OQU1FLmZtdSAgLXIgKgotY2QgLi4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvYnVpbGRfZm11X3dpbmRvd3Muc2ggYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9idWlsZF9mbXVfd2luZG93cy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkOTAyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9idWlsZF9mbXVfd2luZG93cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMhL2Jpbi9zaAotCi1DT05GSUdVUkFUSU9OPSQxICNzaG91bGQgYmUgRGVidWcgb3IgUmVsZWFzZQotCi1GTVVfTkFNRT0ibW9rYUMxIgotCi0KLXJtIGZtdV9idWlsZC9iaW5hcmllcy93aW42NC8qLmRsbAotcm0gKi5mbXUKLSAKLWNwIC4uLyRDT05GSUdVUkFUSU9OL2xpYmZtdXdyYXBwZXIuZGxsIGZtdV9idWlsZC9iaW5hcmllcy93aW42NC8kRk1VX05BTUUuZGxsCi0KLWNkIGZtdV9idWlsZAotCi0KLXJtIC1yZiByZXNvdXJjZXMvcmNwL2pyZQotCi0KLQotcm0gcmVzb3VyY2VzL2xvZ3MuemlwCi16aXAgLi4vJEZNVV9OQU1FLmZtdSAgLXIgKgotY2QgLi4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvYnVpbGRfdGVzdF9mbXVfbGludXgtZGVidWcubGF1bmNoIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvYnVpbGRfdGVzdF9mbXVfbGludXgtZGVidWcubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGEyMTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2J1aWxkX3Rlc3RfZm11X2xpbnV4LWRlYnVnLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLlByb2dyYW1MYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xBVU5DSF9DT05GSUdVUkFUSU9OX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHtwcm9qZWN0fSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvYnVpbGRfZm11X2xpbnV4LnNofSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UT09MX0FSR1VNRU5UUyIgdmFsdWU9IkRlYnVnIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdH0iLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2J1aWxkX3Rlc3RfZm11X2xpbnV4LXJlbGVhc2UubGF1bmNoIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvYnVpbGRfdGVzdF9mbXVfbGludXgtcmVsZWFzZS5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWZlMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvYnVpbGRfdGVzdF9mbXVfbGludXgtcmVsZWFzZS5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5Qcm9ncmFtTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHtwcm9qZWN0fSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MQVVOQ0hfQ09ORklHVVJBVElPTl9CVUlMRF9TQ09QRSIgdmFsdWU9IiR7cHJvamVjdH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2J1aWxkX2ZtdV9saW51eC5zaH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfVE9PTF9BUkdVTUVOVFMiIHZhbHVlPSJSZWxlYXNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1dPUktJTkdfRElSRUNUT1JZIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdH0iLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2ZtdV9idWlsZC8uZ2l0aWdub3JlIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvZm11X2J1aWxkLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MzA1ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvZm11X2J1aWxkLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLS9iaW5hcmllcy8KLS9tb2thQzEuZm11CmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvbW9kZWxEZXNjcmlwdGlvbi54bWwgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvbW9kZWxEZXNjcmlwdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NjcxY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvZm11X2J1aWxkL21vZGVsRGVzY3JpcHRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxmbWlNb2RlbERlc2NyaXB0aW9uIGZtaVZlcnNpb249IjIuMCIgZ2VuZXJhdGlvbkRhdGVBbmRUaW1lPSIyMDE2LTA2LTEwVDEyOjQzOjU5Ljc5NyswMjowMCIgZ2VuZXJhdGlvblRvb2w9Ik1va2EgRk1VIGV4cG9ydGVyIiBndWlkPSIzYTAyMjdlMS1jNDUzLTRmNjEtYmIzMi00ZjhmNzgyOWMzNDMiIG1vZGVsTmFtZT0iQSI+Ci0gIDxDb1NpbXVsYXRpb24gY2FuQmVJbnN0YW50aWF0ZWRPbmx5T25jZVBlclByb2Nlc3M9InRydWUiIGNhbkdldEFuZFNldEZNVXN0YXRlPSJmYWxzZSIgY2FuSGFuZGxlVmFyaWFibGVDb21tdW5pY2F0aW9uU3RlcFNpemU9InRydWUiIGNhbkludGVycG9sYXRlSW5wdXRzPSJmYWxzZSIgY2FuTm90VXNlTWVtb3J5TWFuYWdlbWVudEZ1bmN0aW9ucz0idHJ1ZSIgY2FuUnVuQXN5bmNocm9udW91c2x5PSJmYWxzZSIgY2FuU2VyaWFsaXplRk1Vc3RhdGU9ImZhbHNlIiBtYXhPdXRwdXREZXJpdmF0aXZlT3JkZXI9IjAiIG1vZGVsSWRlbnRpZmllcj0iQUNoYW5nZUV2ZW50IiBuZWVkc0V4ZWN1dGlvblRvb2w9ImZhbHNlIiBwcm92aWRlc0RpcmVjdGlvbmFsRGVyaXZhdGl2ZT0iZmFsc2UiLz4KLSAgPE1vZGVsVmFyaWFibGVzPgotICAgIDxTY2FsYXJWYXJpYWJsZSBjYXVzYWxpdHk9ImlucHV0IiBpbml0aWFsPSJleGFjdCIgbmFtZT0iaW5Cb29sZWFuIiB2YWx1ZVJlZmVyZW5jZT0iMCIgdmFyaWFiaWxpdHk9ImRpc2NyZXRlIj4KLSAgICAgIDxCb29sZWFuLz4KLSAgICA8L1NjYWxhclZhcmlhYmxlPgotICAgIDxTY2FsYXJWYXJpYWJsZSBjYXVzYWxpdHk9ImlucHV0IiBpbml0aWFsPSJleGFjdCIgbmFtZT0iaW5JbnRlZ2VyIiB2YWx1ZVJlZmVyZW5jZT0iMSIgdmFyaWFiaWxpdHk9ImRpc2NyZXRlIj4KLSAgICAgIDxJbnRlZ2VyLz4KLSAgICA8L1NjYWxhclZhcmlhYmxlPgotICAgIDxTY2FsYXJWYXJpYWJsZSBjYXVzYWxpdHk9ImlucHV0IiBpbml0aWFsPSJleGFjdCIgbmFtZT0iaW5SZWFsIiB2YWx1ZVJlZmVyZW5jZT0iMiIgdmFyaWFiaWxpdHk9ImRpc2NyZXRlIj4KLSAgICAgIDxSZWFsLz4KLSAgICA8L1NjYWxhclZhcmlhYmxlPgotICAgIDxTY2FsYXJWYXJpYWJsZSBjYXVzYWxpdHk9ImlucHV0IiBpbml0aWFsPSJleGFjdCIgbmFtZT0iaW5TdHJpbmciIHZhbHVlUmVmZXJlbmNlPSIzIiB2YXJpYWJpbGl0eT0iZGlzY3JldGUiPgotICAgICAgPFN0cmluZy8+Ci0gICAgPC9TY2FsYXJWYXJpYWJsZT4KLSAgICA8U2NhbGFyVmFyaWFibGUgY2F1c2FsaXR5PSJvdXRwdXQiIGluaXRpYWw9ImV4YWN0IiBuYW1lPSJvdXRCb29sZWFuIiB2YWx1ZVJlZmVyZW5jZT0iNCIgdmFyaWFiaWxpdHk9ImRpc2NyZXRlIj4KLSAgICAgIDxCb29sZWFuIHN0YXJ0PSJmYWxzZSIvPgotICAgIDwvU2NhbGFyVmFyaWFibGU+Ci0gIDwvTW9kZWxWYXJpYWJsZXM+Ci0gIDxNb2RlbFN0cnVjdHVyZT4KLSAgICA8T3V0cHV0cz4KLSAgICAgIDxVbmtub3duIGluZGV4PSI1Ii8+Ci0gICAgPC9PdXRwdXRzPgotICA8L01vZGVsU3RydWN0dXJlPgotPC9mbWlNb2RlbERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2ZtdV9idWlsZC9yZXNvdXJjZXMvLmdpdGlnbm9yZSBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2ZtdV9idWlsZC9yZXNvdXJjZXMvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczZDJkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvcmVzb3VyY2VzLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0vcmNwLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvZm11X2J1aWxkL3Jlc291cmNlcy9GTVVfRXhhbXBsZXMuZGkgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvcmVzb3VyY2VzL0ZNVV9FeGFtcGxlcy5kaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzNGQ0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvcmVzb3VyY2VzL0ZNVV9FeGFtcGxlcy5kaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiLz4NCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvcmVzb3VyY2VzL0ZNVV9FeGFtcGxlcy5ub3RhdGlvbiBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2ZtdV9idWlsZC9yZXNvdXJjZXMvRk1VX0V4YW1wbGVzLm5vdGF0aW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDUwMzAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2ZtdV9idWlsZC9yZXNvdXJjZXMvRk1VX0V4YW1wbGVzLm5vdGF0aW9uCisrKyAvZGV2L251bGwKQEAgLTEsMzAxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6Y29uZmlndXJhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXB5cnVzL2luZnJhL3ZpZXdwb2ludHMvY29uZmlndXJhdGlvbiIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi9ydW50aW1lLzEuMC4yL25vdGF0aW9uIiB4bWxuczpzdHlsZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXB5cnVzL2luZnJhL3ZpZXdwb2ludHMvcG9saWN5L3N0eWxlIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwiPg0KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfREVpNGNNWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iUGFweXJ1c1VNTENsYXNzRGlhZ3JhbSIgbmFtZT0iQ2xhc3MgZGlhZ3JhbSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+DQotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX05PLUZFTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNsYXNzX1NoYXBlIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfWkdzSm9NYURFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1pHc0pvY2FERWVXZkZkbnYyNkVmdWciIGtleT0idmlzaWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9OTy1zSU1YUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJDbGFzc19OYW1lTGFiZWwiPg0KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX1pHc0pvc2FERWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1pHc0pvOGFERWVXZkZkbnYyNkVmdWciIGtleT0idmlzaWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTk8tc0ljWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ2xhc3NfRmxvYXRpbmdOYW1lTGFiZWwiPg0KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX1pHc3dzTWFERWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1pHc3dzY2FERWVXZkZkbnYyNkVmdWciIGtleT0idmlzaWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9OTy1zSXNYUUVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0NybVdvQmRXRWVhUGM2WDhPY0MyaHciIHR5cGU9IkNsYXNzX0F0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX1JVcXZJTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IlByb3BlcnR5X0NsYXNzQXR0cmlidXRlTGFiZWwiPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTdHJpbmdMaXN0VmFsdWVTdHlsZSIgeG1pOmlkPSJfWFNRdThNWFFFZVd3eF9wdUhEekZZdyIgbmFtZT0ibWFza0xhYmVsIj4NCi0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPm11bHRpcGxpY2l0eTwvc3RyaW5nTGlzdFZhbHVlPg0KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+dmlzaWJpbGl0eTwvc3RyaW5nTGlzdFZhbHVlPg0KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+ZGVmYXVsdFZhbHVlPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5uYW1lPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT50eXBlPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5kZXJpdmVkPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgIDwvc3R5bGVzPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19SVWtCY01YUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUlVxdkljWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX05PX1RNY1hRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfTk9fVE1zWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX05PX1RNOFhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX05PX1ROTVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfQ3JtOXNCZFdFZWFQYzZYOE9jQzJodyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkNsYXNzX09wZXJhdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX05PX1ROc1hRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfTk9fVE44WFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX05PX1RPTVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX05PX1RPY1hRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfQ3JtOXNSZFdFZWFQYzZYOE9jQzJodyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkNsYXNzX05lc3RlZENsYXNzaWZpZXJDb21wYXJ0bWVudCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9OT19UTzhYUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX05PX1RQTVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9OT19UUGNYUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9OT19UUHNYUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTk8tRkVjWFFFZVd3eF9wdUhEekZZdyIgeD0iNTMiIHk9IjIxMSIgd2lkdGg9Ijc5NyIgaGVpZ2h0PSIxNDEiLz4NCi0gICAgPC9jaGlsZHJlbj4NCi0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfVi1QeUFNYURFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iQ2xhc3NfU2hhcGUiPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9aR3B0WU1hREVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfWkdxVWNNYURFZVdmRmRudjI2RWZ1ZyIga2V5PSJ2aXNpYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1YtUm5NTWFERWVXZkZkbnYyNkVmdWciIHR5cGU9IkNsYXNzX05hbWVMYWJlbCI+DQotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfWkdxN2dNYURFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfWkdxN2djYURFZVdmRmRudjI2RWZ1ZyIga2V5PSJ2aXNpYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9WLVJuTWNhREVlV2ZGZG52MjZFZnVnIiB0eXBlPSJDbGFzc19GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfWkdxN2dzYURFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfWkdxN2c4YURFZVdmRmRudjI2RWZ1ZyIga2V5PSJ2aXNpYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1YtUm5Nc2FERWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfQ3JvTDBCZFdFZWFQYzZYOE9jQzJodyIgdHlwZT0iQ2xhc3NfQXR0cmlidXRlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfYXVMcjRNYURFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iUHJvcGVydHlfQ2xhc3NBdHRyaWJ1dGVMYWJlbCI+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlN0cmluZ0xpc3RWYWx1ZVN0eWxlIiB4bWk6aWQ9Il91NjZENE1hREVlV2ZGZG52MjZFZnVnIiBuYW1lPSJtYXNrTGFiZWwiPg0KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+bXVsdGlwbGljaXR5PC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT52aXNpYmlsaXR5PC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5kZWZhdWx0VmFsdWU8L3N0cmluZ0xpc3RWYWx1ZT4NCi0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPm5hbWU8L3N0cmluZ0xpc3RWYWx1ZT4NCi0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPnR5cGU8L3N0cmluZ0xpc3RWYWx1ZT4NCi0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPmRlcml2ZWQ8L3N0cmluZ0xpc3RWYWx1ZT4NCi0gICAgICAgICAgPC9zdHlsZXM+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX2F1QUZzTWFERWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9hdUxyNGNhREVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfd1JBVUlNYURFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iUHJvcGVydHlfQ2xhc3NBdHRyaWJ1dGVMYWJlbCI+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlN0cmluZ0xpc3RWYWx1ZVN0eWxlIiB4bWk6aWQ9Il95OWlMME1hREVlV2ZGZG52MjZFZnVnIiBuYW1lPSJtYXNrTGFiZWwiPg0KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+bXVsdGlwbGljaXR5PC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT52aXNpYmlsaXR5PC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5kZWZhdWx0VmFsdWU8L3N0cmluZ0xpc3RWYWx1ZT4NCi0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPm5hbWU8L3N0cmluZ0xpc3RWYWx1ZT4NCi0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPnR5cGU8L3N0cmluZ0xpc3RWYWx1ZT4NCi0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPmRlcml2ZWQ8L3N0cmluZ0xpc3RWYWx1ZT4NCi0gICAgICAgICAgPC9zdHlsZXM+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3dRMmpJTWFERWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il93UkFVSWNhREVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfVi1TT1FjYURFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9WLVNPUXNhREVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfVi1TT1E4YURFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfVi1TT1JNYURFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9Dcm9MMFJkV0VlYVBjNlg4T2NDMmh3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQ2xhc3NfT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfVi1TT1JzYURFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9WLVNPUjhhREVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfVi1TT1NNYURFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfVi1TT1NjYURFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9Dcm9MMGhkV0VlYVBjNlg4T2NDMmh3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQ2xhc3NfTmVzdGVkQ2xhc3NpZmllckNvbXBhcnRtZW50Ij4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX1YtU09TOGFERWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfVi1TT1RNYURFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX1YtU09UY2FERWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1YtU09Uc2FERWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9WLVB5QWNhREVlV2ZGZG52MjZFZnVnIiB4PSI1NCIgeT0iNDA0IiB3aWR0aD0iODE3IiBoZWlnaHQ9IjE0MSIvPg0KLSAgICA8L2NoaWxkcmVuPg0KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il84V2E2UU00NEVlVzVXNEdJcUpweUZBIiB0eXBlPSJTdGVyZW90eXBlQ29tbWVudCI+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfOFdhNlFjNDRFZVc1VzRHSXFKcHlGQSIgc2hvd1RpdGxlPSJ0cnVlIi8+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RU9iamVjdFZhbHVlU3R5bGUiIHhtaTppZD0iXzhXYTZRODQ0RWVXNVc0R0lxSnB5RkEiIG5hbWU9IkJBU0VfRUxFTUVOVCI+DQotICAgICAgICA8ZU9iamVjdFZhbHVlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8L3N0eWxlcz4NCi0gICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfOFdhNlFzNDRFZVc1VzRHSXFKcHlGQSIgeD0iMzc3IiB5PSIyMTEiLz4NCi0gICAgPC9jaGlsZHJlbj4NCi0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfLTVEUEVNNDRFZVc1VzRHSXFKcHlGQSIgdHlwZT0iU3RlcmVvdHlwZUNvbW1lbnQiPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iXy01RFBFYzQ0RWVXNVc0R0lxSnB5RkEiIHNob3dUaXRsZT0idHJ1ZSIvPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVPYmplY3RWYWx1ZVN0eWxlIiB4bWk6aWQ9Il8tNUQySU00NEVlVzVXNEdJcUpweUZBIiBuYW1lPSJCQVNFX0VMRU1FTlQiPg0KLSAgICAgICAgPGVPYmplY3RWYWx1ZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19WOU1DRU1hREVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgPC9zdHlsZXM+DQotICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXy01RFBFczQ0RWVXNVc0R0lxSnB5RkEiIHg9IjM3NyIgeT0iNDI1Ii8+DQotICAgIDwvY2hpbGRyZW4+DQotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlN0cmluZ1ZhbHVlU3R5bGUiIHhtaTppZD0iX0RFaTRjY1hRRWVXd3hfcHVIRHpGWXciIG5hbWU9ImRpYWdyYW1fY29tcGF0aWJpbGl0eV92ZXJzaW9uIiBzdHJpbmdWYWx1ZT0iMS4yLjAiLz4NCi0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9ERWk0Y3NYUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgIDxzdHlsZXMgeG1pOnR5cGU9InN0eWxlOlBhcHlydXNWaWV3U3R5bGUiIHhtaTppZD0iX0RFaTRjOFhRRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgIDxvd25lciB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjXzdTQW9JT3hPRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICA8Y29uZmlndXJhdGlvbiB4bWk6dHlwZT0iY29uZmlndXJhdGlvbjpQYXB5cnVzRGlhZ3JhbSIgaHJlZj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2Euc2ltZXgvY29uZmlnL3NpbWV4LmNvbmZpZ3VyYXRpb24jXzFQVlZzRlk5RWVXY211WWpCX19hdGciLz4NCi0gICAgPC9zdHlsZXM+DQotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3E4RE9jTVhQRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iXzhXYTZSTTQ0RWVXNVc0R0lxSnB5RkEiIHR5cGU9IlN0ZXJlb3R5cGVDb21tZW50TGluayIgc291cmNlPSJfTk8tRkVNWFFFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfOFdhNlFNNDRFZVc1VzRHSXFKcHlGQSI+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il84V2E2UmM0NEVlVzVXNEdJcUpweUZBIi8+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RU9iamVjdFZhbHVlU3R5bGUiIHhtaTppZD0iXzhXYTZTYzQ0RWVXNVc0R0lxSnB5RkEiIG5hbWU9IkJBU0VfRUxFTUVOVCI+DQotICAgICAgICA8ZU9iamVjdFZhbHVlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8L3N0eWxlcz4NCi0gICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfOFdhNlJzNDRFZVc1VzRHSXFKcHlGQSIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iXzhXYTZSODQ0RWVXNVc0R0lxSnB5RkEiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfOFdhNlNNNDRFZVc1VzRHSXFKcHlGQSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfLTVEMkljNDRFZVc1VzRHSXFKcHlGQSIgdHlwZT0iU3RlcmVvdHlwZUNvbW1lbnRMaW5rIiBzb3VyY2U9Il9WLVB5QU1hREVlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il8tNURQRU00NEVlVzVXNEdJcUpweUZBIj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iXy01RDJJczQ0RWVXNVc0R0lxSnB5RkEiLz4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpFT2JqZWN0VmFsdWVTdHlsZSIgeG1pOmlkPSJfLTVEMkpzNDRFZVc1VzRHSXFKcHlGQSIgbmFtZT0iQkFTRV9FTEVNRU5UIj4NCi0gICAgICAgIDxlT2JqZWN0VmFsdWUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDwvc3R5bGVzPg0KLSAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8tNUQySTg0NEVlVzVXNEdJcUpweUZBIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfLTVEMkpNNDRFZVc1VzRHSXFKcHlGQSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il8tNUQySmM0NEVlVzVXNEdJcUpweUZBIi8+DQotICAgIDwvZWRnZXM+DQotICA8L25vdGF0aW9uOkRpYWdyYW0+DQotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9vNGhiQU1YUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJQYXB5cnVzVU1MQWN0aXZpdHlEaWFncmFtIiBuYW1lPSJDMSBjbGFzc2lmaWVyIGJlaGF2aW9yIGRpYWdyYW0iIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPg0KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9vNGhiQWNYUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY3Rpdml0eV9TaGFwZSI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbzRpQ0VNWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWN0aXZpdHlfTmFtZUxhYmVsIi8+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il8wZjAwY0JkVkVlYVBjNlg4T2NDMmh3IiB0eXBlPSJBY3Rpdml0eV9QYXJhbWV0ZXJDb21wYXJ0bWVudCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX280aUNFOFhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9vNGlDRk1YUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9vNGlDRmNYUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iXzBmMWJnQmRWRWVhUGM2WDhPY0MyaHciIHR5cGU9IkFjdGl2aXR5X1ByZWNvbmRpdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfbzRpQ0Y4WFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX280aUNHTVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX280aUNHY1hRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfMGYyQ2tCZFZFZWFQYzZYOE9jQzJodyIgdHlwZT0iQWN0aXZpdHlfUG9zdGNvbmRpdGlvbkNvbXBhcnRtZW50Ij4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfbzRpQ0c4WFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX280aUNITVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX280aUNIY1hRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfMGY1RjRCZFZFZWFQYzZYOE9jQzJodyIgdHlwZT0iQWN0aXZpdHlfQWN0aXZpdHlOb2RlQ29tcGFydG1lbnQiPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfc1JZMFFNWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29tbWVudF9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3NSWTBRc1hRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbW1lbnRfQm9keUxhYmVsIi8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q29tbWVudCIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfc1JUN3dNWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9zUlkwUWNYUUVlV3d4X3B1SER6Rll3IiB4PSI0ODQiIHk9Ijg4Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfeHJIU0FNWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fU2hhcGUiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfZEZIQjRNWFJFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9kRkhCNGNYUkVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il94ckg1RU1YUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9OYW1lTGFiZWwiLz4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeHJINUVjWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fVHJpZ2dlckxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3hySDVFc1hRRWVXd3hfcHVIRHpGWXciIHg9Ijg5IiB5PSIxMyIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il94ckg1RThYUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfeHJINUZNWFFFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il94ckg1RmNYUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il94ckg1RnNYUUVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfeHN0MGdNWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfeHN0MGdjWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3hzdDBnc1hRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfeHJIU0FjWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI194ckFrVU1YUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3hySFNBc1hRRWVXd3hfcHVIRHpGWXciIHg9IjE3NiIgeT0iNzMiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il94NlJ2WU1YUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9sNDA2UU1YUkVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX2w0MDZRY1hSRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3g2U1djTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il94NlNXY2NYUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9UcmlnZ2VyTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfeDZTV2NzWFFFZVd3eF9wdUhEekZZdyIgeD0iOTAiIHk9IjExIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3g2U1djOFhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il94NlNXZE1YUUVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3g2U1dkY1hRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3g2U1dkc1hRRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il94NmE1VU1YUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il94NmE1VWNYUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeDZhNVVzWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il94NlJ2WWNYUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3g2Sk1nTVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeDZSdllzWFFFZVd3eF9wdUhEekZZdyIgeD0iMTc2IiB5PSIzMTkiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il95SVA1OE1YUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9xZnpzY01YUkVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3FmMFRnTVhSRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3lJUWhBTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95SVFoQWNYUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9UcmlnZ2VyTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfeUlRaEFzWFFFZVd3eF9wdUhEekZZdyIgeD0iOTIiIHk9IjExIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3lJUWhBOFhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il95SVFoQk1YUUVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3lJUWhCY1hRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3lJUWhCc1hRRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il95SWJnSU1YUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il95SWJnSWNYUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeUliZ0lzWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il95SVA1OGNYUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3lJR3dBTVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeUlQNThzWFFFZVd3eF9wdUhEekZZdyIgeD0iMTc2IiB5PSI1NjIiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9Nd1AyME1YU0VlV3d4X3B1SER6Rll3IiB0eXBlPSJJbml0aWFsTm9kZV9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX013UWQ0TVhTRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJJbml0aWFsTm9kZV9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9Nd1FkNGNYU0VlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX013UWQ0c1hTRWVXd3hfcHVIRHpGWXciIHR5cGU9IkluaXRpYWxOb2RlX1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9Nd1FkNDhYU0VlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX013UDIwY1hTRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbml0aWFsTm9kZSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfTXdFUW9NWFNFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9Nd1AyMHNYU0VlV3d4X3B1SER6Rll3IiB4PSIyMjkiIHk9IjIwIi8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfYmZPWFFNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2JmT1hROFhURWVXd3hfcHVIRHpGWXciIHR5cGU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfS2V5d29yZExhYmVsIi8+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfMGY3aUlCZFZFZWFQYzZYOE9jQzJodyIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9BY3Rpdml0eU5vZGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSnNEUWtNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSnhlaklNWFRFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSnhlakljWFRFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9Kc0Qzb01YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSnNEM29jWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSnNEM29zWFRFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfSnNRcjhNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX0pzUXI4Y1hURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSnNRcjhzWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX0p2RUlVTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25PYmplY3RTaGFwZSI+DQotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9KeGVqSXNYVEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0p4ZWpJOFhURWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0p2RUlVOFhURWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25PYmplY3ROYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSnZFSVZNWFRFZVd3eF9wdUhEekZZdyIgeD0iMjIiIHk9Ii0yIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0p2RUlWY1hURWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25PYmplY3RTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSnZFdllNWFRFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9KdkVJVWNYVEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0pyOGk0TVhURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSnZFSVVzWFRFZVd3eF9wdUhEekZZdyIgeD0iLTE1IiB5PSIxNyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX0p2RXZZY1hURWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25WYWx1ZVNoYXBlIj4NCi0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0p4ZWpKTVhURWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSnhlakpjWFRFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSnZFdlpNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblZhbHVlTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0p2RXZaY1hURWVXd3hfcHVIRHpGWXciIHg9IjI0IiB5PSItMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KdkV2WnNYVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uVmFsdWVTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSnZFdlo4WFRFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9KdkV2WXNYVEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0pyLV9JTVhURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSnZFdlk4WFRFZVd3eF9wdUhEekZZdyIgeD0iLTE1IiB5PSI2MiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX0p2RXZhTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uUmVzdWx0U2hhcGUiPg0KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSnhlakpzWFRFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9KeGVqSjhYVEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KdkZXY3NYVEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25SZXN1bHROYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSnZGV2M4WFRFZVd3eF9wdUhEekZZdyIgeD0iLTQzIiB5PSIxNiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KdkZXZE1YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KdkZXZGNYVEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0p2RldjTVhURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0pyOXhBTVhURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSnZGV2NjWFRFZVd3eF9wdUhEekZZdyIgeD0iMTQ4IiB5PSIyNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0pzRFFrY1hURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSnJ6WThNWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSnNEUWtzWFRFZVd3eF9wdUhEekZZdyIgeD0iMTM0IiB5PSI5IiB3aWR0aD0iMTE4IiBoZWlnaHQ9Ijg1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9qemVGWU1YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJSZWFkU2VsZkFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfajBrUmtNWFRFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfajBrUmtjWFRFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9qemVzY01YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJSZWFkU2VsZkFjdGlvbl9OYW1lTGFiZWwiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2p6ZXNjY1hURWVXd3hfcHVIRHpGWXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9qemVzY3NYVEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9qenBya01YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfanpwcmtjWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9qenBya3NYVEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfanpxU29NWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT3V0cHV0UGluX1JlYWRTZWxmQWN0aW9uUmVzdWx0U2hhcGUiPg0KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfajBrUmtzWFRFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9qMGtSazhYVEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9qenFTbzhYVEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX1JlYWRTZWxmQWN0aW9uUmVzdWx0TmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2p6cVNwTVhURWVXd3hfcHVIRHpGWXciIHg9IjgiIHk9IjE0Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2p6cVNwY1hURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9SZWFkU2VsZkFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9qenFTcHNYVEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2p6cVNvY1hURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX2p6UlJFTVhURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfanpxU29zWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2p6ZUZZY1hURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX2p6UUM4TVhURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2p6ZUZZc1hURWVXd3hfcHVIRHpGWXciIHg9IjE0IiB5PSI5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9sMHljNE1YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb25fU2hhcGUiPg0KLSAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX2wxdVJBTVhURWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX2wxdVJBY1hURWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbDB6RDhzWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbDB6RDg4WFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9sMHpEOU1YVEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9sMDZfd01YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfbDA2X3djWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9sMDZfd3NYVEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfbDA3bTBNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT3V0cHV0UGluX1ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvblJlc3VsdFNoYXBlIj4NCi0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX2wxdVJBc1hURWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfbDF1UkE4WFRFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbDA3bTA4WFRFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik91dHB1dFBpbl9WYWx1ZVNwZWNpZmljYXRpb25BY3Rpb25SZXN1bHROYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbDA4TjRNWFRFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9sMDhONGNYVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uUmVzdWx0U3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2wwOE40c1hURWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfbDA3bTBjWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfbDBtMnNNWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9sMDdtMHNYVEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfbDB6RDhNWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX2wwY2VvTVhURWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2wwekQ4Y1hURWVXd3hfcHVIRHpGWXciIHg9IjE0IiB5PSI1NCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfYmZPLVVjWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9iZk9YUWNYVEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfYmUtZm9NWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9iZk9YUXNYVEVlV3d4X3B1SER6Rll3IiB4PSI5MyIgeT0iMTUyIiB3aWR0aD0iMjkyIiBoZWlnaHQ9IjEzNSIvPg0KLSAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX2hkSEFFTVhWRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjdGl2aXR5RmluYWxOb2RlX1NoYXBlIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfaGRIQUU4WFZFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkFjdGl2aXR5RmluYWxOb2RlX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hkSEFGTVhWRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfaGRIQUZjWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWN0aXZpdHlGaW5hbE5vZGVfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hkSEFGc1hWRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfaGRIQUVjWFZFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjdGl2aXR5RmluYWxOb2RlIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19oY2xib01YVkVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hkSEFFc1hWRWVXd3hfcHVIRHpGWXciIHg9IjQzOCIgeT0iNzAyIi8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfaWJRX2dNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2liUzBzTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfS2V5d29yZExhYmVsIi8+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfMGY5WFVCZFZFZWFQYzZYOE9jQzJodyIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9BY3Rpdml0eU5vZGVDb21wYXJ0bWVudCI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfbUpLTmtNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfbUxCMTBNWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfbUxDYzRNWFhFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9tSkswb01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbUpLMG9jWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbUpLMG9zWFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfbUpneTRNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX21KZ3k0Y1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbUpneTRzWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX21KaUJBTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25PYmplY3RTaGFwZSI+DQotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9tTENjNGNYWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX21MQ2M0c1hYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX21KaUJBOFhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25PYmplY3ROYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbUppQkJNWFhFZVd3eF9wdUhEekZZdyIgeD0iMTkiIHk9IjEiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbUppb0VNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdFN0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9tSmlvRWNYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX21KaUJBY1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfbUpFRzhNWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9tSmlCQXNYWEVlV3d4X3B1SER6Rll3IiB4PSItMTUiIHk9IjEzIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfbUppb0VzWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblZhbHVlU2hhcGUiPg0KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfbUxDYzQ4WFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9tTENjNU1YWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9tSmlvRmNYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uVmFsdWVOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbUppb0ZzWFhFZVd3eF9wdUhEekZZdyIgeD0iMjEiIHk9Ii0yIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX21KaW9GOFhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25WYWx1ZVN0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9tSmlvR01YWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX21KaW9FOFhYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfbUpIS1FNWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9tSmlvRk1YWEVlV3d4X3B1SER6Rll3IiB4PSItMTUiIHk9IjU4Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfbUppb0djWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iT3V0cHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25SZXN1bHRTaGFwZSI+DQotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9tTENjNWNYWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX21MQ2M1c1hYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX21KaW9ITVhYRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPdXRwdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblJlc3VsdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9tSmlvSGNYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX21KaW9Ic1hYRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uUmVzdWx0U3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX21KaW9IOFhYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfbUppb0dzWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfbUpGVkVNWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9tSmlvRzhYWEVlV3d4X3B1SER6Rll3IiB4PSIxMTciIHk9IjMxIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfbUpLTmtjWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19tSV9PY01YWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9tSktOa3NYWEVlV3d4X3B1SER6Rll3IiB4PSIxMzEiIHk9IjMiIHdpZHRoPSIxMTgiIGhlaWdodD0iODUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3J3NTVNTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX1NoYXBlIj4NCi0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9yeVUxZ01YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9yeVUxZ2NYWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3J3NTVNOFhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfcnc1NU5NWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iUmVhZFNlbGZBY3Rpb25fRmxvYXRpbmdOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3J3NTVOY1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX3J4RmZZTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9ImNvbXBhcnRtZW50X3NoYXBlX2Rpc3BsYXkiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9yeEZmWWNYWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3J4RmZZc1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9yeEdHY01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fUmVhZFNlbGZBY3Rpb25SZXN1bHRTaGFwZSI+DQotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9yeVUxZ3NYWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3J5VTFnOFhYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3J4R0djOFhYRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPdXRwdXRQaW5fUmVhZFNlbGZBY3Rpb25SZXN1bHROYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcnhHR2RNWFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9yeEdHZGNYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fUmVhZFNlbGZBY3Rpb25SZXN1bHRTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcnhHR2RzWFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9yeEdHY2NYWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19yd2xKRU1YWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3J4R0djc1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9ydzU1TWNYWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlJlYWRTZWxmQWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19yd2tpQU1YWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ydzU1TXNYWEVlV3d4X3B1SER6Rll3IiB4PSIxMSIgeT0iMyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfdUltSlVNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uX1NoYXBlIj4NCi0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il91S2x0WU1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il91S2x0WWNYWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3VJbXdZTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbl9OYW1lTGFiZWwiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3VJbXdZY1hYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdUltd1lzWFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfdUl5V2tNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX3VJeVdrY1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdUl5V2tzWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3VJeTlvTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9WYWx1ZVNwZWNpZmljYXRpb25BY3Rpb25SZXN1bHRTaGFwZSI+DQotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il91S2x0WXNYWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3VLbHRZOFhYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3VJeTlvOFhYRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPdXRwdXRQaW5fVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uUmVzdWx0TmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3VJeTlwTVhYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfdUl5OXBjWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iT3V0cHV0UGluX1ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91SXk5cHNYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3VJeTlvY1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3VJUUxFTVhYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdUl5OW9zWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3VJbUpVY1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI191SVBrQU1YWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il91SW1KVXNYWEVlV3d4X3B1SER6Rll3IiB4PSIxMSIgeT0iNDgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2liUzBzc1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfaWJRX2djWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX2lhNXpJTVhYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaWJRX2dzWFhFZVd3eF9wdUhEekZZdyIgeD0iOTYiIHk9IjM5NCIgd2lkdGg9IjI5MiIgaGVpZ2h0PSIxMzUiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il94R1RRa01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX1NoYXBlIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeEdUUWs4WFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9LZXl3b3JkTGFiZWwiLz4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il8wZl96a0JkVkVlYVBjNlg4T2NDMmh3IiB0eXBlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0FjdGl2aXR5Tm9kZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il95MldSNE1YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uX1NoYXBlIj4NCi0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il95NF9XTU1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il95NF9XTWNYWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3kyVzQ4TVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25fTmFtZUxhYmVsIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95Mlc0OGNYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il95Mlc0OHNYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il95MjVyZ01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfeTI1cmdjWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il95MjVyZ3NYWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfeTI2NW9NWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdFNoYXBlIj4NCi0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX3k0X1dNc1hYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfeTRfV004WFhFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeTI2NW84WFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il95MjY1cE1YWEVlV3d4X3B1SER6Rll3IiB4PSIyMCIgeT0iMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95MjY1cGNYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uT2JqZWN0U3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3kyNjVwc1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfeTI2NW9jWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI195MlBrTU1YWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3kyNjVvc1hYRWVXd3hfcHVIRHpGWXciIHg9Ii0xNSIgeT0iMTIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il95Mjdnc01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uVmFsdWVTaGFwZSI+DQotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il95NF9XTk1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3k0X1dOY1hYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3kyN2dzOFhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25WYWx1ZU5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il95MjdndE1YWEVlV3d4X3B1SER6Rll3IiB4PSIxNyIgeT0iMSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95MjdndGNYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uVmFsdWVTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfeTI3Z3RzWFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il95Mjdnc2NYWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3kyU0FjTVhYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeTI3Z3NzWFhFZVd3eF9wdUhEekZZdyIgeD0iLTE1IiB5PSI1MiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3kyN2d0OFhYRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uUmVzdWx0U2hhcGUiPg0KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfeTRfV05zWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il95NF9XTjhYWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95MjdndXNYWEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25SZXN1bHROYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfeTI3Z3U4WFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95Mjdndk1YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il95MjdndmNYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3kyN2d1TVhYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3kyUXlVTVhYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeTI3Z3VjWFhFZVd3eF9wdUhEekZZdyIgeD0iMTE3IiB5PSIzNCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3kyV1I0Y1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfeTJNZzRNWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeTJXUjRzWFhFZVd3eF9wdUhEekZZdyIgeD0iMTMxIiB5PSI5IiB3aWR0aD0iMTE4IiBoZWlnaHQ9Ijg1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il80bkpMME1YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJSZWFkU2VsZkFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfNG9yYzRNWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfNG9yYzRjWFhFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il80bkpMMDhYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJSZWFkU2VsZkFjdGlvbl9OYW1lTGFiZWwiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzRuSkwxTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il80bkpMMWNYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il80blpxZ01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfNG5acWdjWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il80blpxZ3NYWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfNG5hUmtNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iT3V0cHV0UGluX1JlYWRTZWxmQWN0aW9uUmVzdWx0U2hhcGUiPg0KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfNG9yYzRzWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il80b3JjNDhYWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il80bmFSazhYWEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX1JlYWRTZWxmQWN0aW9uUmVzdWx0TmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzRuYVJsTVhYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfNG5hUmxjWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iT3V0cHV0UGluX1JlYWRTZWxmQWN0aW9uUmVzdWx0U3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzRuYVJsc1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfNG5hUmtjWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfNG14WVlNWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il80bmFSa3NYWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfNG5KTDBjWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpSZWFkU2VsZkFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfNG1yUndNWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfNG5KTDBzWFhFZVd3eF9wdUhEekZZdyIgeD0iMTEiIHk9IjgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iXzYxaHU4TVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfNjNPWUVNWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfNjNPWUVjWFhFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il82MWh1ODhYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb25fTmFtZUxhYmVsIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il82MWh1OU1YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb25fRmxvYXRpbmdOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzYxaHU5Y1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iXzYxd19nTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9ImNvbXBhcnRtZW50X3NoYXBlX2Rpc3BsYXkiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il82MXdfZ2NYWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzYxd19nc1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il82MXhta01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uUmVzdWx0U2hhcGUiPg0KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfNjNPWUVzWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il82M09ZRThYWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il82MXlOb3NYWEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX1ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvblJlc3VsdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il82MXlObzhYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzYxeU5wTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9WYWx1ZVNwZWNpZmljYXRpb25BY3Rpb25SZXN1bHRTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfNjF5TnBjWFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il82MXlOb01YWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI182MUpVY01YWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzYxeU5vY1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il82MWh1OGNYWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfNjFJdFlNWFhFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfNjFodThzWFhFZVd3eF9wdUhEekZZdyIgeD0iMTEiIHk9IjQ5Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il94R1RRbGNYWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3hHVFFrY1hYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI194RjlTVU1YWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3hHVFFrc1hYRWVXd3hfcHVIRHpGWXciIHg9Ijk2IiB5PSI2NTMiIHdpZHRoPSIyOTIiIGhlaWdodD0iMTM1Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbzRpQ0g4WFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfYm5SQVVNWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX280aUNJTVhRRWVXd3hfcHVIRHpGWXciIHdpZHRoPSI4NTUiIGhlaWdodD0iODQ2Ii8+DQotICAgIDwvY2hpbGRyZW4+DQotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlN0cmluZ1ZhbHVlU3R5bGUiIHhtaTppZD0iX280aUNJY1hRRWVXd3hfcHVIRHpGWXciIG5hbWU9ImRpYWdyYW1fY29tcGF0aWJpbGl0eV92ZXJzaW9uIiBzdHJpbmdWYWx1ZT0iMS4yLjAiLz4NCi0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9vNGlDSXNYUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgIDxzdHlsZXMgeG1pOnR5cGU9InN0eWxlOlBhcHlydXNWaWV3U3R5bGUiIHhtaTppZD0iX280aUNJOFhRRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgIDxvd25lciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19iblJBVU1YUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGNvbmZpZ3VyYXRpb24geG1pOnR5cGU9ImNvbmZpZ3VyYXRpb246UGFweXJ1c0RpYWdyYW0iIGhyZWY9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLnNpbWV4L2NvbmZpZy9zaW1leC5jb25maWd1cmF0aW9uI19WZXJLTUdBeUVlV0F0WWVZY2Nuak9BIi8+DQotICAgIDwvc3R5bGVzPg0KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19iblJBVU1YUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9zNXlKb01YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X0VkZ2UiIHNvdXJjZT0iX2p6cVNvTVhURWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX0p2RUlVTVhURWVXd3hfcHVIRHpGWXciPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3M1eUpvOFhURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfczV5SnBNWFRFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3M1eUpwY1hURWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfczV5SnBzWFRFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3M1eUpwOFhURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfU2VsZWN0aW9uTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zNXlKcU1YVEVlV3d4X3B1SER6Rll3IiB4PSIyMCIgeT0iNDAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3M1eXdzTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfVHJhbnNmb3JtYXRpb25MYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3M1eXdzY1hURWVXd3hfcHVIRHpGWXciIHg9Ii0yMCIgeT0iLTYwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9zNXl3c3NYVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X0tleXdvcmRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3M1eXdzOFhURWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfczV5d3RNWFRFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfR3VhcmRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3M1eXd0Y1hURWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9zNXl3dHNYVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3M1eXd0OFhURWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9zNXlKb2NYVEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19zNWk1RU1YVEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfczV5Sm9zWFRFZVd3eF9wdUhEekZZdyIgcG9pbnRzPSJbMTYwLCAyNDksIC02NDM5ODQsIC02NDM5ODRdJFsyMjUsIDI0NywgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfckpMVHNNNVBFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjgxMjUsMC43NSkiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfczZldE1NWFRFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjA2MjUsMC42ODc1KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfdXBTX2NNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19FZGdlIiBzb3VyY2U9Il9sMDdtME1YVEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9KdkV2WWNYVEVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il91cFRtZ01YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3VwVG1nY1hURWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il91cFRtZ3NYVEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3VwVG1nOFhURWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il91cFRtaE1YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1NlbGVjdGlvbkxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdXBUbWhjWFRFZVd3eF9wdUhEekZZdyIgeD0iMjAiIHk9IjQwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il91cFRtaHNYVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1RyYW5zZm9ybWF0aW9uTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91cFRtaDhYVEVlV3d4X3B1SER6Rll3IiB4PSItMjAiIHk9Ii02MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfdXBUbWlNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19LZXl3b3JkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91cFRtaWNYVEVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3VwVU5rTVhURWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91cFVOa2NYVEVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfdXBVTmtzWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91cFVOazhYVEVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfdXBTX2NjWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfdXBBRWdNWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3VwU19jc1hURWVXd3hfcHVIRHpGWXciIHBvaW50cz0iWzE2MSwgMjk1LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjI1LCAyOTMsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3Bzc3VvTTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC45Mzc1LDAuNjI1KSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il91cUROWU1YVEVlV3d4X3B1SER6Rll3IiBpZD0iKDAuMTI1LDAuNDM3NSkiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX1dPMXcwTVhWRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0VkZ2UiIHNvdXJjZT0iX013UDIwTVhTRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX3hySFNBTVhRRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1dPMlg0TVhWRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1dPMlg0Y1hWRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9XTzJYNHNYVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1dPMlg0OFhWRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9XTzJYNU1YVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfV08yWDVjWFZFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1dPMlg1c1hWRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1dPMlg1OFhWRWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9XTzF3MGNYVkVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfV09YUHNNWFZFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1dPMXcwc1hWRWVXd3hfcHVIRHpGWXciIHBvaW50cz0iWzQ0MiwgNzMsIC02NDM5ODQsIC02NDM5ODRdJFs0NDIsIDExMSwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfV1AwQk1NWFZFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjQ1LDAuOTUpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1dQMG9RTVhWRWVXd3hfcHVIRHpGWXciIGlkPSIoMC40OTYsMC4wNDI1NTMxOTE0ODkzNjE3KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfYzZvVFlNWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfRWRnZSIgc291cmNlPSJfeHJIU0FNWFFFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfYmZPWFFNWFRFZVd3eF9wdUhEekZZdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfYzZvNmNNWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il94TkNjb01YVkVlV3d4X3B1SER6Rll3IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYzZvNmNjWFZFZVd3eF9wdUhEekZZdyIgeD0iLTUiIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9jNm82Y3NYVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfeE5sMlFNWFZFZVd3eF9wdUhEekZZdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2M2bzZjOFhWRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9jNm82ZE1YVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il94T0ZsZ01YVkVlV3d4X3B1SER6Rll3IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYzZvNmRjWFZFZVd3eF9wdUhEekZZdyIgeD0iNSIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2M2bzZkc1hWRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfeE90M29NWFZFZVd3eF9wdUhEekZZdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2M2bzZkOFhWRWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9jNm9UWWNYVkVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfYzZKeVFNWFZFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2M2b1RZc1hWRWVXd3hfcHVIRHpGWXciIHBvaW50cz0iWzQzNywgMTUyLCAtNjQzOTg0LCAtNjQzOTg0XSRbNDM3LCAxODcsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2M3WklZTVhWRWVXd3hfcHVIRHpGWXciIGlkPSIoMC40OTYsMC45MTQ4OTM2MTcwMjEyNzY2KSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9jN1pJWWNYVkVlV3d4X3B1SER6Rll3IiBpZD0iKDAuNDk2NTc1MzQyNDY1NzUzNCwwLjApIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9kY2tpME1YVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19FZGdlIiBzb3VyY2U9Il9iZk9YUU1YVEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il94NlJ2WU1YUUVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9kY2tpMDhYVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX3hMQzRrTVhWRWVXd3hfcHVIRHpGWXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9kY2tpMU1YVkVlV3d4X3B1SER6Rll3IiB4PSI0IiB5PSIxOCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZGNraTFjWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfV2VpZ2h0TGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX3hMb3VjTVhWRWVXd3hfcHVIRHpGWXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9kY2tpMXNYVkVlV3d4X3B1SER6Rll3IiB4PSIyIiB5PSItMTciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2Rja2kxOFhWRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX3hNQy1JTVhWRWVXd3hfcHVIRHpGWXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9kY2tpMk1YVkVlV3d4X3B1SER6Rll3IiB4PSI2IiB5PSIxOCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZGNraTJjWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il94TWNtd01YVkVlV3d4X3B1SER6Rll3IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZGNraTJzWFZFZVd3eF9wdUhEekZZdyIgeD0iLTEiIHk9Ii0xOCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9kY2tpMGNYVkVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfZGNIUDBNWFZFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2Rja2kwc1hWRWVXd3hfcHVIRHpGWXciIHBvaW50cz0iWzQzMiwgMzIyLCAtNjQzOTg0LCAtNjQzOTg0XSRbNDM2LCAzNTcsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2RkV2w4TVhWRWVXd3hfcHVIRHpGWXciIGlkPSIoMC40OTY1NzUzNDI0NjU3NTM0LDEuMCkiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfZGRXbDhjWFZFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjQ4ODc2MTkwNDc2MTkwNTA2LDAuMDQyNTUzMTkxNDg5MzYxNykiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX0ZJTERjTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfRWRnZSIgc291cmNlPSJfcnhHR2NNWFhFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfbUppQkFNWFhFZVd3eF9wdUhEekZZdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfRklMRGM4WFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9GSUxEZE1YWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfRklMRGRjWFlFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfV2VpZ2h0TGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9GSUxEZHNYWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfRklMcWdNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19TZWxlY3Rpb25MYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ZJTHFnY1hZRWVXd3hfcHVIRHpGWXciIHg9IjIwIiB5PSI0MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfRklMcWdzWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19UcmFuc2Zvcm1hdGlvbkxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRklMcWc4WFlFZVd3eF9wdUhEekZZdyIgeD0iLTIwIiB5PSItNjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0ZJTHFoTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfS2V5d29yZExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRklMcWhjWFlFZVd3eF9wdUhEekZZdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9GSUxxaHNYWUVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRklMcWg4WFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0ZJTHFpTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRklMcWljWFlFZVd3eF9wdUhEekZZdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ZJTERjY1hZRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0ZIclVNTVhZRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9GSUxEY3NYWUVlV3d4X3B1SER6Rll3IiBwb2ludHM9IlsxNTcsIDQ4MywgLTY0Mzk4NCwgLTY0Mzk4NF0kWzIyNywgNDc2LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9vbTlPa001UEVlV2FScG9kUjFTNldBIiBpZD0iKDAuODEyNSwwLjY4NzUpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3BGVk1vTTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC4wLDAuNzUpIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9IR0RGWU1YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X0VkZ2UiIHNvdXJjZT0iX3VJeTlvTVhYRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX21KaW9Fc1hYRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0hHREZZOFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdERlpNWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0hHREZaY1hZRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdERlpzWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0hHREZaOFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfU2VsZWN0aW9uTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0RGYU1YWUVlV3d4X3B1SER6Rll3IiB4PSIyMCIgeT0iNDAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0hHREZhY1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfVHJhbnNmb3JtYXRpb25MYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHREZhc1hZRWVXd3hfcHVIRHpGWXciIHg9Ii0yMCIgeT0iLTYwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9IR0RGYThYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X0tleXdvcmRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHREZiTVhZRWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSEdERmJjWFlFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfR3VhcmRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHREZic1hZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9IR0RGYjhYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHREZjTVhZRWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9IR0RGWWNYWUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19IRm8xc01YWUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdERllzWFlFZVd3eF9wdUhEekZZdyIgcG9pbnRzPSJbMTY1LCA1MjksIC02NDM5ODQsIC02NDM5ODRdJFsyMjIsIDUyOSwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfbkRhX1FNNVBFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjkzNzUsMC42MjUpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX25iQV80TTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC4xMjUsMC42ODc1KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfS2x4N29NWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19FZGdlIiBzb3VyY2U9Il80bmFSa01YWEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il95MjY1b01YWEVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9LbHlpc01YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0tseWlzY1hZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9LbHlpc3NYWUVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0tseWlzOFhZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9LbHlpdE1YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1NlbGVjdGlvbkxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfS2x5aXRjWFlFZVd3eF9wdUhEekZZdyIgeD0iMjAiIHk9IjQwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9LbHlpdHNYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1RyYW5zZm9ybWF0aW9uTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LbHlpdDhYWUVlV3d4X3B1SER6Rll3IiB4PSItMjAiIHk9Ii02MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS2x5aXVNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19LZXl3b3JkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LbHlpdWNYWUVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0tseWl1c1hZRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LbHlpdThYWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS2x5aXZNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LbHlpdmNYWUVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfS2x4N29jWFlFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfS2xZNkVNWFlFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0tseDdvc1hZRWVXd3hfcHVIRHpGWXciIHBvaW50cz0iWzE1NywgNzQ3LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjI3LCA3NDAsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2x6a2c4TTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC45Mzc1LDAuNDM3NSkiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfbU1oTWNNNVBFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjA2MjUsMC41NjI1KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfTVREODBNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19FZGdlIiBzb3VyY2U9Il82MXhta01YWEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il95Mjdnc01YWEVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9NVEQ4MDhYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX01URDgxTVhZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9NVEQ4MWNYWUVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX01URDgxc1hZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9NVEQ4MThYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1NlbGVjdGlvbkxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTVREODJNWFlFZVd3eF9wdUhEekZZdyIgeD0iMjAiIHk9IjQwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9NVEQ4MmNYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1RyYW5zZm9ybWF0aW9uTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NVEQ4MnNYWUVlV3d4X3B1SER6Rll3IiB4PSItMjAiIHk9Ii02MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTVREODI4WFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19LZXl3b3JkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NVEQ4M01YWUVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX01URDgzY1hZRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NVEQ4M3NYWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTVREODM4WFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NVEQ4NE1YWUVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfTVREODBjWFlFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfTVNuUTRNWFlFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX01URDgwc1hZRWVXd3hfcHVIRHpGWXciIHBvaW50cz0iWzE2MCwgNzg5LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjI2LCA3OTYsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2pveGRVTTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC45Mzc1LDAuNDM3NSkiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfa1Y3ZVFNNVBFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjA2MjUsMC41NjI1KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfUHo5M3dNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfRWRnZSIgc291cmNlPSJfeDZSdllNWFFFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfaWJRX2dNWFhFZVd3eF9wdUhEekZZdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUHo5M3c4WFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUHo5M3hNWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1B6OTN4Y1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUHo5M3hzWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1B6OTN4OFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9QejkzeU1YWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUHo5M3ljWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUHo5M3lzWFlFZVd3eF9wdUhEekZZdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX1B6OTN3Y1hZRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19Qemdrd01YWUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUHo5M3dzWFlFZVd3eF9wdUhEekZZdyIgcG9pbnRzPSJbMjQwLCAzOTgsIC02NDM5ODQsIC02NDM5ODRdJFsyNDAsIDQzMCwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfUDB4SkFNWFlFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjQ3ODQzNDc4MjYwODY5NTc2LDAuOTE0ODkzNjE3MDIxMjc2NikiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfUDB4SkFjWFlFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjQ3NjM5OTY0MjY0NDQzMTMsMC4wKSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfUVpNcndNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfRWRnZSIgc291cmNlPSJfaWJRX2dNWFhFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfeUlQNThNWFFFZVd3eF9wdUhEekZZdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUVpNcnc4WFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUVpNcnhNWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1FaTXJ4Y1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUVpNcnhzWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1FaTXJ4OFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RWk1yeU1YWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUVpNcnljWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUVpNcnlzWFlFZVd3eF9wdUhEekZZdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX1FaTXJ3Y1hZRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19RWXZfME1YWUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUVpNcndzWFlFZVd3eF9wdUhEekZZdyIgcG9pbnRzPSJbMjM4LCA1NjUsIC02NDM5ODQsIC02NDM5ODRdJFsyNDEsIDYwMCwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfUVpfOUFNWFlFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjQ3OTQ1MjA1NDc5NDUyMDUsMS4wKSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9RWl85QWNYWUVlV3d4X3B1SER6Rll3IiBpZD0iKDAuNDg3MzA0MzQ3ODI2MDg3LDAuMDQyNTUzMTkxNDg5MzYxNykiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX1F5emVrTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0VkZ2UiIHNvdXJjZT0iX3lJUDU4TVhRRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX3hHVFFrTVhYRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1F5MEZvTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1F5MEZvY1hZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9ReTBGb3NYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1F5MEZvOFhZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9ReTBGcE1YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUXkwRnBjWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1F5MEZwc1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1F5MEZwOFhZRWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9ReXpla2NYWUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfUXlZbjBNWFlFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1F5emVrc1hZRWVXd3hfcHVIRHpGWXciIHBvaW50cz0iWzI0MiwgNjQxLCAtNjQzOTg0LCAtNjQzOTg0XSRbMjQwLCA2ODksIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1F6blc0TVhZRWVXd3hfcHVIRHpGWXciIGlkPSIoMC40OTMyNDU5MDE2MzkzNDQzLDAuOTE0ODkzNjE3MDIxMjc2NikiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfUXpuVzRjWFlFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjQ4Mjg3NjcxMjMyODc2NzEsMC4wKSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfUlRTVmNNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfRWRnZSIgc291cmNlPSJfeEdUUWtNWFhFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfaGRIQUVNWFZFZVd3eF9wdUhEekZZdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUlRTVmM4WFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUlRTVmRNWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1JUU1ZkY1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUlRTVmRzWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1JUU1ZkOFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9SVFNWZU1YWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUlRTVmVjWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUlRTVmVzWFlFZVd3eF9wdUhEekZZdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX1JUU1ZjY1hZRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19SUzFDY01YWUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUlRTVmNzWFlFZVd3eF9wdUhEekZZdyIgcG9pbnRzPSJbMzkzLCA3NTEsIC02NDM5ODQsIC02NDM5ODRdJFs0NDQsIDc1MSwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfUlVrSDBNWFlFZVd3eF9wdUhEekZZdyIgaWQ9IigxLjAsMC40NjU2NzE2NDE3OTEwNDUxNCkiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfUlVrSDBjWFlFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjA3NzQwNzQwNzQwNzQwNjQ4LDAuNjU0ODE0ODE0ODE0ODEzKSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgPC9ub3RhdGlvbjpEaWFncmFtPg0KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfRTBEaGNNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iUGFweXJ1c1VNTEFjdGl2aXR5RGlhZ3JhbSIgbmFtZT0iQzIgQ2xhc3NpZmllciBCZWhhdmlvciBkaWFncmFtIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4NCi0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfRTBEaGNjYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMjAwMSI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfRTBEaGNzYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTAwMSIvPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfRTBEaGRNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNzAwMSI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX0UwRGhkY2FFRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9FMERoZHNhRUVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9FMERoZDhhRUVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0UwRGhlTWFFRWVXZkZkbnYyNkVmdWciIHR5cGU9IjcwMDIiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9FMERoZWNhRUVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfRTBEaGVzYUVFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRTBEaGU4YUVFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9FMERoZk1hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI3MDAzIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfRTBEaGZjYUVFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX0UwRGhmc2FFRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0UwRGhmOGFFRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfRTBEaGdNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNzAwNCI+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9ObU9oc01hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDgwIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTm1QSXdNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTEzOCIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbW1lbnQiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX05tS1FRTWFFRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTm1PaHNjYUVFZVdmRmRudjI2RWZ1ZyIgeD0iNDI2IiB5PSIzMSIvPg0KLSAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3ROT2tvTWFFRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwNjMiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfeUlrZFFNYUVFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il95SWxFVU1hRUVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il90Tk9rbzhhRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MDc4Ii8+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3ROUExzTWFFRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUwNzkiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdE5QTHNjYUVFZVdmRmRudjI2RWZ1ZyIgeD0iOTIiIHk9IjE0Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3ROUExzc2FFRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMTUiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdE5QTHM4YUVFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il90TlBMdE1hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDQwIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3ROUEx0Y2FFRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il90TmNuRU1hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il90TmNuRWNhRUVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdE5jbkVzYUVFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il90Tk9rb2NhRUVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3ROSWVBTWFFRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdE5Pa29zYUVFZVdmRmRudjI2RWZ1ZyIgeD0iMTUxIiB5PSIxMjEiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il8tSGdVY01hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDYzIj4NCi0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0IxMFpRTWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfQjEwWlFjYUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfLUhnN2dNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTA3OCIvPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8tSGc3Z2NhRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MDc5Ij4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1IZzdnc2FFRWVXZkZkbnYyNkVmdWciIHg9IjkxIiB5PSIxNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8tSGc3ZzhhRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTE1Ij4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1IZzdoTWFFRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfLUhoaWtNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjA0MCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tSGhpa2NhRUVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfLUhtYkVNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfLUhtYkVjYUVFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXy1IbWJFc2FFRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfLUhnVWNjYUVFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI185bm1zWU1hRUVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXy1IZ1Vjc2FFRWVXZkZkbnYyNkVmdWciIHg9IjE1MSIgeT0iMzU4Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSVRKcEVNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzAwNCI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0lUS1FJTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMzQiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSVRLUUljYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9JVEtRSXNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MDgwIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0lUS1FJOGFGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfSVRKcEVjYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkluaXRpYWxOb2RlIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19JVEM3WU1hRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lUSnBFc2FGRWVXZkZkbnYyNkVmdWciIHg9IjIwNCIgeT0iNTAiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9LaWxWRU1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDY1Ij4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS2lsVkU4YUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTExNyIvPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0tpbFZGTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjcwMDUiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX1E0NmxBTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwODEiPg0KLSAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX1E2SlVFTWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1E2SlVFY2FGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUTQ2bEE4YUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTEzOSIvPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUTQ2bEJNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAyNSI+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUTQ2bEJjYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfUTVCNXdNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX1E1QjV3Y2FGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUTVCNXdzYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX1E1REg0TWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwODQiPg0KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfUTZKVUVzYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9RNkpVRThhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9RNURINDhhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNTE0NCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RNURINU1hRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1E1REg1Y2FGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNDUiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUTVESDVzYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9RNURINGNhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19RNHlDSU1hRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1E1REg0c2FGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9RNDZsQWNhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlJlYWRTZWxmQWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19RNG1iOE1hRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9RNDZsQXNhRkVlV2ZGZG52MjZFZnVnIiB4PSIxMiIgd2lkdGg9IjI4Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9TdDV3c01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDc2Ij4NCi0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9TdkRBTU1hRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9TdkRBTWNhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1N0NXdzOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMjYiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1N0NXd0TWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMjYiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1N0NXd0Y2FGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX1N1QnNnTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9ImNvbXBhcnRtZW50X3NoYXBlX2Rpc3BsYXkiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9TdUJzZ2NhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1N1QnNnc2FGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9TdUNUa01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDc3Ij4NCi0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX1N2REFNc2FGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfU3ZEQU04YUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfU3VDVGs4YUZFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjUxMjQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfU3VDNm9NYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9TdUM2b2NhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTI1Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1N1QzZvc2FGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfU3VDVGtjYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfU3R1S2dNYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9TdUNUa3NhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfU3Q1d3NjYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX1N0cnVRTWFGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1N0NXdzc2FGRWVXZkZkbnYyNkVmdWciIHg9IjEyIiB5PSI0MyIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfWkUtQWNNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA5MSI+DQotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfWkt1cU1NYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfWkt1cU1jYUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9aRS1BYzhhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTYwIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9aRS1uZ01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDE5Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9aRS1uZ2NhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9aRkxiME1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfWkZMYjBjYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9aRkxiMHNhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfWklEd3NNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA5MiI+DQotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9aS3VxTXNhRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1pLdXFNOGFGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1pJRHdzOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNTQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfWklEd3RNYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMTgiIHk9Ii0yIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1pJRVh3TWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfWklFWHdjYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9aSUR3c2NhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX1pFeWFRTWFGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfWklEd3NzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iLTE1IiB5PSIxMiIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX1pJRVh3c2FGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwOTMiPg0KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfWkt1cU5NYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9aS3VxTmNhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9aSUVYeGNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTU2Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1pJRVh4c2FGRWVXZkZkbnYyNkVmdWciIHg9IjIxIiB5PSItMiIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9aSUUtME1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTU3Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1pJRS0wY2FGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfWklFWHc4YUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19aRTNTd01hRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1pJRVh4TWFGRWVXZkZkbnYyNkVmdWciIHg9Ii0xNSIgeT0iNTIiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9aSUUtMHNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDk0Ij4NCi0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX1pLdXFOc2FGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfWkt1cU44YUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfWklFLTFjYUZFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjUxNTgiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfWklFLTFzYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9aSUUtMThhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTU5Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1pJRS0yTWFGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfWklFLTA4YUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfWkUwMmdNYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9aSUUtMU1hRkVlV2ZGZG52MjZFZnVnIiB4PSI4NiIgeT0iMjgiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9aRS1BY2NhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX1pFcDNZTWFGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1pFLUFjc2FGRWVXZkZkbnYyNkVmdWciIHg9IjExOSIgeT0iNyIgd2lkdGg9Ijg3IiBoZWlnaHQ9Ijc1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9LaWxWRmNhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0tpbFZFY2FGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19LaVlnd01hRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0tpbFZFc2FGRWVXZkZkbnYyNkVmdWciIHg9Ijg2IiB5PSIyMDQiIHdpZHRoPSIyNTUiIGhlaWdodD0iMTI0Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfTGFlbVlNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA2NSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xhZW1ZOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMTciLz4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9MYWVtWk1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI3MDA1Ij4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9mVW9Bb01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDgxIj4NCi0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9mVndDQU1hRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9mVndDQWNhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2ZVb0FvOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMzkiLz4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2ZVb0FwTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMjUiPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2ZVb0FwY2FGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX2ZVem0wTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9ImNvbXBhcnRtZW50X3NoYXBlX2Rpc3BsYXkiPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9mVXptMGNhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2ZVem0wc2FGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9mVTBONE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDg0Ij4NCi0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX2ZWd0NBc2FGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfZlZ3Q0E4YUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZlUwTjQ4YUZFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjUxNDQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZlUwTjVNYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9mVTBONWNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTQ1Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2ZVME41c2FGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfZlUwTjRjYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfZlVUM2tNYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9mVTBONHNhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfZlVvQW9jYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpSZWFkU2VsZkFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfZlVTcGNNYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZlVvQW9zYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMTIiIHk9IjIiIHdpZHRoPSIyOCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfaENoczRNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA3NiI+DQotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfaEQ0LTBNYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfaEQ0LTBjYUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9oQ2lUOE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTI2Ii8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9oQ2lUOGNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDI2Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oQ2lUOHNhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9oQ3l5b01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfaEN5eW9jYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oQ3l5b3NhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfaEN6WnNNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA3NyI+DQotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9oRDQtMHNhRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX2hENC0wOGFGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2hDelpzOGFGRWVXZkZkbnYyNkVmdWciIHZpc2libGU9ImZhbHNlIiB0eXBlPSI1MTI0Ij4NCi0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hDelp0TWFGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfaEN6WnRjYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTEyNSI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oQ3padHNhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2hDelpzY2FGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX2hDUW5JTWFGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaEN6WnNzYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2hDaHM0Y2FGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19oQ1BaQU1hRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oQ2hzNHNhRkVlV2ZGZG52MjZFZnVnIiB4PSIxMiIgeT0iNTAiIHdpZHRoPSIyOCIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfcDRqNWNNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA5MSI+DQotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfcDYwalFNYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfcDYwalFjYUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9wNGxIa01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTYwIi8+DQotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9wNGxIa2NhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDE5Ij4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9wNGxIa3NhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9wNDdzNE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfcDQ3czRjYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9wNDdzNHNhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfcDQ4VDhNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA5MiI+DQotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9wNjBqUXNhRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3A2MGpROGFGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3A0OFQ4OGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNTQiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcDQ4VDlNYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMjAiIHk9Ii0zIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3A0OFQ5Y2FGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNTUiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcDQ4VDlzYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9wNDhUOGNhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3A0WTZVTWFGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcDQ4VDhzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iLTE1IiB5PSI5Ii8+DQotICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfcDQ4N0FNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA5MyI+DQotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9wNjBqUk1hRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3A2MGpSY2FGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3A0ODdBOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNTYiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcDQ4N0JNYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMjIiIHk9Ii0yIi8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3A0ODdCY2FGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNTciPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcDQ4N0JzYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9wNDg3QWNhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3A0Z1BFTWFGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcDQ4N0FzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iLTE1IiB5PSI1MyIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3A0ODdCOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwOTQiPg0KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfcDYwalJzYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9wNjBqUjhhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9wNDg3Q3NhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNTE1OCI+DQotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9wNDg3QzhhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+DQotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3A0ODdETWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNTkiPg0KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcDQ4N0RjYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9wNDg3Q01hRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19wNGF2Z01hRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3A0ODdDY2FGRWVXZkZkbnYyNkVmdWciIHg9Ijg2IiB5PSIyOCIvPg0KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3A0ajVjY2FGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfcDRWUDhNYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcDRqNWNzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMTE5IiB5PSI5IiB3aWR0aD0iODciIGhlaWdodD0iNzUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0xhZW1aY2FGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfTGFlbVljYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0xhVG5RTWFGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTGFlbVlzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iODUiIHk9IjQ0MyIgd2lkdGg9IjI1OCIgaGVpZ2h0PSIxMzIiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9Lcmxxb01hR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDA1Ij4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS3JscW84YUdFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjYwMzMiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfS3JscXBNYUdFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9LcmxxcGNhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MDgxIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0tybHFwc2FHRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfS3JscW9jYUdFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjdGl2aXR5RmluYWxOb2RlIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19Lckt6NE1hR0VlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0tybHFvc2FHRWVXZkZkbnYyNkVmdWciIHg9IjM5MiIgeT0iNTA2Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRTBEaGdjYUVFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfQnhVSk1NYUVFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0UwRGhnc2FFRWVXZkZkbnYyNkVmdWciIHdpZHRoPSI4NzgiIGhlaWdodD0iNTc5Ii8+DQotICAgIDwvY2hpbGRyZW4+DQotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlN0cmluZ1ZhbHVlU3R5bGUiIHhtaTppZD0iX0UwRGhnOGFFRWVXZkZkbnYyNkVmdWciIG5hbWU9ImRpYWdyYW1fY29tcGF0aWJpbGl0eV92ZXJzaW9uIiBzdHJpbmdWYWx1ZT0iMS4xLjAiLz4NCi0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9FMERoaE1hRUVlV2ZGZG52MjZFZnVnIi8+DQotICAgIDxzdHlsZXMgeG1pOnR5cGU9InN0eWxlOlBhcHlydXNWaWV3U3R5bGUiIHhtaTppZD0iX0UwRGhoY2FFRWVXZkZkbnYyNkVmdWciPg0KLSAgICAgIDxvd25lciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19CeFVKTU1hRUVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgPGNvbmZpZ3VyYXRpb24geG1pOnR5cGU9ImNvbmZpZ3VyYXRpb246UGFweXJ1c0RpYWdyYW0iIGhyZWY9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLnNpbWV4L2NvbmZpZy9zaW1leC5jb25maWd1cmF0aW9uI19WZXJLTUdBeUVlV0F0WWVZY2Nuak9BIi8+DQotICAgIDwvc3R5bGVzPg0KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19CeFVKTU1hRUVlV2ZGZG52MjZFZnVnIi8+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il8wUVBlOE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI0MDAzIiBzb3VyY2U9Il9RNURINE1hRkVlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il9aSUR3c01hRkVlV2ZGZG52MjZFZnVnIj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wUVBlODhhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDAxIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMFFQZTlNYUZFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzBRUGU5Y2FGRWVXZkZkbnYyNkVmdWciIHZpc2libGU9ImZhbHNlIiB0eXBlPSI2MDAyIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMFFRR0FNYUZFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzBRUUdBY2FGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDUiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wUVFHQXNhRkVlV2ZGZG52MjZFZnVnIiB4PSIyMCIgeT0iNDAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzBRUUdBOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDYiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wUVFHQk1hRkVlV2ZGZG52MjZFZnVnIiB4PSItMjAiIHk9Ii02MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMFFRR0JjYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwNyI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzBRUUdCc2FGRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMFFRR0I4YUZFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjYwMDgiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wUVFHQ01hRkVlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMFFRR0NjYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAxMCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzBRUUdDc2FGRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il8wUVBlOGNhRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI18wUDQ1b01hRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfMFFQZThzYUZFZVdmRmRudjI2RWZ1ZyIgcG9pbnRzPSJbMTUwLCAyOTMsIC02NDM5ODQsIC02NDM5ODRdJFsxOTksIDI5MCwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfN3ZsRlFNNVBFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjgxMjUsMC41NjI1KSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il8wUTVtUU1hRkVlV2ZGZG52MjZFZnVnIiBpZD0iKDAuMTg3NSwwLjI1KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfMG9YRUFNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNDAwMyIgc291cmNlPSJfU3VDVGtNYUZFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfWklFWHdzYUZFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMG9YRUE4YUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwMSI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzBvWEVCTWFGRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wb1hFQmNhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNjAwMiI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzBvWEVCc2FGRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wb1hFQjhhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA1Ij4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMG9YRUNNYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMjAiIHk9IjQwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wb1hFQ2NhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA2Ij4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMG9YRUNzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iLTIwIiB5PSItNjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzBvWEVDOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDciPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wb1hFRE1hRkVlV2ZGZG52MjZFZnVnIiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzBvWEVEY2FGRWVXZkZkbnYyNkVmdWciIHZpc2libGU9ImZhbHNlIiB0eXBlPSI2MDA4Ij4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMG9YRURzYUZFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzBvWEVEOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMTAiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wb1hFRU1hRkVlV2ZGZG52MjZFZnVnIiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfMG9YRUFjYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfMG9DVDRNYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzBvWEVBc2FGRWVXZkZkbnYyNkVmdWciIHBvaW50cz0iWzE1MCwgMzM0LCAtNjQzOTg0LCAtNjQzOTg0XSRbMTk5LCAzMzQsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iXzg3ZmV3TTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC44MTI1LDAuNjI1KSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il8wcENaY01hRkVlV2ZGZG52MjZFZnVnIiBpZD0iKDAuMTI1LDAuNjI1KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfMC1mc0VNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNDAwMyIgc291cmNlPSJfZlUwTjRNYUZFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfcDQ4VDhNYUZFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMC1mc0U4YUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwMSI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzAtZnNGTWFGRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wLWZzRmNhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNjAwMiI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzAtZnNGc2FGRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wLWZzRjhhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA1Ij4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMC1mc0dNYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMjAiIHk9IjQwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wLWZzR2NhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA2Ij4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMC1mc0dzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iLTIwIiB5PSItNjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzAtZnNHOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDciPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wLWZzSE1hRkVlV2ZGZG52MjZFZnVnIiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzAtZnNIY2FGRWVXZkZkbnYyNkVmdWciIHZpc2libGU9ImZhbHNlIiB0eXBlPSI2MDA4Ij4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMC1mc0hzYUZFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzAtZnNIOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMTAiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wLWZzSU1hRkVlV2ZGZG52MjZFZnVnIiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfMC1mc0VjYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfMC1LNzhNYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzAtZnNFc2FGRWVXZkZkbnYyNkVmdWciIHBvaW50cz0iWzE1MCwgNTMxLCAtNjQzOTg0LCAtNjQzOTg0XSRbMjA0LCA1MjcsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iXy01djdNTTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC44NzUsMC41KSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9fU1BUc001UEVlV2FScG9kUjFTNldBIiBpZD0iKDAuMTI1LDAuNDM3NSkiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iXzFiZnhJTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjQwMDMiIHNvdXJjZT0iX2hDelpzTWFGRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX3A0ODdBTWFGRWVXZkZkbnYyNkVmdWciPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzFiZ1lNTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDEiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8xYmdZTWNhRkVlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMWJnWU1zYUZFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjYwMDIiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8xYmdZTThhRkVlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMWJnWU5NYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwNSI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzFiZ1lOY2FGRWVXZkZkbnYyNkVmdWciIHg9IjIwIiB5PSI0MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMWJnWU5zYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwNiI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzFiZ1lOOGFGRWVXZkZkbnYyNkVmdWciIHg9Ii0yMCIgeT0iLTYwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8xYmdZT01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA3Ij4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMWJnWU9jYUZFZVdmRmRudjI2RWZ1ZyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8xYmdZT3NhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNjAwOCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzFiZ1lPOGFGRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8xYmdZUE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDEwIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMWJnWVBjYUZFZVdmRmRudjI2RWZ1ZyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iXzFiZnhJY2FGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjXzFiTEJBTWFGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8xYmZ4SXNhRkVlV2ZGZG52MjZFZnVnIiBwb2ludHM9IlsxNTAsIDU3NiwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzIwNCwgNTcxLCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il8xY1Zlb01hRkVlV2ZGZG52MjZFZnVnIiBpZD0iKDAuMTg3NSwwLjM3NSkiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfQ0ltYzBNNVFFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjA2MjUsMC41KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfTXVIakVNYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNDAwNCIgc291cmNlPSJfSVRKcEVNYUZFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfdE5Pa29NYUVFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTXVIakU4YUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwMyI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX011SGpGTWFHRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9NdUhqRmNhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA0Ij4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTXVIakZzYUdFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX011SGpGOGFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDkiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NdUhqR01hR0VlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTXVIakdjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAxMSI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX011SGpHc2FHRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9NdUhqRWNhR0VlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfTXR1aGdNYUdFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX011SGpFc2FHRWVXZkZkbnYyNkVmdWciIHBvaW50cz0iWzIxNCwgMTA0LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjE0LCAxNTksIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX011eVJjTWFHRWVXZkZkbnYyNkVmdWciIGlkPSIoMC40NSwwLjkpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX011eVJjY2FHRWVXZkZkbnYyNkVmdWciIGlkPSIoMC40OTYsMC4wNDI1NTMxOTE0ODkzNjE3KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfTkxmYmtNYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNDAwNCIgc291cmNlPSJfdE5Pa29NYUVFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfS2lsVkVNYUZFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTkxmYms4YUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwMyI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX05MZ0NvTWFHRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9OTGdDb2NhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA0Ij4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTkxnQ29zYUdFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX05MZ0NvOGFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDkiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9OTGdDcE1hR0VlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTkxnQ3BjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAxMSI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX05MZ0Nwc2FHRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9OTGZia2NhR0VlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfTkxMNWtNYUdFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX05MZmJrc2FHRWVXZkZkbnYyNkVmdWciIHBvaW50cz0iWzIxNSwgMjAwLCAtNjQzOTg0LCAtNjQzOTg0XSRbMjE1LCAyNDAsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX05NRlJjTWFHRWVXZkZkbnYyNkVmdWciIGlkPSIoMC40NzkwNzY5MjMwNzY5MjMwNywwLjkxNDg5MzYxNzAyMTI3NjYpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX05NRlJjY2FHRWVXZkZkbnYyNkVmdWciIGlkPSIoMC40ODY3MjY5OTg0OTE3MDQzNywwLjApIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9OeUpMNE1hR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il9LaWxWRU1hRkVlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il8tSGdVY01hRUVlV2ZGZG52MjZFZnVnIj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9OeUpMNDhhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDAzIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9SLXFQb01hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTnlKTDVNYUdFZVdmRmRudjI2RWZ1ZyIgeD0iLTQiIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9OeUpMNWNhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA0Ij4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9SLS1Zc01hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTnlKTDVzYUdFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX055Skw1OGFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDkiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1JfUXNrTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9OeUpMNk1hR0VlV2ZGZG52MjZFZnVnIiB4PSI0IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTnlKTDZjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAxMSI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfUl9rT2tNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX055Skw2c2FHRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9OeUpMNGNhR0VlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfTnhiYU1NYUdFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX055Skw0c2FHRWVXZkZkbnYyNkVmdWciIHBvaW50cz0iWzIxMywgMzY0LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjE1LCAzOTAsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX055dzI4TWFHRWVXZkZkbnYyNkVmdWciIGlkPSIoMC40ODYyNzQ1MDk4MDM5MjE1NiwxLjApIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX055eGVBTWFHRWVXZkZkbnYyNkVmdWciIGlkPSIoMC40NzkxMzUxMzUxMzUxMzUyLDAuMDQyNTUzMTkxNDg5MzYxNykiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX09LdGM0TWFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjQwMDQiIHNvdXJjZT0iXy1IZ1VjTWFFRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX0xhZW1ZTWFGRWVXZkZkbnYyNkVmdWciPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX09LdGM0OGFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDMiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1I5V0JBTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9PS3RjNU1hR0VlV2ZGZG52MjZFZnVnIiB4PSItOCIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX09LdGM1Y2FHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDQiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1I5dDBjTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9PS3VEOE1hR0VlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfT0t1RDhjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwOSI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfUjlfaFFNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09LdUQ4c2FHRWVXZkZkbnYyNkVmdWciIHg9IjgiIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9PS3VEODhhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDExIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9SLVd0b01hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfT0t1RDlNYUdFZVdmRmRudjI2RWZ1ZyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX09LdGM0Y2FHRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19PS1dRZ01hR0VlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfT0t0YzRzYUdFZVdmRmRudjI2RWZ1ZyIgcG9pbnRzPSJbMjE1LCA0MjgsIC02NDM5ODQsIC02NDM5ODRdJFsyMTcsIDQ3OSwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfT0xXV0VNYUdFZVdmRmRudjI2RWZ1ZyIgaWQ9IigwLjQ4OCwwLjg1MTA2MzgyOTc4NzIzNCkiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfT0xXV0VjYUdFZVdmRmRudjI2RWZ1ZyIgaWQ9IigwLjQ5NDUzODQwNzMyOTEwNDksMC4wKSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfT243a1lNYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNDAwNCIgc291cmNlPSJfTGFlbVlNYUZFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfS3JscW9NYUdFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfT243a1k4YUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwMyI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfUEFpUm9NYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09uN2taTWFHRWVXZkZkbnYyNkVmdWciIHg9Ii0xOCIgeT0iMTkiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX09uN2taY2FHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDQiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1BBNkZFTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9PbjdrWnNhR0VlV2ZGZG52MjZFZnVnIiB4PSIxIiB5PSIxOCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfT244TGNNYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwOSI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfUEJUR29NYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09uOExjY2FHRWVXZkZkbnYyNkVmdWciIHg9IjE4IiB5PSIxOSIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfT244TGNzYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAxMSI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfUEJ0V1VNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09uOExjOGFHRWVXZkZkbnYyNkVmdWciIHg9IjIiIHk9Ii0xNyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9PbjdrWWNhR0VlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfT25oN3dNYUdFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX09uN2tZc2FHRWVXZkZkbnYyNkVmdWciIHBvaW50cz0iWzM0OCwgNTUyLCAtNjQzOTg0LCAtNjQzOTg0XSRbNDY1LCA1NTMsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX09vbTUwTWFHRWVXZkZkbnYyNkVmdWciIGlkPSIoMS4wLDAuNTU0MTk1ODA0MTk1ODAzNikiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfT29tNTBjYUdFZVdmRmRudjI2RWZ1ZyIgaWQ9IigwLjA1LDAuNTQ3NjkyMzA3NjkyMzA3MSkiLz4NCi0gICAgPC9lZGdlcz4NCi0gIDwvbm90YXRpb246RGlhZ3JhbT4NCi0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX1hRUWJzT3hQRWVXUDZlTl82WmNnbXciIHR5cGU9IlBhcHlydXNVTUxDbGFzc0RpYWdyYW0iIG5hbWU9IkV4YW1wbGVzIENsYXNzIERpYWdyYW0iIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPg0KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9hSzN5c094UEVlV1A2ZU5fNlpjZ213IiB0eXBlPSJDbGFzc19TaGFwZSI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfYUs1QTBPeFBFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ2xhc3NfTmFtZUxhYmVsIi8+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfYUs1QTBleFBFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ2xhc3NfRmxvYXRpbmdOYW1lTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9hSzVBMHV4UEVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX19QdE1NQ1FHRWVhQ3RacEQwQVRmQ3ciIHR5cGU9IkNsYXNzX0F0dHJpYnV0ZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX2VIRDdjT3hQRWVXUDZlTl82WmNnbXciIHR5cGU9IlByb3BlcnR5X0NsYXNzQXR0cmlidXRlTGFiZWwiPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTdHJpbmdMaXN0VmFsdWVTdHlsZSIgeG1pOmlkPSJfbXRDZFVPeFFFZVdQNmVOXzZaY2dtdyIgbmFtZT0ibWFza0xhYmVsIj4NCi0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPm11bHRpcGxpY2l0eTwvc3RyaW5nTGlzdFZhbHVlPg0KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+dmlzaWJpbGl0eTwvc3RyaW5nTGlzdFZhbHVlPg0KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+ZGVmYXVsdFZhbHVlPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5uYW1lPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT50eXBlPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5kZXJpdmVkPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgIDwvc3R5bGVzPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19lRzNISU94UEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZUhEN2NleFBFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX2ZQNGtzT3hQRWVXUDZlTl82WmNnbXciIHR5cGU9IlByb3BlcnR5X0NsYXNzQXR0cmlidXRlTGFiZWwiPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTdHJpbmdMaXN0VmFsdWVTdHlsZSIgeG1pOmlkPSJfUVFUbWNDUUhFZWFDdFpwRDBBVGZDdyIgbmFtZT0ibWFza0xhYmVsIj4NCi0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPm11bHRpcGxpY2l0eTwvc3RyaW5nTGlzdFZhbHVlPg0KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+dmlzaWJpbGl0eTwvc3RyaW5nTGlzdFZhbHVlPg0KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+ZGVmYXVsdFZhbHVlPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5uYW1lPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT50eXBlPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5kZXJpdmVkPC9zdHJpbmdMaXN0VmFsdWU+DQotICAgICAgICAgIDwvc3R5bGVzPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19mUHpGSU94UEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZlA1THdPeFBFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX2FLNW40ZXhQRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfYUs1bjR1eFBFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX2FLNW40LXhQRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2FLNW41T3hQRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfX1B0elFDUUdFZWFDdFpwRDBBVGZDdyIgdHlwZT0iQ2xhc3NfT3BlcmF0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfUVE3Y29PeFFFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT3BlcmF0aW9uX0NsYXNzT3BlcmF0aW9uTGFiZWwiPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfUVF2MmNPeFFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1FRN2NvZXhRRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9hSzVuNXV4UEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX2FLNW41LXhQRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9hSzVuNk94UEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9hSzVuNmV4UEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX19QdHpRU1FHRWVhQ3RacEQwQVRmQ3ciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJDbGFzc19OZXN0ZWRDbGFzc2lmaWVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfYUs1bjYteFBFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9hSzVuN094UEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfYUs1bjdleFBFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfYUs1bjd1eFBFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfYUt5Nk1PeFBFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2FLM3lzZXhQRWVXUDZlTl82WmNnbXciIHg9IjE5MyIgeT0iMTQ1IiB3aWR0aD0iMzM0IiBoZWlnaHQ9IjE2OSIvPg0KLSAgICA8L2NoaWxkcmVuPg0KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9iM3I1ME94UEVlV1A2ZU5fNlpjZ213IiB0eXBlPSJTdGVyZW90eXBlQ29tbWVudCI+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfYjNyNTBleFBFZVdQNmVOXzZaY2dtdyIgc2hvd1RpdGxlPSJ0cnVlIi8+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RU9iamVjdFZhbHVlU3R5bGUiIHhtaTppZD0iX2IzdHZBT3hQRWVXUDZlTl82WmNnbXciIG5hbWU9IkJBU0VfRUxFTUVOVCI+DQotICAgICAgICA8ZU9iamVjdFZhbHVlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX2FLeTZNT3hQRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICA8L3N0eWxlcz4NCi0gICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfYjNyNTB1eFBFZVdQNmVOXzZaY2dtdyIgeD0iNDU2IiB5PSIxMDYiLz4NCi0gICAgPC9jaGlsZHJlbj4NCi0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U3RyaW5nVmFsdWVTdHlsZSIgeG1pOmlkPSJfWFFRYnNleFBFZVdQNmVOXzZaY2dtdyIgbmFtZT0iZGlhZ3JhbV9jb21wYXRpYmlsaXR5X3ZlcnNpb24iIHN0cmluZ1ZhbHVlPSIxLjIuMCIvPg0KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtU3R5bGUiIHhtaTppZD0iX1hRUWJzdXhQRWVXUDZlTl82WmNnbXciLz4NCi0gICAgPHN0eWxlcyB4bWk6dHlwZT0ic3R5bGU6UGFweXJ1c1ZpZXdTdHlsZSIgeG1pOmlkPSJfWFFRYnMteFBFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgPG93bmVyIHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfLUpHeEVPeE9FZVdQNmVOXzZaY2dtdyIvPg0KLSAgICA8L3N0eWxlcz4NCi0gICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI18tSkd4RU94T0VlV1A2ZU5fNlpjZ213Ii8+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9iM3VXRU94UEVlV1A2ZU5fNlpjZ213IiB0eXBlPSJTdGVyZW90eXBlQ29tbWVudExpbmsiIHNvdXJjZT0iX2FLM3lzT3hQRWVXUDZlTl82WmNnbXciIHRhcmdldD0iX2IzcjUwT3hQRWVXUDZlTl82WmNnbXciPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfYjN1V0VleFBFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVPYmplY3RWYWx1ZVN0eWxlIiB4bWk6aWQ9Il9iM3VXRmV4UEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJCQVNFX0VMRU1FTlQiPg0KLSAgICAgICAgPGVPYmplY3RWYWx1ZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19hS3k2TU94UEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPC9zdHlsZXM+DQotICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2IzdVdFdXhQRWVXUDZlTl82WmNnbXciIHBvaW50cz0iWzAsIDAsIDAsIDBdJFswLCAwLCAwLCAwXSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9iM3VXRS14UEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2IzdVdGT3hQRWVXUDZlTl82WmNnbXciLz4NCi0gICAgPC9lZGdlcz4NCi0gIDwvbm90YXRpb246RGlhZ3JhbT4NCi0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lrSUJvT3hURWVXUDZlTl82WmNnbXciIHR5cGU9IlBhcHlydXNVTUxBY3Rpdml0eURpYWdyYW0iIG5hbWU9ImNvbXBhcmVfaW1wbCBkaWFncmFtIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4NCi0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSWtJQm9leFRFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWN0aXZpdHlfU2hhcGUiPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0lrSUJvdXhURWVXUDZlTl82WmNnbXciIHR5cGU9IkFjdGl2aXR5X05hbWVMYWJlbCIvPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfS3QzYUlDUWVFZWFvUWI1Sy1pRWVQUSIgdHlwZT0iQWN0aXZpdHlfUGFyYW1ldGVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9Ja0lCcGV4VEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfSWtJQnB1eFRFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWtJQnAteFRFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9LdDNhSVNRZUVlYW9RYjVLLWlFZVBRIiB0eXBlPSJBY3Rpdml0eV9QcmVjb25kaXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX0lrSUJxZXhURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9Ja0lCcXV4VEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9Ja0lCcS14VEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0t0NEJNQ1FlRWVhb1FiNUstaUVlUFEiIHR5cGU9IkFjdGl2aXR5X1Bvc3Rjb25kaXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX0lrSUJyZXhURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9Ja0lCcnV4VEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9Ja0lCci14VEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0t0NEJNU1FlRWVhb1FiNUstaUVlUFEiIHR5cGU9IkFjdGl2aXR5X0FjdGl2aXR5Tm9kZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX2I4QzRrT3hURWVXUDZlTl82WmNnbXciIHR5cGU9IkNhbGxCZWhhdmlvckFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX2I4RlUwT3hURWVXUDZlTl82WmNnbXciIHR5cGU9Ik91dHB1dFBpbl9DYWxsQmVoYXZpb3JBY3Rpb25SZXN1bHRTaGFwZSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfYjhGVTAteFRFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT3V0cHV0UGluX0NhbGxCZWhhdmlvckFjdGlvblJlc3VsdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2I4RlUxT3hURWVXUDZlTl82WmNnbXciIHg9Ii00MSIgeT0iMTIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2I4RlUxZXhURWVXUDZlTl82WmNnbXciIHR5cGU9Ik91dHB1dFBpbl9DYWxsQmVoYXZpb3JBY3Rpb25SZXN1bHRTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9iOEZVMXV4VEVlV1A2ZU5fNlpjZ213IiB4PSItMyIgeT0iMTgiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2I4RlUwZXhURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfYjctbklPeFRFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2I4RlUwdXhURWVXUDZlTl82WmNnbXciIHg9IjEwMiIgeT0iNTMiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfYjhFdHdPeFRFZVdQNmVOXzZaY2dtdyIgdHlwZT0iSW5wdXRQaW5fQ2FsbEJlaGF2aW9yQWN0aW9uQXJndW1lbnRTaGFwZSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfYjhFdHcteFRFZVdQNmVOXzZaY2dtdyIgdHlwZT0iSW5wdXRQaW5fQ2FsbEJlaGF2aW9yQWN0aW9uQXJndW1lbnROYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9iOEV0eE94VEVlV1A2ZU5fNlpjZ213IiB4PSIyMSIgeT0iLTIiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2I4RXR4ZXhURWVXUDZlTl82WmNnbXciIHR5cGU9IklucHV0UGluX0NhbGxCZWhhdmlvckFjdGlvbkFyZ3VtZW50U3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYjhFdHh1eFRFZVdQNmVOXzZaY2dtdyIgeT0iNSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfYjhFdHdleFRFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX2I3djlvT3hURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9iOEV0d3V4VEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX2I4RXR4LXhURWVXUDZlTl82WmNnbXciIHR5cGU9IklucHV0UGluX0NhbGxCZWhhdmlvckFjdGlvbkFyZ3VtZW50U2hhcGUiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2I4RXR5dXhURWVXUDZlTl82WmNnbXciIHR5cGU9IklucHV0UGluX0NhbGxCZWhhdmlvckFjdGlvbkFyZ3VtZW50TmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYjhFdHkteFRFZVdQNmVOXzZaY2dtdyIgeD0iMjYiIHk9Ii00Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9iOEV0ek94VEVlV1A2ZU5fNlpjZ213IiB0eXBlPSJJbnB1dFBpbl9DYWxsQmVoYXZpb3JBY3Rpb25Bcmd1bWVudFN0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2I4RXR6ZXhURWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2I4RXR5T3hURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19iNzdqME94VEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfYjhFdHlleFRFZVdQNmVOXzZaY2dtdyIgeD0iLTE1IiB5PSI4NiIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9iOERmb094VEVlV1A2ZU5fNlpjZ213IiB0eXBlPSJDYWxsQmVoYXZpb3JBY3Rpb25fTmFtZUxhYmVsIi8+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2I4RGZvZXhURWVXUDZlTl82WmNnbXciIHR5cGU9IkNhbGxCZWhhdmlvckFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9iOERmb3V4VEVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2I4QzRrZXhURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDYWxsQmVoYXZpb3JBY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX2I3TkxFT3hURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfYjhFR3NPeFRFZVdQNmVOXzZaY2dtdyIgeD0iMTU0IiB5PSIyOCIgd2lkdGg9IjEwMyIgaGVpZ2h0PSIxMTIiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9zb3VSUU94VEVlV1A2ZU5fNlpjZ213IiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb25fU2hhcGUiPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9zb3U0VU94VEVlV1A2ZU5fNlpjZ213IiB0eXBlPSJWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb25fTmFtZUxhYmVsIi8+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3NvdTRVZXhURWVXUDZlTl82WmNnbXciIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zb3U0VXV4VEVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfc28wWDRPeFRFZVdQNmVOXzZaY2dtdyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfc28wWDRleFRFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3NvMFg0dXhURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfNUZxVEVPeFRFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT3V0cHV0UGluX1ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvblJlc3VsdFNoYXBlIj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il81RnFURS14VEVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX1ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvblJlc3VsdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzVGcVRGT3hURWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzVGcVRGZXhURWVXUDZlTl82WmNnbXciIHR5cGU9Ik91dHB1dFBpbl9WYWx1ZVNwZWNpZmljYXRpb25BY3Rpb25SZXN1bHRTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il81RnFURnV4VEVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il81RnFURWV4VEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3NvalNJT3hURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il81RnFURXV4VEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3NvdVJRZXhURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3NvaUVBT3hURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfc291UlF1eFRFZVdQNmVOXzZaY2dtdyIgeD0iMTgiIHk9IjEwMCIgd2lkdGg9IjUxIi8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWtJQnNleFRFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfVHUwWWNPeFRFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlX1NoYXBlIj4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1R1MFljLXhURWVXUDZlTl82WmNnbXciIHR5cGU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZV9OYW1lTGFiZWwiLz4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1R1MFlkT3hURWVXUDZlTl82WmNnbXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVfU3RyZWFtTGFiZWwiPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1R1MF9nT3hURWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9UdTFta094VEVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlX0V4Y2VwdGlvbkxhYmVsIj4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9UdTFta2V4VEVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfVHUwWWNleFRFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY3Rpdml0eVBhcmFtZXRlck5vZGUiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX1R1cUFZT3hURWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1R1MFljdXhURWVXUDZlTl82WmNnbXciIHk9Ijg0Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9CRjFPb094VUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVfU2hhcGUiPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfQkYxT28teFVFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlX05hbWVMYWJlbCIvPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfQkYxT3BPeFVFZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZV9TdHJlYW1MYWJlbCI+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQkYxT3BleFVFZVdQNmVOXzZaY2dtdyIgeT0iNSIvPg0KLSAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0JGMU9wdXhVRWVXUDZlTl82WmNnbXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVfRXhjZXB0aW9uTGFiZWwiPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0JGMU9wLXhVRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9CRjFPb2V4VUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfQkZtbElPeFVFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfQkYxT291eFVFZVdQNmVOXzZaY2dtdyIgeD0iMzg1IiB5PSIxMjUiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjXzFUbXpNT3hTRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9Ja0lCc3V4VEVlV1A2ZU5fNlpjZ213IiB3aWR0aD0iMzg1IiBoZWlnaHQ9IjEwMyIvPg0KLSAgICA8L2NoaWxkcmVuPg0KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTdHJpbmdWYWx1ZVN0eWxlIiB4bWk6aWQ9Il9Ja0lCcy14VEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJkaWFncmFtX2NvbXBhdGliaWxpdHlfdmVyc2lvbiIgc3RyaW5nVmFsdWU9IjEuMi4wIi8+DQotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW1TdHlsZSIgeG1pOmlkPSJfSWtJQnRPeFRFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJzdHlsZTpQYXB5cnVzVmlld1N0eWxlIiB4bWk6aWQ9Il9Ja0lCdGV4VEVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICA8b3duZXIgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfMVRtek1PeFNFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICA8L3N0eWxlcz4NCi0gICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfMVRtek1PeFNFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfS3NBZXNPeFVFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19FZGdlIiBzb3VyY2U9Il9UdTBZY094VEVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il9iOEV0d094VEVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9Lc0JGd094VUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0tzQkZ3ZXhVRWVXUDZlTl82WmNnbXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9Lc0JGd3V4VUVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0tzQkZ3LXhVRWVXUDZlTl82WmNnbXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9Lc0JGeE94VUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1NlbGVjdGlvbkxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfS3NCRnhleFVFZVdQNmVOXzZaY2dtdyIgeD0iMjAiIHk9IjQwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9Lc0JGeHV4VUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1RyYW5zZm9ybWF0aW9uTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9Lc0JGeC14VUVlV1A2ZU5fNlpjZ213IiB4PSItMjAiIHk9Ii02MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS3NCRnlPeFVFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19LZXl3b3JkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9Lc0JGeWV4VUVlV1A2ZU5fNlpjZ213IiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0tzQkZ5dXhVRWVXUDZlTl82WmNnbXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9Lc0JGeS14VUVlV1A2ZU5fNlpjZ213IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS3NCRnpPeFVFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9Lc0JGemV4VUVlV1A2ZU5fNlpjZ213IiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfS3NBZXNleFVFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfS3J6RFVPeFVFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0tzQWVzdXhVRWVXUDZlTl82WmNnbXciIHBvaW50cz0iWzIwLCA4MCwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzE0NCwgNzksIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0tzajRVT3hVRWVXUDZlTl82WmNnbXciIGlkPSIoMC43NzUsMC40KSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9Lc2o0VWV4VUVlV1A2ZU5fNlpjZ213IiBpZD0iKDAuMTI1LDAuNDM3NSkiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX0xPaDg4T3hVRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfRWRnZSIgc291cmNlPSJfNUZxVEVPeFRFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfYjhFdHgteFRFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTE9pa0FPeFVFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9MT2lrQWV4VUVlV1A2ZU5fNlpjZ213IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTE9pa0F1eFVFZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfV2VpZ2h0TGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9MT2lrQS14VUVlV1A2ZU5fNlpjZ213IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTE9pa0JPeFVFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19TZWxlY3Rpb25MYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0xPaWtCZXhVRWVXUDZlTl82WmNnbXciIHg9IjIwIiB5PSI0MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTE9pa0J1eFVFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19UcmFuc2Zvcm1hdGlvbkxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTE9pa0IteFVFZVdQNmVOXzZaY2dtdyIgeD0iLTIwIiB5PSItNjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xPaWtDT3hVRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfS2V5d29yZExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTE9pa0NleFVFZVdQNmVOXzZaY2dtdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9MT2lrQ3V4VUVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTE9pa0MteFVFZVdQNmVOXzZaY2dtdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xPaWtET3hVRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTE9pa0RleFVFZVdQNmVOXzZaY2dtdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0xPaDg4ZXhVRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0xPV1d3T3hVRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9MT2g4OHV4VUVlV1A2ZU5fNlpjZ213IiBwb2ludHM9Ils4OSwgMTU2LCAtNjQzOTg0LCAtNjQzOTg0XSRbMTQ4LCAxNTAsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9MbHU4QU94VUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X0VkZ2UiIHNvdXJjZT0iX2I4RlUwT3hURWVXUDZlTl82WmNnbXciIHRhcmdldD0iX0JGMU9vT3hVRWVXUDZlTl82WmNnbXciPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xsdmpFT3hVRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTGx2akVleFVFZVdQNmVOXzZaY2dtdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xsdmpFdXhVRWVXUDZlTl82WmNnbXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTGx2akUteFVFZVdQNmVOXzZaY2dtdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xsdmpGT3hVRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfU2VsZWN0aW9uTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9MbHZqRmV4VUVlV1A2ZU5fNlpjZ213IiB4PSIyMCIgeT0iNDAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xsdmpGdXhVRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfVHJhbnNmb3JtYXRpb25MYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0xsdmpGLXhVRWVXUDZlTl82WmNnbXciIHg9Ii0yMCIgeT0iLTYwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9MbHZqR094VUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X0tleXdvcmRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0xsdmpHZXhVRWVXUDZlTl82WmNnbXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTGx2akd1eFVFZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfR3VhcmRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0xsdmpHLXhVRWVXUDZlTl82WmNnbXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9MbHZqSE94VUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0xsdmpIZXhVRWVXUDZlTl82WmNnbXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9MbHU4QWV4VUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19MbGhnb094VUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTGx1OEF1eFVFZVdQNmVOXzZaY2dtdyIgcG9pbnRzPSJbMjc3LCAxMjMsIC02NDM5ODQsIC02NDM5ODRdJFszNjUsIDEyMSwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfTG1PRU1PeFVFZVdQNmVOXzZaY2dtdyIgaWQ9IigwLjIsMC40NSkiLz4NCi0gICAgPC9lZGdlcz4NCi0gIDwvbm90YXRpb246RGlhZ3JhbT4NCi0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX05oNDM4T3hhRWVXUDZlTl82WmNnbXciIHR5cGU9IlBhcHlydXNVTUxBY3Rpdml0eURpYWdyYW0iIG5hbWU9IkNsYXNzaWZpZXIgQmVoYXZpb3IgZGlhZ3JhbSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+DQotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX05oNDM4ZXhhRWVXUDZlTl82WmNnbXciIHR5cGU9IkFjdGl2aXR5X1NoYXBlIiBncmFkaWVudD0iMTY3NzcyMTUsIC0xLCAwIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfRWNwVlFPeGJFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0VjcFZRZXhiRWVXUDZlTl82WmNnbXciIGtleT0iZ3JhZGllbnQiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0UtbUx3T3hiRWVXUDZlTl82WmNnbXciIGtleT0iZmlsbENvbG9yIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX05oNDM4dXhhRWVXUDZlTl82WmNnbXciIHR5cGU9IkFjdGl2aXR5X05hbWVMYWJlbCIvPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfQmEwWTRDUUhFZWFDdFpwRDBBVGZDdyIgdHlwZT0iQWN0aXZpdHlfUGFyYW1ldGVyQ29tcGFydG1lbnQiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9OaDQzOWV4YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfTmg0Mzl1eGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTmg0MzkteGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9CYTBfOENRSEVlYUN0WnBEMEFUZkN3IiB0eXBlPSJBY3Rpdml0eV9QcmVjb25kaXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX05oNDMtZXhhRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9OaDQzLXV4YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9OaDQzLS14YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0JhMW5BQ1FIRWVhQ3RacEQwQVRmQ3ciIHR5cGU9IkFjdGl2aXR5X1Bvc3Rjb25kaXRpb25Db21wYXJ0bWVudCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX05oNDNfZXhhRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9OaDQzX3V4YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9OaDQzXy14YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0JhM2NNQ1FIRWVhQ3RacEQwQVRmQ3ciIHR5cGU9IkFjdGl2aXR5X0FjdGl2aXR5Tm9kZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iXzE1aERBT3hhRWVXUDZlTl82WmNnbXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX1NoYXBlIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMTVoREEteGFFZVdQNmVOXzZaY2dtdyIgdHlwZT0iUmVhZFNlbGZBY3Rpb25fTmFtZUxhYmVsIi8+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzE1aHFFT3hhRWVXUDZlTl82WmNnbXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzE1aHFFZXhhRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il8xNWw3Z094YUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il8xNWw3Z2V4YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMTVsN2d1eGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il8yMXMtY094YUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPdXRwdXRQaW5fUmVhZFNlbGZBY3Rpb25SZXN1bHRTaGFwZSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMjFzLWMteGFFZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik91dHB1dFBpbl9SZWFkU2VsZkFjdGlvblJlc3VsdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzIxcy1kT3hhRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzIxcy1kZXhhRWVXUDZlTl82WmNnbXciIHR5cGU9Ik91dHB1dFBpbl9SZWFkU2VsZkFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzIxcy1kdXhhRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iXzIxcy1jZXhhRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfMTVkX3NPeGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzIxcy1jdXhhRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfMTVoREFleGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlJlYWRTZWxmQWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI18xNWE4WU94YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzE1aERBdXhhRWVXUDZlTl82WmNnbXciIHg9IjIwNiIgeT0iMjA5IiB3aWR0aD0iNjUiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il81eWp4SU94YUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJGb3JrTm9kZV9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzV5anhJLXhhRWVXUDZlTl82WmNnbXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGb3JrTm9kZV9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il81eWp4Sk94YUVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzV5anhKZXhhRWVXUDZlTl82WmNnbXciIHR5cGU9IkZvcmtOb2RlX1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il81eWp4SnV4YUVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iXzV5anhJZXhhRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpGb3JrTm9kZSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfNXlkcWdPeGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il81eWp4SXV4YUVlV1A2ZU5fNlpjZ213IiB4PSIzMzQiIHk9IjkwIiB3aWR0aD0iMTAiIGhlaWdodD0iMjc0Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfOW1uNG9PeGFFZVdQNmVOXzZaY2dtdyIgdHlwZT0iUmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uX1NoYXBlIj4NCi0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iXy13SFFRT3hhRWVXUDZlTl82WmNnbXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfLXdIUVFleGFFZVdQNmVOXzZaY2dtdyIga2V5PSJjYW5vbmljYWwiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il8tMG44ME94YUVlV1A2ZU5fNlpjZ213IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il85bW9mc094YUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb25fTmFtZUxhYmVsIi8+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzltb2ZzZXhhRWVXUDZlTl82WmNnbXciIHR5cGU9IlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il85bW9mc3V4YUVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfOW5PVmtPeGFFZVdQNmVOXzZaY2dtdyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfOW5PVmtleGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzluT1ZrdXhhRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfLXpGcndPeGFFZVdQNmVOXzZaY2dtdyIgdHlwZT0iSW5wdXRQaW5fUmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uT2JqZWN0U2hhcGUiPg0KLSAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il8tMG44MGV4YUVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfLTBuODB1eGFFZVdQNmVOXzZaY2dtdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXy16RnJ3LXhhRWVXUDZlTl82WmNnbXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJJbnB1dFBpbl9SZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb25PYmplY3ROYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tekZyeE94YUVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8tekZyeGV4YUVlV1A2ZU5fNlpjZ213IiB0eXBlPSJJbnB1dFBpbl9SZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb25PYmplY3RTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tekZyeHV4YUVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il8tekZyd2V4YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfOW1qbk1PeGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXy16RnJ3dXhhRWVXUDZlTl82WmNnbXciIHg9Ii0xNSIgeT0iMTMiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfLXpHUzBPeGFFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT3V0cHV0UGluX1JlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvblJlc3VsdFNoYXBlIj4NCi0gICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfLTBuODAteGFFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iXy0wbjgxT3hhRWVXUDZlTl82WmNnbXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8tekdTMC14YUVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX1JlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvblJlc3VsdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy16R1MxT3hhRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXy16R1MxZXhhRWVXUDZlTl82WmNnbXciIHR5cGU9Ik91dHB1dFBpbl9SZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb25SZXN1bHRTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tekdTMXV4YUVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il8tekdTMGV4YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjXzltazFVT3hhRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8tekdTMHV4YUVlV1A2ZU5fNlpjZ213IiB4PSI1OSIgeT0iMTQiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfOW1uNG9leGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDYW5vbmljYWxTdHlsZSIgeG1pOmlkPSJfLXdHcE1PeGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfOW1Zb0VPeGFFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il85bW40b3V4YUVlV1A2ZU5fNlpjZ213IiB4PSIzOTYiIHk9IjExMCIgd2lkdGg9IjYwIi8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSFR2ZU1PeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29tbWVudF9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0hUd0ZRT3hiRWVXUDZlTl82WmNnbXciIHR5cGU9IkNvbW1lbnRfQm9keUxhYmVsIi8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q29tbWVudCIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSFRwWGtPeGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IVHZlTWV4YkVlV1A2ZU5fNlpjZ213IiB4PSIzODgiIHk9IjMyIiB3aWR0aD0iMjQ4IiBoZWlnaHQ9IjM0Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfTXNHQzh1eGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ2FsbE9wZXJhdGlvbkFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX01zSFJHdXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik91dHB1dFBpbl9DYWxsT3BlcmF0aW9uQWN0aW9uUmVzdWx0U2hhcGUiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX01zSFJIZXhiRWVXUDZlTl82WmNnbXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPdXRwdXRQaW5fQ2FsbE9wZXJhdGlvbkFjdGlvblJlc3VsdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX01zSFJIdXhiRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX01zSFJILXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik91dHB1dFBpbl9DYWxsT3BlcmF0aW9uQWN0aW9uUmVzdWx0U3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTXNIUklPeGJFZVdQNmVOXzZaY2dtdyIgeT0iNSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfTXNIUkcteGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19Nc0Rtc094YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTXNIUkhPeGJFZVdQNmVOXzZaY2dtdyIgeD0iMTAzIiB5PSIyOSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9Nc0dxQk94YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJJbnB1dFBpbl9DYWxsT3BlcmF0aW9uQWN0aW9uQXJndW1lbnRTaGFwZSI+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTXNHcUIteGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iSW5wdXRQaW5fQ2FsbE9wZXJhdGlvbkFjdGlvbkFyZ3VtZW50TmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTXNIUkVPeGJFZVdQNmVOXzZaY2dtdyIgeD0iMjYiIHk9Ii01Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9Nc0hSRWV4YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJJbnB1dFBpbl9DYWxsT3BlcmF0aW9uQWN0aW9uQXJndW1lbnRTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9Nc0hSRXV4YkVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9Nc0dxQmV4YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfTXJfVlFPeGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX01zR3FCdXhiRWVXUDZlTl82WmNnbXciIHg9Ii0xNSIgeT0iOSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9Nc0hSRS14YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJJbnB1dFBpbl9DYWxsT3BlcmF0aW9uQWN0aW9uVGFyZ2V0U2hhcGUiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX01zSFJGdXhiRWVXUDZlTl82WmNnbXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJJbnB1dFBpbl9DYWxsT3BlcmF0aW9uQWN0aW9uVGFyZ2V0TmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTXNIUkYteGJFZVdQNmVOXzZaY2dtdyIgeT0iNSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTXNIUkdPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iSW5wdXRQaW5fQ2FsbE9wZXJhdGlvbkFjdGlvblRhcmdldFN0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX01zSFJHZXhiRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX01zSFJGT3hiRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19NcjlnRU94YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTXNIUkZleGJFZVdQNmVOXzZaY2dtdyIgeD0iLTE1IiB5PSI0MCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9Nc0dxQU94YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJDYWxsT3BlcmF0aW9uQWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9Nc0dxQWV4YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJDYWxsT3BlcmF0aW9uQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX01zR3FBdXhiRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfTXNHQzgteGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNhbGxPcGVyYXRpb25BY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX01yb3Y4T3hiRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTXNHcUEteGJFZVdQNmVOXzZaY2dtdyIgeD0iNTIxIiB5PSIxODQiIHdpZHRoPSIxMDQiIGhlaWdodD0iNjYiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9aczBIUU94YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJDb21tZW50X1NoYXBlIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfWnMwSFF1eGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29tbWVudF9Cb2R5TGFiZWwiLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb21tZW50IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19ac25TOE94YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1pzMEhRZXhiRWVXUDZlTl82WmNnbXciIHg9IjUxMyIgeT0iMTEwIiBoZWlnaHQ9IjMyIi8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfd0JPa2dPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il93NEhKTU94YkVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3c0SEpNZXhiRWVXUDZlTl82WmNnbXciIGtleT0iY2Fub25pY2FsIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfdzVOVllPeGJFZVdQNmVOXzZaY2dtdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfd0JQTGtPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9OYW1lTGFiZWwiLz4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfd0JQTGtleGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il93QlBMa3V4YkVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfd0JWNVFPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfd0JWNVFleGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3dCVjVRdXhiRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfdzRUV2NPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdFNoYXBlIj4NCi0gICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfdzVOVllleGJFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3c1TlZZdXhiRWVXUDZlTl82WmNnbXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il93NFQ5Z094YkVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3c0VDlnZXhiRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3c0VDlndXhiRWVXUDZlTl82WmNnbXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25PYmplY3RTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il93NFQ5Zy14YkVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il93NFRXY2V4YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfd0JIUHdPeGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3c0VFdjdXhiRWVXUDZlTl82WmNnbXciIHg9Ii0xNSIgeT0iMzgiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfdzRVa2tPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblZhbHVlU2hhcGUiPg0KLSAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il93NU5WWS14YkVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfdzVOVlpPeGJFZVdQNmVOXzZaY2dtdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3c0VWtrLXhiRWVXUDZlTl82WmNnbXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25WYWx1ZU5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3c0VWtsT3hiRWVXUDZlTl82WmNnbXciIHg9IjE5IiB5PSItMSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfdzRVa2xleGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblZhbHVlU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdzRVa2x1eGJFZVdQNmVOXzZaY2dtdyIgeT0iNSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfdzRVa2tleGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX3dCSkU4T3hiRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il93NFVra3V4YkVlV1A2ZU5fNlpjZ213IiB4PSItMTUiIHk9IjQiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfdzRWTG9PeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT3V0cHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25SZXN1bHRTaGFwZSI+DQotICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX3c1TlZaZXhiRWVXUDZlTl82WmNnbXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il93NU5WWnV4YkVlV1A2ZU5fNlpjZ213IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfdzRWTG8teGJFZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik91dHB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uUmVzdWx0TmFtZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdzRWTHBPeGJFZVdQNmVOXzZaY2dtdyIgeD0iMiIgeT0iMjEiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3c0VkxwZXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik91dHB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uUmVzdWx0U3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdzRWTHB1eGJFZVdQNmVOXzZaY2dtdyIgeT0iNSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfdzRWTG9leGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI193QkgyME94YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdzRWTG91eGJFZVdQNmVOXzZaY2dtdyIgeD0iNTkiIHk9IjIwIi8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3dCT2tnZXhiRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q2Fub25pY2FsU3R5bGUiIHhtaTppZD0iX3c0R2lJT3hiRWVXUDZlTl82WmNnbXciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI193QkVNY094YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3dCT2tndXhiRWVXUDZlTl82WmNnbXciIHg9IjcwNyIgeT0iMjkwIiB3aWR0aD0iNjAiIGhlaWdodD0iNjIiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9JVUc1a094Y0VlV1A2ZU5fNlpjZ213IiB0eXBlPSJDb21tZW50X1NoYXBlIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSVVHNWt1eGNFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29tbWVudF9Cb2R5TGFiZWwiLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb21tZW50IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19JVDF6ME94Y0VlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lVRzVrZXhjRWVXUDZlTl82WmNnbXciIHg9IjcwMiIgeT0iMjAwIi8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfbWFteUVPeG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fU2hhcGUiPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9tYW5aSU94bkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9OYW1lTGFiZWwiLz4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbWFuWklleG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fVHJpZ2dlckxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX21hblpJdXhuRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbWFuWkkteG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX21hblpKT3huRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbWFuWkpleG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fRmxvYXRpbmdOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbWFuWkp1eG5FZVdQNmVOXzZaY2dtdyIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9tYW15RWV4bkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX21hVFFFT3huRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbWFteUV1eG5FZVdQNmVOXzZaY2dtdyIgeD0iMjMiIHk9IjE5MSIgd2lkdGg9IjEyMiIgaGVpZ2h0PSI3NyIvPg0KLSAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3l5cEZ3T3huRWVXUDZlTl82WmNnbXciIHR5cGU9IkluaXRpYWxOb2RlX1NoYXBlIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeXlwRncteG5FZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkluaXRpYWxOb2RlX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3l5cEZ4T3huRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeXlwRnhleG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iSW5pdGlhbE5vZGVfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3l5cEZ4dXhuRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfeXlwRndleG5FZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkluaXRpYWxOb2RlIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI195eVI1WU94bkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3l5cEZ3dXhuRWVXUDZlTl82WmNnbXciIHg9Ijc2IiB5PSIxMTgiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il8yZ0lyTU94bkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzJnSXJNLXhuRWVXUDZlTl82WmNnbXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8yZ0lyTk94bkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9UcmlnZ2VyTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMmdJck5leG5FZVdQNmVOXzZaY2dtdyIgeD0iMzMiIHk9Ii0yNCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8yZ0lyTnV4bkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMmdJck4teG5FZVdQNmVOXzZaY2dtdyIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8yZ0lyT094bkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8yZ0pTUU94bkVlV1A2ZU5fNlpjZ213IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iXzJnSXJNZXhuRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfMmZ2Q2tPeG5FZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8yZ0lyTXV4bkVlV1A2ZU5fNlpjZ213IiB4PSI1MTgiIHk9IjM4MiIvPg0KLSAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX0xITTEwT3hvRWVXUDZlTl82WmNnbXciIHR5cGU9IkFjdGl2aXR5RmluYWxOb2RlX1NoYXBlIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTEhNMTAteG9FZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkFjdGl2aXR5RmluYWxOb2RlX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0xITTExT3hvRWVXUDZlTl82WmNnbXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTEhNMTFleG9FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQWN0aXZpdHlGaW5hbE5vZGVfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0xITTExdXhvRWVXUDZlTl82WmNnbXciIHg9Ii0xIiB5PSItMiIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9MSE0xMGV4b0VlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlGaW5hbE5vZGUiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0xHejBRT3hvRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTEhNMTB1eG9FZVdQNmVOXzZaY2dtdyIgeD0iODc3IiB5PSIzMzMiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9OaDQ0QWV4YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19NY3pmTU94YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTmg0NEF1eGFFZVdQNmVOXzZaY2dtdyIgd2lkdGg9IjkzNSIgaGVpZ2h0PSIzNjgiLz4NCi0gICAgPC9jaGlsZHJlbj4NCi0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U3RyaW5nVmFsdWVTdHlsZSIgeG1pOmlkPSJfTmg0NEEteGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0iZGlhZ3JhbV9jb21wYXRpYmlsaXR5X3ZlcnNpb24iIHN0cmluZ1ZhbHVlPSIxLjIuMCIvPg0KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtU3R5bGUiIHhtaTppZD0iX05oNDRCT3hhRWVXUDZlTl82WmNnbXciLz4NCi0gICAgPHN0eWxlcyB4bWk6dHlwZT0ic3R5bGU6UGFweXJ1c1ZpZXdTdHlsZSIgeG1pOmlkPSJfTmg0NEJleGFFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgPG93bmVyIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX01jemZNT3hhRWVXUDZlTl82WmNnbXciLz4NCi0gICAgPC9zdHlsZXM+DQotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX01jemZNT3hhRWVXUDZlTl82WmNnbXciLz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX1llRnFVT3hiRWVXUDZlTl82WmNnbXciIHR5cGU9IkNvbW1lbnRfQW5ub3RhdGVkRWxlbWVudEVkZ2UiIHNvdXJjZT0iX0hUdmVNT3hiRWVXUDZlTl82WmNnbXciIHRhcmdldD0iXzltbjRvT3hhRWVXUDZlTl82WmNnbXciPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfWWVGcVVleGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ZZUZxVXV4YkVlV1A2ZU5fNlpjZ213IiBwb2ludHM9Ils0MzYsIDEzNSwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzQzMCwgMTQ2LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ZZWJva094YkVlV1A2ZU5fNlpjZ213IiBpZD0iKDAuMTc0OTE2NTczOTcxMDc5LDEuMCkiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfWWVib2tleGJFZVdQNmVOXzZaY2dtdyIgaWQ9IigwLjQ4MzMzMzMzMzMzMzMzMzM0LDAuMCkiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX2RUM3RnT3hiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfRWRnZSIgc291cmNlPSJfNXlqeElPeGFFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfLXpGcndPeGFFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZFQzdGcteGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1RDR0ZRT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9kVDN0aE94YkVlV1A2ZU5fNlpjZ213IiB4PSItNiIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2RUM3RoZXhiRWVXUDZlTl82WmNnbXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9UQ2pZUU94bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZFQzdGh1eGJFZVdQNmVOXzZaY2dtdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2RUM3RoLXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfU2VsZWN0aW9uTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1RDeGFzT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9kVDRVa094YkVlV1A2ZU5fNlpjZ213IiB4PSI3MCIgeT0iNDAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2RUNFVrZXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfVHJhbnNmb3JtYXRpb25MYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVERBRU1PeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2RUNFVrdXhiRWVXUDZlTl82WmNnbXciIHg9IjMwIiB5PSItNjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2RUNFVrLXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfS2V5d29yZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9URE9Hb094bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZFQ0VWxPeGJFZVdQNmVOXzZaY2dtdyIgeD0iLTYiIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZFQ0VWxleGJFZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfR3VhcmRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVERmemNPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2RUNFVsdXhiRWVXUDZlTl82WmNnbXciIHg9IjYiIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9kVDRVbC14YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVERzbndPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2RUNFVtT3hiRWVXUDZlTl82WmNnbXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9kVDN0Z2V4YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19kVHFTSU94YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfZFQzdGd1eGJFZVdQNmVOXzZaY2dtdyIgcG9pbnRzPSJbMzQ5LCAxNjQsIC02NDM5ODQsIC02NDM5ODRdJFszODYsIDE2MywgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfZFVSOU1PeGJFZVdQNmVOXzZaY2dtdyIgaWQ9IigxLjAsMC4xMzg2ODYxMzEzODY4NjEzKSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9kVVI5TWV4YkVlV1A2ZU5fNlpjZ213IiBpZD0iKDAuMTI1LDAuMzEyNSkiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX2V6Nmo4T3hiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfRWRnZSIgc291cmNlPSJfLXpHUzBPeGFFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfTXNHcUJPeGJFZVdQNmVOXzZaY2dtdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2V6Nmo4LXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9oZ09aTU94YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZXo3TEFPeGJFZVdQNmVOXzZaY2dtdyIgeD0iLTE1IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZXo3TEFleGJFZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfV2VpZ2h0TGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX2hnYk5nT3hiRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9lejdMQXV4YkVlV1A2ZU5fNlpjZ213IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZXo3TEEteGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19TZWxlY3Rpb25MYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfaGdqd1lPeGJFZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2V6N0xCT3hiRWVXUDZlTl82WmNnbXciIHg9IjIwIiB5PSItMTAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2V6N0xCZXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfVHJhbnNmb3JtYXRpb25MYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfaGd2V2tPeGJFZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2V6N0xCdXhiRWVXUDZlTl82WmNnbXciIHg9Ii0yMCIgeT0iLTExMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZXo3TEIteGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19LZXl3b3JkTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX2hnN2owT3hiRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9lejdMQ094YkVlV1A2ZU5fNlpjZ213IiB4PSItMTUiIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZXo3TENleGJFZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfR3VhcmRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfaGhGNzRPeGJFZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2V6N0xDdXhiRWVXUDZlTl82WmNnbXciIHg9IjE1IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZXo3TEMteGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX2hoUTdBT3hiRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9lejdMRE94YkVlV1A2ZU5fNlpjZ213IiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfZXo2ajhleGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfZXpucEFPeGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX2V6Nmo4dXhiRWVXUDZlTl82WmNnbXciIHBvaW50cz0iWzQ3NiwgMTY4LCAtNjQzOTg0LCAtNjQzOTg0XSRbNDkxLCAxNjgsIC02NDM5ODQsIC02NDM5ODRdJFs0OTEsIDIzNiwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzUxMSwgMjM2LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oZjBKZ094YkVlV1A2ZU5fNlpjZ213IiBpZD0iKDEuMCwwLjUpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2UwV28wT3hiRWVXUDZlTl82WmNnbXciIGlkPSIoMC4wLDAuNDM3NSkiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX2luMklrT3hiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfRWRnZSIgc291cmNlPSJfNXlqeElPeGFFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfTXNIUkUteGJFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfaW4ySWsteGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1RENnFNT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9pbjJJbE94YkVlV1A2ZU5fNlpjZ213IiB4PSItMjQiIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9pbjJJbGV4YkVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVEVLaDBPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2luMklsdXhiRWVXUDZlTl82WmNnbXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9pbjJ2b094YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1NlbGVjdGlvbkxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9URVpMVU94bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaW4ydm9leGJFZVdQNmVOXzZaY2dtdyIgeD0iNzAiIHk9IjQwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9pbjJ2b3V4YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1RyYW5zZm9ybWF0aW9uTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1RFbF9vT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9pbjJ2by14YkVlV1A2ZU5fNlpjZ213IiB4PSIzMCIgeT0iLTYwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9pbjJ2cE94YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X0tleXdvcmRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVEUwQ0VPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2luMnZwZXhiRWVXUDZlTl82WmNnbXciIHg9Ii0yNCIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9pbjJ2cHV4YkVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9URkNFZ094bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfaW4ydnAteGJFZVdQNmVOXzZaY2dtdyIgeD0iMjQiIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9pbjJ2cU94YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVEZSOElPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2luMnZxZXhiRWVXUDZlTl82WmNnbXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9pbjJJa2V4YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19pbm5mRU94YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfaW4ySWt1eGJFZVdQNmVOXzZaY2dtdyIgcG9pbnRzPSJbMzQ5LCAyNzIsIC02NDM5ODQsIC02NDM5ODRdJFs1MTEsIDI2NiwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfaW9OOEFPeGJFZVdQNmVOXzZaY2dtdyIgaWQ9IigxLjAsMC41MTQ1OTg1NDAxNDU5ODU0KSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9pb044QWV4YkVlV1A2ZU5fNlpjZ213IiBpZD0iKDAuMTI1LDAuNDM3NSkiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX2x6bTU4T3hiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfRWRnZSIgc291cmNlPSJfMjFzLWNPeGFFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfNXlqeElPeGFFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbHptNTgteGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1RITW5zT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9sem01OU94YkVlV1A2ZU5fNlpjZ213IiB4PSItNyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2x6bTU5ZXhiRWVXUDZlTl82WmNnbXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9USGFERU94bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbHptNTl1eGJFZVdQNmVOXzZaY2dtdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2x6bTU5LXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfU2VsZWN0aW9uTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1RIbmVjT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9sem01LU94YkVlV1A2ZU5fNlpjZ213IiB4PSI3MCIgeT0iNDAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2x6bTUtZXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfVHJhbnNmb3JtYXRpb25MYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVEgwNTBPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2x6bTUtdXhiRWVXUDZlTl82WmNnbXciIHg9IjMwIiB5PSItNjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2x6bTUtLXhiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfS2V5d29yZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9USUNWTU94bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbHptNV9PeGJFZVdQNmVOXzZaY2dtdyIgeD0iLTciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbHptNV9leGJFZVdQNmVOXzZaY2dtdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfR3VhcmRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVElTTTBPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2x6bTVfdXhiRWVXUDZlTl82WmNnbXciIHg9IjciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9sem01Xy14YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVElmb01PeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2x6bTZBT3hiRWVXUDZlTl82WmNnbXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9sem01OGV4YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19selE3c094YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfbHptNTh1eGJFZVdQNmVOXzZaY2dtdyIgcG9pbnRzPSJbMjkxLCAyNjcsIC02NDM5ODQsIC02NDM5ODRdJFszMzksIDI2OCwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfbDBFTThPeGJFZVdQNmVOXzZaY2dtdyIgaWQ9IigwLjEsMC41MTQ1OTg1NDAxNDU5ODU0KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfdUN5aDRPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29tbWVudF9Bbm5vdGF0ZWRFbGVtZW50RWRnZSIgc291cmNlPSJfWnMwSFFPeGJFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfTXNHQzh1eGJFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il91Q3loNGV4YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3VDeWg0dXhiRWVXUDZlTl82WmNnbXciIHBvaW50cz0iWzU4MiwgMjEwLCAtNjQzOTg0LCAtNjQzOTg0XSRbNTc4LCAyMjAsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3VET213T3hiRWVXUDZlTl82WmNnbXciIGlkPSIoMC4zMTA4MTUzNjM4ODE0MDE3NCwxLjApIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3VET213ZXhiRWVXUDZlTl82WmNnbXciIGlkPSIoMC41LDAuMCkiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iXzdQTmY0T3hiRWVXUDZlTl82WmNnbXciIHR5cGU9Ik9iamVjdEZsb3dfRWRnZSIgc291cmNlPSJfNXlqeElPeGFFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfdzRUV2NPeGJFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfN1BOZjQteGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1RGZlhnT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il83UE5mNU94YkVlV1A2ZU5fNlpjZ213IiB4PSItNTIiIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il83UE5mNWV4YkVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVEZ1b0VPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzdQTmY1dXhiRWVXUDZlTl82WmNnbXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il83UE5mNS14YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1NlbGVjdGlvbkxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9UR0E3OE94bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfN1BOZjZPeGJFZVdQNmVOXzZaY2dtdyIgeD0iNzAiIHk9IjQwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il83UE5mNmV4YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1RyYW5zZm9ybWF0aW9uTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1RHUXprT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il83UE5mNnV4YkVlV1A2ZU5fNlpjZ213IiB4PSIzMCIgeT0iLTYwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il83UE5mNi14YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X0tleXdvcmRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVEdlMkFPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzdQTmY3T3hiRWVXUDZlTl82WmNnbXciIHg9Ii01MiIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il83UE5mN2V4YkVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9UR3RmZ094bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfN1BOZjd1eGJFZVdQNmVOXzZaY2dtdyIgeD0iNTIiIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il83UE5mNy14YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVEctbFFPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzdQTmY4T3hiRWVXUDZlTl82WmNnbXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il83UE5mNGV4YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI183TzRJc094YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfN1BOZjR1eGJFZVdQNmVOXzZaY2dtdyIgcG9pbnRzPSJbMzQ5LCAzNzMsIC02NDM5ODQsIC02NDM5ODRdJFs2OTcsIDM3MiwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfN1AyWkVPeGJFZVdQNmVOXzZaY2dtdyIgaWQ9IigxLjAsMC45MDE0NTk4NTQwMTQ1OTg1KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfOHZtN29PeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19FZGdlIiBzb3VyY2U9Il9Nc0hSR3V4YkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il93NFVra094YkVlV1A2ZU5fNlpjZ213IiByb3V0aW5nPSJSZWN0aWxpbmVhciI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfOHZtN28teGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX19CVWZrT3hiRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il84dm03cE94YkVlV1A2ZU5fNlpjZ213IiB4PSItMTkiIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il84dm03cGV4YkVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfX0JpaUFPeGJFZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzh2bTdwdXhiRWVXUDZlTl82WmNnbXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il84dm03cC14YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1NlbGVjdGlvbkxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9fQnZXVU94YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfOHZtN3FPeGJFZVdQNmVOXzZaY2dtdyIgeD0iNzAiIHk9IjQwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il84dm03cWV4YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X1RyYW5zZm9ybWF0aW9uTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX19COVl3T3hiRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il84dm03cXV4YkVlV1A2ZU5fNlpjZ213IiB4PSIzMCIgeT0iLTYwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il84dm03cS14YkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJPYmplY3RGbG93X0tleXdvcmRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfX0NNcFVPeGJFZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzh2bTdyT3hiRWVXUDZlTl82WmNnbXciIHg9Ii0xOSIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il84dm03cmV4YkVlV1A2ZU5fNlpjZ213IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9fQ1pkb094YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfOHZtN3J1eGJFZVdQNmVOXzZaY2dtdyIgeD0iNyIgeT0iOCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfOHZtN3IteGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iT2JqZWN0Rmxvd19TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX19DbmdFT3hiRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il84dm03c094YkVlV1A2ZU5fNlpjZ213IiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfOHZtN29leGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfOHZUWm9PeGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzh2bTdvdXhiRWVXUDZlTl82WmNnbXciIHBvaW50cz0iWzY0NSwgMjU3LCAtNjQzOTg0LCAtNjQzOTg0XSRbNjY0LCAyNTcsIC02NDM5ODQsIC02NDM5ODRdJFs2NjQsIDMzNywgLTY0Mzk4NCwgLTY0Mzk4NF0kWzY5NywgMzM3LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il84d0g1QU94YkVlV1A2ZU5fNlpjZ213IiBpZD0iKDEuMCwwLjUpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX19BMVhZT3hiRWVXUDZlTl82WmNnbXciIGlkPSIoMC4wLDAuNDM3NSkiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX1NEVGl3T3hjRWVXUDZlTl82WmNnbXciIHR5cGU9IkNvbW1lbnRfQW5ub3RhdGVkRWxlbWVudEVkZ2UiIHNvdXJjZT0iX0lVRzVrT3hjRWVXUDZlTl82WmNnbXciIHRhcmdldD0iX3dCT2tnT3hiRWVXUDZlTl82WmNnbXciPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfU0RUaXdleGNFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9TRFRpd3V4Y0VlV1A2ZU5fNlpjZ213IiBwb2ludHM9Ils3NDYsIDI5NiwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzczNywgMzI2LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9TRHR5Y094Y0VlV1A2ZU5fNlpjZ213IiBpZD0iKDAuMTY0NDE5MzEyNzQ0NjcxNTYsMS4wKSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9TRHVaZ094Y0VlV1A2ZU5fNlpjZ213IiBpZD0iKDAuNDE2NjY2NjY2NjY2NjY2NywwLjApIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9wQ0Vqa094bkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJDb250cm9sRmxvd19FZGdlIiBzb3VyY2U9Il9tYW15RU94bkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il8xNWhEQU94YUVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9wQ0Vqay14bkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJDb250cm9sRmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX0hSTG1nT3hvRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9wQ0VqbE94bkVlV1A2ZU5fNlpjZ213IiB4PSItOSIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3BDRWpsZXhuRWVXUDZlTl82WmNnbXciIHR5cGU9IkNvbnRyb2xGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9IUmdXb094b0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcENFamx1eG5FZVdQNmVOXzZaY2dtdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3BDRWpsLXhuRWVXUDZlTl82WmNnbXciIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX0hSelJrT3hvRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9wQ0VqbU94bkVlV1A2ZU5fNlpjZ213IiB4PSI5IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfcENFam1leG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9IU0d6a094b0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcENFam11eG5FZVdQNmVOXzZaY2dtdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3BDRWprZXhuRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19wQnJpQU94bkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfcENFamt1eG5FZVdQNmVOXzZaY2dtdyIgcG9pbnRzPSJbMTQ5LCAyNjcsIC02NDM5ODQsIC02NDM5ODRdJFsyMTEsIDI2NywgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfcEM0YjRPeG5FZVdQNmVOXzZaY2dtdyIgaWQ9IigwLjk5MTgwMzI3ODY4ODUyNDYsMC41Mjk3NDkzMjA0NDY5OTQ3KSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9wQzRiNGV4bkVlV1A2ZU5fNlpjZ213IiBpZD0iKDAuMCwwLjU1KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfMDZqTmNPeG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfRWRnZSIgc291cmNlPSJfeXlwRndPeG5FZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfbWFteUVPeG5FZVdQNmVOXzZaY2dtdyI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMDZqMGdPeG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9IU1pIY094b0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMDZqMGdleG5FZVdQNmVOXzZaY2dtdyIgeD0iLTgiIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wNmowZ3V4bkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJDb250cm9sRmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfSFNxMFFPeG9FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzA2ajBnLXhuRWVXUDZlTl82WmNnbXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wNmowaE94bkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJDb250cm9sRmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9IUzhoRU94b0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMDZqMGhleG5FZVdQNmVOXzZaY2dtdyIgeD0iOCIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzA2ajBodXhuRWVXUDZlTl82WmNnbXciIHR5cGU9IkNvbnRyb2xGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfSFRRREVPeG9FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzA2ajBoLXhuRWVXUDZlTl82WmNnbXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il8wNmpOY2V4bkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfMDZNb0lPeG5FZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzA2ak5jdXhuRWVXUDZlTl82WmNnbXciIHBvaW50cz0iWzkwLCAxNzIsIC02NDM5ODQsIC02NDM5ODRdJFs5MCwgMjI4LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il8wN1NOUU94bkVlV1A2ZU5fNlpjZ213IiBpZD0iKDAuNDU0NjA5OTI5MDc4MDE0MSwwLjkyNzMwNDk2NDUzOTAwNzUpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iXzA3U05RZXhuRWVXUDZlTl82WmNnbXciIGlkPSIoMC41MTUzNTQ0MjE2MTE2MzcsMC4wMTI5ODcwMTI5ODcwMTI5ODgpIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9fblRFQU94bkVlV1A2ZU5fNlpjZ213IiB0eXBlPSJDb250cm9sRmxvd19FZGdlIiBzb3VyY2U9Il9tYW15RU94bkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il8yZ0lyTU94bkVlV1A2ZU5fNlpjZ213IiByb3V0aW5nPSJSZWN0aWxpbmVhciI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfX25URUEteG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9CVEt2OE94b0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfX25URUJPeG5FZVdQNmVOXzZaY2dtdyIgeD0iLTg5IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfX25URUJleG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfV2VpZ2h0TGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX0JUbmI0T3hvRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9fblRFQnV4bkVlV1A2ZU5fNlpjZ213IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfX25URUIteG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfR3VhcmRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfQlQ1SXNPeG9FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX19uVEVDT3huRWVXUDZlTl82WmNnbXciIHg9Ijg5IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfX25URUNleG5FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9CVUsxZ094b0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfX25URUN1eG5FZVdQNmVOXzZaY2dtdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX19uVEVBZXhuRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19fbTROUU94bkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfX25URUF1eG5FZVdQNmVOXzZaY2dtdyIgcG9pbnRzPSJbODcsIDMwMSwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzg3LCA0MzksIC02NDM5ODQsIC02NDM5ODRdJFs1ODMsIDQzOSwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfX241ZzhPeG5FZVdQNmVOXzZaY2dtdyIgaWQ9IigwLjQ4MzYwNjU1NzM3NzA0OTE2LDAuOTYxMDM4OTYxMDM4OTYxKSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9fbjVnOGV4bkVlV1A2ZU5fNlpjZ213IiBpZD0iKDAuNDg4LDAuNDY4MDg1MTA2MzgyOTc4NzMpIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9DXzR3Y094b0VlV1A2ZU5fNlpjZ213IiB0eXBlPSJDb250cm9sRmxvd19FZGdlIiBzb3VyY2U9Il8yZ0lyTU94bkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il93Qk9rZ094YkVlV1A2ZU5fNlpjZ213IiByb3V0aW5nPSJSZWN0aWxpbmVhciI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfQ181WGdPeG9FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9FN2U2Y094b0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQ181WGdleG9FZVdQNmVOXzZaY2dtdyIgeD0iLTMxIiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfQ181WGd1eG9FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfV2VpZ2h0TGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX0U3LXBzT3hvRWVXUDZlTl82WmNnbXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9DXzVYZy14b0VlV1A2ZU5fNlpjZ213IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfQ181WGhPeG9FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfR3VhcmRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfRThQdmNPeG9FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0NfNVhoZXhvRWVXUDZlTl82WmNnbXciIHg9IjMxIiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfQ181WGh1eG9FZVdQNmVOXzZaY2dtdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9FOGcxTU94b0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQ181WGgteG9FZVdQNmVOXzZaY2dtdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0NfNHdjZXhvRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19DX2Vnd094b0VlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfQ180d2N1eG9FZVdQNmVOXzZaY2dtdyIgcG9pbnRzPSJbNTg4LCA0MzgsIC02NDM5ODQsIC02NDM5ODRdJFs3NDIsIDQzOCwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzc0MiwgMzg4LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9EQW8tWU94b0VlV1A2ZU5fNlpjZ213IiBpZD0iKDAuNTEyLDAuNDQ2ODA4NTEwNjM4Mjk3ODUpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0RBby1ZZXhvRWVXUDZlTl82WmNnbXciIGlkPSIoMC41LDEuMCkiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX09La2dNT3hvRWVXUDZlTl82WmNnbXciIHR5cGU9IkNvbnRyb2xGbG93X0VkZ2UiIHNvdXJjZT0iX3dCT2tnT3hiRWVXUDZlTl82WmNnbXciIHRhcmdldD0iX0xITTEwT3hvRWVXUDZlTl82WmNnbXciPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX09La2dNLXhvRWVXUDZlTl82WmNnbXciIHR5cGU9IkNvbnRyb2xGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09La2dOT3hvRWVXUDZlTl82WmNnbXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9PS2tnTmV4b0VlV1A2ZU5fNlpjZ213IiB0eXBlPSJDb250cm9sRmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09La2dOdXhvRWVXUDZlTl82WmNnbXciIHk9IjIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9PS2tnTi14b0VlV1A2ZU5fNlpjZ213IiB0eXBlPSJDb250cm9sRmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfT0trZ09PeG9FZVdQNmVOXzZaY2dtdyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX09La2dPZXhvRWVXUDZlTl82WmNnbXciIHR5cGU9IkNvbnRyb2xGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09La2dPdXhvRWVXUDZlTl82WmNnbXciIHk9Ii0yMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9PS2tnTWV4b0VlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfT0tLM2tPeG9FZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX09La2dNdXhvRWVXUDZlTl82WmNnbXciIHBvaW50cz0iWzc3MiwgMzc1LCAtNjQzOTg0LCAtNjQzOTg0XSRbODgzLCAzNzUsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX09MUE9rT3hvRWVXUDZlTl82WmNnbXciIGlkPSIoMS4wLDAuNzkwMzIyNTgwNjQ1MTYxMykiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfT0xQT2tleG9FZVdQNmVOXzZaY2dtdyIgaWQ9IigwLjA1LDAuMzQ4Njg0MjEwNTI2MzE1MDQpIi8+DQotICAgIDwvZWRnZXM+DQotICA8L25vdGF0aW9uOkRpYWdyYW0+DQotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9KbEloTUNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJQYXB5cnVzVU1MQWN0aXZpdHlEaWFncmFtIiBuYW1lPSJDbGFzc2lmaWVyIEJlaGF2aW9yIGRpYWdyYW0iIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPg0KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9KbEloTVNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJBY3Rpdml0eV9TaGFwZSIgZ3JhZGllbnQ9IjE2Nzc3MjE1LCAtMSwgMCI+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0psSWhNaVp6RWVhTkR0VWEzd0FHTXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9KbEloTXlaekVlYU5EdFVhM3dBR013IiBrZXk9ImdyYWRpZW50IiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9KbEloTkNaekVlYU5EdFVhM3dBR013IiBrZXk9ImZpbGxDb2xvciIgdmFsdWU9InRydWUiLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbEloTlNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJBY3Rpdml0eV9OYW1lTGFiZWwiLz4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0psSWhOaVp6RWVhTkR0VWEzd0FHTXciIHR5cGU9IkFjdGl2aXR5X1BhcmFtZXRlckNvbXBhcnRtZW50Ij4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfSmxJaE55WnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX0psSWhPQ1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0psSWhPU1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfSmxJaE9pWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iQWN0aXZpdHlfUHJlY29uZGl0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9KbEloT3laekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfSmxJaFBDWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSmxJaFBTWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9KbEloUGlaekVlYU5EdFVhM3dBR013IiB0eXBlPSJBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uQ29tcGFydG1lbnQiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9KbEloUHlaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfSmxJaFFDWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSmxJaFFTWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9KbEloUWlaekVlYU5EdFVhM3dBR013IiB0eXBlPSJBY3Rpdml0eV9BY3Rpdml0eU5vZGVDb21wYXJ0bWVudCI+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9KbEloUXlaekVlYU5EdFVhM3dBR013IiB0eXBlPSJSZWFkU2VsZkFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWhSQ1p6RWVhTkR0VWEzd0FHTXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbEloUlNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJSZWFkU2VsZkFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbEloUmlaekVlYU5EdFVhM3dBR013IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfSmxJaFJ5WnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfSmxJaFNDWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0psSWhTU1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSmxJaFNpWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT3V0cHV0UGluX1JlYWRTZWxmQWN0aW9uUmVzdWx0U2hhcGUiPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWhTeVp6RWVhTkR0VWEzd0FHTXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPdXRwdXRQaW5fUmVhZFNlbGZBY3Rpb25SZXN1bHROYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbEloVENaekVlYU5EdFVhM3dBR013IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbEloVFNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJPdXRwdXRQaW5fUmVhZFNlbGZBY3Rpb25SZXN1bHRTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbEloVGlaekVlYU5EdFVhM3dBR013IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9KbEloVHlaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0psQnp2aVp6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KbEloVUNaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0psSWhVU1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpSZWFkU2VsZkFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSmxCenZTWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KbEloVWlaekVlYU5EdFVhM3dBR013IiB4PSIzNDciIHk9IjIwMCIgd2lkdGg9IjY1Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSmxJaFV5WnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iRm9ya05vZGVfU2hhcGUiPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbEloVkNaekVlYU5EdFVhM3dBR013IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRm9ya05vZGVfRmxvYXRpbmdOYW1lTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSmxJaFZTWnpFZWFORHRVYTN3QUdNdyIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbEloVmlaekVlYU5EdFVhM3dBR013IiB0eXBlPSJGb3JrTm9kZV9TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSmxJaFZ5WnpFZWFORHRVYTN3QUdNdyIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9KbEloV0NaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Rm9ya05vZGUiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0psQnp2eVp6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSmxJaFhDWnpFZWFORHRVYTN3QUdNdyIgeD0iNDQ2IiB5PSIxNjUiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMDIiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9KbEloWFNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJSZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb25fU2hhcGUiPg0KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSmxJaFhpWnpFZWFORHRVYTN3QUdNdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9KbEloWHlaekVlYU5EdFVhM3dBR013IiBrZXk9ImNhbm9uaWNhbCIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0psSWhZQ1p6RWVhTkR0VWEzd0FHTXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWhZU1p6RWVhTkR0VWEzd0FHTXciIHR5cGU9IlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbl9OYW1lTGFiZWwiLz4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaFlpWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iUmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWhZeVp6RWVhTkR0VWEzd0FHTXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9KbEloWkNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9KbEloWlNaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSmxJaFppWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9KbEloWnlaekVlYU5EdFVhM3dBR013IiB0eXBlPSJJbnB1dFBpbl9SZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb25PYmplY3RTaGFwZSI+DQotICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0psSWhhQ1p6RWVhTkR0VWEzd0FHTXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPg0KLSAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9KbEloYVNaekVlYU5EdFVhM3dBR013IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaGFpWnpFZWFORHRVYTN3QUdNdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IklucHV0UGluX1JlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbk9iamVjdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWhheVp6RWVhTkR0VWEzd0FHTXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWhiQ1p6RWVhTkR0VWEzd0FHTXciIHR5cGU9IklucHV0UGluX1JlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbk9iamVjdFN0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWhiU1p6RWVhTkR0VWEzd0FHTXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0psSWhiaVp6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19KbEJ6d1NaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSmxJaGJ5WnpFZWFORHRVYTN3QUdNdyIgeD0iLTE2IiB5PSI5IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSmxJaGNDWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT3V0cHV0UGluX1JlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvblJlc3VsdFNoYXBlIj4NCi0gICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSmxJaGNTWnpFZWFORHRVYTN3QUdNdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0psSWhjaVp6RWVhTkR0VWEzd0FHTXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbEloY3laekVlYU5EdFVhM3dBR013IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX1JlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvblJlc3VsdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWhkQ1p6RWVhTkR0VWEzd0FHTXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWhkU1p6RWVhTkR0VWEzd0FHTXciIHR5cGU9Ik91dHB1dFBpbl9SZWFkU3RydWN0dXJhbEZlYXR1cmVBY3Rpb25SZXN1bHRTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbEloZGlaekVlYU5EdFVhM3dBR013IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9KbEloZHlaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0psQnp3aVp6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KbEloZUNaekVlYU5EdFVhM3dBR013IiB4PSIxMDgiIHk9IjgiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxOCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9KbEloZVNaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNhbm9uaWNhbFN0eWxlIiB4bWk6aWQ9Il9KbEloZWlaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6UmVhZFN0cnVjdHVyYWxGZWF0dXJlQWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19KbEJ6d0NaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0psSWhleVp6RWVhTkR0VWEzd0FHTXciIHg9IjUwOCIgeT0iMTcxIiB3aWR0aD0iMTEwIiBoZWlnaHQ9IjU0Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSmxJaGZDWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iQ29tbWVudF9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWhmU1p6RWVhTkR0VWEzd0FHTXciIHR5cGU9IkNvbW1lbnRfQm9keUxhYmVsIi8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q29tbWVudCIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSmxCem95WnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KbEloZmlaekVlYU5EdFVhM3dBR013IiB4PSI0OTciIHk9IjcyIiB3aWR0aD0iMjQ4IiBoZWlnaHQ9IjM0Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSmxJaG9DWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9KbElob1NaekVlYU5EdFVhM3dBR013IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0psSWhvaVp6RWVhTkR0VWEzd0FHTXciIGtleT0iY2Fub25pY2FsIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSmxJaG95WnpFZWFORHRVYTN3QUdNdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaHBDWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9OYW1lTGFiZWwiLz4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaHBTWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbElocGlaekVlYU5EdFVhM3dBR013IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfSmxJaHB5WnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+DQotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfSmxJaHFDWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0psSWhxU1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSmxJaHFpWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdFNoYXBlIj4NCi0gICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSmxJaHF5WnpFZWFORHRVYTN3QUdNdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0psSWhyQ1p6RWVhTkR0VWEzd0FHTXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbEloclNaekVlYU5EdFVhM3dBR013IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdE5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWhyaVp6RWVhTkR0VWEzd0FHTXciIHk9IjUiLz4NCi0gICAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWhyeVp6RWVhTkR0VWEzd0FHTXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25PYmplY3RTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbEloc0NaekVlYU5EdFVhM3dBR013IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9KbEloc1NaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSmxCenppWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0psSWhzaVp6RWVhTkR0VWEzd0FHTXciIHg9Ii0xNSIgeT0iMzgiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSmxJaHN5WnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblZhbHVlU2hhcGUiPg0KLSAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9KbElodENaekVlYU5EdFVhM3dBR013IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4NCi0gICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSmxJaHRTWnpFZWFORHRVYTN3QUdNdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWh0aVp6RWVhTkR0VWEzd0FHTXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25WYWx1ZU5hbWVMYWJlbCI+DQotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWh0eVp6RWVhTkR0VWEzd0FHTXciIHg9IjIwIiB5PSIxIi8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbElodUNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uVmFsdWVTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbElodVNaekVlYU5EdFVhM3dBR013IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9KbElodWlaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSmxCejBDWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0psSWh1eVp6RWVhTkR0VWEzd0FHTXciIHg9Ii0xNSIgeT0iNCIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9KbElodkNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJPdXRwdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblJlc3VsdFNoYXBlIj4NCi0gICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSmxJaHZTWnpFZWFORHRVYTN3QUdNdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+DQotICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0psSWh2aVp6RWVhTkR0VWEzd0FHTXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbElodnlaekVlYU5EdFVhM3dBR013IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25SZXN1bHROYW1lTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbElod0NaekVlYU5EdFVhM3dBR013IiB4PSIyIiB5PSIyMSIvPg0KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaHdTWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT3V0cHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25SZXN1bHRTdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbElod2laekVlYU5EdFVhM3dBR013IiB5PSI1Ii8+DQotICAgICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9KbElod3laekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0psQnp6eVp6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KbEloeENaekVlYU5EdFVhM3dBR013IiB4PSIxNDciIHk9IjI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0psSWh4U1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q2Fub25pY2FsU3R5bGUiIHhtaTppZD0iX0psSWh4aVp6RWVhTkR0VWEzd0FHTXciIGNhbm9uaWNhbD0iZmFsc2UiLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19KbEJ6elNaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0psSWh4eVp6RWVhTkR0VWEzd0FHTXciIHg9IjczNiIgeT0iMTkzIiB3aWR0aD0iMTQ4IiBoZWlnaHQ9IjYyIi8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSmxJaHlDWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iQ29tbWVudF9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWh5U1p6RWVhTkR0VWEzd0FHTXciIHR5cGU9IkNvbW1lbnRfQm9keUxhYmVsIi8+DQotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q29tbWVudCIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSmxCenBTWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KbEloeWlaekVlYU5EdFVhM3dBR013IiB4PSI3OTciIHk9IjExMCIvPg0KLSAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX0psSWh5eVp6RWVhTkR0VWEzd0FHTXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1NoYXBlIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaHpDWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fTmFtZUxhYmVsIi8+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWh6U1p6RWVhTkR0VWEzd0FHTXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1RyaWdnZXJMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbEloemlaekVlYU5EdFVhM3dBR013IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWh6eVp6RWVhTkR0VWEzd0FHTXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbEloMENaekVlYU5EdFVhM3dBR013IiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWgwU1p6RWVhTkR0VWEzd0FHTXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWgwaVp6RWVhTkR0VWEzd0FHTXciIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfSmxJaDB5WnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19KbEJ6MFNaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0psSWgxeVp6RWVhTkR0VWEzd0FHTXciIHg9IjM5IiB5PSIzMCIgd2lkdGg9IjEyMiIgaGVpZ2h0PSI3NyIvPg0KLSAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX1dNV0M0Q1pfRWVhN0VZeHJ6bl83bEEiIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1NoYXBlIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfV01XcDhDWl9FZWE3RVl4cnpuXzdsQSIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fTmFtZUxhYmVsIi8+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1dNV3A4U1pfRWVhN0VZeHJ6bl83bEEiIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1RyaWdnZXJMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9XTVdwOGlaX0VlYTdFWXhyem5fN2xBIiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1dNWFJBQ1pfRWVhN0VZeHJ6bl83bEEiIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9XTVhSQVNaX0VlYTdFWXhyem5fN2xBIiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1dNWFJBaVpfRWVhN0VZeHJ6bl83bEEiIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1dNWFJBeVpfRWVhN0VZeHJ6bl83bEEiIHk9IjUiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfV01XQzRTWl9FZWE3RVl4cnpuXzdsQSIvPg0KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19VYWJaVUNaX0VlYTdFWXhyem5fN2xBIi8+DQotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1dNV0M0aVpfRWVhN0VZeHJ6bl83bEEiIHg9IjM2IiB5PSIxMzUiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il8zbDU0RUNjTkVlYW9NdFFpZmktUHBBIiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzNsNTRFeWNORWVhb010UWlmaS1QcEEiIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8zbDU0RkNjTkVlYW9NdFFpZmktUHBBIiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9UcmlnZ2VyTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfM2w1NEZTY05FZWFvTXRRaWZpLVBwQSIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8zbDU0RmljTkVlYW9NdFFpZmktUHBBIiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfM2w1NEZ5Y05FZWFvTXRRaWZpLVBwQSIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8zbDU0R0NjTkVlYW9NdFFpZmktUHBBIiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8zbDU0R1NjTkVlYW9NdFFpZmktUHBBIiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iXzNsNTRFU2NORWVhb010UWlmaS1QcEEiLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfMjJhVTBDY05FZWFvTXRRaWZpLVBwQSIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8zbDU0RWljTkVlYW9NdFFpZmktUHBBIiB4PSIyOCIgeT0iMjM3Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfOVNVQlFDY05FZWFvTXRRaWZpLVBwQSIgdHlwZT0iTWVyZ2VOb2RlX1NoYXBlIj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfOVNVQlF5Y05FZWFvTXRRaWZpLVBwQSIgdHlwZT0iTWVyZ2VOb2RlX0Zsb2F0aW5nTmFtZUxhYmVsIj4NCi0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzlTVUJSQ2NORWVhb010UWlmaS1QcEEiIHg9Ii01IiB5PSItMzYiLz4NCi0gICAgICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfOVNVQlJTY05FZWFvTXRRaWZpLVBwQSIgdHlwZT0iTWVyZ2VOb2RlX1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il85U1VCUmljTkVlYW9NdFFpZmktUHBBIiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iXzlTVUJRU2NORWVhb010UWlmaS1QcEEiLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpNZXJnZU5vZGUiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjXzlSeWMwQ2NORWVhb010UWlmaS1QcEEiLz4NCi0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfOVNVQlFpY05FZWFvTXRRaWZpLVBwQSIgeD0iMjQzIiB5PSIyMTYiLz4NCi0gICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9nZEFOWUNjT0VlYW9NdFFpZmktUHBBIiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9TaGFwZSI+DQotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2dkQU5ZeWNPRWVhb010UWlmaS1QcEEiIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX05hbWVMYWJlbCIvPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9nZEFOWkNjT0VlYW9NdFFpZmktUHBBIiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9UcmlnZ2VyTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZ2RBTlpTY09FZWFvTXRRaWZpLVBwQSIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9nZEJiZ0NjT0VlYW9NdFFpZmktUHBBIiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZ2RCYmdTY09FZWFvTXRRaWZpLVBwQSIgeT0iNSIvPg0KLSAgICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9nZEJiZ2ljT0VlYW9NdFFpZmktUHBBIiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+DQotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9nZEJiZ3ljT0VlYW9NdFFpZmktUHBBIiB5PSI1Ii8+DQotICAgICAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2dkQU5ZU2NPRWVhb010UWlmaS1QcEEiLz4NCi0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfZmJKdTBDY09FZWFvTXRRaWZpLVBwQSIvPg0KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9nZEFOWWljT0VlYW9NdFFpZmktUHBBIiB4PSIzOSIgeT0iMzI4Ii8+DQotICAgICAgICA8L2NoaWxkcmVuPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSmxJaC1TWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSmxCem9pWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0psSWhfU1p6RWVhTkR0VWEzd0FHTXciIHdpZHRoPSIxMDg3IiBoZWlnaHQ9IjQ1MCIvPg0KLSAgICA8L2NoaWxkcmVuPg0KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTdHJpbmdWYWx1ZVN0eWxlIiB4bWk6aWQ9Il9KbEloX2laekVlYU5EdFVhM3dBR013IiBuYW1lPSJkaWFncmFtX2NvbXBhdGliaWxpdHlfdmVyc2lvbiIgc3RyaW5nVmFsdWU9IjEuMi4wIi8+DQotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW1TdHlsZSIgeG1pOmlkPSJfSmxJaF95WnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJzdHlsZTpQYXB5cnVzVmlld1N0eWxlIiB4bWk6aWQ9Il9KbElpQUNaekVlYU5EdFVhM3dBR013Ij4NCi0gICAgICA8b3duZXIgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSmxCem9pWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICA8L3N0eWxlcz4NCi0gICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSmxCem9pWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfSmxJaUFTWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iQ29tbWVudF9Bbm5vdGF0ZWRFbGVtZW50RWRnZSIgc291cmNlPSJfSmxJaGZDWnpFZWFORHRVYTN3QUdNdyIgdGFyZ2V0PSJfSmxJaFhTWnpFZWFORHRVYTN3QUdNdyI+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9KbElpQWlaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0psSWlBeVp6RWVhTkR0VWEzd0FHTXciIHBvaW50cz0iWzU0OCwgMjEwLCAtNjQzOTg0LCAtNjQzOTg0XSRbNTQyLCAyMjEsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0psSWlCQ1p6RWVhTkR0VWEzd0FHTXciIGlkPSIoMC4xNzQ5MTY1NzM5NzEwNzksMS4wKSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9KbElpQlNaekVlYU5EdFVhM3dBR013IiBpZD0iKDAuNDgzMzMzMzMzMzMzMzMzMzQsMC4wKSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfSmxJaUJpWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT2JqZWN0Rmxvd19FZGdlIiBzb3VyY2U9Il9KbEloVXlaekVlYU5EdFVhM3dBR013IiB0YXJnZXQ9Il9KbEloWnlaekVlYU5EdFVhM3dBR013Ij4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbElpQnlaekVlYU5EdFVhM3dBR013IiB0eXBlPSJPYmplY3RGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfSmxJaUNDWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWlDU1p6RWVhTkR0VWEzd0FHTXciIHg9Ii02IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaUNpWnpFZWFORHRVYTN3QUdNdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfV2VpZ2h0TGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX0psSWlDeVp6RWVhTkR0VWEzd0FHTXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbElpRENaekVlYU5EdFVhM3dBR013IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaURTWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT2JqZWN0Rmxvd19TZWxlY3Rpb25MYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfSmxJaURpWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWlEeVp6RWVhTkR0VWEzd0FHTXciIHg9IjcwIiB5PSI0MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaUVDWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT2JqZWN0Rmxvd19UcmFuc2Zvcm1hdGlvbkxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9KbElpRVNaekVlYU5EdFVhM3dBR013IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSmxJaUVpWnpFZWFORHRVYTN3QUdNdyIgeD0iMzAiIHk9Ii02MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaUV5WnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT2JqZWN0Rmxvd19LZXl3b3JkTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX0psSWlGQ1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbElpRlNaekVlYU5EdFVhM3dBR013IiB4PSItNiIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbElpRmlaekVlYU5EdFVhM3dBR013IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9KbElpRnlaekVlYU5EdFVhM3dBR013IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSmxJaUdDWnpFZWFORHRVYTN3QUdNdyIgeD0iNiIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWlHU1p6RWVhTkR0VWEzd0FHTXciIHR5cGU9Ik9iamVjdEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9KbElpR2laekVlYU5EdFVhM3dBR013IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSmxJaUd5WnpFZWFORHRVYTN3QUdNdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0psSWlIQ1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0psQnpwaVp6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9KbElpSFNaekVlYU5EdFVhM3dBR013IiBwb2ludHM9Ils0NjEsIDIzOSwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzQ5OCwgMjM4LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9KbElpSGlaekVlYU5EdFVhM3dBR013IiBpZD0iKDEuMCwwLjMzMzMzMzMzMzMzMzMzMzMpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0psSWlIeVp6RWVhTkR0VWEzd0FHTXciIGlkPSIoMC4xMjUsMC4zMTI1KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfSmxJaVZDWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT2JqZWN0Rmxvd19FZGdlIiBzb3VyY2U9Il9KbEloU2laekVlYU5EdFVhM3dBR013IiB0YXJnZXQ9Il9KbEloVXlaekVlYU5EdFVhM3dBR013Ij4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbElpVlNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJPYmplY3RGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfSmxJaVZpWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWlWeVp6RWVhTkR0VWEzd0FHTXciIHg9Ii03IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaVdDWnpFZWFORHRVYTN3QUdNdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfV2VpZ2h0TGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX0psSWlXU1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbElpV2laekVlYU5EdFVhM3dBR013IiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaVd5WnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT2JqZWN0Rmxvd19TZWxlY3Rpb25MYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfSmxJaVhDWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0psSWlYU1p6RWVhTkR0VWEzd0FHTXciIHg9IjcwIiB5PSI0MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaVhpWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT2JqZWN0Rmxvd19UcmFuc2Zvcm1hdGlvbkxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9KbElpWHlaekVlYU5EdFVhM3dBR013IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSmxJaVlDWnpFZWFORHRVYTN3QUdNdyIgeD0iMzAiIHk9Ii02MCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSmxJaVlTWnpFZWFORHRVYTN3QUdNdyIgdHlwZT0iT2JqZWN0Rmxvd19LZXl3b3JkTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX0psSWlZaVp6RWVhTkR0VWEzd0FHTXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KbElpWXlaekVlYU5EdFVhM3dBR013IiB4PSItNyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KbElpWkNaekVlYU5EdFVhM3dBR013IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9KbElpWlNaekVlYU5EdFVhM3dBR013IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSmxJaVppWnpFZWFORHRVYTN3QUdNdyIgeD0iNyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0psSWlaeVp6RWVhTkR0VWEzd0FHTXciIHR5cGU9Ik9iamVjdEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9KbElpYUNaekVlYU5EdFVhM3dBR013IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSmxJaWFTWnpFZWFORHRVYTN3QUdNdyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0psSWlhaVp6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0psQnpyeVp6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9KbElpYXlaekVlYU5EdFVhM3dBR013IiBwb2ludHM9Ils0MDMsIDM0MiwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzQ1MSwgMzQzLCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9KbElpYkNaekVlYU5EdFVhM3dBR013IiBpZD0iKDAuMSwwLjUxNDU5ODU0MDE0NTk4NTQpIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9KbElpcFNaekVlYU5EdFVhM3dBR013IiB0eXBlPSJDb21tZW50X0Fubm90YXRlZEVsZW1lbnRFZGdlIiBzb3VyY2U9Il9KbEloeUNaekVlYU5EdFVhM3dBR013IiB0YXJnZXQ9Il9KbElob0NaekVlYU5EdFVhM3dBR013Ij4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0psSWlwaVp6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSmxJaXB5WnpFZWFORHRVYTN3QUdNdyIgcG9pbnRzPSJbODU4LCAzNzEsIC02NDM5ODQsIC02NDM5ODRdJFs4NDksIDQwMSwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSmxJaXFDWnpFZWFORHRVYTN3QUdNdyIgaWQ9IigwLjE2NDQxOTMxMjc0NDY3MTU2LDEuMCkiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSmxJaXFTWnpFZWFORHRVYTN3QUdNdyIgaWQ9IigwLjQxNjY2NjY2NjY2NjY2NjcsMC4wKSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfNEVvMEFDWjBFZWFfMmNQQ3B4a3hadyIgdHlwZT0iT2JqZWN0Rmxvd19FZGdlIiBzb3VyY2U9Il9KbEloVXlaekVlYU5EdFVhM3dBR013IiB0YXJnZXQ9Il9KbElocWlaekVlYU5EdFVhM3dBR013Ij4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il80RXBiRUNaMEVlYV8yY1BDcHhreFp3IiB0eXBlPSJPYmplY3RGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfRWFZaUVDY01FZWFvTXRRaWZpLVBwQSIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzRFcUNJQ1owRWVhXzJjUENweGt4WnciIHg9Ii00MCIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzRFcUNJU1owRWVhXzJjUENweGt4WnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9FYTc3c0NjTUVlYW9NdFFpZmktUHBBIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfNEVxQ0lpWjBFZWFfMmNQQ3B4a3hadyIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzRFcUNJeVowRWVhXzJjUENweGt4WnciIHR5cGU9Ik9iamVjdEZsb3dfU2VsZWN0aW9uTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX0ViUlM0Q2NNRWVhb010UWlmaS1QcEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il80RXFDSkNaMEVlYV8yY1BDcHhreFp3IiB4PSI3MCIgeT0iNDAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzRFcUNKU1owRWVhXzJjUENweGt4WnciIHR5cGU9Ik9iamVjdEZsb3dfVHJhbnNmb3JtYXRpb25MYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfRWJ0LTBDY01FZWFvTXRRaWZpLVBwQSIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzRFcUNKaVowRWVhXzJjUENweGt4WnciIHg9IjMwIiB5PSItNjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzRFcUNKeVowRWVhXzJjUENweGt4WnciIHR5cGU9Ik9iamVjdEZsb3dfS2V5d29yZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9FYl9Fa0NjTUVlYW9NdFFpZmktUHBBIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfNEVxQ0tDWjBFZWFfMmNQQ3B4a3hadyIgeD0iLTQwIiB5PSItMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzRFcUNLU1owRWVhXzJjUENweGt4WnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX0VjT1ZJQ2NNRWVhb010UWlmaS1QcEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il80RXFwTUNaMEVlYV8yY1BDcHhreFp3IiB4PSI0MCIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzRFcXBNU1owRWVhXzJjUENweGt4WnciIHR5cGU9Ik9iamVjdEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9FY2J3Z0NjTUVlYW9NdFFpZmktUHBBIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfNEVxcE1pWjBFZWFfMmNQQ3B4a3hadyIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iXzRFbzBBU1owRWVhXzJjUENweGt4WnciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjXzREM19BQ1owRWVhXzJjUENweGt4WnciLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il80RW8wQWlaMEVlYV8yY1BDcHhreFp3IiBwb2ludHM9Ils0NjEsIDI2NywgLTY0Mzk4NCwgLTY0Mzk4NF0kWzY0OCwgMjY1LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il80Rm5FWUNaMEVlYV8yY1BDcHhreFp3IiBpZD0iKDEuMCwwLjcwNTg4MjM1Mjk0MTE3NjUpIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il81X3Raa0NaMEVlYV8yY1BDcHhreFp3IiB0eXBlPSJPYmplY3RGbG93X0VkZ2UiIHNvdXJjZT0iX0psSWhjQ1p6RWVhTkR0VWEzd0FHTXciIHRhcmdldD0iX0psSWhzeVp6RWVhTkR0VWEzd0FHTXciPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzVfdUFvQ1owRWVhXzJjUENweGt4WnciIHR5cGU9Ik9iamVjdEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9teVR2a0NaX0VlYTdFWXhyem5fN2xBIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfNV91QW9TWjBFZWFfMmNQQ3B4a3hadyIgeD0iLTIxIiB5PSIxOSIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfNV91QW9pWjBFZWFfMmNQQ3B4a3hadyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfV2VpZ2h0TGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX215OTI0Q1pfRWVhN0VZeHJ6bl83bEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il81X3VBb3laMEVlYV8yY1BDcHhreFp3IiB4PSItMSIgeT0iMTkiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzVfdUFwQ1owRWVhXzJjUENweGt4WnciIHR5cGU9Ik9iamVjdEZsb3dfU2VsZWN0aW9uTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX216Ulk0Q1pfRWVhN0VZeHJ6bl83bEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il81X3VBcFNaMEVlYV8yY1BDcHhreFp3IiB4PSI2OCIgeT0iNTAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzVfdUFwaVowRWVhXzJjUENweGt4WnciIHR5cGU9Ik9iamVjdEZsb3dfVHJhbnNmb3JtYXRpb25MYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfbXplTk1DWl9FZWE3RVl4cnpuXzdsQSIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzVfdUFweVowRWVhXzJjUENweGt4WnciIHg9IjI5IiB5PSItNDgiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzVfdW5zQ1owRWVhXzJjUENweGt4WnciIHR5cGU9Ik9iamVjdEZsb3dfS2V5d29yZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9tenJva0NaX0VlYTdFWXhyem5fN2xBIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfNV91bnNTWjBFZWFfMmNQQ3B4a3hadyIgeD0iLTE5IiB5PSItMTgiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzVfdW5zaVowRWVhXzJjUENweGt4WnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX216NUQ4Q1pfRWVhN0VZeHJ6bl83bEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il81X3Vuc3laMEVlYV8yY1BDcHhreFp3IiB4PSIyMCIgeT0iMTkiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzVfdW50Q1owRWVhXzJjUENweGt4WnciIHR5cGU9Ik9iamVjdEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9tMEhHWUNaX0VlYTdFWXhyem5fN2xBIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfNV91bnRTWjBFZWFfMmNQQ3B4a3hadyIgeD0iMSIgeT0iLTE4Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iXzVfdFprU1owRWVhXzJjUENweGt4WnciLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjXzVfQmRFQ1owRWVhXzJjUENweGt4WnciLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il81X3Raa2laMEVlYV8yY1BDcHhreFp3IiBwb2ludHM9Ils1ODgsIDIzNiwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzY0MywgMjM1LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il82QW5fa0NaMEVlYV8yY1BDcHhreFp3IiBpZD0iKDAuMDYyNSwwLjMxMjUpIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9LSFAtUUNjTUVlYW9NdFFpZmktUHBBIiB0eXBlPSJDb250cm9sRmxvd19FZGdlIiBzb3VyY2U9Il9XTVdDNENaX0VlYTdFWXhyem5fN2xBIiB0YXJnZXQ9Il85U1VCUUNjTkVlYW9NdFFpZmktUHBBIj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9LSFAtUXljTUVlYW9NdFFpZmktUHBBIiB0eXBlPSJDb250cm9sRmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iXzM1RDZFQ2NNRWVhb010UWlmaS1QcEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LSFAtUkNjTUVlYW9NdFFpZmktUHBBIiB4PSItMjEiIHk9IjE5Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9LSFAtUlNjTUVlYW9NdFFpZmktUHBBIiB0eXBlPSJDb250cm9sRmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfMzVVWXdDY01FZWFvTXRRaWZpLVBwQSIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0tIUC1SaWNNRWVhb010UWlmaS1QcEEiIHg9Ii0xIiB5PSIxNyIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS0hQLVJ5Y01FZWFvTXRRaWZpLVBwQSIgdHlwZT0iQ29udHJvbEZsb3dfR3VhcmRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfMzVpYk1DY01FZWFvTXRRaWZpLVBwQSIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0tIUC1TQ2NNRWVhb010UWlmaS1QcEEiIHg9IjIxIiB5PSIxOSIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS0hQLVNTY01FZWFvTXRRaWZpLVBwQSIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il8zNXVvY0NjTUVlYW9NdFFpZmktUHBBIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfS0hQLVNpY01FZWFvTXRRaWZpLVBwQSIgeD0iMSIgeT0iLTE4Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0tIUC1RU2NNRWVhb010UWlmaS1QcEEiLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19LR3JXZ0NjTUVlYW9NdFFpZmktUHBBIi8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfS0hQLVFpY01FZWFvTXRRaWZpLVBwQSIgcG9pbnRzPSJbMTY3LCAyNjEsIC02NDM5ODQsIC02NDM5ODRdJFsyNDcsIDI1OCwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfS0g3NndDY01FZWFvTXRRaWZpLVBwQSIgaWQ9IigxLjAsMC40NTU4NDU3NzExNDQyNzg5KSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9LSDc2d1NjTUVlYW9NdFFpZmktUHBBIiBpZD0iKDAuMTUsMC4zKSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfSzg2YThDY01FZWFvTXRRaWZpLVBwQSIgdHlwZT0iQ29udHJvbEZsb3dfRWRnZSIgc291cmNlPSJfSmxJaHl5WnpFZWFORHRVYTN3QUdNdyIgdGFyZ2V0PSJfOVNVQlFDY05FZWFvTXRRaWZpLVBwQSI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSzg2YTh5Y01FZWFvTXRRaWZpLVBwQSIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il8zNTYxc0NjTUVlYW9NdFFpZmktUHBBIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSzg2YTlDY01FZWFvTXRRaWZpLVBwQSIgeD0iLTI1IiB5PSIxNiIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSzg4UUlDY01FZWFvTXRRaWZpLVBwQSIgdHlwZT0iQ29udHJvbEZsb3dfV2VpZ2h0TGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iXzM2S0dRQ2NNRWVhb010UWlmaS1QcEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LODllUUNjTUVlYW9NdFFpZmktUHBBIiB4PSItMSIgeT0iMTgiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0s4X1RjQ2NNRWVhb010UWlmaS1QcEEiIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iXzM2WlcwQ2NNRWVhb010UWlmaS1QcEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LOF9UY1NjTUVlYW9NdFFpZmktUHBBIiB4PSIyNCIgeT0iMTgiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0s4X1RjaWNNRWVhb010UWlmaS1QcEEiIHR5cGU9IkNvbnRyb2xGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfMzZsa0VDY01FZWFvTXRRaWZpLVBwQSIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0s4X1RjeWNNRWVhb010UWlmaS1QcEEiIHg9IjEiIHk9Ii0xOCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9LODZhOFNjTUVlYW9NdFFpZmktUHBBIi8+DQotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iRk1VX0V4YW1wbGVzLnVtbCNfSzhWek1DY01FZWFvTXRRaWZpLVBwQSIvPg0KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0s4NmE4aWNNRWVhb010UWlmaS1QcEEiIHBvaW50cz0iWzE2NCwgMTc3LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjUwLCAyNDgsIC02NDM5ODQsIC02NDM5ODRdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0s5bEpVQ2NNRWVhb010UWlmaS1QcEEiIGlkPSIoMS4wLDAuNTc0ODc0MTA1NDg2MzUwMykiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSzlsSlVTY01FZWFvTXRRaWZpLVBwQSIgaWQ9IigwLjMsMC4xNjY2NjY2NjY2NjY2NjY2NikiLz4NCi0gICAgPC9lZGdlcz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX0xfampzQ2NNRWVhb010UWlmaS1QcEEiIHR5cGU9IkNvbnRyb2xGbG93X0VkZ2UiIHNvdXJjZT0iXzlTVUJRQ2NORWVhb010UWlmaS1QcEEiIHRhcmdldD0iX0psSWhReVp6RWVhTkR0VWEzd0FHTXciPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xfa3gwQ2NNRWVhb010UWlmaS1QcEEiIHR5cGU9IkNvbnRyb2xGbG93X05hbWVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfMzN2cmNDY01FZWFvTXRRaWZpLVBwQSIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0xfa3gwU2NNRWVhb010UWlmaS1QcEEiIHg9Ii0xOSIgeT0iMTciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xfa3gwaWNNRWVhb010UWlmaS1QcEEiIHR5cGU9IkNvbnRyb2xGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il8zNFJQNENjTUVlYW9NdFFpZmktUHBBIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTF9reDB5Y01FZWFvTXRRaWZpLVBwQSIgeT0iMTkiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xfa3gxQ2NNRWVhb010UWlmaS1QcEEiIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iXzM0Z2djQ2NNRWVhb010UWlmaS1QcEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9MX2t4MVNjTUVlYW9NdFFpZmktUHBBIiB4PSIxOCIgeT0iMTkiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xfa3gxaWNNRWVhb010UWlmaS1QcEEiIHR5cGU9IkNvbnRyb2xGbG93X1N0ZXJlb3R5cGVMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfMzR1aTRDY01FZWFvTXRRaWZpLVBwQSIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0xfa3gxeWNNRWVhb010UWlmaS1QcEEiIHg9Ii0xIiB5PSItMTciLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfTF9qanNTY01FZWFvTXRRaWZpLVBwQSIvPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0wtMXlBQ2NNRWVhb010UWlmaS1QcEEiLz4NCi0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9MX2pqc2ljTUVlYW9NdFFpZmktUHBBIiBwb2ludHM9IlsyNjQsIDI1NCwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzM1MiwgMjU0LCAtNjQzOTg0LCAtNjQzOTg0XSIvPg0KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9NQWRpb0NjTUVlYW9NdFFpZmktUHBBIiBpZD0iKDAuOCwwLjMpIi8+DQotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX01BZXd3Q2NNRWVhb010UWlmaS1QcEEiIGlkPSIoMC4wLDAuNDUpIi8+DQotICAgIDwvZWRnZXM+DQotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9DLUJtNENjT0VlYW9NdFFpZmktUHBBIiB0eXBlPSJDb250cm9sRmxvd19FZGdlIiBzb3VyY2U9Il8zbDU0RUNjTkVlYW9NdFFpZmktUHBBIiB0YXJnZXQ9Il85U1VCUUNjTkVlYW9NdFFpZmktUHBBIj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9DLUJtNHljT0VlYW9NdFFpZmktUHBBIiB0eXBlPSJDb250cm9sRmxvd19OYW1lTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1VNVkY4Q2NPRWVhb010UWlmaS1QcEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9DLUJtNUNjT0VlYW9NdFFpZmktUHBBIiB4PSItMTYiIHk9IjE3Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9DLUJtNVNjT0VlYW9NdFFpZmktUHBBIiB0eXBlPSJDb250cm9sRmxvd19XZWlnaHRMYWJlbCI+DQotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfVU0ycVlDY09FZWFvTXRRaWZpLVBwQSIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+DQotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0MtQm01aWNPRWVhb010UWlmaS1QcEEiIHk9IjE5Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9DLUJtNXljT0VlYW9NdFFpZmktUHBBIiB0eXBlPSJDb250cm9sRmxvd19HdWFyZExhYmVsIj4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9VTk1Ca0NjT0VlYW9NdFFpZmktUHBBIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfQy1CbTZDY09FZWFvTXRRaWZpLVBwQSIgeD0iMTciIHk9IjE3Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9DLUJtNlNjT0VlYW9NdFFpZmktUHBBIiB0eXBlPSJDb250cm9sRmxvd19TdGVyZW90eXBlTGFiZWwiPg0KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1VOZEhVQ2NPRWVhb010UWlmaS1QcEEiIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9DLUJtNmljT0VlYW9NdFFpZmktUHBBIiB4PSItMSIgeT0iLTE3Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0MtQm00U2NPRWVhb010UWlmaS1QcEEiLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19DOU84c0NjT0VlYW9NdFFpZmktUHBBIi8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfQy1CbTRpY09FZWFvTXRRaWZpLVBwQSIgcG9pbnRzPSJbMTY5LCAzNTIsIC02NDM5ODQsIC02NDM5ODRdJFsyNTIsIDI3MywgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfQy01d29DY09FZWFvTXRRaWZpLVBwQSIgaWQ9IigxLjAsMC4yOTQ0NTAwNzk2OTg1OTUyKSIvPg0KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9DLTV3b1NjT0VlYW9NdFFpZmktUHBBIiBpZD0iKDAuMjE1NDQ1NTQ0NTU0NDU1NjQsMC43MTU0NDU1NDQ1NTQ0NTc1KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfbGtGYjhDY09FZWFvTXRRaWZpLVBwQSIgdHlwZT0iQ29udHJvbEZsb3dfRWRnZSIgc291cmNlPSJfZ2RBTllDY09FZWFvTXRRaWZpLVBwQSIgdGFyZ2V0PSJfOVNVQlFDY05FZWFvTXRRaWZpLVBwQSI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbGtGYjh5Y09FZWFvTXRRaWZpLVBwQSIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbGtGYjlDY09FZWFvTXRRaWZpLVBwQSIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2xrRmI5U2NPRWVhb010UWlmaS1QcEEiIHR5cGU9IkNvbnRyb2xGbG93X1dlaWdodExhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbGtGYjlpY09FZWFvTXRRaWZpLVBwQSIgeT0iMjAiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2xrRmI5eWNPRWVhb010UWlmaS1QcEEiIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9sa0ZiLUNjT0VlYW9NdFFpZmktUHBBIiB5PSIyMCIvPg0KLSAgICAgIDwvY2hpbGRyZW4+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbGtGYi1TY09FZWFvTXRRaWZpLVBwQSIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbGtGYi1pY09FZWFvTXRRaWZpLVBwQSIgeT0iLTIwIi8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX2xrRmI4U2NPRWVhb010UWlmaS1QcEEiLz4NCi0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19samlwWUNjT0VlYW9NdFFpZmktUHBBIi8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfbGtGYjhpY09FZWFvTXRRaWZpLVBwQSIgcG9pbnRzPSJbMTcyLCAzODcsIC02NDM5ODQsIC02NDM5ODRdJFsyNTQsIDI3NiwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4NCi0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfbGt3S1VDY09FZWFvTXRRaWZpLVBwQSIgaWQ9IigxLjAsMC4zNDY1NDg1MDc0NjI2ODY1NikiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfbGt3S1VTY09FZWFvTXRRaWZpLVBwQSIgaWQ9IigwLjMxODEzMTg2ODEzMTg2ODYsMC44MTgxMzE4NjgxMzE4Njc3KSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgPC9ub3RhdGlvbjpEaWFncmFtPg0KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfWndxblVDbDJFZWFxNExVQmRfWTlzQSIgdHlwZT0iQ29tcG9zaXRlU3RydWN0dXJlIiBuYW1lPSJOZXdTaW1leENvbXBvc2l0ZVN0cnVjdHVyZURpYWdyYW0iIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPg0KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9hbWRtNENsMkVlYXE0TFVCZF9ZOXNBIiB0eXBlPSJDbGFzc19TaGFwZSI+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfYW1lTjhDbDJFZWFxNExVQmRfWTlzQSIgdHlwZT0iQ2xhc3NfTmFtZUxhYmVsIi8+DQotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfYW1lTjhTbDJFZWFxNExVQmRfWTlzQSIgdHlwZT0iQ2xhc3NfRmxvYXRpbmdOYW1lTGFiZWwiPg0KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9hbWVOOGlsMkVlYXE0TFVCZF9ZOXNBIiB5PSI1Ii8+DQotICAgICAgPC9jaGlsZHJlbj4NCi0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX2FtZU44eWwyRWVhcTRMVUJkX1k5c0EiIHR5cGU9IkNsYXNzX1N0cnVjdHVyZUNvbXBhcnRtZW50Ij4NCi0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX2FtZU45Q2wyRWVhcTRMVUJkX1k5c0EiLz4NCi0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2FtZU45U2wyRWVhcTRMVUJkX1k5c0EiLz4NCi0gICAgICA8L2NoaWxkcmVuPg0KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0psQnpnQ1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9hbWRtNFNsMkVlYXE0TFVCZF9ZOXNBIiB4PSIyMDIiIHk9Ijg0IiB3aWR0aD0iNjkwIiBoZWlnaHQ9IjMwMSIvPg0KLSAgICA8L2NoaWxkcmVuPg0KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9hbkt4Z0NsMkVlYXE0TFVCZF9ZOXNBIiB0eXBlPSJTdGVyZW90eXBlQ29tbWVudCI+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfYW5LeGdTbDJFZWFxNExVQmRfWTlzQSIvPg0KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVPYmplY3RWYWx1ZVN0eWxlIiB4bWk6aWQ9Il9hbkxZa0NsMkVlYXE0TFVCZF9ZOXNBIiBuYW1lPSJCQVNFX0VMRU1FTlQiPg0KLSAgICAgICAgPGVPYmplY3RWYWx1ZSB4bWk6dHlwZT0idW1sOkNsYXNzIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19KbEJ6Z0NaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgPC9zdHlsZXM+DQotICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPg0KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2FuS3hnaWwyRWVhcTRMVUJkX1k5c0EiIHg9IjIwMCIvPg0KLSAgICA8L2NoaWxkcmVuPg0KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTdHJpbmdWYWx1ZVN0eWxlIiB4bWk6aWQ9Il9ad3FuVVNsMkVlYXE0TFVCZF9ZOXNBIiBuYW1lPSJkaWFncmFtX2NvbXBhdGliaWxpdHlfdmVyc2lvbiIgc3RyaW5nVmFsdWU9IjEuMi4wIi8+DQotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW1TdHlsZSIgeG1pOmlkPSJfWndxblVpbDJFZWFxNExVQmRfWTlzQSIvPg0KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJzdHlsZTpQYXB5cnVzVmlld1N0eWxlIiB4bWk6aWQ9Il9ad3FuVXlsMkVlYXE0TFVCZF9ZOXNBIj4NCi0gICAgICA8b3duZXIgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiBocmVmPSJGTVVfRXhhbXBsZXMudW1sI19GU2R5SUNaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgPGNvbmZpZ3VyYXRpb24geG1pOnR5cGU9ImNvbmZpZ3VyYXRpb246UGFweXJ1c0RpYWdyYW0iIGhyZWY9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLnNpbWV4L2NvbmZpZy9zaW1leC5jb25maWd1cmF0aW9uI19hLVdzVUZpYUVlV1pVTUpoamdUS0V3Ii8+DQotICAgIDwvc3R5bGVzPg0KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0ZTZHlJQ1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX2FuTF9vQ2wyRWVhcTRMVUJkX1k5c0EiIHR5cGU9IlN0ZXJlb3R5cGVDb21tZW50TGluayIgc291cmNlPSJfYW1kbTRDbDJFZWFxNExVQmRfWTlzQSIgdGFyZ2V0PSJfYW5LeGdDbDJFZWFxNExVQmRfWTlzQSI+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9hbkxfb1NsMkVlYXE0TFVCZF9ZOXNBIi8+DQotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RU9iamVjdFZhbHVlU3R5bGUiIHhtaTppZD0iX2FuT2I0Q2wyRWVhcTRMVUJkX1k5c0EiIG5hbWU9IkJBU0VfRUxFTUVOVCI+DQotICAgICAgICA8ZU9iamVjdFZhbHVlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IkZNVV9FeGFtcGxlcy51bWwjX0psQnpnQ1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICA8L3N0eWxlcz4NCi0gICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+DQotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfYW5MX29pbDJFZWFxNExVQmRfWTlzQSIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+DQotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2FuTjAwQ2wyRWVhcTRMVUJkX1k5c0EiLz4NCi0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfYW5OMDBTbDJFZWFxNExVQmRfWTlzQSIvPg0KLSAgICA8L2VkZ2VzPg0KLSAgPC9ub3RhdGlvbjpEaWFncmFtPg0KLTwveG1pOlhNST4NCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvcmVzb3VyY2VzL0ZNVV9FeGFtcGxlcy51bWwgYi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvcmVzb3VyY2VzL0ZNVV9FeGFtcGxlcy51bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZWQ3NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvZm11X2J1aWxkL3Jlc291cmNlcy9GTVVfRXhhbXBsZXMudW1sCisrKyAvZGV2L251bGwKQEAgLTEsNjgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIwMTMxMDAxIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9zcGVjL1hNSS8yMDEzMTAwMSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOmZtaXByb2ZpbGU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGFweXJ1cy9GTUlQcm9maWxlLzEuMC4wIiB4bWxuczpzdGFuZGFyZD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTC9Qcm9maWxlL1N0YW5kYXJkIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwiPg0KLSAgPHVtbDpNb2RlbCB4bWk6aWQ9Il9xOERPY01YUEVlV3d4X3B1SER6Rll3IiBuYW1lPSJGTVUgRXhhbXBsZXMiPg0KLSAgICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlBhY2thZ2VJbXBvcnQiIHhtaTppZD0iX3JFVVpvTVhQRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjXzAiLz4NCi0gICAgPC9wYWNrYWdlSW1wb3J0Pg0KLSAgICA8cGFja2FnZUltcG9ydCB4bWk6dHlwZT0idW1sOlBhY2thZ2VJbXBvcnQiIHhtaTppZD0iX1p2akwwT3hURWVXUDZlTl82WmNnbXciPg0KLSAgICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1BBUFlSVVNfZlVNTF9MSUJSQVJZL2ZVTUxfTGlicmFyeS51bWwjXzAiLz4NCi0gICAgPC9wYWNrYWdlSW1wb3J0Pg0KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfN1NBb0lPeE9FZVdQNmVOXzZaY2dtdyIgbmFtZT0iRURGIj4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciIG5hbWU9IkMxIiBjbGFzc2lmaWVyQmVoYXZpb3I9Il9iblJBVU1YUUVlV3d4X3B1SER6Rll3IiBpc0FjdGl2ZT0idHJ1ZSI+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOnR5cGU9InVtbDpQcm9wZXJ0eSIgeG1pOmlkPSJfUlVrQmNNWFFFZVd3eF9wdUhEekZZdyIgbmFtZT0idmFsdmUiIHZpc2liaWxpdHk9InB1YmxpYyI+DQotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPg0KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX1ZzOFc4TVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRCZWhhdmlvciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiB4bWk6aWQ9Il9iblJBVU1YUUVlV3d4X3B1SER6Rll3IiBuYW1lPSJDMSBDbGFzc2lmaWVyQmVoYXZpb3IiIG5vZGU9Il94ckFrVU1YUUVlV3d4X3B1SER6Rll3IF94NkpNZ01YUUVlV3d4X3B1SER6Rll3IF95SUd3QU1YUUVlV3d4X3B1SER6Rll3IF9Nd0VRb01YU0VlV3d4X3B1SER6Rll3IF9iZS1mb01YVEVlV3d4X3B1SER6Rll3IF9oY2xib01YVkVlV3d4X3B1SER6Rll3IF9pYTV6SU1YWEVlV3d4X3B1SER6Rll3IF94RjlTVU1YWEVlV3d4X3B1SER6Rll3IiBncm91cD0iX2JlLWZvTVhURWVXd3hfcHVIRHpGWXcgX2lhNXpJTVhYRWVXd3hfcHVIRHpGWXcgX3hGOVNVTVhYRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTp0eXBlPSJ1bWw6Q29tbWVudCIgeG1pOmlkPSJfc1JUN3dNWFFFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgICAgPGJvZHk+bW9kZWwgQzEmI3hEOw0KLSAgZGlzY3JldGUgb3V0cHV0IEJvb2xlYW4gdmFsdmUoc3RhcnQgPSBmYWxzZSwgZml4ZWQgPSBmYWxzZSk7JiN4RDsNCi1lcXVhdGlvbiYjeEQ7DQotICB3aGVuIHRpbWUgPj0gMC41IHRoZW4mI3hEOw0KLSAgICB2YWx2ZSA9IHRydWU7JiN4RDsNCi0gIGVsc2V3aGVuIHRpbWUgPj0gMy4yIHRoZW4mI3hEOw0KLSAgICB2YWx2ZSA9IGZhbHNlOyYjeEQ7DQotICBlbHNld2hlbiB0aW1lID49IDUuMiB0aGVuJiN4RDsNCi0gICAgdmFsdmUgPSB0cnVlOyYjeEQ7DQotICBlbmQgd2hlbjsmI3hEOw0KLWVuZCBDMTs8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9XT1hQc01YVkVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il94ckFrVU1YUUVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9Nd0VRb01YU0VlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX2M2SnlRTVhWRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX2JlLWZvTVhURWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX3hyQWtVTVhRRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfZGNIUDBNWFZFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfeDZKTWdNWFFFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfYmUtZm9NWFRFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9Qemdrd01YWUVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9pYTV6SU1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il94NkpNZ01YUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX1FZdl8wTVhZRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX3lJR3dBTVhRRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX2lhNXpJTVhYRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfUXlZbjBNWFlFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfeEY5U1VNWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfeUlHd0FNWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9SUzFDY01YWUVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9oY2xib01YVkVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il94RjlTVU1YWEVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxzdHJ1Y3R1cmVkTm9kZSB4bWk6dHlwZT0idW1sOlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIHhtaTppZD0iX2JlLWZvTVhURWVXd3hfcHVIRHpGWXciIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUxIiBpbmNvbWluZz0iX2M2SnlRTVhWRWVXd3hfcHVIRHpGWXciIG91dGdvaW5nPSJfZGNIUDBNWFZFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il91cEFFZ01YVEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9Kci1fSU1YVEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9sMG0yc01YVEVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il91cFJ4VU1YVEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il91cFNZWU1YVEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX3M1aTVFTVhURWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX0pyOGk0TVhURWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX2p6UlJFTVhURWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX3M1dnRZTVhURWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3M1dnRZY1hURWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9lZGdlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgeG1pOmlkPSJfSnJ6WThNWFRFZVd3eF9wdUhEekZZdyIgbmFtZT0ic2V0IFZhbHZlIiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX1JVa0JjTVhRRWVXd3hfcHVIRHpGWXciIGlzUmVwbGFjZUFsbD0idHJ1ZSI+DQotICAgICAgICAgICAgICA8b2JqZWN0IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX0pyOGk0TVhURWVXd3hfcHVIRHpGWXciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9zNWk1RU1YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfSnI5eEFNWFRFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX0pyLV9JTVhURWVXd3hfcHVIRHpGWXciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iX3VwQUVnTVhURWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4NCi0gICAgICAgICAgICAgIDwvdmFsdWU+DQotICAgICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIHhtaTppZD0iX2p6UUM4TVhURWVXd3hfcHVIRHpGWXciIG5hbWU9InRoaXMiPg0KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfanpSUkVNWFRFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX3M1aTVFTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9Il9iblJBVU1YUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiB4bWk6aWQ9Il9sMGNlb01YVEVlV3d4X3B1SER6Rll3IiBuYW1lPSJ0cnVlIj4NCi0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX2wwbTJzTVhURWVXd3hfcHVIRHpGWXciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il91cEFFZ01YVEVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+DQotICAgICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX21YZTZRTVhURWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX21YZVRNTVhURWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8L3Jlc3VsdD4NCi0gICAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9tWFdYWU1YVEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSI+DQotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPg0KLSAgICAgICAgICAgICAgPC92YWx1ZT4NCi0gICAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgIDwvc3RydWN0dXJlZE5vZGU+DQotICAgICAgICAgIDxzdHJ1Y3R1cmVkTm9kZSB4bWk6dHlwZT0idW1sOlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIHhtaTppZD0iX2lhNXpJTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyIiBpbmNvbWluZz0iX1B6Z2t3TVhZRWVXd3hfcHVIRHpGWXciIG91dGdvaW5nPSJfUVl2XzBNWFlFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9GSHJVTU1YWUVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9tSkVHOE1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9yd2xKRU1YWEVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9GSUoxVU1YWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9GSUoxVWNYWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX0hGbzFzTVhZRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX21KSEtRTVhYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX3VJUUxFTVhYRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0hHQ2VVTVhZRWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0hHQ2VVY1hZRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9lZGdlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgeG1pOmlkPSJfbUlfT2NNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0ic2V0IFZhbHZlIiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX1JVa0JjTVhRRWVXd3hfcHVIRHpGWXciIGlzUmVwbGFjZUFsbD0idHJ1ZSI+DQotICAgICAgICAgICAgICA8b2JqZWN0IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX21KRUc4TVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9GSHJVTU1YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfbUpGVkVNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX21KSEtRTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iX0hGbzFzTVhZRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4NCi0gICAgICAgICAgICAgIDwvdmFsdWU+DQotICAgICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIHhtaTppZD0iX3J3a2lBTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InNlbGYiPg0KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfcndsSkVNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0ZIclVNTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9iblJBVU1YUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiB4bWk6aWQ9Il91SVBrQU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJmYWxzZSI+DQotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il91SVFMRU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfSEZvMXNNWFlFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPg0KLSAgICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il91akotWU1YWEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il91akpYVU1YWEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPC9yZXN1bHQ+DQotICAgICAgICAgICAgICA8dmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfdWpJd1FNWFhFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPg0KLSAgICAgICAgICAgICAgPC92YWx1ZT4NCi0gICAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgIDwvc3RydWN0dXJlZE5vZGU+DQotICAgICAgICAgIDxzdHJ1Y3R1cmVkTm9kZSB4bWk6dHlwZT0idW1sOlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIHhtaTppZD0iX3hGOVNVTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzIiBpbmNvbWluZz0iX1F5WW4wTVhZRWVXd3hfcHVIRHpGWXciIG91dGdvaW5nPSJfUlMxQ2NNWFlFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9LbFk2RU1YWUVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il95MlBrTU1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il80bXhZWU1YWEVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9LbHhVa01YWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9LbHhVa2NYWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX01TblE0TVhZRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX3kyU0FjTVhYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iXzYxSlVjTVhYRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX01URFZ3TVhZRWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX01URFZ3Y1hZRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9lZGdlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgeG1pOmlkPSJfeTJNZzRNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0ic2V0IFZhbHZlIiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX1JVa0JjTVhRRWVXd3hfcHVIRHpGWXciIGlzUmVwbGFjZUFsbD0idHJ1ZSI+DQotICAgICAgICAgICAgICA8b2JqZWN0IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX3kyUGtNTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9LbFk2RU1YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfeTJReVVNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX3kyU0FjTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iX01TblE0TVhZRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4NCi0gICAgICAgICAgICAgIDwvdmFsdWU+DQotICAgICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIHhtaTppZD0iXzRtclJ3TVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InNlbGYiPg0KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfNG14WVlNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0tsWTZFTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9iblJBVU1YUUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiB4bWk6aWQ9Il82MUl0WU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJ0cnVlIj4NCi0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iXzYxSlVjTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il9NU25RNE1YWUVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+DQotICAgICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzdNem1nY1hYRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzdNem1nTVhYRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8L3Jlc3VsdD4NCi0gICAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il83TXlfY01YWEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSI+DQotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPg0KLSAgICAgICAgICAgICAgPC92YWx1ZT4NCi0gICAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgIDwvc3RydWN0dXJlZE5vZGU+DQotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIHhtaTppZD0iX3hyQWtVTVhRRWVXd3hfcHVIRHpGWXciIG5hbWU9ImF0IDAuNSIgaW5jb21pbmc9Il9XT1hQc01YVkVlV3d4X3B1SER6Rll3IiBvdXRnb2luZz0iX2M2SnlRTVhWRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICAgIDx0cmlnZ2VyIHhtaTp0eXBlPSJ1bWw6VHJpZ2dlciIgeG1pOmlkPSJfZERIZDBNWFJFZVd3eF9wdUhEekZZdyIgZXZlbnQ9Il9GT0ZpWU1YUkVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgeG1pOmlkPSJfeDZKTWdNWFFFZVd3eF9wdUhEekZZdyIgbmFtZT0iYXQgMy4yIiBpbmNvbWluZz0iX2RjSFAwTVhWRWVXd3hfcHVIRHpGWXciIG91dGdvaW5nPSJfUHpna3dNWFlFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgICAgPHRyaWdnZXIgeG1pOnR5cGU9InVtbDpUcmlnZ2VyIiB4bWk6aWQ9Il9sM2VQWU1YUkVlV3d4X3B1SER6Rll3IiBldmVudD0iX0xHN2xFTVhSRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiB4bWk6aWQ9Il95SUd3QU1YUUVlV3d4X3B1SER6Rll3IiBuYW1lPSJhdCA1LjIiIGluY29taW5nPSJfUVl2XzBNWFlFZVd3eF9wdUhEekZZdyIgb3V0Z29pbmc9Il9ReVluME1YWUVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICA8dHJpZ2dlciB4bWk6dHlwZT0idW1sOlRyaWdnZXIiIHhtaTppZD0iX3FlZG9vTVhSRWVXd3hfcHVIRHpGWXciIGV2ZW50PSJfTFdtWXdNWFJFZVd3eF9wdUhEekZZdyIvPg0KLSAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6SW5pdGlhbE5vZGUiIHhtaTppZD0iX013RVFvTVhTRWVXd3hfcHVIRHpGWXciIG5hbWU9IkluaXRpYWxOb2RlMSIgb3V0Z29pbmc9Il9XT1hQc01YVkVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlGaW5hbE5vZGUiIHhtaTppZD0iX2hjbGJvTVhWRWVXd3hfcHVIRHpGWXciIG5hbWU9IkFjdGl2aXR5RmluYWxOb2RlMSIgaW5jb21pbmc9Il9SUzFDY01YWUVlV3d4X3B1SER6Rll3Ii8+DQotICAgICAgICA8L293bmVkQmVoYXZpb3I+DQotICAgICAgICA8b3duZWRCZWhhdmlvciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiB4bWk6aWQ9Il9DbE5wWU1YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJDMV9GYWN0b3J5IiBub2RlPSJfQ2xPM2djWFdFZVd3eF9wdUhEekZZdyBfQ291UVlNWFdFZVd3eF9wdUhEekZZdyBfQ291M2NzWFdFZVd3eF9wdUhEekZZdyBfQ293c29jWFdFZVd3eF9wdUhEekZZdyBfQ294VHNjWFdFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6dHlwZT0idW1sOlBhcmFtZXRlciIgeG1pOmlkPSJfQ2xPM2dNWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIgZGlyZWN0aW9uPSJyZXR1cm4iLz4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9Db3dGa3NYV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJjcmVhdGVPYmplY3RBY3Rpb24gdG8gY2FsbENvbnN0cnVjdG9yIiB0YXJnZXQ9Il9Db3ZlZ01YV0VlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9Db3UzY01YV0VlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfQ284UzBNWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NvOFMwY1hXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9Db3dzb01YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJjYWxsQ29uc3RydWN0b3IgdG8gcmV0dXJuUGFyYW1Ob2RlIiB0YXJnZXQ9Il9DbE8zZ2NYV0VlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9Db3hUc2NYV0VlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfQ284UzBzWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NvOFMwOFhXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9Db3hUc3NYV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJmb3JrIHRvIHN0YXJ0YmVoYXZpb3IgaW5wdXQgcGluIiB0YXJnZXQ9Il9Db3dzb3NYV0VlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9Db3hUc2NYV0VlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfQ284NTRNWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NvODU0Y1hXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9Db3hUczhYV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJjYWxsQ29uc3RydWN0b3IgdG8gc3RhcnRCZWhhdmlvciIgdGFyZ2V0PSJfQ294VHNjWFdFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfQ293RmtNWFdFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0NvODU0c1hXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Dbzg1NDhYV0VlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9Il9DbE8zZ2NYV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHRQYXJhbWV0ZXJOb2RlIiBpbmNvbWluZz0iX0Nvd3NvTVhXRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3IiBwYXJhbWV0ZXI9Il9DbE8zZ01YV0VlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9DbFBla01YV0VlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6Q3JlYXRlT2JqZWN0QWN0aW9uIiB4bWk6aWQ9Il9Db3VRWU1YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJjcmVhdGVPYmplY3QiIGNsYXNzaWZpZXI9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il9Db3UzY01YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfQ293RmtzWFdFZVd3eF9wdUhEekZZdyIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQ291M2NjWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L3Jlc3VsdD4NCi0gICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkNhbGxPcGVyYXRpb25BY3Rpb24iIHhtaTppZD0iX0NvdTNjc1hXRWVXd3hfcHVIRHpGWXciIG5hbWU9ImNhbGxDb25zdHJ1Y3RvciIgb3BlcmF0aW9uPSJfQ29sdGdNWFdFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfQ293RmtNWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0NveFRzOFhXRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0Nvd0ZrY1hXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9yZXN1bHQ+DQotICAgICAgICAgICAgPHRhcmdldCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9Db3ZlZ01YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJ0YXJnZXQiIGluY29taW5nPSJfQ293RmtzWFdFZVd3eF9wdUhEekZZdyIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQ292ZWdjWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24iIHhtaTppZD0iX0Nvd3NvY1hXRWVXd3hfcHVIRHpGWXciIG5hbWU9InN0YXJ0IGNsYXNzaWZpZXIgYmVoYXZpb3IiPg0KLSAgICAgICAgICAgIDxvYmplY3QgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgeG1pOmlkPSJfQ293c29zWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0ib2JqZWN0IiBpbmNvbWluZz0iX0NveFRzc1hXRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NveFRzTVhXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9vYmplY3Q+DQotICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpGb3JrTm9kZSIgeG1pOmlkPSJfQ294VHNjWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0iZm9ya0luc3RhbmNpYXRlZE9iamVjdCIgaW5jb21pbmc9Il9Db3hUczhYV0VlV3d4X3B1SER6Rll3IiBvdXRnb2luZz0iX0Nvd3NvTVhXRWVXd3hfcHVIRHpGWXcgX0NveFRzc1hXRWVXd3hfcHVIRHpGWXciLz4NCi0gICAgICAgIDwvb3duZWRCZWhhdmlvcj4NCi0gICAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgeG1pOmlkPSJfQ29sdGdNWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0iQzEiPg0KLSAgICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOnR5cGU9InVtbDpQYXJhbWV0ZXIiIHhtaTppZD0iX0NvcW1BTVhXRWVXd3hfcHVIRHpGWXciIG5hbWU9InJldHVybiIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciIGRpcmVjdGlvbj0icmV0dXJuIi8+DQotICAgICAgICA8L293bmVkT3BlcmF0aW9uPg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il9Cc0RtRU1YUkVlV3d4X3B1SER6Rll3IiBuYW1lPSJFdmVudHMgQzEiPg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlRpbWVFdmVudCIgeG1pOmlkPSJfRk9GaVlNWFJFZVd3eF9wdUhEekZZdyIgbmFtZT0iYXQgMC41Ij4NCi0gICAgICAgICAgPHdoZW4geG1pOnR5cGU9InVtbDpUaW1lRXhwcmVzc2lvbiIgeG1pOmlkPSJfSk9Tb2NNWFJFZVd3eF9wdUhEekZZdyI+DQotICAgICAgICAgICAgPGV4cHIgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfSk9Tb2NjWFJFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjAuNSIvPg0KLSAgICAgICAgICA8L3doZW4+DQotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpUaW1lRXZlbnQiIHhtaTppZD0iX0xHN2xFTVhSRWVXd3hfcHVIRHpGWXciIG5hbWU9ImF0IDMuMiI+DQotICAgICAgICAgIDx3aGVuIHhtaTp0eXBlPSJ1bWw6VGltZUV4cHJlc3Npb24iIHhtaTppZD0iX0xHN2xFY1hSRWVXd3hfcHVIRHpGWXciPg0KLSAgICAgICAgICAgIDxleHByIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFJlYWwiIHhtaTppZD0iX0xHN2xFc1hSRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIzLjIiLz4NCi0gICAgICAgICAgPC93aGVuPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6VGltZUV2ZW50IiB4bWk6aWQ9Il9MV21Zd01YUkVlV3d4X3B1SER6Rll3IiBuYW1lPSJhdCA1LjIiPg0KLSAgICAgICAgICA8d2hlbiB4bWk6dHlwZT0idW1sOlRpbWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9MV21Zd2NYUkVlV3d4X3B1SER6Rll3Ij4NCi0gICAgICAgICAgICA8ZXhwciB4bWk6dHlwZT0idW1sOkxpdGVyYWxSZWFsIiB4bWk6aWQ9Il9MV21Zd3NYUkVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iNS4yIi8+DQotICAgICAgICAgIDwvd2hlbj4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iQzIiIGNsYXNzaWZpZXJCZWhhdmlvcj0iX0J4VUpNTWFFRWVXZkZkbnYyNkVmdWciIGlzQWN0aXZlPSJ0cnVlIj4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiB4bWk6aWQ9Il9hdUFGc01hREVlV2ZGZG52MjZFZnVnIiBuYW1lPSJhYm9ydCIgdmlzaWJpbGl0eT0icHVibGljIj4NCi0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+DQotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfbFR5X3NNYURFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiB4bWk6aWQ9Il93UTJqSU1hREVlV2ZGZG52MjZFZnVnIiBuYW1lPSJzaXplIiB2aXNpYmlsaXR5PSJwdWJsaWMiPg0KLSAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4NCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxSZWFsIiB4bWk6aWQ9Il8xNXhUY01hREVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMS4wIi8+DQotICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgPG93bmVkQmVoYXZpb3IgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgeG1pOmlkPSJfQnhVSk1NYUVFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iQzIgQ2xhc3NpZmllciBCZWhhdmlvciIgbm9kZT0iX3ROSWVBTWFFRWVXZkZkbnYyNkVmdWcgXzlubXNZTWFFRWVXZkZkbnYyNkVmdWcgX0lUQzdZTWFGRWVXZkZkbnYyNkVmdWcgX0tpWWd3TWFGRWVXZkZkbnYyNkVmdWcgX0xhVG5RTWFGRWVXZkZkbnYyNkVmdWcgX0tyS3o0TWFHRWVXZkZkbnYyNkVmdWciIGdyb3VwPSJfS2lZZ3dNYUZFZVdmRmRudjI2RWZ1ZyBfTGFUblFNYUZFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOnR5cGU9InVtbDpDb21tZW50IiB4bWk6aWQ9Il9ObUtRUU1hRUVlV2ZGZG52MjZFZnVnIj4NCi0gICAgICAgICAgICA8Ym9keT5tb2RlbCBDMiYjeEQ7DQotICBkaXNjcmV0ZSBvdXRwdXQgQm9vbGVhbiBhYm9ydChzdGFydCA9IGZhbHNlLCBmaXhlZCA9IGZhbHNlKTsmI3hEOw0KLSAgZGlzY3JldGUgb3V0cHV0IFJlYWwgc2l6ZShzdGFydCA9IDEuMCwgZml4ZWQgPSBmYWxzZSk7JiN4RDsNCi1lcXVhdGlvbiYjeEQ7DQotICB3aGVuIHRpbWUgPj0gMS45IHRoZW4mI3hEOw0KLSAgICBhYm9ydCA9IHRydWU7JiN4RDsNCi0gIGVuZCB3aGVuOyYjeEQ7DQotICB3aGVuIHRpbWUgPj0gNi41IHRoZW4mI3hEOw0KLSAgICBzaXplID0gMC41OyYjeEQ7DQotICBlbmQgd2hlbjsmI3hEOw0KLWVuZCBDMjs8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9NdHVoZ01hR0VlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il90TkllQU1hRUVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il9JVEM3WU1hRkVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX05MTDVrTWFHRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX0tpWWd3TWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX3ROSWVBTWFFRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfTnhiYU1NYUdFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfOW5tc1lNYUVFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfS2lZZ3dNYUZFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9PS1dRZ01hR0VlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il9MYVRuUU1hRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il85bm1zWU1hRUVlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX09uaDd3TWFHRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX0tyS3o0TWFHRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX0xhVG5RTWFGRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPHN0cnVjdHVyZWROb2RlIHhtaTp0eXBlPSJ1bWw6U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgeG1pOmlkPSJfS2lZZ3dNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTEiIGluY29taW5nPSJfTkxMNWtNYUdFZVdmRmRudjI2RWZ1ZyIgb3V0Z29pbmc9Il9OeGJhTU1hR0VlV2ZGZG52MjZFZnVnIj4NCi0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iXzBQNDVvTWFGRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX1pFeWFRTWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX1E0eUNJTWFGRWVXZkZkbnYyNkVmdWciPg0KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXzBRTDBrTWFGRWVXZkZkbnYyNkVmdWciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzBRTDBrY2FGRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9lZGdlPg0KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfMG9DVDRNYUZFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfWkUzU3dNYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfU3R1S2dNYUZFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfMG9WTzBNYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMG9WTzBjYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpSZWFkU2VsZkFjdGlvbiIgeG1pOmlkPSJfUTRtYjhNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0ic2VsZiI+DQotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il9RNHlDSU1hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfMFA0NW9NYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iX0J4VUpNTWFFRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIHhtaTppZD0iX1N0cnVRTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InRydWUiPg0KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfU3R1S2dNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iXzBvQ1Q0TWFGRWVXZkZkbnYyNkVmdWciPg0KLSAgICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4NCi0gICAgICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfVGZnTXdNYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfVGZmbHNNYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDwvcmVzdWx0Pg0KLSAgICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX1RmYXRNTWFGRWVXZkZkbnYyNkVmdWciIHZhbHVlPSJ0cnVlIj4NCi0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+DQotICAgICAgICAgICAgICA8L3ZhbHVlPg0KLSAgICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIHhtaTppZD0iX1pFcDNZTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InNldCBBYm9ydCIgc3RydWN0dXJhbEZlYXR1cmU9Il9hdUFGc01hREVlV2ZGZG52MjZFZnVnIiBpc1JlcGxhY2VBbGw9InRydWUiPg0KLSAgICAgICAgICAgICAgPG9iamVjdCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9aRXlhUU1hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJvYmplY3QiIGluY29taW5nPSJfMFA0NW9NYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX1pFMDJnTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9aRTNTd01hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJ2YWx1ZSIgaW5jb21pbmc9Il8wb0NUNE1hRkVlV2ZGZG52MjZFZnVnIj4NCi0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+DQotICAgICAgICAgICAgICA8L3ZhbHVlPg0KLSAgICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPC9zdHJ1Y3R1cmVkTm9kZT4NCi0gICAgICAgICAgPHN0cnVjdHVyZWROb2RlIHhtaTp0eXBlPSJ1bWw6U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgeG1pOmlkPSJfTGFUblFNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTIiIGluY29taW5nPSJfT0tXUWdNYUdFZVdmRmRudjI2RWZ1ZyIgb3V0Z29pbmc9Il9Pbmg3d01hR0VlV2ZGZG52MjZFZnVnIj4NCi0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iXzAtSzc4TWFGRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX3A0WTZVTWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX2ZVVDNrTWFGRWVXZkZkbnYyNkVmdWciPg0KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXzAtZFAwTWFGRWVXZkZkbnYyNkVmdWciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzAtZDI0TWFGRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9lZGdlPg0KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfMWJMQkFNYUZFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfcDRnUEVNYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfaENRbklNYUZFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfMWJmS0VNYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMWJmS0VjYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpSZWFkU2VsZkFjdGlvbiIgeG1pOmlkPSJfZlVTcGNNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0ic2VsZiI+DQotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il9mVVQza01hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfMC1LNzhNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iX0J4VUpNTWFFRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpWYWx1ZVNwZWNpZmljYXRpb25BY3Rpb24iIHhtaTppZD0iX2hDUFpBTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9IjAuNSI+DQotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il9oQ1FuSU1hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfMWJMQkFNYUZFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPg0KLSAgICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9CWnNJWU01UUVlV2FScG9kUjFTNldBIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9oMEZGb01hRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPC9yZXN1bHQ+DQotICAgICAgICAgICAgICA8dmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfQlpnaU1NNVFFZVdhUnBvZFIxUzZXQSIgdmFsdWU9IjAuNSI+DQotICAgICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjUmVhbCIvPg0KLSAgICAgICAgICAgICAgPC92YWx1ZT4NCi0gICAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiB4bWk6aWQ9Il9wNFZQOE1hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJzZXQgU2l6ZSIgc3RydWN0dXJhbEZlYXR1cmU9Il93UTJqSU1hREVlV2ZGZG52MjZFZnVnIiBpc1JlcGxhY2VBbGw9InRydWUiPg0KLSAgICAgICAgICAgICAgPG9iamVjdCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9wNFk2VU1hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJvYmplY3QiIGluY29taW5nPSJfMC1LNzhNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX3A0YXZnTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9wNGdQRU1hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJ2YWx1ZSIgaW5jb21pbmc9Il8xYkxCQU1hRkVlV2ZGZG52MjZFZnVnIj4NCi0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+DQotICAgICAgICAgICAgICA8L3ZhbHVlPg0KLSAgICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPC9zdHJ1Y3R1cmVkTm9kZT4NCi0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgeG1pOmlkPSJfdE5JZUFNYUVFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iYXQgMS45IiBpbmNvbWluZz0iX010dWhnTWFHRWVXZkZkbnYyNkVmdWciIG91dGdvaW5nPSJfTkxMNWtNYUdFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgPHRyaWdnZXIgeG1pOnR5cGU9InVtbDpUcmlnZ2VyIiB4bWk6aWQ9Il95RzdlZ01hRUVlV2ZGZG52MjZFZnVnIiBldmVudD0iX1hocHBBTWFFRWVXZkZkbnYyNkVmdWciLz4NCi0gICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiB4bWk6aWQ9Il85bm1zWU1hRUVlV2ZGZG52MjZFZnVnIiBuYW1lPSJhdCA2LjUiIGluY29taW5nPSJfTnhiYU1NYUdFZVdmRmRudjI2RWZ1ZyIgb3V0Z29pbmc9Il9PS1dRZ01hR0VlV2ZGZG52MjZFZnVnIj4NCi0gICAgICAgICAgICA8dHJpZ2dlciB4bWk6dHlwZT0idW1sOlRyaWdnZXIiIHhtaTppZD0iXzlubXNZY2FFRWVXZkZkbnYyNkVmdWciIGV2ZW50PSJfaVk0NFVNYUVFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6SW5pdGlhbE5vZGUiIHhtaTppZD0iX0lUQzdZTWFGRWVXZkZkbnYyNkVmdWciIG91dGdvaW5nPSJfTXR1aGdNYUdFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5RmluYWxOb2RlIiB4bWk6aWQ9Il9Lckt6NE1hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJBY3Rpdml0eUZpbmFsTm9kZTEiIGluY29taW5nPSJfT25oN3dNYUdFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgICAgICAgPC9vd25lZEJlaGF2aW9yPg0KLSAgICAgICAgPG93bmVkQmVoYXZpb3IgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgeG1pOmlkPSJfVy1hSElNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iQzJfRmFjdG9yeSIgbm9kZT0iX2ZZZUpZTWFHRWVXZkZkbnYyNkVmdWcgX2ZZaE1zTWFHRWVXZkZkbnYyNkVmdWcgX2ZZaHp3TWFHRWVXZkZkbnYyNkVmdWcgX2ZZaWEwY2FHRWVXZkZkbnYyNkVmdWcgX2ZZakI0c2FHRWVXZkZkbnYyNkVmdWciPg0KLSAgICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOnR5cGU9InVtbDpQYXJhbWV0ZXIiIHhtaTppZD0iX1ctYXVNTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciIGRpcmVjdGlvbj0icmV0dXJuIi8+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfZlloenhjYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iY3JlYXRlT2JqZWN0QWN0aW9uIHRvIGNhbGxDb25zdHJ1Y3RvciIgdGFyZ2V0PSJfZlloendjYUdFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfZlloTXNjYUdFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX2ZZa1FBTWFHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mWWszRU1hR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfZllpYTBNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iY2FsbENvbnN0cnVjdG9yIHRvIHJldHVyblBhcmFtTm9kZSIgdGFyZ2V0PSJfZlllSllNYUdFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfZllqQjRzYUdFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX2ZZazNFY2FHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mWWszRXNhR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfZllqbzhNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iZm9yayB0byBzdGFydGJlaGF2aW9yIGlucHV0IHBpbiIgdGFyZ2V0PSJfZllqQjRNYUdFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfZllqQjRzYUdFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX2ZZazNFOGFHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mWWszRk1hR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfZllqbzhjYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iY2FsbENvbnN0cnVjdG9yIHRvIHN0YXJ0QmVoYXZpb3IiIHRhcmdldD0iX2ZZakI0c2FHRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX2ZZaHp3OGFHRWVXZkZkbnYyNkVmdWciPg0KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9mWWszRmNhR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZllrM0ZzYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPC9lZGdlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfZlllSllNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0icmVzdWx0UGFyYW1ldGVyTm9kZSIgaW5jb21pbmc9Il9mWWlhME1hR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIgcGFyYW1ldGVyPSJfVy1hdU1NYUdFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZllnbG9NYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkNyZWF0ZU9iamVjdEFjdGlvbiIgeG1pOmlkPSJfZlloTXNNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iY3JlYXRlT2JqZWN0IiBjbGFzc2lmaWVyPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfZlloTXNjYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX2ZZaHp4Y2FHRWVXZkZkbnYyNkVmdWciIHR5cGU9Il9WOU1DRU1hREVlV2ZGZG52MjZFZnVnIj4NCi0gICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2ZZaE1zc2FHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9yZXN1bHQ+DQotICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpDYWxsT3BlcmF0aW9uQWN0aW9uIiB4bWk6aWQ9Il9mWWh6d01hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJjYWxsQ29uc3RydWN0b3IiIG9wZXJhdGlvbj0iX1hCV0dZTWFHRWVXZkZkbnYyNkVmdWciPg0KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX2ZZaHp3OGFHRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il9mWWpvOGNhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mWWh6eE1hR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvcmVzdWx0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgeG1pOmlkPSJfZlloendjYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0idGFyZ2V0IiBpbmNvbWluZz0iX2ZZaHp4Y2FHRWVXZkZkbnYyNkVmdWciIHR5cGU9Il9WOU1DRU1hREVlV2ZGZG52MjZFZnVnIj4NCi0gICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2ZZaHp3c2FHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpTdGFydE9iamVjdEJlaGF2aW9yQWN0aW9uIiB4bWk6aWQ9Il9mWWlhMGNhR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJzdGFydCBjbGFzc2lmaWVyIGJlaGF2aW9yIj4NCi0gICAgICAgICAgICA8b2JqZWN0IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX2ZZakI0TWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9mWWpvOE1hR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyI+DQotICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mWWpCNGNhR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvb2JqZWN0Pg0KLSAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6Rm9ya05vZGUiIHhtaTppZD0iX2ZZakI0c2FHRWVXZkZkbnYyNkVmdWciIG5hbWU9ImZvcmtJbnN0YW5jaWF0ZWRPYmplY3QiIGluY29taW5nPSJfZllqbzhjYUdFZVdmRmRudjI2RWZ1ZyIgb3V0Z29pbmc9Il9mWWlhME1hR0VlV2ZGZG52MjZFZnVnIF9mWWpvOE1hR0VlV2ZGZG52MjZFZnVnIi8+DQotICAgICAgICA8L293bmVkQmVoYXZpb3I+DQotICAgICAgICA8b3duZWRPcGVyYXRpb24geG1pOnR5cGU9InVtbDpPcGVyYXRpb24iIHhtaTppZD0iX1hCV0dZTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IkMyIj4NCi0gICAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTp0eXBlPSJ1bWw6UGFyYW1ldGVyIiB4bWk6aWQ9Il9YQmJsOE1hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJyZXR1cm4iIHR5cGU9Il9WOU1DRU1hREVlV2ZGZG52MjZFZnVnIiBkaXJlY3Rpb249InJldHVybiIvPg0KLSAgICAgICAgPC9vd25lZE9wZXJhdGlvbj4NCi0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfVEk5eGdNYUVFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iRXZlbnRzIEMyIj4NCi0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpUaW1lRXZlbnQiIHhtaTppZD0iX1hocHBBTWFFRWVXZkZkbnYyNkVmdWciIG5hbWU9ImF0IDEuOSI+DQotICAgICAgICAgIDx3aGVuIHhtaTp0eXBlPSJ1bWw6VGltZUV4cHJlc3Npb24iIHhtaTppZD0iX1hocHBBY2FFRWVXZkZkbnYyNkVmdWciPg0KLSAgICAgICAgICAgIDxleHByIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFJlYWwiIHhtaTppZD0iX1hocHBBc2FFRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxLjkiLz4NCi0gICAgICAgICAgPC93aGVuPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6VGltZUV2ZW50IiB4bWk6aWQ9Il9pWTQ0VU1hRUVlV2ZGZG52MjZFZnVnIiBuYW1lPSJhdCA2LjUiPg0KLSAgICAgICAgICA8d2hlbiB4bWk6dHlwZT0idW1sOlRpbWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9pWTQ0VWNhRUVlV2ZGZG52MjZFZnVnIj4NCi0gICAgICAgICAgICA8ZXhwciB4bWk6dHlwZT0idW1sOkxpdGVyYWxSZWFsIiB4bWk6aWQ9Il9pWTQ0VXNhRUVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iNi41Ii8+DQotICAgICAgICAgIDwvd2hlbj4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXy1KR3hFT3hPRWVXUDZlTl82WmNnbXciIG5hbWU9IkJhc2ljIj4NCi0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX2FLeTZNT3hQRWVXUDZlTl82WmNnbXciIG5hbWU9IkEiIGNsYXNzaWZpZXJCZWhhdmlvcj0iX01jemZNT3hhRWVXUDZlTl82WmNnbXciIGlzQWN0aXZlPSJ0cnVlIj4NCi0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiB4bWk6aWQ9Il9lRzNISU94UEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ4Ij4NCi0gICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+DQotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaGYxX3NPeFFFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOnR5cGU9InVtbDpQcm9wZXJ0eSIgeG1pOmlkPSJfZlB6RklPeFBFZVdQNmVOXzZaY2dtdyIgbmFtZT0ieSI+DQotICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPg0KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX1BCUHlVQ1FIRWVhQ3RacEQwQVRmQ3ciLz4NCi0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICA8b3duZWRCZWhhdmlvciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiB4bWk6aWQ9Il8xVG16TU94U0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJjb21wYXJlX2ltcGwiIHNwZWNpZmljYXRpb249Il9RUXYyY094UUVlV1A2ZU5fNlpjZ213IiBub2RlPSJfVHVxQVlPeFRFZVdQNmVOXzZaY2dtdyBfYjdOTEVPeFRFZVdQNmVOXzZaY2dtdyBfc29pRUFPeFRFZVdQNmVOXzZaY2dtdyBfQkZtbElPeFVFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6dHlwZT0idW1sOlBhcmFtZXRlciIgeG1pOmlkPSJfTE5oczBPeFRFZVdQNmVOXzZaY2dtdyIgbmFtZT0idiI+DQotICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+DQotICAgICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+DQotICAgICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6dHlwZT0idW1sOlBhcmFtZXRlciIgeG1pOmlkPSJfTHhRRThPeFRFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVzdWx0IiBkaXJlY3Rpb249InJldHVybiI+DQotICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+DQotICAgICAgICAgIDwvb3duZWRQYXJhbWV0ZXI+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfS3J6RFVPeFVFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfYjd2OW9PeFRFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJfVHVxQVlPeFRFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0tyLXBnT3hVRWVXUDZlTl82WmNnbXciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Lci1wZ2V4VUVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfTE9XV3dPeFVFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfYjc3ajBPeFRFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJfc29qU0lPeFRFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0xPZ3UwT3hVRWVXUDZlTl82WmNnbXciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9MT2hWNE94VUVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfTGxoZ29PeFVFZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfQkZtbElPeFVFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJfYjctbklPeFRFZVdQNmVOXzZaY2dtdyI+DQotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0xsdVU4T3hVRWVXUDZlTl82WmNnbXciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9MbHVVOGV4VUVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9Il9UdXFBWU94VEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ2IiBvdXRnb2luZz0iX0tyekRVT3hVRWVXUDZlTl82WmNnbXciIHBhcmFtZXRlcj0iX0xOaHMwT3hURWVXUDZlTl82WmNnbXciPg0KLSAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1R1dVIwT3hURWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpDYWxsQmVoYXZpb3JBY3Rpb24iIHhtaTppZD0iX2I3TkxFT3hURWVXUDZlTl82WmNnbXciIG5hbWU9Ij4iPg0KLSAgICAgICAgICAgIDxhcmd1bWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9iN3Y5b094VEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ4IiBpbmNvbWluZz0iX0tyekRVT3hVRWVXUDZlTl82WmNnbXciPg0KLSAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9iNzJyVU94VEVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfYjcxZE1PeFRFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L2FyZ3VtZW50Pg0KLSAgICAgICAgICAgIDxhcmd1bWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9iNzdqME94VEVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ5IiBpbmNvbWluZz0iX0xPV1d3T3hVRWVXUDZlTl82WmNnbXciPg0KLSAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9iNy1BRWV4VEVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfYjctQUVPeFRFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L2FyZ3VtZW50Pg0KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX2I3LW5JT3hURWVXUDZlTl82WmNnbXciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il9MbGhnb094VUVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfYjhBY1VleFRFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2I4QWNVT3hURWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9yZXN1bHQ+DQotICAgICAgICAgICAgPGJlaGF2aW9yIHhtaTp0eXBlPSJ1bWw6RnVuY3Rpb25CZWhhdmlvciIgaHJlZj0icGF0aG1hcDovL1BBUFlSVVNfZlVNTF9MSUJSQVJZL2ZVTUxfTGlicmFyeS51bWwjUHJpbWl0aXZlQmVoYXZpb3JzLUludGVnZXJGdW5jdGlvbnMtZ3QiLz4NCi0gICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiIgeG1pOmlkPSJfc29pRUFPeFRFZVdQNmVOXzZaY2dtdyIgbmFtZT0iMiI+DQotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfc29qU0lPeFRFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0xPV1d3T3hVRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgICA8dmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMk9wcHNPeFRFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjIiLz4NCi0gICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfQkZtbElPeFVFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVzdWx0IiBpbmNvbWluZz0iX0xsaGdvT3hVRWVXUDZlTl82WmNnbXciIHBhcmFtZXRlcj0iX0x4UUU4T3hURWVXUDZlTl82WmNnbXciPg0KLSAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0JGb2FVT3hVRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgIDwvb3duZWRCZWhhdmlvcj4NCi0gICAgICAgIDxvd25lZEJlaGF2aW9yIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIHhtaTppZD0iX01jemZNT3hhRWVXUDZlTl82WmNnbXciIG5hbWU9IkNsYXNzaWZpZXIgQmVoYXZpb3IiIG5vZGU9Il8xNWE4WU94YUVlV1A2ZU5fNlpjZ213IF81eWRxZ094YUVlV1A2ZU5fNlpjZ213IF85bVlvRU94YUVlV1A2ZU5fNlpjZ213IF9Ncm92OE94YkVlV1A2ZU5fNlpjZ213IF93QkVNY094YkVlV1A2ZU5fNlpjZ213IF9tYVRRRU94bkVlV1A2ZU5fNlpjZ213IF95eVI1WU94bkVlV1A2ZU5fNlpjZ213IF8yZnZDa094bkVlV1A2ZU5fNlpjZ213IF9MR3owUU94b0VlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6dHlwZT0idW1sOkNvbW1lbnQiIHhtaTppZD0iX0hUcFhrT3hiRWVXUDZlTl82WmNnbXciIGFubm90YXRlZEVsZW1lbnQ9Il85bVlvRU94YUVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICA8Ym9keT5SZWFkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiYjeEQ7DQotTGVjdHVyZSBkZSBsYSB2YWxldXIgZCdlbnRyw6llIHg8L2JvZHk+DQotICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTp0eXBlPSJ1bWw6Q29tbWVudCIgeG1pOmlkPSJfWnNuUzhPeGJFZVdQNmVOXzZaY2dtdyIgYW5ub3RhdGVkRWxlbWVudD0iX01yb3Y4T3hiRWVXUDZlTl82WmNnbXciPg0KLSAgICAgICAgICAgIDxib2R5PkNhbGxPcGVyYXRpb25BY3Rpb24mI3hEOw0KLUFwcGVsIMOgIGwnb3DDqXJhdGlvbiBjb21wYXJlPC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6dHlwZT0idW1sOkNvbW1lbnQiIHhtaTppZD0iX0lUMXowT3hjRWVXUDZlTl82WmNnbXciIGFubm90YXRlZEVsZW1lbnQ9Il93QkVNY094YkVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICA8Ym9keT5BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uJiN4RDsNCi1FY3JpdHVyZSBkdSByw6lzdWx0YXQgc3VyIGxhIHNvcnRpZSB5PC9ib2R5Pg0KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9kVHFTSU94YkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il85bWpuTU94YUVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il81eWRxZ094YUVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfZFQyZllPeGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2RUMmZZZXhiRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9lem5wQU94YkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il9Ncl9WUU94YkVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il85bWsxVU94YUVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfZXozZ29PeGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2V6M2dvZXhiRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9pbm5mRU94YkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il9NcjlnRU94YkVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il81eWRxZ094YUVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfaW4wVFlPeGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2luMFRZZXhiRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9selE3c094YkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il81eWRxZ094YUVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il8xNWRfc094YUVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfbHpsRXdPeGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2x6bEV3ZXhiRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il83TzRJc094YkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il93QkhQd094YkVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il81eWRxZ094YUVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfN1BNUndPeGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzdQTVJ3ZXhiRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il84dlRab094YkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il93QkpFOE94YkVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il9Nc0Rtc094YkVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfOHZsdGdPeGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzh2bHRnZXhiRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfcEJyaUFPeG5FZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfMTVhOFlPeGFFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJfbWFUUUVPeG5FZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il8wNk1vSU94bkVlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il9tYVRRRU94bkVlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il95eVI1WU94bkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX19tNE5RT3huRWVXUDZlTl82WmNnbXciIHRhcmdldD0iXzJmdkNrT3huRWVXUDZlTl82WmNnbXciIHNvdXJjZT0iX21hVFFFT3huRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfQ19lZ3dPeG9FZVdQNmVOXzZaY2dtdyIgdGFyZ2V0PSJfd0JFTWNPeGJFZVdQNmVOXzZaY2dtdyIgc291cmNlPSJfMmZ2Q2tPeG5FZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9PS0sza094b0VlV1A2ZU5fNlpjZ213IiB0YXJnZXQ9Il9MR3owUU94b0VlV1A2ZU5fNlpjZ213IiBzb3VyY2U9Il93QkVNY094YkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIHhtaTppZD0iXzE1YThZT3hhRWVXUDZlTl82WmNnbXciIG5hbWU9InNlbGYiIGluY29taW5nPSJfcEJyaUFPeG5FZVdQNmVOXzZaY2dtdyI+DQotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfMTVkX3NPeGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX2x6UTdzT3hiRWVXUDZlTl82WmNnbXciIHR5cGU9Il9NY3pmTU94YUVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpGb3JrTm9kZSIgeG1pOmlkPSJfNXlkcWdPeGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0iRm9ya05vZGUxIiBpbmNvbWluZz0iX2x6UTdzT3hiRWVXUDZlTl82WmNnbXciIG91dGdvaW5nPSJfZFRxU0lPeGJFZVdQNmVOXzZaY2dtdyBfaW5uZkVPeGJFZVdQNmVOXzZaY2dtdyBfN080SXNPeGJFZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgeG1pOmlkPSJfOW1Zb0VPeGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0icmVhZCB4IiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX2VHM0hJT3hQRWVXUDZlTl82WmNnbXciPg0KLSAgICAgICAgICAgIDxvYmplY3QgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgeG1pOmlkPSJfOW1qbk1PeGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0ib2JqZWN0IiBpbmNvbWluZz0iX2RUcVNJT3hiRWVXUDZlTl82WmNnbXciIHR5cGU9Il9hS3k2TU94UEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfOW1rMVVPeGFFZVdQNmVOXzZaY2dtdyIgbmFtZT0ieCIgb3V0Z29pbmc9Il9lem5wQU94YkVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjSW50ZWdlciIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfOW1uUmtleGFFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzltblJrT3hhRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9yZXN1bHQ+DQotICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpDYWxsT3BlcmF0aW9uQWN0aW9uIiB4bWk6aWQ9Il9Ncm92OE94YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJjYWxsIGNvbXBhcmUiIG9wZXJhdGlvbj0iX1FRdjJjT3hRRWVXUDZlTl82WmNnbXciPg0KLSAgICAgICAgICAgIDxhcmd1bWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9Ncl9WUU94YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ2IiBpbmNvbWluZz0iX2V6bnBBT3hiRWVXUDZlTl82WmNnbXciPg0KLSAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+DQotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Nc0J4Z094YkVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfTXNCS2NPeGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L2FyZ3VtZW50Pg0KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX01zRG1zT3hiRWVXUDZlTl82WmNnbXciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il84dlRab094YkVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPg0KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfTXNHQzhleGJFZVdQNmVOXzZaY2dtdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX01zR0M4T3hiRWVXUDZlTl82WmNnbXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9yZXN1bHQ+DQotICAgICAgICAgICAgPHRhcmdldCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9NcjlnRU94YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ0YXJnZXQiIGluY29taW5nPSJfaW5uZkVPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iX2FLeTZNT3hQRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIHhtaTppZD0iX3dCRU1jT3hiRWVXUDZlTl82WmNnbXciIG5hbWU9InNldFkiIGluY29taW5nPSJfQ19lZ3dPeG9FZVdQNmVOXzZaY2dtdyIgb3V0Z29pbmc9Il9PS0sza094b0VlV1A2ZU5fNlpjZ213IiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX2ZQekZJT3hQRWVXUDZlTl82WmNnbXciIGlzUmVwbGFjZUFsbD0idHJ1ZSI+DQotICAgICAgICAgICAgPG9iamVjdCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il93QkhQd094YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJvYmplY3QiIGluY29taW5nPSJfN080SXNPeGJFZVdQNmVOXzZaY2dtdyIgdHlwZT0iX2FLeTZNT3hQRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il93QkgyME94YkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJyZXN1bHQiIHR5cGU9Il9hS3k2TU94UEVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX3dCSkU4T3hiRWVXUDZlTl82WmNnbXciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iXzh2VFpvT3hiRWVXUDZlTl82WmNnbXciPg0KLSAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+DQotICAgICAgICAgICAgPC92YWx1ZT4NCi0gICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiB4bWk6aWQ9Il9tYVRRRU94bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJDaGFuZ2Ugb24geCIgaW5jb21pbmc9Il8wNk1vSU94bkVlV1A2ZU5fNlpjZ213IiBvdXRnb2luZz0iX3BCcmlBT3huRWVXUDZlTl82WmNnbXcgX19tNE5RT3huRWVXUDZlTl82WmNnbXciPg0KLSAgICAgICAgICAgIDx0cmlnZ2VyIHhtaTp0eXBlPSJ1bWw6VHJpZ2dlciIgeG1pOmlkPSJfdU5Dem9PeG5FZVdQNmVOXzZaY2dtdyIgZXZlbnQ9Il9aQWY5WU94bkVlV1A2ZU5fNlpjZ213Ii8+DQotICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpJbml0aWFsTm9kZSIgeG1pOmlkPSJfeXlSNVlPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iSW5pdGlhbE5vZGUxIiBvdXRnb2luZz0iXzA2TW9JT3huRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgeG1pOmlkPSJfMmZ2Q2tPeG5FZVdQNmVOXzZaY2dtdyIgbmFtZT0iQWZ0ZXIgMC41IiBpbmNvbWluZz0iX19tNE5RT3huRWVXUDZlTl82WmNnbXciIG91dGdvaW5nPSJfQ19lZ3dPeG9FZVdQNmVOXzZaY2dtdyI+DQotICAgICAgICAgICAgPHRyaWdnZXIgeG1pOnR5cGU9InVtbDpUcmlnZ2VyIiB4bWk6aWQ9Il82dDMyOE94bkVlV1A2ZU5fNlpjZ213IiBldmVudD0iX2UwN2FJT3huRWVXUDZlTl82WmNnbXciLz4NCi0gICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5RmluYWxOb2RlIiB4bWk6aWQ9Il9MR3owUU94b0VlV1A2ZU5fNlpjZ213IiBuYW1lPSJBY3Rpdml0eUZpbmFsTm9kZTEiIGluY29taW5nPSJfT0tLM2tPeG9FZVdQNmVOXzZaY2dtdyIvPg0KLSAgICAgICAgPC9vd25lZEJlaGF2aW9yPg0KLSAgICAgICAgPG93bmVkT3BlcmF0aW9uIHhtaTp0eXBlPSJ1bWw6T3BlcmF0aW9uIiB4bWk6aWQ9Il9RUXYyY094UUVlV1A2ZU5fNlpjZ213IiBuYW1lPSJjb21wYXJlIiBtZXRob2Q9Il8xVG16TU94U0VlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTp0eXBlPSJ1bWw6UGFyYW1ldGVyIiB4bWk6aWQ9Il9UU19mY094UUVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ2Ij4NCi0gICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4NCi0gICAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4NCi0gICAgICAgICAgPG93bmVkUGFyYW1ldGVyIHhtaTp0eXBlPSJ1bWw6UGFyYW1ldGVyIiB4bWk6aWQ9Il9jblJ1UU94UUVlV1A2ZU5fNlpjZ213IiBuYW1lPSJyZXN1bHQiIGRpcmVjdGlvbj0icmV0dXJuIj4NCi0gICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4NCi0gICAgICAgICAgPC9vd25lZFBhcmFtZXRlcj4NCi0gICAgICAgIDwvb3duZWRPcGVyYXRpb24+DQotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iX1hGN0hFT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IkV2ZW50cyI+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2hhbmdlRXZlbnQiIHhtaTppZD0iX1pBZjlZT3huRWVXUDZlTl82WmNnbXciIG5hbWU9IkNoYW5nZSBvbiB4Ij4NCi0gICAgICAgICAgPGNoYW5nZUV4cHJlc3Npb24geG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9idl9wZ094bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJ4IiB2YWx1ZT0ieCIvPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6VGltZUV2ZW50IiB4bWk6aWQ9Il9lMDdhSU94bkVlV1A2ZU5fNlpjZ213IiBuYW1lPSJBZnRlciAwLjUiIGlzUmVsYXRpdmU9InRydWUiPg0KLSAgICAgICAgICA8d2hlbiB4bWk6dHlwZT0idW1sOlRpbWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9pWm9QOE94bkVlV1A2ZU5fNlpjZ213Ij4NCi0gICAgICAgICAgICA8ZXhwciB4bWk6dHlwZT0idW1sOkxpdGVyYWxSZWFsIiB4bWk6aWQ9Il9pWm9QOGV4bkVlV1A2ZU5fNlpjZ213IiB2YWx1ZT0iMC41Ii8+DQotICAgICAgICAgIDwvd2hlbj4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iX1pvV20wQ1pyRWVhTkR0VWEzd0FHTXciIG5hbWU9IkNoYW5nZSBldmVudHMiPg0KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il9GU2R5SUNaekVlYU5EdFVhM3dBR013IiBuYW1lPSJFeGFtcGxlIDEiPg0KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9KbEJ6Z0NaekVlYU5EdFVhM3dBR013IiBuYW1lPSJBIiBjbGFzc2lmaWVyQmVoYXZpb3I9Il9KbEJ6b2laekVlYU5EdFVhM3dBR013IiBpc0FjdGl2ZT0idHJ1ZSI+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiB4bWk6aWQ9Il9KbEJ6Z1NaekVlYU5EdFVhM3dBR013IiBuYW1lPSJpbkJvb2xlYW4iPg0KLSAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPg0KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfUE92WWtDWjBFZWFfMmNQQ3B4a3hadyIvPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOnR5cGU9InVtbDpQcm9wZXJ0eSIgeG1pOmlkPSJfdTFrUjBDWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0iaW5JbnRlZ2VyIj4NCi0gICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0ludGVnZXIiLz4NCi0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzJTSGk4Q1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4NCi0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIHhtaTppZD0iX3ZLWUVNQ1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9ImluUmVhbCI+DQotICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+DQotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxSZWFsIiB4bWk6aWQ9Il8tWWxUd0NaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiB4bWk6aWQ9Il92ZG5KUUNaekVlYU5EdFVhM3dBR013IiBuYW1lPSJpblN0cmluZyI+DQotICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNTdHJpbmciLz4NCi0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfTWExR2dDWjBFZWFfMmNQQ3B4a3hadyIgdmFsdWU9IiIvPg0KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPg0KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOnR5cGU9InVtbDpQcm9wZXJ0eSIgeG1pOmlkPSJfSmxCemd5WnpFZWFORHRVYTN3QUdNdyIgbmFtZT0ib3V0Qm9vbGVhbiI+DQotICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+DQotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9KbEJ6aENaekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+DQotICAgICAgICAgIDxvd25lZEJlaGF2aW9yIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIHhtaTppZD0iX0psQnpvaVp6RWVhTkR0VWEzd0FHTXciIG5hbWU9IkNsYXNzaWZpZXIgQmVoYXZpb3IiIG5vZGU9Il9KbEJ6dlNaekVlYU5EdFVhM3dBR013IF9KbEJ6dnlaekVlYU5EdFVhM3dBR013IF9KbEJ6d0NaekVlYU5EdFVhM3dBR013IF9KbEJ6elNaekVlYU5EdFVhM3dBR013IF9KbEJ6MFNaekVlYU5EdFVhM3dBR013IF9VYWJaVUNaX0VlYTdFWXhyem5fN2xBIF8yMmFVMENjTkVlYW9NdFFpZmktUHBBIF85UnljMENjTkVlYW9NdFFpZmktUHBBIF9mYkp1MENjT0VlYW9NdFFpZmktUHBBIj4NCi0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTp0eXBlPSJ1bWw6Q29tbWVudCIgeG1pOmlkPSJfSmxCem95WnpFZWFORHRVYTN3QUdNdyIgYW5ub3RhdGVkRWxlbWVudD0iX0psQnp3Q1p6RWVhTkR0VWEzd0FHTXciPg0KLSAgICAgICAgICAgICAgPGJvZHk+UmVhZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24mI3hEOw0KLVJlYWRpbmcgaW5wdXQgdmFsdWUgb24gaW5Cb29sZWFuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOnR5cGU9InVtbDpDb21tZW50IiB4bWk6aWQ9Il9KbEJ6cFNaekVlYU5EdFVhM3dBR013IiBhbm5vdGF0ZWRFbGVtZW50PSJfSmxCenpTWnpFZWFORHRVYTN3QUdNdyI+DQotICAgICAgICAgICAgICA8Ym9keT5BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uJiN4RDsNCi1Xcml0aW5nIG91dHB1dCB2YWx1ZSBvbiBvdXRCb29sZWFuPC9ib2R5Pg0KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50Pg0KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfSmxCenBpWnpFZWFORHRVYTN3QUdNdyIgdGFyZ2V0PSJfSmxCendTWnpFZWFORHRVYTN3QUdNdyIgc291cmNlPSJfSmxCenZ5WnpFZWFORHRVYTN3QUdNdyI+DQotICAgICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfSmxCenB5WnpFZWFORHRVYTN3QUdNdyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfSmxCenFDWnpFZWFORHRVYTN3QUdNdyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9KbEJ6cnlaekVlYU5EdFVhM3dBR013IiB0YXJnZXQ9Il9KbEJ6dnlaekVlYU5EdFVhM3dBR013IiBzb3VyY2U9Il9KbEJ6dmlaekVlYU5EdFVhM3dBR013Ij4NCi0gICAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9KbEJ6c0NaekVlYU5EdFVhM3dBR013IiB2YWx1ZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9KbEJ6c1NaekVlYU5EdFVhM3dBR013IiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgIDwvZWRnZT4NCi0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iXzREM19BQ1owRWVhXzJjUENweGt4WnciIHRhcmdldD0iX0psQnp6aVp6RWVhTkR0VWEzd0FHTXciIHNvdXJjZT0iX0psQnp2eVp6RWVhTkR0VWEzd0FHTXciPg0KLSAgICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iXzRFajdnQ1owRWVhXzJjUENweGt4WnciIHZhbHVlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzRFa2lrQ1owRWVhXzJjUENweGt4WnciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgPC9lZGdlPg0KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfNV9CZEVDWjBFZWFfMmNQQ3B4a3hadyIgdGFyZ2V0PSJfSmxCejBDWnpFZWFORHRVYTN3QUdNdyIgc291cmNlPSJfSmxCendpWnpFZWFORHRVYTN3QUdNdyI+DQotICAgICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfNV9qQmdDWjBFZWFfMmNQQ3B4a3hadyIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfNV9qb2tDWjBFZWFfMmNQQ3B4a3hadyIgdmFsdWU9IjEiLz4NCi0gICAgICAgICAgICA8L2VkZ2U+DQotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfS0dyV2dDY01FZWFvTXRRaWZpLVBwQSIgdGFyZ2V0PSJfOVJ5YzBDY05FZWFvTXRRaWZpLVBwQSIgc291cmNlPSJfVWFiWlVDWl9FZWE3RVl4cnpuXzdsQSIvPg0KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX0s4VnpNQ2NNRWVhb010UWlmaS1QcEEiIHRhcmdldD0iXzlSeWMwQ2NORWVhb010UWlmaS1QcEEiIHNvdXJjZT0iX0psQnowU1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9MLTF5QUNjTUVlYW9NdFFpZmktUHBBIiB0YXJnZXQ9Il9KbEJ6dlNaekVlYU5EdFVhM3dBR013IiBzb3VyY2U9Il85UnljMENjTkVlYW9NdFFpZmktUHBBIi8+DQotICAgICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfQzlPOHNDY09FZWFvTXRRaWZpLVBwQSIgdGFyZ2V0PSJfOVJ5YzBDY05FZWFvTXRRaWZpLVBwQSIgc291cmNlPSJfMjJhVTBDY05FZWFvTXRRaWZpLVBwQSIvPg0KLSAgICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX2xqaXBZQ2NPRWVhb010UWlmaS1QcEEiIHRhcmdldD0iXzlSeWMwQ2NORWVhb010UWlmaS1QcEEiIHNvdXJjZT0iX2ZiSnUwQ2NPRWVhb010UWlmaS1QcEEiLz4NCi0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlJlYWRTZWxmQWN0aW9uIiB4bWk6aWQ9Il9KbEJ6dlNaekVlYU5EdFVhM3dBR013IiBuYW1lPSJzZWxmIiBpbmNvbWluZz0iX0wtMXlBQ2NNRWVhb010UWlmaS1QcEEiPg0KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfSmxCenZpWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0psQnpyeVp6RWVhTkR0VWEzd0FHTXciIHR5cGU9Il9KbEJ6b2laekVlYU5EdFVhM3dBR013Ii8+DQotICAgICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6Rm9ya05vZGUiIHhtaTppZD0iX0psQnp2eVp6RWVhTkR0VWEzd0FHTXciIG5hbWU9IkZvcmtOb2RlMSIgaW5jb21pbmc9Il9KbEJ6cnlaekVlYU5EdFVhM3dBR013IiBvdXRnb2luZz0iX0psQnpwaVp6RWVhTkR0VWEzd0FHTXcgXzREM19BQ1owRWVhXzJjUENweGt4WnciLz4NCi0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlJlYWRTdHJ1Y3R1cmFsRmVhdHVyZUFjdGlvbiIgeG1pOmlkPSJfSmxCendDWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0icmVhZCBpbkJvb2xlYW4iIHN0cnVjdHVyYWxGZWF0dXJlPSJfSmxCemdTWnpFZWFORHRVYTN3QUdNdyI+DQotICAgICAgICAgICAgICA8b2JqZWN0IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX0psQnp3U1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9KbEJ6cGlaekVlYU5EdFVhM3dBR013IiB0eXBlPSJfSmxCemdDWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfSmxCendpWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0ieCIgb3V0Z29pbmc9Il81X0JkRUNaMEVlYV8yY1BDcHhreFp3Ij4NCi0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNJbnRlZ2VyIi8+DQotICAgICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0psQnp3eVp6RWVhTkR0VWEzd0FHTXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0psQnp4Q1p6RWVhTkR0VWEzd0FHTXciIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8L3Jlc3VsdD4NCi0gICAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiB4bWk6aWQ9Il9KbEJ6elNaekVlYU5EdFVhM3dBR013IiBuYW1lPSJzZXQgb3V0Qm9vbGVhbiIgc3RydWN0dXJhbEZlYXR1cmU9Il9KbEJ6Z3laekVlYU5EdFVhM3dBR013IiBpc1JlcGxhY2VBbGw9InRydWUiPg0KLSAgICAgICAgICAgICAgPG9iamVjdCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9KbEJ6emlaekVlYU5EdFVhM3dBR013IiBuYW1lPSJvYmplY3QiIGluY29taW5nPSJfNEQzX0FDWjBFZWFfMmNQQ3B4a3hadyIgdHlwZT0iX0psQnpnQ1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX0psQnp6eVp6RWVhTkR0VWEzd0FHTXciIG5hbWU9InJlc3VsdCIgdHlwZT0iX0psQnpnQ1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9KbEJ6MENaekVlYU5EdFVhM3dBR013IiBuYW1lPSJ2YWx1ZSIgaW5jb21pbmc9Il81X0JkRUNaMEVlYV8yY1BDcHhreFp3Ij4NCi0gICAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+DQotICAgICAgICAgICAgICA8L3ZhbHVlPg0KLSAgICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiB4bWk6aWQ9Il9KbEJ6MFNaekVlYU5EdFVhM3dBR013IiBuYW1lPSJDaGFuZ2Ugb24gaW5Cb29sZWFuIiBvdXRnb2luZz0iX0s4VnpNQ2NNRWVhb010UWlmaS1QcEEiPg0KLSAgICAgICAgICAgICAgPHRyaWdnZXIgeG1pOnR5cGU9InVtbDpUcmlnZ2VyIiB4bWk6aWQ9Il9KbEJ6MGlaekVlYU5EdFVhM3dBR013IiBldmVudD0iX2p0T0VZQ1p6RWVhTkR0VWEzd0FHTXciLz4NCi0gICAgICAgICAgICA8L25vZGU+DQotICAgICAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgeG1pOmlkPSJfVWFiWlVDWl9FZWE3RVl4cnpuXzdsQSIgbmFtZT0iQ2hhbmdlIG9uIGluUmVhbCIgb3V0Z29pbmc9Il9LR3JXZ0NjTUVlYW9NdFFpZmktUHBBIj4NCi0gICAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX0lXYjlZQ2NMRWVhb010UWlmaS1QcEEiIG5hbWU9InJlc3VsdCI+DQotICAgICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0lXcF8wQ2NMRWVhb010UWlmaS1QcEEiIHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICA8L3Jlc3VsdD4NCi0gICAgICAgICAgICAgIDx0cmlnZ2VyIHhtaTp0eXBlPSJ1bWw6VHJpZ2dlciIgeG1pOmlkPSJfVWFiWlVTWl9FZWE3RVl4cnpuXzdsQSIgZXZlbnQ9Il9EdC1xSUNaX0VlYTdFWXhyem5fN2xBIi8+DQotICAgICAgICAgICAgPC9ub2RlPg0KLSAgICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIHhtaTppZD0iXzIyYVUwQ2NORWVhb010UWlmaS1QcEEiIG5hbWU9IkNoYW5nZSBvbiBpbkludGVnZXIiIG91dGdvaW5nPSJfQzlPOHNDY09FZWFvTXRRaWZpLVBwQSI+DQotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il8yMmFVMFNjTkVlYW9NdFFpZmktUHBBIiBuYW1lPSJyZXN1bHQiPg0KLSAgICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8yMmFVMGljTkVlYW9NdFFpZmktUHBBIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPC9yZXN1bHQ+DQotICAgICAgICAgICAgICA8dHJpZ2dlciB4bWk6dHlwZT0idW1sOlRyaWdnZXIiIHhtaTppZD0iXzIyYVUweWNORWVhb010UWlmaS1QcEEiIGV2ZW50PSJfaUgxTThDY05FZWFvTXRRaWZpLVBwQSIvPg0KLSAgICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOk1lcmdlTm9kZSIgeG1pOmlkPSJfOVJ5YzBDY05FZWFvTXRRaWZpLVBwQSIgbmFtZT0iTWVyZ2VOb2RlMSIgaW5jb21pbmc9Il9LR3JXZ0NjTUVlYW9NdFFpZmktUHBBIF9LOFZ6TUNjTUVlYW9NdFFpZmktUHBBIF9DOU84c0NjT0VlYW9NdFFpZmktUHBBIF9samlwWUNjT0VlYW9NdFFpZmktUHBBIiBvdXRnb2luZz0iX0wtMXlBQ2NNRWVhb010UWlmaS1QcEEiLz4NCi0gICAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiB4bWk6aWQ9Il9mYkp1MENjT0VlYW9NdFFpZmktUHBBIiBuYW1lPSJDaGFuZ2Ugb24gaW5TdHJpbmciIG91dGdvaW5nPSJfbGppcFlDY09FZWFvTXRRaWZpLVBwQSI+DQotICAgICAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il9mYkp1MFNjT0VlYW9NdFFpZmktUHBBIiBuYW1lPSJyZXN1bHQiPg0KLSAgICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mYkp1MGljT0VlYW9NdFFpZmktUHBBIiB2YWx1ZT0iMSIvPg0KLSAgICAgICAgICAgICAgPC9yZXN1bHQ+DQotICAgICAgICAgICAgICA8dHJpZ2dlciB4bWk6dHlwZT0idW1sOlRyaWdnZXIiIHhtaTppZD0iX2ZiSnUweWNPRWVhb010UWlmaS1QcEEiIGV2ZW50PSJfWTB2YmdDY09FZWFvTXRRaWZpLVBwQSIvPg0KLSAgICAgICAgICAgIDwvbm9kZT4NCi0gICAgICAgICAgPC9vd25lZEJlaGF2aW9yPg0KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+DQotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfTDUxSHNDWnpFZWFORHRVYTN3QUdNdyIgbmFtZT0iRXZlbnRzIj4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNoYW5nZUV2ZW50IiB4bWk6aWQ9Il9qdE9FWUNaekVlYU5EdFVhM3dBR013IiBuYW1lPSJDaGFuZ2Ugb24gaW5Cb29sZWFuIj4NCi0gICAgICAgICAgICA8Y2hhbmdlRXhwcmVzc2lvbiB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2p0T0VZU1p6RWVhTkR0VWEzd0FHTXciIG5hbWU9ImluQm9vbGVhbiIgdmFsdWU9ImluQm9vbGVhbiIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNoYW5nZUV2ZW50IiB4bWk6aWQ9Il9EdC1xSUNaX0VlYTdFWXhyem5fN2xBIiBuYW1lPSJDaGFuZ2Ugb24gaW5SZWFsIj4NCi0gICAgICAgICAgICA8Y2hhbmdlRXhwcmVzc2lvbiB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0R0X1JNQ1pfRWVhN0VZeHJ6bl83bEEiIG5hbWU9ImluUmVhbCIgdmFsdWU9ImluUmVhbCIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNoYW5nZUV2ZW50IiB4bWk6aWQ9Il9pSDFNOENjTkVlYW9NdFFpZmktUHBBIiBuYW1lPSJDaGFuZ2Ugb24gaW5JbnRlZ2VyIj4NCi0gICAgICAgICAgICA8Y2hhbmdlRXhwcmVzc2lvbiB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2lIMU04U2NORWVhb010UWlmaS1QcEEiIG5hbWU9ImluSW50ZWdlciIgdmFsdWU9ImluSW50ZWdlciIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNoYW5nZUV2ZW50IiB4bWk6aWQ9Il9ZMHZiZ0NjT0VlYW9NdFFpZmktUHBBIiBuYW1lPSJDaGFuZ2Ugb24gaW5TdHJpbmciPg0KLSAgICAgICAgICAgIDxjaGFuZ2VFeHByZXNzaW9uIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWTB2YmdTY09FZWFvTXRRaWZpLVBwQSIgbmFtZT0iaW5TdHJpbmciIHZhbHVlPSJpblN0cmluZyIvPg0KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50Pg0KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4NCi0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iX1ZTMllNQ2wyRWVhcTRMVUJkX1k5c0EiIG5hbWU9IkV2ZW50cyIvPg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9DbUw1d01YV0VlV3d4X3B1SER6Rll3Ij4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfQ21RTE1NWFdFZVd3eF9wdUhEekZZdyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTC9Qcm9maWxlL1N0YW5kYXJkIy8iLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8YXBwbGllZFByb2ZpbGUgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9XX01LUU1hR0VlV2ZGZG52MjZFZnVnIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfV19PbWdNYUdFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4NCi0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTC9Qcm9maWxlL1N0YW5kYXJkIy8iLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8YXBwbGllZFByb2ZpbGUgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il81bnl3ME00NEVlVzVXNEdJcUpweUZBIj4NCi0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfNW4xMElNNDRFZVc1VzRHSXFKcHlGQSIgc291cmNlPSJQYXB5cnVzVmVyc2lvbiI+DQotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iXzVuMTBJYzQ0RWVXNVc0R0lxSnB5RkEiIGtleT0iVmVyc2lvbiIgdmFsdWU9IjAuMC42OSIvPg0KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il81bjEwSXM0NEVlVzVXNEdJcUpweUZBIiBrZXk9IkNvbW1lbnQiIHZhbHVlPSIiLz4NCi0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfNW4xMEk4NDRFZVc1VzRHSXFKcHlGQSIga2V5PSJDb3B5cmlnaHQiIHZhbHVlPSIiLz4NCi0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfNW4xMEpNNDRFZVc1VzRHSXFKcHlGQSIga2V5PSJEYXRlIiB2YWx1ZT0iMjAxNS0xMi0wOSIvPg0KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il81bjEwSmM0NEVlVzVXNEdJcUpweUZBIiBrZXk9IkF1dGhvciIgdmFsdWU9IiIvPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il81bjBtQU00NEVlVzVXNEdJcUpweUZBIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPg0KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJwYXRobWFwOi8vRm1pTUxfUFJPRklMRS9GbWlNTC5wcm9maWxlLnVtbCNfZlczVGNKNVFFZVc0aHBWaXUwODR3USIvPg0KLSAgICAgIDwvZUFubm90YXRpb25zPg0KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSB4bWk6dHlwZT0idW1sOlByb2ZpbGUiIGhyZWY9InBhdGhtYXA6Ly9GbWlNTF9QUk9GSUxFL0ZtaU1MLnByb2ZpbGUudW1sI19fS2kzb0t2RkVlU1hxS3FsSHp4MWdBIi8+DQotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPg0KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTp0eXBlPSJ1bWw6UHJvZmlsZUFwcGxpY2F0aW9uIiB4bWk6aWQ9Il9Mdkpkd0J3WEVlYTBHTWh2UTR4Rm5BIi8+DQotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX2NiRjVjQ01rRWVhMk9hdkJQTkZzalEiLz4NCi0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfVWhTRnNDWnpFZWFORHRVYTN3QUdNdyI+DQotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX1VoVkpBQ1p6RWVhTkR0VWEzd0FHTXciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+DQotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGFweXJ1cy9GTUlQcm9maWxlLzEuMC4wIy8iLz4NCi0gICAgICA8L2VBbm5vdGF0aW9ucz4NCi0gICAgICA8YXBwbGllZFByb2ZpbGUgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vUEFQWVJVU19GTUlfUFJPRklMRS9GTUkucHJvZmlsZS51bWwjX19LaTNvS3ZGRWVTWHFLcWxIengxZ0EiLz4NCi0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+DQotICA8L3VtbDpNb2RlbD4NCi0gIDxzdGFuZGFyZDpDcmVhdGUgeG1pOmlkPSJfQ290Q1FNWFdFZVd3eF9wdUhEekZZdyIgYmFzZV9CZWhhdmlvcmFsRmVhdHVyZT0iX0NvbHRnTVhXRWVXd3hfcHVIRHpGWXciLz4NCi0gIDxzdGFuZGFyZDpDcmVhdGUgeG1pOmlkPSJfWEJjMEVNYUdFZVdmRmRudjI2RWZ1ZyIgYmFzZV9CZWhhdmlvcmFsRmVhdHVyZT0iX1hCV0dZTWFHRWVXZkZkbnYyNkVmdWciLz4NCi0gIDxmbWlwcm9maWxlOkNTX0ZNVSB4bWk6aWQ9Il84VnRJa000NEVlVzVXNEdJcUpweUZBIiBiYXNlX0NsYXNzPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIgY2FuTm90VXNlTWVtb3J5TWFuYWdlbWVudEZ1bmN0aW9ucz0idHJ1ZSIgY2FuSGFuZGxlVmFyaWFibGVDb21tdW5pY2F0aW9uU3RlcFNpemU9InRydWUiLz4NCi0gIDxmbWlwcm9maWxlOkNTX0ZNVSB4bWk6aWQ9Il8tNDFNb000NEVlVzVXNEdJcUpweUZBIiBiYXNlX0NsYXNzPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPg0KLSAgPGZtaXByb2ZpbGU6UG9ydCB4bWk6aWQ9Il9JRlNWSU00NUVlVzVXNEdJcUpweUZBIiBiYXNlX1Byb3BlcnR5PSJfUlVrQmNNWFFFZVd3eF9wdUhEekZZdyIgZGVzY3JpcHRpb249IiIgdmFyaWFiaWxpdHk9ImRpc2NyZXRlIiB2YWx1ZVJlZmVyZW5jZT0iMSIgZGlyZWN0aW9uPSJvdXQiLz4NCi0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfVFphVXdNNDVFZVc1VzRHSXFKcHlGQSIgYmFzZV9Qcm9wZXJ0eT0iX2F1QUZzTWFERWVXZkZkbnYyNkVmdWciIHZhcmlhYmlsaXR5PSJkaXNjcmV0ZSIgZGlyZWN0aW9uPSJvdXQiLz4NCi0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfV1lZQVFNNDVFZVc1VzRHSXFKcHlGQSIgYmFzZV9Qcm9wZXJ0eT0iX3dRMmpJTWFERWVXZkZkbnYyNkVmdWciIHZhcmlhYmlsaXR5PSJkaXNjcmV0ZSIgdmFsdWVSZWZlcmVuY2U9IjEiIGRpcmVjdGlvbj0ib3V0Ii8+DQotICA8Zm1pcHJvZmlsZTpDU19GTVUgeG1pOmlkPSJfYjNBa1lPeFBFZVdQNmVOXzZaY2dtdyIgYmFzZV9DbGFzcz0iX2FLeTZNT3hQRWVXUDZlTl82WmNnbXciLz4NCi0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfN0RFLTBPeFBFZVdQNmVOXzZaY2dtdyIgYmFzZV9Qcm9wZXJ0eT0iX2VHM0hJT3hQRWVXUDZlTl82WmNnbXciLz4NCi0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfOUFKSWNPeFBFZVdQNmVOXzZaY2dtdyIgYmFzZV9Qcm9wZXJ0eT0iX2ZQekZJT3hQRWVXUDZlTl82WmNnbXciIHZhbHVlUmVmZXJlbmNlPSIxIiBkaXJlY3Rpb249Im91dCIvPg0KLSAgPGZtaXByb2ZpbGU6UG9ydCB4bWk6aWQ9Il9zdF9oVUNaekVlYU5EdFVhM3dBR013IiBiYXNlX1Byb3BlcnR5PSJfSmxCemdTWnpFZWFORHRVYTN3QUdNdyIvPg0KLSAgPGZtaXByb2ZpbGU6UG9ydCB4bWk6aWQ9Il91MW11RUNaekVlYU5EdFVhM3dBR013IiBiYXNlX1Byb3BlcnR5PSJfdTFrUjBDWnpFZWFORHRVYTN3QUdNdyIgdmFsdWVSZWZlcmVuY2U9IjEiLz4NCi0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfdktaU1VDWnpFZWFORHRVYTN3QUdNdyIgYmFzZV9Qcm9wZXJ0eT0iX3ZLWUVNQ1p6RWVhTkR0VWEzd0FHTXciIHZhbHVlUmVmZXJlbmNlPSIyIi8+DQotICA8Zm1pcHJvZmlsZTpQb3J0IHhtaTppZD0iX3Zkb1hZQ1p6RWVhTkR0VWEzd0FHTXciIGJhc2VfUHJvcGVydHk9Il92ZG5KUUNaekVlYU5EdFVhM3dBR013IiB2YWx1ZVJlZmVyZW5jZT0iMyIvPg0KLSAgPGZtaXByb2ZpbGU6UG9ydCB4bWk6aWQ9Il9jMmtnTUNaMEVlYV8yY1BDcHhreFp3IiBiYXNlX1Byb3BlcnR5PSJfSmxCemd5WnpFZWFORHRVYTN3QUdNdyIgdmFsdWVSZWZlcmVuY2U9IjQiIGRpcmVjdGlvbj0ib3V0Ii8+DQotICA8Zm1pcHJvZmlsZTpDU19GTVUgeG1pOmlkPSJfUUhnLU1DWjFFZWFfMmNQQ3B4a3hadyIgYmFzZV9DbGFzcz0iX0psQnpnQ1p6RWVhTkR0VWEzd0FHTXciLz4NCi08L3htaTpYTUk+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvZm11X2J1aWxkL3Jlc291cmNlcy9UYW5rQmFycmVsRXhhbXBsZS5kaSBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2ZtdV9idWlsZC9yZXNvdXJjZXMvVGFua0JhcnJlbEV4YW1wbGUuZGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzRkNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvZm11X2J1aWxkL3Jlc291cmNlcy9UYW5rQmFycmVsRXhhbXBsZS5kaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiLz4NCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvcmVzb3VyY2VzL1RhbmtCYXJyZWxFeGFtcGxlLm5vdGF0aW9uIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvZm11X2J1aWxkL3Jlc291cmNlcy9UYW5rQmFycmVsRXhhbXBsZS5ub3RhdGlvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkNzYzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvcmVzb3VyY2VzL1RhbmtCYXJyZWxFeGFtcGxlLm5vdGF0aW9uCisrKyAvZGV2L251bGwKQEAgLTEsMTU4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpjb25maWd1cmF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhcHlydXMvaW5mcmEvdmlld3BvaW50cy9jb25maWd1cmF0aW9uIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjIvbm90YXRpb24iIHhtbG5zOnN0eWxlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhcHlydXMvaW5mcmEvdmlld3BvaW50cy9wb2xpY3kvc3R5bGUiIHhtbG5zOnVtbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzUuMC4wL1VNTCI+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0RFaTRjTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IlBhcHlydXNVTUxDbGFzc0RpYWdyYW0iIG5hbWU9IkNsYXNzIGRpYWdyYW0iIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX05PLUZFTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IjIwMDgiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX1pHc0pvTWFERWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1pHc0pvY2FERWVXZkZkbnYyNkVmdWciIGtleT0idmlzaWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTk8tc0lNWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iNTAyOSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9aR3NKb3NhREVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1pHc0pvOGFERWVXZkZkbnYyNkVmdWciIGtleT0idmlzaWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTk8tc0ljWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iODUxMCI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9aR3N3c01hREVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1pHc3dzY2FERWVXZkZkbnYyNkVmdWciIGtleT0idmlzaWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTk8tc0lzWFFFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfTk9fVE1NWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iNzAxNyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9aR3N3c3NhREVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1pHc3dzOGFERWVXZkZkbnYyNkVmdWciIGtleT0idmlzaWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX1JVcXZJTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IjMwMTIiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfSUZYMHM4NDVFZVc1VzRHSXFKcHlGQSIgdHlwZT0iU3RlcmVvdHlwZUJyYWNlIj4KLSAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9QcnVpRU00NUVlVzVXNEdJcUpweUZBIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9QcnVpRWM0NUVlVzVXNEdJcUpweUZBIiBrZXk9InZpc2libGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX0lGWDB0TTQ1RWVXNVc0R0lxSnB5RkEiIHNob3dUaXRsZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U3RyaW5nVmFsdWVTdHlsZSIgeG1pOmlkPSJfSUZYMHRjNDVFZVc1VzRHSXFKcHlGQSIgbmFtZT0ic3RlcmVvdHlwZSIgc3RyaW5nVmFsdWU9IkZtaU1MUHJvZmlsZTo6UG9ydCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdGVyZW90eXBlIiBocmVmPSJwYXRobWFwOi8vRm1pTUxfUFJPRklMRS9GbWlNTC5wcm9maWxlLnVtbCNfMEFiNTRPeWpFZVNFQktKV0RDckFJUSIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSUZYMHRzNDVFZVc1VzRHSXFKcHlGQSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U3RyaW5nTGlzdFZhbHVlU3R5bGUiIHhtaTppZD0iX1hTUXU4TVhRRWVXd3hfcHVIRHpGWXciIG5hbWU9Im1hc2tMYWJlbCI+Ci0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPm11bHRpcGxpY2l0eTwvc3RyaW5nTGlzdFZhbHVlPgotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT52aXNpYmlsaXR5PC9zdHJpbmdMaXN0VmFsdWU+Ci0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPmRlZmF1bHRWYWx1ZTwvc3RyaW5nTGlzdFZhbHVlPgotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5uYW1lPC9zdHJpbmdMaXN0VmFsdWU+Ci0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPnR5cGU8L3N0cmluZ0xpc3RWYWx1ZT4KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+ZGVyaXZlZDwvc3RyaW5nTGlzdFZhbHVlPgotICAgICAgICAgIDwvc3R5bGVzPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfUlVrQmNNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUlVxdkljWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9OT19UTWNYUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfTk9fVE1zWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfTk9fVE04WFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9OT19UTk1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9OT19UTmNYUUVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNzAxOCI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX05PX1ROc1hRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9OT19UTjhYUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9OT19UT01YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX05PX1RPY1hRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX05PX1RPc1hRRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSI3MDE5Ij4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfTk9fVE84WFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX05PX1RQTVhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX05PX1RQY1hRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTk9fVFBzWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTk8tRkVjWFFFZVd3eF9wdUhEekZZdyIgeD0iMTc3IiB5PSIyMTEiIHdpZHRoPSIzODIiIGhlaWdodD0iMTQxIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9WLVB5QU1hREVlV2ZGZG52MjZFZnVnIiB0eXBlPSIyMDA4Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9aR3B0WU1hREVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9aR3FVY01hREVlV2ZGZG52MjZFZnVnIiBrZXk9InZpc2libGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1YtUm5NTWFERWVXZkZkbnYyNkVmdWciIHR5cGU9IjUwMjkiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfWkdxN2dNYURFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9aR3E3Z2NhREVlV2ZGZG52MjZFZnVnIiBrZXk9InZpc2libGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1YtUm5NY2FERWVXZkZkbnYyNkVmdWciIHR5cGU9Ijg1MTAiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfWkdxN2dzYURFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9aR3E3ZzhhREVlV2ZGZG52MjZFZnVnIiBrZXk9InZpc2libGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1YtUm5Nc2FERWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX1YtU09RTWFERWVXZkZkbnYyNkVmdWciIHR5cGU9IjcwMTciPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfWkdxN2hNYURFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9aR3E3aGNhREVlV2ZGZG52MjZFZnVnIiBrZXk9InZpc2libGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9hdUxyNE1hREVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDEyIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX1RaZjBVODQ1RWVXNVc0R0lxSnB5RkEiIHR5cGU9IlN0ZXJlb3R5cGVCcmFjZSI+Ci0gICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfYVNNeGdNNDVFZVc1VzRHSXFKcHlGQSIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfYVNNeGdjNDVFZVc1VzRHSXFKcHlGQSIga2V5PSJ2aXNpYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9UWmYwVk00NUVlVzVXNEdJcUpweUZBIiBzaG93VGl0bGU9InRydWUiLz4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlN0cmluZ1ZhbHVlU3R5bGUiIHhtaTppZD0iX1RaZjBWYzQ1RWVXNVc0R0lxSnB5RkEiIG5hbWU9InN0ZXJlb3R5cGUiIHN0cmluZ1ZhbHVlPSJGbWlNTFByb2ZpbGU6OlBvcnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RlcmVvdHlwZSIgaHJlZj0icGF0aG1hcDovL0ZtaU1MX1BST0ZJTEUvRm1pTUwucHJvZmlsZS51bWwjXzBBYjU0T3lqRWVTRUJLSldEQ3JBSVEiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1RaZjBWczQ1RWVXNVc0R0lxSnB5RkEiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlN0cmluZ0xpc3RWYWx1ZVN0eWxlIiB4bWk6aWQ9Il91NjZENE1hREVlV2ZGZG52MjZFZnVnIiBuYW1lPSJtYXNrTGFiZWwiPgotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5tdWx0aXBsaWNpdHk8L3N0cmluZ0xpc3RWYWx1ZT4KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+dmlzaWJpbGl0eTwvc3RyaW5nTGlzdFZhbHVlPgotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5kZWZhdWx0VmFsdWU8L3N0cmluZ0xpc3RWYWx1ZT4KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+bmFtZTwvc3RyaW5nTGlzdFZhbHVlPgotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT50eXBlPC9zdHJpbmdMaXN0VmFsdWU+Ci0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPmRlcml2ZWQ8L3N0cmluZ0xpc3RWYWx1ZT4KLSAgICAgICAgICA8L3N0eWxlcz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX2F1QUZzTWFERWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2F1THI0Y2FERWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfd1JBVUlNYURFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzAxMiI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9XWWM0dzg0NUVlVzVXNEdJcUpweUZBIiB0eXBlPSJTdGVyZW90eXBlQnJhY2UiPgotICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX2F1ZFBzTTQ1RWVXNVc0R0lxSnB5RkEiIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX2F1ZFBzYzQ1RWVXNVc0R0lxSnB5RkEiIGtleT0idmlzaWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfV1ljNHhNNDVFZVc1VzRHSXFKcHlGQSIgc2hvd1RpdGxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTdHJpbmdWYWx1ZVN0eWxlIiB4bWk6aWQ9Il9XWWM0eGM0NUVlVzVXNEdJcUpweUZBIiBuYW1lPSJzdGVyZW90eXBlIiBzdHJpbmdWYWx1ZT0iRm1pTUxQcm9maWxlOjpQb3J0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlN0ZXJlb3R5cGUiIGhyZWY9InBhdGhtYXA6Ly9GbWlNTF9QUk9GSUxFL0ZtaU1MLnByb2ZpbGUudW1sI18wQWI1NE95akVlU0VCS0pXRENyQUlRIi8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9XWWM0eHM0NUVlVzVXNEdJcUpweUZBIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTdHJpbmdMaXN0VmFsdWVTdHlsZSIgeG1pOmlkPSJfeTlpTDBNYURFZVdmRmRudjI2RWZ1ZyIgbmFtZT0ibWFza0xhYmVsIj4KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+bXVsdGlwbGljaXR5PC9zdHJpbmdMaXN0VmFsdWU+Ci0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPnZpc2liaWxpdHk8L3N0cmluZ0xpc3RWYWx1ZT4KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+ZGVmYXVsdFZhbHVlPC9zdHJpbmdMaXN0VmFsdWU+Ci0gICAgICAgICAgICA8c3RyaW5nTGlzdFZhbHVlPm5hbWU8L3N0cmluZ0xpc3RWYWx1ZT4KLSAgICAgICAgICAgIDxzdHJpbmdMaXN0VmFsdWU+dHlwZTwvc3RyaW5nTGlzdFZhbHVlPgotICAgICAgICAgICAgPHN0cmluZ0xpc3RWYWx1ZT5kZXJpdmVkPC9zdHJpbmdMaXN0VmFsdWU+Ci0gICAgICAgICAgPC9zdHlsZXM+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcm9wZXJ0eSIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI193UTJqSU1hREVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il93UkFVSWNhREVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX1YtU09RY2FERWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9WLVNPUXNhREVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9WLVNPUThhREVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1YtU09STWFERWVXZkZkbnYyNkVmdWciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX1YtU09SY2FERWVXZkZkbnYyNkVmdWciIHZpc2libGU9ImZhbHNlIiB0eXBlPSI3MDE4Ij4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfVi1TT1JzYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX1YtU09SOGFERWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX1YtU09TTWFERWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfVi1TT1NjYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfVi1TT1NzYURFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjcwMTkiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9WLVNPUzhhREVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfVi1TT1RNYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfVi1TT1RjYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9WLVNPVHNhREVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19WOU1DRU1hREVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9WLVB5QWNhREVlV2ZGZG52MjZFZnVnIiB4PSIxNzciIHk9IjQyNSIgd2lkdGg9IjM3OCIgaGVpZ2h0PSIxNDEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iXzhXYTZRTTQ0RWVXNVc0R0lxSnB5RkEiIHR5cGU9IlN0ZXJlb3R5cGVDb21tZW50Ij4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iXzhXYTZRYzQ0RWVXNVc0R0lxSnB5RkEiIHNob3dUaXRsZT0idHJ1ZSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RU9iamVjdFZhbHVlU3R5bGUiIHhtaTppZD0iXzhXYTZRODQ0RWVXNVc0R0lxSnB5RkEiIG5hbWU9IkJBU0VfRUxFTUVOVCI+Ci0gICAgICAgIDxlT2JqZWN0VmFsdWUgeG1pOnR5cGU9InVtbDpDbGFzcyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8L3N0eWxlcz4KLSAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzhXYTZRczQ0RWVXNVc0R0lxSnB5RkEiIHg9IjM3NyIgeT0iMjExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il8tNURQRU00NEVlVzVXNEdJcUpweUZBIiB0eXBlPSJTdGVyZW90eXBlQ29tbWVudCI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il8tNURQRWM0NEVlVzVXNEdJcUpweUZBIiBzaG93VGl0bGU9InRydWUiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVPYmplY3RWYWx1ZVN0eWxlIiB4bWk6aWQ9Il8tNUQySU00NEVlVzVXNEdJcUpweUZBIiBuYW1lPSJCQVNFX0VMRU1FTlQiPgotICAgICAgICA8ZU9iamVjdFZhbHVlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPC9zdHlsZXM+Ci0gICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8tNURQRXM0NEVlVzVXNEdJcUpweUZBIiB4PSIzNzciIHk9IjQyNSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U3RyaW5nVmFsdWVTdHlsZSIgeG1pOmlkPSJfREVpNGNjWFFFZVd3eF9wdUhEekZZdyIgbmFtZT0iZGlhZ3JhbV9jb21wYXRpYmlsaXR5X3ZlcnNpb24iIHN0cmluZ1ZhbHVlPSIxLjEuMCIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW1TdHlsZSIgeG1pOmlkPSJfREVpNGNzWFFFZVd3eF9wdUhEekZZdyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9InN0eWxlOlBhcHlydXNWaWV3U3R5bGUiIHhtaTppZD0iX0RFaTRjOFhRRWVXd3hfcHVIRHpGWXciPgotICAgICAgPG93bmVyIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfcThET2NNWFBFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGNvbmZpZ3VyYXRpb24geG1pOnR5cGU9ImNvbmZpZ3VyYXRpb246UGFweXJ1c0RpYWdyYW0iIGhyZWY9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLnNpbWV4L2NvbmZpZy9zaW1leC5jb25maWd1cmF0aW9uI18xUFZWc0ZZOUVlV2NtdVlqQl9fYXRnIi8+Ci0gICAgPC9zdHlsZXM+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19xOERPY01YUEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iXzhXYTZSTTQ0RWVXNVc0R0lxSnB5RkEiIHR5cGU9IlN0ZXJlb3R5cGVDb21tZW50TGluayIgc291cmNlPSJfTk8tRkVNWFFFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfOFdhNlFNNDRFZVc1VzRHSXFKcHlGQSI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iXzhXYTZSYzQ0RWVXNVc0R0lxSnB5RkEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVPYmplY3RWYWx1ZVN0eWxlIiB4bWk6aWQ9Il84V2E2U2M0NEVlVzVXNEdJcUpweUZBIiBuYW1lPSJCQVNFX0VMRU1FTlQiPgotICAgICAgICA8ZU9iamVjdFZhbHVlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPC9zdHlsZXM+Ci0gICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il84V2E2UnM0NEVlVzVXNEdJcUpweUZBIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il84V2E2Ujg0NEVlVzVXNEdJcUpweUZBIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfOFdhNlNNNDRFZVc1VzRHSXFKcHlGQSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iXy01RDJJYzQ0RWVXNVc0R0lxSnB5RkEiIHR5cGU9IlN0ZXJlb3R5cGVDb21tZW50TGluayIgc291cmNlPSJfVi1QeUFNYURFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfLTVEUEVNNDRFZVc1VzRHSXFKcHlGQSI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iXy01RDJJczQ0RWVXNVc0R0lxSnB5RkEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVPYmplY3RWYWx1ZVN0eWxlIiB4bWk6aWQ9Il8tNUQySnM0NEVlVzVXNEdJcUpweUZBIiBuYW1lPSJCQVNFX0VMRU1FTlQiPgotICAgICAgICA8ZU9iamVjdFZhbHVlIHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPC9zdHlsZXM+Ci0gICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8tNUQySTg0NEVlVzVXNEdJcUpweUZBIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il8tNUQySk00NEVlVzVXNEdJcUpweUZBIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfLTVEMkpjNDRFZVc1VzRHSXFKcHlGQSIvPgotICAgIDwvZWRnZXM+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfbzRoYkFNWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iUGFweXJ1c1VNTEFjdGl2aXR5RGlhZ3JhbSIgbmFtZT0iQzEgY2xhc3NpZmllciBiZWhhdmlvciBkaWFncmFtIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9vNGhiQWNYUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY3Rpdml0eV9TaGFwZSI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9vNGlDRU1YUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY3Rpdml0eV9OYW1lTGFiZWwiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfbzRpQ0VzWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWN0aXZpdHlfUGFyYW1ldGVyQ29tcGFydG1lbnQiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX280aUNFOFhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX280aUNGTVhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbzRpQ0ZjWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfbzRpQ0ZzWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWN0aXZpdHlfUHJlY29uZGl0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX280aUNGOFhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX280aUNHTVhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbzRpQ0djWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfbzRpQ0dzWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWN0aXZpdHlfUG9zdGNvbmRpdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9vNGlDRzhYUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9vNGlDSE1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX280aUNIY1hRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX280aUNIc1hRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjdGl2aXR5X0FjdGl2aXR5Tm9kZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfc1JZMFFNWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29tbWVudF9TaGFwZSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfc1JZMFFzWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29tbWVudF9Cb2R5TGFiZWwiLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbW1lbnQiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfc1JUN3dNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3NSWTBRY1hRRWVXd3hfcHVIRHpGWXciIHg9IjQ4NCIgeT0iODgiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfeHJIU0FNWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fU2hhcGUiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9kRkhCNE1YUkVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfZEZIQjRjWFJFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3hySDVFTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX05hbWVMYWJlbCIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3hySDVFY1hRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1RyaWdnZXJMYWJlbCI+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3hySDVFc1hRRWVXd3hfcHVIRHpGWXciIHg9Ijg5IiB5PSIxMyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeHJINUU4WFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fU3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfeHJINUZNWFFFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeHJINUZjWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fRmxvYXRpbmdOYW1lTGFiZWwiPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il94ckg1RnNYUUVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX3hzdDBnTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9ImNvbXBhcnRtZW50X3NoYXBlX2Rpc3BsYXkiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfeHN0MGdjWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeHN0MGdzWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfeHJIU0FjWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfeHJBa1VNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3hySFNBc1hRRWVXd3hfcHVIRHpGWXciIHg9IjE3NiIgeT0iNzMiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfeDZSdllNWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fU2hhcGUiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9sNDA2UU1YUkVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfbDQwNlFjWFJFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3g2U1djTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX05hbWVMYWJlbCIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3g2U1djY1hRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1RyaWdnZXJMYWJlbCI+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3g2U1djc1hRRWVXd3hfcHVIRHpGWXciIHg9IjkwIiB5PSIxMSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeDZTV2M4WFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fU3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfeDZTV2RNWFFFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeDZTV2RjWFFFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWNjZXB0RXZlbnRBY3Rpb25fRmxvYXRpbmdOYW1lTGFiZWwiPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il94NlNXZHNYUUVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX3g2YTVVTVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9ImNvbXBhcnRtZW50X3NoYXBlX2Rpc3BsYXkiPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfeDZhNVVjWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeDZhNVVzWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfeDZSdlljWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfeDZKTWdNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3g2UnZZc1hRRWVXd3hfcHVIRHpGWXciIHg9IjE3NiIgeT0iMzE5Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3lJUDU4TVhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1NoYXBlIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfcWZ6c2NNWFJFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3FmMFRnTVhSRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95SVFoQU1YUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9OYW1lTGFiZWwiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95SVFoQWNYUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJBY2NlcHRFdmVudEFjdGlvbl9UcmlnZ2VyTGFiZWwiPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il95SVFoQXNYUUVlV3d4X3B1SER6Rll3IiB4PSI5MiIgeT0iMTEiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3lJUWhBOFhRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX1N0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3lJUWhCTVhRRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3lJUWhCY1hRRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjY2VwdEV2ZW50QWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfeUlRaEJzWFFFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il95SWJnSU1YUUVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX3lJYmdJY1hRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3lJYmdJc1hRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3lJUDU4Y1hRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX3lJR3dBTVhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il95SVA1OHNYUUVlV3d4X3B1SER6Rll3IiB4PSIxNzYiIHk9IjU2MiIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9Nd1AyME1YU0VlV3d4X3B1SER6Rll3IiB0eXBlPSJJbml0aWFsTm9kZV9TaGFwZSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTXdRZDRNWFNFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkluaXRpYWxOb2RlX0Zsb2F0aW5nTmFtZUxhYmVsIj4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTXdRZDRjWFNFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTXdRZDRzWFNFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5pdGlhbE5vZGVfU3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTXdRZDQ4WFNFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfTXdQMjBjWFNFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5pdGlhbE5vZGUiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfTXdFUW9NWFNFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX013UDIwc1hTRWVXd3hfcHVIRHpGWXciIHg9IjIyOSIgeT0iMjAiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfYmZPWFFNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9TaGFwZSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfYmZPWFE4WFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9LZXl3b3JkTGFiZWwiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX2JmTy1VTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfQWN0aXZpdHlOb2RlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfSnNEUWtNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9TaGFwZSI+Ci0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9KeGVqSU1YVEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0p4ZWpJY1hURWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0pzRDNvTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25fTmFtZUxhYmVsIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0pzRDNvY1hURWVXd3hfcHVIRHpGWXciIHR5cGU9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25fRmxvYXRpbmdOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSnNEM29zWFRFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0pzUXI4TVhURWVXd3hfcHVIRHpGWXciIHR5cGU9ImNvbXBhcnRtZW50X3NoYXBlX2Rpc3BsYXkiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX0pzUXI4Y1hURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9Kc1FyOHNYVEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX0p2RUlVTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25PYmplY3RTaGFwZSI+Ci0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0p4ZWpJc1hURWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9KeGVqSThYVEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSnZFSVU4WFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdE5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0p2RUlWTVhURWVXd3hfcHVIRHpGWXciIHg9IjIyIiB5PSItMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSnZFSVZjWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdFN0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0p2RXZZTVhURWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0p2RUlVY1hURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX0pyOGk0TVhURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KdkVJVXNYVEVlV3d4X3B1SER6Rll3IiB4PSItMTUiIHk9IjE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX0p2RXZZY1hURWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25WYWx1ZVNoYXBlIj4KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSnhlakpNWFRFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0p4ZWpKY1hURWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9KdkV2Wk1YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uVmFsdWVOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9KdkV2WmNYVEVlV3d4X3B1SER6Rll3IiB4PSIyNCIgeT0iLTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0p2RXZac1hURWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25WYWx1ZVN0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0p2RXZaOFhURWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0p2RXZZc1hURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX0pyLV9JTVhURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KdkV2WThYVEVlV3d4X3B1SER6Rll3IiB4PSItMTUiIHk9IjYyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX0p2RXZhTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uUmVzdWx0U2hhcGUiPgotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9KeGVqSnNYVEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSnhlako4WFRFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0p2Rldjc1hURWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPdXRwdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblJlc3VsdE5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0p2RldjOFhURWVXd3hfcHVIRHpGWXciIHg9Ii00MyIgeT0iMTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0p2RldkTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uUmVzdWx0U3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSnZGV2RjWFRFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfSnZGV2NNWFRFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX0pyOXhBTVhURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KdkZXY2NYVEVlV3d4X3B1SER6Rll3IiB4PSIxNDgiIHk9IjI1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0pzRFFrY1hURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX0pyelk4TVhURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSnNEUWtzWFRFZVd3eF9wdUhEekZZdyIgeD0iMTM0IiB5PSI5IiB3aWR0aD0iMTE4IiBoZWlnaHQ9Ijg1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfanplRllNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iUmVhZFNlbGZBY3Rpb25fU2hhcGUiPgotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfajBrUmtNWFRFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9qMGtSa2NYVEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9qemVzY01YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJSZWFkU2VsZkFjdGlvbl9OYW1lTGFiZWwiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfanplc2NjWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iUmVhZFNlbGZBY3Rpb25fRmxvYXRpbmdOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfanplc2NzWFRFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX2p6cHJrTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9ImNvbXBhcnRtZW50X3NoYXBlX2Rpc3BsYXkiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX2p6cHJrY1hURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9qenBya3NYVEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX2p6cVNvTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9SZWFkU2VsZkFjdGlvblJlc3VsdFNoYXBlIj4KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfajBrUmtzWFRFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX2owa1JrOFhURWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9qenFTbzhYVEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX1JlYWRTZWxmQWN0aW9uUmVzdWx0TmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfanpxU3BNWFRFZVd3eF9wdUhEekZZdyIgeD0iOCIgeT0iMTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2p6cVNwY1hURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9SZWFkU2VsZkFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2p6cVNwc1hURWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2p6cVNvY1hURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19qelJSRU1YVEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfanpxU29zWFRFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9qemVGWWNYVEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfanpRQzhNWFRFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9qemVGWXNYVEVlV3d4X3B1SER6Rll3IiB4PSIxNCIgeT0iOSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX2wweWM0TVhURWVXd3hfcHVIRHpGWXciIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbl9TaGFwZSI+Ci0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9sMXVSQU1YVEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX2wxdVJBY1hURWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2wwekQ4c1hURWVXd3hfcHVIRHpGWXciIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbl9OYW1lTGFiZWwiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbDB6RDg4WFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2wwekQ5TVhURWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9sMDZfd01YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9sMDZfd2NYVEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbDA2X3dzWFRFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9sMDdtME1YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uUmVzdWx0U2hhcGUiPgotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9sMXVSQXNYVEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfbDF1UkE4WFRFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2wwN20wOFhURWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPdXRwdXRQaW5fVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uUmVzdWx0TmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbDA4TjRNWFRFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbDA4TjRjWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT3V0cHV0UGluX1ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2wwOE40c1hURWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2wwN20wY1hURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19sMG0yc01YVEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbDA3bTBzWFRFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9sMHpEOE1YVEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX2wwY2VvTVhURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbDB6RDhjWFRFZVd3eF9wdUhEekZZdyIgeD0iMTQiIHk9IjU0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfYmZPLVVjWFRFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfYmZPWFFjWFRFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19iZS1mb01YVEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfYmZPWFFzWFRFZVd3eF9wdUhEekZZdyIgeD0iOTMiIHk9IjE1MiIgd2lkdGg9IjI5MiIgaGVpZ2h0PSIxMzUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfaGRIQUVNWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWN0aXZpdHlGaW5hbE5vZGVfU2hhcGUiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2hkSEFFOFhWRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBY3Rpdml0eUZpbmFsTm9kZV9GbG9hdGluZ05hbWVMYWJlbCI+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hkSEFGTVhWRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2hkSEFGY1hWRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFjdGl2aXR5RmluYWxOb2RlX1N0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hkSEFGc1hWRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2hkSEFFY1hWRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjdGl2aXR5RmluYWxOb2RlIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX2hjbGJvTVhWRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9oZEhBRXNYVkVlV3d4X3B1SER6Rll3IiB4PSI0MzgiIHk9IjcwMiIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9pYlFfZ01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX1NoYXBlIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9pYlMwc01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0tleXdvcmRMYWJlbCIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfaWJTMHNjWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9BY3Rpdml0eU5vZGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9tSktOa01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uX1NoYXBlIj4KLSAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX21MQjEwTVhYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfbUxDYzRNWFhFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbUpLMG9NWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9OYW1lTGFiZWwiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbUpLMG9jWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9GbG9hdGluZ05hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9tSkswb3NYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfbUpneTRNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfbUpneTRjWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX21KZ3k0c1hYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfbUppQkFNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdFNoYXBlIj4KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfbUxDYzRjWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX21MQ2M0c1hYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9tSmlCQThYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uT2JqZWN0TmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbUppQkJNWFhFZVd3eF9wdUhEekZZdyIgeD0iMTkiIHk9IjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX21KaW9FTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25PYmplY3RTdGVyZW90eXBlTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9tSmlvRWNYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9tSmlCQWNYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19tSkVHOE1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbUppQkFzWFhFZVd3eF9wdUhEekZZdyIgeD0iLTE1IiB5PSIxMyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9tSmlvRXNYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uVmFsdWVTaGFwZSI+Ci0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX21MQ2M0OFhYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9tTENjNU1YWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfbUppb0ZjWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblZhbHVlTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfbUppb0ZzWFhFZVd3eF9wdUhEekZZdyIgeD0iMjEiIHk9Ii0yIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9tSmlvRjhYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uVmFsdWVTdGVyZW90eXBlTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9tSmlvR01YWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9tSmlvRThYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19tSkhLUU1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbUppb0ZNWFhFZVd3eF9wdUhEekZZdyIgeD0iLTE1IiB5PSI1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9tSmlvR2NYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblJlc3VsdFNoYXBlIj4KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfbUxDYzVjWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX21MQ2M1c1hYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9tSmlvSE1YWEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25SZXN1bHROYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9tSmlvSGNYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9tSmlvSHNYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX21KaW9IOFhYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX21KaW9Hc1hYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19tSkZWRU1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbUppb0c4WFhFZVd3eF9wdUhEekZZdyIgeD0iMTE3IiB5PSIzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9tSktOa2NYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19tSV9PY01YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX21KS05rc1hYRWVXd3hfcHVIRHpGWXciIHg9IjEzMSIgeT0iMyIgd2lkdGg9IjExOCIgaGVpZ2h0PSI4NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3J3NTVNTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX1NoYXBlIj4KLSAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX3J5VTFnTVhYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfcnlVMWdjWFhFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfcnc1NU04WFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iUmVhZFNlbGZBY3Rpb25fTmFtZUxhYmVsIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3J3NTVOTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3J3NTVOY1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9yeEZmWU1YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9yeEZmWWNYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcnhGZllzWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9yeEdHY01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fUmVhZFNlbGZBY3Rpb25SZXN1bHRTaGFwZSI+Ci0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX3J5VTFnc1hYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9yeVUxZzhYWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfcnhHR2M4WFhFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik91dHB1dFBpbl9SZWFkU2VsZkFjdGlvblJlc3VsdE5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3J4R0dkTVhYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3J4R0dkY1hYRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9SZWFkU2VsZkFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3J4R0dkc1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3J4R0djY1hYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19yd2xKRU1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcnhHR2NzWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9ydzU1TWNYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfcndraUFNWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ydzU1TXNYWEVlV3d4X3B1SER6Rll3IiB4PSIxMSIgeT0iMyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3VJbUpVTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbl9TaGFwZSI+Ci0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il91S2x0WU1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3VLbHRZY1hYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3VJbXdZTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbl9OYW1lTGFiZWwiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfdUltd1ljWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3VJbXdZc1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il91SXlXa01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il91SXlXa2NYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdUl5V2tzWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il91SXk5b01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uUmVzdWx0U2hhcGUiPgotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il91S2x0WXNYWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfdUtsdFk4WFhFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3VJeTlvOFhYRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPdXRwdXRQaW5fVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uUmVzdWx0TmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdUl5OXBNWFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfdUl5OXBjWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iT3V0cHV0UGluX1ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3VJeTlwc1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3VJeTlvY1hYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI191SVFMRU1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdUl5OW9zWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il91SW1KVWNYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX3VJUGtBTVhYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdUltSlVzWFhFZVd3eF9wdUhEekZZdyIgeD0iMTEiIHk9IjQ4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaWJTMHNzWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfaWJRX2djWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19pYTV6SU1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaWJRX2dzWFhFZVd3eF9wdUhEekZZdyIgeD0iOTYiIHk9IjM5NCIgd2lkdGg9IjI5MiIgaGVpZ2h0PSIxMzUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfeEdUUWtNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9TaGFwZSI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeEdUUWs4WFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9LZXl3b3JkTGFiZWwiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX3hHVFFsTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfQWN0aXZpdHlOb2RlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfeTJXUjRNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbl9TaGFwZSI+Ci0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il95NF9XTU1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3k0X1dNY1hYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3kyVzQ4TVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25fTmFtZUxhYmVsIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3kyVzQ4Y1hYRWVXd3hfcHVIRHpGWXciIHR5cGU9IkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25fRmxvYXRpbmdOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfeTJXNDhzWFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX3kyNXJnTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9ImNvbXBhcnRtZW50X3NoYXBlX2Rpc3BsYXkiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX3kyNXJnY1hYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il95MjVyZ3NYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3kyNjVvTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25PYmplY3RTaGFwZSI+Ci0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX3k0X1dNc1hYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il95NF9XTThYWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfeTI2NW84WFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbk9iamVjdE5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3kyNjVwTVhYRWVXd3hfcHVIRHpGWXciIHg9IjIwIiB5PSIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95MjY1cGNYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uT2JqZWN0U3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfeTI2NXBzWFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfeTI2NW9jWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfeTJQa01NWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3kyNjVvc1hYRWVXd3hfcHVIRHpGWXciIHg9Ii0xNSIgeT0iMTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfeTI3Z3NNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iSW5wdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblZhbHVlU2hhcGUiPgotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il95NF9XTk1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfeTRfV05jWFhFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3kyN2dzOFhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IklucHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25WYWx1ZU5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3kyN2d0TVhYRWVXd3hfcHVIRHpGWXciIHg9IjE3IiB5PSIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95MjdndGNYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJJbnB1dFBpbl9BZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uVmFsdWVTdGVyZW90eXBlTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il95MjdndHNYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il95Mjdnc2NYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI195MlNBY01YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeTI3Z3NzWFhFZVd3eF9wdUhEekZZdyIgeD0iLTE1IiB5PSI1MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il95MjdndDhYWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblJlc3VsdFNoYXBlIj4KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfeTRfV05zWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3k0X1dOOFhYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95MjdndXNYWEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3V0cHV0UGluX0FkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb25SZXN1bHROYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il95MjdndThYWEVlV3d4X3B1SER6Rll3IiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il95Mjdndk1YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fQWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3kyN2d2Y1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3kyN2d1TVhYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI195MlF5VU1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeTI3Z3VjWFhFZVd3eF9wdUhEekZZdyIgeD0iMTE3IiB5PSIzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il95MldSNGNYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI195Mk1nNE1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3kyV1I0c1hYRWVXd3hfcHVIRHpGWXciIHg9IjEzMSIgeT0iOSIgd2lkdGg9IjExOCIgaGVpZ2h0PSI4NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iXzRuSkwwTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX1NoYXBlIj4KLSAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iXzRvcmM0TVhYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfNG9yYzRjWFhFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfNG5KTDA4WFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iUmVhZFNlbGZBY3Rpb25fTmFtZUxhYmVsIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzRuSkwxTVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlJlYWRTZWxmQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzRuSkwxY1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il80blpxZ01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il80blpxZ2NYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfNG5acWdzWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il80bmFSa01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fUmVhZFNlbGZBY3Rpb25SZXN1bHRTaGFwZSI+Ci0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iXzRvcmM0c1hYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il80b3JjNDhYWEVlV3d4X3B1SER6Rll3IiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfNG5hUms4WFhFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik91dHB1dFBpbl9SZWFkU2VsZkFjdGlvblJlc3VsdE5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzRuYVJsTVhYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzRuYVJsY1hYRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik91dHB1dFBpbl9SZWFkU2VsZkFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzRuYVJsc1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iXzRuYVJrY1hYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI180bXhZWU1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfNG5hUmtzWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il80bkpMMGNYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfNG1yUndNWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il80bkpMMHNYWEVlV3d4X3B1SER6Rll3IiB4PSIxMSIgeT0iOCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iXzYxaHU4TVhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbl9TaGFwZSI+Ci0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il82M09ZRU1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iXzYzT1lFY1hYRWVXd3hfcHVIRHpGWXciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzYxaHU4OFhYRWVXd3hfcHVIRHpGWXciIHR5cGU9IlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbl9OYW1lTGFiZWwiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfNjFodTlNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uX0Zsb2F0aW5nTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzYxaHU5Y1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il82MXdfZ01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il82MXdfZ2NYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfNjF3X2dzWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il82MXhta01YWEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPdXRwdXRQaW5fVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uUmVzdWx0U2hhcGUiPgotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il82M09ZRXNYWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfNjNPWUU4WFhFZVd3eF9wdUhEekZZdyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzYxeU5vc1hYRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPdXRwdXRQaW5fVmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uUmVzdWx0TmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfNjF5Tm84WFhFZVd3eF9wdUhEekZZdyIgeT0iNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfNjF5TnBNWFhFZVd3eF9wdUhEekZZdyIgdHlwZT0iT3V0cHV0UGluX1ZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvblJlc3VsdFN0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzYxeU5wY1hYRWVXd3hfcHVIRHpGWXciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iXzYxeU5vTVhYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI182MUpVY01YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfNjF5Tm9jWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il82MWh1OGNYWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjXzYxSXRZTVhYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfNjFodThzWFhFZVd3eF9wdUhEekZZdyIgeD0iMTEiIHk9IjQ5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeEdUUWxjWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfeEdUUWtjWFhFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI194RjlTVU1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfeEdUUWtzWFhFZVd3eF9wdUhEekZZdyIgeD0iOTYiIHk9IjY1MyIgd2lkdGg9IjI5MiIgaGVpZ2h0PSIxMzUiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbzRpQ0g4WFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfYm5SQVVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfbzRpQ0lNWFFFZVd3eF9wdUhEekZZdyIgd2lkdGg9Ijg1NSIgaGVpZ2h0PSI4NDYiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlN0cmluZ1ZhbHVlU3R5bGUiIHhtaTppZD0iX280aUNJY1hRRWVXd3hfcHVIRHpGWXciIG5hbWU9ImRpYWdyYW1fY29tcGF0aWJpbGl0eV92ZXJzaW9uIiBzdHJpbmdWYWx1ZT0iMS4yLjAiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtU3R5bGUiIHhtaTppZD0iX280aUNJc1hRRWVXd3hfcHVIRHpGWXciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJzdHlsZTpQYXB5cnVzVmlld1N0eWxlIiB4bWk6aWQ9Il9vNGlDSThYUUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgIDxvd25lciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX2JuUkFVTVhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDxjb25maWd1cmF0aW9uIHhtaTp0eXBlPSJjb25maWd1cmF0aW9uOlBhcHlydXNEaWFncmFtIiBocmVmPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5zaW1leC9jb25maWcvc2ltZXguY29uZmlndXJhdGlvbiNfVmVyS01HQXlFZVdBdFllWWNjbmpPQSIvPgotICAgIDwvc3R5bGVzPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfYm5SQVVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9zNXlKb01YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X0VkZ2UiIHNvdXJjZT0iX2p6cVNvTVhURWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX0p2RUlVTVhURWVXd3hfcHVIRHpGWXciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfczV5Sm84WFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19OYW1lTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3M1eUpwTVhURWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfczV5SnBjWFRFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfV2VpZ2h0TGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3M1eUpwc1hURWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfczV5SnA4WFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19TZWxlY3Rpb25MYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfczV5SnFNWFRFZVd3eF9wdUhEekZZdyIgeD0iMjAiIHk9IjQwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfczV5d3NNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19UcmFuc2Zvcm1hdGlvbkxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zNXl3c2NYVEVlV3d4X3B1SER6Rll3IiB4PSItMjAiIHk9Ii02MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3M1eXdzc1hURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfS2V5d29yZExhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zNXl3czhYVEVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9zNXl3dE1YVEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19HdWFyZExhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zNXl3dGNYVEVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3M1eXd0c1hURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9zNXl3dDhYVEVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3M1eUpvY1hURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19zNWk1RU1YVEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9zNXlKb3NYVEVlV3d4X3B1SER6Rll3IiBwb2ludHM9IlsxNjAsIDI0OSwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzIyNSwgMjQ3LCAtNjQzOTg0LCAtNjQzOTg0XSIvPgotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3JKTFRzTTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC44MTI1LDAuNzUpIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfczZldE1NWFRFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjA2MjUsMC42ODc1KSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX3VwU19jTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfRWRnZSIgc291cmNlPSJfbDA3bTBNWFRFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfSnZFdlljWFRFZVd3eF9wdUhEekZZdyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il91cFRtZ01YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X05hbWVMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdXBUbWdjWFRFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il91cFRtZ3NYVEVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19XZWlnaHRMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdXBUbWc4WFRFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il91cFRtaE1YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1NlbGVjdGlvbkxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il91cFRtaGNYVEVlV3d4X3B1SER6Rll3IiB4PSIyMCIgeT0iNDAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il91cFRtaHNYVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1RyYW5zZm9ybWF0aW9uTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3VwVG1oOFhURWVXd3hfcHVIRHpGWXciIHg9Ii0yMCIgeT0iLTYwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfdXBUbWlNWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19LZXl3b3JkTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3VwVG1pY1hURWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3VwVU5rTVhURWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X0d1YXJkTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3VwVU5rY1hURWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfdXBVTmtzWFRFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19TdGVyZW90eXBlTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3VwVU5rOFhURWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfdXBTX2NjWFRFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX3VwQUVnTVhURWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3VwU19jc1hURWVXd3hfcHVIRHpGWXciIHBvaW50cz0iWzE2MSwgMjk1LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjI1LCAyOTMsIC02NDM5ODQsIC02NDM5ODRdIi8+Ci0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfcHNzdW9NNVBFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjkzNzUsMC42MjUpIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfdXFETllNWFRFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjEyNSwwLjQzNzUpIi8+Ci0gICAgPC9lZGdlcz4KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfV08xdzBNWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfRWRnZSIgc291cmNlPSJfTXdQMjBNWFNFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfeHJIU0FNWFFFZVd3eF9wdUhEekZZdyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9XTzJYNE1YVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19OYW1lTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1dPMlg0Y1hWRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfV08yWDRzWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfV2VpZ2h0TGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1dPMlg0OFhWRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfV08yWDVNWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfR3VhcmRMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfV08yWDVjWFZFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9XTzJYNXNYVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19TdGVyZW90eXBlTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1dPMlg1OFhWRWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfV08xdzBjWFZFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19XT1hQc01YVkVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9XTzF3MHNYVkVlV3d4X3B1SER6Rll3IiBwb2ludHM9Ils0NDIsIDczLCAtNjQzOTg0LCAtNjQzOTg0XSRbNDQyLCAxMTEsIC02NDM5ODQsIC02NDM5ODRdIi8+Ci0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfV1AwQk1NWFZFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjQ1LDAuOTUpIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfV1Awb1FNWFZFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjQ5NiwwLjA0MjU1MzE5MTQ4OTM2MTcpIi8+Ci0gICAgPC9lZGdlcz4KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfYzZvVFlNWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfRWRnZSIgc291cmNlPSJfeHJIU0FNWFFFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfYmZPWFFNWFRFZVd3eF9wdUhEekZZdyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9jNm82Y01YVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19OYW1lTGFiZWwiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfeE5DY29NWFZFZVd3eF9wdUhEekZZdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYzZvNmNjWFZFZVd3eF9wdUhEekZZdyIgeD0iLTUiIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfYzZvNmNzWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfV2VpZ2h0TGFiZWwiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfeE5sMlFNWFZFZVd3eF9wdUhEekZZdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfYzZvNmM4WFZFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9jNm82ZE1YVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19HdWFyZExhYmVsIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX3hPRmxnTVhWRWVXd3hfcHVIRHpGWXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2M2bzZkY1hWRWVXd3hfcHVIRHpGWXciIHg9IjUiIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfYzZvNmRzWFZFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX3hPdDNvTVhWRWVXd3hfcHVIRHpGWXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2M2bzZkOFhWRWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfYzZvVFljWFZFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19jNkp5UU1YVkVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9jNm9UWXNYVkVlV3d4X3B1SER6Rll3IiBwb2ludHM9Ils0MzcsIDE1MiwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzQzNywgMTg3LCAtNjQzOTg0LCAtNjQzOTg0XSIvPgotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2M3WklZTVhWRWVXd3hfcHVIRHpGWXciIGlkPSIoMC40OTYsMC45MTQ4OTM2MTcwMjEyNzY2KSIvPgotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2M3WklZY1hWRWVXd3hfcHVIRHpGWXciIGlkPSIoMC40OTY1NzUzNDI0NjU3NTM0LDAuMCkiLz4KLSAgICA8L2VkZ2VzPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9kY2tpME1YVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19FZGdlIiBzb3VyY2U9Il9iZk9YUU1YVEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il94NlJ2WU1YUUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2Rja2kwOFhWRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X05hbWVMYWJlbCI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il94TEM0a01YVkVlV3d4X3B1SER6Rll3IiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9kY2tpMU1YVkVlV3d4X3B1SER6Rll3IiB4PSI0IiB5PSIxOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2Rja2kxY1hWRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1dlaWdodExhYmVsIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX3hMb3VjTVhWRWVXd3hfcHVIRHpGWXciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2Rja2kxc1hWRWVXd3hfcHVIRHpGWXciIHg9IjIiIHk9Ii0xNyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2Rja2kxOFhWRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfeE1DLUlNWFZFZVd3eF9wdUhEekZZdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZGNraTJNWFZFZVd3eF9wdUhEekZZdyIgeD0iNiIgeT0iMTgiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9kY2tpMmNYVkVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19TdGVyZW90eXBlTGFiZWwiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfeE1jbXdNWFZFZVd3eF9wdUhEekZZdyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZGNraTJzWFZFZVd3eF9wdUhEekZZdyIgeD0iLTEiIHk9Ii0xOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfZGNraTBjWFZFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19kY0hQME1YVkVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9kY2tpMHNYVkVlV3d4X3B1SER6Rll3IiBwb2ludHM9Ils0MzIsIDMyMiwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzQzNiwgMzU3LCAtNjQzOTg0LCAtNjQzOTg0XSIvPgotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2RkV2w4TVhWRWVXd3hfcHVIRHpGWXciIGlkPSIoMC40OTY1NzUzNDI0NjU3NTM0LDEuMCkiLz4KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9kZFdsOGNYVkVlV3d4X3B1SER6Rll3IiBpZD0iKDAuNDg4NzYxOTA0NzYxOTA1MDYsMC4wNDI1NTMxOTE0ODkzNjE3KSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX0ZJTERjTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfRWRnZSIgc291cmNlPSJfcnhHR2NNWFhFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfbUppQkFNWFhFZVd3eF9wdUhEekZZdyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9GSUxEYzhYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X05hbWVMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRklMRGRNWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9GSUxEZGNYWUVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19XZWlnaHRMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRklMRGRzWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9GSUxxZ01YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1NlbGVjdGlvbkxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9GSUxxZ2NYWUVlV3d4X3B1SER6Rll3IiB4PSIyMCIgeT0iNDAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9GSUxxZ3NYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1RyYW5zZm9ybWF0aW9uTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ZJTHFnOFhZRWVXd3hfcHVIRHpGWXciIHg9Ii0yMCIgeT0iLTYwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfRklMcWhNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19LZXl3b3JkTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ZJTHFoY1hZRWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0ZJTHFoc1hZRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X0d1YXJkTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ZJTHFoOFhZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfRklMcWlNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19TdGVyZW90eXBlTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ZJTHFpY1hZRWVXd3hfcHVIRHpGWXciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfRklMRGNjWFlFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX0ZIclVNTVhZRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ZJTERjc1hZRWVXd3hfcHVIRHpGWXciIHBvaW50cz0iWzE1NywgNDgzLCAtNjQzOTg0LCAtNjQzOTg0XSRbMjI3LCA0NzYsIC02NDM5ODQsIC02NDM5ODRdIi8+Ci0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfb205T2tNNVBFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjgxMjUsMC42ODc1KSIvPgotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3BGVk1vTTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC4wLDAuNzUpIi8+Ci0gICAgPC9lZGdlcz4KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfSEdERllNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19FZGdlIiBzb3VyY2U9Il91SXk5b01YWEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9tSmlvRXNYWEVlV3d4X3B1SER6Rll3Ij4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0hHREZZOFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfTmFtZUxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0RGWk1YWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0hHREZaY1hZRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X1dlaWdodExhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0RGWnNYWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0hHREZaOFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfU2VsZWN0aW9uTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHREZhTVhZRWVXd3hfcHVIRHpGWXciIHg9IjIwIiB5PSI0MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0hHREZhY1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfVHJhbnNmb3JtYXRpb25MYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdERmFzWFlFZVd3eF9wdUhEekZZdyIgeD0iLTIwIiB5PSItNjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9IR0RGYThYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X0tleXdvcmRMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdERmJNWFlFZVd3eF9wdUhEekZZdyIgeT0iLTIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSEdERmJjWFlFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfR3VhcmRMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdERmJzWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9IR0RGYjhYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1N0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdERmNNWFlFZVd3eF9wdUhEekZZdyIgeT0iLTIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9IR0RGWWNYWUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfSEZvMXNNWFlFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdERllzWFlFZVd3eF9wdUhEekZZdyIgcG9pbnRzPSJbMTY1LCA1MjksIC02NDM5ODQsIC02NDM5ODRdJFsyMjIsIDUyOSwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9uRGFfUU01UEVlV2FScG9kUjFTNldBIiBpZD0iKDAuOTM3NSwwLjYyNSkiLz4KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9uYkFfNE01UEVlV2FScG9kUjFTNldBIiBpZD0iKDAuMTI1LDAuNjg3NSkiLz4KLSAgICA8L2VkZ2VzPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9LbHg3b01YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X0VkZ2UiIHNvdXJjZT0iXzRuYVJrTVhYRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX3kyNjVvTVhYRWVXd3hfcHVIRHpGWXciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS2x5aXNNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19OYW1lTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0tseWlzY1hZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS2x5aXNzWFlFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfV2VpZ2h0TGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0tseWlzOFhZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS2x5aXRNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19TZWxlY3Rpb25MYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfS2x5aXRjWFlFZVd3eF9wdUhEekZZdyIgeD0iMjAiIHk9IjQwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfS2x5aXRzWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19UcmFuc2Zvcm1hdGlvbkxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LbHlpdDhYWUVlV3d4X3B1SER6Rll3IiB4PSItMjAiIHk9Ii02MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0tseWl1TVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfS2V5d29yZExhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LbHlpdWNYWUVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9LbHlpdXNYWUVlV3d4X3B1SER6Rll3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT2JqZWN0Rmxvd19HdWFyZExhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LbHlpdThYWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0tseWl2TVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LbHlpdmNYWUVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0tseDdvY1hZRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19LbFk2RU1YWUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9LbHg3b3NYWUVlV3d4X3B1SER6Rll3IiBwb2ludHM9IlsxNTcsIDc0NywgLTY0Mzk4NCwgLTY0Mzk4NF0kWzIyNywgNzQwLCAtNjQzOTg0LCAtNjQzOTg0XSIvPgotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX2x6a2c4TTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC45Mzc1LDAuNDM3NSkiLz4KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9tTWhNY001UEVlV2FScG9kUjFTNldBIiBpZD0iKDAuMDYyNSwwLjU2MjUpIi8+Ci0gICAgPC9lZGdlcz4KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfTVREODBNWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iT2JqZWN0Rmxvd19FZGdlIiBzb3VyY2U9Il82MXhta01YWEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il95Mjdnc01YWEVlV3d4X3B1SER6Rll3Ij4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX01URDgwOFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfTmFtZUxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NVEQ4MU1YWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX01URDgxY1hZRWVXd3hfcHVIRHpGWXciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPYmplY3RGbG93X1dlaWdodExhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NVEQ4MXNYWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX01URDgxOFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfU2VsZWN0aW9uTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX01URDgyTVhZRWVXd3hfcHVIRHpGWXciIHg9IjIwIiB5PSI0MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX01URDgyY1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9Ik9iamVjdEZsb3dfVHJhbnNmb3JtYXRpb25MYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTVREODJzWFlFZVd3eF9wdUhEekZZdyIgeD0iLTIwIiB5PSItNjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9NVEQ4MjhYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X0tleXdvcmRMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTVREODNNWFlFZVd3eF9wdUhEekZZdyIgeT0iLTIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTVREODNjWFlFZVd3eF9wdUhEekZZdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9iamVjdEZsb3dfR3VhcmRMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTVREODNzWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9NVEQ4MzhYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJPYmplY3RGbG93X1N0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTVREODRNWFlFZVd3eF9wdUhEekZZdyIgeT0iLTIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9NVEQ4MGNYWUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfTVNuUTRNWFlFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTVREODBzWFlFZVd3eF9wdUhEekZZdyIgcG9pbnRzPSJbMTYwLCA3ODksIC02NDM5ODQsIC02NDM5ODRdJFsyMjYsIDc5NiwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9qb3hkVU01UEVlV2FScG9kUjFTNldBIiBpZD0iKDAuOTM3NSwwLjQzNzUpIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfa1Y3ZVFNNVBFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjA2MjUsMC41NjI1KSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX1B6OTN3TVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0VkZ2UiIHNvdXJjZT0iX3g2UnZZTVhRRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX2liUV9nTVhYRWVXd3hfcHVIRHpGWXciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUHo5M3c4WFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9QejkzeE1YWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1B6OTN4Y1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1dlaWdodExhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9QejkzeHNYWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1B6OTN4OFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1B6OTN5TVhZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUHo5M3ljWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9QejkzeXNYWUVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX1B6OTN3Y1hZRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfUHpna3dNWFlFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUHo5M3dzWFlFZVd3eF9wdUhEekZZdyIgcG9pbnRzPSJbMjQwLCAzOTgsIC02NDM5ODQsIC02NDM5ODRdJFsyNDAsIDQzMCwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9QMHhKQU1YWUVlV3d4X3B1SER6Rll3IiBpZD0iKDAuNDc4NDM0NzgyNjA4Njk1NzYsMC45MTQ4OTM2MTcwMjEyNzY2KSIvPgotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1AweEpBY1hZRWVXd3hfcHVIRHpGWXciIGlkPSIoMC40NzYzOTk2NDI2NDQ0MzEzLDAuMCkiLz4KLSAgICA8L2VkZ2VzPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9RWk1yd01YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19FZGdlIiBzb3VyY2U9Il9pYlFfZ01YWEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il95SVA1OE1YUUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1FaTXJ3OFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X05hbWVMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUVpNcnhNWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9RWk1yeGNYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19XZWlnaHRMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUVpNcnhzWFlFZVd3eF9wdUhEekZZdyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9RWk1yeDhYWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJDb250cm9sRmxvd19HdWFyZExhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RWk1yeU1YWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1FaTXJ5Y1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1N0ZXJlb3R5cGVMYWJlbCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUVpNcnlzWFlFZVd3eF9wdUhEekZZdyIgeT0iLTIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9RWk1yd2NYWUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX1FZdl8wTVhZRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1FaTXJ3c1hZRWVXd3hfcHVIRHpGWXciIHBvaW50cz0iWzIzOCwgNTY1LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjQxLCA2MDAsIC02NDM5ODQsIC02NDM5ODRdIi8+Ci0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfUVpfOUFNWFlFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjQ3OTQ1MjA1NDc5NDUyMDUsMS4wKSIvPgotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1FaXzlBY1hZRWVXd3hfcHVIRHpGWXciIGlkPSIoMC40ODczMDQzNDc4MjYwODcsMC4wNDI1NTMxOTE0ODkzNjE3KSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX1F5emVrTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0VkZ2UiIHNvdXJjZT0iX3lJUDU4TVhRRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX3hHVFFrTVhYRWVXd3hfcHVIRHpGWXciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUXkwRm9NWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ReTBGb2NYWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1F5MEZvc1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1dlaWdodExhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ReTBGbzhYWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1F5MEZwTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1F5MEZwY1hZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUXkwRnBzWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ReTBGcDhYWUVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX1F5emVrY1hZRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfUXlZbjBNWFlFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUXl6ZWtzWFlFZVd3eF9wdUhEekZZdyIgcG9pbnRzPSJbMjQyLCA2NDEsIC02NDM5ODQsIC02NDM5ODRdJFsyNDAsIDY4OSwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9Rem5XNE1YWUVlV3d4X3B1SER6Rll3IiBpZD0iKDAuNDkzMjQ1OTAxNjM5MzQ0MywwLjkxNDg5MzYxNzAyMTI3NjYpIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfUXpuVzRjWFlFZVd3eF9wdUhEekZZdyIgaWQ9IigwLjQ4Mjg3NjcxMjMyODc2NzEsMC4wKSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX1JUU1ZjTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0VkZ2UiIHNvdXJjZT0iX3hHVFFrTVhYRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX2hkSEFFTVhWRWVXd3hfcHVIRHpGWXciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUlRTVmM4WFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfTmFtZUxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9SVFNWZE1YWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1JUU1ZkY1hZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X1dlaWdodExhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9SVFNWZHNYWUVlV3d4X3B1SER6Rll3IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1JUU1ZkOFhZRWVXd3hfcHVIRHpGWXciIHR5cGU9IkNvbnRyb2xGbG93X0d1YXJkTGFiZWwiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1JUU1ZlTVhZRWVXd3hfcHVIRHpGWXciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUlRTVmVjWFlFZVd3eF9wdUhEekZZdyIgdHlwZT0iQ29udHJvbEZsb3dfU3RlcmVvdHlwZUxhYmVsIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9SVFNWZXNYWUVlV3d4X3B1SER6Rll3IiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX1JUU1ZjY1hZRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfUlMxQ2NNWFlFZVd3eF9wdUhEekZZdyIvPgotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUlRTVmNzWFlFZVd3eF9wdUhEekZZdyIgcG9pbnRzPSJbMzkzLCA3NTEsIC02NDM5ODQsIC02NDM5ODRdJFs0NDQsIDc1MSwgLTY0Mzk4NCwgLTY0Mzk4NF0iLz4KLSAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9SVWtIME1YWUVlV3d4X3B1SER6Rll3IiBpZD0iKDEuMCwwLjQ2NTY3MTY0MTc5MTA0NTE0KSIvPgotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1JVa0gwY1hZRWVXd3hfcHVIRHpGWXciIGlkPSIoMC4wNzc0MDc0MDc0MDc0MDY0OCwwLjY1NDgxNDgxNDgxNDgxMykiLz4KLSAgICA8L2VkZ2VzPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0UwRGhjTWFFRWVXZkZkbnYyNkVmdWciIHR5cGU9IlBhcHlydXNVTUxBY3Rpdml0eURpYWdyYW0iIG5hbWU9IkMyIENsYXNzaWZpZXIgQmVoYXZpb3IgZGlhZ3JhbSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfRTBEaGNjYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMjAwMSI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9FMERoY3NhRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0UwRGhkTWFFRWVXZkZkbnYyNkVmdWciIHR5cGU9IjcwMDEiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX0UwRGhkY2FFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX0UwRGhkc2FFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRTBEaGQ4YUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfRTBEaGVNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNzAwMiI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfRTBEaGVjYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfRTBEaGVzYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9FMERoZThhRUVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9FMERoZk1hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI3MDAzIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il9FMERoZmNhRUVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il9FMERoZnNhRUVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0UwRGhmOGFFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0UwRGhnTWFFRWVXZkZkbnYyNkVmdWciIHR5cGU9IjcwMDQiPgotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9ObU9oc01hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDgwIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9ObVBJd01hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTM4Ii8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb21tZW50IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX05tS1FRTWFFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ObU9oc2NhRUVlV2ZGZG52MjZFZnVnIiB4PSI0MjYiIHk9IjMxIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3ROT2tvTWFFRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwNjMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il95SWtkUU1hRUVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfeUlsRVVNYUVFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3ROT2tvOGFFRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUwNzgiLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il90TlBMc01hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MDc5Ij4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdE5QTHNjYUVFZVdmRmRudjI2RWZ1ZyIgeD0iOTIiIHk9IjE0Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il90TlBMc3NhRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTE1Ij4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfdE5QTHM4YUVFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfdE5QTHRNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjA0MCI+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3ROUEx0Y2FFRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfdE5jbkVNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il90TmNuRWNhRUVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il90TmNuRXNhRUVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il90Tk9rb2NhRUVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI190TkllQU1hRUVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfdE5Pa29zYUVFZVdmRmRudjI2RWZ1ZyIgeD0iMTUxIiB5PSIxMjEiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfLUhnVWNNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA2MyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0IxMFpRTWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9CMTBaUWNhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfLUhnN2dNYUVFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTA3OCIvPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXy1IZzdnY2FFRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUwNzkiPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tSGc3Z3NhRUVlV2ZGZG52MjZFZnVnIiB4PSI5MSIgeT0iMTUiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXy1IZzdnOGFFRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMTUiPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tSGc3aE1hRUVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8tSGhpa01hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDQwIj4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLUhoaWtjYUVFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il8tSG1iRU1hRUVlV2ZGZG52MjZFZnVnIiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iXy1IbWJFY2FFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXy1IbWJFc2FFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iXy1IZ1VjY2FFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjXzlubXNZTWFFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8tSGdVY3NhRUVlV2ZGZG52MjZFZnVnIiB4PSIxNTEiIHk9IjM1OCIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9JVEpwRU1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDA0Ij4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9JVEtRSU1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDM0Ij4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSVRLUUljYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfSVRLUUlzYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTA4MCI+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0lUS1FJOGFGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0lUSnBFY2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkluaXRpYWxOb2RlIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX0lUQzdZTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVEpwRXNhRkVlV2ZGZG52MjZFZnVnIiB4PSIyMDQiIHk9IjUwIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX0tpbFZFTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwNjUiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0tpbFZFOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMTciLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0tpbFZGTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjcwMDUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfUTQ2bEFNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA4MSI+Ci0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9RNkpVRU1hRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1E2SlVFY2FGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1E0NmxBOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMzkiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUTQ2bEJNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAyNSI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RNDZsQmNhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfUTVCNXdNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfUTVCNXdjYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1E1QjV3c2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfUTVESDRNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA4NCI+Ci0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX1E2SlVFc2FGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9RNkpVRThhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfUTVESDQ4YUZFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjUxNDQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9RNURINU1hRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9RNURINWNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfUTVESDVzYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfUTVESDRjYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX1E0eUNJTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9RNURINHNhRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX1E0NmxBY2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpSZWFkU2VsZkFjdGlvbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19RNG1iOE1hRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1E0NmxBc2FGRWVXZkZkbnYyNkVmdWciIHg9IjEyIiB3aWR0aD0iMjgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9TdDV3c01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDc2Ij4KLSAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX1N2REFNTWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfU3ZEQU1jYUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfU3Q1d3M4YUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTEyNiIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9TdDV3dE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDI2Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1N0NXd0Y2FGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9TdUJzZ01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9TdUJzZ2NhRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfU3VCc2dzYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9TdUNUa01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDc3Ij4KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfU3ZEQU1zYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1N2REFNOGFGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9TdUNUazhhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNTEyNCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX1N1QzZvTWFGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1N1QzZvY2FGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMjUiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9TdUM2b3NhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9TdUNUa2NhRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfU3R1S2dNYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1N1Q1Rrc2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfU3Q1d3NjYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19TdHJ1UU1hRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1N0NXdzc2FGRWVXZkZkbnYyNkVmdWciIHg9IjEyIiB5PSI0MyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX1pFLUFjTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwOTEiPgotICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfWkt1cU1NYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9aS3VxTWNhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9aRS1BYzhhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTYwIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1pFLW5nTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMTkiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfWkUtbmdjYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX1pGTGIwTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9ImNvbXBhcnRtZW50X3NoYXBlX2Rpc3BsYXkiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlRpdGxlU3R5bGUiIHhtaTppZD0iX1pGTGIwY2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9aRkxiMHNhRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX1pJRHdzTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwOTIiPgotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9aS3VxTXNhRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfWkt1cU04YUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1pJRHdzOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNTQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9aSUR3dE1hRkVlV2ZGZG52MjZFZnVnIiB4PSIxOCIgeT0iLTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX1pJRVh3TWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNTUiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9aSUVYd2NhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9aSUR3c2NhRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19aRXlhUU1hRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfWklEd3NzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iLTE1IiB5PSIxMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9aSUVYd3NhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDkzIj4KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfWkt1cU5NYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX1pLdXFOY2FGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9aSUVYeGNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTU2Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfWklFWHhzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMjEiIHk9Ii0yIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9aSUUtME1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTU3Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfWklFLTBjYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfWklFWHc4YUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfWkUzU3dNYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1pJRVh4TWFGRWVXZkZkbnYyNkVmdWciIHg9Ii0xNSIgeT0iNTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfWklFLTBzYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA5NCI+Ci0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX1pLdXFOc2FGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9aS3VxTjhhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfWklFLTFjYUZFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjUxNTgiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9aSUUtMXNhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9aSUUtMThhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTU5Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfWklFLTJNYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfWklFLTA4YUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX1pFMDJnTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9aSUUtMU1hRkVlV2ZGZG52MjZFZnVnIiB4PSI4NiIgeT0iMjgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfWkUtQWNjYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfWkVwM1lNYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9aRS1BY3NhRkVlV2ZGZG52MjZFZnVnIiB4PSIxMTkiIHk9IjciIHdpZHRoPSI4NyIgaGVpZ2h0PSI3NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0tpbFZGY2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX0tpbFZFY2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfS2lZZ3dNYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0tpbFZFc2FGRWVXZkZkbnYyNkVmdWciIHg9Ijg2IiB5PSIyMDQiIHdpZHRoPSIyNTUiIGhlaWdodD0iMTI0Ii8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX0xhZW1ZTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwNjUiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0xhZW1ZOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMTciLz4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkJhc2ljQ29tcGFydG1lbnQiIHhtaTppZD0iX0xhZW1aTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjcwMDUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfZlVvQW9NYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA4MSI+Ci0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9mVndDQU1hRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX2ZWd0NBY2FGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2ZVb0FvOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMzkiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZlVvQXBNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAyNSI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9mVW9BcGNhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfZlV6bTBNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfZlV6bTBjYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2ZVem0wc2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfZlUwTjRNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA4NCI+Ci0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX2ZWd0NBc2FGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9mVndDQThhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfZlUwTjQ4YUZFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjUxNDQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9mVTBONU1hRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9mVTBONWNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI1MTQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfZlUwTjVzYUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfZlUwTjRjYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX2ZVVDNrTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9mVTBONHNhRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX2ZVb0FvY2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpSZWFkU2VsZkFjdGlvbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19mVVNwY01hRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2ZVb0Fvc2FGRWVXZkZkbnYyNkVmdWciIHg9IjEyIiB5PSIyIiB3aWR0aD0iMjgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9oQ2hzNE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDc2Ij4KLSAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX2hENC0wTWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfaEQ0LTBjYUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfaENpVDhNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTEyNiIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9oQ2lUOGNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDI2Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hDaVQ4c2FGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpCYXNpY0NvbXBhcnRtZW50IiB4bWk6aWQ9Il9oQ3l5b01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJjb21wYXJ0bWVudF9zaGFwZV9kaXNwbGF5Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpUaXRsZVN0eWxlIiB4bWk6aWQ9Il9oQ3l5b2NhRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfaEN5eW9zYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9oQ3pac01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDc3Ij4KLSAgICAgICAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfaEQ0LTBzYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJQYXB5cnVzQ1NTRm9yY2VWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX2hENC0wOGFGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9oQ3paczhhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNTEyNCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2hDelp0TWFGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX2hDelp0Y2FGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxMjUiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9oQ3padHNhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9oQ3pac2NhRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfaENRbklNYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hDelpzc2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246SGludGVkRGlhZ3JhbUxpbmtTdHlsZSIgeG1pOmlkPSJfaENoczRjYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19oQ1BaQU1hRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2hDaHM0c2FGRWVXZkZkbnYyNkVmdWciIHg9IjEyIiB5PSI1MCIgd2lkdGg9IjI4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfcDRqNWNNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA5MSI+Ci0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9wNjBqUU1hRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX3A2MGpRY2FGRWVXZkZkbnYyNkVmdWciIGtleT0ibXV0YWJsZSIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3A0bEhrTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUxNjAiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfcDRsSGtjYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAxOSI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9wNGxIa3NhRkVlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246QmFzaWNDb21wYXJ0bWVudCIgeG1pOmlkPSJfcDQ3czRNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iY29tcGFydG1lbnRfc2hhcGVfZGlzcGxheSI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246VGl0bGVTdHlsZSIgeG1pOmlkPSJfcDQ3czRjYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3A0N3M0c2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfcDQ4VDhNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA5MiI+Ci0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX3A2MGpRc2FGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9wNjBqUThhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfcDQ4VDg4YUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTE1NCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3A0OFQ5TWFGRWVXZkZkbnYyNkVmdWciIHg9IjIwIiB5PSItMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfcDQ4VDljYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTE1NSI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3A0OFQ5c2FGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3A0OFQ4Y2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX3A0WTZVTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9wNDhUOHNhRkVlV2ZGZG52MjZFZnVnIiB4PSItMTUiIHk9IjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZSIgeG1pOmlkPSJfcDQ4N0FNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iMzA5MyI+Ci0gICAgICAgICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX3A2MGpSTWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iUGFweXJ1c0NTU0ZvcmNlVmFsdWUiPgotICAgICAgICAgICAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9wNjBqUmNhRkVlV2ZGZG52MjZFZnVnIiBrZXk9Im11dGFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfcDQ4N0E4YUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTE1NiI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3A0ODdCTWFGRWVXZkZkbnYyNkVmdWciIHg9IjIyIiB5PSItMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfcDQ4N0JjYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTE1NyI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3A0ODdCc2FGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3A0ODdBY2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOklucHV0UGluIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX3A0Z1BFTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9wNDg3QXNhRkVlV2ZGZG52MjZFZnVnIiB4PSItMTUiIHk9IjUzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246U2hhcGUiIHhtaTppZD0iX3A0ODdCOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjMwOTQiPgotICAgICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9wNjBqUnNhRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9IlBhcHlydXNDU1NGb3JjZVZhbHVlIj4KLSAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfcDYwalI4YUZFZVdmRmRudjI2RWZ1ZyIga2V5PSJtdXRhYmxlIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX3A0ODdDc2FGRWVXZkZkbnYyNkVmdWciIHZpc2libGU9ImZhbHNlIiB0eXBlPSI1MTU4Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfcDQ4N0M4YUZFZVdmRmRudjI2RWZ1ZyIgeT0iNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfcDQ4N0RNYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNTE1OSI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX3A0ODdEY2FGRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3A0ODdDTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19wNGF2Z01hRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcDQ4N0NjYUZFZVdmRmRudjI2RWZ1ZyIgeD0iODYiIHk9IjI4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkhpbnRlZERpYWdyYW1MaW5rU3R5bGUiIHhtaTppZD0iX3A0ajVjY2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBZGRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlQWN0aW9uIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX3A0VlA4TWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcDRqNWNzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMTE5IiB5PSI5IiB3aWR0aD0iODciIGhlaWdodD0iNzUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9MYWVtWmNhRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9MYWVtWWNhRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX0xhVG5RTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9MYWVtWXNhRkVlV2ZGZG52MjZFZnVnIiB4PSI4NSIgeT0iNDQzIiB3aWR0aD0iMjU4IiBoZWlnaHQ9IjEzMiIvPgotICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlIiB4bWk6aWQ9Il9Lcmxxb01hR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSIzMDA1Ij4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9LcmxxbzhhR0VlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNjAzMyI+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0tybHFwTWFHRWVXZkZkbnYyNkVmdWciIHk9IjUiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX0tybHFwY2FHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjUwODEiPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9LcmxxcHNhR0VlV2ZGZG52MjZFZnVnIiB5PSI1Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpIaW50ZWREaWFncmFtTGlua1N0eWxlIiB4bWk6aWQ9Il9Lcmxxb2NhR0VlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpBY3Rpdml0eUZpbmFsTm9kZSIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19Lckt6NE1hR0VlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfS3JscW9zYUdFZVdmRmRudjI2RWZ1ZyIgeD0iMzkyIiB5PSI1MDYiLz4KLSAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRTBEaGdjYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfQnhVSk1NYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRTBEaGdzYUVFZVdmRmRudjI2RWZ1ZyIgd2lkdGg9Ijg3OCIgaGVpZ2h0PSI1NzkiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlN0cmluZ1ZhbHVlU3R5bGUiIHhtaTppZD0iX0UwRGhnOGFFRWVXZkZkbnYyNkVmdWciIG5hbWU9ImRpYWdyYW1fY29tcGF0aWJpbGl0eV92ZXJzaW9uIiBzdHJpbmdWYWx1ZT0iMS4xLjAiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtU3R5bGUiIHhtaTppZD0iX0UwRGhoTWFFRWVXZkZkbnYyNkVmdWciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJzdHlsZTpQYXB5cnVzVmlld1N0eWxlIiB4bWk6aWQ9Il9FMERoaGNhRUVlV2ZGZG52MjZFZnVnIj4KLSAgICAgIDxvd25lciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX0J4VUpNTWFFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgIDxjb25maWd1cmF0aW9uIHhtaTp0eXBlPSJjb25maWd1cmF0aW9uOlBhcHlydXNEaWFncmFtIiBocmVmPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5zaW1leC9jb25maWcvc2ltZXguY29uZmlndXJhdGlvbiNfVmVyS01HQXlFZVdBdFllWWNjbmpPQSIvPgotICAgIDwvc3R5bGVzPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHkiIGhyZWY9IlRhbmtCYXJyZWxFeGFtcGxlLnVtbCNfQnhVSk1NYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il8wUVBlOE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI0MDAzIiBzb3VyY2U9Il9RNURINE1hRkVlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il9aSUR3c01hRkVlV2ZGZG52MjZFZnVnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzBRUGU4OGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDEiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzBRUGU5TWFGRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMFFQZTljYUZFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjYwMDIiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzBRUUdBTWFGRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMFFRR0FjYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwNSI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMFFRR0FzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMjAiIHk9IjQwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMFFRR0E4YUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwNiI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMFFRR0JNYUZFZVdmRmRudjI2RWZ1ZyIgeD0iLTIwIiB5PSItNjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wUVFHQmNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA3Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wUVFHQnNhRkVlV2ZGZG52MjZFZnVnIiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wUVFHQjhhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNjAwOCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMFFRR0NNYUZFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wUVFHQ2NhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDEwIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wUVFHQ3NhRkVlV2ZGZG52MjZFZnVnIiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iXzBRUGU4Y2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI18wUDQ1b01hRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8wUVBlOHNhRkVlV2ZGZG52MjZFZnVnIiBwb2ludHM9IlsxNTAsIDI5MywgLTY0Mzk4NCwgLTY0Mzk4NF0kWzE5OSwgMjkwLCAtNjQzOTg0LCAtNjQzOTg0XSIvPgotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iXzd2bEZRTTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC44MTI1LDAuNTYyNSkiLz4KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il8wUTVtUU1hRkVlV2ZGZG52MjZFZnVnIiBpZD0iKDAuMTg3NSwwLjI1KSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iXzBvWEVBTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjQwMDMiIHNvdXJjZT0iX1N1Q1RrTWFGRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX1pJRVh3c2FGRWVXZkZkbnYyNkVmdWciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMG9YRUE4YUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwMSI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMG9YRUJNYUZFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wb1hFQmNhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNjAwMiI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMG9YRUJzYUZFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wb1hFQjhhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA1Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wb1hFQ01hRkVlV2ZGZG52MjZFZnVnIiB4PSIyMCIgeT0iNDAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wb1hFQ2NhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA2Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wb1hFQ3NhRkVlV2ZGZG52MjZFZnVnIiB4PSItMjAiIHk9Ii02MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzBvWEVDOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDciPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzBvWEVETWFGRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzBvWEVEY2FGRWVXZkZkbnYyNkVmdWciIHZpc2libGU9ImZhbHNlIiB0eXBlPSI2MDA4Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wb1hFRHNhRkVlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzBvWEVEOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMTAiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzBvWEVFTWFGRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfMG9YRUFjYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjXzBvQ1Q0TWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzBvWEVBc2FGRWVXZkZkbnYyNkVmdWciIHBvaW50cz0iWzE1MCwgMzM0LCAtNjQzOTg0LCAtNjQzOTg0XSRbMTk5LCAzMzQsIC02NDM5ODQsIC02NDM5ODRdIi8+Ci0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfODdmZXdNNVBFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjgxMjUsMC42MjUpIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfMHBDWmNNYUZFZVdmRmRudjI2RWZ1ZyIgaWQ9IigwLjEyNSwwLjYyNSkiLz4KLSAgICA8L2VkZ2VzPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il8wLWZzRU1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI0MDAzIiBzb3VyY2U9Il9mVTBONE1hRkVlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il9wNDhUOE1hRkVlV2ZGZG52MjZFZnVnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzAtZnNFOGFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDEiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzAtZnNGTWFGRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMC1mc0ZjYUZFZVdmRmRudjI2RWZ1ZyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IjYwMDIiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzAtZnNGc2FGRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMC1mc0Y4YUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwNSI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMC1mc0dNYUZFZVdmRmRudjI2RWZ1ZyIgeD0iMjAiIHk9IjQwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMC1mc0djYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwNiI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMC1mc0dzYUZFZVdmRmRudjI2RWZ1ZyIgeD0iLTIwIiB5PSItNjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wLWZzRzhhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA3Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wLWZzSE1hRkVlV2ZGZG52MjZFZnVnIiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wLWZzSGNhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNjAwOCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMC1mc0hzYUZFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8wLWZzSDhhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDEwIj4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8wLWZzSU1hRkVlV2ZGZG52MjZFZnVnIiB5PSItMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iXzAtZnNFY2FGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI18wLUs3OE1hRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8wLWZzRXNhRkVlV2ZGZG52MjZFZnVnIiBwb2ludHM9IlsxNTAsIDUzMSwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzIwNCwgNTI3LCAtNjQzOTg0LCAtNjQzOTg0XSIvPgotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iXy01djdNTTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC44NzUsMC41KSIvPgotICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX19TUFRzTTVQRWVXYVJwb2RSMVM2V0EiIGlkPSIoMC4xMjUsMC40Mzc1KSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iXzFiZnhJTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjQwMDMiIHNvdXJjZT0iX2hDelpzTWFGRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX3A0ODdBTWFGRWVXZkZkbnYyNkVmdWciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfMWJnWU1NYUZFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwMSI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMWJnWU1jYUZFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8xYmdZTXNhRkVlV2ZGZG52MjZFZnVnIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iNjAwMiI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfMWJnWU04YUZFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8xYmdZTk1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA1Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8xYmdZTmNhRkVlV2ZGZG52MjZFZnVnIiB4PSIyMCIgeT0iNDAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il8xYmdZTnNhRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA2Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8xYmdZTjhhRkVlV2ZGZG52MjZFZnVnIiB4PSItMjAiIHk9Ii02MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzFiZ1lPTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDciPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzFiZ1lPY2FGRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzFiZ1lPc2FGRWVXZkZkbnYyNkVmdWciIHZpc2libGU9ImZhbHNlIiB0eXBlPSI2MDA4Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8xYmdZTzhhRkVlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iXzFiZ1lQTWFGRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMTAiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXzFiZ1lQY2FGRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfMWJmeEljYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjXzFiTEJBTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXzFiZnhJc2FGRWVXZkZkbnYyNkVmdWciIHBvaW50cz0iWzE1MCwgNTc2LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjA0LCA1NzEsIC02NDM5ODQsIC02NDM5ODRdIi8+Ci0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfMWNWZW9NYUZFZVdmRmRudjI2RWZ1ZyIgaWQ9IigwLjE4NzUsMC4zNzUpIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfQ0ltYzBNNVFFZVdhUnBvZFIxUzZXQSIgaWQ9IigwLjA2MjUsMC41KSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX011SGpFTWFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjQwMDQiIHNvdXJjZT0iX0lUSnBFTWFGRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX3ROT2tvTWFFRWVXZkZkbnYyNkVmdWciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTXVIakU4YUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwMyI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTXVIakZNYUdFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9NdUhqRmNhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA0Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9NdUhqRnNhR0VlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX011SGpGOGFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDkiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX011SGpHTWFHRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTXVIakdjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAxMSI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTXVIakdzYUdFZVdmRmRudjI2RWZ1ZyIgeT0iLTIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9NdUhqRWNhR0VlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX010dWhnTWFHRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX011SGpFc2FHRWVXZkZkbnYyNkVmdWciIHBvaW50cz0iWzIxNCwgMTA0LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjE0LCAxNTksIC02NDM5ODQsIC02NDM5ODRdIi8+Ci0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfTXV5UmNNYUdFZVdmRmRudjI2RWZ1ZyIgaWQ9IigwLjQ1LDAuOSkiLz4KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9NdXlSY2NhR0VlV2ZGZG52MjZFZnVnIiBpZD0iKDAuNDk2LDAuMDQyNTUzMTkxNDg5MzYxNykiLz4KLSAgICA8L2VkZ2VzPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9OTGZia01hR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il90Tk9rb01hRUVlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il9LaWxWRU1hRkVlV2ZGZG52MjZFZnVnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX05MZmJrOGFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDMiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX05MZ0NvTWFHRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTkxnQ29jYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwNCI+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTkxnQ29zYUdFZVdmRmRudjI2RWZ1ZyIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9OTGdDbzhhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA5Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9OTGdDcE1hR0VlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX05MZ0NwY2FHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMTEiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX05MZ0Nwc2FHRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfTkxmYmtjYUdFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19OTEw1a01hR0VlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9OTGZia3NhR0VlV2ZGZG52MjZFZnVnIiBwb2ludHM9IlsyMTUsIDIwMCwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzIxNSwgMjQwLCAtNjQzOTg0LCAtNjQzOTg0XSIvPgotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX05NRlJjTWFHRWVXZkZkbnYyNkVmdWciIGlkPSIoMC40NzkwNzY5MjMwNzY5MjMwNywwLjkxNDg5MzYxNzAyMTI3NjYpIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfTk1GUmNjYUdFZVdmRmRudjI2RWZ1ZyIgaWQ9IigwLjQ4NjcyNjk5ODQ5MTcwNDM3LDAuMCkiLz4KLSAgICA8L2VkZ2VzPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yIiB4bWk6aWQ9Il9OeUpMNE1hR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il9LaWxWRU1hRkVlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il8tSGdVY01hRUVlV2ZGZG52MjZFZnVnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX055Skw0OGFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDMiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfUi1xUG9NYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTnlKTDVNYUdFZVdmRmRudjI2RWZ1ZyIgeD0iLTQiIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfTnlKTDVjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwNCI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9SLS1Zc01hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9OeUpMNXNhR0VlV2ZGZG52MjZFZnVnIiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX055Skw1OGFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMDkiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfUl9Rc2tNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfTnlKTDZNYUdFZVdmRmRudjI2RWZ1ZyIgeD0iNCIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9OeUpMNmNhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDExIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1Jfa09rTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX055Skw2c2FHRWVXZkZkbnYyNkVmdWciIHk9Ii0yMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfTnlKTDRjYUdFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19OeGJhTU1hR0VlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9OeUpMNHNhR0VlV2ZGZG52MjZFZnVnIiBwb2ludHM9IlsyMTMsIDM2NCwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzIxNSwgMzkwLCAtNjQzOTg0LCAtNjQzOTg0XSIvPgotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX055dzI4TWFHRWVXZkZkbnYyNkVmdWciIGlkPSIoMC40ODYyNzQ1MDk4MDM5MjE1NiwxLjApIi8+Ci0gICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfTnl4ZUFNYUdFZVdmRmRudjI2RWZ1ZyIgaWQ9IigwLjQ3OTEzNTEzNTEzNTEzNTIsMC4wNDI1NTMxOTE0ODkzNjE3KSIvPgotICAgIDwvZWRnZXM+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3IiIHhtaTppZD0iX09LdGM0TWFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjQwMDQiIHNvdXJjZT0iXy1IZ1VjTWFFRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX0xhZW1ZTWFGRWVXZkZkbnYyNkVmdWciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfT0t0YzQ4YUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwMyI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9SOVdCQU1hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9PS3RjNU1hR0VlV2ZGZG52MjZFZnVnIiB4PSItOCIgeT0iMjAiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9PS3RjNWNhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA0Ij4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1I5dDBjTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09LdUQ4TWFHRWVXZkZkbnYyNkVmdWciIHk9IjIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfT0t1RDhjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwOSI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9SOV9oUU1hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9PS3VEOHNhR0VlV2ZGZG52MjZFZnVnIiB4PSI4IiB5PSIyMCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246RGVjb3JhdGlvbk5vZGUiIHhtaTppZD0iX09LdUQ4OGFHRWVXZkZkbnYyNkVmdWciIHR5cGU9IjYwMTEiPgotICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpCb29sZWFuVmFsdWVTdHlsZSIgeG1pOmlkPSJfUi1XdG9NYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iSVNfVVBEQVRFRF9QT1NJVElPTiIgYm9vbGVhblZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfT0t1RDlNYUdFZVdmRmRudjI2RWZ1ZyIgeT0iLTIwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9PS3RjNGNhR0VlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8ZWxlbWVudCB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiBocmVmPSJUYW5rQmFycmVsRXhhbXBsZS51bWwjX09LV1FnTWFHRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX09LdGM0c2FHRWVXZkZkbnYyNkVmdWciIHBvaW50cz0iWzIxNSwgNDI4LCAtNjQzOTg0LCAtNjQzOTg0XSRbMjE3LCA0NzksIC02NDM5ODQsIC02NDM5ODRdIi8+Ci0gICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfT0xXV0VNYUdFZVdmRmRudjI2RWZ1ZyIgaWQ9IigwLjQ4OCwwLjg1MTA2MzgyOTc4NzIzNCkiLz4KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9PTFdXRWNhR0VlV2ZGZG52MjZFZnVnIiBpZD0iKDAuNDk0NTM4NDA3MzI5MTA0OSwwLjApIi8+Ci0gICAgPC9lZGdlcz4KLSAgICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvciIgeG1pOmlkPSJfT243a1lNYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNDAwNCIgc291cmNlPSJfTGFlbVlNYUZFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfS3JscW9NYUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9PbjdrWThhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDAzIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1BBaVJvTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09uN2taTWFHRWVXZkZkbnYyNkVmdWciIHg9Ii0xOCIgeT0iMTkiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9PbjdrWmNhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDA0Ij4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1BBNkZFTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09uN2tac2FHRWVXZkZkbnYyNkVmdWciIHg9IjEiIHk9IjE4Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpEZWNvcmF0aW9uTm9kZSIgeG1pOmlkPSJfT244TGNNYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iNjAwOSI+Ci0gICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkJvb2xlYW5WYWx1ZVN0eWxlIiB4bWk6aWQ9Il9QQlRHb01hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJJU19VUERBVEVEX1BPU0lUSU9OIiBib29sZWFuVmFsdWU9InRydWUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9PbjhMY2NhR0VlV2ZGZG52MjZFZnVnIiB4PSIxOCIgeT0iMTkiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOkRlY29yYXRpb25Ob2RlIiB4bWk6aWQ9Il9PbjhMY3NhR0VlV2ZGZG52MjZFZnVnIiB0eXBlPSI2MDExIj4KLSAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Qm9vbGVhblZhbHVlU3R5bGUiIHhtaTppZD0iX1BCdFdVTWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IklTX1VQREFURURfUE9TSVRJT04iIGJvb2xlYW5WYWx1ZT0idHJ1ZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX09uOExjOGFHRWVXZkZkbnYyNkVmdWciIHg9IjIiIHk9Ii0xNyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfT243a1ljYUdFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgaHJlZj0iVGFua0JhcnJlbEV4YW1wbGUudW1sI19Pbmg3d01hR0VlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9PbjdrWXNhR0VlV2ZGZG52MjZFZnVnIiBwb2ludHM9IlszNDgsIDU1MiwgLTY0Mzk4NCwgLTY0Mzk4NF0kWzQ2NSwgNTUzLCAtNjQzOTg0LCAtNjQzOTg0XSIvPgotICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX09vbTUwTWFHRWVXZkZkbnYyNkVmdWciIGlkPSIoMS4wLDAuNTU0MTk1ODA0MTk1ODAzNikiLz4KLSAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9Pb201MGNhR0VlV2ZGZG52MjZFZnVnIiBpZD0iKDAuMDUsMC41NDc2OTIzMDc2OTIzMDcxKSIvPgotICAgIDwvZWRnZXM+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2ZtdV9idWlsZC9yZXNvdXJjZXMvVGFua0JhcnJlbEV4YW1wbGUudW1sIGIvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvZm11X2J1aWxkL3Jlc291cmNlcy9UYW5rQmFycmVsRXhhbXBsZS51bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYmZlOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9mbWkvdG9vbHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS53cmFwcGVyL3Rlc3QvZm11X2J1aWxkL3Jlc291cmNlcy9UYW5rQmFycmVsRXhhbXBsZS51bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyMDEzMTAwMSIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvc3BlYy9YTUkvMjAxMzEwMDEiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczpmbWlwcm9maWxlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhcHlydXMvRk1JUHJvZmlsZS8xLjAuMCIgeG1sbnM6c3RhbmRhcmQ9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi81LjAuMC9VTUwvUHJvZmlsZS9TdGFuZGFyZCIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1MIj4KLSAgPHVtbDpNb2RlbCB4bWk6aWQ9Il9xOERPY01YUEVlV3d4X3B1SER6Rll3IiBuYW1lPSJUYW5rQmFycmVsRXhhbXBsZSI+Ci0gICAgPHBhY2thZ2VJbXBvcnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlSW1wb3J0IiB4bWk6aWQ9Il9yRVVab01YUEVlV3d4X3B1SER6Rll3Ij4KLSAgICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjXzAiLz4KLSAgICA8L3BhY2thZ2VJbXBvcnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3IiBuYW1lPSJDMSIgY2xhc3NpZmllckJlaGF2aW9yPSJfYm5SQVVNWFFFZVd3eF9wdUhEekZZdyIgaXNBY3RpdmU9InRydWUiPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTp0eXBlPSJ1bWw6UHJvcGVydHkiIHhtaTppZD0iX1JVa0JjTVhRRWVXd3hfcHVIRHpGWXciIG5hbWU9InZhbHZlIiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9WczhXOE1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQmVoYXZpb3IgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgeG1pOmlkPSJfYm5SQVVNWFFFZVd3eF9wdUhEekZZdyIgbmFtZT0iQzEgQ2xhc3NpZmllckJlaGF2aW9yIiBub2RlPSJfeHJBa1VNWFFFZVd3eF9wdUhEekZZdyBfeDZKTWdNWFFFZVd3eF9wdUhEekZZdyBfeUlHd0FNWFFFZVd3eF9wdUhEekZZdyBfTXdFUW9NWFNFZVd3eF9wdUhEekZZdyBfYmUtZm9NWFRFZVd3eF9wdUhEekZZdyBfaGNsYm9NWFZFZVd3eF9wdUhEekZZdyBfaWE1eklNWFhFZVd3eF9wdUhEekZZdyBfeEY5U1VNWFhFZVd3eF9wdUhEekZZdyIgZ3JvdXA9Il9iZS1mb01YVEVlV3d4X3B1SER6Rll3IF9pYTV6SU1YWEVlV3d4X3B1SER6Rll3IF94RjlTVU1YWEVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6dHlwZT0idW1sOkNvbW1lbnQiIHhtaTppZD0iX3NSVDd3TVhRRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgIDxib2R5Pm1vZGVsIEMxJiN4RDsKLSAgZGlzY3JldGUgb3V0cHV0IEJvb2xlYW4gdmFsdmUoc3RhcnQgPSBmYWxzZSwgZml4ZWQgPSBmYWxzZSk7JiN4RDsKLWVxdWF0aW9uJiN4RDsKLSAgd2hlbiB0aW1lID49IDAuNSB0aGVuJiN4RDsKLSAgICB2YWx2ZSA9IHRydWU7JiN4RDsKLSAgZWxzZXdoZW4gdGltZSA+PSAzLjIgdGhlbiYjeEQ7Ci0gICAgdmFsdmUgPSBmYWxzZTsmI3hEOwotICBlbHNld2hlbiB0aW1lID49IDUuMiB0aGVuJiN4RDsKLSAgICB2YWx2ZSA9IHRydWU7JiN4RDsKLSAgZW5kIHdoZW47JiN4RDsKLWVuZCBDMTs8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9XT1hQc01YVkVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il94ckFrVU1YUUVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9Nd0VRb01YU0VlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX2M2SnlRTVhWRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX2JlLWZvTVhURWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX3hyQWtVTVhRRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfZGNIUDBNWFZFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfeDZKTWdNWFFFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfYmUtZm9NWFRFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9Qemdrd01YWUVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9pYTV6SU1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il94NkpNZ01YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX1FZdl8wTVhZRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX3lJR3dBTVhRRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX2lhNXpJTVhYRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfUXlZbjBNWFlFZVd3eF9wdUhEekZZdyIgdGFyZ2V0PSJfeEY5U1VNWFhFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfeUlHd0FNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9SUzFDY01YWUVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9oY2xib01YVkVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il94RjlTVU1YWEVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDxzdHJ1Y3R1cmVkTm9kZSB4bWk6dHlwZT0idW1sOlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIHhtaTppZD0iX2JlLWZvTVhURWVXd3hfcHVIRHpGWXciIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUxIiBpbmNvbWluZz0iX2M2SnlRTVhWRWVXd3hfcHVIRHpGWXciIG91dGdvaW5nPSJfZGNIUDBNWFZFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il91cEFFZ01YVEVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9Kci1fSU1YVEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9sMG0yc01YVEVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il91cFJ4VU1YVEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il91cFNZWU1YVEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX3M1aTVFTVhURWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX0pyOGk0TVhURWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX2p6UlJFTVhURWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX3M1dnRZTVhURWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3M1dnRZY1hURWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9lZGdlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgeG1pOmlkPSJfSnJ6WThNWFRFZVd3eF9wdUhEekZZdyIgbmFtZT0ic2V0IFZhbHZlIiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX1JVa0JjTVhRRWVXd3hfcHVIRHpGWXciIGlzUmVwbGFjZUFsbD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b2JqZWN0IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX0pyOGk0TVhURWVXd3hfcHVIRHpGWXciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9zNWk1RU1YVEVlV3d4X3B1SER6Rll3IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfSnI5eEFNWFRFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX0pyLV9JTVhURWVXd3hfcHVIRHpGWXciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iX3VwQUVnTVhURWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIHhtaTppZD0iX2p6UUM4TVhURWVXd3hfcHVIRHpGWXciIG5hbWU9InRoaXMiPgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfanpSUkVNWFRFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX3M1aTVFTVhURWVXd3hfcHVIRHpGWXciIHR5cGU9Il9iblJBVU1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiB4bWk6aWQ9Il9sMGNlb01YVEVlV3d4X3B1SER6Rll3IiBuYW1lPSJ0cnVlIj4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX2wwbTJzTVhURWVXd3hfcHVIRHpGWXciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il91cEFFZ01YVEVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX21YZTZRTVhURWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX21YZVRNTVhURWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L3Jlc3VsdD4KLSAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9tWFdYWU1YVEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgPC92YWx1ZT4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgIDwvc3RydWN0dXJlZE5vZGU+Ci0gICAgICAgIDxzdHJ1Y3R1cmVkTm9kZSB4bWk6dHlwZT0idW1sOlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIHhtaTppZD0iX2lhNXpJTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyIiBpbmNvbWluZz0iX1B6Z2t3TVhZRWVXd3hfcHVIRHpGWXciIG91dGdvaW5nPSJfUVl2XzBNWFlFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9GSHJVTU1YWUVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il9tSkVHOE1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9yd2xKRU1YWEVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9GSUoxVU1YWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9GSUoxVWNYWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX0hGbzFzTVhZRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX21KSEtRTVhYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iX3VJUUxFTVhYRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0hHQ2VVTVhZRWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0hHQ2VVY1hZRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9lZGdlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgeG1pOmlkPSJfbUlfT2NNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0ic2V0IFZhbHZlIiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX1JVa0JjTVhRRWVXd3hfcHVIRHpGWXciIGlzUmVwbGFjZUFsbD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b2JqZWN0IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX21KRUc4TVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9GSHJVTU1YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfbUpGVkVNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX21KSEtRTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iX0hGbzFzTVhZRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIHhtaTppZD0iX3J3a2lBTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InNlbGYiPgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfcndsSkVNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0ZIclVNTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9iblJBVU1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiB4bWk6aWQ9Il91SVBrQU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJmYWxzZSI+Ci0gICAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il91SVFMRU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfSEZvMXNNWFlFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il91akotWU1YWEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il91akpYVU1YWEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgICA8dmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfdWpJd1FNWFhFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgPC92YWx1ZT4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgIDwvc3RydWN0dXJlZE5vZGU+Ci0gICAgICAgIDxzdHJ1Y3R1cmVkTm9kZSB4bWk6dHlwZT0idW1sOlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUiIHhtaTppZD0iX3hGOVNVTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzIiBpbmNvbWluZz0iX1F5WW4wTVhZRWVXd3hfcHVIRHpGWXciIG91dGdvaW5nPSJfUlMxQ2NNWFlFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9LbFk2RU1YWUVlV3d4X3B1SER6Rll3IiB0YXJnZXQ9Il95MlBrTU1YWEVlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il80bXhZWU1YWEVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il9LbHhVa01YWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9LbHhVa2NYWUVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOk9iamVjdEZsb3ciIHhtaTppZD0iX01TblE0TVhZRWVXd3hfcHVIRHpGWXciIHRhcmdldD0iX3kyU0FjTVhYRWVXd3hfcHVIRHpGWXciIHNvdXJjZT0iXzYxSlVjTVhYRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX01URFZ3TVhZRWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX01URFZ3Y1hZRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9lZGdlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgeG1pOmlkPSJfeTJNZzRNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0ic2V0IFZhbHZlIiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX1JVa0JjTVhRRWVXd3hfcHVIRHpGWXciIGlzUmVwbGFjZUFsbD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b2JqZWN0IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX3kyUGtNTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il9LbFk2RU1YWUVlV3d4X3B1SER6Rll3IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfeTJReVVNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX3kyU0FjTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iX01TblE0TVhZRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6UmVhZFNlbGZBY3Rpb24iIHhtaTppZD0iXzRtclJ3TVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InNlbGYiPgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfNG14WVlNWFhFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0tsWTZFTVhZRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9iblJBVU1YUUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6VmFsdWVTcGVjaWZpY2F0aW9uQWN0aW9uIiB4bWk6aWQ9Il82MUl0WU1YWEVlV3d4X3B1SER6Rll3IiBuYW1lPSJ0cnVlIj4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iXzYxSlVjTVhYRWVXd3hfcHVIRHpGWXciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il9NU25RNE1YWUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzdNem1nY1hYRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzdNem1nTVhYRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L3Jlc3VsdD4KLSAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il83TXlfY01YWEVlV3d4X3B1SER6Rll3IiB2YWx1ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgPC92YWx1ZT4KLSAgICAgICAgICA8L25vZGU+Ci0gICAgICAgIDwvc3RydWN0dXJlZE5vZGU+Ci0gICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIHhtaTppZD0iX3hyQWtVTVhRRWVXd3hfcHVIRHpGWXciIG5hbWU9ImF0IDAuNSIgaW5jb21pbmc9Il9XT1hQc01YVkVlV3d4X3B1SER6Rll3IiBvdXRnb2luZz0iX2M2SnlRTVhWRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgIDx0cmlnZ2VyIHhtaTp0eXBlPSJ1bWw6VHJpZ2dlciIgeG1pOmlkPSJfZERIZDBNWFJFZVd3eF9wdUhEekZZdyIgZXZlbnQ9Il9GT0ZpWU1YUkVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDwvbm9kZT4KLSAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY2NlcHRFdmVudEFjdGlvbiIgeG1pOmlkPSJfeDZKTWdNWFFFZVd3eF9wdUhEekZZdyIgbmFtZT0iYXQgMy4yIiBpbmNvbWluZz0iX2RjSFAwTVhWRWVXd3hfcHVIRHpGWXciIG91dGdvaW5nPSJfUHpna3dNWFlFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgPHRyaWdnZXIgeG1pOnR5cGU9InVtbDpUcmlnZ2VyIiB4bWk6aWQ9Il9sM2VQWU1YUkVlV3d4X3B1SER6Rll3IiBldmVudD0iX0xHN2xFTVhSRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgICAgPC9ub2RlPgotICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiB4bWk6aWQ9Il95SUd3QU1YUUVlV3d4X3B1SER6Rll3IiBuYW1lPSJhdCA1LjIiIGluY29taW5nPSJfUVl2XzBNWFlFZVd3eF9wdUhEekZZdyIgb3V0Z29pbmc9Il9ReVluME1YWUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICA8dHJpZ2dlciB4bWk6dHlwZT0idW1sOlRyaWdnZXIiIHhtaTppZD0iX3FlZG9vTVhSRWVXd3hfcHVIRHpGWXciIGV2ZW50PSJfTFdtWXdNWFJFZVd3eF9wdUhEekZZdyIvPgotICAgICAgICA8L25vZGU+Ci0gICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6SW5pdGlhbE5vZGUiIHhtaTppZD0iX013RVFvTVhTRWVXd3hfcHVIRHpGWXciIG5hbWU9IkluaXRpYWxOb2RlMSIgb3V0Z29pbmc9Il9XT1hQc01YVkVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlGaW5hbE5vZGUiIHhtaTppZD0iX2hjbGJvTVhWRWVXd3hfcHVIRHpGWXciIG5hbWU9IkFjdGl2aXR5RmluYWxOb2RlMSIgaW5jb21pbmc9Il9SUzFDY01YWUVlV3d4X3B1SER6Rll3Ii8+Ci0gICAgICA8L293bmVkQmVoYXZpb3I+Ci0gICAgICA8b3duZWRCZWhhdmlvciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiB4bWk6aWQ9Il9DbE5wWU1YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJDMV9GYWN0b3J5IiBub2RlPSJfQ2xPM2djWFdFZVd3eF9wdUhEekZZdyBfQ291UVlNWFdFZVd3eF9wdUhEekZZdyBfQ291M2NzWFdFZVd3eF9wdUhEekZZdyBfQ293c29jWFdFZVd3eF9wdUhEekZZdyBfQ294VHNjWFdFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6dHlwZT0idW1sOlBhcmFtZXRlciIgeG1pOmlkPSJfQ2xPM2dNWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfTk8wVUVNWFFFZVd3eF9wdUhEekZZdyIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9Db3dGa3NYV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJjcmVhdGVPYmplY3RBY3Rpb24gdG8gY2FsbENvbnN0cnVjdG9yIiB0YXJnZXQ9Il9Db3ZlZ01YV0VlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9Db3UzY01YV0VlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfQ284UzBNWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NvOFMwY1hXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvZWRnZT4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9Db3dzb01YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJjYWxsQ29uc3RydWN0b3IgdG8gcmV0dXJuUGFyYW1Ob2RlIiB0YXJnZXQ9Il9DbE8zZ2NYV0VlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9Db3hUc2NYV0VlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfQ284UzBzWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NvOFMwOFhXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvZWRnZT4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9Db3hUc3NYV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJmb3JrIHRvIHN0YXJ0YmVoYXZpb3IgaW5wdXQgcGluIiB0YXJnZXQ9Il9Db3dzb3NYV0VlV3d4X3B1SER6Rll3IiBzb3VyY2U9Il9Db3hUc2NYV0VlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfQ284NTRNWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NvODU0Y1hXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvZWRnZT4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9Db3hUczhYV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJjYWxsQ29uc3RydWN0b3IgdG8gc3RhcnRCZWhhdmlvciIgdGFyZ2V0PSJfQ294VHNjWFdFZVd3eF9wdUhEekZZdyIgc291cmNlPSJfQ293RmtNWFdFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX0NvODU0c1hXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Dbzg1NDhYV0VlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L2VkZ2U+Ci0gICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9Il9DbE8zZ2NYV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHRQYXJhbWV0ZXJOb2RlIiBpbmNvbWluZz0iX0Nvd3NvTVhXRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3IiBwYXJhbWV0ZXI9Il9DbE8zZ01YV0VlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9DbFBla01YV0VlV3d4X3B1SER6Rll3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L25vZGU+Ci0gICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6Q3JlYXRlT2JqZWN0QWN0aW9uIiB4bWk6aWQ9Il9Db3VRWU1YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJjcmVhdGVPYmplY3QiIGNsYXNzaWZpZXI9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il9Db3UzY01YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfQ293RmtzWFdFZVd3eF9wdUhEekZZdyIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQ291M2NjWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L3Jlc3VsdD4KLSAgICAgICAgPC9ub2RlPgotICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkNhbGxPcGVyYXRpb25BY3Rpb24iIHhtaTppZD0iX0NvdTNjc1hXRWVXd3hfcHVIRHpGWXciIG5hbWU9ImNhbGxDb25zdHJ1Y3RvciIgb3BlcmF0aW9uPSJfQ29sdGdNWFdFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfQ293RmtNWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX0NveFRzOFhXRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0Nvd0ZrY1hXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgPHRhcmdldCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9Db3ZlZ01YV0VlV3d4X3B1SER6Rll3IiBuYW1lPSJ0YXJnZXQiIGluY29taW5nPSJfQ293RmtzWFdFZVd3eF9wdUhEekZZdyIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQ292ZWdjWFdFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L3RhcmdldD4KLSAgICAgICAgPC9ub2RlPgotICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24iIHhtaTppZD0iX0Nvd3NvY1hXRWVXd3hfcHVIRHpGWXciIG5hbWU9InN0YXJ0IGNsYXNzaWZpZXIgYmVoYXZpb3IiPgotICAgICAgICAgIDxvYmplY3QgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgeG1pOmlkPSJfQ293c29zWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0ib2JqZWN0IiBpbmNvbWluZz0iX0NveFRzc1hXRWVXd3hfcHVIRHpGWXciIHR5cGU9Il9OTzBVRU1YUUVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0NveFRzTVhXRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9vYmplY3Q+Ci0gICAgICAgIDwvbm9kZT4KLSAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpGb3JrTm9kZSIgeG1pOmlkPSJfQ294VHNjWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0iZm9ya0luc3RhbmNpYXRlZE9iamVjdCIgaW5jb21pbmc9Il9Db3hUczhYV0VlV3d4X3B1SER6Rll3IiBvdXRnb2luZz0iX0Nvd3NvTVhXRWVXd3hfcHVIRHpGWXcgX0NveFRzc1hXRWVXd3hfcHVIRHpGWXciLz4KLSAgICAgIDwvb3duZWRCZWhhdmlvcj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgeG1pOmlkPSJfQ29sdGdNWFdFZVd3eF9wdUhEekZZdyIgbmFtZT0iQzEiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOnR5cGU9InVtbDpQYXJhbWV0ZXIiIHhtaTppZD0iX0NvcW1BTVhXRWVXd3hfcHVIRHpGWXciIG5hbWU9InJldHVybiIgdHlwZT0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il9Cc0RtRU1YUkVlV3d4X3B1SER6Rll3IiBuYW1lPSJFdmVudHMgQzEiPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlRpbWVFdmVudCIgeG1pOmlkPSJfRk9GaVlNWFJFZVd3eF9wdUhEekZZdyIgbmFtZT0iYXQgMC41Ij4KLSAgICAgICAgPHdoZW4geG1pOnR5cGU9InVtbDpUaW1lRXhwcmVzc2lvbiIgeG1pOmlkPSJfSk9Tb2NNWFJFZVd3eF9wdUhEekZZdyI+Ci0gICAgICAgICAgPGV4cHIgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfSk9Tb2NjWFJFZVd3eF9wdUhEekZZdyIgdmFsdWU9IjAuNSIvPgotICAgICAgICA8L3doZW4+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpUaW1lRXZlbnQiIHhtaTppZD0iX0xHN2xFTVhSRWVXd3hfcHVIRHpGWXciIG5hbWU9ImF0IDMuMiI+Ci0gICAgICAgIDx3aGVuIHhtaTp0eXBlPSJ1bWw6VGltZUV4cHJlc3Npb24iIHhtaTppZD0iX0xHN2xFY1hSRWVXd3hfcHVIRHpGWXciPgotICAgICAgICAgIDxleHByIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFJlYWwiIHhtaTppZD0iX0xHN2xFc1hSRWVXd3hfcHVIRHpGWXciIHZhbHVlPSIzLjIiLz4KLSAgICAgICAgPC93aGVuPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6VGltZUV2ZW50IiB4bWk6aWQ9Il9MV21Zd01YUkVlV3d4X3B1SER6Rll3IiBuYW1lPSJhdCA1LjIiPgotICAgICAgICA8d2hlbiB4bWk6dHlwZT0idW1sOlRpbWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9MV21Zd2NYUkVlV3d4X3B1SER6Rll3Ij4KLSAgICAgICAgICA8ZXhwciB4bWk6dHlwZT0idW1sOkxpdGVyYWxSZWFsIiB4bWk6aWQ9Il9MV21Zd3NYUkVlV3d4X3B1SER6Rll3IiB2YWx1ZT0iNS4yIi8+Ci0gICAgICAgIDwvd2hlbj4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iQzIiIGNsYXNzaWZpZXJCZWhhdmlvcj0iX0J4VUpNTWFFRWVXZkZkbnYyNkVmdWciIGlzQWN0aXZlPSJ0cnVlIj4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiB4bWk6aWQ9Il9hdUFGc01hREVlV2ZGZG52MjZFZnVnIiBuYW1lPSJhYm9ydCIgdmlzaWJpbGl0eT0icHVibGljIj4KLSAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNCb29sZWFuIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfbFR5X3NNYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6dHlwZT0idW1sOlByb3BlcnR5IiB4bWk6aWQ9Il93UTJqSU1hREVlV2ZGZG52MjZFZnVnIiBuYW1lPSJzaXplIiB2aXNpYmlsaXR5PSJwdWJsaWMiPgotICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxSZWFsIiB4bWk6aWQ9Il8xNXhUY01hREVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMS4wIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQmVoYXZpb3IgeG1pOnR5cGU9InVtbDpBY3Rpdml0eSIgeG1pOmlkPSJfQnhVSk1NYUVFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iQzIgQ2xhc3NpZmllciBCZWhhdmlvciIgbm9kZT0iX3ROSWVBTWFFRWVXZkZkbnYyNkVmdWcgXzlubXNZTWFFRWVXZkZkbnYyNkVmdWcgX0lUQzdZTWFGRWVXZkZkbnYyNkVmdWcgX0tpWWd3TWFGRWVXZkZkbnYyNkVmdWcgX0xhVG5RTWFGRWVXZkZkbnYyNkVmdWcgX0tyS3o0TWFHRWVXZkZkbnYyNkVmdWciIGdyb3VwPSJfS2lZZ3dNYUZFZVdmRmRudjI2RWZ1ZyBfTGFUblFNYUZFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOnR5cGU9InVtbDpDb21tZW50IiB4bWk6aWQ9Il9ObUtRUU1hRUVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICA8Ym9keT5tb2RlbCBDMiYjeEQ7Ci0gIGRpc2NyZXRlIG91dHB1dCBCb29sZWFuIGFib3J0KHN0YXJ0ID0gZmFsc2UsIGZpeGVkID0gZmFsc2UpOyYjeEQ7Ci0gIGRpc2NyZXRlIG91dHB1dCBSZWFsIHNpemUoc3RhcnQgPSAxLjAsIGZpeGVkID0gZmFsc2UpOyYjeEQ7Ci1lcXVhdGlvbiYjeEQ7Ci0gIHdoZW4gdGltZSA+PSAxLjkgdGhlbiYjeEQ7Ci0gICAgYWJvcnQgPSB0cnVlOyYjeEQ7Ci0gIGVuZCB3aGVuOyYjeEQ7Ci0gIHdoZW4gdGltZSA+PSA2LjUgdGhlbiYjeEQ7Ci0gICAgc2l6ZSA9IDAuNTsmI3hEOwotICBlbmQgd2hlbjsmI3hEOwotZW5kIEMyOzwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX010dWhnTWFHRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX3ROSWVBTWFFRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iX0lUQzdZTWFGRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfTkxMNWtNYUdFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfS2lZZ3dNYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfdE5JZUFNYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICA8ZWRnZSB4bWk6dHlwZT0idW1sOkNvbnRyb2xGbG93IiB4bWk6aWQ9Il9OeGJhTU1hR0VlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il85bm1zWU1hRUVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il9LaVlnd01hRkVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6Q29udHJvbEZsb3ciIHhtaTppZD0iX09LV1FnTWFHRWVXZkZkbnYyNkVmdWciIHRhcmdldD0iX0xhVG5RTWFGRWVXZkZkbnYyNkVmdWciIHNvdXJjZT0iXzlubXNZTWFFRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpDb250cm9sRmxvdyIgeG1pOmlkPSJfT25oN3dNYUdFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfS3JLejRNYUdFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfTGFUblFNYUZFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICA8c3RydWN0dXJlZE5vZGUgeG1pOnR5cGU9InVtbDpTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIiB4bWk6aWQ9Il9LaVlnd01hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMSIgaW5jb21pbmc9Il9OTEw1a01hR0VlV2ZGZG52MjZFZnVnIiBvdXRnb2luZz0iX054YmFNTWFHRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfMFA0NW9NYUZFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfWkV5YVFNYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfUTR5Q0lNYUZFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfMFFMMGtNYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMFFMMGtjYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il8wb0NUNE1hRkVlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il9aRTNTd01hRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il9TdHVLZ01hRkVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8wb1ZPME1hRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8wb1ZPMGNhRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlJlYWRTZWxmQWN0aW9uIiB4bWk6aWQ9Il9RNG1iOE1hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJzZWxmIj4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX1E0eUNJTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il8wUDQ1b01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJfQnhVSk1NYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgIDwvbm9kZT4KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiIgeG1pOmlkPSJfU3RydVFNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il9TdHVLZ01hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfMG9DVDRNYUZFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICAgIDx0eXBlIHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjQm9vbGVhbiIvPgotICAgICAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9UZmdNd01hRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9UZmZsc01hRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgICA8dmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfVGZhdE1NYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiPgotICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWRkU3RydWN0dXJhbEZlYXR1cmVWYWx1ZUFjdGlvbiIgeG1pOmlkPSJfWkVwM1lNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0ic2V0IEFib3J0IiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX2F1QUZzTWFERWVXZkZkbnYyNkVmdWciIGlzUmVwbGFjZUFsbD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b2JqZWN0IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX1pFeWFRTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il8wUDQ1b01hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfWkUwMmdNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX1pFM1N3TWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iXzBvQ1Q0TWFGRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI0Jvb2xlYW4iLz4KLSAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICA8L3N0cnVjdHVyZWROb2RlPgotICAgICAgICA8c3RydWN0dXJlZE5vZGUgeG1pOnR5cGU9InVtbDpTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIiB4bWk6aWQ9Il9MYVRuUU1hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMiIgaW5jb21pbmc9Il9PS1dRZ01hR0VlV2ZGZG52MjZFZnVnIiBvdXRnb2luZz0iX09uaDd3TWFHRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgIDxlZGdlIHhtaTp0eXBlPSJ1bWw6T2JqZWN0RmxvdyIgeG1pOmlkPSJfMC1LNzhNYUZFZVdmRmRudjI2RWZ1ZyIgdGFyZ2V0PSJfcDRZNlVNYUZFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfZlVUM2tNYUZFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfMC1kUDBNYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDx3ZWlnaHQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfMC1kMjRNYUZFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L2VkZ2U+Ci0gICAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il8xYkxCQU1hRkVlV2ZGZG52MjZFZnVnIiB0YXJnZXQ9Il9wNGdQRU1hRkVlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il9oQ1FuSU1hRkVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgIDxndWFyZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxCb29sZWFuIiB4bWk6aWQ9Il8xYmZLRU1hRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8xYmZLRWNhRkVlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvZWRnZT4KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlJlYWRTZWxmQWN0aW9uIiB4bWk6aWQ9Il9mVVNwY01hRkVlV2ZGZG52MjZFZnVnIiBuYW1lPSJzZWxmIj4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX2ZVVDNrTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il8wLUs3OE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJfQnhVSk1NYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgIDwvbm9kZT4KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlZhbHVlU3BlY2lmaWNhdGlvbkFjdGlvbiIgeG1pOmlkPSJfaENQWkFNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iMC41Ij4KLSAgICAgICAgICAgIDxyZXN1bHQgeG1pOnR5cGU9InVtbDpPdXRwdXRQaW4iIHhtaTppZD0iX2hDUW5JTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InJlc3VsdCIgb3V0Z29pbmc9Il8xYkxCQU1hRkVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0Jac0lZTTVRRWVXYVJwb2RSMVM2V0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2gwRkZvTWFGRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L3Jlc3VsdD4KLSAgICAgICAgICAgIDx2YWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxSZWFsIiB4bWk6aWQ9Il9CWmdpTU01UUVlV2FScG9kUjFTNldBIiB2YWx1ZT0iMC41Ij4KLSAgICAgICAgICAgICAgPHR5cGUgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiBocmVmPSJwYXRobWFwOi8vVU1MX0xJQlJBUklFUy9VTUxQcmltaXRpdmVUeXBlcy5saWJyYXJ5LnVtbCNSZWFsIi8+Ci0gICAgICAgICAgICA8L3ZhbHVlPgotICAgICAgICAgIDwvbm9kZT4KLSAgICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFkZFN0cnVjdHVyYWxGZWF0dXJlVmFsdWVBY3Rpb24iIHhtaTppZD0iX3A0VlA4TWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InNldCBTaXplIiBzdHJ1Y3R1cmFsRmVhdHVyZT0iX3dRMmpJTWFERWVXZkZkbnYyNkVmdWciIGlzUmVwbGFjZUFsbD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b2JqZWN0IHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX3A0WTZVTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9Im9iamVjdCIgaW5jb21pbmc9Il8wLUs3OE1hRkVlV2ZGZG52MjZFZnVnIiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfcDRhdmdNYUZFZVdmRmRudjI2RWZ1ZyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICAgICAgPHZhbHVlIHhtaTp0eXBlPSJ1bWw6SW5wdXRQaW4iIHhtaTppZD0iX3A0Z1BFTWFGRWVXZkZkbnYyNkVmdWciIG5hbWU9InZhbHVlIiBpbmNvbWluZz0iXzFiTEJBTWFGRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgICA8dHlwZSB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI1JlYWwiLz4KLSAgICAgICAgICAgIDwvdmFsdWU+Ci0gICAgICAgICAgPC9ub2RlPgotICAgICAgICA8L3N0cnVjdHVyZWROb2RlPgotICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjY2VwdEV2ZW50QWN0aW9uIiB4bWk6aWQ9Il90TkllQU1hRUVlV2ZGZG52MjZFZnVnIiBuYW1lPSJhdCAxLjkiIGluY29taW5nPSJfTXR1aGdNYUdFZVdmRmRudjI2RWZ1ZyIgb3V0Z29pbmc9Il9OTEw1a01hR0VlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICA8dHJpZ2dlciB4bWk6dHlwZT0idW1sOlRyaWdnZXIiIHhtaTppZD0iX3lHN2VnTWFFRWVXZkZkbnYyNkVmdWciIGV2ZW50PSJfWGhwcEFNYUVFZVdmRmRudjI2RWZ1ZyIvPgotICAgICAgICA8L25vZGU+Ci0gICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWNjZXB0RXZlbnRBY3Rpb24iIHhtaTppZD0iXzlubXNZTWFFRWVXZkZkbnYyNkVmdWciIG5hbWU9ImF0IDYuNSIgaW5jb21pbmc9Il9OeGJhTU1hR0VlV2ZGZG52MjZFZnVnIiBvdXRnb2luZz0iX09LV1FnTWFHRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgIDx0cmlnZ2VyIHhtaTp0eXBlPSJ1bWw6VHJpZ2dlciIgeG1pOmlkPSJfOW5tc1ljYUVFZVdmRmRudjI2RWZ1ZyIgZXZlbnQ9Il9pWTQ0VU1hRUVlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgIDwvbm9kZT4KLSAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpJbml0aWFsTm9kZSIgeG1pOmlkPSJfSVRDN1lNYUZFZVdmRmRudjI2RWZ1ZyIgb3V0Z29pbmc9Il9NdHVoZ01hR0VlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlGaW5hbE5vZGUiIHhtaTppZD0iX0tyS3o0TWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9IkFjdGl2aXR5RmluYWxOb2RlMSIgaW5jb21pbmc9Il9Pbmg3d01hR0VlV2ZGZG52MjZFZnVnIi8+Ci0gICAgICA8L293bmVkQmVoYXZpb3I+Ci0gICAgICA8b3duZWRCZWhhdmlvciB4bWk6dHlwZT0idW1sOkFjdGl2aXR5IiB4bWk6aWQ9Il9XLWFISU1hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJDMl9GYWN0b3J5IiBub2RlPSJfZlllSllNYUdFZVdmRmRudjI2RWZ1ZyBfZlloTXNNYUdFZVdmRmRudjI2RWZ1ZyBfZlloendNYUdFZVdmRmRudjI2RWZ1ZyBfZllpYTBjYUdFZVdmRmRudjI2RWZ1ZyBfZllqQjRzYUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgIDxvd25lZFBhcmFtZXRlciB4bWk6dHlwZT0idW1sOlBhcmFtZXRlciIgeG1pOmlkPSJfVy1hdU1NYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0icmVzdWx0IiB0eXBlPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIgZGlyZWN0aW9uPSJyZXR1cm4iLz4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9mWWh6eGNhR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJjcmVhdGVPYmplY3RBY3Rpb24gdG8gY2FsbENvbnN0cnVjdG9yIiB0YXJnZXQ9Il9mWWh6d2NhR0VlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il9mWWhNc2NhR0VlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfZllrUUFNYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2ZZazNFTWFHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvZWRnZT4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9mWWlhME1hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJjYWxsQ29uc3RydWN0b3IgdG8gcmV0dXJuUGFyYW1Ob2RlIiB0YXJnZXQ9Il9mWWVKWU1hR0VlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il9mWWpCNHNhR0VlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfZllrM0VjYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2ZZazNFc2FHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvZWRnZT4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9mWWpvOE1hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJmb3JrIHRvIHN0YXJ0YmVoYXZpb3IgaW5wdXQgcGluIiB0YXJnZXQ9Il9mWWpCNE1hR0VlV2ZGZG52MjZFZnVnIiBzb3VyY2U9Il9mWWpCNHNhR0VlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICA8Z3VhcmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsQm9vbGVhbiIgeG1pOmlkPSJfZllrM0U4YUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICA8d2VpZ2h0IHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2ZZazNGTWFHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvZWRnZT4KLSAgICAgICAgPGVkZ2UgeG1pOnR5cGU9InVtbDpPYmplY3RGbG93IiB4bWk6aWQ9Il9mWWpvOGNhR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJjYWxsQ29uc3RydWN0b3IgdG8gc3RhcnRCZWhhdmlvciIgdGFyZ2V0PSJfZllqQjRzYUdFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJfZlloenc4YUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgPGd1YXJkIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX2ZZazNGY2FHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgPHdlaWdodCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mWWszRnNhR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L2VkZ2U+Ci0gICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9Il9mWWVKWU1hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJyZXN1bHRQYXJhbWV0ZXJOb2RlIiBpbmNvbWluZz0iX2ZZaWEwTWFHRWVXZkZkbnYyNkVmdWciIHR5cGU9Il9WOU1DRU1hREVlV2ZGZG52MjZFZnVnIiBwYXJhbWV0ZXI9Il9XLWF1TU1hR0VlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICA8dXBwZXJCb3VuZCB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9mWWdsb01hR0VlV2ZGZG52MjZFZnVnIiB2YWx1ZT0iMSIvPgotICAgICAgICA8L25vZGU+Ci0gICAgICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6Q3JlYXRlT2JqZWN0QWN0aW9uIiB4bWk6aWQ9Il9mWWhNc01hR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJjcmVhdGVPYmplY3QiIGNsYXNzaWZpZXI9Il9WOU1DRU1hREVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICA8cmVzdWx0IHhtaTp0eXBlPSJ1bWw6T3V0cHV0UGluIiB4bWk6aWQ9Il9mWWhNc2NhR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJyZXN1bHQiIG91dGdvaW5nPSJfZlloenhjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZlloTXNzYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L3Jlc3VsdD4KLSAgICAgICAgPC9ub2RlPgotICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkNhbGxPcGVyYXRpb25BY3Rpb24iIHhtaTppZD0iX2ZZaHp3TWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9ImNhbGxDb25zdHJ1Y3RvciIgb3BlcmF0aW9uPSJfWEJXR1lNYUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgPHJlc3VsdCB4bWk6dHlwZT0idW1sOk91dHB1dFBpbiIgeG1pOmlkPSJfZlloenc4YUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0icmVzdWx0IiBvdXRnb2luZz0iX2ZZam84Y2FHRWVXZkZkbnYyNkVmdWciIHR5cGU9Il9WOU1DRU1hREVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2ZZaHp4TWFHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9yZXN1bHQ+Ci0gICAgICAgICAgPHRhcmdldCB4bWk6dHlwZT0idW1sOklucHV0UGluIiB4bWk6aWQ9Il9mWWh6d2NhR0VlV2ZGZG52MjZFZnVnIiBuYW1lPSJ0YXJnZXQiIGluY29taW5nPSJfZlloenhjYUdFZVdmRmRudjI2RWZ1ZyIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgICAgPHVwcGVyQm91bmQgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZlloendzYUdFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L3RhcmdldD4KLSAgICAgICAgPC9ub2RlPgotICAgICAgICA8bm9kZSB4bWk6dHlwZT0idW1sOlN0YXJ0T2JqZWN0QmVoYXZpb3JBY3Rpb24iIHhtaTppZD0iX2ZZaWEwY2FHRWVXZkZkbnYyNkVmdWciIG5hbWU9InN0YXJ0IGNsYXNzaWZpZXIgYmVoYXZpb3IiPgotICAgICAgICAgIDxvYmplY3QgeG1pOnR5cGU9InVtbDpJbnB1dFBpbiIgeG1pOmlkPSJfZllqQjRNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0ib2JqZWN0IiBpbmNvbWluZz0iX2ZZam84TWFHRWVXZkZkbnYyNkVmdWciIHR5cGU9Il9WOU1DRU1hREVlV2ZGZG52MjZFZnVnIj4KLSAgICAgICAgICAgIDx1cHBlckJvdW5kIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2ZZakI0Y2FHRWVXZkZkbnYyNkVmdWciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9vYmplY3Q+Ci0gICAgICAgIDwvbm9kZT4KLSAgICAgICAgPG5vZGUgeG1pOnR5cGU9InVtbDpGb3JrTm9kZSIgeG1pOmlkPSJfZllqQjRzYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iZm9ya0luc3RhbmNpYXRlZE9iamVjdCIgaW5jb21pbmc9Il9mWWpvOGNhR0VlV2ZGZG52MjZFZnVnIiBvdXRnb2luZz0iX2ZZaWEwTWFHRWVXZkZkbnYyNkVmdWcgX2ZZam84TWFHRWVXZkZkbnYyNkVmdWciLz4KLSAgICAgIDwvb3duZWRCZWhhdmlvcj4KLSAgICAgIDxvd25lZE9wZXJhdGlvbiB4bWk6dHlwZT0idW1sOk9wZXJhdGlvbiIgeG1pOmlkPSJfWEJXR1lNYUdFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iQzIiPgotICAgICAgICA8b3duZWRQYXJhbWV0ZXIgeG1pOnR5cGU9InVtbDpQYXJhbWV0ZXIiIHhtaTppZD0iX1hCYmw4TWFHRWVXZkZkbnYyNkVmdWciIG5hbWU9InJldHVybiIgdHlwZT0iX1Y5TUNFTWFERWVXZkZkbnYyNkVmdWciIGRpcmVjdGlvbj0icmV0dXJuIi8+Ci0gICAgICA8L293bmVkT3BlcmF0aW9uPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il9USTl4Z01hRUVlV2ZGZG52MjZFZnVnIiBuYW1lPSJFdmVudHMgQzIiPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlRpbWVFdmVudCIgeG1pOmlkPSJfWGhwcEFNYUVFZVdmRmRudjI2RWZ1ZyIgbmFtZT0iYXQgMS45Ij4KLSAgICAgICAgPHdoZW4geG1pOnR5cGU9InVtbDpUaW1lRXhwcmVzc2lvbiIgeG1pOmlkPSJfWGhwcEFjYUVFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICAgICAgPGV4cHIgeG1pOnR5cGU9InVtbDpMaXRlcmFsUmVhbCIgeG1pOmlkPSJfWGhwcEFzYUVFZVdmRmRudjI2RWZ1ZyIgdmFsdWU9IjEuOSIvPgotICAgICAgICA8L3doZW4+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpUaW1lRXZlbnQiIHhtaTppZD0iX2lZNDRVTWFFRWVXZkZkbnYyNkVmdWciIG5hbWU9ImF0IDYuNSI+Ci0gICAgICAgIDx3aGVuIHhtaTp0eXBlPSJ1bWw6VGltZUV4cHJlc3Npb24iIHhtaTppZD0iX2lZNDRVY2FFRWVXZkZkbnYyNkVmdWciPgotICAgICAgICAgIDxleHByIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFJlYWwiIHhtaTppZD0iX2lZNDRVc2FFRWVXZkZkbnYyNkVmdWciIHZhbHVlPSI2LjUiLz4KLSAgICAgICAgPC93aGVuPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfQ21MNXdNWFdFZVd3eF9wdUhEekZZdyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfQ21RTE1NWFdFZVd3eF9wdUhEekZZdyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1ML1Byb2ZpbGUvU3RhbmRhcmQjLyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfV19NS1FNYUdFZVdmRmRudjI2RWZ1ZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfV19PbWdNYUdFZVdmRmRudjI2RWZ1ZyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgPHJlZmVyZW5jZXMgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvNS4wLjAvVU1ML1Byb2ZpbGUvU3RhbmRhcmQjLyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vVU1MX1BST0ZJTEVTL1N0YW5kYXJkLnByb2ZpbGUudW1sI18wIi8+Ci0gICAgPC9wcm9maWxlQXBwbGljYXRpb24+Ci0gICAgPHByb2ZpbGVBcHBsaWNhdGlvbiB4bWk6dHlwZT0idW1sOlByb2ZpbGVBcHBsaWNhdGlvbiIgeG1pOmlkPSJfLWxyLVVCa1BFZWFib1BqLWlzSDNKUSIvPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOnR5cGU9InVtbDpQcm9maWxlQXBwbGljYXRpb24iIHhtaTppZD0iX0EzWEdBQmtRRWVhYm9Qai1pc0gzSlEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0EzWVVJQmtRRWVhYm9Qai1pc0gzSlEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXB5cnVzL0ZNSVByb2ZpbGUvMS4wLjAjLyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgeG1pOnR5cGU9InVtbDpQcm9maWxlIiBocmVmPSJwYXRobWFwOi8vUEFQWVJVU19GTUlfUFJPRklMRS9GTUkucHJvZmlsZS51bWwjX19LaTNvS3ZGRWVTWHFLcWxIengxZ0EiLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgPC91bWw6TW9kZWw+Ci0gIDxzdGFuZGFyZDpDcmVhdGUgeG1pOmlkPSJfQ290Q1FNWFdFZVd3eF9wdUhEekZZdyIgYmFzZV9CZWhhdmlvcmFsRmVhdHVyZT0iX0NvbHRnTVhXRWVXd3hfcHVIRHpGWXciLz4KLSAgPHN0YW5kYXJkOkNyZWF0ZSB4bWk6aWQ9Il9YQmMwRU1hR0VlV2ZGZG52MjZFZnVnIiBiYXNlX0JlaGF2aW9yYWxGZWF0dXJlPSJfWEJXR1lNYUdFZVdmRmRudjI2RWZ1ZyIvPgotICA8Zm1pcHJvZmlsZTpDU19GTVUgeG1pOmlkPSJfOFZ0SWtNNDRFZVc1VzRHSXFKcHlGQSIgYmFzZV9DbGFzcz0iX05PMFVFTVhRRWVXd3hfcHVIRHpGWXciIGNhbk5vdFVzZU1lbW9yeU1hbmFnZW1lbnRGdW5jdGlvbnM9InRydWUiIGNhbkhhbmRsZVZhcmlhYmxlQ29tbXVuaWNhdGlvblN0ZXBTaXplPSJ0cnVlIi8+Ci0gIDxmbWlwcm9maWxlOkNTX0ZNVSB4bWk6aWQ9Il8tNDFNb000NEVlVzVXNEdJcUpweUZBIiBiYXNlX0NsYXNzPSJfVjlNQ0VNYURFZVdmRmRudjI2RWZ1ZyIvPgotICA8Zm1pcHJvZmlsZTpQb3J0IHhtaTppZD0iX0lGU1ZJTTQ1RWVXNVc0R0lxSnB5RkEiIGJhc2VfUHJvcGVydHk9Il9SVWtCY01YUUVlV3d4X3B1SER6Rll3IiBkZXNjcmlwdGlvbj0iIiB2YXJpYWJpbGl0eT0iZGlzY3JldGUiIHZhbHVlUmVmZXJlbmNlPSIxIi8+Ci0gIDxmbWlwcm9maWxlOlBvcnQgeG1pOmlkPSJfVFphVXdNNDVFZVc1VzRHSXFKcHlGQSIgYmFzZV9Qcm9wZXJ0eT0iX2F1QUZzTWFERWVXZkZkbnYyNkVmdWciIHZhcmlhYmlsaXR5PSJkaXNjcmV0ZSIvPgotICA8Zm1pcHJvZmlsZTpQb3J0IHhtaTppZD0iX1dZWUFRTTQ1RWVXNVc0R0lxSnB5RkEiIGJhc2VfUHJvcGVydHk9Il93UTJqSU1hREVlV2ZGZG52MjZFZnVnIiB2YXJpYWJpbGl0eT0iZGlzY3JldGUiIHZhbHVlUmVmZXJlbmNlPSIxIi8+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LndyYXBwZXIvdGVzdC9mbXVfYnVpbGQvcmVzb3VyY2VzL21va2EucHJvcGVydGllcyBiL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2ZtdV9idWlsZC9yZXNvdXJjZXMvbW9rYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDE1ZTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUud3JhcHBlci90ZXN0L2ZtdV9idWlsZC9yZXNvdXJjZXMvbW9rYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIEp1biAxMCAxMjo0Mzo1OSBDRVNUIDIwMTYKLWZtdS5xdWFsaWZpZWRuYW1lPUZNVSBFeGFtcGxlc1w6XDpDaGFuZ2UgZXZlbnRzXDpcOkV4YW1wbGUgMVw6XDpBCi1tb2RlbC5wYXRoPUZNVV9FeGFtcGxlcy51bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3Rvb2xzL3BvbS54bWwgYi9idW5kbGVzL2ZtaS90b29scy9wb20ueG1sCmluZGV4IDFlZjkzZjguLjQ4YzZiMmMgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvZm1pL3Rvb2xzL3BvbS54bWwKKysrIGIvYnVuZGxlcy9mbWkvdG9vbHMvcG9tLnhtbApAQCAtOSw3ICs5LDcgQEAKIAk8cGFyZW50Pg0KIAkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thPC9ncm91cElkPg0KIAkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmJ1bmRsZXMuZm1pPC9hcnRpZmFjdElkPg0KLQkJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4NCisJCTx2ZXJzaW9uPjIuMS4wLVNOQVBTSE9UPC92ZXJzaW9uPg0KIAk8L3BhcmVudD4NCiAJDQogCTwhLS0gUE9NIERlc2NyaXB0aW9uIC0tPg0KQEAgLTIyLDcgKzIyLDcgQEAKIAkJPG1vZHVsZT5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pPC9tb2R1bGU+DQogCQk8bW9kdWxlPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZm1pMnVtbDwvbW9kdWxlPg0KIAkJPG1vZHVsZT5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnByb2ZpbGUudWk8L21vZHVsZT4NCi0JCTxtb2R1bGU+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5leHBvcnRlcjwvbW9kdWxlPg0KKwkJPG1vZHVsZT5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnJjcC5leHBvcnQ8L21vZHVsZT4NCiAJCTxtb2R1bGU+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS5yY3A8L21vZHVsZT4NCiAJPC9tb2R1bGVzPg0KIAkNCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS91aS9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9mbWkvdWkvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBjOTJkNjUwLi43ZDkyNGVjIDEwMDY0NAotLS0gYS9idW5kbGVzL2ZtaS91aS9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL2J1bmRsZXMvZm1pL3VpL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTIsNyArMiw3IEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogRk1JIFVJCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMC4xMDAucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogMi4xLjAucXVhbGlmaWVyCiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpLkFjdGl2YXRvcgogUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4xMDkuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMTMuMCw0LjAuMCkiLApAQCAtMTIsNyArMTIsNiBAQAogIG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS51aTtidW5kbGUtdmVyc2lvbj0iMi4wLjEwMCIsCiAgb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmNvbXBvc2l0ZXMudXRpbHM7YnVuZGxlLXZlcnNpb249IjIuMC4xMDAiLAogIG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbXUuZW5naW5lO2J1bmRsZS12ZXJzaW9uPSIyLjAuMTAwIiwKLSBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyO2J1bmRsZS12ZXJzaW9uPSIyLjAuMTAwIiwKICBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZtaTJ1bWw7YnVuZGxlLXZlcnNpb249IjIuMC4xMDAiLAogIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWk7YnVuZGxlLXZlcnNpb249IlsxLjguMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLnBhcHlydXMuaW5mcmEuZ21mZGlhZy5jc3M7YnVuZGxlLXZlcnNpb249IlsyLjEuMCwzLjAuMCkiLApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdWkvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9mbWkvdWkvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS51aS9wbHVnaW4ueG1sCmluZGV4IGE0MTljZDguLjQ1YjAzMGMgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvZm1pL3VpL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkudWkvcGx1Z2luLnhtbAorKysgYi9idW5kbGVzL2ZtaS91aS9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpL3BsdWdpbi54bWwKQEAgLTI4LDIxICsyOCw2IEBACiAgICAgICAgICAgICA8L3Zpc2libGVXaGVuPg0KICAgICAgICAgIDwvbWVudT4NCiAgICAgICA8L21lbnVDb250cmlidXRpb24+DQotICAgICAgPG1lbnVDb250cmlidXRpb24NCi0gICAgICAgICAgICBhbGxQb3B1cHM9ImZhbHNlIg0KLSAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS5wYXB5cnVzLnZpZXdzLm1vZGVsZXhwbG9yZXIucG9wdXAubW9rYS5mbWkiPg0KLSAgICAgICAgIDxjb21tYW5kDQotICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpLmhhbmRsZXJzLkV4cG9ydEZNVUhhbmRsZXJDb21tYW5kIg0KLSAgICAgICAgICAgICAgIGljb249InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucGFweXJ1cy51bWwuaWNvbnMvcmVzb3VyY2UvZ2lmL0NvbXBvbmVudC5naWYiDQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS51aS51dGlscy5oYW5kbGVycy5FeHBvcnRGTVVNZW51Ig0KLSAgICAgICAgICAgICAgIGxhYmVsPSJFeHBvcnQgRk1VIGZvciBjby1zaW11bGF0aW9uIg0KLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIg0KLSAgICAgICAgICAgICAgIHRvb2x0aXA9IkV4cG9ydCBGTVUgZm9yIGNvLXNpbXVsYXRpb24iPg0KLSAgICAgICAgICAgIDx2aXNpYmxlV2hlbg0KLSAgICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPg0KLSAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+DQotICAgICAgICAgPC9jb21tYW5kPg0KLSAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4NCiAgICAgICAgPG1lbnVDb250cmlidXRpb24NCiAgICAgICAgICAgICBhbGxQb3B1cHM9ImZhbHNlIg0KICAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS5wYXB5cnVzLnZpZXdzLm1vZGVsZXhwbG9yZXIucG9wdXAubW9rYS5mbWkiPg0KQEAgLTEwMCwxMiArODUsNiBAQAogICAgPC9leHRlbnNpb24+DQogICAgPGV4dGVuc2lvbg0KICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+DQotICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5wYXB5cnVzLmVkaXRvci5jYXRlZ29yeSINCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iRXhwb3J0IEZNVSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS51aS5oYW5kbGVycy5FeHBvcnRGTVVIYW5kbGVyQ29tbWFuZCINCi0gICAgICAgICAgICBuYW1lPSJFeHBvcnQgRk1VIj4NCi0gICAgICA8L2NvbW1hbmQ+DQogICAgICAgIDxjb21tYW5kDQogICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UucGFweXJ1cy5lZGl0b3IuY2F0ZWdvcnkiDQogICAgICAgICAgICAgZGVzY3JpcHRpb249IkltcG9ydCBGTVUiDQpAQCAtMTE2LDI1ICs5NSw2IEBACiAgICA8ZXh0ZW5zaW9uDQogICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4NCiAgICAgICA8aGFuZGxlcg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpLmhhbmRsZXJzLkV4cG9ydEZNVUhhbmRsZXIiDQotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpLmhhbmRsZXJzLkV4cG9ydEZNVUhhbmRsZXJDb21tYW5kIj4NCi0gICAgICAgICA8ZW5hYmxlZFdoZW4+DQotICAgICAgICAgICAgPHdpdGgNCi0gICAgICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4NCi0gICAgICAgICAgICAgICA8aXRlcmF0ZQ0KLSAgICAgICAgICAgICAgICAgICAgIGlmRW1wdHk9ImZhbHNlIg0KLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPSJhbmQiPg0KLSAgICAgICAgICAgICAgICAgIDxhZGFwdA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ij4NCi0gICAgICAgICAgICAgICAgICAgICA8aW5zdGFuY2VvZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyI+DQotICAgICAgICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPg0KLSAgICAgICAgICAgICAgICAgIDwvYWRhcHQ+DQotICAgICAgICAgICAgICAgPC9pdGVyYXRlPg0KLSAgICAgICAgICAgIDwvd2l0aD4NCi0gICAgICAgICA8L2VuYWJsZWRXaGVuPg0KLSAgICAgIDwvaGFuZGxlcj4NCi0gICAgICA8aGFuZGxlcg0KICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpLmhhbmRsZXJzLkltcG9ydEZNVUxpYkhhbmRsZXIiDQogICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpLmhhbmRsZXJzLkltcG9ydEZNVUhhbmRsZXJDb21tYW5kIj4NCiAgICAgICAgICAgICAgPGVuYWJsZWRXaGVuPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZm1pL3VpL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkudWkvcG9tLnhtbCBiL2J1bmRsZXMvZm1pL3VpL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkudWkvcG9tLnhtbAppbmRleCBlODRiNmFlLi5iNmRhYmM3IDEwMDY0NAotLS0gYS9idW5kbGVzL2ZtaS91aS9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpL3BvbS54bWwKKysrIGIvYnVuZGxlcy9mbWkvdWkvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS51aS9wb20ueG1sCkBAIC05LDcgKzksNyBAQAogCTxwYXJlbnQ+DQogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+DQogCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuYnVuZGxlcy5mbWkudWk8L2FydGlmYWN0SWQ+DQotCQk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQogCTwvcGFyZW50Pg0KIA0KIAk8IS0tIFBPTSBkZXNjcmlwdGlvbiAtLT4NCmRpZmYgLS1naXQgYS9idW5kbGVzL2ZtaS91aS9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLnVpL3NyYy9vcmcvZWNsaXBzZS9wYXB5cnVzL21va2EvZm1pL3VpL2hhbmRsZXJzL0V4cG9ydEZNVUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvZm1pL3VpL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkudWkvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvbW9rYS9mbWkvdWkvaGFuZGxlcnMvRXhwb3J0Rk1VSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2YyNzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvZm1pL3VpL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkudWkvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvbW9rYS9mbWkvdWkvaGFuZGxlcnMvRXhwb3J0Rk1VSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ0VBIExJU1QuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgQ0VBIExJU1QgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS51aS5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuY29tcG9zaXRlcy51dGlscy5oYW5kbGVycy5BYnN0cmFjdENvbXBvc2l0ZVV0aWxzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuY29tcG9zaXRlcy51dGlscy5oYW5kbGVycy5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyLkZNVUV4cG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkucHJvZmlsZS51dGlsLkZNSVByb2ZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkudWkuZGlhbG9ncy5FeHBvcnRGTVVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkJlaGF2aW9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEV4cG9ydEZNVUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdENvbXBvc2l0ZVV0aWxzSGFuZGxlciB7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVjb3JkaW5nQ29tbWFuZCBnZXRVcGRhdGVDb21tYW5kKENsYXNzIGNvbnRleHQsIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlyZXR1cm4gbmV3IEV4cG9ydEZNVUNvbW1hbmQoY29udGV4dCwgZG9tYWluKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IFV0aWxzLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0ZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzcyAmJiAhKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEJlaGF2aW9yKSkgewotCQkJCXJldHVybiBGTUlQcm9maWxlVXRpbC5pc0NTX0ZNVSgoQ2xhc3Mpc2VsZWN0ZWRFbGVtZW50KSA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0KLQkvKioKLQkgKiBDb21tYW5kIHRoYXQgZXhwb3J0cyB0aGUgRk1VIGZvciBhIGdpdmVuIENTX0ZNVS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBFeHBvcnRGTVVDb21tYW5kIGV4dGVuZHMgUmVjb3JkaW5nQ29tbWFuZCB7Ci0KLQkJcHJvdGVjdGVkIENsYXNzIGNvbnRleHQ7Ci0KLQkJcHVibGljIEV4cG9ydEZNVUNvbW1hbmQoQ2xhc3MgY29udGV4dCwgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCQlzdXBlcihkb21haW4pOwotCQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICoKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQjZG9FeGVjdXRlV2l0aFJlc3VsdChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCQkgKiAsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpIDsKLQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCi0JCQkJCQotCQkJCQlFeHBvcnRGTVVEaWFsb2cgZGlhbG9nID0gbmV3IEV4cG9ydEZNVURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBjb250ZXh0LmdldE5hbWUoKSkgOwotLy8JCQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotLy8JCQkJCWRpYWxvZy5zZXRQcmVmZXJlbmNlU3RvcmUoc3RvcmUpOwotCQkJCQlpbnQgc3RhdHVzID0gZGlhbG9nLm9wZW4oKSA7Ci0JCQkJCWlmIChzdGF0dXMgIT0gU1dULkFCT1JUKSB7Ci0JCQkJCQlGTVVFeHBvcnRlci5nZW5lcmF0ZUZNVShjb250ZXh0LCBkaWFsb2cuZ2V0Rm11TmFtZSgpLGRpYWxvZy5nZXRTZWxlY3RlZERpcigpLGRpYWxvZy5nZXRTZWxlY3RlZFBsYXRmb3JtKCksZGlhbG9nLmdldFNlbGVjdGVkSnJlUGF0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9mbWkvdWkvcG9tLnhtbCBiL2J1bmRsZXMvZm1pL3VpL3BvbS54bWwKaW5kZXggZTQyYjA0ZC4uODE5ZDNlMCAxMDA2NDQKLS0tIGEvYnVuZGxlcy9mbWkvdWkvcG9tLnhtbAorKysgYi9idW5kbGVzL2ZtaS91aS9wb20ueG1sCkBAIC05LDcgKzksNyBAQAogCTxwYXJlbnQ+DQogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+DQogCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuYnVuZGxlcy5mbWk8L2FydGlmYWN0SWQ+DQotCQk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQogCTwvcGFyZW50Pg0KIAkNCiAJPCEtLSBQT00gRGVzY3JpcHRpb24gLS0+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9wb20ueG1sIGIvYnVuZGxlcy9wb20ueG1sCmluZGV4IGFhNjc1NDUuLmMxNzc4YTAgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvcG9tLnhtbAorKysgYi9idW5kbGVzL3BvbS54bWwKQEAgLTksNyArOSw3IEBACiAJPHBhcmVudD4KIAkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thPC9ncm91cElkPgogCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2Eucm9vdDwvYXJ0aWZhY3RJZD4KLQkJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAJPC9wYXJlbnQ+CiAJCiAJPCEtLSBQT00gRGVzY3JpcHRpb24gLS0+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZmVhdHVyZS9wb20ueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZlYXR1cmUvcG9tLnhtbAppbmRleCAwODk4MTQyLi5mMWZkOTkwIDEwMDY0NAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZmVhdHVyZS9wb20ueG1sCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mZWF0dXJlL3BvbS54bWwKQEAgLTYsMTMgKzYsMTQgQEAKIAk8cGFyZW50PgogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mZWF0dXJlczwvYXJ0aWZhY3RJZD4KLQkJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+CiAJPC9wYXJlbnQ+CiAKIAk8IS0tIFBPTSBkZXNjcmlwdGlvbiAtLT4KIAk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZmVhdHVyZTwvYXJ0aWZhY3RJZD4KIAk8cGFja2FnaW5nPmVjbGlwc2UtZmVhdHVyZTwvcGFja2FnaW5nPgogCTxuYW1lPk1va2EgQ29yZSBGZWF0dXJlPC9uYW1lPgorCTx2ZXJzaW9uPjIuMC4xMDAtU05BUFNIT1Q8L3ZlcnNpb24+CiAKIAk8YnVpbGQ+CiAJCTxwbHVnaW5zPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDVmMDMwNDQuLmFlYTdmMTUgMTAwNjQ0Ci0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQ0KICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZlYXR1cmUiDQogICAgICAgbGFiZWw9Ik1va2EgRm9yIENvc2ltdWxhdGlvbiAoSW5jdWJhdGlvbikiDQotICAgICAgdmVyc2lvbj0iMi4wLjEwMC5xdWFsaWZpZXIiDQorICAgICAgdmVyc2lvbj0iMi4xLjAucXVhbGlmaWVyIg0KICAgICAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2UgTW9kZWxpbmcgUHJvamVjdCI+DQogDQogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9kZXNjcmlwdGlvbiI+DQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mZWF0dXJlL3BvbS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZlYXR1cmUvcG9tLnhtbAppbmRleCA1MjY2NDc2Li4xNGEzYmY3IDEwMDY0NAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZlYXR1cmUvcG9tLnhtbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZlYXR1cmUvcG9tLnhtbApAQCAtNSw3ICs1LDcgQEAKIAk8cGFyZW50PgogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mZWF0dXJlczwvYXJ0aWZhY3RJZD4KLQkJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPHZlcnNpb24+Mi4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAJPC9wYXJlbnQ+CiAJCiAJPCEtLSBQT00gZGVzY3JpcHRpb24gLS0+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9wb20ueG1sIGIvZmVhdHVyZXMvcG9tLnhtbAppbmRleCA5YjI0OWJkLi45YThhYjhjIDEwMDY0NAotLS0gYS9mZWF0dXJlcy9wb20ueG1sCisrKyBiL2ZlYXR1cmVzL3BvbS54bWwKQEAgLTcsNyArNyw3IEBACiAJPHBhcmVudD4NCiAJCTxncm91cElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYTwvZ3JvdXBJZD4NCiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5yb290PC9hcnRpZmFjdElkPg0KLQkJPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4NCisJCTx2ZXJzaW9uPjIuMS4wLVNOQVBTSE9UPC92ZXJzaW9uPg0KIAk8L3BhcmVudD4NCiAJDQogCTwhLS0gUE9NIERlc2NyaXB0aW9uIC0tPg0KZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmluZGV4IGZjZjYxNzcuLmNlYjhkMjMgMTAwNjQ0Ci0tLSBhL3BvbS54bWwKKysrIGIvcG9tLnhtbApAQCAtNiw3ICs2LDcgQEAKIAogCTwhLS0gUGFyZW50IG9mIHRoaXMgUE9NIC0tPgogCTxwYXJlbnQ+Ci0JCTx2ZXJzaW9uPjIuMC4xMDAtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTx2ZXJzaW9uPjIuMS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5yZWxlbmcuY29uZmlndXJhdGlvbjwvYXJ0aWZhY3RJZD4KIAkJPHJlbGF0aXZlUGF0aD4uL3JlbGVuZy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuY29uZmlndXJhdGlvbjwvcmVsYXRpdmVQYXRoPgpkaWZmIC0tZ2l0IGEvcHJvZHVjdHMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtdS5wcm9kdWN0L3BvbS54bWwgYi9wcm9kdWN0cy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LnByb2R1Y3QvcG9tLnhtbAppbmRleCBiNGFmZGNlLi5kY2Y2OTk2IDEwMDY0NAotLS0gYS9wcm9kdWN0cy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LnByb2R1Y3QvcG9tLnhtbAorKysgYi9wcm9kdWN0cy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm11LnByb2R1Y3QvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogCTx2ZXJzaW9uPjIuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPg0KIA0KIAk8cHJvcGVydGllcz4NCi0JCTxmbWkuZXhwb3J0ZXIudGFyZ2V0LmZvbGRlcj4uLi8uLi9idW5kbGVzL2ZtaS90b29scy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmV4cG9ydGVyL3Jlc291cmNlcy88L2ZtaS5leHBvcnRlci50YXJnZXQuZm9sZGVyPg0KKwkJPGZtaS5leHBvcnRlci50YXJnZXQuZm9sZGVyPi4uLy4uL2J1bmRsZXMvZm1pL3Rvb2xzL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkucmNwLmV4cG9ydC9yZXNvdXJjZXMvPC9mbWkuZXhwb3J0ZXIudGFyZ2V0LmZvbGRlcj4NCiAJPC9wcm9wZXJ0aWVzPg0KIA0KIAk8IS0tIFNwZWNpZmljIGJ1aWxkIC0tPg0KZGlmZiAtLWdpdCBhL3Byb2R1Y3RzL3BvbS54bWwgYi9wcm9kdWN0cy9wb20ueG1sCmluZGV4IDhmMDJkNjUuLjE1M2YwYTcgMTAwNjQ0Ci0tLSBhL3Byb2R1Y3RzL3BvbS54bWwKKysrIGIvcHJvZHVjdHMvcG9tLnhtbApAQCAtOSwxMyArOSwxNCBAQAogCTxwYXJlbnQ+DQogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+DQogCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2Eucm9vdDwvYXJ0aWZhY3RJZD4NCi0JCTx2ZXJzaW9uPjIuMC4xMDAtU05BUFNIT1Q8L3ZlcnNpb24+DQorCQk8dmVyc2lvbj4yLjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4NCiAJPC9wYXJlbnQ+DQogCQ0KIAk8IS0tIFBPTSBEZXNjcmlwdGlvbiAtLT4NCiAJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLnByb2R1Y3RzPC9hcnRpZmFjdElkPg0KIAk8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KIAk8bmFtZT5Nb2thIFJDUCAoQnVuZGxlcyBmb2xkZXIpPC9uYW1lPg0KKwk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KIAkNCiAJPCEtLSBNb2R1bGVzIHRvIGJ1aWxkIC0tPg0KIAk8bW9kdWxlcz4NCmRpZmYgLS1naXQgYS9yZWxlbmcvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmNvbmZpZ3VyYXRpb24vcG9tLnhtbCBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuY29uZmlndXJhdGlvbi9wb20ueG1sCmluZGV4IDI3Yzk1YWQuLmExMzU3OTcgMTAwNjQ0Ci0tLSBhL3JlbGVuZy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuY29uZmlndXJhdGlvbi9wb20ueG1sCisrKyBiL3JlbGVuZy9vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuY29uZmlndXJhdGlvbi9wb20ueG1sCkBAIC0xNCw3ICsxNCw3IEBACiAJPCEtLSBNb2thIHJvb3QgUE9NOiBnZW5lcmFsIGluZm9ybWF0aW9uIC0tPg0KIAk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+DQogCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5yZWxlbmcuY29uZmlndXJhdGlvbjwvYXJ0aWZhY3RJZD4NCi0JPHZlcnNpb24+Mi4wLjEwMC1TTkFQU0hPVDwvdmVyc2lvbj4NCisJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQogCTxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+DQogCTxuYW1lPk1va2E8L25hbWU+DQogCTxkZXNjcmlwdGlvbj5QYXB5cnVzIE1vZGVsIEV4ZWN1dGlvbiBQbGF0Zm9ybTwvZGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvcmVsZW5nL29yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5wMi9jYXRlZ29yeS54bWwgYi9yZWxlbmcvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLnAyL2NhdGVnb3J5LnhtbAppbmRleCBlNTdkMDRhLi40ZTBiYjg2IDEwMDY0NAotLS0gYS9yZWxlbmcvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLnAyL2NhdGVnb3J5LnhtbAorKysgYi9yZWxlbmcvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLnAyL2NhdGVnb3J5LnhtbApAQCAtMyw3ICszLDcgQEAKICAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZlYXR1cmVfMi4wLjEwMC5xdWFsaWZpZXIuamFyIiBpZD0ib3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZlYXR1cmUiIHZlcnNpb249IjIuMC4xMDAucXVhbGlmaWVyIj4NCiAgICAgICA8Y2F0ZWdvcnkgbmFtZT0ib3JnLmVjbGlwc2UucGFweXJ1cy5tb2thIi8+DQogICAgPC9mZWF0dXJlPg0KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mZWF0dXJlXzIuMC4xMDAucXVhbGlmaWVyLmphciIgaWQ9Im9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5mbWkuZmVhdHVyZSIgdmVyc2lvbj0iMi4wLjEwMC5xdWFsaWZpZXIiPg0KKyAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLmZtaS5mZWF0dXJlXzIuMS4wLnF1YWxpZmllci5qYXIiIGlkPSJvcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EuZm1pLmZlYXR1cmUiIHZlcnNpb249IjIuMS4wLnF1YWxpZmllciI+DQogICAgICAgPGNhdGVnb3J5IG5hbWU9Im9yZy5lY2xpcHNlLnBhcHlydXMubW9rYSIvPg0KICAgIDwvZmVhdHVyZT4NCiAgICA8Y2F0ZWdvcnktZGVmIG5hbWU9Im9yZy5lY2xpcHNlLnBhcHlydXMubW9rYSIgbGFiZWw9Ik1va2EiPg0KZGlmZiAtLWdpdCBhL3JlbGVuZy9wb20ueG1sIGIvcmVsZW5nL3BvbS54bWwKaW5kZXggYzBkNjU0MS4uMDQxOTc2NiAxMDA2NDQKLS0tIGEvcmVsZW5nL3BvbS54bWwKKysrIGIvcmVsZW5nL3BvbS54bWwKQEAgLTcsMTMgKzcsMTQgQEAKIAk8cGFyZW50PgogCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2E8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBhcHlydXMubW9rYS5yb290PC9hcnRpZmFjdElkPgotCQk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPgorCQk8dmVyc2lvbj4yLjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KIAk8L3BhcmVudD4KIAkKIAk8IS0tIFBPTSBkZXNjcmlwdGlvbiAtLT4KIAk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wYXB5cnVzLm1va2EucmVsZW5nPC9hcnRpZmFjdElkPgogCTxuYW1lPk1va2EgVHljaG8gQ29uZmlndXJhdGlvbiAoUmVsZW5nIGZvbGRlcik8L25hbWU+CiAJPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKwk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPgogCQogCTwhLS0gTW9kdWxlcyB0byBidWlsZCAtLT4KIAk8bW9kdWxlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BvbS54bWwgYi90ZXN0cy9wb20ueG1sCmluZGV4IDAwZjlkOTcuLmYzOGI1ZWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3BvbS54bWwKKysrIGIvdGVzdHMvcG9tLnhtbApAQCAtOCw3ICs4LDcgQEAKIAk8cGFyZW50Pg0KIAkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thPC9ncm91cElkPg0KIAkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGFweXJ1cy5tb2thLnJvb3Q8L2FydGlmYWN0SWQ+DQotCQk8dmVyc2lvbj4yLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPg0KKwkJPHZlcnNpb24+Mi4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQogCTwvcGFyZW50Pg0KIA0KIAk8IS0tIFBPTSBEZXNjcmlwdGlvbiAtLT4NCg==